xref: /aosp_15_r20/external/lzma/CPP/7zip/UI/FileManager/PanelItems.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // PanelItems.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 "../../../../C/Sort.h"
6*f6dc9357SAndroid Build Coastguard Worker 
7*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/FileName.h"
8*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/Menu.h"
9*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/PropVariant.h"
10*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/PropVariantConv.h"
11*f6dc9357SAndroid Build Coastguard Worker 
12*f6dc9357SAndroid Build Coastguard Worker #include "../../PropID.h"
13*f6dc9357SAndroid Build Coastguard Worker 
14*f6dc9357SAndroid Build Coastguard Worker #include "../Common/ExtractingFilePath.h"
15*f6dc9357SAndroid Build Coastguard Worker 
16*f6dc9357SAndroid Build Coastguard Worker #include "resource.h"
17*f6dc9357SAndroid Build Coastguard Worker 
18*f6dc9357SAndroid Build Coastguard Worker #include "LangUtils.h"
19*f6dc9357SAndroid Build Coastguard Worker #include "Panel.h"
20*f6dc9357SAndroid Build Coastguard Worker #include "PropertyName.h"
21*f6dc9357SAndroid Build Coastguard Worker #include "RootFolder.h"
22*f6dc9357SAndroid Build Coastguard Worker 
23*f6dc9357SAndroid Build Coastguard Worker using namespace NWindows;
24*f6dc9357SAndroid Build Coastguard Worker 
GetColumnVisible(PROPID propID,bool isFsFolder)25*f6dc9357SAndroid Build Coastguard Worker static bool GetColumnVisible(PROPID propID, bool isFsFolder)
26*f6dc9357SAndroid Build Coastguard Worker {
27*f6dc9357SAndroid Build Coastguard Worker   if (isFsFolder)
28*f6dc9357SAndroid Build Coastguard Worker   {
29*f6dc9357SAndroid Build Coastguard Worker     switch (propID)
30*f6dc9357SAndroid Build Coastguard Worker     {
31*f6dc9357SAndroid Build Coastguard Worker       case kpidATime:
32*f6dc9357SAndroid Build Coastguard Worker       case kpidChangeTime:
33*f6dc9357SAndroid Build Coastguard Worker       case kpidAttrib:
34*f6dc9357SAndroid Build Coastguard Worker       case kpidPackSize:
35*f6dc9357SAndroid Build Coastguard Worker       case kpidINode:
36*f6dc9357SAndroid Build Coastguard Worker       case kpidLinks:
37*f6dc9357SAndroid Build Coastguard Worker       case kpidNtReparse:
38*f6dc9357SAndroid Build Coastguard Worker         return false;
39*f6dc9357SAndroid Build Coastguard Worker     }
40*f6dc9357SAndroid Build Coastguard Worker   }
41*f6dc9357SAndroid Build Coastguard Worker   return true;
42*f6dc9357SAndroid Build Coastguard Worker }
43*f6dc9357SAndroid Build Coastguard Worker 
GetColumnWidth(PROPID propID,VARTYPE)44*f6dc9357SAndroid Build Coastguard Worker static unsigned GetColumnWidth(PROPID propID, VARTYPE /* varType */)
45*f6dc9357SAndroid Build Coastguard Worker {
46*f6dc9357SAndroid Build Coastguard Worker   switch (propID)
47*f6dc9357SAndroid Build Coastguard Worker   {
48*f6dc9357SAndroid Build Coastguard Worker     case kpidName: return 160;
49*f6dc9357SAndroid Build Coastguard Worker   }
50*f6dc9357SAndroid Build Coastguard Worker   return 100;
51*f6dc9357SAndroid Build Coastguard Worker }
52*f6dc9357SAndroid Build Coastguard Worker 
GetColumnAlign(PROPID propID,VARTYPE varType)53*f6dc9357SAndroid Build Coastguard Worker static int GetColumnAlign(PROPID propID, VARTYPE varType)
54*f6dc9357SAndroid Build Coastguard Worker {
55*f6dc9357SAndroid Build Coastguard Worker   switch (propID)
56*f6dc9357SAndroid Build Coastguard Worker   {
57*f6dc9357SAndroid Build Coastguard Worker     case kpidCTime:
58*f6dc9357SAndroid Build Coastguard Worker     case kpidATime:
59*f6dc9357SAndroid Build Coastguard Worker     case kpidMTime:
60*f6dc9357SAndroid Build Coastguard Worker     case kpidChangeTime:
61*f6dc9357SAndroid Build Coastguard Worker       return LVCFMT_LEFT;
62*f6dc9357SAndroid Build Coastguard Worker   }
63*f6dc9357SAndroid Build Coastguard Worker 
64*f6dc9357SAndroid Build Coastguard Worker   switch (varType)
65*f6dc9357SAndroid Build Coastguard Worker   {
66*f6dc9357SAndroid Build Coastguard Worker     case VT_UI1:
67*f6dc9357SAndroid Build Coastguard Worker     case VT_I2:
68*f6dc9357SAndroid Build Coastguard Worker     case VT_UI2:
69*f6dc9357SAndroid Build Coastguard Worker     case VT_I4:
70*f6dc9357SAndroid Build Coastguard Worker     case VT_INT:
71*f6dc9357SAndroid Build Coastguard Worker     case VT_UI4:
72*f6dc9357SAndroid Build Coastguard Worker     case VT_UINT:
73*f6dc9357SAndroid Build Coastguard Worker     case VT_I8:
74*f6dc9357SAndroid Build Coastguard Worker     case VT_UI8:
75*f6dc9357SAndroid Build Coastguard Worker     case VT_BOOL:
76*f6dc9357SAndroid Build Coastguard Worker       return LVCFMT_RIGHT;
77*f6dc9357SAndroid Build Coastguard Worker 
78*f6dc9357SAndroid Build Coastguard Worker     case VT_EMPTY:
79*f6dc9357SAndroid Build Coastguard Worker     case VT_I1:
80*f6dc9357SAndroid Build Coastguard Worker     case VT_FILETIME:
81*f6dc9357SAndroid Build Coastguard Worker     case VT_BSTR:
82*f6dc9357SAndroid Build Coastguard Worker       return LVCFMT_LEFT;
83*f6dc9357SAndroid Build Coastguard Worker 
84*f6dc9357SAndroid Build Coastguard Worker     default:
85*f6dc9357SAndroid Build Coastguard Worker       return LVCFMT_CENTER;
86*f6dc9357SAndroid Build Coastguard Worker   }
87*f6dc9357SAndroid Build Coastguard Worker }
88*f6dc9357SAndroid Build Coastguard Worker 
89*f6dc9357SAndroid Build Coastguard Worker 
ItemProperty_Compare_NameFirst(void * const * a1,void * const * a2,void *)90*f6dc9357SAndroid Build Coastguard Worker static int ItemProperty_Compare_NameFirst(void *const *a1, void *const *a2, void * /* param */)
91*f6dc9357SAndroid Build Coastguard Worker {
92*f6dc9357SAndroid Build Coastguard Worker   return (*(*((const CPropColumn *const *)a1))).Compare_NameFirst
93*f6dc9357SAndroid Build Coastguard Worker          (*(*((const CPropColumn *const *)a2)));
94*f6dc9357SAndroid Build Coastguard Worker }
95*f6dc9357SAndroid Build Coastguard Worker 
InitColumns()96*f6dc9357SAndroid Build Coastguard Worker HRESULT CPanel::InitColumns()
97*f6dc9357SAndroid Build Coastguard Worker {
98*f6dc9357SAndroid Build Coastguard Worker   SaveListViewInfo();
99*f6dc9357SAndroid Build Coastguard Worker 
100*f6dc9357SAndroid Build Coastguard Worker   // DeleteListItems();
101*f6dc9357SAndroid Build Coastguard Worker   _selectedStatusVector.Clear();
102*f6dc9357SAndroid Build Coastguard Worker 
103*f6dc9357SAndroid Build Coastguard Worker   {
104*f6dc9357SAndroid Build Coastguard Worker     // ReadListViewInfo();
105*f6dc9357SAndroid Build Coastguard Worker     const UString oldType = _typeIDString;
106*f6dc9357SAndroid Build Coastguard Worker     _typeIDString = GetFolderTypeID();
107*f6dc9357SAndroid Build Coastguard Worker     // an empty _typeIDString is allowed.
108*f6dc9357SAndroid Build Coastguard Worker 
109*f6dc9357SAndroid Build Coastguard Worker     // we read registry only for new FolderTypeID
110*f6dc9357SAndroid Build Coastguard Worker     if (!_needSaveInfo || _typeIDString != oldType)
111*f6dc9357SAndroid Build Coastguard Worker       _listViewInfo.Read(_typeIDString);
112*f6dc9357SAndroid Build Coastguard Worker 
113*f6dc9357SAndroid Build Coastguard Worker     // folders with same FolderTypeID can have different columns
114*f6dc9357SAndroid Build Coastguard Worker     // so we still read columns for that case.
115*f6dc9357SAndroid Build Coastguard Worker     // if (_needSaveInfo && _typeIDString == oldType) return S_OK;
116*f6dc9357SAndroid Build Coastguard Worker   }
117*f6dc9357SAndroid Build Coastguard Worker 
118*f6dc9357SAndroid Build Coastguard Worker   // PROPID sortID;
119*f6dc9357SAndroid Build Coastguard Worker   /*
120*f6dc9357SAndroid Build Coastguard Worker   if (_listViewInfo.SortIndex >= 0)
121*f6dc9357SAndroid Build Coastguard Worker     sortID = _listViewInfo.Columns[_listViewInfo.SortIndex].PropID;
122*f6dc9357SAndroid Build Coastguard Worker   */
123*f6dc9357SAndroid Build Coastguard Worker   // sortID = _listViewInfo.SortID;
124*f6dc9357SAndroid Build Coastguard Worker 
125*f6dc9357SAndroid Build Coastguard Worker   _ascending = _listViewInfo.Ascending;
126*f6dc9357SAndroid Build Coastguard Worker 
127*f6dc9357SAndroid Build Coastguard Worker   _columns.Clear();
128*f6dc9357SAndroid Build Coastguard Worker 
129*f6dc9357SAndroid Build Coastguard Worker   const bool isFsFolder = IsFSFolder() || IsAltStreamsFolder();
130*f6dc9357SAndroid Build Coastguard Worker 
131*f6dc9357SAndroid Build Coastguard Worker   {
132*f6dc9357SAndroid Build Coastguard Worker     UInt32 numProps;
133*f6dc9357SAndroid Build Coastguard Worker     _folder->GetNumberOfProperties(&numProps);
134*f6dc9357SAndroid Build Coastguard Worker 
135*f6dc9357SAndroid Build Coastguard Worker     for (UInt32 i = 0; i < numProps; i++)
136*f6dc9357SAndroid Build Coastguard Worker     {
137*f6dc9357SAndroid Build Coastguard Worker       CMyComBSTR name;
138*f6dc9357SAndroid Build Coastguard Worker       PROPID propID;
139*f6dc9357SAndroid Build Coastguard Worker       VARTYPE varType;
140*f6dc9357SAndroid Build Coastguard Worker       HRESULT res = _folder->GetPropertyInfo(i, &name, &propID, &varType);
141*f6dc9357SAndroid Build Coastguard Worker 
142*f6dc9357SAndroid Build Coastguard Worker       if (res != S_OK)
143*f6dc9357SAndroid Build Coastguard Worker       {
144*f6dc9357SAndroid Build Coastguard Worker         /* We can return ERROR, but in that case, other code will not be called,
145*f6dc9357SAndroid Build Coastguard Worker            and user can see empty window without error message. So we just ignore that field */
146*f6dc9357SAndroid Build Coastguard Worker         continue;
147*f6dc9357SAndroid Build Coastguard Worker       }
148*f6dc9357SAndroid Build Coastguard Worker       if (propID == kpidIsDir)
149*f6dc9357SAndroid Build Coastguard Worker         continue;
150*f6dc9357SAndroid Build Coastguard Worker       CPropColumn prop;
151*f6dc9357SAndroid Build Coastguard Worker       prop.Type = varType;
152*f6dc9357SAndroid Build Coastguard Worker       prop.ID = propID;
153*f6dc9357SAndroid Build Coastguard Worker       prop.Name = GetNameOfProperty(propID, name);
154*f6dc9357SAndroid Build Coastguard Worker       prop.Order = -1;
155*f6dc9357SAndroid Build Coastguard Worker       prop.IsVisible = GetColumnVisible(propID, isFsFolder);
156*f6dc9357SAndroid Build Coastguard Worker       prop.Width = GetColumnWidth(propID, varType);
157*f6dc9357SAndroid Build Coastguard Worker       prop.IsRawProp = false;
158*f6dc9357SAndroid Build Coastguard Worker       _columns.Add(prop);
159*f6dc9357SAndroid Build Coastguard Worker     }
160*f6dc9357SAndroid Build Coastguard Worker 
161*f6dc9357SAndroid Build Coastguard Worker     /*
162*f6dc9357SAndroid Build Coastguard Worker     {
163*f6dc9357SAndroid Build Coastguard Worker       // debug column
164*f6dc9357SAndroid Build Coastguard Worker       CPropColumn prop;
165*f6dc9357SAndroid Build Coastguard Worker       prop.Type = VT_BSTR;
166*f6dc9357SAndroid Build Coastguard Worker       prop.ID = 2000;
167*f6dc9357SAndroid Build Coastguard Worker       prop.Name = "Debug";
168*f6dc9357SAndroid Build Coastguard Worker       prop.Order = -1;
169*f6dc9357SAndroid Build Coastguard Worker       prop.IsVisible = true;
170*f6dc9357SAndroid Build Coastguard Worker       prop.Width = 300;
171*f6dc9357SAndroid Build Coastguard Worker       prop.IsRawProp = false;
172*f6dc9357SAndroid Build Coastguard Worker       _columns.Add(prop);
173*f6dc9357SAndroid Build Coastguard Worker     }
174*f6dc9357SAndroid Build Coastguard Worker     */
175*f6dc9357SAndroid Build Coastguard Worker   }
176*f6dc9357SAndroid Build Coastguard Worker 
177*f6dc9357SAndroid Build Coastguard Worker   if (_folderRawProps)
178*f6dc9357SAndroid Build Coastguard Worker   {
179*f6dc9357SAndroid Build Coastguard Worker     UInt32 numProps;
180*f6dc9357SAndroid Build Coastguard Worker     _folderRawProps->GetNumRawProps(&numProps);
181*f6dc9357SAndroid Build Coastguard Worker 
182*f6dc9357SAndroid Build Coastguard Worker     for (UInt32 i = 0; i < numProps; i++)
183*f6dc9357SAndroid Build Coastguard Worker     {
184*f6dc9357SAndroid Build Coastguard Worker       CMyComBSTR name;
185*f6dc9357SAndroid Build Coastguard Worker       PROPID propID;
186*f6dc9357SAndroid Build Coastguard Worker       const HRESULT res = _folderRawProps->GetRawPropInfo(i, &name, &propID);
187*f6dc9357SAndroid Build Coastguard Worker       if (res != S_OK)
188*f6dc9357SAndroid Build Coastguard Worker         continue;
189*f6dc9357SAndroid Build Coastguard Worker       CPropColumn prop;
190*f6dc9357SAndroid Build Coastguard Worker       prop.Type = VT_EMPTY;
191*f6dc9357SAndroid Build Coastguard Worker       prop.ID = propID;
192*f6dc9357SAndroid Build Coastguard Worker       prop.Name = GetNameOfProperty(propID, name);
193*f6dc9357SAndroid Build Coastguard Worker       prop.Order = -1;
194*f6dc9357SAndroid Build Coastguard Worker       prop.IsVisible = GetColumnVisible(propID, isFsFolder);
195*f6dc9357SAndroid Build Coastguard Worker       prop.Width = GetColumnWidth(propID, VT_BSTR);
196*f6dc9357SAndroid Build Coastguard Worker       prop.IsRawProp = true;
197*f6dc9357SAndroid Build Coastguard Worker       _columns.Add(prop);
198*f6dc9357SAndroid Build Coastguard Worker     }
199*f6dc9357SAndroid Build Coastguard Worker   }
200*f6dc9357SAndroid Build Coastguard Worker 
201*f6dc9357SAndroid Build Coastguard Worker   unsigned order = 0;
202*f6dc9357SAndroid Build Coastguard Worker   unsigned i;
203*f6dc9357SAndroid Build Coastguard Worker 
204*f6dc9357SAndroid Build Coastguard Worker   for (i = 0; i < _listViewInfo.Columns.Size(); i++)
205*f6dc9357SAndroid Build Coastguard Worker   {
206*f6dc9357SAndroid Build Coastguard Worker     const CColumnInfo &columnInfo = _listViewInfo.Columns[i];
207*f6dc9357SAndroid Build Coastguard Worker     const int index = _columns.FindItem_for_PropID(columnInfo.PropID);
208*f6dc9357SAndroid Build Coastguard Worker     if (index >= 0)
209*f6dc9357SAndroid Build Coastguard Worker     {
210*f6dc9357SAndroid Build Coastguard Worker       CPropColumn &item = _columns[index];
211*f6dc9357SAndroid Build Coastguard Worker       if (item.Order >= 0)
212*f6dc9357SAndroid Build Coastguard Worker         continue; // we ignore duplicated items
213*f6dc9357SAndroid Build Coastguard Worker       bool isVisible = columnInfo.IsVisible;
214*f6dc9357SAndroid Build Coastguard Worker       // we enable kpidName, if it was disabled by some incorrect code
215*f6dc9357SAndroid Build Coastguard Worker       if (columnInfo.PropID == kpidName)
216*f6dc9357SAndroid Build Coastguard Worker         isVisible = true;
217*f6dc9357SAndroid Build Coastguard Worker       item.IsVisible = isVisible;
218*f6dc9357SAndroid Build Coastguard Worker       item.Width = columnInfo.Width;
219*f6dc9357SAndroid Build Coastguard Worker       if (isVisible)
220*f6dc9357SAndroid Build Coastguard Worker         item.Order = (int)(order++);
221*f6dc9357SAndroid Build Coastguard Worker       continue;
222*f6dc9357SAndroid Build Coastguard Worker     }
223*f6dc9357SAndroid Build Coastguard Worker   }
224*f6dc9357SAndroid Build Coastguard Worker 
225*f6dc9357SAndroid Build Coastguard Worker   for (i = 0; i < _columns.Size(); i++)
226*f6dc9357SAndroid Build Coastguard Worker   {
227*f6dc9357SAndroid Build Coastguard Worker     CPropColumn &item = _columns[i];
228*f6dc9357SAndroid Build Coastguard Worker     if (item.IsVisible && item.Order < 0)
229*f6dc9357SAndroid Build Coastguard Worker       item.Order = (int)(order++);
230*f6dc9357SAndroid Build Coastguard Worker   }
231*f6dc9357SAndroid Build Coastguard Worker 
232*f6dc9357SAndroid Build Coastguard Worker   for (i = 0; i < _columns.Size(); i++)
233*f6dc9357SAndroid Build Coastguard Worker   {
234*f6dc9357SAndroid Build Coastguard Worker     CPropColumn &item = _columns[i];
235*f6dc9357SAndroid Build Coastguard Worker     if (item.Order < 0)
236*f6dc9357SAndroid Build Coastguard Worker       item.Order = (int)(order++);
237*f6dc9357SAndroid Build Coastguard Worker   }
238*f6dc9357SAndroid Build Coastguard Worker 
239*f6dc9357SAndroid Build Coastguard Worker   CPropColumns newColumns;
240*f6dc9357SAndroid Build Coastguard Worker 
241*f6dc9357SAndroid Build Coastguard Worker   for (i = 0; i < _columns.Size(); i++)
242*f6dc9357SAndroid Build Coastguard Worker   {
243*f6dc9357SAndroid Build Coastguard Worker     const CPropColumn &prop = _columns[i];
244*f6dc9357SAndroid Build Coastguard Worker     if (prop.IsVisible)
245*f6dc9357SAndroid Build Coastguard Worker       newColumns.Add(prop);
246*f6dc9357SAndroid Build Coastguard Worker   }
247*f6dc9357SAndroid Build Coastguard Worker 
248*f6dc9357SAndroid Build Coastguard Worker 
249*f6dc9357SAndroid Build Coastguard Worker   /*
250*f6dc9357SAndroid Build Coastguard Worker   _sortIndex = 0;
251*f6dc9357SAndroid Build Coastguard Worker   if (_listViewInfo.SortIndex >= 0)
252*f6dc9357SAndroid Build Coastguard Worker   {
253*f6dc9357SAndroid Build Coastguard Worker     int sortIndex = _columns.FindItem_for_PropID(sortID);
254*f6dc9357SAndroid Build Coastguard Worker     if (sortIndex >= 0)
255*f6dc9357SAndroid Build Coastguard Worker       _sortIndex = sortIndex;
256*f6dc9357SAndroid Build Coastguard Worker   }
257*f6dc9357SAndroid Build Coastguard Worker   */
258*f6dc9357SAndroid Build Coastguard Worker 
259*f6dc9357SAndroid Build Coastguard Worker   if (_listViewInfo.IsLoaded)
260*f6dc9357SAndroid Build Coastguard Worker     _sortID = _listViewInfo.SortID;
261*f6dc9357SAndroid Build Coastguard Worker   else
262*f6dc9357SAndroid Build Coastguard Worker   {
263*f6dc9357SAndroid Build Coastguard Worker     _sortID = 0;
264*f6dc9357SAndroid Build Coastguard Worker     if (IsFSFolder() || IsAltStreamsFolder() || IsArcFolder())
265*f6dc9357SAndroid Build Coastguard Worker       _sortID = kpidName;
266*f6dc9357SAndroid Build Coastguard Worker   }
267*f6dc9357SAndroid Build Coastguard Worker 
268*f6dc9357SAndroid Build Coastguard Worker   /* There are restrictions in ListView control:
269*f6dc9357SAndroid Build Coastguard Worker      1) main column (kpidName) must have (LV_COLUMNW::iSubItem = 0)
270*f6dc9357SAndroid Build Coastguard Worker         So we need special sorting for columns.
271*f6dc9357SAndroid Build Coastguard Worker      2) when we add new column, LV_COLUMNW::iOrder cannot be larger than already inserted columns)
272*f6dc9357SAndroid Build Coastguard Worker         So we set column order after all columns are added.
273*f6dc9357SAndroid Build Coastguard Worker   */
274*f6dc9357SAndroid Build Coastguard Worker   newColumns.Sort(ItemProperty_Compare_NameFirst, NULL);
275*f6dc9357SAndroid Build Coastguard Worker 
276*f6dc9357SAndroid Build Coastguard Worker   if (newColumns.IsEqualTo(_visibleColumns))
277*f6dc9357SAndroid Build Coastguard Worker     return S_OK;
278*f6dc9357SAndroid Build Coastguard Worker 
279*f6dc9357SAndroid Build Coastguard Worker   CIntArr columns(newColumns.Size());
280*f6dc9357SAndroid Build Coastguard Worker   for (i = 0; i < newColumns.Size(); i++)
281*f6dc9357SAndroid Build Coastguard Worker     columns[i] = -1;
282*f6dc9357SAndroid Build Coastguard Worker 
283*f6dc9357SAndroid Build Coastguard Worker   bool orderError = false;
284*f6dc9357SAndroid Build Coastguard Worker 
285*f6dc9357SAndroid Build Coastguard Worker   for (i = 0; i < newColumns.Size(); i++)
286*f6dc9357SAndroid Build Coastguard Worker   {
287*f6dc9357SAndroid Build Coastguard Worker     const CPropColumn &prop = newColumns[i];
288*f6dc9357SAndroid Build Coastguard Worker     if (prop.Order < (int)newColumns.Size() && columns[prop.Order] == -1)
289*f6dc9357SAndroid Build Coastguard Worker       columns[prop.Order] = (int)i;
290*f6dc9357SAndroid Build Coastguard Worker     else
291*f6dc9357SAndroid Build Coastguard Worker       orderError = true;
292*f6dc9357SAndroid Build Coastguard Worker   }
293*f6dc9357SAndroid Build Coastguard Worker 
294*f6dc9357SAndroid Build Coastguard Worker   for (;;)
295*f6dc9357SAndroid Build Coastguard Worker   {
296*f6dc9357SAndroid Build Coastguard Worker     const unsigned numColumns = _visibleColumns.Size();
297*f6dc9357SAndroid Build Coastguard Worker     if (numColumns == 0)
298*f6dc9357SAndroid Build Coastguard Worker       break;
299*f6dc9357SAndroid Build Coastguard Worker     DeleteColumn(numColumns - 1);
300*f6dc9357SAndroid Build Coastguard Worker   }
301*f6dc9357SAndroid Build Coastguard Worker 
302*f6dc9357SAndroid Build Coastguard Worker   for (i = 0; i < newColumns.Size(); i++)
303*f6dc9357SAndroid Build Coastguard Worker     AddColumn(newColumns[i]);
304*f6dc9357SAndroid Build Coastguard Worker 
305*f6dc9357SAndroid Build Coastguard Worker   // columns[0], columns[1], .... should be displayed from left to right:
306*f6dc9357SAndroid Build Coastguard Worker   if (!orderError)
307*f6dc9357SAndroid Build Coastguard Worker     _listView.SetColumnOrderArray(_visibleColumns.Size(), columns);
308*f6dc9357SAndroid Build Coastguard Worker 
309*f6dc9357SAndroid Build Coastguard Worker   _needSaveInfo = true;
310*f6dc9357SAndroid Build Coastguard Worker 
311*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
312*f6dc9357SAndroid Build Coastguard Worker }
313*f6dc9357SAndroid Build Coastguard Worker 
314*f6dc9357SAndroid Build Coastguard Worker 
DeleteColumn(unsigned index)315*f6dc9357SAndroid Build Coastguard Worker void CPanel::DeleteColumn(unsigned index)
316*f6dc9357SAndroid Build Coastguard Worker {
317*f6dc9357SAndroid Build Coastguard Worker   _visibleColumns.Delete(index);
318*f6dc9357SAndroid Build Coastguard Worker   _listView.DeleteColumn(index);
319*f6dc9357SAndroid Build Coastguard Worker }
320*f6dc9357SAndroid Build Coastguard Worker 
AddColumn(const CPropColumn & prop)321*f6dc9357SAndroid Build Coastguard Worker void CPanel::AddColumn(const CPropColumn &prop)
322*f6dc9357SAndroid Build Coastguard Worker {
323*f6dc9357SAndroid Build Coastguard Worker   const unsigned index = _visibleColumns.Size();
324*f6dc9357SAndroid Build Coastguard Worker 
325*f6dc9357SAndroid Build Coastguard Worker   LV_COLUMNW column;
326*f6dc9357SAndroid Build Coastguard Worker   column.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM | LVCF_ORDER;
327*f6dc9357SAndroid Build Coastguard Worker   column.cx = (int)prop.Width;
328*f6dc9357SAndroid Build Coastguard Worker   column.fmt = GetColumnAlign(prop.ID, prop.Type);
329*f6dc9357SAndroid Build Coastguard Worker   column.iOrder = (int)index; // must be <= _listView.ItemCount
330*f6dc9357SAndroid Build Coastguard Worker   column.iSubItem = (int)index; // must be <= _listView.ItemCount
331*f6dc9357SAndroid Build Coastguard Worker   column.pszText = const_cast<wchar_t *>((const wchar_t *)prop.Name);
332*f6dc9357SAndroid Build Coastguard Worker 
333*f6dc9357SAndroid Build Coastguard Worker   _visibleColumns.Add(prop);
334*f6dc9357SAndroid Build Coastguard Worker   _listView.InsertColumn(index, &column);
335*f6dc9357SAndroid Build Coastguard Worker }
336*f6dc9357SAndroid Build Coastguard Worker 
337*f6dc9357SAndroid Build Coastguard Worker 
RefreshListCtrl()338*f6dc9357SAndroid Build Coastguard Worker HRESULT CPanel::RefreshListCtrl()
339*f6dc9357SAndroid Build Coastguard Worker {
340*f6dc9357SAndroid Build Coastguard Worker   CSelectedState state;
341*f6dc9357SAndroid Build Coastguard Worker   return RefreshListCtrl(state);
342*f6dc9357SAndroid Build Coastguard Worker }
343*f6dc9357SAndroid Build Coastguard Worker 
344*f6dc9357SAndroid Build Coastguard Worker int CALLBACK CompareItems(LPARAM lParam1, LPARAM lParam2, LPARAM lpData);
345*f6dc9357SAndroid Build Coastguard Worker 
346*f6dc9357SAndroid Build Coastguard Worker 
GetSelectedNames(UStringVector & selectedNames)347*f6dc9357SAndroid Build Coastguard Worker void CPanel::GetSelectedNames(UStringVector &selectedNames)
348*f6dc9357SAndroid Build Coastguard Worker {
349*f6dc9357SAndroid Build Coastguard Worker   CRecordVector<UInt32> indices;
350*f6dc9357SAndroid Build Coastguard Worker   Get_ItemIndices_Selected(indices);
351*f6dc9357SAndroid Build Coastguard Worker   selectedNames.ClearAndReserve(indices.Size());
352*f6dc9357SAndroid Build Coastguard Worker   FOR_VECTOR (i, indices)
353*f6dc9357SAndroid Build Coastguard Worker     selectedNames.AddInReserved(GetItemRelPath(indices[i]));
354*f6dc9357SAndroid Build Coastguard Worker 
355*f6dc9357SAndroid Build Coastguard Worker   /*
356*f6dc9357SAndroid Build Coastguard Worker   for (int i = 0; i < _listView.GetItemCount(); i++)
357*f6dc9357SAndroid Build Coastguard Worker   {
358*f6dc9357SAndroid Build Coastguard Worker     const int kSize = 1024;
359*f6dc9357SAndroid Build Coastguard Worker     WCHAR name[kSize + 1];
360*f6dc9357SAndroid Build Coastguard Worker     LVITEMW item;
361*f6dc9357SAndroid Build Coastguard Worker     item.iItem = i;
362*f6dc9357SAndroid Build Coastguard Worker     item.pszText = name;
363*f6dc9357SAndroid Build Coastguard Worker     item.cchTextMax = kSize;
364*f6dc9357SAndroid Build Coastguard Worker     item.iSubItem = 0;
365*f6dc9357SAndroid Build Coastguard Worker     item.mask = LVIF_TEXT | LVIF_PARAM;
366*f6dc9357SAndroid Build Coastguard Worker     if (!_listView.GetItem(&item))
367*f6dc9357SAndroid Build Coastguard Worker       continue;
368*f6dc9357SAndroid Build Coastguard Worker     const unsigned realIndex = GetRealIndex(item);
369*f6dc9357SAndroid Build Coastguard Worker     if (realIndex == kParentIndex)
370*f6dc9357SAndroid Build Coastguard Worker       continue;
371*f6dc9357SAndroid Build Coastguard Worker     if (_selectedStatusVector[realIndex])
372*f6dc9357SAndroid Build Coastguard Worker       selectedNames.Add(item.pszText);
373*f6dc9357SAndroid Build Coastguard Worker   }
374*f6dc9357SAndroid Build Coastguard Worker   */
375*f6dc9357SAndroid Build Coastguard Worker   selectedNames.Sort();
376*f6dc9357SAndroid Build Coastguard Worker }
377*f6dc9357SAndroid Build Coastguard Worker 
SaveSelectedState(CSelectedState & s)378*f6dc9357SAndroid Build Coastguard Worker void CPanel::SaveSelectedState(CSelectedState &s)
379*f6dc9357SAndroid Build Coastguard Worker {
380*f6dc9357SAndroid Build Coastguard Worker   s.FocusedName_Defined = false;
381*f6dc9357SAndroid Build Coastguard Worker   s.FocusedName.Empty();
382*f6dc9357SAndroid Build Coastguard Worker   s.SelectFocused = true; // false;
383*f6dc9357SAndroid Build Coastguard Worker   s.SelectedNames.Clear();
384*f6dc9357SAndroid Build Coastguard Worker   s.FocusedItem = _listView.GetFocusedItem();
385*f6dc9357SAndroid Build Coastguard Worker   {
386*f6dc9357SAndroid Build Coastguard Worker     if (s.FocusedItem >= 0)
387*f6dc9357SAndroid Build Coastguard Worker     {
388*f6dc9357SAndroid Build Coastguard Worker       const unsigned realIndex = GetRealItemIndex(s.FocusedItem);
389*f6dc9357SAndroid Build Coastguard Worker       if (realIndex != kParentIndex)
390*f6dc9357SAndroid Build Coastguard Worker       {
391*f6dc9357SAndroid Build Coastguard Worker         s.FocusedName = GetItemRelPath(realIndex);
392*f6dc9357SAndroid Build Coastguard Worker         s.FocusedName_Defined = true;
393*f6dc9357SAndroid Build Coastguard Worker 
394*f6dc9357SAndroid Build Coastguard Worker         s.SelectFocused = _listView.IsItemSelected(s.FocusedItem);
395*f6dc9357SAndroid Build Coastguard Worker 
396*f6dc9357SAndroid Build Coastguard Worker         /*
397*f6dc9357SAndroid Build Coastguard Worker         const int kSize = 1024;
398*f6dc9357SAndroid Build Coastguard Worker         WCHAR name[kSize + 1];
399*f6dc9357SAndroid Build Coastguard Worker         LVITEMW item;
400*f6dc9357SAndroid Build Coastguard Worker         item.iItem = focusedItem;
401*f6dc9357SAndroid Build Coastguard Worker         item.pszText = name;
402*f6dc9357SAndroid Build Coastguard Worker         item.cchTextMax = kSize;
403*f6dc9357SAndroid Build Coastguard Worker         item.iSubItem = 0;
404*f6dc9357SAndroid Build Coastguard Worker         item.mask = LVIF_TEXT;
405*f6dc9357SAndroid Build Coastguard Worker         if (_listView.GetItem(&item))
406*f6dc9357SAndroid Build Coastguard Worker         focusedName = item.pszText;
407*f6dc9357SAndroid Build Coastguard Worker         */
408*f6dc9357SAndroid Build Coastguard Worker       }
409*f6dc9357SAndroid Build Coastguard Worker     }
410*f6dc9357SAndroid Build Coastguard Worker   }
411*f6dc9357SAndroid Build Coastguard Worker   GetSelectedNames(s.SelectedNames);
412*f6dc9357SAndroid Build Coastguard Worker }
413*f6dc9357SAndroid Build Coastguard Worker 
414*f6dc9357SAndroid Build Coastguard Worker /*
415*f6dc9357SAndroid Build Coastguard Worker HRESULT CPanel::RefreshListCtrl(const CSelectedState &s)
416*f6dc9357SAndroid Build Coastguard Worker {
417*f6dc9357SAndroid Build Coastguard Worker   bool selectFocused = s.SelectFocused;
418*f6dc9357SAndroid Build Coastguard Worker   if (_mySelectMode)
419*f6dc9357SAndroid Build Coastguard Worker     selectFocused = true;
420*f6dc9357SAndroid Build Coastguard Worker   return RefreshListCtrl2(
421*f6dc9357SAndroid Build Coastguard Worker       s.FocusedItem >= 0, // allowEmptyFocusedName
422*f6dc9357SAndroid Build Coastguard Worker       s.FocusedName, s.FocusedItem, selectFocused, s.SelectedNames);
423*f6dc9357SAndroid Build Coastguard Worker }
424*f6dc9357SAndroid Build Coastguard Worker */
425*f6dc9357SAndroid Build Coastguard Worker 
RefreshListCtrl_SaveFocused(bool onTimer)426*f6dc9357SAndroid Build Coastguard Worker HRESULT CPanel::RefreshListCtrl_SaveFocused(bool onTimer)
427*f6dc9357SAndroid Build Coastguard Worker {
428*f6dc9357SAndroid Build Coastguard Worker   CSelectedState state;
429*f6dc9357SAndroid Build Coastguard Worker   SaveSelectedState(state);
430*f6dc9357SAndroid Build Coastguard Worker   state.CalledFromTimer = onTimer;
431*f6dc9357SAndroid Build Coastguard Worker   return RefreshListCtrl(state);
432*f6dc9357SAndroid Build Coastguard Worker }
433*f6dc9357SAndroid Build Coastguard Worker 
SetFocusedSelectedItem(int index,bool select)434*f6dc9357SAndroid Build Coastguard Worker void CPanel::SetFocusedSelectedItem(int index, bool select)
435*f6dc9357SAndroid Build Coastguard Worker {
436*f6dc9357SAndroid Build Coastguard Worker   UINT state = LVIS_FOCUSED;
437*f6dc9357SAndroid Build Coastguard Worker   if (select)
438*f6dc9357SAndroid Build Coastguard Worker     state |= LVIS_SELECTED;
439*f6dc9357SAndroid Build Coastguard Worker   _listView.SetItemState(index, state, state);
440*f6dc9357SAndroid Build Coastguard Worker   if (!_mySelectMode && select)
441*f6dc9357SAndroid Build Coastguard Worker   {
442*f6dc9357SAndroid Build Coastguard Worker     const unsigned realIndex = GetRealItemIndex(index);
443*f6dc9357SAndroid Build Coastguard Worker     if (realIndex != kParentIndex)
444*f6dc9357SAndroid Build Coastguard Worker       _selectedStatusVector[realIndex] = true;
445*f6dc9357SAndroid Build Coastguard Worker   }
446*f6dc9357SAndroid Build Coastguard Worker }
447*f6dc9357SAndroid Build Coastguard Worker 
448*f6dc9357SAndroid Build Coastguard Worker // #define PRINT_STAT
449*f6dc9357SAndroid Build Coastguard Worker 
450*f6dc9357SAndroid Build Coastguard Worker #ifdef PRINT_STAT
451*f6dc9357SAndroid Build Coastguard Worker   void Print_OnNotify(const char *name);
452*f6dc9357SAndroid Build Coastguard Worker #else
453*f6dc9357SAndroid Build Coastguard Worker   #define Print_OnNotify(x)
454*f6dc9357SAndroid Build Coastguard Worker #endif
455*f6dc9357SAndroid Build Coastguard Worker 
456*f6dc9357SAndroid Build Coastguard Worker 
457*f6dc9357SAndroid Build Coastguard Worker 
458*f6dc9357SAndroid Build Coastguard Worker /*
459*f6dc9357SAndroid Build Coastguard Worker 
460*f6dc9357SAndroid Build Coastguard Worker extern UInt32 g_NumGroups;
461*f6dc9357SAndroid Build Coastguard Worker extern DWORD g_start_tick;
462*f6dc9357SAndroid Build Coastguard Worker extern DWORD g_prev_tick;
463*f6dc9357SAndroid Build Coastguard Worker extern DWORD g_Num_SetItemText;
464*f6dc9357SAndroid Build Coastguard Worker extern UInt32 g_NumMessages;
465*f6dc9357SAndroid Build Coastguard Worker */
466*f6dc9357SAndroid Build Coastguard Worker 
RefreshListCtrl(const CSelectedState & state)467*f6dc9357SAndroid Build Coastguard Worker HRESULT CPanel::RefreshListCtrl(const CSelectedState &state)
468*f6dc9357SAndroid Build Coastguard Worker {
469*f6dc9357SAndroid Build Coastguard Worker   m_DropHighlighted_SelectionIndex = -1;
470*f6dc9357SAndroid Build Coastguard Worker   m_DropHighlighted_SubFolderName.Empty();
471*f6dc9357SAndroid Build Coastguard Worker 
472*f6dc9357SAndroid Build Coastguard Worker   if (!_folder)
473*f6dc9357SAndroid Build Coastguard Worker     return S_OK;
474*f6dc9357SAndroid Build Coastguard Worker 
475*f6dc9357SAndroid Build Coastguard Worker   /*
476*f6dc9357SAndroid Build Coastguard Worker   g_start_tick = GetTickCount();
477*f6dc9357SAndroid Build Coastguard Worker   g_Num_SetItemText = 0;
478*f6dc9357SAndroid Build Coastguard Worker   g_NumMessages = 0;
479*f6dc9357SAndroid Build Coastguard Worker   */
480*f6dc9357SAndroid Build Coastguard Worker 
481*f6dc9357SAndroid Build Coastguard Worker   _dontShowMode = false;
482*f6dc9357SAndroid Build Coastguard Worker   if (!state.CalledFromTimer)
483*f6dc9357SAndroid Build Coastguard Worker     LoadFullPathAndShow();
484*f6dc9357SAndroid Build Coastguard Worker   // OutputDebugStringA("=======\n");
485*f6dc9357SAndroid Build Coastguard Worker   // OutputDebugStringA("s1 \n");
486*f6dc9357SAndroid Build Coastguard Worker   CDisableTimerProcessing timerProcessing(*this);
487*f6dc9357SAndroid Build Coastguard Worker   CDisableNotify disableNotify(*this);
488*f6dc9357SAndroid Build Coastguard Worker 
489*f6dc9357SAndroid Build Coastguard Worker   int focusedPos = state.FocusedItem;
490*f6dc9357SAndroid Build Coastguard Worker   if (focusedPos < 0)
491*f6dc9357SAndroid Build Coastguard Worker     focusedPos = 0;
492*f6dc9357SAndroid Build Coastguard Worker 
493*f6dc9357SAndroid Build Coastguard Worker   _listView.SetRedraw(false);
494*f6dc9357SAndroid Build Coastguard Worker   // m_RedrawEnabled = false;
495*f6dc9357SAndroid Build Coastguard Worker 
496*f6dc9357SAndroid Build Coastguard Worker   LVITEMW item;
497*f6dc9357SAndroid Build Coastguard Worker   ZeroMemory(&item, sizeof(item));
498*f6dc9357SAndroid Build Coastguard Worker 
499*f6dc9357SAndroid Build Coastguard Worker   // DWORD tickCount0 = GetTickCount();
500*f6dc9357SAndroid Build Coastguard Worker 
501*f6dc9357SAndroid Build Coastguard Worker   // _enableItemChangeNotify = false;
502*f6dc9357SAndroid Build Coastguard Worker   DeleteListItems();
503*f6dc9357SAndroid Build Coastguard Worker   _enableItemChangeNotify = true;
504*f6dc9357SAndroid Build Coastguard Worker 
505*f6dc9357SAndroid Build Coastguard Worker   int listViewItemCount = 0;
506*f6dc9357SAndroid Build Coastguard Worker 
507*f6dc9357SAndroid Build Coastguard Worker   _selectedStatusVector.Clear();
508*f6dc9357SAndroid Build Coastguard Worker   // _realIndices.Clear();
509*f6dc9357SAndroid Build Coastguard Worker   _startGroupSelect = 0;
510*f6dc9357SAndroid Build Coastguard Worker 
511*f6dc9357SAndroid Build Coastguard Worker   _selectionIsDefined = false;
512*f6dc9357SAndroid Build Coastguard Worker 
513*f6dc9357SAndroid Build Coastguard Worker   // m_Files.Clear();
514*f6dc9357SAndroid Build Coastguard Worker 
515*f6dc9357SAndroid Build Coastguard Worker   /*
516*f6dc9357SAndroid Build Coastguard Worker   if (!_folder)
517*f6dc9357SAndroid Build Coastguard Worker   {
518*f6dc9357SAndroid Build Coastguard Worker     // throw 1;
519*f6dc9357SAndroid Build Coastguard Worker     SetToRootFolder();
520*f6dc9357SAndroid Build Coastguard Worker   }
521*f6dc9357SAndroid Build Coastguard Worker   */
522*f6dc9357SAndroid Build Coastguard Worker 
523*f6dc9357SAndroid Build Coastguard Worker   _headerToolBar.EnableButton(kParentFolderID, !IsRootFolder());
524*f6dc9357SAndroid Build Coastguard Worker 
525*f6dc9357SAndroid Build Coastguard Worker   {
526*f6dc9357SAndroid Build Coastguard Worker     CMyComPtr<IFolderSetFlatMode> folderSetFlatMode;
527*f6dc9357SAndroid Build Coastguard Worker     _folder.QueryInterface(IID_IFolderSetFlatMode, &folderSetFlatMode);
528*f6dc9357SAndroid Build Coastguard Worker     if (folderSetFlatMode)
529*f6dc9357SAndroid Build Coastguard Worker       folderSetFlatMode->SetFlatMode(BoolToInt(_flatMode));
530*f6dc9357SAndroid Build Coastguard Worker   }
531*f6dc9357SAndroid Build Coastguard Worker 
532*f6dc9357SAndroid Build Coastguard Worker   /*
533*f6dc9357SAndroid Build Coastguard Worker   {
534*f6dc9357SAndroid Build Coastguard Worker     CMyComPtr<IFolderSetShowNtfsStreamsMode> setShow;
535*f6dc9357SAndroid Build Coastguard Worker     _folder.QueryInterface(IID_IFolderSetShowNtfsStreamsMode, &setShow);
536*f6dc9357SAndroid Build Coastguard Worker     if (setShow)
537*f6dc9357SAndroid Build Coastguard Worker       setShow->SetShowNtfsStreamsMode(BoolToInt(_showNtfsStrems_Mode));
538*f6dc9357SAndroid Build Coastguard Worker   }
539*f6dc9357SAndroid Build Coastguard Worker   */
540*f6dc9357SAndroid Build Coastguard Worker 
541*f6dc9357SAndroid Build Coastguard Worker   _isDirVector.Clear();
542*f6dc9357SAndroid Build Coastguard Worker   // DWORD tickCount1 = GetTickCount();
543*f6dc9357SAndroid Build Coastguard Worker   IFolderFolder *folder = _folder;
544*f6dc9357SAndroid Build Coastguard Worker   RINOK(_folder->LoadItems())
545*f6dc9357SAndroid Build Coastguard Worker   // DWORD tickCount2 = GetTickCount();
546*f6dc9357SAndroid Build Coastguard Worker   // OutputDebugString(TEXT("Start Dir\n"));
547*f6dc9357SAndroid Build Coastguard Worker   RINOK(InitColumns())
548*f6dc9357SAndroid Build Coastguard Worker 
549*f6dc9357SAndroid Build Coastguard Worker   UInt32 numItems;
550*f6dc9357SAndroid Build Coastguard Worker   _folder->GetNumberOfItems(&numItems);
551*f6dc9357SAndroid Build Coastguard Worker   {
552*f6dc9357SAndroid Build Coastguard Worker     NCOM::CPropVariant prop;
553*f6dc9357SAndroid Build Coastguard Worker     _isDirVector.ClearAndSetSize(numItems);
554*f6dc9357SAndroid Build Coastguard Worker     bool *vec = _isDirVector.NonConstData();
555*f6dc9357SAndroid Build Coastguard Worker     HRESULT hres = S_OK;
556*f6dc9357SAndroid Build Coastguard Worker     unsigned i;
557*f6dc9357SAndroid Build Coastguard Worker     for (i = 0; i < numItems; i++)
558*f6dc9357SAndroid Build Coastguard Worker     {
559*f6dc9357SAndroid Build Coastguard Worker       hres = folder->GetProperty(i, kpidIsDir, &prop);
560*f6dc9357SAndroid Build Coastguard Worker       if (hres != S_OK)
561*f6dc9357SAndroid Build Coastguard Worker         break;
562*f6dc9357SAndroid Build Coastguard Worker       bool v = false;
563*f6dc9357SAndroid Build Coastguard Worker       if (prop.vt == VT_BOOL)
564*f6dc9357SAndroid Build Coastguard Worker         v = VARIANT_BOOLToBool(prop.boolVal);
565*f6dc9357SAndroid Build Coastguard Worker       else if (prop.vt != VT_EMPTY)
566*f6dc9357SAndroid Build Coastguard Worker         break;
567*f6dc9357SAndroid Build Coastguard Worker       vec[i] = v;
568*f6dc9357SAndroid Build Coastguard Worker     }
569*f6dc9357SAndroid Build Coastguard Worker     if (i != numItems)
570*f6dc9357SAndroid Build Coastguard Worker     {
571*f6dc9357SAndroid Build Coastguard Worker       _isDirVector.Clear();
572*f6dc9357SAndroid Build Coastguard Worker       if (hres == S_OK)
573*f6dc9357SAndroid Build Coastguard Worker         hres = E_FAIL;
574*f6dc9357SAndroid Build Coastguard Worker     }
575*f6dc9357SAndroid Build Coastguard Worker     RINOK(hres)
576*f6dc9357SAndroid Build Coastguard Worker   }
577*f6dc9357SAndroid Build Coastguard Worker 
578*f6dc9357SAndroid Build Coastguard Worker   const bool showDots = _showDots && !IsRootFolder();
579*f6dc9357SAndroid Build Coastguard Worker 
580*f6dc9357SAndroid Build Coastguard Worker   _listView.SetItemCount(numItems + (showDots ? 1 : 0));
581*f6dc9357SAndroid Build Coastguard Worker 
582*f6dc9357SAndroid Build Coastguard Worker   _selectedStatusVector.ClearAndReserve(numItems);
583*f6dc9357SAndroid Build Coastguard Worker   int cursorIndex = -1;
584*f6dc9357SAndroid Build Coastguard Worker 
585*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<IFolderGetSystemIconIndex> folderGetSystemIconIndex;
586*f6dc9357SAndroid Build Coastguard Worker #if 1 // 0 : for debug local icons loading
587*f6dc9357SAndroid Build Coastguard Worker   if (!Is_Slow_Icon_Folder() || _showRealFileIcons)
588*f6dc9357SAndroid Build Coastguard Worker     _folder.QueryInterface(IID_IFolderGetSystemIconIndex, &folderGetSystemIconIndex);
589*f6dc9357SAndroid Build Coastguard Worker #endif
590*f6dc9357SAndroid Build Coastguard Worker 
591*f6dc9357SAndroid Build Coastguard Worker   const bool isFSDrivesFolder = IsFSDrivesFolder();
592*f6dc9357SAndroid Build Coastguard Worker   const bool isArcFolder = IsArcFolder();
593*f6dc9357SAndroid Build Coastguard Worker 
594*f6dc9357SAndroid Build Coastguard Worker   if (!IsFSFolder())
595*f6dc9357SAndroid Build Coastguard Worker   {
596*f6dc9357SAndroid Build Coastguard Worker     CMyComPtr<IGetFolderArcProps> getFolderArcProps;
597*f6dc9357SAndroid Build Coastguard Worker     _folder.QueryInterface(IID_IGetFolderArcProps, &getFolderArcProps);
598*f6dc9357SAndroid Build Coastguard Worker     _thereAreDeletedItems = false;
599*f6dc9357SAndroid Build Coastguard Worker     if (getFolderArcProps)
600*f6dc9357SAndroid Build Coastguard Worker     {
601*f6dc9357SAndroid Build Coastguard Worker       CMyComPtr<IFolderArcProps> arcProps;
602*f6dc9357SAndroid Build Coastguard Worker       getFolderArcProps->GetFolderArcProps(&arcProps);
603*f6dc9357SAndroid Build Coastguard Worker       if (arcProps)
604*f6dc9357SAndroid Build Coastguard Worker       {
605*f6dc9357SAndroid Build Coastguard Worker         UInt32 numLevels;
606*f6dc9357SAndroid Build Coastguard Worker         if (arcProps->GetArcNumLevels(&numLevels) != S_OK)
607*f6dc9357SAndroid Build Coastguard Worker           numLevels = 0;
608*f6dc9357SAndroid Build Coastguard Worker         NCOM::CPropVariant prop;
609*f6dc9357SAndroid Build Coastguard Worker         if (arcProps->GetArcProp(numLevels - 1, kpidIsDeleted, &prop) == S_OK)
610*f6dc9357SAndroid Build Coastguard Worker           if (prop.vt == VT_BOOL && VARIANT_BOOLToBool(prop.boolVal))
611*f6dc9357SAndroid Build Coastguard Worker             _thereAreDeletedItems = true;
612*f6dc9357SAndroid Build Coastguard Worker       }
613*f6dc9357SAndroid Build Coastguard Worker     }
614*f6dc9357SAndroid Build Coastguard Worker   }
615*f6dc9357SAndroid Build Coastguard Worker 
616*f6dc9357SAndroid Build Coastguard Worker   _thereAre_ListView_Items = true;
617*f6dc9357SAndroid Build Coastguard Worker 
618*f6dc9357SAndroid Build Coastguard Worker   // OutputDebugStringA("\n\n");
619*f6dc9357SAndroid Build Coastguard Worker 
620*f6dc9357SAndroid Build Coastguard Worker   Print_OnNotify("===== Before Load");
621*f6dc9357SAndroid Build Coastguard Worker 
622*f6dc9357SAndroid Build Coastguard Worker   // #define USE_EMBED_ITEM
623*f6dc9357SAndroid Build Coastguard Worker 
624*f6dc9357SAndroid Build Coastguard Worker   if (showDots)
625*f6dc9357SAndroid Build Coastguard Worker   {
626*f6dc9357SAndroid Build Coastguard Worker     const UString itemName ("..");
627*f6dc9357SAndroid Build Coastguard Worker     item.iItem = listViewItemCount;
628*f6dc9357SAndroid Build Coastguard Worker     if (itemName == state.FocusedName)
629*f6dc9357SAndroid Build Coastguard Worker       cursorIndex = listViewItemCount;
630*f6dc9357SAndroid Build Coastguard Worker     item.mask = LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE;
631*f6dc9357SAndroid Build Coastguard Worker     int subItem = 0;
632*f6dc9357SAndroid Build Coastguard Worker     item.iSubItem = subItem++;
633*f6dc9357SAndroid Build Coastguard Worker     item.lParam = (LPARAM)(int)kParentIndex;
634*f6dc9357SAndroid Build Coastguard Worker     #ifdef USE_EMBED_ITEM
635*f6dc9357SAndroid Build Coastguard Worker     item.pszText = const_cast<wchar_t *>((const wchar_t *)itemName);
636*f6dc9357SAndroid Build Coastguard Worker     #else
637*f6dc9357SAndroid Build Coastguard Worker     item.pszText = LPSTR_TEXTCALLBACKW;
638*f6dc9357SAndroid Build Coastguard Worker     #endif
639*f6dc9357SAndroid Build Coastguard Worker     // const UInt32 attrib = FILE_ATTRIBUTE_DIRECTORY;
640*f6dc9357SAndroid Build Coastguard Worker     item.iImage = g_Ext_to_Icon_Map.GetIconIndex_DIR();
641*f6dc9357SAndroid Build Coastguard Worker         // g_Ext_to_Icon_Map.GetIconIndex(attrib, itemName);
642*f6dc9357SAndroid Build Coastguard Worker     if (item.iImage < 0)
643*f6dc9357SAndroid Build Coastguard Worker         item.iImage = 0;
644*f6dc9357SAndroid Build Coastguard Worker     if (_listView.InsertItem(&item) == -1)
645*f6dc9357SAndroid Build Coastguard Worker       return E_FAIL;
646*f6dc9357SAndroid Build Coastguard Worker     listViewItemCount++;
647*f6dc9357SAndroid Build Coastguard Worker   }
648*f6dc9357SAndroid Build Coastguard Worker 
649*f6dc9357SAndroid Build Coastguard Worker   // OutputDebugStringA("S1\n");
650*f6dc9357SAndroid Build Coastguard Worker 
651*f6dc9357SAndroid Build Coastguard Worker   UString correctedName;
652*f6dc9357SAndroid Build Coastguard Worker   UString itemName;
653*f6dc9357SAndroid Build Coastguard Worker   UString relPath;
654*f6dc9357SAndroid Build Coastguard Worker 
655*f6dc9357SAndroid Build Coastguard Worker   for (UInt32 i = 0; i < numItems; i++)
656*f6dc9357SAndroid Build Coastguard Worker   {
657*f6dc9357SAndroid Build Coastguard Worker     const wchar_t *name = NULL;
658*f6dc9357SAndroid Build Coastguard Worker     unsigned nameLen = 0;
659*f6dc9357SAndroid Build Coastguard Worker 
660*f6dc9357SAndroid Build Coastguard Worker     if (_folderGetItemName)
661*f6dc9357SAndroid Build Coastguard Worker       _folderGetItemName->GetItemName(i, &name, &nameLen);
662*f6dc9357SAndroid Build Coastguard Worker     if (!name)
663*f6dc9357SAndroid Build Coastguard Worker     {
664*f6dc9357SAndroid Build Coastguard Worker       GetItemName(i, itemName);
665*f6dc9357SAndroid Build Coastguard Worker       name = itemName;
666*f6dc9357SAndroid Build Coastguard Worker       nameLen = itemName.Len();
667*f6dc9357SAndroid Build Coastguard Worker     }
668*f6dc9357SAndroid Build Coastguard Worker 
669*f6dc9357SAndroid Build Coastguard Worker     bool selected = false;
670*f6dc9357SAndroid Build Coastguard Worker 
671*f6dc9357SAndroid Build Coastguard Worker     if (state.FocusedName_Defined || !state.SelectedNames.IsEmpty())
672*f6dc9357SAndroid Build Coastguard Worker     {
673*f6dc9357SAndroid Build Coastguard Worker       relPath.Empty();
674*f6dc9357SAndroid Build Coastguard Worker       // relPath += GetItemPrefix(i);
675*f6dc9357SAndroid Build Coastguard Worker       if (_flatMode)
676*f6dc9357SAndroid Build Coastguard Worker       {
677*f6dc9357SAndroid Build Coastguard Worker         const wchar_t *prefix = NULL;
678*f6dc9357SAndroid Build Coastguard Worker         if (_folderGetItemName)
679*f6dc9357SAndroid Build Coastguard Worker         {
680*f6dc9357SAndroid Build Coastguard Worker           unsigned prefixLen = 0;
681*f6dc9357SAndroid Build Coastguard Worker           _folderGetItemName->GetItemPrefix(i, &prefix, &prefixLen);
682*f6dc9357SAndroid Build Coastguard Worker           if (prefix)
683*f6dc9357SAndroid Build Coastguard Worker             relPath = prefix;
684*f6dc9357SAndroid Build Coastguard Worker         }
685*f6dc9357SAndroid Build Coastguard Worker         if (!prefix)
686*f6dc9357SAndroid Build Coastguard Worker         {
687*f6dc9357SAndroid Build Coastguard Worker           NCOM::CPropVariant prop;
688*f6dc9357SAndroid Build Coastguard Worker           if (_folder->GetProperty(i, kpidPrefix, &prop) != S_OK)
689*f6dc9357SAndroid Build Coastguard Worker             throw 2723400;
690*f6dc9357SAndroid Build Coastguard Worker           if (prop.vt == VT_BSTR)
691*f6dc9357SAndroid Build Coastguard Worker             relPath.SetFromBstr(prop.bstrVal);
692*f6dc9357SAndroid Build Coastguard Worker         }
693*f6dc9357SAndroid Build Coastguard Worker       }
694*f6dc9357SAndroid Build Coastguard Worker       relPath += name;
695*f6dc9357SAndroid Build Coastguard Worker       if (relPath == state.FocusedName)
696*f6dc9357SAndroid Build Coastguard Worker         cursorIndex = listViewItemCount;
697*f6dc9357SAndroid Build Coastguard Worker       if (state.SelectedNames.FindInSorted(relPath) != -1)
698*f6dc9357SAndroid Build Coastguard Worker         selected = true;
699*f6dc9357SAndroid Build Coastguard Worker     }
700*f6dc9357SAndroid Build Coastguard Worker 
701*f6dc9357SAndroid Build Coastguard Worker     _selectedStatusVector.AddInReserved(selected);
702*f6dc9357SAndroid Build Coastguard Worker 
703*f6dc9357SAndroid Build Coastguard Worker     item.mask = LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE;
704*f6dc9357SAndroid Build Coastguard Worker 
705*f6dc9357SAndroid Build Coastguard Worker     if (!_mySelectMode)
706*f6dc9357SAndroid Build Coastguard Worker       if (selected)
707*f6dc9357SAndroid Build Coastguard Worker       {
708*f6dc9357SAndroid Build Coastguard Worker         item.mask |= LVIF_STATE;
709*f6dc9357SAndroid Build Coastguard Worker         item.state = LVIS_SELECTED;
710*f6dc9357SAndroid Build Coastguard Worker       }
711*f6dc9357SAndroid Build Coastguard Worker 
712*f6dc9357SAndroid Build Coastguard Worker     int subItem = 0;
713*f6dc9357SAndroid Build Coastguard Worker     item.iItem = listViewItemCount;
714*f6dc9357SAndroid Build Coastguard Worker 
715*f6dc9357SAndroid Build Coastguard Worker     item.iSubItem = subItem++;
716*f6dc9357SAndroid Build Coastguard Worker     item.lParam = (LPARAM)i;
717*f6dc9357SAndroid Build Coastguard Worker 
718*f6dc9357SAndroid Build Coastguard Worker     /*
719*f6dc9357SAndroid Build Coastguard Worker     int finish = nameLen - 4;
720*f6dc9357SAndroid Build Coastguard Worker     int j;
721*f6dc9357SAndroid Build Coastguard Worker     for (j = 0; j < finish; j++)
722*f6dc9357SAndroid Build Coastguard Worker     {
723*f6dc9357SAndroid Build Coastguard Worker       if (name[j    ] == ' ' &&
724*f6dc9357SAndroid Build Coastguard Worker           name[j + 1] == ' ' &&
725*f6dc9357SAndroid Build Coastguard Worker           name[j + 2] == ' ' &&
726*f6dc9357SAndroid Build Coastguard Worker           name[j + 3] == ' ' &&
727*f6dc9357SAndroid Build Coastguard Worker           name[j + 4] == ' ')
728*f6dc9357SAndroid Build Coastguard Worker         break;
729*f6dc9357SAndroid Build Coastguard Worker     }
730*f6dc9357SAndroid Build Coastguard Worker     if (j < finish)
731*f6dc9357SAndroid Build Coastguard Worker     {
732*f6dc9357SAndroid Build Coastguard Worker       correctedName.Empty();
733*f6dc9357SAndroid Build Coastguard Worker       correctedName = "virus";
734*f6dc9357SAndroid Build Coastguard Worker       int pos = 0;
735*f6dc9357SAndroid Build Coastguard Worker       for (;;)
736*f6dc9357SAndroid Build Coastguard Worker       {
737*f6dc9357SAndroid Build Coastguard Worker         int posNew = itemName.Find(L"     ", pos);
738*f6dc9357SAndroid Build Coastguard Worker         if (posNew < 0)
739*f6dc9357SAndroid Build Coastguard Worker         {
740*f6dc9357SAndroid Build Coastguard Worker           correctedName += itemName.Ptr(pos);
741*f6dc9357SAndroid Build Coastguard Worker           break;
742*f6dc9357SAndroid Build Coastguard Worker         }
743*f6dc9357SAndroid Build Coastguard Worker         correctedName += itemName.Mid(pos, posNew - pos);
744*f6dc9357SAndroid Build Coastguard Worker         correctedName += " ... ";
745*f6dc9357SAndroid Build Coastguard Worker         pos = posNew;
746*f6dc9357SAndroid Build Coastguard Worker         while (itemName[++pos] == ' ');
747*f6dc9357SAndroid Build Coastguard Worker       }
748*f6dc9357SAndroid Build Coastguard Worker       item.pszText = const_cast<wchar_t *>((const wchar_t *)correctedName);
749*f6dc9357SAndroid Build Coastguard Worker     }
750*f6dc9357SAndroid Build Coastguard Worker     else
751*f6dc9357SAndroid Build Coastguard Worker     */
752*f6dc9357SAndroid Build Coastguard Worker     {
753*f6dc9357SAndroid Build Coastguard Worker       #ifdef USE_EMBED_ITEM
754*f6dc9357SAndroid Build Coastguard Worker       item.pszText = const_cast<wchar_t *>((const wchar_t *)name);
755*f6dc9357SAndroid Build Coastguard Worker       #else
756*f6dc9357SAndroid Build Coastguard Worker       item.pszText = LPSTR_TEXTCALLBACKW;
757*f6dc9357SAndroid Build Coastguard Worker       #endif
758*f6dc9357SAndroid Build Coastguard Worker       /* LPSTR_TEXTCALLBACKW works, but in some cases there are problems,
759*f6dc9357SAndroid Build Coastguard Worker       since we block notify handler.
760*f6dc9357SAndroid Build Coastguard Worker       LPSTR_TEXTCALLBACKW can be 2-3 times faster for loading in this loop. */
761*f6dc9357SAndroid Build Coastguard Worker     }
762*f6dc9357SAndroid Build Coastguard Worker 
763*f6dc9357SAndroid Build Coastguard Worker     bool defined = false;
764*f6dc9357SAndroid Build Coastguard Worker     item.iImage = -1;
765*f6dc9357SAndroid Build Coastguard Worker 
766*f6dc9357SAndroid Build Coastguard Worker     if (folderGetSystemIconIndex)
767*f6dc9357SAndroid Build Coastguard Worker     {
768*f6dc9357SAndroid Build Coastguard Worker       const HRESULT res = folderGetSystemIconIndex->GetSystemIconIndex(i, &item.iImage);
769*f6dc9357SAndroid Build Coastguard Worker       if (res == S_OK)
770*f6dc9357SAndroid Build Coastguard Worker       {
771*f6dc9357SAndroid Build Coastguard Worker         // item.iImage = -1; // for debug
772*f6dc9357SAndroid Build Coastguard Worker         defined = (item.iImage > 0);
773*f6dc9357SAndroid Build Coastguard Worker #if 0 // 0: can be slower: 2 attempts for some paths.
774*f6dc9357SAndroid Build Coastguard Worker       // 1: faster, but we can get default icon for some cases (where non default icon is possible)
775*f6dc9357SAndroid Build Coastguard Worker 
776*f6dc9357SAndroid Build Coastguard Worker         if (item.iImage == 0)
777*f6dc9357SAndroid Build Coastguard Worker         {
778*f6dc9357SAndroid Build Coastguard Worker           // (item.iImage == 0) means default icon.
779*f6dc9357SAndroid Build Coastguard Worker           // But (item.iImage == 0) also can be returned for exe/ico files,
780*f6dc9357SAndroid Build Coastguard Worker           // if filePath is LONG PATH (path_len() >= MAX_PATH).
781*f6dc9357SAndroid Build Coastguard Worker           // Also we want to show split icon (.001) for any split extension: 001 002 003.
782*f6dc9357SAndroid Build Coastguard Worker           // Are there another cases for (item.iImage == 0) for files with known extensions?
783*f6dc9357SAndroid Build Coastguard Worker           // We don't want to do second attempt to request icon,
784*f6dc9357SAndroid Build Coastguard Worker           // if it also will return (item.iImage == 0).
785*f6dc9357SAndroid Build Coastguard Worker 
786*f6dc9357SAndroid Build Coastguard Worker           int dotPos = -1;
787*f6dc9357SAndroid Build Coastguard Worker           for (unsigned k = 0;; k++)
788*f6dc9357SAndroid Build Coastguard Worker           {
789*f6dc9357SAndroid Build Coastguard Worker             const wchar_t c = name[k];
790*f6dc9357SAndroid Build Coastguard Worker             if (c == 0)
791*f6dc9357SAndroid Build Coastguard Worker               break;
792*f6dc9357SAndroid Build Coastguard Worker             if (c == '.')
793*f6dc9357SAndroid Build Coastguard Worker               dotPos = (int)i;
794*f6dc9357SAndroid Build Coastguard Worker             // we don't need IS_PATH_SEPAR check, because we have only (fileName) doesn't include path prefix.
795*f6dc9357SAndroid Build Coastguard Worker             // if (IS_PATH_SEPAR(c) || c == ':') dotPos = -1;
796*f6dc9357SAndroid Build Coastguard Worker           }
797*f6dc9357SAndroid Build Coastguard Worker           defined = true;
798*f6dc9357SAndroid Build Coastguard Worker           if (dotPos >= 0)
799*f6dc9357SAndroid Build Coastguard Worker           {
800*f6dc9357SAndroid Build Coastguard Worker #if 0
801*f6dc9357SAndroid Build Coastguard Worker             const wchar_t *ext = name + dotPos;
802*f6dc9357SAndroid Build Coastguard Worker             if (StringsAreEqualNoCase_Ascii(ext, ".exe") ||
803*f6dc9357SAndroid Build Coastguard Worker                 StringsAreEqualNoCase_Ascii(ext, ".ico"))
804*f6dc9357SAndroid Build Coastguard Worker #endif
805*f6dc9357SAndroid Build Coastguard Worker               defined = false;
806*f6dc9357SAndroid Build Coastguard Worker           }
807*f6dc9357SAndroid Build Coastguard Worker         }
808*f6dc9357SAndroid Build Coastguard Worker #endif
809*f6dc9357SAndroid Build Coastguard Worker       }
810*f6dc9357SAndroid Build Coastguard Worker     }
811*f6dc9357SAndroid Build Coastguard Worker 
812*f6dc9357SAndroid Build Coastguard Worker     if (!defined)
813*f6dc9357SAndroid Build Coastguard Worker     {
814*f6dc9357SAndroid Build Coastguard Worker       UInt32 attrib = 0;
815*f6dc9357SAndroid Build Coastguard Worker       {
816*f6dc9357SAndroid Build Coastguard Worker         NCOM::CPropVariant prop;
817*f6dc9357SAndroid Build Coastguard Worker         RINOK(_folder->GetProperty(i, kpidAttrib, &prop))
818*f6dc9357SAndroid Build Coastguard Worker         if (prop.vt == VT_UI4)
819*f6dc9357SAndroid Build Coastguard Worker         {
820*f6dc9357SAndroid Build Coastguard Worker           attrib = prop.ulVal;
821*f6dc9357SAndroid Build Coastguard Worker           if (isArcFolder)
822*f6dc9357SAndroid Build Coastguard Worker           {
823*f6dc9357SAndroid Build Coastguard Worker             // if attrib (high 16-bits) is supposed from posix,
824*f6dc9357SAndroid Build Coastguard Worker             // we keep only low bits (basic Windows attrib flags):
825*f6dc9357SAndroid Build Coastguard Worker             if (attrib & 0xF0000000)
826*f6dc9357SAndroid Build Coastguard Worker               attrib &= 0x3FFF;
827*f6dc9357SAndroid Build Coastguard Worker           }
828*f6dc9357SAndroid Build Coastguard Worker         }
829*f6dc9357SAndroid Build Coastguard Worker       }
830*f6dc9357SAndroid Build Coastguard Worker       if (IsItem_Folder(i))
831*f6dc9357SAndroid Build Coastguard Worker         attrib |= FILE_ATTRIBUTE_DIRECTORY;
832*f6dc9357SAndroid Build Coastguard Worker       else
833*f6dc9357SAndroid Build Coastguard Worker         attrib &= ~(UInt32)FILE_ATTRIBUTE_DIRECTORY;
834*f6dc9357SAndroid Build Coastguard Worker 
835*f6dc9357SAndroid Build Coastguard Worker       item.iImage = -1;
836*f6dc9357SAndroid Build Coastguard Worker       if (isFSDrivesFolder)
837*f6dc9357SAndroid Build Coastguard Worker       {
838*f6dc9357SAndroid Build Coastguard Worker         FString fs (us2fs((UString)name));
839*f6dc9357SAndroid Build Coastguard Worker         fs.Add_PathSepar();
840*f6dc9357SAndroid Build Coastguard Worker         item.iImage = Shell_GetFileInfo_SysIconIndex_for_Path(fs, attrib);
841*f6dc9357SAndroid Build Coastguard Worker         // item.iImage = 0; // for debug
842*f6dc9357SAndroid Build Coastguard Worker       }
843*f6dc9357SAndroid Build Coastguard Worker       if (item.iImage < 0) // <= 0 check?
844*f6dc9357SAndroid Build Coastguard Worker         item.iImage = g_Ext_to_Icon_Map.GetIconIndex(attrib, name);
845*f6dc9357SAndroid Build Coastguard Worker     }
846*f6dc9357SAndroid Build Coastguard Worker 
847*f6dc9357SAndroid Build Coastguard Worker     // item.iImage = -1; // for debug
848*f6dc9357SAndroid Build Coastguard Worker     if (item.iImage < 0)
849*f6dc9357SAndroid Build Coastguard Worker         item.iImage = 0; // default image
850*f6dc9357SAndroid Build Coastguard Worker     if (_listView.InsertItem(&item) == -1)
851*f6dc9357SAndroid Build Coastguard Worker       return E_FAIL;
852*f6dc9357SAndroid Build Coastguard Worker     listViewItemCount++;
853*f6dc9357SAndroid Build Coastguard Worker   }
854*f6dc9357SAndroid Build Coastguard Worker 
855*f6dc9357SAndroid Build Coastguard Worker   /*
856*f6dc9357SAndroid Build Coastguard Worker     xp-64: there is different order when Windows calls CPanel::OnNotify for _listView modes:
857*f6dc9357SAndroid Build Coastguard Worker     Details      : after whole code
858*f6dc9357SAndroid Build Coastguard Worker     List         : 2 times:
859*f6dc9357SAndroid Build Coastguard Worker                         1) - ListView.SotRedraw()
860*f6dc9357SAndroid Build Coastguard Worker                         2) - after whole code
861*f6dc9357SAndroid Build Coastguard Worker     Small Icons  :
862*f6dc9357SAndroid Build Coastguard Worker     Large icons  : 2 times:
863*f6dc9357SAndroid Build Coastguard Worker                         1) - ListView.Sort()
864*f6dc9357SAndroid Build Coastguard Worker                         2) - after whole code (calls with reverse order of items)
865*f6dc9357SAndroid Build Coastguard Worker 
866*f6dc9357SAndroid Build Coastguard Worker     So we need to allow Notify(), when windows requests names during the following code.
867*f6dc9357SAndroid Build Coastguard Worker   */
868*f6dc9357SAndroid Build Coastguard Worker 
869*f6dc9357SAndroid Build Coastguard Worker   Print_OnNotify("after Load");
870*f6dc9357SAndroid Build Coastguard Worker 
871*f6dc9357SAndroid Build Coastguard Worker   disableNotify.SetMemMode_Enable();
872*f6dc9357SAndroid Build Coastguard Worker   disableNotify.Restore();
873*f6dc9357SAndroid Build Coastguard Worker 
874*f6dc9357SAndroid Build Coastguard Worker   if (_listView.GetItemCount() > 0 && cursorIndex >= 0)
875*f6dc9357SAndroid Build Coastguard Worker     SetFocusedSelectedItem(cursorIndex, state.SelectFocused);
876*f6dc9357SAndroid Build Coastguard Worker 
877*f6dc9357SAndroid Build Coastguard Worker   Print_OnNotify("after SetFocusedSelectedItem");
878*f6dc9357SAndroid Build Coastguard Worker 
879*f6dc9357SAndroid Build Coastguard Worker   SetSortRawStatus();
880*f6dc9357SAndroid Build Coastguard Worker   _listView.SortItems(CompareItems, (LPARAM)this);
881*f6dc9357SAndroid Build Coastguard Worker 
882*f6dc9357SAndroid Build Coastguard Worker   Print_OnNotify("after  Sort");
883*f6dc9357SAndroid Build Coastguard Worker 
884*f6dc9357SAndroid Build Coastguard Worker   if (cursorIndex < 0 && _listView.GetItemCount() > 0)
885*f6dc9357SAndroid Build Coastguard Worker   {
886*f6dc9357SAndroid Build Coastguard Worker     if (focusedPos >= _listView.GetItemCount())
887*f6dc9357SAndroid Build Coastguard Worker       focusedPos = _listView.GetItemCount() - 1;
888*f6dc9357SAndroid Build Coastguard Worker     // we select item only in showDots mode.
889*f6dc9357SAndroid Build Coastguard Worker     SetFocusedSelectedItem(focusedPos, showDots && (focusedPos == 0));
890*f6dc9357SAndroid Build Coastguard Worker   }
891*f6dc9357SAndroid Build Coastguard Worker 
892*f6dc9357SAndroid Build Coastguard Worker   // m_RedrawEnabled = true;
893*f6dc9357SAndroid Build Coastguard Worker 
894*f6dc9357SAndroid Build Coastguard Worker   Print_OnNotify("after  SetFocusedSelectedItem2");
895*f6dc9357SAndroid Build Coastguard Worker 
896*f6dc9357SAndroid Build Coastguard Worker   _listView.EnsureVisible(_listView.GetFocusedItem(), false);
897*f6dc9357SAndroid Build Coastguard Worker 
898*f6dc9357SAndroid Build Coastguard Worker   // disableNotify.SetMemMode_Enable();
899*f6dc9357SAndroid Build Coastguard Worker   // disableNotify.Restore();
900*f6dc9357SAndroid Build Coastguard Worker 
901*f6dc9357SAndroid Build Coastguard Worker   Print_OnNotify("after  EnsureVisible");
902*f6dc9357SAndroid Build Coastguard Worker 
903*f6dc9357SAndroid Build Coastguard Worker   _listView.SetRedraw(true);
904*f6dc9357SAndroid Build Coastguard Worker 
905*f6dc9357SAndroid Build Coastguard Worker   Print_OnNotify("after  SetRedraw");
906*f6dc9357SAndroid Build Coastguard Worker 
907*f6dc9357SAndroid Build Coastguard Worker   _listView.InvalidateRect(NULL, true);
908*f6dc9357SAndroid Build Coastguard Worker 
909*f6dc9357SAndroid Build Coastguard Worker   Print_OnNotify("after InvalidateRect");
910*f6dc9357SAndroid Build Coastguard Worker   /*
911*f6dc9357SAndroid Build Coastguard Worker   _listView.UpdateWindow();
912*f6dc9357SAndroid Build Coastguard Worker   */
913*f6dc9357SAndroid Build Coastguard Worker   Refresh_StatusBar();
914*f6dc9357SAndroid Build Coastguard Worker   /*
915*f6dc9357SAndroid Build Coastguard Worker   char s[256];
916*f6dc9357SAndroid Build Coastguard Worker   sprintf(s,
917*f6dc9357SAndroid Build Coastguard Worker       // "attribMap = %5d, extMap = %5d, "
918*f6dc9357SAndroid Build Coastguard Worker       "delete = %5d, load = %5d, list = %5d, sort = %5d, end = %5d",
919*f6dc9357SAndroid Build Coastguard Worker       // g_Ext_to_Icon_Map._attribMap.Size(),
920*f6dc9357SAndroid Build Coastguard Worker       // g_Ext_to_Icon_Map._extMap.Size(),
921*f6dc9357SAndroid Build Coastguard Worker       tickCount1 - tickCount0,
922*f6dc9357SAndroid Build Coastguard Worker       tickCount2 - tickCount1,
923*f6dc9357SAndroid Build Coastguard Worker       tickCount3 - tickCount2,
924*f6dc9357SAndroid Build Coastguard Worker       tickCount4 - tickCount3,
925*f6dc9357SAndroid Build Coastguard Worker       tickCount5 - tickCount4
926*f6dc9357SAndroid Build Coastguard Worker       );
927*f6dc9357SAndroid Build Coastguard Worker   sprintf(s,
928*f6dc9357SAndroid Build Coastguard Worker       "5 = %5d, 6 = %5d, 7 = %5d, 8 = %5d, 9 = %5d",
929*f6dc9357SAndroid Build Coastguard Worker       tickCount5 - tickCount4,
930*f6dc9357SAndroid Build Coastguard Worker       tickCount6 - tickCount5,
931*f6dc9357SAndroid Build Coastguard Worker       tickCount7 - tickCount6,
932*f6dc9357SAndroid Build Coastguard Worker       tickCount8 - tickCount7,
933*f6dc9357SAndroid Build Coastguard Worker       tickCount9 - tickCount8
934*f6dc9357SAndroid Build Coastguard Worker       );
935*f6dc9357SAndroid Build Coastguard Worker   OutputDebugStringA(s);
936*f6dc9357SAndroid Build Coastguard Worker   */
937*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
938*f6dc9357SAndroid Build Coastguard Worker }
939*f6dc9357SAndroid Build Coastguard Worker 
940*f6dc9357SAndroid Build Coastguard Worker 
Get_ItemIndices_Selected(CRecordVector<UInt32> & indices) const941*f6dc9357SAndroid Build Coastguard Worker void CPanel::Get_ItemIndices_Selected(CRecordVector<UInt32> &indices) const
942*f6dc9357SAndroid Build Coastguard Worker {
943*f6dc9357SAndroid Build Coastguard Worker   indices.Clear();
944*f6dc9357SAndroid Build Coastguard Worker   /*
945*f6dc9357SAndroid Build Coastguard Worker   int itemIndex = -1;
946*f6dc9357SAndroid Build Coastguard Worker   while ((itemIndex = _listView.GetNextSelectedItem(itemIndex)) != -1)
947*f6dc9357SAndroid Build Coastguard Worker   {
948*f6dc9357SAndroid Build Coastguard Worker     LPARAM param;
949*f6dc9357SAndroid Build Coastguard Worker     if (_listView.GetItemParam(itemIndex, param))
950*f6dc9357SAndroid Build Coastguard Worker       indices.Add(param);
951*f6dc9357SAndroid Build Coastguard Worker   }
952*f6dc9357SAndroid Build Coastguard Worker   HeapSort(&indices.Front(), indices.Size());
953*f6dc9357SAndroid Build Coastguard Worker   */
954*f6dc9357SAndroid Build Coastguard Worker   const bool *v = _selectedStatusVector.ConstData();
955*f6dc9357SAndroid Build Coastguard Worker   const unsigned size = _selectedStatusVector.Size();
956*f6dc9357SAndroid Build Coastguard Worker   for (unsigned i = 0; i < size; i++)
957*f6dc9357SAndroid Build Coastguard Worker     if (v[i])
958*f6dc9357SAndroid Build Coastguard Worker       indices.Add(i);
959*f6dc9357SAndroid Build Coastguard Worker }
960*f6dc9357SAndroid Build Coastguard Worker 
961*f6dc9357SAndroid Build Coastguard Worker 
Get_ItemIndices_Operated(CRecordVector<UInt32> & indices) const962*f6dc9357SAndroid Build Coastguard Worker void CPanel::Get_ItemIndices_Operated(CRecordVector<UInt32> &indices) const
963*f6dc9357SAndroid Build Coastguard Worker {
964*f6dc9357SAndroid Build Coastguard Worker   Get_ItemIndices_Selected(indices);
965*f6dc9357SAndroid Build Coastguard Worker   if (!indices.IsEmpty())
966*f6dc9357SAndroid Build Coastguard Worker     return;
967*f6dc9357SAndroid Build Coastguard Worker   if (_listView.GetSelectedCount() == 0)
968*f6dc9357SAndroid Build Coastguard Worker     return;
969*f6dc9357SAndroid Build Coastguard Worker   const int focusedItem = _listView.GetFocusedItem();
970*f6dc9357SAndroid Build Coastguard Worker   if (focusedItem >= 0)
971*f6dc9357SAndroid Build Coastguard Worker   {
972*f6dc9357SAndroid Build Coastguard Worker     if (_listView.IsItemSelected(focusedItem))
973*f6dc9357SAndroid Build Coastguard Worker     {
974*f6dc9357SAndroid Build Coastguard Worker       const unsigned realIndex = GetRealItemIndex(focusedItem);
975*f6dc9357SAndroid Build Coastguard Worker       if (realIndex != kParentIndex)
976*f6dc9357SAndroid Build Coastguard Worker         indices.Add(realIndex);
977*f6dc9357SAndroid Build Coastguard Worker     }
978*f6dc9357SAndroid Build Coastguard Worker   }
979*f6dc9357SAndroid Build Coastguard Worker }
980*f6dc9357SAndroid Build Coastguard Worker 
Get_ItemIndices_All(CRecordVector<UInt32> & indices) const981*f6dc9357SAndroid Build Coastguard Worker void CPanel::Get_ItemIndices_All(CRecordVector<UInt32> &indices) const
982*f6dc9357SAndroid Build Coastguard Worker {
983*f6dc9357SAndroid Build Coastguard Worker   indices.Clear();
984*f6dc9357SAndroid Build Coastguard Worker   UInt32 numItems;
985*f6dc9357SAndroid Build Coastguard Worker   if (_folder->GetNumberOfItems(&numItems) != S_OK)
986*f6dc9357SAndroid Build Coastguard Worker     return;
987*f6dc9357SAndroid Build Coastguard Worker   indices.ClearAndSetSize(numItems);
988*f6dc9357SAndroid Build Coastguard Worker   UInt32 *vec = indices.NonConstData();
989*f6dc9357SAndroid Build Coastguard Worker   for (UInt32 i = 0; i < numItems; i++)
990*f6dc9357SAndroid Build Coastguard Worker     vec[i] = i;
991*f6dc9357SAndroid Build Coastguard Worker }
992*f6dc9357SAndroid Build Coastguard Worker 
Get_ItemIndices_OperSmart(CRecordVector<UInt32> & indices) const993*f6dc9357SAndroid Build Coastguard Worker void CPanel::Get_ItemIndices_OperSmart(CRecordVector<UInt32> &indices) const
994*f6dc9357SAndroid Build Coastguard Worker {
995*f6dc9357SAndroid Build Coastguard Worker   Get_ItemIndices_Operated(indices);
996*f6dc9357SAndroid Build Coastguard Worker   if (indices.IsEmpty() || (indices.Size() == 1 && indices[0] == (UInt32)(Int32)-1))
997*f6dc9357SAndroid Build Coastguard Worker     Get_ItemIndices_All(indices);
998*f6dc9357SAndroid Build Coastguard Worker }
999*f6dc9357SAndroid Build Coastguard Worker 
1000*f6dc9357SAndroid Build Coastguard Worker /*
1001*f6dc9357SAndroid Build Coastguard Worker void CPanel::GetOperatedListViewIndices(CRecordVector<UInt32> &indices) const
1002*f6dc9357SAndroid Build Coastguard Worker {
1003*f6dc9357SAndroid Build Coastguard Worker   indices.Clear();
1004*f6dc9357SAndroid Build Coastguard Worker   int numItems = _listView.GetItemCount();
1005*f6dc9357SAndroid Build Coastguard Worker   for (int i = 0; i < numItems; i++)
1006*f6dc9357SAndroid Build Coastguard Worker   {
1007*f6dc9357SAndroid Build Coastguard Worker     const unsigned realIndex = GetRealItemIndex(i);
1008*f6dc9357SAndroid Build Coastguard Worker     if (realIndex >= 0)
1009*f6dc9357SAndroid Build Coastguard Worker       if (_selectedStatusVector[realIndex])
1010*f6dc9357SAndroid Build Coastguard Worker         indices.Add(i);
1011*f6dc9357SAndroid Build Coastguard Worker   }
1012*f6dc9357SAndroid Build Coastguard Worker   if (indices.IsEmpty())
1013*f6dc9357SAndroid Build Coastguard Worker   {
1014*f6dc9357SAndroid Build Coastguard Worker     const int focusedItem = _listView.GetFocusedItem();
1015*f6dc9357SAndroid Build Coastguard Worker       if (focusedItem >= 0)
1016*f6dc9357SAndroid Build Coastguard Worker         indices.Add(focusedItem);
1017*f6dc9357SAndroid Build Coastguard Worker   }
1018*f6dc9357SAndroid Build Coastguard Worker }
1019*f6dc9357SAndroid Build Coastguard Worker */
1020*f6dc9357SAndroid Build Coastguard Worker 
EditItem(bool useEditor)1021*f6dc9357SAndroid Build Coastguard Worker void CPanel::EditItem(bool useEditor)
1022*f6dc9357SAndroid Build Coastguard Worker {
1023*f6dc9357SAndroid Build Coastguard Worker   if (!useEditor)
1024*f6dc9357SAndroid Build Coastguard Worker   {
1025*f6dc9357SAndroid Build Coastguard Worker     CMyComPtr<IFolderCalcItemFullSize> calcItemFullSize;
1026*f6dc9357SAndroid Build Coastguard Worker     _folder.QueryInterface(IID_IFolderCalcItemFullSize, &calcItemFullSize);
1027*f6dc9357SAndroid Build Coastguard Worker     if (calcItemFullSize)
1028*f6dc9357SAndroid Build Coastguard Worker     {
1029*f6dc9357SAndroid Build Coastguard Worker       bool needRefresh = false;
1030*f6dc9357SAndroid Build Coastguard Worker       CRecordVector<UInt32> indices;
1031*f6dc9357SAndroid Build Coastguard Worker       Get_ItemIndices_Operated(indices);
1032*f6dc9357SAndroid Build Coastguard Worker       FOR_VECTOR (i, indices)
1033*f6dc9357SAndroid Build Coastguard Worker       {
1034*f6dc9357SAndroid Build Coastguard Worker         UInt32 index = indices[i];
1035*f6dc9357SAndroid Build Coastguard Worker         if (IsItem_Folder(index))
1036*f6dc9357SAndroid Build Coastguard Worker         {
1037*f6dc9357SAndroid Build Coastguard Worker           calcItemFullSize->CalcItemFullSize(index, NULL);
1038*f6dc9357SAndroid Build Coastguard Worker           needRefresh = true;
1039*f6dc9357SAndroid Build Coastguard Worker         }
1040*f6dc9357SAndroid Build Coastguard Worker       }
1041*f6dc9357SAndroid Build Coastguard Worker       if (needRefresh)
1042*f6dc9357SAndroid Build Coastguard Worker       {
1043*f6dc9357SAndroid Build Coastguard Worker         // _listView.RedrawItem(0);
1044*f6dc9357SAndroid Build Coastguard Worker         // _listView.RedrawAllItems();
1045*f6dc9357SAndroid Build Coastguard Worker         InvalidateList();
1046*f6dc9357SAndroid Build Coastguard Worker         return;
1047*f6dc9357SAndroid Build Coastguard Worker       }
1048*f6dc9357SAndroid Build Coastguard Worker     }
1049*f6dc9357SAndroid Build Coastguard Worker   }
1050*f6dc9357SAndroid Build Coastguard Worker 
1051*f6dc9357SAndroid Build Coastguard Worker 
1052*f6dc9357SAndroid Build Coastguard Worker   const int focusedItem = _listView.GetFocusedItem();
1053*f6dc9357SAndroid Build Coastguard Worker   if (focusedItem < 0)
1054*f6dc9357SAndroid Build Coastguard Worker     return;
1055*f6dc9357SAndroid Build Coastguard Worker   const unsigned realIndex = GetRealItemIndex(focusedItem);
1056*f6dc9357SAndroid Build Coastguard Worker   if (realIndex == kParentIndex)
1057*f6dc9357SAndroid Build Coastguard Worker     return;
1058*f6dc9357SAndroid Build Coastguard Worker   if (!IsItem_Folder(realIndex))
1059*f6dc9357SAndroid Build Coastguard Worker     EditItem(realIndex, useEditor);
1060*f6dc9357SAndroid Build Coastguard Worker }
1061*f6dc9357SAndroid Build Coastguard Worker 
OpenFocusedItemAsInternal(const wchar_t * type)1062*f6dc9357SAndroid Build Coastguard Worker void CPanel::OpenFocusedItemAsInternal(const wchar_t *type)
1063*f6dc9357SAndroid Build Coastguard Worker {
1064*f6dc9357SAndroid Build Coastguard Worker   const int focusedItem = _listView.GetFocusedItem();
1065*f6dc9357SAndroid Build Coastguard Worker   if (focusedItem < 0)
1066*f6dc9357SAndroid Build Coastguard Worker     return;
1067*f6dc9357SAndroid Build Coastguard Worker   const unsigned realIndex = GetRealItemIndex(focusedItem);
1068*f6dc9357SAndroid Build Coastguard Worker   if (IsItem_Folder(realIndex))
1069*f6dc9357SAndroid Build Coastguard Worker     OpenFolder(realIndex);
1070*f6dc9357SAndroid Build Coastguard Worker   else
1071*f6dc9357SAndroid Build Coastguard Worker     OpenItem(realIndex, true, false, type);
1072*f6dc9357SAndroid Build Coastguard Worker }
1073*f6dc9357SAndroid Build Coastguard Worker 
OpenSelectedItems(bool tryInternal)1074*f6dc9357SAndroid Build Coastguard Worker void CPanel::OpenSelectedItems(bool tryInternal)
1075*f6dc9357SAndroid Build Coastguard Worker {
1076*f6dc9357SAndroid Build Coastguard Worker   CRecordVector<UInt32> indices;
1077*f6dc9357SAndroid Build Coastguard Worker   Get_ItemIndices_Operated(indices);
1078*f6dc9357SAndroid Build Coastguard Worker   if (indices.Size() > 20)
1079*f6dc9357SAndroid Build Coastguard Worker   {
1080*f6dc9357SAndroid Build Coastguard Worker     MessageBox_Error_LangID(IDS_TOO_MANY_ITEMS);
1081*f6dc9357SAndroid Build Coastguard Worker     return;
1082*f6dc9357SAndroid Build Coastguard Worker   }
1083*f6dc9357SAndroid Build Coastguard Worker 
1084*f6dc9357SAndroid Build Coastguard Worker   const int focusedItem = _listView.GetFocusedItem();
1085*f6dc9357SAndroid Build Coastguard Worker   if (focusedItem >= 0)
1086*f6dc9357SAndroid Build Coastguard Worker   {
1087*f6dc9357SAndroid Build Coastguard Worker     const unsigned realIndex = GetRealItemIndex(focusedItem);
1088*f6dc9357SAndroid Build Coastguard Worker     if (realIndex == kParentIndex && (tryInternal || indices.Size() == 0) && _listView.IsItemSelected(focusedItem))
1089*f6dc9357SAndroid Build Coastguard Worker       indices.Insert(0, realIndex);
1090*f6dc9357SAndroid Build Coastguard Worker   }
1091*f6dc9357SAndroid Build Coastguard Worker 
1092*f6dc9357SAndroid Build Coastguard Worker   bool dirIsStarted = false;
1093*f6dc9357SAndroid Build Coastguard Worker   FOR_VECTOR (i, indices)
1094*f6dc9357SAndroid Build Coastguard Worker   {
1095*f6dc9357SAndroid Build Coastguard Worker     UInt32 index = indices[i];
1096*f6dc9357SAndroid Build Coastguard Worker     // CFileInfo &aFile = m_Files[index];
1097*f6dc9357SAndroid Build Coastguard Worker     if (IsItem_Folder(index))
1098*f6dc9357SAndroid Build Coastguard Worker     {
1099*f6dc9357SAndroid Build Coastguard Worker       if (!dirIsStarted)
1100*f6dc9357SAndroid Build Coastguard Worker       {
1101*f6dc9357SAndroid Build Coastguard Worker         if (tryInternal)
1102*f6dc9357SAndroid Build Coastguard Worker         {
1103*f6dc9357SAndroid Build Coastguard Worker           OpenFolder(index);
1104*f6dc9357SAndroid Build Coastguard Worker           dirIsStarted = true;
1105*f6dc9357SAndroid Build Coastguard Worker           break;
1106*f6dc9357SAndroid Build Coastguard Worker         }
1107*f6dc9357SAndroid Build Coastguard Worker         else
1108*f6dc9357SAndroid Build Coastguard Worker           OpenFolderExternal(index);
1109*f6dc9357SAndroid Build Coastguard Worker       }
1110*f6dc9357SAndroid Build Coastguard Worker     }
1111*f6dc9357SAndroid Build Coastguard Worker     else
1112*f6dc9357SAndroid Build Coastguard Worker       OpenItem(index, (tryInternal && indices.Size() == 1), true);
1113*f6dc9357SAndroid Build Coastguard Worker   }
1114*f6dc9357SAndroid Build Coastguard Worker }
1115*f6dc9357SAndroid Build Coastguard Worker 
GetItemName(unsigned itemIndex) const1116*f6dc9357SAndroid Build Coastguard Worker UString CPanel::GetItemName(unsigned itemIndex) const
1117*f6dc9357SAndroid Build Coastguard Worker {
1118*f6dc9357SAndroid Build Coastguard Worker   if (itemIndex == kParentIndex)
1119*f6dc9357SAndroid Build Coastguard Worker     return L"..";
1120*f6dc9357SAndroid Build Coastguard Worker   NCOM::CPropVariant prop;
1121*f6dc9357SAndroid Build Coastguard Worker   if (_folder->GetProperty(itemIndex, kpidName, &prop) != S_OK)
1122*f6dc9357SAndroid Build Coastguard Worker     throw 2723400;
1123*f6dc9357SAndroid Build Coastguard Worker   if (prop.vt != VT_BSTR)
1124*f6dc9357SAndroid Build Coastguard Worker     throw 2723401;
1125*f6dc9357SAndroid Build Coastguard Worker   return prop.bstrVal;
1126*f6dc9357SAndroid Build Coastguard Worker }
1127*f6dc9357SAndroid Build Coastguard Worker 
GetItemName_for_Copy(unsigned itemIndex) const1128*f6dc9357SAndroid Build Coastguard Worker UString CPanel::GetItemName_for_Copy(unsigned itemIndex) const
1129*f6dc9357SAndroid Build Coastguard Worker {
1130*f6dc9357SAndroid Build Coastguard Worker   if (itemIndex == kParentIndex)
1131*f6dc9357SAndroid Build Coastguard Worker     return L"..";
1132*f6dc9357SAndroid Build Coastguard Worker   UString s;
1133*f6dc9357SAndroid Build Coastguard Worker   {
1134*f6dc9357SAndroid Build Coastguard Worker     NCOM::CPropVariant prop;
1135*f6dc9357SAndroid Build Coastguard Worker     if (_folder->GetProperty(itemIndex, kpidOutName, &prop) == S_OK)
1136*f6dc9357SAndroid Build Coastguard Worker     {
1137*f6dc9357SAndroid Build Coastguard Worker       if (prop.vt == VT_BSTR)
1138*f6dc9357SAndroid Build Coastguard Worker         s = prop.bstrVal;
1139*f6dc9357SAndroid Build Coastguard Worker       else if (prop.vt != VT_EMPTY)
1140*f6dc9357SAndroid Build Coastguard Worker         throw 2723401;
1141*f6dc9357SAndroid Build Coastguard Worker     }
1142*f6dc9357SAndroid Build Coastguard Worker     if (s.IsEmpty())
1143*f6dc9357SAndroid Build Coastguard Worker       s = GetItemName(itemIndex);
1144*f6dc9357SAndroid Build Coastguard Worker   }
1145*f6dc9357SAndroid Build Coastguard Worker   return Get_Correct_FsFile_Name(s);
1146*f6dc9357SAndroid Build Coastguard Worker }
1147*f6dc9357SAndroid Build Coastguard Worker 
GetItemName(unsigned itemIndex,UString & s) const1148*f6dc9357SAndroid Build Coastguard Worker void CPanel::GetItemName(unsigned itemIndex, UString &s) const
1149*f6dc9357SAndroid Build Coastguard Worker {
1150*f6dc9357SAndroid Build Coastguard Worker   if (itemIndex == kParentIndex)
1151*f6dc9357SAndroid Build Coastguard Worker   {
1152*f6dc9357SAndroid Build Coastguard Worker     s = "..";
1153*f6dc9357SAndroid Build Coastguard Worker     return;
1154*f6dc9357SAndroid Build Coastguard Worker   }
1155*f6dc9357SAndroid Build Coastguard Worker   NCOM::CPropVariant prop;
1156*f6dc9357SAndroid Build Coastguard Worker   if (_folder->GetProperty(itemIndex, kpidName, &prop) != S_OK)
1157*f6dc9357SAndroid Build Coastguard Worker     throw 2723400;
1158*f6dc9357SAndroid Build Coastguard Worker   if (prop.vt != VT_BSTR)
1159*f6dc9357SAndroid Build Coastguard Worker     throw 2723401;
1160*f6dc9357SAndroid Build Coastguard Worker   s.SetFromBstr(prop.bstrVal);
1161*f6dc9357SAndroid Build Coastguard Worker }
1162*f6dc9357SAndroid Build Coastguard Worker 
GetItemPrefix(unsigned itemIndex) const1163*f6dc9357SAndroid Build Coastguard Worker UString CPanel::GetItemPrefix(unsigned itemIndex) const
1164*f6dc9357SAndroid Build Coastguard Worker {
1165*f6dc9357SAndroid Build Coastguard Worker   if (itemIndex == kParentIndex)
1166*f6dc9357SAndroid Build Coastguard Worker     return UString();
1167*f6dc9357SAndroid Build Coastguard Worker   NCOM::CPropVariant prop;
1168*f6dc9357SAndroid Build Coastguard Worker   if (_folder->GetProperty(itemIndex, kpidPrefix, &prop) != S_OK)
1169*f6dc9357SAndroid Build Coastguard Worker     throw 2723400;
1170*f6dc9357SAndroid Build Coastguard Worker   UString prefix;
1171*f6dc9357SAndroid Build Coastguard Worker   if (prop.vt == VT_BSTR)
1172*f6dc9357SAndroid Build Coastguard Worker     prefix.SetFromBstr(prop.bstrVal);
1173*f6dc9357SAndroid Build Coastguard Worker   return prefix;
1174*f6dc9357SAndroid Build Coastguard Worker }
1175*f6dc9357SAndroid Build Coastguard Worker 
GetItemRelPath(unsigned itemIndex) const1176*f6dc9357SAndroid Build Coastguard Worker UString CPanel::GetItemRelPath(unsigned itemIndex) const
1177*f6dc9357SAndroid Build Coastguard Worker {
1178*f6dc9357SAndroid Build Coastguard Worker   return GetItemPrefix(itemIndex) + GetItemName(itemIndex);
1179*f6dc9357SAndroid Build Coastguard Worker }
1180*f6dc9357SAndroid Build Coastguard Worker 
GetItemRelPath2(unsigned itemIndex) const1181*f6dc9357SAndroid Build Coastguard Worker UString CPanel::GetItemRelPath2(unsigned itemIndex) const
1182*f6dc9357SAndroid Build Coastguard Worker {
1183*f6dc9357SAndroid Build Coastguard Worker   UString s = GetItemRelPath(itemIndex);
1184*f6dc9357SAndroid Build Coastguard Worker   #if defined(_WIN32) && !defined(UNDER_CE)
1185*f6dc9357SAndroid Build Coastguard Worker   if (s.Len() == 2 && NFile::NName::IsDrivePath2(s))
1186*f6dc9357SAndroid Build Coastguard Worker   {
1187*f6dc9357SAndroid Build Coastguard Worker     if (IsFSDrivesFolder() && !IsDeviceDrivesPrefix())
1188*f6dc9357SAndroid Build Coastguard Worker       s.Add_PathSepar();
1189*f6dc9357SAndroid Build Coastguard Worker   }
1190*f6dc9357SAndroid Build Coastguard Worker   #endif
1191*f6dc9357SAndroid Build Coastguard Worker   return s;
1192*f6dc9357SAndroid Build Coastguard Worker }
1193*f6dc9357SAndroid Build Coastguard Worker 
1194*f6dc9357SAndroid Build Coastguard Worker 
Add_ItemRelPath2_To_String(unsigned itemIndex,UString & s) const1195*f6dc9357SAndroid Build Coastguard Worker void CPanel::Add_ItemRelPath2_To_String(unsigned itemIndex, UString &s) const
1196*f6dc9357SAndroid Build Coastguard Worker {
1197*f6dc9357SAndroid Build Coastguard Worker   if (itemIndex == kParentIndex)
1198*f6dc9357SAndroid Build Coastguard Worker   {
1199*f6dc9357SAndroid Build Coastguard Worker     s += "..";
1200*f6dc9357SAndroid Build Coastguard Worker     return;
1201*f6dc9357SAndroid Build Coastguard Worker   }
1202*f6dc9357SAndroid Build Coastguard Worker 
1203*f6dc9357SAndroid Build Coastguard Worker   const unsigned start = s.Len();
1204*f6dc9357SAndroid Build Coastguard Worker   NCOM::CPropVariant prop;
1205*f6dc9357SAndroid Build Coastguard Worker   if (_folder->GetProperty(itemIndex, kpidPrefix, &prop) != S_OK)
1206*f6dc9357SAndroid Build Coastguard Worker     throw 2723400;
1207*f6dc9357SAndroid Build Coastguard Worker   if (prop.vt == VT_BSTR)
1208*f6dc9357SAndroid Build Coastguard Worker     s += prop.bstrVal;
1209*f6dc9357SAndroid Build Coastguard Worker 
1210*f6dc9357SAndroid Build Coastguard Worker   const wchar_t *name = NULL;
1211*f6dc9357SAndroid Build Coastguard Worker   unsigned nameLen = 0;
1212*f6dc9357SAndroid Build Coastguard Worker 
1213*f6dc9357SAndroid Build Coastguard Worker   if (_folderGetItemName)
1214*f6dc9357SAndroid Build Coastguard Worker     _folderGetItemName->GetItemName(itemIndex, &name, &nameLen);
1215*f6dc9357SAndroid Build Coastguard Worker   if (name)
1216*f6dc9357SAndroid Build Coastguard Worker     s += name;
1217*f6dc9357SAndroid Build Coastguard Worker   else
1218*f6dc9357SAndroid Build Coastguard Worker   {
1219*f6dc9357SAndroid Build Coastguard Worker     prop.Clear();
1220*f6dc9357SAndroid Build Coastguard Worker     if (_folder->GetProperty(itemIndex, kpidName, &prop) != S_OK)
1221*f6dc9357SAndroid Build Coastguard Worker       throw 2723400;
1222*f6dc9357SAndroid Build Coastguard Worker     if (prop.vt != VT_BSTR)
1223*f6dc9357SAndroid Build Coastguard Worker       throw 2723401;
1224*f6dc9357SAndroid Build Coastguard Worker     s += prop.bstrVal;
1225*f6dc9357SAndroid Build Coastguard Worker   }
1226*f6dc9357SAndroid Build Coastguard Worker 
1227*f6dc9357SAndroid Build Coastguard Worker   #if defined(_WIN32) && !defined(UNDER_CE)
1228*f6dc9357SAndroid Build Coastguard Worker     if (s.Len() - start == 2 && NFile::NName::IsDrivePath2(s.Ptr(start)))
1229*f6dc9357SAndroid Build Coastguard Worker     {
1230*f6dc9357SAndroid Build Coastguard Worker       if (IsFSDrivesFolder() && !IsDeviceDrivesPrefix())
1231*f6dc9357SAndroid Build Coastguard Worker         s.Add_PathSepar();
1232*f6dc9357SAndroid Build Coastguard Worker     }
1233*f6dc9357SAndroid Build Coastguard Worker   #endif
1234*f6dc9357SAndroid Build Coastguard Worker }
1235*f6dc9357SAndroid Build Coastguard Worker 
1236*f6dc9357SAndroid Build Coastguard Worker 
GetItemFullPath(unsigned itemIndex) const1237*f6dc9357SAndroid Build Coastguard Worker UString CPanel::GetItemFullPath(unsigned itemIndex) const
1238*f6dc9357SAndroid Build Coastguard Worker {
1239*f6dc9357SAndroid Build Coastguard Worker   return GetFsPath() + GetItemRelPath2(itemIndex);
1240*f6dc9357SAndroid Build Coastguard Worker }
1241*f6dc9357SAndroid Build Coastguard Worker 
GetItem_BoolProp(UInt32 itemIndex,PROPID propID) const1242*f6dc9357SAndroid Build Coastguard Worker bool CPanel::GetItem_BoolProp(UInt32 itemIndex, PROPID propID) const
1243*f6dc9357SAndroid Build Coastguard Worker {
1244*f6dc9357SAndroid Build Coastguard Worker   NCOM::CPropVariant prop;
1245*f6dc9357SAndroid Build Coastguard Worker   if (_folder->GetProperty(itemIndex, propID, &prop) != S_OK)
1246*f6dc9357SAndroid Build Coastguard Worker     throw 2723400;
1247*f6dc9357SAndroid Build Coastguard Worker   if (prop.vt == VT_BOOL)
1248*f6dc9357SAndroid Build Coastguard Worker     return VARIANT_BOOLToBool(prop.boolVal);
1249*f6dc9357SAndroid Build Coastguard Worker   if (prop.vt == VT_EMPTY)
1250*f6dc9357SAndroid Build Coastguard Worker     return false;
1251*f6dc9357SAndroid Build Coastguard Worker   throw 2723401;
1252*f6dc9357SAndroid Build Coastguard Worker }
1253*f6dc9357SAndroid Build Coastguard Worker 
IsItem_Deleted(unsigned itemIndex) const1254*f6dc9357SAndroid Build Coastguard Worker bool CPanel::IsItem_Deleted(unsigned itemIndex) const
1255*f6dc9357SAndroid Build Coastguard Worker {
1256*f6dc9357SAndroid Build Coastguard Worker   if (itemIndex == kParentIndex)
1257*f6dc9357SAndroid Build Coastguard Worker     return false;
1258*f6dc9357SAndroid Build Coastguard Worker   return GetItem_BoolProp(itemIndex, kpidIsDeleted);
1259*f6dc9357SAndroid Build Coastguard Worker }
1260*f6dc9357SAndroid Build Coastguard Worker 
IsItem_Folder(unsigned itemIndex) const1261*f6dc9357SAndroid Build Coastguard Worker bool CPanel::IsItem_Folder(unsigned itemIndex) const
1262*f6dc9357SAndroid Build Coastguard Worker {
1263*f6dc9357SAndroid Build Coastguard Worker   if (itemIndex == kParentIndex)
1264*f6dc9357SAndroid Build Coastguard Worker     return true;
1265*f6dc9357SAndroid Build Coastguard Worker   if (itemIndex < _isDirVector.Size())
1266*f6dc9357SAndroid Build Coastguard Worker     return _isDirVector[itemIndex];
1267*f6dc9357SAndroid Build Coastguard Worker   return GetItem_BoolProp(itemIndex, kpidIsDir);
1268*f6dc9357SAndroid Build Coastguard Worker }
1269*f6dc9357SAndroid Build Coastguard Worker 
IsItem_AltStream(unsigned itemIndex) const1270*f6dc9357SAndroid Build Coastguard Worker bool CPanel::IsItem_AltStream(unsigned itemIndex) const
1271*f6dc9357SAndroid Build Coastguard Worker {
1272*f6dc9357SAndroid Build Coastguard Worker   if (itemIndex == kParentIndex)
1273*f6dc9357SAndroid Build Coastguard Worker     return false;
1274*f6dc9357SAndroid Build Coastguard Worker   return GetItem_BoolProp(itemIndex, kpidIsAltStream);
1275*f6dc9357SAndroid Build Coastguard Worker }
1276*f6dc9357SAndroid Build Coastguard Worker 
GetItem_UInt64Prop(unsigned itemIndex,PROPID propID) const1277*f6dc9357SAndroid Build Coastguard Worker UInt64 CPanel::GetItem_UInt64Prop(unsigned itemIndex, PROPID propID) const
1278*f6dc9357SAndroid Build Coastguard Worker {
1279*f6dc9357SAndroid Build Coastguard Worker   if (itemIndex == kParentIndex)
1280*f6dc9357SAndroid Build Coastguard Worker     return 0;
1281*f6dc9357SAndroid Build Coastguard Worker   NCOM::CPropVariant prop;
1282*f6dc9357SAndroid Build Coastguard Worker   if (_folder->GetProperty(itemIndex, propID, &prop) != S_OK)
1283*f6dc9357SAndroid Build Coastguard Worker     throw 2723400;
1284*f6dc9357SAndroid Build Coastguard Worker   UInt64 val = 0;
1285*f6dc9357SAndroid Build Coastguard Worker   if (ConvertPropVariantToUInt64(prop, val))
1286*f6dc9357SAndroid Build Coastguard Worker     return val;
1287*f6dc9357SAndroid Build Coastguard Worker   return 0;
1288*f6dc9357SAndroid Build Coastguard Worker }
1289*f6dc9357SAndroid Build Coastguard Worker 
GetItemSize(unsigned itemIndex) const1290*f6dc9357SAndroid Build Coastguard Worker UInt64 CPanel::GetItemSize(unsigned itemIndex) const
1291*f6dc9357SAndroid Build Coastguard Worker {
1292*f6dc9357SAndroid Build Coastguard Worker   if (itemIndex == kParentIndex)
1293*f6dc9357SAndroid Build Coastguard Worker     return 0;
1294*f6dc9357SAndroid Build Coastguard Worker   if (_folderGetItemName)
1295*f6dc9357SAndroid Build Coastguard Worker     return _folderGetItemName->GetItemSize(itemIndex);
1296*f6dc9357SAndroid Build Coastguard Worker   return GetItem_UInt64Prop(itemIndex, kpidSize);
1297*f6dc9357SAndroid Build Coastguard Worker }
1298*f6dc9357SAndroid Build Coastguard Worker 
SaveListViewInfo()1299*f6dc9357SAndroid Build Coastguard Worker void CPanel::SaveListViewInfo()
1300*f6dc9357SAndroid Build Coastguard Worker {
1301*f6dc9357SAndroid Build Coastguard Worker   if (!_needSaveInfo)
1302*f6dc9357SAndroid Build Coastguard Worker     return;
1303*f6dc9357SAndroid Build Coastguard Worker 
1304*f6dc9357SAndroid Build Coastguard Worker   unsigned i;
1305*f6dc9357SAndroid Build Coastguard Worker 
1306*f6dc9357SAndroid Build Coastguard Worker   for (i = 0; i < _visibleColumns.Size(); i++)
1307*f6dc9357SAndroid Build Coastguard Worker   {
1308*f6dc9357SAndroid Build Coastguard Worker     CPropColumn &prop = _visibleColumns[i];
1309*f6dc9357SAndroid Build Coastguard Worker     LVCOLUMN winColumnInfo;
1310*f6dc9357SAndroid Build Coastguard Worker     winColumnInfo.mask = LVCF_ORDER | LVCF_WIDTH;
1311*f6dc9357SAndroid Build Coastguard Worker     if (!_listView.GetColumn(i, &winColumnInfo))
1312*f6dc9357SAndroid Build Coastguard Worker       throw 1;
1313*f6dc9357SAndroid Build Coastguard Worker     prop.Order = winColumnInfo.iOrder;
1314*f6dc9357SAndroid Build Coastguard Worker     prop.Width = (UInt32)(Int32)winColumnInfo.cx;
1315*f6dc9357SAndroid Build Coastguard Worker   }
1316*f6dc9357SAndroid Build Coastguard Worker 
1317*f6dc9357SAndroid Build Coastguard Worker   CListViewInfo viewInfo;
1318*f6dc9357SAndroid Build Coastguard Worker 
1319*f6dc9357SAndroid Build Coastguard Worker   // PROPID sortPropID = _columns[_sortIndex].ID;
1320*f6dc9357SAndroid Build Coastguard Worker   const PROPID sortPropID = _sortID;
1321*f6dc9357SAndroid Build Coastguard Worker 
1322*f6dc9357SAndroid Build Coastguard Worker   // we save columns as "sorted by order" to registry
1323*f6dc9357SAndroid Build Coastguard Worker 
1324*f6dc9357SAndroid Build Coastguard Worker   CPropColumns sortedProperties = _visibleColumns;
1325*f6dc9357SAndroid Build Coastguard Worker 
1326*f6dc9357SAndroid Build Coastguard Worker   sortedProperties.Sort();
1327*f6dc9357SAndroid Build Coastguard Worker 
1328*f6dc9357SAndroid Build Coastguard Worker   for (i = 0; i < sortedProperties.Size(); i++)
1329*f6dc9357SAndroid Build Coastguard Worker   {
1330*f6dc9357SAndroid Build Coastguard Worker     const CPropColumn &prop = sortedProperties[i];
1331*f6dc9357SAndroid Build Coastguard Worker     CColumnInfo columnInfo;
1332*f6dc9357SAndroid Build Coastguard Worker     columnInfo.IsVisible = prop.IsVisible;
1333*f6dc9357SAndroid Build Coastguard Worker     columnInfo.PropID = prop.ID;
1334*f6dc9357SAndroid Build Coastguard Worker     columnInfo.Width = prop.Width;
1335*f6dc9357SAndroid Build Coastguard Worker     viewInfo.Columns.Add(columnInfo);
1336*f6dc9357SAndroid Build Coastguard Worker   }
1337*f6dc9357SAndroid Build Coastguard Worker 
1338*f6dc9357SAndroid Build Coastguard Worker   for (i = 0; i < _columns.Size(); i++)
1339*f6dc9357SAndroid Build Coastguard Worker   {
1340*f6dc9357SAndroid Build Coastguard Worker     const CPropColumn &prop = _columns[i];
1341*f6dc9357SAndroid Build Coastguard Worker     if (sortedProperties.FindItem_for_PropID(prop.ID) < 0)
1342*f6dc9357SAndroid Build Coastguard Worker     {
1343*f6dc9357SAndroid Build Coastguard Worker       CColumnInfo columnInfo;
1344*f6dc9357SAndroid Build Coastguard Worker       columnInfo.IsVisible = false;
1345*f6dc9357SAndroid Build Coastguard Worker       columnInfo.PropID = prop.ID;
1346*f6dc9357SAndroid Build Coastguard Worker       columnInfo.Width = prop.Width;
1347*f6dc9357SAndroid Build Coastguard Worker       viewInfo.Columns.Add(columnInfo);
1348*f6dc9357SAndroid Build Coastguard Worker     }
1349*f6dc9357SAndroid Build Coastguard Worker   }
1350*f6dc9357SAndroid Build Coastguard Worker 
1351*f6dc9357SAndroid Build Coastguard Worker   viewInfo.SortID = sortPropID;
1352*f6dc9357SAndroid Build Coastguard Worker   viewInfo.Ascending = _ascending;
1353*f6dc9357SAndroid Build Coastguard Worker   viewInfo.IsLoaded = true;
1354*f6dc9357SAndroid Build Coastguard Worker   if (!_listViewInfo.IsEqual(viewInfo))
1355*f6dc9357SAndroid Build Coastguard Worker   {
1356*f6dc9357SAndroid Build Coastguard Worker     viewInfo.Save(_typeIDString);
1357*f6dc9357SAndroid Build Coastguard Worker     _listViewInfo = viewInfo;
1358*f6dc9357SAndroid Build Coastguard Worker   }
1359*f6dc9357SAndroid Build Coastguard Worker }
1360*f6dc9357SAndroid Build Coastguard Worker 
1361*f6dc9357SAndroid Build Coastguard Worker 
OnRightClick(MY_NMLISTVIEW_NMITEMACTIVATE * itemActivate,LRESULT & result)1362*f6dc9357SAndroid Build Coastguard Worker bool CPanel::OnRightClick(MY_NMLISTVIEW_NMITEMACTIVATE *itemActivate, LRESULT &result)
1363*f6dc9357SAndroid Build Coastguard Worker {
1364*f6dc9357SAndroid Build Coastguard Worker   if (itemActivate->hdr.hwndFrom == HWND(_listView))
1365*f6dc9357SAndroid Build Coastguard Worker     return false;
1366*f6dc9357SAndroid Build Coastguard Worker   POINT point;
1367*f6dc9357SAndroid Build Coastguard Worker   ::GetCursorPos(&point);
1368*f6dc9357SAndroid Build Coastguard Worker   ShowColumnsContextMenu(point.x, point.y);
1369*f6dc9357SAndroid Build Coastguard Worker   result = TRUE;
1370*f6dc9357SAndroid Build Coastguard Worker   return true;
1371*f6dc9357SAndroid Build Coastguard Worker }
1372*f6dc9357SAndroid Build Coastguard Worker 
ShowColumnsContextMenu(int x,int y)1373*f6dc9357SAndroid Build Coastguard Worker void CPanel::ShowColumnsContextMenu(int x, int y)
1374*f6dc9357SAndroid Build Coastguard Worker {
1375*f6dc9357SAndroid Build Coastguard Worker   CMenu menu;
1376*f6dc9357SAndroid Build Coastguard Worker   CMenuDestroyer menuDestroyer(menu);
1377*f6dc9357SAndroid Build Coastguard Worker 
1378*f6dc9357SAndroid Build Coastguard Worker   menu.CreatePopup();
1379*f6dc9357SAndroid Build Coastguard Worker 
1380*f6dc9357SAndroid Build Coastguard Worker   const int kCommandStart = 100;
1381*f6dc9357SAndroid Build Coastguard Worker   FOR_VECTOR (i, _columns)
1382*f6dc9357SAndroid Build Coastguard Worker   {
1383*f6dc9357SAndroid Build Coastguard Worker     const CPropColumn &prop = _columns[i];
1384*f6dc9357SAndroid Build Coastguard Worker     UINT flags =  MF_STRING;
1385*f6dc9357SAndroid Build Coastguard Worker     if (prop.IsVisible)
1386*f6dc9357SAndroid Build Coastguard Worker       flags |= MF_CHECKED;
1387*f6dc9357SAndroid Build Coastguard Worker     if (i == 0)
1388*f6dc9357SAndroid Build Coastguard Worker       flags |= MF_GRAYED;
1389*f6dc9357SAndroid Build Coastguard Worker     menu.AppendItem(flags, kCommandStart + i, prop.Name);
1390*f6dc9357SAndroid Build Coastguard Worker   }
1391*f6dc9357SAndroid Build Coastguard Worker 
1392*f6dc9357SAndroid Build Coastguard Worker   const int menuResult = menu.Track(TPM_LEFTALIGN | TPM_RETURNCMD | TPM_NONOTIFY, x, y, _listView);
1393*f6dc9357SAndroid Build Coastguard Worker 
1394*f6dc9357SAndroid Build Coastguard Worker   if (menuResult >= kCommandStart && menuResult <= kCommandStart + (int)_columns.Size())
1395*f6dc9357SAndroid Build Coastguard Worker   {
1396*f6dc9357SAndroid Build Coastguard Worker     const unsigned index = (unsigned)(menuResult - kCommandStart);
1397*f6dc9357SAndroid Build Coastguard Worker     CPropColumn &prop = _columns[index];
1398*f6dc9357SAndroid Build Coastguard Worker     prop.IsVisible = !prop.IsVisible;
1399*f6dc9357SAndroid Build Coastguard Worker 
1400*f6dc9357SAndroid Build Coastguard Worker     if (prop.IsVisible)
1401*f6dc9357SAndroid Build Coastguard Worker     {
1402*f6dc9357SAndroid Build Coastguard Worker       prop.Order = (int)_visibleColumns.Size();
1403*f6dc9357SAndroid Build Coastguard Worker       AddColumn(prop);
1404*f6dc9357SAndroid Build Coastguard Worker     }
1405*f6dc9357SAndroid Build Coastguard Worker     else
1406*f6dc9357SAndroid Build Coastguard Worker     {
1407*f6dc9357SAndroid Build Coastguard Worker       const int visibleIndex = _visibleColumns.FindItem_for_PropID(prop.ID);
1408*f6dc9357SAndroid Build Coastguard Worker       if (visibleIndex >= 0)
1409*f6dc9357SAndroid Build Coastguard Worker       {
1410*f6dc9357SAndroid Build Coastguard Worker         /*
1411*f6dc9357SAndroid Build Coastguard Worker         if (_sortIndex == index)
1412*f6dc9357SAndroid Build Coastguard Worker         {
1413*f6dc9357SAndroid Build Coastguard Worker         _sortIndex = 0;
1414*f6dc9357SAndroid Build Coastguard Worker         _ascending = true;
1415*f6dc9357SAndroid Build Coastguard Worker         }
1416*f6dc9357SAndroid Build Coastguard Worker         */
1417*f6dc9357SAndroid Build Coastguard Worker         if (_sortID == prop.ID)
1418*f6dc9357SAndroid Build Coastguard Worker         {
1419*f6dc9357SAndroid Build Coastguard Worker           _sortID = kpidName;
1420*f6dc9357SAndroid Build Coastguard Worker           _ascending = true;
1421*f6dc9357SAndroid Build Coastguard Worker         }
1422*f6dc9357SAndroid Build Coastguard Worker         DeleteColumn((unsigned)visibleIndex);
1423*f6dc9357SAndroid Build Coastguard Worker       }
1424*f6dc9357SAndroid Build Coastguard Worker     }
1425*f6dc9357SAndroid Build Coastguard Worker   }
1426*f6dc9357SAndroid Build Coastguard Worker }
1427*f6dc9357SAndroid Build Coastguard Worker 
OnReload(bool onTimer)1428*f6dc9357SAndroid Build Coastguard Worker void CPanel::OnReload(bool onTimer)
1429*f6dc9357SAndroid Build Coastguard Worker {
1430*f6dc9357SAndroid Build Coastguard Worker   const HRESULT res = RefreshListCtrl_SaveFocused(onTimer);
1431*f6dc9357SAndroid Build Coastguard Worker   if (res != S_OK)
1432*f6dc9357SAndroid Build Coastguard Worker     MessageBox_Error_HRESULT(res);
1433*f6dc9357SAndroid Build Coastguard Worker }
1434*f6dc9357SAndroid Build Coastguard Worker 
OnTimer()1435*f6dc9357SAndroid Build Coastguard Worker void CPanel::OnTimer()
1436*f6dc9357SAndroid Build Coastguard Worker {
1437*f6dc9357SAndroid Build Coastguard Worker   if (!_processTimer)
1438*f6dc9357SAndroid Build Coastguard Worker     return;
1439*f6dc9357SAndroid Build Coastguard Worker   if (!AutoRefresh_Mode)
1440*f6dc9357SAndroid Build Coastguard Worker     return;
1441*f6dc9357SAndroid Build Coastguard Worker   if (!_folder) // it's unexpected case, but we use it as additional protection.
1442*f6dc9357SAndroid Build Coastguard Worker     return;
1443*f6dc9357SAndroid Build Coastguard Worker   {
1444*f6dc9357SAndroid Build Coastguard Worker     CMyComPtr<IFolderWasChanged> folderWasChanged;
1445*f6dc9357SAndroid Build Coastguard Worker     _folder.QueryInterface(IID_IFolderWasChanged, &folderWasChanged);
1446*f6dc9357SAndroid Build Coastguard Worker     if (!folderWasChanged)
1447*f6dc9357SAndroid Build Coastguard Worker       return;
1448*f6dc9357SAndroid Build Coastguard Worker     Int32 wasChanged;
1449*f6dc9357SAndroid Build Coastguard Worker     if (folderWasChanged->WasChanged(&wasChanged) != S_OK || wasChanged == 0)
1450*f6dc9357SAndroid Build Coastguard Worker       return;
1451*f6dc9357SAndroid Build Coastguard Worker   }
1452*f6dc9357SAndroid Build Coastguard Worker   OnReload(true); // onTimer
1453*f6dc9357SAndroid Build Coastguard Worker }
1454