23#include <commoncontrols.h>
29#define UNIMPLEMENTED DbgPrint("%s is UNIMPLEMENTED!\n", __FUNCTION__)
46#define PT_SHELLEXT 0x2E
55 PT_YAGUID == lpPData->
type)) || (pidl && pidl->mkid.cb == 0x00)));
65 if (pidlDirectory ==
NULL || szDisplayName ==
NULL)
102 EnumFlags = SHCONTF_FOLDERS | SHCONTF_INCLUDEHIDDEN;
107 ERR(
"Can't bind to parent folder\n");
113 ERR(
"PIDL doesn't belong to the shell namespace, aborting\n");
117 hr = persist->GetCurFolder(&correctParent);
120 ERR(
"Unable to get current folder\n");
128 ERR(
"Can't enum the folder !\n");
132 while(
SUCCEEDED(pEnumIDList->Next(1, &correctChild, &fetched)) && correctChild && fetched)
134 if (!
folder->CompareIDs(0, childPidl, correctChild))
136 *cleanPidl =
ILCombine(correctParent, correctChild);
150 , m_bNavigating(
FALSE)
153 , m_pidlCurrent(
NULL)
192 ERR(
"Failed to create root item\n");
234 CComPtr <IWebBrowser2> browserService;
236 TRACE(
"Cleaning up explorer band ...\n");
248 TRACE(
"Cleanup done !\n");
256 tvItem.hItem =
hItem;
261 return reinterpret_cast<NodeInfo*
>(tvItem.lParam);
267 CMINVOKECOMMANDINFO cmi;
275 hr = pBrowserOleWnd->GetWindow(&browserWnd);
280 cmi.cbSize =
sizeof(cmi);
282 cmi.hwnd = browserWnd;
284 cmi.fMask |= CMIC_MASK_SHIFT_DOWN;
286 cmi.fMask |= CMIC_MASK_CONTROL_DOWN;
288 return menu->InvokeCommand(&cmi);
300 hr = pBrowserService->BrowseObject(pidlGoto, SBSP_SAMEBROWSER | SBSP_ABSOLUTE);
318 if (pnmtv->itemNew.hItem ==
m_hRoot)
323 pnmtv->itemNew.state &= ~TVIS_EXPANDED;
332 if (pNodeInfo && !pNodeInfo->
expanded)
338 tvItem.hItem = pnmtv->itemNew.hItem;
339 tvItem.cChildren = 0;
377 if (!pnmtv->itemNew.lParam)
389 SFGAOF attrs = SFGAO_CANCOPY | SFGAO_CANMOVE | SFGAO_CANLINK;
390 pSrcFolder->GetAttributesOf(1, &pLast, &attrs);
393 if (attrs & SFGAO_CANCOPY)
395 if (attrs & SFGAO_CANMOVE)
397 if (attrs & SFGAO_CANLINK)
432 if (
x == -1 &&
y == -1)
440 ERR(
"No node data, something has gone wrong !\n");
447 ERR(
"Can't bind to folder!\n");
450 hr = pFolder->GetUIObjectOf(m_hWnd, 1, (
LPCITEMIDLIST*)&pidlChild, IID_IContextMenu,
451 NULL,
reinterpret_cast<void**
>(&contextMenu));
454 ERR(
"Can't get IContextMenu interface\n");
465 WARN(
"Can't get context menu for item\n");
521 ERR(
"Can't reparse PIDL to a valid one\n");
533 ERR(
"Can't reparse PIDL to a valid one\n");
542 TRACE(
"Directory updated\n");
545 TRACE(
"Unhandled message\n");
572 SFGAOF attrs = SFGAO_STREAM | SFGAO_HASSUBFOLDER;
578 if (attrs & SFGAO_STREAM)
580 TRACE(
"Ignoring stream\n");
601 ERR(
"Failed to allocate NodeInfo\n");
611 tvInsert.hParent = hParent;
614 tvInsert.item.cchTextMax =
MAX_PATH;
615 tvInsert.item.pszText = wszDisplayName;
616 tvInsert.item.iImage = tvInsert.item.iSelectedImage = iIcon;
617 tvInsert.item.cChildren = (attrs & SFGAO_HASSUBFOLDER) ? 1 : 0;
618 tvInsert.item.lParam = (
LPARAM)pChildInfo;
625 sortCallback.
hParent = hParent;
642 return InsertItem(hParent, psfFolder, pElt, pEltRelative, bSort);
660 EnumFlags = SHCONTF_FOLDERS;
665 ERR(
"Can't get desktop PIDL !\n");
681 ERR(
"Can't bind folder to desktop !\n");
688 EnumFlags |= SHCONTF_INCLUDEHIDDEN;
691 hr = pFolder->EnumObjects(
NULL,EnumFlags,&pEnumIDList);
696 ERR(
"Can't enum the folder !\n");
702 while(
SUCCEEDED(pEnumIDList->Next(1, &pidlSub, &fetched)) && pidlSub && fetched)
753 ERR(
"Something has gone wrong, no data associated to node !\n");
768 if (relativeChild != 0)
773 tvItem.cChildren = 1;
837 ERR(
"Can't get IBrowserService !\n");
841 hr = pBrowserService->GetPidl(&explorerPidl);
844 ERR(
"Unable to get browser PIDL !\n");
880 tvItem.hItem = parentNode;
898 itemInfo.hItem = toRename;
903 if (!itemInfo.lParam)
905 ERR(
"Unable to fetch lParam\n");
909 treeInfo = (
NodeInfo*)itemInfo.lParam;
918 itemInfo.hItem = toRename;
920 itemInfo.pszText = wszDisplayName;
946 WARN(
"No tree info !\n");
953 WARN(
"PIDL allocation failed\n");
968 WARN(
"No tree info !\n");
1000 return lstrcmpiW(wszFolder1,wszFolder2);
1027 return (
hr > 0) ? -1 : 1;
1052 TRACE(
"CloseDW called\n");
1079 if (pdbi->
dwMask & DBIM_MINSIZE)
1085 if (pdbi->
dwMask & DBIM_MAXSIZE)
1090 if (pdbi->
dwMask & DBIM_INTEGRAL)
1095 if (pdbi->
dwMask & DBIM_ACTUAL)
1101 if (pdbi->
dwMask & DBIM_TITLE)
1107 if (pdbi->
dwMask & DBIM_MODEFLAGS)
1109 pdbi->
dwModeFlags = DBIMF_NORMAL | DBIMF_VARIABLEHEIGHT;
1112 if (pdbi->
dwMask & DBIM_BKCOLOR)
1114 pdbi->
dwMask &= ~DBIM_BKCOLOR;
1129 TRACE(
"SetSite called \n");
1148 ERR(
"Could not get parent's window ! Status: %08lx\n",
hr);
1163 0, 0, 0, 0, parentWnd,
NULL, _AtlBaseModule.GetModuleInstance(),
NULL);
1230 if (lpMsg->
hwnd == m_hWnd ||
1246 memcpy(pClassID, &CLSID_ExplorerBand,
sizeof(
CLSID));
1287 switch (pNotifyHeader->
code)
1312 DWORD dwAttr = SFGAO_CANRENAME;
1327 hr =
pParent->GetAttributesOf(1, &pChild, &dwAttr);
1345 if (dispInfo->item.pszText)
1355 hr =
pParent->SetNameOf(0, pidlChild, dispInfo->item.pszText, SHGDN_INFOLDER, &pidlNew);
1365 hr = pPersist->GetCurFolder(&pidlParent);
1368 pidlNewAbs =
ILCombine(pidlParent, pidlNew);
1453 switch (dispIdMember)
1457 TRACE(
"DISPID_NAVIGATECOMPLETE2 received\n");
1461 TRACE(
"Unknown dispid requested: %08x\n", dispIdMember);
1468 ERR(
"Entering drag\n");
1510 hr = pShellFldr->GetUIObjectOf(m_hWnd, 1, &pChild, IID_IDropTarget,
NULL,
reinterpret_cast<void**
>(&pDropTarget));
1522 ERR(
"Can't bind to folder object\n");
1531 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 ULONG WINAPI SHChangeNotifyRegister(HWND hwnd, INT fSources, LONG wEventMask, UINT uMsg, INT cItems, SHChangeNotifyEntry *lpItems)
LPITEMIDLIST relativePidl
LPITEMIDLIST absolutePidl
HTREEITEM InsertItem(HTREEITEM hParent, IShellFolder *psfParent, LPITEMIDLIST pElt, LPITEMIDLIST pEltRelative, BOOL bSort)
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() 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
STDMETHOD() Select(long paramC) override
void OnSelectionChanged(LPNMTREEVIEW pnmtv)
STDMETHOD() IsWindowOwner(HWND hWnd) override
STDMETHOD() Invoke(long paramC) override
HRESULT ExecuteCommand(CComPtr< IContextMenu > &menu, UINT nCmd)
STDMETHOD() ShowDW(BOOL fShow) override
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
void InitializeExplorerBand()
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() RefreshFlags(long paramC, long param10, long param14) override
STDMETHOD() Load(IStream *pStm) override
STDMETHOD() GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId) override
BOOL DeleteItem(LPITEMIDLIST toDelete)
HRESULT UpdateBrowser(LPITEMIDLIST pidlGoto)
BOOL NavigateToCurrentFolder()
STDMETHOD() CacheItem(long paramC) override
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
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
BOOL RefreshTreePidl(HTREEITEM tree, LPITEMIDLIST pidlParent)
LRESULT OnKillFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
NodeInfo * GetNodeInfo(HTREEITEM hItem)
STDMETHOD() QueryContinueDrag(BOOL fEscapePressed, DWORD grfKeyState) override
BOOL NavigateToPIDL(LPITEMIDLIST dest, HTREEITEM *item, BOOL bExpand, BOOL bInsert, BOOL bSelect)
STDMETHOD() ContextSensitiveHelp(BOOL fEnterMode) override
STDMETHOD() GiveFeedback(DWORD dwEffect) override
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() GetNavigateTarget(long paramC, long param10, long param14) override
BOOL RenameItem(HTREEITEM toRename, LPITEMIDLIST newPidl)
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)
#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 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 _ReparsePIDL(LPITEMIDLIST buggyPidl, LPITEMIDLIST *cleanPidl)
HRESULT GetDisplayName(LPCITEMIDLIST pidlDirectory, TCHAR *szDisplayName, UINT cchMax, DWORD uFlags)
static BOOL _ILIsSpecialFolder(LPCITEMIDLIST pidl)
#define WM_USER_SHELLEVENT
GLint GLint GLint GLint GLint x
GLint GLint GLint GLint GLint GLint y
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
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 GetAttributesOf([in] UINT cidl, [in, size_is(cidl)] PCUITEMID_CHILD_ARRAY apidl, [in, out] SFGAOF *rgfInOut)
#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)
#define TreeView_DeleteAllItems(hwnd)
#define TVM_SORTCHILDRENCB
#define TreeView_SelectItem(hwnd, hitem)
#define TreeView_Expand(hwnd, hitem, code)
#define TreeView_GetChild(hwnd, hitem)
#define TreeView_GetParent(hwnd, hitem)
#define TVS_SHOWSELALWAYS
#define TreeView_GetSelection(hwnd)
#define TreeView_GetItem(hwnd, pitem)
#define TreeView_GetNextSibling(hwnd, hitem)
#define TVN_ITEMEXPANDING
#define TVN_BEGINLABELEDITW
#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 SHCNRF_RecursiveInterrupt
#define SHCNE_RENAMEFOLDER
#define SHCNRF_ShellLevel
#define FCIDM_SHVIEWFIRST
#define SHCNRF_InterruptLevel
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)
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 DestroyWindow(_In_ HWND)
SHORT WINAPI GetKeyState(_In_ int)
BOOL WINAPI ScreenToClient(_In_ HWND, _Inout_ LPPOINT)
#define IID_PPV_ARG(Itype, ppType)