4 * Copyright 2016 Sylvain Deverre <deverre dot sylv at gmail dot com>
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 #define WM_USER_SHELLEVENT WM_USER+88
24 #define WM_USER_FOLDEREVENT WM_USER+88
27 public CComCoClass
<CExplorerBand
, &CLSID_ExplorerBand
>,
28 public CComObjectRootEx
<CComMultiThreadModelNoCS
>,
30 public IObjectWithSite
,
32 public IPersistStream
,
33 public IOleCommandTarget
,
34 public IServiceProvider
,
36 public IWinEventHandler
,
37 public INamespaceProxy
,
41 public CWindowImpl
<CExplorerBand
, CWindow
, CControlWinTraits
>
48 LPITEMIDLIST absolutePidl
;
49 LPITEMIDLIST relativePidl
;
53 // *** BaseBarSite information ***
54 CComPtr
<IUnknown
> pSite
;
55 CComPtr
<IShellFolder
> pDesktop
;
57 // *** tree explorer band stuff ***
62 HIMAGELIST hImageList
;
64 HTREEITEM oldSelected
;
65 LPITEMIDLIST pidlCurrent
;
67 // *** notification cookies ***
71 // *** Drop target information ***
72 CComPtr
<IDropTarget
> pDropTarget
;
73 HTREEITEM childTargetNode
;
74 CComPtr
<IDataObject
> pCurObject
;
76 void InitializeExplorerBand();
77 void DestroyExplorerBand();
78 HRESULT
ExecuteCommand(CComPtr
<IContextMenu
>& menu
, UINT nCmd
);
80 // *** notifications handling ***
81 BOOL
OnTreeItemExpanding(LPNMTREEVIEW pnmtv
);
82 void OnSelectionChanged(LPNMTREEVIEW pnmtv
);
83 BOOL
OnTreeItemDeleted(LPNMTREEVIEW pnmtv
);
84 void OnTreeItemDragging(LPNMTREEVIEW pnmtv
, BOOL isRightClick
);
86 // *** ATL event handlers ***
87 LRESULT
OnContextMenu(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
88 LRESULT
ContextMenuHack(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
89 LRESULT
OnShellEvent(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
90 LRESULT
OnSetFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
91 LRESULT
OnKillFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
93 // *** Helper functions ***
94 NodeInfo
* GetNodeInfo(HTREEITEM hItem
);
95 HRESULT
UpdateBrowser(LPITEMIDLIST pidlGoto
);
96 HTREEITEM
InsertItem(HTREEITEM hParent
, IShellFolder
*psfParent
, LPITEMIDLIST pElt
, LPITEMIDLIST pEltRelative
, BOOL bSort
);
97 HTREEITEM
InsertItem(HTREEITEM hParent
, LPITEMIDLIST pElt
, LPITEMIDLIST pEltRelative
, BOOL bSort
);
98 BOOL
InsertSubitems(HTREEITEM hItem
, NodeInfo
*pNodeInfo
);
99 BOOL
NavigateToPIDL(LPITEMIDLIST dest
, HTREEITEM
*item
, BOOL bExpand
, BOOL bInsert
, BOOL bSelect
);
100 BOOL
DeleteItem(LPITEMIDLIST toDelete
);
101 BOOL
RenameItem(HTREEITEM toRename
, LPITEMIDLIST newPidl
);
102 BOOL
RefreshTreePidl(HTREEITEM tree
, LPITEMIDLIST pidlParent
);
103 BOOL
NavigateToCurrentFolder();
105 // *** Tree item sorting callback ***
106 static int CALLBACK
CompareTreeItems(LPARAM p1
, LPARAM p2
, LPARAM p3
);
110 virtual ~CExplorerBand();
112 // *** IOleWindow methods ***
113 virtual HRESULT STDMETHODCALLTYPE
GetWindow(HWND
*lphwnd
);
114 virtual HRESULT STDMETHODCALLTYPE
ContextSensitiveHelp(BOOL fEnterMode
);
116 // *** IDockingWindow methods ***
117 virtual HRESULT STDMETHODCALLTYPE
CloseDW(DWORD dwReserved
);
118 virtual HRESULT STDMETHODCALLTYPE
ResizeBorderDW(const RECT
*prcBorder
, IUnknown
*punkToolbarSite
, BOOL fReserved
);
119 virtual HRESULT STDMETHODCALLTYPE
ShowDW(BOOL fShow
);
121 // *** IDeskBand methods ***
122 virtual HRESULT STDMETHODCALLTYPE
GetBandInfo(DWORD dwBandID
, DWORD dwViewMode
, DESKBANDINFO
*pdbi
);
124 // *** IObjectWithSite methods ***
125 virtual HRESULT STDMETHODCALLTYPE
SetSite(IUnknown
*pUnkSite
);
126 virtual HRESULT STDMETHODCALLTYPE
GetSite(REFIID riid
, void **ppvSite
);
128 // *** IOleCommandTarget methods ***
129 virtual HRESULT STDMETHODCALLTYPE
QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
, OLECMD prgCmds
[], OLECMDTEXT
*pCmdText
);
130 virtual HRESULT STDMETHODCALLTYPE
Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
);
132 // *** IServiceProvider methods ***
133 virtual HRESULT STDMETHODCALLTYPE
QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
);
135 // *** IInputObject methods ***
136 virtual HRESULT STDMETHODCALLTYPE
UIActivateIO(BOOL fActivate
, LPMSG lpMsg
);
137 virtual HRESULT STDMETHODCALLTYPE
HasFocusIO();
138 virtual HRESULT STDMETHODCALLTYPE
TranslateAcceleratorIO(LPMSG lpMsg
);
140 // *** IPersist methods ***
141 virtual HRESULT STDMETHODCALLTYPE
GetClassID(CLSID
*pClassID
);
143 // *** IPersistStream methods ***
144 virtual HRESULT STDMETHODCALLTYPE
IsDirty();
145 virtual HRESULT STDMETHODCALLTYPE
Load(IStream
*pStm
);
146 virtual HRESULT STDMETHODCALLTYPE
Save(IStream
*pStm
, BOOL fClearDirty
);
147 virtual HRESULT STDMETHODCALLTYPE
GetSizeMax(ULARGE_INTEGER
*pcbSize
);
149 // *** IWinEventHandler methods ***
150 virtual HRESULT STDMETHODCALLTYPE
OnWinEvent(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*theResult
);
151 virtual HRESULT STDMETHODCALLTYPE
IsWindowOwner(HWND hWnd
);
153 // *** IBandNavigate methods ***
154 virtual HRESULT STDMETHODCALLTYPE
Select(long paramC
);
156 // *** INamespaceProxy ***
157 virtual HRESULT STDMETHODCALLTYPE
GetNavigateTarget(long paramC
, long param10
, long param14
);
158 virtual HRESULT STDMETHODCALLTYPE
Invoke(long paramC
);
159 virtual HRESULT STDMETHODCALLTYPE
OnSelectionChanged(long paramC
);
160 virtual HRESULT STDMETHODCALLTYPE
RefreshFlags(long paramC
, long param10
, long param14
);
161 virtual HRESULT STDMETHODCALLTYPE
CacheItem(long paramC
);
163 // *** IDispatch methods ***
164 virtual HRESULT STDMETHODCALLTYPE
GetTypeInfoCount(UINT
*pctinfo
);
165 virtual HRESULT STDMETHODCALLTYPE
GetTypeInfo(UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
);
166 virtual HRESULT STDMETHODCALLTYPE
GetIDsOfNames(REFIID riid
, LPOLESTR
*rgszNames
, UINT cNames
, LCID lcid
, DISPID
*rgDispId
);
167 virtual HRESULT STDMETHODCALLTYPE
Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
);
169 // *** IDropTarget methods ***
170 virtual HRESULT STDMETHODCALLTYPE
DragEnter(IDataObject
*pObj
, DWORD glfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
171 virtual HRESULT STDMETHODCALLTYPE
DragOver(DWORD glfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
172 virtual HRESULT STDMETHODCALLTYPE
DragLeave();
173 virtual HRESULT STDMETHODCALLTYPE
Drop(IDataObject
*pObj
, DWORD glfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
175 // *** IDropSource methods ***
176 virtual HRESULT STDMETHODCALLTYPE
QueryContinueDrag(BOOL fEscapePressed
, DWORD grfKeyState
);
177 virtual HRESULT STDMETHODCALLTYPE
GiveFeedback(DWORD dwEffect
);
179 DECLARE_REGISTRY_RESOURCEID(IDR_EXPLORERBAND
)
180 DECLARE_NOT_AGGREGATABLE(CExplorerBand
)
182 DECLARE_PROTECT_FINAL_CONSTRUCT()
184 BEGIN_COM_MAP(CExplorerBand
)
185 COM_INTERFACE_ENTRY_IID(IID_IDispatch
, IDispatch
)
186 COM_INTERFACE_ENTRY_IID(IID_IWinEventHandler
, IWinEventHandler
)
187 COM_INTERFACE_ENTRY_IID(IID_IBandNavigate
, IBandNavigate
)
188 COM_INTERFACE_ENTRY_IID(IID_INamespaceProxy
, INamespaceProxy
)
189 COM_INTERFACE_ENTRY2_IID(IID_IOleWindow
, IOleWindow
, IDeskBand
)
190 COM_INTERFACE_ENTRY2_IID(IID_IDockingWindow
, IDockingWindow
, IDeskBand
)
191 COM_INTERFACE_ENTRY_IID(IID_IDeskBand
, IDeskBand
)
192 COM_INTERFACE_ENTRY_IID(IID_IObjectWithSite
, IObjectWithSite
)
193 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget
, IOleCommandTarget
)
194 COM_INTERFACE_ENTRY_IID(IID_IServiceProvider
, IServiceProvider
)
195 COM_INTERFACE_ENTRY_IID(IID_IInputObject
, IInputObject
)
196 COM_INTERFACE_ENTRY2_IID(IID_IPersist
, IPersist
, IPersistStream
)
197 COM_INTERFACE_ENTRY_IID(IID_IPersistStream
, IPersistStream
)
200 BEGIN_MSG_MAP(CExplorerBand
)
201 MESSAGE_HANDLER(WM_CONTEXTMENU
, OnContextMenu
)
202 MESSAGE_HANDLER(WM_USER_SHELLEVENT
, OnShellEvent
)
203 MESSAGE_HANDLER(WM_RBUTTONDOWN
, ContextMenuHack
)
204 MESSAGE_HANDLER(WM_SETFOCUS
, OnSetFocus
)
205 // MESSAGE_HANDLER(WM_KILLFOCUS, OnKillFocus)