[SHDOCVW][SDK] Support Favorites bar Part 2 (#7223)

Implement Favorites bar.
JIRA issue: CORE-19686
- Introduce CNSCBand class to commonize
  some code of CFavBand and CExplorerBand
  classes.
- Implement Favorites bar.
- Fix IBandNavigate and INamespaceProxy
  interfaces.
This commit is contained in:
Katayama Hirofumi MZ 2024-08-14 12:00:47 +09:00 committed by GitHub
parent 1061e7f7db
commit 7ede534910
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 2050 additions and 2249 deletions

File diff suppressed because it is too large Load diff

View file

@ -8,185 +8,27 @@
#pragma once
#define WM_USER_SHELLEVENT (WM_USER + 88)
#include "CNSCBand.h"
class CExplorerBand :
public CComCoClass<CExplorerBand, &CLSID_ExplorerBand>,
public CComObjectRootEx<CComMultiThreadModelNoCS>,
public IDeskBand,
public IObjectWithSite,
public IInputObject,
public IPersistStream,
public IOleCommandTarget,
public IServiceProvider,
public IBandNavigate,
public IWinEventHandler,
public INamespaceProxy,
public IDispatch,
public IDropSource,
public IDropTarget,
public CWindowImpl<CExplorerBand, CWindow, CControlWinTraits>
class CExplorerBand
: public CNSCBand
, public CComCoClass<CExplorerBand, &CLSID_ExplorerBand>
, public CComObjectRootEx<CComMultiThreadModelNoCS>
, public IDispatch
{
private:
class NodeInfo
{
public:
LPITEMIDLIST absolutePidl;
LPITEMIDLIST relativePidl;
BOOL expanded;
};
// *** BaseBarSite information ***
CComPtr<IUnknown> m_pSite;
CComPtr<IShellFolder> m_pDesktop;
// *** tree explorer band stuff ***
BOOL m_fVisible;
BYTE m_mtxBlockNavigate; // A "lock" that prevents internal selection changes to initiate a navigation to the newly selected item.
BOOL m_bFocused;
DWORD m_dwBandID;
BOOL m_isEditing;
HIMAGELIST m_hImageList;
HTREEITEM m_hRoot;
HTREEITEM m_oldSelected;
LPITEMIDLIST m_pidlCurrent; // Note: This is NULL until the first user navigation!
// *** notification cookies ***
DWORD m_adviseCookie;
ULONG m_shellRegID;
// *** Drop target information ***
CComPtr<IDropTarget> m_pDropTarget;
HTREEITEM m_childTargetNode;
CComPtr<IDataObject> m_pCurObject;
void InitializeExplorerBand();
void DestroyExplorerBand();
HRESULT ExecuteCommand(CComPtr<IContextMenu>& menu, UINT nCmd);
// *** notifications handling ***
BOOL OnTreeItemExpanding(LPNMTREEVIEW pnmtv);
void OnSelectionChanged(LPNMTREEVIEW pnmtv);
BOOL OnTreeItemDeleted(LPNMTREEVIEW pnmtv);
void OnTreeItemDragging(LPNMTREEVIEW pnmtv, BOOL isRightClick);
// *** ATL event handlers ***
LRESULT OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
LRESULT ContextMenuHack(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
LRESULT OnShellEvent(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
LRESULT OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
LRESULT OnKillFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
LRESULT OnTimer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
// *** Helper functions ***
NodeInfo* GetNodeInfo(HTREEITEM hItem);
HRESULT UpdateBrowser(LPITEMIDLIST pidlGoto);
HTREEITEM InsertItem(
_In_opt_ HTREEITEM hParent,
_Inout_ IShellFolder *psfParent,
_In_ LPCITEMIDLIST pElt,
_In_ LPCITEMIDLIST pEltRelative,
_In_ BOOL bSort);
HTREEITEM InsertItem(
_In_opt_ HTREEITEM hParent,
_In_ LPCITEMIDLIST pElt,
_In_ LPCITEMIDLIST pEltRelative,
_In_ BOOL bSort);
BOOL InsertSubitems(HTREEITEM hItem, NodeInfo *pNodeInfo);
BOOL NavigateToPIDL(LPCITEMIDLIST dest, HTREEITEM *item, BOOL bExpand, BOOL bInsert, BOOL bSelect);
BOOL NavigateToCurrentFolder();
HRESULT GetCurrentLocation(PIDLIST_ABSOLUTE &pidl);
HRESULT IsCurrentLocation(PCIDLIST_ABSOLUTE pidl);
void OnChangeNotify(
_In_opt_ LPCITEMIDLIST pidl0,
_In_opt_ LPCITEMIDLIST pidl1,
_In_ LONG lEvent);
void Refresh();
void RefreshRecurse(_In_ HTREEITEM hItem);
BOOL IsTreeItemInEnum(_In_ HTREEITEM hItem, _In_ IEnumIDList *pEnum);
BOOL TreeItemHasThisChild(_In_ HTREEITEM hItem, _In_ PCITEMID_CHILD pidlChild);
HRESULT GetItemEnum(_Out_ CComPtr<IEnumIDList>& pEnum, _In_ HTREEITEM hItem);
BOOL ItemHasAnyChild(_In_ HTREEITEM hItem);
// *** Tree item sorting callback ***
static int CALLBACK CompareTreeItems(LPARAM p1, LPARAM p2, LPARAM p3);
public:
CExplorerBand();
virtual ~CExplorerBand();
// *** IOleWindow methods ***
STDMETHOD(GetWindow)(HWND *lphwnd) override;
STDMETHOD(ContextSensitiveHelp)(BOOL fEnterMode) override;
// *** IDockingWindow methods ***
STDMETHOD(CloseDW)(DWORD dwReserved) override;
STDMETHOD(ResizeBorderDW)(const RECT *prcBorder, IUnknown *punkToolbarSite, BOOL fReserved) override;
STDMETHOD(ShowDW)(BOOL fShow) override;
// *** IDeskBand methods ***
STDMETHOD(GetBandInfo)(DWORD dwBandID, DWORD dwViewMode, DESKBANDINFO *pdbi) override;
// *** IObjectWithSite methods ***
STDMETHOD(SetSite)(IUnknown *pUnkSite) override;
STDMETHOD(GetSite)(REFIID riid, void **ppvSite) override;
// *** IOleCommandTarget methods ***
STDMETHOD(QueryStatus)(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds [], OLECMDTEXT *pCmdText) override;
STDMETHOD(Exec)(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut) override;
// *** IServiceProvider methods ***
STDMETHOD(QueryService)(REFGUID guidService, REFIID riid, void **ppvObject) override;
// *** IInputObject methods ***
STDMETHOD(UIActivateIO)(BOOL fActivate, LPMSG lpMsg) override;
STDMETHOD(HasFocusIO)() override;
STDMETHOD(TranslateAcceleratorIO)(LPMSG lpMsg) override;
// *** IPersist methods ***
STDMETHOD(GetClassID)(CLSID *pClassID) override;
// *** IPersistStream methods ***
STDMETHOD(IsDirty)() override;
STDMETHOD(Load)(IStream *pStm) override;
STDMETHOD(Save)(IStream *pStm, BOOL fClearDirty) override;
STDMETHOD(GetSizeMax)(ULARGE_INTEGER *pcbSize) override;
// *** IWinEventHandler methods ***
STDMETHOD(OnWinEvent)(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult) override;
STDMETHOD(IsWindowOwner)(HWND hWnd) override;
// *** IBandNavigate methods ***
STDMETHOD(Select)(long paramC) override;
// *** INamespaceProxy ***
STDMETHOD(GetNavigateTarget)(
_In_ PCIDLIST_ABSOLUTE pidl,
_Out_ PIDLIST_ABSOLUTE ppidlTarget,
_Out_ ULONG *pulAttrib) override;
STDMETHOD(Invoke)(_In_ PCIDLIST_ABSOLUTE pidl) override;
STDMETHOD(OnSelectionChanged)(_In_ PCIDLIST_ABSOLUTE pidl) override;
STDMETHOD(RefreshFlags)(
_Out_ DWORD *pdwStyle,
_Out_ DWORD *pdwExStyle,
_Out_ DWORD *dwEnum) override;
STDMETHOD(CacheItem)(_In_ PCIDLIST_ABSOLUTE pidl) override;
STDMETHODIMP GetClassID(CLSID *pClassID) override;
STDMETHODIMP OnSelectionChanged(_In_ PCIDLIST_ABSOLUTE pidl) override;
STDMETHODIMP Invoke(_In_ PCIDLIST_ABSOLUTE pidl) override;
// *** IDispatch methods ***
STDMETHOD(GetTypeInfoCount)(UINT *pctinfo) override;
STDMETHOD(GetTypeInfo)(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo) override;
STDMETHOD(GetIDsOfNames)(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId) override;
STDMETHOD(Invoke)(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) override;
// *** IDropTarget methods ***
STDMETHOD(DragEnter)(IDataObject *pObj, DWORD glfKeyState, POINTL pt, DWORD *pdwEffect) override;
STDMETHOD(DragOver)(DWORD glfKeyState, POINTL pt, DWORD *pdwEffect) override;
STDMETHOD(DragLeave)() override;
STDMETHOD(Drop)(IDataObject *pObj, DWORD glfKeyState, POINTL pt, DWORD *pdwEffect) override;
// *** IDropSource methods ***
STDMETHOD(QueryContinueDrag)(BOOL fEscapePressed, DWORD grfKeyState) override;
STDMETHOD(GiveFeedback)(DWORD dwEffect) override;
STDMETHODIMP GetTypeInfoCount(UINT *pctinfo) override;
STDMETHODIMP GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo) override;
STDMETHODIMP GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId) override;
STDMETHODIMP Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) override;
DECLARE_REGISTRY_RESOURCEID(IDR_EXPLORERBAND)
DECLARE_NOT_AGGREGATABLE(CExplorerBand)
@ -194,27 +36,39 @@ public:
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CExplorerBand)
COM_INTERFACE_ENTRY_IID(IID_IDispatch, IDispatch)
COM_INTERFACE_ENTRY_IID(IID_IWinEventHandler, IWinEventHandler)
COM_INTERFACE_ENTRY_IID(IID_IBandNavigate, IBandNavigate)
COM_INTERFACE_ENTRY_IID(IID_INamespaceProxy, INamespaceProxy)
COM_INTERFACE_ENTRY2_IID(IID_IOleWindow, IOleWindow, IDeskBand)
COM_INTERFACE_ENTRY2_IID(IID_IDockingWindow, IDockingWindow, IDeskBand)
COM_INTERFACE_ENTRY_IID(IID_IDeskBand, IDeskBand)
COM_INTERFACE_ENTRY2_IID(IID_IDockingWindow, IDockingWindow, IDeskBand)
COM_INTERFACE_ENTRY2_IID(IID_IOleWindow, IOleWindow, IDeskBand)
COM_INTERFACE_ENTRY_IID(IID_IObjectWithSite, IObjectWithSite)
COM_INTERFACE_ENTRY_IID(IID_IInputObject, IInputObject)
COM_INTERFACE_ENTRY_IID(IID_IPersistStream, IPersistStream)
COM_INTERFACE_ENTRY2_IID(IID_IPersist, IPersist, IPersistStream)
COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget, IOleCommandTarget)
COM_INTERFACE_ENTRY_IID(IID_IServiceProvider, IServiceProvider)
COM_INTERFACE_ENTRY_IID(IID_IInputObject, IInputObject)
COM_INTERFACE_ENTRY2_IID(IID_IPersist, IPersist, IPersistStream)
COM_INTERFACE_ENTRY_IID(IID_IPersistStream, IPersistStream)
COM_INTERFACE_ENTRY_IID(IID_IContextMenu, IContextMenu)
COM_INTERFACE_ENTRY_IID(IID_IBandNavigate, IBandNavigate)
COM_INTERFACE_ENTRY_IID(IID_IWinEventHandler, IWinEventHandler)
COM_INTERFACE_ENTRY_IID(IID_INamespaceProxy, INamespaceProxy)
COM_INTERFACE_ENTRY_IID(IID_IDispatch, IDispatch)
COM_INTERFACE_ENTRY2_IID(IID_IUnknown, IUnknown, IDispatch)
END_COM_MAP()
BEGIN_MSG_MAP(CExplorerBand)
MESSAGE_HANDLER(WM_CONTEXTMENU, OnContextMenu)
MESSAGE_HANDLER(WM_USER_SHELLEVENT, OnShellEvent)
MESSAGE_HANDLER(WM_RBUTTONDOWN, ContextMenuHack)
MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
MESSAGE_HANDLER(WM_TIMER, OnTimer)
// MESSAGE_HANDLER(WM_KILLFOCUS, OnKillFocus)
END_MSG_MAP()
protected:
INT _GetRootCsidl() override;
DWORD _GetTVStyle() override;
DWORD _GetTVExStyle() override;
DWORD _GetEnumFlags() override;
HRESULT _CreateTreeView(HWND hwndParent) override;
void _DestroyTreeView() override;
BOOL _WantsRootItem() override;
BOOL _GetTitle(LPWSTR pszTitle, INT cchTitle) override;
void _SortItems(HTREEITEM hParent) override;
BOOL _NavigateToCurrentFolder();
BOOL _NavigateToPIDL(
_In_ LPCITEMIDLIST dest,
_Out_ HTREEITEM *phItem,
_In_ BOOL bExpand,
_In_ BOOL bInsert,
_In_ BOOL bSelect);
static INT CALLBACK _CompareTreeItems(LPARAM p1, LPARAM p2, LPARAM p3); // Used by _SortItems
};

View file

@ -11,40 +11,64 @@
WINE_DEFAULT_DEBUG_CHANNEL(shdocvw);
CFavBand::CFavBand()
: m_fVisible(FALSE)
, m_bFocused(FALSE)
, m_dwBandID(0)
, m_hToolbarImageList(NULL)
, m_hTreeViewImageList(NULL)
{
SHDOCVW_LockModule();
SHGetSpecialFolderLocation(NULL, CSIDL_FAVORITES, &m_pidlFav);
}
CFavBand::~CFavBand()
{
if (m_hToolbarImageList)
{
ImageList_Destroy(m_hToolbarImageList);
m_hToolbarImageList = NULL;
}
if (m_hTreeViewImageList)
{
ImageList_Destroy(m_hTreeViewImageList);
m_hTreeViewImageList = NULL;
}
SHDOCVW_UnlockModule();
}
VOID CFavBand::OnFinalMessage(HWND)
STDMETHODIMP CFavBand::GetClassID(CLSID *pClassID)
{
// The message loop is finished, now we can safely destruct!
Release();
if (!pClassID)
return E_POINTER;
*pClassID = CLSID_SH_FavBand;
return S_OK;
}
// *** helper methods ***
INT CFavBand::_GetRootCsidl()
{
return CSIDL_FAVORITES;
}
BOOL CFavBand::CreateToolbar()
DWORD CFavBand::_GetTVStyle()
{
// Remove TVS_SINGLEEXPAND for now since it has strange behaviour
return TVS_NOHSCROLL | TVS_NONEVENHEIGHT | TVS_FULLROWSELECT | TVS_INFOTIP |
/*TVS_SINGLEEXPAND | TVS_TRACKSELECT |*/ TVS_SHOWSELALWAYS | TVS_EDITLABELS |
WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_TABSTOP;
}
DWORD CFavBand::_GetTVExStyle()
{
return WS_EX_CLIENTEDGE;
}
DWORD CFavBand::_GetEnumFlags()
{
return SHCONTF_FOLDERS | SHCONTF_NONFOLDERS;
}
BOOL CFavBand::_GetTitle(LPWSTR pszTitle, INT cchTitle)
{
#define IDS_FAVORITES 47 // Borrowed from shell32.dll
HINSTANCE hShell32 = ::LoadLibraryExW(L"shell32.dll", NULL, LOAD_LIBRARY_AS_DATAFILE);
if (hShell32)
{
::LoadStringW(hShell32, IDS_FAVORITES, pszTitle, cchTitle);
::FreeLibrary(hShell32);
return TRUE;
}
return FALSE;
#undef IDS_FAVORITES
}
BOOL CFavBand::_WantsRootItem()
{
return FALSE;
}
HRESULT CFavBand::_CreateToolbar(HWND hwndParent)
{
#define IDB_SHELL_EXPLORER_SM 216 // Borrowed from browseui.dll
HINSTANCE hinstBrowseUI = LoadLibraryExW(L"browseui.dll", NULL, LOAD_LIBRARY_AS_DATAFILE);
@ -58,23 +82,23 @@ BOOL CFavBand::CreateToolbar()
#undef IDB_SHELL_EXPLORER_SM
ATLASSERT(hbmToolbar);
if (!hbmToolbar)
return FALSE;
return E_FAIL;
m_hToolbarImageList = ImageList_Create(16, 16, ILC_COLOR32, 0, 8);
ATLASSERT(m_hToolbarImageList);
if (!m_hToolbarImageList)
return FALSE;
return E_FAIL;
ImageList_Add(m_hToolbarImageList, hbmToolbar, NULL);
DeleteObject(hbmToolbar);
DWORD style = WS_CHILD | WS_VISIBLE | TBSTYLE_FLAT | TBSTYLE_LIST | CCS_NODIVIDER |
TBSTYLE_WRAPABLE;
HWND hwndTB = ::CreateWindowExW(0, TOOLBARCLASSNAMEW, NULL, style, 0, 0, 0, 0, m_hWnd,
(HMENU)(LONG_PTR)IDW_TOOLBAR, instance, NULL);
HWND hwndTB = ::CreateWindowExW(0, TOOLBARCLASSNAMEW, NULL, style, 0, 0, 0, 0, hwndParent,
(HMENU)UlongToHandle(IDW_TOOLBAR), instance, NULL);
ATLASSERT(hwndTB);
if (!hwndTB)
return FALSE;
return E_FAIL;
m_hwndToolbar.Attach(hwndTB);
m_hwndToolbar.SendMessage(TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);
@ -102,480 +126,57 @@ BOOL CFavBand::CreateToolbar()
tbb[iButton].iString = (INT)m_hwndToolbar.SendMessage(TB_ADDSTRING, 0, (LPARAM)szzOrganize);
++iButton;
ATLASSERT(iButton == _countof(tbb));
LRESULT ret = m_hwndToolbar.SendMessage(TB_ADDBUTTONS, iButton, (LPARAM)&tbb);
ATLASSERT(ret);
return ret;
}
BOOL CFavBand::CreateTreeView()
{
m_hTreeViewImageList = ImageList_Create(16, 16, ILC_COLOR32 | ILC_MASK, 64, 0);
ATLASSERT(m_hTreeViewImageList);
if (!m_hTreeViewImageList)
return FALSE;
DWORD style = TVS_NOHSCROLL | TVS_NONEVENHEIGHT | TVS_FULLROWSELECT | TVS_INFOTIP |
TVS_SINGLEEXPAND | TVS_TRACKSELECT | TVS_SHOWSELALWAYS | TVS_EDITLABELS |
WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_TABSTOP;
HWND hwndTV = ::CreateWindowExW(WS_EX_CLIENTEDGE, WC_TREEVIEWW, NULL, style, 0, 0, 0, 0,
m_hWnd, (HMENU)(ULONG_PTR)IDW_TREEVIEW, instance, NULL);
ATLASSERT(hwndTV);
if (!hwndTV)
return FALSE;
m_hwndTreeView.Attach(hwndTV);
TreeView_SetImageList(m_hwndTreeView, m_hTreeViewImageList, TVSIL_NORMAL);
return TRUE;
}
// *** message handlers ***
LRESULT CFavBand::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
INITCOMMONCONTROLSEX iccx = { sizeof(iccx), ICC_TREEVIEW_CLASSES | ICC_BAR_CLASSES };
if (!::InitCommonControlsEx(&iccx) || !CreateToolbar() || !CreateTreeView())
return -1;
return 0;
}
LRESULT CFavBand::OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
m_hwndTreeView.DestroyWindow();
m_hwndToolbar.DestroyWindow();
return 0;
}
LRESULT CFavBand::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
if (!m_hwndTreeView)
return 0;
RECT rc;
GetClientRect(&rc);
LONG cx = rc.right, cy = rc.bottom;
RECT rcTB;
m_hwndToolbar.SendMessage(TB_AUTOSIZE, 0, 0);
m_hwndToolbar.GetWindowRect(&rcTB);
LONG cyTB = rcTB.bottom - rcTB.top;
m_hwndTreeView.MoveWindow(0, cyTB, cx, cy - cyTB);
return 0;
}
LRESULT CFavBand::OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
{
m_bFocused = TRUE;
IUnknown_OnFocusChangeIS(m_pSite, reinterpret_cast<IUnknown*>(this), TRUE);
return 0;
}
LRESULT CFavBand::OnKillFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
{
IUnknown_OnFocusChangeIS(m_pSite, reinterpret_cast<IUnknown*>(this), FALSE);
m_bFocused = FALSE;
return 0;
}
LRESULT CFavBand::OnCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
{
switch (LOWORD(wParam))
{
case ID_ADD:
{
UNIMPLEMENTED;
SHELL_ErrorBox(m_hWnd, ERROR_NOT_SUPPORTED);
break;
}
case ID_ORGANIZE:
{
SHELLEXECUTEINFOW sei = { sizeof(sei), SEE_MASK_IDLIST };
sei.hwnd = m_hWnd;
sei.nShow = SW_SHOWNORMAL;
sei.lpIDList = m_pidlFav;
::ShellExecuteExW(&sei);
break;
}
}
return 0;
}
// *** IOleWindow ***
STDMETHODIMP CFavBand::GetWindow(HWND *lphwnd)
{
if (!lphwnd)
return E_INVALIDARG;
*lphwnd = m_hWnd;
return S_OK;
}
STDMETHODIMP CFavBand::ContextSensitiveHelp(BOOL fEnterMode)
{
UNIMPLEMENTED;
return E_NOTIMPL;
}
// *** IDockingWindow ***
STDMETHODIMP CFavBand::CloseDW(DWORD dwReserved)
{
// We do nothing, we don't have anything to save yet
TRACE("CloseDW called\n");
return S_OK;
}
STDMETHODIMP CFavBand::ResizeBorderDW(const RECT *prcBorder, IUnknown *punkToolbarSite, BOOL fReserved)
{
/* Must return E_NOTIMPL according to MSDN */
return E_NOTIMPL;
}
STDMETHODIMP CFavBand::ShowDW(BOOL fShow)
{
m_fVisible = fShow;
ShowWindow(fShow ? SW_SHOW : SW_HIDE);
return S_OK;
}
// *** IDeskBand ***
STDMETHODIMP CFavBand::GetBandInfo(DWORD dwBandID, DWORD dwViewMode, DESKBANDINFO *pdbi)
{
if (!pdbi)
return E_INVALIDARG;
m_dwBandID = dwBandID;
if (pdbi->dwMask & DBIM_MINSIZE)
{
pdbi->ptMinSize.x = 200;
pdbi->ptMinSize.y = 30;
}
if (pdbi->dwMask & DBIM_MAXSIZE)
pdbi->ptMaxSize.y = -1;
if (pdbi->dwMask & DBIM_INTEGRAL)
pdbi->ptIntegral.y = 1;
if (pdbi->dwMask & DBIM_ACTUAL)
{
pdbi->ptActual.x = 200;
pdbi->ptActual.y = 30;
}
if (pdbi->dwMask & DBIM_TITLE)
{
#define IDS_FAVORITES 47 // Borrowed from shell32.dll
HINSTANCE hShell32 = LoadLibraryExW(L"shell32.dll", NULL, LOAD_LIBRARY_AS_DATAFILE);
if (hShell32)
{
LoadStringW(hShell32, IDS_FAVORITES, pdbi->wszTitle, _countof(pdbi->wszTitle));
FreeLibrary(hShell32);
}
#undef IDS_FAVORITES
}
if (pdbi->dwMask & DBIM_MODEFLAGS)
pdbi->dwModeFlags = DBIMF_NORMAL | DBIMF_VARIABLEHEIGHT;
if (pdbi->dwMask & DBIM_BKCOLOR)
pdbi->dwMask &= ~DBIM_BKCOLOR;
m_hwndToolbar.SendMessage(TB_ADDBUTTONS, iButton, (LPARAM)&tbb);
return S_OK;
}
// *** IObjectWithSite ***
STDMETHODIMP CFavBand::SetSite(IUnknown *pUnkSite)
{
HRESULT hr;
if (pUnkSite == m_pSite)
return S_OK;
TRACE("SetSite called\n");
if (!pUnkSite)
{
DestroyWindow();
m_hWnd = NULL;
}
if (pUnkSite != m_pSite)
m_pSite = NULL;
if (!pUnkSite)
return S_OK;
HWND hwndParent;
hr = IUnknown_GetWindow(pUnkSite, &hwndParent);
if (!SUCCEEDED(hr))
{
ERR("Could not get parent's window! 0x%08lX\n", hr);
return E_INVALIDARG;
}
m_pSite = pUnkSite;
if (m_hWnd)
{
SetParent(hwndParent); // Change its parent
}
else
{
this->Create(hwndParent, NULL, NULL, WS_CHILD | WS_VISIBLE, 0, (UINT)0, NULL);
}
return S_OK;
}
STDMETHODIMP CFavBand::GetSite(REFIID riid, void **ppvSite)
{
if (!ppvSite)
return E_POINTER;
*ppvSite = m_pSite;
return S_OK;
}
// *** IOleCommandTarget ***
STDMETHODIMP CFavBand::QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds [], OLECMDTEXT *pCmdText)
{
UNIMPLEMENTED;
return E_NOTIMPL;
}
STDMETHODIMP CFavBand::Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
{
UNIMPLEMENTED;
return E_NOTIMPL;
}
// *** IServiceProvider ***
STDMETHODIMP CFavBand::QueryService(REFGUID guidService, REFIID riid, void **ppvObject)
{
UNIMPLEMENTED;
return E_NOTIMPL;
}
// *** IServiceProvider ***
STDMETHODIMP CFavBand::QueryContextMenu(
HMENU hmenu,
UINT indexMenu,
UINT idCmdFirst,
UINT idCmdLast,
UINT uFlags)
{
UNIMPLEMENTED;
return E_NOTIMPL;
}
STDMETHODIMP CFavBand::InvokeCommand(
LPCMINVOKECOMMANDINFO lpici)
{
UNIMPLEMENTED;
return E_NOTIMPL;
}
STDMETHODIMP CFavBand::GetCommandString(
UINT_PTR idCmd,
UINT uType,
UINT *pwReserved,
LPSTR pszName,
UINT cchMax)
{
UNIMPLEMENTED;
return E_NOTIMPL;
}
// *** IInputObject ***
STDMETHODIMP CFavBand::UIActivateIO(BOOL fActivate, LPMSG lpMsg)
{
if (fActivate)
{
//SetFocus();
SetActiveWindow();
}
if (lpMsg)
{
TranslateMessage(lpMsg);
DispatchMessage(lpMsg);
}
return S_OK;
}
STDMETHODIMP CFavBand::HasFocusIO()
{
return m_bFocused ? S_OK : S_FALSE;
}
STDMETHODIMP CFavBand::TranslateAcceleratorIO(LPMSG lpMsg)
{
if (lpMsg->hwnd == m_hWnd)
{
TranslateMessage(lpMsg);
DispatchMessage(lpMsg);
return S_OK;
}
return S_FALSE;
}
// *** IPersist ***
STDMETHODIMP CFavBand::GetClassID(CLSID *pClassID)
{
if (!pClassID)
return E_POINTER;
*pClassID = CLSID_SH_FavBand;
return S_OK;
}
// *** IPersistStream ***
STDMETHODIMP CFavBand::IsDirty()
{
UNIMPLEMENTED;
return E_NOTIMPL;
}
STDMETHODIMP CFavBand::Load(IStream *pStm)
{
UNIMPLEMENTED;
return E_NOTIMPL;
}
STDMETHODIMP CFavBand::Save(IStream *pStm, BOOL fClearDirty)
{
UNIMPLEMENTED;
return E_NOTIMPL;
}
STDMETHODIMP CFavBand::GetSizeMax(ULARGE_INTEGER *pcbSize)
{
// TODO: calculate max size
UNIMPLEMENTED;
return E_NOTIMPL;
}
// *** IWinEventHandler ***
STDMETHODIMP CFavBand::OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult)
{
UNIMPLEMENTED;
return E_NOTIMPL;
}
STDMETHODIMP CFavBand::IsWindowOwner(HWND hWnd)
{
return (hWnd == m_hWnd) ? S_OK : S_FALSE;
}
// *** IBandNavigate ***
STDMETHODIMP CFavBand::Select(long paramC)
{
UNIMPLEMENTED;
return E_NOTIMPL;
}
// *** INamespaceProxy ***
/// Returns the ITEMIDLIST that should be navigated when an item is invoked.
STDMETHODIMP CFavBand::GetNavigateTarget(
_In_ PCIDLIST_ABSOLUTE pidl,
_Out_ PIDLIST_ABSOLUTE ppidlTarget,
_Out_ ULONG *pulAttrib)
{
UNIMPLEMENTED;
return E_NOTIMPL;
}
/// Handles a user action on an item.
STDMETHODIMP CFavBand::Invoke(_In_ PCIDLIST_ABSOLUTE pidl)
{
UNIMPLEMENTED;
return E_NOTIMPL;
}
/// Called when the user has selected an item.
// Called when the user has selected an item.
STDMETHODIMP CFavBand::OnSelectionChanged(_In_ PCIDLIST_ABSOLUTE pidl)
{
UNIMPLEMENTED;
return E_NOTIMPL;
}
CComHeapPtr<ITEMIDLIST> pidlTarget;
DWORD attrs = SFGAO_FOLDER | SFGAO_LINK;
HRESULT hr = GetNavigateTarget(pidl, &pidlTarget, &attrs);
if (FAILED_UNEXPECTEDLY(hr))
return hr;
/// Returns flags used to update the tree control.
STDMETHODIMP CFavBand::RefreshFlags(
_Out_ DWORD *pdwStyle,
_Out_ DWORD *pdwExStyle,
_Out_ DWORD *dwEnum)
{
UNIMPLEMENTED;
return E_NOTIMPL;
}
if ((attrs & (SFGAO_FOLDER | SFGAO_LINK)) == (SFGAO_FOLDER | SFGAO_LINK))
return _UpdateBrowser(pidlTarget);
STDMETHODIMP CFavBand::CacheItem(
_In_ PCIDLIST_ABSOLUTE pidl)
{
UNIMPLEMENTED;
return E_NOTIMPL;
}
// *** IDispatch ***
STDMETHODIMP CFavBand::GetTypeInfoCount(UINT *pctinfo)
{
UNIMPLEMENTED;
return E_NOTIMPL;
}
STDMETHODIMP CFavBand::GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
{
UNIMPLEMENTED;
return E_NOTIMPL;
}
STDMETHODIMP CFavBand::GetIDsOfNames(
REFIID riid,
LPOLESTR *rgszNames,
UINT cNames,
LCID lcid,
DISPID *rgDispId)
{
UNIMPLEMENTED;
return E_NOTIMPL;
}
STDMETHODIMP CFavBand::Invoke(
DISPID dispIdMember,
REFIID riid,
LCID lcid,
WORD wFlags,
DISPPARAMS *pDispParams,
VARIANT *pVarResult,
EXCEPINFO *pExcepInfo,
UINT *puArgErr)
{
switch (dispIdMember)
if (attrs & SFGAO_FOLDER)
{
case DISPID_DOWNLOADCOMPLETE:
case DISPID_NAVIGATECOMPLETE2:
// FIXME: Update current location
return S_OK;
HTREEITEM hItem = TreeView_GetSelection(m_hwndTreeView);
CItemData *pItemData = GetItemData(hItem);
if (pItemData && !pItemData->expanded)
{
_InsertSubitems(hItem, pItemData->absolutePidl);
pItemData->expanded = TRUE;
}
TreeView_Expand(m_hwndTreeView, hItem, TVE_EXPAND);
return S_OK;
}
return E_INVALIDARG;
SHELLEXECUTEINFOW info = { sizeof(info) };
info.fMask = SEE_MASK_FLAG_NO_UI | SEE_MASK_IDLIST;
info.hwnd = m_hWnd;
info.nShow = SW_SHOWNORMAL;
info.lpIDList = pidlTarget;
ShellExecuteExW(&info);
return hr;
}
void CFavBand::_SortItems(HTREEITEM hParent)
{
TreeView_SortChildren(m_hwndTreeView, hParent, 0); // Sort by name
}
HRESULT CFavBand::_CreateTreeView(HWND hwndParent)
{
HRESULT hr = CNSCBand::_CreateTreeView(hwndParent);
if (FAILED_UNEXPECTEDLY(hr))
return hr;
TreeView_SetItemHeight(m_hwndTreeView, 24);
_InsertSubitems(TVI_ROOT, m_pidlRoot);
return hr;
}

