ReactOS 0.4.15-dev-7108-g1cf6ce6
CExplorerBand Class Reference

#include <explorerband.h>

Inheritance diagram for CExplorerBand:
Collaboration diagram for CExplorerBand:

Classes

class  NodeInfo
 

Public Member Functions

 CExplorerBand ()
 
virtual ~CExplorerBand ()
 
virtual HRESULT STDMETHODCALLTYPE GetWindow (HWND *lphwnd)
 
virtual HRESULT STDMETHODCALLTYPE ContextSensitiveHelp (BOOL fEnterMode)
 
virtual HRESULT STDMETHODCALLTYPE CloseDW (DWORD dwReserved)
 
virtual HRESULT STDMETHODCALLTYPE ResizeBorderDW (const RECT *prcBorder, IUnknown *punkToolbarSite, BOOL fReserved)
 
virtual HRESULT STDMETHODCALLTYPE ShowDW (BOOL fShow)
 
virtual HRESULT STDMETHODCALLTYPE GetBandInfo (DWORD dwBandID, DWORD dwViewMode, DESKBANDINFO *pdbi)
 
virtual HRESULT STDMETHODCALLTYPE SetSite (IUnknown *pUnkSite)
 
virtual HRESULT STDMETHODCALLTYPE GetSite (REFIID riid, void **ppvSite)
 
virtual HRESULT STDMETHODCALLTYPE QueryStatus (const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT *pCmdText)
 
