1 // PanelSelect.cpp
2
3 #include "StdAfx.h"
4
5 #include "resource.h"
6
7 #include "../../../Common/StringConvert.h"
8 #include "../../../Common/Wildcard.h"
9
10 #include "ComboDialog.h"
11 #include "LangUtils.h"
12 #include "Panel.h"
13
OnShiftSelectMessage()14 void CPanel::OnShiftSelectMessage()
15 {
16 if (!_mySelectMode)
17 return;
18 const int focusedItem = _listView.GetFocusedItem();
19 if (focusedItem < 0)
20 return;
21 if (!_selectionIsDefined)
22 return;
23 int startItem = MyMin(focusedItem, _prevFocusedItem);
24 int finishItem = MyMax(focusedItem, _prevFocusedItem);
25
26 int numItems = _listView.GetItemCount();
27 for (int i = 0; i < numItems; i++)
28 {
29 const unsigned realIndex = GetRealItemIndex(i);
30 if (realIndex == kParentIndex)
31 continue;
32 if (i >= startItem && i <= finishItem)
33 if (_selectedStatusVector[realIndex] != _selectMark)
34 {
35 _selectedStatusVector[realIndex] = _selectMark;
36 _listView.RedrawItem(i);
37 }
38 }
39
40 _prevFocusedItem = focusedItem;
41 }
42
OnArrowWithShift()43 void CPanel::OnArrowWithShift()
44 {
45 if (!_mySelectMode)
46 return;
47 const int focusedItem = _listView.GetFocusedItem();
48 if (focusedItem < 0)
49 return;
50 const unsigned realIndex = GetRealItemIndex(focusedItem);
51
52 if (_selectionIsDefined)
53 {
54 if (realIndex != kParentIndex)
55 _selectedStatusVector[realIndex] = _selectMark;
56 }
57 else
58 {
59 if (realIndex == kParentIndex)
60 {
61 _selectionIsDefined = true;
62 _selectMark = true;
63 }
64 else
65 {
66 _selectionIsDefined = true;
67 _selectMark = !_selectedStatusVector[realIndex];
68 _selectedStatusVector[realIndex] = _selectMark;
69 }
70 }
71
72 _prevFocusedItem = focusedItem;
73 PostMsg(kShiftSelectMessage);
74 _listView.RedrawItem(focusedItem);
75 }
76
OnInsert()77 void CPanel::OnInsert()
78 {
79 /*
80 const int kState = CDIS_MARKED; // LVIS_DROPHILITED;
81 UINT state = (_listView.GetItemState(focusedItem, LVIS_CUT) == 0) ?
82 LVIS_CUT : 0;
83 _listView.SetItemState(focusedItem, state, LVIS_CUT);
84 // _listView.SetItemState_Selected(focusedItem);
85 */
86
87 const int focusedItem = _listView.GetFocusedItem();
88 if (focusedItem < 0)
89 return;
90
91 const unsigned realIndex = GetRealItemIndex(focusedItem);
92 if (realIndex != kParentIndex)
93 {
94 bool isSelected = !_selectedStatusVector[realIndex];
95 _selectedStatusVector[realIndex] = isSelected;
96 if (!_mySelectMode)
97 _listView.SetItemState_Selected(focusedItem, isSelected);
98 _listView.RedrawItem(focusedItem);
99 }
100
101 int nextIndex = focusedItem + 1;
102 if (nextIndex < _listView.GetItemCount())
103 {
104 _listView.SetItemState_FocusedSelected(nextIndex);
105 _listView.EnsureVisible(nextIndex, false);
106 }
107 }
108
109 /*
110 void CPanel::OnUpWithShift()
111 {
112 const int focusedItem = _listView.GetFocusedItem();
113 if (focusedItem < 0)
114 return;
115 const int index = GetRealItemIndex(focusedItem);
116 if (index == kParentIndex)
117 return;
118 _selectedStatusVector[index] = !_selectedStatusVector[index];
119 _listView.RedrawItem(index);
120 }
121
122 void CPanel::OnDownWithShift()
123 {
124 const int focusedItem = _listView.GetFocusedItem();
125 if (focusedItem < 0)
126 return;
127 const int index = GetRealItemIndex(focusedItem);
128 if (index == kParentIndex)
129 return;
130 _selectedStatusVector[index] = !_selectedStatusVector[index];
131 _listView.RedrawItem(index);
132 }
133 */
134
UpdateSelection()135 void CPanel::UpdateSelection()
136 {
137 if (!_mySelectMode)
138 {
139 bool enableTemp = _enableItemChangeNotify;
140 _enableItemChangeNotify = false;
141 int numItems = _listView.GetItemCount();
142 for (int i = 0; i < numItems; i++)
143 {
144 const unsigned realIndex = GetRealItemIndex(i);
145 if (realIndex != kParentIndex)
146 _listView.SetItemState_Selected(i, _selectedStatusVector[realIndex]);
147 }
148 _enableItemChangeNotify = enableTemp;
149 }
150 _listView.RedrawAllItems();
151 }
152
153
SelectSpec(bool selectMode)154 void CPanel::SelectSpec(bool selectMode)
155 {
156 CComboDialog dlg;
157 LangString(selectMode ? IDS_SELECT : IDS_DESELECT, dlg.Title );
158 LangString(IDS_SELECT_MASK, dlg.Static);
159 dlg.Value = '*';
160 if (dlg.Create(GetParent()) != IDOK)
161 return;
162 const UString &mask = dlg.Value;
163 FOR_VECTOR (i, _selectedStatusVector)
164 if (DoesWildcardMatchName(mask, GetItemName(i)))
165 _selectedStatusVector[i] = selectMode;
166 UpdateSelection();
167 }
168
SelectByType(bool selectMode)169 void CPanel::SelectByType(bool selectMode)
170 {
171 const int focusedItem = _listView.GetFocusedItem();
172 if (focusedItem < 0)
173 return;
174 const unsigned realIndex = GetRealItemIndex(focusedItem);
175 UString name = GetItemName(realIndex);
176 bool isItemFolder = IsItem_Folder(realIndex);
177
178 if (isItemFolder)
179 {
180 FOR_VECTOR (i, _selectedStatusVector)
181 if (IsItem_Folder(i) == isItemFolder)
182 _selectedStatusVector[i] = selectMode;
183 }
184 else
185 {
186 int pos = name.ReverseFind_Dot();
187 if (pos < 0)
188 {
189 FOR_VECTOR (i, _selectedStatusVector)
190 if (IsItem_Folder(i) == isItemFolder && GetItemName(i).ReverseFind_Dot() < 0)
191 _selectedStatusVector[i] = selectMode;
192 }
193 else
194 {
195 UString mask ('*');
196 mask += name.Ptr((unsigned)pos);
197 FOR_VECTOR (i, _selectedStatusVector)
198 if (IsItem_Folder(i) == isItemFolder && DoesWildcardMatchName(mask, GetItemName(i)))
199 _selectedStatusVector[i] = selectMode;
200 }
201 }
202
203 UpdateSelection();
204 }
205
SelectAll(bool selectMode)206 void CPanel::SelectAll(bool selectMode)
207 {
208 FOR_VECTOR (i, _selectedStatusVector)
209 _selectedStatusVector[i] = selectMode;
210 UpdateSelection();
211 }
212
InvertSelection()213 void CPanel::InvertSelection()
214 {
215 if (!_mySelectMode)
216 {
217 /*
218 unsigned numSelected = 0;
219 FOR_VECTOR (i, _selectedStatusVector)
220 if (_selectedStatusVector[i])
221 numSelected++;
222 */
223 // 17.02: fixed : now we invert item even, if single item is selected
224 /*
225 if (numSelected == 1)
226 {
227 int focused = _listView.GetFocusedItem();
228 if (focused >= 0)
229 {
230 const unsigned realIndex = GetRealItemIndex(focused);
231 if (realIndex >= 0)
232 if (_selectedStatusVector[realIndex])
233 _selectedStatusVector[realIndex] = false;
234 }
235 }
236 */
237 }
238 FOR_VECTOR (i, _selectedStatusVector)
239 _selectedStatusVector[i] = !_selectedStatusVector[i];
240 UpdateSelection();
241 }
242
KillSelection()243 void CPanel::KillSelection()
244 {
245 SelectAll(false);
246 // ver 20.01: now we don't like that focused will be selected item.
247 // So the following code was disabled:
248 /*
249 if (!_mySelectMode)
250 {
251 int focused = _listView.GetFocusedItem();
252 if (focused >= 0)
253 {
254 // CPanel::OnItemChanged notify for LVIS_SELECTED change doesn't work here. Why?
255 // so we change _selectedStatusVector[realIndex] here.
256 const unsigned realIndex = GetRealItemIndex(focused);
257 if (realIndex != kParentIndex)
258 _selectedStatusVector[realIndex] = true;
259 _listView.SetItemState_Selected(focused);
260 }
261 }
262 */
263 }
264
OnLeftClick(MY_NMLISTVIEW_NMITEMACTIVATE * itemActivate)265 void CPanel::OnLeftClick(MY_NMLISTVIEW_NMITEMACTIVATE *itemActivate)
266 {
267 if (itemActivate->hdr.hwndFrom != HWND(_listView))
268 return;
269 // It will work only for Version 4.71 (IE 4);
270 int indexInList = itemActivate->iItem;
271 if (indexInList < 0)
272 return;
273
274 #ifndef UNDER_CE
275 if ((itemActivate->uKeyFlags & LVKF_SHIFT) != 0)
276 {
277 // int focusedIndex = _listView.GetFocusedItem();
278 const int focusedIndex = _startGroupSelect;
279 if (focusedIndex < 0)
280 return;
281 const int startItem = MyMin(focusedIndex, indexInList);
282 const int finishItem = MyMax(focusedIndex, indexInList);
283
284 const int numItems = _listView.GetItemCount();
285 for (int i = 0; i < numItems; i++)
286 {
287 const unsigned realIndex = GetRealItemIndex(i);
288 if (realIndex == kParentIndex)
289 continue;
290 const bool selected = (i >= startItem && i <= finishItem);
291 if (_selectedStatusVector[realIndex] != selected)
292 {
293 _selectedStatusVector[realIndex] = selected;
294 _listView.RedrawItem(i);
295 }
296 }
297 }
298 else
299 #endif
300 {
301 _startGroupSelect = indexInList;
302
303 #ifndef UNDER_CE
304 if ((itemActivate->uKeyFlags & LVKF_CONTROL) != 0)
305 {
306 const unsigned realIndex = GetRealItemIndex(indexInList);
307 if (realIndex != kParentIndex)
308 {
309 _selectedStatusVector[realIndex] = !_selectedStatusVector[realIndex];
310 _listView.RedrawItem(indexInList);
311 }
312 }
313 #endif
314 }
315
316 return;
317 }
318