xref: /aosp_15_r20/external/lzma/CPP/7zip/UI/FileManager/BrowseDialog2.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // BrowseDialog2.cpp
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker 
5*f6dc9357SAndroid Build Coastguard Worker #ifdef UNDER_CE
6*f6dc9357SAndroid Build Coastguard Worker #include <commdlg.h>
7*f6dc9357SAndroid Build Coastguard Worker #endif
8*f6dc9357SAndroid Build Coastguard Worker 
9*f6dc9357SAndroid Build Coastguard Worker #include <windowsx.h>
10*f6dc9357SAndroid Build Coastguard Worker 
11*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/IntToString.h"
12*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/StringConvert.h"
13*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/Wildcard.h"
14*f6dc9357SAndroid Build Coastguard Worker 
15*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/DLL.h"
16*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/FileFind.h"
17*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/FileDir.h"
18*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/FileName.h"
19*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/Menu.h"
20*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/ProcessUtils.h"
21*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/PropVariantConv.h"
22*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/Control/ComboBox.h"
23*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/Control/Dialog.h"
24*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/Control/Edit.h"
25*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/Control/ListView.h"
26*f6dc9357SAndroid Build Coastguard Worker 
27*f6dc9357SAndroid Build Coastguard Worker #include "../Explorer/MyMessages.h"
28*f6dc9357SAndroid Build Coastguard Worker 
29*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_NO_REGISTRY
30*f6dc9357SAndroid Build Coastguard Worker #include "HelpUtils.h"
31*f6dc9357SAndroid Build Coastguard Worker #endif
32*f6dc9357SAndroid Build Coastguard Worker 
33*f6dc9357SAndroid Build Coastguard Worker #include "../Common/PropIDUtils.h"
34*f6dc9357SAndroid Build Coastguard Worker 
35*f6dc9357SAndroid Build Coastguard Worker #include "PropertyNameRes.h"
36*f6dc9357SAndroid Build Coastguard Worker #include "RegistryUtils.h"
37*f6dc9357SAndroid Build Coastguard Worker #include "SysIconUtils.h"
38*f6dc9357SAndroid Build Coastguard Worker #include "FormatUtils.h"
39*f6dc9357SAndroid Build Coastguard Worker #include "LangUtils.h"
40*f6dc9357SAndroid Build Coastguard Worker 
41*f6dc9357SAndroid Build Coastguard Worker #include "resource.h"
42*f6dc9357SAndroid Build Coastguard Worker #include "BrowseDialog2Res.h"
43*f6dc9357SAndroid Build Coastguard Worker #include "BrowseDialog2.h"
44*f6dc9357SAndroid Build Coastguard Worker 
45*f6dc9357SAndroid Build Coastguard Worker using namespace NWindows;
46*f6dc9357SAndroid Build Coastguard Worker using namespace NFile;
47*f6dc9357SAndroid Build Coastguard Worker using namespace NName;
48*f6dc9357SAndroid Build Coastguard Worker using namespace NFind;
49*f6dc9357SAndroid Build Coastguard Worker 
50*f6dc9357SAndroid Build Coastguard Worker #ifndef _UNICODE
51*f6dc9357SAndroid Build Coastguard Worker extern bool g_IsNT;
52*f6dc9357SAndroid Build Coastguard Worker #endif
53*f6dc9357SAndroid Build Coastguard Worker 
54*f6dc9357SAndroid Build Coastguard Worker extern bool g_LVN_ITEMACTIVATE_Support;
55*f6dc9357SAndroid Build Coastguard Worker 
56*f6dc9357SAndroid Build Coastguard Worker static const int kParentIndex = -1;
57*f6dc9357SAndroid Build Coastguard Worker // static const UINT k_Message_RefreshPathEdit = WM_APP + 1;
58*f6dc9357SAndroid Build Coastguard Worker 
59*f6dc9357SAndroid Build Coastguard Worker 
60*f6dc9357SAndroid Build Coastguard Worker static const wchar_t *k_Message_Link_operation_was_Blocked =
61*f6dc9357SAndroid Build Coastguard Worker     L"link openning was blocked by 7-Zip";
62*f6dc9357SAndroid Build Coastguard Worker 
63*f6dc9357SAndroid Build Coastguard Worker extern UString HResultToMessage(HRESULT errorCode);
64*f6dc9357SAndroid Build Coastguard Worker 
MessageBox_HResError(HWND wnd,HRESULT errorCode,const wchar_t * name)65*f6dc9357SAndroid Build Coastguard Worker static void MessageBox_HResError(HWND wnd, HRESULT errorCode, const wchar_t *name)
66*f6dc9357SAndroid Build Coastguard Worker {
67*f6dc9357SAndroid Build Coastguard Worker   UString s = HResultToMessage(errorCode);
68*f6dc9357SAndroid Build Coastguard Worker   if (name)
69*f6dc9357SAndroid Build Coastguard Worker   {
70*f6dc9357SAndroid Build Coastguard Worker     s.Add_LF();
71*f6dc9357SAndroid Build Coastguard Worker     s += name;
72*f6dc9357SAndroid Build Coastguard Worker   }
73*f6dc9357SAndroid Build Coastguard Worker   ShowErrorMessage(wnd, s);
74*f6dc9357SAndroid Build Coastguard Worker }
75*f6dc9357SAndroid Build Coastguard Worker 
MessageBox_LastError_path(HWND wnd,const FString & path)76*f6dc9357SAndroid Build Coastguard Worker static void MessageBox_LastError_path(HWND wnd, const FString &path)
77*f6dc9357SAndroid Build Coastguard Worker {
78*f6dc9357SAndroid Build Coastguard Worker   const HRESULT hres = GetLastError_noZero_HRESULT();
79*f6dc9357SAndroid Build Coastguard Worker   MessageBox_HResError(wnd, hres, fs2us(path));
80*f6dc9357SAndroid Build Coastguard Worker }
81*f6dc9357SAndroid Build Coastguard Worker 
82*f6dc9357SAndroid Build Coastguard Worker 
83*f6dc9357SAndroid Build Coastguard Worker static const UInt32 k_EnumerateDirsLimit = 200;
84*f6dc9357SAndroid Build Coastguard Worker static const UInt32 k_EnumerateFilesLimit = 2000;
85*f6dc9357SAndroid Build Coastguard Worker 
86*f6dc9357SAndroid Build Coastguard Worker struct CBrowseItem
87*f6dc9357SAndroid Build Coastguard Worker {
88*f6dc9357SAndroid Build Coastguard Worker   unsigned MainFileIndex;
89*f6dc9357SAndroid Build Coastguard Worker   int SubFileIndex;
90*f6dc9357SAndroid Build Coastguard Worker   bool WasInterrupted;
91*f6dc9357SAndroid Build Coastguard Worker   UInt32 NumFiles;
92*f6dc9357SAndroid Build Coastguard Worker   UInt32 NumDirs;
93*f6dc9357SAndroid Build Coastguard Worker   UInt32 NumRootItems;
94*f6dc9357SAndroid Build Coastguard Worker   UInt64 Size;
95*f6dc9357SAndroid Build Coastguard Worker 
CBrowseItemCBrowseItem96*f6dc9357SAndroid Build Coastguard Worker   CBrowseItem():
97*f6dc9357SAndroid Build Coastguard Worker     // MainFileIndex(0),
98*f6dc9357SAndroid Build Coastguard Worker     SubFileIndex(-1),
99*f6dc9357SAndroid Build Coastguard Worker     WasInterrupted(false),
100*f6dc9357SAndroid Build Coastguard Worker     NumFiles(0),
101*f6dc9357SAndroid Build Coastguard Worker     NumDirs(0),
102*f6dc9357SAndroid Build Coastguard Worker     NumRootItems(0),
103*f6dc9357SAndroid Build Coastguard Worker     Size(0)
104*f6dc9357SAndroid Build Coastguard Worker     {}
105*f6dc9357SAndroid Build Coastguard Worker };
106*f6dc9357SAndroid Build Coastguard Worker 
107*f6dc9357SAndroid Build Coastguard Worker 
108*f6dc9357SAndroid Build Coastguard Worker struct CBrowseEnumerator
109*f6dc9357SAndroid Build Coastguard Worker {
110*f6dc9357SAndroid Build Coastguard Worker   FString Path; // folder path without slash at the end
111*f6dc9357SAndroid Build Coastguard Worker   CFileInfo fi; // temp
112*f6dc9357SAndroid Build Coastguard Worker   CFileInfo fi_SubFile;
113*f6dc9357SAndroid Build Coastguard Worker   CBrowseItem bi;
114*f6dc9357SAndroid Build Coastguard Worker 
115*f6dc9357SAndroid Build Coastguard Worker   void Enumerate(unsigned level);
NeedInterruptCBrowseEnumerator116*f6dc9357SAndroid Build Coastguard Worker   bool NeedInterrupt() const
117*f6dc9357SAndroid Build Coastguard Worker   {
118*f6dc9357SAndroid Build Coastguard Worker     return bi.NumFiles >= k_EnumerateFilesLimit
119*f6dc9357SAndroid Build Coastguard Worker         || bi.NumDirs  >= k_EnumerateDirsLimit;
120*f6dc9357SAndroid Build Coastguard Worker   }
121*f6dc9357SAndroid Build Coastguard Worker };
122*f6dc9357SAndroid Build Coastguard Worker 
Enumerate(unsigned level)123*f6dc9357SAndroid Build Coastguard Worker void CBrowseEnumerator::Enumerate(unsigned level)
124*f6dc9357SAndroid Build Coastguard Worker {
125*f6dc9357SAndroid Build Coastguard Worker   Path.Add_PathSepar();
126*f6dc9357SAndroid Build Coastguard Worker   const unsigned len = Path.Len();
127*f6dc9357SAndroid Build Coastguard Worker   CObjectVector<FString> names;
128*f6dc9357SAndroid Build Coastguard Worker   {
129*f6dc9357SAndroid Build Coastguard Worker     CEnumerator enumerator;
130*f6dc9357SAndroid Build Coastguard Worker     enumerator.SetDirPrefix(Path);
131*f6dc9357SAndroid Build Coastguard Worker     while (enumerator.Next(fi))
132*f6dc9357SAndroid Build Coastguard Worker     {
133*f6dc9357SAndroid Build Coastguard Worker       if (level == 0)
134*f6dc9357SAndroid Build Coastguard Worker       {
135*f6dc9357SAndroid Build Coastguard Worker         if (bi.NumRootItems == 0)
136*f6dc9357SAndroid Build Coastguard Worker           fi_SubFile = fi;
137*f6dc9357SAndroid Build Coastguard Worker         bi.NumRootItems++;
138*f6dc9357SAndroid Build Coastguard Worker       }
139*f6dc9357SAndroid Build Coastguard Worker 
140*f6dc9357SAndroid Build Coastguard Worker       if (fi.IsDir())
141*f6dc9357SAndroid Build Coastguard Worker       {
142*f6dc9357SAndroid Build Coastguard Worker         bi.NumDirs++;
143*f6dc9357SAndroid Build Coastguard Worker         if (!fi.HasReparsePoint())
144*f6dc9357SAndroid Build Coastguard Worker           names.Add(fi.Name);
145*f6dc9357SAndroid Build Coastguard Worker       }
146*f6dc9357SAndroid Build Coastguard Worker       else
147*f6dc9357SAndroid Build Coastguard Worker       {
148*f6dc9357SAndroid Build Coastguard Worker         bi.NumFiles++;
149*f6dc9357SAndroid Build Coastguard Worker         bi.Size += fi.Size;
150*f6dc9357SAndroid Build Coastguard Worker       }
151*f6dc9357SAndroid Build Coastguard Worker 
152*f6dc9357SAndroid Build Coastguard Worker       if (level != 0 || bi.NumRootItems > 1)
153*f6dc9357SAndroid Build Coastguard Worker         if (NeedInterrupt())
154*f6dc9357SAndroid Build Coastguard Worker         {
155*f6dc9357SAndroid Build Coastguard Worker           bi.WasInterrupted = true;
156*f6dc9357SAndroid Build Coastguard Worker           return;
157*f6dc9357SAndroid Build Coastguard Worker         }
158*f6dc9357SAndroid Build Coastguard Worker     }
159*f6dc9357SAndroid Build Coastguard Worker   }
160*f6dc9357SAndroid Build Coastguard Worker 
161*f6dc9357SAndroid Build Coastguard Worker   FOR_VECTOR (i, names)
162*f6dc9357SAndroid Build Coastguard Worker   {
163*f6dc9357SAndroid Build Coastguard Worker     if (NeedInterrupt())
164*f6dc9357SAndroid Build Coastguard Worker     {
165*f6dc9357SAndroid Build Coastguard Worker       bi.WasInterrupted = true;
166*f6dc9357SAndroid Build Coastguard Worker       return;
167*f6dc9357SAndroid Build Coastguard Worker     }
168*f6dc9357SAndroid Build Coastguard Worker     Path.DeleteFrom(len);
169*f6dc9357SAndroid Build Coastguard Worker     Path += names[i];
170*f6dc9357SAndroid Build Coastguard Worker     Enumerate(level + 1);
171*f6dc9357SAndroid Build Coastguard Worker   }
172*f6dc9357SAndroid Build Coastguard Worker }
173*f6dc9357SAndroid Build Coastguard Worker 
174*f6dc9357SAndroid Build Coastguard Worker 
175*f6dc9357SAndroid Build Coastguard Worker 
176*f6dc9357SAndroid Build Coastguard Worker 
177*f6dc9357SAndroid Build Coastguard Worker class CBrowseDialog2: public NControl::CModalDialog
178*f6dc9357SAndroid Build Coastguard Worker {
179*f6dc9357SAndroid Build Coastguard Worker   CRecordVector<CBrowseItem> _items;
180*f6dc9357SAndroid Build Coastguard Worker   CObjectVector<CFileInfo> _files;
181*f6dc9357SAndroid Build Coastguard Worker 
182*f6dc9357SAndroid Build Coastguard Worker   NControl::CListView _list;
183*f6dc9357SAndroid Build Coastguard Worker   // NControl::CEdit _pathEdit;
184*f6dc9357SAndroid Build Coastguard Worker   NControl::CComboBox _filterCombo;
185*f6dc9357SAndroid Build Coastguard Worker 
186*f6dc9357SAndroid Build Coastguard Worker   CExtToIconMap _extToIconMap;
187*f6dc9357SAndroid Build Coastguard Worker   int _sortIndex;
188*f6dc9357SAndroid Build Coastguard Worker   int _columnIndex_fileNameInDir;
189*f6dc9357SAndroid Build Coastguard Worker   int _columnIndex_NumFiles;
190*f6dc9357SAndroid Build Coastguard Worker   int _columnIndex_NumDirs;
191*f6dc9357SAndroid Build Coastguard Worker   bool _ascending;
192*f6dc9357SAndroid Build Coastguard Worker  #ifndef Z7_SFX
193*f6dc9357SAndroid Build Coastguard Worker   bool _showDots;
194*f6dc9357SAndroid Build Coastguard Worker  #endif
195*f6dc9357SAndroid Build Coastguard Worker   UString _topDirPrefix; // we don't open parent of that folder
196*f6dc9357SAndroid Build Coastguard Worker   UString DirPrefix;
197*f6dc9357SAndroid Build Coastguard Worker 
198*f6dc9357SAndroid Build Coastguard Worker   virtual bool OnInit() Z7_override;
199*f6dc9357SAndroid Build Coastguard Worker   virtual bool OnSize(WPARAM wParam, int xSize, int ySize) Z7_override;
200*f6dc9357SAndroid Build Coastguard Worker   virtual bool OnMessage(UINT message, WPARAM wParam, LPARAM lParam) Z7_override;
201*f6dc9357SAndroid Build Coastguard Worker   virtual bool OnNotify(UINT controlID, LPNMHDR header) Z7_override;
202*f6dc9357SAndroid Build Coastguard Worker   // virtual bool OnCommand(unsigned code, unsigned itemID, LPARAM lParam) Z7_override;
203*f6dc9357SAndroid Build Coastguard Worker   virtual bool OnButtonClicked(unsigned buttonID, HWND buttonHWND) Z7_override;
204*f6dc9357SAndroid Build Coastguard Worker   virtual void OnOK() Z7_override;
205*f6dc9357SAndroid Build Coastguard Worker 
206*f6dc9357SAndroid Build Coastguard Worker   bool OnKeyDown(LPNMLVKEYDOWN keyDownInfo);
207*f6dc9357SAndroid Build Coastguard Worker 
208*f6dc9357SAndroid Build Coastguard Worker   // void Post_RefreshPathEdit() { PostMsg(k_Message_RefreshPathEdit); }
209*f6dc9357SAndroid Build Coastguard Worker   bool GetParentPath(const UString &path, UString &parentPrefix, UString &name);
210*f6dc9357SAndroid Build Coastguard Worker   // Reload changes DirPrefix. Don't send DirPrefix in pathPrefix parameter
211*f6dc9357SAndroid Build Coastguard Worker   HRESULT Reload(const UString &pathPrefix, const UStringVector &selectedNames, const UString &focusedName);
212*f6dc9357SAndroid Build Coastguard Worker   HRESULT Reload(const UString &pathPrefix, const UString &selectedNames);
213*f6dc9357SAndroid Build Coastguard Worker   HRESULT Reload();
214*f6dc9357SAndroid Build Coastguard Worker 
215*f6dc9357SAndroid Build Coastguard Worker   void ChangeSorting_and_Reload(int columnIndex);
216*f6dc9357SAndroid Build Coastguard Worker 
Get_MainFileInfo_for_realIndex(unsigned realIndex) const217*f6dc9357SAndroid Build Coastguard Worker   const CFileInfo & Get_MainFileInfo_for_realIndex(unsigned realIndex) const
218*f6dc9357SAndroid Build Coastguard Worker   {
219*f6dc9357SAndroid Build Coastguard Worker     return _files[_items[realIndex].MainFileIndex];
220*f6dc9357SAndroid Build Coastguard Worker   }
221*f6dc9357SAndroid Build Coastguard Worker 
Get_MainFileName_for_realIndex(unsigned realIndex) const222*f6dc9357SAndroid Build Coastguard Worker   const FString & Get_MainFileName_for_realIndex(unsigned realIndex) const
223*f6dc9357SAndroid Build Coastguard Worker   {
224*f6dc9357SAndroid Build Coastguard Worker     return Get_MainFileInfo_for_realIndex(realIndex).Name;
225*f6dc9357SAndroid Build Coastguard Worker   }
226*f6dc9357SAndroid Build Coastguard Worker 
227*f6dc9357SAndroid Build Coastguard Worker   void Reload_WithErrorMessage();
228*f6dc9357SAndroid Build Coastguard Worker   void OpenParentFolder();
229*f6dc9357SAndroid Build Coastguard Worker   // void SetPathEditText();
230*f6dc9357SAndroid Build Coastguard Worker   void PrintFileProps(UString &s, const CFileInfo &file);
231*f6dc9357SAndroid Build Coastguard Worker   void Show_FileProps_Window(const CFileInfo &file);
232*f6dc9357SAndroid Build Coastguard Worker   void OnItemEnter();
233*f6dc9357SAndroid Build Coastguard Worker   // void FinishOnOK();
234*f6dc9357SAndroid Build Coastguard Worker   void OnDelete(/* bool toRecycleBin */);
235*f6dc9357SAndroid Build Coastguard Worker   virtual void OnHelp() Z7_override;
236*f6dc9357SAndroid Build Coastguard Worker   bool OnContextMenu(HANDLE windowHandle, int xPos, int yPos);
237*f6dc9357SAndroid Build Coastguard Worker 
GetRealItemIndex(int indexInListView) const238*f6dc9357SAndroid Build Coastguard Worker   int GetRealItemIndex(int indexInListView) const
239*f6dc9357SAndroid Build Coastguard Worker   {
240*f6dc9357SAndroid Build Coastguard Worker     LPARAM param;
241*f6dc9357SAndroid Build Coastguard Worker     if (!_list.GetItemParam((unsigned)indexInListView, param))
242*f6dc9357SAndroid Build Coastguard Worker       return (int)-1;
243*f6dc9357SAndroid Build Coastguard Worker     return (int)param;
244*f6dc9357SAndroid Build Coastguard Worker   }
245*f6dc9357SAndroid Build Coastguard Worker 
246*f6dc9357SAndroid Build Coastguard Worker   void GetSelected_RealIndexes(CUIntVector &vector);
247*f6dc9357SAndroid Build Coastguard Worker 
248*f6dc9357SAndroid Build Coastguard Worker public:
249*f6dc9357SAndroid Build Coastguard Worker   // bool TempMode;
250*f6dc9357SAndroid Build Coastguard Worker   // bool Show_Non7zDirs_InTemp;
251*f6dc9357SAndroid Build Coastguard Worker   // int FilterIndex;  // [in / out]
252*f6dc9357SAndroid Build Coastguard Worker   // CObjectVector<CBrowseFilterInfo> Filters;
253*f6dc9357SAndroid Build Coastguard Worker 
254*f6dc9357SAndroid Build Coastguard Worker   UString TempFolderPath; // with slash
255*f6dc9357SAndroid Build Coastguard Worker   UString Title;
256*f6dc9357SAndroid Build Coastguard Worker 
IsExactTempFolder(const UString & pathPrefix) const257*f6dc9357SAndroid Build Coastguard Worker   bool IsExactTempFolder(const UString &pathPrefix) const
258*f6dc9357SAndroid Build Coastguard Worker   {
259*f6dc9357SAndroid Build Coastguard Worker     return CompareFileNames(pathPrefix, TempFolderPath) == 0;
260*f6dc9357SAndroid Build Coastguard Worker   }
261*f6dc9357SAndroid Build Coastguard Worker 
CBrowseDialog2()262*f6dc9357SAndroid Build Coastguard Worker   CBrowseDialog2():
263*f6dc9357SAndroid Build Coastguard Worker    #ifndef Z7_SFX
264*f6dc9357SAndroid Build Coastguard Worker       _showDots(false)
265*f6dc9357SAndroid Build Coastguard Worker    #endif
266*f6dc9357SAndroid Build Coastguard Worker       // , TempMode(false)
267*f6dc9357SAndroid Build Coastguard Worker       // Show_Non7zDirs_InTemp(false),
268*f6dc9357SAndroid Build Coastguard Worker       // FilterIndex(-1)
269*f6dc9357SAndroid Build Coastguard Worker     {}
Create(HWND parent=NULL)270*f6dc9357SAndroid Build Coastguard Worker   INT_PTR Create(HWND parent = NULL) { return CModalDialog::Create(IDD_BROWSE2, parent); }
271*f6dc9357SAndroid Build Coastguard Worker   int CompareItems(LPARAM lParam1, LPARAM lParam2) const;
272*f6dc9357SAndroid Build Coastguard Worker };
273*f6dc9357SAndroid Build Coastguard Worker 
274*f6dc9357SAndroid Build Coastguard Worker 
275*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_LANG
276*f6dc9357SAndroid Build Coastguard Worker static const UInt32 kLangIDs[] =
277*f6dc9357SAndroid Build Coastguard Worker {
278*f6dc9357SAndroid Build Coastguard Worker   IDS_BUTTON_DELETE,
279*f6dc9357SAndroid Build Coastguard Worker   IDM_VIEW_REFRESH
280*f6dc9357SAndroid Build Coastguard Worker };
281*f6dc9357SAndroid Build Coastguard Worker #endif
282*f6dc9357SAndroid Build Coastguard Worker 
OnInit()283*f6dc9357SAndroid Build Coastguard Worker bool CBrowseDialog2::OnInit()
284*f6dc9357SAndroid Build Coastguard Worker {
285*f6dc9357SAndroid Build Coastguard Worker   #ifdef Z7_LANG
286*f6dc9357SAndroid Build Coastguard Worker   LangSetDlgItems(*this, kLangIDs, Z7_ARRAY_SIZE(kLangIDs));
287*f6dc9357SAndroid Build Coastguard Worker   #endif
288*f6dc9357SAndroid Build Coastguard Worker   if (!Title.IsEmpty())
289*f6dc9357SAndroid Build Coastguard Worker     SetText(Title);
290*f6dc9357SAndroid Build Coastguard Worker 
291*f6dc9357SAndroid Build Coastguard Worker   _list.Attach(GetItem(IDL_BROWSE2));
292*f6dc9357SAndroid Build Coastguard Worker   _filterCombo.Attach(GetItem(IDC_BROWSE2_FILTER));
293*f6dc9357SAndroid Build Coastguard Worker 
294*f6dc9357SAndroid Build Coastguard Worker   _ascending = true;
295*f6dc9357SAndroid Build Coastguard Worker   _sortIndex = 0;
296*f6dc9357SAndroid Build Coastguard Worker   _columnIndex_fileNameInDir = -1;
297*f6dc9357SAndroid Build Coastguard Worker   _columnIndex_NumFiles = -1;
298*f6dc9357SAndroid Build Coastguard Worker   _columnIndex_NumDirs = -1;
299*f6dc9357SAndroid Build Coastguard Worker   // _pathEdit.Attach(GetItem(IDE_BROWSE_PATH));
300*f6dc9357SAndroid Build Coastguard Worker 
301*f6dc9357SAndroid Build Coastguard Worker   #ifndef UNDER_CE
302*f6dc9357SAndroid Build Coastguard Worker   _list.SetUnicodeFormat();
303*f6dc9357SAndroid Build Coastguard Worker   #endif
304*f6dc9357SAndroid Build Coastguard Worker 
305*f6dc9357SAndroid Build Coastguard Worker   #ifndef Z7_SFX
306*f6dc9357SAndroid Build Coastguard Worker   {
307*f6dc9357SAndroid Build Coastguard Worker     CFmSettings st;
308*f6dc9357SAndroid Build Coastguard Worker     st.Load();
309*f6dc9357SAndroid Build Coastguard Worker 
310*f6dc9357SAndroid Build Coastguard Worker     DWORD extendedStyle = 0;
311*f6dc9357SAndroid Build Coastguard Worker     if (st.FullRow)
312*f6dc9357SAndroid Build Coastguard Worker       extendedStyle |= LVS_EX_FULLROWSELECT;
313*f6dc9357SAndroid Build Coastguard Worker     if (st.ShowGrid)
314*f6dc9357SAndroid Build Coastguard Worker       extendedStyle |= LVS_EX_GRIDLINES;
315*f6dc9357SAndroid Build Coastguard Worker     if (st.SingleClick)
316*f6dc9357SAndroid Build Coastguard Worker     {
317*f6dc9357SAndroid Build Coastguard Worker       extendedStyle |= LVS_EX_ONECLICKACTIVATE | LVS_EX_TRACKSELECT;
318*f6dc9357SAndroid Build Coastguard Worker       /*
319*f6dc9357SAndroid Build Coastguard Worker       if (ReadUnderline())
320*f6dc9357SAndroid Build Coastguard Worker       extendedStyle |= LVS_EX_UNDERLINEHOT;
321*f6dc9357SAndroid Build Coastguard Worker       */
322*f6dc9357SAndroid Build Coastguard Worker     }
323*f6dc9357SAndroid Build Coastguard Worker     if (extendedStyle)
324*f6dc9357SAndroid Build Coastguard Worker       _list.SetExtendedListViewStyle(extendedStyle);
325*f6dc9357SAndroid Build Coastguard Worker     _showDots = st.ShowDots;
326*f6dc9357SAndroid Build Coastguard Worker   }
327*f6dc9357SAndroid Build Coastguard Worker   #endif
328*f6dc9357SAndroid Build Coastguard Worker 
329*f6dc9357SAndroid Build Coastguard Worker   {
330*f6dc9357SAndroid Build Coastguard Worker     /*
331*f6dc9357SAndroid Build Coastguard Worker     Filters.Clear(); // for debug
332*f6dc9357SAndroid Build Coastguard Worker     if (Filters.IsEmpty() && !FolderMode)
333*f6dc9357SAndroid Build Coastguard Worker     {
334*f6dc9357SAndroid Build Coastguard Worker       CBrowseFilterInfo &f = Filters.AddNew();
335*f6dc9357SAndroid Build Coastguard Worker       const UString mask("*.*");
336*f6dc9357SAndroid Build Coastguard Worker       f.Masks.Add(mask);
337*f6dc9357SAndroid Build Coastguard Worker       // f.Description = "(";
338*f6dc9357SAndroid Build Coastguard Worker       f.Description += mask;
339*f6dc9357SAndroid Build Coastguard Worker       // f.Description += ")";
340*f6dc9357SAndroid Build Coastguard Worker     }
341*f6dc9357SAndroid Build Coastguard Worker     */
342*f6dc9357SAndroid Build Coastguard Worker     _filterCombo.AddString(L"7-Zip temp files (7z*)");
343*f6dc9357SAndroid Build Coastguard Worker     _filterCombo.SetCurSel(0);
344*f6dc9357SAndroid Build Coastguard Worker     EnableItem(IDC_BROWSE2_FILTER, false);
345*f6dc9357SAndroid Build Coastguard Worker #if 0
346*f6dc9357SAndroid Build Coastguard Worker     FOR_VECTOR (i, Filters)
347*f6dc9357SAndroid Build Coastguard Worker     {
348*f6dc9357SAndroid Build Coastguard Worker       _filterCombo.AddString(Filters[i].Description);
349*f6dc9357SAndroid Build Coastguard Worker     }
350*f6dc9357SAndroid Build Coastguard Worker     if (Filters.Size() <= 1)
351*f6dc9357SAndroid Build Coastguard Worker     {
352*f6dc9357SAndroid Build Coastguard Worker       EnableItem(IDC_BROWSE_FILTER, false);
353*f6dc9357SAndroid Build Coastguard Worker     }
354*f6dc9357SAndroid Build Coastguard Worker     if (/* FilterIndex >= 0 && */ (unsigned)FilterIndex < Filters.Size())
355*f6dc9357SAndroid Build Coastguard Worker       _filterCombo.SetCurSel(FilterIndex);
356*f6dc9357SAndroid Build Coastguard Worker #endif
357*f6dc9357SAndroid Build Coastguard Worker   }
358*f6dc9357SAndroid Build Coastguard Worker 
359*f6dc9357SAndroid Build Coastguard Worker   _list.SetImageList(Shell_Get_SysImageList_smallIcons(true), LVSIL_SMALL);
360*f6dc9357SAndroid Build Coastguard Worker   _list.SetImageList(Shell_Get_SysImageList_smallIcons(false), LVSIL_NORMAL);
361*f6dc9357SAndroid Build Coastguard Worker 
362*f6dc9357SAndroid Build Coastguard Worker   unsigned columnIndex = 0;
363*f6dc9357SAndroid Build Coastguard Worker   _list.InsertColumn(columnIndex++, LangString(IDS_PROP_NAME), 100);
364*f6dc9357SAndroid Build Coastguard Worker   _list.InsertColumn(columnIndex++, LangString(IDS_PROP_MTIME), 100);
365*f6dc9357SAndroid Build Coastguard Worker   {
366*f6dc9357SAndroid Build Coastguard Worker     LV_COLUMNW column;
367*f6dc9357SAndroid Build Coastguard Worker     column.iSubItem = (int)columnIndex;
368*f6dc9357SAndroid Build Coastguard Worker     column.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
369*f6dc9357SAndroid Build Coastguard Worker     column.fmt = LVCFMT_RIGHT;
370*f6dc9357SAndroid Build Coastguard Worker     column.cx = 100;
371*f6dc9357SAndroid Build Coastguard Worker     UString s = LangString(IDS_PROP_SIZE);
372*f6dc9357SAndroid Build Coastguard Worker     column.pszText = s.Ptr_non_const();
373*f6dc9357SAndroid Build Coastguard Worker     _list.InsertColumn(columnIndex++, &column);
374*f6dc9357SAndroid Build Coastguard Worker 
375*f6dc9357SAndroid Build Coastguard Worker     // if (TempMode)
376*f6dc9357SAndroid Build Coastguard Worker     {
377*f6dc9357SAndroid Build Coastguard Worker       _columnIndex_NumFiles = (int)columnIndex;
378*f6dc9357SAndroid Build Coastguard Worker       s = LangString(IDS_PROP_FILES);
379*f6dc9357SAndroid Build Coastguard Worker       column.pszText = s.Ptr_non_const();
380*f6dc9357SAndroid Build Coastguard Worker       _list.InsertColumn(columnIndex++, &column);
381*f6dc9357SAndroid Build Coastguard Worker 
382*f6dc9357SAndroid Build Coastguard Worker       _columnIndex_NumDirs = (int)columnIndex;
383*f6dc9357SAndroid Build Coastguard Worker       s = LangString(IDS_PROP_FOLDERS);
384*f6dc9357SAndroid Build Coastguard Worker       column.pszText = s.Ptr_non_const();
385*f6dc9357SAndroid Build Coastguard Worker       _list.InsertColumn(columnIndex++, &column);
386*f6dc9357SAndroid Build Coastguard Worker 
387*f6dc9357SAndroid Build Coastguard Worker       _columnIndex_fileNameInDir = (int)columnIndex;
388*f6dc9357SAndroid Build Coastguard Worker       s = LangString(IDS_PROP_NAME);
389*f6dc9357SAndroid Build Coastguard Worker       s += "-2";
390*f6dc9357SAndroid Build Coastguard Worker       _list.InsertColumn(columnIndex++, s, 100);
391*f6dc9357SAndroid Build Coastguard Worker     }
392*f6dc9357SAndroid Build Coastguard Worker   }
393*f6dc9357SAndroid Build Coastguard Worker 
394*f6dc9357SAndroid Build Coastguard Worker   _list.InsertItem(0, L"12345678901234567"
395*f6dc9357SAndroid Build Coastguard Worker       #ifndef UNDER_CE
396*f6dc9357SAndroid Build Coastguard Worker       L"1234567890"
397*f6dc9357SAndroid Build Coastguard Worker       #endif
398*f6dc9357SAndroid Build Coastguard Worker       );
399*f6dc9357SAndroid Build Coastguard Worker   _list.SetSubItem(0, 1, L"2009-09-09"
400*f6dc9357SAndroid Build Coastguard Worker       #ifndef UNDER_CE
401*f6dc9357SAndroid Build Coastguard Worker       L" 09:09:09"
402*f6dc9357SAndroid Build Coastguard Worker       #endif
403*f6dc9357SAndroid Build Coastguard Worker       );
404*f6dc9357SAndroid Build Coastguard Worker   _list.SetSubItem(0, 2, L"99999 MB+");
405*f6dc9357SAndroid Build Coastguard Worker 
406*f6dc9357SAndroid Build Coastguard Worker   if (_columnIndex_NumFiles >= 0)
407*f6dc9357SAndroid Build Coastguard Worker     _list.SetSubItem(0, (unsigned)_columnIndex_NumFiles, L"123456789+");
408*f6dc9357SAndroid Build Coastguard Worker   if (_columnIndex_NumDirs >= 0)
409*f6dc9357SAndroid Build Coastguard Worker     _list.SetSubItem(0, (unsigned)_columnIndex_NumDirs, L"123456789+");
410*f6dc9357SAndroid Build Coastguard Worker   if (_columnIndex_fileNameInDir >= 0)
411*f6dc9357SAndroid Build Coastguard Worker     _list.SetSubItem(0, (unsigned)_columnIndex_fileNameInDir, L"12345678901234567890");
412*f6dc9357SAndroid Build Coastguard Worker 
413*f6dc9357SAndroid Build Coastguard Worker   for (unsigned i = 0; i < columnIndex; i++)
414*f6dc9357SAndroid Build Coastguard Worker     _list.SetColumnWidthAuto((int)i);
415*f6dc9357SAndroid Build Coastguard Worker   _list.DeleteAllItems();
416*f6dc9357SAndroid Build Coastguard Worker 
417*f6dc9357SAndroid Build Coastguard Worker   // if (TempMode)
418*f6dc9357SAndroid Build Coastguard Worker   {
419*f6dc9357SAndroid Build Coastguard Worker     _sortIndex = 1; // for MTime column
420*f6dc9357SAndroid Build Coastguard Worker     // _ascending = false;
421*f6dc9357SAndroid Build Coastguard Worker   }
422*f6dc9357SAndroid Build Coastguard Worker 
423*f6dc9357SAndroid Build Coastguard Worker 
424*f6dc9357SAndroid Build Coastguard Worker   NormalizeSize();
425*f6dc9357SAndroid Build Coastguard Worker 
426*f6dc9357SAndroid Build Coastguard Worker   _topDirPrefix.Empty();
427*f6dc9357SAndroid Build Coastguard Worker   {
428*f6dc9357SAndroid Build Coastguard Worker     unsigned rootSize = GetRootPrefixSize(TempFolderPath);
429*f6dc9357SAndroid Build Coastguard Worker     #if defined(_WIN32) && !defined(UNDER_CE)
430*f6dc9357SAndroid Build Coastguard Worker     // We can go up from root folder to drives list
431*f6dc9357SAndroid Build Coastguard Worker     if (IsDrivePath(TempFolderPath))
432*f6dc9357SAndroid Build Coastguard Worker       rootSize = 0;
433*f6dc9357SAndroid Build Coastguard Worker     else if (IsSuperPath(TempFolderPath))
434*f6dc9357SAndroid Build Coastguard Worker     {
435*f6dc9357SAndroid Build Coastguard Worker       if (IsDrivePath(TempFolderPath.Ptr(kSuperPathPrefixSize)))
436*f6dc9357SAndroid Build Coastguard Worker         rootSize = kSuperPathPrefixSize;
437*f6dc9357SAndroid Build Coastguard Worker     }
438*f6dc9357SAndroid Build Coastguard Worker     #endif
439*f6dc9357SAndroid Build Coastguard Worker     _topDirPrefix.SetFrom(TempFolderPath, rootSize);
440*f6dc9357SAndroid Build Coastguard Worker   }
441*f6dc9357SAndroid Build Coastguard Worker 
442*f6dc9357SAndroid Build Coastguard Worker   if (Reload(TempFolderPath, UString()) != S_OK)
443*f6dc9357SAndroid Build Coastguard Worker   {
444*f6dc9357SAndroid Build Coastguard Worker     // return false;
445*f6dc9357SAndroid Build Coastguard Worker   }
446*f6dc9357SAndroid Build Coastguard Worker /*
447*f6dc9357SAndroid Build Coastguard Worker   UString name;
448*f6dc9357SAndroid Build Coastguard Worker   DirPrefix = TempFolderPath;
449*f6dc9357SAndroid Build Coastguard Worker   for (;;)
450*f6dc9357SAndroid Build Coastguard Worker   {
451*f6dc9357SAndroid Build Coastguard Worker     UString baseFolder = DirPrefix;
452*f6dc9357SAndroid Build Coastguard Worker     if (Reload(baseFolder, name) == S_OK)
453*f6dc9357SAndroid Build Coastguard Worker       break;
454*f6dc9357SAndroid Build Coastguard Worker     name.Empty();
455*f6dc9357SAndroid Build Coastguard Worker     if (DirPrefix.IsEmpty())
456*f6dc9357SAndroid Build Coastguard Worker       break;
457*f6dc9357SAndroid Build Coastguard Worker     UString parent, name2;
458*f6dc9357SAndroid Build Coastguard Worker     GetParentPath(DirPrefix, parent, name2);
459*f6dc9357SAndroid Build Coastguard Worker     DirPrefix = parent;
460*f6dc9357SAndroid Build Coastguard Worker   }
461*f6dc9357SAndroid Build Coastguard Worker */
462*f6dc9357SAndroid Build Coastguard Worker 
463*f6dc9357SAndroid Build Coastguard Worker   #ifndef UNDER_CE
464*f6dc9357SAndroid Build Coastguard Worker   /* If we clear UISF_HIDEFOCUS, the focus rectangle in ListView will be visible,
465*f6dc9357SAndroid Build Coastguard Worker      even if we use mouse for pressing the button to open this dialog. */
466*f6dc9357SAndroid Build Coastguard Worker   PostMsg(Z7_WIN_WM_UPDATEUISTATE, MAKEWPARAM(Z7_WIN_UIS_CLEAR, Z7_WIN_UISF_HIDEFOCUS));
467*f6dc9357SAndroid Build Coastguard Worker   #endif
468*f6dc9357SAndroid Build Coastguard Worker 
469*f6dc9357SAndroid Build Coastguard Worker   /*
470*f6dc9357SAndroid Build Coastguard Worker   */
471*f6dc9357SAndroid Build Coastguard Worker 
472*f6dc9357SAndroid Build Coastguard Worker   return CModalDialog::OnInit();
473*f6dc9357SAndroid Build Coastguard Worker }
474*f6dc9357SAndroid Build Coastguard Worker 
475*f6dc9357SAndroid Build Coastguard Worker 
OnSize(WPARAM,int xSize,int ySize)476*f6dc9357SAndroid Build Coastguard Worker bool CBrowseDialog2::OnSize(WPARAM /* wParam */, int xSize, int ySize)
477*f6dc9357SAndroid Build Coastguard Worker {
478*f6dc9357SAndroid Build Coastguard Worker   int mx, my;
479*f6dc9357SAndroid Build Coastguard Worker   {
480*f6dc9357SAndroid Build Coastguard Worker     RECT r;
481*f6dc9357SAndroid Build Coastguard Worker     GetClientRectOfItem(IDS_BUTTON_DELETE, r);
482*f6dc9357SAndroid Build Coastguard Worker     mx = r.left;
483*f6dc9357SAndroid Build Coastguard Worker     my = r.top;
484*f6dc9357SAndroid Build Coastguard Worker   }
485*f6dc9357SAndroid Build Coastguard Worker   InvalidateRect(NULL);
486*f6dc9357SAndroid Build Coastguard Worker 
487*f6dc9357SAndroid Build Coastguard Worker   const int xLim = xSize - mx;
488*f6dc9357SAndroid Build Coastguard Worker   {
489*f6dc9357SAndroid Build Coastguard Worker     RECT r;
490*f6dc9357SAndroid Build Coastguard Worker     GetClientRectOfItem(IDT_BROWSE2_FOLDER, r);
491*f6dc9357SAndroid Build Coastguard Worker     MoveItem(IDT_BROWSE2_FOLDER, r.left, r.top, xLim - r.left, RECT_SIZE_Y(r));
492*f6dc9357SAndroid Build Coastguard Worker   }
493*f6dc9357SAndroid Build Coastguard Worker 
494*f6dc9357SAndroid Build Coastguard Worker   int bx1, bx2, by;
495*f6dc9357SAndroid Build Coastguard Worker   GetItemSizes(IDCLOSE, bx1, by);
496*f6dc9357SAndroid Build Coastguard Worker   GetItemSizes(IDHELP,  bx2, by);
497*f6dc9357SAndroid Build Coastguard Worker   const int y = ySize - my - by;
498*f6dc9357SAndroid Build Coastguard Worker   const int x = xLim - bx1;
499*f6dc9357SAndroid Build Coastguard Worker   MoveItem(IDCLOSE, x - mx - bx2, y, bx1, by);
500*f6dc9357SAndroid Build Coastguard Worker   MoveItem(IDHELP,  x,            y, bx2, by);
501*f6dc9357SAndroid Build Coastguard Worker   /*
502*f6dc9357SAndroid Build Coastguard Worker   int yPathSize;
503*f6dc9357SAndroid Build Coastguard Worker   {
504*f6dc9357SAndroid Build Coastguard Worker     RECT r;
505*f6dc9357SAndroid Build Coastguard Worker     GetClientRectOfItem(IDE_BROWSE_PATH, r);
506*f6dc9357SAndroid Build Coastguard Worker     yPathSize = RECT_SIZE_Y(r);
507*f6dc9357SAndroid Build Coastguard Worker     _pathEdit.Move(r.left, y - my - yPathSize - my - yPathSize, xLim - r.left, yPathSize);
508*f6dc9357SAndroid Build Coastguard Worker   }
509*f6dc9357SAndroid Build Coastguard Worker   */
510*f6dc9357SAndroid Build Coastguard Worker   // Y_Size of ComboBox is tricky. Can we use it?
511*f6dc9357SAndroid Build Coastguard Worker   int yFilterSize;
512*f6dc9357SAndroid Build Coastguard Worker   {
513*f6dc9357SAndroid Build Coastguard Worker     RECT r;
514*f6dc9357SAndroid Build Coastguard Worker     GetClientRectOfItem(IDC_BROWSE2_FILTER, r);
515*f6dc9357SAndroid Build Coastguard Worker     yFilterSize = RECT_SIZE_Y(r);
516*f6dc9357SAndroid Build Coastguard Worker     _filterCombo.Move(r.left, y - my - yFilterSize, xLim - r.left, yFilterSize);
517*f6dc9357SAndroid Build Coastguard Worker   }
518*f6dc9357SAndroid Build Coastguard Worker   {
519*f6dc9357SAndroid Build Coastguard Worker     RECT r;
520*f6dc9357SAndroid Build Coastguard Worker     GetClientRectOfItem(IDL_BROWSE2, r);
521*f6dc9357SAndroid Build Coastguard Worker     _list.Move(r.left, r.top, xLim - r.left, y - my - yFilterSize - my - r.top);
522*f6dc9357SAndroid Build Coastguard Worker   }
523*f6dc9357SAndroid Build Coastguard Worker   return false;
524*f6dc9357SAndroid Build Coastguard Worker }
525*f6dc9357SAndroid Build Coastguard Worker 
526*f6dc9357SAndroid Build Coastguard Worker 
OnMessage(UINT message,WPARAM wParam,LPARAM lParam)527*f6dc9357SAndroid Build Coastguard Worker bool CBrowseDialog2::OnMessage(UINT message, WPARAM wParam, LPARAM lParam)
528*f6dc9357SAndroid Build Coastguard Worker {
529*f6dc9357SAndroid Build Coastguard Worker   /*
530*f6dc9357SAndroid Build Coastguard Worker   if (message == k_Message_RefreshPathEdit)
531*f6dc9357SAndroid Build Coastguard Worker   {
532*f6dc9357SAndroid Build Coastguard Worker     // SetPathEditText();
533*f6dc9357SAndroid Build Coastguard Worker     return true;
534*f6dc9357SAndroid Build Coastguard Worker   }
535*f6dc9357SAndroid Build Coastguard Worker   */
536*f6dc9357SAndroid Build Coastguard Worker   if (message == WM_CONTEXTMENU)
537*f6dc9357SAndroid Build Coastguard Worker   {
538*f6dc9357SAndroid Build Coastguard Worker     if (OnContextMenu((HANDLE)wParam, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)))
539*f6dc9357SAndroid Build Coastguard Worker       return true;
540*f6dc9357SAndroid Build Coastguard Worker   }
541*f6dc9357SAndroid Build Coastguard Worker   return CModalDialog::OnMessage(message, wParam, lParam);
542*f6dc9357SAndroid Build Coastguard Worker }
543*f6dc9357SAndroid Build Coastguard Worker 
544*f6dc9357SAndroid Build Coastguard Worker 
545*f6dc9357SAndroid Build Coastguard Worker /*
546*f6dc9357SAndroid Build Coastguard Worker bool CBrowseDialog2::OnCommand(unsigned code, unsigned itemID, LPARAM lParam)
547*f6dc9357SAndroid Build Coastguard Worker {
548*f6dc9357SAndroid Build Coastguard Worker   if (code == CBN_SELCHANGE)
549*f6dc9357SAndroid Build Coastguard Worker   {
550*f6dc9357SAndroid Build Coastguard Worker     switch (itemID)
551*f6dc9357SAndroid Build Coastguard Worker     {
552*f6dc9357SAndroid Build Coastguard Worker       case IDC_BROWSE2_FILTER:
553*f6dc9357SAndroid Build Coastguard Worker       {
554*f6dc9357SAndroid Build Coastguard Worker         Reload();
555*f6dc9357SAndroid Build Coastguard Worker         return true;
556*f6dc9357SAndroid Build Coastguard Worker       }
557*f6dc9357SAndroid Build Coastguard Worker     }
558*f6dc9357SAndroid Build Coastguard Worker   }
559*f6dc9357SAndroid Build Coastguard Worker   return CModalDialog::OnCommand(code, itemID, lParam);
560*f6dc9357SAndroid Build Coastguard Worker }
561*f6dc9357SAndroid Build Coastguard Worker */
562*f6dc9357SAndroid Build Coastguard Worker 
OnNotify(UINT,LPNMHDR header)563*f6dc9357SAndroid Build Coastguard Worker bool CBrowseDialog2::OnNotify(UINT /* controlID */, LPNMHDR header)
564*f6dc9357SAndroid Build Coastguard Worker {
565*f6dc9357SAndroid Build Coastguard Worker   if (header->hwndFrom != _list)
566*f6dc9357SAndroid Build Coastguard Worker   {
567*f6dc9357SAndroid Build Coastguard Worker     if (::GetParent(header->hwndFrom) == _list)
568*f6dc9357SAndroid Build Coastguard Worker     {
569*f6dc9357SAndroid Build Coastguard Worker       // NMHDR:code is UINT
570*f6dc9357SAndroid Build Coastguard Worker       // NM_RCLICK is unsigned in windows sdk
571*f6dc9357SAndroid Build Coastguard Worker       // NM_RCLICK is int      in MinGW
572*f6dc9357SAndroid Build Coastguard Worker       if (header->code == (UINT)NM_RCLICK)
573*f6dc9357SAndroid Build Coastguard Worker       {
574*f6dc9357SAndroid Build Coastguard Worker #ifdef UNDER_CE
575*f6dc9357SAndroid Build Coastguard Worker #define MY_NMLISTVIEW_NMITEMACTIVATE NMLISTVIEW
576*f6dc9357SAndroid Build Coastguard Worker #else
577*f6dc9357SAndroid Build Coastguard Worker #define MY_NMLISTVIEW_NMITEMACTIVATE NMITEMACTIVATE
578*f6dc9357SAndroid Build Coastguard Worker #endif
579*f6dc9357SAndroid Build Coastguard Worker         MY_NMLISTVIEW_NMITEMACTIVATE *itemActivate = (MY_NMLISTVIEW_NMITEMACTIVATE *)header;
580*f6dc9357SAndroid Build Coastguard Worker         if (itemActivate->hdr.hwndFrom == HWND(_list))
581*f6dc9357SAndroid Build Coastguard Worker           return false;
582*f6dc9357SAndroid Build Coastguard Worker         /*
583*f6dc9357SAndroid Build Coastguard Worker           POINT point;
584*f6dc9357SAndroid Build Coastguard Worker           ::GetCursorPos(&point);
585*f6dc9357SAndroid Build Coastguard Worker           ShowColumnsContextMenu(point.x, point.y);
586*f6dc9357SAndroid Build Coastguard Worker         */
587*f6dc9357SAndroid Build Coastguard Worker         // we want to disable menu for columns.
588*f6dc9357SAndroid Build Coastguard Worker         // to return the value from a dialog procedure we must
589*f6dc9357SAndroid Build Coastguard Worker         // call SetMsgResult(val) and return true;
590*f6dc9357SAndroid Build Coastguard Worker         // NM_RCLICK : Return nonzero to not allow the default processing
591*f6dc9357SAndroid Build Coastguard Worker         SetMsgResult(TRUE); // do not allow default processing
592*f6dc9357SAndroid Build Coastguard Worker         return true;
593*f6dc9357SAndroid Build Coastguard Worker       }
594*f6dc9357SAndroid Build Coastguard Worker     }
595*f6dc9357SAndroid Build Coastguard Worker     return false;
596*f6dc9357SAndroid Build Coastguard Worker   }
597*f6dc9357SAndroid Build Coastguard Worker 
598*f6dc9357SAndroid Build Coastguard Worker   switch (header->code)
599*f6dc9357SAndroid Build Coastguard Worker   {
600*f6dc9357SAndroid Build Coastguard Worker     case LVN_ITEMACTIVATE:
601*f6dc9357SAndroid Build Coastguard Worker       if (g_LVN_ITEMACTIVATE_Support)
602*f6dc9357SAndroid Build Coastguard Worker         OnItemEnter();
603*f6dc9357SAndroid Build Coastguard Worker       break;
604*f6dc9357SAndroid Build Coastguard Worker     case NM_DBLCLK:
605*f6dc9357SAndroid Build Coastguard Worker     case NM_RETURN: // probably it's unused
606*f6dc9357SAndroid Build Coastguard Worker       if (!g_LVN_ITEMACTIVATE_Support)
607*f6dc9357SAndroid Build Coastguard Worker         OnItemEnter();
608*f6dc9357SAndroid Build Coastguard Worker       break;
609*f6dc9357SAndroid Build Coastguard Worker     case LVN_COLUMNCLICK:
610*f6dc9357SAndroid Build Coastguard Worker     {
611*f6dc9357SAndroid Build Coastguard Worker       const int index = LPNMLISTVIEW(header)->iSubItem;
612*f6dc9357SAndroid Build Coastguard Worker       ChangeSorting_and_Reload(index);
613*f6dc9357SAndroid Build Coastguard Worker       return false;
614*f6dc9357SAndroid Build Coastguard Worker     }
615*f6dc9357SAndroid Build Coastguard Worker     case LVN_KEYDOWN:
616*f6dc9357SAndroid Build Coastguard Worker     {
617*f6dc9357SAndroid Build Coastguard Worker       bool boolResult = OnKeyDown(LPNMLVKEYDOWN(header));
618*f6dc9357SAndroid Build Coastguard Worker       // Post_RefreshPathEdit();
619*f6dc9357SAndroid Build Coastguard Worker       return boolResult;
620*f6dc9357SAndroid Build Coastguard Worker     }
621*f6dc9357SAndroid Build Coastguard Worker     /*
622*f6dc9357SAndroid Build Coastguard Worker     case NM_RCLICK:
623*f6dc9357SAndroid Build Coastguard Worker     case NM_CLICK:
624*f6dc9357SAndroid Build Coastguard Worker     case LVN_BEGINDRAG:
625*f6dc9357SAndroid Build Coastguard Worker       Post_RefreshPathEdit();
626*f6dc9357SAndroid Build Coastguard Worker       break;
627*f6dc9357SAndroid Build Coastguard Worker     */
628*f6dc9357SAndroid Build Coastguard Worker   }
629*f6dc9357SAndroid Build Coastguard Worker 
630*f6dc9357SAndroid Build Coastguard Worker   return false;
631*f6dc9357SAndroid Build Coastguard Worker }
632*f6dc9357SAndroid Build Coastguard Worker 
OnKeyDown(LPNMLVKEYDOWN keyDownInfo)633*f6dc9357SAndroid Build Coastguard Worker bool CBrowseDialog2::OnKeyDown(LPNMLVKEYDOWN keyDownInfo)
634*f6dc9357SAndroid Build Coastguard Worker {
635*f6dc9357SAndroid Build Coastguard Worker   const bool ctrl = IsKeyDown(VK_CONTROL);
636*f6dc9357SAndroid Build Coastguard Worker   // const bool alt = IsKeyDown(VK_MENU);
637*f6dc9357SAndroid Build Coastguard Worker   // const bool leftCtrl = IsKeyDown(VK_LCONTROL);
638*f6dc9357SAndroid Build Coastguard Worker   // const bool rightCtrl = IsKeyDown(VK_RCONTROL);
639*f6dc9357SAndroid Build Coastguard Worker   // const bool shift = IsKeyDown(VK_SHIFT);
640*f6dc9357SAndroid Build Coastguard Worker 
641*f6dc9357SAndroid Build Coastguard Worker   switch (keyDownInfo->wVKey)
642*f6dc9357SAndroid Build Coastguard Worker   {
643*f6dc9357SAndroid Build Coastguard Worker     case VK_BACK:
644*f6dc9357SAndroid Build Coastguard Worker       OpenParentFolder();
645*f6dc9357SAndroid Build Coastguard Worker       return true;
646*f6dc9357SAndroid Build Coastguard Worker     case 'R':
647*f6dc9357SAndroid Build Coastguard Worker       if (ctrl)
648*f6dc9357SAndroid Build Coastguard Worker       {
649*f6dc9357SAndroid Build Coastguard Worker         Reload_WithErrorMessage();
650*f6dc9357SAndroid Build Coastguard Worker         return true;
651*f6dc9357SAndroid Build Coastguard Worker       }
652*f6dc9357SAndroid Build Coastguard Worker       return false;
653*f6dc9357SAndroid Build Coastguard Worker     case VK_F3:
654*f6dc9357SAndroid Build Coastguard Worker     case VK_F5:
655*f6dc9357SAndroid Build Coastguard Worker     case VK_F6:
656*f6dc9357SAndroid Build Coastguard Worker       if (ctrl)
657*f6dc9357SAndroid Build Coastguard Worker       {
658*f6dc9357SAndroid Build Coastguard Worker         int index = 0; // name
659*f6dc9357SAndroid Build Coastguard Worker               if (keyDownInfo->wVKey == VK_F5)  index = 1; // MTime
660*f6dc9357SAndroid Build Coastguard Worker         else  if (keyDownInfo->wVKey == VK_F6)  index = 2; // Size
661*f6dc9357SAndroid Build Coastguard Worker         ChangeSorting_and_Reload(index);
662*f6dc9357SAndroid Build Coastguard Worker         Reload_WithErrorMessage();
663*f6dc9357SAndroid Build Coastguard Worker         return true;
664*f6dc9357SAndroid Build Coastguard Worker       }
665*f6dc9357SAndroid Build Coastguard Worker       return false;
666*f6dc9357SAndroid Build Coastguard Worker     case 'A':
667*f6dc9357SAndroid Build Coastguard Worker       if (ctrl)
668*f6dc9357SAndroid Build Coastguard Worker       {
669*f6dc9357SAndroid Build Coastguard Worker         // if (TempMode)
670*f6dc9357SAndroid Build Coastguard Worker           _list.SelectAll();
671*f6dc9357SAndroid Build Coastguard Worker         return true;
672*f6dc9357SAndroid Build Coastguard Worker       }
673*f6dc9357SAndroid Build Coastguard Worker       return false;
674*f6dc9357SAndroid Build Coastguard Worker 
675*f6dc9357SAndroid Build Coastguard Worker     case VK_DELETE:
676*f6dc9357SAndroid Build Coastguard Worker       // if (TempMode)
677*f6dc9357SAndroid Build Coastguard Worker         OnDelete(/* !shift */);
678*f6dc9357SAndroid Build Coastguard Worker       return true;
679*f6dc9357SAndroid Build Coastguard Worker #if 0
680*f6dc9357SAndroid Build Coastguard Worker     case VK_NEXT:
681*f6dc9357SAndroid Build Coastguard Worker     case VK_PRIOR:
682*f6dc9357SAndroid Build Coastguard Worker     {
683*f6dc9357SAndroid Build Coastguard Worker       if (ctrl && !alt && !shift)
684*f6dc9357SAndroid Build Coastguard Worker       {
685*f6dc9357SAndroid Build Coastguard Worker         if (keyDownInfo->wVKey == VK_NEXT)
686*f6dc9357SAndroid Build Coastguard Worker           OnItemEnter();
687*f6dc9357SAndroid Build Coastguard Worker         else
688*f6dc9357SAndroid Build Coastguard Worker           OpenParentFolder();
689*f6dc9357SAndroid Build Coastguard Worker         SetMsgResult(TRUE); // to disable processing
690*f6dc9357SAndroid Build Coastguard Worker         return true;
691*f6dc9357SAndroid Build Coastguard Worker       }
692*f6dc9357SAndroid Build Coastguard Worker       break;
693*f6dc9357SAndroid Build Coastguard Worker     }
694*f6dc9357SAndroid Build Coastguard Worker #endif
695*f6dc9357SAndroid Build Coastguard Worker   }
696*f6dc9357SAndroid Build Coastguard Worker   return false;
697*f6dc9357SAndroid Build Coastguard Worker }
698*f6dc9357SAndroid Build Coastguard Worker 
699*f6dc9357SAndroid Build Coastguard Worker 
OnButtonClicked(unsigned buttonID,HWND buttonHWND)700*f6dc9357SAndroid Build Coastguard Worker bool CBrowseDialog2::OnButtonClicked(unsigned buttonID, HWND buttonHWND)
701*f6dc9357SAndroid Build Coastguard Worker {
702*f6dc9357SAndroid Build Coastguard Worker   switch (buttonID)
703*f6dc9357SAndroid Build Coastguard Worker   {
704*f6dc9357SAndroid Build Coastguard Worker     case IDB_BROWSE2_PARENT: OpenParentFolder(); break;
705*f6dc9357SAndroid Build Coastguard Worker     case IDS_BUTTON_DELETE:
706*f6dc9357SAndroid Build Coastguard Worker     {
707*f6dc9357SAndroid Build Coastguard Worker       OnDelete(/* !IsKeyDown(VK_SHIFT) */);
708*f6dc9357SAndroid Build Coastguard Worker       break;
709*f6dc9357SAndroid Build Coastguard Worker     }
710*f6dc9357SAndroid Build Coastguard Worker     case IDM_VIEW_REFRESH:
711*f6dc9357SAndroid Build Coastguard Worker     {
712*f6dc9357SAndroid Build Coastguard Worker       Reload_WithErrorMessage();
713*f6dc9357SAndroid Build Coastguard Worker       break;
714*f6dc9357SAndroid Build Coastguard Worker     }
715*f6dc9357SAndroid Build Coastguard Worker     default: return CModalDialog::OnButtonClicked(buttonID, buttonHWND);
716*f6dc9357SAndroid Build Coastguard Worker   }
717*f6dc9357SAndroid Build Coastguard Worker   _list.SetFocus();
718*f6dc9357SAndroid Build Coastguard Worker   return true;
719*f6dc9357SAndroid Build Coastguard Worker }
720*f6dc9357SAndroid Build Coastguard Worker 
721*f6dc9357SAndroid Build Coastguard Worker 
722*f6dc9357SAndroid Build Coastguard Worker 
PrintPropsPrefix(UString & s,UInt32 id)723*f6dc9357SAndroid Build Coastguard Worker static void PrintPropsPrefix(UString &s, UInt32 id)
724*f6dc9357SAndroid Build Coastguard Worker {
725*f6dc9357SAndroid Build Coastguard Worker   s.Add_LF();
726*f6dc9357SAndroid Build Coastguard Worker   s += "    ";
727*f6dc9357SAndroid Build Coastguard Worker   AddLangString(s, id);
728*f6dc9357SAndroid Build Coastguard Worker   s += ": ";
729*f6dc9357SAndroid Build Coastguard Worker }
730*f6dc9357SAndroid Build Coastguard Worker 
731*f6dc9357SAndroid Build Coastguard Worker wchar_t *Browse_ConvertSizeToString(UInt64 v, wchar_t *s);
732*f6dc9357SAndroid Build Coastguard Worker 
Browse_ConvertSizeToString(const CBrowseItem & bi,wchar_t * s)733*f6dc9357SAndroid Build Coastguard Worker static void Browse_ConvertSizeToString(const CBrowseItem &bi, wchar_t *s)
734*f6dc9357SAndroid Build Coastguard Worker {
735*f6dc9357SAndroid Build Coastguard Worker   s = Browse_ConvertSizeToString(bi.Size, s);
736*f6dc9357SAndroid Build Coastguard Worker   if (bi.WasInterrupted)
737*f6dc9357SAndroid Build Coastguard Worker   {
738*f6dc9357SAndroid Build Coastguard Worker     *s++ = '+';
739*f6dc9357SAndroid Build Coastguard Worker     *s = 0;
740*f6dc9357SAndroid Build Coastguard Worker   }
741*f6dc9357SAndroid Build Coastguard Worker }
742*f6dc9357SAndroid Build Coastguard Worker 
743*f6dc9357SAndroid Build Coastguard Worker void AddSizeValue(UString &s, UInt64 value);
744*f6dc9357SAndroid Build Coastguard Worker 
PrintProps_Size(UString & s,UInt64 size)745*f6dc9357SAndroid Build Coastguard Worker static void PrintProps_Size(UString &s, UInt64 size)
746*f6dc9357SAndroid Build Coastguard Worker {
747*f6dc9357SAndroid Build Coastguard Worker   PrintPropsPrefix(s, IDS_PROP_SIZE);
748*f6dc9357SAndroid Build Coastguard Worker #if 1
749*f6dc9357SAndroid Build Coastguard Worker   AddSizeValue(s, size);
750*f6dc9357SAndroid Build Coastguard Worker #else
751*f6dc9357SAndroid Build Coastguard Worker   s.Add_UInt64(size);
752*f6dc9357SAndroid Build Coastguard Worker   if (size >= 10000)
753*f6dc9357SAndroid Build Coastguard Worker   {
754*f6dc9357SAndroid Build Coastguard Worker     s += " (";
755*f6dc9357SAndroid Build Coastguard Worker     wchar_t temp[64];
756*f6dc9357SAndroid Build Coastguard Worker     Browse_ConvertSizeToString(size, temp);
757*f6dc9357SAndroid Build Coastguard Worker     s += temp;
758*f6dc9357SAndroid Build Coastguard Worker     s.Add_Char(')');
759*f6dc9357SAndroid Build Coastguard Worker   }
760*f6dc9357SAndroid Build Coastguard Worker #endif
761*f6dc9357SAndroid Build Coastguard Worker }
762*f6dc9357SAndroid Build Coastguard Worker 
PrintProps_MTime(UString & s,const CFileInfo & fi)763*f6dc9357SAndroid Build Coastguard Worker static void PrintProps_MTime(UString &s, const CFileInfo &fi)
764*f6dc9357SAndroid Build Coastguard Worker {
765*f6dc9357SAndroid Build Coastguard Worker   PrintPropsPrefix(s, IDS_PROP_MTIME);
766*f6dc9357SAndroid Build Coastguard Worker   char t[64];
767*f6dc9357SAndroid Build Coastguard Worker   ConvertUtcFileTimeToString(fi.MTime, t);
768*f6dc9357SAndroid Build Coastguard Worker   s += t;
769*f6dc9357SAndroid Build Coastguard Worker }
770*f6dc9357SAndroid Build Coastguard Worker 
771*f6dc9357SAndroid Build Coastguard Worker 
PrintProps_Name(UString & s,const CFileInfo & fi)772*f6dc9357SAndroid Build Coastguard Worker static void PrintProps_Name(UString &s, const CFileInfo &fi)
773*f6dc9357SAndroid Build Coastguard Worker {
774*f6dc9357SAndroid Build Coastguard Worker   s += fs2us(fi.Name);
775*f6dc9357SAndroid Build Coastguard Worker   if (fi.IsDir())
776*f6dc9357SAndroid Build Coastguard Worker     s.Add_PathSepar();
777*f6dc9357SAndroid Build Coastguard Worker }
778*f6dc9357SAndroid Build Coastguard Worker 
PrintProps_Attrib(UString & s,const CFileInfo & fi)779*f6dc9357SAndroid Build Coastguard Worker static void PrintProps_Attrib(UString &s, const CFileInfo &fi)
780*f6dc9357SAndroid Build Coastguard Worker {
781*f6dc9357SAndroid Build Coastguard Worker   PrintPropsPrefix(s, IDS_PROP_ATTRIBUTES);
782*f6dc9357SAndroid Build Coastguard Worker   char props[64];
783*f6dc9357SAndroid Build Coastguard Worker   ConvertWinAttribToString(props, fi.Attrib);
784*f6dc9357SAndroid Build Coastguard Worker   s += props;
785*f6dc9357SAndroid Build Coastguard Worker #if 0
786*f6dc9357SAndroid Build Coastguard Worker   if (fi.HasReparsePoint())
787*f6dc9357SAndroid Build Coastguard Worker   {
788*f6dc9357SAndroid Build Coastguard Worker     s.Add_LF();
789*f6dc9357SAndroid Build Coastguard Worker     s += "IsLink: +";
790*f6dc9357SAndroid Build Coastguard Worker   }
791*f6dc9357SAndroid Build Coastguard Worker #endif
792*f6dc9357SAndroid Build Coastguard Worker }
793*f6dc9357SAndroid Build Coastguard Worker 
PrintProps(UString & s,const CBrowseItem & bi,const CFileInfo & fi,const CFileInfo * fi2)794*f6dc9357SAndroid Build Coastguard Worker static void PrintProps(UString &s, const CBrowseItem &bi,
795*f6dc9357SAndroid Build Coastguard Worker     const CFileInfo &fi, const CFileInfo *fi2)
796*f6dc9357SAndroid Build Coastguard Worker {
797*f6dc9357SAndroid Build Coastguard Worker   PrintProps_Name(s, fi);
798*f6dc9357SAndroid Build Coastguard Worker   PrintProps_Attrib(s, fi);
799*f6dc9357SAndroid Build Coastguard Worker   if (bi.NumDirs != 0)
800*f6dc9357SAndroid Build Coastguard Worker   {
801*f6dc9357SAndroid Build Coastguard Worker     PrintPropsPrefix(s, IDS_PROP_FOLDERS);
802*f6dc9357SAndroid Build Coastguard Worker     s.Add_UInt32(bi.NumDirs);
803*f6dc9357SAndroid Build Coastguard Worker     if (bi.WasInterrupted)
804*f6dc9357SAndroid Build Coastguard Worker       s += "+";
805*f6dc9357SAndroid Build Coastguard Worker   }
806*f6dc9357SAndroid Build Coastguard Worker   if (bi.NumFiles != 0)
807*f6dc9357SAndroid Build Coastguard Worker   {
808*f6dc9357SAndroid Build Coastguard Worker     PrintPropsPrefix(s, IDS_PROP_FILES);
809*f6dc9357SAndroid Build Coastguard Worker     s.Add_UInt32(bi.NumFiles);
810*f6dc9357SAndroid Build Coastguard Worker     if (bi.WasInterrupted)
811*f6dc9357SAndroid Build Coastguard Worker       s += "+";
812*f6dc9357SAndroid Build Coastguard Worker   }
813*f6dc9357SAndroid Build Coastguard Worker   {
814*f6dc9357SAndroid Build Coastguard Worker     PrintProps_Size(s, bi.Size);
815*f6dc9357SAndroid Build Coastguard Worker     if (bi.WasInterrupted)
816*f6dc9357SAndroid Build Coastguard Worker       s += "+";
817*f6dc9357SAndroid Build Coastguard Worker   }
818*f6dc9357SAndroid Build Coastguard Worker 
819*f6dc9357SAndroid Build Coastguard Worker   PrintProps_MTime(s, fi);
820*f6dc9357SAndroid Build Coastguard Worker 
821*f6dc9357SAndroid Build Coastguard Worker   if (fi2)
822*f6dc9357SAndroid Build Coastguard Worker   {
823*f6dc9357SAndroid Build Coastguard Worker     s.Add_LF();
824*f6dc9357SAndroid Build Coastguard Worker     s += "----------------";
825*f6dc9357SAndroid Build Coastguard Worker     s.Add_LF();
826*f6dc9357SAndroid Build Coastguard Worker     PrintProps_Name(s, *fi2);
827*f6dc9357SAndroid Build Coastguard Worker     PrintProps_Attrib(s, *fi2);
828*f6dc9357SAndroid Build Coastguard Worker     if (!fi2->IsDir())
829*f6dc9357SAndroid Build Coastguard Worker       PrintProps_Size(s, fi2->Size);
830*f6dc9357SAndroid Build Coastguard Worker     PrintProps_MTime(s, *fi2);
831*f6dc9357SAndroid Build Coastguard Worker   }
832*f6dc9357SAndroid Build Coastguard Worker }
833*f6dc9357SAndroid Build Coastguard Worker 
834*f6dc9357SAndroid Build Coastguard Worker 
GetSelected_RealIndexes(CUIntVector & vector)835*f6dc9357SAndroid Build Coastguard Worker void CBrowseDialog2::GetSelected_RealIndexes(CUIntVector &vector)
836*f6dc9357SAndroid Build Coastguard Worker {
837*f6dc9357SAndroid Build Coastguard Worker   vector.Clear();
838*f6dc9357SAndroid Build Coastguard Worker   int index = -1;
839*f6dc9357SAndroid Build Coastguard Worker   for (;;)
840*f6dc9357SAndroid Build Coastguard Worker   {
841*f6dc9357SAndroid Build Coastguard Worker     index = _list.GetNextSelectedItem(index);
842*f6dc9357SAndroid Build Coastguard Worker     if (index < 0)
843*f6dc9357SAndroid Build Coastguard Worker       break;
844*f6dc9357SAndroid Build Coastguard Worker     const int realIndex = GetRealItemIndex(index);
845*f6dc9357SAndroid Build Coastguard Worker     if (realIndex >= 0)
846*f6dc9357SAndroid Build Coastguard Worker       vector.Add((unsigned)realIndex);
847*f6dc9357SAndroid Build Coastguard Worker   }
848*f6dc9357SAndroid Build Coastguard Worker }
849*f6dc9357SAndroid Build Coastguard Worker 
850*f6dc9357SAndroid Build Coastguard Worker 
PrintFileProps(UString & s,const CFileInfo & file)851*f6dc9357SAndroid Build Coastguard Worker void CBrowseDialog2::PrintFileProps(UString &s, const CFileInfo &file)
852*f6dc9357SAndroid Build Coastguard Worker {
853*f6dc9357SAndroid Build Coastguard Worker   CFileInfo file2;
854*f6dc9357SAndroid Build Coastguard Worker   FString path = us2fs(DirPrefix);
855*f6dc9357SAndroid Build Coastguard Worker   path += file.Name;
856*f6dc9357SAndroid Build Coastguard Worker   if (!file2.Find(path))
857*f6dc9357SAndroid Build Coastguard Worker   {
858*f6dc9357SAndroid Build Coastguard Worker     MessageBox_LastError_path(*this, path);
859*f6dc9357SAndroid Build Coastguard Worker     Reload_WithErrorMessage();
860*f6dc9357SAndroid Build Coastguard Worker     return;
861*f6dc9357SAndroid Build Coastguard Worker   }
862*f6dc9357SAndroid Build Coastguard Worker   CBrowseEnumerator enumer;
863*f6dc9357SAndroid Build Coastguard Worker   enumer.bi.Size = file2.Size;
864*f6dc9357SAndroid Build Coastguard Worker   if (file2.IsDir() && !file2.HasReparsePoint())
865*f6dc9357SAndroid Build Coastguard Worker   {
866*f6dc9357SAndroid Build Coastguard Worker     enumer.Path = path;
867*f6dc9357SAndroid Build Coastguard Worker     enumer.Enumerate(0); // level
868*f6dc9357SAndroid Build Coastguard Worker   }
869*f6dc9357SAndroid Build Coastguard Worker   PrintProps(s, enumer.bi, file2,
870*f6dc9357SAndroid Build Coastguard Worker       enumer.bi.NumRootItems == 1 ? &enumer.fi_SubFile : NULL);
871*f6dc9357SAndroid Build Coastguard Worker }
872*f6dc9357SAndroid Build Coastguard Worker 
873*f6dc9357SAndroid Build Coastguard Worker 
Show_FileProps_Window(const CFileInfo & file)874*f6dc9357SAndroid Build Coastguard Worker void CBrowseDialog2::Show_FileProps_Window(const CFileInfo &file)
875*f6dc9357SAndroid Build Coastguard Worker {
876*f6dc9357SAndroid Build Coastguard Worker   UString s;
877*f6dc9357SAndroid Build Coastguard Worker   PrintFileProps(s, file);
878*f6dc9357SAndroid Build Coastguard Worker   MessageBoxW(*this, s, LangString(IDS_PROPERTIES), MB_OK);
879*f6dc9357SAndroid Build Coastguard Worker }
880*f6dc9357SAndroid Build Coastguard Worker 
881*f6dc9357SAndroid Build Coastguard Worker 
OnDelete()882*f6dc9357SAndroid Build Coastguard Worker void CBrowseDialog2::OnDelete(/* bool toRecycleBin */)
883*f6dc9357SAndroid Build Coastguard Worker {
884*f6dc9357SAndroid Build Coastguard Worker #if 1
885*f6dc9357SAndroid Build Coastguard Worker   // we don't want deleting in non temp folders
886*f6dc9357SAndroid Build Coastguard Worker   if (!DirPrefix.IsPrefixedBy(TempFolderPath))
887*f6dc9357SAndroid Build Coastguard Worker     return;
888*f6dc9357SAndroid Build Coastguard Worker #endif
889*f6dc9357SAndroid Build Coastguard Worker 
890*f6dc9357SAndroid Build Coastguard Worker   CUIntVector indices;
891*f6dc9357SAndroid Build Coastguard Worker   GetSelected_RealIndexes(indices);
892*f6dc9357SAndroid Build Coastguard Worker   if (indices.Size() == 0)
893*f6dc9357SAndroid Build Coastguard Worker     return;
894*f6dc9357SAndroid Build Coastguard Worker   {
895*f6dc9357SAndroid Build Coastguard Worker     UInt32 titleID, messageID;
896*f6dc9357SAndroid Build Coastguard Worker     UString messageParam;
897*f6dc9357SAndroid Build Coastguard Worker     UString s2;
898*f6dc9357SAndroid Build Coastguard Worker     if (indices.Size() == 1)
899*f6dc9357SAndroid Build Coastguard Worker     {
900*f6dc9357SAndroid Build Coastguard Worker       const unsigned index = indices[0];
901*f6dc9357SAndroid Build Coastguard Worker       const CBrowseItem &bi = _items[index];
902*f6dc9357SAndroid Build Coastguard Worker       const CFileInfo &file = _files[bi.MainFileIndex];
903*f6dc9357SAndroid Build Coastguard Worker       PrintFileProps(s2, file);
904*f6dc9357SAndroid Build Coastguard Worker       messageParam = fs2us(file.Name);
905*f6dc9357SAndroid Build Coastguard Worker       if (file.IsDir())
906*f6dc9357SAndroid Build Coastguard Worker       {
907*f6dc9357SAndroid Build Coastguard Worker         titleID = IDS_CONFIRM_FOLDER_DELETE;
908*f6dc9357SAndroid Build Coastguard Worker         messageID = IDS_WANT_TO_DELETE_FOLDER;
909*f6dc9357SAndroid Build Coastguard Worker       }
910*f6dc9357SAndroid Build Coastguard Worker       else
911*f6dc9357SAndroid Build Coastguard Worker       {
912*f6dc9357SAndroid Build Coastguard Worker         titleID = IDS_CONFIRM_FILE_DELETE;
913*f6dc9357SAndroid Build Coastguard Worker         messageID = IDS_WANT_TO_DELETE_FILE;
914*f6dc9357SAndroid Build Coastguard Worker       }
915*f6dc9357SAndroid Build Coastguard Worker     }
916*f6dc9357SAndroid Build Coastguard Worker     else
917*f6dc9357SAndroid Build Coastguard Worker     {
918*f6dc9357SAndroid Build Coastguard Worker       titleID = IDS_CONFIRM_ITEMS_DELETE;
919*f6dc9357SAndroid Build Coastguard Worker       messageID = IDS_WANT_TO_DELETE_ITEMS;
920*f6dc9357SAndroid Build Coastguard Worker       messageParam = NumberToString(indices.Size());
921*f6dc9357SAndroid Build Coastguard Worker 
922*f6dc9357SAndroid Build Coastguard Worker       for (UInt32 i = 0; i < indices.Size(); i++)
923*f6dc9357SAndroid Build Coastguard Worker       {
924*f6dc9357SAndroid Build Coastguard Worker         if (i >= 10)
925*f6dc9357SAndroid Build Coastguard Worker         {
926*f6dc9357SAndroid Build Coastguard Worker           s2 += "...";
927*f6dc9357SAndroid Build Coastguard Worker           break;
928*f6dc9357SAndroid Build Coastguard Worker         }
929*f6dc9357SAndroid Build Coastguard Worker         const CBrowseItem &bi = _items[indices[i]];
930*f6dc9357SAndroid Build Coastguard Worker         const CFileInfo &fi = _files[bi.MainFileIndex];
931*f6dc9357SAndroid Build Coastguard Worker         PrintProps_Name(s2, fi);
932*f6dc9357SAndroid Build Coastguard Worker         s2.Add_LF();
933*f6dc9357SAndroid Build Coastguard Worker       }
934*f6dc9357SAndroid Build Coastguard Worker     }
935*f6dc9357SAndroid Build Coastguard Worker     UString s = MyFormatNew(messageID, messageParam);
936*f6dc9357SAndroid Build Coastguard Worker     if (!s2.IsEmpty())
937*f6dc9357SAndroid Build Coastguard Worker     {
938*f6dc9357SAndroid Build Coastguard Worker       s.Add_LF();
939*f6dc9357SAndroid Build Coastguard Worker       s.Add_LF();
940*f6dc9357SAndroid Build Coastguard Worker       s += s2;
941*f6dc9357SAndroid Build Coastguard Worker     }
942*f6dc9357SAndroid Build Coastguard Worker     if (::MessageBoxW((HWND)*this, s, LangString(titleID),
943*f6dc9357SAndroid Build Coastguard Worker         MB_YESNOCANCEL | MB_ICONQUESTION) != IDYES)
944*f6dc9357SAndroid Build Coastguard Worker       return;
945*f6dc9357SAndroid Build Coastguard Worker   }
946*f6dc9357SAndroid Build Coastguard Worker 
947*f6dc9357SAndroid Build Coastguard Worker   for (UInt32 i = 0; i < indices.Size(); i++)
948*f6dc9357SAndroid Build Coastguard Worker   {
949*f6dc9357SAndroid Build Coastguard Worker     const unsigned index = indices[i];
950*f6dc9357SAndroid Build Coastguard Worker     bool result = true;
951*f6dc9357SAndroid Build Coastguard Worker     const CBrowseItem &bi = _items[index];
952*f6dc9357SAndroid Build Coastguard Worker     const CFileInfo &fi = _files[bi.MainFileIndex];
953*f6dc9357SAndroid Build Coastguard Worker     if (fi.Name.IsEmpty())
954*f6dc9357SAndroid Build Coastguard Worker       return; // some error
955*f6dc9357SAndroid Build Coastguard Worker     const FString fullPath = us2fs(DirPrefix) + fi.Name;
956*f6dc9357SAndroid Build Coastguard Worker     if (fi.IsDir())
957*f6dc9357SAndroid Build Coastguard Worker       result = NFile::NDir::RemoveDirWithSubItems(fullPath);
958*f6dc9357SAndroid Build Coastguard Worker     else
959*f6dc9357SAndroid Build Coastguard Worker       result = NFile::NDir::DeleteFileAlways(fullPath);
960*f6dc9357SAndroid Build Coastguard Worker     if (!result)
961*f6dc9357SAndroid Build Coastguard Worker     {
962*f6dc9357SAndroid Build Coastguard Worker       MessageBox_LastError_path(*this, fullPath);
963*f6dc9357SAndroid Build Coastguard Worker       return;
964*f6dc9357SAndroid Build Coastguard Worker     }
965*f6dc9357SAndroid Build Coastguard Worker   }
966*f6dc9357SAndroid Build Coastguard Worker 
967*f6dc9357SAndroid Build Coastguard Worker   Reload_WithErrorMessage();
968*f6dc9357SAndroid Build Coastguard Worker }
969*f6dc9357SAndroid Build Coastguard Worker 
970*f6dc9357SAndroid Build Coastguard Worker 
971*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_NO_REGISTRY
972*f6dc9357SAndroid Build Coastguard Worker #define kHelpTopic "fm/temp.htm"
OnHelp()973*f6dc9357SAndroid Build Coastguard Worker void CBrowseDialog2::OnHelp()
974*f6dc9357SAndroid Build Coastguard Worker {
975*f6dc9357SAndroid Build Coastguard Worker   ShowHelpWindow(kHelpTopic);
976*f6dc9357SAndroid Build Coastguard Worker   CModalDialog::OnHelp();
977*f6dc9357SAndroid Build Coastguard Worker }
978*f6dc9357SAndroid Build Coastguard Worker #endif
979*f6dc9357SAndroid Build Coastguard Worker 
980*f6dc9357SAndroid Build Coastguard Worker 
981*f6dc9357SAndroid Build Coastguard Worker HRESULT StartApplication(const UString &dir, const UString &path, HWND window, CProcess &process);
StartApplication(const UString & dir,const UString & path,HWND window,CProcess & process)982*f6dc9357SAndroid Build Coastguard Worker HRESULT StartApplication(const UString &dir, const UString &path, HWND window, CProcess &process)
983*f6dc9357SAndroid Build Coastguard Worker {
984*f6dc9357SAndroid Build Coastguard Worker   UString path2 = path;
985*f6dc9357SAndroid Build Coastguard Worker 
986*f6dc9357SAndroid Build Coastguard Worker   #ifdef _WIN32
987*f6dc9357SAndroid Build Coastguard Worker   {
988*f6dc9357SAndroid Build Coastguard Worker     const int dot = path2.ReverseFind_Dot();
989*f6dc9357SAndroid Build Coastguard Worker     const int separ = path2.ReverseFind_PathSepar();
990*f6dc9357SAndroid Build Coastguard Worker     if (dot < 0 || dot < separ)
991*f6dc9357SAndroid Build Coastguard Worker       path2.Add_Dot();
992*f6dc9357SAndroid Build Coastguard Worker   }
993*f6dc9357SAndroid Build Coastguard Worker   #endif
994*f6dc9357SAndroid Build Coastguard Worker 
995*f6dc9357SAndroid Build Coastguard Worker   UINT32 result;
996*f6dc9357SAndroid Build Coastguard Worker 
997*f6dc9357SAndroid Build Coastguard Worker #ifndef _UNICODE
998*f6dc9357SAndroid Build Coastguard Worker   if (g_IsNT)
999*f6dc9357SAndroid Build Coastguard Worker   {
1000*f6dc9357SAndroid Build Coastguard Worker     SHELLEXECUTEINFOW execInfo;
1001*f6dc9357SAndroid Build Coastguard Worker     execInfo.cbSize = sizeof(execInfo);
1002*f6dc9357SAndroid Build Coastguard Worker     execInfo.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_DDEWAIT;
1003*f6dc9357SAndroid Build Coastguard Worker     execInfo.hwnd = NULL;
1004*f6dc9357SAndroid Build Coastguard Worker     execInfo.lpVerb = NULL;
1005*f6dc9357SAndroid Build Coastguard Worker     execInfo.lpFile = path2;
1006*f6dc9357SAndroid Build Coastguard Worker     execInfo.lpParameters = NULL;
1007*f6dc9357SAndroid Build Coastguard Worker     execInfo.lpDirectory = dir.IsEmpty() ? NULL : (LPCWSTR)dir;
1008*f6dc9357SAndroid Build Coastguard Worker     execInfo.nShow = SW_SHOWNORMAL;
1009*f6dc9357SAndroid Build Coastguard Worker     execInfo.hProcess = NULL;
1010*f6dc9357SAndroid Build Coastguard Worker typedef BOOL (WINAPI * Func_ShellExecuteExW)(LPSHELLEXECUTEINFOW lpExecInfo);
1011*f6dc9357SAndroid Build Coastguard Worker Z7_DIAGNOSTIC_IGNORE_CAST_FUNCTION
1012*f6dc9357SAndroid Build Coastguard Worker     const
1013*f6dc9357SAndroid Build Coastguard Worker     Func_ShellExecuteExW
1014*f6dc9357SAndroid Build Coastguard Worker        f_ShellExecuteExW = Z7_GET_PROC_ADDRESS(
1015*f6dc9357SAndroid Build Coastguard Worker     Func_ShellExecuteExW, ::GetModuleHandleW(L"shell32.dll"),
1016*f6dc9357SAndroid Build Coastguard Worker         "ShellExecuteExW");
1017*f6dc9357SAndroid Build Coastguard Worker     if (!f_ShellExecuteExW)
1018*f6dc9357SAndroid Build Coastguard Worker       return 0;
1019*f6dc9357SAndroid Build Coastguard Worker     f_ShellExecuteExW(&execInfo);
1020*f6dc9357SAndroid Build Coastguard Worker     result = (UINT32)(UINT_PTR)execInfo.hInstApp;
1021*f6dc9357SAndroid Build Coastguard Worker     process.Attach(execInfo.hProcess);
1022*f6dc9357SAndroid Build Coastguard Worker   }
1023*f6dc9357SAndroid Build Coastguard Worker   else
1024*f6dc9357SAndroid Build Coastguard Worker #endif
1025*f6dc9357SAndroid Build Coastguard Worker   {
1026*f6dc9357SAndroid Build Coastguard Worker     SHELLEXECUTEINFO execInfo;
1027*f6dc9357SAndroid Build Coastguard Worker     execInfo.cbSize = sizeof(execInfo);
1028*f6dc9357SAndroid Build Coastguard Worker     execInfo.fMask = SEE_MASK_NOCLOSEPROCESS
1029*f6dc9357SAndroid Build Coastguard Worker       #ifndef UNDER_CE
1030*f6dc9357SAndroid Build Coastguard Worker       | SEE_MASK_FLAG_DDEWAIT
1031*f6dc9357SAndroid Build Coastguard Worker       #endif
1032*f6dc9357SAndroid Build Coastguard Worker       ;
1033*f6dc9357SAndroid Build Coastguard Worker     execInfo.hwnd = NULL;
1034*f6dc9357SAndroid Build Coastguard Worker     execInfo.lpVerb = NULL;
1035*f6dc9357SAndroid Build Coastguard Worker     const CSysString sysPath (GetSystemString(path2));
1036*f6dc9357SAndroid Build Coastguard Worker     const CSysString sysDir (GetSystemString(dir));
1037*f6dc9357SAndroid Build Coastguard Worker     execInfo.lpFile = sysPath;
1038*f6dc9357SAndroid Build Coastguard Worker     execInfo.lpParameters = NULL;
1039*f6dc9357SAndroid Build Coastguard Worker     execInfo.lpDirectory =
1040*f6dc9357SAndroid Build Coastguard Worker       #ifdef UNDER_CE
1041*f6dc9357SAndroid Build Coastguard Worker         NULL
1042*f6dc9357SAndroid Build Coastguard Worker       #else
1043*f6dc9357SAndroid Build Coastguard Worker         sysDir.IsEmpty() ? NULL : (LPCTSTR)sysDir
1044*f6dc9357SAndroid Build Coastguard Worker       #endif
1045*f6dc9357SAndroid Build Coastguard Worker       ;
1046*f6dc9357SAndroid Build Coastguard Worker     execInfo.nShow = SW_SHOWNORMAL;
1047*f6dc9357SAndroid Build Coastguard Worker     execInfo.hProcess = NULL;
1048*f6dc9357SAndroid Build Coastguard Worker     ::ShellExecuteEx(&execInfo);
1049*f6dc9357SAndroid Build Coastguard Worker     result = (UINT32)(UINT_PTR)execInfo.hInstApp;
1050*f6dc9357SAndroid Build Coastguard Worker     process.Attach(execInfo.hProcess);
1051*f6dc9357SAndroid Build Coastguard Worker   }
1052*f6dc9357SAndroid Build Coastguard Worker 
1053*f6dc9357SAndroid Build Coastguard Worker   // DEBUG_PRINT_NUM("-- ShellExecuteEx -- execInfo.hInstApp = ", result)
1054*f6dc9357SAndroid Build Coastguard Worker 
1055*f6dc9357SAndroid Build Coastguard Worker   if (result <= 32)
1056*f6dc9357SAndroid Build Coastguard Worker   {
1057*f6dc9357SAndroid Build Coastguard Worker     switch (result)
1058*f6dc9357SAndroid Build Coastguard Worker     {
1059*f6dc9357SAndroid Build Coastguard Worker       case SE_ERR_NOASSOC:
1060*f6dc9357SAndroid Build Coastguard Worker         MessageBox_HResError(window,
1061*f6dc9357SAndroid Build Coastguard Worker           GetLastError_noZero_HRESULT(),
1062*f6dc9357SAndroid Build Coastguard Worker           NULL
1063*f6dc9357SAndroid Build Coastguard Worker           // L"There is no application associated with the given file name extension",
1064*f6dc9357SAndroid Build Coastguard Worker           );
1065*f6dc9357SAndroid Build Coastguard Worker     }
1066*f6dc9357SAndroid Build Coastguard Worker 
1067*f6dc9357SAndroid Build Coastguard Worker     return E_FAIL; // fixed in 15.13. Can we use it for any Windows version?
1068*f6dc9357SAndroid Build Coastguard Worker   }
1069*f6dc9357SAndroid Build Coastguard Worker 
1070*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
1071*f6dc9357SAndroid Build Coastguard Worker }
1072*f6dc9357SAndroid Build Coastguard Worker 
1073*f6dc9357SAndroid Build Coastguard Worker void StartApplicationDontWait(const UString &dir, const UString &path, HWND window);
StartApplicationDontWait(const UString & dir,const UString & path,HWND window)1074*f6dc9357SAndroid Build Coastguard Worker void StartApplicationDontWait(const UString &dir, const UString &path, HWND window)
1075*f6dc9357SAndroid Build Coastguard Worker {
1076*f6dc9357SAndroid Build Coastguard Worker   CProcess process;
1077*f6dc9357SAndroid Build Coastguard Worker   StartApplication(dir, path, window, process);
1078*f6dc9357SAndroid Build Coastguard Worker }
1079*f6dc9357SAndroid Build Coastguard Worker 
1080*f6dc9357SAndroid Build Coastguard Worker 
GetQuotedString2(const UString & s)1081*f6dc9357SAndroid Build Coastguard Worker static UString GetQuotedString2(const UString &s)
1082*f6dc9357SAndroid Build Coastguard Worker {
1083*f6dc9357SAndroid Build Coastguard Worker   UString s2 ('\"');
1084*f6dc9357SAndroid Build Coastguard Worker   s2 += s;
1085*f6dc9357SAndroid Build Coastguard Worker   s2.Add_Char('\"');
1086*f6dc9357SAndroid Build Coastguard Worker   return s2;
1087*f6dc9357SAndroid Build Coastguard Worker }
1088*f6dc9357SAndroid Build Coastguard Worker 
1089*f6dc9357SAndroid Build Coastguard Worker 
OnContextMenu(HANDLE windowHandle,int xPos,int yPos)1090*f6dc9357SAndroid Build Coastguard Worker bool CBrowseDialog2::OnContextMenu(HANDLE windowHandle, int xPos, int yPos)
1091*f6dc9357SAndroid Build Coastguard Worker {
1092*f6dc9357SAndroid Build Coastguard Worker   if (windowHandle != _list)
1093*f6dc9357SAndroid Build Coastguard Worker     return false;
1094*f6dc9357SAndroid Build Coastguard Worker 
1095*f6dc9357SAndroid Build Coastguard Worker   CUIntVector indices;
1096*f6dc9357SAndroid Build Coastguard Worker   GetSelected_RealIndexes(indices);
1097*f6dc9357SAndroid Build Coastguard Worker 
1098*f6dc9357SAndroid Build Coastguard Worker   // negative x,y are possible for multi-screen modes.
1099*f6dc9357SAndroid Build Coastguard Worker   // x=-1 && y=-1 for keyboard call (SHIFT+F10 and others).
1100*f6dc9357SAndroid Build Coastguard Worker #if 1 // 0 : for debug
1101*f6dc9357SAndroid Build Coastguard Worker   if (xPos == -1 && yPos == -1)
1102*f6dc9357SAndroid Build Coastguard Worker #endif
1103*f6dc9357SAndroid Build Coastguard Worker   {
1104*f6dc9357SAndroid Build Coastguard Worker /*
1105*f6dc9357SAndroid Build Coastguard Worker     if (indices.Size() == 0)
1106*f6dc9357SAndroid Build Coastguard Worker     {
1107*f6dc9357SAndroid Build Coastguard Worker       xPos = 0;
1108*f6dc9357SAndroid Build Coastguard Worker       yPos = 0;
1109*f6dc9357SAndroid Build Coastguard Worker     }
1110*f6dc9357SAndroid Build Coastguard Worker     else
1111*f6dc9357SAndroid Build Coastguard Worker */
1112*f6dc9357SAndroid Build Coastguard Worker     {
1113*f6dc9357SAndroid Build Coastguard Worker       const int itemIndex = _list.GetFocusedItem();
1114*f6dc9357SAndroid Build Coastguard Worker       if (itemIndex == -1)
1115*f6dc9357SAndroid Build Coastguard Worker         return false;
1116*f6dc9357SAndroid Build Coastguard Worker       RECT rect;
1117*f6dc9357SAndroid Build Coastguard Worker       if (!_list.GetItemRect(itemIndex, &rect, LVIR_ICON))
1118*f6dc9357SAndroid Build Coastguard Worker         return false;
1119*f6dc9357SAndroid Build Coastguard Worker       // rect : rect of file icon relative to listVeiw.
1120*f6dc9357SAndroid Build Coastguard Worker       xPos = (rect.left + rect.right) / 2;
1121*f6dc9357SAndroid Build Coastguard Worker       yPos = (rect.top + rect.bottom) / 2;
1122*f6dc9357SAndroid Build Coastguard Worker       RECT r;
1123*f6dc9357SAndroid Build Coastguard Worker       GetClientRectOfItem(IDL_BROWSE2, r);
1124*f6dc9357SAndroid Build Coastguard Worker       if (yPos < 0 || yPos >= RECT_SIZE_Y(r))
1125*f6dc9357SAndroid Build Coastguard Worker         yPos = 0;
1126*f6dc9357SAndroid Build Coastguard Worker     }
1127*f6dc9357SAndroid Build Coastguard Worker     POINT point = {xPos, yPos};
1128*f6dc9357SAndroid Build Coastguard Worker     _list.ClientToScreen(&point);
1129*f6dc9357SAndroid Build Coastguard Worker     xPos = point.x;
1130*f6dc9357SAndroid Build Coastguard Worker     yPos = point.y;
1131*f6dc9357SAndroid Build Coastguard Worker   }
1132*f6dc9357SAndroid Build Coastguard Worker 
1133*f6dc9357SAndroid Build Coastguard Worker   const UInt32 k_CmdId_Delete = 1;
1134*f6dc9357SAndroid Build Coastguard Worker   const UInt32 k_CmdId_Open_Explorer = 2;
1135*f6dc9357SAndroid Build Coastguard Worker   const UInt32 k_CmdId_Open_7zip = 3;
1136*f6dc9357SAndroid Build Coastguard Worker   const UInt32 k_CmdId_Props = 4;
1137*f6dc9357SAndroid Build Coastguard Worker   int menuResult;
1138*f6dc9357SAndroid Build Coastguard Worker   {
1139*f6dc9357SAndroid Build Coastguard Worker     CMenu menu;
1140*f6dc9357SAndroid Build Coastguard Worker     CMenuDestroyer menuDestroyer(menu);
1141*f6dc9357SAndroid Build Coastguard Worker     menu.CreatePopup();
1142*f6dc9357SAndroid Build Coastguard Worker 
1143*f6dc9357SAndroid Build Coastguard Worker     unsigned numMenuItems = 0;
1144*f6dc9357SAndroid Build Coastguard Worker     // unsigned defaultCmd = 0;
1145*f6dc9357SAndroid Build Coastguard Worker 
1146*f6dc9357SAndroid Build Coastguard Worker     for (unsigned cmd = k_CmdId_Delete; cmd <= k_CmdId_Props; cmd++)
1147*f6dc9357SAndroid Build Coastguard Worker     {
1148*f6dc9357SAndroid Build Coastguard Worker       if (cmd == k_CmdId_Delete)
1149*f6dc9357SAndroid Build Coastguard Worker       {
1150*f6dc9357SAndroid Build Coastguard Worker         if (/* !TempMode || */ indices.Size() == 0)
1151*f6dc9357SAndroid Build Coastguard Worker           continue;
1152*f6dc9357SAndroid Build Coastguard Worker         // defaultCmd = cmd;
1153*f6dc9357SAndroid Build Coastguard Worker       }
1154*f6dc9357SAndroid Build Coastguard Worker       else if (indices.Size() > 1)
1155*f6dc9357SAndroid Build Coastguard Worker         break;
1156*f6dc9357SAndroid Build Coastguard Worker 
1157*f6dc9357SAndroid Build Coastguard Worker 
1158*f6dc9357SAndroid Build Coastguard Worker       if (numMenuItems != 0)
1159*f6dc9357SAndroid Build Coastguard Worker       {
1160*f6dc9357SAndroid Build Coastguard Worker         if (cmd == k_CmdId_Open_Explorer)
1161*f6dc9357SAndroid Build Coastguard Worker           menu.AppendItem(MF_SEPARATOR, 0, (LPCTSTR)NULL);
1162*f6dc9357SAndroid Build Coastguard Worker         if (cmd == k_CmdId_Props)
1163*f6dc9357SAndroid Build Coastguard Worker           menu.AppendItem(MF_SEPARATOR, 0, (LPCTSTR)NULL);
1164*f6dc9357SAndroid Build Coastguard Worker       }
1165*f6dc9357SAndroid Build Coastguard Worker 
1166*f6dc9357SAndroid Build Coastguard Worker       const UINT flags = MF_STRING;
1167*f6dc9357SAndroid Build Coastguard Worker       UString s;
1168*f6dc9357SAndroid Build Coastguard Worker       if (cmd == k_CmdId_Delete)
1169*f6dc9357SAndroid Build Coastguard Worker       {
1170*f6dc9357SAndroid Build Coastguard Worker         s = LangString(IDS_BUTTON_DELETE);
1171*f6dc9357SAndroid Build Coastguard Worker         s += "\tDelete";
1172*f6dc9357SAndroid Build Coastguard Worker       }
1173*f6dc9357SAndroid Build Coastguard Worker       else if (cmd == k_CmdId_Open_Explorer)
1174*f6dc9357SAndroid Build Coastguard Worker       {
1175*f6dc9357SAndroid Build Coastguard Worker         s = LangString(IDM_OPEN_OUTSIDE);
1176*f6dc9357SAndroid Build Coastguard Worker         if (s.IsEmpty())
1177*f6dc9357SAndroid Build Coastguard Worker           s = "Open Outside";
1178*f6dc9357SAndroid Build Coastguard Worker         s += "\tShift+Enter";
1179*f6dc9357SAndroid Build Coastguard Worker       }
1180*f6dc9357SAndroid Build Coastguard Worker       else if (cmd == k_CmdId_Open_7zip)
1181*f6dc9357SAndroid Build Coastguard Worker       {
1182*f6dc9357SAndroid Build Coastguard Worker         s = LangString(IDM_OPEN_OUTSIDE);
1183*f6dc9357SAndroid Build Coastguard Worker         if (s.IsEmpty())
1184*f6dc9357SAndroid Build Coastguard Worker           s = "Open Outside";
1185*f6dc9357SAndroid Build Coastguard Worker         s += " : 7-Zip";
1186*f6dc9357SAndroid Build Coastguard Worker       }
1187*f6dc9357SAndroid Build Coastguard Worker       else if (cmd == k_CmdId_Props)
1188*f6dc9357SAndroid Build Coastguard Worker       {
1189*f6dc9357SAndroid Build Coastguard Worker         s = LangString(IDS_PROPERTIES);
1190*f6dc9357SAndroid Build Coastguard Worker         if (s.IsEmpty())
1191*f6dc9357SAndroid Build Coastguard Worker           s = "Properties";
1192*f6dc9357SAndroid Build Coastguard Worker         s += "\tAlt+Enter";
1193*f6dc9357SAndroid Build Coastguard Worker       }
1194*f6dc9357SAndroid Build Coastguard Worker       else
1195*f6dc9357SAndroid Build Coastguard Worker         break;
1196*f6dc9357SAndroid Build Coastguard Worker       s.RemoveChar(L'&');
1197*f6dc9357SAndroid Build Coastguard Worker       menu.AppendItem(flags, cmd, s);
1198*f6dc9357SAndroid Build Coastguard Worker       numMenuItems++;
1199*f6dc9357SAndroid Build Coastguard Worker     }
1200*f6dc9357SAndroid Build Coastguard Worker     // default item is useless for us
1201*f6dc9357SAndroid Build Coastguard Worker     /*
1202*f6dc9357SAndroid Build Coastguard Worker     if (defaultCmd != 0)
1203*f6dc9357SAndroid Build Coastguard Worker       SetMenuDefaultItem(menu, (unsigned)defaultCmd,
1204*f6dc9357SAndroid Build Coastguard Worker         FALSE); // byPos
1205*f6dc9357SAndroid Build Coastguard Worker     */
1206*f6dc9357SAndroid Build Coastguard Worker     /* hwnd for TrackPopupMenuEx(): DOCS:
1207*f6dc9357SAndroid Build Coastguard Worker       A handle to the window that owns the shortcut menu.
1208*f6dc9357SAndroid Build Coastguard Worker       This window receives all messages from the menu.
1209*f6dc9357SAndroid Build Coastguard Worker       The window does not receive a WM_COMMAND message from the menu
1210*f6dc9357SAndroid Build Coastguard Worker       until the function returns.
1211*f6dc9357SAndroid Build Coastguard Worker       If you specify TPM_NONOTIFY in the fuFlags parameter,
1212*f6dc9357SAndroid Build Coastguard Worker       the function does not send messages to the window identified by hwnd.
1213*f6dc9357SAndroid Build Coastguard Worker     */
1214*f6dc9357SAndroid Build Coastguard Worker     if (numMenuItems == 0)
1215*f6dc9357SAndroid Build Coastguard Worker       return true;
1216*f6dc9357SAndroid Build Coastguard Worker     menuResult = menu.Track(TPM_LEFTALIGN | TPM_RETURNCMD | TPM_NONOTIFY,
1217*f6dc9357SAndroid Build Coastguard Worker         xPos, yPos, *this);
1218*f6dc9357SAndroid Build Coastguard Worker     /* menu.Track() return value is zero, if the user cancels
1219*f6dc9357SAndroid Build Coastguard Worker        the menu without making a selection, or if an error occurs */
1220*f6dc9357SAndroid Build Coastguard Worker     if (menuResult <= 0)
1221*f6dc9357SAndroid Build Coastguard Worker       return true;
1222*f6dc9357SAndroid Build Coastguard Worker   }
1223*f6dc9357SAndroid Build Coastguard Worker 
1224*f6dc9357SAndroid Build Coastguard Worker   if (menuResult == k_CmdId_Delete)
1225*f6dc9357SAndroid Build Coastguard Worker   {
1226*f6dc9357SAndroid Build Coastguard Worker     OnDelete(/* !IsKeyDown(VK_SHIFT) */);
1227*f6dc9357SAndroid Build Coastguard Worker     return true;
1228*f6dc9357SAndroid Build Coastguard Worker   }
1229*f6dc9357SAndroid Build Coastguard Worker 
1230*f6dc9357SAndroid Build Coastguard Worker   if (indices.Size() <= 1)
1231*f6dc9357SAndroid Build Coastguard Worker   {
1232*f6dc9357SAndroid Build Coastguard Worker     UString fullPath = DirPrefix;
1233*f6dc9357SAndroid Build Coastguard Worker     if (indices.Size() != 0)
1234*f6dc9357SAndroid Build Coastguard Worker     {
1235*f6dc9357SAndroid Build Coastguard Worker       const CBrowseItem &bi = _items[indices[0]];
1236*f6dc9357SAndroid Build Coastguard Worker       const CFileInfo &file = _files[bi.MainFileIndex];
1237*f6dc9357SAndroid Build Coastguard Worker       if (file.HasReparsePoint())
1238*f6dc9357SAndroid Build Coastguard Worker       {
1239*f6dc9357SAndroid Build Coastguard Worker         // we don't want external program was used to work with Links
1240*f6dc9357SAndroid Build Coastguard Worker         ShowErrorMessage(*this, k_Message_Link_operation_was_Blocked);
1241*f6dc9357SAndroid Build Coastguard Worker         return true;
1242*f6dc9357SAndroid Build Coastguard Worker       }
1243*f6dc9357SAndroid Build Coastguard Worker       fullPath += fs2us(file.Name);
1244*f6dc9357SAndroid Build Coastguard Worker     }
1245*f6dc9357SAndroid Build Coastguard Worker     if (menuResult == k_CmdId_Open_Explorer)
1246*f6dc9357SAndroid Build Coastguard Worker     {
1247*f6dc9357SAndroid Build Coastguard Worker       StartApplicationDontWait(DirPrefix, fullPath, (HWND)*this);
1248*f6dc9357SAndroid Build Coastguard Worker       return true;
1249*f6dc9357SAndroid Build Coastguard Worker     }
1250*f6dc9357SAndroid Build Coastguard Worker 
1251*f6dc9357SAndroid Build Coastguard Worker     if (menuResult == k_CmdId_Open_7zip)
1252*f6dc9357SAndroid Build Coastguard Worker     {
1253*f6dc9357SAndroid Build Coastguard Worker       UString imageName = fs2us(NWindows::NDLL::GetModuleDirPrefix());
1254*f6dc9357SAndroid Build Coastguard Worker       imageName += "7zFM.exe";
1255*f6dc9357SAndroid Build Coastguard Worker       WRes wres;
1256*f6dc9357SAndroid Build Coastguard Worker       {
1257*f6dc9357SAndroid Build Coastguard Worker         CProcess process;
1258*f6dc9357SAndroid Build Coastguard Worker         wres = process.Create(imageName, GetQuotedString2(fullPath), NULL); // curDir
1259*f6dc9357SAndroid Build Coastguard Worker       }
1260*f6dc9357SAndroid Build Coastguard Worker       if (wres != 0)
1261*f6dc9357SAndroid Build Coastguard Worker       {
1262*f6dc9357SAndroid Build Coastguard Worker         const HRESULT hres = HRESULT_FROM_WIN32(wres);
1263*f6dc9357SAndroid Build Coastguard Worker         MessageBox_HResError(*this, hres, imageName);
1264*f6dc9357SAndroid Build Coastguard Worker       }
1265*f6dc9357SAndroid Build Coastguard Worker       return true;
1266*f6dc9357SAndroid Build Coastguard Worker     }
1267*f6dc9357SAndroid Build Coastguard Worker 
1268*f6dc9357SAndroid Build Coastguard Worker     if (indices.Size() == 1)
1269*f6dc9357SAndroid Build Coastguard Worker     if (menuResult == k_CmdId_Props)
1270*f6dc9357SAndroid Build Coastguard Worker     {
1271*f6dc9357SAndroid Build Coastguard Worker       const CBrowseItem &bi = _items[indices[0]];
1272*f6dc9357SAndroid Build Coastguard Worker       const CFileInfo &file = _files[bi.MainFileIndex];
1273*f6dc9357SAndroid Build Coastguard Worker       Show_FileProps_Window(file);
1274*f6dc9357SAndroid Build Coastguard Worker       return true;
1275*f6dc9357SAndroid Build Coastguard Worker     }
1276*f6dc9357SAndroid Build Coastguard Worker   }
1277*f6dc9357SAndroid Build Coastguard Worker 
1278*f6dc9357SAndroid Build Coastguard Worker   return true;
1279*f6dc9357SAndroid Build Coastguard Worker }
1280*f6dc9357SAndroid Build Coastguard Worker 
1281*f6dc9357SAndroid Build Coastguard Worker 
1282*f6dc9357SAndroid Build Coastguard Worker 
1283*f6dc9357SAndroid Build Coastguard Worker struct CWaitCursor2
1284*f6dc9357SAndroid Build Coastguard Worker {
1285*f6dc9357SAndroid Build Coastguard Worker   HCURSOR _waitCursor;
1286*f6dc9357SAndroid Build Coastguard Worker   HCURSOR _oldCursor;
1287*f6dc9357SAndroid Build Coastguard Worker 
CWaitCursor2CWaitCursor21288*f6dc9357SAndroid Build Coastguard Worker   CWaitCursor2():
1289*f6dc9357SAndroid Build Coastguard Worker       _waitCursor(NULL),
1290*f6dc9357SAndroid Build Coastguard Worker       _oldCursor(NULL)
1291*f6dc9357SAndroid Build Coastguard Worker     {}
SetCWaitCursor21292*f6dc9357SAndroid Build Coastguard Worker   void Set()
1293*f6dc9357SAndroid Build Coastguard Worker   {
1294*f6dc9357SAndroid Build Coastguard Worker     if (!_waitCursor)
1295*f6dc9357SAndroid Build Coastguard Worker     {
1296*f6dc9357SAndroid Build Coastguard Worker       _waitCursor = LoadCursor(NULL, IDC_WAIT);
1297*f6dc9357SAndroid Build Coastguard Worker       if (_waitCursor)
1298*f6dc9357SAndroid Build Coastguard Worker         _oldCursor = SetCursor(_waitCursor);
1299*f6dc9357SAndroid Build Coastguard Worker     }
1300*f6dc9357SAndroid Build Coastguard Worker   }
~CWaitCursor2CWaitCursor21301*f6dc9357SAndroid Build Coastguard Worker   ~CWaitCursor2()
1302*f6dc9357SAndroid Build Coastguard Worker   {
1303*f6dc9357SAndroid Build Coastguard Worker     if (_waitCursor)
1304*f6dc9357SAndroid Build Coastguard Worker       SetCursor(_oldCursor);
1305*f6dc9357SAndroid Build Coastguard Worker   }
1306*f6dc9357SAndroid Build Coastguard Worker };
1307*f6dc9357SAndroid Build Coastguard Worker 
1308*f6dc9357SAndroid Build Coastguard Worker 
OnOK()1309*f6dc9357SAndroid Build Coastguard Worker void CBrowseDialog2::OnOK()
1310*f6dc9357SAndroid Build Coastguard Worker {
1311*f6dc9357SAndroid Build Coastguard Worker   /* DOCS:
1312*f6dc9357SAndroid Build Coastguard Worker     If a dialog box or one of its controls currently has the input focus,
1313*f6dc9357SAndroid Build Coastguard Worker     then pressing the ENTER key causes Windows to send a WM_COMMAND message
1314*f6dc9357SAndroid Build Coastguard Worker     with the idItem (wParam) parameter set to the ID of the default command button.
1315*f6dc9357SAndroid Build Coastguard Worker     If the dialog box does not have a default command button,
1316*f6dc9357SAndroid Build Coastguard Worker     then the idItem parameter is set to IDOK by default.
1317*f6dc9357SAndroid Build Coastguard Worker 
1318*f6dc9357SAndroid Build Coastguard Worker     We process IDOK here for Enter pressing, because we have no DEFPUSHBUTTON.
1319*f6dc9357SAndroid Build Coastguard Worker   */
1320*f6dc9357SAndroid Build Coastguard Worker   if (GetFocus() == _list)
1321*f6dc9357SAndroid Build Coastguard Worker   {
1322*f6dc9357SAndroid Build Coastguard Worker     OnItemEnter();
1323*f6dc9357SAndroid Build Coastguard Worker     return;
1324*f6dc9357SAndroid Build Coastguard Worker   }
1325*f6dc9357SAndroid Build Coastguard Worker   // Enter can be pressed in another controls (Edit).
1326*f6dc9357SAndroid Build Coastguard Worker   // So we don't need End() call here
1327*f6dc9357SAndroid Build Coastguard Worker }
1328*f6dc9357SAndroid Build Coastguard Worker 
1329*f6dc9357SAndroid Build Coastguard Worker 
GetParentPath(const UString & path,UString & parentPrefix,UString & name)1330*f6dc9357SAndroid Build Coastguard Worker bool CBrowseDialog2::GetParentPath(const UString &path, UString &parentPrefix, UString &name)
1331*f6dc9357SAndroid Build Coastguard Worker {
1332*f6dc9357SAndroid Build Coastguard Worker   parentPrefix.Empty();
1333*f6dc9357SAndroid Build Coastguard Worker   name.Empty();
1334*f6dc9357SAndroid Build Coastguard Worker   if (path.IsEmpty())
1335*f6dc9357SAndroid Build Coastguard Worker     return false;
1336*f6dc9357SAndroid Build Coastguard Worker   if (_topDirPrefix == path)
1337*f6dc9357SAndroid Build Coastguard Worker     return false;
1338*f6dc9357SAndroid Build Coastguard Worker   UString s = path;
1339*f6dc9357SAndroid Build Coastguard Worker   if (IS_PATH_SEPAR(s.Back()))
1340*f6dc9357SAndroid Build Coastguard Worker     s.DeleteBack();
1341*f6dc9357SAndroid Build Coastguard Worker   if (s.IsEmpty())
1342*f6dc9357SAndroid Build Coastguard Worker     return false;
1343*f6dc9357SAndroid Build Coastguard Worker   if (IS_PATH_SEPAR(s.Back()))
1344*f6dc9357SAndroid Build Coastguard Worker     return false;
1345*f6dc9357SAndroid Build Coastguard Worker   const unsigned pos1 = (unsigned)(s.ReverseFind_PathSepar() + 1);
1346*f6dc9357SAndroid Build Coastguard Worker   parentPrefix.SetFrom(s, pos1);
1347*f6dc9357SAndroid Build Coastguard Worker   name = s.Ptr(pos1);
1348*f6dc9357SAndroid Build Coastguard Worker   return true;
1349*f6dc9357SAndroid Build Coastguard Worker }
1350*f6dc9357SAndroid Build Coastguard Worker 
1351*f6dc9357SAndroid Build Coastguard Worker 
CompareItems(LPARAM lParam1,LPARAM lParam2) const1352*f6dc9357SAndroid Build Coastguard Worker int CBrowseDialog2::CompareItems(LPARAM lParam1, LPARAM lParam2) const
1353*f6dc9357SAndroid Build Coastguard Worker {
1354*f6dc9357SAndroid Build Coastguard Worker   if (lParam1 == lParam2)      return 0;
1355*f6dc9357SAndroid Build Coastguard Worker   if (lParam1 == kParentIndex) return -1;
1356*f6dc9357SAndroid Build Coastguard Worker   if (lParam2 == kParentIndex) return 1;
1357*f6dc9357SAndroid Build Coastguard Worker 
1358*f6dc9357SAndroid Build Coastguard Worker   const int index1 = (int)lParam1;
1359*f6dc9357SAndroid Build Coastguard Worker   const int index2 = (int)lParam2;
1360*f6dc9357SAndroid Build Coastguard Worker 
1361*f6dc9357SAndroid Build Coastguard Worker   const CBrowseItem &item1 = _items[index1];
1362*f6dc9357SAndroid Build Coastguard Worker   const CBrowseItem &item2 = _items[index2];
1363*f6dc9357SAndroid Build Coastguard Worker 
1364*f6dc9357SAndroid Build Coastguard Worker   const CFileInfo &f1 = _files[item1.MainFileIndex];
1365*f6dc9357SAndroid Build Coastguard Worker   const CFileInfo &f2 = _files[item2.MainFileIndex];
1366*f6dc9357SAndroid Build Coastguard Worker 
1367*f6dc9357SAndroid Build Coastguard Worker   const bool isDir2 = f2.IsDir();
1368*f6dc9357SAndroid Build Coastguard Worker   if (f1.IsDir())
1369*f6dc9357SAndroid Build Coastguard Worker   {
1370*f6dc9357SAndroid Build Coastguard Worker     if (!isDir2) return -1;
1371*f6dc9357SAndroid Build Coastguard Worker   }
1372*f6dc9357SAndroid Build Coastguard Worker   else if (isDir2) return 1;
1373*f6dc9357SAndroid Build Coastguard Worker 
1374*f6dc9357SAndroid Build Coastguard Worker   const int res2 = MyCompare(index1, index2);
1375*f6dc9357SAndroid Build Coastguard Worker   int res = 0;
1376*f6dc9357SAndroid Build Coastguard Worker   switch (_sortIndex)
1377*f6dc9357SAndroid Build Coastguard Worker   {
1378*f6dc9357SAndroid Build Coastguard Worker     case 0: res = CompareFileNames(fs2us(f1.Name), fs2us(f2.Name)); break;
1379*f6dc9357SAndroid Build Coastguard Worker     case 1: res = CompareFileTime(&f1.MTime, &f2.MTime); break;
1380*f6dc9357SAndroid Build Coastguard Worker     case 2: res = MyCompare(item1.Size, item2.Size); break;
1381*f6dc9357SAndroid Build Coastguard Worker     case 3: res = MyCompare(item1.NumFiles, item2.NumFiles); break;
1382*f6dc9357SAndroid Build Coastguard Worker     case 4: res = MyCompare(item1.NumDirs, item2.NumDirs); break;
1383*f6dc9357SAndroid Build Coastguard Worker     case 5:
1384*f6dc9357SAndroid Build Coastguard Worker     {
1385*f6dc9357SAndroid Build Coastguard Worker       const int sub1 = item1.SubFileIndex;
1386*f6dc9357SAndroid Build Coastguard Worker       const int sub2 = item2.SubFileIndex;
1387*f6dc9357SAndroid Build Coastguard Worker       if (sub1 < 0)
1388*f6dc9357SAndroid Build Coastguard Worker       {
1389*f6dc9357SAndroid Build Coastguard Worker         if (sub2 >= 0)
1390*f6dc9357SAndroid Build Coastguard Worker           res = -1;
1391*f6dc9357SAndroid Build Coastguard Worker       }
1392*f6dc9357SAndroid Build Coastguard Worker       else if (sub2 < 0)
1393*f6dc9357SAndroid Build Coastguard Worker         res = 1;
1394*f6dc9357SAndroid Build Coastguard Worker       else
1395*f6dc9357SAndroid Build Coastguard Worker         res = CompareFileNames(fs2us(_files[sub1].Name), fs2us(_files[sub2].Name));
1396*f6dc9357SAndroid Build Coastguard Worker       break;
1397*f6dc9357SAndroid Build Coastguard Worker     }
1398*f6dc9357SAndroid Build Coastguard Worker   }
1399*f6dc9357SAndroid Build Coastguard Worker   if (res == 0)
1400*f6dc9357SAndroid Build Coastguard Worker     res = res2;
1401*f6dc9357SAndroid Build Coastguard Worker   return _ascending ? res: -res;
1402*f6dc9357SAndroid Build Coastguard Worker }
1403*f6dc9357SAndroid Build Coastguard Worker 
CompareItems2(LPARAM lParam1,LPARAM lParam2,LPARAM lpData)1404*f6dc9357SAndroid Build Coastguard Worker static int CALLBACK CompareItems2(LPARAM lParam1, LPARAM lParam2, LPARAM lpData)
1405*f6dc9357SAndroid Build Coastguard Worker {
1406*f6dc9357SAndroid Build Coastguard Worker   return ((CBrowseDialog2 *)lpData)->CompareItems(lParam1, lParam2);
1407*f6dc9357SAndroid Build Coastguard Worker }
1408*f6dc9357SAndroid Build Coastguard Worker 
1409*f6dc9357SAndroid Build Coastguard Worker 
FindNonHexChar_F(const FChar * s)1410*f6dc9357SAndroid Build Coastguard Worker static const FChar *FindNonHexChar_F(const FChar *s) throw()
1411*f6dc9357SAndroid Build Coastguard Worker {
1412*f6dc9357SAndroid Build Coastguard Worker   for (;;)
1413*f6dc9357SAndroid Build Coastguard Worker   {
1414*f6dc9357SAndroid Build Coastguard Worker     const FChar c = (FChar)*s++; // pointer can go 1 byte after end
1415*f6dc9357SAndroid Build Coastguard Worker     if ( (c < '0' || c > '9')
1416*f6dc9357SAndroid Build Coastguard Worker       && (c < 'a' || c > 'z')
1417*f6dc9357SAndroid Build Coastguard Worker       && (c < 'A' || c > 'Z'))
1418*f6dc9357SAndroid Build Coastguard Worker     return s - 1;
1419*f6dc9357SAndroid Build Coastguard Worker   }
1420*f6dc9357SAndroid Build Coastguard Worker }
1421*f6dc9357SAndroid Build Coastguard Worker 
1422*f6dc9357SAndroid Build Coastguard Worker 
Reload_WithErrorMessage()1423*f6dc9357SAndroid Build Coastguard Worker void CBrowseDialog2::Reload_WithErrorMessage()
1424*f6dc9357SAndroid Build Coastguard Worker {
1425*f6dc9357SAndroid Build Coastguard Worker   const HRESULT res = Reload();
1426*f6dc9357SAndroid Build Coastguard Worker   if (res != S_OK)
1427*f6dc9357SAndroid Build Coastguard Worker     MessageBox_HResError(*this, res, DirPrefix);
1428*f6dc9357SAndroid Build Coastguard Worker }
1429*f6dc9357SAndroid Build Coastguard Worker 
ChangeSorting_and_Reload(int columnIndex)1430*f6dc9357SAndroid Build Coastguard Worker void CBrowseDialog2::ChangeSorting_and_Reload(int columnIndex)
1431*f6dc9357SAndroid Build Coastguard Worker {
1432*f6dc9357SAndroid Build Coastguard Worker   if (columnIndex == _sortIndex)
1433*f6dc9357SAndroid Build Coastguard Worker     _ascending = !_ascending;
1434*f6dc9357SAndroid Build Coastguard Worker   else
1435*f6dc9357SAndroid Build Coastguard Worker   {
1436*f6dc9357SAndroid Build Coastguard Worker     _ascending = (columnIndex == 0 || columnIndex == _columnIndex_fileNameInDir); // for name columns
1437*f6dc9357SAndroid Build Coastguard Worker     _sortIndex = columnIndex;
1438*f6dc9357SAndroid Build Coastguard Worker   }
1439*f6dc9357SAndroid Build Coastguard Worker   Reload_WithErrorMessage();
1440*f6dc9357SAndroid Build Coastguard Worker }
1441*f6dc9357SAndroid Build Coastguard Worker 
1442*f6dc9357SAndroid Build Coastguard Worker 
1443*f6dc9357SAndroid Build Coastguard Worker // Reload changes DirPrefix. Don't send DirPrefix in pathPrefix parameter
Reload(const UString & pathPrefix,const UString & selectedName)1444*f6dc9357SAndroid Build Coastguard Worker HRESULT CBrowseDialog2::Reload(const UString &pathPrefix, const UString &selectedName)
1445*f6dc9357SAndroid Build Coastguard Worker {
1446*f6dc9357SAndroid Build Coastguard Worker   UStringVector selectedVector;
1447*f6dc9357SAndroid Build Coastguard Worker   if (!selectedName.IsEmpty())
1448*f6dc9357SAndroid Build Coastguard Worker     selectedVector.Add(selectedName);
1449*f6dc9357SAndroid Build Coastguard Worker   return Reload(pathPrefix, selectedVector, selectedName);
1450*f6dc9357SAndroid Build Coastguard Worker }
1451*f6dc9357SAndroid Build Coastguard Worker 
1452*f6dc9357SAndroid Build Coastguard Worker 
Reload(const UString & pathPrefix,const UStringVector & selectedVector2,const UString & focusedName)1453*f6dc9357SAndroid Build Coastguard Worker HRESULT CBrowseDialog2::Reload(const UString &pathPrefix, const UStringVector &selectedVector2, const UString &focusedName)
1454*f6dc9357SAndroid Build Coastguard Worker {
1455*f6dc9357SAndroid Build Coastguard Worker   UStringVector selectedVector = selectedVector2;
1456*f6dc9357SAndroid Build Coastguard Worker   selectedVector.Sort();
1457*f6dc9357SAndroid Build Coastguard Worker   CObjectVector<CFileInfo> files;
1458*f6dc9357SAndroid Build Coastguard Worker   CRecordVector<CBrowseItem> items;
1459*f6dc9357SAndroid Build Coastguard Worker   CWaitCursor2 waitCursor;
1460*f6dc9357SAndroid Build Coastguard Worker 
1461*f6dc9357SAndroid Build Coastguard Worker   #ifndef UNDER_CE
1462*f6dc9357SAndroid Build Coastguard Worker   bool isDrive = false;
1463*f6dc9357SAndroid Build Coastguard Worker   if (pathPrefix.IsEmpty() || pathPrefix.IsEqualTo(kSuperPathPrefix))
1464*f6dc9357SAndroid Build Coastguard Worker   {
1465*f6dc9357SAndroid Build Coastguard Worker     isDrive = true;
1466*f6dc9357SAndroid Build Coastguard Worker     FStringVector drives;
1467*f6dc9357SAndroid Build Coastguard Worker     if (!MyGetLogicalDriveStrings(drives))
1468*f6dc9357SAndroid Build Coastguard Worker       return GetLastError_noZero_HRESULT();
1469*f6dc9357SAndroid Build Coastguard Worker     FOR_VECTOR (i, drives)
1470*f6dc9357SAndroid Build Coastguard Worker     {
1471*f6dc9357SAndroid Build Coastguard Worker       const FString &d = drives[i];
1472*f6dc9357SAndroid Build Coastguard Worker       if (d.Len() < 2 || d.Back() != '\\')
1473*f6dc9357SAndroid Build Coastguard Worker         return E_FAIL;
1474*f6dc9357SAndroid Build Coastguard Worker       CBrowseItem item;
1475*f6dc9357SAndroid Build Coastguard Worker       item.MainFileIndex = files.Size();
1476*f6dc9357SAndroid Build Coastguard Worker       CFileInfo &fi = files.AddNew();
1477*f6dc9357SAndroid Build Coastguard Worker       fi.SetAsDir();
1478*f6dc9357SAndroid Build Coastguard Worker       fi.Name = d;
1479*f6dc9357SAndroid Build Coastguard Worker       fi.Name.DeleteBack();
1480*f6dc9357SAndroid Build Coastguard Worker       items.Add(item);
1481*f6dc9357SAndroid Build Coastguard Worker     }
1482*f6dc9357SAndroid Build Coastguard Worker   }
1483*f6dc9357SAndroid Build Coastguard Worker   else
1484*f6dc9357SAndroid Build Coastguard Worker   #endif
1485*f6dc9357SAndroid Build Coastguard Worker   {
1486*f6dc9357SAndroid Build Coastguard Worker     {
1487*f6dc9357SAndroid Build Coastguard Worker       CEnumerator enumerator;
1488*f6dc9357SAndroid Build Coastguard Worker       enumerator.SetDirPrefix(us2fs(pathPrefix));
1489*f6dc9357SAndroid Build Coastguard Worker       CFileInfo fi;
1490*f6dc9357SAndroid Build Coastguard Worker       FString tail;
1491*f6dc9357SAndroid Build Coastguard Worker 
1492*f6dc9357SAndroid Build Coastguard Worker       const bool isTempFolder = (
1493*f6dc9357SAndroid Build Coastguard Worker           // TempMode &&
1494*f6dc9357SAndroid Build Coastguard Worker           IsExactTempFolder(pathPrefix)
1495*f6dc9357SAndroid Build Coastguard Worker           );
1496*f6dc9357SAndroid Build Coastguard Worker       for (;;)
1497*f6dc9357SAndroid Build Coastguard Worker       {
1498*f6dc9357SAndroid Build Coastguard Worker         {
1499*f6dc9357SAndroid Build Coastguard Worker           bool found;
1500*f6dc9357SAndroid Build Coastguard Worker           if (!enumerator.Next(fi, found))
1501*f6dc9357SAndroid Build Coastguard Worker             return GetLastError_noZero_HRESULT();
1502*f6dc9357SAndroid Build Coastguard Worker           if (!found)
1503*f6dc9357SAndroid Build Coastguard Worker             break;
1504*f6dc9357SAndroid Build Coastguard Worker         }
1505*f6dc9357SAndroid Build Coastguard Worker         if (isTempFolder)
1506*f6dc9357SAndroid Build Coastguard Worker         {
1507*f6dc9357SAndroid Build Coastguard Worker           // if (!Show_Non7zDirs_InTemp)
1508*f6dc9357SAndroid Build Coastguard Worker           {
1509*f6dc9357SAndroid Build Coastguard Worker             if (!fi.Name.IsPrefixedBy_Ascii_NoCase("7z"))
1510*f6dc9357SAndroid Build Coastguard Worker               continue;
1511*f6dc9357SAndroid Build Coastguard Worker             tail = fi.Name.Ptr(2);
1512*f6dc9357SAndroid Build Coastguard Worker             if ( !tail.IsPrefixedBy_Ascii_NoCase("E") // drag and drop / Copy / create to email
1513*f6dc9357SAndroid Build Coastguard Worker               && !tail.IsPrefixedBy_Ascii_NoCase("O") // open
1514*f6dc9357SAndroid Build Coastguard Worker               && !tail.IsPrefixedBy_Ascii_NoCase("S")) // SFXSetup
1515*f6dc9357SAndroid Build Coastguard Worker                continue;
1516*f6dc9357SAndroid Build Coastguard Worker             const FChar *beg = tail.Ptr(1);
1517*f6dc9357SAndroid Build Coastguard Worker             const FChar *end = FindNonHexChar_F(beg);
1518*f6dc9357SAndroid Build Coastguard Worker             if (end - beg != 8 || *end != 0)
1519*f6dc9357SAndroid Build Coastguard Worker               continue;
1520*f6dc9357SAndroid Build Coastguard Worker           }
1521*f6dc9357SAndroid Build Coastguard Worker         }
1522*f6dc9357SAndroid Build Coastguard Worker         CBrowseItem item;
1523*f6dc9357SAndroid Build Coastguard Worker         item.MainFileIndex = files.Size();
1524*f6dc9357SAndroid Build Coastguard Worker         item.Size = fi.Size;
1525*f6dc9357SAndroid Build Coastguard Worker         files.Add(fi);
1526*f6dc9357SAndroid Build Coastguard Worker         items.Add(item);
1527*f6dc9357SAndroid Build Coastguard Worker       }
1528*f6dc9357SAndroid Build Coastguard Worker     }
1529*f6dc9357SAndroid Build Coastguard Worker 
1530*f6dc9357SAndroid Build Coastguard Worker     UInt64 cnt = items.Size();
1531*f6dc9357SAndroid Build Coastguard Worker     // if (TempMode)
1532*f6dc9357SAndroid Build Coastguard Worker     {
1533*f6dc9357SAndroid Build Coastguard Worker       FOR_VECTOR (i, items)
1534*f6dc9357SAndroid Build Coastguard Worker       {
1535*f6dc9357SAndroid Build Coastguard Worker         CBrowseItem &item = items[i];
1536*f6dc9357SAndroid Build Coastguard Worker         const CFileInfo &fi = files[item.MainFileIndex];
1537*f6dc9357SAndroid Build Coastguard Worker         if (!fi.IsDir() || fi.HasReparsePoint())
1538*f6dc9357SAndroid Build Coastguard Worker           continue;
1539*f6dc9357SAndroid Build Coastguard Worker 
1540*f6dc9357SAndroid Build Coastguard Worker         CBrowseEnumerator enumer;
1541*f6dc9357SAndroid Build Coastguard Worker         // we need to keep MainFileIndex and Size value of item:
1542*f6dc9357SAndroid Build Coastguard Worker         enumer.bi = item; // don't change it
1543*f6dc9357SAndroid Build Coastguard Worker         enumer.Path = us2fs(pathPrefix);
1544*f6dc9357SAndroid Build Coastguard Worker         enumer.Path += fi.Name;
1545*f6dc9357SAndroid Build Coastguard Worker         enumer.Enumerate(0); // level
1546*f6dc9357SAndroid Build Coastguard Worker         item = enumer.bi;
1547*f6dc9357SAndroid Build Coastguard Worker         if (item.NumRootItems == 1)
1548*f6dc9357SAndroid Build Coastguard Worker         {
1549*f6dc9357SAndroid Build Coastguard Worker           item.SubFileIndex = (int)files.Size();
1550*f6dc9357SAndroid Build Coastguard Worker           files.Add(enumer.fi_SubFile);
1551*f6dc9357SAndroid Build Coastguard Worker         }
1552*f6dc9357SAndroid Build Coastguard Worker         cnt += item.NumDirs;
1553*f6dc9357SAndroid Build Coastguard Worker         cnt += item.NumFiles;
1554*f6dc9357SAndroid Build Coastguard Worker         if (cnt > 1000)
1555*f6dc9357SAndroid Build Coastguard Worker           waitCursor.Set();
1556*f6dc9357SAndroid Build Coastguard Worker       }
1557*f6dc9357SAndroid Build Coastguard Worker     }
1558*f6dc9357SAndroid Build Coastguard Worker   }
1559*f6dc9357SAndroid Build Coastguard Worker   _items = items;
1560*f6dc9357SAndroid Build Coastguard Worker   _files = files;
1561*f6dc9357SAndroid Build Coastguard Worker 
1562*f6dc9357SAndroid Build Coastguard Worker   DirPrefix = pathPrefix;
1563*f6dc9357SAndroid Build Coastguard Worker 
1564*f6dc9357SAndroid Build Coastguard Worker   EnableItem(IDB_BROWSE2_PARENT, !IsExactTempFolder(pathPrefix));
1565*f6dc9357SAndroid Build Coastguard Worker 
1566*f6dc9357SAndroid Build Coastguard Worker   SetItemText(IDT_BROWSE2_FOLDER, DirPrefix);
1567*f6dc9357SAndroid Build Coastguard Worker 
1568*f6dc9357SAndroid Build Coastguard Worker   _list.SetRedraw(false);
1569*f6dc9357SAndroid Build Coastguard Worker   _list.DeleteAllItems();
1570*f6dc9357SAndroid Build Coastguard Worker 
1571*f6dc9357SAndroid Build Coastguard Worker   LVITEMW item;
1572*f6dc9357SAndroid Build Coastguard Worker 
1573*f6dc9357SAndroid Build Coastguard Worker   unsigned index = 0;
1574*f6dc9357SAndroid Build Coastguard Worker   int cursorIndex = -1;
1575*f6dc9357SAndroid Build Coastguard Worker 
1576*f6dc9357SAndroid Build Coastguard Worker   #ifndef Z7_SFX
1577*f6dc9357SAndroid Build Coastguard Worker   if (_showDots && _topDirPrefix != DirPrefix)
1578*f6dc9357SAndroid Build Coastguard Worker   {
1579*f6dc9357SAndroid Build Coastguard Worker     item.iItem = (int)index;
1580*f6dc9357SAndroid Build Coastguard Worker     const UString itemName ("..");
1581*f6dc9357SAndroid Build Coastguard Worker     if (focusedName == itemName)
1582*f6dc9357SAndroid Build Coastguard Worker       cursorIndex = (int)index;
1583*f6dc9357SAndroid Build Coastguard Worker     /*
1584*f6dc9357SAndroid Build Coastguard Worker     if (selectedVector.IsEmpty()
1585*f6dc9357SAndroid Build Coastguard Worker         // && focusedName.IsEmpty()
1586*f6dc9357SAndroid Build Coastguard Worker         // && focusedName == ".."
1587*f6dc9357SAndroid Build Coastguard Worker         )
1588*f6dc9357SAndroid Build Coastguard Worker       cursorIndex = (int)index;
1589*f6dc9357SAndroid Build Coastguard Worker     */
1590*f6dc9357SAndroid Build Coastguard Worker     item.mask = LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE;
1591*f6dc9357SAndroid Build Coastguard Worker     unsigned subItem = 0;
1592*f6dc9357SAndroid Build Coastguard Worker     item.iSubItem = (int)(subItem++);
1593*f6dc9357SAndroid Build Coastguard Worker     item.lParam = kParentIndex;
1594*f6dc9357SAndroid Build Coastguard Worker     item.pszText = itemName.Ptr_non_const();
1595*f6dc9357SAndroid Build Coastguard Worker     item.iImage = _extToIconMap.GetIconIndex(FILE_ATTRIBUTE_DIRECTORY, DirPrefix);
1596*f6dc9357SAndroid Build Coastguard Worker     if (item.iImage < 0)
1597*f6dc9357SAndroid Build Coastguard Worker       item.iImage = 0;
1598*f6dc9357SAndroid Build Coastguard Worker     _list.InsertItem(&item);
1599*f6dc9357SAndroid Build Coastguard Worker #if 0
1600*f6dc9357SAndroid Build Coastguard Worker     for (int k = 1; k < 6; k++)
1601*f6dc9357SAndroid Build Coastguard Worker       _list.SetSubItem(index, subItem++, L"2");
1602*f6dc9357SAndroid Build Coastguard Worker #endif
1603*f6dc9357SAndroid Build Coastguard Worker     index++;
1604*f6dc9357SAndroid Build Coastguard Worker   }
1605*f6dc9357SAndroid Build Coastguard Worker   #endif
1606*f6dc9357SAndroid Build Coastguard Worker 
1607*f6dc9357SAndroid Build Coastguard Worker   for (unsigned i = 0; i < _items.Size(); i++, index++)
1608*f6dc9357SAndroid Build Coastguard Worker   {
1609*f6dc9357SAndroid Build Coastguard Worker     item.iItem = (int)index;
1610*f6dc9357SAndroid Build Coastguard Worker     const CBrowseItem &bi = _items[i];
1611*f6dc9357SAndroid Build Coastguard Worker     const CFileInfo &fi = _files[bi.MainFileIndex];
1612*f6dc9357SAndroid Build Coastguard Worker     const UString name = fs2us(fi.Name);
1613*f6dc9357SAndroid Build Coastguard Worker     // if (!selectedName.IsEmpty() && CompareFileNames(name, selectedName) == 0)
1614*f6dc9357SAndroid Build Coastguard Worker     item.mask = LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE;
1615*f6dc9357SAndroid Build Coastguard Worker     item.state = 0;
1616*f6dc9357SAndroid Build Coastguard Worker     if (selectedVector.FindInSorted(name) != -1)
1617*f6dc9357SAndroid Build Coastguard Worker     {
1618*f6dc9357SAndroid Build Coastguard Worker       /*
1619*f6dc9357SAndroid Build Coastguard Worker       if (cursorIndex == -1)
1620*f6dc9357SAndroid Build Coastguard Worker         cursorIndex = (int)index;
1621*f6dc9357SAndroid Build Coastguard Worker       */
1622*f6dc9357SAndroid Build Coastguard Worker       item.mask |= LVIF_STATE;
1623*f6dc9357SAndroid Build Coastguard Worker       item.state |= LVIS_SELECTED;
1624*f6dc9357SAndroid Build Coastguard Worker     }
1625*f6dc9357SAndroid Build Coastguard Worker     if (focusedName == name)
1626*f6dc9357SAndroid Build Coastguard Worker     {
1627*f6dc9357SAndroid Build Coastguard Worker       if (cursorIndex == -1)
1628*f6dc9357SAndroid Build Coastguard Worker         cursorIndex = (int)index;
1629*f6dc9357SAndroid Build Coastguard Worker       item.mask |= LVIF_STATE;
1630*f6dc9357SAndroid Build Coastguard Worker       item.state |= LVIS_FOCUSED;
1631*f6dc9357SAndroid Build Coastguard Worker     }
1632*f6dc9357SAndroid Build Coastguard Worker 
1633*f6dc9357SAndroid Build Coastguard Worker     unsigned subItem = 0;
1634*f6dc9357SAndroid Build Coastguard Worker     item.iSubItem = (int)(subItem++);
1635*f6dc9357SAndroid Build Coastguard Worker     item.lParam = (LPARAM)i;
1636*f6dc9357SAndroid Build Coastguard Worker     item.pszText = name.Ptr_non_const();
1637*f6dc9357SAndroid Build Coastguard Worker 
1638*f6dc9357SAndroid Build Coastguard Worker     const UString fullPath = DirPrefix + name;
1639*f6dc9357SAndroid Build Coastguard Worker     #ifndef UNDER_CE
1640*f6dc9357SAndroid Build Coastguard Worker     if (isDrive)
1641*f6dc9357SAndroid Build Coastguard Worker     {
1642*f6dc9357SAndroid Build Coastguard Worker       item.iImage = Shell_GetFileInfo_SysIconIndex_for_Path(
1643*f6dc9357SAndroid Build Coastguard Worker           fi.Name + FCHAR_PATH_SEPARATOR,
1644*f6dc9357SAndroid Build Coastguard Worker           FILE_ATTRIBUTE_DIRECTORY);
1645*f6dc9357SAndroid Build Coastguard Worker     }
1646*f6dc9357SAndroid Build Coastguard Worker     else
1647*f6dc9357SAndroid Build Coastguard Worker     #endif
1648*f6dc9357SAndroid Build Coastguard Worker       item.iImage = _extToIconMap.GetIconIndex(fi.Attrib, fullPath);
1649*f6dc9357SAndroid Build Coastguard Worker     if (item.iImage < 0)
1650*f6dc9357SAndroid Build Coastguard Worker         item.iImage = 0;
1651*f6dc9357SAndroid Build Coastguard Worker     _list.InsertItem(&item);
1652*f6dc9357SAndroid Build Coastguard Worker     wchar_t s[64];
1653*f6dc9357SAndroid Build Coastguard Worker     {
1654*f6dc9357SAndroid Build Coastguard Worker       s[0] = 0;
1655*f6dc9357SAndroid Build Coastguard Worker       if (!FILETIME_IsZero(fi.MTime))
1656*f6dc9357SAndroid Build Coastguard Worker         ConvertUtcFileTimeToString(fi.MTime, s,
1657*f6dc9357SAndroid Build Coastguard Worker             #ifndef UNDER_CE
1658*f6dc9357SAndroid Build Coastguard Worker               kTimestampPrintLevel_MIN
1659*f6dc9357SAndroid Build Coastguard Worker             #else
1660*f6dc9357SAndroid Build Coastguard Worker               kTimestampPrintLevel_DAY
1661*f6dc9357SAndroid Build Coastguard Worker             #endif
1662*f6dc9357SAndroid Build Coastguard Worker               );
1663*f6dc9357SAndroid Build Coastguard Worker       _list.SetSubItem(index, subItem++, s);
1664*f6dc9357SAndroid Build Coastguard Worker     }
1665*f6dc9357SAndroid Build Coastguard Worker     {
1666*f6dc9357SAndroid Build Coastguard Worker       s[0] = 0;
1667*f6dc9357SAndroid Build Coastguard Worker       Browse_ConvertSizeToString(bi, s);
1668*f6dc9357SAndroid Build Coastguard Worker       _list.SetSubItem(index, subItem++, s);
1669*f6dc9357SAndroid Build Coastguard Worker     }
1670*f6dc9357SAndroid Build Coastguard Worker     if (_columnIndex_NumFiles >= 0)
1671*f6dc9357SAndroid Build Coastguard Worker     {
1672*f6dc9357SAndroid Build Coastguard Worker       UString s2;
1673*f6dc9357SAndroid Build Coastguard Worker       if (fi.HasReparsePoint())
1674*f6dc9357SAndroid Build Coastguard Worker       {
1675*f6dc9357SAndroid Build Coastguard Worker         s2 = "Link";
1676*f6dc9357SAndroid Build Coastguard Worker       }
1677*f6dc9357SAndroid Build Coastguard Worker       else if (bi.NumFiles != 0)
1678*f6dc9357SAndroid Build Coastguard Worker       {
1679*f6dc9357SAndroid Build Coastguard Worker         s2.Add_UInt32(bi.NumFiles);
1680*f6dc9357SAndroid Build Coastguard Worker         if (bi.WasInterrupted)
1681*f6dc9357SAndroid Build Coastguard Worker           s2 += "+";
1682*f6dc9357SAndroid Build Coastguard Worker       }
1683*f6dc9357SAndroid Build Coastguard Worker       _list.SetSubItem(index, subItem, s2);
1684*f6dc9357SAndroid Build Coastguard Worker     }
1685*f6dc9357SAndroid Build Coastguard Worker     subItem++;
1686*f6dc9357SAndroid Build Coastguard Worker     if (_columnIndex_NumDirs >= 0 && bi.NumDirs != 0)
1687*f6dc9357SAndroid Build Coastguard Worker     {
1688*f6dc9357SAndroid Build Coastguard Worker       UString s2;
1689*f6dc9357SAndroid Build Coastguard Worker       s2.Add_UInt32(bi.NumDirs);
1690*f6dc9357SAndroid Build Coastguard Worker       if (bi.WasInterrupted)
1691*f6dc9357SAndroid Build Coastguard Worker         s2 += "+";
1692*f6dc9357SAndroid Build Coastguard Worker       _list.SetSubItem(index, subItem, s2);
1693*f6dc9357SAndroid Build Coastguard Worker     }
1694*f6dc9357SAndroid Build Coastguard Worker     subItem++;
1695*f6dc9357SAndroid Build Coastguard Worker     if (_columnIndex_fileNameInDir >= 0 && bi.SubFileIndex >= 0)
1696*f6dc9357SAndroid Build Coastguard Worker     {
1697*f6dc9357SAndroid Build Coastguard Worker       _list.SetSubItem(index, subItem, fs2us(_files[bi.SubFileIndex].Name));
1698*f6dc9357SAndroid Build Coastguard Worker     }
1699*f6dc9357SAndroid Build Coastguard Worker     subItem++;
1700*f6dc9357SAndroid Build Coastguard Worker   }
1701*f6dc9357SAndroid Build Coastguard Worker 
1702*f6dc9357SAndroid Build Coastguard Worker   if (_list.GetItemCount() > 0 && cursorIndex >= 0)
1703*f6dc9357SAndroid Build Coastguard Worker   {
1704*f6dc9357SAndroid Build Coastguard Worker     // _list.SetItemState_FocusedSelected(cursorIndex);
1705*f6dc9357SAndroid Build Coastguard Worker     // _list.SetItemState_Focused(cursorIndex);
1706*f6dc9357SAndroid Build Coastguard Worker   }
1707*f6dc9357SAndroid Build Coastguard Worker   _list.SortItems(CompareItems2, (LPARAM)this);
1708*f6dc9357SAndroid Build Coastguard Worker   if (_list.GetItemCount() > 0 && cursorIndex < 0)
1709*f6dc9357SAndroid Build Coastguard Worker   {
1710*f6dc9357SAndroid Build Coastguard Worker     if (selectedVector.IsEmpty())
1711*f6dc9357SAndroid Build Coastguard Worker       _list.SetItemState_FocusedSelected(0);
1712*f6dc9357SAndroid Build Coastguard Worker     else
1713*f6dc9357SAndroid Build Coastguard Worker        _list.SetItemState(0, LVIS_FOCUSED, LVIS_FOCUSED);
1714*f6dc9357SAndroid Build Coastguard Worker   }
1715*f6dc9357SAndroid Build Coastguard Worker   _list.EnsureVisible(_list.GetFocusedItem(), false);
1716*f6dc9357SAndroid Build Coastguard Worker   _list.SetRedraw(true);
1717*f6dc9357SAndroid Build Coastguard Worker   _list.InvalidateRect(NULL, true);
1718*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
1719*f6dc9357SAndroid Build Coastguard Worker }
1720*f6dc9357SAndroid Build Coastguard Worker 
1721*f6dc9357SAndroid Build Coastguard Worker 
1722*f6dc9357SAndroid Build Coastguard Worker 
Reload()1723*f6dc9357SAndroid Build Coastguard Worker HRESULT CBrowseDialog2::Reload()
1724*f6dc9357SAndroid Build Coastguard Worker {
1725*f6dc9357SAndroid Build Coastguard Worker   UStringVector selected;
1726*f6dc9357SAndroid Build Coastguard Worker   {
1727*f6dc9357SAndroid Build Coastguard Worker     CUIntVector indexes;
1728*f6dc9357SAndroid Build Coastguard Worker     GetSelected_RealIndexes(indexes);
1729*f6dc9357SAndroid Build Coastguard Worker     FOR_VECTOR (i, indexes)
1730*f6dc9357SAndroid Build Coastguard Worker       selected.Add(fs2us(Get_MainFileName_for_realIndex(indexes[i])));
1731*f6dc9357SAndroid Build Coastguard Worker   }
1732*f6dc9357SAndroid Build Coastguard Worker   UString focusedName;
1733*f6dc9357SAndroid Build Coastguard Worker   const int focusedItem = _list.GetFocusedItem();
1734*f6dc9357SAndroid Build Coastguard Worker   if (focusedItem >= 0)
1735*f6dc9357SAndroid Build Coastguard Worker   {
1736*f6dc9357SAndroid Build Coastguard Worker     const int realIndex = GetRealItemIndex(focusedItem);
1737*f6dc9357SAndroid Build Coastguard Worker     if (realIndex != kParentIndex)
1738*f6dc9357SAndroid Build Coastguard Worker       focusedName = fs2us(Get_MainFileName_for_realIndex((unsigned)realIndex));
1739*f6dc9357SAndroid Build Coastguard Worker   }
1740*f6dc9357SAndroid Build Coastguard Worker   const UString dirPathTemp = DirPrefix;
1741*f6dc9357SAndroid Build Coastguard Worker   return Reload(dirPathTemp, selected, focusedName);
1742*f6dc9357SAndroid Build Coastguard Worker }
1743*f6dc9357SAndroid Build Coastguard Worker 
1744*f6dc9357SAndroid Build Coastguard Worker 
OpenParentFolder()1745*f6dc9357SAndroid Build Coastguard Worker void CBrowseDialog2::OpenParentFolder()
1746*f6dc9357SAndroid Build Coastguard Worker {
1747*f6dc9357SAndroid Build Coastguard Worker #if 1 // 0 : for debug
1748*f6dc9357SAndroid Build Coastguard Worker   // we don't allow to go to parent of TempFolder.
1749*f6dc9357SAndroid Build Coastguard Worker   // if (TempMode)
1750*f6dc9357SAndroid Build Coastguard Worker   {
1751*f6dc9357SAndroid Build Coastguard Worker     if (IsExactTempFolder(DirPrefix))
1752*f6dc9357SAndroid Build Coastguard Worker       return;
1753*f6dc9357SAndroid Build Coastguard Worker   }
1754*f6dc9357SAndroid Build Coastguard Worker #endif
1755*f6dc9357SAndroid Build Coastguard Worker 
1756*f6dc9357SAndroid Build Coastguard Worker   UString parent, selected;
1757*f6dc9357SAndroid Build Coastguard Worker   if (GetParentPath(DirPrefix, parent, selected))
1758*f6dc9357SAndroid Build Coastguard Worker     Reload(parent, selected);
1759*f6dc9357SAndroid Build Coastguard Worker }
1760*f6dc9357SAndroid Build Coastguard Worker 
1761*f6dc9357SAndroid Build Coastguard Worker 
OnItemEnter()1762*f6dc9357SAndroid Build Coastguard Worker void CBrowseDialog2::OnItemEnter()
1763*f6dc9357SAndroid Build Coastguard Worker {
1764*f6dc9357SAndroid Build Coastguard Worker   const bool alt = IsKeyDown(VK_MENU);
1765*f6dc9357SAndroid Build Coastguard Worker   const bool ctrl = IsKeyDown(VK_CONTROL);
1766*f6dc9357SAndroid Build Coastguard Worker   const bool shift = IsKeyDown(VK_SHIFT);
1767*f6dc9357SAndroid Build Coastguard Worker 
1768*f6dc9357SAndroid Build Coastguard Worker   const int index = _list.GetNextSelectedItem(-1);
1769*f6dc9357SAndroid Build Coastguard Worker   if (index < 0)
1770*f6dc9357SAndroid Build Coastguard Worker     return;
1771*f6dc9357SAndroid Build Coastguard Worker   if (_list.GetNextSelectedItem(index) >= 0)
1772*f6dc9357SAndroid Build Coastguard Worker     return; // more than one selected
1773*f6dc9357SAndroid Build Coastguard Worker   const int realIndex = GetRealItemIndex(index);
1774*f6dc9357SAndroid Build Coastguard Worker   if (realIndex == kParentIndex)
1775*f6dc9357SAndroid Build Coastguard Worker     OpenParentFolder();
1776*f6dc9357SAndroid Build Coastguard Worker   else
1777*f6dc9357SAndroid Build Coastguard Worker   {
1778*f6dc9357SAndroid Build Coastguard Worker     const CBrowseItem &bi = _items[realIndex];
1779*f6dc9357SAndroid Build Coastguard Worker     const CFileInfo &file = _files[bi.MainFileIndex];
1780*f6dc9357SAndroid Build Coastguard Worker     if (alt)
1781*f6dc9357SAndroid Build Coastguard Worker     {
1782*f6dc9357SAndroid Build Coastguard Worker       Show_FileProps_Window(file);
1783*f6dc9357SAndroid Build Coastguard Worker       return;
1784*f6dc9357SAndroid Build Coastguard Worker     }
1785*f6dc9357SAndroid Build Coastguard Worker     if (file.HasReparsePoint())
1786*f6dc9357SAndroid Build Coastguard Worker     {
1787*f6dc9357SAndroid Build Coastguard Worker       // we don't want Link open operation,
1788*f6dc9357SAndroid Build Coastguard Worker       // because user can think that it's usual folder/file (non-link).
1789*f6dc9357SAndroid Build Coastguard Worker       ShowErrorMessage(*this, k_Message_Link_operation_was_Blocked);
1790*f6dc9357SAndroid Build Coastguard Worker       return;
1791*f6dc9357SAndroid Build Coastguard Worker     }
1792*f6dc9357SAndroid Build Coastguard Worker     bool needExternal = true;
1793*f6dc9357SAndroid Build Coastguard Worker     if (file.IsDir())
1794*f6dc9357SAndroid Build Coastguard Worker     {
1795*f6dc9357SAndroid Build Coastguard Worker       if (!shift || alt || ctrl) // open folder in Explorer:
1796*f6dc9357SAndroid Build Coastguard Worker         needExternal = false;
1797*f6dc9357SAndroid Build Coastguard Worker     }
1798*f6dc9357SAndroid Build Coastguard Worker     const UString fullPath = DirPrefix + fs2us(file.Name);
1799*f6dc9357SAndroid Build Coastguard Worker     if (needExternal)
1800*f6dc9357SAndroid Build Coastguard Worker     {
1801*f6dc9357SAndroid Build Coastguard Worker       StartApplicationDontWait(DirPrefix, fullPath, (HWND)*this);
1802*f6dc9357SAndroid Build Coastguard Worker       return;
1803*f6dc9357SAndroid Build Coastguard Worker     }
1804*f6dc9357SAndroid Build Coastguard Worker     UString s = fullPath;
1805*f6dc9357SAndroid Build Coastguard Worker     s.Add_PathSepar();
1806*f6dc9357SAndroid Build Coastguard Worker     const HRESULT res = Reload(s, UString());
1807*f6dc9357SAndroid Build Coastguard Worker     if (res != S_OK)
1808*f6dc9357SAndroid Build Coastguard Worker       MessageBox_HResError(*this, res, s);
1809*f6dc9357SAndroid Build Coastguard Worker     // SetPathEditText();
1810*f6dc9357SAndroid Build Coastguard Worker   }
1811*f6dc9357SAndroid Build Coastguard Worker }
1812*f6dc9357SAndroid Build Coastguard Worker 
1813*f6dc9357SAndroid Build Coastguard Worker 
MyBrowseForTempFolder(HWND owner)1814*f6dc9357SAndroid Build Coastguard Worker void MyBrowseForTempFolder(HWND owner)
1815*f6dc9357SAndroid Build Coastguard Worker {
1816*f6dc9357SAndroid Build Coastguard Worker   FString tempPathF;
1817*f6dc9357SAndroid Build Coastguard Worker   if (!NFile::NDir::MyGetTempPath(tempPathF) || tempPathF.IsEmpty())
1818*f6dc9357SAndroid Build Coastguard Worker   {
1819*f6dc9357SAndroid Build Coastguard Worker     MessageBox_LastError_path(owner, tempPathF);
1820*f6dc9357SAndroid Build Coastguard Worker     return;
1821*f6dc9357SAndroid Build Coastguard Worker   }
1822*f6dc9357SAndroid Build Coastguard Worker   CBrowseDialog2 dialog;
1823*f6dc9357SAndroid Build Coastguard Worker 
1824*f6dc9357SAndroid Build Coastguard Worker   LangString_OnlyFromLangFile(IDM_TEMP_DIR, dialog.Title);
1825*f6dc9357SAndroid Build Coastguard Worker   dialog.Title.Replace(L"...", L"");
1826*f6dc9357SAndroid Build Coastguard Worker   if (dialog.Title.IsEmpty())
1827*f6dc9357SAndroid Build Coastguard Worker     dialog.Title = "Delete Temporary Files";
1828*f6dc9357SAndroid Build Coastguard Worker 
1829*f6dc9357SAndroid Build Coastguard Worker   dialog.TempFolderPath = fs2us(tempPathF);
1830*f6dc9357SAndroid Build Coastguard Worker   dialog.Create(owner);
1831*f6dc9357SAndroid Build Coastguard Worker   // we can exit from dialog with 2 ways:
1832*f6dc9357SAndroid Build Coastguard Worker   // IDCANCEL : Esc Key, or close icons
1833*f6dc9357SAndroid Build Coastguard Worker   // IDCLOSE  : with Close button
1834*f6dc9357SAndroid Build Coastguard Worker }
1835