ReactOS 0.4.15-dev-8434-g155a7c7
CExplorerBand Class Reference

#include <explorerband.h>

Inheritance diagram for CExplorerBand:
Collaboration diagram for CExplorerBand:

Classes

class  NodeInfo
 

Public Member Functions

 CExplorerBand ()
 
virtual ~CExplorerBand ()
 
STDMETHOD() GetWindow (HWND *lphwnd) override
 
STDMETHOD() ContextSensitiveHelp (BOOL fEnterMode) override
 
STDMETHOD() CloseDW (DWORD dwReserved) override
 
STDMETHOD() ResizeBorderDW (const RECT *prcBorder, IUnknown *punkToolbarSite, BOOL fReserved) override
 
STDMETHOD() ShowDW (BOOL fShow) override
 
STDMETHOD() GetBandInfo (DWORD dwBandID, DWORD dwViewMode, DESKBANDINFO *pdbi) override
 
STDMETHOD() SetSite (IUnknown *pUnkSite) override
 
STDMETHOD() GetSite (REFIID riid, void **ppvSite) override
 
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
 
STDMETHOD() QueryService (REFGUID guidService, REFIID riid, void **ppvObject) override
 
STDMETHOD() UIActivateIO (BOOL fActivate, LPMSG lpMsg) override
 
STDMETHOD() HasFocusIO () override
 
STDMETHOD() TranslateAcceleratorIO (LPMSG lpMsg) override
 
STDMETHOD() GetClassID (CLSID *pClassID) override
 
STDMETHOD() IsDirty () override
 
STDMETHOD() Load (IStream *pStm) override
 
STDMETHOD() Save (IStream *pStm, BOOL fClearDirty) override
 
STDMETHOD() GetSizeMax (ULARGE_INTEGER *pcbSize) override
 
STDMETHOD() OnWinEvent (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult) override
 
STDMETHOD() IsWindowOwner (HWND hWnd) override
 
STDMETHOD() Select (long paramC) override
 
STDMETHOD() GetNavigateTarget (_In_ PCIDLIST_ABSOLUTE pidl, _Out_ PIDLIST_ABSOLUTE ppidlTarget, _Out_ ULONG *pulAttrib) override
 Returns the ITEMIDLIST that should be navigated when an item is invoked.
 
STDMETHOD() Invoke (_In_ PCIDLIST_ABSOLUTE pidl) override
 Handles a user action on an item.
 
STDMETHOD() OnSelectionChanged (_In_ PCIDLIST_ABSOLUTE pidl) override
 Called when the user has selected an item.
 
STDMETHOD() RefreshFlags (_Out_ DWORD *pdwStyle, _Out_ DWORD *pdwExStyle, _Out_ DWORD *dwEnum) override
 Returns flags used to update the tree control.
 
STDMETHOD() CacheItem (_In_ PCIDLIST_ABSOLUTE pidl) override
 
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
 
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
 
STDMETHOD() QueryContinueDrag (BOOL fEscapePressed, DWORD grfKeyState) override
 
STDMETHOD() GiveFeedback (DWORD dwEffect) override
 
- Public Member Functions inherited from ATL::CComObjectRootEx< CComMultiThreadModelNoCS >
 ~CComObjectRootEx ()
 
ULONG InternalAddRef ()
 
ULONG InternalRelease ()
 
void Lock ()
 
void Unlock ()
 
HRESULT _AtlInitialConstruct ()
 
- Public Member Functions inherited from ATL::CComObjectRootBase
 CComObjectRootBase ()
 
 ~CComObjectRootBase ()
 
void SetVoid (void *)
 
HRESULT _AtlFinalConstruct ()
 
HRESULT FinalConstruct ()
 
void InternalFinalConstructAddRef ()
 
void InternalFinalConstructRelease ()
 
void FinalRelease ()
 
HRESULT GetBandInfo ([in] DWORD dwBandID, [in] DWORD dwViewMode, [in, out] DESKBANDINFO *pdbi)
 
- Public Member Functions inherited from IDockingWindow
HRESULT ShowDW ([in] BOOL fShow)
 
HRESULT CloseDW ([in] DWORD dwReserved)
 
HRESULT ResizeBorderDW ([in] LPCRECT prcBorder, [in] IUnknown *punkToolbarSite, [in] BOOL fReserved)
 
HRESULT GetWindow ([out] HWND *phwnd)
 
HRESULT ContextSensitiveHelp ([in] BOOL fEnterMode)
 
