1*f6dc9357SAndroid Build Coastguard Worker // App.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 "resource.h"
6*f6dc9357SAndroid Build Coastguard Worker #include "OverwriteDialogRes.h"
7*f6dc9357SAndroid Build Coastguard Worker
8*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/FileName.h"
9*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/PropVariantConv.h"
10*f6dc9357SAndroid Build Coastguard Worker
11*f6dc9357SAndroid Build Coastguard Worker /*
12*f6dc9357SAndroid Build Coastguard Worker #include "Windows/COM.h"
13*f6dc9357SAndroid Build Coastguard Worker #include "Windows/Error.h"
14*f6dc9357SAndroid Build Coastguard Worker #include "Windows/FileDir.h"
15*f6dc9357SAndroid Build Coastguard Worker
16*f6dc9357SAndroid Build Coastguard Worker #include "Windows/PropVariant.h"
17*f6dc9357SAndroid Build Coastguard Worker #include "Windows/Thread.h"
18*f6dc9357SAndroid Build Coastguard Worker */
19*f6dc9357SAndroid Build Coastguard Worker
20*f6dc9357SAndroid Build Coastguard Worker #include "App.h"
21*f6dc9357SAndroid Build Coastguard Worker #include "CopyDialog.h"
22*f6dc9357SAndroid Build Coastguard Worker #include "ExtractCallback.h"
23*f6dc9357SAndroid Build Coastguard Worker #include "FormatUtils.h"
24*f6dc9357SAndroid Build Coastguard Worker #include "IFolder.h"
25*f6dc9357SAndroid Build Coastguard Worker #include "LangUtils.h"
26*f6dc9357SAndroid Build Coastguard Worker #include "MyLoadMenu.h"
27*f6dc9357SAndroid Build Coastguard Worker #include "RegistryUtils.h"
28*f6dc9357SAndroid Build Coastguard Worker #include "ViewSettings.h"
29*f6dc9357SAndroid Build Coastguard Worker
30*f6dc9357SAndroid Build Coastguard Worker #include "PropertyNameRes.h"
31*f6dc9357SAndroid Build Coastguard Worker
32*f6dc9357SAndroid Build Coastguard Worker using namespace NWindows;
33*f6dc9357SAndroid Build Coastguard Worker using namespace NFile;
34*f6dc9357SAndroid Build Coastguard Worker using namespace NDir;
35*f6dc9357SAndroid Build Coastguard Worker using namespace NFind;
36*f6dc9357SAndroid Build Coastguard Worker using namespace NName;
37*f6dc9357SAndroid Build Coastguard Worker
38*f6dc9357SAndroid Build Coastguard Worker extern HINSTANCE g_hInstance;
39*f6dc9357SAndroid Build Coastguard Worker
40*f6dc9357SAndroid Build Coastguard Worker #define kTempDirPrefix FTEXT("7zE")
41*f6dc9357SAndroid Build Coastguard Worker
OnTab()42*f6dc9357SAndroid Build Coastguard Worker void CPanelCallbackImp::OnTab()
43*f6dc9357SAndroid Build Coastguard Worker {
44*f6dc9357SAndroid Build Coastguard Worker if (g_App.NumPanels != 1)
45*f6dc9357SAndroid Build Coastguard Worker _app->Panels[1 - _index].SetFocusToList();
46*f6dc9357SAndroid Build Coastguard Worker _app->RefreshTitle();
47*f6dc9357SAndroid Build Coastguard Worker }
48*f6dc9357SAndroid Build Coastguard Worker
SetFocusToPath(unsigned index)49*f6dc9357SAndroid Build Coastguard Worker void CPanelCallbackImp::SetFocusToPath(unsigned index)
50*f6dc9357SAndroid Build Coastguard Worker {
51*f6dc9357SAndroid Build Coastguard Worker unsigned newPanelIndex = index;
52*f6dc9357SAndroid Build Coastguard Worker if (g_App.NumPanels == 1)
53*f6dc9357SAndroid Build Coastguard Worker newPanelIndex = g_App.LastFocusedPanel;
54*f6dc9357SAndroid Build Coastguard Worker _app->RefreshTitle();
55*f6dc9357SAndroid Build Coastguard Worker _app->Panels[newPanelIndex]._headerComboBox.SetFocus();
56*f6dc9357SAndroid Build Coastguard Worker _app->Panels[newPanelIndex]._headerComboBox.ShowDropDown();
57*f6dc9357SAndroid Build Coastguard Worker }
58*f6dc9357SAndroid Build Coastguard Worker
59*f6dc9357SAndroid Build Coastguard Worker
OnCopy(bool move,bool copyToSame)60*f6dc9357SAndroid Build Coastguard Worker void CPanelCallbackImp::OnCopy(bool move, bool copyToSame) { _app->OnCopy(move, copyToSame, _index); }
OnSetSameFolder()61*f6dc9357SAndroid Build Coastguard Worker void CPanelCallbackImp::OnSetSameFolder() { _app->OnSetSameFolder(_index); }
OnSetSubFolder()62*f6dc9357SAndroid Build Coastguard Worker void CPanelCallbackImp::OnSetSubFolder() { _app->OnSetSubFolder(_index); }
PanelWasFocused()63*f6dc9357SAndroid Build Coastguard Worker void CPanelCallbackImp::PanelWasFocused() { _app->SetFocusedPanel(_index); _app->RefreshTitlePanel(_index); }
DragBegin()64*f6dc9357SAndroid Build Coastguard Worker void CPanelCallbackImp::DragBegin() { _app->DragBegin(_index); }
DragEnd()65*f6dc9357SAndroid Build Coastguard Worker void CPanelCallbackImp::DragEnd() { _app->DragEnd(); }
RefreshTitle(bool always)66*f6dc9357SAndroid Build Coastguard Worker void CPanelCallbackImp::RefreshTitle(bool always) { _app->RefreshTitlePanel(_index, always); }
67*f6dc9357SAndroid Build Coastguard Worker
ReloadLangItems()68*f6dc9357SAndroid Build Coastguard Worker void CApp::ReloadLangItems()
69*f6dc9357SAndroid Build Coastguard Worker {
70*f6dc9357SAndroid Build Coastguard Worker LangString(IDS_N_SELECTED_ITEMS, LangString_N_SELECTED_ITEMS);
71*f6dc9357SAndroid Build Coastguard Worker }
72*f6dc9357SAndroid Build Coastguard Worker
SetListSettings()73*f6dc9357SAndroid Build Coastguard Worker void CApp::SetListSettings()
74*f6dc9357SAndroid Build Coastguard Worker {
75*f6dc9357SAndroid Build Coastguard Worker CFmSettings st;
76*f6dc9357SAndroid Build Coastguard Worker st.Load();
77*f6dc9357SAndroid Build Coastguard Worker
78*f6dc9357SAndroid Build Coastguard Worker ShowSystemMenu = st.ShowSystemMenu;
79*f6dc9357SAndroid Build Coastguard Worker
80*f6dc9357SAndroid Build Coastguard Worker DWORD extendedStyle = LVS_EX_HEADERDRAGDROP;
81*f6dc9357SAndroid Build Coastguard Worker if (st.FullRow)
82*f6dc9357SAndroid Build Coastguard Worker extendedStyle |= LVS_EX_FULLROWSELECT;
83*f6dc9357SAndroid Build Coastguard Worker if (st.ShowGrid)
84*f6dc9357SAndroid Build Coastguard Worker extendedStyle |= LVS_EX_GRIDLINES;
85*f6dc9357SAndroid Build Coastguard Worker
86*f6dc9357SAndroid Build Coastguard Worker if (st.SingleClick)
87*f6dc9357SAndroid Build Coastguard Worker {
88*f6dc9357SAndroid Build Coastguard Worker extendedStyle |= LVS_EX_ONECLICKACTIVATE | LVS_EX_TRACKSELECT;
89*f6dc9357SAndroid Build Coastguard Worker /*
90*f6dc9357SAndroid Build Coastguard Worker if (ReadUnderline())
91*f6dc9357SAndroid Build Coastguard Worker extendedStyle |= LVS_EX_UNDERLINEHOT;
92*f6dc9357SAndroid Build Coastguard Worker */
93*f6dc9357SAndroid Build Coastguard Worker }
94*f6dc9357SAndroid Build Coastguard Worker
95*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < kNumPanelsMax; i++)
96*f6dc9357SAndroid Build Coastguard Worker {
97*f6dc9357SAndroid Build Coastguard Worker CPanel &panel = Panels[i];
98*f6dc9357SAndroid Build Coastguard Worker panel._mySelectMode = st.AlternativeSelection;
99*f6dc9357SAndroid Build Coastguard Worker panel._showDots = st.ShowDots;
100*f6dc9357SAndroid Build Coastguard Worker panel._showRealFileIcons = st.ShowRealFileIcons;
101*f6dc9357SAndroid Build Coastguard Worker panel._exStyle = extendedStyle;
102*f6dc9357SAndroid Build Coastguard Worker
103*f6dc9357SAndroid Build Coastguard Worker LONG_PTR style = panel._listView.GetStyle();
104*f6dc9357SAndroid Build Coastguard Worker if (st.AlternativeSelection)
105*f6dc9357SAndroid Build Coastguard Worker style |= LVS_SINGLESEL;
106*f6dc9357SAndroid Build Coastguard Worker else
107*f6dc9357SAndroid Build Coastguard Worker style &= ~(LONG_PTR)(DWORD)LVS_SINGLESEL;
108*f6dc9357SAndroid Build Coastguard Worker panel._listView.SetStyle(style);
109*f6dc9357SAndroid Build Coastguard Worker panel.SetExtendedStyle();
110*f6dc9357SAndroid Build Coastguard Worker }
111*f6dc9357SAndroid Build Coastguard Worker }
112*f6dc9357SAndroid Build Coastguard Worker
113*f6dc9357SAndroid Build Coastguard Worker #ifndef ILC_COLOR32
114*f6dc9357SAndroid Build Coastguard Worker #define ILC_COLOR32 0x0020
115*f6dc9357SAndroid Build Coastguard Worker #endif
116*f6dc9357SAndroid Build Coastguard Worker
CreateOnePanel(unsigned panelIndex,const UString & mainPath,const UString & arcFormat,bool needOpenArc,COpenResult & openRes)117*f6dc9357SAndroid Build Coastguard Worker HRESULT CApp::CreateOnePanel(unsigned panelIndex, const UString &mainPath, const UString &arcFormat,
118*f6dc9357SAndroid Build Coastguard Worker bool needOpenArc,
119*f6dc9357SAndroid Build Coastguard Worker COpenResult &openRes)
120*f6dc9357SAndroid Build Coastguard Worker {
121*f6dc9357SAndroid Build Coastguard Worker if (Panels[panelIndex].PanelCreated)
122*f6dc9357SAndroid Build Coastguard Worker return S_OK;
123*f6dc9357SAndroid Build Coastguard Worker
124*f6dc9357SAndroid Build Coastguard Worker m_PanelCallbackImp[panelIndex].Init(this, panelIndex);
125*f6dc9357SAndroid Build Coastguard Worker
126*f6dc9357SAndroid Build Coastguard Worker UString path;
127*f6dc9357SAndroid Build Coastguard Worker if (mainPath.IsEmpty())
128*f6dc9357SAndroid Build Coastguard Worker {
129*f6dc9357SAndroid Build Coastguard Worker if (!::ReadPanelPath(panelIndex, path))
130*f6dc9357SAndroid Build Coastguard Worker path.Empty();
131*f6dc9357SAndroid Build Coastguard Worker }
132*f6dc9357SAndroid Build Coastguard Worker else
133*f6dc9357SAndroid Build Coastguard Worker path = mainPath;
134*f6dc9357SAndroid Build Coastguard Worker
135*f6dc9357SAndroid Build Coastguard Worker const unsigned id = 1000 + 100 * panelIndex; // check it
136*f6dc9357SAndroid Build Coastguard Worker
137*f6dc9357SAndroid Build Coastguard Worker return Panels[panelIndex].Create(_window, _window,
138*f6dc9357SAndroid Build Coastguard Worker id, path, arcFormat, &m_PanelCallbackImp[panelIndex], &AppState,
139*f6dc9357SAndroid Build Coastguard Worker needOpenArc,
140*f6dc9357SAndroid Build Coastguard Worker openRes);
141*f6dc9357SAndroid Build Coastguard Worker }
142*f6dc9357SAndroid Build Coastguard Worker
143*f6dc9357SAndroid Build Coastguard Worker
CreateToolbar(HWND parent,NControl::CImageList & imageList,NControl::CToolBar & toolBar,bool largeButtons)144*f6dc9357SAndroid Build Coastguard Worker static void CreateToolbar(HWND parent,
145*f6dc9357SAndroid Build Coastguard Worker NControl::CImageList &imageList,
146*f6dc9357SAndroid Build Coastguard Worker NControl::CToolBar &toolBar,
147*f6dc9357SAndroid Build Coastguard Worker bool largeButtons)
148*f6dc9357SAndroid Build Coastguard Worker {
149*f6dc9357SAndroid Build Coastguard Worker toolBar.Attach(::CreateWindowEx(0, TOOLBARCLASSNAME, NULL, 0
150*f6dc9357SAndroid Build Coastguard Worker | WS_CHILD
151*f6dc9357SAndroid Build Coastguard Worker | WS_VISIBLE
152*f6dc9357SAndroid Build Coastguard Worker | TBSTYLE_FLAT
153*f6dc9357SAndroid Build Coastguard Worker | TBSTYLE_TOOLTIPS
154*f6dc9357SAndroid Build Coastguard Worker | TBSTYLE_WRAPABLE
155*f6dc9357SAndroid Build Coastguard Worker // | TBSTYLE_AUTOSIZE
156*f6dc9357SAndroid Build Coastguard Worker // | CCS_NORESIZE
157*f6dc9357SAndroid Build Coastguard Worker #ifdef UNDER_CE
158*f6dc9357SAndroid Build Coastguard Worker | CCS_NODIVIDER
159*f6dc9357SAndroid Build Coastguard Worker | CCS_NOPARENTALIGN
160*f6dc9357SAndroid Build Coastguard Worker #endif
161*f6dc9357SAndroid Build Coastguard Worker ,0,0,0,0, parent, NULL, g_hInstance, NULL));
162*f6dc9357SAndroid Build Coastguard Worker
163*f6dc9357SAndroid Build Coastguard Worker // TB_BUTTONSTRUCTSIZE message, which is required for
164*f6dc9357SAndroid Build Coastguard Worker // backward compatibility.
165*f6dc9357SAndroid Build Coastguard Worker toolBar.ButtonStructSize();
166*f6dc9357SAndroid Build Coastguard Worker
167*f6dc9357SAndroid Build Coastguard Worker imageList.Create(
168*f6dc9357SAndroid Build Coastguard Worker largeButtons ? 48: 24,
169*f6dc9357SAndroid Build Coastguard Worker largeButtons ? 36: 24,
170*f6dc9357SAndroid Build Coastguard Worker ILC_MASK | ILC_COLOR32, 0, 0);
171*f6dc9357SAndroid Build Coastguard Worker toolBar.SetImageList(0, imageList);
172*f6dc9357SAndroid Build Coastguard Worker }
173*f6dc9357SAndroid Build Coastguard Worker
174*f6dc9357SAndroid Build Coastguard Worker
175*f6dc9357SAndroid Build Coastguard Worker struct CButtonInfo
176*f6dc9357SAndroid Build Coastguard Worker {
177*f6dc9357SAndroid Build Coastguard Worker int CommandID;
178*f6dc9357SAndroid Build Coastguard Worker UINT BitmapResID;
179*f6dc9357SAndroid Build Coastguard Worker UINT Bitmap2ResID;
180*f6dc9357SAndroid Build Coastguard Worker UINT StringResID;
181*f6dc9357SAndroid Build Coastguard Worker
GetTextCButtonInfo182*f6dc9357SAndroid Build Coastguard Worker UString GetText() const { return LangString(StringResID); }
183*f6dc9357SAndroid Build Coastguard Worker };
184*f6dc9357SAndroid Build Coastguard Worker
185*f6dc9357SAndroid Build Coastguard Worker static const CButtonInfo g_StandardButtons[] =
186*f6dc9357SAndroid Build Coastguard Worker {
187*f6dc9357SAndroid Build Coastguard Worker { IDM_COPY_TO, IDB_COPY, IDB_COPY2, IDS_BUTTON_COPY },
188*f6dc9357SAndroid Build Coastguard Worker { IDM_MOVE_TO, IDB_MOVE, IDB_MOVE2, IDS_BUTTON_MOVE },
189*f6dc9357SAndroid Build Coastguard Worker { IDM_DELETE, IDB_DELETE, IDB_DELETE2, IDS_BUTTON_DELETE } ,
190*f6dc9357SAndroid Build Coastguard Worker { IDM_PROPERTIES, IDB_INFO, IDB_INFO2, IDS_BUTTON_INFO }
191*f6dc9357SAndroid Build Coastguard Worker };
192*f6dc9357SAndroid Build Coastguard Worker
193*f6dc9357SAndroid Build Coastguard Worker static const CButtonInfo g_ArchiveButtons[] =
194*f6dc9357SAndroid Build Coastguard Worker {
195*f6dc9357SAndroid Build Coastguard Worker { kMenuCmdID_Toolbar_Add, IDB_ADD, IDB_ADD2, IDS_ADD },
196*f6dc9357SAndroid Build Coastguard Worker { kMenuCmdID_Toolbar_Extract, IDB_EXTRACT, IDB_EXTRACT2, IDS_EXTRACT },
197*f6dc9357SAndroid Build Coastguard Worker { kMenuCmdID_Toolbar_Test, IDB_TEST, IDB_TEST2, IDS_TEST }
198*f6dc9357SAndroid Build Coastguard Worker };
199*f6dc9357SAndroid Build Coastguard Worker
SetButtonText(int commandID,const CButtonInfo * buttons,unsigned numButtons,UString & s)200*f6dc9357SAndroid Build Coastguard Worker static bool SetButtonText(int commandID, const CButtonInfo *buttons, unsigned numButtons, UString &s)
201*f6dc9357SAndroid Build Coastguard Worker {
202*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < numButtons; i++)
203*f6dc9357SAndroid Build Coastguard Worker {
204*f6dc9357SAndroid Build Coastguard Worker const CButtonInfo &b = buttons[i];
205*f6dc9357SAndroid Build Coastguard Worker if (b.CommandID == commandID)
206*f6dc9357SAndroid Build Coastguard Worker {
207*f6dc9357SAndroid Build Coastguard Worker s = b.GetText();
208*f6dc9357SAndroid Build Coastguard Worker return true;
209*f6dc9357SAndroid Build Coastguard Worker }
210*f6dc9357SAndroid Build Coastguard Worker }
211*f6dc9357SAndroid Build Coastguard Worker return false;
212*f6dc9357SAndroid Build Coastguard Worker }
213*f6dc9357SAndroid Build Coastguard Worker
SetButtonText(int commandID,UString & s)214*f6dc9357SAndroid Build Coastguard Worker static void SetButtonText(int commandID, UString &s)
215*f6dc9357SAndroid Build Coastguard Worker {
216*f6dc9357SAndroid Build Coastguard Worker if (SetButtonText(commandID, g_StandardButtons, Z7_ARRAY_SIZE(g_StandardButtons), s))
217*f6dc9357SAndroid Build Coastguard Worker return;
218*f6dc9357SAndroid Build Coastguard Worker SetButtonText(commandID, g_ArchiveButtons, Z7_ARRAY_SIZE(g_ArchiveButtons), s);
219*f6dc9357SAndroid Build Coastguard Worker }
220*f6dc9357SAndroid Build Coastguard Worker
AddButton(NControl::CImageList & imageList,NControl::CToolBar & toolBar,const CButtonInfo & butInfo,bool showText,bool large)221*f6dc9357SAndroid Build Coastguard Worker static void AddButton(
222*f6dc9357SAndroid Build Coastguard Worker NControl::CImageList &imageList,
223*f6dc9357SAndroid Build Coastguard Worker NControl::CToolBar &toolBar,
224*f6dc9357SAndroid Build Coastguard Worker const CButtonInfo &butInfo, bool showText, bool large)
225*f6dc9357SAndroid Build Coastguard Worker {
226*f6dc9357SAndroid Build Coastguard Worker TBBUTTON but;
227*f6dc9357SAndroid Build Coastguard Worker but.iBitmap = 0;
228*f6dc9357SAndroid Build Coastguard Worker but.idCommand = butInfo.CommandID;
229*f6dc9357SAndroid Build Coastguard Worker but.fsState = TBSTATE_ENABLED;
230*f6dc9357SAndroid Build Coastguard Worker but.fsStyle = TBSTYLE_BUTTON;
231*f6dc9357SAndroid Build Coastguard Worker but.dwData = 0;
232*f6dc9357SAndroid Build Coastguard Worker
233*f6dc9357SAndroid Build Coastguard Worker UString s = butInfo.GetText();
234*f6dc9357SAndroid Build Coastguard Worker but.iString = 0;
235*f6dc9357SAndroid Build Coastguard Worker if (showText)
236*f6dc9357SAndroid Build Coastguard Worker but.iString = (INT_PTR)(LPCWSTR)s;
237*f6dc9357SAndroid Build Coastguard Worker
238*f6dc9357SAndroid Build Coastguard Worker but.iBitmap = imageList.GetImageCount();
239*f6dc9357SAndroid Build Coastguard Worker HBITMAP b = ::LoadBitmap(g_hInstance,
240*f6dc9357SAndroid Build Coastguard Worker large ?
241*f6dc9357SAndroid Build Coastguard Worker MAKEINTRESOURCE(butInfo.BitmapResID):
242*f6dc9357SAndroid Build Coastguard Worker MAKEINTRESOURCE(butInfo.Bitmap2ResID));
243*f6dc9357SAndroid Build Coastguard Worker if (b)
244*f6dc9357SAndroid Build Coastguard Worker {
245*f6dc9357SAndroid Build Coastguard Worker imageList.AddMasked(b, RGB(255, 0, 255));
246*f6dc9357SAndroid Build Coastguard Worker ::DeleteObject(b);
247*f6dc9357SAndroid Build Coastguard Worker }
248*f6dc9357SAndroid Build Coastguard Worker #ifdef _UNICODE
249*f6dc9357SAndroid Build Coastguard Worker toolBar.AddButton(1, &but);
250*f6dc9357SAndroid Build Coastguard Worker #else
251*f6dc9357SAndroid Build Coastguard Worker toolBar.AddButtonW(1, &but);
252*f6dc9357SAndroid Build Coastguard Worker #endif
253*f6dc9357SAndroid Build Coastguard Worker }
254*f6dc9357SAndroid Build Coastguard Worker
ReloadToolbars()255*f6dc9357SAndroid Build Coastguard Worker void CApp::ReloadToolbars()
256*f6dc9357SAndroid Build Coastguard Worker {
257*f6dc9357SAndroid Build Coastguard Worker _buttonsImageList.Destroy();
258*f6dc9357SAndroid Build Coastguard Worker _toolBar.Destroy();
259*f6dc9357SAndroid Build Coastguard Worker
260*f6dc9357SAndroid Build Coastguard Worker
261*f6dc9357SAndroid Build Coastguard Worker if (ShowArchiveToolbar || ShowStandardToolbar)
262*f6dc9357SAndroid Build Coastguard Worker {
263*f6dc9357SAndroid Build Coastguard Worker CreateToolbar(_window, _buttonsImageList, _toolBar, LargeButtons);
264*f6dc9357SAndroid Build Coastguard Worker unsigned i;
265*f6dc9357SAndroid Build Coastguard Worker if (ShowArchiveToolbar)
266*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i < Z7_ARRAY_SIZE(g_ArchiveButtons); i++)
267*f6dc9357SAndroid Build Coastguard Worker AddButton(_buttonsImageList, _toolBar, g_ArchiveButtons[i], ShowButtonsLables, LargeButtons);
268*f6dc9357SAndroid Build Coastguard Worker if (ShowStandardToolbar)
269*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i < Z7_ARRAY_SIZE(g_StandardButtons); i++)
270*f6dc9357SAndroid Build Coastguard Worker AddButton(_buttonsImageList, _toolBar, g_StandardButtons[i], ShowButtonsLables, LargeButtons);
271*f6dc9357SAndroid Build Coastguard Worker
272*f6dc9357SAndroid Build Coastguard Worker _toolBar.AutoSize();
273*f6dc9357SAndroid Build Coastguard Worker }
274*f6dc9357SAndroid Build Coastguard Worker }
275*f6dc9357SAndroid Build Coastguard Worker
SaveToolbarChanges()276*f6dc9357SAndroid Build Coastguard Worker void CApp::SaveToolbarChanges()
277*f6dc9357SAndroid Build Coastguard Worker {
278*f6dc9357SAndroid Build Coastguard Worker SaveToolbar();
279*f6dc9357SAndroid Build Coastguard Worker ReloadToolbars();
280*f6dc9357SAndroid Build Coastguard Worker MoveSubWindows();
281*f6dc9357SAndroid Build Coastguard Worker }
282*f6dc9357SAndroid Build Coastguard Worker
283*f6dc9357SAndroid Build Coastguard Worker
Create(HWND hwnd,const UString & mainPath,const UString & arcFormat,int xSizes[2],bool needOpenArc,COpenResult & openRes)284*f6dc9357SAndroid Build Coastguard Worker HRESULT CApp::Create(HWND hwnd, const UString &mainPath, const UString &arcFormat, int xSizes[2], bool needOpenArc, COpenResult &openRes)
285*f6dc9357SAndroid Build Coastguard Worker {
286*f6dc9357SAndroid Build Coastguard Worker _window.Attach(hwnd);
287*f6dc9357SAndroid Build Coastguard Worker
288*f6dc9357SAndroid Build Coastguard Worker #ifdef UNDER_CE
289*f6dc9357SAndroid Build Coastguard Worker _commandBar.Create(g_hInstance, hwnd, 1);
290*f6dc9357SAndroid Build Coastguard Worker #endif
291*f6dc9357SAndroid Build Coastguard Worker
292*f6dc9357SAndroid Build Coastguard Worker MyLoadMenu(false); // needResetMenu
293*f6dc9357SAndroid Build Coastguard Worker
294*f6dc9357SAndroid Build Coastguard Worker #ifdef UNDER_CE
295*f6dc9357SAndroid Build Coastguard Worker _commandBar.AutoSize();
296*f6dc9357SAndroid Build Coastguard Worker #endif
297*f6dc9357SAndroid Build Coastguard Worker
298*f6dc9357SAndroid Build Coastguard Worker ReadToolbar();
299*f6dc9357SAndroid Build Coastguard Worker ReloadToolbars();
300*f6dc9357SAndroid Build Coastguard Worker
301*f6dc9357SAndroid Build Coastguard Worker unsigned i;
302*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i < kNumPanelsMax; i++)
303*f6dc9357SAndroid Build Coastguard Worker Panels[i].PanelCreated = false;
304*f6dc9357SAndroid Build Coastguard Worker
305*f6dc9357SAndroid Build Coastguard Worker AppState.Read();
306*f6dc9357SAndroid Build Coastguard Worker
307*f6dc9357SAndroid Build Coastguard Worker SetListSettings();
308*f6dc9357SAndroid Build Coastguard Worker
309*f6dc9357SAndroid Build Coastguard Worker if (LastFocusedPanel >= kNumPanelsMax)
310*f6dc9357SAndroid Build Coastguard Worker LastFocusedPanel = 0;
311*f6dc9357SAndroid Build Coastguard Worker // ShowDeletedFiles = Read_ShowDeleted();
312*f6dc9357SAndroid Build Coastguard Worker
313*f6dc9357SAndroid Build Coastguard Worker CListMode listMode;
314*f6dc9357SAndroid Build Coastguard Worker listMode.Read();
315*f6dc9357SAndroid Build Coastguard Worker
316*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i < kNumPanelsMax; i++)
317*f6dc9357SAndroid Build Coastguard Worker {
318*f6dc9357SAndroid Build Coastguard Worker CPanel &panel = Panels[i];
319*f6dc9357SAndroid Build Coastguard Worker panel._listViewMode = listMode.Panels[i];
320*f6dc9357SAndroid Build Coastguard Worker panel._xSize = xSizes[i];
321*f6dc9357SAndroid Build Coastguard Worker panel._flatModeForArc = ReadFlatView(i);
322*f6dc9357SAndroid Build Coastguard Worker }
323*f6dc9357SAndroid Build Coastguard Worker
324*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i < kNumPanelsMax; i++)
325*f6dc9357SAndroid Build Coastguard Worker {
326*f6dc9357SAndroid Build Coastguard Worker unsigned panelIndex = i;
327*f6dc9357SAndroid Build Coastguard Worker if (needOpenArc && LastFocusedPanel == 1)
328*f6dc9357SAndroid Build Coastguard Worker panelIndex = 1 - i;
329*f6dc9357SAndroid Build Coastguard Worker
330*f6dc9357SAndroid Build Coastguard Worker bool isMainPanel = (panelIndex == LastFocusedPanel);
331*f6dc9357SAndroid Build Coastguard Worker
332*f6dc9357SAndroid Build Coastguard Worker if (NumPanels > 1 || isMainPanel)
333*f6dc9357SAndroid Build Coastguard Worker {
334*f6dc9357SAndroid Build Coastguard Worker if (NumPanels == 1)
335*f6dc9357SAndroid Build Coastguard Worker Panels[panelIndex]._xSize = xSizes[0] + xSizes[1];
336*f6dc9357SAndroid Build Coastguard Worker
337*f6dc9357SAndroid Build Coastguard Worker COpenResult openRes2;
338*f6dc9357SAndroid Build Coastguard Worker UString path;
339*f6dc9357SAndroid Build Coastguard Worker if (isMainPanel)
340*f6dc9357SAndroid Build Coastguard Worker path = mainPath;
341*f6dc9357SAndroid Build Coastguard Worker
342*f6dc9357SAndroid Build Coastguard Worker RINOK(CreateOnePanel(panelIndex, path, arcFormat,
343*f6dc9357SAndroid Build Coastguard Worker isMainPanel && needOpenArc,
344*f6dc9357SAndroid Build Coastguard Worker *(isMainPanel ? &openRes : &openRes2)))
345*f6dc9357SAndroid Build Coastguard Worker
346*f6dc9357SAndroid Build Coastguard Worker if (isMainPanel)
347*f6dc9357SAndroid Build Coastguard Worker {
348*f6dc9357SAndroid Build Coastguard Worker if (needOpenArc && !openRes.ArchiveIsOpened)
349*f6dc9357SAndroid Build Coastguard Worker return S_OK;
350*f6dc9357SAndroid Build Coastguard Worker }
351*f6dc9357SAndroid Build Coastguard Worker }
352*f6dc9357SAndroid Build Coastguard Worker }
353*f6dc9357SAndroid Build Coastguard Worker
354*f6dc9357SAndroid Build Coastguard Worker SetFocusedPanel(LastFocusedPanel);
355*f6dc9357SAndroid Build Coastguard Worker Panels[LastFocusedPanel].SetFocusToList();
356*f6dc9357SAndroid Build Coastguard Worker return S_OK;
357*f6dc9357SAndroid Build Coastguard Worker }
358*f6dc9357SAndroid Build Coastguard Worker
359*f6dc9357SAndroid Build Coastguard Worker
SwitchOnOffOnePanel()360*f6dc9357SAndroid Build Coastguard Worker HRESULT CApp::SwitchOnOffOnePanel()
361*f6dc9357SAndroid Build Coastguard Worker {
362*f6dc9357SAndroid Build Coastguard Worker if (NumPanels == 1)
363*f6dc9357SAndroid Build Coastguard Worker {
364*f6dc9357SAndroid Build Coastguard Worker NumPanels++;
365*f6dc9357SAndroid Build Coastguard Worker COpenResult openRes;
366*f6dc9357SAndroid Build Coastguard Worker RINOK(CreateOnePanel(1 - LastFocusedPanel, UString(), UString(),
367*f6dc9357SAndroid Build Coastguard Worker false, // needOpenArc
368*f6dc9357SAndroid Build Coastguard Worker openRes))
369*f6dc9357SAndroid Build Coastguard Worker Panels[1 - LastFocusedPanel].Enable(true);
370*f6dc9357SAndroid Build Coastguard Worker Panels[1 - LastFocusedPanel].Show(SW_SHOWNORMAL);
371*f6dc9357SAndroid Build Coastguard Worker }
372*f6dc9357SAndroid Build Coastguard Worker else
373*f6dc9357SAndroid Build Coastguard Worker {
374*f6dc9357SAndroid Build Coastguard Worker NumPanels--;
375*f6dc9357SAndroid Build Coastguard Worker Panels[1 - LastFocusedPanel].Enable(false);
376*f6dc9357SAndroid Build Coastguard Worker Panels[1 - LastFocusedPanel].Show(SW_HIDE);
377*f6dc9357SAndroid Build Coastguard Worker }
378*f6dc9357SAndroid Build Coastguard Worker MoveSubWindows();
379*f6dc9357SAndroid Build Coastguard Worker return S_OK;
380*f6dc9357SAndroid Build Coastguard Worker }
381*f6dc9357SAndroid Build Coastguard Worker
Save()382*f6dc9357SAndroid Build Coastguard Worker void CApp::Save()
383*f6dc9357SAndroid Build Coastguard Worker {
384*f6dc9357SAndroid Build Coastguard Worker AppState.Save();
385*f6dc9357SAndroid Build Coastguard Worker CListMode listMode;
386*f6dc9357SAndroid Build Coastguard Worker
387*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < kNumPanelsMax; i++)
388*f6dc9357SAndroid Build Coastguard Worker {
389*f6dc9357SAndroid Build Coastguard Worker const CPanel &panel = Panels[i];
390*f6dc9357SAndroid Build Coastguard Worker UString path;
391*f6dc9357SAndroid Build Coastguard Worker if (panel._parentFolders.IsEmpty())
392*f6dc9357SAndroid Build Coastguard Worker path = panel._currentFolderPrefix;
393*f6dc9357SAndroid Build Coastguard Worker else
394*f6dc9357SAndroid Build Coastguard Worker path = panel._parentFolders[0].ParentFolderPath;
395*f6dc9357SAndroid Build Coastguard Worker // GetFolderPath(panel._parentFolders[0].ParentFolder);
396*f6dc9357SAndroid Build Coastguard Worker SavePanelPath(i, path);
397*f6dc9357SAndroid Build Coastguard Worker listMode.Panels[i] = panel.GetListViewMode();
398*f6dc9357SAndroid Build Coastguard Worker SaveFlatView(i, panel._flatModeForArc);
399*f6dc9357SAndroid Build Coastguard Worker }
400*f6dc9357SAndroid Build Coastguard Worker
401*f6dc9357SAndroid Build Coastguard Worker listMode.Save();
402*f6dc9357SAndroid Build Coastguard Worker // Save_ShowDeleted(ShowDeletedFiles);
403*f6dc9357SAndroid Build Coastguard Worker }
404*f6dc9357SAndroid Build Coastguard Worker
ReleaseApp()405*f6dc9357SAndroid Build Coastguard Worker void CApp::ReleaseApp()
406*f6dc9357SAndroid Build Coastguard Worker {
407*f6dc9357SAndroid Build Coastguard Worker // 24.09: ReleasePanel() will stop panel timer processing.
408*f6dc9357SAndroid Build Coastguard Worker // but we want to stop timer processing for all panels
409*f6dc9357SAndroid Build Coastguard Worker // before ReleasePanel() calling.
410*f6dc9357SAndroid Build Coastguard Worker unsigned i;
411*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i < kNumPanelsMax; i++)
412*f6dc9357SAndroid Build Coastguard Worker Panels[i].Disable_Processing_Timer_Notify_StatusBar();
413*f6dc9357SAndroid Build Coastguard Worker // It's for unloading COM dll's: don't change it.
414*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i < kNumPanelsMax; i++)
415*f6dc9357SAndroid Build Coastguard Worker Panels[i].ReleasePanel();
416*f6dc9357SAndroid Build Coastguard Worker }
417*f6dc9357SAndroid Build Coastguard Worker
418*f6dc9357SAndroid Build Coastguard Worker // reduces path to part that exists on disk (or root prefix of path)
419*f6dc9357SAndroid Build Coastguard Worker // output path is normalized (with WCHAR_PATH_SEPARATOR)
Reduce_Path_To_RealFileSystemPath(UString & path)420*f6dc9357SAndroid Build Coastguard Worker static void Reduce_Path_To_RealFileSystemPath(UString &path)
421*f6dc9357SAndroid Build Coastguard Worker {
422*f6dc9357SAndroid Build Coastguard Worker unsigned prefixSize = GetRootPrefixSize(path);
423*f6dc9357SAndroid Build Coastguard Worker
424*f6dc9357SAndroid Build Coastguard Worker while (!path.IsEmpty())
425*f6dc9357SAndroid Build Coastguard Worker {
426*f6dc9357SAndroid Build Coastguard Worker if (NFind::DoesDirExist_FollowLink(us2fs(path)))
427*f6dc9357SAndroid Build Coastguard Worker {
428*f6dc9357SAndroid Build Coastguard Worker NName::NormalizeDirPathPrefix(path);
429*f6dc9357SAndroid Build Coastguard Worker break;
430*f6dc9357SAndroid Build Coastguard Worker }
431*f6dc9357SAndroid Build Coastguard Worker int pos = path.ReverseFind_PathSepar();
432*f6dc9357SAndroid Build Coastguard Worker if (pos < 0)
433*f6dc9357SAndroid Build Coastguard Worker {
434*f6dc9357SAndroid Build Coastguard Worker path.Empty();
435*f6dc9357SAndroid Build Coastguard Worker break;
436*f6dc9357SAndroid Build Coastguard Worker }
437*f6dc9357SAndroid Build Coastguard Worker path.DeleteFrom((unsigned)(pos + 1));
438*f6dc9357SAndroid Build Coastguard Worker if ((unsigned)pos + 1 == prefixSize)
439*f6dc9357SAndroid Build Coastguard Worker break;
440*f6dc9357SAndroid Build Coastguard Worker path.DeleteFrom((unsigned)pos);
441*f6dc9357SAndroid Build Coastguard Worker }
442*f6dc9357SAndroid Build Coastguard Worker }
443*f6dc9357SAndroid Build Coastguard Worker
444*f6dc9357SAndroid Build Coastguard Worker // returns: true, if such dir exists or is root
445*f6dc9357SAndroid Build Coastguard Worker /*
446*f6dc9357SAndroid Build Coastguard Worker static bool CheckFolderPath(const UString &path)
447*f6dc9357SAndroid Build Coastguard Worker {
448*f6dc9357SAndroid Build Coastguard Worker UString pathReduced = path;
449*f6dc9357SAndroid Build Coastguard Worker Reduce_Path_To_RealFileSystemPath(pathReduced);
450*f6dc9357SAndroid Build Coastguard Worker return (pathReduced == path);
451*f6dc9357SAndroid Build Coastguard Worker }
452*f6dc9357SAndroid Build Coastguard Worker */
453*f6dc9357SAndroid Build Coastguard Worker
454*f6dc9357SAndroid Build Coastguard Worker extern UString ConvertSizeToString(UInt64 value);
455*f6dc9357SAndroid Build Coastguard Worker
AddSizeValue(UString & s,UInt64 size)456*f6dc9357SAndroid Build Coastguard Worker static void AddSizeValue(UString &s, UInt64 size)
457*f6dc9357SAndroid Build Coastguard Worker {
458*f6dc9357SAndroid Build Coastguard Worker s += MyFormatNew(IDS_FILE_SIZE, ConvertSizeToString(size));
459*f6dc9357SAndroid Build Coastguard Worker }
460*f6dc9357SAndroid Build Coastguard Worker
AddValuePair1(UString & s,UINT resourceID,UInt64 size)461*f6dc9357SAndroid Build Coastguard Worker static void AddValuePair1(UString &s, UINT resourceID, UInt64 size)
462*f6dc9357SAndroid Build Coastguard Worker {
463*f6dc9357SAndroid Build Coastguard Worker AddLangString(s, resourceID);
464*f6dc9357SAndroid Build Coastguard Worker s += ": ";
465*f6dc9357SAndroid Build Coastguard Worker AddSizeValue(s, size);
466*f6dc9357SAndroid Build Coastguard Worker s.Add_LF();
467*f6dc9357SAndroid Build Coastguard Worker }
468*f6dc9357SAndroid Build Coastguard Worker
469*f6dc9357SAndroid Build Coastguard Worker void AddValuePair2(UString &s, UINT resourceID, UInt64 num, UInt64 size);
AddValuePair2(UString & s,UINT resourceID,UInt64 num,UInt64 size)470*f6dc9357SAndroid Build Coastguard Worker void AddValuePair2(UString &s, UINT resourceID, UInt64 num, UInt64 size)
471*f6dc9357SAndroid Build Coastguard Worker {
472*f6dc9357SAndroid Build Coastguard Worker if (num == 0)
473*f6dc9357SAndroid Build Coastguard Worker return;
474*f6dc9357SAndroid Build Coastguard Worker AddLangString(s, resourceID);
475*f6dc9357SAndroid Build Coastguard Worker s += ": ";
476*f6dc9357SAndroid Build Coastguard Worker s += ConvertSizeToString(num);
477*f6dc9357SAndroid Build Coastguard Worker
478*f6dc9357SAndroid Build Coastguard Worker if (size != (UInt64)(Int64)-1)
479*f6dc9357SAndroid Build Coastguard Worker {
480*f6dc9357SAndroid Build Coastguard Worker s += " ( ";
481*f6dc9357SAndroid Build Coastguard Worker AddSizeValue(s, size);
482*f6dc9357SAndroid Build Coastguard Worker s += " )";
483*f6dc9357SAndroid Build Coastguard Worker }
484*f6dc9357SAndroid Build Coastguard Worker s.Add_LF();
485*f6dc9357SAndroid Build Coastguard Worker }
486*f6dc9357SAndroid Build Coastguard Worker
AddPropValueToSum(IFolderFolder * folder,UInt32 index,PROPID propID,UInt64 & sum)487*f6dc9357SAndroid Build Coastguard Worker static void AddPropValueToSum(IFolderFolder *folder, UInt32 index, PROPID propID, UInt64 &sum)
488*f6dc9357SAndroid Build Coastguard Worker {
489*f6dc9357SAndroid Build Coastguard Worker if (sum == (UInt64)(Int64)-1)
490*f6dc9357SAndroid Build Coastguard Worker return;
491*f6dc9357SAndroid Build Coastguard Worker NCOM::CPropVariant prop;
492*f6dc9357SAndroid Build Coastguard Worker folder->GetProperty(index, propID, &prop);
493*f6dc9357SAndroid Build Coastguard Worker UInt64 val = 0;
494*f6dc9357SAndroid Build Coastguard Worker if (ConvertPropVariantToUInt64(prop, val))
495*f6dc9357SAndroid Build Coastguard Worker sum += val;
496*f6dc9357SAndroid Build Coastguard Worker else
497*f6dc9357SAndroid Build Coastguard Worker sum = (UInt64)(Int64)-1;
498*f6dc9357SAndroid Build Coastguard Worker }
499*f6dc9357SAndroid Build Coastguard Worker
GetItemsInfoString(const CRecordVector<UInt32> & indices)500*f6dc9357SAndroid Build Coastguard Worker UString CPanel::GetItemsInfoString(const CRecordVector<UInt32> &indices)
501*f6dc9357SAndroid Build Coastguard Worker {
502*f6dc9357SAndroid Build Coastguard Worker UString info;
503*f6dc9357SAndroid Build Coastguard Worker UInt64 numDirs, numFiles, filesSize, foldersSize;
504*f6dc9357SAndroid Build Coastguard Worker numDirs = numFiles = filesSize = foldersSize = 0;
505*f6dc9357SAndroid Build Coastguard Worker
506*f6dc9357SAndroid Build Coastguard Worker unsigned i;
507*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i < indices.Size(); i++)
508*f6dc9357SAndroid Build Coastguard Worker {
509*f6dc9357SAndroid Build Coastguard Worker const UInt32 index = indices[i];
510*f6dc9357SAndroid Build Coastguard Worker if (IsItem_Folder(index))
511*f6dc9357SAndroid Build Coastguard Worker {
512*f6dc9357SAndroid Build Coastguard Worker AddPropValueToSum(_folder, index, kpidSize, foldersSize);
513*f6dc9357SAndroid Build Coastguard Worker numDirs++;
514*f6dc9357SAndroid Build Coastguard Worker }
515*f6dc9357SAndroid Build Coastguard Worker else
516*f6dc9357SAndroid Build Coastguard Worker {
517*f6dc9357SAndroid Build Coastguard Worker AddPropValueToSum(_folder, index, kpidSize, filesSize);
518*f6dc9357SAndroid Build Coastguard Worker numFiles++;
519*f6dc9357SAndroid Build Coastguard Worker }
520*f6dc9357SAndroid Build Coastguard Worker }
521*f6dc9357SAndroid Build Coastguard Worker
522*f6dc9357SAndroid Build Coastguard Worker AddValuePair2(info, IDS_PROP_FOLDERS, numDirs, foldersSize);
523*f6dc9357SAndroid Build Coastguard Worker AddValuePair2(info, IDS_PROP_FILES, numFiles, filesSize);
524*f6dc9357SAndroid Build Coastguard Worker int numDefined = ((foldersSize != (UInt64)(Int64)-1) && foldersSize != 0) ? 1: 0;
525*f6dc9357SAndroid Build Coastguard Worker numDefined += ((filesSize != (UInt64)(Int64)-1) && filesSize != 0) ? 1: 0;
526*f6dc9357SAndroid Build Coastguard Worker if (numDefined == 2)
527*f6dc9357SAndroid Build Coastguard Worker AddValuePair1(info, IDS_PROP_SIZE, filesSize + foldersSize);
528*f6dc9357SAndroid Build Coastguard Worker
529*f6dc9357SAndroid Build Coastguard Worker info.Add_LF();
530*f6dc9357SAndroid Build Coastguard Worker info += _currentFolderPrefix;
531*f6dc9357SAndroid Build Coastguard Worker
532*f6dc9357SAndroid Build Coastguard Worker for (i = 0; i < indices.Size() && (int)i < (int)kCopyDialog_NumInfoLines - 6; i++)
533*f6dc9357SAndroid Build Coastguard Worker {
534*f6dc9357SAndroid Build Coastguard Worker info.Add_LF();
535*f6dc9357SAndroid Build Coastguard Worker info += " ";
536*f6dc9357SAndroid Build Coastguard Worker const UInt32 index = indices[i];
537*f6dc9357SAndroid Build Coastguard Worker info += GetItemRelPath(index);
538*f6dc9357SAndroid Build Coastguard Worker if (IsItem_Folder(index))
539*f6dc9357SAndroid Build Coastguard Worker info.Add_PathSepar();
540*f6dc9357SAndroid Build Coastguard Worker }
541*f6dc9357SAndroid Build Coastguard Worker if (i != indices.Size())
542*f6dc9357SAndroid Build Coastguard Worker {
543*f6dc9357SAndroid Build Coastguard Worker info.Add_LF();
544*f6dc9357SAndroid Build Coastguard Worker info += " ...";
545*f6dc9357SAndroid Build Coastguard Worker }
546*f6dc9357SAndroid Build Coastguard Worker return info;
547*f6dc9357SAndroid Build Coastguard Worker }
548*f6dc9357SAndroid Build Coastguard Worker
549*f6dc9357SAndroid Build Coastguard Worker bool IsCorrectFsName(const UString &name);
550*f6dc9357SAndroid Build Coastguard Worker
551*f6dc9357SAndroid Build Coastguard Worker
552*f6dc9357SAndroid Build Coastguard Worker
553*f6dc9357SAndroid Build Coastguard Worker /* Returns true, if path is path that can be used as path for File System functions
554*f6dc9357SAndroid Build Coastguard Worker */
555*f6dc9357SAndroid Build Coastguard Worker
556*f6dc9357SAndroid Build Coastguard Worker /*
557*f6dc9357SAndroid Build Coastguard Worker static bool IsFsPath(const FString &path)
558*f6dc9357SAndroid Build Coastguard Worker {
559*f6dc9357SAndroid Build Coastguard Worker if (!IsAbsolutePath(path))
560*f6dc9357SAndroid Build Coastguard Worker return false;
561*f6dc9357SAndroid Build Coastguard Worker unsigned prefixSize = GetRootPrefixSize(path);
562*f6dc9357SAndroid Build Coastguard Worker }
563*f6dc9357SAndroid Build Coastguard Worker */
564*f6dc9357SAndroid Build Coastguard Worker
OnCopy(bool move,bool copyToSame,unsigned srcPanelIndex)565*f6dc9357SAndroid Build Coastguard Worker void CApp::OnCopy(bool move, bool copyToSame, unsigned srcPanelIndex)
566*f6dc9357SAndroid Build Coastguard Worker {
567*f6dc9357SAndroid Build Coastguard Worker const unsigned destPanelIndex = (NumPanels <= 1) ? srcPanelIndex : (1 - srcPanelIndex);
568*f6dc9357SAndroid Build Coastguard Worker CPanel &srcPanel = Panels[srcPanelIndex];
569*f6dc9357SAndroid Build Coastguard Worker CPanel &destPanel = Panels[destPanelIndex];
570*f6dc9357SAndroid Build Coastguard Worker
571*f6dc9357SAndroid Build Coastguard Worker CPanel::CDisableTimerProcessing disableTimerProcessing1(destPanel);
572*f6dc9357SAndroid Build Coastguard Worker CPanel::CDisableTimerProcessing disableTimerProcessing2(srcPanel);
573*f6dc9357SAndroid Build Coastguard Worker
574*f6dc9357SAndroid Build Coastguard Worker if (move)
575*f6dc9357SAndroid Build Coastguard Worker {
576*f6dc9357SAndroid Build Coastguard Worker if (!srcPanel.CheckBeforeUpdate(IDS_MOVE))
577*f6dc9357SAndroid Build Coastguard Worker return;
578*f6dc9357SAndroid Build Coastguard Worker }
579*f6dc9357SAndroid Build Coastguard Worker else if (!srcPanel.DoesItSupportOperations())
580*f6dc9357SAndroid Build Coastguard Worker {
581*f6dc9357SAndroid Build Coastguard Worker srcPanel.MessageBox_Error_UnsupportOperation();
582*f6dc9357SAndroid Build Coastguard Worker return;
583*f6dc9357SAndroid Build Coastguard Worker }
584*f6dc9357SAndroid Build Coastguard Worker
585*f6dc9357SAndroid Build Coastguard Worker CRecordVector<UInt32> indices;
586*f6dc9357SAndroid Build Coastguard Worker UString destPath;
587*f6dc9357SAndroid Build Coastguard Worker bool useDestPanel = false;
588*f6dc9357SAndroid Build Coastguard Worker
589*f6dc9357SAndroid Build Coastguard Worker {
590*f6dc9357SAndroid Build Coastguard Worker if (copyToSame)
591*f6dc9357SAndroid Build Coastguard Worker {
592*f6dc9357SAndroid Build Coastguard Worker const int focusedItem = srcPanel._listView.GetFocusedItem();
593*f6dc9357SAndroid Build Coastguard Worker if (focusedItem < 0)
594*f6dc9357SAndroid Build Coastguard Worker return;
595*f6dc9357SAndroid Build Coastguard Worker const unsigned realIndex = srcPanel.GetRealItemIndex(focusedItem);
596*f6dc9357SAndroid Build Coastguard Worker if (realIndex == kParentIndex)
597*f6dc9357SAndroid Build Coastguard Worker return;
598*f6dc9357SAndroid Build Coastguard Worker indices.Add(realIndex);
599*f6dc9357SAndroid Build Coastguard Worker destPath = srcPanel.GetItemName(realIndex);
600*f6dc9357SAndroid Build Coastguard Worker }
601*f6dc9357SAndroid Build Coastguard Worker else
602*f6dc9357SAndroid Build Coastguard Worker {
603*f6dc9357SAndroid Build Coastguard Worker srcPanel.Get_ItemIndices_OperSmart(indices);
604*f6dc9357SAndroid Build Coastguard Worker if (indices.Size() == 0)
605*f6dc9357SAndroid Build Coastguard Worker return;
606*f6dc9357SAndroid Build Coastguard Worker destPath = destPanel.GetFsPath();
607*f6dc9357SAndroid Build Coastguard Worker if (NumPanels == 1)
608*f6dc9357SAndroid Build Coastguard Worker Reduce_Path_To_RealFileSystemPath(destPath);
609*f6dc9357SAndroid Build Coastguard Worker }
610*f6dc9357SAndroid Build Coastguard Worker }
611*f6dc9357SAndroid Build Coastguard Worker
612*f6dc9357SAndroid Build Coastguard Worker UStringVector copyFolders;
613*f6dc9357SAndroid Build Coastguard Worker ReadCopyHistory(copyFolders);
614*f6dc9357SAndroid Build Coastguard Worker
615*f6dc9357SAndroid Build Coastguard Worker const bool useFullItemPaths = srcPanel.Is_IO_FS_Folder(); // maybe we need flat also here ??
616*f6dc9357SAndroid Build Coastguard Worker
617*f6dc9357SAndroid Build Coastguard Worker {
618*f6dc9357SAndroid Build Coastguard Worker CCopyDialog copyDialog;
619*f6dc9357SAndroid Build Coastguard Worker
620*f6dc9357SAndroid Build Coastguard Worker copyDialog.Strings = copyFolders;
621*f6dc9357SAndroid Build Coastguard Worker copyDialog.Value = destPath;
622*f6dc9357SAndroid Build Coastguard Worker LangString(move ? IDS_MOVE : IDS_COPY, copyDialog.Title);
623*f6dc9357SAndroid Build Coastguard Worker LangString(move ? IDS_MOVE_TO : IDS_COPY_TO, copyDialog.Static);
624*f6dc9357SAndroid Build Coastguard Worker copyDialog.Info = srcPanel.GetItemsInfoString(indices);
625*f6dc9357SAndroid Build Coastguard Worker
626*f6dc9357SAndroid Build Coastguard Worker if (copyDialog.Create(srcPanel.GetParent()) != IDOK)
627*f6dc9357SAndroid Build Coastguard Worker return;
628*f6dc9357SAndroid Build Coastguard Worker
629*f6dc9357SAndroid Build Coastguard Worker destPath = copyDialog.Value;
630*f6dc9357SAndroid Build Coastguard Worker }
631*f6dc9357SAndroid Build Coastguard Worker
632*f6dc9357SAndroid Build Coastguard Worker {
633*f6dc9357SAndroid Build Coastguard Worker if (destPath.IsEmpty())
634*f6dc9357SAndroid Build Coastguard Worker {
635*f6dc9357SAndroid Build Coastguard Worker srcPanel.MessageBox_Error_UnsupportOperation();
636*f6dc9357SAndroid Build Coastguard Worker return;
637*f6dc9357SAndroid Build Coastguard Worker }
638*f6dc9357SAndroid Build Coastguard Worker
639*f6dc9357SAndroid Build Coastguard Worker UString correctName;
640*f6dc9357SAndroid Build Coastguard Worker if (!srcPanel.CorrectFsPath(destPath, correctName))
641*f6dc9357SAndroid Build Coastguard Worker {
642*f6dc9357SAndroid Build Coastguard Worker srcPanel.MessageBox_Error_HRESULT(E_INVALIDARG);
643*f6dc9357SAndroid Build Coastguard Worker return;
644*f6dc9357SAndroid Build Coastguard Worker }
645*f6dc9357SAndroid Build Coastguard Worker
646*f6dc9357SAndroid Build Coastguard Worker if (IsAbsolutePath(destPath))
647*f6dc9357SAndroid Build Coastguard Worker destPath.Empty();
648*f6dc9357SAndroid Build Coastguard Worker else
649*f6dc9357SAndroid Build Coastguard Worker destPath = srcPanel.GetFsPath();
650*f6dc9357SAndroid Build Coastguard Worker destPath += correctName;
651*f6dc9357SAndroid Build Coastguard Worker
652*f6dc9357SAndroid Build Coastguard Worker #if defined(_WIN32) && !defined(UNDER_CE)
653*f6dc9357SAndroid Build Coastguard Worker if (destPath.Len() != 0 && destPath[0] == '\\')
654*f6dc9357SAndroid Build Coastguard Worker if (destPath.Len() == 1 || destPath[1] != '\\')
655*f6dc9357SAndroid Build Coastguard Worker {
656*f6dc9357SAndroid Build Coastguard Worker srcPanel.MessageBox_Error_UnsupportOperation();
657*f6dc9357SAndroid Build Coastguard Worker return;
658*f6dc9357SAndroid Build Coastguard Worker }
659*f6dc9357SAndroid Build Coastguard Worker #endif
660*f6dc9357SAndroid Build Coastguard Worker
661*f6dc9357SAndroid Build Coastguard Worker bool possibleToUseDestPanel = false;
662*f6dc9357SAndroid Build Coastguard Worker
663*f6dc9357SAndroid Build Coastguard Worker if (CompareFileNames(destPath, destPanel.GetFsPath()) == 0)
664*f6dc9357SAndroid Build Coastguard Worker {
665*f6dc9357SAndroid Build Coastguard Worker if (NumPanels == 1 || CompareFileNames(destPath, srcPanel.GetFsPath()) == 0)
666*f6dc9357SAndroid Build Coastguard Worker {
667*f6dc9357SAndroid Build Coastguard Worker srcPanel.MessageBox_Error(L"Cannot copy files onto itself");
668*f6dc9357SAndroid Build Coastguard Worker return;
669*f6dc9357SAndroid Build Coastguard Worker }
670*f6dc9357SAndroid Build Coastguard Worker
671*f6dc9357SAndroid Build Coastguard Worker if (destPanel.DoesItSupportOperations())
672*f6dc9357SAndroid Build Coastguard Worker possibleToUseDestPanel = true;
673*f6dc9357SAndroid Build Coastguard Worker }
674*f6dc9357SAndroid Build Coastguard Worker
675*f6dc9357SAndroid Build Coastguard Worker bool destIsFsPath = false;
676*f6dc9357SAndroid Build Coastguard Worker
677*f6dc9357SAndroid Build Coastguard Worker if (possibleToUseDestPanel)
678*f6dc9357SAndroid Build Coastguard Worker {
679*f6dc9357SAndroid Build Coastguard Worker if (destPanel.IsFSFolder() || destPanel.IsAltStreamsFolder())
680*f6dc9357SAndroid Build Coastguard Worker destIsFsPath = true;
681*f6dc9357SAndroid Build Coastguard Worker else if (destPanel.IsFSDrivesFolder() || destPanel.IsRootFolder())
682*f6dc9357SAndroid Build Coastguard Worker {
683*f6dc9357SAndroid Build Coastguard Worker srcPanel.MessageBox_Error_UnsupportOperation();
684*f6dc9357SAndroid Build Coastguard Worker return;
685*f6dc9357SAndroid Build Coastguard Worker }
686*f6dc9357SAndroid Build Coastguard Worker }
687*f6dc9357SAndroid Build Coastguard Worker else
688*f6dc9357SAndroid Build Coastguard Worker {
689*f6dc9357SAndroid Build Coastguard Worker if (IsAltPathPrefix(us2fs(destPath)))
690*f6dc9357SAndroid Build Coastguard Worker {
691*f6dc9357SAndroid Build Coastguard Worker // we allow alt streams dest only to alt stream folder in second panel
692*f6dc9357SAndroid Build Coastguard Worker srcPanel.MessageBox_Error_UnsupportOperation();
693*f6dc9357SAndroid Build Coastguard Worker return;
694*f6dc9357SAndroid Build Coastguard Worker /*
695*f6dc9357SAndroid Build Coastguard Worker FString basePath = us2fs(destPath);
696*f6dc9357SAndroid Build Coastguard Worker basePath.DeleteBack();
697*f6dc9357SAndroid Build Coastguard Worker if (!DoesFileOrDirExist(basePath))
698*f6dc9357SAndroid Build Coastguard Worker {
699*f6dc9357SAndroid Build Coastguard Worker srcPanel.MessageBoxError2Lines(basePath, ERROR_FILE_NOT_FOUND); // GetLastError()
700*f6dc9357SAndroid Build Coastguard Worker return;
701*f6dc9357SAndroid Build Coastguard Worker }
702*f6dc9357SAndroid Build Coastguard Worker destIsFsPath = true;
703*f6dc9357SAndroid Build Coastguard Worker */
704*f6dc9357SAndroid Build Coastguard Worker }
705*f6dc9357SAndroid Build Coastguard Worker else
706*f6dc9357SAndroid Build Coastguard Worker {
707*f6dc9357SAndroid Build Coastguard Worker if (indices.Size() == 1 &&
708*f6dc9357SAndroid Build Coastguard Worker !destPath.IsEmpty() && !IS_PATH_SEPAR(destPath.Back()))
709*f6dc9357SAndroid Build Coastguard Worker {
710*f6dc9357SAndroid Build Coastguard Worker int pos = destPath.ReverseFind_PathSepar();
711*f6dc9357SAndroid Build Coastguard Worker if (pos < 0)
712*f6dc9357SAndroid Build Coastguard Worker {
713*f6dc9357SAndroid Build Coastguard Worker srcPanel.MessageBox_Error_UnsupportOperation();
714*f6dc9357SAndroid Build Coastguard Worker return;
715*f6dc9357SAndroid Build Coastguard Worker }
716*f6dc9357SAndroid Build Coastguard Worker {
717*f6dc9357SAndroid Build Coastguard Worker /*
718*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
719*f6dc9357SAndroid Build Coastguard Worker UString name = destPath.Ptr(pos + 1);
720*f6dc9357SAndroid Build Coastguard Worker if (name.Find(L':') >= 0)
721*f6dc9357SAndroid Build Coastguard Worker {
722*f6dc9357SAndroid Build Coastguard Worker srcPanel.MessageBox_Error_UnsupportOperation();
723*f6dc9357SAndroid Build Coastguard Worker return;
724*f6dc9357SAndroid Build Coastguard Worker }
725*f6dc9357SAndroid Build Coastguard Worker #endif
726*f6dc9357SAndroid Build Coastguard Worker */
727*f6dc9357SAndroid Build Coastguard Worker UString prefix = destPath.Left(pos + 1);
728*f6dc9357SAndroid Build Coastguard Worker if (!CreateComplexDir(us2fs(prefix)))
729*f6dc9357SAndroid Build Coastguard Worker {
730*f6dc9357SAndroid Build Coastguard Worker const HRESULT lastError = GetLastError_noZero_HRESULT();
731*f6dc9357SAndroid Build Coastguard Worker srcPanel.MessageBox_Error_2Lines_Message_HRESULT(prefix, lastError);
732*f6dc9357SAndroid Build Coastguard Worker return;
733*f6dc9357SAndroid Build Coastguard Worker }
734*f6dc9357SAndroid Build Coastguard Worker }
735*f6dc9357SAndroid Build Coastguard Worker // bool isFolder = srcPanael.IsItem_Folder(indices[0]);
736*f6dc9357SAndroid Build Coastguard Worker }
737*f6dc9357SAndroid Build Coastguard Worker else
738*f6dc9357SAndroid Build Coastguard Worker {
739*f6dc9357SAndroid Build Coastguard Worker NName::NormalizeDirPathPrefix(destPath);
740*f6dc9357SAndroid Build Coastguard Worker if (!CreateComplexDir(us2fs(destPath)))
741*f6dc9357SAndroid Build Coastguard Worker {
742*f6dc9357SAndroid Build Coastguard Worker const HRESULT lastError = GetLastError_noZero_HRESULT();
743*f6dc9357SAndroid Build Coastguard Worker srcPanel.MessageBox_Error_2Lines_Message_HRESULT(destPath, lastError);
744*f6dc9357SAndroid Build Coastguard Worker return;
745*f6dc9357SAndroid Build Coastguard Worker }
746*f6dc9357SAndroid Build Coastguard Worker }
747*f6dc9357SAndroid Build Coastguard Worker destIsFsPath = true;
748*f6dc9357SAndroid Build Coastguard Worker }
749*f6dc9357SAndroid Build Coastguard Worker }
750*f6dc9357SAndroid Build Coastguard Worker
751*f6dc9357SAndroid Build Coastguard Worker if (!destIsFsPath)
752*f6dc9357SAndroid Build Coastguard Worker useDestPanel = true;
753*f6dc9357SAndroid Build Coastguard Worker
754*f6dc9357SAndroid Build Coastguard Worker AddUniqueStringToHeadOfList(copyFolders, destPath);
755*f6dc9357SAndroid Build Coastguard Worker while (copyFolders.Size() > 20)
756*f6dc9357SAndroid Build Coastguard Worker copyFolders.DeleteBack();
757*f6dc9357SAndroid Build Coastguard Worker SaveCopyHistory(copyFolders);
758*f6dc9357SAndroid Build Coastguard Worker }
759*f6dc9357SAndroid Build Coastguard Worker
760*f6dc9357SAndroid Build Coastguard Worker bool useSrcPanel = !useDestPanel || !srcPanel.Is_IO_FS_Folder();
761*f6dc9357SAndroid Build Coastguard Worker
762*f6dc9357SAndroid Build Coastguard Worker bool useTemp = useSrcPanel && useDestPanel;
763*f6dc9357SAndroid Build Coastguard Worker if (useTemp && NumPanels == 1)
764*f6dc9357SAndroid Build Coastguard Worker {
765*f6dc9357SAndroid Build Coastguard Worker srcPanel.MessageBox_Error_UnsupportOperation();
766*f6dc9357SAndroid Build Coastguard Worker return;
767*f6dc9357SAndroid Build Coastguard Worker }
768*f6dc9357SAndroid Build Coastguard Worker
769*f6dc9357SAndroid Build Coastguard Worker CTempDir tempDirectory;
770*f6dc9357SAndroid Build Coastguard Worker FString tempDirPrefix;
771*f6dc9357SAndroid Build Coastguard Worker if (useTemp)
772*f6dc9357SAndroid Build Coastguard Worker {
773*f6dc9357SAndroid Build Coastguard Worker tempDirectory.Create(kTempDirPrefix);
774*f6dc9357SAndroid Build Coastguard Worker tempDirPrefix = tempDirectory.GetPath();
775*f6dc9357SAndroid Build Coastguard Worker NFile::NName::NormalizeDirPathPrefix(tempDirPrefix);
776*f6dc9357SAndroid Build Coastguard Worker }
777*f6dc9357SAndroid Build Coastguard Worker
778*f6dc9357SAndroid Build Coastguard Worker CSelectedState srcSelState;
779*f6dc9357SAndroid Build Coastguard Worker CSelectedState destSelState;
780*f6dc9357SAndroid Build Coastguard Worker srcPanel.SaveSelectedState(srcSelState);
781*f6dc9357SAndroid Build Coastguard Worker destPanel.SaveSelectedState(destSelState);
782*f6dc9357SAndroid Build Coastguard Worker
783*f6dc9357SAndroid Build Coastguard Worker CPanel::CDisableNotify disableNotify1(destPanel);
784*f6dc9357SAndroid Build Coastguard Worker CPanel::CDisableNotify disableNotify2(srcPanel);
785*f6dc9357SAndroid Build Coastguard Worker
786*f6dc9357SAndroid Build Coastguard Worker HRESULT result = S_OK;
787*f6dc9357SAndroid Build Coastguard Worker
788*f6dc9357SAndroid Build Coastguard Worker if (useSrcPanel)
789*f6dc9357SAndroid Build Coastguard Worker {
790*f6dc9357SAndroid Build Coastguard Worker CCopyToOptions options;
791*f6dc9357SAndroid Build Coastguard Worker // options.src_Is_IO_FS_Folder = useFullItemPaths;
792*f6dc9357SAndroid Build Coastguard Worker options.folder = useTemp ? fs2us(tempDirPrefix) : destPath;
793*f6dc9357SAndroid Build Coastguard Worker options.moveMode = move;
794*f6dc9357SAndroid Build Coastguard Worker options.includeAltStreams = true;
795*f6dc9357SAndroid Build Coastguard Worker options.replaceAltStreamChars = false;
796*f6dc9357SAndroid Build Coastguard Worker options.showErrorMessages = true;
797*f6dc9357SAndroid Build Coastguard Worker
798*f6dc9357SAndroid Build Coastguard Worker result = srcPanel.CopyTo(options, indices, NULL);
799*f6dc9357SAndroid Build Coastguard Worker }
800*f6dc9357SAndroid Build Coastguard Worker
801*f6dc9357SAndroid Build Coastguard Worker if (result == S_OK && useDestPanel)
802*f6dc9357SAndroid Build Coastguard Worker {
803*f6dc9357SAndroid Build Coastguard Worker UStringVector filePaths;
804*f6dc9357SAndroid Build Coastguard Worker UString folderPrefix;
805*f6dc9357SAndroid Build Coastguard Worker
806*f6dc9357SAndroid Build Coastguard Worker if (useTemp)
807*f6dc9357SAndroid Build Coastguard Worker folderPrefix = fs2us(tempDirPrefix);
808*f6dc9357SAndroid Build Coastguard Worker else
809*f6dc9357SAndroid Build Coastguard Worker folderPrefix = srcPanel.GetFsPath();
810*f6dc9357SAndroid Build Coastguard Worker
811*f6dc9357SAndroid Build Coastguard Worker filePaths.ClearAndReserve(indices.Size());
812*f6dc9357SAndroid Build Coastguard Worker
813*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR (i, indices)
814*f6dc9357SAndroid Build Coastguard Worker {
815*f6dc9357SAndroid Build Coastguard Worker UInt32 index = indices[i];
816*f6dc9357SAndroid Build Coastguard Worker UString s;
817*f6dc9357SAndroid Build Coastguard Worker if (useFullItemPaths)
818*f6dc9357SAndroid Build Coastguard Worker s = srcPanel.GetItemRelPath2(index);
819*f6dc9357SAndroid Build Coastguard Worker else
820*f6dc9357SAndroid Build Coastguard Worker s = srcPanel.GetItemName_for_Copy(index);
821*f6dc9357SAndroid Build Coastguard Worker filePaths.AddInReserved(s);
822*f6dc9357SAndroid Build Coastguard Worker }
823*f6dc9357SAndroid Build Coastguard Worker
824*f6dc9357SAndroid Build Coastguard Worker result = destPanel.CopyFrom(move, folderPrefix, filePaths, true, NULL);
825*f6dc9357SAndroid Build Coastguard Worker }
826*f6dc9357SAndroid Build Coastguard Worker
827*f6dc9357SAndroid Build Coastguard Worker if (result != S_OK)
828*f6dc9357SAndroid Build Coastguard Worker {
829*f6dc9357SAndroid Build Coastguard Worker // disableNotify1.Restore();
830*f6dc9357SAndroid Build Coastguard Worker // disableNotify2.Restore();
831*f6dc9357SAndroid Build Coastguard Worker // For Password:
832*f6dc9357SAndroid Build Coastguard Worker // srcPanel.SetFocusToList();
833*f6dc9357SAndroid Build Coastguard Worker // srcPanel.InvalidateList(NULL, true);
834*f6dc9357SAndroid Build Coastguard Worker
835*f6dc9357SAndroid Build Coastguard Worker if (result != E_ABORT)
836*f6dc9357SAndroid Build Coastguard Worker srcPanel.MessageBox_Error_HRESULT(result);
837*f6dc9357SAndroid Build Coastguard Worker // return;
838*f6dc9357SAndroid Build Coastguard Worker }
839*f6dc9357SAndroid Build Coastguard Worker
840*f6dc9357SAndroid Build Coastguard Worker RefreshTitleAlways();
841*f6dc9357SAndroid Build Coastguard Worker
842*f6dc9357SAndroid Build Coastguard Worker if (copyToSame || move)
843*f6dc9357SAndroid Build Coastguard Worker {
844*f6dc9357SAndroid Build Coastguard Worker srcPanel.RefreshListCtrl(srcSelState);
845*f6dc9357SAndroid Build Coastguard Worker }
846*f6dc9357SAndroid Build Coastguard Worker
847*f6dc9357SAndroid Build Coastguard Worker if (!copyToSame)
848*f6dc9357SAndroid Build Coastguard Worker {
849*f6dc9357SAndroid Build Coastguard Worker destPanel.RefreshListCtrl(destSelState);
850*f6dc9357SAndroid Build Coastguard Worker srcPanel.KillSelection();
851*f6dc9357SAndroid Build Coastguard Worker }
852*f6dc9357SAndroid Build Coastguard Worker
853*f6dc9357SAndroid Build Coastguard Worker disableNotify1.Restore();
854*f6dc9357SAndroid Build Coastguard Worker disableNotify2.Restore();
855*f6dc9357SAndroid Build Coastguard Worker srcPanel.SetFocusToList();
856*f6dc9357SAndroid Build Coastguard Worker }
857*f6dc9357SAndroid Build Coastguard Worker
OnSetSameFolder(unsigned srcPanelIndex)858*f6dc9357SAndroid Build Coastguard Worker void CApp::OnSetSameFolder(unsigned srcPanelIndex)
859*f6dc9357SAndroid Build Coastguard Worker {
860*f6dc9357SAndroid Build Coastguard Worker if (NumPanels <= 1)
861*f6dc9357SAndroid Build Coastguard Worker return;
862*f6dc9357SAndroid Build Coastguard Worker const CPanel &srcPanel = Panels[srcPanelIndex];
863*f6dc9357SAndroid Build Coastguard Worker CPanel &destPanel = Panels[1 - srcPanelIndex];
864*f6dc9357SAndroid Build Coastguard Worker destPanel.BindToPathAndRefresh(srcPanel._currentFolderPrefix);
865*f6dc9357SAndroid Build Coastguard Worker }
866*f6dc9357SAndroid Build Coastguard Worker
OnSetSubFolder(unsigned srcPanelIndex)867*f6dc9357SAndroid Build Coastguard Worker void CApp::OnSetSubFolder(unsigned srcPanelIndex)
868*f6dc9357SAndroid Build Coastguard Worker {
869*f6dc9357SAndroid Build Coastguard Worker if (NumPanels <= 1)
870*f6dc9357SAndroid Build Coastguard Worker return;
871*f6dc9357SAndroid Build Coastguard Worker const CPanel &srcPanel = Panels[srcPanelIndex];
872*f6dc9357SAndroid Build Coastguard Worker CPanel &destPanel = Panels[1 - srcPanelIndex];
873*f6dc9357SAndroid Build Coastguard Worker
874*f6dc9357SAndroid Build Coastguard Worker const int focusedItem = srcPanel._listView.GetFocusedItem();
875*f6dc9357SAndroid Build Coastguard Worker if (focusedItem < 0)
876*f6dc9357SAndroid Build Coastguard Worker return;
877*f6dc9357SAndroid Build Coastguard Worker const unsigned realIndex = srcPanel.GetRealItemIndex(focusedItem);
878*f6dc9357SAndroid Build Coastguard Worker if (!srcPanel.IsItem_Folder(realIndex))
879*f6dc9357SAndroid Build Coastguard Worker return;
880*f6dc9357SAndroid Build Coastguard Worker
881*f6dc9357SAndroid Build Coastguard Worker // destPanel.BindToFolder(srcPanel._currentFolderPrefix + srcPanel.GetItemName(realIndex) + WCHAR_PATH_SEPARATOR);
882*f6dc9357SAndroid Build Coastguard Worker
883*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IFolderFolder> newFolder;
884*f6dc9357SAndroid Build Coastguard Worker if (realIndex == kParentIndex)
885*f6dc9357SAndroid Build Coastguard Worker {
886*f6dc9357SAndroid Build Coastguard Worker if (srcPanel._folder->BindToParentFolder(&newFolder) != S_OK)
887*f6dc9357SAndroid Build Coastguard Worker return;
888*f6dc9357SAndroid Build Coastguard Worker if (!newFolder)
889*f6dc9357SAndroid Build Coastguard Worker {
890*f6dc9357SAndroid Build Coastguard Worker {
891*f6dc9357SAndroid Build Coastguard Worker const UString parentPrefix = srcPanel.GetParentDirPrefix();
892*f6dc9357SAndroid Build Coastguard Worker COpenResult openRes;
893*f6dc9357SAndroid Build Coastguard Worker destPanel.BindToPath(parentPrefix, UString(), openRes);
894*f6dc9357SAndroid Build Coastguard Worker }
895*f6dc9357SAndroid Build Coastguard Worker destPanel.RefreshListCtrl();
896*f6dc9357SAndroid Build Coastguard Worker return;
897*f6dc9357SAndroid Build Coastguard Worker }
898*f6dc9357SAndroid Build Coastguard Worker }
899*f6dc9357SAndroid Build Coastguard Worker else
900*f6dc9357SAndroid Build Coastguard Worker {
901*f6dc9357SAndroid Build Coastguard Worker if (srcPanel._folder->BindToFolder(realIndex, &newFolder) != S_OK)
902*f6dc9357SAndroid Build Coastguard Worker return;
903*f6dc9357SAndroid Build Coastguard Worker }
904*f6dc9357SAndroid Build Coastguard Worker
905*f6dc9357SAndroid Build Coastguard Worker if (!newFolder)
906*f6dc9357SAndroid Build Coastguard Worker return;
907*f6dc9357SAndroid Build Coastguard Worker
908*f6dc9357SAndroid Build Coastguard Worker destPanel.CloseOpenFolders();
909*f6dc9357SAndroid Build Coastguard Worker destPanel.SetNewFolder(newFolder);
910*f6dc9357SAndroid Build Coastguard Worker destPanel.RefreshListCtrl();
911*f6dc9357SAndroid Build Coastguard Worker }
912*f6dc9357SAndroid Build Coastguard Worker
913*f6dc9357SAndroid Build Coastguard Worker /*
914*f6dc9357SAndroid Build Coastguard Worker int CApp::GetFocusedPanelIndex() const
915*f6dc9357SAndroid Build Coastguard Worker {
916*f6dc9357SAndroid Build Coastguard Worker return LastFocusedPanel;
917*f6dc9357SAndroid Build Coastguard Worker HWND hwnd = ::GetFocus();
918*f6dc9357SAndroid Build Coastguard Worker for (;;)
919*f6dc9357SAndroid Build Coastguard Worker {
920*f6dc9357SAndroid Build Coastguard Worker if (hwnd == 0)
921*f6dc9357SAndroid Build Coastguard Worker return 0;
922*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < kNumPanelsMax; i++)
923*f6dc9357SAndroid Build Coastguard Worker {
924*f6dc9357SAndroid Build Coastguard Worker if (PanelsCreated[i] &&
925*f6dc9357SAndroid Build Coastguard Worker ((HWND)Panels[i] == hwnd || Panels[i]._listView == hwnd))
926*f6dc9357SAndroid Build Coastguard Worker return i;
927*f6dc9357SAndroid Build Coastguard Worker }
928*f6dc9357SAndroid Build Coastguard Worker hwnd = GetParent(hwnd);
929*f6dc9357SAndroid Build Coastguard Worker }
930*f6dc9357SAndroid Build Coastguard Worker }
931*f6dc9357SAndroid Build Coastguard Worker */
932*f6dc9357SAndroid Build Coastguard Worker
933*f6dc9357SAndroid Build Coastguard Worker static UString g_ToolTipBuffer;
934*f6dc9357SAndroid Build Coastguard Worker static CSysString g_ToolTipBufferSys;
935*f6dc9357SAndroid Build Coastguard Worker
OnNotify(int,LPNMHDR pnmh)936*f6dc9357SAndroid Build Coastguard Worker void CApp::OnNotify(int /* ctrlID */, LPNMHDR pnmh)
937*f6dc9357SAndroid Build Coastguard Worker {
938*f6dc9357SAndroid Build Coastguard Worker {
939*f6dc9357SAndroid Build Coastguard Worker if (pnmh->code == TTN_GETDISPINFO)
940*f6dc9357SAndroid Build Coastguard Worker {
941*f6dc9357SAndroid Build Coastguard Worker LPNMTTDISPINFO info = (LPNMTTDISPINFO)pnmh;
942*f6dc9357SAndroid Build Coastguard Worker info->hinst = NULL;
943*f6dc9357SAndroid Build Coastguard Worker g_ToolTipBuffer.Empty();
944*f6dc9357SAndroid Build Coastguard Worker SetButtonText((int)info->hdr.idFrom, g_ToolTipBuffer);
945*f6dc9357SAndroid Build Coastguard Worker g_ToolTipBufferSys = GetSystemString(g_ToolTipBuffer);
946*f6dc9357SAndroid Build Coastguard Worker info->lpszText = g_ToolTipBufferSys.Ptr_non_const();
947*f6dc9357SAndroid Build Coastguard Worker return;
948*f6dc9357SAndroid Build Coastguard Worker }
949*f6dc9357SAndroid Build Coastguard Worker #ifndef _UNICODE
950*f6dc9357SAndroid Build Coastguard Worker if (pnmh->code == TTN_GETDISPINFOW)
951*f6dc9357SAndroid Build Coastguard Worker {
952*f6dc9357SAndroid Build Coastguard Worker LPNMTTDISPINFOW info = (LPNMTTDISPINFOW)pnmh;
953*f6dc9357SAndroid Build Coastguard Worker info->hinst = NULL;
954*f6dc9357SAndroid Build Coastguard Worker g_ToolTipBuffer.Empty();
955*f6dc9357SAndroid Build Coastguard Worker SetButtonText((int)info->hdr.idFrom, g_ToolTipBuffer);
956*f6dc9357SAndroid Build Coastguard Worker info->lpszText = g_ToolTipBuffer.Ptr_non_const();
957*f6dc9357SAndroid Build Coastguard Worker return;
958*f6dc9357SAndroid Build Coastguard Worker }
959*f6dc9357SAndroid Build Coastguard Worker #endif
960*f6dc9357SAndroid Build Coastguard Worker }
961*f6dc9357SAndroid Build Coastguard Worker }
962*f6dc9357SAndroid Build Coastguard Worker
RefreshTitle(bool always)963*f6dc9357SAndroid Build Coastguard Worker void CApp::RefreshTitle(bool always)
964*f6dc9357SAndroid Build Coastguard Worker {
965*f6dc9357SAndroid Build Coastguard Worker UString path = GetFocusedPanel()._currentFolderPrefix;
966*f6dc9357SAndroid Build Coastguard Worker if (path.IsEmpty())
967*f6dc9357SAndroid Build Coastguard Worker path = "7-Zip"; // LangString(IDS_APP_TITLE);
968*f6dc9357SAndroid Build Coastguard Worker if (!always && path == PrevTitle)
969*f6dc9357SAndroid Build Coastguard Worker return;
970*f6dc9357SAndroid Build Coastguard Worker PrevTitle = path;
971*f6dc9357SAndroid Build Coastguard Worker NWindows::MySetWindowText(_window, path);
972*f6dc9357SAndroid Build Coastguard Worker }
973*f6dc9357SAndroid Build Coastguard Worker
RefreshTitlePanel(unsigned panelIndex,bool always)974*f6dc9357SAndroid Build Coastguard Worker void CApp::RefreshTitlePanel(unsigned panelIndex, bool always)
975*f6dc9357SAndroid Build Coastguard Worker {
976*f6dc9357SAndroid Build Coastguard Worker if (panelIndex != GetFocusedPanelIndex())
977*f6dc9357SAndroid Build Coastguard Worker return;
978*f6dc9357SAndroid Build Coastguard Worker RefreshTitle(always);
979*f6dc9357SAndroid Build Coastguard Worker }
980*f6dc9357SAndroid Build Coastguard Worker
AddUniqueStringToHead(UStringVector & list,const UString & s)981*f6dc9357SAndroid Build Coastguard Worker static void AddUniqueStringToHead(UStringVector &list, const UString &s)
982*f6dc9357SAndroid Build Coastguard Worker {
983*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < list.Size();)
984*f6dc9357SAndroid Build Coastguard Worker if (s.IsEqualTo_NoCase(list[i]))
985*f6dc9357SAndroid Build Coastguard Worker list.Delete(i);
986*f6dc9357SAndroid Build Coastguard Worker else
987*f6dc9357SAndroid Build Coastguard Worker i++;
988*f6dc9357SAndroid Build Coastguard Worker list.Insert(0, s);
989*f6dc9357SAndroid Build Coastguard Worker }
990*f6dc9357SAndroid Build Coastguard Worker
991*f6dc9357SAndroid Build Coastguard Worker
Normalize()992*f6dc9357SAndroid Build Coastguard Worker void CFolderHistory::Normalize()
993*f6dc9357SAndroid Build Coastguard Worker {
994*f6dc9357SAndroid Build Coastguard Worker const unsigned kMaxSize = 100;
995*f6dc9357SAndroid Build Coastguard Worker if (Strings.Size() > kMaxSize)
996*f6dc9357SAndroid Build Coastguard Worker Strings.DeleteFrom(kMaxSize);
997*f6dc9357SAndroid Build Coastguard Worker }
998*f6dc9357SAndroid Build Coastguard Worker
AddString(const UString & s)999*f6dc9357SAndroid Build Coastguard Worker void CFolderHistory::AddString(const UString &s)
1000*f6dc9357SAndroid Build Coastguard Worker {
1001*f6dc9357SAndroid Build Coastguard Worker NSynchronization::CCriticalSectionLock lock(_criticalSection);
1002*f6dc9357SAndroid Build Coastguard Worker AddUniqueStringToHead(Strings, s);
1003*f6dc9357SAndroid Build Coastguard Worker Normalize();
1004*f6dc9357SAndroid Build Coastguard Worker }
1005