1*f6dc9357SAndroid Build Coastguard Worker // PanelFolderChange.cpp
2*f6dc9357SAndroid Build Coastguard Worker
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker
5*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/StringConvert.h"
6*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/Wildcard.h"
7*f6dc9357SAndroid Build Coastguard Worker
8*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/FileName.h"
9*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/FileDir.h"
10*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/PropVariant.h"
11*f6dc9357SAndroid Build Coastguard Worker
12*f6dc9357SAndroid Build Coastguard Worker #include "../../PropID.h"
13*f6dc9357SAndroid Build Coastguard Worker
14*f6dc9357SAndroid Build Coastguard Worker #ifdef UNDER_CE
15*f6dc9357SAndroid Build Coastguard Worker #include "FSFolder.h"
16*f6dc9357SAndroid Build Coastguard Worker #else
17*f6dc9357SAndroid Build Coastguard Worker #include "FSDrives.h"
18*f6dc9357SAndroid Build Coastguard Worker #endif
19*f6dc9357SAndroid Build Coastguard Worker #include "LangUtils.h"
20*f6dc9357SAndroid Build Coastguard Worker #include "ListViewDialog.h"
21*f6dc9357SAndroid Build Coastguard Worker #include "Panel.h"
22*f6dc9357SAndroid Build Coastguard Worker #include "RootFolder.h"
23*f6dc9357SAndroid Build Coastguard Worker #include "ViewSettings.h"
24*f6dc9357SAndroid Build Coastguard Worker
25*f6dc9357SAndroid Build Coastguard Worker #include "resource.h"
26*f6dc9357SAndroid Build Coastguard Worker
27*f6dc9357SAndroid Build Coastguard Worker using namespace NWindows;
28*f6dc9357SAndroid Build Coastguard Worker using namespace NFile;
29*f6dc9357SAndroid Build Coastguard Worker using namespace NFind;
30*f6dc9357SAndroid Build Coastguard Worker
ReleaseFolder()31*f6dc9357SAndroid Build Coastguard Worker void CPanel::ReleaseFolder()
32*f6dc9357SAndroid Build Coastguard Worker {
33*f6dc9357SAndroid Build Coastguard Worker DeleteListItems();
34*f6dc9357SAndroid Build Coastguard Worker
35*f6dc9357SAndroid Build Coastguard Worker _folder.Release();
36*f6dc9357SAndroid Build Coastguard Worker
37*f6dc9357SAndroid Build Coastguard Worker _folderCompare.Release();
38*f6dc9357SAndroid Build Coastguard Worker _folderGetItemName.Release();
39*f6dc9357SAndroid Build Coastguard Worker _folderRawProps.Release();
40*f6dc9357SAndroid Build Coastguard Worker _folderAltStreams.Release();
41*f6dc9357SAndroid Build Coastguard Worker _folderOperations.Release();
42*f6dc9357SAndroid Build Coastguard Worker
43*f6dc9357SAndroid Build Coastguard Worker _thereAreDeletedItems = false;
44*f6dc9357SAndroid Build Coastguard Worker }
45*f6dc9357SAndroid Build Coastguard Worker
SetNewFolder(IFolderFolder * newFolder)46*f6dc9357SAndroid Build Coastguard Worker void CPanel::SetNewFolder(IFolderFolder *newFolder)
47*f6dc9357SAndroid Build Coastguard Worker {
48*f6dc9357SAndroid Build Coastguard Worker ReleaseFolder();
49*f6dc9357SAndroid Build Coastguard Worker _folder = newFolder;
50*f6dc9357SAndroid Build Coastguard Worker if (_folder)
51*f6dc9357SAndroid Build Coastguard Worker {
52*f6dc9357SAndroid Build Coastguard Worker _folder.QueryInterface(IID_IFolderCompare, &_folderCompare);
53*f6dc9357SAndroid Build Coastguard Worker _folder.QueryInterface(IID_IFolderGetItemName, &_folderGetItemName);
54*f6dc9357SAndroid Build Coastguard Worker _folder.QueryInterface(IID_IArchiveGetRawProps, &_folderRawProps);
55*f6dc9357SAndroid Build Coastguard Worker _folder.QueryInterface(IID_IFolderAltStreams, &_folderAltStreams);
56*f6dc9357SAndroid Build Coastguard Worker _folder.QueryInterface(IID_IFolderOperations, &_folderOperations);
57*f6dc9357SAndroid Build Coastguard Worker }
58*f6dc9357SAndroid Build Coastguard Worker }
59*f6dc9357SAndroid Build Coastguard Worker
SetToRootFolder()60*f6dc9357SAndroid Build Coastguard Worker void CPanel::SetToRootFolder()
61*f6dc9357SAndroid Build Coastguard Worker {
62*f6dc9357SAndroid Build Coastguard Worker ReleaseFolder();
63*f6dc9357SAndroid Build Coastguard Worker _library.Free();
64*f6dc9357SAndroid Build Coastguard Worker
65*f6dc9357SAndroid Build Coastguard Worker CRootFolder *rootFolderSpec = new CRootFolder;
66*f6dc9357SAndroid Build Coastguard Worker SetNewFolder(rootFolderSpec);
67*f6dc9357SAndroid Build Coastguard Worker rootFolderSpec->Init();
68*f6dc9357SAndroid Build Coastguard Worker }
69*f6dc9357SAndroid Build Coastguard Worker
70*f6dc9357SAndroid Build Coastguard Worker
DoesNameContainWildcard_SkipRoot(const UString & path)71*f6dc9357SAndroid Build Coastguard Worker static bool DoesNameContainWildcard_SkipRoot(const UString &path)
72*f6dc9357SAndroid Build Coastguard Worker {
73*f6dc9357SAndroid Build Coastguard Worker return DoesNameContainWildcard(path.Ptr(NName::GetRootPrefixSize(path)));
74*f6dc9357SAndroid Build Coastguard Worker }
75*f6dc9357SAndroid Build Coastguard Worker
BindToPath(const UString & fullPath,const UString & arcFormat,COpenResult & openRes)76*f6dc9357SAndroid Build Coastguard Worker HRESULT CPanel::BindToPath(const UString &fullPath, const UString &arcFormat, COpenResult &openRes)
77*f6dc9357SAndroid Build Coastguard Worker {
78*f6dc9357SAndroid Build Coastguard Worker UString path = fullPath;
79*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
80*f6dc9357SAndroid Build Coastguard Worker path.Replace(L'/', WCHAR_PATH_SEPARATOR);
81*f6dc9357SAndroid Build Coastguard Worker #endif
82*f6dc9357SAndroid Build Coastguard Worker
83*f6dc9357SAndroid Build Coastguard Worker openRes.ArchiveIsOpened = false;
84*f6dc9357SAndroid Build Coastguard Worker openRes.Encrypted = false;
85*f6dc9357SAndroid Build Coastguard Worker
86*f6dc9357SAndroid Build Coastguard Worker CDisableTimerProcessing disableTimerProcessing(*this);
87*f6dc9357SAndroid Build Coastguard Worker CDisableNotify disableNotify(*this);
88*f6dc9357SAndroid Build Coastguard Worker
89*f6dc9357SAndroid Build Coastguard Worker for (; !_parentFolders.IsEmpty(); CloseOneLevel())
90*f6dc9357SAndroid Build Coastguard Worker {
91*f6dc9357SAndroid Build Coastguard Worker // ---------- we try to use open archive ----------
92*f6dc9357SAndroid Build Coastguard Worker
93*f6dc9357SAndroid Build Coastguard Worker const CFolderLink &link = _parentFolders.Back();
94*f6dc9357SAndroid Build Coastguard Worker const UString &virtPath = link.VirtualPath;
95*f6dc9357SAndroid Build Coastguard Worker if (!path.IsPrefixedBy(virtPath))
96*f6dc9357SAndroid Build Coastguard Worker continue;
97*f6dc9357SAndroid Build Coastguard Worker UString relatPath = path.Ptr(virtPath.Len());
98*f6dc9357SAndroid Build Coastguard Worker if (!relatPath.IsEmpty())
99*f6dc9357SAndroid Build Coastguard Worker {
100*f6dc9357SAndroid Build Coastguard Worker if (!IS_PATH_SEPAR(relatPath[0]))
101*f6dc9357SAndroid Build Coastguard Worker continue;
102*f6dc9357SAndroid Build Coastguard Worker else
103*f6dc9357SAndroid Build Coastguard Worker relatPath.Delete(0);
104*f6dc9357SAndroid Build Coastguard Worker }
105*f6dc9357SAndroid Build Coastguard Worker
106*f6dc9357SAndroid Build Coastguard Worker UString relatPath2 = relatPath;
107*f6dc9357SAndroid Build Coastguard Worker if (!relatPath2.IsEmpty() && !IS_PATH_SEPAR(relatPath2.Back()))
108*f6dc9357SAndroid Build Coastguard Worker relatPath2.Add_PathSepar();
109*f6dc9357SAndroid Build Coastguard Worker
110*f6dc9357SAndroid Build Coastguard Worker for (;;)
111*f6dc9357SAndroid Build Coastguard Worker {
112*f6dc9357SAndroid Build Coastguard Worker const UString foldPath = GetFolderPath(_folder);
113*f6dc9357SAndroid Build Coastguard Worker if (relatPath2 == foldPath)
114*f6dc9357SAndroid Build Coastguard Worker break;
115*f6dc9357SAndroid Build Coastguard Worker if (relatPath.IsPrefixedBy(foldPath))
116*f6dc9357SAndroid Build Coastguard Worker {
117*f6dc9357SAndroid Build Coastguard Worker path = relatPath.Ptr(foldPath.Len());
118*f6dc9357SAndroid Build Coastguard Worker break;
119*f6dc9357SAndroid Build Coastguard Worker }
120*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IFolderFolder> newFolder;
121*f6dc9357SAndroid Build Coastguard Worker if (_folder->BindToParentFolder(&newFolder) != S_OK)
122*f6dc9357SAndroid Build Coastguard Worker throw 20140918;
123*f6dc9357SAndroid Build Coastguard Worker if (!newFolder) // we exit from loop above if (relatPath.IsPrefixedBy(empty path for root folder)
124*f6dc9357SAndroid Build Coastguard Worker throw 20140918;
125*f6dc9357SAndroid Build Coastguard Worker SetNewFolder(newFolder);
126*f6dc9357SAndroid Build Coastguard Worker }
127*f6dc9357SAndroid Build Coastguard Worker break;
128*f6dc9357SAndroid Build Coastguard Worker }
129*f6dc9357SAndroid Build Coastguard Worker
130*f6dc9357SAndroid Build Coastguard Worker if (_parentFolders.IsEmpty())
131*f6dc9357SAndroid Build Coastguard Worker {
132*f6dc9357SAndroid Build Coastguard Worker // ---------- we open file or folder from file system ----------
133*f6dc9357SAndroid Build Coastguard Worker
134*f6dc9357SAndroid Build Coastguard Worker CloseOpenFolders();
135*f6dc9357SAndroid Build Coastguard Worker UString sysPath = path;
136*f6dc9357SAndroid Build Coastguard Worker /* we will Empty() sysPath variable, if we need to BindToFolder()
137*f6dc9357SAndroid Build Coastguard Worker directly with (path) variable */
138*f6dc9357SAndroid Build Coastguard Worker const unsigned prefixSize = NName::GetRootPrefixSize(sysPath);
139*f6dc9357SAndroid Build Coastguard Worker if (prefixSize == 0 || sysPath[prefixSize] == 0)
140*f6dc9357SAndroid Build Coastguard Worker sysPath.Empty();
141*f6dc9357SAndroid Build Coastguard Worker
142*f6dc9357SAndroid Build Coastguard Worker #if defined(_WIN32) && !defined(UNDER_CE)
143*f6dc9357SAndroid Build Coastguard Worker if (!sysPath.IsEmpty() && sysPath.Back() == ':' &&
144*f6dc9357SAndroid Build Coastguard Worker (sysPath.Len() != 2 || !NName::IsDrivePath2(sysPath)))
145*f6dc9357SAndroid Build Coastguard Worker {
146*f6dc9357SAndroid Build Coastguard Worker // if base item for alt streams prefix "base:" exists, we will use it
147*f6dc9357SAndroid Build Coastguard Worker UString baseFile = sysPath;
148*f6dc9357SAndroid Build Coastguard Worker baseFile.DeleteBack();
149*f6dc9357SAndroid Build Coastguard Worker if (NFind::DoesFileOrDirExist(us2fs(baseFile)))
150*f6dc9357SAndroid Build Coastguard Worker sysPath.Empty();
151*f6dc9357SAndroid Build Coastguard Worker }
152*f6dc9357SAndroid Build Coastguard Worker #endif
153*f6dc9357SAndroid Build Coastguard Worker
154*f6dc9357SAndroid Build Coastguard Worker CFileInfo fileInfo;
155*f6dc9357SAndroid Build Coastguard Worker
156*f6dc9357SAndroid Build Coastguard Worker while (!sysPath.IsEmpty())
157*f6dc9357SAndroid Build Coastguard Worker {
158*f6dc9357SAndroid Build Coastguard Worker if (sysPath.Len() <= prefixSize)
159*f6dc9357SAndroid Build Coastguard Worker {
160*f6dc9357SAndroid Build Coastguard Worker path.DeleteFrom(prefixSize);
161*f6dc9357SAndroid Build Coastguard Worker sysPath.Empty();
162*f6dc9357SAndroid Build Coastguard Worker break;
163*f6dc9357SAndroid Build Coastguard Worker }
164*f6dc9357SAndroid Build Coastguard Worker
165*f6dc9357SAndroid Build Coastguard Worker fileInfo.ClearBase();
166*f6dc9357SAndroid Build Coastguard Worker if (IsPathSepar(sysPath.Back()))
167*f6dc9357SAndroid Build Coastguard Worker {
168*f6dc9357SAndroid Build Coastguard Worker /* Windows 10 by default doesn't allow look "Local Settings" that is junction to "AppData\Local",
169*f6dc9357SAndroid Build Coastguard Worker but it does allow look "Local Settings\Temp\*"
170*f6dc9357SAndroid Build Coastguard Worker 22.02: at first we try to use paths with slashes "path\" */
171*f6dc9357SAndroid Build Coastguard Worker CFileInfo fi;
172*f6dc9357SAndroid Build Coastguard Worker // CFindFile findFile;
173*f6dc9357SAndroid Build Coastguard Worker // FString path2 = us2fs(sysPath);
174*f6dc9357SAndroid Build Coastguard Worker // path2 += '*'; // CHAR_ANY_MASK;
175*f6dc9357SAndroid Build Coastguard Worker // if (findFile.FindFirst(path2, fi))
176*f6dc9357SAndroid Build Coastguard Worker CEnumerator enumerator;
177*f6dc9357SAndroid Build Coastguard Worker enumerator.SetDirPrefix(us2fs(sysPath));
178*f6dc9357SAndroid Build Coastguard Worker bool found = false;
179*f6dc9357SAndroid Build Coastguard Worker if (enumerator.Next(fi, found))
180*f6dc9357SAndroid Build Coastguard Worker {
181*f6dc9357SAndroid Build Coastguard Worker // sysPath.DeleteBack();
182*f6dc9357SAndroid Build Coastguard Worker fileInfo.SetAsDir();
183*f6dc9357SAndroid Build Coastguard Worker fileInfo.Size = 0;
184*f6dc9357SAndroid Build Coastguard Worker fileInfo.Name.Empty();
185*f6dc9357SAndroid Build Coastguard Worker break;
186*f6dc9357SAndroid Build Coastguard Worker }
187*f6dc9357SAndroid Build Coastguard Worker sysPath.DeleteBack();
188*f6dc9357SAndroid Build Coastguard Worker continue;
189*f6dc9357SAndroid Build Coastguard Worker }
190*f6dc9357SAndroid Build Coastguard Worker
191*f6dc9357SAndroid Build Coastguard Worker if (fileInfo.Find(us2fs(sysPath)))
192*f6dc9357SAndroid Build Coastguard Worker break;
193*f6dc9357SAndroid Build Coastguard Worker int pos = sysPath.ReverseFind_PathSepar();
194*f6dc9357SAndroid Build Coastguard Worker if (pos < 0)
195*f6dc9357SAndroid Build Coastguard Worker {
196*f6dc9357SAndroid Build Coastguard Worker sysPath.Empty();
197*f6dc9357SAndroid Build Coastguard Worker break;
198*f6dc9357SAndroid Build Coastguard Worker }
199*f6dc9357SAndroid Build Coastguard Worker {
200*f6dc9357SAndroid Build Coastguard Worker if ((unsigned)pos != sysPath.Len() - 1)
201*f6dc9357SAndroid Build Coastguard Worker pos++;
202*f6dc9357SAndroid Build Coastguard Worker sysPath.DeleteFrom((unsigned)pos);
203*f6dc9357SAndroid Build Coastguard Worker }
204*f6dc9357SAndroid Build Coastguard Worker }
205*f6dc9357SAndroid Build Coastguard Worker
206*f6dc9357SAndroid Build Coastguard Worker SetToRootFolder();
207*f6dc9357SAndroid Build Coastguard Worker
208*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IFolderFolder> newFolder;
209*f6dc9357SAndroid Build Coastguard Worker
210*f6dc9357SAndroid Build Coastguard Worker if (sysPath.IsEmpty())
211*f6dc9357SAndroid Build Coastguard Worker {
212*f6dc9357SAndroid Build Coastguard Worker _folder->BindToFolder(path, &newFolder);
213*f6dc9357SAndroid Build Coastguard Worker }
214*f6dc9357SAndroid Build Coastguard Worker else if (fileInfo.IsDir())
215*f6dc9357SAndroid Build Coastguard Worker {
216*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
217*f6dc9357SAndroid Build Coastguard Worker if (DoesNameContainWildcard_SkipRoot(sysPath))
218*f6dc9357SAndroid Build Coastguard Worker {
219*f6dc9357SAndroid Build Coastguard Worker FString dirPrefix, fileName;
220*f6dc9357SAndroid Build Coastguard Worker NDir::GetFullPathAndSplit(us2fs(sysPath), dirPrefix, fileName);
221*f6dc9357SAndroid Build Coastguard Worker if (DoesNameContainWildcard_SkipRoot(fs2us(dirPrefix)))
222*f6dc9357SAndroid Build Coastguard Worker return E_INVALIDARG;
223*f6dc9357SAndroid Build Coastguard Worker sysPath = fs2us(dirPrefix + fileInfo.Name);
224*f6dc9357SAndroid Build Coastguard Worker }
225*f6dc9357SAndroid Build Coastguard Worker #endif
226*f6dc9357SAndroid Build Coastguard Worker
227*f6dc9357SAndroid Build Coastguard Worker NName::NormalizeDirPathPrefix(sysPath);
228*f6dc9357SAndroid Build Coastguard Worker _folder->BindToFolder(sysPath, &newFolder);
229*f6dc9357SAndroid Build Coastguard Worker }
230*f6dc9357SAndroid Build Coastguard Worker else
231*f6dc9357SAndroid Build Coastguard Worker {
232*f6dc9357SAndroid Build Coastguard Worker FString dirPrefix, fileName;
233*f6dc9357SAndroid Build Coastguard Worker
234*f6dc9357SAndroid Build Coastguard Worker NDir::GetFullPathAndSplit(us2fs(sysPath), dirPrefix, fileName);
235*f6dc9357SAndroid Build Coastguard Worker
236*f6dc9357SAndroid Build Coastguard Worker HRESULT res = S_OK;
237*f6dc9357SAndroid Build Coastguard Worker
238*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
239*f6dc9357SAndroid Build Coastguard Worker if (DoesNameContainWildcard_SkipRoot(fs2us(dirPrefix)))
240*f6dc9357SAndroid Build Coastguard Worker return E_INVALIDARG;
241*f6dc9357SAndroid Build Coastguard Worker
242*f6dc9357SAndroid Build Coastguard Worker if (DoesNameContainWildcard(fs2us(fileName)))
243*f6dc9357SAndroid Build Coastguard Worker res = S_FALSE;
244*f6dc9357SAndroid Build Coastguard Worker else
245*f6dc9357SAndroid Build Coastguard Worker #endif
246*f6dc9357SAndroid Build Coastguard Worker {
247*f6dc9357SAndroid Build Coastguard Worker CTempFileInfo tfi;
248*f6dc9357SAndroid Build Coastguard Worker tfi.RelPath = fs2us(fileName);
249*f6dc9357SAndroid Build Coastguard Worker tfi.FolderPath = dirPrefix;
250*f6dc9357SAndroid Build Coastguard Worker tfi.FilePath = us2fs(sysPath);
251*f6dc9357SAndroid Build Coastguard Worker res = OpenAsArc(NULL, tfi, sysPath, arcFormat, openRes);
252*f6dc9357SAndroid Build Coastguard Worker }
253*f6dc9357SAndroid Build Coastguard Worker
254*f6dc9357SAndroid Build Coastguard Worker if (res == S_FALSE)
255*f6dc9357SAndroid Build Coastguard Worker _folder->BindToFolder(fs2us(dirPrefix), &newFolder);
256*f6dc9357SAndroid Build Coastguard Worker else
257*f6dc9357SAndroid Build Coastguard Worker {
258*f6dc9357SAndroid Build Coastguard Worker RINOK(res)
259*f6dc9357SAndroid Build Coastguard Worker openRes.ArchiveIsOpened = true;
260*f6dc9357SAndroid Build Coastguard Worker _parentFolders.Back().ParentFolderPath = fs2us(dirPrefix);
261*f6dc9357SAndroid Build Coastguard Worker path.DeleteFrontal(sysPath.Len());
262*f6dc9357SAndroid Build Coastguard Worker if (!path.IsEmpty() && IS_PATH_SEPAR(path[0]))
263*f6dc9357SAndroid Build Coastguard Worker path.Delete(0);
264*f6dc9357SAndroid Build Coastguard Worker }
265*f6dc9357SAndroid Build Coastguard Worker }
266*f6dc9357SAndroid Build Coastguard Worker
267*f6dc9357SAndroid Build Coastguard Worker if (newFolder)
268*f6dc9357SAndroid Build Coastguard Worker {
269*f6dc9357SAndroid Build Coastguard Worker SetNewFolder(newFolder);
270*f6dc9357SAndroid Build Coastguard Worker // LoadFullPath();
271*f6dc9357SAndroid Build Coastguard Worker return S_OK;
272*f6dc9357SAndroid Build Coastguard Worker }
273*f6dc9357SAndroid Build Coastguard Worker }
274*f6dc9357SAndroid Build Coastguard Worker
275*f6dc9357SAndroid Build Coastguard Worker {
276*f6dc9357SAndroid Build Coastguard Worker // ---------- we open folder remPath in archive and sub archives ----------
277*f6dc9357SAndroid Build Coastguard Worker
278*f6dc9357SAndroid Build Coastguard Worker for (unsigned curPos = 0; curPos != path.Len();)
279*f6dc9357SAndroid Build Coastguard Worker {
280*f6dc9357SAndroid Build Coastguard Worker UString s = path.Ptr(curPos);
281*f6dc9357SAndroid Build Coastguard Worker const int slashPos = NName::FindSepar(s);
282*f6dc9357SAndroid Build Coastguard Worker unsigned skipLen = s.Len();
283*f6dc9357SAndroid Build Coastguard Worker if (slashPos >= 0)
284*f6dc9357SAndroid Build Coastguard Worker {
285*f6dc9357SAndroid Build Coastguard Worker s.DeleteFrom((unsigned)slashPos);
286*f6dc9357SAndroid Build Coastguard Worker skipLen = (unsigned)slashPos + 1;
287*f6dc9357SAndroid Build Coastguard Worker }
288*f6dc9357SAndroid Build Coastguard Worker
289*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IFolderFolder> newFolder;
290*f6dc9357SAndroid Build Coastguard Worker _folder->BindToFolder(s, &newFolder);
291*f6dc9357SAndroid Build Coastguard Worker if (newFolder)
292*f6dc9357SAndroid Build Coastguard Worker curPos += skipLen;
293*f6dc9357SAndroid Build Coastguard Worker else if (_folderAltStreams)
294*f6dc9357SAndroid Build Coastguard Worker {
295*f6dc9357SAndroid Build Coastguard Worker const int pos = s.Find(L':');
296*f6dc9357SAndroid Build Coastguard Worker if (pos >= 0)
297*f6dc9357SAndroid Build Coastguard Worker {
298*f6dc9357SAndroid Build Coastguard Worker UString baseName = s;
299*f6dc9357SAndroid Build Coastguard Worker baseName.DeleteFrom((unsigned)pos);
300*f6dc9357SAndroid Build Coastguard Worker if (_folderAltStreams->BindToAltStreams(baseName, &newFolder) == S_OK && newFolder)
301*f6dc9357SAndroid Build Coastguard Worker curPos += (unsigned)pos + 1;
302*f6dc9357SAndroid Build Coastguard Worker }
303*f6dc9357SAndroid Build Coastguard Worker }
304*f6dc9357SAndroid Build Coastguard Worker
305*f6dc9357SAndroid Build Coastguard Worker if (!newFolder)
306*f6dc9357SAndroid Build Coastguard Worker break;
307*f6dc9357SAndroid Build Coastguard Worker
308*f6dc9357SAndroid Build Coastguard Worker SetNewFolder(newFolder);
309*f6dc9357SAndroid Build Coastguard Worker }
310*f6dc9357SAndroid Build Coastguard Worker }
311*f6dc9357SAndroid Build Coastguard Worker
312*f6dc9357SAndroid Build Coastguard Worker return S_OK;
313*f6dc9357SAndroid Build Coastguard Worker }
314*f6dc9357SAndroid Build Coastguard Worker
BindToPathAndRefresh(const UString & path)315*f6dc9357SAndroid Build Coastguard Worker HRESULT CPanel::BindToPathAndRefresh(const UString &path)
316*f6dc9357SAndroid Build Coastguard Worker {
317*f6dc9357SAndroid Build Coastguard Worker CDisableTimerProcessing disableTimerProcessing(*this);
318*f6dc9357SAndroid Build Coastguard Worker CDisableNotify disableNotify(*this);
319*f6dc9357SAndroid Build Coastguard Worker COpenResult openRes;
320*f6dc9357SAndroid Build Coastguard Worker UString s = path;
321*f6dc9357SAndroid Build Coastguard Worker
322*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
323*f6dc9357SAndroid Build Coastguard Worker if (!s.IsEmpty() && s[0] == '\"' && s.Back() == '\"')
324*f6dc9357SAndroid Build Coastguard Worker {
325*f6dc9357SAndroid Build Coastguard Worker s.DeleteBack();
326*f6dc9357SAndroid Build Coastguard Worker s.Delete(0);
327*f6dc9357SAndroid Build Coastguard Worker }
328*f6dc9357SAndroid Build Coastguard Worker #endif
329*f6dc9357SAndroid Build Coastguard Worker
330*f6dc9357SAndroid Build Coastguard Worker HRESULT res = BindToPath(s, UString(), openRes);
331*f6dc9357SAndroid Build Coastguard Worker RefreshListCtrl();
332*f6dc9357SAndroid Build Coastguard Worker return res;
333*f6dc9357SAndroid Build Coastguard Worker }
334*f6dc9357SAndroid Build Coastguard Worker
SetBookmark(unsigned index)335*f6dc9357SAndroid Build Coastguard Worker void CPanel::SetBookmark(unsigned index)
336*f6dc9357SAndroid Build Coastguard Worker {
337*f6dc9357SAndroid Build Coastguard Worker _appState->FastFolders.SetString(index, _currentFolderPrefix);
338*f6dc9357SAndroid Build Coastguard Worker }
339*f6dc9357SAndroid Build Coastguard Worker
OpenBookmark(unsigned index)340*f6dc9357SAndroid Build Coastguard Worker void CPanel::OpenBookmark(unsigned index)
341*f6dc9357SAndroid Build Coastguard Worker {
342*f6dc9357SAndroid Build Coastguard Worker BindToPathAndRefresh(_appState->FastFolders.GetString(index));
343*f6dc9357SAndroid Build Coastguard Worker }
344*f6dc9357SAndroid Build Coastguard Worker
GetFolderPath(IFolderFolder * folder)345*f6dc9357SAndroid Build Coastguard Worker UString GetFolderPath(IFolderFolder *folder)
346*f6dc9357SAndroid Build Coastguard Worker {
347*f6dc9357SAndroid Build Coastguard Worker {
348*f6dc9357SAndroid Build Coastguard Worker NCOM::CPropVariant prop;
349*f6dc9357SAndroid Build Coastguard Worker if (folder->GetFolderProperty(kpidPath, &prop) == S_OK)
350*f6dc9357SAndroid Build Coastguard Worker if (prop.vt == VT_BSTR)
351*f6dc9357SAndroid Build Coastguard Worker return (wchar_t *)prop.bstrVal;
352*f6dc9357SAndroid Build Coastguard Worker }
353*f6dc9357SAndroid Build Coastguard Worker return UString();
354*f6dc9357SAndroid Build Coastguard Worker }
355*f6dc9357SAndroid Build Coastguard Worker
LoadFullPath()356*f6dc9357SAndroid Build Coastguard Worker void CPanel::LoadFullPath()
357*f6dc9357SAndroid Build Coastguard Worker {
358*f6dc9357SAndroid Build Coastguard Worker _currentFolderPrefix.Empty();
359*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR (i, _parentFolders)
360*f6dc9357SAndroid Build Coastguard Worker {
361*f6dc9357SAndroid Build Coastguard Worker const CFolderLink &folderLink = _parentFolders[i];
362*f6dc9357SAndroid Build Coastguard Worker _currentFolderPrefix += folderLink.ParentFolderPath;
363*f6dc9357SAndroid Build Coastguard Worker // GetFolderPath(folderLink.ParentFolder);
364*f6dc9357SAndroid Build Coastguard Worker _currentFolderPrefix += folderLink.RelPath;
365*f6dc9357SAndroid Build Coastguard Worker _currentFolderPrefix.Add_PathSepar();
366*f6dc9357SAndroid Build Coastguard Worker }
367*f6dc9357SAndroid Build Coastguard Worker if (_folder)
368*f6dc9357SAndroid Build Coastguard Worker _currentFolderPrefix += GetFolderPath(_folder);
369*f6dc9357SAndroid Build Coastguard Worker }
370*f6dc9357SAndroid Build Coastguard Worker
371*f6dc9357SAndroid Build Coastguard Worker
372*f6dc9357SAndroid Build Coastguard Worker
GetRealIconIndex_for_DirPath(CFSTR path,DWORD attrib)373*f6dc9357SAndroid Build Coastguard Worker static int GetRealIconIndex_for_DirPath(CFSTR path, DWORD attrib)
374*f6dc9357SAndroid Build Coastguard Worker {
375*f6dc9357SAndroid Build Coastguard Worker attrib |= FILE_ATTRIBUTE_DIRECTORY; // optional
376*f6dc9357SAndroid Build Coastguard Worker int index = -1;
377*f6dc9357SAndroid Build Coastguard Worker if (Shell_GetFileInfo_SysIconIndex_for_Path_attrib_iconIndexRef(path, attrib, index))
378*f6dc9357SAndroid Build Coastguard Worker if (index >= 0)
379*f6dc9357SAndroid Build Coastguard Worker return index;
380*f6dc9357SAndroid Build Coastguard Worker return g_Ext_to_Icon_Map.GetIconIndex_DIR(attrib);
381*f6dc9357SAndroid Build Coastguard Worker }
382*f6dc9357SAndroid Build Coastguard Worker
383*f6dc9357SAndroid Build Coastguard Worker
384*f6dc9357SAndroid Build Coastguard Worker extern UString RootFolder_GetName_Computer(int &iconIndex);
385*f6dc9357SAndroid Build Coastguard Worker extern UString RootFolder_GetName_Network(int &iconIndex);
386*f6dc9357SAndroid Build Coastguard Worker extern UString RootFolder_GetName_Documents(int &iconIndex);
387*f6dc9357SAndroid Build Coastguard Worker
388*f6dc9357SAndroid Build Coastguard Worker
Find_FileExtension_DotPos_in_path(const wchar_t * path)389*f6dc9357SAndroid Build Coastguard Worker static int Find_FileExtension_DotPos_in_path(const wchar_t *path)
390*f6dc9357SAndroid Build Coastguard Worker {
391*f6dc9357SAndroid Build Coastguard Worker int dotPos = -1;
392*f6dc9357SAndroid Build Coastguard Worker unsigned i;
393*f6dc9357SAndroid Build Coastguard Worker for (i = 0;; i++)
394*f6dc9357SAndroid Build Coastguard Worker {
395*f6dc9357SAndroid Build Coastguard Worker const wchar_t c = path[i];
396*f6dc9357SAndroid Build Coastguard Worker if (c == 0)
397*f6dc9357SAndroid Build Coastguard Worker return dotPos;
398*f6dc9357SAndroid Build Coastguard Worker if (c == '.')
399*f6dc9357SAndroid Build Coastguard Worker dotPos = (int)i;
400*f6dc9357SAndroid Build Coastguard Worker else if (IS_PATH_SEPAR(c) || c == ':')
401*f6dc9357SAndroid Build Coastguard Worker dotPos = -1;
402*f6dc9357SAndroid Build Coastguard Worker }
403*f6dc9357SAndroid Build Coastguard Worker }
404*f6dc9357SAndroid Build Coastguard Worker
405*f6dc9357SAndroid Build Coastguard Worker
LoadFullPathAndShow()406*f6dc9357SAndroid Build Coastguard Worker void CPanel::LoadFullPathAndShow()
407*f6dc9357SAndroid Build Coastguard Worker {
408*f6dc9357SAndroid Build Coastguard Worker LoadFullPath();
409*f6dc9357SAndroid Build Coastguard Worker _appState->FolderHistory.AddString(_currentFolderPrefix);
410*f6dc9357SAndroid Build Coastguard Worker
411*f6dc9357SAndroid Build Coastguard Worker _headerComboBox.SetText(_currentFolderPrefix);
412*f6dc9357SAndroid Build Coastguard Worker
413*f6dc9357SAndroid Build Coastguard Worker #ifndef UNDER_CE
414*f6dc9357SAndroid Build Coastguard Worker
415*f6dc9357SAndroid Build Coastguard Worker COMBOBOXEXITEM item;
416*f6dc9357SAndroid Build Coastguard Worker item.mask = 0;
417*f6dc9357SAndroid Build Coastguard Worker item.iImage = -1;
418*f6dc9357SAndroid Build Coastguard Worker
419*f6dc9357SAndroid Build Coastguard Worker UString path = _currentFolderPrefix;
420*f6dc9357SAndroid Build Coastguard Worker // path = "\\\\.\\PhysicalDrive1\\"; // for debug
421*f6dc9357SAndroid Build Coastguard Worker // path = "\\\\.\\y:\\"; // for debug
422*f6dc9357SAndroid Build Coastguard Worker if (!path.IsEmpty())
423*f6dc9357SAndroid Build Coastguard Worker {
424*f6dc9357SAndroid Build Coastguard Worker const unsigned rootPrefixSize = NName::GetRootPrefixSize(path);
425*f6dc9357SAndroid Build Coastguard Worker if (rootPrefixSize == 0 && path[0] != '\\')
426*f6dc9357SAndroid Build Coastguard Worker {
427*f6dc9357SAndroid Build Coastguard Worker int iconIndex = -1;
428*f6dc9357SAndroid Build Coastguard Worker UString name_Computer = RootFolder_GetName_Computer(iconIndex);
429*f6dc9357SAndroid Build Coastguard Worker name_Computer.Add_PathSepar();
430*f6dc9357SAndroid Build Coastguard Worker if (path == name_Computer
431*f6dc9357SAndroid Build Coastguard Worker || path == L"\\\\?\\")
432*f6dc9357SAndroid Build Coastguard Worker item.iImage = iconIndex;
433*f6dc9357SAndroid Build Coastguard Worker else
434*f6dc9357SAndroid Build Coastguard Worker {
435*f6dc9357SAndroid Build Coastguard Worker UString name = RootFolder_GetName_Network(iconIndex);
436*f6dc9357SAndroid Build Coastguard Worker name.Add_PathSepar();
437*f6dc9357SAndroid Build Coastguard Worker if (path == name)
438*f6dc9357SAndroid Build Coastguard Worker item.iImage = iconIndex;
439*f6dc9357SAndroid Build Coastguard Worker }
440*f6dc9357SAndroid Build Coastguard Worker }
441*f6dc9357SAndroid Build Coastguard Worker
442*f6dc9357SAndroid Build Coastguard Worker if (item.iImage < 0)
443*f6dc9357SAndroid Build Coastguard Worker {
444*f6dc9357SAndroid Build Coastguard Worker if (rootPrefixSize == 0 || rootPrefixSize == path.Len())
445*f6dc9357SAndroid Build Coastguard Worker {
446*f6dc9357SAndroid Build Coastguard Worker DWORD attrib = FILE_ATTRIBUTE_DIRECTORY;
447*f6dc9357SAndroid Build Coastguard Worker CFileInfo info;
448*f6dc9357SAndroid Build Coastguard Worker if (info.Find(us2fs(path)))
449*f6dc9357SAndroid Build Coastguard Worker attrib = info.Attrib;
450*f6dc9357SAndroid Build Coastguard Worker NName::If_IsSuperPath_RemoveSuperPrefix(path);
451*f6dc9357SAndroid Build Coastguard Worker item.iImage = GetRealIconIndex_for_DirPath(us2fs(path), attrib);
452*f6dc9357SAndroid Build Coastguard Worker }
453*f6dc9357SAndroid Build Coastguard Worker else if (rootPrefixSize == NName::kDevicePathPrefixSize
454*f6dc9357SAndroid Build Coastguard Worker && NName::IsDevicePath(us2fs(path.Left(path.Len() - 1))))
455*f6dc9357SAndroid Build Coastguard Worker {
456*f6dc9357SAndroid Build Coastguard Worker if (path.IsPrefixedBy_Ascii_NoCase("\\\\.\\"))
457*f6dc9357SAndroid Build Coastguard Worker path.DeleteFrontal(4);
458*f6dc9357SAndroid Build Coastguard Worker if (path.Len() > 3) // is not "c:\\"
459*f6dc9357SAndroid Build Coastguard Worker {
460*f6dc9357SAndroid Build Coastguard Worker // PhysicalDrive
461*f6dc9357SAndroid Build Coastguard Worker if (path.Back() == '\\')
462*f6dc9357SAndroid Build Coastguard Worker path.DeleteBack();
463*f6dc9357SAndroid Build Coastguard Worker }
464*f6dc9357SAndroid Build Coastguard Worker item.iImage = Shell_GetFileInfo_SysIconIndex_for_Path(us2fs(path), FILE_ATTRIBUTE_ARCHIVE);
465*f6dc9357SAndroid Build Coastguard Worker }
466*f6dc9357SAndroid Build Coastguard Worker else
467*f6dc9357SAndroid Build Coastguard Worker {
468*f6dc9357SAndroid Build Coastguard Worker if (path.Back() == '\\')
469*f6dc9357SAndroid Build Coastguard Worker path.DeleteBack();
470*f6dc9357SAndroid Build Coastguard Worker bool need_Fs_Check = true;
471*f6dc9357SAndroid Build Coastguard Worker bool is_File = false;
472*f6dc9357SAndroid Build Coastguard Worker if (!_parentFolders.IsEmpty())
473*f6dc9357SAndroid Build Coastguard Worker {
474*f6dc9357SAndroid Build Coastguard Worker const CFolderLink &link = _parentFolders.Back();
475*f6dc9357SAndroid Build Coastguard Worker if (link.VirtualPath == path)
476*f6dc9357SAndroid Build Coastguard Worker {
477*f6dc9357SAndroid Build Coastguard Worker is_File = true;
478*f6dc9357SAndroid Build Coastguard Worker if (_parentFolders.Size() != 1)
479*f6dc9357SAndroid Build Coastguard Worker need_Fs_Check = false;
480*f6dc9357SAndroid Build Coastguard Worker }
481*f6dc9357SAndroid Build Coastguard Worker else
482*f6dc9357SAndroid Build Coastguard Worker need_Fs_Check = false;
483*f6dc9357SAndroid Build Coastguard Worker }
484*f6dc9357SAndroid Build Coastguard Worker if (need_Fs_Check)
485*f6dc9357SAndroid Build Coastguard Worker {
486*f6dc9357SAndroid Build Coastguard Worker CFileInfo info;
487*f6dc9357SAndroid Build Coastguard Worker const bool finded = info.Find(us2fs(path));
488*f6dc9357SAndroid Build Coastguard Worker DWORD attrib = FILE_ATTRIBUTE_DIRECTORY;
489*f6dc9357SAndroid Build Coastguard Worker if (finded)
490*f6dc9357SAndroid Build Coastguard Worker attrib = info.Attrib;
491*f6dc9357SAndroid Build Coastguard Worker item.iImage = Shell_GetFileInfo_SysIconIndex_for_Path(us2fs(path), attrib);
492*f6dc9357SAndroid Build Coastguard Worker }
493*f6dc9357SAndroid Build Coastguard Worker if (item.iImage <= 0 && is_File)
494*f6dc9357SAndroid Build Coastguard Worker {
495*f6dc9357SAndroid Build Coastguard Worker int dotPos = Find_FileExtension_DotPos_in_path(path);
496*f6dc9357SAndroid Build Coastguard Worker if (dotPos < 0)
497*f6dc9357SAndroid Build Coastguard Worker dotPos = (int)path.Len();
498*f6dc9357SAndroid Build Coastguard Worker item.iImage = g_Ext_to_Icon_Map.GetIconIndex(FILE_ATTRIBUTE_ARCHIVE, path.Ptr(dotPos));
499*f6dc9357SAndroid Build Coastguard Worker }
500*f6dc9357SAndroid Build Coastguard Worker }
501*f6dc9357SAndroid Build Coastguard Worker }
502*f6dc9357SAndroid Build Coastguard Worker }
503*f6dc9357SAndroid Build Coastguard Worker
504*f6dc9357SAndroid Build Coastguard Worker if (item.iImage < 0)
505*f6dc9357SAndroid Build Coastguard Worker item.iImage = g_Ext_to_Icon_Map.GetIconIndex_DIR();
506*f6dc9357SAndroid Build Coastguard Worker // if (item.iImage < 0) item.iImage = 0;
507*f6dc9357SAndroid Build Coastguard Worker // item.iImage = -1; // for debug
508*f6dc9357SAndroid Build Coastguard Worker if (item.iImage >= 0)
509*f6dc9357SAndroid Build Coastguard Worker {
510*f6dc9357SAndroid Build Coastguard Worker item.iSelectedImage = item.iImage;
511*f6dc9357SAndroid Build Coastguard Worker item.mask |= (CBEIF_IMAGE | CBEIF_SELECTEDIMAGE);
512*f6dc9357SAndroid Build Coastguard Worker }
513*f6dc9357SAndroid Build Coastguard Worker item.iItem = -1;
514*f6dc9357SAndroid Build Coastguard Worker _headerComboBox.SetItem(&item);
515*f6dc9357SAndroid Build Coastguard Worker
516*f6dc9357SAndroid Build Coastguard Worker #endif
517*f6dc9357SAndroid Build Coastguard Worker
518*f6dc9357SAndroid Build Coastguard Worker RefreshTitle();
519*f6dc9357SAndroid Build Coastguard Worker }
520*f6dc9357SAndroid Build Coastguard Worker
521*f6dc9357SAndroid Build Coastguard Worker #ifndef UNDER_CE
OnNotifyComboBoxEnter(const UString & s)522*f6dc9357SAndroid Build Coastguard Worker LRESULT CPanel::OnNotifyComboBoxEnter(const UString &s)
523*f6dc9357SAndroid Build Coastguard Worker {
524*f6dc9357SAndroid Build Coastguard Worker if (BindToPathAndRefresh(GetUnicodeString(s)) == S_OK)
525*f6dc9357SAndroid Build Coastguard Worker {
526*f6dc9357SAndroid Build Coastguard Worker PostMsg(kSetFocusToListView);
527*f6dc9357SAndroid Build Coastguard Worker return TRUE;
528*f6dc9357SAndroid Build Coastguard Worker }
529*f6dc9357SAndroid Build Coastguard Worker return FALSE;
530*f6dc9357SAndroid Build Coastguard Worker }
531*f6dc9357SAndroid Build Coastguard Worker
OnNotifyComboBoxEndEdit(PNMCBEENDEDITW info,LRESULT & result)532*f6dc9357SAndroid Build Coastguard Worker bool CPanel::OnNotifyComboBoxEndEdit(PNMCBEENDEDITW info, LRESULT &result)
533*f6dc9357SAndroid Build Coastguard Worker {
534*f6dc9357SAndroid Build Coastguard Worker if (info->iWhy == CBENF_ESCAPE)
535*f6dc9357SAndroid Build Coastguard Worker {
536*f6dc9357SAndroid Build Coastguard Worker _headerComboBox.SetText(_currentFolderPrefix);
537*f6dc9357SAndroid Build Coastguard Worker PostMsg(kSetFocusToListView);
538*f6dc9357SAndroid Build Coastguard Worker result = FALSE;
539*f6dc9357SAndroid Build Coastguard Worker return true;
540*f6dc9357SAndroid Build Coastguard Worker }
541*f6dc9357SAndroid Build Coastguard Worker
542*f6dc9357SAndroid Build Coastguard Worker /*
543*f6dc9357SAndroid Build Coastguard Worker if (info->iWhy == CBENF_DROPDOWN)
544*f6dc9357SAndroid Build Coastguard Worker {
545*f6dc9357SAndroid Build Coastguard Worker result = FALSE;
546*f6dc9357SAndroid Build Coastguard Worker return true;
547*f6dc9357SAndroid Build Coastguard Worker }
548*f6dc9357SAndroid Build Coastguard Worker */
549*f6dc9357SAndroid Build Coastguard Worker
550*f6dc9357SAndroid Build Coastguard Worker if (info->iWhy == CBENF_RETURN)
551*f6dc9357SAndroid Build Coastguard Worker {
552*f6dc9357SAndroid Build Coastguard Worker // When we use Edit control and press Enter.
553*f6dc9357SAndroid Build Coastguard Worker UString s;
554*f6dc9357SAndroid Build Coastguard Worker _headerComboBox.GetText(s);
555*f6dc9357SAndroid Build Coastguard Worker result = OnNotifyComboBoxEnter(s);
556*f6dc9357SAndroid Build Coastguard Worker return true;
557*f6dc9357SAndroid Build Coastguard Worker }
558*f6dc9357SAndroid Build Coastguard Worker return false;
559*f6dc9357SAndroid Build Coastguard Worker }
560*f6dc9357SAndroid Build Coastguard Worker #endif
561*f6dc9357SAndroid Build Coastguard Worker
562*f6dc9357SAndroid Build Coastguard Worker #ifndef _UNICODE
OnNotifyComboBoxEndEdit(PNMCBEENDEDIT info,LRESULT & result)563*f6dc9357SAndroid Build Coastguard Worker bool CPanel::OnNotifyComboBoxEndEdit(PNMCBEENDEDIT info, LRESULT &result)
564*f6dc9357SAndroid Build Coastguard Worker {
565*f6dc9357SAndroid Build Coastguard Worker if (info->iWhy == CBENF_ESCAPE)
566*f6dc9357SAndroid Build Coastguard Worker {
567*f6dc9357SAndroid Build Coastguard Worker _headerComboBox.SetText(_currentFolderPrefix);
568*f6dc9357SAndroid Build Coastguard Worker PostMsg(kSetFocusToListView);
569*f6dc9357SAndroid Build Coastguard Worker result = FALSE;
570*f6dc9357SAndroid Build Coastguard Worker return true;
571*f6dc9357SAndroid Build Coastguard Worker }
572*f6dc9357SAndroid Build Coastguard Worker /*
573*f6dc9357SAndroid Build Coastguard Worker if (info->iWhy == CBENF_DROPDOWN)
574*f6dc9357SAndroid Build Coastguard Worker {
575*f6dc9357SAndroid Build Coastguard Worker result = FALSE;
576*f6dc9357SAndroid Build Coastguard Worker return true;
577*f6dc9357SAndroid Build Coastguard Worker }
578*f6dc9357SAndroid Build Coastguard Worker */
579*f6dc9357SAndroid Build Coastguard Worker
580*f6dc9357SAndroid Build Coastguard Worker if (info->iWhy == CBENF_RETURN)
581*f6dc9357SAndroid Build Coastguard Worker {
582*f6dc9357SAndroid Build Coastguard Worker UString s;
583*f6dc9357SAndroid Build Coastguard Worker _headerComboBox.GetText(s);
584*f6dc9357SAndroid Build Coastguard Worker // GetUnicodeString(info->szText)
585*f6dc9357SAndroid Build Coastguard Worker result = OnNotifyComboBoxEnter(s);
586*f6dc9357SAndroid Build Coastguard Worker return true;
587*f6dc9357SAndroid Build Coastguard Worker }
588*f6dc9357SAndroid Build Coastguard Worker return false;
589*f6dc9357SAndroid Build Coastguard Worker }
590*f6dc9357SAndroid Build Coastguard Worker #endif
591*f6dc9357SAndroid Build Coastguard Worker
AddComboBoxItem(const UString & name,int iconIndex,unsigned indent,bool addToList)592*f6dc9357SAndroid Build Coastguard Worker void CPanel::AddComboBoxItem(const UString &name, int iconIndex, unsigned indent, bool addToList)
593*f6dc9357SAndroid Build Coastguard Worker {
594*f6dc9357SAndroid Build Coastguard Worker #ifdef UNDER_CE
595*f6dc9357SAndroid Build Coastguard Worker
596*f6dc9357SAndroid Build Coastguard Worker UString s;
597*f6dc9357SAndroid Build Coastguard Worker iconIndex = iconIndex;
598*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < indent; i++)
599*f6dc9357SAndroid Build Coastguard Worker s += " ";
600*f6dc9357SAndroid Build Coastguard Worker _headerComboBox.AddString(s + name);
601*f6dc9357SAndroid Build Coastguard Worker
602*f6dc9357SAndroid Build Coastguard Worker #else
603*f6dc9357SAndroid Build Coastguard Worker
604*f6dc9357SAndroid Build Coastguard Worker COMBOBOXEXITEMW item;
605*f6dc9357SAndroid Build Coastguard Worker item.mask = CBEIF_TEXT | CBEIF_INDENT;
606*f6dc9357SAndroid Build Coastguard Worker if (iconIndex < 0)
607*f6dc9357SAndroid Build Coastguard Worker iconIndex = g_Ext_to_Icon_Map.GetIconIndex_DIR();
608*f6dc9357SAndroid Build Coastguard Worker item.iSelectedImage = item.iImage = iconIndex;
609*f6dc9357SAndroid Build Coastguard Worker if (iconIndex >= 0)
610*f6dc9357SAndroid Build Coastguard Worker item.mask |= (CBEIF_IMAGE | CBEIF_SELECTEDIMAGE);
611*f6dc9357SAndroid Build Coastguard Worker item.iItem = -1;
612*f6dc9357SAndroid Build Coastguard Worker item.iIndent = (int)indent;
613*f6dc9357SAndroid Build Coastguard Worker item.pszText = name.Ptr_non_const();
614*f6dc9357SAndroid Build Coastguard Worker _headerComboBox.InsertItem(&item);
615*f6dc9357SAndroid Build Coastguard Worker
616*f6dc9357SAndroid Build Coastguard Worker #endif
617*f6dc9357SAndroid Build Coastguard Worker
618*f6dc9357SAndroid Build Coastguard Worker if (addToList)
619*f6dc9357SAndroid Build Coastguard Worker {
620*f6dc9357SAndroid Build Coastguard Worker UString s = name;
621*f6dc9357SAndroid Build Coastguard Worker s.Add_PathSepar();
622*f6dc9357SAndroid Build Coastguard Worker ComboBoxPaths.Add(s);
623*f6dc9357SAndroid Build Coastguard Worker }
624*f6dc9357SAndroid Build Coastguard Worker }
625*f6dc9357SAndroid Build Coastguard Worker
626*f6dc9357SAndroid Build Coastguard Worker
OnComboBoxCommand(UINT code,LPARAM,LRESULT & result)627*f6dc9357SAndroid Build Coastguard Worker bool CPanel::OnComboBoxCommand(UINT code, LPARAM /* param */, LRESULT &result)
628*f6dc9357SAndroid Build Coastguard Worker {
629*f6dc9357SAndroid Build Coastguard Worker result = FALSE;
630*f6dc9357SAndroid Build Coastguard Worker switch (code)
631*f6dc9357SAndroid Build Coastguard Worker {
632*f6dc9357SAndroid Build Coastguard Worker case CBN_DROPDOWN:
633*f6dc9357SAndroid Build Coastguard Worker {
634*f6dc9357SAndroid Build Coastguard Worker ComboBoxPaths.Clear();
635*f6dc9357SAndroid Build Coastguard Worker _headerComboBox.ResetContent();
636*f6dc9357SAndroid Build Coastguard Worker
637*f6dc9357SAndroid Build Coastguard Worker UString sumPath;
638*f6dc9357SAndroid Build Coastguard Worker UStringVector pathParts;
639*f6dc9357SAndroid Build Coastguard Worker unsigned indent = 0;
640*f6dc9357SAndroid Build Coastguard Worker {
641*f6dc9357SAndroid Build Coastguard Worker UString path = _currentFolderPrefix;
642*f6dc9357SAndroid Build Coastguard Worker // path = L"\\\\.\\y:\\"; // for debug
643*f6dc9357SAndroid Build Coastguard Worker UString prefix0;
644*f6dc9357SAndroid Build Coastguard Worker if (path.IsPrefixedBy_Ascii_NoCase("\\\\"))
645*f6dc9357SAndroid Build Coastguard Worker {
646*f6dc9357SAndroid Build Coastguard Worker const int separ = FindCharPosInString(path.Ptr(2), '\\');
647*f6dc9357SAndroid Build Coastguard Worker if (separ > 0
648*f6dc9357SAndroid Build Coastguard Worker && (separ > 1 || path[2] != '.')) // "\\\\.\\" will be processed later
649*f6dc9357SAndroid Build Coastguard Worker {
650*f6dc9357SAndroid Build Coastguard Worker const UString s = path.Left(2 + separ);
651*f6dc9357SAndroid Build Coastguard Worker prefix0 = s;
652*f6dc9357SAndroid Build Coastguard Worker prefix0.Add_PathSepar();
653*f6dc9357SAndroid Build Coastguard Worker AddComboBoxItem(s,
654*f6dc9357SAndroid Build Coastguard Worker GetRealIconIndex_for_DirPath(us2fs(prefix0), FILE_ATTRIBUTE_DIRECTORY),
655*f6dc9357SAndroid Build Coastguard Worker indent++,
656*f6dc9357SAndroid Build Coastguard Worker false); // addToList
657*f6dc9357SAndroid Build Coastguard Worker ComboBoxPaths.Add(prefix0);
658*f6dc9357SAndroid Build Coastguard Worker }
659*f6dc9357SAndroid Build Coastguard Worker }
660*f6dc9357SAndroid Build Coastguard Worker
661*f6dc9357SAndroid Build Coastguard Worker unsigned rootPrefixSize = NName::GetRootPrefixSize(path);
662*f6dc9357SAndroid Build Coastguard Worker
663*f6dc9357SAndroid Build Coastguard Worker sumPath = path;
664*f6dc9357SAndroid Build Coastguard Worker
665*f6dc9357SAndroid Build Coastguard Worker if (rootPrefixSize <= prefix0.Len())
666*f6dc9357SAndroid Build Coastguard Worker {
667*f6dc9357SAndroid Build Coastguard Worker rootPrefixSize = prefix0.Len();
668*f6dc9357SAndroid Build Coastguard Worker sumPath.DeleteFrom(rootPrefixSize);
669*f6dc9357SAndroid Build Coastguard Worker }
670*f6dc9357SAndroid Build Coastguard Worker else
671*f6dc9357SAndroid Build Coastguard Worker {
672*f6dc9357SAndroid Build Coastguard Worker // rootPrefixSize > prefix0.Len()
673*f6dc9357SAndroid Build Coastguard Worker sumPath.DeleteFrom(rootPrefixSize);
674*f6dc9357SAndroid Build Coastguard Worker
675*f6dc9357SAndroid Build Coastguard Worker CFileInfo info;
676*f6dc9357SAndroid Build Coastguard Worker DWORD attrib = FILE_ATTRIBUTE_DIRECTORY;
677*f6dc9357SAndroid Build Coastguard Worker if (info.Find(us2fs(sumPath)) && info.IsDir())
678*f6dc9357SAndroid Build Coastguard Worker attrib = info.Attrib;
679*f6dc9357SAndroid Build Coastguard Worker UString s = sumPath.Ptr(prefix0.Len());
680*f6dc9357SAndroid Build Coastguard Worker if (!s.IsEmpty())
681*f6dc9357SAndroid Build Coastguard Worker {
682*f6dc9357SAndroid Build Coastguard Worker const wchar_t c = s.Back();
683*f6dc9357SAndroid Build Coastguard Worker if (IS_PATH_SEPAR(c))
684*f6dc9357SAndroid Build Coastguard Worker s.DeleteBack();
685*f6dc9357SAndroid Build Coastguard Worker }
686*f6dc9357SAndroid Build Coastguard Worker UString path_for_icon = sumPath;
687*f6dc9357SAndroid Build Coastguard Worker NName::If_IsSuperPath_RemoveSuperPrefix(path_for_icon);
688*f6dc9357SAndroid Build Coastguard Worker
689*f6dc9357SAndroid Build Coastguard Worker AddComboBoxItem(s,
690*f6dc9357SAndroid Build Coastguard Worker GetRealIconIndex_for_DirPath(us2fs(path_for_icon), attrib),
691*f6dc9357SAndroid Build Coastguard Worker indent++,
692*f6dc9357SAndroid Build Coastguard Worker false); // addToList
693*f6dc9357SAndroid Build Coastguard Worker ComboBoxPaths.Add(sumPath);
694*f6dc9357SAndroid Build Coastguard Worker }
695*f6dc9357SAndroid Build Coastguard Worker
696*f6dc9357SAndroid Build Coastguard Worker path.DeleteFrontal(rootPrefixSize);
697*f6dc9357SAndroid Build Coastguard Worker SplitPathToParts(path, pathParts);
698*f6dc9357SAndroid Build Coastguard Worker }
699*f6dc9357SAndroid Build Coastguard Worker
700*f6dc9357SAndroid Build Coastguard Worker // it's expected that pathParts.Back() is empty, because _currentFolderPrefix has PathSeparator.
701*f6dc9357SAndroid Build Coastguard Worker unsigned next_Arc_index = 0;
702*f6dc9357SAndroid Build Coastguard Worker int iconIndex_Computer;
703*f6dc9357SAndroid Build Coastguard Worker const UString name_Computer = RootFolder_GetName_Computer(iconIndex_Computer);
704*f6dc9357SAndroid Build Coastguard Worker
705*f6dc9357SAndroid Build Coastguard Worker // const bool is_devicePrefix = (sumPath == L"\\\\.\\");
706*f6dc9357SAndroid Build Coastguard Worker
707*f6dc9357SAndroid Build Coastguard Worker if (pathParts.Size() > 1)
708*f6dc9357SAndroid Build Coastguard Worker if (!sumPath.IsEmpty()
709*f6dc9357SAndroid Build Coastguard Worker || pathParts.Size() != 2
710*f6dc9357SAndroid Build Coastguard Worker || pathParts[0] != name_Computer)
711*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i + 1 < pathParts.Size(); i++)
712*f6dc9357SAndroid Build Coastguard Worker {
713*f6dc9357SAndroid Build Coastguard Worker UString name = pathParts[i];
714*f6dc9357SAndroid Build Coastguard Worker sumPath += name;
715*f6dc9357SAndroid Build Coastguard Worker
716*f6dc9357SAndroid Build Coastguard Worker bool isRootDir_inLink = false;
717*f6dc9357SAndroid Build Coastguard Worker if (next_Arc_index < _parentFolders.Size())
718*f6dc9357SAndroid Build Coastguard Worker {
719*f6dc9357SAndroid Build Coastguard Worker const CFolderLink &link = _parentFolders[next_Arc_index];
720*f6dc9357SAndroid Build Coastguard Worker if (link.VirtualPath == sumPath)
721*f6dc9357SAndroid Build Coastguard Worker {
722*f6dc9357SAndroid Build Coastguard Worker isRootDir_inLink = true;
723*f6dc9357SAndroid Build Coastguard Worker next_Arc_index++;
724*f6dc9357SAndroid Build Coastguard Worker }
725*f6dc9357SAndroid Build Coastguard Worker }
726*f6dc9357SAndroid Build Coastguard Worker
727*f6dc9357SAndroid Build Coastguard Worker int iconIndex = -1;
728*f6dc9357SAndroid Build Coastguard Worker DWORD attrib = isRootDir_inLink ?
729*f6dc9357SAndroid Build Coastguard Worker FILE_ATTRIBUTE_ARCHIVE:
730*f6dc9357SAndroid Build Coastguard Worker FILE_ATTRIBUTE_DIRECTORY;
731*f6dc9357SAndroid Build Coastguard Worker if (next_Arc_index == 0
732*f6dc9357SAndroid Build Coastguard Worker || (next_Arc_index == 1 && isRootDir_inLink))
733*f6dc9357SAndroid Build Coastguard Worker {
734*f6dc9357SAndroid Build Coastguard Worker if (i == 0 && NName::IsDevicePath(us2fs(sumPath)))
735*f6dc9357SAndroid Build Coastguard Worker {
736*f6dc9357SAndroid Build Coastguard Worker UString path = name;
737*f6dc9357SAndroid Build Coastguard Worker path.Add_PathSepar();
738*f6dc9357SAndroid Build Coastguard Worker attrib = FILE_ATTRIBUTE_ARCHIVE;
739*f6dc9357SAndroid Build Coastguard Worker // FILE_ATTRIBUTE_DIRECTORY;
740*f6dc9357SAndroid Build Coastguard Worker }
741*f6dc9357SAndroid Build Coastguard Worker else
742*f6dc9357SAndroid Build Coastguard Worker {
743*f6dc9357SAndroid Build Coastguard Worker CFileInfo info;
744*f6dc9357SAndroid Build Coastguard Worker if (info.Find(us2fs(sumPath)))
745*f6dc9357SAndroid Build Coastguard Worker attrib = info.Attrib;
746*f6dc9357SAndroid Build Coastguard Worker }
747*f6dc9357SAndroid Build Coastguard Worker iconIndex = Shell_GetFileInfo_SysIconIndex_for_Path(us2fs(sumPath), attrib);
748*f6dc9357SAndroid Build Coastguard Worker }
749*f6dc9357SAndroid Build Coastguard Worker
750*f6dc9357SAndroid Build Coastguard Worker if (iconIndex < 0)
751*f6dc9357SAndroid Build Coastguard Worker iconIndex = g_Ext_to_Icon_Map.GetIconIndex(attrib, name);
752*f6dc9357SAndroid Build Coastguard Worker // iconIndex = -1; // for debug
753*f6dc9357SAndroid Build Coastguard Worker if (iconIndex < 0 && isRootDir_inLink)
754*f6dc9357SAndroid Build Coastguard Worker iconIndex = 0; // default file
755*f6dc9357SAndroid Build Coastguard Worker
756*f6dc9357SAndroid Build Coastguard Worker sumPath.Add_PathSepar();
757*f6dc9357SAndroid Build Coastguard Worker
758*f6dc9357SAndroid Build Coastguard Worker ComboBoxPaths.Add(sumPath);
759*f6dc9357SAndroid Build Coastguard Worker if (name.IsEmpty())
760*f6dc9357SAndroid Build Coastguard Worker name.Add_PathSepar();
761*f6dc9357SAndroid Build Coastguard Worker AddComboBoxItem(name, iconIndex, indent++,
762*f6dc9357SAndroid Build Coastguard Worker false); // addToList
763*f6dc9357SAndroid Build Coastguard Worker }
764*f6dc9357SAndroid Build Coastguard Worker
765*f6dc9357SAndroid Build Coastguard Worker #ifndef UNDER_CE
766*f6dc9357SAndroid Build Coastguard Worker
767*f6dc9357SAndroid Build Coastguard Worker {
768*f6dc9357SAndroid Build Coastguard Worker int iconIndex;
769*f6dc9357SAndroid Build Coastguard Worker const UString name = RootFolder_GetName_Documents(iconIndex);
770*f6dc9357SAndroid Build Coastguard Worker // iconIndex = -1; // for debug
771*f6dc9357SAndroid Build Coastguard Worker AddComboBoxItem(name, iconIndex, 0, true);
772*f6dc9357SAndroid Build Coastguard Worker }
773*f6dc9357SAndroid Build Coastguard Worker AddComboBoxItem(name_Computer, iconIndex_Computer, 0, true);
774*f6dc9357SAndroid Build Coastguard Worker {
775*f6dc9357SAndroid Build Coastguard Worker FStringVector driveStrings;
776*f6dc9357SAndroid Build Coastguard Worker MyGetLogicalDriveStrings(driveStrings);
777*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR (i, driveStrings)
778*f6dc9357SAndroid Build Coastguard Worker {
779*f6dc9357SAndroid Build Coastguard Worker FString s = driveStrings[i];
780*f6dc9357SAndroid Build Coastguard Worker ComboBoxPaths.Add(fs2us(s));
781*f6dc9357SAndroid Build Coastguard Worker int iconIndex2 = GetRealIconIndex_for_DirPath(s, FILE_ATTRIBUTE_DIRECTORY);
782*f6dc9357SAndroid Build Coastguard Worker if (!s.IsEmpty())
783*f6dc9357SAndroid Build Coastguard Worker {
784*f6dc9357SAndroid Build Coastguard Worker const FChar c = s.Back();
785*f6dc9357SAndroid Build Coastguard Worker if (IS_PATH_SEPAR(c))
786*f6dc9357SAndroid Build Coastguard Worker s.DeleteBack();
787*f6dc9357SAndroid Build Coastguard Worker }
788*f6dc9357SAndroid Build Coastguard Worker // iconIndex2 = -1; // for debug
789*f6dc9357SAndroid Build Coastguard Worker AddComboBoxItem(fs2us(s), iconIndex2, 1, false);
790*f6dc9357SAndroid Build Coastguard Worker }
791*f6dc9357SAndroid Build Coastguard Worker }
792*f6dc9357SAndroid Build Coastguard Worker {
793*f6dc9357SAndroid Build Coastguard Worker int iconIndex;
794*f6dc9357SAndroid Build Coastguard Worker const UString name = RootFolder_GetName_Network(iconIndex);
795*f6dc9357SAndroid Build Coastguard Worker AddComboBoxItem(name, iconIndex, 0, true);
796*f6dc9357SAndroid Build Coastguard Worker }
797*f6dc9357SAndroid Build Coastguard Worker
798*f6dc9357SAndroid Build Coastguard Worker #endif
799*f6dc9357SAndroid Build Coastguard Worker
800*f6dc9357SAndroid Build Coastguard Worker return false;
801*f6dc9357SAndroid Build Coastguard Worker }
802*f6dc9357SAndroid Build Coastguard Worker
803*f6dc9357SAndroid Build Coastguard Worker case CBN_SELENDOK:
804*f6dc9357SAndroid Build Coastguard Worker {
805*f6dc9357SAndroid Build Coastguard Worker int index = _headerComboBox.GetCurSel();
806*f6dc9357SAndroid Build Coastguard Worker if (index >= 0)
807*f6dc9357SAndroid Build Coastguard Worker {
808*f6dc9357SAndroid Build Coastguard Worker const UString path = ComboBoxPaths[index];
809*f6dc9357SAndroid Build Coastguard Worker _headerComboBox.SetCurSel(-1);
810*f6dc9357SAndroid Build Coastguard Worker // _headerComboBox.SetText(pass); // it's fix for selecting by mouse.
811*f6dc9357SAndroid Build Coastguard Worker if (BindToPathAndRefresh(path) == S_OK)
812*f6dc9357SAndroid Build Coastguard Worker {
813*f6dc9357SAndroid Build Coastguard Worker PostMsg(kSetFocusToListView);
814*f6dc9357SAndroid Build Coastguard Worker #ifdef UNDER_CE
815*f6dc9357SAndroid Build Coastguard Worker PostMsg(kRefresh_HeaderComboBox);
816*f6dc9357SAndroid Build Coastguard Worker #endif
817*f6dc9357SAndroid Build Coastguard Worker return true;
818*f6dc9357SAndroid Build Coastguard Worker }
819*f6dc9357SAndroid Build Coastguard Worker }
820*f6dc9357SAndroid Build Coastguard Worker return false;
821*f6dc9357SAndroid Build Coastguard Worker }
822*f6dc9357SAndroid Build Coastguard Worker /*
823*f6dc9357SAndroid Build Coastguard Worker case CBN_CLOSEUP:
824*f6dc9357SAndroid Build Coastguard Worker {
825*f6dc9357SAndroid Build Coastguard Worker LoadFullPathAndShow();
826*f6dc9357SAndroid Build Coastguard Worker true;
827*f6dc9357SAndroid Build Coastguard Worker
828*f6dc9357SAndroid Build Coastguard Worker }
829*f6dc9357SAndroid Build Coastguard Worker case CBN_SELCHANGE:
830*f6dc9357SAndroid Build Coastguard Worker {
831*f6dc9357SAndroid Build Coastguard Worker // LoadFullPathAndShow();
832*f6dc9357SAndroid Build Coastguard Worker return true;
833*f6dc9357SAndroid Build Coastguard Worker }
834*f6dc9357SAndroid Build Coastguard Worker */
835*f6dc9357SAndroid Build Coastguard Worker }
836*f6dc9357SAndroid Build Coastguard Worker return false;
837*f6dc9357SAndroid Build Coastguard Worker }
838*f6dc9357SAndroid Build Coastguard Worker
OnNotifyComboBox(LPNMHDR NON_CE_VAR (header),LRESULT & NON_CE_VAR (result))839*f6dc9357SAndroid Build Coastguard Worker bool CPanel::OnNotifyComboBox(LPNMHDR NON_CE_VAR(header), LRESULT & NON_CE_VAR(result))
840*f6dc9357SAndroid Build Coastguard Worker {
841*f6dc9357SAndroid Build Coastguard Worker #ifndef UNDER_CE
842*f6dc9357SAndroid Build Coastguard Worker switch (header->code)
843*f6dc9357SAndroid Build Coastguard Worker {
844*f6dc9357SAndroid Build Coastguard Worker case CBEN_BEGINEDIT:
845*f6dc9357SAndroid Build Coastguard Worker {
846*f6dc9357SAndroid Build Coastguard Worker _lastFocusedIsList = false;
847*f6dc9357SAndroid Build Coastguard Worker _panelCallback->PanelWasFocused();
848*f6dc9357SAndroid Build Coastguard Worker break;
849*f6dc9357SAndroid Build Coastguard Worker }
850*f6dc9357SAndroid Build Coastguard Worker #ifndef _UNICODE
851*f6dc9357SAndroid Build Coastguard Worker case CBEN_ENDEDIT:
852*f6dc9357SAndroid Build Coastguard Worker {
853*f6dc9357SAndroid Build Coastguard Worker return OnNotifyComboBoxEndEdit((PNMCBEENDEDIT)header, result);
854*f6dc9357SAndroid Build Coastguard Worker }
855*f6dc9357SAndroid Build Coastguard Worker #endif
856*f6dc9357SAndroid Build Coastguard Worker case CBEN_ENDEDITW:
857*f6dc9357SAndroid Build Coastguard Worker {
858*f6dc9357SAndroid Build Coastguard Worker return OnNotifyComboBoxEndEdit((PNMCBEENDEDITW)header, result);
859*f6dc9357SAndroid Build Coastguard Worker }
860*f6dc9357SAndroid Build Coastguard Worker }
861*f6dc9357SAndroid Build Coastguard Worker #endif
862*f6dc9357SAndroid Build Coastguard Worker return false;
863*f6dc9357SAndroid Build Coastguard Worker }
864*f6dc9357SAndroid Build Coastguard Worker
865*f6dc9357SAndroid Build Coastguard Worker
FoldersHistory()866*f6dc9357SAndroid Build Coastguard Worker void CPanel::FoldersHistory()
867*f6dc9357SAndroid Build Coastguard Worker {
868*f6dc9357SAndroid Build Coastguard Worker CListViewDialog listViewDialog;
869*f6dc9357SAndroid Build Coastguard Worker listViewDialog.DeleteIsAllowed = true;
870*f6dc9357SAndroid Build Coastguard Worker listViewDialog.SelectFirst = true;
871*f6dc9357SAndroid Build Coastguard Worker LangString(IDS_FOLDERS_HISTORY, listViewDialog.Title);
872*f6dc9357SAndroid Build Coastguard Worker _appState->FolderHistory.GetList(listViewDialog.Strings);
873*f6dc9357SAndroid Build Coastguard Worker if (listViewDialog.Create(GetParent()) != IDOK)
874*f6dc9357SAndroid Build Coastguard Worker return;
875*f6dc9357SAndroid Build Coastguard Worker UString selectString;
876*f6dc9357SAndroid Build Coastguard Worker if (listViewDialog.StringsWereChanged)
877*f6dc9357SAndroid Build Coastguard Worker {
878*f6dc9357SAndroid Build Coastguard Worker _appState->FolderHistory.RemoveAll();
879*f6dc9357SAndroid Build Coastguard Worker for (int i = (int)listViewDialog.Strings.Size() - 1; i >= 0; i--)
880*f6dc9357SAndroid Build Coastguard Worker _appState->FolderHistory.AddString(listViewDialog.Strings[i]);
881*f6dc9357SAndroid Build Coastguard Worker if (listViewDialog.FocusedItemIndex >= 0)
882*f6dc9357SAndroid Build Coastguard Worker selectString = listViewDialog.Strings[listViewDialog.FocusedItemIndex];
883*f6dc9357SAndroid Build Coastguard Worker }
884*f6dc9357SAndroid Build Coastguard Worker else
885*f6dc9357SAndroid Build Coastguard Worker {
886*f6dc9357SAndroid Build Coastguard Worker if (listViewDialog.FocusedItemIndex >= 0)
887*f6dc9357SAndroid Build Coastguard Worker selectString = listViewDialog.Strings[listViewDialog.FocusedItemIndex];
888*f6dc9357SAndroid Build Coastguard Worker }
889*f6dc9357SAndroid Build Coastguard Worker if (listViewDialog.FocusedItemIndex >= 0)
890*f6dc9357SAndroid Build Coastguard Worker BindToPathAndRefresh(selectString);
891*f6dc9357SAndroid Build Coastguard Worker }
892*f6dc9357SAndroid Build Coastguard Worker
893*f6dc9357SAndroid Build Coastguard Worker
GetParentDirPrefix() const894*f6dc9357SAndroid Build Coastguard Worker UString CPanel::GetParentDirPrefix() const
895*f6dc9357SAndroid Build Coastguard Worker {
896*f6dc9357SAndroid Build Coastguard Worker UString s;
897*f6dc9357SAndroid Build Coastguard Worker if (!_currentFolderPrefix.IsEmpty())
898*f6dc9357SAndroid Build Coastguard Worker {
899*f6dc9357SAndroid Build Coastguard Worker wchar_t c = _currentFolderPrefix.Back();
900*f6dc9357SAndroid Build Coastguard Worker if (IS_PATH_SEPAR(c) || c == ':')
901*f6dc9357SAndroid Build Coastguard Worker {
902*f6dc9357SAndroid Build Coastguard Worker s = _currentFolderPrefix;
903*f6dc9357SAndroid Build Coastguard Worker s.DeleteBack();
904*f6dc9357SAndroid Build Coastguard Worker if (s != L"\\\\." &&
905*f6dc9357SAndroid Build Coastguard Worker s != L"\\\\?")
906*f6dc9357SAndroid Build Coastguard Worker {
907*f6dc9357SAndroid Build Coastguard Worker int pos = s.ReverseFind_PathSepar();
908*f6dc9357SAndroid Build Coastguard Worker if (pos >= 0)
909*f6dc9357SAndroid Build Coastguard Worker s.DeleteFrom((unsigned)(pos + 1));
910*f6dc9357SAndroid Build Coastguard Worker }
911*f6dc9357SAndroid Build Coastguard Worker }
912*f6dc9357SAndroid Build Coastguard Worker }
913*f6dc9357SAndroid Build Coastguard Worker return s;
914*f6dc9357SAndroid Build Coastguard Worker }
915*f6dc9357SAndroid Build Coastguard Worker
916*f6dc9357SAndroid Build Coastguard Worker
OpenParentFolder()917*f6dc9357SAndroid Build Coastguard Worker void CPanel::OpenParentFolder()
918*f6dc9357SAndroid Build Coastguard Worker {
919*f6dc9357SAndroid Build Coastguard Worker LoadFullPath(); // Maybe we don't need it ??
920*f6dc9357SAndroid Build Coastguard Worker
921*f6dc9357SAndroid Build Coastguard Worker UString parentFolderPrefix;
922*f6dc9357SAndroid Build Coastguard Worker UString focusedName;
923*f6dc9357SAndroid Build Coastguard Worker
924*f6dc9357SAndroid Build Coastguard Worker if (!_currentFolderPrefix.IsEmpty())
925*f6dc9357SAndroid Build Coastguard Worker {
926*f6dc9357SAndroid Build Coastguard Worker wchar_t c = _currentFolderPrefix.Back();
927*f6dc9357SAndroid Build Coastguard Worker if (IS_PATH_SEPAR(c) || c == ':')
928*f6dc9357SAndroid Build Coastguard Worker {
929*f6dc9357SAndroid Build Coastguard Worker focusedName = _currentFolderPrefix;
930*f6dc9357SAndroid Build Coastguard Worker focusedName.DeleteBack();
931*f6dc9357SAndroid Build Coastguard Worker /*
932*f6dc9357SAndroid Build Coastguard Worker if (c == ':' && !focusedName.IsEmpty() && IS_PATH_SEPAR(focusedName.Back()))
933*f6dc9357SAndroid Build Coastguard Worker {
934*f6dc9357SAndroid Build Coastguard Worker focusedName.DeleteBack();
935*f6dc9357SAndroid Build Coastguard Worker }
936*f6dc9357SAndroid Build Coastguard Worker else
937*f6dc9357SAndroid Build Coastguard Worker */
938*f6dc9357SAndroid Build Coastguard Worker if (focusedName != L"\\\\." &&
939*f6dc9357SAndroid Build Coastguard Worker focusedName != L"\\\\?")
940*f6dc9357SAndroid Build Coastguard Worker {
941*f6dc9357SAndroid Build Coastguard Worker const int pos = focusedName.ReverseFind_PathSepar();
942*f6dc9357SAndroid Build Coastguard Worker if (pos >= 0)
943*f6dc9357SAndroid Build Coastguard Worker {
944*f6dc9357SAndroid Build Coastguard Worker parentFolderPrefix = focusedName;
945*f6dc9357SAndroid Build Coastguard Worker parentFolderPrefix.DeleteFrom((unsigned)(pos + 1));
946*f6dc9357SAndroid Build Coastguard Worker focusedName.DeleteFrontal((unsigned)(pos + 1));
947*f6dc9357SAndroid Build Coastguard Worker }
948*f6dc9357SAndroid Build Coastguard Worker }
949*f6dc9357SAndroid Build Coastguard Worker }
950*f6dc9357SAndroid Build Coastguard Worker }
951*f6dc9357SAndroid Build Coastguard Worker
952*f6dc9357SAndroid Build Coastguard Worker CDisableTimerProcessing disableTimerProcessing(*this);
953*f6dc9357SAndroid Build Coastguard Worker CDisableNotify disableNotify(*this);
954*f6dc9357SAndroid Build Coastguard Worker
955*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IFolderFolder> newFolder;
956*f6dc9357SAndroid Build Coastguard Worker _folder->BindToParentFolder(&newFolder);
957*f6dc9357SAndroid Build Coastguard Worker
958*f6dc9357SAndroid Build Coastguard Worker // newFolder.Release(); // for test
959*f6dc9357SAndroid Build Coastguard Worker
960*f6dc9357SAndroid Build Coastguard Worker if (newFolder)
961*f6dc9357SAndroid Build Coastguard Worker SetNewFolder(newFolder);
962*f6dc9357SAndroid Build Coastguard Worker else
963*f6dc9357SAndroid Build Coastguard Worker {
964*f6dc9357SAndroid Build Coastguard Worker bool needSetFolder = true;
965*f6dc9357SAndroid Build Coastguard Worker if (!_parentFolders.IsEmpty())
966*f6dc9357SAndroid Build Coastguard Worker {
967*f6dc9357SAndroid Build Coastguard Worker {
968*f6dc9357SAndroid Build Coastguard Worker const CFolderLink &link = _parentFolders.Back();
969*f6dc9357SAndroid Build Coastguard Worker parentFolderPrefix = link.ParentFolderPath;
970*f6dc9357SAndroid Build Coastguard Worker focusedName = link.RelPath;
971*f6dc9357SAndroid Build Coastguard Worker }
972*f6dc9357SAndroid Build Coastguard Worker CloseOneLevel();
973*f6dc9357SAndroid Build Coastguard Worker needSetFolder = (!_folder);
974*f6dc9357SAndroid Build Coastguard Worker }
975*f6dc9357SAndroid Build Coastguard Worker
976*f6dc9357SAndroid Build Coastguard Worker if (needSetFolder)
977*f6dc9357SAndroid Build Coastguard Worker {
978*f6dc9357SAndroid Build Coastguard Worker {
979*f6dc9357SAndroid Build Coastguard Worker COpenResult openRes;
980*f6dc9357SAndroid Build Coastguard Worker BindToPath(parentFolderPrefix, UString(), openRes);
981*f6dc9357SAndroid Build Coastguard Worker }
982*f6dc9357SAndroid Build Coastguard Worker }
983*f6dc9357SAndroid Build Coastguard Worker }
984*f6dc9357SAndroid Build Coastguard Worker
985*f6dc9357SAndroid Build Coastguard Worker CSelectedState state;
986*f6dc9357SAndroid Build Coastguard Worker state.FocusedName = focusedName;
987*f6dc9357SAndroid Build Coastguard Worker state.FocusedName_Defined = true;
988*f6dc9357SAndroid Build Coastguard Worker /*
989*f6dc9357SAndroid Build Coastguard Worker if (!focusedName.IsEmpty())
990*f6dc9357SAndroid Build Coastguard Worker state.SelectedNames.Add(focusedName);
991*f6dc9357SAndroid Build Coastguard Worker */
992*f6dc9357SAndroid Build Coastguard Worker LoadFullPath();
993*f6dc9357SAndroid Build Coastguard Worker // ::SetCurrentDirectory(::_currentFolderPrefix);
994*f6dc9357SAndroid Build Coastguard Worker RefreshListCtrl(state);
995*f6dc9357SAndroid Build Coastguard Worker // _listView.EnsureVisible(_listView.GetFocusedItem(), false);
996*f6dc9357SAndroid Build Coastguard Worker }
997*f6dc9357SAndroid Build Coastguard Worker
998*f6dc9357SAndroid Build Coastguard Worker
CloseOneLevel()999*f6dc9357SAndroid Build Coastguard Worker void CPanel::CloseOneLevel()
1000*f6dc9357SAndroid Build Coastguard Worker {
1001*f6dc9357SAndroid Build Coastguard Worker ReleaseFolder();
1002*f6dc9357SAndroid Build Coastguard Worker _library.Free();
1003*f6dc9357SAndroid Build Coastguard Worker {
1004*f6dc9357SAndroid Build Coastguard Worker CFolderLink &link = _parentFolders.Back();
1005*f6dc9357SAndroid Build Coastguard Worker if (link.ParentFolder)
1006*f6dc9357SAndroid Build Coastguard Worker SetNewFolder(link.ParentFolder);
1007*f6dc9357SAndroid Build Coastguard Worker _library.Attach(link.Library.Detach());
1008*f6dc9357SAndroid Build Coastguard Worker }
1009*f6dc9357SAndroid Build Coastguard Worker if (_parentFolders.Size() > 1)
1010*f6dc9357SAndroid Build Coastguard Worker OpenParentArchiveFolder();
1011*f6dc9357SAndroid Build Coastguard Worker _parentFolders.DeleteBack();
1012*f6dc9357SAndroid Build Coastguard Worker if (_parentFolders.IsEmpty())
1013*f6dc9357SAndroid Build Coastguard Worker _flatMode = _flatModeForDisk;
1014*f6dc9357SAndroid Build Coastguard Worker }
1015*f6dc9357SAndroid Build Coastguard Worker
CloseOpenFolders()1016*f6dc9357SAndroid Build Coastguard Worker void CPanel::CloseOpenFolders()
1017*f6dc9357SAndroid Build Coastguard Worker {
1018*f6dc9357SAndroid Build Coastguard Worker while (!_parentFolders.IsEmpty())
1019*f6dc9357SAndroid Build Coastguard Worker CloseOneLevel();
1020*f6dc9357SAndroid Build Coastguard Worker _flatMode = _flatModeForDisk;
1021*f6dc9357SAndroid Build Coastguard Worker ReleaseFolder();
1022*f6dc9357SAndroid Build Coastguard Worker _library.Free();
1023*f6dc9357SAndroid Build Coastguard Worker }
1024*f6dc9357SAndroid Build Coastguard Worker
OpenRootFolder()1025*f6dc9357SAndroid Build Coastguard Worker void CPanel::OpenRootFolder()
1026*f6dc9357SAndroid Build Coastguard Worker {
1027*f6dc9357SAndroid Build Coastguard Worker CDisableTimerProcessing disableTimerProcessing(*this);
1028*f6dc9357SAndroid Build Coastguard Worker CDisableNotify disableNotify(*this);
1029*f6dc9357SAndroid Build Coastguard Worker _parentFolders.Clear();
1030*f6dc9357SAndroid Build Coastguard Worker SetToRootFolder();
1031*f6dc9357SAndroid Build Coastguard Worker RefreshListCtrl();
1032*f6dc9357SAndroid Build Coastguard Worker // ::SetCurrentDirectory(::_currentFolderPrefix);
1033*f6dc9357SAndroid Build Coastguard Worker /*
1034*f6dc9357SAndroid Build Coastguard Worker BeforeChangeFolder();
1035*f6dc9357SAndroid Build Coastguard Worker _currentFolderPrefix.Empty();
1036*f6dc9357SAndroid Build Coastguard Worker AfterChangeFolder();
1037*f6dc9357SAndroid Build Coastguard Worker SetCurrentPathText();
1038*f6dc9357SAndroid Build Coastguard Worker RefreshListCtrl(UString(), 0, UStringVector());
1039*f6dc9357SAndroid Build Coastguard Worker _listView.EnsureVisible(_listView.GetFocusedItem(), false);
1040*f6dc9357SAndroid Build Coastguard Worker */
1041*f6dc9357SAndroid Build Coastguard Worker }
1042*f6dc9357SAndroid Build Coastguard Worker
OpenDrivesFolder()1043*f6dc9357SAndroid Build Coastguard Worker void CPanel::OpenDrivesFolder()
1044*f6dc9357SAndroid Build Coastguard Worker {
1045*f6dc9357SAndroid Build Coastguard Worker CloseOpenFolders();
1046*f6dc9357SAndroid Build Coastguard Worker #ifdef UNDER_CE
1047*f6dc9357SAndroid Build Coastguard Worker NFsFolder::CFSFolder *folderSpec = new NFsFolder::CFSFolder;
1048*f6dc9357SAndroid Build Coastguard Worker SetNewFolder(folderSpec);
1049*f6dc9357SAndroid Build Coastguard Worker folderSpec->InitToRoot();
1050*f6dc9357SAndroid Build Coastguard Worker #else
1051*f6dc9357SAndroid Build Coastguard Worker CFSDrives *folderSpec = new CFSDrives;
1052*f6dc9357SAndroid Build Coastguard Worker SetNewFolder(folderSpec);
1053*f6dc9357SAndroid Build Coastguard Worker folderSpec->Init();
1054*f6dc9357SAndroid Build Coastguard Worker #endif
1055*f6dc9357SAndroid Build Coastguard Worker RefreshListCtrl();
1056*f6dc9357SAndroid Build Coastguard Worker }
1057*f6dc9357SAndroid Build Coastguard Worker
OpenFolder(unsigned index)1058*f6dc9357SAndroid Build Coastguard Worker void CPanel::OpenFolder(unsigned index)
1059*f6dc9357SAndroid Build Coastguard Worker {
1060*f6dc9357SAndroid Build Coastguard Worker if (index == kParentIndex)
1061*f6dc9357SAndroid Build Coastguard Worker {
1062*f6dc9357SAndroid Build Coastguard Worker OpenParentFolder();
1063*f6dc9357SAndroid Build Coastguard Worker return;
1064*f6dc9357SAndroid Build Coastguard Worker }
1065*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IFolderFolder> newFolder;
1066*f6dc9357SAndroid Build Coastguard Worker const HRESULT res = _folder->BindToFolder((unsigned)index, &newFolder);
1067*f6dc9357SAndroid Build Coastguard Worker if (res != 0)
1068*f6dc9357SAndroid Build Coastguard Worker {
1069*f6dc9357SAndroid Build Coastguard Worker MessageBox_Error_HRESULT(res);
1070*f6dc9357SAndroid Build Coastguard Worker return;
1071*f6dc9357SAndroid Build Coastguard Worker }
1072*f6dc9357SAndroid Build Coastguard Worker if (!newFolder)
1073*f6dc9357SAndroid Build Coastguard Worker return;
1074*f6dc9357SAndroid Build Coastguard Worker SetNewFolder(newFolder);
1075*f6dc9357SAndroid Build Coastguard Worker LoadFullPath();
1076*f6dc9357SAndroid Build Coastguard Worker RefreshListCtrl();
1077*f6dc9357SAndroid Build Coastguard Worker // 17.02: fixed : now we don't select first item
1078*f6dc9357SAndroid Build Coastguard Worker // _listView.SetItemState_Selected(_listView.GetFocusedItem());
1079*f6dc9357SAndroid Build Coastguard Worker _listView.EnsureVisible(_listView.GetFocusedItem(), false);
1080*f6dc9357SAndroid Build Coastguard Worker }
1081*f6dc9357SAndroid Build Coastguard Worker
OpenAltStreams()1082*f6dc9357SAndroid Build Coastguard Worker void CPanel::OpenAltStreams()
1083*f6dc9357SAndroid Build Coastguard Worker {
1084*f6dc9357SAndroid Build Coastguard Worker CRecordVector<UInt32> indices;
1085*f6dc9357SAndroid Build Coastguard Worker Get_ItemIndices_Operated(indices);
1086*f6dc9357SAndroid Build Coastguard Worker Int32 realIndex = -1;
1087*f6dc9357SAndroid Build Coastguard Worker if (indices.Size() > 1)
1088*f6dc9357SAndroid Build Coastguard Worker return;
1089*f6dc9357SAndroid Build Coastguard Worker if (indices.Size() == 1)
1090*f6dc9357SAndroid Build Coastguard Worker realIndex = (Int32)indices[0];
1091*f6dc9357SAndroid Build Coastguard Worker
1092*f6dc9357SAndroid Build Coastguard Worker if (_folderAltStreams)
1093*f6dc9357SAndroid Build Coastguard Worker {
1094*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IFolderFolder> newFolder;
1095*f6dc9357SAndroid Build Coastguard Worker _folderAltStreams->BindToAltStreams((UInt32)realIndex, &newFolder);
1096*f6dc9357SAndroid Build Coastguard Worker if (newFolder)
1097*f6dc9357SAndroid Build Coastguard Worker {
1098*f6dc9357SAndroid Build Coastguard Worker CDisableTimerProcessing disableTimerProcessing(*this);
1099*f6dc9357SAndroid Build Coastguard Worker CDisableNotify disableNotify(*this);
1100*f6dc9357SAndroid Build Coastguard Worker SetNewFolder(newFolder);
1101*f6dc9357SAndroid Build Coastguard Worker RefreshListCtrl();
1102*f6dc9357SAndroid Build Coastguard Worker return;
1103*f6dc9357SAndroid Build Coastguard Worker }
1104*f6dc9357SAndroid Build Coastguard Worker return;
1105*f6dc9357SAndroid Build Coastguard Worker }
1106*f6dc9357SAndroid Build Coastguard Worker
1107*f6dc9357SAndroid Build Coastguard Worker #if defined(_WIN32) && !defined(UNDER_CE)
1108*f6dc9357SAndroid Build Coastguard Worker UString path;
1109*f6dc9357SAndroid Build Coastguard Worker if (realIndex >= 0)
1110*f6dc9357SAndroid Build Coastguard Worker path = GetItemFullPath((UInt32)realIndex);
1111*f6dc9357SAndroid Build Coastguard Worker else
1112*f6dc9357SAndroid Build Coastguard Worker {
1113*f6dc9357SAndroid Build Coastguard Worker path = GetFsPath();
1114*f6dc9357SAndroid Build Coastguard Worker if (!NName::IsDriveRootPath_SuperAllowed(us2fs(path)))
1115*f6dc9357SAndroid Build Coastguard Worker if (!path.IsEmpty() && IS_PATH_SEPAR(path.Back()))
1116*f6dc9357SAndroid Build Coastguard Worker path.DeleteBack();
1117*f6dc9357SAndroid Build Coastguard Worker }
1118*f6dc9357SAndroid Build Coastguard Worker
1119*f6dc9357SAndroid Build Coastguard Worker path.Add_Colon();
1120*f6dc9357SAndroid Build Coastguard Worker BindToPathAndRefresh(path);
1121*f6dc9357SAndroid Build Coastguard Worker #endif
1122*f6dc9357SAndroid Build Coastguard Worker }
1123