- Public Member Functions inherited from IUnknown
HRESULT QueryInterface ([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
 
ULONG AddRef ()
 
ULONG Release ()
 
- Public Member Functions inherited from IObjectWithSite
HRESULT SetSite ([in] IUnknown *pUnkSite)
 
HRESULT GetSite ([in] REFIID riid, [out, iid_is(riid)] PVOID *ppvSite)
 
HRESULT IsDirty ()
 
HRESULT Load ([in, unique] IStream *pStm)
 
HRESULT Save ([in, unique] IStream *pStm, [in] BOOL fClearDirty)
 
HRESULT GetSizeMax ([out] ULARGE_INTEGER *pcbSize)
 
HRESULT GetClassID ([out] CLSID *pClassID)
 
HRESULT QueryStatus ([in, unique] const GUID *pguidCmdGroup, [in] ULONG cCmds, [in, out, size_is(cCmds)] OLECMD prgCmds[], [in, out, unique] OLECMDTEXT *pCmdText)
 
HRESULT Exec ([in, unique] const GUID *pguidCmdGroup, [in] DWORD nCmdID, [in] DWORD nCmdexecopt, [in, unique] VARIANT *pvaIn, [in, out, unique] VARIANT *pvaOut)
 
- Public Member Functions inherited from IServiceProvider
HRESULT QueryService ([in] REFGUID guidService, [in] REFIID riid, [out] void **ppvObject)
 
HRESULT RemoteQueryService ([in] REFGUID guidService, [in] REFIID riid, [out, iid_is(riid)] IUnknown **ppvObject)
 
- Public Member Functions inherited from IDispatch
HRESULT GetTypeInfoCount ([out] UINT *pctinfo)
 
HRESULT GetTypeInfo ([in] UINT iTInfo, [in] LCID lcid, [out] ITypeInfo **ppTInfo)
 
HRESULT GetIDsOfNames ([in] REFIID riid, [in, size_is(cNames)] LPOLESTR *rgszNames, [in] UINT cNames, [in] LCID lcid, [out, size_is(cNames)] DISPID *rgDispId)
 
HRESULT Invoke ([in] DISPID dispIdMember, [in] REFIID riid, [in] LCID lcid, [in] WORD wFlags, [in, out] DISPPARAMS *pDispParams, [out] VARIANT *pVarResult, [out] EXCEPINFO *pExcepInfo, [out] UINT *puArgErr)
 
HRESULT RemoteInvoke ([in] DISPID dispIdMember, [in] REFIID riid, [in] LCID lcid, [in] DWORD dwFlags, [in] DISPPARAMS *pDispParams, [out] VARIANT *pVarResult, [out] EXCEPINFO *pExcepInfo, [out] UINT *pArgErr, [in] UINT cVarRef, [in, size_is(cVarRef)] UINT *rgVarRefIdx, [in, out, size_is(cVarRef)] VARIANTARG *rgVarRef)
 
HRESULT QueryContinueDrag ([in] BOOL fEscapePressed, [in] DWORD grfKeyState)
 
HRESULT GiveFeedback ([in] DWORD dwEffect)
 
HRESULT DragEnter ([in, unique] IDataObject *pDataObj, [in] DWORD grfKeyState, [in] POINTL pt, [in, out] DWORD *pdwEffect)
 
HRESULT DragOver ([in] DWORD grfKeyState, [in] POINTL pt, [in, out] DWORD *pdwEffect)
 
HRESULT DragLeave ()
 
HRESULT Drop ([in, unique] IDataObject *pDataObj, [in] DWORD grfKeyState, [in] POINTL pt, [in, out] DWORD *pdwEffect)
 

Private Member Functions

void InitializeExplorerBand ()
 
void DestroyExplorerBand ()
 
HRESULT ExecuteCommand (CComPtr< IContextMenu > &menu, UINT nCmd)
 
BOOL OnTreeItemExpanding (LPNMTREEVIEW pnmtv)
 
void OnSelectionChanged (LPNMTREEVIEW pnmtv)
 
BOOL OnTreeItemDeleted (LPNMTREEVIEW pnmtv)
 
void OnTreeItemDragging (LPNMTREEVIEW pnmtv, BOOL isRightClick)
 
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)
 
NodeInfoGetNodeInfo (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)
 

Static Private Member Functions

static int CALLBACK CompareTreeItems (LPARAM p1, LPARAM p2, LPARAM p3)
 

Private Attributes

CComPtr< IUnknownm_pSite
 
CComPtr< IShellFolderm_pDesktop
 
BOOL m_fVisible
 
BYTE m_mtxBlockNavigate
 
BOOL m_bFocused
 
DWORD m_dwBandID
 
BOOL m_isEditing
 
HIMAGELIST m_hImageList
 
HTREEITEM m_hRoot
 
HTREEITEM m_oldSelected
 
LPITEMIDLIST m_pidlCurrent
 
DWORD m_adviseCookie
 
ULONG m_shellRegID
 
CComPtr< IDropTargetm_pDropTarget
 
HTREEITEM m_childTargetNode
 
CComPtr< IDataObjectm_pCurObject
 

Additional Inherited Members

- Public Types inherited from IOleWindow
typedef IOleWindowLPOLEWINDOW
 
- Public Types inherited from IUnknown
typedef IUnknownLPUNKNOWN
 
- Public Types inherited from IObjectWithSite
typedef IObjectWithSiteLPOBJECTWITHSITE
 
- Public Types inherited from IPersistStream
typedef IPersistStreamLPPERSISTSTREAM
 
- Public Types inherited from IPersist
typedef IPersistLPPERSIST
 
- Public Types inherited from IOleCommandTarget
enum  OLECMDF {
  OLECMDF_SUPPORTED = 0x1 , OLECMDF_ENABLED = 0x2 , OLECMDF_LATCHED = 0x4 , OLECMDF_NINCHED = 0x8 ,
  OLECMDF_INVISIBLE = 0x10 , OLECMDF_DEFHIDEONCTXTMENU = 0x20
}
 
enum  OLECMDTEXTF { OLECMDTEXTF_NONE = 0 , OLECMDTEXTF_NAME = 1 , OLECMDTEXTF_STATUS = 2 }
 
enum  OLECMDEXECOPT { OLECMDEXECOPT_DODEFAULT = 0 , OLECMDEXECOPT_PROMPTUSER = 1 , OLECMDEXECOPT_DONTPROMPTUSER = 2 , OLECMDEXECOPT_SHOWHELP = 3 }
 
enum  OLECMDID {
  OLECMDID_OPEN = 1 , OLECMDID_NEW = 2 , OLECMDID_SAVE = 3 , OLECMDID_SAVEAS = 4 ,
  OLECMDID_SAVECOPYAS = 5 , OLECMDID_PRINT = 6 , OLECMDID_PRINTPREVIEW = 7 , OLECMDID_PAGESETUP = 8 ,
  OLECMDID_SPELL = 9 , OLECMDID_PROPERTIES = 10 , OLECMDID_CUT = 11 , OLECMDID_COPY = 12 ,
  OLECMDID_PASTE = 13 , OLECMDID_PASTESPECIAL = 14 , OLECMDID_UNDO = 15 , OLECMDID_REDO = 16 ,
  OLECMDID_SELECTALL = 17 , OLECMDID_CLEARSELECTION = 18 , OLECMDID_ZOOM = 19 , OLECMDID_GETZOOMRANGE = 20 ,
  OLECMDID_UPDATECOMMANDS = 21 , OLECMDID_REFRESH = 22 , OLECMDID_STOP = 23 , OLECMDID_HIDETOOLBARS = 24 ,
  OLECMDID_SETPROGRESSMAX = 25 , OLECMDID_SETPROGRESSPOS = 26 , OLECMDID_SETPROGRESSTEXT = 27 , OLECMDID_SETTITLE = 28 ,
  OLECMDID_SETDOWNLOADSTATE = 29 , OLECMDID_STOPDOWNLOAD = 30 , OLECMDID_ONTOOLBARACTIVATED = 31 , OLECMDID_FIND = 32 ,
  OLECMDID_DELETE = 33 , OLECMDID_HTTPEQUIV = 34 , OLECMDID_HTTPEQUIV_DONE = 35 , OLECMDID_ENABLE_INTERACTION = 36 ,
  OLECMDID_ONUNLOAD = 37 , OLECMDID_PROPERTYBAG2 = 38 , OLECMDID_PREREFRESH = 39 , OLECMDID_SHOWSCRIPTERROR = 40 ,
  OLECMDID_SHOWMESSAGE = 41 , OLECMDID_SHOWFIND = 42 , OLECMDID_SHOWPAGESETUP = 43 , OLECMDID_SHOWPRINT = 44 ,
  OLECMDID_CLOSE = 45 , OLECMDID_ALLOWUILESSSAVEAS = 46 , OLECMDID_DONTDOWNLOADCSS = 47 , OLECMDID_UPDATEPAGESTATUS = 48 ,
  OLECMDID_PRINT2 = 49 , OLECMDID_PRINTPREVIEW2 = 50 , OLECMDID_SETPRINTTEMPLATE = 51 , OLECMDID_GETPRINTTEMPLATE = 52 ,
  OLECMDID_PAGEACTIONBLOCKED = 55 , OLECMDID_PAGEACTIONUIQUERY = 56 , OLECMDID_FOCUSVIEWCONTROLS = 57 , OLECMDID_FOCUSVIEWCONTROLSQUERY = 58 ,
  OLECMDID_SHOWPAGEACTIONMENU = 59 , OLECMDID_ADDTRAVELENTRY = 60 , OLECMDID_UPDATETRAVELENTRY = 61 , OLECMDID_UPDATEBACKFORWARDSTATE = 62 ,
  OLECMDID_OPTICAL_ZOOM = 63 , OLECMDID_OPTICAL_GETZOOMRANGE = 64 , OLECMDID_WINDOWSTATECHANGED = 65 , OLECMDID_ACTIVEXINSTALLSCOPE = 66 ,
  OLECMDID_UPDATETRAVELENTRY_DATARECOVERY = 67 , OLECMDID_SHOWTASKDLG = 68 , OLECMDID_POPSTATEEVENT = 69 , OLECMDID_VIEWPORT_MODE = 70 ,
  OLECMDID_LAYOUT_VIEWPORT_WIDTH = 71 , OLECMDID_VISUAL_VIEWPORT_EXCLUDE_BOTTOM = 72 , OLECMDID_USER_OPTICAL_ZOOM = 73 , OLECMDID_PAGEAVAILABLE = 74 ,
  OLECMDID_GETUSERSCALABLE = 75 , OLECMDID_UPDATE_CARET = 76 , OLECMDID_ENABLE_VISIBILITY = 77 , OLECMDID_MEDIA_PLAYBACK = 78
}
 
typedef IOleCommandTargetLPOLECOMMANDTARGET
 
typedef enum IOleCommandTarget::OLECMDF OLECMDF
 
typedef struct IOleCommandTarget::_tagOLECMD OLECMD
 
typedef struct IOleCommandTarget::_tagOLECMDTEXT OLECMDTEXT
 
typedef enum IOleCommandTarget::OLECMDTEXTF OLECMDTEXTF
 
typedef enum IOleCommandTarget::OLECMDEXECOPT OLECMDEXECOPT
 
typedef enum IOleCommandTarget::OLECMDID OLECMDID
 
- Public Types inherited from IServiceProvider
typedef IServiceProviderLPSERVICEPROVIDER
 
- Public Types inherited from IDispatch
typedef IDispatchLPDISPATCH
 
- Public Types inherited from IDropSource
typedef IDropSourceLPDROPSOURCE
 
- Public Types inherited from IDropTarget
typedef IDropTargetLPDROPTARGET
 
- Static Public Member Functions inherited from ATL::CComObjectRootBase
static void WINAPI ObjectMain (bool)
 
static const struct _ATL_CATMAP_ENTRYGetCategoryMap ()
 
static HRESULT WINAPI InternalQueryInterface (void *pThis, const _ATL_INTMAP_ENTRY *pEntries, REFIID iid, void **ppvObject)
 
- Public Attributes inherited from ATL::CComObjectRootBase
LONG m_dwRef
 
- Public Attributes inherited from IDispatch
const DISPID DISPID_UNKNOWN = -1
 
const DISPID DISPID_VALUE = 0
 
const DISPID DISPID_PROPERTYPUT = -3
 
const DISPID DISPID_NEWENUM = -4
 
const DISPID DISPID_EVALUATE = -5
 
const DISPID DISPID_CONSTRUCTOR = -6
 
const DISPID DISPID_DESTRUCTOR = -7
 
const DISPID DISPID_COLLECT = -8
 
- Public Attributes inherited from IDropTarget
const DWORD MK_ALT = 0x20
 
const DWORD DROPEFFECT_NONE = 0
 
const DWORD DROPEFFECT_COPY = 1
 
const DWORD DROPEFFECT_MOVE = 2
 
const DWORD DROPEFFECT_LINK = 4
 
const DWORD DROPEFFECT_SCROLL = 0x80000000
 
const DWORD DD_DEFSCROLLINSET = 11
 
const DWORD DD_DEFSCROLLDELAY = 50
 
const DWORD DD_DEFSCROLLINTERVAL = 50
 
const DWORD DD_DEFDRAGDELAY = 200
 
const DWORD DD_DEFDRAGMINDIST = 2
 

Detailed Description

Definition at line 13 of file explorerband.h.

Constructor & Destructor Documentation

◆ CExplorerBand()

CExplorerBand::CExplorerBand ( )

Definition at line 72 of file explorerband.cpp.

73 : m_pSite(NULL)
76 , m_dwBandID(0)
79{
80}
BYTE m_mtxBlockNavigate
Definition: explorerband.h:45
DWORD m_dwBandID
Definition: explorerband.h:47
LPITEMIDLIST m_pidlCurrent
Definition: explorerband.h:52
CComPtr< IUnknown > m_pSite
Definition: explorerband.h:40
#define NULL
Definition: types.h:112
#define FALSE
Definition: types.h:117

◆ ~CExplorerBand()

CExplorerBand::~CExplorerBand ( )
virtual

Definition at line 82 of file explorerband.cpp.

83{
84 if (m_pidlCurrent)
85 {
87 }
88}
void WINAPI ILFree(LPITEMIDLIST pidl)
Definition: pidl.c:940

Member Function Documentation

◆ CacheItem()

STDMETHODIMP CExplorerBand::CacheItem ( _In_ PCIDLIST_ABSOLUTE  pidl)
override

Definition at line 1493 of file explorerband.cpp.

1494{
1496 return E_NOTIMPL;
1497}
#define UNIMPLEMENTED
Definition: debug.h:118
#define E_NOTIMPL
Definition: ddrawi.h:99

◆ CloseDW()

HRESULT STDMETHODCALLTYPE CExplorerBand::CloseDW ( DWORD  dwReserved)
override

Implements IDockingWindow.

Definition at line 1089 of file explorerband.cpp.

1090{
1091 // We do nothing, we don't have anything to save yet
1092 TRACE("CloseDW called\n");
1093 return S_OK;
1094}
#define S_OK
Definition: intsafe.h:52
#define TRACE(s)
Definition: solgame.cpp:4

◆ CompareTreeItems()

int CALLBACK CExplorerBand::CompareTreeItems ( LPARAM  p1,
LPARAM  p2,
LPARAM  p3 
)
staticprivate

Definition at line 1019 of file explorerband.cpp.

1020{
1021 /*
1022 * We first sort drive letters (Path root), then PIDLs and then regular folder
1023 * display name.
1024 * This is not how Windows sorts item, but it gives decent results.
1025 */
1026 NodeInfo *info1;
1027 NodeInfo *info2;
1028 CExplorerBand *pThis;
1029 WCHAR wszFolder1[MAX_PATH];
1030 WCHAR wszFolder2[MAX_PATH];
1031
1032 info1 = (NodeInfo*)p1;
1033 info2 = (NodeInfo*)p2;
1034 pThis = (CExplorerBand*)p3;
1035
1036 GetDisplayName(info1->absolutePidl, wszFolder1, MAX_PATH, SHGDN_FORPARSING);
1037 GetDisplayName(info2->absolutePidl, wszFolder2, MAX_PATH, SHGDN_FORPARSING);
1038 if (PathIsRoot(wszFolder1) && PathIsRoot(wszFolder2))
1039 {
1040 return lstrcmpiW(wszFolder1,wszFolder2);
1041 }
1042 if (PathIsRoot(wszFolder1) && !PathIsRoot(wszFolder2))
1043 {
1044 return -1;
1045 }
1046 if (!PathIsRoot(wszFolder1) && PathIsRoot(wszFolder2))
1047 {
1048 return 1;
1049 }
1050 // Now, we compare non-root folders, grab display name
1051 GetDisplayName(info1->absolutePidl, wszFolder1, MAX_PATH, SHGDN_INFOLDER);
1052 GetDisplayName(info2->absolutePidl, wszFolder2, MAX_PATH, SHGDN_INFOLDER);
1053
1054 if (_ILIsSpecialFolder(info1->relativePidl) && !_ILIsSpecialFolder(info2->relativePidl))
1055 {
1056 return -1;
1057 }
1058 if (!_ILIsSpecialFolder(info1->relativePidl) && _ILIsSpecialFolder(info2->relativePidl))
1059 {
1060 return 1;
1061 }
1062 if (_ILIsSpecialFolder(info1->relativePidl) && !_ILIsSpecialFolder(info2->relativePidl))
1063 {
1064 HRESULT hr;
1065 hr = pThis->m_pDesktop->CompareIDs(0, info1->absolutePidl, info2->absolutePidl);
1066 if (!hr) return 0;
1067 return (hr > 0) ? -1 : 1;
1068 }
1069 return StrCmpLogicalW(wszFolder1, wszFolder2);
1070}
BOOL GetDisplayName(LPCTSTR ServiceName)
Definition: name.c:12
CComPtr< IShellFolder > m_pDesktop
Definition: explorerband.h:41
#define MAX_PATH
Definition: compat.h:34
int WINAPI lstrcmpiW(LPCWSTR str1, LPCWSTR str2)
Definition: locale.c:4261
INT WINAPI StrCmpLogicalW(LPCWSTR lpszStr, LPCWSTR lpszComp)
Definition: string.c:2304
static BOOL _ILIsSpecialFolder(LPCITEMIDLIST pidl)
HRESULT hr
Definition: shlfolder.c:183
#define PathIsRoot
Definition: shlwapi.h:955
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by InsertItem(), and InsertSubitems().

◆ ContextMenuHack()

LRESULT CExplorerBand::ContextMenuHack ( UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)
private

Definition at line 491 of file explorerband.cpp.

492{
493 bHandled = FALSE;
494 if (uMsg == WM_RBUTTONDOWN)
495 {
497 info.pt.x = LOWORD(lParam);
498 info.pt.y = HIWORD(lParam);
499 info.flags = TVHT_ONITEM;
500 info.hItem = NULL;
501
502 // Save the current location
504
505 // Move to the item selected by the treeview (don't change right pane)
506 TreeView_HitTest(m_hWnd, &info);
508 TreeView_SelectItem(m_hWnd, info.hItem);
510 }
511 return FALSE; /* let the wndproc process the message */
512}
HTREEITEM m_oldSelected
Definition: explorerband.h:51
LPARAM lParam
Definition: combotst.c:139
#define LOWORD(l)
Definition: pedump.c:82
#define TreeView_SelectItem(hwnd, hitem)
Definition: commctrl.h:3481
#define TVHT_ONITEM
Definition: commctrl.h:3527
#define TreeView_GetSelection(hwnd)
Definition: commctrl.h:3473
#define TreeView_HitTest(hwnd, lpht)
Definition: commctrl.h:3513
#define HIWORD(l)
Definition: typedefs.h:247
#define WM_RBUTTONDOWN
Definition: winuser.h:1779

◆ ContextSensitiveHelp()

HRESULT STDMETHODCALLTYPE CExplorerBand::ContextSensitiveHelp ( BOOL  fEnterMode)
override

Implements IOleWindow.

Definition at line 1081 of file explorerband.cpp.

1082{
1084 return E_NOTIMPL;
1085}

◆ DestroyExplorerBand()

void CExplorerBand::DestroyExplorerBand ( )
private

Definition at line 156 of file explorerband.cpp.

157{
158 HRESULT hr;
159 CComPtr <IWebBrowser2> browserService;
160
161 TRACE("Cleaning up explorer band ...\n");
162
163 hr = IUnknown_QueryService(m_pSite, SID_SWebBrowserApp, IID_PPV_ARG(IWebBrowser2, &browserService));
165 return;
166
167 hr = AtlUnadvise(browserService, DIID_DWebBrowserEvents, m_adviseCookie);
168 /* Remove all items of the treeview */
169 RevokeDragDrop(m_hWnd);
172 m_hRoot = NULL;
173 TRACE("Cleanup done !\n");
174}
HTREEITEM m_hRoot
Definition: explorerband.h:50
DWORD m_adviseCookie
Definition: explorerband.h:55
HRESULT WINAPI AtlUnadvise(IUnknown *pUnkCP, const IID *iid, DWORD dw)
Definition: atl.c:73
#define FAILED_UNEXPECTEDLY(hr)
Definition: precomp.h:121
HRESULT WINAPI RevokeDragDrop(HWND hwnd)
Definition: ole2.c:639
HRESULT WINAPI IUnknown_QueryService(IUnknown *, REFGUID, REFIID, LPVOID *)
Definition: ordinal.c:1497
#define TreeView_DeleteAllItems(hwnd)
Definition: commctrl.h:3417
#define SID_SWebBrowserApp
Definition: shlguid.h:111
#define IID_PPV_ARG(Itype, ppType)

Referenced by SetSite().

◆ DragEnter()

HRESULT STDMETHODCALLTYPE CExplorerBand::DragEnter ( IDataObject pObj,
DWORD  glfKeyState,
POINTL  pt,
DWORD pdwEffect 
)
override

Implements IDropTarget.

Definition at line 1533 of file explorerband.cpp.

1534{
1535 ERR("Entering drag\n");
1536 m_pCurObject = pObj;
1538 return DragOver(glfKeyState, pt, pdwEffect);
1539}
#define ERR(fmt,...)
Definition: precomp.h:57
CComPtr< IDataObject > m_pCurObject
Definition: explorerband.h:61
STDMETHOD() DragOver(DWORD glfKeyState, POINTL pt, DWORD *pdwEffect) override
#define pt(x, y)
Definition: drawing.c:79

◆ DragLeave()

HRESULT STDMETHODCALLTYPE CExplorerBand::DragLeave ( void  )
override

Implements IDropTarget.

Definition at line 1619 of file explorerband.cpp.

1620{
1625 if (m_pCurObject)
1626 {
1628 }
1629 return S_OK;
1630}
HTREEITEM m_childTargetNode
Definition: explorerband.h:60

Referenced by Drop().

◆ DragOver()

HRESULT STDMETHODCALLTYPE CExplorerBand::DragOver ( DWORD  glfKeyState,
POINTL  pt,
DWORD pdwEffect 
)
override

Implements IDropTarget.

Definition at line 1541 of file explorerband.cpp.

1542{
1544 CComPtr<IShellFolder> pShellFldr;
1545 NodeInfo *nodeInfo;
1546 //LPCITEMIDLIST pChild;
1547 HRESULT hr;
1548
1549 info.pt.x = pt.x;
1550 info.pt.y = pt.y;
1551 info.flags = TVHT_ONITEM;
1552 info.hItem = NULL;
1553 ScreenToClient(&info.pt);
1554
1555 // Move to the item selected by the treeview (don't change right pane)
1556 TreeView_HitTest(m_hWnd, &info);
1557
1558 if (info.hItem)
1559 {
1561 TreeView_SelectItem(m_hWnd, info.hItem);
1563 // Delegate to shell folder
1564 if (m_pDropTarget && info.hItem != m_childTargetNode)
1565 {
1567 }
1568 if (info.hItem != m_childTargetNode)
1569 {
1570 nodeInfo = GetNodeInfo(info.hItem);
1571 if (!nodeInfo)
1572 return E_FAIL;
1573#if 0
1574 hr = SHBindToParent(nodeInfo->absolutePidl, IID_PPV_ARG(IShellFolder, &pShellFldr), &pChild);
1575 if (!SUCCEEDED(hr))
1576 return E_FAIL;
1577 hr = pShellFldr->GetUIObjectOf(m_hWnd, 1, &pChild, IID_IDropTarget, NULL, reinterpret_cast<void**>(&pDropTarget));
1578 if (!SUCCEEDED(hr))
1579 return E_FAIL;
1580#endif
1581 if(_ILIsDesktop(nodeInfo->absolutePidl))
1582 pShellFldr = m_pDesktop;
1583 else
1584 {
1585 hr = m_pDesktop->BindToObject(nodeInfo->absolutePidl, 0, IID_PPV_ARG(IShellFolder, &pShellFldr));
1586 if (!SUCCEEDED(hr))
1587 {
1588 /* Don't allow dnd since we couldn't get our folder object */
1589 ERR("Can't bind to folder object\n");
1590 *pdwEffect = DROPEFFECT_NONE;
1591 return E_FAIL;
1592 }
1593 }
1594 hr = pShellFldr->CreateViewObject(m_hWnd, IID_PPV_ARG(IDropTarget, &m_pDropTarget));
1595 if (!SUCCEEDED(hr))
1596 {
1597 /* Don't allow dnd since we couldn't get our drop target */
1598 ERR("Can't get drop target for folder object\n");
1599 *pdwEffect = DROPEFFECT_NONE;
1600 return E_FAIL;
1601 }
1602 hr = m_pDropTarget->DragEnter(m_pCurObject, glfKeyState, pt, pdwEffect);
1603 m_childTargetNode = info.hItem;
1604 }
1605 if (m_pDropTarget)
1606 {
1607 hr = m_pDropTarget->DragOver(glfKeyState, pt, pdwEffect);
1608 }
1609 }
1610 else
1611 {
1614 *pdwEffect = DROPEFFECT_NONE;
1615 }
1616 return S_OK;
1617}
BOOL _ILIsDesktop(LPCITEMIDLIST pidl)
Definition: CBandSite.h:24
NodeInfo * GetNodeInfo(HTREEITEM hItem)
CComPtr< IDropTarget > m_pDropTarget
Definition: explorerband.h:59
#define E_FAIL
Definition: ddrawi.h:102
const DWORD DROPEFFECT_NONE
Definition: oleidl.idl:929
#define SUCCEEDED(hr)
Definition: intsafe.h:50
HRESULT WINAPI SHBindToParent(LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppv, LPCITEMIDLIST *ppidlLast)
Definition: pidl.c:1350
BOOL WINAPI ScreenToClient(_In_ HWND, _Inout_ LPPOINT)

Referenced by DragEnter().

◆ Drop()

HRESULT STDMETHODCALLTYPE CExplorerBand::Drop ( IDataObject pObj,
DWORD  glfKeyState,
POINTL  pt,
DWORD pdwEffect 
)
override

Implements IDropTarget.

Definition at line 1632 of file explorerband.cpp.

1633{
1634 if (!m_pDropTarget)
1635 return E_FAIL;
1636 m_pDropTarget->Drop(pObj, glfKeyState, pt, pdwEffect);
1637 DragLeave();
1638 return S_OK;
1639}
STDMETHOD() DragLeave() override

◆ Exec()

HRESULT STDMETHODCALLTYPE CExplorerBand::Exec ( const GUID pguidCmdGroup,
DWORD  nCmdID,
DWORD  nCmdexecopt,
VARIANT pvaIn,
VARIANT pvaOut 
)
override

Implements IOleCommandTarget.

Definition at line 1231 of file explorerband.cpp.

1232{
1234 return E_NOTIMPL;
1235}

◆ ExecuteCommand()

HRESULT CExplorerBand::ExecuteCommand ( CComPtr< IContextMenu > &  menu,
UINT  nCmd 
)
private

Definition at line 232 of file explorerband.cpp.

233{
234 CComPtr<IOleWindow> pBrowserOleWnd;
235 CMINVOKECOMMANDINFO cmi;
236 HWND browserWnd;
237 HRESULT hr;
238
241 return hr;
242
243 hr = pBrowserOleWnd->GetWindow(&browserWnd);
245 return hr;
246
247 ZeroMemory(&cmi, sizeof(cmi));
248 cmi.cbSize = sizeof(cmi);
249 cmi.lpVerb = MAKEINTRESOURCEA(nCmd);
250 cmi.hwnd = browserWnd;
251 if (GetKeyState(VK_SHIFT) & 0x8000)
252 cmi.fMask |= CMIC_MASK_SHIFT_DOWN;
253 if (GetKeyState(VK_CONTROL) & 0x8000)
254 cmi.fMask |= CMIC_MASK_CONTROL_DOWN;
255
256 return menu->InvokeCommand(&cmi);
257}
#define SID_SShellBrowser
Definition: shlguid.h:128
#define ZeroMemory
Definition: winbase.h:1712
#define VK_CONTROL
Definition: winuser.h:2203
#define MAKEINTRESOURCEA(i)
Definition: winuser.h:581
#define VK_SHIFT
Definition: winuser.h:2202
SHORT WINAPI GetKeyState(_In_ int)

Referenced by OnContextMenu().

◆ GetBandInfo()

HRESULT STDMETHODCALLTYPE CExplorerBand::GetBandInfo ( DWORD  dwBandID,
DWORD  dwViewMode,
DESKBANDINFO pdbi 
)
override

Implements IDeskBand.

Definition at line 1111 of file explorerband.cpp.

1112{
1113 if (!pdbi)
1114 {
1115 return E_INVALIDARG;
1116 }
1117 this->m_dwBandID = dwBandID;
1118
1119 if (pdbi->dwMask & DBIM_MINSIZE)
1120 {
1121 pdbi->ptMinSize.x = 200;
1122 pdbi->ptMinSize.y = 30;
1123 }
1124
1125 if (pdbi->dwMask & DBIM_MAXSIZE)
1126 {
1127 pdbi->ptMaxSize.y = -1;
1128 }
1129
1130 if (pdbi->dwMask & DBIM_INTEGRAL)
1131 {
1132 pdbi->ptIntegral.y = 1;
1133 }
1134
1135 if (pdbi->dwMask & DBIM_ACTUAL)
1136 {
1137 pdbi->ptActual.x = 200;
1138 pdbi->ptActual.y = 30;
1139 }
1140
1141 if (pdbi->dwMask & DBIM_TITLE)
1142 {
1143 if (!LoadStringW(_AtlBaseModule.GetResourceInstance(), IDS_FOLDERSLABEL, pdbi->wszTitle, _countof(pdbi->wszTitle)))
1145 }
1146
1147 if (pdbi->dwMask & DBIM_MODEFLAGS)
1148 {
1149 pdbi->dwModeFlags = DBIMF_NORMAL | DBIMF_VARIABLEHEIGHT;
1150 }
1151
1152 if (pdbi->dwMask & DBIM_BKCOLOR)
1153 {
1154 pdbi->dwMask &= ~DBIM_BKCOLOR;
1155 }
1156 return S_OK;
1157}
#define E_INVALIDARG
Definition: ddrawi.h:101
#define IDS_FOLDERSLABEL
Definition: resource.h:128
#define _countof(array)
Definition: sndvol32.h:70
LONG y
Definition: windef.h:330
LONG x
Definition: windef.h:329
WCHAR wszTitle[256]
Definition: shobjidl.idl:2459
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define HRESULT_FROM_WIN32(x)
Definition: winerror.h:92
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)

