5 #include "resource.h"
\r
7 #include "Common/StringConvert.h"
\r
8 #include "Common/Wildcard.h"
\r
12 #include "ComboDialog.h"
\r
14 #include "LangUtils.h"
\r
16 void CPanel::OnShiftSelectMessage()
\r
20 int focusedItem = _listView.GetFocusedItem();
\r
21 if (focusedItem < 0)
\r
23 if (!_selectionIsDefined)
\r
25 int startItem = MyMin(focusedItem, _prevFocusedItem);
\r
26 int finishItem = MyMax(focusedItem, _prevFocusedItem);
\r
27 for (int i = 0; i < _listView.GetItemCount(); i++)
\r
29 int realIndex = GetRealItemIndex(i);
\r
30 if (realIndex == kParentIndex)
\r
32 if (i >= startItem && i <= finishItem)
\r
33 if (_selectedStatusVector[realIndex] != _selectMark)
\r
35 _selectedStatusVector[realIndex] = _selectMark;
\r
36 _listView.RedrawItem(i);
\r
39 _prevFocusedItem = focusedItem;
\r
42 void CPanel::OnArrowWithShift()
\r
46 int focusedItem = _listView.GetFocusedItem();
\r
47 if (focusedItem < 0)
\r
49 int realIndex = GetRealItemIndex(focusedItem);
\r
50 if (_selectionIsDefined)
\r
52 if (realIndex != kParentIndex)
\r
53 _selectedStatusVector[realIndex] = _selectMark;
\r
57 if (realIndex == kParentIndex)
\r
59 _selectionIsDefined = true;
\r
64 _selectionIsDefined = true;
\r
65 _selectMark = !_selectedStatusVector[realIndex];
\r
66 _selectedStatusVector[realIndex] = _selectMark;
\r
69 _prevFocusedItem = focusedItem;
\r
70 PostMessage(kShiftSelectMessage);
\r
71 _listView.RedrawItem(focusedItem);
\r
74 void CPanel::OnInsert()
\r
77 const int kState = CDIS_MARKED; // LVIS_DROPHILITED;
\r
78 UINT state = (_listView.GetItemState(focusedItem, LVIS_CUT) == 0) ?
\r
80 _listView.SetItemState(focusedItem, state, LVIS_CUT);
\r
81 // _listView.SetItemState(focusedItem, LVIS_SELECTED, LVIS_SELECTED);
\r
84 int focusedItem = _listView.GetFocusedItem();
\r
85 if (focusedItem < 0)
\r
87 int realIndex = GetRealItemIndex(focusedItem);
\r
88 bool isSelected = !_selectedStatusVector[realIndex];
\r
89 if (realIndex != kParentIndex)
\r
90 _selectedStatusVector[realIndex] = isSelected;
\r
93 _listView.SetItemState(focusedItem, isSelected ? LVIS_SELECTED: 0, LVIS_SELECTED);
\r
95 _listView.RedrawItem(focusedItem);
\r
97 int nextIndex = focusedItem + 1;
\r
98 if (nextIndex < _listView.GetItemCount())
\r
100 _listView.SetItemState_FocusedSelected(nextIndex);
\r
101 _listView.EnsureVisible(nextIndex, false);
\r
106 void CPanel::OnUpWithShift()
\r
108 int focusedItem = _listView.GetFocusedItem();
\r
109 if (focusedItem < 0)
\r
111 int index = GetRealItemIndex(focusedItem);
\r
112 _selectedStatusVector[index] = !_selectedStatusVector[index];
\r
113 _listView.RedrawItem(index);
\r
116 void CPanel::OnDownWithShift()
\r
118 int focusedItem = _listView.GetFocusedItem();
\r
119 if (focusedItem < 0)
\r
121 int index = GetRealItemIndex(focusedItem);
\r
122 _selectedStatusVector[index] = !_selectedStatusVector[index];
\r
123 _listView.RedrawItem(index);
\r
127 void CPanel::UpdateSelection()
\r
129 if (!_mySelectMode)
\r
131 bool enableTemp = _enableItemChangeNotify;
\r
132 _enableItemChangeNotify = false;
\r
133 int numItems = _listView.GetItemCount();
\r
134 for (int i = 0; i < numItems; i++)
\r
136 int realIndex = GetRealItemIndex(i);
\r
137 if (realIndex != kParentIndex)
\r
140 value = _selectedStatusVector[realIndex] ? LVIS_SELECTED: 0;
\r
141 _listView.SetItemState(i, value, LVIS_SELECTED);
\r
144 _enableItemChangeNotify = enableTemp;
\r
146 _listView.RedrawAllItems();
\r
150 void CPanel::SelectSpec(bool selectMode)
\r
152 CComboDialog comboDialog;
\r
153 comboDialog.Title = selectMode ?
\r
154 LangString(IDS_SELECT, 0x03020250):
\r
155 LangString(IDS_DESELECT, 0x03020251);
\r
156 comboDialog.Static = LangString(IDS_SELECT_MASK, 0x03020252);
\r
157 comboDialog.Value = L"*";
\r
158 if (comboDialog.Create(GetParent()) == IDCANCEL)
\r
160 const UString &mask = comboDialog.Value;
\r
161 for (int i = 0; i < _selectedStatusVector.Size(); i++)
\r
162 if (CompareWildCardWithName(mask, GetItemName(i)))
\r
163 _selectedStatusVector[i] = selectMode;
\r
167 void CPanel::SelectByType(bool selectMode)
\r
169 int focusedItem = _listView.GetFocusedItem();
\r
170 if (focusedItem < 0)
\r
172 int realIndex = GetRealItemIndex(focusedItem);
\r
173 UString name = GetItemName(realIndex);
\r
174 bool isItemFolder = IsItemFolder(realIndex);
\r
178 _folder->GetNumberOfItems(&numItems);
\r
179 if ((UInt32)_selectedStatusVector.Size() != numItems)
\r
185 for (int i = 0; i < _selectedStatusVector.Size(); i++)
\r
186 if (IsItemFolder(i) == isItemFolder)
\r
187 _selectedStatusVector[i] = selectMode;
\r
191 int pos = name.ReverseFind(L'.');
\r
194 for (int i = 0; i < _selectedStatusVector.Size(); i++)
\r
195 if (IsItemFolder(i) == isItemFolder && GetItemName(i).ReverseFind(L'.') < 0)
\r
196 _selectedStatusVector[i] = selectMode;
\r
200 UString mask = UString(L'*') + name.Mid(pos);
\r
201 for (int i = 0; i < _selectedStatusVector.Size(); i++)
\r
202 if (IsItemFolder(i) == isItemFolder && CompareWildCardWithName(mask, GetItemName(i)))
\r
203 _selectedStatusVector[i] = selectMode;
\r
209 void CPanel::SelectAll(bool selectMode)
\r
211 for (int i = 0; i < _selectedStatusVector.Size(); i++)
\r
212 _selectedStatusVector[i] = selectMode;
\r
216 void CPanel::InvertSelection()
\r
218 if (!_mySelectMode)
\r
220 int numSelected = 0;
\r
221 for (int i = 0; i < _selectedStatusVector.Size(); i++)
\r
222 if (_selectedStatusVector[i])
\r
224 if (numSelected == 1)
\r
226 int focused = _listView.GetFocusedItem();
\r
229 int realIndex = GetRealItemIndex(focused);
\r
230 if (realIndex >= 0)
\r
231 if (_selectedStatusVector[realIndex])
\r
232 _selectedStatusVector[realIndex] = false;
\r
236 for (int i = 0; i < _selectedStatusVector.Size(); i++)
\r
237 _selectedStatusVector[i] = !_selectedStatusVector[i];
\r
241 void CPanel::KillSelection()
\r
244 if (!_mySelectMode)
\r
246 int focused = _listView.GetFocusedItem();
\r
249 // CPanel::OnItemChanged notify for LVIS_SELECTED change doesn't work here. Why?
\r
250 // so we change _selectedStatusVector[realIndex] here.
\r
251 int realIndex = GetRealItemIndex(focused);
\r
252 if (realIndex != kParentIndex)
\r
253 _selectedStatusVector[realIndex] = true;
\r
254 _listView.SetItemState(focused, LVIS_SELECTED, LVIS_SELECTED);
\r
259 void CPanel::OnLeftClick(MY_NMLISTVIEW_NMITEMACTIVATE *itemActivate)
\r
261 if (itemActivate->hdr.hwndFrom != HWND(_listView))
\r
263 // It will be work only for Version 4.71 (IE 4);
\r
264 int indexInList = itemActivate->iItem;
\r
265 if (indexInList < 0)
\r
268 if ((itemActivate->uKeyFlags & LVKF_SHIFT) != 0)
\r
270 // int focusedIndex = _listView.GetFocusedItem();
\r
271 int focusedIndex = _startGroupSelect;
\r
272 if (focusedIndex < 0)
\r
274 int startItem = MyMin(focusedIndex, indexInList);
\r
275 int finishItem = MyMax(focusedIndex, indexInList);
\r
276 for (int i = 0; i < _selectedStatusVector.Size(); i++)
\r
278 int realIndex = GetRealItemIndex(i);
\r
279 if (realIndex == kParentIndex)
\r
281 bool selected = (i >= startItem && i <= finishItem);
\r
282 if (_selectedStatusVector[realIndex] != selected)
\r
284 _selectedStatusVector[realIndex] = selected;
\r
285 _listView.RedrawItem(i);
\r
292 _startGroupSelect = indexInList;
\r
294 if ((itemActivate->uKeyFlags & LVKF_CONTROL) != 0)
\r
296 int realIndex = GetRealItemIndex(indexInList);
\r
297 if (realIndex != kParentIndex)
\r
299 _selectedStatusVector[realIndex] = !_selectedStatusVector[realIndex];
\r
300 _listView.RedrawItem(indexInList);
\r