View file

@ -7,129 +7,27 @@
#pragma once
#define FAVBANDCLASSNAME L"ReactOS Favorites Band"
#ifdef __cplusplus
#include "CNSCBand.h"
class CFavBand
: public CComCoClass<CFavBand, &CLSID_SH_FavBand>
: public CNSCBand
, public CComCoClass<CFavBand, &CLSID_SH_FavBand>
, public CComObjectRootEx<CComMultiThreadModelNoCS>
, public CWindowImpl<CFavBand>
, public IDispatch
, public IDeskBand
, public IObjectWithSite
, public IInputObject
, public IPersistStream
, public IOleCommandTarget
, public IServiceProvider
, public IContextMenu
, public IBandNavigate
, public IWinEventHandler
, public INamespaceProxy
{
public:
DECLARE_WND_CLASS_EX(FAVBANDCLASSNAME, 0, COLOR_3DFACE)
static LPCWSTR GetWndClassName() { return FAVBANDCLASSNAME; }
CFavBand();
virtual ~CFavBand();
// *** IOleWindow methods ***
STDMETHODIMP GetWindow(HWND *lphwnd) override;
STDMETHODIMP ContextSensitiveHelp(BOOL fEnterMode) override;
// *** IDockingWindow methods ***
STDMETHODIMP CloseDW(DWORD dwReserved) override;
STDMETHODIMP ResizeBorderDW(const RECT *prcBorder, IUnknown *punkToolbarSite, BOOL fReserved) override;
STDMETHODIMP ShowDW(BOOL fShow) override;
// *** IDeskBand methods ***
STDMETHODIMP GetBandInfo(DWORD dwBandID, DWORD dwViewMode, DESKBANDINFO *pdbi) override;
// *** IObjectWithSite methods ***
STDMETHODIMP SetSite(IUnknown *pUnkSite) override;
STDMETHODIMP GetSite(REFIID riid, void **ppvSite) override;
// *** IOleCommandTarget methods ***
STDMETHODIMP QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds [], OLECMDTEXT *pCmdText) override;
STDMETHODIMP Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut) override;
// *** IServiceProvider methods ***
STDMETHODIMP QueryService(REFGUID guidService, REFIID riid, void **ppvObject) override;
// *** IContextMenu methods ***
STDMETHODIMP QueryContextMenu(
HMENU hmenu,
UINT indexMenu,
UINT idCmdFirst,
UINT idCmdLast,
UINT uFlags) override;
STDMETHODIMP InvokeCommand(LPCMINVOKECOMMANDINFO lpici) override;
STDMETHODIMP GetCommandString(
UINT_PTR idCmd,
UINT uType,
UINT *pwReserved,
LPSTR pszName,
UINT cchMax) override;
// *** IInputObject methods ***
STDMETHODIMP UIActivateIO(BOOL fActivate, LPMSG lpMsg) override;
STDMETHODIMP HasFocusIO() override;
STDMETHODIMP TranslateAcceleratorIO(LPMSG lpMsg) override;
// *** IPersist methods ***
STDMETHODIMP GetClassID(CLSID *pClassID) override;
// *** IPersistStream methods ***
STDMETHODIMP IsDirty() override;
STDMETHODIMP Load(IStream *pStm) override;
STDMETHODIMP Save(IStream *pStm, BOOL fClearDirty) override;
STDMETHODIMP GetSizeMax(ULARGE_INTEGER *pcbSize) override;
// *** IWinEventHandler methods ***
STDMETHODIMP OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult) override;
STDMETHODIMP IsWindowOwner(HWND hWnd) override;
// *** IBandNavigate methods ***
STDMETHODIMP Select(long paramC) override;
// *** INamespaceProxy methods ***
STDMETHODIMP GetNavigateTarget(
_In_ PCIDLIST_ABSOLUTE pidl,
_Out_ PIDLIST_ABSOLUTE ppidlTarget,
_Out_ ULONG *pulAttrib) override;
STDMETHODIMP Invoke(_In_ PCIDLIST_ABSOLUTE pidl) override;
STDMETHODIMP OnSelectionChanged(_In_ PCIDLIST_ABSOLUTE pidl) override;
STDMETHODIMP RefreshFlags(
_Out_ DWORD *pdwStyle,
_Out_ DWORD *pdwExStyle,
_Out_ DWORD *dwEnum) override;
STDMETHODIMP CacheItem(_In_ PCIDLIST_ABSOLUTE pidl) override;
// *** IDispatch methods ***
STDMETHODIMP GetTypeInfoCount(UINT *pctinfo) override;
STDMETHODIMP GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo) override;
STDMETHODIMP GetIDsOfNames(
REFIID riid,
LPOLESTR *rgszNames,
UINT cNames,
LCID lcid,
DISPID *rgDispId) override;
STDMETHODIMP Invoke(
DISPID dispIdMember,
REFIID riid,
LCID lcid,
WORD wFlags,
DISPPARAMS *pDispParams,
VARIANT *pVarResult,
EXCEPINFO *pExcepInfo,
UINT *puArgErr) override;
STDMETHODIMP OnSelectionChanged(_In_ PCIDLIST_ABSOLUTE pidl);
DECLARE_REGISTRY_RESOURCEID(IDR_FAVBAND)
DECLARE_NOT_AGGREGATABLE(CFavBand)
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CFavBand)
COM_INTERFACE_ENTRY_IID(IID_IDispatch, IDispatch)
COM_INTERFACE_ENTRY_IID(IID_IDeskBand, IDeskBand)
COM_INTERFACE_ENTRY2_IID(IID_IDockingWindow, IDockingWindow, IDeskBand)
COM_INTERFACE_ENTRY2_IID(IID_IOleWindow, IOleWindow, IDeskBand)
@ -146,38 +44,16 @@ public:
COM_INTERFACE_ENTRY_IID(IID_INamespaceProxy, INamespaceProxy)
END_COM_MAP()
BEGIN_MSG_MAP(CFavBand)
MESSAGE_HANDLER(WM_CREATE, OnCreate)
MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
MESSAGE_HANDLER(WM_SIZE, OnSize)
MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
MESSAGE_HANDLER(WM_KILLFOCUS, OnKillFocus)
MESSAGE_HANDLER(WM_COMMAND, OnCommand)
END_MSG_MAP()
protected:
BOOL m_fVisible;
BOOL m_bFocused;
DWORD m_dwBandID;
CComPtr<IUnknown> m_pSite;
CComHeapPtr<ITEMIDLIST> m_pidlFav;
HIMAGELIST m_hToolbarImageList;
HIMAGELIST m_hTreeViewImageList;
CToolbar<> m_hwndToolbar;
CTreeView m_hwndTreeView;
VOID OnFinalMessage(HWND) override;
// *** helper methods ***
BOOL CreateToolbar();
BOOL CreateTreeView();
// *** message handlers ***
LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
LRESULT OnKillFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
LRESULT OnCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
INT _GetRootCsidl() override;
DWORD _GetTVStyle() override;
DWORD _GetTVExStyle() override;
DWORD _GetEnumFlags() override;
BOOL _GetTitle(LPWSTR pszTitle, INT cchTitle) override;
HRESULT _CreateTreeView(HWND hwndParent) override;
HRESULT _CreateToolbar(HWND hwndParent) override;
BOOL _WantsRootItem() override;
void _SortItems(HTREEITEM hParent) override;
};
#endif // def __cplusplus