◆ GetClassID()

HRESULT STDMETHODCALLTYPE CExplorerBand::GetClassID ( CLSID pClassID)
override

Implements IPersist.

Definition at line 1282 of file explorerband.cpp.

1283{
1284 if (!pClassID)
1285 return E_POINTER;
1286 memcpy(pClassID, &CLSID_ExplorerBand, sizeof(CLSID));
1287 return S_OK;
1288}
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define E_POINTER
Definition: winerror.h:2365

◆ GetCurrentLocation()

HRESULT CExplorerBand::GetCurrentLocation ( PIDLIST_ABSOLUTE pidl)
private

Definition at line 199 of file explorerband.cpp.

200{
201 pidl = NULL;
203 HRESULT hr = IUnknown_QueryService(m_pSite, SID_STopLevelBrowser, IID_PPV_ARG(IShellBrowser, &psb));
205 return hr;
206
208 if (SUCCEEDED(hr = psb->QueryInterface(IID_PPV_ARG(IBrowserService, &pbs))))
209 if (SUCCEEDED(hr = pbs->GetPidl(&pidl)) && pidl)
210 return hr;
211
213 if (!FAILED_UNEXPECTEDLY(hr = psb->QueryActiveShellView(&psv)))
214 if (SUCCEEDED(hr = psv.p ? GetCurrentLocationFromView(*psv.p, pidl) : E_FAIL))
215 return hr;
216 return hr;
217}
static HRESULT GetCurrentLocationFromView(IShellView &View, PIDLIST_ABSOLUTE &pidl)

Referenced by IsCurrentLocation(), and NavigateToCurrentFolder().

◆ GetIDsOfNames()

HRESULT STDMETHODCALLTYPE CExplorerBand::GetIDsOfNames ( REFIID  riid,
LPOLESTR rgszNames,
UINT  cNames,
LCID  lcid,
DISPID rgDispId 
)
override

Implements IDispatch.

Definition at line 1512 of file explorerband.cpp.

1513{
1515 return E_NOTIMPL;
1516}

◆ GetItemEnum()

HRESULT CExplorerBand::GetItemEnum ( _Out_ CComPtr< IEnumIDList > &  pEnum,
_In_ HTREEITEM  hItem 
)
private

Definition at line 576 of file explorerband.cpp.

