xref: /aosp_15_r20/external/lzma/CPP/7zip/UI/FileManager/PanelSelect.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
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