xref: /aosp_15_r20/external/lzma/CPP/7zip/UI/FileManager/App.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
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