579{
580 NodeInfo* pNodeInfo = GetNodeInfo(hItem);
581
582 CComPtr<IShellFolder> psfDesktop;
583 HRESULT hr = SHGetDesktopFolder(&psfDesktop);
584 if (FAILED(hr))
585 return hr;
586
587 CComPtr<IShellFolder> pFolder;
588 hr = psfDesktop->BindToObject(pNodeInfo->absolutePidl, NULL, IID_PPV_ARG(IShellFolder, &pFolder));
589 if (FAILED(hr))
590 return hr;
591
592 return pFolder->EnumObjects(NULL, SHCONTF_FOLDERS, &pEnum);
593}
HRESULT WINAPI SHGetDesktopFolder(IShellFolder **psf)
#define FAILED(hr)
Definition: intsafe.h:51

Referenced by ItemHasAnyChild(), and RefreshRecurse().

◆ GetNavigateTarget()

STDMETHODIMP CExplorerBand::GetNavigateTarget ( _In_ PCIDLIST_ABSOLUTE  pidl,
_Out_ PIDLIST_ABSOLUTE  ppidlTarget,
_Out_ ULONG pulAttrib 
)
override

Returns the ITEMIDLIST that should be navigated when an item is invoked.

Definition at line 1460 of file explorerband.cpp.

1464{
1466 return E_NOTIMPL;
1467}

◆ GetNodeInfo()

CExplorerBand::NodeInfo * CExplorerBand::GetNodeInfo ( HTREEITEM  hItem)
private

Definition at line 176 of file explorerband.cpp.

177{
178 TVITEM tvItem;
179
180 tvItem.mask = TVIF_PARAM;
181 tvItem.hItem = hItem;
182
183 if (!TreeView_GetItem(m_hWnd, &tvItem))
184 return 0;
185
186 return reinterpret_cast<NodeInfo*>(tvItem.lParam);
187}
#define TVITEM
Definition: commctrl.h:3365
#define TreeView_GetItem(hwnd, pitem)
Definition: commctrl.h:3490
#define TVIF_PARAM
Definition: commctrl.h:3268
HTREEITEM hItem
Definition: treelist.h:37

Referenced by DragOver(), GetItemEnum(), InitializeExplorerBand(), IsTreeItemInEnum(), NavigateToPIDL(), OnContextMenu(), OnSelectionChanged(), OnTreeItemDeleted(), OnTreeItemDragging(), OnTreeItemExpanding(), OnWinEvent(), RefreshRecurse(), and TreeItemHasThisChild().

◆ GetSite()

HRESULT STDMETHODCALLTYPE CExplorerBand::GetSite ( REFIID  riid,
void **  ppvSite 
)
override

Definition at line 1215 of file explorerband.cpp.

1216{
1217 if (!ppvSite)
1218 return E_POINTER;
1219 *ppvSite = m_pSite;
1220 return S_OK;
1221}

◆ GetSizeMax()

HRESULT STDMETHODCALLTYPE CExplorerBand::GetSizeMax ( ULARGE_INTEGER pcbSize)
override

Implements IPersistStream.

Definition at line 1310 of file explorerband.cpp.

1311{
1312 // TODO: calculate max size
1314 return E_NOTIMPL;
1315}

◆ GetTypeInfo()

HRESULT STDMETHODCALLTYPE CExplorerBand::GetTypeInfo ( UINT  iTInfo,
LCID  lcid,
ITypeInfo **  ppTInfo 
)
override

Implements IDispatch.

Definition at line 1506 of file explorerband.cpp.

1507{
1509 return E_NOTIMPL;
1510}

◆ GetTypeInfoCount()

HRESULT STDMETHODCALLTYPE CExplorerBand::GetTypeInfoCount ( UINT pctinfo)
override

Implements IDispatch.

Definition at line 1500 of file explorerband.cpp.

1501{
1503 return E_NOTIMPL;
1504}

◆ GetWindow()

HRESULT STDMETHODCALLTYPE CExplorerBand::GetWindow ( HWND lphwnd)
override

Implements IOleWindow.

Definition at line 1073 of file explorerband.cpp.

1074{
1075 if (!lphwnd)
1076 return E_INVALIDARG;
1077 *lphwnd = m_hWnd;
1078 return S_OK;
1079}

◆ GiveFeedback()

HRESULT STDMETHODCALLTYPE CExplorerBand::GiveFeedback ( DWORD  dwEffect)
override

Implements IDropSource.

Definition at line 1651 of file explorerband.cpp.

1652{
1654}
#define DRAGDROP_S_USEDEFAULTCURSORS
Definition: winerror.h:2648

◆ HasFocusIO()

HRESULT STDMETHODCALLTYPE CExplorerBand::HasFocusIO ( )
override

Definition at line 1263 of file explorerband.cpp.

1264{
1265 return m_bFocused ? S_OK : S_FALSE;
1266}
#define S_FALSE
Definition: winerror.h:2357

◆ InitializeExplorerBand()

void CExplorerBand::InitializeExplorerBand ( )
private

Definition at line 90 of file explorerband.cpp.

91{
92 // Init the treeview here
95 return;
96
97 LPITEMIDLIST pidl;
98 hr = SHGetFolderLocation(m_hWnd, CSIDL_DESKTOP, NULL, 0, &pidl);
100 return;
101
102 IImageList * piml;
105 return;
106
108
109 // Insert the root node
110 m_hRoot = InsertItem(NULL, m_pDesktop, pidl, pidl, FALSE);
111 if (!m_hRoot)
112 {
113 ERR("Failed to create root item\n");
114 return;
115 }
116
117 NodeInfo* pNodeInfo = GetNodeInfo(m_hRoot);
118
119 // Insert child nodes
120 InsertSubitems(m_hRoot, pNodeInfo);
122
123 // Navigate to current folder position
125
126#define TARGET_EVENTS ( \
127 SHCNE_DRIVEADD | SHCNE_MKDIR | SHCNE_CREATE | SHCNE_DRIVEREMOVED | SHCNE_RMDIR | \
128 SHCNE_DELETE | SHCNE_RENAMEFOLDER | SHCNE_RENAMEITEM | SHCNE_UPDATEDIR | \
129 SHCNE_UPDATEITEM | SHCNE_ASSOCCHANGED \
130)
131 // Register shell notification
132 SHChangeNotifyEntry shcne = { pidl, TRUE };
137 1, &shcne);
138 if (!m_shellRegID)
139 {
140 ERR("Something went wrong, error %08x\n", GetLastError());
141 }
142
143 // Register browser connection endpoint
144 CComPtr<IWebBrowser2> browserService;
145 hr = IUnknown_QueryService(m_pSite, SID_SWebBrowserApp, IID_PPV_ARG(IWebBrowser2, &browserService));
147 return;
148
149 hr = AtlAdvise(browserService, dynamic_cast<IDispatch*>(this), DIID_DWebBrowserEvents, &m_adviseCookie);
151 return;
152
153 ILFree(pidl);
154}
EXTERN_C ULONG WINAPI SHChangeNotifyRegister(HWND hwnd, INT fSources, LONG wEventMask, UINT uMsg, INT cItems, SHChangeNotifyEntry *lpItems)
HTREEITEM InsertItem(_In_opt_ HTREEITEM hParent, _Inout_ IShellFolder *psfParent, _In_ LPCITEMIDLIST pElt, _In_ LPCITEMIDLIST pEltRelative, _In_ BOOL bSort)
BOOL NavigateToCurrentFolder()
ULONG m_shellRegID
Definition: explorerband.h:56
BOOL InsertSubitems(HTREEITEM hItem, NodeInfo *pNodeInfo)
#define TRUE
Definition: types.h:120
HRESULT WINAPI AtlAdvise(IUnknown *pUnkCP, IUnknown *pUnk, const IID *iid, DWORD *pdw)
Definition: atl.c:45
HRESULT WINAPI SHGetFolderLocation(HWND hwndOwner, int nFolder, HANDLE hToken, DWORD dwReserved, LPITEMIDLIST *ppidl)
Definition: shellpath.c:3150
#define TARGET_EVENTS
#define WM_USER_SHELLEVENT
Definition: explorerband.h:11
#define TreeView_Expand(hwnd, hitem, code)
Definition: commctrl.h:3420
#define TVSIL_NORMAL
Definition: commctrl.h:3443
#define TVE_EXPAND
Definition: commctrl.h:3423
#define TreeView_SetImageList(hwnd, himl, iImage)
Definition: commctrl.h:3447
#define SHIL_SMALL
Definition: shellapi.h:185
HRESULT WINAPI SHGetImageList(int iImageList, REFIID riid, void **ppv)
Definition: shellord.c:2668
#define SHCNRF_NewDelivery
Definition: shlobj.h:1937
#define SHCNRF_ShellLevel
Definition: shlobj.h:1935
#define CSIDL_DESKTOP
Definition: shlobj.h:2172
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41

Referenced by SetSite().

◆ InsertItem() [1/2]

HTREEITEM CExplorerBand::InsertItem ( _In_opt_ HTREEITEM  hParent,
_In_ LPCITEMIDLIST  pElt,
_In_ LPCITEMIDLIST  pEltRelative,
_In_ BOOL  bSort 
)
private

Definition at line 804 of file explorerband.cpp.

809{
810 CComPtr<IShellFolder> psfFolder;
811 HRESULT hr = SHBindToParent(pElt, IID_PPV_ARG(IShellFolder, &psfFolder), NULL);
813 return NULL;
814
815 return InsertItem(hParent, psfFolder, pElt, pEltRelative, bSort);
816}

◆ InsertItem() [2/2]

HTREEITEM CExplorerBand::InsertItem ( _In_opt_ HTREEITEM  hParent,
_Inout_ IShellFolder psfParent,
_In_ LPCITEMIDLIST  pElt,
_In_ LPCITEMIDLIST  pEltRelative,
_In_ BOOL  bSort 
)
private

Definition at line 729 of file explorerband.cpp.

735{
736 TV_INSERTSTRUCT tvInsert;
737 HTREEITEM htiCreated;
738
739 /* Get the attributes of the node */
740 SFGAOF attrs = SFGAO_STREAM | SFGAO_HASSUBFOLDER;
741 HRESULT hr = psfParent->GetAttributesOf(1, &pEltRelative, &attrs);
743 return NULL;
744
745 /* Ignore streams */
746 if (attrs & SFGAO_STREAM)
747 {
748 TRACE("Ignoring stream\n");
749 return NULL;
750 }
751
752 /* Get the name of the node */
753 WCHAR wszDisplayName[MAX_PATH];
754 STRRET strret;
755 hr = psfParent->GetDisplayNameOf(pEltRelative, SHGDN_INFOLDER, &strret);
757 return NULL;
758
759 hr = StrRetToBufW(&strret, pEltRelative, wszDisplayName, MAX_PATH);
761 return NULL;
762
763 /* Get the icon of the node */
764 INT iIcon = SHMapPIDLToSystemImageListIndex(psfParent, pEltRelative, NULL);
765
766 NodeInfo* pChildInfo = new NodeInfo;
767 if (!pChildInfo)
768 {
769 ERR("Failed to allocate NodeInfo\n");
770 return FALSE;
771 }
772
773 // Store our node info
774 pChildInfo->absolutePidl = ILClone(pElt);
775 pChildInfo->relativePidl = ILClone(pEltRelative);
776 pChildInfo->expanded = FALSE;
777
778 // Set up our treeview template
779 tvInsert.hParent = hParent;
780 tvInsert.hInsertAfter = TVI_LAST;
782 tvInsert.item.cchTextMax = MAX_PATH;
783 tvInsert.item.pszText = wszDisplayName;
784 tvInsert.item.iImage = tvInsert.item.iSelectedImage = iIcon;
785 tvInsert.item.cChildren = (attrs & SFGAO_HASSUBFOLDER) ? 1 : 0;
786 tvInsert.item.lParam = (LPARAM)pChildInfo;
787
788 htiCreated = TreeView_InsertItem(m_hWnd, &tvInsert);
789
790 if (bSort)
791 {
792 TVSORTCB sortCallback;
793 sortCallback.hParent = hParent;
794 sortCallback.lpfnCompare = CompareTreeItems;
795 sortCallback.lParam = (LPARAM)this;
796 SendMessage(TVM_SORTCHILDRENCB, 0, (LPARAM)&sortCallback);
797 }
798
799 return htiCreated;
800}
static int CALLBACK CompareTreeItems(LPARAM p1, LPARAM p2, LPARAM p3)
HRESULT WINAPI StrRetToBufW(LPSTRRET src, const ITEMIDLIST *pidl, LPWSTR dest, UINT len)
Definition: string.c:1530
static IShellFolder IShellItem **static IBindCtx LPITEMIDLIST SFGAOF
Definition: ebrowser.c:83
int WINAPI SHMapPIDLToSystemImageListIndex(IShellFolder *sh, LPCITEMIDLIST pidl, int *pIndex)
Definition: iconcache.cpp:766
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:237
#define TVI_LAST
Definition: commctrl.h:3370
#define TVM_SORTCHILDRENCB
Definition: commctrl.h:3547
#define TVIF_TEXT
Definition: commctrl.h:3266
#define TVIF_IMAGE
Definition: commctrl.h:3267
#define TV_INSERTSTRUCT
Definition: commctrl.h:3377
#define TVIF_CHILDREN
Definition: commctrl.h:3272
#define TreeView_InsertItem(hwnd, lpis)
Definition: commctrl.h:3412
#define TVIF_SELECTEDIMAGE
Definition: commctrl.h:3271
LPARAM lParam
Definition: commctrl.h:3616
HTREEITEM hParent
Definition: commctrl.h:3614
PFNTVCOMPARE lpfnCompare
Definition: commctrl.h:3615
int32_t INT
Definition: typedefs.h:58
LONG_PTR LPARAM
Definition: windef.h:208
#define SendMessage
Definition: winuser.h:5852

