diff options
Diffstat (limited to '7zip/FileManager/PanelItems.cpp')
-rwxr-xr-x | 7zip/FileManager/PanelItems.cpp | 817 |
1 files changed, 0 insertions, 817 deletions
diff --git a/7zip/FileManager/PanelItems.cpp b/7zip/FileManager/PanelItems.cpp deleted file mode 100755 index c7483eb5..00000000 --- a/7zip/FileManager/PanelItems.cpp +++ /dev/null @@ -1,817 +0,0 @@ -// PanelItems.cpp - -#include "StdAfx.h" - -#include "Common/String.h" -#include "Common/StringConvert.h" - -#include "Windows/PropVariant.h" -#include "Windows/PropVariantConversions.h" -#include "Windows/Menu.h" - -#include "../PropID.h" - -#include "Panel.h" -#include "resource.h" - -#include "RootFolder.h" - -#include "PropertyName.h" -#include "LangUtils.h" - -using namespace NWindows; - -static int GetColumnAlign(PROPID propID, VARTYPE varType) -{ - switch(propID) - { - case kpidCreationTime: - case kpidLastAccessTime: - case kpidLastWriteTime: - return LVCFMT_LEFT; - } - switch(varType) - { - case VT_UI1: - case VT_I2: - case VT_UI2: - case VT_I4: - case VT_INT: - case VT_UI4: - case VT_UINT: - case VT_I8: - case VT_UI8: - case VT_BOOL: - return LVCFMT_RIGHT; - - case VT_EMPTY: - case VT_I1: - case VT_FILETIME: - case VT_BSTR: - return LVCFMT_LEFT; - - default: - return LVCFMT_CENTER; - } -} - -void CPanel::InitColumns() -{ - if (_needSaveInfo) - SaveListViewInfo(); - - _listView.DeleteAllItems(); - _selectedStatusVector.Clear(); - - ReadListViewInfo(); - - - PROPID sortID; - /* - if (_listViewInfo.SortIndex >= 0) - sortID = _listViewInfo.Columns[_listViewInfo.SortIndex].PropID; - */ - sortID = _listViewInfo.SortID; - - _ascending = _listViewInfo.Ascending; - - _properties.Clear(); - - CMyComPtr<IEnumProperties> enumProperties; - // CMyComPtr<IEnumSTATPROPSTG> enumSTATPROPSTG; - /* - if (m_ArchiveHandler) - { - if (m_ArchiveHandler->EnumProperties(&enumSTATPROPSTG) != S_OK) - throw 1; - } - else - */ - { - if (_folder.QueryInterface(IID_IEnumProperties, &enumProperties) != S_OK) - throw 1; - /* - if (enumProperties->EnumProperties(&enumSTATPROPSTG)!= S_OK) - throw 1; - */ - } - - _needSaveInfo = true; - - UINT32 numProperties; - enumProperties->GetNumberOfProperties(&numProperties); - int i; - for (i = 0; i < (int)numProperties; i++) - { - CMyComBSTR name; - PROPID propID; - VARTYPE varType; - - if (enumProperties->GetPropertyInfo(i, &name, &propID, &varType) != S_OK) - throw 1; - - CItemProperty destProperty; - destProperty.Type = varType; - destProperty.ID = propID; - if (propID == kpidIsFolder) - continue; - { - if (name != NULL) - destProperty.Name = name; - else - destProperty.Name = L"Error"; - } - UString propName = GetNameOfProperty(propID); - if (!propName.IsEmpty()) - destProperty.Name = propName; - destProperty.Order = -1; - destProperty.IsVisible = true; - destProperty.Width = 100; - _properties.Add(destProperty); - } - // InitColumns2(sortID); - - for (;;) - if (!_listView.DeleteColumn(0)) - break; - - int order = 0; - for(i = 0; i < _listViewInfo.Columns.Size(); i++) - { - const CColumnInfo &columnInfo = _listViewInfo.Columns[i]; - int index = _properties.FindItemWithID(columnInfo.PropID); - if (index >= 0) - { - CItemProperty &item = _properties[index]; - item.IsVisible = columnInfo.IsVisible; - item.Width = columnInfo.Width; - if (columnInfo.IsVisible) - item.Order = order++; - continue; - } - } - for(i = 0; i < _properties.Size(); i++) - { - CItemProperty &item = _properties[i]; - if (item.Order < 0) - item.Order = order++; - } - - _visibleProperties.Clear(); - for (i = 0; i < _properties.Size(); i++) - { - const CItemProperty &property = _properties[i]; - if (property.IsVisible) - _visibleProperties.Add(property); - } - - // _sortIndex = 0; - _sortID = kpidName; - /* - if (_listViewInfo.SortIndex >= 0) - { - int sortIndex = _properties.FindItemWithID(sortID); - if (sortIndex >= 0) - _sortIndex = sortIndex; - } - */ - _sortID = _listViewInfo.SortID; - - for (i = 0; i < _visibleProperties.Size(); i++) - { - InsertColumn(i); - } -} - -void CPanel::InsertColumn(int index) -{ - const CItemProperty &property = _visibleProperties[index]; - LV_COLUMNW column; - column.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM | LVCF_ORDER; - column.cx = property.Width; - column.fmt = GetColumnAlign(property.ID, property.Type); - column.iOrder = property.Order; - column.iSubItem = index; - UString propertyName = GetNameOfProperty(property.ID); - if (propertyName.IsEmpty()) - propertyName = property.Name; - column.pszText = (wchar_t *)(const wchar_t *)propertyName; - _listView.InsertColumn(index, &column); -} - -void CPanel::RefreshListCtrl() -{ - RefreshListCtrl(UString(), -1, true, UStringVector()); -} - -int CALLBACK CompareItems(LPARAM lParam1, LPARAM lParam2, LPARAM lpData); - - -void CPanel::GetSelectedNames(UStringVector &selectedNames) -{ - selectedNames.Clear(); - - CRecordVector<UINT32> indices; - GetSelectedItemsIndices(indices); - selectedNames.Reserve(indices.Size()); - for (int i = 0; i < indices.Size(); i++) - selectedNames.Add(GetItemRelPath(indices[i])); - - /* - for (int i = 0; i < _listView.GetItemCount(); i++) - { - const int kSize = 1024; - WCHAR name[kSize + 1]; - LVITEMW item; - item.iItem = i; - item.pszText = name; - item.cchTextMax = kSize; - item.iSubItem = 0; - item.mask = LVIF_TEXT | LVIF_PARAM; - if (!_listView.GetItem(&item)) - continue; - int realIndex = GetRealIndex(item); - if (realIndex == kParentIndex) - continue; - if (_selectedStatusVector[realIndex]) - selectedNames.Add(item.pszText); - } - */ - selectedNames.Sort(); -} - -void CPanel::SaveSelectedState(CSelectedState &s) -{ - s.FocusedName.Empty(); - s.SelectedNames.Clear(); - s.FocusedItem = _listView.GetFocusedItem(); - { - if (s.FocusedItem >= 0) - { - int realIndex = GetRealItemIndex(s.FocusedItem); - if (realIndex != kParentIndex) - s.FocusedName = GetItemRelPath(realIndex); - /* - const int kSize = 1024; - WCHAR name[kSize + 1]; - LVITEMW item; - item.iItem = focusedItem; - item.pszText = name; - item.cchTextMax = kSize; - item.iSubItem = 0; - item.mask = LVIF_TEXT; - if (_listView.GetItem(&item)) - focusedName = item.pszText; - */ - } - } - GetSelectedNames(s.SelectedNames); -} - -void CPanel::RefreshListCtrl(const CSelectedState &s) -{ - bool selectFocused = s.SelectFocused; - if (_mySelectMode) - selectFocused = true; - RefreshListCtrl(s.FocusedName, s.FocusedItem, selectFocused, s.SelectedNames); -} - -void CPanel::RefreshListCtrlSaveFocused() -{ - CSelectedState state; - SaveSelectedState(state); - RefreshListCtrl(state); -} - -void CPanel::SetFocusedSelectedItem(int index, bool select) -{ - UINT state = LVIS_FOCUSED; - if (select) - state |= LVIS_SELECTED; - _listView.SetItemState(index, state, state); - if (!_mySelectMode && select) - { - int realIndex = GetRealItemIndex(index); - if (realIndex != kParentIndex) - _selectedStatusVector[realIndex] = true; - } -} - -void CPanel::RefreshListCtrl(const UString &focusedName, int focusedPos, bool selectFocused, - const UStringVector &selectedNames) -{ - _dontShowMode = false; - LoadFullPathAndShow(); - // OutputDebugStringA("=======\n"); - // OutputDebugStringA("s1 \n"); - CDisableTimerProcessing timerProcessing(*this); - - if (focusedPos < 0) - focusedPos = 0; - - _listView.SetRedraw(false); - // m_RedrawEnabled = false; - - LVITEMW item; - ZeroMemory(&item, sizeof(item)); - - _listView.DeleteAllItems(); - _selectedStatusVector.Clear(); - // _realIndices.Clear(); - _startGroupSelect = 0; - - _selectionIsDefined = false; - - // m_Files.Clear(); - // _folder.Release(); - - if (!_folder) - { - // throw 1; - SetToRootFolder(); - } - - _headerToolBar.EnableButton(kParentFolderID, !IsRootFolder()); - - CMyComPtr<IFolderSetFlatMode> folderSetFlatMode; - _folder.QueryInterface(IID_IFolderSetFlatMode, &folderSetFlatMode); - if (folderSetFlatMode) - folderSetFlatMode->SetFlatMode(BoolToInt(_flatMode)); - - if (_folder->LoadItems() != S_OK) - return; - - InitColumns(); - - - // OutputDebugString(TEXT("Start Dir\n")); - UINT32 numItems; - _folder->GetNumberOfItems(&numItems); - - bool showDots = _showDots && !IsRootFolder(); - - _listView.SetItemCount(numItems + (showDots ? 1 : 0)); - - _selectedStatusVector.Reserve(numItems); - int cursorIndex = -1; - - CMyComPtr<IFolderGetSystemIconIndex> folderGetSystemIconIndex; - if (!IsFSFolder() || _showRealFileIcons) - _folder.QueryInterface(IID_IFolderGetSystemIconIndex, &folderGetSystemIconIndex); - - if (showDots) - { - UString itemName = L".."; - item.iItem = _listView.GetItemCount(); - if (itemName.CompareNoCase(focusedName) == 0) - cursorIndex = item.iItem; - item.mask = LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE; - int subItem = 0; - item.iSubItem = subItem++; - item.lParam = kParentIndex; - item.pszText = (wchar_t *)(const wchar_t *)itemName; - UINT32 attributes = FILE_ATTRIBUTE_DIRECTORY; - item.iImage = _extToIconMap.GetIconIndex(attributes, itemName); - if (item.iImage < 0) - item.iImage = 0; - if(_listView.InsertItem(&item) == -1) - return; - } - - // OutputDebugStringA("S1\n"); - - for(UInt32 i = 0; i < numItems; i++) - { - UString itemName = GetItemName(i); - const UString relPath = GetItemRelPath(i); - if (relPath.CompareNoCase(focusedName) == 0) - cursorIndex = _listView.GetItemCount(); - bool selected = false; - if (selectedNames.FindInSorted(relPath) >= 0) - selected = true; - _selectedStatusVector.Add(selected); - - item.mask = LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE; - - if (!_mySelectMode) - if (selected) - { - item.mask |= LVIF_STATE; - item.state = LVIS_SELECTED; - } - - int subItem = 0; - item.iItem = _listView.GetItemCount(); - - item.iSubItem = subItem++; - item.lParam = i; - - UString correctedName; - if (itemName.Find(L" ") >= 0) - { - int pos = 0; - for (;;) - { - int posNew = itemName.Find(L" ", pos); - if (posNew < 0) - { - correctedName += itemName.Mid(pos); - break; - } - correctedName += itemName.Mid(pos, posNew - pos); - correctedName += L" ... "; - pos = posNew; - while (itemName[++pos] == ' '); - } - item.pszText = (wchar_t *)(const wchar_t *)correctedName; - } - else - item.pszText = (wchar_t *)(const wchar_t *)itemName; - - NCOM::CPropVariant propVariant; - _folder->GetProperty(i, kpidAttributes, &propVariant); - UINT32 attributes = 0; - if (propVariant.vt == VT_UI4) - attributes = propVariant.ulVal; - else - { - if (IsItemFolder(i)) - attributes |= FILE_ATTRIBUTE_DIRECTORY; - } - - bool defined = false; - - if (folderGetSystemIconIndex) - { - folderGetSystemIconIndex->GetSystemIconIndex(i, &item.iImage); - defined = (item.iImage > 0); - } - if (!defined) - { - if (_currentFolderPrefix.IsEmpty()) - { - int iconIndexTemp; - GetRealIconIndex(itemName + L"\\", attributes, iconIndexTemp); - item.iImage = iconIndexTemp; - } - else - { - item.iImage = _extToIconMap.GetIconIndex(attributes, itemName); - } - } - if (item.iImage < 0) - item.iImage = 0; - - if(_listView.InsertItem(&item) == -1) - return; // error - } - // OutputDebugStringA("End2\n"); - - if(_listView.GetItemCount() > 0 && cursorIndex >= 0) - SetFocusedSelectedItem(cursorIndex, selectFocused); - _listView.SortItems(CompareItems, (LPARAM)this); - if (cursorIndex < 0 && _listView.GetItemCount() > 0) - { - if (focusedPos >= _listView.GetItemCount()) - focusedPos = _listView.GetItemCount() - 1; - SetFocusedSelectedItem(focusedPos, true); - } - // m_RedrawEnabled = true; - _listView.EnsureVisible(_listView.GetFocusedItem(), false); - _listView.SetRedraw(true); - _listView.InvalidateRect(NULL, true); - // OutputDebugStringA("End1\n"); - /* - _listView.UpdateWindow(); - */ -} - -void CPanel::GetSelectedItemsIndices(CRecordVector<UINT32> &indices) const -{ - indices.Clear(); - /* - int itemIndex = -1; - while ((itemIndex = _listView.GetNextItem(itemIndex, LVNI_SELECTED)) != -1) - { - LPARAM param; - if (_listView.GetItemParam(itemIndex, param)) - indices.Add(param); - } - */ - for (int i = 0; i < _selectedStatusVector.Size(); i++) - if (_selectedStatusVector[i]) - indices.Add(i); - indices.Sort(); -} - -void CPanel::GetOperatedItemIndices(CRecordVector<UINT32> &indices) const -{ - GetSelectedItemsIndices(indices); - if (!indices.IsEmpty()) - return; - if (_listView.GetSelectedCount() == 0) - return; - int focusedItem = _listView.GetFocusedItem(); - if (focusedItem >= 0) - { - if(_listView.GetItemState(focusedItem, LVIS_SELECTED) == LVIS_SELECTED) - { - int realIndex = GetRealItemIndex(focusedItem); - if (realIndex != kParentIndex) - indices.Add(realIndex); - } - } -} - -/* -void CPanel::GetOperatedListViewIndices(CRecordVector<UInt32> &indices) const -{ - indices.Clear(); - int numItems = _listView.GetItemCount(); - for (int i = 0; i < numItems; i++) - { - int realIndex = GetRealItemIndex(i); - if (realIndex >= 0) - if (_selectedStatusVector[realIndex]) - indices.Add(i); - } - if (indices.IsEmpty()) - { - int focusedItem = _listView.GetFocusedItem(); - if (focusedItem >= 0) - indices.Add(focusedItem); - } -} -*/ - -void CPanel::EditItem() -{ - int focusedItem = _listView.GetFocusedItem(); - if (focusedItem < 0) - return; - int realIndex = GetRealItemIndex(focusedItem); - if (realIndex == kParentIndex) - return; - if (!IsItemFolder(realIndex)) - EditItem(realIndex); -} - -void CPanel::OpenFocusedItemAsInternal() -{ - int focusedItem = _listView.GetFocusedItem(); - if (focusedItem < 0) - return; - int realIndex = GetRealItemIndex(focusedItem); - if (IsItemFolder(realIndex)) - OpenFolder(realIndex); - else - OpenItem(realIndex, true, false); -} - -void CPanel::OpenSelectedItems(bool tryInternal) -{ - CRecordVector<UINT32> indices; - GetOperatedItemIndices(indices); - if (indices.Size() > 20) - { - MessageBox(LangString(IDS_TOO_MANY_ITEMS, 0x02000606)); - return; - } - - int focusedItem = _listView.GetFocusedItem(); - if (focusedItem >= 0) - { - int realIndex = GetRealItemIndex(focusedItem); - if (realIndex == kParentIndex && (tryInternal || indices.Size() == 0)) - indices.Insert(0, realIndex); - } - - bool dirIsStarted = false; - for(int i = 0; i < indices.Size(); i++) - { - UINT32 index = indices[i]; - // CFileInfo &aFile = m_Files[index]; - if (IsItemFolder(index)) - { - if (!dirIsStarted) - { - if (tryInternal) - { - OpenFolder(index); - dirIsStarted = true; - break; - } - else - OpenFolderExternal(index); - } - } - else - OpenItem(index, (tryInternal && indices.Size() == 1), true); - } -} - -UString CPanel::GetItemName(int itemIndex) const -{ - if (itemIndex == kParentIndex) - return L".."; - NCOM::CPropVariant propVariant; - if (_folder->GetProperty(itemIndex, kpidName, &propVariant) != S_OK) - throw 2723400; - if (propVariant.vt != VT_BSTR) - throw 2723401; - return (propVariant.bstrVal); -} - -UString CPanel::GetItemPrefix(int itemIndex) const -{ - if (itemIndex == kParentIndex) - return UString(); - NCOM::CPropVariant propVariant; - if (_folder->GetProperty(itemIndex, kpidPrefix, &propVariant) != S_OK) - throw 2723400; - UString prefix; - if (propVariant.vt == VT_BSTR) - prefix = propVariant.bstrVal; - return prefix; -} - -UString CPanel::GetItemRelPath(int itemIndex) const -{ - return GetItemPrefix(itemIndex) + GetItemName(itemIndex); -} - - -bool CPanel::IsItemFolder(int itemIndex) const -{ - if (itemIndex == kParentIndex) - return true; - NCOM::CPropVariant propVariant; - if (_folder->GetProperty(itemIndex, kpidIsFolder, &propVariant) != S_OK) - throw 2723400; - if (propVariant.vt == VT_BOOL) - return VARIANT_BOOLToBool(propVariant.boolVal); - if (propVariant.vt == VT_EMPTY) - return false; - return false; -} - -UINT64 CPanel::GetItemSize(int itemIndex) const -{ - if (itemIndex == kParentIndex) - return 0; - NCOM::CPropVariant propVariant; - if (_folder->GetProperty(itemIndex, kpidSize, &propVariant) != S_OK) - throw 2723400; - if (propVariant.vt == VT_EMPTY) - return 0; - return ConvertPropVariantToUInt64(propVariant); -} - -void CPanel::ReadListViewInfo() -{ - CMyComPtr<IFolderGetTypeID> folderGetTypeID; - if(_folder.QueryInterface(IID_IFolderGetTypeID, &folderGetTypeID) != S_OK) - return; - CMyComBSTR typeID; - folderGetTypeID->GetTypeID(&typeID); - _typeIDString = typeID; - ::ReadListViewInfo(_typeIDString, _listViewInfo); -} - -void CPanel::SaveListViewInfo() -{ - int i; - for(i = 0; i < _visibleProperties.Size(); i++) - { - CItemProperty &property = _visibleProperties[i]; - LVCOLUMN winColumnInfo; - winColumnInfo.mask = LVCF_ORDER | LVCF_WIDTH; - if (!_listView.GetColumn(i, &winColumnInfo)) - throw 1; - property.Order = winColumnInfo.iOrder; - property.Width = winColumnInfo.cx; - } - - CListViewInfo viewInfo; - - // PROPID sortPropID = _properties[_sortIndex].ID; - PROPID sortPropID = _sortID; - - _visibleProperties.Sort(); - for(i = 0; i < _visibleProperties.Size(); i++) - { - const CItemProperty &property = _visibleProperties[i]; - CColumnInfo columnInfo; - columnInfo.IsVisible = property.IsVisible; - columnInfo.PropID = property.ID; - columnInfo.Width = property.Width; - viewInfo.Columns.Add(columnInfo); - } - for(i = 0; i < _properties.Size(); i++) - { - const CItemProperty &property = _properties[i]; - if (!property.IsVisible) - { - CColumnInfo columnInfo; - columnInfo.IsVisible = property.IsVisible; - columnInfo.PropID = property.ID; - columnInfo.Width = property.Width; - viewInfo.Columns.Add(columnInfo); - } - } - - // viewInfo.SortIndex = viewInfo.FindColumnWithID(sortPropID); - viewInfo.SortID = sortPropID; - - viewInfo.Ascending = _ascending; - if (!_listViewInfo.IsEqual(viewInfo)) - { - ::SaveListViewInfo(_typeIDString, viewInfo); - _listViewInfo = viewInfo; - } -} - -bool CPanel::OnRightClick(LPNMITEMACTIVATE itemActiveate, LRESULT &result) -{ - if(itemActiveate->hdr.hwndFrom == HWND(_listView)) - return false; - - POINT point; - ::GetCursorPos(&point); - - CMenu menu; - CMenuDestroyer menuDestroyer(menu); - - menu.CreatePopup(); - - const int kCommandStart = 100; - for(int i = 0; i < _properties.Size(); i++) - { - const CItemProperty &property = _properties[i]; - UINT flags = MF_STRING; - if (property.IsVisible) - flags |= MF_CHECKED; - if (i == 0) - flags |= MF_GRAYED; - menu.AppendItem(flags, kCommandStart + i, GetSystemString(property.Name)); - } - int menuResult = menu.Track(TPM_LEFTALIGN | TPM_RETURNCMD | TPM_NONOTIFY, - point.x, point.y, _listView); - if (menuResult >= kCommandStart && menuResult <= kCommandStart + _properties.Size()) - { - int index = menuResult - kCommandStart; - CItemProperty &property = _properties[index]; - property.IsVisible = !property.IsVisible; - - if (property.IsVisible) - { - int prevVisibleSize = _visibleProperties.Size(); - property.Order = prevVisibleSize; - _visibleProperties.Add(property); - InsertColumn(prevVisibleSize); - } - else - { - int visibleIndex = _visibleProperties.FindItemWithID(property.ID); - _visibleProperties.Delete(visibleIndex); - /* - if (_sortIndex == index) - { - _sortIndex = 0; - _ascending = true; - } - */ - if (_sortID == property.ID) - { - _sortID = kpidName; - _ascending = true; - } - - _listView.DeleteColumn(visibleIndex); - } - } - result = TRUE; - return true; -} - -void CPanel::OnReload() -{ - RefreshListCtrlSaveFocused(); - OnRefreshStatusBar(); -} - -void CPanel::OnTimer() -{ - if (!_processTimer) - return; - CMyComPtr<IFolderWasChanged> folderWasChanged; - if (_folder.QueryInterface(IID_IFolderWasChanged, &folderWasChanged) != S_OK) - return; - INT32 wasChanged; - if (folderWasChanged->WasChanged(&wasChanged) != S_OK) - return; - if (wasChanged == 0) - return; - OnReload(); -} - |