View file

@ -34,6 +34,7 @@ add_cd_file(TARGET shdocvw DESTINATION reactos/system32 FOR all)
add_library(shdocvw_sublib OBJECT
CExplorerBand.cpp
CFavBand.cpp
CNSCBand.cpp
mrulist.cpp
objects.cpp
utility.cpp)

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,231 @@
/*
* PROJECT: ReactOS shdocvw
* LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
* PURPOSE: NameSpace Control Band
* COPYRIGHT: Copyright 2024 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
*/
#pragma once
#define NSCBANDCLASSNAME L"ReactOS NameSpace Control Band"
#define WM_USER_SHELLEVENT (WM_USER + 88)
#ifdef __cplusplus
class CNSCBand
: public CWindowImpl<CNSCBand>
, public IDeskBand
, public IObjectWithSite
, public IInputObject
, public IPersistStream
, public IOleCommandTarget
, public IServiceProvider
, public IContextMenu
, public IBandNavigate
, public IWinEventHandler
, public INamespaceProxy
, public IDropTarget
, public IDropSource
{
public:
DECLARE_WND_CLASS_EX(NSCBANDCLASSNAME, 0, COLOR_3DFACE)
static LPCWSTR GetWndClassName() { return NSCBANDCLASSNAME; }
CNSCBand();
virtual ~CNSCBand();
// The node of TreeView
struct CItemData
{
CComHeapPtr<ITEMIDLIST> absolutePidl;
CComHeapPtr<ITEMIDLIST> relativePidl;
BOOL expanded = FALSE;
};
CItemData* GetItemData(_In_ HTREEITEM hItem);
// *** IOleWindow methods ***
STDMETHODIMP GetWindow(HWND *lphwnd) override;
STDMETHODIMP ContextSensitiveHelp(BOOL fEnterMode) override;
// *** IDockingWindow methods ***
STDMETHODIMP CloseDW(DWORD dwReserved) override;
STDMETHODIMP ResizeBorderDW(const RECT *prcBorder, IUnknown *punkToolbarSite, BOOL fReserved) override;
STDMETHODIMP ShowDW(BOOL fShow) override;
// *** IDeskBand methods ***
STDMETHODIMP GetBandInfo(DWORD dwBandID, DWORD dwViewMode, DESKBANDINFO *pdbi) override;
// *** IObjectWithSite methods ***
STDMETHODIMP SetSite(IUnknown *pUnkSite) override;
STDMETHODIMP GetSite(REFIID riid, void **ppvSite) override;
// *** IOleCommandTarget methods ***
STDMETHODIMP QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds [], OLECMDTEXT *pCmdText) override;
STDMETHODIMP Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut) override;
// *** IServiceProvider methods ***
STDMETHODIMP QueryService(REFGUID guidService, REFIID riid, void **ppvObject) override;
// *** IContextMenu methods ***
STDMETHODIMP QueryContextMenu(
HMENU hmenu,
UINT indexMenu,
UINT idCmdFirst,
UINT idCmdLast,
UINT uFlags) override;
STDMETHODIMP InvokeCommand(LPCMINVOKECOMMANDINFO lpici) override;
STDMETHODIMP GetCommandString(
UINT_PTR idCmd,
UINT uType,
UINT *pwReserved,
LPSTR pszName,
UINT cchMax) override;
// *** IInputObject methods ***
STDMETHODIMP UIActivateIO(BOOL fActivate, LPMSG lpMsg) override;
STDMETHODIMP HasFocusIO() override;
STDMETHODIMP TranslateAcceleratorIO(LPMSG lpMsg) override;
// *** IPersist methods ***
STDMETHODIMP GetClassID(CLSID *pClassID) override;
// *** IPersistStream methods ***
STDMETHODIMP IsDirty() override;
STDMETHODIMP Load(IStream *pStm) override;
STDMETHODIMP Save(IStream *pStm, BOOL fClearDirty) override;
STDMETHODIMP GetSizeMax(ULARGE_INTEGER *pcbSize) override;
// *** IWinEventHandler methods ***
STDMETHODIMP OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult) override;
STDMETHODIMP IsWindowOwner(HWND hWnd) override;
// *** IBandNavigate methods ***
STDMETHODIMP Select(LPCITEMIDLIST pidl) override;
// *** INamespaceProxy methods ***
STDMETHODIMP GetNavigateTarget(
_In_ PCIDLIST_ABSOLUTE pidl,
_Out_ PIDLIST_ABSOLUTE *ppidlTarget,
_Out_ ULONG *pulAttrib) override;
STDMETHODIMP Invoke(_In_ PCIDLIST_ABSOLUTE pidl) override;
STDMETHODIMP OnSelectionChanged(_In_ PCIDLIST_ABSOLUTE pidl) override;
STDMETHODIMP RefreshFlags(
_Out_ DWORD *pdwStyle,
_Out_ DWORD *pdwExStyle,
_Out_ DWORD *dwEnum) override;
STDMETHODIMP CacheItem(_In_ PCIDLIST_ABSOLUTE pidl) override;
// *** IDropTarget methods ***
STDMETHODIMP DragEnter(IDataObject *pObj, DWORD glfKeyState, POINTL pt, DWORD *pdwEffect) override;
STDMETHODIMP DragOver(DWORD glfKeyState, POINTL pt, DWORD *pdwEffect) override;
STDMETHODIMP DragLeave() override;
STDMETHODIMP Drop(IDataObject *pObj, DWORD glfKeyState, POINTL pt, DWORD *pdwEffect) override;
// *** IDropSource methods ***
STDMETHODIMP QueryContinueDrag(BOOL fEscapePressed, DWORD grfKeyState) override;
STDMETHODIMP GiveFeedback(DWORD dwEffect) override;
protected:
DWORD m_dwTVStyle = 0;
DWORD m_dwTVExStyle = 0;
DWORD m_dwEnumFlags = 0;
BOOL m_fVisible = FALSE;
BOOL m_bFocused = FALSE;
DWORD m_dwBandID = 0;
CComPtr<IUnknown> m_pSite;
CComPtr<IShellFolder> m_pDesktop;
CComHeapPtr<ITEMIDLIST> m_pidlRoot;
HIMAGELIST m_hToolbarImageList = NULL;
CToolbar<> m_hwndToolbar;
CTreeView m_hwndTreeView;
LONG m_mtxBlockNavigate = 0; // A "lock" that prevents internal selection changes to initiate a navigation to the newly selected item.
BOOL m_isEditing = FALSE;
HTREEITEM m_hRoot = NULL;
HTREEITEM m_oldSelected = NULL;
DWORD m_adviseCookie = 0;
ULONG m_shellRegID = 0;
// *** Drop target information ***
CComPtr<IDropTarget> m_pDropTarget;
HTREEITEM m_childTargetNode = NULL;
CComPtr<IDataObject> m_pCurObject;
VOID OnFinalMessage(HWND) override;
// *** helper methods ***
virtual INT _GetRootCsidl() = 0;
virtual HRESULT _CreateTreeView(HWND hwndParent);
virtual HRESULT _CreateToolbar(HWND hwndParent) { return S_OK; }
virtual void _DestroyTreeView();
virtual void _DestroyToolbar();
virtual DWORD _GetTVStyle() = 0;
virtual DWORD _GetTVExStyle() = 0;
virtual DWORD _GetEnumFlags() = 0;
virtual BOOL _GetTitle(LPWSTR pszTitle, INT cchTitle) = 0;
virtual BOOL _WantsRootItem() = 0;
virtual void _SortItems(HTREEITEM hParent) = 0;
void _RegisterChangeNotify();
void _UnregisterChangeNotify();
BOOL OnTreeItemExpanding(_In_ LPNMTREEVIEW pnmtv);
BOOL OnTreeItemDeleted(_In_ LPNMTREEVIEW pnmtv);
void _OnSelectionChanged(_In_ LPNMTREEVIEW pnmtv);
void OnTreeItemDragging(_In_ LPNMTREEVIEW pnmtv, _In_ BOOL isRightClick);
LRESULT OnBeginLabelEdit(_In_ LPNMTVDISPINFO dispInfo);
LRESULT OnEndLabelEdit(_In_ LPNMTVDISPINFO dispInfo);
void OnChangeNotify(
_In_opt_ LPCITEMIDLIST pidl0,
_In_opt_ LPCITEMIDLIST pidl1,
_In_ LONG lEvent);
HRESULT _ExecuteCommand(_In_ CComPtr<IContextMenu>& menu, _In_ UINT nCmd);
HTREEITEM _InsertItem(
_In_opt_ HTREEITEM hParent,
_Inout_ IShellFolder *psfParent,
_In_ LPCITEMIDLIST pElt,
_In_ LPCITEMIDLIST pEltRelative,
_In_ BOOL bSort);
HTREEITEM _InsertItem(
_In_opt_ HTREEITEM hParent,
_In_ LPCITEMIDLIST pElt,
_In_ LPCITEMIDLIST pEltRelative,
_In_ BOOL bSort);
BOOL _InsertSubitems(HTREEITEM hItem, LPCITEMIDLIST entry);
HRESULT _UpdateBrowser(LPCITEMIDLIST pidlGoto);
HRESULT _GetCurrentLocation(_Out_ PIDLIST_ABSOLUTE *ppidl);
HRESULT _IsCurrentLocation(_In_ PCIDLIST_ABSOLUTE pidl);
void _Refresh();
void _RefreshRecurse(_In_ HTREEITEM hItem);
BOOL _IsTreeItemInEnum(_In_ HTREEITEM hItem, _In_ IEnumIDList *pEnum);
BOOL _TreeItemHasThisChild(_In_ HTREEITEM hItem, _In_ PCITEMID_CHILD pidlChild);
HRESULT _GetItemEnum(
_Out_ CComPtr<IEnumIDList>& pEnum,
_In_ HTREEITEM hItem,
_Out_opt_ IShellFolder **ppFolder = NULL);
BOOL _ItemHasAnyChild(_In_ HTREEITEM hItem);
HRESULT _AddFavorite();
// *** ATL message handlers ***
LRESULT OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
LRESULT OnKillFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
LRESULT OnCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
LRESULT OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
LRESULT OnTimer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
LRESULT OnShellEvent(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
BEGIN_MSG_MAP(CNSCBand)
MESSAGE_HANDLER(WM_CREATE, OnCreate)
MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
MESSAGE_HANDLER(WM_SIZE, OnSize)
MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
MESSAGE_HANDLER(WM_KILLFOCUS, OnKillFocus)
MESSAGE_HANDLER(WM_COMMAND, OnCommand)
MESSAGE_HANDLER(WM_NOTIFY, OnNotify)
MESSAGE_HANDLER(WM_TIMER, OnTimer)
MESSAGE_HANDLER(WM_CONTEXTMENU, OnContextMenu)
MESSAGE_HANDLER(WM_USER_SHELLEVENT, OnShellEvent)
END_MSG_MAP()
};
#endif // def __cplusplus

View file

@ -506,7 +506,7 @@ DECLARE_INTERFACE_(IBandNavigate, IUnknown)
STDMETHOD_(ULONG,AddRef)(THIS) PURE;
STDMETHOD_(ULONG,Release)(THIS) PURE;
/*** IBandNavigate ***/
STDMETHOD(Select)(THIS_ long paramC) PURE;
STDMETHOD(Select)(THIS_ LPCITEMIDLIST pidl) PURE;
};
#undef INTERFACE
@ -528,7 +528,7 @@ DECLARE_INTERFACE_(INamespaceProxy, IUnknown)
STDMETHOD_(ULONG,AddRef)(THIS) PURE;
STDMETHOD_(ULONG,Release)(THIS) PURE;
/*** INamespaceProxy ***/
STDMETHOD(GetNavigateTarget)(THIS_ _In_ PCIDLIST_ABSOLUTE pidl, _Out_ PIDLIST_ABSOLUTE ppidlTarget, _Out_ ULONG *pulAttrib) PURE;
STDMETHOD(GetNavigateTarget)(THIS_ _In_ PCIDLIST_ABSOLUTE pidl, _Out_ PIDLIST_ABSOLUTE *ppidlTarget, _Out_ ULONG *pulAttrib) PURE;
STDMETHOD(Invoke)(THIS_ _In_ PCIDLIST_ABSOLUTE pidl) PURE;
STDMETHOD(OnSelectionChanged)(THIS_ _In_ PCIDLIST_ABSOLUTE pidl) PURE;
STDMETHOD(RefreshFlags)(THIS_ _Out_ DWORD *pdwStyle, _Out_ DWORD *pdwExStyle, _Out_ DWORD *dwEnum) PURE;