Referenced by InitializeExplorerBand(), InsertItem(), InsertSubitems(), NavigateToPIDL(), and RefreshRecurse().

◆ InsertSubitems()

BOOL CExplorerBand::InsertSubitems ( HTREEITEM  hItem,
NodeInfo pNodeInfo 
)
private

Definition at line 818 of file explorerband.cpp.

819{
820 CComPtr<IEnumIDList> pEnumIDList;
821 LPITEMIDLIST pidlSub;
823 SHCONTF EnumFlags;
824 HRESULT hr;
825 ULONG fetched;
826 ULONG uItemCount;
827 CComPtr<IShellFolder> pFolder;
828 TVSORTCB sortCallback;
829
830 entry = pNodeInfo->absolutePidl;
831 fetched = 1;
832 uItemCount = 0;
833 EnumFlags = SHCONTF_FOLDERS;
834
835 hr = SHGetFolderLocation(m_hWnd, CSIDL_DESKTOP, NULL, 0, &pidlSub);
836 if (!SUCCEEDED(hr))
837 {
838 ERR("Can't get desktop PIDL !\n");
839 return FALSE;
840 }
841
842 if (!m_pDesktop->CompareIDs(NULL, pidlSub, entry))
843 {
844 // We are the desktop, so use pDesktop as pFolder
845 pFolder = m_pDesktop;
846 }
847 else
848 {
849 // Get an IShellFolder of our pidl
850 hr = m_pDesktop->BindToObject(entry, NULL, IID_PPV_ARG(IShellFolder, &pFolder));
851 if (!SUCCEEDED(hr))
852 {
853 ILFree(pidlSub);
854 ERR("Can't bind folder to desktop !\n");
855 return FALSE;
856 }
857 }
858 ILFree(pidlSub);
859
860 // TODO: handle hidden folders according to settings !
861 EnumFlags |= SHCONTF_INCLUDEHIDDEN;
862
863 // Enum through objects
864 hr = pFolder->EnumObjects(NULL,EnumFlags,&pEnumIDList);
865
866 // avoid broken IShellFolder implementations that return null pointer with success
867 if (!SUCCEEDED(hr) || !pEnumIDList)
868 {
869 ERR("Can't enum the folder !\n");
870 return FALSE;
871 }
872
873 /* Don't redraw while we add stuff into the tree */
875 while(SUCCEEDED(pEnumIDList->Next(1, &pidlSub, &fetched)) && pidlSub && fetched)
876 {
877 LPITEMIDLIST pidlSubComplete;
878 pidlSubComplete = ILCombine(entry, pidlSub);
879
880 if (InsertItem(hItem, pFolder, pidlSubComplete, pidlSub, FALSE))
881 uItemCount++;
882 ILFree(pidlSubComplete);
883 ILFree(pidlSub);
884 }
885 pNodeInfo->expanded = TRUE;
886 /* Let's do sorting */
887 sortCallback.hParent = hItem;
888 sortCallback.lpfnCompare = CompareTreeItems;
889 sortCallback.lParam = (LPARAM)this;
890 SendMessage(TVM_SORTCHILDRENCB, 0, (LPARAM)&sortCallback);
891
892 /* Now we can redraw */
894
895 return (uItemCount > 0) ? TRUE : FALSE;
896}
uint32_t entry
Definition: isohybrid.c:63
static SHCONTF
Definition: ordinal.c:64
LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: pidl.c:712
uint32_t ULONG
Definition: typedefs.h:59
#define WM_SETREDRAW
Definition: winuser.h:1616

Referenced by InitializeExplorerBand(), NavigateToPIDL(), and OnTreeItemExpanding().

◆ Invoke() [1/2]

STDMETHODIMP CExplorerBand::Invoke ( _In_ PCIDLIST_ABSOLUTE  pidl)
override

Handles a user action on an item.

Definition at line 1470 of file explorerband.cpp.

1471{
1473 return E_NOTIMPL;
1474}

◆ Invoke() [2/2]

HRESULT STDMETHODCALLTYPE CExplorerBand::Invoke ( DISPID  dispIdMember,
REFIID  riid,
LCID  lcid,
WORD  wFlags,
DISPPARAMS *  pDispParams,
VARIANT pVarResult,
EXCEPINFO *  pExcepInfo,
UINT puArgErr 
)
override

Implements IDispatch.

Definition at line 1518 of file explorerband.cpp.

1519{
1520 switch (dispIdMember)
1521 {
1524 TRACE("DISPID_NAVIGATECOMPLETE2 received\n");
1526 return S_OK;
1527 }
1528 TRACE("Unknown dispid requested: %08x\n", dispIdMember);
1529 return E_INVALIDARG;
1530}
#define DISPID_NAVIGATECOMPLETE2
Definition: webchild.h:54
#define DISPID_DOWNLOADCOMPLETE
Definition: webchild.h:39

◆ IsCurrentLocation()

HRESULT CExplorerBand::IsCurrentLocation ( PCIDLIST_ABSOLUTE  pidl)
private

Definition at line 219 of file explorerband.cpp.

220{
221 if (!pidl)
222 return E_INVALIDARG;
223 HRESULT hr = E_FAIL;
227 if (location != m_pidlCurrent)
229 return hr;
230}
HRESULT GetCurrentLocation(PIDLIST_ABSOLUTE &pidl)
BOOL SHELL_IsEqualAbsoluteID(PCIDLIST_ABSOLUTE a, PCIDLIST_ABSOLUTE b)
Definition: utility.cpp:54

Referenced by OnWinEvent().

◆ IsDirty()

HRESULT STDMETHODCALLTYPE CExplorerBand::IsDirty ( void  )
override

Implements IPersistStream.

Definition at line 1292 of file explorerband.cpp.

1293{
1295 return E_NOTIMPL;
1296}

◆ IsTreeItemInEnum()

BOOL CExplorerBand::IsTreeItemInEnum ( _In_ HTREEITEM  hItem,
_In_ IEnumIDList pEnum 
)
private

Definition at line 537 of file explorerband.cpp.

540{
541 NodeInfo* pNodeInfo = GetNodeInfo(hItem);
542 if (!pNodeInfo)
543 return FALSE;
544
545 pEnum->Reset();
546
548 while (pEnum->Next(1, &pidlTemp, NULL) == S_OK)
549 {
550 if (ILIsEqual(pidlTemp, pNodeInfo->relativePidl))
551 return TRUE;
552
553 pidlTemp.Free();
554 }
555
556 return FALSE;
557}
void Free()
Definition: atlalloc.h:153
BOOL WINAPI ILIsEqual(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: pidl.c:548

Referenced by RefreshRecurse().

◆ IsWindowOwner()

HRESULT STDMETHODCALLTYPE CExplorerBand::IsWindowOwner ( HWND  hWnd)
override

Definition at line 1445 of file explorerband.cpp.

1446{
1447 return (hWnd == m_hWnd) ? S_OK : S_FALSE;
1448}
HWND hWnd
Definition: settings.c:17

◆ ItemHasAnyChild()

BOOL CExplorerBand::ItemHasAnyChild ( _In_ HTREEITEM  hItem)
private

Definition at line 595 of file explorerband.cpp.

596{
598 HRESULT hr = GetItemEnum(pEnum, hItem);
599 if (FAILED(hr))
600 return FALSE;
601
603 hr = pEnum->Next(1, &pidlTemp, NULL);
604 return SUCCEEDED(hr);
605}
HRESULT GetItemEnum(_Out_ CComPtr< IEnumIDList > &pEnum, _In_ HTREEITEM hItem)

Referenced by RefreshRecurse().

◆ Load()

HRESULT STDMETHODCALLTYPE CExplorerBand::Load ( IStream pStm)
override

Implements IPersistStream.

Definition at line 1298 of file explorerband.cpp.

1299{
1301 return E_NOTIMPL;
1302}

◆ NavigateToCurrentFolder()

BOOL CExplorerBand::NavigateToCurrentFolder ( )
private

Definition at line 998 of file explorerband.cpp.

999{
1000 LPITEMIDLIST explorerPidl;
1002 BOOL result;
1003
1004 HRESULT hr = GetCurrentLocation(explorerPidl);
1006 {
1007 ERR("Unable to get browser PIDL !\n");
1008 return FALSE;
1009 }
1011 /* find PIDL into our explorer */
1012 result = NavigateToPIDL(explorerPidl, &dummy, TRUE, FALSE, TRUE);
1014 ILFree(explorerPidl);
1015 return result;
1016}
BOOL NavigateToPIDL(LPCITEMIDLIST dest, HTREEITEM *item, BOOL bExpand, BOOL bInsert, BOOL bSelect)
unsigned int BOOL
Definition: ntddk_ex.h:94
GLuint64EXT * result
Definition: glext.h:11304

Referenced by InitializeExplorerBand(), and Invoke().

◆ NavigateToPIDL()

BOOL CExplorerBand::NavigateToPIDL ( LPCITEMIDLIST  dest,
HTREEITEM item,
BOOL  bExpand,
BOOL  bInsert,
BOOL  bSelect 
)
private

Navigate to a given PIDL in the treeview, and return matching tree item handle

  • dest: The absolute PIDL we should navigate in the treeview
  • item: Handle of the tree item matching the PIDL
  • bExpand: expand collapsed nodes in order to find the right element
  • bInsert: insert the element at the right place if we don't find it
  • bSelect: select the item after we found it

Definition at line 906 of file explorerband.cpp.

908{
910 HTREEITEM tmp;
912 NodeInfo *nodeData;
913 LPITEMIDLIST relativeChild;
914 TVITEM tvItem;
915
916 if (!item)
917 return FALSE;
918
920 parent = NULL;
921 while (TRUE)
922 {
923 nodeData = GetNodeInfo(current);
924 if (!nodeData)
925 {
926 ERR("Something has gone wrong, no data associated to node !\n");
927 *item = NULL;
928 return FALSE;
929 }
930 // If we found our node, give it back
931 if (!m_pDesktop->CompareIDs(0, nodeData->absolutePidl, dest))
932 {
933 if (bSelect)
935 *item = current;
936 return TRUE;
937 }
938
939 // Check if we are a parent of the requested item
940 relativeChild = ILFindChild(nodeData->absolutePidl, dest);
941 if (relativeChild != 0)
942 {
943 // Notify treeview we have children
944 tvItem.mask = TVIF_CHILDREN;
945 tvItem.hItem = current;
946 tvItem.cChildren = 1;
947 TreeView_SetItem(m_hWnd, &tvItem);
948
949 // If we can expand and the node isn't expanded yet, do it
950 if (bExpand)
951 {
952 if (!nodeData->expanded)
953 InsertSubitems(current, nodeData);
955 }
956
957 // Try to get a child
958 tmp = TreeView_GetChild(m_hWnd, current);
959 if (tmp)
960 {
961 // We have a child, let's continue with it
962 parent = current;
963 current = tmp;
964 continue;
965 }
966
967 if (bInsert && nodeData->expanded)
968 {
969 // Happens when we have to create a subchild inside a child
970 current = InsertItem(current, dest, relativeChild, TRUE);
971 }
972 // We end up here, without any children, so we found nothing
973 // Tell the parent node it has children
974 ZeroMemory(&tvItem, sizeof(tvItem));
975 *item = NULL;
976 return FALSE;
977 }
978
979 // Find sibling
980 tmp = TreeView_GetNextSibling(m_hWnd, current);
981 if (tmp)
982 {
983 current = tmp;
984 continue;
985 }
986 if (bInsert)
987 {
989 *item = current;
990 return TRUE;
991 }
992 *item = NULL;
993 return FALSE;
994 }
996}
static BOOL bInsert
Definition: cmdinput.c:121
r parent
Definition: btrfs.c:3010
struct task_struct * current
Definition: linux.c:32
static char * dest
Definition: rtl.c:135
static ATOM item
Definition: dde.c:856
#define UNREACHABLE
LPITEMIDLIST WINAPI ILFindLastID(LPCITEMIDLIST pidl)
Definition: pidl.c:198
PUIDLIST_RELATIVE WINAPI ILFindChild(PIDLIST_ABSOLUTE pidl1, PCIDLIST_ABSOLUTE pidl2)
Definition: pidl.c:654
#define TreeView_GetChild(hwnd, hitem)
Definition: commctrl.h:3466
#define TreeView_GetNextSibling(hwnd, hitem)
Definition: commctrl.h:3467
#define TreeView_SetItem(hwnd, pitem)
Definition: commctrl.h:3497

Referenced by NavigateToCurrentFolder().

◆ OnChangeNotify()

void CExplorerBand::OnChangeNotify ( _In_opt_ LPCITEMIDLIST  pidl0,
_In_opt_ LPCITEMIDLIST  pidl1,
_In_ LONG  lEvent 
)
private

Definition at line 681 of file explorerband.cpp.

685{
686 switch (lEvent)
687 {
688 case SHCNE_DRIVEADD:
689 case SHCNE_MKDIR:
690 case SHCNE_CREATE:
692 case SHCNE_RMDIR:
693 case SHCNE_DELETE:
695 case SHCNE_RENAMEITEM:
696 case SHCNE_UPDATEDIR:
697 case SHCNE_UPDATEITEM:
699 {
702 break;
703 }
704 default:
705 {
706 TRACE("lEvent: 0x%08lX\n", lEvent);
707 break;
708 }
709 }
710}
#define TIMER_ID_REFRESH
#define SHCNE_DRIVEREMOVED
Definition: shlobj.h:1896
#define SHCNE_RMDIR
Definition: shlobj.h:1893
#define SHCNE_DELETE
Definition: shlobj.h:1891
#define SHCNE_MKDIR
Definition: shlobj.h:1892
#define SHCNE_UPDATEITEM
Definition: shlobj.h:1902
#define SHCNE_RENAMEITEM
Definition: shlobj.h:1889
#define SHCNE_UPDATEDIR
Definition: shlobj.h:1901
#define SHCNE_CREATE
Definition: shlobj.h:1890
#define SHCNE_RENAMEFOLDER
Definition: shlobj.h:1906
#define SHCNE_DRIVEADD
Definition: shlobj.h:1897
#define SHCNE_ASSOCCHANGED
Definition: shlobj.h:1910
HANDLE lEvent
Definition: tftpd.cpp:56
UINT_PTR WINAPI SetTimer(_In_opt_ HWND, _In_ UINT_PTR, _In_ UINT, _In_opt_ TIMERPROC)
BOOL WINAPI KillTimer(_In_opt_ HWND, _In_ UINT_PTR)

Referenced by OnShellEvent().

◆ OnContextMenu()

LRESULT CExplorerBand::OnContextMenu ( UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)
private

Definition at line 380 of file explorerband.cpp.

381{
383 NodeInfo *info;
384 HMENU treeMenu;
385 POINT pt;
386 CComPtr<IShellFolder> pFolder;
387 CComPtr<IContextMenu> contextMenu;
388 HRESULT hr;
389 UINT uCommand;
390 LPITEMIDLIST pidlChild;
391 UINT cmdBase = max(FCIDM_SHVIEWFIRST, 1);
392 UINT cmf = CMF_EXPLORE;
393 SFGAOF attr = SFGAO_CANRENAME;
394 BOOL startedRename = FALSE;
395
396 treeMenu = NULL;
397 item = TreeView_GetSelection(m_hWnd);
398 bHandled = TRUE;
399 if (!item)
400 {
401 goto Cleanup;
402 }
403
404 pt.x = LOWORD(lParam);
405 pt.y = HIWORD(lParam);
406 if ((UINT)lParam == (UINT)-1)
407 {
408 RECT r;
409 if (TreeView_GetItemRect(m_hWnd, item, &r, TRUE))
410 {
411 pt.x = (r.left + r.right) / 2; // Center of
412 pt.y = (r.top + r.bottom) / 2; // item rectangle
413 }
415 }
416
418 if (!info)
419 {
420 ERR("No node data, something has gone wrong !\n");
421 goto Cleanup;
422 }
423 hr = SHBindToParent(info->absolutePidl, IID_PPV_ARG(IShellFolder, &pFolder),
424 (LPCITEMIDLIST*)&pidlChild);
425 if (!SUCCEEDED(hr))
426 {
427 ERR("Can't bind to folder!\n");
428 goto Cleanup;
429 }
430 hr = pFolder->GetUIObjectOf(m_hWnd, 1, (LPCITEMIDLIST*)&pidlChild, IID_IContextMenu,
431 NULL, reinterpret_cast<void**>(&contextMenu));
432 if (!SUCCEEDED(hr))
433 {
434 ERR("Can't get IContextMenu interface\n");
435 goto Cleanup;
436 }
437
438 IUnknown_SetSite(contextMenu, (IDeskBand *)this);
439
440 if (SUCCEEDED(pFolder->GetAttributesOf(1, (LPCITEMIDLIST*)&pidlChild, &attr)) && (attr & SFGAO_CANRENAME))
441 cmf |= CMF_CANRENAME;
442
443 treeMenu = CreatePopupMenu();
444 hr = contextMenu->QueryContextMenu(treeMenu, 0, cmdBase, FCIDM_SHVIEWLAST, cmf);
445 if (!SUCCEEDED(hr))
446 {
447 WARN("Can't get context menu for item\n");
448 DestroyMenu(treeMenu);
449 goto Cleanup;
450 }
451
453 pt.x, pt.y, 0, m_hWnd, NULL);
454 if (uCommand)
455 {
456 uCommand -= cmdBase;
457
458 // Do DFM_CMD_RENAME in the treeview
459 if ((cmf & CMF_CANRENAME) && SHELL_IsVerb(contextMenu, uCommand, L"rename"))
460 {
461 HTREEITEM oldSelected = m_oldSelected;
462 SetFocus();
463 startedRename = TreeView_EditLabel(m_hWnd, item) != NULL;
464 m_oldSelected = oldSelected; // Restore after TVN_BEGINLABELEDIT
465 goto Cleanup;
466 }
467
468 hr = ExecuteCommand(contextMenu, uCommand);
469 }
470
471Cleanup:
472 if (contextMenu)
473 IUnknown_SetSite(contextMenu, NULL);
474 if (treeMenu)
475 DestroyMenu(treeMenu);
476 if (startedRename)
477 {
478 // The treeview disables drawing of the edited item so we must make sure
479 // the correct item is selected (on right-click -> rename on not-current folder).
480 // TVN_ENDLABELEDIT becomes responsible for restoring the selection.
481 }
482 else
483 {
487 }
488 return TRUE;
489}
#define WARN(fmt,...)
Definition: precomp.h:61
HRESULT ExecuteCommand(CComPtr< IContextMenu > &menu, UINT nCmd)
BOOL SHELL_IsVerb(IContextMenu *pcm, UINT_PTR idCmd, LPCWSTR Verb)
Definition: utility.cpp:59
HRESULT WINAPI IUnknown_SetSite(IUnknown *obj, IUnknown *site)
Definition: ordinal.c:1407
static const WCHAR Cleanup[]
Definition: register.c:80
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:63
unsigned int UINT
Definition: ndis.h:50
#define L(x)
Definition: ntvdm.h:50
#define TreeView_GetItemRect(hwnd, hitem, prc, code)
Definition: commctrl.h:3429
#define TreeView_EditLabel(hwnd, hitem)
Definition: commctrl.h:3504
#define FCIDM_SHVIEWFIRST
Definition: shlobj.h:580
#define FCIDM_SHVIEWLAST
Definition: shlobj.h:614
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
Definition: shtypes.idl:42
Definition: cookie.c:202
#define max(a, b)
Definition: svc.c:63
HMENU WINAPI CreatePopupMenu(void)
Definition: menu.c:838
#define TPM_RIGHTBUTTON
Definition: winuser.h:2380
BOOL WINAPI ClientToScreen(_In_ HWND, _Inout_ LPPOINT)
HWND WINAPI SetFocus(_In_opt_ HWND)
#define TPM_LEFTALIGN
Definition: winuser.h:2377
#define TPM_LEFTBUTTON
Definition: winuser.h:2379
BOOL WINAPI DestroyMenu(_In_ HMENU)
BOOL WINAPI TrackPopupMenu(_In_ HMENU, _In_ UINT, _In_ int, _In_ int, _Reserved_ int, _In_ HWND, _Reserved_ LPCRECT)
#define TPM_RETURNCMD
Definition: winuser.h:2387

Referenced by OnWinEvent().

◆ OnKillFocus()

LRESULT CExplorerBand::OnKillFocus ( UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)
private

Definition at line 720 of file explorerband.cpp.

721{
722 IUnknown_OnFocusChangeIS(m_pSite, reinterpret_cast<IUnknown*>(this), FALSE);
723 bHandled = FALSE;
724 return TRUE;
725}
HRESULT WINAPI IUnknown_OnFocusChangeIS(LPUNKNOWN lpUnknown, LPUNKNOWN pFocusObject, BOOL bFocus)
Definition: ordinal.c:4767

◆ OnSelectionChanged() [1/2]

STDMETHODIMP CExplorerBand::OnSelectionChanged ( _In_ PCIDLIST_ABSOLUTE  pidl)
override

Called when the user has selected an item.

Definition at line 1477 of file explorerband.cpp.

1478{
1480 return E_NOTIMPL;
1481}

◆ OnSelectionChanged() [2/2]

void CExplorerBand::OnSelectionChanged ( LPNMTREEVIEW  pnmtv)
private

Definition at line 331 of file explorerband.cpp.

332{
333 NodeInfo* pNodeInfo = GetNodeInfo(pnmtv->itemNew.hItem);
334
335 /* Prevents navigation if selection is initiated inside the band */
337 return;
338
339 UpdateBrowser(pNodeInfo->absolutePidl);
340
341 SetFocus();
342 // Expand the node
343 //TreeView_Expand(m_hWnd, pnmtv->itemNew.hItem, TVE_EXPAND);
344}
HRESULT UpdateBrowser(LPITEMIDLIST pidlGoto)

Referenced by OnWinEvent().

◆ OnSetFocus()

LRESULT CExplorerBand::OnSetFocus ( UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)
private

Definition at line 712 of file explorerband.cpp.

713{
715 IUnknown_OnFocusChangeIS(m_pSite, reinterpret_cast<IUnknown*>(this), TRUE);
716 bHandled = FALSE;
717 return TRUE;
718}

◆ OnShellEvent()

LRESULT CExplorerBand::OnShellEvent ( UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)
private

Definition at line 515 of file explorerband.cpp.

516{
517 // We use SHCNRF_NewDelivery method
518 HANDLE hChange = (HANDLE)wParam;
519 DWORD dwProcID = (DWORD)lParam;
520
521 PIDLIST_ABSOLUTE *ppidl = NULL;
522 LONG lEvent;
523 HANDLE hLock = SHChangeNotification_Lock(hChange, dwProcID, &ppidl, &lEvent);
524 if (hLock == NULL)
525 {
526 ERR("hLock == NULL\n");
527 return 0;
528 }
529
530 OnChangeNotify(ppidl[0], ppidl[1], (lEvent & ~SHCNE_INTERRUPT));
531
533 return 0;
534}
EXTERN_C HANDLE WINAPI SHChangeNotification_Lock(HANDLE hTicket, DWORD dwOwnerPID, LPITEMIDLIST **lppidls, LPLONG lpwEventId)
EXTERN_C BOOL WINAPI SHChangeNotification_Unlock(HANDLE hLock)
void OnChangeNotify(_In_opt_ LPCITEMIDLIST pidl0, _In_opt_ LPCITEMIDLIST pidl1, _In_ LONG lEvent)
WPARAM wParam
Definition: combotst.c:138
unsigned long DWORD
Definition: ntddk_ex.h:95
#define DWORD
Definition: nt_native.h:44
long LONG
Definition: pedump.c:60
#define SHCNE_INTERRUPT
Definition: shlobj.h:1914
PVOID HANDLE
Definition: typedefs.h:73

◆ OnTimer()

LRESULT CExplorerBand::OnTimer ( UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL bHandled 
)
private

Definition at line 667 of file explorerband.cpp.

668{
670 return 0;
671
673
674 // FIXME: Avoid full refresh and optimize for speed
675 Refresh();
676
677 return 0;
678}

◆ OnTreeItemDeleted()

BOOL CExplorerBand::OnTreeItemDeleted ( LPNMTREEVIEW  pnmtv)
private

Definition at line 311 of file explorerband.cpp.

312{
313 // Navigate to parent when deleting selected item
314 HTREEITEM hItem = pnmtv->itemOld.hItem;
315 HTREEITEM hParent = TreeView_GetParent(m_hWnd, hItem);
316 if (hParent && TreeView_GetSelection(m_hWnd) == hItem)
317 TreeView_SelectItem(m_hWnd, hParent);
318
319 /* Destroy memory associated to our node */
320 NodeInfo* pNode = GetNodeInfo(hItem);
321 if (!pNode)
322 return FALSE;
323
324 ILFree(pNode->relativePidl);
325 ILFree(pNode->absolutePidl);
326 delete pNode;
327
328 return TRUE;
329}
#define TreeView_GetParent(hwnd, hitem)
Definition: commctrl.h:3469

Referenced by OnWinEvent().

◆ OnTreeItemDragging()

void CExplorerBand::OnTreeItemDragging ( LPNMTREEVIEW  pnmtv,
BOOL  isRightClick 
)
private

Definition at line 346 of file explorerband.cpp.

347{
348 if (!pnmtv->itemNew.lParam)
349 return;
350
351 NodeInfo* pNodeInfo = GetNodeInfo(pnmtv->itemNew.hItem);
352
353 HRESULT hr;
354 CComPtr<IShellFolder> pSrcFolder;
355 LPCITEMIDLIST pLast;
356 hr = SHBindToParent(pNodeInfo->absolutePidl, IID_PPV_ARG(IShellFolder, &pSrcFolder), &pLast);
357 if (!SUCCEEDED(hr))
358 return;
359
360 SFGAOF attrs = SFGAO_CANCOPY | SFGAO_CANMOVE | SFGAO_CANLINK;
361 pSrcFolder->GetAttributesOf(1, &pLast, &attrs);
362
363 DWORD dwEffect = 0;
364 if (attrs & SFGAO_CANCOPY)
365 dwEffect |= DROPEFFECT_COPY;
366 if (attrs & SFGAO_CANMOVE)
367 dwEffect |= DROPEFFECT_MOVE;
368 if (attrs & SFGAO_CANLINK)
369 dwEffect |= DROPEFFECT_LINK;
370
372 hr = pSrcFolder->GetUIObjectOf(m_hWnd, 1, &pLast, IID_IDataObject, 0, (LPVOID*)&pObj);
373 if (!SUCCEEDED(hr))
374 return;
375
376 DoDragDrop(pObj, this, dwEffect, &dwEffect);
377}
HRESULT WINAPI DoDragDrop(IDataObject *pDataObject, IDropSource *pDropSource, DWORD dwOKEffect, DWORD *pdwEffect)
Definition: ole2.c:753
const DWORD DROPEFFECT_LINK
Definition: oleidl.idl:932
const DWORD DROPEFFECT_COPY
Definition: oleidl.idl:930
const DWORD DROPEFFECT_MOVE
Definition: oleidl.idl:931
const GUID IID_IDataObject

Referenced by OnWinEvent().

◆ OnTreeItemExpanding()

BOOL CExplorerBand::OnTreeItemExpanding ( LPNMTREEVIEW  pnmtv)
private

Definition at line 277 of file explorerband.cpp.

278{
279 NodeInfo *pNodeInfo;
280
281 if (pnmtv->action == TVE_COLLAPSE) {
282 if (pnmtv->itemNew.hItem == m_hRoot)
283 {
284 // Prenvent root from collapsing
285 pnmtv->itemNew.mask |= TVIF_STATE;
286 pnmtv->itemNew.stateMask |= TVIS_EXPANDED;
287 pnmtv->itemNew.state &= ~TVIS_EXPANDED;
288 pnmtv->action = TVE_EXPAND;
289 return TRUE;
290 }
291 }
292 if (pnmtv->action == TVE_EXPAND) {
293 // Grab our directory PIDL
294 pNodeInfo = GetNodeInfo(pnmtv->itemNew.hItem);
295 // We have it, let's try
296 if (pNodeInfo && !pNodeInfo->expanded)
297 if (!InsertSubitems(pnmtv->itemNew.hItem, pNodeInfo)) {
298 // remove subitem "+" since we failed to add subitems
299 TV_ITEM tvItem;
300
301 tvItem.mask = TVIF_CHILDREN;
302 tvItem.hItem = pnmtv->itemNew.hItem;
303 tvItem.cChildren = 0;
304
305 TreeView_SetItem(m_hWnd, &tvItem);
306 }
307 }
308 return FALSE;
309}
#define TV_ITEM
Definition: commctrl.h:3300
#define TVE_COLLAPSE
Definition: commctrl.h:3422
#define TVIS_EXPANDED
Definition: commctrl.h:3284
#define TVIF_STATE
Definition: commctrl.h:3269

Referenced by OnWinEvent().

◆ OnWinEvent()

HRESULT STDMETHODCALLTYPE CExplorerBand::OnWinEvent ( HWND  hWnd,
UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam,
LRESULT theResult 
)
override

Definition at line 1318 of file explorerband.cpp.

1319{
1320 BOOL bHandled;
1322
1323 if (uMsg == WM_NOTIFY)
1324 {
1325 NMHDR *pNotifyHeader = (NMHDR*)lParam;
1326 switch (pNotifyHeader->code)
1327 {
1328 case TVN_ITEMEXPANDING:
1330 if (theResult)
1331 *theResult = result;
1332 break;
1333 case TVN_SELCHANGED:
1335 break;
1336 case TVN_DELETEITEM:
1338 break;
1339 case NM_RCLICK:
1340 OnContextMenu(WM_CONTEXTMENU, (WPARAM)m_hWnd, GetMessagePos(), bHandled);
1341 if (theResult)
1342 *theResult = 1;
1343 break;
1344 case TVN_BEGINDRAG:
1345 case TVN_BEGINRDRAG:
1347 break;
1349 {
1350 // TODO: put this in a function ? (mostly copypasta from CDefView)
1351 DWORD dwAttr = SFGAO_CANRENAME;
1354 LPCITEMIDLIST pChild;
1355 HRESULT hr;
1356
1357 if (theResult)
1358 *theResult = 1;
1359 NodeInfo *info = GetNodeInfo(dispInfo->item.hItem);
1360 if (!info)
1361 return E_FAIL;
1362 hr = SHBindToParent(info->absolutePidl, IID_PPV_ARG(IShellFolder, &pParent), &pChild);
1363 if (!SUCCEEDED(hr) || !pParent.p)
1364 return E_FAIL;
1365
1366 hr = pParent->GetAttributesOf(1, &pChild, &dwAttr);
1367 if (SUCCEEDED(hr) && (dwAttr & SFGAO_CANRENAME))
1368 {
1369 if (theResult)
1370 *theResult = 0;
1371 m_isEditing = TRUE;
1373 }
1374 return S_OK;
1375 }
1376 case TVN_ENDLABELEDITW:
1377 {
1379 NodeInfo *info = GetNodeInfo(dispInfo->item.hItem);
1380 HRESULT hr;
1381
1383 if (m_oldSelected)
1384 {
1388 }
1389
1390 if (theResult)
1391 *theResult = 0;
1392 if (dispInfo->item.pszText)
1393 {
1394 LPITEMIDLIST pidlNew;
1396 LPCITEMIDLIST pidlChild;
1397 BOOL RenamedCurrent = IsCurrentLocation(info->absolutePidl) == S_OK;
1398
1399 hr = SHBindToParent(info->absolutePidl, IID_PPV_ARG(IShellFolder, &pParent), &pidlChild);
1400 if (!SUCCEEDED(hr) || !pParent.p)
1401 return E_FAIL;
1402
1403 hr = pParent->SetNameOf(m_hWnd, pidlChild, dispInfo->item.pszText, SHGDN_INFOLDER, &pidlNew);
1404 if(SUCCEEDED(hr) && pidlNew)
1405 {
1406 CComPtr<IPersistFolder2> pPersist;
1407 LPITEMIDLIST pidlParent, pidlNewAbs;
1408
1410 if(!SUCCEEDED(hr))
1411 return E_FAIL;
1412
1413 hr = pPersist->GetCurFolder(&pidlParent);
1414 if(!SUCCEEDED(hr))
1415 return E_FAIL;
1416 pidlNewAbs = ILCombine(pidlParent, pidlNew);
1417
1418 if (RenamedCurrent)
1419 {
1420 // Navigate to our new location
1421 UpdateBrowser(pidlNewAbs);
1422 }
1423 else
1424 {
1425 // Tell everyone in case SetNameOf forgot, this causes IShellView to update itself when we renamed a child
1426 SHChangeNotify(SHCNE_RENAMEFOLDER, SHCNF_IDLIST, info->absolutePidl, pidlNewAbs);
1427 }
1428
1429 ILFree(pidlParent);
1430 ILFree(pidlNewAbs);
1431 ILFree(pidlNew);
1432 if (theResult)
1433 *theResult = 1;
1434 }
1435 return S_OK;
1436 }
1437 }
1438 default:
1439 break;
1440 }
1441 }
1442 return S_OK;
1443}
EXTERN_C void WINAPI SHChangeNotify(LONG wEventId, UINT uFlags, LPCVOID dwItem1, LPCVOID dwItem2)
BOOL OnTreeItemExpanding(LPNMTREEVIEW pnmtv)
HRESULT IsCurrentLocation(PCIDLIST_ABSOLUTE pidl)
void OnSelectionChanged(LPNMTREEVIEW pnmtv)
void OnTreeItemDragging(LPNMTREEVIEW pnmtv, BOOL isRightClick)
LRESULT OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
BOOL OnTreeItemDeleted(LPNMTREEVIEW pnmtv)
virtual _Must_inspect_result_ NTSTATUS QueryInterface(__in FxQueryInterfaceParams *Params)
Definition: fxobject.cpp:255
FxObject * pParent
Definition: fxdpcapi.cpp:86
#define TVN_DELETEITEM
Definition: commctrl.h:3742
#define TVN_SELCHANGED
Definition: commctrl.h:3735
#define TVN_BEGINDRAG
Definition: commctrl.h:3740
#define LPNMTREEVIEW
Definition: commctrl.h:3643
#define TVN_BEGINRDRAG
Definition: commctrl.h:3741
#define NM_RCLICK
Definition: commctrl.h:133
#define TVN_ITEMEXPANDING
Definition: commctrl.h:3738
#define TVN_BEGINLABELEDITW
Definition: commctrl.h:3710
#define LPNMTVDISPINFO
Definition: commctrl.h:3676
#define TVN_ENDLABELEDITW
Definition: commctrl.h:3712
#define WM_CONTEXTMENU
Definition: richedit.h:64
#define WM_NOTIFY
Definition: richedit.h:61
#define SHCNF_IDLIST
Definition: shlobj.h:1920
UINT code
Definition: winuser.h:3159
LONG_PTR LRESULT
Definition: windef.h:209
UINT_PTR WPARAM
Definition: windef.h:207
DWORD WINAPI GetMessagePos(void)
Definition: message.c:1351

◆ QueryContinueDrag()

HRESULT STDMETHODCALLTYPE CExplorerBand::QueryContinueDrag ( BOOL  fEscapePressed,
DWORD  grfKeyState 
)
override

Implements IDropSource.

Definition at line 1642 of file explorerband.cpp.

1643{
1644 if (fEscapePressed)
1645 return DRAGDROP_S_CANCEL;
1646 if ((grfKeyState & MK_LBUTTON) || (grfKeyState & MK_RBUTTON))
1647 return S_OK;
1648 return DRAGDROP_S_DROP;
1649}
#define DRAGDROP_S_DROP
Definition: winerror.h:2646
#define DRAGDROP_S_CANCEL
Definition: winerror.h:2647
#define MK_RBUTTON
Definition: winuser.h:2368
#define MK_LBUTTON
Definition: winuser.h:2367

◆ QueryService()

HRESULT STDMETHODCALLTYPE CExplorerBand::QueryService ( REFGUID  guidService,
REFIID  riid,
void **  ppvObject 
)
override

Implements IServiceProvider.

Definition at line 1239 of file explorerband.cpp.

1240{
1241 /* FIXME: we probably want to handle more services here */
1243}
REFIID riid
Definition: atlbase.h:39
_In_ void _In_ PCCERT_CONTEXT _In_opt_ LPFILETIME _In_ DWORD _In_ DWORD _Outptr_opt_ void ** ppvObject
Definition: wincrypt.h:6082

◆ QueryStatus()

HRESULT STDMETHODCALLTYPE CExplorerBand::QueryStatus ( const GUID pguidCmdGroup,
ULONG  cCmds,
OLECMD  prgCmds[],
OLECMDTEXT pCmdText 
)
override

Implements IOleCommandTarget.

Definition at line 1225 of file explorerband.cpp.

1226{
1228 return E_NOTIMPL;
1229}

◆ Refresh()

void CExplorerBand::Refresh ( )
private

Definition at line 657 of file explorerband.cpp.

658{
663}
void RefreshRecurse(_In_ HTREEITEM hItem)
BOOL WINAPI InvalidateRect(_In_opt_ HWND, _In_opt_ LPCRECT, _In_ BOOL)

Referenced by OnTimer().

◆ RefreshFlags()

