mirror of
https://github.com/reactos/reactos.git
synced 2025-02-22 08:25:03 +00:00
[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:
parent
1061e7f7db
commit
7ede534910
8 changed files with 2050 additions and 2249 deletions
File diff suppressed because it is too large
Load diff
|
@ -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
|
||||
};
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
1487
dll/win32/shdocvw/CNSCBand.cpp
Normal file
1487
dll/win32/shdocvw/CNSCBand.cpp
Normal file
File diff suppressed because it is too large
Load diff
231
dll/win32/shdocvw/CNSCBand.h
Normal file
231
dll/win32/shdocvw/CNSCBand.h
Normal 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
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue