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