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