STDMETHODIMP CExplorerBand::RefreshFlags ( _Out_ DWORD pdwStyle,
_Out_ DWORD pdwExStyle,
_Out_ DWORD dwEnum 
)
override

Returns flags used to update the tree control.

Definition at line 1484 of file explorerband.cpp.

1488{
1490 return E_NOTIMPL;
1491}

◆ RefreshRecurse()

void CExplorerBand::RefreshRecurse ( _In_ HTREEITEM  hItem)
private

Definition at line 607 of file explorerband.cpp.

608{
609 NodeInfo* pNodeInfo = GetNodeInfo(hTarget);
610
612 HRESULT hrEnum = GetItemEnum(pEnum, hTarget);
613
614 // Delete zombie items
615 HTREEITEM hItem, hNextItem;
616 for (hItem = TreeView_GetChild(m_hWnd, hTarget); hItem; hItem = hNextItem)
617 {
618 hNextItem = TreeView_GetNextSibling(m_hWnd, hItem);
619
620 if (SUCCEEDED(hrEnum) && !IsTreeItemInEnum(hItem, pEnum))
621 TreeView_DeleteItem(m_hWnd, hItem);
622 }
623
624 pEnum = NULL;
625 hrEnum = GetItemEnum(pEnum, hTarget);
626
627 // Insert new items and update items
628 if (SUCCEEDED(hrEnum))
629 {
631 while (pEnum->Next(1, &pidlTemp, NULL) == S_OK)
632 {
633 if (!TreeItemHasThisChild(hTarget, pidlTemp))
634 {
635 CComHeapPtr<ITEMIDLIST> pidlAbsolute(ILCombine(pNodeInfo->absolutePidl, pidlTemp));
636 InsertItem(hTarget, pidlAbsolute, pidlTemp, TRUE);
637 }
638 pidlTemp.Free();
639 }
640 }
641
642 // Update children and recurse
643 for (hItem = TreeView_GetChild(m_hWnd, hTarget); hItem; hItem = hNextItem)
644 {
645 hNextItem = TreeView_GetNextSibling(m_hWnd, hItem);
646
648 item.hItem = hItem;
649 item.cChildren = ItemHasAnyChild(hItem);
650 TreeView_SetItem(m_hWnd, &item);
651
654 }
655}
BOOL TreeItemHasThisChild(_In_ HTREEITEM hItem, _In_ PCITEMID_CHILD pidlChild)
BOOL ItemHasAnyChild(_In_ HTREEITEM hItem)
BOOL IsTreeItemInEnum(_In_ HTREEITEM hItem, _In_ IEnumIDList *pEnum)
#define TVIS_EXPANDEDONCE
Definition: commctrl.h:3285
#define TreeView_GetItemState(hwndTV, hti, mask)
Definition: commctrl.h:3595
#define TV_ITEMW
Definition: commctrl.h:3297
#define TVIF_HANDLE
Definition: commctrl.h:3270
#define TreeView_DeleteItem(hwnd, hitem)
Definition: commctrl.h:3415

Referenced by Refresh(), and RefreshRecurse().

◆ ResizeBorderDW()

HRESULT STDMETHODCALLTYPE CExplorerBand::ResizeBorderDW ( const RECT prcBorder,
IUnknown punkToolbarSite,
BOOL  fReserved 
)
override

Definition at line 1096 of file explorerband.cpp.

1097{
1098 /* Must return E_NOTIMPL according to MSDN */
1099 return E_NOTIMPL;
1100}

◆ Save()

HRESULT STDMETHODCALLTYPE CExplorerBand::Save ( IStream pStm,
BOOL  fClearDirty 
)
override

Implements IPersistStream.

Definition at line 1304 of file explorerband.cpp.

1305{
1307 return E_NOTIMPL;
1308}

◆ Select()

HRESULT STDMETHODCALLTYPE CExplorerBand::Select ( long  paramC)
override

Definition at line 1451 of file explorerband.cpp.

1452{
1454 return E_NOTIMPL;
1455}

◆ SetSite()

HRESULT STDMETHODCALLTYPE CExplorerBand::SetSite ( IUnknown pUnkSite)
override

Implements IObjectWithSite.

Definition at line 1161 of file explorerband.cpp.

1162{
1163 HRESULT hr;
1164 HWND parentWnd;
1165
1166 if (pUnkSite == m_pSite)
1167 return S_OK;
1168
1169 TRACE("SetSite called \n");
1170 if (!pUnkSite)
1171 {
1173 DestroyWindow();
1174 m_hWnd = NULL;
1175 }
1176
1177 if (pUnkSite != m_pSite)
1178 {
1179 m_pSite = NULL;
1180 }
1181
1182 if(!pUnkSite)
1183 return S_OK;
1184
1185 hr = IUnknown_GetWindow(pUnkSite, &parentWnd);
1186 if (!SUCCEEDED(hr))
1187 {
1188 ERR("Could not get parent's window ! Status: %08lx\n", hr);
1189 return E_INVALIDARG;
1190 }
1191
1192 m_pSite = pUnkSite;
1193
1194 if (m_hWnd)
1195 {
1196 // Change its parent
1197 SetParent(parentWnd);
1198 }
1199 else
1200 {
1202 WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | TVS_HASLINES | TVS_HASBUTTONS | TVS_SHOWSELALWAYS | TVS_EDITLABELS /* | TVS_SINGLEEXPAND*/ , // remove TVS_SINGLEEXPAND for now since it has strange behaviour
1203 0, 0, 0, 0, parentWnd, NULL, _AtlBaseModule.GetModuleInstance(), NULL);
1204
1205 // Subclass the window
1206 SubclassWindow(wnd);
1207
1208 // Initialize our treeview now
1210 RegisterDragDrop(m_hWnd, dynamic_cast<IDropTarget*>(this));
1211 }
1212 return S_OK;
1213}
void DestroyExplorerBand()
void InitializeExplorerBand()
HRESULT WINAPI RegisterDragDrop(HWND hwnd, LPDROPTARGET pDropTarget)
Definition: ole2.c:557
HRESULT WINAPI IUnknown_GetWindow(IUnknown *lpUnknown, HWND *lphWnd)
Definition: ordinal.c:1332
#define WS_CHILD
Definition: pedump.c:617
#define WS_CLIPSIBLINGS
Definition: pedump.c:618
#define WS_CLIPCHILDREN
Definition: pedump.c:619
#define TVS_SHOWSELALWAYS
Definition: commctrl.h:3252
#define TVS_HASLINES
Definition: commctrl.h:3248
#define WC_TREEVIEW
Definition: commctrl.h:3245
#define TVS_HASBUTTONS
Definition: commctrl.h:3247
#define TVS_EDITLABELS
Definition: commctrl.h:3250
#define SubclassWindow(hwnd, lpfn)
Definition: windowsx.h:542
HWND WINAPI SetParent(_In_ HWND, _In_opt_ HWND)
#define CreateWindow
Definition: winuser.h:5763
BOOL WINAPI DestroyWindow(_In_ HWND)

◆ ShowDW()

HRESULT STDMETHODCALLTYPE CExplorerBand::ShowDW ( BOOL  fShow)
override

Implements IDockingWindow.

Definition at line 1102 of file explorerband.cpp.

1103{
1104 m_fVisible = fShow;
1105 ShowWindow(fShow);
1106 return S_OK;
1107}
BOOL WINAPI ShowWindow(_In_ HWND, _In_ int)

◆ TranslateAcceleratorIO()

HRESULT STDMETHODCALLTYPE CExplorerBand::TranslateAcceleratorIO ( LPMSG  lpMsg)
override

Definition at line 1268 of file explorerband.cpp.

1269{
1270 if (lpMsg->hwnd == m_hWnd ||
1271 (m_isEditing && IsChild(lpMsg->hwnd)))
1272 {
1273 TranslateMessage(lpMsg);
1274 DispatchMessage(lpMsg);
1275 return S_OK;
1276 }
1277
1278 return S_FALSE;
1279}
HWND hwnd
Definition: winuser.h:3114
BOOL WINAPI TranslateMessage(_In_ const MSG *)
BOOL WINAPI IsChild(_In_ HWND, _In_ HWND)
#define DispatchMessage
Definition: winuser.h:5774

◆ TreeItemHasThisChild()

BOOL CExplorerBand::TreeItemHasThisChild ( _In_ HTREEITEM  hItem,
_In_ PCITEMID_CHILD  pidlChild 
)
private

Definition at line 560 of file explorerband.cpp.

563{
564 for (hItem = TreeView_GetChild(m_hWnd, hItem); hItem;
566 {
567 NodeInfo* pNodeInfo = GetNodeInfo(hItem);
568 if (ILIsEqual(pNodeInfo->relativePidl, pidlChild))
569 return TRUE;
570 }
571
572 return FALSE;
573}

Referenced by RefreshRecurse().

◆ UIActivateIO()

HRESULT STDMETHODCALLTYPE CExplorerBand::UIActivateIO ( BOOL  fActivate,
LPMSG  lpMsg 
)
override

Definition at line 1247 of file explorerband.cpp.

1248{
1249 if (fActivate)
1250 {
1251 //SetFocus();
1253 }
1254 // TODO: handle message
1255 if(lpMsg)
1256 {
1257 TranslateMessage(lpMsg);
1258 DispatchMessage(lpMsg);
1259 }
1260 return S_OK;
1261}
HWND WINAPI SetActiveWindow(_In_ HWND)

◆ UpdateBrowser()

HRESULT CExplorerBand::UpdateBrowser ( LPITEMIDLIST  pidlGoto)
private

Definition at line 259 of file explorerband.cpp.

260{
261 CComPtr<IShellBrowser> pBrowserService;
262 HRESULT hr;
263
264 hr = IUnknown_QueryService(m_pSite, SID_STopLevelBrowser, IID_PPV_ARG(IShellBrowser, &pBrowserService));
266 return hr;
267
268 hr = pBrowserService->BrowseObject(pidlGoto, SBSP_SAMEBROWSER | SBSP_ABSOLUTE);
270 return hr;
271
273 return SHILClone(pidlGoto, &m_pidlCurrent);
274}
HRESULT SHILClone(_In_opt_ LPCITEMIDLIST pidl, _Outptr_ LPITEMIDLIST *ppidl)
Definition: utils.cpp:13

Referenced by OnSelectionChanged(), and OnWinEvent().

Member Data Documentation

◆ m_adviseCookie

DWORD CExplorerBand::m_adviseCookie
private

Definition at line 55 of file explorerband.h.

Referenced by DestroyExplorerBand(), and InitializeExplorerBand().

◆ m_bFocused

BOOL CExplorerBand::m_bFocused
private

Definition at line 46 of file explorerband.h.

Referenced by HasFocusIO(), and OnSetFocus().

◆ m_childTargetNode

HTREEITEM CExplorerBand::m_childTargetNode
private

Definition at line 60 of file explorerband.h.

Referenced by DragLeave(), and DragOver().

◆ m_dwBandID

DWORD CExplorerBand::m_dwBandID
private

Definition at line 47 of file explorerband.h.

Referenced by GetBandInfo().

◆ m_fVisible

BOOL CExplorerBand::m_fVisible
private

Definition at line 44 of file explorerband.h.

Referenced by ShowDW().

◆ m_hImageList

HIMAGELIST CExplorerBand::m_hImageList
private

Definition at line 49 of file explorerband.h.

◆ m_hRoot

HTREEITEM CExplorerBand::m_hRoot
private

◆ m_isEditing

BOOL CExplorerBand::m_isEditing
private

Definition at line 48 of file explorerband.h.

Referenced by OnWinEvent(), and TranslateAcceleratorIO().

◆ m_mtxBlockNavigate

BYTE CExplorerBand::m_mtxBlockNavigate
private

◆ m_oldSelected

HTREEITEM CExplorerBand::m_oldSelected
private

Definition at line 51 of file explorerband.h.

Referenced by ContextMenuHack(), DragEnter(), DragLeave(), OnContextMenu(), and OnWinEvent().

◆ m_pCurObject

CComPtr<IDataObject> CExplorerBand::m_pCurObject
private

Definition at line 61 of file explorerband.h.

Referenced by DragEnter(), DragLeave(), and DragOver().

◆ m_pDesktop

CComPtr<IShellFolder> CExplorerBand::m_pDesktop
private

◆ m_pDropTarget

CComPtr<IDropTarget> CExplorerBand::m_pDropTarget
private

Definition at line 59 of file explorerband.h.

Referenced by DragOver(), and Drop().

◆ m_pidlCurrent

LPITEMIDLIST CExplorerBand::m_pidlCurrent
private

Definition at line 52 of file explorerband.h.

Referenced by IsCurrentLocation(), UpdateBrowser(), and ~CExplorerBand().

◆ m_pSite

◆ m_shellRegID

ULONG CExplorerBand::m_shellRegID
private

Definition at line 56 of file explorerband.h.

Referenced by InitializeExplorerBand().


The documentation for this class was generated from the following files: