Files
easy7zip/7zip/FileManager/PanelSelect.cpp
Igor Pavlov 8c1b5c7b7e 3.13
2016-05-28 00:15:41 +01:00

240 lines
6.2 KiB
C++
Executable File

// PanelSelect.cpp
#include "StdAfx.h"
#include "resource.h"
#include "Common/StringConvert.h"
#include "Common/Wildcard.h"
#include "Panel.h"
#include "Resource/ComboDialog/ComboDialog.h"
#include "LangUtils.h"
void CPanel::OnShiftSelectMessage()
{
int focusedItem = _listView.GetFocusedItem();
if (focusedItem < 0)
return;
if (!_selectionIsDefined)
return;
int startItem = MyMin(focusedItem, _prevFocusedItem);
int finishItem = MyMax(focusedItem, _prevFocusedItem);
for (int i = 0; i < _listView.GetItemCount(); i++)
{
int realIndex = GetRealItemIndex(i);
if (realIndex == -1)
continue;
if (i >= startItem && i <= finishItem)
if (_selectedStatusVector[realIndex] != _selectMark)
{
_selectedStatusVector[realIndex] = _selectMark;
_listView.RedrawItem(i);
}
}
_prevFocusedItem = focusedItem;
}
void CPanel::OnArrowWithShift()
{
int focusedItem = _listView.GetFocusedItem();
if (focusedItem < 0)
return;
int realIndex = GetRealItemIndex(focusedItem);
if (_selectionIsDefined)
{
if (realIndex != -1)
_selectedStatusVector[realIndex] = _selectMark;
}
else
{
if (realIndex == -1)
{
_selectionIsDefined = true;
_selectMark = true;
}
else
{
_selectionIsDefined = true;
_selectMark = !_selectedStatusVector[realIndex];
_selectedStatusVector[realIndex] = _selectMark;
}
}
_prevFocusedItem = focusedItem;
PostMessage(kShiftSelectMessage);
_listView.RedrawItem(focusedItem);
}
void CPanel::OnInsert()
{
/*
const int kState = CDIS_MARKED; // LVIS_DROPHILITED;
UINT state = (_listView.GetItemState(focusedItem, LVIS_CUT) == 0) ?
LVIS_CUT : 0;
_listView.SetItemState(focusedItem, state, LVIS_CUT);
// _listView.SetItemState(focusedItem, LVIS_SELECTED, LVIS_SELECTED);
*/
int focusedItem = _listView.GetFocusedItem();
if (focusedItem < 0)
return;
int realIndex = GetRealItemIndex(focusedItem);
if (realIndex != -1)
_selectedStatusVector[realIndex] = !_selectedStatusVector[realIndex];
_listView.RedrawItem(focusedItem);
int nextIndex = focusedItem + 1;
if (nextIndex < _listView.GetItemCount())
{
_listView.SetItemState(nextIndex, LVIS_FOCUSED | LVIS_SELECTED,
LVIS_FOCUSED | LVIS_SELECTED);
_listView.EnsureVisible(nextIndex, false);
}
}
/*
void CPanel::OnUpWithShift()
{
int focusedItem = _listView.GetFocusedItem();
if (focusedItem < 0)
return;
int index = GetRealItemIndex(focusedItem);
_selectedStatusVector[index] = !_selectedStatusVector[index];
_listView.RedrawItem(index);
}
void CPanel::OnDownWithShift()
{
int focusedItem = _listView.GetFocusedItem();
if (focusedItem < 0)
return;
int index = GetRealItemIndex(focusedItem);
_selectedStatusVector[index] = !_selectedStatusVector[index];
_listView.RedrawItem(index);
}
*/
void CPanel::SelectSpec(bool selectMode)
{
CComboDialog comboDialog;
comboDialog.Title = selectMode ?
LangLoadStringW(IDS_SELECT, 0x03020250):
LangLoadStringW(IDS_DESELECT, 0x03020251);
comboDialog.Static = LangLoadStringW(IDS_SELECT_MASK, 0x03020252);
comboDialog.Value = L"*";
if (comboDialog.Create(GetParent()) == IDCANCEL)
return;
UString mask = GetUnicodeString(comboDialog.Value);
for (int i = 0; i < _selectedStatusVector.Size(); i++)
if (CompareWildCardWithName(mask, GetItemName(i)))
_selectedStatusVector[i] = selectMode;
_listView.RedrawAllItems();
}
void CPanel::SelectByType(bool selectMode)
{
int focusedItem = _listView.GetFocusedItem();
if (focusedItem < 0)
return;
int realIndex = GetRealItemIndex(focusedItem);
UString name = GetItemName(realIndex);
bool isItemFolder = IsItemFolder(realIndex);
UINT32 numItems;
_folder->GetNumberOfItems(&numItems);
if (_selectedStatusVector.Size() != numItems)
throw 11111;
if (isItemFolder)
{
for (int i = 0; i < _selectedStatusVector.Size(); i++)
if (IsItemFolder(i) == isItemFolder)
_selectedStatusVector[i] = selectMode;
}
else
{
int pos = name.ReverseFind(L'.');
if (pos < 0)
{
for (int i = 0; i < _selectedStatusVector.Size(); i++)
if (IsItemFolder(i) == isItemFolder && GetItemName(i).ReverseFind(L'.') < 0)
_selectedStatusVector[i] = selectMode;
}
else
{
UString mask = UString(L'*') + name.Mid(pos);
for (int i = 0; i < _selectedStatusVector.Size(); i++)
if (IsItemFolder(i) == isItemFolder && CompareWildCardWithName(mask, GetItemName(i)))
_selectedStatusVector[i] = selectMode;
}
}
_listView.RedrawAllItems();
}
void CPanel::SelectAll(bool selectMode)
{
for (int i = 0; i < _selectedStatusVector.Size(); i++)
_selectedStatusVector[i] = selectMode;
_listView.RedrawAllItems();
}
void CPanel::InvertSelection()
{
for (int i = 0; i < _selectedStatusVector.Size(); i++)
_selectedStatusVector[i] = !_selectedStatusVector[i];
_listView.RedrawAllItems();
}
void CPanel::KillSelection()
{
SelectAll(false);
}
void CPanel::OnLeftClick(LPNMITEMACTIVATE itemActivate)
{
if(itemActivate->hdr.hwndFrom != HWND(_listView))
return;
// It will be work only for Version 4.71 (IE 4);
int indexInList = itemActivate->iItem;
if (indexInList < 0)
return;
if ((itemActivate->uKeyFlags & LVKF_SHIFT) != 0)
{
// int focusedIndex = _listView.GetFocusedItem();
int focusedIndex = _startGroupSelect;
if (focusedIndex < 0)
return;
int startItem = MyMin(focusedIndex, indexInList);
int finishItem = MyMax(focusedIndex, indexInList);
for (int i = 0; i < _selectedStatusVector.Size(); i++)
{
int realIndex = GetRealItemIndex(i);
if (realIndex == -1)
continue;
bool selected = (i >= startItem && i <= finishItem);
if (_selectedStatusVector[realIndex] != selected)
{
_selectedStatusVector[realIndex] = selected;
_listView.RedrawItem(i);
}
}
}
else
{
_startGroupSelect = indexInList;
if ((itemActivate->uKeyFlags & LVKF_CONTROL) != 0)
{
int realIndex = GetRealItemIndex(indexInList);
if (realIndex != -1)
{
_selectedStatusVector[realIndex] = !_selectedStatusVector[realIndex];
_listView.RedrawItem(indexInList);
}
}
}
return;
}