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); HRESULT hr = entry->do_context_menu(_hwnd, tvhti.pt, _cm_ifs); if (SUCCEEDED(hr)) refresh(); else CHECKERROR(hr); } } }
bool ShellBrowserChild::select_folder(ShellDirectory* dir, bool expand) { CONTEXT("ShellBrowserChild::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) == dir) { if (TreeView_SelectItem(_left_hwnd, hitem)) { if (expand) if (!TreeView_Expand(_left_hwnd, hitem, TVE_EXPAND)) return false; return true; } break; } } return false; }
void ShellBrowserChild::Tree_DoItemMenu(HWND hwndTreeView, HTREEITEM hItem, LPPOINT pptScreen) { CONTEXT("ShellBrowserChild::Tree_DoItemMenu()"); LPARAM itemData = TreeView_GetItemData(hwndTreeView, hItem); if (itemData) { ShellEntry* entry = (ShellEntry*)itemData; ShellDirectory* dir = entry->_up; ShellFolder folder = dir? dir->_folder: GetDesktopFolder(); LPCITEMIDLIST pidl = static_cast<ShellEntry*>(entry)->_pidl; CHECKERROR(ShellFolderContextMenu(folder, _hwnd, 1, &pidl, pptScreen->x, pptScreen->y, _cm_ifs)); } }
void TrayNotifyDlg::SetIconMode(NOTIFYICONMODE mode) { int idx = TreeView_GetItemData(_tree_ctrl, _selectedItem); if (!idx) return; NotifyIconConfig& entry = _info[idx]; if (entry._mode != mode) { entry._mode = mode; // trigger refresh in notify area and this dialog if (_pNotifyArea) SendMessage(*_pNotifyArea, PM_REFRESH, 0, 0); } if (_pNotifyArea) { bool found = false; NotifyIconCfgList& cfg = _pNotifyArea->_cfg; for(NotifyIconCfgList::iterator it=cfg.begin(); it!=cfg.end(); ++it) { NotifyIconConfig& cfg_entry = *it; if (cfg_entry.match(entry)) { cfg_entry._mode = mode; ++found; break; } } if (!found) { // insert new configuration entry NotifyIconConfig cfg_entry = entry; cfg_entry._mode = mode; _pNotifyArea->_cfg.push_back(cfg_entry); } } Refresh(); ///@todo select treeview item at new position in tree view -> refresh HTREEITEM in _selectedItem }
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; }
void ShellBrowserChild::OnTreeItemExpanding(int idCtrl, LPNMTREEVIEW pnmtv) { CONTEXT("ShellBrowserChild::OnTreeItemExpanding()"); if (pnmtv->action == TVE_COLLAPSE) TreeView_Expand(_left_hwnd, pnmtv->itemNew.hItem, TVE_COLLAPSE|TVE_COLLAPSERESET); else if (pnmtv->action == TVE_EXPAND) { ShellDirectory* dir = (ShellDirectory*)TreeView_GetItemData(_left_hwnd, pnmtv->itemNew.hItem); if (dir) if (!InsertSubitems(pnmtv->itemNew.hItem, dir)) { dir->_shell_attribs &= ~SFGAO_HASSUBFOLDER; // remove subitem "+" TV_ITEM tvItem; tvItem.mask = TVIF_CHILDREN; tvItem.hItem = pnmtv->itemNew.hItem; tvItem.cChildren = 0; TreeView_SetItem(_left_hwnd, &tvItem); } } }