lean explorer: correctly handle path of command line argument in explore mode 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/mainframe.cp p 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/shell/entries.cpp --- branches/lean-explorer/reactos/subsys/system/explorer/shell/entries.cpp 2005-12-31 17:27:25 UTC (rev 20489) +++ branches/lean-explorer/reactos/subsys/system/explorer/shell/entries.cpp 2005-12-31 18:36:39 UTC (rev 20490) @@ -129,36 +129,6 @@
}
- // read directory tree and expand to the given location -ShellEntry* ShellDirectory::read_tree(const void* path, SORT_ORDER sortOrder) -{ - CONTEXT("ShellEntry::read_tree()"); - - HCURSOR old_cursor = SetCursor(LoadCursor(0, IDC_WAIT)); - - ShellDirectory* entry = this; - - for(const void*p=path; p && entry; ) { - if (!(entry->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) - break; - - entry->read_directory(sortOrder); - - if (entry->_down) - entry->_expanded = true; - - ShellEntry* next_entry = entry->find_entry(p); - p = entry->get_next_path_component(p); - - entry = static_cast<ShellDirectory*>(next_entry); - } - - SetCursor(old_cursor); - - return entry; -} - - void ShellDirectory::read_directory(SORT_ORDER sortOrder, int scan_flags) { CONTEXT("ShellEntry::read_directory(SORT_ORDER)"); _____
Modified: branches/lean-explorer/reactos/subsys/system/explorer/shell/entries.h --- branches/lean-explorer/reactos/subsys/system/explorer/shell/entries.h 2005-12-31 17:27:25 UTC (rev 20489) +++ branches/lean-explorer/reactos/subsys/system/explorer/shell/entries.h 2005-12-31 18:36:39 UTC (rev 20490) @@ -155,17 +155,15 @@
pFolder->Release(); }
- ShellEntry* read_tree(const void* path, SORT_ORDER sortOrder); void read_directory(SORT_ORDER sortOrder, int scan_flags=0); void read_directory(int scan_flags=0); void sort_directory(SORT_ORDER sortOrder); void smart_scan(int scan_flags=0); - virtual const void* get_next_path_component(const void*) const; - virtual ShellEntry* find_entry(const void* p);
+ virtual ShellEntry* find_entry(const void* p); virtual bool get_path(PTSTR path) const;
- int extract_icons(); + int extract_icons();
ShellFolder _folder; HWND _hwnd; @@ -178,7 +176,7 @@ inline IShellFolder* ShellEntry::get_parent_folder() const { if (_up) - return static_cast<ShellDirectory*>(_up)->_folder; + return _up->_folder; else return GetDesktopFolder(); } _____
Modified: branches/lean-explorer/reactos/subsys/system/explorer/shell/mainframe.cp p --- branches/lean-explorer/reactos/subsys/system/explorer/shell/mainframe.cp p 2005-12-31 17:27:25 UTC (rev 20489) +++ branches/lean-explorer/reactos/subsys/system/explorer/shell/mainframe.cp p 2005-12-31 18:36:39 UTC (rev 20490) @@ -82,8 +82,6 @@
delete _shellBrowser.release(); }
- ///@todo use OWM_ROOTED flag - // create explorer treeview if (_create_info._open_mode & OWM_EXPLORE) { if (!_left_hwnd) { _____
Modified: branches/lean-explorer/reactos/subsys/system/explorer/shell/shellbrowser .cpp --- branches/lean-explorer/reactos/subsys/system/explorer/shell/shellbrowser .cpp 2005-12-31 17:27:25 UTC (rev 20489) +++ branches/lean-explorer/reactos/subsys/system/explorer/shell/shellbrowser .cpp 2005-12-31 18:36:39 UTC (rev 20490) @@ -103,8 +103,6 @@
_root._entry = new ShellDirectory(GetDesktopFolder(), _create_info._root_shell_path, _hwnd);
- jump_to(_create_info._shell_path); - // -> set_curdir() _root._entry->read_directory();
@@ -113,8 +111,7 @@ InitDragDrop(); }
- /* already filled by ShellDirectory constructor - lstrcpy(_root._entry->_data.cFileName, TEXT("Desktop")); */ + jump_to(_create_info._shell_path);
return 0; } @@ -278,11 +275,11 @@ if (pnmtv->action == TVE_COLLAPSE) TreeView_Expand(_left_hwnd, pnmtv->itemNew.hItem, TVE_COLLAPSE|TVE_COLLAPSERESET); else if (pnmtv->action == TVE_EXPAND) { - ShellDirectory* entry = (ShellDirectory*)TreeView_GetItemData(_left_hwnd, pnmtv->itemNew.hItem); + ShellDirectory* dir = (ShellDirectory*)TreeView_GetItemData(_left_hwnd, pnmtv->itemNew.hItem);
- if (entry) - if (!InsertSubitems(pnmtv->itemNew.hItem, entry)) { - entry->_shell_attribs &= ~SFGAO_HASSUBFOLDER; + if (dir) + if (!InsertSubitems(pnmtv->itemNew.hItem, dir)) { + dir->_shell_attribs &= ~SFGAO_HASSUBFOLDER;
// remove subitem "+" TV_ITEM tvItem; @@ -359,10 +356,11 @@ { CONTEXT("ShellBrowserChild::OnTreeItemSelected()");
- _last_sel = pnmtv->itemNew.hItem; - ShellDirectory* entry = (ShellDirectory*)pnmtv->itemNew.lParam; + ShellDirectory* dir = (ShellDirectory*)pnmtv->itemNew.lParam;
- jump_to(entry); + jump_to(dir); + + _last_sel = pnmtv->itemNew.hItem; }
void ShellBrowserChild::UpdateFolderView(IShellFolder* folder) @@ -576,26 +574,24 @@
if (pida->cidl >= 1) { if (_left_hwnd) { // explorer mode - //@@if (_last_sel) { - ShellDirectory* parent = _cur_dir;//@@(ShellDirectory*)TreeView_GetItemData(_left_hwnd, _last_sel); + ShellDirectory* parent = _cur_dir;
- if (parent) { - try { - parent->smart_scan(); - } catch(COMException& e) { - return e.Error(); - } + if (parent) { + try { + parent->smart_scan(); + } catch(COMException& e) { + return e.Error(); + }
- UINT firstOffset = pida->aoffset[1]; - LPITEMIDLIST pidl = (LPITEMIDLIST)((LPBYTE)pida+firstOffset); + UINT firstOffset = pida->aoffset[1]; + LPITEMIDLIST pidl = (LPITEMIDLIST)((LPBYTE)pida+firstOffset);
- ShellEntry* entry = parent->find_entry(pidl); + ShellEntry* entry = parent->find_entry(pidl);
- if (entry && (entry->_data.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)) - if (expand_folder(static_cast<ShellDirectory*>(entry))) - return S_OK; - } - //@@} + if (entry && (entry->_data.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)) + if (select_folder(static_cast<ShellDirectory*>(entry), true)) + return S_OK; + } } else { // no tree control if (MainFrame::OpenShellFolders(pida, _hWndFrame)) return S_OK; @@ -611,7 +607,7 @@ }
-bool ShellBrowserChild::expand_folder(ShellDirectory* entry) +bool ShellBrowserChild::select_folder(ShellDirectory* dir, bool expand) { CONTEXT("ShellBrowserChild::expand_folder()");
@@ -619,14 +615,19 @@ if (!_last_sel) return false;
- if (!TreeView_Expand(_left_hwnd, _last_sel, TVE_EXPAND)) - return false; + if (expand) + if (!TreeView_Expand(_left_hwnd, _last_sel, TVE_EXPAND)) + return false;
for(HTREEITEM hitem=TreeView_GetChild(_left_hwnd,_last_sel); hitem; hitem=TreeView_GetNextSibling(_left_hwnd,hitem)) { - if ((ShellDirectory*)TreeView_GetItemData(_left_hwnd,hitem) == entry) { - if (TreeView_SelectItem(_left_hwnd, hitem) && - TreeView_Expand(_left_hwnd, hitem, TVE_EXPAND)) + if ((ShellDirectory*)TreeView_GetItemData(_left_hwnd,hitem) == dir) { + if (TreeView_SelectItem(_left_hwnd, hitem)) { + if (expand) + if (!TreeView_Expand(_left_hwnd, hitem, TVE_EXPAND)) + return false; + return true; + }
break; } @@ -645,7 +646,7 @@
void ShellBrowserChild::jump_to(LPCITEMIDLIST pidl) { - ShellDirectory* entry = NULL; + ShellDirectory* dir = NULL;
if (!_cur_dir) _cur_dir = _root._entry; @@ -661,48 +662,36 @@
_cur_dir->smart_scan();
- entry = static_cast<ShellDirectory*>(_cur_dir->find_entry(child_pidl)); - if (!entry) + dir = static_cast<ShellDirectory*>(_cur_dir->find_entry(child_pidl)); + if (!dir) break;
- jump_to(entry); + jump_to(dir); } } else { _cur_dir->smart_scan();
- entry = static_cast<ShellDirectory*>(_cur_dir->find_entry(pidl)); // This is not correct in the common case, but works on the desktop level. + dir = static_cast<ShellDirectory*>(_cur_dir->find_entry(pidl)); // This is not correct in the common case, but works on the desktop level.
- if (entry) - jump_to(entry); + if (dir) + jump_to(dir); } }
// If not already called, now directly call UpdateFolderView() using pidl. - if (!entry) + if (!dir) UpdateFolderView(ShellFolder(pidl)); }
-void ShellBrowserChild::jump_to(ShellDirectory* entry) +void ShellBrowserChild::jump_to(ShellDirectory* dir) { - IShellFolder* folder; - ShellDirectory* se = entry; - - if (se->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) - folder = static_cast<ShellDirectory*>(se)->_folder; - else - folder = se->get_parent_folder(); - - if (!folder) { - assert(folder); + if (dir == _cur_dir) return; - }
- if (_create_info._open_mode & OWM_EXPLORE) { + if (_left_hwnd) + select_folder(dir, false);
- //@@ todo + UpdateFolderView(dir->_folder);
- } else; - UpdateFolderView(folder); - - _cur_dir = se; + _cur_dir = dir; } _____
Modified: branches/lean-explorer/reactos/subsys/system/explorer/shell/shellbrowser .h --- branches/lean-explorer/reactos/subsys/system/explorer/shell/shellbrowser .h 2005-12-31 17:27:25 UTC (rev 20489) +++ branches/lean-explorer/reactos/subsys/system/explorer/shell/shellbrowser .h 2005-12-31 18:36:39 UTC (rev 20490) @@ -138,7 +138,7 @@
void UpdateFolderView(IShellFolder* folder); void Tree_DoItemMenu(HWND hwndTreeView, HTREEITEM hItem, LPPOINT pptScreen); - bool expand_folder(ShellDirectory* entry); + bool select_folder(ShellDirectory* dir, bool expand);
// SDI integration public: @@ -150,7 +150,7 @@ void jump_to(LPCTSTR path); void jump_to(LPCITEMIDLIST pidl);
- void jump_to(ShellDirectory* entry); + void jump_to(ShellDirectory* dir);
protected: ShellDirectory* _cur_dir; _____
Modified: branches/lean-explorer/reactos/subsys/system/explorer/shell/shellfs.cpp --- branches/lean-explorer/reactos/subsys/system/explorer/shell/shellfs.cpp 2005-12-31 17:27:25 UTC (rev 20489) +++ branches/lean-explorer/reactos/subsys/system/explorer/shell/shellfs.cpp 2005-12-31 18:36:39 UTC (rev 20490) @@ -96,7 +96,7 @@
CONTEXT("ShellEntry::create_absolute_pidl()");
if (_up) { - ShellDirectory* dir = static_cast<ShellDirectory*>(_up); + ShellDirectory* dir = _up;
if (dir->_pidl->mkid.cb) // Caching of absolute PIDLs could enhance performance. return _pidl.create_absolute_pidl(dir->create_absolute_pidl()); @@ -306,19 +306,6 @@ _scanned = true; }
-const void* ShellDirectory::get_next_path_component(const void* p) const -{ - LPITEMIDLIST pidl = (LPITEMIDLIST)p; - - if (!pidl || !pidl->mkid.cb) - return NULL; - - // go to next element - pidl = (LPITEMIDLIST)((LPBYTE)pidl+pidl->mkid.cb); - - return pidl; -} - ShellEntry* ShellDirectory::find_entry(const void* p) { LPITEMIDLIST pidl = (LPITEMIDLIST) p;