Imported Upstream version 9.20
[platform/upstream/7zip.git] / CPP / 7zip / UI / FileManager / PanelSelect.cpp
1 // PanelSelect.cpp\r
2 \r
3 #include "StdAfx.h"\r
4 \r
5 #include "resource.h"\r
6 \r
7 #include "Common/StringConvert.h"\r
8 #include "Common/Wildcard.h"\r
9 \r
10 #include "Panel.h"\r
11 \r
12 #include "ComboDialog.h"\r
13 \r
14 #include "LangUtils.h"\r
15 \r
16 void CPanel::OnShiftSelectMessage()\r
17 {\r
18   if (!_mySelectMode)\r
19     return;\r
20   int focusedItem = _listView.GetFocusedItem();\r
21   if (focusedItem < 0)\r
22     return;\r
23   if (!_selectionIsDefined)\r
24     return;\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
28   {\r
29     int realIndex = GetRealItemIndex(i);\r
30     if (realIndex == kParentIndex)\r
31       continue;\r
32     if (i >= startItem && i <= finishItem)\r
33       if (_selectedStatusVector[realIndex] != _selectMark)\r
34       {\r
35         _selectedStatusVector[realIndex] = _selectMark;\r
36         _listView.RedrawItem(i);\r
37       }\r
38   }\r
39   _prevFocusedItem = focusedItem;\r
40 }\r
41 \r
42 void CPanel::OnArrowWithShift()\r
43 {\r
44   if (!_mySelectMode)\r
45     return;\r
46   int focusedItem = _listView.GetFocusedItem();\r
47   if (focusedItem < 0)\r
48     return;\r
49   int realIndex = GetRealItemIndex(focusedItem);\r
50   if (_selectionIsDefined)\r
51   {\r
52     if (realIndex != kParentIndex)\r
53       _selectedStatusVector[realIndex] = _selectMark;\r
54   }\r
55   else\r
56   {\r
57     if (realIndex == kParentIndex)\r
58     {\r
59       _selectionIsDefined = true;\r
60       _selectMark = true;\r
61     }\r
62     else\r
63     {\r
64       _selectionIsDefined = true;\r
65       _selectMark = !_selectedStatusVector[realIndex];\r
66       _selectedStatusVector[realIndex] = _selectMark;\r
67     }\r
68   }\r
69   _prevFocusedItem = focusedItem;\r
70   PostMessage(kShiftSelectMessage);\r
71   _listView.RedrawItem(focusedItem);\r
72 }\r
73 \r
74 void CPanel::OnInsert()\r
75 {\r
76   /*\r
77   const int kState = CDIS_MARKED; // LVIS_DROPHILITED;\r
78   UINT state = (_listView.GetItemState(focusedItem, LVIS_CUT) == 0) ?\r
79       LVIS_CUT : 0;\r
80   _listView.SetItemState(focusedItem, state, LVIS_CUT);\r
81   // _listView.SetItemState(focusedItem, LVIS_SELECTED, LVIS_SELECTED);\r
82 \r
83   */\r
84   int focusedItem = _listView.GetFocusedItem();\r
85   if (focusedItem < 0)\r
86     return;\r
87   int realIndex = GetRealItemIndex(focusedItem);\r
88   bool isSelected = !_selectedStatusVector[realIndex];\r
89   if (realIndex != kParentIndex)\r
90     _selectedStatusVector[realIndex] = isSelected;\r
91   \r
92   if (!_mySelectMode)\r
93     _listView.SetItemState(focusedItem, isSelected ? LVIS_SELECTED: 0, LVIS_SELECTED);\r
94 \r
95   _listView.RedrawItem(focusedItem);\r
96 \r
97   int nextIndex = focusedItem + 1;\r
98   if (nextIndex < _listView.GetItemCount())\r
99   {\r
100     _listView.SetItemState_FocusedSelected(nextIndex);\r
101     _listView.EnsureVisible(nextIndex, false);\r
102   }\r
103 }\r
104 \r
105 /*\r
106 void CPanel::OnUpWithShift()\r
107 {\r
108   int focusedItem = _listView.GetFocusedItem();\r
109   if (focusedItem < 0)\r
110     return;\r
111   int index = GetRealItemIndex(focusedItem);\r
112   _selectedStatusVector[index] = !_selectedStatusVector[index];\r
113   _listView.RedrawItem(index);\r
114 }\r
115 \r
116 void CPanel::OnDownWithShift()\r
117 {\r
118   int focusedItem = _listView.GetFocusedItem();\r
119   if (focusedItem < 0)\r
120     return;\r
121   int index = GetRealItemIndex(focusedItem);\r
122   _selectedStatusVector[index] = !_selectedStatusVector[index];\r
123   _listView.RedrawItem(index);\r
124 }\r
125 */\r
126 \r
127 void CPanel::UpdateSelection()\r
128 {\r
129   if (!_mySelectMode)\r
130   {\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
135     {\r
136       int realIndex = GetRealItemIndex(i);\r
137       if (realIndex != kParentIndex)\r
138       {\r
139         UINT value = 0;\r
140         value = _selectedStatusVector[realIndex] ? LVIS_SELECTED: 0;\r
141         _listView.SetItemState(i, value, LVIS_SELECTED);\r
142       }\r
143     }\r
144     _enableItemChangeNotify = enableTemp;\r
145   }\r
146   _listView.RedrawAllItems();\r
147 }\r
148 \r
149 \r
150 void CPanel::SelectSpec(bool selectMode)\r
151 {\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
159     return;\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
164   UpdateSelection();\r
165 }\r
166 \r
167 void CPanel::SelectByType(bool selectMode)\r
168 {\r
169   int focusedItem = _listView.GetFocusedItem();\r
170   if (focusedItem < 0)\r
171     return;\r
172   int realIndex = GetRealItemIndex(focusedItem);\r
173   UString name = GetItemName(realIndex);\r
174   bool isItemFolder = IsItemFolder(realIndex);\r
175 \r
176   /*\r
177   UINT32 numItems;\r
178   _folder->GetNumberOfItems(&numItems);\r
179   if ((UInt32)_selectedStatusVector.Size() != numItems)\r
180     throw 11111;\r
181   */\r
182 \r
183   if (isItemFolder)\r
184   {\r
185     for (int i = 0; i < _selectedStatusVector.Size(); i++)\r
186       if (IsItemFolder(i) == isItemFolder)\r
187         _selectedStatusVector[i] = selectMode;\r
188   }\r
189   else\r
190   {\r
191     int pos = name.ReverseFind(L'.');\r
192     if (pos < 0)\r
193     {\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
197     }\r
198     else\r
199     {\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
204     }\r
205   }\r
206   UpdateSelection();\r
207 }\r
208 \r
209 void CPanel::SelectAll(bool selectMode)\r
210 {\r
211   for (int i = 0; i < _selectedStatusVector.Size(); i++)\r
212     _selectedStatusVector[i] = selectMode;\r
213   UpdateSelection();\r
214 }\r
215 \r
216 void CPanel::InvertSelection()\r
217 {\r
218   if (!_mySelectMode)\r
219   {\r
220     int numSelected = 0;\r
221     for (int i = 0; i < _selectedStatusVector.Size(); i++)\r
222       if (_selectedStatusVector[i])\r
223         numSelected++;\r
224     if (numSelected == 1)\r
225     {\r
226       int focused = _listView.GetFocusedItem();\r
227       if (focused >= 0)\r
228       {\r
229         int realIndex = GetRealItemIndex(focused);\r
230         if (realIndex >= 0)\r
231           if (_selectedStatusVector[realIndex])\r
232             _selectedStatusVector[realIndex] = false;\r
233       }\r
234     }\r
235   }\r
236   for (int i = 0; i < _selectedStatusVector.Size(); i++)\r
237     _selectedStatusVector[i] = !_selectedStatusVector[i];\r
238   UpdateSelection();\r
239 }\r
240 \r
241 void CPanel::KillSelection()\r
242 {\r
243   SelectAll(false);\r
244   if (!_mySelectMode)\r
245   {\r
246     int focused = _listView.GetFocusedItem();\r
247     if (focused >= 0)\r
248     {\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
255     }\r
256   }\r
257 }\r
258 \r
259 void CPanel::OnLeftClick(MY_NMLISTVIEW_NMITEMACTIVATE *itemActivate)\r
260 {\r
261   if (itemActivate->hdr.hwndFrom != HWND(_listView))\r
262     return;\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
266     return;\r
267   #ifndef UNDER_CE\r
268   if ((itemActivate->uKeyFlags & LVKF_SHIFT) != 0)\r
269   {\r
270     // int focusedIndex = _listView.GetFocusedItem();\r
271     int focusedIndex = _startGroupSelect;\r
272     if (focusedIndex < 0)\r
273       return;\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
277     {\r
278       int realIndex = GetRealItemIndex(i);\r
279       if (realIndex == kParentIndex)\r
280         continue;\r
281       bool selected = (i >= startItem && i <= finishItem);\r
282       if (_selectedStatusVector[realIndex] != selected)\r
283       {\r
284         _selectedStatusVector[realIndex] = selected;\r
285         _listView.RedrawItem(i);\r
286       }\r
287     }\r
288   }\r
289   else\r
290   #endif\r
291   {\r
292     _startGroupSelect = indexInList;\r
293     #ifndef UNDER_CE\r
294     if ((itemActivate->uKeyFlags & LVKF_CONTROL) != 0)\r
295     {\r
296       int realIndex = GetRealItemIndex(indexInList);\r
297       if (realIndex != kParentIndex)\r
298       {\r
299         _selectedStatusVector[realIndex] = !_selectedStatusVector[realIndex];\r
300         _listView.RedrawItem(indexInList);\r
301       }\r
302     }\r
303     #endif\r
304   }\r
305   return;\r
306 }\r