lean explorer: - merge a few bug fixes from trunk - display icon overlays in Explorer tree view Modified: branches/lean-explorer/reactos/subsys/system/explorer/explorer.cpp Modified: branches/lean-explorer/reactos/subsys/system/explorer/shell/entries.cpp Modified: branches/lean-explorer/reactos/subsys/system/explorer/shell/entries.h Modified: branches/lean-explorer/reactos/subsys/system/explorer/shell/shellbrowser .cpp Modified: branches/lean-explorer/reactos/subsys/system/explorer/shell/shellbrowser .h Modified: branches/lean-explorer/reactos/subsys/system/explorer/shell/shellfs.cpp _____
Modified: branches/lean-explorer/reactos/subsys/system/explorer/explorer.cpp --- branches/lean-explorer/reactos/subsys/system/explorer/explorer.cpp 2005-12-28 17:10:36 UTC (rev 20398) +++ branches/lean-explorer/reactos/subsys/system/explorer/explorer.cpp 2005-12-28 17:37:37 UTC (rev 20399) @@ -443,8 +443,6 @@
ShowWindow(hMainFrame, cmdShow); UpdateWindow(hMainFrame);
- bool valid_dir = false; - cmd._cmdShow = cmdShow;
// parse command line options _____
Modified: branches/lean-explorer/reactos/subsys/system/explorer/shell/entries.cpp --- branches/lean-explorer/reactos/subsys/system/explorer/shell/entries.cpp 2005-12-28 17:10:36 UTC (rev 20398) +++ branches/lean-explorer/reactos/subsys/system/explorer/shell/entries.cpp 2005-12-28 17:37:37 UTC (rev 20399) @@ -319,7 +319,7 @@
}
-void Entry::extract_icon() +int Entry::extract_icon() { TCHAR path[MAX_PATH];
@@ -384,10 +384,21 @@ } }
- _icon_id = icon_id; + return icon_id; }
+int Entry::safe_extract_icon() +{ + try { + return extract_icon(); + } catch(COMException&) { + // ignore unexpected exceptions while extracting icons + }
+ return ICID_NONE; +} + + BOOL Entry::launch_entry(HWND hwnd, UINT nCmdShow) { TCHAR cmd[MAX_PATH]; _____
Modified: branches/lean-explorer/reactos/subsys/system/explorer/shell/entries.h --- branches/lean-explorer/reactos/subsys/system/explorer/shell/entries.h 2005-12-28 17:10:36 UTC (rev 20398) +++ branches/lean-explorer/reactos/subsys/system/explorer/shell/entries.h 2005-12-28 17:37:37 UTC (rev 20399) @@ -96,7 +96,8 @@
Entry* read_tree(const void* path, SORT_ORDER sortOrder); void sort_directory(SORT_ORDER sortOrder); void smart_scan(int scan_flags=SCAN_ALL); - void extract_icon(); + int extract_icon(); + int safe_extract_icon();
virtual void read_directory(int scan_flags=SCAN_ALL) {} virtual const void* get_next_path_component(const void*) const {return NULL;} _____
Modified: branches/lean-explorer/reactos/subsys/system/explorer/shell/shellbrowser .cpp --- branches/lean-explorer/reactos/subsys/system/explorer/shell/shellbrowser .cpp 2005-12-28 17:10:36 UTC (rev 20398) +++ branches/lean-explorer/reactos/subsys/system/explorer/shell/shellbrowser .cpp 2005-12-28 17:37:37 UTC (rev 20399) @@ -51,11 +51,10 @@
_left_hwnd(left_hwnd), _right_hwnd(right_hwnd), _create_info(create_info), - _cm_ifs(_cm_ifs) + _cm_ifs(cm_ifs) { _pShellView = NULL; _pDropTarget = NULL; - _himlSmall = 0; _last_sel = 0;
// SDI integration @@ -64,12 +63,16 @@
_cur_dir = NULL;
+ _himl = ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), ILC_MASK|ILC_COLOR24, 2, 0); + ImageList_SetBkColor(_himl, GetSysColor(COLOR_WINDOW)); + Init(hwnd); }
ShellBrowserChild::~ShellBrowserChild() { TreeView_SetImageList(_left_hwnd, 0, TVSIL_NORMAL); + ImageList_Destroy(_himl);
if (_pShellView) _pShellView->Release(); @@ -94,16 +97,6 @@
ClientRect rect(_hwnd);
- SHFILEINFO sfi; - - _himlSmall = (HIMAGELIST)SHGetFileInfo(TEXT("C:\"), 0, &sfi, sizeof(SHFILEINFO), SHGFI_SYSICONINDEX|SHGFI_SMALLICON); -// _himlLarge = (HIMAGELIST)SHGetFileInfo(TEXT("C:\"), 0, &sfi, sizeof(SHFILEINFO), SHGFI_SYSICONINDEX|SHGFI_LARGEICON); - - if (_left_hwnd) { - InitializeTree(); - InitDragDrop(); - } - const String& root_name = GetDesktopFolder().get_name(_create_info._root_shell_path, SHGDN_FORADDRESSBAR);
_root._drive_type = DRIVE_UNKNOWN; @@ -118,6 +111,11 @@ // -> set_curdir() _root._entry->read_directory();
+ if (_left_hwnd) { + InitializeTree(); + InitDragDrop(); + } + /* already filled by ShellDirectory constructor lstrcpy(_root._entry->_data.cFileName, TEXT("Desktop")); */
@@ -129,23 +127,21 @@ { CONTEXT("ShellBrowserChild::InitializeTree()");
- TreeView_SetImageList(_left_hwnd, _himlSmall, TVSIL_NORMAL); + TreeView_SetImageList(_left_hwnd, _himl, TVSIL_NORMAL); TreeView_SetScrollTime(_left_hwnd, 100);
- TV_ITEM tvItem; + TV_INSERTSTRUCT tvInsert; + TV_ITEM& tvItem = tvInsert.item;
+ tvInsert.hParent = 0; + tvInsert.hInsertAfter = TVI_LAST; + tvItem.mask = TVIF_PARAM | TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_CHILDREN; tvItem.lParam = (LPARAM)_root._entry; - tvItem.pszText = LPSTR_TEXTCALLBACK; + tvItem.pszText = _root._volname; //LPSTR_TEXTCALLBACK; tvItem.iImage = tvItem.iSelectedImage = I_IMAGECALLBACK; tvItem.cChildren = 1;
- TV_INSERTSTRUCT tvInsert; - - tvInsert.hParent = 0; - tvInsert.hInsertAfter = TVI_LAST; - tvInsert.item = tvItem; - HTREEITEM hItem = TreeView_InsertItem(_left_hwnd, &tvInsert); TreeView_SelectItem(_left_hwnd, hItem); TreeView_Expand(_left_hwnd, hItem, TVE_EXPAND); @@ -167,8 +163,7 @@ _pDropTarget->Release(); // free TreeDropTarget _pDropTarget = NULL; return false; - } - else + } else _pDropTarget->Release();
FORMATETC ftetc; @@ -233,38 +228,57 @@
LPNMTVDISPINFO lpdi = (LPNMTVDISPINFO)pnmh; ShellEntry* entry = (ShellEntry*)lpdi->item.lParam; - if (!entry) - return;
- if (lpdi->item.mask & TVIF_TEXT) - lpdi->item.pszText = entry->_display_name; + if (entry) { + if (lpdi->item.mask & TVIF_TEXT) + lpdi->item.pszText = entry->_display_name;
- if (lpdi->item.mask & (/*TVIF_TEXT|*/TVIF_IMAGE|TVIF_SELECTEDIMAGE)) { - ShellPath pidl_abs = entry->create_absolute_pidl(); // Caching of absolute PIDLs could enhance performance. - LPCITEMIDLIST pidl = pidl_abs; + if (lpdi->item.mask & (TVIF_IMAGE|TVIF_SELECTEDIMAGE)) { + ShellPath pidl_abs = entry->create_absolute_pidl(); // Caching of absolute PIDLs could enhance performance. + LPCITEMIDLIST pidl = pidl_abs;
- SHFILEINFO sfi; -/* - if (lpdi->item.mask & TVIF_TEXT) - if (SHGetFileInfo((LPCTSTR)pidl, 0, &sfi, sizeof(sfi), SHGFI_PIDL|SHGFI_DISPLAYNAME)) - lstrcpy(lpdi->item.pszText, sfi.szDisplayName); ///@todo look at cchTextMax if there is enough space available - else - lpdi->item.pszText = entry->_data.cFileName; -*/ - if (lpdi->item.mask & TVIF_IMAGE) - if ((HIMAGELIST)SHGetFileInfo((LPCTSTR)pidl, 0, &sfi, sizeof(sfi), SHGFI_PIDL|SHGFI_SYSICONINDEX|SHGFI_SMALLICON|SHGFI_LINKOVERLAY) == _himlSmall) - lpdi->item.iImage = sfi.iIcon; - else - lpdi->item.iImage = -1; + if (lpdi->item.mask & TVIF_IMAGE) + lpdi->item.iImage = get_entry_image(entry, pidl, SHGFI_SMALLICON, _image_map);
- if (lpdi->item.mask & TVIF_SELECTEDIMAGE) - if ((HIMAGELIST)SHGetFileInfo((LPCTSTR)pidl, 0, &sfi, sizeof(sfi), SHGFI_PIDL|SHGFI_SYSICONINDEX|SHGFI_SMALLICON|SHGFI_OPENICON) == _himlSmall) - lpdi->item.iSelectedImage = sfi.iIcon; - else - lpdi->item.iSelectedImage = -1; + if (lpdi->item.mask & TVIF_SELECTEDIMAGE) + lpdi->item.iSelectedImage = get_entry_image(entry, pidl, SHGFI_SMALLICON|SHGFI_OPENICON, _image_map_open); + } } }
+int ShellBrowserChild::get_entry_image(Entry* entry, LPCITEMIDLIST pidl, int shgfi_flags, ImageMap& cache) +{ + SHFILEINFO sfi; + int idx = -1; + + ImageMap::const_iterator found = cache.find(entry); + + if (found != cache.end()) + return found->second; + + if (SHGetFileInfo((LPCTSTR)pidl, 0, &sfi, sizeof(sfi), shgfi_flags|SHGFI_PIDL|SHGFI_ICON|SHGFI_ADDOVERLAYS)) { + idx = ImageList_AddIcon(_himl, sfi.hIcon); + + DestroyIcon(sfi.hIcon); + } + + cache[entry] = idx; + + return idx; +} + +void ShellBrowserChild::invalidate_cache() +{ + TreeView_SetImageList(_left_hwnd, 0, TVSIL_NORMAL); + ImageList_Destroy(_himl); + + TreeView_SetImageList(_left_hwnd, _himl, TVSIL_NORMAL); + _himl = ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), ILC_MASK|ILC_COLOR24, 2, 0); + + _image_map.clear(); + _image_map_open.clear(); +} + void ShellBrowserChild::OnTreeItemExpanding(int idCtrl, LPNMTREEVIEW pnmtv) { CONTEXT("ShellBrowserChild::OnTreeItemExpanding()"); _____
Modified: branches/lean-explorer/reactos/subsys/system/explorer/shell/shellbrowser .h --- branches/lean-explorer/reactos/subsys/system/explorer/shell/shellbrowser .h 2005-12-28 17:10:36 UTC (rev 20398) +++ branches/lean-explorer/reactos/subsys/system/explorer/shell/shellbrowser .h 2005-12-28 17:37:37 UTC (rev 20399) @@ -41,6 +41,10 @@
};
+#ifndef SHGFI_ADDOVERLAYS // missing in MinGW (as of 28.12.2005) +#define SHGFI_ADDOVERLAYS 0x000000020 +#endif + /// Implementation of IShellBrowserImpl interface in explorer child windows struct ShellBrowserChild : public IShellBrowserImpl { @@ -112,11 +116,10 @@ ShellFolder _folder;
IShellView* _pShellView; // current hosted shellview - HIMAGELIST _himlSmall; // list -// HIMAGELIST _himlLarge; // shell image TreeDropTarget* _pDropTarget;
- HTREEITEM _last_sel; + HIMAGELIST _himl; + HTREEITEM _last_sel;
public: LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam); @@ -154,4 +157,11 @@ protected: ShellDirectory* _cur_dir; CtxMenuInterfaces& _cm_ifs; + + typedef map<Entry*, int> ImageMap; + ImageMap _image_map; + ImageMap _image_map_open; + + int get_entry_image(Entry* entry, LPCITEMIDLIST pidl, int shgfi_flags, ImageMap& cache); + void invalidate_cache(); }; _____
Modified: branches/lean-explorer/reactos/subsys/system/explorer/shell/shellfs.cpp --- branches/lean-explorer/reactos/subsys/system/explorer/shell/shellfs.cpp 2005-12-28 17:10:36 UTC (rev 20398) +++ branches/lean-explorer/reactos/subsys/system/explorer/shell/shellfs.cpp 2005-12-28 17:37:37 UTC (rev 20399) @@ -298,11 +298,7 @@
if (w32fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) entry->_icon_id = ICID_FOLDER; else if (scan_flags & SCAN_EXTRACT_ICONS) - try { - entry->extract_icon(); - } catch(COMException&) { - // ignore unexpected exceptions while extracting icons - } + entry->_icon_id = entry->safe_extract_icon();
last = entry; } while(FindNextFile(hFind, &w32fd)); @@ -404,11 +400,7 @@ if (!(entry->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) || !(attribs & SFGAO_FILESYSTEM)) { if (scan_flags & SCAN_EXTRACT_ICONS) - try { - entry->extract_icon(); - } catch(COMException&) { - // ignore unexpected exceptions while extracting icons - } + entry->_icon_id = entry->safe_extract_icon(); } else if (entry->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) entry->_icon_id = ICID_FOLDER; else @@ -463,7 +455,7 @@
for(Entry*entry=_down; entry; entry=entry->_next) if (entry->_icon_id == ICID_UNKNOWN) { - entry->extract_icon(); + entry->_icon_id = entry->extract_icon();
if (entry->_icon_id != ICID_NONE) ++cnt;