~ubuntu-branches/ubuntu/precise/p7zip/precise-updates

« back to all changes in this revision

Viewing changes to CPP/7zip/UI/FileManager/PanelSelect.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Mohammed Adnène Trojette
  • Date: 2009-02-14 20:12:27 UTC
  • mfrom: (1.1.11 upstream) (2.1.3 sid)
  • Revision ID: james.westby@ubuntu.com-20090214201227-go63qxm9ozfdma60
Tags: 4.65~dfsg.1-1
* New upstream release.
* Remove wx2.8 Build-Depends added by mistakes (7zG is not yet
  intended to be built).
* Use dh_clean without -k.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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 "Panel.h"
 
11
 
 
12
#include "ComboDialog.h"
 
13
 
 
14
#include "LangUtils.h"
 
15
 
 
16
void CPanel::OnShiftSelectMessage()
 
17
{
 
18
  if (!_mySelectMode)
 
19
    return;
 
20
  int focusedItem = _listView.GetFocusedItem();
 
21
  if (focusedItem < 0)
 
22
    return;
 
23
  if (!_selectionIsDefined)
 
24
    return;
 
25
  int startItem = MyMin(focusedItem, _prevFocusedItem);
 
26
  int finishItem = MyMax(focusedItem, _prevFocusedItem);
 
27
  for (int i = 0; i < _listView.GetItemCount(); i++)
 
28
  {
 
29
    int 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
  _prevFocusedItem = focusedItem;
 
40
}
 
41
 
 
42
#ifdef _WIN32
 
43
void CPanel::OnArrowWithShift()
 
44
{
 
45
  if (!_mySelectMode)
 
46
    return;
 
47
  int focusedItem = _listView.GetFocusedItem();
 
48
  if (focusedItem < 0)
 
49
    return;
 
50
  int realIndex = GetRealItemIndex(focusedItem);
 
51
  if (_selectionIsDefined)
 
52
  {
 
53
    if (realIndex != kParentIndex)
 
54
      _selectedStatusVector[realIndex] = _selectMark;
 
55
  }
 
56
  else
 
57
  {
 
58
    if (realIndex == kParentIndex)
 
59
    {
 
60
      _selectionIsDefined = true;
 
61
      _selectMark = true;
 
62
    }
 
63
    else
 
64
    {
 
65
      _selectionIsDefined = true;
 
66
      _selectMark = !_selectedStatusVector[realIndex];
 
67
      _selectedStatusVector[realIndex] = _selectMark;
 
68
    }
 
69
  }
 
70
  _prevFocusedItem = focusedItem;
 
71
  PostMessage(kShiftSelectMessage);
 
72
  _listView.RedrawItem(focusedItem);
 
73
}
 
74
 
 
75
void CPanel::OnInsert()
 
76
{
 
77
  /*
 
78
  const int kState = CDIS_MARKED; // LVIS_DROPHILITED;
 
79
  UINT state = (_listView.GetItemState(focusedItem, LVIS_CUT) == 0) ?
 
80
      LVIS_CUT : 0;
 
81
  _listView.SetItemState(focusedItem, state, LVIS_CUT);
 
82
  // _listView.SetItemState(focusedItem, LVIS_SELECTED, LVIS_SELECTED);
 
83
 
 
84
  */
 
85
  int focusedItem = _listView.GetFocusedItem();
 
86
  if (focusedItem < 0)
 
87
    return;
 
88
  int realIndex = GetRealItemIndex(focusedItem);
 
89
  bool isSelected = !_selectedStatusVector[realIndex];
 
90
  if (realIndex != kParentIndex)
 
91
    _selectedStatusVector[realIndex] = isSelected;
 
92
  
 
93
  if (!_mySelectMode)
 
94
    _listView.SetItemState(focusedItem, isSelected ? LVIS_SELECTED: 0, LVIS_SELECTED);
 
95
 
 
96
  _listView.RedrawItem(focusedItem);
 
97
 
 
98
  int nextIndex = focusedItem + 1;
 
99
  if (nextIndex < _listView.GetItemCount())
 
100
  {
 
101
    _listView.SetItemState(nextIndex, LVIS_FOCUSED | LVIS_SELECTED, 
 
102
        LVIS_FOCUSED | LVIS_SELECTED);
 
103
    _listView.EnsureVisible(nextIndex, false);
 
104
  }
 
105
}
 
106
#endif // _WIN32
 
107
 
 
108
/*
 
109
void CPanel::OnUpWithShift()
 
110
{
 
111
  int focusedItem = _listView.GetFocusedItem();
 
112
  if (focusedItem < 0)
 
113
    return;
 
114
  int index = GetRealItemIndex(focusedItem);
 
115
  _selectedStatusVector[index] = !_selectedStatusVector[index];
 
116
  _listView.RedrawItem(index);
 
117
}
 
118
 
 
119
void CPanel::OnDownWithShift()
 
120
{
 
121
  int focusedItem = _listView.GetFocusedItem();
 
122
  if (focusedItem < 0)
 
123
    return;
 
124
  int index = GetRealItemIndex(focusedItem);
 
125
  _selectedStatusVector[index] = !_selectedStatusVector[index];
 
126
  _listView.RedrawItem(index);
 
127
}
 
128
*/
 
129
 
 
130
void CPanel::UpdateSelection()
 
131
{
 
132
printf("CPanel::UpdateSelection : _mySelectMode=%d\n",(int)_mySelectMode);
 
133
  if (!_mySelectMode)
 
134
  {
 
135
    bool enableTemp = _enableItemChangeNotify;
 
136
    _enableItemChangeNotify = false;
 
137
    int numItems = _listView.GetItemCount();
 
138
printf("CPanel::UpdateSelection : numItems=%d\n",(int)numItems);
 
139
    for (int i = 0; i < numItems; i++)
 
140
    {
 
141
      int realIndex = GetRealItemIndex(i);
 
142
      if (realIndex != kParentIndex)
 
143
      {
 
144
        UINT value = 0;
 
145
        value = _selectedStatusVector[realIndex] ? LVIS_SELECTED: 0;
 
146
printf("CPanel::UpdateSelection : SetItemState(%d,%d,LVIS_SELECTED)\n",(int)i,(unsigned)value);
 
147
        _listView.SetItemState(i, value, LVIS_SELECTED);
 
148
      }
 
149
    }
 
150
    _enableItemChangeNotify = enableTemp;
 
151
  }
 
152
  _listView.RedrawAllItems();
 
153
}
 
154
 
 
155
 
 
156
void CPanel::SelectSpec(bool selectMode)
 
157
{
 
158
  CComboDialog comboDialog;
 
159
  comboDialog.Title = selectMode ? 
 
160
      LangString(IDS_SELECT, 0x03020250):
 
161
      LangString(IDS_DESELECT, 0x03020251);
 
162
  comboDialog.Static = LangString(IDS_SELECT_MASK, 0x03020252);
 
163
  comboDialog.Value = L"*";
 
164
  if (comboDialog.Create(GetParent()) == IDCANCEL)
 
165
    return;
 
166
  const UString &mask = comboDialog.Value;
 
167
  for (int i = 0; i < _selectedStatusVector.Size(); i++)
 
168
    if (CompareWildCardWithName(mask, GetItemName(i)))
 
169
       _selectedStatusVector[i] = selectMode;
 
170
  UpdateSelection();
 
171
}
 
172
 
 
173
void CPanel::SelectByType(bool selectMode)
 
174
{
 
175
  int focusedItem = _listView.GetFocusedItem();
 
176
  if (focusedItem < 0)
 
177
    return;
 
178
  int realIndex = GetRealItemIndex(focusedItem);
 
179
  UString name = GetItemName(realIndex);
 
180
  bool isItemFolder = IsItemFolder(realIndex);
 
181
 
 
182
  /*
 
183
  UINT32 numItems;
 
184
  _folder->GetNumberOfItems(&numItems);
 
185
  if ((UInt32)_selectedStatusVector.Size() != numItems)
 
186
    throw 11111;
 
187
  */
 
188
 
 
189
  if (isItemFolder)
 
190
  {
 
191
    for (int i = 0; i < _selectedStatusVector.Size(); i++)
 
192
      if (IsItemFolder(i) == isItemFolder)
 
193
        _selectedStatusVector[i] = selectMode;
 
194
  }
 
195
  else
 
196
  {
 
197
    int pos = name.ReverseFind(L'.');
 
198
    if (pos < 0)
 
199
    {
 
200
      for (int i = 0; i < _selectedStatusVector.Size(); i++)
 
201
        if (IsItemFolder(i) == isItemFolder && GetItemName(i).ReverseFind(L'.') < 0)
 
202
          _selectedStatusVector[i] = selectMode;
 
203
    }
 
204
    else
 
205
    {
 
206
      UString mask = UString(L'*') + name.Mid(pos);
 
207
      for (int i = 0; i < _selectedStatusVector.Size(); i++)
 
208
        if (IsItemFolder(i) == isItemFolder && CompareWildCardWithName(mask, GetItemName(i)))
 
209
          _selectedStatusVector[i] = selectMode;
 
210
    }
 
211
  }
 
212
  UpdateSelection();
 
213
}
 
214
 
 
215
void CPanel::SelectAll(bool selectMode)
 
216
{
 
217
  for (int i = 0; i < _selectedStatusVector.Size(); i++)
 
218
    _selectedStatusVector[i] = selectMode;
 
219
  UpdateSelection();
 
220
}
 
221
 
 
222
void CPanel::InvertSelection()
 
223
{
 
224
  if (!_mySelectMode)
 
225
  {
 
226
    int numSelected = 0;
 
227
    for (int i = 0; i < _selectedStatusVector.Size(); i++)
 
228
      if (_selectedStatusVector[i])
 
229
        numSelected++;
 
230
    if (numSelected == 1)
 
231
    {
 
232
      int focused = _listView.GetFocusedItem();
 
233
      if (focused >= 0)
 
234
      {
 
235
        int realIndex = GetRealItemIndex(focused);
 
236
        if (realIndex >= 0)
 
237
          if (_selectedStatusVector[realIndex])
 
238
            _selectedStatusVector[realIndex] = false;
 
239
      }
 
240
    }
 
241
  }
 
242
  for (int i = 0; i < _selectedStatusVector.Size(); i++)
 
243
    _selectedStatusVector[i] = !_selectedStatusVector[i];
 
244
  UpdateSelection();
 
245
}
 
246
 
 
247
void CPanel::KillSelection()
 
248
{
 
249
  SelectAll(false);
 
250
  if (!_mySelectMode)
 
251
  {
 
252
    int focused = _listView.GetFocusedItem();
 
253
    if (focused >= 0)
 
254
      _listView.SetItemState(focused, LVIS_SELECTED, LVIS_SELECTED);
 
255
  }
 
256
}
 
257
 
 
258
#ifdef _WIN32
 
259
void CPanel::OnLeftClick(LPNMITEMACTIVATE itemActivate)
 
260
{
 
261
  if(itemActivate->hdr.hwndFrom != HWND(_listView))
 
262
    return;
 
263
  // It will be work only for Version 4.71 (IE 4);
 
264
  int indexInList = itemActivate->iItem;
 
265
  if (indexInList < 0)
 
266
    return;
 
267
  if ((itemActivate->uKeyFlags & LVKF_SHIFT) != 0)
 
268
  {
 
269
    // int focusedIndex = _listView.GetFocusedItem();
 
270
    int focusedIndex = _startGroupSelect;
 
271
    if (focusedIndex < 0)
 
272
      return;
 
273
    int startItem = MyMin(focusedIndex, indexInList);
 
274
    int finishItem = MyMax(focusedIndex, indexInList);
 
275
    for (int i = 0; i < _selectedStatusVector.Size(); i++)
 
276
    {
 
277
      int realIndex = GetRealItemIndex(i);
 
278
      if (realIndex == kParentIndex)
 
279
        continue;
 
280
      bool selected = (i >= startItem && i <= finishItem);
 
281
      if (_selectedStatusVector[realIndex] != selected)
 
282
      {
 
283
        _selectedStatusVector[realIndex] = selected;
 
284
        _listView.RedrawItem(i);
 
285
      }
 
286
    }
 
287
  }
 
288
  else 
 
289
  {
 
290
    _startGroupSelect = indexInList;
 
291
    if ((itemActivate->uKeyFlags & LVKF_CONTROL) != 0)
 
292
    {
 
293
      int realIndex = GetRealItemIndex(indexInList);
 
294
      if (realIndex != kParentIndex)
 
295
      {
 
296
        _selectedStatusVector[realIndex] = !_selectedStatusVector[realIndex];
 
297
        _listView.RedrawItem(indexInList);
 
298
      }
 
299
    }
 
300
  }
 
301
  return;
 
302
}
 
303
#endif
 
304
 
 
305