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