10#include <commoncontrols.h>
17#define UNIMPLEMENTED DbgPrint("%s is UNIMPLEMENTED!\n", __FUNCTION__)
34#define PT_SHELLEXT 0x2E
43 PT_YAGUID == lpPData->
type)) || (pidl && pidl->mkid.cb == 0x00)));
53 if (pidlDirectory ==
NULL || szDisplayName ==
NULL)
75 , m_mtxBlockNavigate(0)
113 ERR(
"Failed to create root item\n");
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 \
159 CComPtr <IWebBrowser2> browserService;
161 TRACE(
"Cleaning up explorer band ...\n");
173 TRACE(
"Cleanup done !\n");
181 tvItem.hItem =
hItem;
186 return reinterpret_cast<NodeInfo*
>(tvItem.lParam);
235 CMINVOKECOMMANDINFO cmi;
243 hr = pBrowserOleWnd->GetWindow(&browserWnd);
248 cmi.cbSize =
sizeof(cmi);
250 cmi.hwnd = browserWnd;
252 cmi.fMask |= CMIC_MASK_SHIFT_DOWN;
254 cmi.fMask |= CMIC_MASK_CONTROL_DOWN;
256 return menu->InvokeCommand(&cmi);
268 hr = pBrowserService->BrowseObject(pidlGoto, SBSP_SAMEBROWSER | SBSP_ABSOLUTE);
282 if (pnmtv->itemNew.hItem ==
m_hRoot)
287 pnmtv->itemNew.state &= ~TVIS_EXPANDED;
296 if (pNodeInfo && !pNodeInfo->
expanded)
302 tvItem.hItem = pnmtv->itemNew.hItem;
303 tvItem.cChildren = 0;
348 if (!pnmtv->itemNew.lParam)
360 SFGAOF attrs = SFGAO_CANCOPY | SFGAO_CANMOVE | SFGAO_CANLINK;
361 pSrcFolder->GetAttributesOf(1, &pLast, &attrs);
364 if (attrs & SFGAO_CANCOPY)
366 if (attrs & SFGAO_CANMOVE)
368 if (attrs & SFGAO_CANLINK)
392 UINT cmf = CMF_EXPLORE;
411 pt.x = (
r.left +
r.right) / 2;
412 pt.y = (
r.top +
r.bottom) / 2;
420 ERR(
"No node data, something has gone wrong !\n");
427 ERR(
"Can't bind to folder!\n");
430 hr = pFolder->GetUIObjectOf(m_hWnd, 1, (
LPCITEMIDLIST*)&pidlChild, IID_IContextMenu,
431 NULL,
reinterpret_cast<void**
>(&contextMenu));
434 ERR(
"Can't get IContextMenu interface\n");
441 cmf |= CMF_CANRENAME;
447 WARN(
"Can't get context menu for item\n");
459 if ((cmf & CMF_CANRENAME) &&
SHELL_IsVerb(contextMenu, uCommand,
L"rename"))
526 ERR(
"hLock == NULL\n");
548 while (pEnum->Next(1, &pidlTemp,
NULL) ==
S_OK)
592 return pFolder->EnumObjects(
NULL, SHCONTF_FOLDERS, &pEnum);
603 hr = pEnum->Next(1, &pidlTemp,
NULL);
631 while (pEnum->Next(1, &pidlTemp,
NULL) ==
S_OK)
665#define TIMER_ID_REFRESH 9999
740 SFGAOF attrs = SFGAO_STREAM | SFGAO_HASSUBFOLDER;
741 HRESULT hr = psfParent->GetAttributesOf(1, &pEltRelative, &attrs);
746 if (attrs & SFGAO_STREAM)
748 TRACE(
"Ignoring stream\n");
755 hr = psfParent->GetDisplayNameOf(pEltRelative, SHGDN_INFOLDER, &strret);
769 ERR(
"Failed to allocate NodeInfo\n");
779 tvInsert.hParent = hParent;
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;
793 sortCallback.
hParent = hParent;
815 return InsertItem(hParent, psfFolder, pElt, pEltRelative, bSort);
833 EnumFlags = SHCONTF_FOLDERS;
838 ERR(
"Can't get desktop PIDL !\n");
854 ERR(
"Can't bind folder to desktop !\n");
861 EnumFlags |= SHCONTF_INCLUDEHIDDEN;
864 hr = pFolder->EnumObjects(
NULL,EnumFlags,&pEnumIDList);
869 ERR(
"Can't enum the folder !\n");
875 while(
SUCCEEDED(pEnumIDList->Next(1, &pidlSub, &fetched)) && pidlSub && fetched)
926 ERR(
"Something has gone wrong, no data associated to node !\n");
941 if (relativeChild != 0)
946 tvItem.cChildren = 1;
1007 ERR(
"Unable to get browser PIDL !\n");
1040 return lstrcmpiW(wszFolder1,wszFolder2);
1067 return (
hr > 0) ? -1 : 1;
1092 TRACE(
"CloseDW called\n");
1119 if (pdbi->
dwMask & DBIM_MINSIZE)
1125 if (pdbi->
dwMask & DBIM_MAXSIZE)
1130 if (pdbi->
dwMask & DBIM_INTEGRAL)
1135 if (pdbi->
dwMask & DBIM_ACTUAL)
1141 if (pdbi->
dwMask & DBIM_TITLE)
1147 if (pdbi->
dwMask & DBIM_MODEFLAGS)
1149 pdbi->
dwModeFlags = DBIMF_NORMAL | DBIMF_VARIABLEHEIGHT;
1152 if (pdbi->
dwMask & DBIM_BKCOLOR)
1154 pdbi->
dwMask &= ~DBIM_BKCOLOR;
1169 TRACE(
"SetSite called \n");
1188 ERR(
"Could not get parent's window ! Status: %08lx\n",
hr);
1203 0, 0, 0, 0, parentWnd,
NULL, _AtlBaseModule.GetModuleInstance(),
NULL);
1270 if (lpMsg->
hwnd == m_hWnd ||
1286 memcpy(pClassID, &CLSID_ExplorerBand,
sizeof(
CLSID));
1326 switch (pNotifyHeader->
code)
1351 DWORD dwAttr = SFGAO_CANRENAME;
1366 hr =
pParent->GetAttributesOf(1, &pChild, &dwAttr);
1392 if (dispInfo->item.pszText)
1403 hr =
pParent->SetNameOf(m_hWnd, pidlChild, dispInfo->item.pszText, SHGDN_INFOLDER, &pidlNew);
1413 hr = pPersist->GetCurFolder(&pidlParent);
1416 pidlNewAbs =
ILCombine(pidlParent, pidlNew);
1520 switch (dispIdMember)
1524 TRACE(
"DISPID_NAVIGATECOMPLETE2 received\n");
1528 TRACE(
"Unknown dispid requested: %08x\n", dispIdMember);
1535 ERR(
"Entering drag\n");
1577 hr = pShellFldr->GetUIObjectOf(m_hWnd, 1, &pChild, IID_IDropTarget,
NULL,
reinterpret_cast<void**
>(&pDropTarget));
1589 ERR(
"Can't bind to folder object\n");
1598 ERR(
"Can't get drop target for folder object\n");
BOOL _ILIsDesktop(LPCITEMIDLIST pidl)
HRESULT WINAPI SHGetDesktopFolder(IShellFolder **psf)
BOOL GetDisplayName(LPCTSTR ServiceName)
#define STDMETHODCALLTYPE
EXTERN_C HANDLE WINAPI SHChangeNotification_Lock(HANDLE hTicket, DWORD dwOwnerPID, LPITEMIDLIST **lppidls, LPLONG lpwEventId)
EXTERN_C ULONG WINAPI SHChangeNotifyRegister(HWND hwnd, INT fSources, LONG wEventMask, UINT uMsg, INT cItems, SHChangeNotifyEntry *lpItems)
EXTERN_C void WINAPI SHChangeNotify(LONG wEventId, UINT uFlags, LPCVOID dwItem1, LPCVOID dwItem2)
EXTERN_C BOOL WINAPI SHChangeNotification_Unlock(HANDLE hLock)
LPITEMIDLIST relativePidl
LPITEMIDLIST absolutePidl
STDMETHOD() GetSite(REFIID riid, void **ppvSite) override
BOOL OnTreeItemExpanding(LPNMTREEVIEW pnmtv)
STDMETHOD() Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut) override
STDMETHOD() CacheItem(_In_ PCIDLIST_ABSOLUTE pidl) override
BOOL TreeItemHasThisChild(_In_ HTREEITEM hItem, _In_ PCITEMID_CHILD pidlChild)
STDMETHOD() UIActivateIO(BOOL fActivate, LPMSG lpMsg) override
STDMETHOD() ResizeBorderDW(const RECT *prcBorder, IUnknown *punkToolbarSite, BOOL fReserved) override
void DestroyExplorerBand()
STDMETHOD() Save(IStream *pStm, BOOL fClearDirty) override
HRESULT IsCurrentLocation(PCIDLIST_ABSOLUTE pidl)
STDMETHOD() Select(long paramC) override
void OnSelectionChanged(LPNMTREEVIEW pnmtv)
STDMETHOD() IsWindowOwner(HWND hWnd) override
void OnChangeNotify(_In_opt_ LPCITEMIDLIST pidl0, _In_opt_ LPCITEMIDLIST pidl1, _In_ LONG lEvent)
HRESULT GetItemEnum(_Out_ CComPtr< IEnumIDList > &pEnum, _In_ HTREEITEM hItem)
HRESULT ExecuteCommand(CComPtr< IContextMenu > &menu, UINT nCmd)
STDMETHOD() ShowDW(BOOL fShow) override
HTREEITEM InsertItem(_In_opt_ HTREEITEM hParent, _Inout_ IShellFolder *psfParent, _In_ LPCITEMIDLIST pElt, _In_ LPCITEMIDLIST pEltRelative, _In_ BOOL bSort)
LRESULT OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
STDMETHOD() SetSite(IUnknown *pUnkSite) override
STDMETHOD() OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult) override
STDMETHOD() GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo) override
STDMETHOD() HasFocusIO() override
STDMETHOD() Drop(IDataObject *pObj, DWORD glfKeyState, POINTL pt, DWORD *pdwEffect) override
BOOL ItemHasAnyChild(_In_ HTREEITEM hItem)
BOOL IsTreeItemInEnum(_In_ HTREEITEM hItem, _In_ IEnumIDList *pEnum)
STDMETHOD() Invoke(_In_ PCIDLIST_ABSOLUTE pidl) override
Handles a user action on an item.
void InitializeExplorerBand()
void RefreshRecurse(_In_ HTREEITEM hItem)
STDMETHOD() CloseDW(DWORD dwReserved) override
STDMETHOD() IsDirty() override
HTREEITEM m_childTargetNode
STDMETHOD() GetWindow(HWND *lphwnd) override
static int CALLBACK CompareTreeItems(LPARAM p1, LPARAM p2, LPARAM p3)
STDMETHOD() TranslateAcceleratorIO(LPMSG lpMsg) override
STDMETHOD() Load(IStream *pStm) override
STDMETHOD() GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId) override
HRESULT UpdateBrowser(LPITEMIDLIST pidlGoto)
LRESULT OnTimer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
BOOL NavigateToCurrentFolder()
STDMETHOD() GetSizeMax(ULARGE_INTEGER *pcbSize) override
STDMETHOD() GetTypeInfoCount(UINT *pctinfo) override
LPITEMIDLIST m_pidlCurrent
STDMETHOD() QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT *pCmdText) override
BOOL NavigateToPIDL(LPCITEMIDLIST dest, HTREEITEM *item, BOOL bExpand, BOOL bInsert, BOOL bSelect)
STDMETHOD() GetBandInfo(DWORD dwBandID, DWORD dwViewMode, DESKBANDINFO *pdbi) override
STDMETHOD() QueryService(REFGUID guidService, REFIID riid, void **ppvObject) override
CComPtr< IDataObject > m_pCurObject
void OnTreeItemDragging(LPNMTREEVIEW pnmtv, BOOL isRightClick)
CComPtr< IUnknown > m_pSite
LRESULT OnKillFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
NodeInfo * GetNodeInfo(HTREEITEM hItem)
STDMETHOD() QueryContinueDrag(BOOL fEscapePressed, DWORD grfKeyState) 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() RefreshFlags(_Out_ DWORD *pdwStyle, _Out_ DWORD *pdwExStyle, _Out_ DWORD *dwEnum) override
Returns flags used to update the tree control.
STDMETHOD() ContextSensitiveHelp(BOOL fEnterMode) override
STDMETHOD() GiveFeedback(DWORD dwEffect) override
HRESULT GetCurrentLocation(PIDLIST_ABSOLUTE &pidl)
LRESULT OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
LRESULT ContextMenuHack(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
CComPtr< IShellFolder > m_pDesktop
BOOL OnTreeItemDeleted(LPNMTREEVIEW pnmtv)
CComPtr< IDropTarget > m_pDropTarget
STDMETHOD() DragOver(DWORD glfKeyState, POINTL pt, DWORD *pdwEffect) override
STDMETHOD() DragEnter(IDataObject *pObj, DWORD glfKeyState, POINTL pt, DWORD *pdwEffect) override
STDMETHOD() GetClassID(CLSID *pClassID) override
LRESULT OnShellEvent(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
BOOL InsertSubitems(HTREEITEM hItem, NodeInfo *pNodeInfo)
STDMETHOD() DragLeave() override
virtual _Must_inspect_result_ NTSTATUS QueryInterface(__in FxQueryInterfaceParams *Params)
HRESULT WINAPI AtlAdvise(IUnknown *pUnkCP, IUnknown *pUnk, const IID *iid, DWORD *pdw)
HRESULT WINAPI AtlUnadvise(IUnknown *pUnkCP, const IID *iid, DWORD dw)
BOOL SHELL_IsVerb(IContextMenu *pcm, UINT_PTR idCmd, LPCWSTR Verb)
BOOL SHELL_IsEqualAbsoluteID(PCIDLIST_ABSOLUTE a, PCIDLIST_ABSOLUTE b)
HRESULT SHELL_GetIDListFromObject(IUnknown *punk, PIDLIST_ABSOLUTE *ppidl)
#define FAILED_UNEXPECTEDLY(hr)
int WINAPI lstrcmpiW(LPCWSTR str1, LPCWSTR str2)
HRESULT WINAPI RegisterDragDrop(HWND hwnd, LPDROPTARGET pDropTarget)
HRESULT WINAPI DoDragDrop(IDataObject *pDataObject, IDropSource *pDropSource, DWORD dwOKEffect, DWORD *pdwEffect)
HRESULT WINAPI RevokeDragDrop(HWND hwnd)
HRESULT SHILClone(_In_opt_ LPCITEMIDLIST pidl, _Outptr_ LPITEMIDLIST *ppidl)
HRESULT WINAPI SHGetFolderLocation(HWND hwndOwner, int nFolder, HANDLE hToken, DWORD dwReserved, LPITEMIDLIST *ppidl)
HRESULT WINAPI IUnknown_QueryService(IUnknown *, REFGUID, REFIID, LPVOID *)
HRESULT WINAPI IUnknown_GetWindow(IUnknown *lpUnknown, HWND *lphWnd)
HRESULT WINAPI IUnknown_OnFocusChangeIS(LPUNKNOWN lpUnknown, LPUNKNOWN pFocusObject, BOOL bFocus)
HRESULT WINAPI IUnknown_SetSite(IUnknown *obj, IUnknown *site)
INT WINAPI StrCmpLogicalW(LPCWSTR lpszStr, LPCWSTR lpszComp)
HRESULT WINAPI StrRetToBufW(LPSTRRET src, const ITEMIDLIST *pidl, LPWSTR dest, UINT len)
static const WCHAR Cleanup[]
static IShellFolder IShellItem **static IBindCtx LPITEMIDLIST SFGAOF
struct _PIDLDATA * LPPIDLDATA
struct _PIDLDATA PIDLDATA
HRESULT GetDisplayName(LPCITEMIDLIST pidlDirectory, TCHAR *szDisplayName, UINT cchMax, DWORD uFlags)
static BOOL _ILIsSpecialFolder(LPCITEMIDLIST pidl)
static HRESULT GetCurrentLocationFromView(IShellView &View, PIDLIST_ABSOLUTE &pidl)
#define WM_USER_SHELLEVENT
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLdouble GLdouble GLdouble r
int WINAPI SHMapPIDLToSystemImageListIndex(IShellFolder *sh, LPCITEMIDLIST pidl, int *pIndex)
const DWORD DROPEFFECT_NONE
const DWORD DROPEFFECT_LINK
const DWORD DROPEFFECT_COPY
const DWORD DROPEFFECT_MOVE
HRESULT GetDisplayNameOf([in] PCUITEMID_CHILD pidl, [in] SHGDNF uFlags, [out] STRRET *lpName)
HRESULT QueryInterface([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
#define memcpy(s1, s2, n)
struct task_struct * current
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
static VARIANTARG static DISPID
_In_ HANDLE _In_ DWORD _In_ DWORD _Inout_opt_ LPOVERLAPPED _In_opt_ LPTRANSMIT_FILE_BUFFERS _In_ DWORD dwReserved
const GUID IID_IDataObject
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
void WINAPI ILFree(LPITEMIDLIST pidl)
LPITEMIDLIST WINAPI ILFindLastID(LPCITEMIDLIST pidl)
LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
HRESULT WINAPI SHBindToParent(LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppv, LPCITEMIDLIST *ppidlLast)
PUIDLIST_RELATIVE WINAPI ILFindChild(PIDLIST_ABSOLUTE pidl1, PCIDLIST_ABSOLUTE pidl2)
BOOL WINAPI ILIsEqual(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
#define TreeView_DeleteAllItems(hwnd)
#define TVM_SORTCHILDRENCB
#define TreeView_SelectItem(hwnd, hitem)
#define TreeView_Expand(hwnd, hitem, code)
#define TreeView_GetChild(hwnd, hitem)
#define TVIS_EXPANDEDONCE
#define TreeView_GetItemState(hwndTV, hti, mask)
#define TreeView_GetParent(hwnd, hitem)
#define TVS_SHOWSELALWAYS
#define TreeView_GetSelection(hwnd)
#define TreeView_GetItem(hwnd, pitem)
#define TreeView_GetItemRect(hwnd, hitem, prc, code)
#define TreeView_GetNextSibling(hwnd, hitem)
#define TVN_ITEMEXPANDING
#define TVN_BEGINLABELEDITW
#define TreeView_EditLabel(hwnd, hitem)
#define TreeView_SetImageList(hwnd, himl, iImage)
#define TreeView_HitTest(hwnd, lpht)
#define TreeView_InsertItem(hwnd, lpis)
#define TVIF_SELECTEDIMAGE
#define TVN_ENDLABELEDITW
#define TreeView_SetItem(hwnd, pitem)
#define TreeView_DeleteItem(hwnd, hitem)
HRESULT WINAPI SHGetImageList(int iImageList, REFIID riid, void **ppv)
#define SID_SShellBrowser
#define SID_SWebBrowserApp
#define SHCNE_DRIVEREMOVED
#define SHCNE_RENAMEFOLDER
#define SHCNRF_NewDelivery
#define SHCNRF_ShellLevel
#define SHCNE_ASSOCCHANGED
#define FCIDM_SHVIEWFIRST
ITEMIDLIST UNALIGNED * LPITEMIDLIST
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
#define DISPID_NAVIGATECOMPLETE2
#define DISPID_DOWNLOADCOMPLETE
DWORD WINAPI GetLastError(void)
_In_ DWORD _Out_ _In_ WORD wFlags
_In_ void _In_ PCCERT_CONTEXT _In_opt_ LPFILETIME _In_ DWORD _In_ DWORD _Outptr_opt_ void ** ppvObject
#define SubclassWindow(hwnd, lpfn)
#define DRAGDROP_S_USEDEFAULTCURSORS
#define DRAGDROP_S_CANCEL
#define HRESULT_FROM_WIN32(x)
HMENU WINAPI CreatePopupMenu(void)
BOOL WINAPI TranslateMessage(_In_ const MSG *)
BOOL WINAPI ShowWindow(_In_ HWND, _In_ int)
DWORD WINAPI GetMessagePos(void)
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
HWND WINAPI SetParent(_In_ HWND, _In_opt_ HWND)
BOOL WINAPI ClientToScreen(_In_ HWND, _Inout_ LPPOINT)
UINT_PTR WINAPI SetTimer(_In_opt_ HWND, _In_ UINT_PTR, _In_ UINT, _In_opt_ TIMERPROC)
HWND WINAPI SetFocus(_In_opt_ HWND)
BOOL WINAPI IsChild(_In_ HWND, _In_ HWND)
HWND WINAPI SetActiveWindow(_In_ HWND)
#define MAKEINTRESOURCEA(i)
BOOL WINAPI DestroyMenu(_In_ HMENU)
BOOL WINAPI TrackPopupMenu(_In_ HMENU, _In_ UINT, _In_ int, _In_ int, _Reserved_ int, _In_ HWND, _Reserved_ LPCRECT)
BOOL WINAPI InvalidateRect(_In_opt_ HWND, _In_opt_ LPCRECT, _In_ BOOL)
BOOL WINAPI KillTimer(_In_opt_ HWND, _In_ UINT_PTR)
BOOL WINAPI DestroyWindow(_In_ HWND)
SHORT WINAPI GetKeyState(_In_ int)
BOOL WINAPI ScreenToClient(_In_ HWND, _Inout_ LPPOINT)
#define IID_PPV_ARG(Itype, ppType)