📄 shellbrowser.cpp
字号:
{
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);
HRESULT hr = entry->do_context_menu(_hwnd, tvhti.pt, _cm_ifs);
if (SUCCEEDED(hr))
refresh();
else
CHECKERROR(hr);
}
}
}
void ShellBrowser::UpdateFolderView(IShellFolder* folder)
{
CONTEXT("ShellBrowser::UpdateFolderView()");
FOLDERSETTINGS fs;
IShellView* pLastShellView = _pShellView;
_folder = folder;
if (pLastShellView)
pLastShellView->GetCurrentInfo(&fs);
else {
fs.ViewMode = _create_info._open_mode&OWM_DETAILS? FVM_DETAILS: FVM_ICON;
fs.fFlags = FWF_NOCLIENTEDGE|FWF_BESTFITWINDOW;
}
#ifndef __MINGW32__ // IShellFolderViewCB missing in MinGW (as of 25.09.2005)
SFV_CREATE sfv_create;
sfv_create.cbSize = sizeof(SFV_CREATE);
sfv_create.pshf = folder;
sfv_create.psvOuter = NULL;
sfv_create.psfvcb = this;
HRESULT hr = SHCreateShellFolderView(&sfv_create, &_pShellView);
#else
HRESULT hr = folder->CreateViewObject(_hwnd, IID_IShellView, (void**)&_pShellView);
#endif
if (FAILED(hr)) {
_pShellView = NULL;
return;
}
RECT rect = {CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT};
hr = _pShellView->CreateViewWindow(pLastShellView, &fs, static_cast<IShellBrowser*>(this), &rect, &_right_hwnd/*&m_hWndListView*/);
if (pLastShellView) {
pLastShellView->GetCurrentInfo(&fs);
pLastShellView->UIActivate(SVUIA_DEACTIVATE);
pLastShellView->DestroyViewWindow();
pLastShellView->Release();
}
_pShellView->UIActivate(SVUIA_ACTIVATE_NOFOCUS);
}
#ifndef __MINGW32__ // IShellFolderViewCB missing in MinGW (as of 25.09.2005)
/// shell view callback
HRESULT STDMETHODCALLTYPE ShellBrowser::MessageSFVCB(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if (uMsg == SFVM_INITMENUPOPUP) {
///@todo never reached
InsertMenu((HMENU)lParam, 0, MF_BYPOSITION, 12345, TEXT("TEST ENTRY"));
return S_OK;
}
return E_NOTIMPL;
}
#endif
HRESULT ShellBrowser::OnDefaultCommand(LPIDA pida)
{
CONTEXT("ShellBrowser::OnDefaultCommand()");
if (pida->cidl >= 1) {
if (_left_hwnd) { // explorer mode
if (_last_sel) {
ShellDirectory* parent = (ShellDirectory*)TreeView_GetItemData(_left_hwnd, _last_sel);
if (parent) {
try {
parent->smart_scan(SORT_NAME, SCAN_DONT_ACCESS);
} catch(COMException& e) {
return e.Error();
}
UINT firstOffset = pida->aoffset[1];
LPITEMIDLIST pidl = (LPITEMIDLIST)((LPBYTE)pida+firstOffset);
Entry* entry = parent->find_entry(pidl);
if (entry && (entry->_data.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY))
if (entry->_etype == ET_SHELL)
if (_last_sel && select_entry(_last_sel, entry))
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
if (MainFrameBase::OpenShellFolders(pida, _hwndFrame))
return S_OK;
/* create new Frame Window
if (MainFrame::OpenShellFolders(pida, 0))
return S_OK;
*/
}
}
return E_NOTIMPL;
}
HTREEITEM ShellBrowser::select_entry(HTREEITEM hitem, Entry* entry, bool expand)
{
CONTEXT("ShellBrowser::select_entry()");
if (expand && !TreeView_Expand(_left_hwnd, hitem, TVE_EXPAND))
return 0;
for(hitem=TreeView_GetChild(_left_hwnd,hitem); hitem; hitem=TreeView_GetNextSibling(_left_hwnd,hitem)) {
if ((Entry*)TreeView_GetItemData(_left_hwnd,hitem) == entry) {
if (TreeView_SelectItem(_left_hwnd, hitem)) {
if (expand)
TreeView_Expand(_left_hwnd, hitem, TVE_EXPAND);
return hitem;
}
break;
}
}
return 0;
}
bool ShellBrowser::jump_to_pidl(LPCITEMIDLIST pidl)
{
if (!_root._entry)
return false;
// iterate through the hierarchy and open all folders to reach pidl
WaitCursor wait;
HTREEITEM hitem = TreeView_GetRoot(_left_hwnd);
Entry* entry = _root._entry;
for(const void*p=pidl;;) {
if (!p)
return true;
if (!entry || !hitem)
break;
entry->smart_scan(SORT_NAME, SCAN_DONT_ACCESS);
Entry* found = entry->find_entry(p);
p = entry->get_next_path_component(p);
if (found)
hitem = select_entry(hitem, found);
entry = found;
}
return false;
}
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;
}
void ShellBrowser::refresh()
{
///@todo
}
#ifndef _NO_MDI
MDIShellBrowserChild::MDIShellBrowserChild(HWND hwnd, const ShellChildWndInfo& info)
: super(hwnd, info),
_create_info(info),
_shellpath_info(info) //@@ copies info -> no reference to _create_info !
{
/**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& parsingpath = GetDesktopFolder().get_name(info._shell_path, SHGDN_FORPARSING);
// store path into history
if (info._path && *info._path)
_url_history.push(info._path);
*/
}
MDIShellBrowserChild* MDIShellBrowserChild::create(const ShellChildWndInfo& info)
{
ChildWindow* child = ChildWindow::create(info, info._pos.rcNormalPosition,
WINDOW_CREATOR_INFO(MDIShellBrowserChild,ShellChildWndInfo), CLASSNAME_CHILDWND, NULL, info._pos.showCmd==SW_SHOWMAXIMIZED? WS_MAXIMIZE: 0);
return static_cast<MDIShellBrowserChild*>(child);
}
LRESULT MDIShellBrowserChild::Init(LPCREATESTRUCT pcs)
{
CONTEXT("MDIShellBrowserChild::Init()");
if (super::Init(pcs))
return 1;
update_shell_browser();
return 0;
}
LRESULT MDIShellBrowserChild::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
{
switch(nmsg) {
case PM_DISPATCH_COMMAND: {
switch(LOWORD(wparam)) {
case ID_WINDOW_NEW: {CONTEXT("MDIShellBrowserChild PM_DISPATCH_COMMAND ID_WINDOW_NEW");
MDIShellBrowserChild::create(_create_info);
break;}
case ID_REFRESH:
///@todo refresh shell child
_shellBrowser->invalidate_cache();
break;
case ID_VIEW_SDI:
MainFrameBase::Create(ExplorerCmd(_url, false));
break;
default:
return super::WndProc(nmsg, wparam, lparam);
}
return TRUE;}
default:
return super::WndProc(nmsg, wparam, lparam);
}
return 0;
}
void MDIShellBrowserChild::update_shell_browser()
{
int split_pos = DEFAULT_SPLIT_POS;
if (_shellBrowser.get()) {
split_pos = _split_pos;
delete _shellBrowser.release();
}
// create explorer treeview
if (_create_info._open_mode & OWM_EXPLORE) {
if (!_left_hwnd) {
ClientRect rect(_hwnd);
_left_hwnd = CreateWindowEx(0, WC_TREEVIEW, NULL,
WS_CHILD|WS_TABSTOP|WS_VISIBLE|TVS_HASLINES|TVS_LINESATROOT|TVS_HASBUTTONS|TVS_SHOWSELALWAYS,//|TVS_NOTOOLTIPS
0, rect.top, split_pos-SPLIT_WIDTH/2, rect.bottom-rect.top,
_hwnd, (HMENU)IDC_FILETREE, g_Globals._hInstance, 0);
}
} else {
if (_left_hwnd) {
DestroyWindow(_left_hwnd);
_left_hwnd = 0;
}
}
_shellBrowser = auto_ptr<ShellBrowser>(new ShellBrowser(_hwnd, _hwndFrame, _left_hwnd, _right_hwnd,
_shellpath_info, this, _cm_ifs));
_shellBrowser->Init();
}
String MDIShellBrowserChild::jump_to_int(LPCTSTR url)
{
String dir, fname;
if (!_tcsnicmp(url, TEXT("shell://"), 8)) {
if (_shellBrowser->jump_to_pidl(ShellPath(url+8)))
return url;
}
if (SplitFileSysURL(url, dir, fname)) {
///@todo use fname
if (_shellBrowser->jump_to_pidl(ShellPath(dir)))
return FmtString(TEXT("file://%s"), (LPCTSTR)dir);
}
return String();
}
void MDIShellBrowserChild::entry_selected(Entry* entry)
{
if (_left_hwnd)
_shellBrowser->select_folder(entry, false);
_shellBrowser->UpdateFolderView(entry->get_shell_folder());
// set size of new created shell view windows
ClientRect rt(_hwnd);
resize_children(rt.right, rt.bottom);
// set new URL
TCHAR path[MAX_PATH];
if (entry->get_path(path, COUNTOF(path))) {
String url;
if (path[0] == ':')
url.printf(TEXT("shell://%s"), path);
else
url.printf(TEXT("file://%s"), path);
set_url(url);
}
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -