HRESULT CPanel::RefreshListCtrl(const UString &focusedName, int focusedPos, bool selectFocused, const UStringVector &selectedNames) { _dontShowMode = false; LoadFullPathAndShow(); // OutputDebugStringA("=======\n"); // OutputDebugStringA("s1 \n"); CDisableTimerProcessing timerProcessing(*this); CDisableNotify disableNotify(*this); if (focusedPos < 0) focusedPos = 0; _listView.SetRedraw(false); // m_RedrawEnabled = false; LVITEMW item; ZeroMemory(&item, sizeof(item)); // DWORD tickCount0 = GetTickCount(); _enableItemChangeNotify = false; _listView.DeleteAllItems(); _enableItemChangeNotify = true; int listViewItemCount = 0; _selectedStatusVector.Clear(); // _realIndices.Clear(); _startGroupSelect = 0; _selectionIsDefined = false; // m_Files.Clear(); if (!_folder) { // throw 1; SetToRootFolder(); } _headerToolBar.EnableButton(kParentFolderID, !IsRootFolder()); { CMyComPtr<IFolderSetFlatMode> folderSetFlatMode; _folder.QueryInterface(IID_IFolderSetFlatMode, &folderSetFlatMode); if (folderSetFlatMode) folderSetFlatMode->SetFlatMode(BoolToInt(_flatMode)); } /* { CMyComPtr<IFolderSetShowNtfsStreamsMode> setShow; _folder.QueryInterface(IID_IFolderSetShowNtfsStreamsMode, &setShow); if (setShow) setShow->SetShowNtfsStreamsMode(BoolToInt(_showNtfsStrems_Mode)); } */ // DWORD tickCount1 = GetTickCount(); RINOK(_folder->LoadItems()); // DWORD tickCount2 = GetTickCount(); RINOK(InitColumns()); // OutputDebugString(TEXT("Start Dir\n")); UInt32 numItems; _folder->GetNumberOfItems(&numItems); bool showDots = _showDots && !IsRootFolder(); _listView.SetItemCount(numItems + (showDots ? 1 : 0)); _selectedStatusVector.ClearAndReserve(numItems); int cursorIndex = -1; CMyComPtr<IFolderGetSystemIconIndex> folderGetSystemIconIndex; if (!Is_Slow_Icon_Folder() || _showRealFileIcons) _folder.QueryInterface(IID_IFolderGetSystemIconIndex, &folderGetSystemIconIndex); if (!IsFSFolder()) { CMyComPtr<IGetFolderArcProps> getFolderArcProps; _folder.QueryInterface(IID_IGetFolderArcProps, &getFolderArcProps); _thereAreDeletedItems = false; if (getFolderArcProps) { CMyComPtr<IFolderArcProps> arcProps; getFolderArcProps->GetFolderArcProps(&arcProps); if (arcProps) { UInt32 numLevels; if (arcProps->GetArcNumLevels(&numLevels) != S_OK) numLevels = 0; NCOM::CPropVariant prop; if (arcProps->GetArcProp(numLevels - 1, kpidIsDeleted, &prop) == S_OK) if (prop.vt == VT_BOOL && VARIANT_BOOLToBool(prop.boolVal)) _thereAreDeletedItems = true; } } } if (showDots) { UString itemName = L".."; item.iItem = listViewItemCount; if (itemName == focusedName) cursorIndex = item.iItem; item.mask = LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE; int subItem = 0; item.iSubItem = subItem++; item.lParam = kParentIndex; // item.pszText = const_cast<wchar_t *>((const wchar_t *)itemName); item.pszText = LPSTR_TEXTCALLBACKW; UInt32 attrib = FILE_ATTRIBUTE_DIRECTORY; item.iImage = _extToIconMap.GetIconIndex(attrib, itemName); if (item.iImage < 0) item.iImage = 0; if (_listView.InsertItem(&item) == -1) return E_FAIL; listViewItemCount++; } // OutputDebugStringA("S1\n"); UString correctedName; UString itemName; UString relPath; for (UInt32 i = 0; i < numItems; i++) { const wchar_t *name = NULL; unsigned nameLen = 0; if (_folderGetItemName) _folderGetItemName->GetItemName(i, &name, &nameLen); if (!name) { GetItemName(i, itemName); name = itemName; nameLen = itemName.Len(); } bool selected = false; if (!focusedName.IsEmpty() || !selectedNames.IsEmpty()) { relPath.Empty(); // relPath += GetItemPrefix(i); // change it (_flatMode) if (i != kParentIndex && _flatMode) { const wchar_t *prefix = NULL; if (_folderGetItemName) { unsigned prefixLen = 0; _folderGetItemName->GetItemPrefix(i, &prefix, &prefixLen); if (prefix) relPath += prefix; } if (!prefix) { NCOM::CPropVariant prop; if (_folder->GetProperty(i, kpidPrefix, &prop) != S_OK) throw 2723400; if (prop.vt == VT_BSTR) relPath += prop.bstrVal; } } relPath += name; if (relPath == focusedName) cursorIndex = listViewItemCount; if (selectedNames.FindInSorted(relPath) >= 0) selected = true; } _selectedStatusVector.AddInReserved(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 = listViewItemCount; item.iSubItem = subItem++; item.lParam = i; /* int finish = nameLen - 4; int j; for (j = 0; j < finish; j++) { if (name[j ] == ' ' && name[j + 1] == ' ' && name[j + 2] == ' ' && name[j + 3] == ' ' && name[j + 4] == ' ') break; } if (j < finish) { correctedName.Empty(); correctedName = L"virus"; int pos = 0; for (;;) { int posNew = itemName.Find(L" ", pos); if (posNew < 0) { correctedName += itemName.Ptr(pos); break; } correctedName += itemName.Mid(pos, posNew - pos); correctedName += L" ... "; pos = posNew; while (itemName[++pos] == ' '); } item.pszText = const_cast<wchar_t *>((const wchar_t *)correctedName); } else */ { // item.pszText = const_cast<wchar_t *>((const wchar_t *)name); item.pszText = LPSTR_TEXTCALLBACKW; /* LPSTR_TEXTCALLBACKW works, but in some cases there are problems, since we block notify handler. */ } UInt32 attrib = 0; // for (int yyy = 0; yyy < 6000000; yyy++) { NCOM::CPropVariant prop; RINOK(_folder->GetProperty(i, kpidAttrib, &prop)); if (prop.vt == VT_UI4) { // char s[256]; sprintf(s, "attrib = %7x", attrib); OutputDebugStringA(s); attrib = prop.ulVal; } else if (IsItem_Folder(i)) attrib |= 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(us2fs((UString)name) + FCHAR_PATH_SEPARATOR, attrib, iconIndexTemp); item.iImage = iconIndexTemp; } else { item.iImage = _extToIconMap.GetIconIndex(attrib, name); } } if (item.iImage < 0) item.iImage = 0; if (_listView.InsertItem(&item) == -1) return E_FAIL; listViewItemCount++; } // OutputDebugStringA("End2\n"); if (_listView.GetItemCount() > 0 && cursorIndex >= 0) SetFocusedSelectedItem(cursorIndex, selectFocused); // DWORD tickCount3 = GetTickCount(); SetSortRawStatus(); _listView.SortItems(CompareItems, (LPARAM)this); // DWORD tickCount4 = GetTickCount(); if (cursorIndex < 0 && _listView.GetItemCount() > 0) { if (focusedPos >= _listView.GetItemCount()) focusedPos = _listView.GetItemCount() - 1; // we select item only in showDots mode. SetFocusedSelectedItem(focusedPos, showDots); } // m_RedrawEnabled = true; // DWORD tickCount5 = GetTickCount(); _listView.EnsureVisible(_listView.GetFocusedItem(), false); // DWORD tickCount6 = GetTickCount(); disableNotify.SetMemMode_Enable(); disableNotify.Restore(); _listView.SetRedraw(true); // DWORD tickCount7 = GetTickCount(); _listView.InvalidateRect(NULL, true); // DWORD tickCount8 = GetTickCount(); // OutputDebugStringA("End1\n"); /* _listView.UpdateWindow(); */ Refresh_StatusBar(); // DWORD tickCount9 = GetTickCount(); /* char s[256]; sprintf(s, // "attribMap = %5d, extMap = %5d, " "delete = %5d, load = %5d, list = %5d, sort = %5d, end = %5d", // _extToIconMap._attribMap.Size(), // _extToIconMap._extMap.Size(), tickCount1 - tickCount0, tickCount2 - tickCount1, tickCount3 - tickCount2, tickCount4 - tickCount3, tickCount5 - tickCount4 ); sprintf(s, "5 = %5d, 6 = %5d, 7 = %5d, 8 = %5d, 9 = %5d", tickCount5 - tickCount4, tickCount6 - tickCount5, tickCount7 - tickCount6, tickCount8 - tickCount7, tickCount9 - tickCount8 ); OutputDebugStringA(s); */ return S_OK; }
HRESULT 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)); RINOK(_folder->LoadItems()); RINOK(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 = const_cast<wchar_t *>((const wchar_t *)itemName); UInt32 attrib = FILE_ATTRIBUTE_DIRECTORY; item.iImage = _extToIconMap.GetIconIndex(attrib, itemName); if (item.iImage < 0) item.iImage = 0; if (_listView.InsertItem(&item) == -1) return E_FAIL; } // 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 = const_cast<wchar_t *>((const wchar_t *)correctedName); } else item.pszText = const_cast<wchar_t *>((const wchar_t *)itemName); NCOM::CPropVariant prop; RINOK(_folder->GetProperty(i, kpidAttrib, &prop)); UInt32 attrib = 0; if (prop.vt == VT_UI4) attrib = prop.ulVal; else if (IsItemFolder(i)) attrib |= 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 + WCHAR_PATH_SEPARATOR, attrib, iconIndexTemp); item.iImage = iconIndexTemp; } else { item.iImage = _extToIconMap.GetIconIndex(attrib, itemName); } } if (item.iImage < 0) item.iImage = 0; if (_listView.InsertItem(&item) == -1) return E_FAIL; // 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; // we select item only in showDots mode. SetFocusedSelectedItem(focusedPos, showDots); } // m_RedrawEnabled = true; _listView.EnsureVisible(_listView.GetFocusedItem(), false); _listView.SetRedraw(true); _listView.InvalidateRect(NULL, true); // OutputDebugStringA("End1\n"); /* _listView.UpdateWindow(); */ return S_OK; }