1*f6dc9357SAndroid Build Coastguard Worker // Panel.cpp
2*f6dc9357SAndroid Build Coastguard Worker
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker
5*f6dc9357SAndroid Build Coastguard Worker #include <windowsx.h>
6*f6dc9357SAndroid Build Coastguard Worker
7*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/IntToString.h"
8*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/StringConvert.h"
9*f6dc9357SAndroid Build Coastguard Worker
10*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/ErrorMsg.h"
11*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/FileName.h"
12*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/PropVariant.h"
13*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/Thread.h"
14*f6dc9357SAndroid Build Coastguard Worker
15*f6dc9357SAndroid Build Coastguard Worker #include "../../PropID.h"
16*f6dc9357SAndroid Build Coastguard Worker
17*f6dc9357SAndroid Build Coastguard Worker #include "resource.h"
18*f6dc9357SAndroid Build Coastguard Worker #include "../GUI/ExtractRes.h"
19*f6dc9357SAndroid Build Coastguard Worker
20*f6dc9357SAndroid Build Coastguard Worker #include "../Common/ArchiveName.h"
21*f6dc9357SAndroid Build Coastguard Worker #include "../Common/CompressCall.h"
22*f6dc9357SAndroid Build Coastguard Worker #include "../Common/ZipRegistry.h"
23*f6dc9357SAndroid Build Coastguard Worker
24*f6dc9357SAndroid Build Coastguard Worker #include "../Agent/IFolderArchive.h"
25*f6dc9357SAndroid Build Coastguard Worker
26*f6dc9357SAndroid Build Coastguard Worker #include "App.h"
27*f6dc9357SAndroid Build Coastguard Worker #include "ExtractCallback.h"
28*f6dc9357SAndroid Build Coastguard Worker #include "FSFolder.h"
29*f6dc9357SAndroid Build Coastguard Worker #include "FormatUtils.h"
30*f6dc9357SAndroid Build Coastguard Worker #include "LangUtils.h"
31*f6dc9357SAndroid Build Coastguard Worker #include "Panel.h"
32*f6dc9357SAndroid Build Coastguard Worker #include "RootFolder.h"
33*f6dc9357SAndroid Build Coastguard Worker
34*f6dc9357SAndroid Build Coastguard Worker #include "PropertyNameRes.h"
35*f6dc9357SAndroid Build Coastguard Worker
36*f6dc9357SAndroid Build Coastguard Worker using namespace NWindows;
37*f6dc9357SAndroid Build Coastguard Worker using namespace NControl;
38*f6dc9357SAndroid Build Coastguard Worker
39*f6dc9357SAndroid Build Coastguard Worker #ifndef _UNICODE
40*f6dc9357SAndroid Build Coastguard Worker extern bool g_IsNT;
41*f6dc9357SAndroid Build Coastguard Worker #endif
42*f6dc9357SAndroid Build Coastguard Worker
43*f6dc9357SAndroid Build Coastguard Worker static const UINT_PTR kTimerID = 1;
44*f6dc9357SAndroid Build Coastguard Worker static const UINT kTimerElapse = 1000;
45*f6dc9357SAndroid Build Coastguard Worker
46*f6dc9357SAndroid Build Coastguard Worker static DWORD kStyles[4] = { LVS_ICON, LVS_SMALLICON, LVS_LIST, LVS_REPORT };
47*f6dc9357SAndroid Build Coastguard Worker
48*f6dc9357SAndroid Build Coastguard Worker // static const int kCreateFolderID = 101;
49*f6dc9357SAndroid Build Coastguard Worker
50*f6dc9357SAndroid Build Coastguard Worker extern HINSTANCE g_hInstance;
51*f6dc9357SAndroid Build Coastguard Worker
ReleasePanel()52*f6dc9357SAndroid Build Coastguard Worker void CPanel::ReleasePanel()
53*f6dc9357SAndroid Build Coastguard Worker {
54*f6dc9357SAndroid Build Coastguard Worker Disable_Processing_Timer_Notify_StatusBar();
55*f6dc9357SAndroid Build Coastguard Worker // It's for unloading COM dll's: don't change it.
56*f6dc9357SAndroid Build Coastguard Worker CloseOpenFolders();
57*f6dc9357SAndroid Build Coastguard Worker _sevenZipContextMenu.Release();
58*f6dc9357SAndroid Build Coastguard Worker _systemContextMenu.Release();
59*f6dc9357SAndroid Build Coastguard Worker }
60*f6dc9357SAndroid Build Coastguard Worker
~CPanel()61*f6dc9357SAndroid Build Coastguard Worker CPanel::~CPanel()
62*f6dc9357SAndroid Build Coastguard Worker {
63*f6dc9357SAndroid Build Coastguard Worker CloseOpenFolders();
64*f6dc9357SAndroid Build Coastguard Worker }
65*f6dc9357SAndroid Build Coastguard Worker
GetParent() const66*f6dc9357SAndroid Build Coastguard Worker HWND CPanel::GetParent() const
67*f6dc9357SAndroid Build Coastguard Worker {
68*f6dc9357SAndroid Build Coastguard Worker const HWND h = CWindow2::GetParent();
69*f6dc9357SAndroid Build Coastguard Worker return h ? h : _mainWindow;
70*f6dc9357SAndroid Build Coastguard Worker }
71*f6dc9357SAndroid Build Coastguard Worker
72*f6dc9357SAndroid Build Coastguard Worker #define kClassName L"7-Zip::Panel"
73*f6dc9357SAndroid Build Coastguard Worker
74*f6dc9357SAndroid Build Coastguard Worker
Create(HWND mainWindow,HWND parentWindow,UINT id,const UString & currentFolderPrefix,const UString & arcFormat,CPanelCallback * panelCallback,CAppState * appState,bool needOpenArc,COpenResult & openRes)75*f6dc9357SAndroid Build Coastguard Worker HRESULT CPanel::Create(HWND mainWindow, HWND parentWindow, UINT id,
76*f6dc9357SAndroid Build Coastguard Worker const UString ¤tFolderPrefix,
77*f6dc9357SAndroid Build Coastguard Worker const UString &arcFormat,
78*f6dc9357SAndroid Build Coastguard Worker CPanelCallback *panelCallback, CAppState *appState,
79*f6dc9357SAndroid Build Coastguard Worker bool needOpenArc,
80*f6dc9357SAndroid Build Coastguard Worker COpenResult &openRes)
81*f6dc9357SAndroid Build Coastguard Worker {
82*f6dc9357SAndroid Build Coastguard Worker _mainWindow = mainWindow;
83*f6dc9357SAndroid Build Coastguard Worker _processTimer = true;
84*f6dc9357SAndroid Build Coastguard Worker _processNotify = true;
85*f6dc9357SAndroid Build Coastguard Worker _processStatusBar = true;
86*f6dc9357SAndroid Build Coastguard Worker
87*f6dc9357SAndroid Build Coastguard Worker _panelCallback = panelCallback;
88*f6dc9357SAndroid Build Coastguard Worker _appState = appState;
89*f6dc9357SAndroid Build Coastguard Worker // _index = index;
90*f6dc9357SAndroid Build Coastguard Worker _baseID = id;
91*f6dc9357SAndroid Build Coastguard Worker _comboBoxID = _baseID + 3;
92*f6dc9357SAndroid Build Coastguard Worker _statusBarID = _comboBoxID + 1;
93*f6dc9357SAndroid Build Coastguard Worker
94*f6dc9357SAndroid Build Coastguard Worker UString cfp = currentFolderPrefix;
95*f6dc9357SAndroid Build Coastguard Worker
96*f6dc9357SAndroid Build Coastguard Worker if (!currentFolderPrefix.IsEmpty())
97*f6dc9357SAndroid Build Coastguard Worker if (currentFolderPrefix[0] == L'.')
98*f6dc9357SAndroid Build Coastguard Worker {
99*f6dc9357SAndroid Build Coastguard Worker FString cfpF;
100*f6dc9357SAndroid Build Coastguard Worker if (NFile::NDir::MyGetFullPathName(us2fs(currentFolderPrefix), cfpF))
101*f6dc9357SAndroid Build Coastguard Worker cfp = fs2us(cfpF);
102*f6dc9357SAndroid Build Coastguard Worker }
103*f6dc9357SAndroid Build Coastguard Worker
104*f6dc9357SAndroid Build Coastguard Worker RINOK(BindToPath(cfp, arcFormat, openRes))
105*f6dc9357SAndroid Build Coastguard Worker
106*f6dc9357SAndroid Build Coastguard Worker if (needOpenArc && !openRes.ArchiveIsOpened)
107*f6dc9357SAndroid Build Coastguard Worker return S_OK;
108*f6dc9357SAndroid Build Coastguard Worker
109*f6dc9357SAndroid Build Coastguard Worker if (!CreateEx(0, kClassName, NULL, WS_CHILD | WS_VISIBLE,
110*f6dc9357SAndroid Build Coastguard Worker 0, 0, _xSize, 260,
111*f6dc9357SAndroid Build Coastguard Worker parentWindow, (HMENU)(UINT_PTR)id, g_hInstance))
112*f6dc9357SAndroid Build Coastguard Worker return E_FAIL;
113*f6dc9357SAndroid Build Coastguard Worker PanelCreated = true;
114*f6dc9357SAndroid Build Coastguard Worker
115*f6dc9357SAndroid Build Coastguard Worker return S_OK;
116*f6dc9357SAndroid Build Coastguard Worker }
117*f6dc9357SAndroid Build Coastguard Worker
118*f6dc9357SAndroid Build Coastguard Worker // extern UInt32 g_NumMessages;
119*f6dc9357SAndroid Build Coastguard Worker
OnMessage(UINT message,WPARAM wParam,LPARAM lParam)120*f6dc9357SAndroid Build Coastguard Worker LRESULT CPanel::OnMessage(UINT message, WPARAM wParam, LPARAM lParam)
121*f6dc9357SAndroid Build Coastguard Worker {
122*f6dc9357SAndroid Build Coastguard Worker // g_NumMessages++;
123*f6dc9357SAndroid Build Coastguard Worker switch (message)
124*f6dc9357SAndroid Build Coastguard Worker {
125*f6dc9357SAndroid Build Coastguard Worker case kShiftSelectMessage:
126*f6dc9357SAndroid Build Coastguard Worker OnShiftSelectMessage();
127*f6dc9357SAndroid Build Coastguard Worker return 0;
128*f6dc9357SAndroid Build Coastguard Worker case kReLoadMessage:
129*f6dc9357SAndroid Build Coastguard Worker RefreshListCtrl(_selectedState);
130*f6dc9357SAndroid Build Coastguard Worker return 0;
131*f6dc9357SAndroid Build Coastguard Worker case kSetFocusToListView:
132*f6dc9357SAndroid Build Coastguard Worker _listView.SetFocus();
133*f6dc9357SAndroid Build Coastguard Worker return 0;
134*f6dc9357SAndroid Build Coastguard Worker case kOpenItemChanged:
135*f6dc9357SAndroid Build Coastguard Worker return OnOpenItemChanged(lParam);
136*f6dc9357SAndroid Build Coastguard Worker case kRefresh_StatusBar:
137*f6dc9357SAndroid Build Coastguard Worker if (_processStatusBar)
138*f6dc9357SAndroid Build Coastguard Worker Refresh_StatusBar();
139*f6dc9357SAndroid Build Coastguard Worker return 0;
140*f6dc9357SAndroid Build Coastguard Worker #ifdef UNDER_CE
141*f6dc9357SAndroid Build Coastguard Worker case kRefresh_HeaderComboBox:
142*f6dc9357SAndroid Build Coastguard Worker LoadFullPathAndShow();
143*f6dc9357SAndroid Build Coastguard Worker return 0;
144*f6dc9357SAndroid Build Coastguard Worker #endif
145*f6dc9357SAndroid Build Coastguard Worker case WM_TIMER:
146*f6dc9357SAndroid Build Coastguard Worker OnTimer();
147*f6dc9357SAndroid Build Coastguard Worker return 0;
148*f6dc9357SAndroid Build Coastguard Worker case WM_CONTEXTMENU:
149*f6dc9357SAndroid Build Coastguard Worker if (OnContextMenu(HANDLE(wParam), GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)))
150*f6dc9357SAndroid Build Coastguard Worker return 0;
151*f6dc9357SAndroid Build Coastguard Worker break;
152*f6dc9357SAndroid Build Coastguard Worker /*
153*f6dc9357SAndroid Build Coastguard Worker case WM_DROPFILES:
154*f6dc9357SAndroid Build Coastguard Worker CompressDropFiles(HDROP(wParam));
155*f6dc9357SAndroid Build Coastguard Worker return 0;
156*f6dc9357SAndroid Build Coastguard Worker */
157*f6dc9357SAndroid Build Coastguard Worker }
158*f6dc9357SAndroid Build Coastguard Worker return CWindow2::OnMessage(message, wParam, lParam);
159*f6dc9357SAndroid Build Coastguard Worker }
160*f6dc9357SAndroid Build Coastguard Worker
OnMessage(UINT message,WPARAM wParam,LPARAM lParam)161*f6dc9357SAndroid Build Coastguard Worker LRESULT CMyListView::OnMessage(UINT message, WPARAM wParam, LPARAM lParam)
162*f6dc9357SAndroid Build Coastguard Worker {
163*f6dc9357SAndroid Build Coastguard Worker if (message == WM_CHAR)
164*f6dc9357SAndroid Build Coastguard Worker {
165*f6dc9357SAndroid Build Coastguard Worker UINT scanCode = (UINT)((lParam >> 16) & 0xFF);
166*f6dc9357SAndroid Build Coastguard Worker bool extended = ((lParam & 0x1000000) != 0);
167*f6dc9357SAndroid Build Coastguard Worker UINT virtualKey = MapVirtualKey(scanCode, 1);
168*f6dc9357SAndroid Build Coastguard Worker if (virtualKey == VK_MULTIPLY || virtualKey == VK_ADD ||
169*f6dc9357SAndroid Build Coastguard Worker virtualKey == VK_SUBTRACT)
170*f6dc9357SAndroid Build Coastguard Worker return 0;
171*f6dc9357SAndroid Build Coastguard Worker if ((wParam == '/' && extended)
172*f6dc9357SAndroid Build Coastguard Worker || wParam == '\\' || wParam == '/')
173*f6dc9357SAndroid Build Coastguard Worker {
174*f6dc9357SAndroid Build Coastguard Worker _panel->OpenDrivesFolder();
175*f6dc9357SAndroid Build Coastguard Worker return 0;
176*f6dc9357SAndroid Build Coastguard Worker }
177*f6dc9357SAndroid Build Coastguard Worker }
178*f6dc9357SAndroid Build Coastguard Worker else if (message == WM_SYSCHAR)
179*f6dc9357SAndroid Build Coastguard Worker {
180*f6dc9357SAndroid Build Coastguard Worker // For Alt+Enter Beep disabling
181*f6dc9357SAndroid Build Coastguard Worker UINT scanCode = (UINT)(lParam >> 16) & 0xFF;
182*f6dc9357SAndroid Build Coastguard Worker UINT virtualKey = MapVirtualKey(scanCode, 1);
183*f6dc9357SAndroid Build Coastguard Worker if (virtualKey == VK_RETURN || virtualKey == VK_MULTIPLY ||
184*f6dc9357SAndroid Build Coastguard Worker virtualKey == VK_ADD || virtualKey == VK_SUBTRACT)
185*f6dc9357SAndroid Build Coastguard Worker return 0;
186*f6dc9357SAndroid Build Coastguard Worker }
187*f6dc9357SAndroid Build Coastguard Worker /*
188*f6dc9357SAndroid Build Coastguard Worker else if (message == WM_SYSKEYDOWN)
189*f6dc9357SAndroid Build Coastguard Worker {
190*f6dc9357SAndroid Build Coastguard Worker // return 0;
191*f6dc9357SAndroid Build Coastguard Worker }
192*f6dc9357SAndroid Build Coastguard Worker */
193*f6dc9357SAndroid Build Coastguard Worker else if (message == WM_KEYDOWN)
194*f6dc9357SAndroid Build Coastguard Worker {
195*f6dc9357SAndroid Build Coastguard Worker bool alt = IsKeyDown(VK_MENU);
196*f6dc9357SAndroid Build Coastguard Worker bool ctrl = IsKeyDown(VK_CONTROL);
197*f6dc9357SAndroid Build Coastguard Worker bool shift = IsKeyDown(VK_SHIFT);
198*f6dc9357SAndroid Build Coastguard Worker switch (wParam)
199*f6dc9357SAndroid Build Coastguard Worker {
200*f6dc9357SAndroid Build Coastguard Worker /*
201*f6dc9357SAndroid Build Coastguard Worker case VK_RETURN:
202*f6dc9357SAndroid Build Coastguard Worker {
203*f6dc9357SAndroid Build Coastguard Worker if (shift && !alt && !ctrl)
204*f6dc9357SAndroid Build Coastguard Worker {
205*f6dc9357SAndroid Build Coastguard Worker _panel->OpenSelectedItems(false);
206*f6dc9357SAndroid Build Coastguard Worker return 0;
207*f6dc9357SAndroid Build Coastguard Worker }
208*f6dc9357SAndroid Build Coastguard Worker break;
209*f6dc9357SAndroid Build Coastguard Worker }
210*f6dc9357SAndroid Build Coastguard Worker */
211*f6dc9357SAndroid Build Coastguard Worker case VK_NEXT:
212*f6dc9357SAndroid Build Coastguard Worker {
213*f6dc9357SAndroid Build Coastguard Worker if (ctrl && !alt && !shift)
214*f6dc9357SAndroid Build Coastguard Worker {
215*f6dc9357SAndroid Build Coastguard Worker _panel->OpenFocusedItemAsInternal();
216*f6dc9357SAndroid Build Coastguard Worker return 0;
217*f6dc9357SAndroid Build Coastguard Worker }
218*f6dc9357SAndroid Build Coastguard Worker break;
219*f6dc9357SAndroid Build Coastguard Worker }
220*f6dc9357SAndroid Build Coastguard Worker case VK_PRIOR:
221*f6dc9357SAndroid Build Coastguard Worker if (ctrl && !alt && !shift)
222*f6dc9357SAndroid Build Coastguard Worker {
223*f6dc9357SAndroid Build Coastguard Worker _panel->OpenParentFolder();
224*f6dc9357SAndroid Build Coastguard Worker return 0;
225*f6dc9357SAndroid Build Coastguard Worker }
226*f6dc9357SAndroid Build Coastguard Worker }
227*f6dc9357SAndroid Build Coastguard Worker }
228*f6dc9357SAndroid Build Coastguard Worker #ifdef UNDER_CE
229*f6dc9357SAndroid Build Coastguard Worker else if (message == WM_KEYUP)
230*f6dc9357SAndroid Build Coastguard Worker {
231*f6dc9357SAndroid Build Coastguard Worker if (wParam == VK_F2) // it's VK_TSOFT2
232*f6dc9357SAndroid Build Coastguard Worker {
233*f6dc9357SAndroid Build Coastguard Worker // Activate Menu
234*f6dc9357SAndroid Build Coastguard Worker ::PostMessage(g_HWND, WM_SYSCOMMAND, SC_KEYMENU, 0);
235*f6dc9357SAndroid Build Coastguard Worker return 0;
236*f6dc9357SAndroid Build Coastguard Worker }
237*f6dc9357SAndroid Build Coastguard Worker }
238*f6dc9357SAndroid Build Coastguard Worker #endif
239*f6dc9357SAndroid Build Coastguard Worker else if (message == WM_SETFOCUS)
240*f6dc9357SAndroid Build Coastguard Worker {
241*f6dc9357SAndroid Build Coastguard Worker _panel->_lastFocusedIsList = true;
242*f6dc9357SAndroid Build Coastguard Worker _panel->_panelCallback->PanelWasFocused();
243*f6dc9357SAndroid Build Coastguard Worker }
244*f6dc9357SAndroid Build Coastguard Worker return CListView2::OnMessage(message, wParam, lParam);
245*f6dc9357SAndroid Build Coastguard Worker }
246*f6dc9357SAndroid Build Coastguard Worker
247*f6dc9357SAndroid Build Coastguard Worker /*
248*f6dc9357SAndroid Build Coastguard Worker static LRESULT APIENTRY ComboBoxSubclassProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
249*f6dc9357SAndroid Build Coastguard Worker {
250*f6dc9357SAndroid Build Coastguard Worker CWindow tempDialog(hwnd);
251*f6dc9357SAndroid Build Coastguard Worker CMyComboBox *w = (CMyComboBox *)(tempDialog.GetUserDataLongPtr());
252*f6dc9357SAndroid Build Coastguard Worker if (w == NULL)
253*f6dc9357SAndroid Build Coastguard Worker return 0;
254*f6dc9357SAndroid Build Coastguard Worker return w->OnMessage(message, wParam, lParam);
255*f6dc9357SAndroid Build Coastguard Worker }
256*f6dc9357SAndroid Build Coastguard Worker
257*f6dc9357SAndroid Build Coastguard Worker LRESULT CMyComboBox::OnMessage(UINT message, WPARAM wParam, LPARAM lParam)
258*f6dc9357SAndroid Build Coastguard Worker {
259*f6dc9357SAndroid Build Coastguard Worker return CallWindowProc(_origWindowProc, *this, message, wParam, lParam);
260*f6dc9357SAndroid Build Coastguard Worker }
261*f6dc9357SAndroid Build Coastguard Worker */
262*f6dc9357SAndroid Build Coastguard Worker
263*f6dc9357SAndroid Build Coastguard Worker #ifndef UNDER_CE
264*f6dc9357SAndroid Build Coastguard Worker
ComboBoxEditSubclassProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)265*f6dc9357SAndroid Build Coastguard Worker static LRESULT APIENTRY ComboBoxEditSubclassProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
266*f6dc9357SAndroid Build Coastguard Worker {
267*f6dc9357SAndroid Build Coastguard Worker CWindow tempDialog(hwnd);
268*f6dc9357SAndroid Build Coastguard Worker CMyComboBoxEdit *w = (CMyComboBoxEdit *)(tempDialog.GetUserDataLongPtr());
269*f6dc9357SAndroid Build Coastguard Worker if (w == NULL)
270*f6dc9357SAndroid Build Coastguard Worker return 0;
271*f6dc9357SAndroid Build Coastguard Worker return w->OnMessage(message, wParam, lParam);
272*f6dc9357SAndroid Build Coastguard Worker }
273*f6dc9357SAndroid Build Coastguard Worker
274*f6dc9357SAndroid Build Coastguard Worker #endif
275*f6dc9357SAndroid Build Coastguard Worker
OnMessage(UINT message,WPARAM wParam,LPARAM lParam)276*f6dc9357SAndroid Build Coastguard Worker LRESULT CMyComboBoxEdit::OnMessage(UINT message, WPARAM wParam, LPARAM lParam)
277*f6dc9357SAndroid Build Coastguard Worker {
278*f6dc9357SAndroid Build Coastguard Worker // See MSDN / Subclassing a Combo Box / Creating a Combo-box Toolbar
279*f6dc9357SAndroid Build Coastguard Worker switch (message)
280*f6dc9357SAndroid Build Coastguard Worker {
281*f6dc9357SAndroid Build Coastguard Worker case WM_SYSKEYDOWN:
282*f6dc9357SAndroid Build Coastguard Worker switch (wParam)
283*f6dc9357SAndroid Build Coastguard Worker {
284*f6dc9357SAndroid Build Coastguard Worker case VK_F1:
285*f6dc9357SAndroid Build Coastguard Worker case VK_F2:
286*f6dc9357SAndroid Build Coastguard Worker {
287*f6dc9357SAndroid Build Coastguard Worker // check ALT
288*f6dc9357SAndroid Build Coastguard Worker if ((lParam & (1<<29)) == 0)
289*f6dc9357SAndroid Build Coastguard Worker break;
290*f6dc9357SAndroid Build Coastguard Worker bool alt = IsKeyDown(VK_MENU);
291*f6dc9357SAndroid Build Coastguard Worker bool ctrl = IsKeyDown(VK_CONTROL);
292*f6dc9357SAndroid Build Coastguard Worker bool shift = IsKeyDown(VK_SHIFT);
293*f6dc9357SAndroid Build Coastguard Worker if (alt && !ctrl && !shift)
294*f6dc9357SAndroid Build Coastguard Worker {
295*f6dc9357SAndroid Build Coastguard Worker _panel->_panelCallback->SetFocusToPath(wParam == VK_F1 ? 0 : 1);
296*f6dc9357SAndroid Build Coastguard Worker return 0;
297*f6dc9357SAndroid Build Coastguard Worker }
298*f6dc9357SAndroid Build Coastguard Worker break;
299*f6dc9357SAndroid Build Coastguard Worker }
300*f6dc9357SAndroid Build Coastguard Worker }
301*f6dc9357SAndroid Build Coastguard Worker break;
302*f6dc9357SAndroid Build Coastguard Worker case WM_KEYDOWN:
303*f6dc9357SAndroid Build Coastguard Worker switch (wParam)
304*f6dc9357SAndroid Build Coastguard Worker {
305*f6dc9357SAndroid Build Coastguard Worker case VK_TAB:
306*f6dc9357SAndroid Build Coastguard Worker // SendMessage(hwndMain, WM_ENTER, 0, 0);
307*f6dc9357SAndroid Build Coastguard Worker _panel->SetFocusToList();
308*f6dc9357SAndroid Build Coastguard Worker return 0;
309*f6dc9357SAndroid Build Coastguard Worker case VK_F9:
310*f6dc9357SAndroid Build Coastguard Worker {
311*f6dc9357SAndroid Build Coastguard Worker bool alt = IsKeyDown(VK_MENU);
312*f6dc9357SAndroid Build Coastguard Worker bool ctrl = IsKeyDown(VK_CONTROL);
313*f6dc9357SAndroid Build Coastguard Worker bool shift = IsKeyDown(VK_SHIFT);
314*f6dc9357SAndroid Build Coastguard Worker if (!alt && !ctrl && !shift)
315*f6dc9357SAndroid Build Coastguard Worker {
316*f6dc9357SAndroid Build Coastguard Worker g_App.SwitchOnOffOnePanel();
317*f6dc9357SAndroid Build Coastguard Worker return 0;
318*f6dc9357SAndroid Build Coastguard Worker }
319*f6dc9357SAndroid Build Coastguard Worker break;
320*f6dc9357SAndroid Build Coastguard Worker }
321*f6dc9357SAndroid Build Coastguard Worker case 'W':
322*f6dc9357SAndroid Build Coastguard Worker {
323*f6dc9357SAndroid Build Coastguard Worker bool ctrl = IsKeyDown(VK_CONTROL);
324*f6dc9357SAndroid Build Coastguard Worker if (ctrl)
325*f6dc9357SAndroid Build Coastguard Worker {
326*f6dc9357SAndroid Build Coastguard Worker PostMessage(g_HWND, WM_COMMAND, IDCLOSE, 0);
327*f6dc9357SAndroid Build Coastguard Worker return 0;
328*f6dc9357SAndroid Build Coastguard Worker }
329*f6dc9357SAndroid Build Coastguard Worker break;
330*f6dc9357SAndroid Build Coastguard Worker }
331*f6dc9357SAndroid Build Coastguard Worker }
332*f6dc9357SAndroid Build Coastguard Worker break;
333*f6dc9357SAndroid Build Coastguard Worker case WM_CHAR:
334*f6dc9357SAndroid Build Coastguard Worker switch (wParam)
335*f6dc9357SAndroid Build Coastguard Worker {
336*f6dc9357SAndroid Build Coastguard Worker case VK_TAB:
337*f6dc9357SAndroid Build Coastguard Worker case VK_ESCAPE:
338*f6dc9357SAndroid Build Coastguard Worker return 0;
339*f6dc9357SAndroid Build Coastguard Worker }
340*f6dc9357SAndroid Build Coastguard Worker }
341*f6dc9357SAndroid Build Coastguard Worker #ifndef _UNICODE
342*f6dc9357SAndroid Build Coastguard Worker if (g_IsNT)
343*f6dc9357SAndroid Build Coastguard Worker return CallWindowProcW(_origWindowProc, *this, message, wParam, lParam);
344*f6dc9357SAndroid Build Coastguard Worker else
345*f6dc9357SAndroid Build Coastguard Worker #endif
346*f6dc9357SAndroid Build Coastguard Worker return CallWindowProc(_origWindowProc, *this, message, wParam, lParam);
347*f6dc9357SAndroid Build Coastguard Worker }
348*f6dc9357SAndroid Build Coastguard Worker
349*f6dc9357SAndroid Build Coastguard Worker
350*f6dc9357SAndroid Build Coastguard Worker /*
351*f6dc9357SAndroid Build Coastguard Worker REBARBANDINFO in vista (_WIN32_WINNT >= 0x0600) has additional fields
352*f6dc9357SAndroid Build Coastguard Worker we want 2000/xp compatibility.
353*f6dc9357SAndroid Build Coastguard Worker so we must use reduced structure, if we compile with (_WIN32_WINNT >= 0x0600)
354*f6dc9357SAndroid Build Coastguard Worker Also there are additional fields, if (_WIN32_IE >= 0x0400).
355*f6dc9357SAndroid Build Coastguard Worker but (_WIN32_IE >= 0x0400) is expected.
356*f6dc9357SAndroid Build Coastguard Worker note:
357*f6dc9357SAndroid Build Coastguard Worker in x64 (64-bit):
358*f6dc9357SAndroid Build Coastguard Worker {
359*f6dc9357SAndroid Build Coastguard Worker (108 == REBARBANDINFO_V6_SIZE)
360*f6dc9357SAndroid Build Coastguard Worker (112 == sizeof(REBARBANDINFO) // for (_WIN32_WINNT < 0x0600)
361*f6dc9357SAndroid Build Coastguard Worker (128 == sizeof(REBARBANDINFO) // for (_WIN32_WINNT >= 0x0600)
362*f6dc9357SAndroid Build Coastguard Worker there is difference in sizes, because REBARBANDINFO size was
363*f6dc9357SAndroid Build Coastguard Worker not aligned for 8-bytes in (_WIN32_WINNT < 0x0600).
364*f6dc9357SAndroid Build Coastguard Worker We hope that WinVista+ support support both (108 and 112) sizes.
365*f6dc9357SAndroid Build Coastguard Worker But does WinXP-x64 support (108 == REBARBANDINFO_V6_SIZE)?
366*f6dc9357SAndroid Build Coastguard Worker {
367*f6dc9357SAndroid Build Coastguard Worker 96 LPARAM lParam;
368*f6dc9357SAndroid Build Coastguard Worker 104 UINT cxHeader;
369*f6dc9357SAndroid Build Coastguard Worker #if (_WIN32_WINNT >= 0x0600)
370*f6dc9357SAndroid Build Coastguard Worker 108 RECT rcChevronLocation;
371*f6dc9357SAndroid Build Coastguard Worker 124 UINT uChevronState;
372*f6dc9357SAndroid Build Coastguard Worker #endif
373*f6dc9357SAndroid Build Coastguard Worker }
374*f6dc9357SAndroid Build Coastguard Worker */
375*f6dc9357SAndroid Build Coastguard Worker
376*f6dc9357SAndroid Build Coastguard Worker #if defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0600) && defined(REBARBANDINFOA_V6_SIZE)
377*f6dc9357SAndroid Build Coastguard Worker #define my_compatib_REBARBANDINFO_size REBARBANDINFO_V6_SIZE
378*f6dc9357SAndroid Build Coastguard Worker #else
379*f6dc9357SAndroid Build Coastguard Worker #define my_compatib_REBARBANDINFO_size sizeof(REBARBANDINFO)
380*f6dc9357SAndroid Build Coastguard Worker #endif
381*f6dc9357SAndroid Build Coastguard Worker
382*f6dc9357SAndroid Build Coastguard Worker
OnCreate(CREATESTRUCT *)383*f6dc9357SAndroid Build Coastguard Worker bool CPanel::OnCreate(CREATESTRUCT * /* createStruct */)
384*f6dc9357SAndroid Build Coastguard Worker {
385*f6dc9357SAndroid Build Coastguard Worker // _virtualMode = false;
386*f6dc9357SAndroid Build Coastguard Worker // _sortIndex = 0;
387*f6dc9357SAndroid Build Coastguard Worker _sortID = kpidName;
388*f6dc9357SAndroid Build Coastguard Worker _ascending = true;
389*f6dc9357SAndroid Build Coastguard Worker _lastFocusedIsList = true;
390*f6dc9357SAndroid Build Coastguard Worker
391*f6dc9357SAndroid Build Coastguard Worker DWORD style = WS_CHILD | WS_VISIBLE; // | WS_BORDER ; // | LVS_SHAREIMAGELISTS; // | LVS_SHOWSELALWAYS;
392*f6dc9357SAndroid Build Coastguard Worker
393*f6dc9357SAndroid Build Coastguard Worker style |= LVS_SHAREIMAGELISTS;
394*f6dc9357SAndroid Build Coastguard Worker // style |= LVS_AUTOARRANGE;
395*f6dc9357SAndroid Build Coastguard Worker style |= WS_CLIPCHILDREN;
396*f6dc9357SAndroid Build Coastguard Worker style |= WS_CLIPSIBLINGS;
397*f6dc9357SAndroid Build Coastguard Worker
398*f6dc9357SAndroid Build Coastguard Worker const UInt32 kNumListModes = Z7_ARRAY_SIZE(kStyles);
399*f6dc9357SAndroid Build Coastguard Worker if (_listViewMode >= kNumListModes)
400*f6dc9357SAndroid Build Coastguard Worker _listViewMode = kNumListModes - 1;
401*f6dc9357SAndroid Build Coastguard Worker
402*f6dc9357SAndroid Build Coastguard Worker style |= kStyles[_listViewMode]
403*f6dc9357SAndroid Build Coastguard Worker | WS_TABSTOP
404*f6dc9357SAndroid Build Coastguard Worker | LVS_EDITLABELS;
405*f6dc9357SAndroid Build Coastguard Worker if (_mySelectMode)
406*f6dc9357SAndroid Build Coastguard Worker style |= LVS_SINGLESEL;
407*f6dc9357SAndroid Build Coastguard Worker
408*f6dc9357SAndroid Build Coastguard Worker /*
409*f6dc9357SAndroid Build Coastguard Worker if (_virtualMode)
410*f6dc9357SAndroid Build Coastguard Worker style |= LVS_OWNERDATA;
411*f6dc9357SAndroid Build Coastguard Worker */
412*f6dc9357SAndroid Build Coastguard Worker
413*f6dc9357SAndroid Build Coastguard Worker DWORD exStyle;
414*f6dc9357SAndroid Build Coastguard Worker exStyle = WS_EX_CLIENTEDGE;
415*f6dc9357SAndroid Build Coastguard Worker
416*f6dc9357SAndroid Build Coastguard Worker if (!_listView.CreateEx(exStyle, style, 0, 0, 116, 260,
417*f6dc9357SAndroid Build Coastguard Worker *this, (HMENU)(UINT_PTR)(_baseID + 1), g_hInstance, NULL))
418*f6dc9357SAndroid Build Coastguard Worker return false;
419*f6dc9357SAndroid Build Coastguard Worker
420*f6dc9357SAndroid Build Coastguard Worker _listView.SetUnicodeFormat();
421*f6dc9357SAndroid Build Coastguard Worker _listView._panel = this;
422*f6dc9357SAndroid Build Coastguard Worker _listView.SetWindowProc();
423*f6dc9357SAndroid Build Coastguard Worker
424*f6dc9357SAndroid Build Coastguard Worker _listView.SetImageList(Shell_Get_SysImageList_smallIcons(true), LVSIL_SMALL);
425*f6dc9357SAndroid Build Coastguard Worker _listView.SetImageList(Shell_Get_SysImageList_smallIcons(false), LVSIL_NORMAL);
426*f6dc9357SAndroid Build Coastguard Worker
427*f6dc9357SAndroid Build Coastguard Worker // _exStyle |= LVS_EX_HEADERDRAGDROP;
428*f6dc9357SAndroid Build Coastguard Worker // DWORD extendedStyle = _listView.GetExtendedListViewStyle();
429*f6dc9357SAndroid Build Coastguard Worker // extendedStyle |= _exStyle;
430*f6dc9357SAndroid Build Coastguard Worker // _listView.SetExtendedListViewStyle(extendedStyle);
431*f6dc9357SAndroid Build Coastguard Worker SetExtendedStyle();
432*f6dc9357SAndroid Build Coastguard Worker
433*f6dc9357SAndroid Build Coastguard Worker _listView.Show(SW_SHOW);
434*f6dc9357SAndroid Build Coastguard Worker _listView.InvalidateRect(NULL, true);
435*f6dc9357SAndroid Build Coastguard Worker _listView.Update();
436*f6dc9357SAndroid Build Coastguard Worker
437*f6dc9357SAndroid Build Coastguard Worker // Ensure that the common control DLL is loaded.
438*f6dc9357SAndroid Build Coastguard Worker INITCOMMONCONTROLSEX icex;
439*f6dc9357SAndroid Build Coastguard Worker
440*f6dc9357SAndroid Build Coastguard Worker icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
441*f6dc9357SAndroid Build Coastguard Worker icex.dwICC = ICC_BAR_CLASSES;
442*f6dc9357SAndroid Build Coastguard Worker InitCommonControlsEx(&icex);
443*f6dc9357SAndroid Build Coastguard Worker
444*f6dc9357SAndroid Build Coastguard Worker const TBBUTTON tbb[] =
445*f6dc9357SAndroid Build Coastguard Worker {
446*f6dc9357SAndroid Build Coastguard Worker // {0, 0, TBSTATE_ENABLED, BTNS_SEP, 0L, 0},
447*f6dc9357SAndroid Build Coastguard Worker {VIEW_PARENTFOLDER, kParentFolderID, TBSTATE_ENABLED, BTNS_BUTTON, { 0, 0 }, 0, 0 },
448*f6dc9357SAndroid Build Coastguard Worker // {0, 0, TBSTATE_ENABLED, BTNS_SEP, 0L, 0},
449*f6dc9357SAndroid Build Coastguard Worker // {VIEW_NEWFOLDER, kCreateFolderID, TBSTATE_ENABLED, BTNS_BUTTON, 0L, 0},
450*f6dc9357SAndroid Build Coastguard Worker };
451*f6dc9357SAndroid Build Coastguard Worker
452*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_USE_DYN_ComCtl32Version
453*f6dc9357SAndroid Build Coastguard Worker if (g_ComCtl32Version >= MAKELONG(71, 4))
454*f6dc9357SAndroid Build Coastguard Worker #endif
455*f6dc9357SAndroid Build Coastguard Worker {
456*f6dc9357SAndroid Build Coastguard Worker icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
457*f6dc9357SAndroid Build Coastguard Worker icex.dwICC = ICC_COOL_CLASSES | ICC_BAR_CLASSES;
458*f6dc9357SAndroid Build Coastguard Worker InitCommonControlsEx(&icex);
459*f6dc9357SAndroid Build Coastguard Worker
460*f6dc9357SAndroid Build Coastguard Worker // if there is no CCS_NOPARENTALIGN, there is space of some pixels after rebar (Incorrect GetWindowRect ?)
461*f6dc9357SAndroid Build Coastguard Worker
462*f6dc9357SAndroid Build Coastguard Worker _headerReBar.Attach(::CreateWindowEx(WS_EX_TOOLWINDOW,
463*f6dc9357SAndroid Build Coastguard Worker REBARCLASSNAME,
464*f6dc9357SAndroid Build Coastguard Worker NULL, WS_VISIBLE | WS_BORDER | WS_CHILD |
465*f6dc9357SAndroid Build Coastguard Worker WS_CLIPCHILDREN | WS_CLIPSIBLINGS
466*f6dc9357SAndroid Build Coastguard Worker | CCS_NODIVIDER
467*f6dc9357SAndroid Build Coastguard Worker | CCS_NOPARENTALIGN
468*f6dc9357SAndroid Build Coastguard Worker | CCS_TOP
469*f6dc9357SAndroid Build Coastguard Worker | RBS_VARHEIGHT
470*f6dc9357SAndroid Build Coastguard Worker | RBS_BANDBORDERS
471*f6dc9357SAndroid Build Coastguard Worker ,0,0,0,0, *this, NULL, g_hInstance, NULL));
472*f6dc9357SAndroid Build Coastguard Worker }
473*f6dc9357SAndroid Build Coastguard Worker
474*f6dc9357SAndroid Build Coastguard Worker DWORD toolbarStyle = WS_CHILD | WS_VISIBLE ;
475*f6dc9357SAndroid Build Coastguard Worker if (_headerReBar)
476*f6dc9357SAndroid Build Coastguard Worker {
477*f6dc9357SAndroid Build Coastguard Worker toolbarStyle |= 0
478*f6dc9357SAndroid Build Coastguard Worker // | WS_CLIPCHILDREN
479*f6dc9357SAndroid Build Coastguard Worker // | WS_CLIPSIBLINGS
480*f6dc9357SAndroid Build Coastguard Worker
481*f6dc9357SAndroid Build Coastguard Worker | TBSTYLE_TOOLTIPS
482*f6dc9357SAndroid Build Coastguard Worker | CCS_NODIVIDER
483*f6dc9357SAndroid Build Coastguard Worker | CCS_NORESIZE
484*f6dc9357SAndroid Build Coastguard Worker | TBSTYLE_FLAT
485*f6dc9357SAndroid Build Coastguard Worker ;
486*f6dc9357SAndroid Build Coastguard Worker }
487*f6dc9357SAndroid Build Coastguard Worker
488*f6dc9357SAndroid Build Coastguard Worker _headerToolBar.Attach(::CreateToolbarEx ((*this), toolbarStyle,
489*f6dc9357SAndroid Build Coastguard Worker _baseID + 2, 11,
490*f6dc9357SAndroid Build Coastguard Worker (HINSTANCE)HINST_COMMCTRL,
491*f6dc9357SAndroid Build Coastguard Worker IDB_VIEW_SMALL_COLOR,
492*f6dc9357SAndroid Build Coastguard Worker (LPCTBBUTTON)&tbb, Z7_ARRAY_SIZE(tbb),
493*f6dc9357SAndroid Build Coastguard Worker 0, 0, 0, 0, sizeof (TBBUTTON)));
494*f6dc9357SAndroid Build Coastguard Worker
495*f6dc9357SAndroid Build Coastguard Worker #ifndef UNDER_CE
496*f6dc9357SAndroid Build Coastguard Worker // Load ComboBoxEx class
497*f6dc9357SAndroid Build Coastguard Worker icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
498*f6dc9357SAndroid Build Coastguard Worker icex.dwICC = ICC_USEREX_CLASSES;
499*f6dc9357SAndroid Build Coastguard Worker InitCommonControlsEx(&icex);
500*f6dc9357SAndroid Build Coastguard Worker #endif
501*f6dc9357SAndroid Build Coastguard Worker
502*f6dc9357SAndroid Build Coastguard Worker _headerComboBox.CreateEx(0,
503*f6dc9357SAndroid Build Coastguard Worker #ifdef UNDER_CE
504*f6dc9357SAndroid Build Coastguard Worker WC_COMBOBOXW
505*f6dc9357SAndroid Build Coastguard Worker #else
506*f6dc9357SAndroid Build Coastguard Worker WC_COMBOBOXEXW
507*f6dc9357SAndroid Build Coastguard Worker #endif
508*f6dc9357SAndroid Build Coastguard Worker , NULL,
509*f6dc9357SAndroid Build Coastguard Worker WS_BORDER | WS_VISIBLE |WS_CHILD | CBS_DROPDOWN | CBS_AUTOHSCROLL,
510*f6dc9357SAndroid Build Coastguard Worker 0, 0, 100, 620,
511*f6dc9357SAndroid Build Coastguard Worker (_headerReBar ? _headerToolBar : (HWND)*this),
512*f6dc9357SAndroid Build Coastguard Worker (HMENU)(UINT_PTR)(_comboBoxID),
513*f6dc9357SAndroid Build Coastguard Worker g_hInstance, NULL);
514*f6dc9357SAndroid Build Coastguard Worker
515*f6dc9357SAndroid Build Coastguard Worker #ifndef UNDER_CE
516*f6dc9357SAndroid Build Coastguard Worker _headerComboBox.SetUnicodeFormat(true);
517*f6dc9357SAndroid Build Coastguard Worker _headerComboBox.SetImageList(Shell_Get_SysImageList_smallIcons(true));
518*f6dc9357SAndroid Build Coastguard Worker _headerComboBox.SetExtendedStyle(CBES_EX_PATHWORDBREAKPROC, CBES_EX_PATHWORDBREAKPROC);
519*f6dc9357SAndroid Build Coastguard Worker /*
520*f6dc9357SAndroid Build Coastguard Worker _headerComboBox.SetUserDataLongPtr(LONG_PTR(&_headerComboBox));
521*f6dc9357SAndroid Build Coastguard Worker _headerComboBox._panel = this;
522*f6dc9357SAndroid Build Coastguard Worker _headerComboBox._origWindowProc =
523*f6dc9357SAndroid Build Coastguard Worker (WNDPROC)_headerComboBox.SetLongPtr(GWLP_WNDPROC,
524*f6dc9357SAndroid Build Coastguard Worker LONG_PTR(ComboBoxSubclassProc));
525*f6dc9357SAndroid Build Coastguard Worker */
526*f6dc9357SAndroid Build Coastguard Worker _comboBoxEdit.Attach(_headerComboBox.GetEditControl());
527*f6dc9357SAndroid Build Coastguard Worker // _comboBoxEdit.SendMessage(CCM_SETUNICODEFORMAT, (WPARAM)(BOOL)TRUE, 0);
528*f6dc9357SAndroid Build Coastguard Worker _comboBoxEdit.SetUserDataLongPtr(LONG_PTR(&_comboBoxEdit));
529*f6dc9357SAndroid Build Coastguard Worker _comboBoxEdit._panel = this;
530*f6dc9357SAndroid Build Coastguard Worker #ifndef _UNICODE
531*f6dc9357SAndroid Build Coastguard Worker if (g_IsNT)
532*f6dc9357SAndroid Build Coastguard Worker _comboBoxEdit._origWindowProc =
533*f6dc9357SAndroid Build Coastguard Worker (WNDPROC)_comboBoxEdit.SetLongPtrW(GWLP_WNDPROC, LONG_PTR(ComboBoxEditSubclassProc));
534*f6dc9357SAndroid Build Coastguard Worker else
535*f6dc9357SAndroid Build Coastguard Worker #endif
536*f6dc9357SAndroid Build Coastguard Worker _comboBoxEdit._origWindowProc =
537*f6dc9357SAndroid Build Coastguard Worker (WNDPROC)_comboBoxEdit.SetLongPtr(GWLP_WNDPROC, LONG_PTR(ComboBoxEditSubclassProc));
538*f6dc9357SAndroid Build Coastguard Worker #endif
539*f6dc9357SAndroid Build Coastguard Worker
540*f6dc9357SAndroid Build Coastguard Worker if (_headerReBar)
541*f6dc9357SAndroid Build Coastguard Worker {
542*f6dc9357SAndroid Build Coastguard Worker REBARINFO rbi;
543*f6dc9357SAndroid Build Coastguard Worker rbi.cbSize = sizeof(REBARINFO); // Required when using this struct.
544*f6dc9357SAndroid Build Coastguard Worker rbi.fMask = 0;
545*f6dc9357SAndroid Build Coastguard Worker rbi.himl = (HIMAGELIST)NULL;
546*f6dc9357SAndroid Build Coastguard Worker _headerReBar.SetBarInfo(&rbi);
547*f6dc9357SAndroid Build Coastguard Worker
548*f6dc9357SAndroid Build Coastguard Worker // Send the TB_BUTTONSTRUCTSIZE message, which is required for
549*f6dc9357SAndroid Build Coastguard Worker // backward compatibility.
550*f6dc9357SAndroid Build Coastguard Worker // _headerToolBar.SendMessage(TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);
551*f6dc9357SAndroid Build Coastguard Worker SIZE size;
552*f6dc9357SAndroid Build Coastguard Worker _headerToolBar.GetMaxSize(&size);
553*f6dc9357SAndroid Build Coastguard Worker
554*f6dc9357SAndroid Build Coastguard Worker REBARBANDINFO rbBand;
555*f6dc9357SAndroid Build Coastguard Worker memset(&rbBand, 0, sizeof(rbBand));
556*f6dc9357SAndroid Build Coastguard Worker // rbBand.cbSize = sizeof(rbBand); // for debug
557*f6dc9357SAndroid Build Coastguard Worker // rbBand.cbSize = REBARBANDINFO_V3_SIZE; // for debug
558*f6dc9357SAndroid Build Coastguard Worker rbBand.cbSize = my_compatib_REBARBANDINFO_size;
559*f6dc9357SAndroid Build Coastguard Worker rbBand.fMask = RBBIM_STYLE | RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_SIZE;
560*f6dc9357SAndroid Build Coastguard Worker rbBand.fStyle = RBBS_NOGRIPPER;
561*f6dc9357SAndroid Build Coastguard Worker rbBand.cxMinChild = (UINT)size.cx;
562*f6dc9357SAndroid Build Coastguard Worker rbBand.cyMinChild = (UINT)size.cy;
563*f6dc9357SAndroid Build Coastguard Worker rbBand.cyChild = (UINT)size.cy;
564*f6dc9357SAndroid Build Coastguard Worker rbBand.cx = (UINT)size.cx;
565*f6dc9357SAndroid Build Coastguard Worker rbBand.hwndChild = _headerToolBar;
566*f6dc9357SAndroid Build Coastguard Worker _headerReBar.InsertBand(-1, &rbBand);
567*f6dc9357SAndroid Build Coastguard Worker
568*f6dc9357SAndroid Build Coastguard Worker RECT rc;
569*f6dc9357SAndroid Build Coastguard Worker ::GetWindowRect(_headerComboBox, &rc);
570*f6dc9357SAndroid Build Coastguard Worker rbBand.cxMinChild = 30;
571*f6dc9357SAndroid Build Coastguard Worker rbBand.cyMinChild = (UINT)(rc.bottom - rc.top);
572*f6dc9357SAndroid Build Coastguard Worker rbBand.cx = 1000;
573*f6dc9357SAndroid Build Coastguard Worker rbBand.hwndChild = _headerComboBox;
574*f6dc9357SAndroid Build Coastguard Worker _headerReBar.InsertBand(-1, &rbBand);
575*f6dc9357SAndroid Build Coastguard Worker // _headerReBar.MaximizeBand(1, false);
576*f6dc9357SAndroid Build Coastguard Worker }
577*f6dc9357SAndroid Build Coastguard Worker
578*f6dc9357SAndroid Build Coastguard Worker _statusBar.Create(WS_CHILD | WS_VISIBLE, L"Status", (*this), _statusBarID);
579*f6dc9357SAndroid Build Coastguard Worker // _statusBar2.Create(WS_CHILD | WS_VISIBLE, L"Status", (*this), _statusBarID + 1);
580*f6dc9357SAndroid Build Coastguard Worker
581*f6dc9357SAndroid Build Coastguard Worker const int sizes[] = {220, 320, 420, -1};
582*f6dc9357SAndroid Build Coastguard Worker _statusBar.SetParts(4, sizes);
583*f6dc9357SAndroid Build Coastguard Worker // _statusBar2.SetParts(5, sizes);
584*f6dc9357SAndroid Build Coastguard Worker
585*f6dc9357SAndroid Build Coastguard Worker /*
586*f6dc9357SAndroid Build Coastguard Worker RECT rect;
587*f6dc9357SAndroid Build Coastguard Worker GetClientRect(&rect);
588*f6dc9357SAndroid Build Coastguard Worker OnSize(0, RECT_SIZE_X(rect), RECT_SIZE_Y(rect));
589*f6dc9357SAndroid Build Coastguard Worker */
590*f6dc9357SAndroid Build Coastguard Worker
591*f6dc9357SAndroid Build Coastguard Worker SetTimer(kTimerID, kTimerElapse);
592*f6dc9357SAndroid Build Coastguard Worker
593*f6dc9357SAndroid Build Coastguard Worker // InitListCtrl();
594*f6dc9357SAndroid Build Coastguard Worker RefreshListCtrl();
595*f6dc9357SAndroid Build Coastguard Worker
596*f6dc9357SAndroid Build Coastguard Worker return true;
597*f6dc9357SAndroid Build Coastguard Worker }
598*f6dc9357SAndroid Build Coastguard Worker
OnDestroy()599*f6dc9357SAndroid Build Coastguard Worker void CPanel::OnDestroy()
600*f6dc9357SAndroid Build Coastguard Worker {
601*f6dc9357SAndroid Build Coastguard Worker SaveListViewInfo();
602*f6dc9357SAndroid Build Coastguard Worker CWindow2::OnDestroy();
603*f6dc9357SAndroid Build Coastguard Worker }
604*f6dc9357SAndroid Build Coastguard Worker
ChangeWindowSize(int xSize,int ySize)605*f6dc9357SAndroid Build Coastguard Worker void CPanel::ChangeWindowSize(int xSize, int ySize)
606*f6dc9357SAndroid Build Coastguard Worker {
607*f6dc9357SAndroid Build Coastguard Worker if (!(HWND)*this)
608*f6dc9357SAndroid Build Coastguard Worker return;
609*f6dc9357SAndroid Build Coastguard Worker int kHeaderSize;
610*f6dc9357SAndroid Build Coastguard Worker int kStatusBarSize;
611*f6dc9357SAndroid Build Coastguard Worker // int kStatusBar2Size;
612*f6dc9357SAndroid Build Coastguard Worker RECT rect;
613*f6dc9357SAndroid Build Coastguard Worker if (_headerReBar)
614*f6dc9357SAndroid Build Coastguard Worker _headerReBar.GetWindowRect(&rect);
615*f6dc9357SAndroid Build Coastguard Worker else
616*f6dc9357SAndroid Build Coastguard Worker _headerToolBar.GetWindowRect(&rect);
617*f6dc9357SAndroid Build Coastguard Worker
618*f6dc9357SAndroid Build Coastguard Worker kHeaderSize = RECT_SIZE_Y(rect);
619*f6dc9357SAndroid Build Coastguard Worker
620*f6dc9357SAndroid Build Coastguard Worker _statusBar.GetWindowRect(&rect);
621*f6dc9357SAndroid Build Coastguard Worker kStatusBarSize = RECT_SIZE_Y(rect);
622*f6dc9357SAndroid Build Coastguard Worker
623*f6dc9357SAndroid Build Coastguard Worker // _statusBar2.GetWindowRect(&rect);
624*f6dc9357SAndroid Build Coastguard Worker // kStatusBar2Size = RECT_SIZE_Y(rect);
625*f6dc9357SAndroid Build Coastguard Worker
626*f6dc9357SAndroid Build Coastguard Worker int yListViewSize = MyMax(ySize - kHeaderSize - kStatusBarSize, 0);
627*f6dc9357SAndroid Build Coastguard Worker const int kStartXPos = 32;
628*f6dc9357SAndroid Build Coastguard Worker if (_headerReBar)
629*f6dc9357SAndroid Build Coastguard Worker {
630*f6dc9357SAndroid Build Coastguard Worker }
631*f6dc9357SAndroid Build Coastguard Worker else
632*f6dc9357SAndroid Build Coastguard Worker {
633*f6dc9357SAndroid Build Coastguard Worker _headerToolBar.Move(0, 0, xSize, 0);
634*f6dc9357SAndroid Build Coastguard Worker _headerComboBox.Move(kStartXPos, 2,
635*f6dc9357SAndroid Build Coastguard Worker MyMax(xSize - kStartXPos - 10, kStartXPos), 0);
636*f6dc9357SAndroid Build Coastguard Worker }
637*f6dc9357SAndroid Build Coastguard Worker _listView.Move(0, kHeaderSize, xSize, yListViewSize);
638*f6dc9357SAndroid Build Coastguard Worker _statusBar.Move(0, kHeaderSize + yListViewSize, xSize, kStatusBarSize);
639*f6dc9357SAndroid Build Coastguard Worker // _statusBar2.MoveWindow(0, kHeaderSize + yListViewSize + kStatusBarSize, xSize, kStatusBar2Size);
640*f6dc9357SAndroid Build Coastguard Worker // _statusBar.MoveWindow(0, 100, xSize, kStatusBarSize);
641*f6dc9357SAndroid Build Coastguard Worker // _statusBar2.MoveWindow(0, 200, xSize, kStatusBar2Size);
642*f6dc9357SAndroid Build Coastguard Worker }
643*f6dc9357SAndroid Build Coastguard Worker
OnSize(WPARAM,int xSize,int ySize)644*f6dc9357SAndroid Build Coastguard Worker bool CPanel::OnSize(WPARAM /* wParam */, int xSize, int ySize)
645*f6dc9357SAndroid Build Coastguard Worker {
646*f6dc9357SAndroid Build Coastguard Worker if (!(HWND)*this)
647*f6dc9357SAndroid Build Coastguard Worker return true;
648*f6dc9357SAndroid Build Coastguard Worker if (_headerReBar)
649*f6dc9357SAndroid Build Coastguard Worker _headerReBar.Move(0, 0, xSize, 0);
650*f6dc9357SAndroid Build Coastguard Worker ChangeWindowSize(xSize, ySize);
651*f6dc9357SAndroid Build Coastguard Worker return true;
652*f6dc9357SAndroid Build Coastguard Worker }
653*f6dc9357SAndroid Build Coastguard Worker
OnNotifyReBar(LPNMHDR header,LRESULT &)654*f6dc9357SAndroid Build Coastguard Worker bool CPanel::OnNotifyReBar(LPNMHDR header, LRESULT & /* result */)
655*f6dc9357SAndroid Build Coastguard Worker {
656*f6dc9357SAndroid Build Coastguard Worker switch (header->code)
657*f6dc9357SAndroid Build Coastguard Worker {
658*f6dc9357SAndroid Build Coastguard Worker case RBN_HEIGHTCHANGE:
659*f6dc9357SAndroid Build Coastguard Worker {
660*f6dc9357SAndroid Build Coastguard Worker RECT rect;
661*f6dc9357SAndroid Build Coastguard Worker GetWindowRect(&rect);
662*f6dc9357SAndroid Build Coastguard Worker ChangeWindowSize(RECT_SIZE_X(rect), RECT_SIZE_Y(rect));
663*f6dc9357SAndroid Build Coastguard Worker return false;
664*f6dc9357SAndroid Build Coastguard Worker }
665*f6dc9357SAndroid Build Coastguard Worker }
666*f6dc9357SAndroid Build Coastguard Worker return false;
667*f6dc9357SAndroid Build Coastguard Worker }
668*f6dc9357SAndroid Build Coastguard Worker
669*f6dc9357SAndroid Build Coastguard Worker /*
670*f6dc9357SAndroid Build Coastguard Worker UInt32 g_OnNotify = 0;
671*f6dc9357SAndroid Build Coastguard Worker UInt32 g_LVIF_TEXT = 0;
672*f6dc9357SAndroid Build Coastguard Worker UInt32 g_Time = 0;
673*f6dc9357SAndroid Build Coastguard Worker
674*f6dc9357SAndroid Build Coastguard Worker void Print_OnNotify(const char *name)
675*f6dc9357SAndroid Build Coastguard Worker {
676*f6dc9357SAndroid Build Coastguard Worker char s[256];
677*f6dc9357SAndroid Build Coastguard Worker DWORD tim = GetTickCount();
678*f6dc9357SAndroid Build Coastguard Worker sprintf(s,
679*f6dc9357SAndroid Build Coastguard Worker "Time = %7u ms, Notify = %9u, TEXT = %9u, %s",
680*f6dc9357SAndroid Build Coastguard Worker tim - g_Time,
681*f6dc9357SAndroid Build Coastguard Worker g_OnNotify,
682*f6dc9357SAndroid Build Coastguard Worker g_LVIF_TEXT,
683*f6dc9357SAndroid Build Coastguard Worker name);
684*f6dc9357SAndroid Build Coastguard Worker g_Time = tim;
685*f6dc9357SAndroid Build Coastguard Worker OutputDebugStringA(s);
686*f6dc9357SAndroid Build Coastguard Worker g_OnNotify = 0;
687*f6dc9357SAndroid Build Coastguard Worker g_LVIF_TEXT = 0;
688*f6dc9357SAndroid Build Coastguard Worker }
689*f6dc9357SAndroid Build Coastguard Worker */
690*f6dc9357SAndroid Build Coastguard Worker
OnNotify(UINT,LPNMHDR header,LRESULT & result)691*f6dc9357SAndroid Build Coastguard Worker bool CPanel::OnNotify(UINT /* controlID */, LPNMHDR header, LRESULT &result)
692*f6dc9357SAndroid Build Coastguard Worker {
693*f6dc9357SAndroid Build Coastguard Worker /*
694*f6dc9357SAndroid Build Coastguard Worker g_OnNotify++;
695*f6dc9357SAndroid Build Coastguard Worker
696*f6dc9357SAndroid Build Coastguard Worker if (header->hwndFrom == _listView)
697*f6dc9357SAndroid Build Coastguard Worker {
698*f6dc9357SAndroid Build Coastguard Worker if (header->code == LVN_GETDISPINFOW)
699*f6dc9357SAndroid Build Coastguard Worker {
700*f6dc9357SAndroid Build Coastguard Worker LV_DISPINFOW *dispInfo = (LV_DISPINFOW *)header;
701*f6dc9357SAndroid Build Coastguard Worker if ((dispInfo->item.mask & LVIF_TEXT))
702*f6dc9357SAndroid Build Coastguard Worker g_LVIF_TEXT++;
703*f6dc9357SAndroid Build Coastguard Worker }
704*f6dc9357SAndroid Build Coastguard Worker }
705*f6dc9357SAndroid Build Coastguard Worker */
706*f6dc9357SAndroid Build Coastguard Worker
707*f6dc9357SAndroid Build Coastguard Worker if (!_processNotify)
708*f6dc9357SAndroid Build Coastguard Worker return false;
709*f6dc9357SAndroid Build Coastguard Worker
710*f6dc9357SAndroid Build Coastguard Worker if (header->hwndFrom == _headerComboBox)
711*f6dc9357SAndroid Build Coastguard Worker return OnNotifyComboBox(header, result);
712*f6dc9357SAndroid Build Coastguard Worker else if (header->hwndFrom == _headerReBar)
713*f6dc9357SAndroid Build Coastguard Worker return OnNotifyReBar(header, result);
714*f6dc9357SAndroid Build Coastguard Worker else if (header->hwndFrom == _listView)
715*f6dc9357SAndroid Build Coastguard Worker return OnNotifyList(header, result);
716*f6dc9357SAndroid Build Coastguard Worker else if (::GetParent(header->hwndFrom) == _listView)
717*f6dc9357SAndroid Build Coastguard Worker {
718*f6dc9357SAndroid Build Coastguard Worker // NMHDR:code is UINT
719*f6dc9357SAndroid Build Coastguard Worker // NM_RCLICK is unsigned in windows sdk
720*f6dc9357SAndroid Build Coastguard Worker // NM_RCLICK is int in MinGW
721*f6dc9357SAndroid Build Coastguard Worker if (header->code == (UINT)NM_RCLICK)
722*f6dc9357SAndroid Build Coastguard Worker return OnRightClick((MY_NMLISTVIEW_NMITEMACTIVATE *)header, result);
723*f6dc9357SAndroid Build Coastguard Worker }
724*f6dc9357SAndroid Build Coastguard Worker return false;
725*f6dc9357SAndroid Build Coastguard Worker }
726*f6dc9357SAndroid Build Coastguard Worker
OnCommand(unsigned code,unsigned itemID,LPARAM lParam,LRESULT & result)727*f6dc9357SAndroid Build Coastguard Worker bool CPanel::OnCommand(unsigned code, unsigned itemID, LPARAM lParam, LRESULT &result)
728*f6dc9357SAndroid Build Coastguard Worker {
729*f6dc9357SAndroid Build Coastguard Worker if (itemID == kParentFolderID)
730*f6dc9357SAndroid Build Coastguard Worker {
731*f6dc9357SAndroid Build Coastguard Worker OpenParentFolder();
732*f6dc9357SAndroid Build Coastguard Worker result = 0;
733*f6dc9357SAndroid Build Coastguard Worker return true;
734*f6dc9357SAndroid Build Coastguard Worker }
735*f6dc9357SAndroid Build Coastguard Worker /*
736*f6dc9357SAndroid Build Coastguard Worker if (itemID == kCreateFolderID)
737*f6dc9357SAndroid Build Coastguard Worker {
738*f6dc9357SAndroid Build Coastguard Worker CreateFolder();
739*f6dc9357SAndroid Build Coastguard Worker result = 0;
740*f6dc9357SAndroid Build Coastguard Worker return true;
741*f6dc9357SAndroid Build Coastguard Worker }
742*f6dc9357SAndroid Build Coastguard Worker */
743*f6dc9357SAndroid Build Coastguard Worker if (itemID == _comboBoxID)
744*f6dc9357SAndroid Build Coastguard Worker {
745*f6dc9357SAndroid Build Coastguard Worker if (OnComboBoxCommand(code, lParam, result))
746*f6dc9357SAndroid Build Coastguard Worker return true;
747*f6dc9357SAndroid Build Coastguard Worker }
748*f6dc9357SAndroid Build Coastguard Worker return CWindow2::OnCommand(code, itemID, lParam, result);
749*f6dc9357SAndroid Build Coastguard Worker }
750*f6dc9357SAndroid Build Coastguard Worker
751*f6dc9357SAndroid Build Coastguard Worker
752*f6dc9357SAndroid Build Coastguard Worker
753*f6dc9357SAndroid Build Coastguard Worker /*
754*f6dc9357SAndroid Build Coastguard Worker void CPanel::MessageBox_Info(LPCWSTR message, LPCWSTR caption) const
755*f6dc9357SAndroid Build Coastguard Worker { ::MessageBoxW((HWND)*this, message, caption, MB_OK); }
756*f6dc9357SAndroid Build Coastguard Worker void CPanel::MessageBox_Warning(LPCWSTR message) const
757*f6dc9357SAndroid Build Coastguard Worker { ::MessageBoxW((HWND)*this, message, L"7-Zip", MB_OK | MB_ICONWARNING); }
758*f6dc9357SAndroid Build Coastguard Worker */
759*f6dc9357SAndroid Build Coastguard Worker
MessageBox_Error_Caption(LPCWSTR message,LPCWSTR caption) const760*f6dc9357SAndroid Build Coastguard Worker void CPanel::MessageBox_Error_Caption(LPCWSTR message, LPCWSTR caption) const
761*f6dc9357SAndroid Build Coastguard Worker { ::MessageBoxW((HWND)*this, message, caption, MB_OK | MB_ICONSTOP); }
762*f6dc9357SAndroid Build Coastguard Worker
MessageBox_Error(LPCWSTR message) const763*f6dc9357SAndroid Build Coastguard Worker void CPanel::MessageBox_Error(LPCWSTR message) const
764*f6dc9357SAndroid Build Coastguard Worker { MessageBox_Error_Caption(message, L"7-Zip"); }
765*f6dc9357SAndroid Build Coastguard Worker
ErrorHResult_To_Message(HRESULT errorCode)766*f6dc9357SAndroid Build Coastguard Worker static UString ErrorHResult_To_Message(HRESULT errorCode)
767*f6dc9357SAndroid Build Coastguard Worker {
768*f6dc9357SAndroid Build Coastguard Worker if (errorCode == 0)
769*f6dc9357SAndroid Build Coastguard Worker errorCode = E_FAIL;
770*f6dc9357SAndroid Build Coastguard Worker return HResultToMessage(errorCode);
771*f6dc9357SAndroid Build Coastguard Worker }
772*f6dc9357SAndroid Build Coastguard Worker
MessageBox_Error_HRESULT_Caption(HRESULT errorCode,LPCWSTR caption) const773*f6dc9357SAndroid Build Coastguard Worker void CPanel::MessageBox_Error_HRESULT_Caption(HRESULT errorCode, LPCWSTR caption) const
774*f6dc9357SAndroid Build Coastguard Worker {
775*f6dc9357SAndroid Build Coastguard Worker MessageBox_Error_Caption(ErrorHResult_To_Message(errorCode), caption);
776*f6dc9357SAndroid Build Coastguard Worker }
777*f6dc9357SAndroid Build Coastguard Worker
MessageBox_Error_HRESULT(HRESULT errorCode) const778*f6dc9357SAndroid Build Coastguard Worker void CPanel::MessageBox_Error_HRESULT(HRESULT errorCode) const
779*f6dc9357SAndroid Build Coastguard Worker { MessageBox_Error_HRESULT_Caption(errorCode, L"7-Zip"); }
780*f6dc9357SAndroid Build Coastguard Worker
MessageBox_Error_2Lines_Message_HRESULT(LPCWSTR message,HRESULT errorCode) const781*f6dc9357SAndroid Build Coastguard Worker void CPanel::MessageBox_Error_2Lines_Message_HRESULT(LPCWSTR message, HRESULT errorCode) const
782*f6dc9357SAndroid Build Coastguard Worker {
783*f6dc9357SAndroid Build Coastguard Worker UString m = message;
784*f6dc9357SAndroid Build Coastguard Worker m.Add_LF();
785*f6dc9357SAndroid Build Coastguard Worker m += ErrorHResult_To_Message(errorCode);
786*f6dc9357SAndroid Build Coastguard Worker MessageBox_Error(m);
787*f6dc9357SAndroid Build Coastguard Worker }
788*f6dc9357SAndroid Build Coastguard Worker
MessageBox_LastError(LPCWSTR caption) const789*f6dc9357SAndroid Build Coastguard Worker void CPanel::MessageBox_LastError(LPCWSTR caption) const
790*f6dc9357SAndroid Build Coastguard Worker { MessageBox_Error_HRESULT_Caption(GetLastError_noZero_HRESULT(), caption); }
791*f6dc9357SAndroid Build Coastguard Worker
MessageBox_LastError() const792*f6dc9357SAndroid Build Coastguard Worker void CPanel::MessageBox_LastError() const
793*f6dc9357SAndroid Build Coastguard Worker { MessageBox_LastError(L"7-Zip"); }
794*f6dc9357SAndroid Build Coastguard Worker
MessageBox_Error_LangID(UINT resourceID) const795*f6dc9357SAndroid Build Coastguard Worker void CPanel::MessageBox_Error_LangID(UINT resourceID) const
796*f6dc9357SAndroid Build Coastguard Worker { MessageBox_Error(LangString(resourceID)); }
797*f6dc9357SAndroid Build Coastguard Worker
MessageBox_Error_UnsupportOperation() const798*f6dc9357SAndroid Build Coastguard Worker void CPanel::MessageBox_Error_UnsupportOperation() const
799*f6dc9357SAndroid Build Coastguard Worker { MessageBox_Error_LangID(IDS_OPERATION_IS_NOT_SUPPORTED); }
800*f6dc9357SAndroid Build Coastguard Worker
801*f6dc9357SAndroid Build Coastguard Worker
802*f6dc9357SAndroid Build Coastguard Worker
803*f6dc9357SAndroid Build Coastguard Worker
SetFocusToList()804*f6dc9357SAndroid Build Coastguard Worker void CPanel::SetFocusToList()
805*f6dc9357SAndroid Build Coastguard Worker {
806*f6dc9357SAndroid Build Coastguard Worker _listView.SetFocus();
807*f6dc9357SAndroid Build Coastguard Worker // SetCurrentPathText();
808*f6dc9357SAndroid Build Coastguard Worker }
809*f6dc9357SAndroid Build Coastguard Worker
SetFocusToLastRememberedItem()810*f6dc9357SAndroid Build Coastguard Worker void CPanel::SetFocusToLastRememberedItem()
811*f6dc9357SAndroid Build Coastguard Worker {
812*f6dc9357SAndroid Build Coastguard Worker if (_lastFocusedIsList)
813*f6dc9357SAndroid Build Coastguard Worker SetFocusToList();
814*f6dc9357SAndroid Build Coastguard Worker else
815*f6dc9357SAndroid Build Coastguard Worker _headerComboBox.SetFocus();
816*f6dc9357SAndroid Build Coastguard Worker }
817*f6dc9357SAndroid Build Coastguard Worker
GetFolderTypeID() const818*f6dc9357SAndroid Build Coastguard Worker UString CPanel::GetFolderTypeID() const
819*f6dc9357SAndroid Build Coastguard Worker {
820*f6dc9357SAndroid Build Coastguard Worker {
821*f6dc9357SAndroid Build Coastguard Worker NCOM::CPropVariant prop;
822*f6dc9357SAndroid Build Coastguard Worker if (_folder->GetFolderProperty(kpidType, &prop) == S_OK)
823*f6dc9357SAndroid Build Coastguard Worker if (prop.vt == VT_BSTR)
824*f6dc9357SAndroid Build Coastguard Worker return (const wchar_t *)prop.bstrVal;
825*f6dc9357SAndroid Build Coastguard Worker }
826*f6dc9357SAndroid Build Coastguard Worker return UString();
827*f6dc9357SAndroid Build Coastguard Worker }
828*f6dc9357SAndroid Build Coastguard Worker
IsFolderTypeEqTo(const char * s) const829*f6dc9357SAndroid Build Coastguard Worker bool CPanel::IsFolderTypeEqTo(const char *s) const
830*f6dc9357SAndroid Build Coastguard Worker {
831*f6dc9357SAndroid Build Coastguard Worker return StringsAreEqual_Ascii(GetFolderTypeID(), s);
832*f6dc9357SAndroid Build Coastguard Worker }
833*f6dc9357SAndroid Build Coastguard Worker
IsRootFolder() const834*f6dc9357SAndroid Build Coastguard Worker bool CPanel::IsRootFolder() const { return IsFolderTypeEqTo("RootFolder"); }
IsFSFolder() const835*f6dc9357SAndroid Build Coastguard Worker bool CPanel::IsFSFolder() const { return IsFolderTypeEqTo("FSFolder"); }
IsFSDrivesFolder() const836*f6dc9357SAndroid Build Coastguard Worker bool CPanel::IsFSDrivesFolder() const { return IsFolderTypeEqTo("FSDrives"); }
IsAltStreamsFolder() const837*f6dc9357SAndroid Build Coastguard Worker bool CPanel::IsAltStreamsFolder() const { return IsFolderTypeEqTo("AltStreamsFolder"); }
IsArcFolder() const838*f6dc9357SAndroid Build Coastguard Worker bool CPanel::IsArcFolder() const
839*f6dc9357SAndroid Build Coastguard Worker {
840*f6dc9357SAndroid Build Coastguard Worker return GetFolderTypeID().IsPrefixedBy_Ascii_NoCase("7-Zip");
841*f6dc9357SAndroid Build Coastguard Worker }
842*f6dc9357SAndroid Build Coastguard Worker
IsHashFolder() const843*f6dc9357SAndroid Build Coastguard Worker bool CPanel::IsHashFolder() const
844*f6dc9357SAndroid Build Coastguard Worker {
845*f6dc9357SAndroid Build Coastguard Worker if (_folder)
846*f6dc9357SAndroid Build Coastguard Worker {
847*f6dc9357SAndroid Build Coastguard Worker NCOM::CPropVariant prop;
848*f6dc9357SAndroid Build Coastguard Worker if (_folder->GetFolderProperty(kpidIsHash, &prop) == S_OK)
849*f6dc9357SAndroid Build Coastguard Worker if (prop.vt == VT_BOOL)
850*f6dc9357SAndroid Build Coastguard Worker return VARIANT_BOOLToBool(prop.boolVal);
851*f6dc9357SAndroid Build Coastguard Worker }
852*f6dc9357SAndroid Build Coastguard Worker return false;
853*f6dc9357SAndroid Build Coastguard Worker }
854*f6dc9357SAndroid Build Coastguard Worker
GetFsPath() const855*f6dc9357SAndroid Build Coastguard Worker UString CPanel::GetFsPath() const
856*f6dc9357SAndroid Build Coastguard Worker {
857*f6dc9357SAndroid Build Coastguard Worker if (IsFSDrivesFolder() && !IsDeviceDrivesPrefix() && !IsSuperDrivesPrefix())
858*f6dc9357SAndroid Build Coastguard Worker return UString();
859*f6dc9357SAndroid Build Coastguard Worker return _currentFolderPrefix;
860*f6dc9357SAndroid Build Coastguard Worker }
861*f6dc9357SAndroid Build Coastguard Worker
GetDriveOrNetworkPrefix() const862*f6dc9357SAndroid Build Coastguard Worker UString CPanel::GetDriveOrNetworkPrefix() const
863*f6dc9357SAndroid Build Coastguard Worker {
864*f6dc9357SAndroid Build Coastguard Worker if (!IsFSFolder())
865*f6dc9357SAndroid Build Coastguard Worker return UString();
866*f6dc9357SAndroid Build Coastguard Worker UString drive = GetFsPath();
867*f6dc9357SAndroid Build Coastguard Worker drive.DeleteFrom(NFile::NName::GetRootPrefixSize(drive));
868*f6dc9357SAndroid Build Coastguard Worker return drive;
869*f6dc9357SAndroid Build Coastguard Worker }
870*f6dc9357SAndroid Build Coastguard Worker
SetListViewMode(UInt32 index)871*f6dc9357SAndroid Build Coastguard Worker void CPanel::SetListViewMode(UInt32 index)
872*f6dc9357SAndroid Build Coastguard Worker {
873*f6dc9357SAndroid Build Coastguard Worker if (index >= 4)
874*f6dc9357SAndroid Build Coastguard Worker return;
875*f6dc9357SAndroid Build Coastguard Worker _listViewMode = index;
876*f6dc9357SAndroid Build Coastguard Worker const LONG_PTR oldStyle = _listView.GetStyle();
877*f6dc9357SAndroid Build Coastguard Worker const DWORD newStyle = kStyles[index];
878*f6dc9357SAndroid Build Coastguard Worker
879*f6dc9357SAndroid Build Coastguard Worker // DWORD tickCount1 = GetTickCount();
880*f6dc9357SAndroid Build Coastguard Worker if ((oldStyle & LVS_TYPEMASK) != (LONG_PTR)newStyle)
881*f6dc9357SAndroid Build Coastguard Worker _listView.SetStyle((oldStyle & ~(LONG_PTR)(DWORD)LVS_TYPEMASK) | (LONG_PTR)newStyle);
882*f6dc9357SAndroid Build Coastguard Worker // RefreshListCtrlSaveFocused();
883*f6dc9357SAndroid Build Coastguard Worker /*
884*f6dc9357SAndroid Build Coastguard Worker DWORD tickCount2 = GetTickCount();
885*f6dc9357SAndroid Build Coastguard Worker char s[256];
886*f6dc9357SAndroid Build Coastguard Worker sprintf(s, "SetStyle = %5d",
887*f6dc9357SAndroid Build Coastguard Worker tickCount2 - tickCount1
888*f6dc9357SAndroid Build Coastguard Worker );
889*f6dc9357SAndroid Build Coastguard Worker OutputDebugStringA(s);
890*f6dc9357SAndroid Build Coastguard Worker */
891*f6dc9357SAndroid Build Coastguard Worker
892*f6dc9357SAndroid Build Coastguard Worker }
893*f6dc9357SAndroid Build Coastguard Worker
ChangeFlatMode()894*f6dc9357SAndroid Build Coastguard Worker void CPanel::ChangeFlatMode()
895*f6dc9357SAndroid Build Coastguard Worker {
896*f6dc9357SAndroid Build Coastguard Worker _flatMode = !_flatMode;
897*f6dc9357SAndroid Build Coastguard Worker if (!_parentFolders.IsEmpty())
898*f6dc9357SAndroid Build Coastguard Worker _flatModeForArc = _flatMode;
899*f6dc9357SAndroid Build Coastguard Worker else
900*f6dc9357SAndroid Build Coastguard Worker _flatModeForDisk = _flatMode;
901*f6dc9357SAndroid Build Coastguard Worker RefreshListCtrl_SaveFocused();
902*f6dc9357SAndroid Build Coastguard Worker }
903*f6dc9357SAndroid Build Coastguard Worker
904*f6dc9357SAndroid Build Coastguard Worker /*
905*f6dc9357SAndroid Build Coastguard Worker void CPanel::Change_ShowNtfsStrems_Mode()
906*f6dc9357SAndroid Build Coastguard Worker {
907*f6dc9357SAndroid Build Coastguard Worker _showNtfsStrems_Mode = !_showNtfsStrems_Mode;
908*f6dc9357SAndroid Build Coastguard Worker if (!_parentFolders.IsEmpty())
909*f6dc9357SAndroid Build Coastguard Worker _showNtfsStrems_ModeForArc = _showNtfsStrems_Mode;
910*f6dc9357SAndroid Build Coastguard Worker else
911*f6dc9357SAndroid Build Coastguard Worker _showNtfsStrems_ModeForDisk = _showNtfsStrems_Mode;
912*f6dc9357SAndroid Build Coastguard Worker RefreshListCtrlSaveFocused();
913*f6dc9357SAndroid Build Coastguard Worker }
914*f6dc9357SAndroid Build Coastguard Worker */
915*f6dc9357SAndroid Build Coastguard Worker
Post_Refresh_StatusBar()916*f6dc9357SAndroid Build Coastguard Worker void CPanel::Post_Refresh_StatusBar()
917*f6dc9357SAndroid Build Coastguard Worker {
918*f6dc9357SAndroid Build Coastguard Worker if (_processStatusBar)
919*f6dc9357SAndroid Build Coastguard Worker PostMsg(kRefresh_StatusBar);
920*f6dc9357SAndroid Build Coastguard Worker }
921*f6dc9357SAndroid Build Coastguard Worker
AddToArchive()922*f6dc9357SAndroid Build Coastguard Worker void CPanel::AddToArchive()
923*f6dc9357SAndroid Build Coastguard Worker {
924*f6dc9357SAndroid Build Coastguard Worker if (!Is_IO_FS_Folder())
925*f6dc9357SAndroid Build Coastguard Worker {
926*f6dc9357SAndroid Build Coastguard Worker MessageBox_Error_UnsupportOperation();
927*f6dc9357SAndroid Build Coastguard Worker return;
928*f6dc9357SAndroid Build Coastguard Worker }
929*f6dc9357SAndroid Build Coastguard Worker CRecordVector<UInt32> indices;
930*f6dc9357SAndroid Build Coastguard Worker Get_ItemIndices_Operated(indices);
931*f6dc9357SAndroid Build Coastguard Worker if (indices.Size() == 0)
932*f6dc9357SAndroid Build Coastguard Worker {
933*f6dc9357SAndroid Build Coastguard Worker MessageBox_Error_LangID(IDS_SELECT_FILES);
934*f6dc9357SAndroid Build Coastguard Worker return;
935*f6dc9357SAndroid Build Coastguard Worker }
936*f6dc9357SAndroid Build Coastguard Worker UString destCurDirPrefix = GetFsPath();
937*f6dc9357SAndroid Build Coastguard Worker if (IsFSDrivesFolder())
938*f6dc9357SAndroid Build Coastguard Worker destCurDirPrefix = ROOT_FS_FOLDER;
939*f6dc9357SAndroid Build Coastguard Worker UStringVector names;
940*f6dc9357SAndroid Build Coastguard Worker GetFilePaths(indices, names);
941*f6dc9357SAndroid Build Coastguard Worker UString baseName;
942*f6dc9357SAndroid Build Coastguard Worker const UString arcName = CreateArchiveName(names,
943*f6dc9357SAndroid Build Coastguard Worker false, // isHash
944*f6dc9357SAndroid Build Coastguard Worker NULL, // CFileInfo *fi
945*f6dc9357SAndroid Build Coastguard Worker baseName);
946*f6dc9357SAndroid Build Coastguard Worker const HRESULT res = CompressFiles(destCurDirPrefix, arcName, L"",
947*f6dc9357SAndroid Build Coastguard Worker true, // addExtension
948*f6dc9357SAndroid Build Coastguard Worker names,
949*f6dc9357SAndroid Build Coastguard Worker false, // email
950*f6dc9357SAndroid Build Coastguard Worker true, // showDialog
951*f6dc9357SAndroid Build Coastguard Worker false); // waitFinish
952*f6dc9357SAndroid Build Coastguard Worker if (res != S_OK)
953*f6dc9357SAndroid Build Coastguard Worker {
954*f6dc9357SAndroid Build Coastguard Worker if (destCurDirPrefix.Len() >= MAX_PATH)
955*f6dc9357SAndroid Build Coastguard Worker MessageBox_Error_LangID(IDS_MESSAGE_UNSUPPORTED_OPERATION_FOR_LONG_PATH_FOLDER);
956*f6dc9357SAndroid Build Coastguard Worker }
957*f6dc9357SAndroid Build Coastguard Worker // KillSelection();
958*f6dc9357SAndroid Build Coastguard Worker }
959*f6dc9357SAndroid Build Coastguard Worker
960*f6dc9357SAndroid Build Coastguard Worker // function from ContextMenu.cpp
961*f6dc9357SAndroid Build Coastguard Worker UString GetSubFolderNameForExtract(const UString &arcPath);
962*f6dc9357SAndroid Build Coastguard Worker
GetSubFolderNameForExtract2(const UString & arcPath)963*f6dc9357SAndroid Build Coastguard Worker static UString GetSubFolderNameForExtract2(const UString &arcPath)
964*f6dc9357SAndroid Build Coastguard Worker {
965*f6dc9357SAndroid Build Coastguard Worker int slashPos = arcPath.ReverseFind_PathSepar();
966*f6dc9357SAndroid Build Coastguard Worker UString s;
967*f6dc9357SAndroid Build Coastguard Worker UString name = arcPath;
968*f6dc9357SAndroid Build Coastguard Worker if (slashPos >= 0)
969*f6dc9357SAndroid Build Coastguard Worker {
970*f6dc9357SAndroid Build Coastguard Worker s = arcPath.Left((unsigned)(slashPos + 1));
971*f6dc9357SAndroid Build Coastguard Worker name = arcPath.Ptr((unsigned)(slashPos + 1));
972*f6dc9357SAndroid Build Coastguard Worker }
973*f6dc9357SAndroid Build Coastguard Worker s += GetSubFolderNameForExtract(name);
974*f6dc9357SAndroid Build Coastguard Worker return s;
975*f6dc9357SAndroid Build Coastguard Worker }
976*f6dc9357SAndroid Build Coastguard Worker
977*f6dc9357SAndroid Build Coastguard Worker
FindDir_InOperatedList(const CRecordVector<UInt32> & operatedIndices) const978*f6dc9357SAndroid Build Coastguard Worker int CPanel::FindDir_InOperatedList(const CRecordVector<UInt32> &operatedIndices) const
979*f6dc9357SAndroid Build Coastguard Worker {
980*f6dc9357SAndroid Build Coastguard Worker const bool *isDirVector = _isDirVector.ConstData();
981*f6dc9357SAndroid Build Coastguard Worker const UInt32 *indices = operatedIndices.ConstData();
982*f6dc9357SAndroid Build Coastguard Worker const unsigned numItems = operatedIndices.Size();
983*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < numItems; i++)
984*f6dc9357SAndroid Build Coastguard Worker if (isDirVector[indices[i]])
985*f6dc9357SAndroid Build Coastguard Worker return (int)i;
986*f6dc9357SAndroid Build Coastguard Worker return -1;
987*f6dc9357SAndroid Build Coastguard Worker }
988*f6dc9357SAndroid Build Coastguard Worker
989*f6dc9357SAndroid Build Coastguard Worker
GetFilePaths(const CRecordVector<UInt32> & operatedIndices,UStringVector & paths) const990*f6dc9357SAndroid Build Coastguard Worker void CPanel::GetFilePaths(const CRecordVector<UInt32> &operatedIndices, UStringVector &paths) const
991*f6dc9357SAndroid Build Coastguard Worker {
992*f6dc9357SAndroid Build Coastguard Worker paths.ClearAndReserve(operatedIndices.Size());
993*f6dc9357SAndroid Build Coastguard Worker UString path = GetFsPath();
994*f6dc9357SAndroid Build Coastguard Worker const unsigned prefixLen = path.Len();
995*f6dc9357SAndroid Build Coastguard Worker const UInt32 *indices = operatedIndices.ConstData();
996*f6dc9357SAndroid Build Coastguard Worker const unsigned numItems = operatedIndices.Size();
997*f6dc9357SAndroid Build Coastguard Worker // for (unsigned y = 0; y < 10000; y++, paths.Clear())
998*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < numItems; i++)
999*f6dc9357SAndroid Build Coastguard Worker {
1000*f6dc9357SAndroid Build Coastguard Worker path.DeleteFrom(prefixLen);
1001*f6dc9357SAndroid Build Coastguard Worker Add_ItemRelPath2_To_String(indices[i], path);
1002*f6dc9357SAndroid Build Coastguard Worker // ODS_U(path)
1003*f6dc9357SAndroid Build Coastguard Worker paths.AddInReserved(path);
1004*f6dc9357SAndroid Build Coastguard Worker }
1005*f6dc9357SAndroid Build Coastguard Worker }
1006*f6dc9357SAndroid Build Coastguard Worker
1007*f6dc9357SAndroid Build Coastguard Worker
ExtractArchives()1008*f6dc9357SAndroid Build Coastguard Worker void CPanel::ExtractArchives()
1009*f6dc9357SAndroid Build Coastguard Worker {
1010*f6dc9357SAndroid Build Coastguard Worker if (!_parentFolders.IsEmpty())
1011*f6dc9357SAndroid Build Coastguard Worker {
1012*f6dc9357SAndroid Build Coastguard Worker _panelCallback->OnCopy(false, false);
1013*f6dc9357SAndroid Build Coastguard Worker return;
1014*f6dc9357SAndroid Build Coastguard Worker }
1015*f6dc9357SAndroid Build Coastguard Worker CRecordVector<UInt32> indices;
1016*f6dc9357SAndroid Build Coastguard Worker Get_ItemIndices_Operated(indices);
1017*f6dc9357SAndroid Build Coastguard Worker if (indices.IsEmpty() || FindDir_InOperatedList(indices) != -1)
1018*f6dc9357SAndroid Build Coastguard Worker {
1019*f6dc9357SAndroid Build Coastguard Worker MessageBox_Error_LangID(IDS_SELECT_FILES);
1020*f6dc9357SAndroid Build Coastguard Worker return;
1021*f6dc9357SAndroid Build Coastguard Worker }
1022*f6dc9357SAndroid Build Coastguard Worker UStringVector paths;
1023*f6dc9357SAndroid Build Coastguard Worker GetFilePaths(indices, paths);
1024*f6dc9357SAndroid Build Coastguard Worker UString outFolder = GetFsPath();
1025*f6dc9357SAndroid Build Coastguard Worker if (indices.Size() == 1)
1026*f6dc9357SAndroid Build Coastguard Worker outFolder += GetSubFolderNameForExtract2(GetItemRelPath(indices[0]));
1027*f6dc9357SAndroid Build Coastguard Worker else
1028*f6dc9357SAndroid Build Coastguard Worker outFolder.Add_Char('*');
1029*f6dc9357SAndroid Build Coastguard Worker outFolder.Add_PathSepar();
1030*f6dc9357SAndroid Build Coastguard Worker
1031*f6dc9357SAndroid Build Coastguard Worker CContextMenuInfo ci;
1032*f6dc9357SAndroid Build Coastguard Worker ci.Load();
1033*f6dc9357SAndroid Build Coastguard Worker
1034*f6dc9357SAndroid Build Coastguard Worker ::ExtractArchives(paths, outFolder
1035*f6dc9357SAndroid Build Coastguard Worker , true // showDialog
1036*f6dc9357SAndroid Build Coastguard Worker , false // elimDup
1037*f6dc9357SAndroid Build Coastguard Worker , ci.WriteZone
1038*f6dc9357SAndroid Build Coastguard Worker );
1039*f6dc9357SAndroid Build Coastguard Worker }
1040*f6dc9357SAndroid Build Coastguard Worker
1041*f6dc9357SAndroid Build Coastguard Worker /*
1042*f6dc9357SAndroid Build Coastguard Worker static void AddValuePair(UINT resourceID, UInt64 value, UString &s)
1043*f6dc9357SAndroid Build Coastguard Worker {
1044*f6dc9357SAndroid Build Coastguard Worker AddLangString(s, resourceID);
1045*f6dc9357SAndroid Build Coastguard Worker char sz[32];
1046*f6dc9357SAndroid Build Coastguard Worker s += ": ";
1047*f6dc9357SAndroid Build Coastguard Worker ConvertUInt64ToString(value, sz);
1048*f6dc9357SAndroid Build Coastguard Worker s += sz;
1049*f6dc9357SAndroid Build Coastguard Worker s.Add_LF();
1050*f6dc9357SAndroid Build Coastguard Worker }
1051*f6dc9357SAndroid Build Coastguard Worker
1052*f6dc9357SAndroid Build Coastguard Worker // now we don't need CThreadTest, since now we call CopyTo for "test command
1053*f6dc9357SAndroid Build Coastguard Worker
1054*f6dc9357SAndroid Build Coastguard Worker class CThreadTest: public CProgressThreadVirt
1055*f6dc9357SAndroid Build Coastguard Worker {
1056*f6dc9357SAndroid Build Coastguard Worker HRESULT ProcessVirt();
1057*f6dc9357SAndroid Build Coastguard Worker public:
1058*f6dc9357SAndroid Build Coastguard Worker CRecordVector<UInt32> Indices;
1059*f6dc9357SAndroid Build Coastguard Worker CExtractCallbackImp *ExtractCallbackSpec;
1060*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IFolderArchiveExtractCallback> ExtractCallback;
1061*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IArchiveFolder> ArchiveFolder;
1062*f6dc9357SAndroid Build Coastguard Worker };
1063*f6dc9357SAndroid Build Coastguard Worker
1064*f6dc9357SAndroid Build Coastguard Worker HRESULT CThreadTest::ProcessVirt()
1065*f6dc9357SAndroid Build Coastguard Worker {
1066*f6dc9357SAndroid Build Coastguard Worker RINOK(ArchiveFolder->Extract(&Indices[0], Indices.Size(),
1067*f6dc9357SAndroid Build Coastguard Worker true, // includeAltStreams
1068*f6dc9357SAndroid Build Coastguard Worker false, // replaceAltStreamColon
1069*f6dc9357SAndroid Build Coastguard Worker NExtract::NPathMode::kFullPathnames,
1070*f6dc9357SAndroid Build Coastguard Worker NExtract::NOverwriteMode::kAskBefore,
1071*f6dc9357SAndroid Build Coastguard Worker NULL, // path
1072*f6dc9357SAndroid Build Coastguard Worker BoolToInt(true), // testMode
1073*f6dc9357SAndroid Build Coastguard Worker ExtractCallback));
1074*f6dc9357SAndroid Build Coastguard Worker if (ExtractCallbackSpec->IsOK())
1075*f6dc9357SAndroid Build Coastguard Worker {
1076*f6dc9357SAndroid Build Coastguard Worker UString s;
1077*f6dc9357SAndroid Build Coastguard Worker AddValuePair(IDS_PROP_FOLDERS, ExtractCallbackSpec->NumFolders, s);
1078*f6dc9357SAndroid Build Coastguard Worker AddValuePair(IDS_PROP_FILES, ExtractCallbackSpec->NumFiles, s);
1079*f6dc9357SAndroid Build Coastguard Worker // AddValuePair(IDS_PROP_SIZE, ExtractCallbackSpec->UnpackSize, s);
1080*f6dc9357SAndroid Build Coastguard Worker // AddSizePair(IDS_COMPRESSED_COLON, Stat.PackSize, s);
1081*f6dc9357SAndroid Build Coastguard Worker s.Add_LF();
1082*f6dc9357SAndroid Build Coastguard Worker AddLangString(s, IDS_MESSAGE_NO_ERRORS);
1083*f6dc9357SAndroid Build Coastguard Worker FinalMessage.OkMessage.Message = s;
1084*f6dc9357SAndroid Build Coastguard Worker }
1085*f6dc9357SAndroid Build Coastguard Worker return S_OK;
1086*f6dc9357SAndroid Build Coastguard Worker }
1087*f6dc9357SAndroid Build Coastguard Worker
1088*f6dc9357SAndroid Build Coastguard Worker static void AddSizePair(UInt32 langID, UInt64 value, UString &s)
1089*f6dc9357SAndroid Build Coastguard Worker {
1090*f6dc9357SAndroid Build Coastguard Worker char sz[32];
1091*f6dc9357SAndroid Build Coastguard Worker AddLangString(s, langID);
1092*f6dc9357SAndroid Build Coastguard Worker s += L' ';
1093*f6dc9357SAndroid Build Coastguard Worker ConvertUInt64ToString(value, sz);
1094*f6dc9357SAndroid Build Coastguard Worker s += sz;
1095*f6dc9357SAndroid Build Coastguard Worker ConvertUInt64ToString(value >> 20, sz);
1096*f6dc9357SAndroid Build Coastguard Worker s += " (";
1097*f6dc9357SAndroid Build Coastguard Worker s += sz;
1098*f6dc9357SAndroid Build Coastguard Worker s += " MB)";
1099*f6dc9357SAndroid Build Coastguard Worker s.Add_LF();
1100*f6dc9357SAndroid Build Coastguard Worker }
1101*f6dc9357SAndroid Build Coastguard Worker */
1102*f6dc9357SAndroid Build Coastguard Worker
TestArchives()1103*f6dc9357SAndroid Build Coastguard Worker void CPanel::TestArchives()
1104*f6dc9357SAndroid Build Coastguard Worker {
1105*f6dc9357SAndroid Build Coastguard Worker CRecordVector<UInt32> indices;
1106*f6dc9357SAndroid Build Coastguard Worker Get_ItemIndices_OperSmart(indices);
1107*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IArchiveFolder> archiveFolder;
1108*f6dc9357SAndroid Build Coastguard Worker _folder.QueryInterface(IID_IArchiveFolder, &archiveFolder);
1109*f6dc9357SAndroid Build Coastguard Worker if (archiveFolder)
1110*f6dc9357SAndroid Build Coastguard Worker {
1111*f6dc9357SAndroid Build Coastguard Worker CCopyToOptions options;
1112*f6dc9357SAndroid Build Coastguard Worker options.streamMode = true;
1113*f6dc9357SAndroid Build Coastguard Worker options.showErrorMessages = true;
1114*f6dc9357SAndroid Build Coastguard Worker options.testMode = true;
1115*f6dc9357SAndroid Build Coastguard Worker
1116*f6dc9357SAndroid Build Coastguard Worker UStringVector messages;
1117*f6dc9357SAndroid Build Coastguard Worker HRESULT res = CopyTo(options, indices, &messages);
1118*f6dc9357SAndroid Build Coastguard Worker if (res != S_OK)
1119*f6dc9357SAndroid Build Coastguard Worker {
1120*f6dc9357SAndroid Build Coastguard Worker if (res != E_ABORT)
1121*f6dc9357SAndroid Build Coastguard Worker MessageBox_Error_HRESULT(res);
1122*f6dc9357SAndroid Build Coastguard Worker }
1123*f6dc9357SAndroid Build Coastguard Worker return;
1124*f6dc9357SAndroid Build Coastguard Worker
1125*f6dc9357SAndroid Build Coastguard Worker /*
1126*f6dc9357SAndroid Build Coastguard Worker {
1127*f6dc9357SAndroid Build Coastguard Worker CThreadTest extracter;
1128*f6dc9357SAndroid Build Coastguard Worker
1129*f6dc9357SAndroid Build Coastguard Worker extracter.ArchiveFolder = archiveFolder;
1130*f6dc9357SAndroid Build Coastguard Worker extracter.ExtractCallbackSpec = new CExtractCallbackImp;
1131*f6dc9357SAndroid Build Coastguard Worker extracter.ExtractCallback = extracter.ExtractCallbackSpec;
1132*f6dc9357SAndroid Build Coastguard Worker extracter.ExtractCallbackSpec->ProgressDialog = &extracter.ProgressDialog;
1133*f6dc9357SAndroid Build Coastguard Worker if (!_parentFolders.IsEmpty())
1134*f6dc9357SAndroid Build Coastguard Worker {
1135*f6dc9357SAndroid Build Coastguard Worker const CFolderLink &fl = _parentFolders.Back();
1136*f6dc9357SAndroid Build Coastguard Worker extracter.ExtractCallbackSpec->PasswordIsDefined = fl.UsePassword;
1137*f6dc9357SAndroid Build Coastguard Worker extracter.ExtractCallbackSpec->Password = fl.Password;
1138*f6dc9357SAndroid Build Coastguard Worker }
1139*f6dc9357SAndroid Build Coastguard Worker
1140*f6dc9357SAndroid Build Coastguard Worker if (indices.IsEmpty())
1141*f6dc9357SAndroid Build Coastguard Worker return;
1142*f6dc9357SAndroid Build Coastguard Worker
1143*f6dc9357SAndroid Build Coastguard Worker extracter.Indices = indices;
1144*f6dc9357SAndroid Build Coastguard Worker
1145*f6dc9357SAndroid Build Coastguard Worker const UString title = LangString(IDS_PROGRESS_TESTING);
1146*f6dc9357SAndroid Build Coastguard Worker
1147*f6dc9357SAndroid Build Coastguard Worker extracter.ProgressDialog.CompressingMode = false;
1148*f6dc9357SAndroid Build Coastguard Worker extracter.ProgressDialog.MainWindow = GetParent();
1149*f6dc9357SAndroid Build Coastguard Worker extracter.ProgressDialog.MainTitle = "7-Zip"; // LangString(IDS_APP_TITLE);
1150*f6dc9357SAndroid Build Coastguard Worker extracter.ProgressDialog.MainAddTitle = title + L' ';
1151*f6dc9357SAndroid Build Coastguard Worker
1152*f6dc9357SAndroid Build Coastguard Worker extracter.ExtractCallbackSpec->OverwriteMode = NExtract::NOverwriteMode::kAskBefore;
1153*f6dc9357SAndroid Build Coastguard Worker extracter.ExtractCallbackSpec->Init();
1154*f6dc9357SAndroid Build Coastguard Worker
1155*f6dc9357SAndroid Build Coastguard Worker if (extracter.Create(title, GetParent()) != S_OK)
1156*f6dc9357SAndroid Build Coastguard Worker return;
1157*f6dc9357SAndroid Build Coastguard Worker
1158*f6dc9357SAndroid Build Coastguard Worker }
1159*f6dc9357SAndroid Build Coastguard Worker RefreshTitleAlways();
1160*f6dc9357SAndroid Build Coastguard Worker return;
1161*f6dc9357SAndroid Build Coastguard Worker */
1162*f6dc9357SAndroid Build Coastguard Worker }
1163*f6dc9357SAndroid Build Coastguard Worker
1164*f6dc9357SAndroid Build Coastguard Worker if (!IsFSFolder())
1165*f6dc9357SAndroid Build Coastguard Worker {
1166*f6dc9357SAndroid Build Coastguard Worker MessageBox_Error_UnsupportOperation();
1167*f6dc9357SAndroid Build Coastguard Worker return;
1168*f6dc9357SAndroid Build Coastguard Worker }
1169*f6dc9357SAndroid Build Coastguard Worker UStringVector paths;
1170*f6dc9357SAndroid Build Coastguard Worker GetFilePaths(indices, paths);
1171*f6dc9357SAndroid Build Coastguard Worker if (paths.IsEmpty())
1172*f6dc9357SAndroid Build Coastguard Worker {
1173*f6dc9357SAndroid Build Coastguard Worker MessageBox_Error_LangID(IDS_SELECT_FILES);
1174*f6dc9357SAndroid Build Coastguard Worker return;
1175*f6dc9357SAndroid Build Coastguard Worker }
1176*f6dc9357SAndroid Build Coastguard Worker ::TestArchives(paths);
1177*f6dc9357SAndroid Build Coastguard Worker }
1178