mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 20:23:34 +00:00
explorer:
- simplify SCAN flags - extend shell browser to use WINFS - resolve a few FIXMEs - simplify ShellBrowser initialization - handle /root command line option svn path=/trunk/; revision=20515
This commit is contained in:
parent
69288462ca
commit
77932fa09a
18 changed files with 214 additions and 187 deletions
|
@ -59,7 +59,7 @@ void CollectProgramsThread::collect_programs(const ShellPath& path)
|
||||||
ShellDirectory* dir = new ShellDirectory(GetDesktopFolder(), path, 0);
|
ShellDirectory* dir = new ShellDirectory(GetDesktopFolder(), path, 0);
|
||||||
_dirs.push(dir);
|
_dirs.push(dir);
|
||||||
|
|
||||||
dir->smart_scan(SORT_NONE, /*SCAN_EXTRACT_ICONS|*/SCAN_FILESYSTEM);
|
dir->smart_scan(SORT_NONE);
|
||||||
|
|
||||||
for(Entry*entry=dir->_down; _alive && entry; entry=entry->_next) {
|
for(Entry*entry=dir->_down; _alive && entry; entry=entry->_next) {
|
||||||
if (entry->_shell_attribs & SFGAO_HIDDEN)
|
if (entry->_shell_attribs & SFGAO_HIDDEN)
|
||||||
|
|
|
@ -167,3 +167,4 @@ If you search for more information, look into the Subversion repository.
|
||||||
01.11.2005 m. fuchs String::str(), String::toLower() to allow conventient and WINE compatible string conversions
|
01.11.2005 m. fuchs String::str(), String::toLower() to allow conventient and WINE compatible string conversions
|
||||||
29.11.2005 m. fuchs Adjustments for Visual Studio 2005: use new secure CT functions, COUNTOF for buffer sizes
|
29.11.2005 m. fuchs Adjustments for Visual Studio 2005: use new secure CT functions, COUNTOF for buffer sizes
|
||||||
28.12.2005 m. fuchs display icon overlays in Explorer tree view
|
28.12.2005 m. fuchs display icon overlays in Explorer tree view
|
||||||
|
31.12.2005 m. fuchs handle "/root" command line parameter
|
||||||
|
|
|
@ -614,6 +614,7 @@ HRESULT Entry::GetUIObjectOf(HWND hWnd, REFIID riid, LPVOID* ppvOut)
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// get full path of specified directory entry
|
// get full path of specified directory entry
|
||||||
bool Entry::get_path_base ( PTSTR path, size_t path_count, ENTRY_TYPE etype ) const
|
bool Entry::get_path_base ( PTSTR path, size_t path_count, ENTRY_TYPE etype ) const
|
||||||
{
|
{
|
||||||
|
|
|
@ -50,12 +50,9 @@ enum SORT_ORDER {
|
||||||
};
|
};
|
||||||
|
|
||||||
enum SCAN_FLAGS {
|
enum SCAN_FLAGS {
|
||||||
// SCAN_EXTRACT_ICONS = 1,
|
SCAN_DONT_EXTRACT_ICONS = 1,
|
||||||
SCAN_DO_ACCESS = 2,
|
SCAN_DONT_ACCESS = 2,
|
||||||
|
SCAN_NO_FILESYSTEM = 4
|
||||||
SCAN_ALL = 3,
|
|
||||||
|
|
||||||
SCAN_FILESYSTEM = 4
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifndef ATTRIBUTE_SYMBOLIC_LINK
|
#ifndef ATTRIBUTE_SYMBOLIC_LINK
|
||||||
|
@ -114,19 +111,20 @@ public:
|
||||||
|
|
||||||
void free_subentries();
|
void free_subentries();
|
||||||
|
|
||||||
void read_directory_base(SORT_ORDER sortOrder=SORT_NAME, int scan_flags=SCAN_ALL);
|
void read_directory_base(SORT_ORDER sortOrder=SORT_NAME, int scan_flags=0);
|
||||||
Entry* read_tree(const void* path, SORT_ORDER sortOrder=SORT_NAME, int scan_flags=SCAN_ALL);
|
Entry* read_tree(const void* path, SORT_ORDER sortOrder=SORT_NAME, int scan_flags=0);
|
||||||
void sort_directory(SORT_ORDER sortOrder);
|
void sort_directory(SORT_ORDER sortOrder);
|
||||||
void smart_scan(SORT_ORDER sortOrder=SORT_NAME, int scan_flags=SCAN_ALL);
|
void smart_scan(SORT_ORDER sortOrder=SORT_NAME, int scan_flags=0);
|
||||||
int extract_icon(ICONCACHE_FLAGS flags=ICF_NORMAL);
|
int extract_icon(ICONCACHE_FLAGS flags=ICF_NORMAL);
|
||||||
int safe_extract_icon(ICONCACHE_FLAGS flags=ICF_NORMAL);
|
int safe_extract_icon(ICONCACHE_FLAGS flags=ICF_NORMAL);
|
||||||
|
|
||||||
virtual void read_directory(int scan_flags=SCAN_ALL) {}
|
virtual void read_directory(int scan_flags=0) {}
|
||||||
virtual const void* get_next_path_component(const void*) const {return NULL;}
|
virtual const void* get_next_path_component(const void*) const {return NULL;}
|
||||||
virtual Entry* find_entry(const void*) {return NULL;}
|
virtual Entry* find_entry(const void*) {return NULL;}
|
||||||
virtual bool get_path(PTSTR path, size_t path_count) const = 0;
|
virtual bool get_path(PTSTR path, size_t path_count) const = 0;
|
||||||
virtual ShellPath create_absolute_pidl() const {return (LPCITEMIDLIST)NULL;}
|
virtual ShellPath create_absolute_pidl() const {return (LPCITEMIDLIST)NULL;}
|
||||||
virtual HRESULT GetUIObjectOf(HWND hWnd, REFIID riid, LPVOID* ppvOut);
|
virtual HRESULT GetUIObjectOf(HWND hWnd, REFIID riid, LPVOID* ppvOut);
|
||||||
|
virtual ShellFolder get_shell_folder() const;
|
||||||
virtual BOOL launch_entry(HWND hwnd, UINT nCmdShow=SW_SHOWNORMAL);
|
virtual BOOL launch_entry(HWND hwnd, UINT nCmdShow=SW_SHOWNORMAL);
|
||||||
virtual HRESULT do_context_menu(HWND hwnd, const POINT& pos, CtxMenuInterfaces& cm_ifs);
|
virtual HRESULT do_context_menu(HWND hwnd, const POINT& pos, CtxMenuInterfaces& cm_ifs);
|
||||||
|
|
||||||
|
@ -158,6 +156,6 @@ struct Root {
|
||||||
DWORD _fs_flags;
|
DWORD _fs_flags;
|
||||||
SORT_ORDER _sort_order;
|
SORT_ORDER _sort_order;
|
||||||
|
|
||||||
Entry* read_tree(LPCTSTR path, int scan_flags=SCAN_ALL);
|
Entry* read_tree(LPCTSTR path, int scan_flags=0);
|
||||||
Entry* read_tree(LPCITEMIDLIST pidl, int scan_flags=SCAN_ALL);
|
Entry* read_tree(LPCITEMIDLIST pidl, int scan_flags=0);
|
||||||
};
|
};
|
||||||
|
|
|
@ -50,7 +50,7 @@ struct FATDirectory : public FATEntry, public Directory
|
||||||
FATDirectory(FATDrive& drive, Entry* parent, LPCTSTR path, unsigned cluster);
|
FATDirectory(FATDrive& drive, Entry* parent, LPCTSTR path, unsigned cluster);
|
||||||
~FATDirectory();
|
~FATDirectory();
|
||||||
|
|
||||||
virtual void read_directory(int scan_flags=SCAN_ALL);
|
virtual void read_directory(int scan_flags=0);
|
||||||
virtual const void* get_next_path_component(const void*) const;
|
virtual const void* get_next_path_component(const void*) const;
|
||||||
virtual Entry* find_entry(const void*);
|
virtual Entry* find_entry(const void*);
|
||||||
|
|
||||||
|
|
|
@ -980,6 +980,11 @@ LRESULT MDIMainFrame::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
|
||||||
// Shell Namespace as default view
|
// Shell Namespace as default view
|
||||||
ShellChildWndInfo create_info(_hmdiclient, path, shell_path);
|
ShellChildWndInfo create_info(_hmdiclient, path, shell_path);
|
||||||
|
|
||||||
|
if (wparam & OWM_ROOTED)
|
||||||
|
create_info._root_shell_path = shell_path;
|
||||||
|
else
|
||||||
|
create_info._root_shell_path = DesktopFolderPath(); //SpecialFolderPath(CSIDL_DRIVES, _hwnd);
|
||||||
|
|
||||||
create_info._pos.showCmd = wparam&OWM_SEPARATE? SW_SHOWNORMAL: SW_SHOWMAXIMIZED;
|
create_info._pos.showCmd = wparam&OWM_SEPARATE? SW_SHOWNORMAL: SW_SHOWMAXIMIZED;
|
||||||
create_info._pos.rcNormalPosition.left = CW_USEDEFAULT;
|
create_info._pos.rcNormalPosition.left = CW_USEDEFAULT;
|
||||||
create_info._pos.rcNormalPosition.top = CW_USEDEFAULT;
|
create_info._pos.rcNormalPosition.top = CW_USEDEFAULT;
|
||||||
|
@ -1521,7 +1526,7 @@ LRESULT SDIMainFrame::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
|
||||||
if (wparam & OWM_ROOTED)
|
if (wparam & OWM_ROOTED)
|
||||||
_shellpath_info._root_shell_path = shell_path;
|
_shellpath_info._root_shell_path = shell_path;
|
||||||
else
|
else
|
||||||
_shellpath_info._root_shell_path = SpecialFolderPath(CSIDL_DESKTOP, _hwnd); // CSIDL_DRIVES
|
_shellpath_info._root_shell_path = DesktopFolderPath(); //SpecialFolderPath(CSIDL_DRIVES, _hwnd);
|
||||||
|
|
||||||
jump_to(shell_path, wparam); //@todo content of 'path' not used any more
|
jump_to(shell_path, wparam); //@todo content of 'path' not used any more
|
||||||
return TRUE;} // success
|
return TRUE;} // success
|
||||||
|
@ -1660,11 +1665,9 @@ void SDIMainFrame::update_shell_browser()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_shellBrowser = auto_ptr<ShellBrowser>(new ShellBrowser(_hwnd, _left_hwnd, _right_hwnd,
|
_shellBrowser = auto_ptr<ShellBrowser>(new ShellBrowser(_hwnd, _hwnd, _left_hwnd, _right_hwnd,
|
||||||
_shellpath_info, this, _cm_ifs));
|
_shellpath_info, this, _cm_ifs));
|
||||||
|
|
||||||
_shellBrowser->Init(_hwnd);
|
|
||||||
|
|
||||||
if (_left_hwnd)
|
if (_left_hwnd)
|
||||||
_shellBrowser->Init();
|
_shellBrowser->Init();
|
||||||
|
|
||||||
|
@ -1674,23 +1677,17 @@ void SDIMainFrame::update_shell_browser()
|
||||||
|
|
||||||
void SDIMainFrame::entry_selected(Entry* entry)
|
void SDIMainFrame::entry_selected(Entry* entry)
|
||||||
{
|
{
|
||||||
if (entry->_etype == ET_SHELL) {
|
if (_left_hwnd)
|
||||||
ShellEntry* shell_entry = static_cast<ShellEntry*>(entry);
|
_shellBrowser->select_folder(entry, false);
|
||||||
IShellFolder* folder;
|
|
||||||
|
|
||||||
if (shell_entry->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
_shellBrowser->UpdateFolderView(entry->get_shell_folder());
|
||||||
folder = static_cast<ShellDirectory*>(shell_entry)->_folder;
|
|
||||||
else
|
|
||||||
folder = shell_entry->get_parent_folder();
|
|
||||||
|
|
||||||
if (!folder) {
|
// set size of new created shell view windows
|
||||||
assert(folder);
|
resize_children();
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
TCHAR path[MAX_PATH];
|
TCHAR path[MAX_PATH];
|
||||||
|
|
||||||
if (shell_entry->get_path(path, COUNTOF(path))) {
|
if (entry->get_path(path, COUNTOF(path))) {
|
||||||
String url;
|
String url;
|
||||||
|
|
||||||
if (path[0] == ':')
|
if (path[0] == ':')
|
||||||
|
@ -1700,12 +1697,6 @@ void SDIMainFrame::entry_selected(Entry* entry)
|
||||||
|
|
||||||
set_url(url);
|
set_url(url);
|
||||||
}
|
}
|
||||||
|
|
||||||
_shellBrowser->UpdateFolderView(folder);
|
|
||||||
|
|
||||||
// update _clnt_rect and set size of new created shell view windows
|
|
||||||
update_clnt_rect();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SDIMainFrame::set_url(LPCTSTR url)
|
void SDIMainFrame::set_url(LPCTSTR url)
|
||||||
|
|
|
@ -117,6 +117,6 @@ struct NtObjDirectory : public NtObjEntry, public Directory
|
||||||
_path = NULL;
|
_path = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void read_directory(int scan_flags=SCAN_ALL);
|
virtual void read_directory(int scan_flags=0);
|
||||||
virtual Entry* find_entry(const void*);
|
virtual Entry* find_entry(const void*);
|
||||||
};
|
};
|
||||||
|
|
|
@ -648,7 +648,6 @@ void Pane::calc_tabbed_width(LPDRAWITEMSTRUCT dis, int col, LPCTSTR str)
|
||||||
DrawTextEx(dis->hDC, (LPTSTR)str, -1, &rt, DT_CALCRECT|DT_SINGLELINE|DT_NOPREFIX|DT_EXPANDTABS|DT_TABSTOP, &dtp);*/
|
DrawTextEx(dis->hDC, (LPTSTR)str, -1, &rt, DT_CALCRECT|DT_SINGLELINE|DT_NOPREFIX|DT_EXPANDTABS|DT_TABSTOP, &dtp);*/
|
||||||
|
|
||||||
DrawText(dis->hDC, (LPTSTR)str, -1, &rt, DT_CALCRECT|DT_SINGLELINE|DT_EXPANDTABS|DT_TABSTOP|(2<<8));
|
DrawText(dis->hDC, (LPTSTR)str, -1, &rt, DT_CALCRECT|DT_SINGLELINE|DT_EXPANDTABS|DT_TABSTOP|(2<<8));
|
||||||
//FIXME rt (0,0) ???
|
|
||||||
|
|
||||||
if (rt.right > _widths[col])
|
if (rt.right > _widths[col])
|
||||||
_widths[col] = rt.right;
|
_widths[col] = rt.right;
|
||||||
|
|
|
@ -50,7 +50,7 @@ struct RegDirectory : public RegEntry, public Directory
|
||||||
_path = NULL;
|
_path = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void read_directory(int scan_flags=SCAN_ALL);
|
virtual void read_directory(int scan_flags=0);
|
||||||
virtual const void* get_next_path_component(const void*) const;
|
virtual const void* get_next_path_component(const void*) const;
|
||||||
virtual Entry* find_entry(const void*);
|
virtual Entry* find_entry(const void*);
|
||||||
|
|
||||||
|
@ -78,5 +78,5 @@ struct RegistryRoot : public RegEntry, public Directory
|
||||||
_path = NULL;
|
_path = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void read_directory(int scan_flags=SCAN_ALL);
|
virtual void read_directory(int scan_flags=0);
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2003, 2004, 2005 Martin Fuchs
|
* Copyright 2003, 2004, 2005, 2006 Martin Fuchs
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
@ -37,7 +37,7 @@ const LPCTSTR C_DRIVE = C_DRIVE_STR;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
ShellBrowser::ShellBrowser(HWND hwnd, HWND left_hwnd, WindowHandle& right_hwnd, ShellPathInfo& create_info,
|
ShellBrowser::ShellBrowser(HWND hwnd, HWND hwndFrame, HWND left_hwnd, WindowHandle& right_hwnd, ShellPathInfo& create_info,
|
||||||
BrowserCallback* cb, CtxMenuInterfaces& cm_ifs)
|
BrowserCallback* cb, CtxMenuInterfaces& cm_ifs)
|
||||||
#ifndef __MINGW32__ // IShellFolderViewCB missing in MinGW (as of 25.09.2005)
|
#ifndef __MINGW32__ // IShellFolderViewCB missing in MinGW (as of 25.09.2005)
|
||||||
: super(IID_IShellFolderViewCB),
|
: super(IID_IShellFolderViewCB),
|
||||||
|
@ -45,6 +45,7 @@ ShellBrowser::ShellBrowser(HWND hwnd, HWND left_hwnd, WindowHandle& right_hwnd,
|
||||||
:
|
:
|
||||||
#endif
|
#endif
|
||||||
_hwnd(hwnd),
|
_hwnd(hwnd),
|
||||||
|
_hwndFrame(hwndFrame),
|
||||||
_left_hwnd(left_hwnd),
|
_left_hwnd(left_hwnd),
|
||||||
_right_hwnd(right_hwnd),
|
_right_hwnd(right_hwnd),
|
||||||
_create_info(create_info),
|
_create_info(create_info),
|
||||||
|
@ -81,12 +82,10 @@ ShellBrowser::~ShellBrowser()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
LRESULT ShellBrowser::Init(HWND hWndFrame)
|
void ShellBrowser::Init()
|
||||||
{
|
{
|
||||||
CONTEXT("ShellBrowser::Init()");
|
CONTEXT("ShellBrowser::Init()");
|
||||||
|
|
||||||
_hWndFrame = hWndFrame;
|
|
||||||
|
|
||||||
const String& root_name = GetDesktopFolder().get_name(_create_info._root_shell_path, SHGDN_FORADDRESSBAR);
|
const String& root_name = GetDesktopFolder().get_name(_create_info._root_shell_path, SHGDN_FORADDRESSBAR);
|
||||||
|
|
||||||
_root._drive_type = DRIVE_UNKNOWN;
|
_root._drive_type = DRIVE_UNKNOWN;
|
||||||
|
@ -96,22 +95,23 @@ LRESULT ShellBrowser::Init(HWND hWndFrame)
|
||||||
|
|
||||||
_root._entry = new ShellDirectory(GetDesktopFolder(), _create_info._root_shell_path, _hwnd);
|
_root._entry = new ShellDirectory(GetDesktopFolder(), _create_info._root_shell_path, _hwnd);
|
||||||
|
|
||||||
jump_to(_create_info._shell_path);
|
_root._entry->read_directory(SCAN_DONT_ACCESS|SCAN_NO_FILESYSTEM); // avoid to handle desktop root folder as file system directory
|
||||||
|
|
||||||
// -> set_curdir()
|
if (_left_hwnd) {
|
||||||
_root._entry->read_directory();
|
InitializeTree();
|
||||||
|
InitDragDrop();
|
||||||
|
}
|
||||||
|
|
||||||
|
jump_to(_create_info._shell_path);
|
||||||
|
|
||||||
/* already filled by ShellDirectory constructor
|
/* already filled by ShellDirectory constructor
|
||||||
lstrcpy(_root._entry->_data.cFileName, TEXT("Desktop")); */
|
lstrcpy(_root._entry->_data.cFileName, TEXT("Desktop")); */
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShellBrowser::jump_to(LPCITEMIDLIST pidl)
|
void ShellBrowser::jump_to(LPCITEMIDLIST pidl)
|
||||||
{
|
{
|
||||||
Entry* entry = NULL;
|
Entry* entry = NULL;
|
||||||
|
|
||||||
//@@
|
|
||||||
if (!_cur_dir)
|
if (!_cur_dir)
|
||||||
_cur_dir = static_cast<ShellDirectory*>(_root._entry);
|
_cur_dir = static_cast<ShellDirectory*>(_root._entry);
|
||||||
|
|
||||||
|
@ -129,7 +129,7 @@ void ShellBrowser::jump_to(LPCITEMIDLIST pidl)
|
||||||
if (!child_pidl || !child_pidl->mkid.cb)
|
if (!child_pidl || !child_pidl->mkid.cb)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
_cur_dir->smart_scan();
|
_cur_dir->smart_scan(SORT_NAME, SCAN_DONT_ACCESS);
|
||||||
|
|
||||||
entry = _cur_dir->find_entry(child_pidl);
|
entry = _cur_dir->find_entry(child_pidl);
|
||||||
if (!entry)
|
if (!entry)
|
||||||
|
@ -139,7 +139,7 @@ void ShellBrowser::jump_to(LPCITEMIDLIST pidl)
|
||||||
_callback->entry_selected(entry);
|
_callback->entry_selected(entry);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
_cur_dir->smart_scan();
|
_cur_dir->smart_scan(SORT_NAME, SCAN_DONT_ACCESS);
|
||||||
|
|
||||||
entry = _cur_dir->find_entry(pidl); // This is not correct in the common case, but works on the desktop level.
|
entry = _cur_dir->find_entry(pidl); // This is not correct in the common case, but works on the desktop level.
|
||||||
|
|
||||||
|
@ -211,30 +211,6 @@ bool ShellBrowser::InitDragDrop()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void ShellBrowser::OnTreeItemRClick(int idCtrl, LPNMHDR pnmh)
|
|
||||||
{
|
|
||||||
CONTEXT("ShellBrowser::OnTreeItemRClick()");
|
|
||||||
|
|
||||||
TVHITTESTINFO tvhti;
|
|
||||||
|
|
||||||
GetCursorPos(&tvhti.pt);
|
|
||||||
ScreenToClient(_left_hwnd, &tvhti.pt);
|
|
||||||
|
|
||||||
tvhti.flags = LVHT_NOWHERE;
|
|
||||||
(void)TreeView_HitTest(_left_hwnd, &tvhti);
|
|
||||||
|
|
||||||
if (TVHT_ONITEM & tvhti.flags) {
|
|
||||||
LPARAM itemData = TreeView_GetItemData(_left_hwnd, tvhti.hItem);
|
|
||||||
|
|
||||||
if (itemData) {
|
|
||||||
Entry* entry = (Entry*)itemData;
|
|
||||||
ClientToScreen(_left_hwnd, &tvhti.pt);
|
|
||||||
|
|
||||||
CHECKERROR(entry->do_context_menu(_hwnd, tvhti.pt, _cm_ifs));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ShellBrowser::OnTreeGetDispInfo(int idCtrl, LPNMHDR pnmh)
|
void ShellBrowser::OnTreeGetDispInfo(int idCtrl, LPNMHDR pnmh)
|
||||||
{
|
{
|
||||||
CONTEXT("ShellBrowser::OnTreeGetDispInfo()");
|
CONTEXT("ShellBrowser::OnTreeGetDispInfo()");
|
||||||
|
@ -289,6 +265,7 @@ void ShellBrowser::invalidate_cache()
|
||||||
_image_map.clear();
|
_image_map.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void ShellBrowser::OnTreeItemExpanding(int idCtrl, LPNMTREEVIEW pnmtv)
|
void ShellBrowser::OnTreeItemExpanding(int idCtrl, LPNMTREEVIEW pnmtv)
|
||||||
{
|
{
|
||||||
CONTEXT("ShellBrowser::OnTreeItemExpanding()");
|
CONTEXT("ShellBrowser::OnTreeItemExpanding()");
|
||||||
|
@ -325,7 +302,7 @@ int ShellBrowser::InsertSubitems(HTREEITEM hParentItem, Entry* entry, IShellFold
|
||||||
SendMessage(_left_hwnd, WM_SETREDRAW, FALSE, 0);
|
SendMessage(_left_hwnd, WM_SETREDRAW, FALSE, 0);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
entry->smart_scan();
|
entry->smart_scan(SORT_NAME, SCAN_DONT_ACCESS);
|
||||||
} catch(COMException& e) {
|
} catch(COMException& e) {
|
||||||
HandleException(e, g_Globals._hMainWnd);
|
HandleException(e, g_Globals._hMainWnd);
|
||||||
}
|
}
|
||||||
|
@ -344,6 +321,16 @@ int ShellBrowser::InsertSubitems(HTREEITEM hParentItem, Entry* entry, IShellFold
|
||||||
if (entry->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
if (entry->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
|
// ignore hidden directories
|
||||||
|
if (entry->_data.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// ignore directory entries "." and ".."
|
||||||
|
if (entry->_data.cFileName[0]==TEXT('.') &&
|
||||||
|
(entry->_data.cFileName[1]==TEXT('\0') ||
|
||||||
|
(entry->_data.cFileName[1]==TEXT('.') && entry->_data.cFileName[2]==TEXT('\0'))))
|
||||||
|
continue;
|
||||||
|
|
||||||
ZeroMemory(&tvItem, sizeof(tvItem));
|
ZeroMemory(&tvItem, sizeof(tvItem));
|
||||||
|
|
||||||
tvItem.mask = TVIF_PARAM | TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_CHILDREN;
|
tvItem.mask = TVIF_PARAM | TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_CHILDREN;
|
||||||
|
@ -363,21 +350,22 @@ int ShellBrowser::InsertSubitems(HTREEITEM hParentItem, Entry* entry, IShellFold
|
||||||
tvInsert.hParent = hParentItem;
|
tvInsert.hParent = hParentItem;
|
||||||
|
|
||||||
(void)TreeView_InsertItem(_left_hwnd, &tvInsert);
|
(void)TreeView_InsertItem(_left_hwnd, &tvInsert);
|
||||||
}
|
|
||||||
|
|
||||||
++cnt;
|
++cnt;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
SendMessage(_left_hwnd, WM_SETREDRAW, TRUE, 0);
|
SendMessage(_left_hwnd, WM_SETREDRAW, TRUE, 0);
|
||||||
|
|
||||||
return cnt;
|
return cnt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void ShellBrowser::OnTreeItemSelected(int idCtrl, LPNMTREEVIEW pnmtv)
|
void ShellBrowser::OnTreeItemSelected(int idCtrl, LPNMTREEVIEW pnmtv)
|
||||||
{
|
{
|
||||||
CONTEXT("ShellBrowser::OnTreeItemSelected()");
|
CONTEXT("ShellBrowser::OnTreeItemSelected()");
|
||||||
|
|
||||||
ShellEntry* entry = (ShellEntry*)pnmtv->itemNew.lParam;
|
Entry* entry = (Entry*)pnmtv->itemNew.lParam;
|
||||||
|
|
||||||
_last_sel = pnmtv->itemNew.hItem;
|
_last_sel = pnmtv->itemNew.hItem;
|
||||||
|
|
||||||
|
@ -385,6 +373,32 @@ void ShellBrowser::OnTreeItemSelected(int idCtrl, LPNMTREEVIEW pnmtv)
|
||||||
_callback->entry_selected(entry);
|
_callback->entry_selected(entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ShellBrowser::OnTreeItemRClick(int idCtrl, LPNMHDR pnmh)
|
||||||
|
{
|
||||||
|
CONTEXT("ShellBrowser::OnTreeItemRClick()");
|
||||||
|
|
||||||
|
TVHITTESTINFO tvhti;
|
||||||
|
|
||||||
|
GetCursorPos(&tvhti.pt);
|
||||||
|
ScreenToClient(_left_hwnd, &tvhti.pt);
|
||||||
|
|
||||||
|
tvhti.flags = LVHT_NOWHERE;
|
||||||
|
(void)TreeView_HitTest(_left_hwnd, &tvhti);
|
||||||
|
|
||||||
|
if (TVHT_ONITEM & tvhti.flags) {
|
||||||
|
LPARAM itemData = TreeView_GetItemData(_left_hwnd, tvhti.hItem);
|
||||||
|
|
||||||
|
if (itemData) {
|
||||||
|
Entry* entry = (Entry*)itemData;
|
||||||
|
ClientToScreen(_left_hwnd, &tvhti.pt);
|
||||||
|
|
||||||
|
CHECKERROR(entry->do_context_menu(_hwnd, tvhti.pt, _cm_ifs));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void ShellBrowser::UpdateFolderView(IShellFolder* folder)
|
void ShellBrowser::UpdateFolderView(IShellFolder* folder)
|
||||||
{
|
{
|
||||||
CONTEXT("ShellBrowser::UpdateFolderView()");
|
CONTEXT("ShellBrowser::UpdateFolderView()");
|
||||||
|
@ -461,7 +475,7 @@ HRESULT ShellBrowser::OnDefaultCommand(LPIDA pida)
|
||||||
|
|
||||||
if (parent) {
|
if (parent) {
|
||||||
try {
|
try {
|
||||||
parent->smart_scan();
|
parent->smart_scan(SORT_NAME, SCAN_DONT_ACCESS);
|
||||||
} catch(COMException& e) {
|
} catch(COMException& e) {
|
||||||
return e.Error();
|
return e.Error();
|
||||||
}
|
}
|
||||||
|
@ -475,10 +489,13 @@ HRESULT ShellBrowser::OnDefaultCommand(LPIDA pida)
|
||||||
if (entry->_etype == ET_SHELL)
|
if (entry->_etype == ET_SHELL)
|
||||||
if (_last_sel && select_entry(_last_sel, entry))
|
if (_last_sel && select_entry(_last_sel, entry))
|
||||||
return S_OK;
|
return S_OK;
|
||||||
|
|
||||||
|
//@todo look for hidden or new subfolders and refresh/add new entry instead of opening a new window
|
||||||
|
return E_NOTIMPL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else { // no tree control
|
} else { // no tree control
|
||||||
if (MainFrameBase::OpenShellFolders(pida, _hWndFrame))
|
if (MainFrameBase::OpenShellFolders(pida, _hwndFrame))
|
||||||
return S_OK;
|
return S_OK;
|
||||||
|
|
||||||
/* create new Frame Window
|
/* create new Frame Window
|
||||||
|
@ -534,7 +551,7 @@ bool ShellBrowser::jump_to_pidl(LPCITEMIDLIST pidl)
|
||||||
if (!entry || !hitem)
|
if (!entry || !hitem)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
entry->smart_scan(SORT_NAME);
|
entry->smart_scan(SORT_NAME, SCAN_DONT_ACCESS);
|
||||||
|
|
||||||
Entry* found = entry->find_entry(p);
|
Entry* found = entry->find_entry(p);
|
||||||
p = entry->get_next_path_component(p);
|
p = entry->get_next_path_component(p);
|
||||||
|
@ -549,12 +566,40 @@ bool ShellBrowser::jump_to_pidl(LPCITEMIDLIST pidl)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool ShellBrowser::select_folder(Entry* entry, bool expand)
|
||||||
|
{
|
||||||
|
CONTEXT("ShellBrowser::expand_folder()");
|
||||||
|
|
||||||
|
if (!_last_sel)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
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)) {
|
||||||
|
if (expand)
|
||||||
|
if (!TreeView_Expand(_left_hwnd, hitem, TVE_EXPAND))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifndef _NO_MDI
|
#ifndef _NO_MDI
|
||||||
|
|
||||||
MDIShellBrowserChild::MDIShellBrowserChild(HWND hwnd, const ShellChildWndInfo& info)
|
MDIShellBrowserChild::MDIShellBrowserChild(HWND hwnd, const ShellChildWndInfo& info)
|
||||||
: super(hwnd, info),
|
: super(hwnd, info),
|
||||||
_create_info(info),
|
_create_info(info),
|
||||||
_shellpath_info(info) //@@ copies info -> no referenz to _create_info !
|
_shellpath_info(info) //@@ copies info -> no reference to _create_info !
|
||||||
{
|
{
|
||||||
/**todo Conversion of shell path into path string -> store into URL history
|
/**todo Conversion of shell path into path string -> store into URL history
|
||||||
const String& path = GetDesktopFolder().get_name(info._shell_path, SHGDN_FORADDRESSBAR);
|
const String& path = GetDesktopFolder().get_name(info._shell_path, SHGDN_FORADDRESSBAR);
|
||||||
|
@ -585,12 +630,6 @@ LRESULT MDIShellBrowserChild::Init(LPCREATESTRUCT pcs)
|
||||||
|
|
||||||
update_shell_browser();
|
update_shell_browser();
|
||||||
|
|
||||||
if (_shellBrowser.get())
|
|
||||||
if (_left_hwnd)
|
|
||||||
_shellBrowser->Init();
|
|
||||||
else
|
|
||||||
_shellBrowser->UpdateFolderView(_create_info._shell_path.get_folder());
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -651,10 +690,10 @@ void MDIShellBrowserChild::update_shell_browser()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_shellBrowser = auto_ptr<ShellBrowser>(new ShellBrowser(_hwnd, _left_hwnd, _right_hwnd,
|
_shellBrowser = auto_ptr<ShellBrowser>(new ShellBrowser(_hwnd, _hwndFrame, _left_hwnd, _right_hwnd,
|
||||||
_shellpath_info, this, _cm_ifs));
|
_shellpath_info, this, _cm_ifs));
|
||||||
|
|
||||||
_shellBrowser->Init(_hwndFrame);
|
_shellBrowser->Init();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -681,23 +720,19 @@ String MDIShellBrowserChild::jump_to_int(LPCTSTR url)
|
||||||
|
|
||||||
void MDIShellBrowserChild::entry_selected(Entry* entry)
|
void MDIShellBrowserChild::entry_selected(Entry* entry)
|
||||||
{
|
{
|
||||||
if (entry->_etype == ET_SHELL) {
|
if (_left_hwnd)
|
||||||
ShellEntry* shell_entry = static_cast<ShellEntry*>(entry);
|
_shellBrowser->select_folder(entry, false);
|
||||||
IShellFolder* folder;
|
|
||||||
|
|
||||||
if (shell_entry->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
_shellBrowser->UpdateFolderView(entry->get_shell_folder());
|
||||||
folder = static_cast<ShellDirectory*>(shell_entry)->_folder;
|
|
||||||
else
|
|
||||||
folder = shell_entry->get_parent_folder();
|
|
||||||
|
|
||||||
if (!folder) {
|
// set size of new created shell view windows
|
||||||
assert(folder);
|
ClientRect rt(_hwnd);
|
||||||
return;
|
resize_children(rt.right, rt.bottom);
|
||||||
}
|
|
||||||
|
|
||||||
|
// set new URL
|
||||||
TCHAR path[MAX_PATH];
|
TCHAR path[MAX_PATH];
|
||||||
|
|
||||||
if (shell_entry->get_path(path, COUNTOF(path))) {
|
if (entry->get_path(path, COUNTOF(path))) {
|
||||||
String url;
|
String url;
|
||||||
|
|
||||||
if (path[0] == ':')
|
if (path[0] == ':')
|
||||||
|
@ -707,13 +742,6 @@ void MDIShellBrowserChild::entry_selected(Entry* entry)
|
||||||
|
|
||||||
set_url(url);
|
set_url(url);
|
||||||
}
|
}
|
||||||
|
|
||||||
_shellBrowser->UpdateFolderView(folder);
|
|
||||||
|
|
||||||
// set size of new created shell view windows
|
|
||||||
ClientRect rt(_hwnd);
|
|
||||||
resize_children(rt.right, rt.bottom);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -61,7 +61,7 @@ struct ShellBrowser : public IShellBrowserImpl
|
||||||
, public IComSrvBase<IShellFolderViewCB, ShellBrowser>, public SimpleComObject
|
, public IComSrvBase<IShellFolderViewCB, ShellBrowser>, public SimpleComObject
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
ShellBrowser(HWND hwnd, HWND left_hwnd, WindowHandle& right_hwnd, ShellPathInfo& create_info,
|
ShellBrowser(HWND hwnd, HWND hwndFrame, HWND left_hwnd, WindowHandle& right_hwnd, ShellPathInfo& create_info,
|
||||||
BrowserCallback* cb, CtxMenuInterfaces& cm_ifs);
|
BrowserCallback* cb, CtxMenuInterfaces& cm_ifs);
|
||||||
virtual ~ShellBrowser();
|
virtual ~ShellBrowser();
|
||||||
|
|
||||||
|
@ -90,7 +90,7 @@ struct ShellBrowser : public IShellBrowserImpl
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
HWND hwnd = (HWND)SendMessage(_hWndFrame, PM_GET_CONTROLWINDOW, id, 0);
|
HWND hwnd = (HWND)SendMessage(_hwndFrame, PM_GET_CONTROLWINDOW, id, 0);
|
||||||
|
|
||||||
if (hwnd) {
|
if (hwnd) {
|
||||||
*lphwnd = hwnd;
|
*lphwnd = hwnd;
|
||||||
|
@ -105,7 +105,7 @@ struct ShellBrowser : public IShellBrowserImpl
|
||||||
if (!pret)
|
if (!pret)
|
||||||
return E_POINTER;
|
return E_POINTER;
|
||||||
|
|
||||||
HWND hstatusbar = (HWND)SendMessage(_hWndFrame, PM_GET_CONTROLWINDOW, id, 0);
|
HWND hstatusbar = (HWND)SendMessage(_hwndFrame, PM_GET_CONTROLWINDOW, id, 0);
|
||||||
|
|
||||||
if (hstatusbar) {
|
if (hstatusbar) {
|
||||||
*pret = ::SendMessage(hstatusbar, uMsg, wParam, lParam);
|
*pret = ::SendMessage(hstatusbar, uMsg, wParam, lParam);
|
||||||
|
@ -122,13 +122,7 @@ struct ShellBrowser : public IShellBrowserImpl
|
||||||
void OnTreeItemRClick(int idCtrl, LPNMHDR pnmh);
|
void OnTreeItemRClick(int idCtrl, LPNMHDR pnmh);
|
||||||
void OnTreeItemSelected(int idCtrl, LPNMTREEVIEW pnmtv);
|
void OnTreeItemSelected(int idCtrl, LPNMTREEVIEW pnmtv);
|
||||||
|
|
||||||
LRESULT Init(HWND hWndFrame);
|
void Init();
|
||||||
|
|
||||||
void Init()
|
|
||||||
{
|
|
||||||
InitializeTree();
|
|
||||||
InitDragDrop();
|
|
||||||
}
|
|
||||||
|
|
||||||
int InsertSubitems(HTREEITEM hParentItem, Entry* entry, IShellFolder* pParentFolder);
|
int InsertSubitems(HTREEITEM hParentItem, Entry* entry, IShellFolder* pParentFolder);
|
||||||
|
|
||||||
|
@ -139,6 +133,8 @@ struct ShellBrowser : public IShellBrowserImpl
|
||||||
void UpdateFolderView(IShellFolder* folder);
|
void UpdateFolderView(IShellFolder* folder);
|
||||||
HTREEITEM select_entry(HTREEITEM hitem, Entry* entry, bool expand=true);
|
HTREEITEM select_entry(HTREEITEM hitem, Entry* entry, bool expand=true);
|
||||||
|
|
||||||
|
bool select_folder(Entry* entry, bool expand);
|
||||||
|
|
||||||
// for SDIMainFrame
|
// for SDIMainFrame
|
||||||
void jump_to(LPCITEMIDLIST pidl);
|
void jump_to(LPCITEMIDLIST pidl);
|
||||||
|
|
||||||
|
@ -153,7 +149,7 @@ protected:
|
||||||
HIMAGELIST _himl_old;
|
HIMAGELIST _himl_old;
|
||||||
BrowserCallback* _callback;
|
BrowserCallback* _callback;
|
||||||
|
|
||||||
WindowHandle _hWndFrame;
|
HWND _hwndFrame;
|
||||||
ShellFolder _folder;
|
ShellFolder _folder;
|
||||||
|
|
||||||
IShellView* _pShellView; // current hosted shellview
|
IShellView* _pShellView; // current hosted shellview
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2003, 2004, 2005 Martin Fuchs
|
* Copyright 2003, 2004, 2005, 2006 Martin Fuchs
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
@ -228,6 +228,22 @@ HRESULT ShellEntry::GetUIObjectOf(HWND hWnd, REFIID riid, LPVOID* ppvOut)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ShellFolder Entry::get_shell_folder() const
|
||||||
|
{
|
||||||
|
return ShellFolder(create_absolute_pidl());
|
||||||
|
}
|
||||||
|
|
||||||
|
ShellFolder ShellEntry::get_shell_folder() const
|
||||||
|
{
|
||||||
|
return get_parent_folder();
|
||||||
|
}
|
||||||
|
|
||||||
|
ShellFolder ShellDirectory::get_shell_folder() const
|
||||||
|
{
|
||||||
|
return _folder;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void ShellDirectory::read_directory(int scan_flags)
|
void ShellDirectory::read_directory(int scan_flags)
|
||||||
{
|
{
|
||||||
CONTEXT("ShellDirectory::read_directory()");
|
CONTEXT("ShellDirectory::read_directory()");
|
||||||
|
@ -241,14 +257,13 @@ void ShellDirectory::read_directory(int scan_flags)
|
||||||
return;*/
|
return;*/
|
||||||
|
|
||||||
#ifndef _NO_WIN_FS
|
#ifndef _NO_WIN_FS
|
||||||
TCHAR buffer[MAX_PATH];
|
TCHAR buffer[_MAX_PATH+_MAX_FNAME];
|
||||||
|
|
||||||
if ((scan_flags&SCAN_FILESYSTEM) && get_path(buffer, COUNTOF(buffer)) && _tcsncmp(buffer,TEXT("::{"),3)) {
|
if (!(scan_flags&SCAN_NO_FILESYSTEM) && get_path(buffer, COUNTOF(buffer)) && _tcsncmp(buffer,TEXT("::{"),3)) {
|
||||||
Entry* entry = NULL; // eliminate useless GCC warning by initializing entry
|
Entry* entry = NULL; // eliminate useless GCC warning by initializing entry
|
||||||
|
|
||||||
LPTSTR p = buffer + _tcslen(buffer);
|
LPTSTR p = buffer + _tcslen(buffer);
|
||||||
|
|
||||||
// TODO FIXME - this can overflow
|
|
||||||
lstrcpy(p, TEXT("\\*"));
|
lstrcpy(p, TEXT("\\*"));
|
||||||
|
|
||||||
WIN32_FIND_DATA w32fd;
|
WIN32_FIND_DATA w32fd;
|
||||||
|
@ -284,7 +299,7 @@ void ShellDirectory::read_directory(int scan_flags)
|
||||||
|
|
||||||
entry->_level = level;
|
entry->_level = level;
|
||||||
|
|
||||||
if (scan_flags & SCAN_DO_ACCESS) {
|
if (!(scan_flags & SCAN_DONT_ACCESS)) {
|
||||||
HANDLE hFile = CreateFile(buffer, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
|
HANDLE hFile = CreateFile(buffer, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
|
||||||
0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);
|
0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);
|
||||||
|
|
||||||
|
@ -325,19 +340,18 @@ void ShellDirectory::read_directory(int scan_flags)
|
||||||
|
|
||||||
if (w32fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
if (w32fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
||||||
entry->_icon_id = ICID_FOLDER;
|
entry->_icon_id = ICID_FOLDER;
|
||||||
/* else if (scan_flags & SCAN_EXTRACT_ICONS)
|
else if (!(scan_flags & SCAN_DONT_EXTRACT_ICONS))
|
||||||
entry->safe_extract_icon(large_icons);
|
entry->_icon_id = entry->safe_extract_icon(); // Assume small icon, we can extract the large icon later on demand.
|
||||||
*/
|
|
||||||
last = entry;
|
last = entry;
|
||||||
} while(FindNextFile(hFind, &w32fd));
|
} while(FindNextFile(hFind, &w32fd));
|
||||||
|
|
||||||
FindClose(hFind);
|
FindClose(hFind);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else // !SCAN_FILESYSTEM
|
else // SCAN_NO_FILESYSTEM
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
|
|
||||||
ShellItemEnumerator enumerator(_folder, SHCONTF_FOLDERS|SHCONTF_NONFOLDERS|SHCONTF_INCLUDEHIDDEN|SHCONTF_SHAREABLE|SHCONTF_STORAGE);
|
ShellItemEnumerator enumerator(_folder, SHCONTF_FOLDERS|SHCONTF_NONFOLDERS|SHCONTF_INCLUDEHIDDEN|SHCONTF_SHAREABLE|SHCONTF_STORAGE);
|
||||||
|
|
||||||
TCHAR name[MAX_PATH];
|
TCHAR name[MAX_PATH];
|
||||||
|
@ -376,7 +390,7 @@ void ShellDirectory::read_directory(int scan_flags)
|
||||||
if (attribs & SFGAO_REMOVABLE) {
|
if (attribs & SFGAO_REMOVABLE) {
|
||||||
attribs |= SFGAO_HASSUBFOLDER;
|
attribs |= SFGAO_HASSUBFOLDER;
|
||||||
removeable = true;
|
removeable = true;
|
||||||
} else if (scan_flags & SCAN_DO_ACCESS) {
|
} else if (!(scan_flags & SCAN_DONT_ACCESS)) {
|
||||||
DWORD attribs2 = SFGAO_READONLY;
|
DWORD attribs2 = SFGAO_READONLY;
|
||||||
|
|
||||||
HRESULT hr = _folder->GetAttributesOf(1, (LPCITEMIDLIST*)&pidls[n], &attribs2);
|
HRESULT hr = _folder->GetAttributesOf(1, (LPCITEMIDLIST*)&pidls[n], &attribs2);
|
||||||
|
@ -388,7 +402,7 @@ void ShellDirectory::read_directory(int scan_flags)
|
||||||
attribs = 0;
|
attribs = 0;
|
||||||
|
|
||||||
bhfi_valid = fill_w32fdata_shell(pidls[n], attribs, &w32fd, &bhfi,
|
bhfi_valid = fill_w32fdata_shell(pidls[n], attribs, &w32fd, &bhfi,
|
||||||
(scan_flags&SCAN_DO_ACCESS) && !removeable);
|
!(scan_flags&SCAN_DONT_ACCESS) && !removeable);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
Entry* entry = NULL; // eliminate useless GCC warning by initializing entry
|
Entry* entry = NULL; // eliminate useless GCC warning by initializing entry
|
||||||
|
@ -429,9 +443,9 @@ void ShellDirectory::read_directory(int scan_flags)
|
||||||
// get icons for files and virtual objects
|
// get icons for files and virtual objects
|
||||||
if (!(entry->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ||
|
if (!(entry->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ||
|
||||||
!(attribs & SFGAO_FILESYSTEM)) {
|
!(attribs & SFGAO_FILESYSTEM)) {
|
||||||
/* if (scan_flags & SCAN_EXTRACT_ICONS)
|
if (!(scan_flags & SCAN_DONT_EXTRACT_ICONS))
|
||||||
entry->extract_icon(large_icons);
|
entry->_icon_id = entry->safe_extract_icon(); // Assume small icon, we can extract the large icon later on demand.
|
||||||
*/ } else if (entry->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
} else if (entry->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
||||||
entry->_icon_id = ICID_FOLDER;
|
entry->_icon_id = ICID_FOLDER;
|
||||||
else
|
else
|
||||||
entry->_icon_id = ICID_NONE; // don't try again later
|
entry->_icon_id = ICID_NONE; // don't try again later
|
||||||
|
@ -478,6 +492,16 @@ Entry* ShellDirectory::find_entry(const void* p)
|
||||||
|
|
||||||
if (se->_pidl && se->_pidl->mkid.cb==pidl->mkid.cb && !memcmp(se->_pidl, pidl, se->_pidl->mkid.cb))
|
if (se->_pidl && se->_pidl->mkid.cb==pidl->mkid.cb && !memcmp(se->_pidl, pidl, se->_pidl->mkid.cb))
|
||||||
return entry;
|
return entry;
|
||||||
|
} else {
|
||||||
|
const ShellPath& sp = entry->create_absolute_pidl();
|
||||||
|
static DynamicFct<LPITEMIDLIST(WINAPI*)(LPCITEMIDLIST)> ILFindLastID(TEXT("SHELL32"), "ILFindLastID");
|
||||||
|
|
||||||
|
if (ILFindLastID) {
|
||||||
|
LPCITEMIDLIST entry_pidl = (*ILFindLastID)(sp);
|
||||||
|
|
||||||
|
if (entry_pidl && entry_pidl->mkid.cb==pidl->mkid.cb && !memcmp(entry_pidl, pidl, entry_pidl->mkid.cb))
|
||||||
|
return entry;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
|
@ -37,6 +37,7 @@ struct ShellEntry : public Entry
|
||||||
virtual HRESULT GetUIObjectOf(HWND hWnd, REFIID riid, LPVOID* ppvOut);
|
virtual HRESULT GetUIObjectOf(HWND hWnd, REFIID riid, LPVOID* ppvOut);
|
||||||
virtual BOOL launch_entry(HWND hwnd, UINT nCmdShow=SW_SHOWNORMAL);
|
virtual BOOL launch_entry(HWND hwnd, UINT nCmdShow=SW_SHOWNORMAL);
|
||||||
virtual HRESULT do_context_menu(HWND hwnd, LPPOINT pptScreen, CtxMenuInterfaces& cm_ifs);
|
virtual HRESULT do_context_menu(HWND hwnd, LPPOINT pptScreen, CtxMenuInterfaces& cm_ifs);
|
||||||
|
virtual ShellFolder get_shell_folder() const;
|
||||||
|
|
||||||
IShellFolder* get_parent_folder() const;
|
IShellFolder* get_parent_folder() const;
|
||||||
|
|
||||||
|
@ -99,11 +100,12 @@ struct ShellDirectory : public ShellEntry, public Directory
|
||||||
pFolder->Release();
|
pFolder->Release();
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void read_directory(int scan_flags=SCAN_ALL);
|
virtual void read_directory(int scan_flags=0);
|
||||||
virtual const void* get_next_path_component(const void*) const;
|
virtual const void* get_next_path_component(const void*) const;
|
||||||
virtual Entry* find_entry(const void*);
|
virtual Entry* find_entry(const void*);
|
||||||
|
|
||||||
virtual bool get_path(PTSTR path, size_t path_count) const;
|
virtual bool get_path(PTSTR path, size_t path_count) const;
|
||||||
|
virtual ShellFolder get_shell_folder() const;
|
||||||
|
|
||||||
int extract_icons(ICONCACHE_FLAGS flags);
|
int extract_icons(ICONCACHE_FLAGS flags);
|
||||||
|
|
||||||
|
|
|
@ -140,19 +140,6 @@ void WinDirectory::read_directory(int scan_flags)
|
||||||
|
|
||||||
if (hFind != INVALID_HANDLE_VALUE) {
|
if (hFind != INVALID_HANDLE_VALUE) {
|
||||||
do {
|
do {
|
||||||
#ifdef _NO_WIN_FS //@todo not really correct: We shouldn't hide . and ..
|
|
||||||
// ignore hidden files (usefull in the start menu)
|
|
||||||
if (w32fd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// ignore directory entries "." and ".."
|
|
||||||
if ((w32fd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) &&
|
|
||||||
w32fd.cFileName[0]==TEXT('.') &&
|
|
||||||
(w32fd.cFileName[1]==TEXT('\0') ||
|
|
||||||
(w32fd.cFileName[1]==TEXT('.') && w32fd.cFileName[2]==TEXT('\0'))))
|
|
||||||
continue;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
lstrcpy(pname+1, w32fd.cFileName);
|
lstrcpy(pname+1, w32fd.cFileName);
|
||||||
|
|
||||||
if (w32fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
if (w32fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
||||||
|
@ -172,7 +159,7 @@ void WinDirectory::read_directory(int scan_flags)
|
||||||
// display file type names, but don't hide file extensions
|
// display file type names, but don't hide file extensions
|
||||||
g_Globals._ftype_mgr.set_type(entry, true);
|
g_Globals._ftype_mgr.set_type(entry, true);
|
||||||
|
|
||||||
if (scan_flags & SCAN_DO_ACCESS) {
|
if (!(scan_flags & SCAN_DONT_ACCESS)) {
|
||||||
HANDLE hFile = CreateFile(buffer, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
|
HANDLE hFile = CreateFile(buffer, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
|
||||||
0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);
|
0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);
|
||||||
|
|
||||||
|
|
|
@ -60,7 +60,7 @@ struct WinDirectory : public WinEntry, public Directory
|
||||||
_path = NULL;
|
_path = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void read_directory(int scan_flags=SCAN_ALL);
|
virtual void read_directory(int scan_flags=0);
|
||||||
virtual const void* get_next_path_component(const void*) const;
|
virtual const void* get_next_path_component(const void*) const;
|
||||||
virtual Entry* find_entry(const void*);
|
virtual Entry* find_entry(const void*);
|
||||||
};
|
};
|
||||||
|
|
|
@ -373,7 +373,7 @@ void BookmarkList::import_IE_favorites(ShellDirectory& dir, HWND hwnd)
|
||||||
{
|
{
|
||||||
TCHAR path[MAX_PATH], ext[_MAX_EXT];
|
TCHAR path[MAX_PATH], ext[_MAX_EXT];
|
||||||
|
|
||||||
dir.smart_scan(SORT_NAME, SCAN_FILESYSTEM);
|
dir.smart_scan(SORT_NAME, SCAN_DONT_EXTRACT_ICONS);
|
||||||
|
|
||||||
for(Entry*entry=dir._down; entry; entry=entry->_next) {
|
for(Entry*entry=dir._down; entry; entry=entry->_next) {
|
||||||
if (entry->_shell_attribs & SFGAO_HIDDEN) // ignore files like "desktop.ini"
|
if (entry->_shell_attribs & SFGAO_HIDDEN) // ignore files like "desktop.ini"
|
||||||
|
|
|
@ -105,7 +105,7 @@ void QuickLaunchBar::AddShortcuts()
|
||||||
RecursiveCreateDirectory(path);
|
RecursiveCreateDirectory(path);
|
||||||
_dir = new ShellDirectory(GetDesktopFolder(), path, _hwnd);
|
_dir = new ShellDirectory(GetDesktopFolder(), path, _hwnd);
|
||||||
|
|
||||||
_dir->smart_scan(SORT_NAME, /*SCAN_EXTRACT_ICONS|*/SCAN_FILESYSTEM);
|
_dir->smart_scan(SORT_NAME);
|
||||||
|
|
||||||
// immediatelly extract the shortcut icons
|
// immediatelly extract the shortcut icons
|
||||||
for(Entry*entry=_dir->_down; entry; entry=entry->_next)
|
for(Entry*entry=_dir->_down; entry; entry=entry->_next)
|
||||||
|
|
|
@ -218,9 +218,9 @@ void StartMenu::AddEntries()
|
||||||
WaitCursor wait;
|
WaitCursor wait;
|
||||||
|
|
||||||
#ifdef _LAZY_ICONEXTRACT
|
#ifdef _LAZY_ICONEXTRACT
|
||||||
dir.smart_scan(SORT_NAME, SCAN_FILESYSTEM); // lazy icon extraction, try to read directly from filesystem
|
dir.smart_scan(SORT_NAME, SCAN_DONT_EXTRACT_ICONS); // lazy icon extraction, try to read directly from filesystem
|
||||||
#else
|
#else
|
||||||
dir.smart_scan(SORT_NAME, SCAN_EXTRACT_ICONS|SCAN_FILESYSTEM);
|
dir.smart_scan(SORT_NAME);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2208,9 +2208,9 @@ void RecentStartMenu::AddEntries()
|
||||||
WaitCursor wait;
|
WaitCursor wait;
|
||||||
|
|
||||||
#ifdef _LAZY_ICONEXTRACT
|
#ifdef _LAZY_ICONEXTRACT
|
||||||
dir.smart_scan(SORT_NAME, SCAN_FILESYSTEM);
|
dir.smart_scan(SORT_NAME, SCAN_DONT_EXTRACT_ICONS);
|
||||||
#else
|
#else
|
||||||
dir.smart_scan(SORT_NAME, SCAN_EXTRACT_ICONS|SCAN_FILESYSTEM);
|
dir.smart_scan(SORT_NAME);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue