5 #include "Windows/PropVariant.h"
\r
7 #include "../../PropID.h"
\r
11 using namespace NWindows;
\r
13 static UString GetExtension(const UString &name)
\r
15 int dotPos = name.ReverseFind(L'.');
\r
18 return name.Mid(dotPos);
\r
21 int CALLBACK CompareItems2(LPARAM lParam1, LPARAM lParam2, LPARAM lpData)
\r
25 CPanel *panel = (CPanel*)lpData;
\r
27 switch(panel->_sortID)
\r
29 // if (panel->_sortIndex == 0)
\r
32 const UString name1 = panel->GetItemName((int)lParam1);
\r
33 const UString name2 = panel->GetItemName((int)lParam2);
\r
34 int res = name1.CompareNoCase(name2);
\r
36 if (res != 0 || !panel->_flatMode)
\r
38 const UString prefix1 = panel->GetItemPrefix(lParam1);
\r
39 const UString prefix2 = panel->GetItemPrefix(lParam2);
\r
40 return res = prefix1.CompareNoCase(prefix2);
\r
44 case kpidNoProperty:
\r
46 return MyCompare(lParam1, lParam2);
\r
50 const UString ext1 = GetExtension(panel->GetItemName((int)lParam1));
\r
51 const UString ext2 = GetExtension(panel->GetItemName((int)lParam2));
\r
52 return ext1.CompareNoCase(ext2);
\r
56 if (panel->_sortIndex == 1)
\r
57 return MyCompare(file1.Size, file2.Size);
\r
58 return ::CompareFileTime(&file1.MTime, &file2.MTime);
\r
61 // PROPID propID = panel->_properties[panel->_sortIndex].ID;
\r
62 PROPID propID = panel->_sortID;
\r
64 NCOM::CPropVariant prop1, prop2;
\r
65 // Name must be first property
\r
66 panel->_folder->GetProperty((UINT32)lParam1, propID, &prop1);
\r
67 panel->_folder->GetProperty((UINT32)lParam2, propID, &prop2);
\r
68 if (prop1.vt != prop2.vt)
\r
70 return MyCompare(prop1.vt, prop2.vt);
\r
72 if (prop1.vt == VT_BSTR)
\r
74 return _wcsicmp(prop1.bstrVal, prop2.bstrVal);
\r
76 return prop1.Compare(prop2);
\r
80 int CALLBACK CompareItems(LPARAM lParam1, LPARAM lParam2, LPARAM lpData)
\r
82 if (lpData == NULL) return 0;
\r
83 if (lParam1 == kParentIndex) return -1;
\r
84 if (lParam2 == kParentIndex) return 1;
\r
86 CPanel *panel = (CPanel*)lpData;
\r
88 bool isDir1 = panel->IsItemFolder((int)lParam1);
\r
89 bool isDir2 = panel->IsItemFolder((int)lParam2);
\r
91 if (isDir1 && !isDir2) return -1;
\r
92 if (isDir2 && !isDir1) return 1;
\r
94 int result = CompareItems2(lParam1, lParam2, lpData);
\r
95 return panel->_ascending ? result: (-result);
\r
100 void CPanel::SortItems(int index)
\r
102 if (index == _sortIndex)
\r
103 _ascending = !_ascending;
\r
106 _sortIndex = index;
\r
108 switch (_properties[_sortIndex].ID)
\r
111 case kpidPackedSize:
\r
115 _ascending = false;
\r
119 _listView.SortItems(CompareItems, (LPARAM)this);
\r
120 _listView.EnsureVisible(_listView.GetFocusedItem(), false);
\r
122 void CPanel::SortItemsWithPropID(PROPID propID)
\r
124 int index = _properties.FindItemWithID(propID);
\r
129 void CPanel::SortItemsWithPropID(PROPID propID)
\r
131 if (propID == _sortID)
\r
132 _ascending = !_ascending;
\r
144 _ascending = false;
\r
148 _listView.SortItems(CompareItems, (LPARAM)this);
\r
149 _listView.EnsureVisible(_listView.GetFocusedItem(), false);
\r
153 void CPanel::OnColumnClick(LPNMLISTVIEW info)
\r
156 int index = _properties.FindItemWithID(_visibleProperties[info->iSubItem].ID);
\r
159 SortItemsWithPropID(_visibleProperties[info->iSubItem].ID);
\r