virtual HRESULT STDMETHODCALLTYPE Exec (const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
 
virtual HRESULT STDMETHODCALLTYPE QueryService (REFGUID guidService, REFIID riid, void **ppvObject)
 
virtual HRESULT STDMETHODCALLTYPE UIActivateIO (BOOL fActivate, LPMSG lpMsg)
 
virtual HRESULT STDMETHODCALLTYPE HasFocusIO ()
 
virtual HRESULT STDMETHODCALLTYPE TranslateAcceleratorIO (LPMSG lpMsg)
 
virtual HRESULT STDMETHODCALLTYPE GetClassID (CLSID *pClassID)
 
virtual HRESULT STDMETHODCALLTYPE IsDirty ()
 
virtual HRESULT STDMETHODCALLTYPE Load (IStream *pStm)
 
virtual HRESULT STDMETHODCALLTYPE Save (IStream *pStm, BOOL fClearDirty)
 
virtual HRESULT STDMETHODCALLTYPE GetSizeMax (ULARGE_INTEGER *pcbSize)
 
virtual HRESULT STDMETHODCALLTYPE OnWinEvent (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult)
 
virtual HRESULT STDMETHODCALLTYPE IsWindowOwner (HWND hWnd)
 
virtual HRESULT STDMETHODCALLTYPE Select (long paramC)
 
virtual HRESULT STDMETHODCALLTYPE GetNavigateTarget (long paramC, long param10, long param14)
 
virtual HRESULT STDMETHODCALLTYPE Invoke (long paramC)
 
virtual HRESULT STDMETHODCALLTYPE OnSelectionChanged (long paramC)
 
virtual HRESULT STDMETHODCALLTYPE RefreshFlags (long paramC, long param10, long param14)
 
virtual HRESULT STDMETHODCALLTYPE CacheItem (long paramC)
 
virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount (UINT *pctinfo)
 
virtual HRESULT STDMETHODCALLTYPE GetTypeInfo (UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
 
virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames (REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
 
virtual HRESULT STDMETHODCALLTYPE Invoke (DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
 
virtual HRESULT STDMETHODCALLTYPE DragEnter (IDataObject *pObj, DWORD glfKeyState, POINTL pt, DWORD *pdwEffect)
 
virtual HRESULT STDMETHODCALLTYPE DragOver (DWORD glfKeyState, POINTL pt, DWORD *pdwEffect)
 
virtual HRESULT STDMETHODCALLTYPE DragLeave ()
 
virtual HRESULT STDMETHODCALLTYPE Drop (IDataObject *pObj, DWORD glfKeyState, POINTL pt, DWORD *pdwEffect)
 
virtual HRESULT STDMETHODCALLTYPE QueryContinueDrag (BOOL fEscapePressed, DWORD grfKeyState)
 
virtual HRESULT STDMETHODCALLTYPE GiveFeedback (DWORD dwEffect)
 
- 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)
 
NodeInfoGetNodeInfo (HTREEITEM hItem)
 
HRESULT UpdateBrowser (LPITEMIDLIST pidlGoto)
 
HTREEITEM InsertItem (HTREEITEM hParent, IShellFolder *psfParent, LPITEMIDLIST pElt, LPITEMIDLIST pEltRelative, BOOL bSort)
 
HTREEITEM InsertItem (HTREEITEM hParent, LPITEMIDLIST pElt, LPITEMIDLIST pEltRelative, BOOL bSort)
 
BOOL InsertSubitems (HTREEITEM hItem, NodeInfo *pNodeInfo)
 
BOOL NavigateToPIDL (LPITEMIDLIST dest, HTREEITEM *item, BOOL bExpand, BOOL bInsert, BOOL bSelect)
 
BOOL DeleteItem (LPITEMIDLIST toDelete)
 
BOOL RenameItem (HTREEITEM toRename, LPITEMIDLIST newPidl)
 
BOOL RefreshTreePidl (HTREEITEM tree, LPITEMIDLIST pidlParent)
 
BOOL NavigateToCurrentFolder ()
 

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
 
BOOL m_bNavigating
 
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 27 of file explorerband.h.

Constructor & Destructor Documentation

◆ CExplorerBand()

CExplorerBand::CExplorerBand ( )

Definition at line 147 of file explorerband.cpp.

148 : m_pSite(NULL)
151 , m_dwBandID(0)
154{
155}
BOOL m_bNavigating
Definition: explorerband.h:60
DWORD m_dwBandID
Definition: explorerband.h:62
LPITEMIDLIST m_pidlCurrent
Definition: explorerband.h:67
CComPtr< IUnknown > m_pSite
Definition: explorerband.h:55
#define NULL
Definition: types.h:112
#define FALSE
Definition: types.h:117

◆ ~CExplorerBand()

CExplorerBand::~CExplorerBand ( )
virtual

Definition at line 157 of file explorerband.cpp.

158{
159 if (m_pidlCurrent)
160 {
162 }
163}
void WINAPI ILFree(LPITEMIDLIST pidl)
Definition: pidl.c:929

Member Function Documentation

◆ CacheItem()

HRESULT STDMETHODCALLTYPE CExplorerBand::CacheItem ( long  paramC)
virtual

Definition at line 1417 of file explorerband.cpp.

1418{
1420 return E_NOTIMPL;
1421}
#define UNIMPLEMENTED
Definition: debug.h:115
#define E_NOTIMPL
Definition: ddrawi.h:99

◆ CloseDW()

HRESULT STDMETHODCALLTYPE CExplorerBand::CloseDW ( DWORD  dwReserved)
virtual

Implements IDockingWindow.

Definition at line 1040 of file explorerband.cpp.

1041{
1042 // We do nothing, we don't have anything to save yet
1043 TRACE("CloseDW called\n");
1044 return S_OK;
1045}
#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 970 of file explorerband.cpp.

971{
972 /*
973 * We first sort drive letters (Path root), then PIDLs and then regular folder
974 * display name.
975 * This is not how Windows sorts item, but it gives decent results.
976 */
977 NodeInfo *info1;
978 NodeInfo *info2;
979 CExplorerBand *pThis;
980 WCHAR wszFolder1[MAX_PATH];
981 WCHAR wszFolder2[MAX_PATH];
982
983 info1 = (NodeInfo*)p1;
984 info2 = (NodeInfo*)p2;
985 pThis = (CExplorerBand*)p3;
986
987 GetDisplayName(info1->absolutePidl, wszFolder1, MAX_PATH, SHGDN_FORPARSING);
988 GetDisplayName(info2->absolutePidl, wszFolder2, MAX_PATH, SHGDN_FORPARSING);
989 if (PathIsRoot(wszFolder1) && PathIsRoot(wszFolder2))
990 {
991 return lstrcmpiW(wszFolder1,wszFolder2);
992 }
993 if (PathIsRoot(wszFolder1) && !PathIsRoot(wszFolder2))
994 {
995 return -1;
996 }
997 if (!PathIsRoot(wszFolder1) && PathIsRoot(wszFolder2))
998 {
999 return 1;
1000 }
1001 // Now, we compare non-root folders, grab display name
1002 GetDisplayName(info1->absolutePidl, wszFolder1, MAX_PATH, SHGDN_INFOLDER);
1003 GetDisplayName(info2->absolutePidl, wszFolder2, MAX_PATH, SHGDN_INFOLDER);
1004
1005 if (_ILIsSpecialFolder(info1->relativePidl) && !_ILIsSpecialFolder(info2->relativePidl))
1006 {
1007 return -1;
1008 }
1009 if (!_ILIsSpecialFolder(info1->relativePidl) && _ILIsSpecialFolder(info2->relativePidl))
1010 {
1011 return 1;
1012 }
1013 if (_ILIsSpecialFolder(info1->relativePidl) && !_ILIsSpecialFolder(info2->relativePidl))
1014 {
1015 HRESULT hr;
1016 hr = pThis->m_pDesktop->CompareIDs(0, info1->absolutePidl, info2->absolutePidl);
1017 if (!hr) return 0;
1018 return (hr > 0) ? -1 : 1;
1019 }
1020 return StrCmpLogicalW(wszFolder1, wszFolder2);
1021}
BOOL GetDisplayName(LPCTSTR ServiceName)
Definition: name.c:12
CComPtr< IShellFolder > m_pDesktop
Definition: explorerband.h:56
#define MAX_PATH
Definition: compat.h:34
INT WINAPI StrCmpLogicalW(LPCWSTR lpszStr, LPCWSTR lpszComp)
Definition: string.c:2296
static BOOL _ILIsSpecialFolder(LPCITEMIDLIST pidl)
int WINAPI lstrcmpiW(LPCWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:194
HRESULT hr
Definition: shlfolder.c:183
#define PathIsRoot
Definition: shlwapi.h:955
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by InsertItem(), InsertSubitems(), and RenameItem().

◆ ContextMenuHack()

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

Definition at line 476 of file explorerband.cpp.

477{
478 bHandled = FALSE;
479 if (uMsg == WM_RBUTTONDOWN)
480 {
482 info.pt.x = LOWORD(lParam);
483 info.pt.y = HIWORD(lParam);
484 info.flags = TVHT_ONITEM;
485 info.hItem = NULL;
486
487 // Save the current location
489
490 // Move to the item selected by the treeview (don't change right pane)
491 TreeView_HitTest(m_hWnd, &info);
493 TreeView_SelectItem(m_hWnd, info.hItem);
495 }
496 return FALSE; /* let the wndproc process the message */
497}
HTREEITEM m_oldSelected
Definition: explorerband.h:66
LPARAM lParam
Definition: combotst.c:139
#define TRUE
Definition: types.h:120
#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:1778

◆ ContextSensitiveHelp()

HRESULT STDMETHODCALLTYPE CExplorerBand::ContextSensitiveHelp ( BOOL  fEnterMode)
virtual

Implements IOleWindow.

Definition at line 1032 of file explorerband.cpp.

1033{
1035 return E_NOTIMPL;
1036}

◆ DeleteItem()

BOOL CExplorerBand::DeleteItem ( LPITEMIDLIST  toDelete)
private

Definition at line 845 of file explorerband.cpp.

846{
847 HTREEITEM toDelete;
848 TVITEM tvItem;
849 HTREEITEM parentNode;
850
851 if (!NavigateToPIDL(idl, &toDelete, FALSE, FALSE, FALSE))
852 return FALSE;
853
854 // TODO: check that the treeview item is really deleted
855
856 parentNode = TreeView_GetParent(m_hWnd, toDelete);
857 // Navigate to parent when deleting child item
858 if (!m_pDesktop->CompareIDs(0, idl, m_pidlCurrent))
859 {
860 TreeView_SelectItem(m_hWnd, parentNode);
861 }
862
863 // Remove the child item
864 TreeView_DeleteItem(m_hWnd, toDelete);
865 // Probe parent to see if it has children
866 if (!TreeView_GetChild(m_hWnd, parentNode))
867 {
868 // Decrement parent's child count
869 ZeroMemory(&tvItem, sizeof(tvItem));
870 tvItem.mask = TVIF_CHILDREN;
871 tvItem.hItem = parentNode;
872 tvItem.cChildren = 0;
873 TreeView_SetItem(m_hWnd, &tvItem);
874 }
875 return TRUE;
876}
BOOL NavigateToPIDL(LPITEMIDLIST dest, HTREEITEM *item, BOOL bExpand, BOOL bInsert, BOOL bSelect)
#define TVITEM
Definition: commctrl.h:3365
#define TreeView_GetChild(hwnd, hitem)
Definition: commctrl.h:3466
#define TreeView_GetParent(hwnd, hitem)
Definition: commctrl.h:3469
#define TVIF_CHILDREN
Definition: commctrl.h:3272
#define TreeView_SetItem(hwnd, pitem)
Definition: commctrl.h:3497
#define TreeView_DeleteItem(hwnd, hitem)
Definition: commctrl.h:3415
int cChildren
Definition: treeview.c:154
#define ZeroMemory
Definition: winbase.h:1712

◆ DestroyExplorerBand()

void CExplorerBand::DestroyExplorerBand ( )
private

Definition at line 231 of file explorerband.cpp.

232{
233 HRESULT hr;
234 CComPtr <IWebBrowser2> browserService;
235
236 TRACE("Cleaning up explorer band ...\n");
237
238 hr = IUnknown_QueryService(m_pSite, SID_SWebBrowserApp, IID_PPV_ARG(IWebBrowser2, &browserService));
240 return;
241
242 hr = AtlUnadvise(browserService, DIID_DWebBrowserEvents, m_adviseCookie);
243 /* Remove all items of the treeview */
244 RevokeDragDrop(m_hWnd);
247 m_hRoot = NULL;
248 TRACE("Cleanup done !\n");
249}
HTREEITEM m_hRoot
Definition: explorerband.h:65
DWORD m_adviseCookie
Definition: explorerband.h:70
HRESULT WINAPI AtlUnadvise(IUnknown *pUnkCP, const IID *iid, DWORD dw)
Definition: atl.c:73
#define FAILED_UNEXPECTEDLY(hr)
Definition: precomp.h:122
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 
)
virtual

Implements IDropTarget.

Definition at line 1457 of file explorerband.cpp.

1458{
1459 ERR("Entering drag\n");
1460 m_pCurObject = pObj;
1462 return DragOver(glfKeyState, pt, pdwEffect);
1463}
#define ERR(fmt,...)
Definition: debug.h:110
virtual HRESULT STDMETHODCALLTYPE DragOver(DWORD glfKeyState, POINTL pt, DWORD *pdwEffect)
CComPtr< IDataObject > m_pCurObject
Definition: explorerband.h:76
#define pt(x, y)
Definition: drawing.c:79

◆ DragLeave()

HRESULT STDMETHODCALLTYPE CExplorerBand::DragLeave ( void  )
virtual

Implements IDropTarget.

Definition at line 1543 of file explorerband.cpp.

1544{
1549 if (m_pCurObject)
1550 {
1552 }
1553 return S_OK;
1554}
HTREEITEM m_childTargetNode
Definition: explorerband.h:75

Referenced by Drop().

◆ DragOver()

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

Implements IDropTarget.

Definition at line 1465 of file explorerband.cpp.

1466{
1468 CComPtr<IShellFolder> pShellFldr;
1469 NodeInfo *nodeInfo;
1470 //LPCITEMIDLIST pChild;
1471 HRESULT hr;
1472
1473 info.pt.x = pt.x;
1474 info.pt.y = pt.y;
1475 info.flags = TVHT_ONITEM;
1476 info.hItem = NULL;
1477 ScreenToClient(&info.pt);
1478
1479 // Move to the item selected by the treeview (don't change right pane)
1480 TreeView_HitTest(m_hWnd, &info);
1481
1482 if (info.hItem)
1483 {
1485 TreeView_SelectItem(m_hWnd, info.hItem);
1487 // Delegate to shell folder
1488 if (m_pDropTarget && info.hItem != m_childTargetNode)
1489 {
1491 }
1492 if (info.hItem != m_childTargetNode)
1493 {
1494 nodeInfo = GetNodeInfo(info.hItem);
1495 if (!nodeInfo)
1496 return E_FAIL;
1497#if 0
1498 hr = SHBindToParent(nodeInfo->absolutePidl, IID_PPV_ARG(IShellFolder, &pShellFldr), &pChild);
1499 if (!SUCCEEDED(hr))
1500 return E_FAIL;
1501 hr = pShellFldr->GetUIObjectOf(m_hWnd, 1, &pChild, IID_IDropTarget, NULL, reinterpret_cast<void**>(&pDropTarget));
1502 if (!SUCCEEDED(hr))
1503 return E_FAIL;
1504#endif
1505 if(_ILIsDesktop(nodeInfo->absolutePidl))
1506 pShellFldr = m_pDesktop;
1507 else
1508 {
1509 hr = m_pDesktop->BindToObject(nodeInfo->absolutePidl, 0, IID_PPV_ARG(IShellFolder, &pShellFldr));
1510 if (!SUCCEEDED(hr))
1511 {
1512 /* Don't allow dnd since we couldn't get our folder object */
1513 ERR("Can't bind to folder object\n");
1514 *pdwEffect = DROPEFFECT_NONE;
1515 return E_FAIL;
1516 }
1517 }
1518 hr = pShellFldr->CreateViewObject(m_hWnd, IID_PPV_ARG(IDropTarget, &m_pDropTarget));
1519 if (!SUCCEEDED(hr))
1520 {
1521 /* Don't allow dnd since we couldn't get our drop target */
1522 ERR("Can't get drop target for folder object\n");
1523 *pdwEffect = DROPEFFECT_NONE;
1524 return E_FAIL;
1525 }
1526 hr = m_pDropTarget->DragEnter(m_pCurObject, glfKeyState, pt, pdwEffect);
1527 m_childTargetNode = info.hItem;
1528 }
1529 if (m_pDropTarget)
1530 {
1531 hr = m_pDropTarget->DragOver(glfKeyState, pt, pdwEffect);
1532 }
1533 }
1534 else
1535 {
1538 *pdwEffect = DROPEFFECT_NONE;
1539 }
1540 return S_OK;
1541}
BOOL _ILIsDesktop(LPCITEMIDLIST pidl)
Definition: CBandSite.h:24
NodeInfo * GetNodeInfo(HTREEITEM hItem)
CComPtr< IDropTarget > m_pDropTarget
Definition: explorerband.h:74
#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:1352
BOOL WINAPI ScreenToClient(_In_ HWND, _Inout_ LPPOINT)

Referenced by DragEnter().

◆ Drop()

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

Implements IDropTarget.

Definition at line 1556 of file explorerband.cpp.

1557{
1558 if (!m_pDropTarget)
1559 return E_FAIL;
1560 m_pDropTarget->Drop(pObj, glfKeyState, pt, pdwEffect);
1561 DragLeave();
1562 return S_OK;
1563}
virtual HRESULT STDMETHODCALLTYPE DragLeave()

◆ Exec()

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

Implements IOleCommandTarget.

Definition at line 1182 of file explorerband.cpp.

1183{
1185 return E_NOTIMPL;
1186}

◆ ExecuteCommand()

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

Definition at line 264 of file explorerband.cpp.

265{
266 CComPtr<IOleWindow> pBrowserOleWnd;
267 CMINVOKECOMMANDINFO cmi;
268 HWND browserWnd;
269 HRESULT hr;
270
273 return hr;
274
275 hr = pBrowserOleWnd->GetWindow(&browserWnd);
277 return hr;
278
279 ZeroMemory(&cmi, sizeof(cmi));
280 cmi.cbSize = sizeof(cmi);
281 cmi.lpVerb = MAKEINTRESOURCEA(nCmd);
282 cmi.hwnd = browserWnd;
283 if (GetKeyState(VK_SHIFT) & 0x8000)
284 cmi.fMask |= CMIC_MASK_SHIFT_DOWN;
285 if (GetKeyState(VK_CONTROL) & 0x8000)
286 cmi.fMask |= CMIC_MASK_CONTROL_DOWN;
287
288 return menu->InvokeCommand(&cmi);
289}
#define SID_SShellBrowser
Definition: shlguid.h:128
#define VK_CONTROL
Definition: winuser.h:2202
#define MAKEINTRESOURCEA(i)
Definition: winuser.h:581
#define VK_SHIFT
Definition: winuser.h:2201
SHORT WINAPI GetKeyState(_In_ int)

Referenced by OnContextMenu().

◆ GetBandInfo()

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

Implements IDeskBand.

Definition at line 1062 of file explorerband.cpp.

1063{
1064 if (!pdbi)
1065 {
1066 return E_INVALIDARG;
1067 }
1068 this->m_dwBandID = dwBandID;
1069
1070 if (pdbi->dwMask & DBIM_MINSIZE)
1071 {
1072 pdbi->ptMinSize.x = 200;
1073 pdbi->ptMinSize.y = 30;
1074 }
1075
1076 if (pdbi->dwMask & DBIM_MAXSIZE)
1077 {
1078 pdbi->ptMaxSize.y = -1;
1079 }
1080
1081 if (pdbi->dwMask & DBIM_INTEGRAL)
1082 {
1083 pdbi->ptIntegral.y = 1;
1084 }
1085
1086 if (pdbi->dwMask & DBIM_ACTUAL)
1087 {
1088 pdbi->ptActual.x = 200;
1089 pdbi->ptActual.y = 30;
1090 }
1091
1092 if (pdbi->dwMask & DBIM_TITLE)
1093 {
1094 if (!LoadStringW(_AtlBaseModule.GetResourceInstance(), IDS_FOLDERSLABEL, pdbi->wszTitle, _countof(pdbi->wszTitle)))
1096 }
1097
1098 if (pdbi->dwMask & DBIM_MODEFLAGS)
1099 {
1100 pdbi->dwModeFlags = DBIMF_NORMAL | DBIMF_VARIABLEHEIGHT;
1101 }
1102
1103 if (pdbi->dwMask & DBIM_BKCOLOR)
1104 {
1105 pdbi->dwMask &= ~DBIM_BKCOLOR;
1106 }
1107 return S_OK;
1108}
#define E_INVALIDARG
Definition: ddrawi.h:101
#define IDS_FOLDERSLABEL
Definition: resource.h:127
#define _countof(array)
Definition: sndvol32.h:68
LONG y
Definition: windef.h:330
LONG x
Definition: windef.h:329
WCHAR wszTitle[256]
Definition: shobjidl.idl:2385
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)
virtual

Implements IPersist.

Definition at line 1233 of file explorerband.cpp.

1234{
1235 if (!pClassID)
1236 return E_POINTER;
1237 memcpy(pClassID, &CLSID_ExplorerBand, sizeof(CLSID));
1238 return S_OK;
1239}
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define E_POINTER
Definition: winerror.h:2365

◆ GetIDsOfNames()

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

Implements IDispatch.

Definition at line 1436 of file explorerband.cpp.

1437{
1439 return E_NOTIMPL;
1440}

◆ GetNavigateTarget()

HRESULT STDMETHODCALLTYPE CExplorerBand::GetNavigateTarget ( long  paramC,
long  param10,
long  param14 
)
virtual

Definition at line 1393 of file explorerband.cpp.

1394{
1396 return E_NOTIMPL;
1397}

◆ GetNodeInfo()

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

Definition at line 251 of file explorerband.cpp.

252{
253 TVITEM tvItem;
254
255 tvItem.mask = TVIF_PARAM;
256 tvItem.hItem = hItem;
257
258 if (!TreeView_GetItem(m_hWnd, &tvItem))
259 return 0;
260
261 return reinterpret_cast<NodeInfo*>(tvItem.lParam);
262}
#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(), InitializeExplorerBand(), NavigateToPIDL(), OnContextMenu(), OnSelectionChanged(), OnTreeItemDeleted(), OnTreeItemDragging(), OnTreeItemExpanding(), OnWinEvent(), and RefreshTreePidl().

◆ GetSite()

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

Definition at line 1166 of file explorerband.cpp.

1167{
1168 if (!ppvSite)
1169 return E_POINTER;
1170 *ppvSite = m_pSite;
1171 return S_OK;
1172}

◆ GetSizeMax()

HRESULT STDMETHODCALLTYPE CExplorerBand::GetSizeMax ( ULARGE_INTEGER pcbSize)
virtual

Implements IPersistStream.

Definition at line 1261 of file explorerband.cpp.

1262{
1263 // TODO: calculate max size
1265 return E_NOTIMPL;
1266}

◆ GetTypeInfo()

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

Implements IDispatch.

Definition at line 1430 of file explorerband.cpp.

1431{
1433 return E_NOTIMPL;
1434}

◆ GetTypeInfoCount()

HRESULT STDMETHODCALLTYPE CExplorerBand::GetTypeInfoCount ( UINT pctinfo)
virtual

Implements IDispatch.

Definition at line 1424 of file explorerband.cpp.

1425{
1427 return E_NOTIMPL;
1428}

◆ GetWindow()

HRESULT STDMETHODCALLTYPE CExplorerBand::GetWindow ( HWND lphwnd)
virtual

Implements IOleWindow.

Definition at line 1024 of file explorerband.cpp.

1025{
1026 if (!lphwnd)
1027 return E_INVALIDARG;
1028 *lphwnd = m_hWnd;
1029 return S_OK;
1030}

◆ GiveFeedback()

HRESULT STDMETHODCALLTYPE CExplorerBand::GiveFeedback ( DWORD  dwEffect)
virtual

Implements IDropSource.

Definition at line 1575 of file explorerband.cpp.

1576{
1578}
#define DRAGDROP_S_USEDEFAULTCURSORS
Definition: winerror.h:2648

◆ HasFocusIO()

HRESULT STDMETHODCALLTYPE CExplorerBand::HasFocusIO ( )
virtual

Definition at line 1214 of file explorerband.cpp.

1215{
1216 return m_bFocused ? S_OK : S_FALSE;
1217}
#define S_FALSE
Definition: winerror.h:2357

◆ InitializeExplorerBand()

void CExplorerBand::InitializeExplorerBand ( )
private

Definition at line 165 of file explorerband.cpp.

166{
167 // Init the treeview here
168 HRESULT hr;
169 LPITEMIDLIST pidl;
170 CComPtr<IWebBrowser2> browserService;
172
175 return;
176
177 hr = SHGetFolderLocation(m_hWnd, CSIDL_DESKTOP, NULL, 0, &pidl);
179 return;
180
181 IImageList * piml;
184 return;
185
187
188 // Insert the root node
189 m_hRoot = InsertItem(0, m_pDesktop, pidl, pidl, FALSE);
190 if (!m_hRoot)
191 {
192 ERR("Failed to create root item\n");
193 return;
194 }
195
196 NodeInfo* pNodeInfo = GetNodeInfo(m_hRoot);
197
198 // Insert child nodes
199 InsertSubitems(m_hRoot, pNodeInfo);
201
202 // Navigate to current folder position
204
205 // Register shell notification
206 shcne.pidl = pidl;
207 shcne.fRecursive = TRUE;
209 m_hWnd,
213 1,
214 &shcne);
215 if (!m_shellRegID)
216 {
217 ERR("Something went wrong, error %08x\n", GetLastError());
218 }
219 // Register browser connection endpoint
220 hr = IUnknown_QueryService(m_pSite, SID_SWebBrowserApp, IID_PPV_ARG(IWebBrowser2, &browserService));
222 return;
223
224 hr = AtlAdvise(browserService, dynamic_cast<IDispatch*>(this), DIID_DWebBrowserEvents, &m_adviseCookie);
226 return;
227
228 ILFree(pidl);
229}
HRESULT WINAPI SHGetDesktopFolder(IShellFolder **psf)
EXTERN_C ULONG WINAPI SHChangeNotifyRegister(HWND hwnd, INT fSources, LONG wEventMask, UINT uMsg, INT cItems, SHChangeNotifyEntry *lpItems)
HTREEITEM InsertItem(HTREEITEM hParent, IShellFolder *psfParent, LPITEMIDLIST pElt, LPITEMIDLIST pEltRelative, BOOL bSort)
BOOL NavigateToCurrentFolder()
ULONG m_shellRegID
Definition: explorerband.h:71
BOOL InsertSubitems(HTREEITEM hItem, NodeInfo *pNodeInfo)
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:3093
#define WM_USER_SHELLEVENT
Definition: explorerband.h:24
#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:182
HRESULT WINAPI SHGetImageList(int iImageList, REFIID riid, void **ppv)
Definition: shellord.c:2412
#define SHCNRF_RecursiveInterrupt
Definition: shlobj.h:1855
#define SHCNE_RMDIR
Definition: shlobj.h:1812
#define SHCNE_MKDIR
Definition: shlobj.h:1811
#define SHCNE_RENAMEFOLDER
Definition: shlobj.h:1825
#define SHCNE_DISKEVENTS
Definition: shlobj.h:1830
#define SHCNRF_ShellLevel
Definition: shlobj.h:1854
#define CSIDL_DESKTOP
Definition: shlobj.h:2091
#define SHCNRF_InterruptLevel
Definition: shlobj.h:1853
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41
PCIDLIST_ABSOLUTE pidl
Definition: shlobj.h:1804

Referenced by SetSite().

◆ InsertItem() [1/2]

HTREEITEM CExplorerBand::InsertItem ( HTREEITEM  hParent,
IShellFolder psfParent,
LPITEMIDLIST  pElt,
LPITEMIDLIST  pEltRelative,
BOOL  bSort 
)
private

Definition at line 557 of file explorerband.cpp.

558{
559 TV_INSERTSTRUCT tvInsert;
560 HTREEITEM htiCreated;
561
562 /* Get the attributes of the node */
563 SFGAOF attrs = SFGAO_STREAM | SFGAO_HASSUBFOLDER;
564 HRESULT hr = psfParent->GetAttributesOf(1, &pEltRelative, &attrs);
566 return NULL;
567
568 /* Ignore streams */
569 if (attrs & SFGAO_STREAM)
570 {
571 TRACE("Ignoring stream\n");
572 return NULL;
573 }
574
575 /* Get the name of the node */
576 WCHAR wszDisplayName[MAX_PATH];
577 STRRET strret;
578 hr = psfParent->GetDisplayNameOf(pEltRelative, SHGDN_INFOLDER, &strret);
580 return NULL;
581
582 hr = StrRetToBufW(&strret, pEltRelative, wszDisplayName, MAX_PATH);
584 return NULL;
585
586 /* Get the icon of the node */
587 INT iIcon = SHMapPIDLToSystemImageListIndex(psfParent, pEltRelative, NULL);
588
589 NodeInfo* pChildInfo = new NodeInfo;
590 if (!pChildInfo)
591 {
592 ERR("Failed to allocate NodeInfo\n");
593 return FALSE;
594 }
595
596 // Store our node info
597 pChildInfo->absolutePidl = ILClone(pElt);
598 pChildInfo->relativePidl = ILClone(pEltRelative);
599 pChildInfo->expanded = FALSE;
600
601 // Set up our treeview template
602 tvInsert.hParent = hParent;
603 tvInsert.hInsertAfter = TVI_LAST;
605 tvInsert.item.cchTextMax = MAX_PATH;
606 tvInsert.item.pszText = wszDisplayName;
607 tvInsert.item.iImage = tvInsert.item.iSelectedImage = iIcon;
608 tvInsert.item.cChildren = (attrs & SFGAO_HASSUBFOLDER) ? 1 : 0;
609 tvInsert.item.lParam = (LPARAM)pChildInfo;
610
611 htiCreated = TreeView_InsertItem(m_hWnd, &tvInsert);
612
613 if (bSort)
614 {
615 TVSORTCB sortCallback;
616 sortCallback.hParent = hParent;
617 sortCallback.lpfnCompare = CompareTreeItems;
618 sortCallback.lParam = (LPARAM)this;
619 SendMessage(TVM_SORTCHILDRENCB, 0, (LPARAM)&sortCallback);
620 }
621
622 return htiCreated;
623}
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:1522
static IShellFolder IShellItem **static IBindCtx LPITEMIDLIST SFGAOF
Definition: ebrowser.c:83
int WINAPI SHMapPIDLToSystemImageListIndex(IShellFolder *sh, LPCITEMIDLIST pidl, int *pIndex)
Definition: iconcache.cpp:783
HRESULT GetDisplayNameOf([in] PCUITEMID_CHILD pidl, [in] SHGDNF uFlags, [out] STRRET *lpName)
HRESULT GetAttributesOf([in] UINT cidl, [in, size_is(cidl)] PCUITEMID_CHILD_ARRAY apidl, [in, out] SFGAOF *rgfInOut)
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:228
#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 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:5842

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

◆ InsertItem() [2/2]

HTREEITEM CExplorerBand::InsertItem ( HTREEITEM  hParent,
LPITEMIDLIST  pElt,
LPITEMIDLIST  pEltRelative,
BOOL  bSort 
)
private

Definition at line 626 of file explorerband.cpp.

627{
628 CComPtr<IShellFolder> psfFolder;
629 HRESULT hr = SHBindToParent(pElt, IID_PPV_ARG(IShellFolder, &psfFolder), NULL);
631 return NULL;
632
633 return InsertItem(hParent, psfFolder, pElt, pEltRelative, bSort);
634}

◆ InsertSubitems()

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

Definition at line 636 of file explorerband.cpp.

637{
638 CComPtr<IEnumIDList> pEnumIDList;
639 LPITEMIDLIST pidlSub;
641 SHCONTF EnumFlags;
642 HRESULT hr;
643 ULONG fetched;
644 ULONG uItemCount;
645 CComPtr<IShellFolder> pFolder;
646 TVSORTCB sortCallback;
647
648 entry = pNodeInfo->absolutePidl;
649 fetched = 1;
650 uItemCount = 0;
651 EnumFlags = SHCONTF_FOLDERS;
652
653 hr = SHGetFolderLocation(m_hWnd, CSIDL_DESKTOP, NULL, 0, &pidlSub);
654 if (!SUCCEEDED(hr))
655 {
656 ERR("Can't get desktop PIDL !\n");
657 return FALSE;
658 }
659
660 if (!m_pDesktop->CompareIDs(NULL, pidlSub, entry))
661 {
662 // We are the desktop, so use pDesktop as pFolder
663 pFolder = m_pDesktop;
664 }
665 else
666 {
667 // Get an IShellFolder of our pidl
668 hr = m_pDesktop->BindToObject(entry, NULL, IID_PPV_ARG(IShellFolder, &pFolder));
669 if (!SUCCEEDED(hr))
670 {
671 ILFree(pidlSub);
672 ERR("Can't bind folder to desktop !\n");
673 return FALSE;
674 }
675 }
676 ILFree(pidlSub);
677
678 // TODO: handle hidden folders according to settings !
679 EnumFlags |= SHCONTF_INCLUDEHIDDEN;
680
681 // Enum through objects
682 hr = pFolder->EnumObjects(NULL,EnumFlags,&pEnumIDList);
683
684 // avoid broken IShellFolder implementations that return null pointer with success
685 if (!SUCCEEDED(hr) || !pEnumIDList)
686 {
687 ERR("Can't enum the folder !\n");
688 return FALSE;
689 }
690
691 /* Don't redraw while we add stuff into the tree */
693 while(SUCCEEDED(pEnumIDList->Next(1, &pidlSub, &fetched)) && pidlSub && fetched)
694 {
695 LPITEMIDLIST pidlSubComplete;
696 pidlSubComplete = ILCombine(entry, pidlSub);
697
698 if (InsertItem(hItem, pFolder, pidlSubComplete, pidlSub, FALSE))
699 uItemCount++;
700 ILFree(pidlSubComplete);
701 ILFree(pidlSub);
702 }
703 pNodeInfo->expanded = TRUE;
704 /* Let's do sorting */
705 sortCallback.hParent = hItem;
706 sortCallback.lpfnCompare = CompareTreeItems;
707 sortCallback.lParam = (LPARAM)this;
708 SendMessage(TVM_SORTCHILDRENCB, 0, (LPARAM)&sortCallback);
709
710 /* Now we can redraw */
712
713 return (uItemCount > 0) ? TRUE : FALSE;
714}
uint32_t entry
Definition: isohybrid.c:63
static SHCONTF
Definition: ordinal.c:64
LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: pidl.c:703
uint32_t ULONG
Definition: typedefs.h:59
#define WM_SETREDRAW
Definition: winuser.h:1615

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

◆ Invoke() [1/2]

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

Implements IDispatch.

Definition at line 1442 of file explorerband.cpp.

1443{
1444 switch (dispIdMember)
1445 {
1448 TRACE("DISPID_NAVIGATECOMPLETE2 received\n");
1450 return S_OK;
1451 }
1452 TRACE("Unknown dispid requested: %08x\n", dispIdMember);
1453 return E_INVALIDARG;
1454}
#define DISPID_NAVIGATECOMPLETE2
Definition: webchild.h:54
#define DISPID_DOWNLOADCOMPLETE
Definition: webchild.h:39

◆ Invoke() [2/2]

HRESULT STDMETHODCALLTYPE CExplorerBand::Invoke ( long  paramC)
virtual

Definition at line 1399 of file explorerband.cpp.

1400{
1402 return E_NOTIMPL;
1403}

◆ IsDirty()

HRESULT STDMETHODCALLTYPE CExplorerBand::IsDirty ( void  )
virtual

Implements IPersistStream.

Definition at line 1243 of file explorerband.cpp.

1244{
1246 return E_NOTIMPL;
1247}

◆ IsWindowOwner()

HRESULT STDMETHODCALLTYPE CExplorerBand::IsWindowOwner ( HWND  hWnd)
virtual

Definition at line 1380 of file explorerband.cpp.

1381{
1382 return (hWnd == m_hWnd) ? S_OK : S_FALSE;
1383}
HWND hWnd
Definition: settings.c:17

◆ Load()

HRESULT STDMETHODCALLTYPE CExplorerBand::Load ( IStream pStm)
virtual

Implements IPersistStream.

Definition at line 1249 of file explorerband.cpp.

1250{
1252 return E_NOTIMPL;
1253}

◆ NavigateToCurrentFolder()

BOOL CExplorerBand::NavigateToCurrentFolder ( )
private

Definition at line 816 of file explorerband.cpp.

817{
818 LPITEMIDLIST explorerPidl;
819 CComPtr<IBrowserService> pBrowserService;
820 HRESULT hr;
822 BOOL result;
823 explorerPidl = NULL;
824
825 hr = IUnknown_QueryService(m_pSite, SID_STopLevelBrowser, IID_PPV_ARG(IBrowserService, &pBrowserService));
826 if (!SUCCEEDED(hr))
827 {
828 ERR("Can't get IBrowserService !\n");
829 return FALSE;
830 }
831
832 hr = pBrowserService->GetPidl(&explorerPidl);
833 if (!SUCCEEDED(hr) || !explorerPidl)
834 {
835 ERR("Unable to get browser PIDL !\n");
836 return FALSE;
837 }
839 /* find PIDL into our explorer */
840 result = NavigateToPIDL(explorerPidl, &dummy, TRUE, FALSE, TRUE);
842 return result;
843}
unsigned int BOOL
Definition: ntddk_ex.h:94
GLuint64EXT * result
Definition: glext.h:11304

Referenced by InitializeExplorerBand(), and Invoke().

◆ NavigateToPIDL()

BOOL CExplorerBand::NavigateToPIDL ( LPITEMIDLIST  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 724 of file explorerband.cpp.

726{
728 HTREEITEM tmp;
730 NodeInfo *nodeData;
731 LPITEMIDLIST relativeChild;
732 TVITEM tvItem;
733
734 if (!item)
735 return FALSE;
736
738 parent = NULL;
739 while (TRUE)
740 {
741 nodeData = GetNodeInfo(current);
742 if (!nodeData)
743 {
744 ERR("Something has gone wrong, no data associated to node !\n");
745 *item = NULL;
746 return FALSE;
747 }
748 // If we found our node, give it back
749 if (!m_pDesktop->CompareIDs(0, nodeData->absolutePidl, dest))
750 {
751 if (bSelect)
753 *item = current;
754 return TRUE;
755 }
756
757 // Check if we are a parent of the requested item
758 relativeChild = ILFindChild(nodeData->absolutePidl, dest);
759 if (relativeChild != 0)
760 {
761 // Notify treeview we have children
762 tvItem.mask = TVIF_CHILDREN;
763 tvItem.hItem = current;
764 tvItem.cChildren = 1;
765 TreeView_SetItem(m_hWnd, &tvItem);
766
767 // If we can expand and the node isn't expanded yet, do it
768 if (bExpand)
769 {
770 if (!nodeData->expanded)
771 InsertSubitems(current, nodeData);
773 }
774
775 // Try to get a child
776 tmp = TreeView_GetChild(m_hWnd, current);
777 if (tmp)
778 {
779 // We have a child, let's continue with it
780 parent = current;
781 current = tmp;
782 continue;
783 }
784
785 if (bInsert && nodeData->expanded)
786 {
787 // Happens when we have to create a subchild inside a child
788 current = InsertItem(current, dest, relativeChild, TRUE);
789 }
790 // We end up here, without any children, so we found nothing
791 // Tell the parent node it has children
792 ZeroMemory(&tvItem, sizeof(tvItem));
793 *item = NULL;
794 return FALSE;
795 }
796
797 // Find sibling
798 tmp = TreeView_GetNextSibling(m_hWnd, current);
799 if (tmp)
800 {
801 current = tmp;
802 continue;
803 }
804 if (bInsert)
805 {
807 *item = current;
808 return TRUE;
809 }
810 *item = NULL;
811 return FALSE;
812 }
814}
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:189
PUIDLIST_RELATIVE WINAPI ILFindChild(PIDLIST_ABSOLUTE pidl1, PCIDLIST_ABSOLUTE pidl2)
Definition: pidl.c:645
#define TreeView_GetNextSibling(hwnd, hitem)
Definition: commctrl.h:3467

Referenced by DeleteItem(), NavigateToCurrentFolder(), and OnShellEvent().

◆ OnContextMenu()

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

Definition at line 400 of file explorerband.cpp.

401{
403 NodeInfo *info;
404 HMENU treeMenu;
405 WORD x;
406 WORD y;
407 CComPtr<IShellFolder> pFolder;
408 CComPtr<IContextMenu> contextMenu;
409 HRESULT hr;
410 UINT uCommand;
411 LPITEMIDLIST pidlChild;
412
413 treeMenu = NULL;
414 item = TreeView_GetSelection(m_hWnd);
415 bHandled = TRUE;
416 if (!item)
417 {
418 goto Cleanup;
419 }
420
421 x = LOWORD(lParam);
422 y = HIWORD(lParam);
423 if (x == -1 && y == -1)
424 {
425 // TODO: grab position of tree item and position it correctly
426 }
427
429 if (!info)
430 {
431 ERR("No node data, something has gone wrong !\n");
432 goto Cleanup;
433 }
434 hr = SHBindToParent(info->absolutePidl, IID_PPV_ARG(IShellFolder, &pFolder),
435 (LPCITEMIDLIST*)&pidlChild);
436 if (!SUCCEEDED(hr))
437 {
438 ERR("Can't bind to folder!\n");
439 goto Cleanup;
440 }
441 hr = pFolder->GetUIObjectOf(m_hWnd, 1, (LPCITEMIDLIST*)&pidlChild, IID_IContextMenu,
442 NULL, reinterpret_cast<void**>(&contextMenu));
443 if (!SUCCEEDED(hr))
444 {
445 ERR("Can't get IContextMenu interface\n");
446 goto Cleanup;
447 }
448
449 IUnknown_SetSite(contextMenu, (IDeskBand *)this);
450
451 treeMenu = CreatePopupMenu();
452 hr = contextMenu->QueryContextMenu(treeMenu, 0, FCIDM_SHVIEWFIRST, FCIDM_SHVIEWLAST,
453 CMF_EXPLORE);
454 if (!SUCCEEDED(hr))
455 {
456 WARN("Can't get context menu for item\n");
457 DestroyMenu(treeMenu);
458 goto Cleanup;
459 }
461 x, y, 0, m_hWnd, NULL);
462
463 ExecuteCommand(contextMenu, uCommand);
464
465Cleanup:
466 if (contextMenu)
467 IUnknown_SetSite(contextMenu, NULL);
468 if (treeMenu)
469 DestroyMenu(treeMenu);
473 return TRUE;
474}
#define WARN(fmt,...)
Definition: debug.h:112
HRESULT ExecuteCommand(CComPtr< IContextMenu > &menu, UINT nCmd)
HRESULT WINAPI IUnknown_SetSite(IUnknown *obj, IUnknown *site)
Definition: ordinal.c:1407
static const WCHAR Cleanup[]
Definition: register.c:80
unsigned short WORD
Definition: ntddk_ex.h:93
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
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 FCIDM_SHVIEWFIRST
Definition: shlobj.h:573
#define FCIDM_SHVIEWLAST
Definition: shlobj.h:607
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
Definition: shtypes.idl:42
HMENU WINAPI CreatePopupMenu(void)
Definition: menu.c:838
#define TPM_RIGHTBUTTON
Definition: winuser.h:2379
#define TPM_LEFTALIGN
Definition: winuser.h:2376
#define TPM_LEFTBUTTON
Definition: winuser.h:2378
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:2386

Referenced by OnWinEvent().

◆ OnKillFocus()

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

Definition at line 549 of file explorerband.cpp.

550{
551 IUnknown_OnFocusChangeIS(m_pSite, reinterpret_cast<IUnknown*>(this), FALSE);
552 bHandled = FALSE;
553 return TRUE;
554}
HRESULT WINAPI IUnknown_OnFocusChangeIS(LPUNKNOWN lpUnknown, LPUNKNOWN pFocusObject, BOOL bFocus)
Definition: ordinal.c:4688

◆ OnSelectionChanged() [1/2]

HRESULT STDMETHODCALLTYPE CExplorerBand::OnSelectionChanged ( long  paramC)
virtual

Definition at line 1405 of file explorerband.cpp.

1406{
1408 return E_NOTIMPL;
1409}

◆ OnSelectionChanged() [2/2]

void CExplorerBand::OnSelectionChanged ( LPNMTREEVIEW  pnmtv)
private

Definition at line 360 of file explorerband.cpp.

361{
362 NodeInfo* pNodeInfo = GetNodeInfo(pnmtv->itemNew.hItem);
363
364 /* Prevents navigation if selection is initiated inside the band */
365 if (m_bNavigating)
366 return;
367
368 UpdateBrowser(pNodeInfo->absolutePidl);
369
370 SetFocus();
371 // Expand the node
372 //TreeView_Expand(m_hWnd, pnmtv->itemNew.hItem, TVE_EXPAND);
373}
HRESULT UpdateBrowser(LPITEMIDLIST pidlGoto)
HWND WINAPI SetFocus(_In_opt_ HWND)

Referenced by OnWinEvent().

◆ OnSetFocus()

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

Definition at line 541 of file explorerband.cpp.

542{
544 IUnknown_OnFocusChangeIS(m_pSite, reinterpret_cast<IUnknown*>(this), TRUE);
545 bHandled = FALSE;
546 return TRUE;
547}

◆ OnShellEvent()

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

Definition at line 499 of file explorerband.cpp.

500{
502 LPITEMIDLIST clean;
503 HTREEITEM pItem;
504
506 /* TODO: handle shell notifications */
507 switch(lParam & ~SHCNE_INTERRUPT)
508 {
509 case SHCNE_MKDIR:
510 if (!SUCCEEDED(_ReparsePIDL(dest[0], &clean)))
511 {
512 ERR("Can't reparse PIDL to a valid one\n");
513 return FALSE;
514 }
515 NavigateToPIDL(clean, &pItem, FALSE, TRUE, FALSE);
516 ILFree(clean);
517 break;
518 case SHCNE_RMDIR:
519 DeleteItem(dest[0]);
520 break;
522 if (!SUCCEEDED(_ReparsePIDL(dest[1], &clean)))
523 {
524 ERR("Can't reparse PIDL to a valid one\n");
525 return FALSE;
526 }
527 if (NavigateToPIDL(dest[0], &pItem, FALSE, FALSE, FALSE))
528 RenameItem(pItem, clean);
529 ILFree(clean);
530 break;
531 case SHCNE_UPDATEDIR:
532 // We don't take care of this message
533 TRACE("Directory updated\n");
534 break;
535 default:
536 TRACE("Unhandled message\n");
537 }
538 return TRUE;
539}
BOOL RenameItem(HTREEITEM toRename, LPITEMIDLIST newPidl)
WPARAM wParam
Definition: combotst.c:138
HRESULT _ReparsePIDL(LPITEMIDLIST buggyPidl, LPITEMIDLIST *cleanPidl)
#define SHCNE_UPDATEDIR
Definition: shlobj.h:1820
#define SHCNE_INTERRUPT
Definition: shlobj.h:1833
#define DeleteItem
Definition: userenv.h:210

◆ OnTreeItemDeleted()

BOOL CExplorerBand::OnTreeItemDeleted ( LPNMTREEVIEW  pnmtv)
private

Definition at line 347 of file explorerband.cpp.

348{
349 /* Destroy memory associated to our node */
350 NodeInfo* ptr = GetNodeInfo(pnmtv->itemNew.hItem);
351 if (ptr)
352 {
353 ILFree(ptr->relativePidl);
354 ILFree(ptr->absolutePidl);
355 delete ptr;
356 }
357 return TRUE;
358}
static PVOID ptr
Definition: dispmode.c:27

Referenced by OnWinEvent().

◆ OnTreeItemDragging()

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

Definition at line 375 of file explorerband.cpp.

376{
377 CComPtr<IShellFolder> pSrcFolder;
379 LPCITEMIDLIST pLast;
380 HRESULT hr;
381 DWORD dwEffect;
382 DWORD dwEffect2;
383
384 dwEffect = DROPEFFECT_COPY | DROPEFFECT_MOVE;
385 if (!pnmtv->itemNew.lParam)
386 return;
387 NodeInfo* pNodeInfo = GetNodeInfo(pnmtv->itemNew.hItem);
388 hr = SHBindToParent(pNodeInfo->absolutePidl, IID_PPV_ARG(IShellFolder, &pSrcFolder), &pLast);
389 if (!SUCCEEDED(hr))
390 return;
391 hr = pSrcFolder->GetUIObjectOf(m_hWnd, 1, &pLast, IID_IDataObject, 0, reinterpret_cast<void**>(&pObj));
392 if (!SUCCEEDED(hr))
393 return;
394 DoDragDrop(pObj, this, dwEffect, &dwEffect2);
395 return;
396}
HRESULT WINAPI DoDragDrop(IDataObject *pDataObject, IDropSource *pDropSource, DWORD dwOKEffect, DWORD *pdwEffect)
Definition: ole2.c:753
unsigned long DWORD
Definition: ntddk_ex.h:95
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 313 of file explorerband.cpp.

314{
315 NodeInfo *pNodeInfo;
316
317 if (pnmtv->action == TVE_COLLAPSE) {
318 if (pnmtv->itemNew.hItem == m_hRoot)
319 {
320 // Prenvent root from collapsing
321 pnmtv->itemNew.mask |= TVIF_STATE;
322 pnmtv->itemNew.stateMask |= TVIS_EXPANDED;
323 pnmtv->itemNew.state &= ~TVIS_EXPANDED;
324 pnmtv->action = TVE_EXPAND;
325 return TRUE;
326 }
327 }
328 if (pnmtv->action == TVE_EXPAND) {
329 // Grab our directory PIDL
330 pNodeInfo = GetNodeInfo(pnmtv->itemNew.hItem);
331 // We have it, let's try
332 if (pNodeInfo && !pNodeInfo->expanded)
333 if (!InsertSubitems(pnmtv->itemNew.hItem, pNodeInfo)) {
334 // remove subitem "+" since we failed to add subitems
335 TV_ITEM tvItem;
336
337 tvItem.mask = TVIF_CHILDREN;
338 tvItem.hItem = pnmtv->itemNew.hItem;
339 tvItem.cChildren = 0;
340
341 TreeView_SetItem(m_hWnd, &tvItem);
342 }
343 }
344 return FALSE;
345}
#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 
)
virtual

Definition at line 1270 of file explorerband.cpp.

1271{
1272 BOOL bHandled;
1274
1275 if (uMsg == WM_NOTIFY)
1276 {
1277 NMHDR *pNotifyHeader = (NMHDR*)lParam;
1278 switch (pNotifyHeader->code)
1279 {
1280 case TVN_ITEMEXPANDING:
1282 if (theResult)
1283 *theResult = result;
1284 break;
1285 case TVN_SELCHANGED:
1287 break;
1288 case TVN_DELETEITEM:
1290 break;
1291 case NM_RCLICK:
1292 OnContextMenu(WM_CONTEXTMENU, (WPARAM)m_hWnd, GetMessagePos(), bHandled);
1293 if (theResult)
1294 *theResult = 1;
1295 break;
1296 case TVN_BEGINDRAG:
1297 case TVN_BEGINRDRAG:
1299 break;
1301 {
1302 // TODO: put this in a function ? (mostly copypasta from CDefView)
1303 DWORD dwAttr = SFGAO_CANRENAME;
1306 LPCITEMIDLIST pChild;
1307 HRESULT hr;
1308
1309 if (theResult)
1310 *theResult = 1;
1311 NodeInfo *info = GetNodeInfo(dispInfo->item.hItem);
1312 if (!info)
1313 return E_FAIL;
1314 hr = SHBindToParent(info->absolutePidl, IID_PPV_ARG(IShellFolder, &pParent), &pChild);
1315 if (!SUCCEEDED(hr) || !pParent.p)
1316 return E_FAIL;
1317
1318 hr = pParent->GetAttributesOf(1, &pChild, &dwAttr);
1319 if (SUCCEEDED(hr) && (dwAttr & SFGAO_CANRENAME))
1320 {
1321 if (theResult)
1322 *theResult = 0;
1323 m_isEditing = TRUE;
1324 }
1325 return S_OK;
1326 }
1327 case TVN_ENDLABELEDITW:
1328 {
1330 NodeInfo *info = GetNodeInfo(dispInfo->item.hItem);
1331 HRESULT hr;
1332
1334 if (theResult)
1335 *theResult = 0;
1336 if (dispInfo->item.pszText)
1337 {
1338 LPITEMIDLIST pidlNew;
1340 LPCITEMIDLIST pidlChild;
1341
1342 hr = SHBindToParent(info->absolutePidl, IID_PPV_ARG(IShellFolder, &pParent), &pidlChild);
1343 if (!SUCCEEDED(hr) || !pParent.p)
1344 return E_FAIL;
1345
1346 hr = pParent->SetNameOf(0, pidlChild, dispInfo->item.pszText, SHGDN_INFOLDER, &pidlNew);
1347 if(SUCCEEDED(hr) && pidlNew)
1348 {
1349 CComPtr<IPersistFolder2> pPersist;
1350 LPITEMIDLIST pidlParent, pidlNewAbs;
1351
1353 if(!SUCCEEDED(hr))
1354 return E_FAIL;
1355
1356 hr = pPersist->GetCurFolder(&pidlParent);
1357 if(!SUCCEEDED(hr))
1358 return E_FAIL;
1359 pidlNewAbs = ILCombine(pidlParent, pidlNew);
1360
1361 // Navigate to our new location
1362 UpdateBrowser(pidlNewAbs);
1363
1364 ILFree(pidlParent);
1365 ILFree(pidlNewAbs);
1366 ILFree(pidlNew);
1367 if (theResult)
1368 *theResult = 1;
1369 }
1370 return S_OK;
1371 }
1372 }
1373 default:
1374 break;
1375 }
1376 }
1377 return S_OK;
1378}
BOOL OnTreeItemExpanding(LPNMTREEVIEW pnmtv)
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
UINT code
Definition: winuser.h:3158
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 
)
virtual

Implements IDropSource.

Definition at line 1566 of file explorerband.cpp.

1567{
1568 if (fEscapePressed)
1569 return DRAGDROP_S_CANCEL;
1570 if ((grfKeyState & MK_LBUTTON) || (grfKeyState & MK_RBUTTON))
1571 return S_OK;
1572 return DRAGDROP_S_DROP;
1573}
#define DRAGDROP_S_DROP
Definition: winerror.h:2646
#define DRAGDROP_S_CANCEL
Definition: winerror.h:2647
#define MK_RBUTTON
Definition: winuser.h:2367
#define MK_LBUTTON
Definition: winuser.h:2366

◆ QueryService()

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

Implements IServiceProvider.

Definition at line 1190 of file explorerband.cpp.

1191{
1192 /* FIXME: we probably want to handle more services here */
1194}
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 
)
virtual

Implements IOleCommandTarget.

Definition at line 1176 of file explorerband.cpp.

1177{
1179 return E_NOTIMPL;
1180}

◆ RefreshFlags()

HRESULT STDMETHODCALLTYPE CExplorerBand::RefreshFlags ( long  paramC,
long  param10,
long  param14 
)
virtual

Definition at line 1411 of file explorerband.cpp.

1412{
1414 return E_NOTIMPL;
1415}

◆ RefreshTreePidl()

BOOL CExplorerBand::RefreshTreePidl ( HTREEITEM  tree,
LPITEMIDLIST  pidlParent 
)
private

Definition at line 928 of file explorerband.cpp.

929{
930 HTREEITEM tmp;
931 NodeInfo *pInfo;
932
933 // Update our node data
934 pInfo = GetNodeInfo(tree);
935 if (!pInfo)
936 {
937 WARN("No tree info !\n");
938 return FALSE;
939 }
940 ILFree(pInfo->absolutePidl);
941 pInfo->absolutePidl = ILCombine(pidlParent, pInfo->relativePidl);
942 if (!pInfo->absolutePidl)
943 {
944 WARN("PIDL allocation failed\n");
945 return FALSE;
946 }
947 // Recursively update children
948 if ((tmp = TreeView_GetChild(m_hWnd, tree)) != NULL)
949 {
950 RefreshTreePidl(tmp, pInfo->absolutePidl);
951 }
952
953 tmp = TreeView_GetNextSibling(m_hWnd, tree);
954 while(tmp != NULL)
955 {
956 pInfo = GetNodeInfo(tmp);
957 if(!pInfo)
958 {
959 WARN("No tree info !\n");
960 continue;
961 }
962 ILFree(pInfo->absolutePidl);
963 pInfo->absolutePidl = ILCombine(pidlParent, pInfo->relativePidl);
964 tmp = TreeView_GetNextSibling(m_hWnd, tmp);
965 }
966 return TRUE;
967}
BOOL RefreshTreePidl(HTREEITEM tree, LPITEMIDLIST pidlParent)

Referenced by RefreshTreePidl(), and RenameItem().

◆ RenameItem()

BOOL CExplorerBand::RenameItem ( HTREEITEM  toRename,
LPITEMIDLIST  newPidl 
)
private

Definition at line 878 of file explorerband.cpp.

879{
880 WCHAR wszDisplayName[MAX_PATH];
881 TVITEM itemInfo;
882 LPCITEMIDLIST relPidl;
883 NodeInfo *treeInfo;
884 TVSORTCB sortCallback;
886
887 ZeroMemory(&itemInfo, sizeof(itemInfo));
888 itemInfo.mask = TVIF_PARAM;
889 itemInfo.hItem = toRename;
890
891 // Change PIDL associated to the item
892 relPidl = ILFindLastID(newPidl);
893 TreeView_GetItem(m_hWnd, &itemInfo);
894 if (!itemInfo.lParam)
895 {
896 ERR("Unable to fetch lParam\n");
897 return FALSE;
898 }
900 treeInfo = (NodeInfo*)itemInfo.lParam;
901 ILFree(treeInfo->absolutePidl);
902 ILFree(treeInfo->relativePidl);
903 treeInfo->absolutePidl = ILClone(newPidl);
904 treeInfo->relativePidl = ILClone(relPidl);
905
906 // Change the display name
907 GetDisplayName(newPidl, wszDisplayName, MAX_PATH, SHGDN_INFOLDER);
908 ZeroMemory(&itemInfo, sizeof(itemInfo));
909 itemInfo.hItem = toRename;
910 itemInfo.mask = TVIF_TEXT;
911 itemInfo.pszText = wszDisplayName;
912 TreeView_SetItem(m_hWnd, &itemInfo);
913
914 if((child = TreeView_GetChild(m_hWnd, toRename)) != NULL)
915 {
916 RefreshTreePidl(child, newPidl);
917 }
918
919 // Sorting
920 sortCallback.hParent = TreeView_GetParent(m_hWnd, toRename);
921 sortCallback.lpfnCompare = CompareTreeItems;
922 sortCallback.lParam = (LPARAM)this;
923 SendMessage(TVM_SORTCHILDRENCB, 0, (LPARAM)&sortCallback);
925 return TRUE;
926}
static HWND child
Definition: cursoricon.c:298

Referenced by OnShellEvent().

◆ ResizeBorderDW()

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

Definition at line 1047 of file explorerband.cpp.

1048{
1049 /* Must return E_NOTIMPL according to MSDN */
1050 return E_NOTIMPL;
1051}

◆ Save()

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

Implements IPersistStream.

Definition at line 1255 of file explorerband.cpp.

1256{
1258 return E_NOTIMPL;
1259}

◆ Select()

HRESULT STDMETHODCALLTYPE CExplorerBand::Select ( long  paramC)
virtual

Definition at line 1386 of file explorerband.cpp.

1387{
1389 return E_NOTIMPL;
1390}

◆ SetSite()

HRESULT STDMETHODCALLTYPE CExplorerBand::SetSite ( IUnknown pUnkSite)
virtual

Implements IObjectWithSite.

Definition at line 1112 of file explorerband.cpp.

1113{
1114 HRESULT hr;
1115 HWND parentWnd;
1116
1117 if (pUnkSite == m_pSite)
1118 return S_OK;
1119
1120 TRACE("SetSite called \n");
1121 if (!pUnkSite)
1122 {
1124 DestroyWindow();
1125 m_hWnd = NULL;
1126 }
1127
1128 if (pUnkSite != m_pSite)
1129 {
1130 m_pSite = NULL;
1131 }
1132
1133 if(!pUnkSite)
1134 return S_OK;
1135
1136 hr = IUnknown_GetWindow(pUnkSite, &parentWnd);
1137 if (!SUCCEEDED(hr))
1138 {
1139 ERR("Could not get parent's window ! Status: %08lx\n", hr);
1140 return E_INVALIDARG;
1141 }
1142
1143 m_pSite = pUnkSite;
1144
1145 if (m_hWnd)
1146 {
1147 // Change its parent
1148 SetParent(parentWnd);
1149 }
1150 else
1151 {
1153 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
1154 0, 0, 0, 0, parentWnd, NULL, _AtlBaseModule.GetModuleInstance(), NULL);
1155
1156 // Subclass the window
1157 SubclassWindow(wnd);
1158
1159 // Initialize our treeview now
1161 RegisterDragDrop(m_hWnd, dynamic_cast<IDropTarget*>(this));
1162 }
1163 return S_OK;
1164}
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:5753
BOOL WINAPI DestroyWindow(_In_ HWND)

◆ ShowDW()

HRESULT STDMETHODCALLTYPE CExplorerBand::ShowDW ( BOOL  fShow)
virtual

Implements IDockingWindow.

Definition at line 1053 of file explorerband.cpp.

1054{
1055 m_fVisible = fShow;
1056 ShowWindow(fShow);
1057 return S_OK;
1058}
BOOL WINAPI ShowWindow(_In_ HWND, _In_ int)

◆ TranslateAcceleratorIO()

HRESULT STDMETHODCALLTYPE CExplorerBand::TranslateAcceleratorIO ( LPMSG  lpMsg)
virtual

Definition at line 1219 of file explorerband.cpp.

1220{
1221 if (lpMsg->hwnd == m_hWnd ||
1222 (m_isEditing && IsChild(lpMsg->hwnd)))
1223 {
1224 TranslateMessage(lpMsg);
1225 DispatchMessage(lpMsg);
1226 return S_OK;
1227 }
1228
1229 return S_FALSE;
1230}
HWND hwnd
Definition: winuser.h:3113
BOOL WINAPI TranslateMessage(_In_ const MSG *)
BOOL WINAPI IsChild(_In_ HWND, _In_ HWND)
#define DispatchMessage
Definition: winuser.h:5764

◆ UIActivateIO()

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

Definition at line 1198 of file explorerband.cpp.

1199{
1200 if (fActivate)
1201 {
1202 //SetFocus();
1204 }
1205 // TODO: handle message
1206 if(lpMsg)
1207 {
1208 TranslateMessage(lpMsg);
1209 DispatchMessage(lpMsg);
1210 }
1211 return S_OK;
1212}
HWND WINAPI SetActiveWindow(_In_ HWND)

◆ UpdateBrowser()

HRESULT CExplorerBand::UpdateBrowser ( LPITEMIDLIST  pidlGoto)
private

Definition at line 291 of file explorerband.cpp.

292{
293 CComPtr<IShellBrowser> pBrowserService;
294 HRESULT hr;
295
296 hr = IUnknown_QueryService(m_pSite, SID_STopLevelBrowser, IID_PPV_ARG(IShellBrowser, &pBrowserService));
298 return hr;
299
300 hr = pBrowserService->BrowseObject(pidlGoto, SBSP_SAMEBROWSER | SBSP_ABSOLUTE);
302 return hr;
303
304 if (m_pidlCurrent)
305 {
307 m_pidlCurrent = ILClone(pidlGoto);
308 }
309 return hr;
310}

Referenced by OnSelectionChanged(), and OnWinEvent().

Member Data Documentation

◆ m_adviseCookie

DWORD CExplorerBand::m_adviseCookie
private

Definition at line 70 of file explorerband.h.

Referenced by DestroyExplorerBand(), and InitializeExplorerBand().

◆ m_bFocused

BOOL CExplorerBand::m_bFocused
private

Definition at line 61 of file explorerband.h.

Referenced by HasFocusIO(), and OnSetFocus().

◆ m_bNavigating

BOOL CExplorerBand::m_bNavigating
private

◆ m_childTargetNode

HTREEITEM CExplorerBand::m_childTargetNode
private

Definition at line 75 of file explorerband.h.

Referenced by DragLeave(), and DragOver().

◆ m_dwBandID

DWORD CExplorerBand::m_dwBandID
private

Definition at line 62 of file explorerband.h.

Referenced by GetBandInfo().

◆ m_fVisible

BOOL CExplorerBand::m_fVisible
private

Definition at line 59 of file explorerband.h.

Referenced by ShowDW().

◆ m_hImageList

HIMAGELIST CExplorerBand::m_hImageList
private

Definition at line 64 of file explorerband.h.

◆ m_hRoot

HTREEITEM CExplorerBand::m_hRoot
private

◆ m_isEditing

BOOL CExplorerBand::m_isEditing
private

Definition at line 63 of file explorerband.h.

Referenced by OnWinEvent(), and TranslateAcceleratorIO().

◆ m_oldSelected

HTREEITEM CExplorerBand::m_oldSelected
private

Definition at line 66 of file explorerband.h.

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

◆ m_pCurObject

CComPtr<IDataObject> CExplorerBand::m_pCurObject
private

Definition at line 76 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 74 of file explorerband.h.

Referenced by DragOver(), and Drop().

◆ m_pidlCurrent

LPITEMIDLIST CExplorerBand::m_pidlCurrent
private

Definition at line 67 of file explorerband.h.

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

◆ m_pSite

◆ m_shellRegID

ULONG CExplorerBand::m_shellRegID
private

Definition at line 71 of file explorerband.h.

Referenced by InitializeExplorerBand().


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