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)
152 , m_pidlCurrent(
NULL)
191 ERR(
"Failed to create root item\n");
233 CComPtr <IWebBrowser2> browserService;
235 TRACE(
"Cleaning up explorer band ...\n");
247 TRACE(
"Cleanup done !\n");
255 tvItem.hItem =
hItem;
260 return reinterpret_cast<NodeInfo*
>(tvItem.lParam);
266 CMINVOKECOMMANDINFO cmi;
274 hr = pBrowserOleWnd->GetWindow(&browserWnd);
279 cmi.cbSize =
sizeof(cmi);
281 cmi.hwnd = browserWnd;
283 cmi.fMask |= CMIC_MASK_SHIFT_DOWN;
285 cmi.fMask |= CMIC_MASK_CONTROL_DOWN;
287 return menu->InvokeCommand(&cmi);
299 hr = pBrowserService->BrowseObject(pidlGoto, SBSP_SAMEBROWSER | SBSP_ABSOLUTE);
317 if (pnmtv->itemNew.hItem ==
m_hRoot)
322 pnmtv->itemNew.state &= ~TVIS_EXPANDED;
331 if (pNodeInfo && !pNodeInfo->
expanded)
337 tvItem.hItem = pnmtv->itemNew.hItem;
338 tvItem.cChildren = 0;
384 if (!pnmtv->itemNew.lParam)
390 hr = pSrcFolder->GetUIObjectOf(m_hWnd, 1, &pLast,
IID_IDataObject, 0,
reinterpret_cast<void**
>(&pObj));
422 if (
x == -1 &&
y == -1)
430 ERR(
"No node data, something has gone wrong !\n");
437 ERR(
"Can't bind to folder!\n");
440 hr = pFolder->GetUIObjectOf(m_hWnd, 1, (
LPCITEMIDLIST*)&pidlChild, IID_IContextMenu,
441 NULL,
reinterpret_cast<void**
>(&contextMenu));
444 ERR(
"Can't get IContextMenu interface\n");
455 WARN(
"Can't get context menu for item\n");
511 ERR(
"Can't reparse PIDL to a valid one\n");
523 ERR(
"Can't reparse PIDL to a valid one\n");
532 TRACE(
"Directory updated\n");
535 TRACE(
"Unhandled message\n");
562 SFGAOF attrs = SFGAO_STREAM | SFGAO_HASSUBFOLDER;
568 if ((attrs & SFGAO_STREAM))
570 TRACE(
"Ignoring stream\n");
591 ERR(
"Failed to allocate NodeInfo\n");
601 tvInsert.hParent = hParent;
604 tvInsert.item.cchTextMax =
MAX_PATH;
605 tvInsert.item.pszText = wszDisplayName;
606 tvInsert.item.iImage = tvInsert.item.iSelectedImage = iIcon;
607 tvInsert.item.cChildren = (attrs & SFGAO_HASSUBFOLDER) ? 1 : 0;
608 tvInsert.item.lParam = (
LPARAM)pChildInfo;
615 sortCallback.
hParent = hParent;
632 return InsertItem(hParent, psfFolder, pElt, pEltRelative, bSort);
650 EnumFlags = SHCONTF_FOLDERS;
655 ERR(
"Can't get desktop PIDL !\n");
671 ERR(
"Can't bind folder to desktop !\n");
678 EnumFlags |= SHCONTF_INCLUDEHIDDEN;
681 hr = pFolder->EnumObjects(
NULL,EnumFlags,&pEnumIDList);
686 ERR(
"Can't enum the folder !\n");
692 while(
SUCCEEDED(pEnumIDList->Next(1, &pidlSub, &fetched)) && pidlSub && fetched)
743 ERR(
"Something has gone wrong, no data associated to node !\n");
758 if (relativeChild != 0)
763 tvItem.cChildren = 1;
827 ERR(
"Can't get IBrowserService !\n");
831 hr = pBrowserService->GetPidl(&explorerPidl);
834 ERR(
"Unable to get browser PIDL !\n");
870 tvItem.hItem = parentNode;
888 itemInfo.hItem = toRename;
893 if (!itemInfo.lParam)
895 ERR(
"Unable to fetch lParam\n");
899 treeInfo = (
NodeInfo*)itemInfo.lParam;
908 itemInfo.hItem = toRename;
910 itemInfo.pszText = wszDisplayName;
936 WARN(
"No tree info !\n");
943 WARN(
"PIDL allocation failed\n");
958 WARN(
"No tree info !\n");
1017 return (
hr > 0) ? -1 : 1;
1042 TRACE(
"CloseDW called\n");
1069 if (pdbi->
dwMask & DBIM_MINSIZE)
1075 if (pdbi->
dwMask & DBIM_MAXSIZE)
1080 if (pdbi->
dwMask & DBIM_INTEGRAL)
1085 if (pdbi->
dwMask & DBIM_ACTUAL)
1091 if (pdbi->
dwMask & DBIM_TITLE)
1097 if (pdbi->
dwMask & DBIM_MODEFLAGS)
1099 pdbi->
dwModeFlags = DBIMF_NORMAL | DBIMF_VARIABLEHEIGHT;
1102 if (pdbi->
dwMask & DBIM_BKCOLOR)
1104 pdbi->
dwMask &= ~DBIM_BKCOLOR;
1119 TRACE(
"SetSite called \n");
1138 ERR(
"Could not get parent's window ! Status: %08lx\n",
hr);
1153 0, 0, 0, 0, parentWnd,
NULL, _AtlBaseModule.GetModuleInstance(),
NULL);
1220 if (lpMsg->
hwnd == m_hWnd)
1235 memcpy(pClassID, &CLSID_ExplorerBand,
sizeof(
CLSID));
1276 switch (pNotifyHeader->
code)
1300 DWORD dwAttr = SFGAO_CANRENAME;
1315 hr =
pParent->GetAttributesOf(1, &pChild, &dwAttr);
1316 if (
SUCCEEDED(
hr) && (dwAttr & SFGAO_CANRENAME) && theResult)
1328 if (dispInfo->item.pszText)
1338 hr =
pParent->SetNameOf(0, pidlChild, dispInfo->item.pszText, SHGDN_INFOLDER, &pidlNew);
1348 hr = pPersist->GetCurFolder(&pidlParent);
1351 pidlNewAbs =
ILCombine(pidlParent, pidlNew);
1436 switch (dispIdMember)
1440 TRACE(
"DISPID_NAVIGATECOMPLETE2 received\n");
1444 TRACE(
"Unknown dispid requested: %08x\n", dispIdMember);
1451 ERR(
"Entering drag\n");
1493 hr = pShellFldr->GetUIObjectOf(m_hWnd, 1, &pChild, IID_IDropTarget,
NULL,
reinterpret_cast<void**
>(&pDropTarget));
1505 ERR(
"Can't bind to folder object\n");
1514 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)
BOOL OnTreeItemExpanding(LPNMTREEVIEW pnmtv)
virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
void DestroyExplorerBand()
virtual HRESULT STDMETHODCALLTYPE DragOver(DWORD glfKeyState, POINTL pt, DWORD *pdwEffect)
virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT *pctinfo)
virtual HRESULT STDMETHODCALLTYPE TranslateAcceleratorIO(LPMSG lpMsg)
void OnSelectionChanged(LPNMTREEVIEW pnmtv)
virtual HRESULT STDMETHODCALLTYPE QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT *pCmdText)
virtual HRESULT STDMETHODCALLTYPE Drop(IDataObject *pObj, DWORD glfKeyState, POINTL pt, DWORD *pdwEffect)
virtual HRESULT STDMETHODCALLTYPE GetClassID(CLSID *pClassID)
HRESULT ExecuteCommand(CComPtr< IContextMenu > &menu, UINT nCmd)
virtual HRESULT STDMETHODCALLTYPE RefreshFlags(long paramC, long param10, long param14)
LRESULT OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
virtual HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
virtual HRESULT STDMETHODCALLTYPE Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
virtual HRESULT STDMETHODCALLTYPE QueryContinueDrag(BOOL fEscapePressed, DWORD grfKeyState)
virtual HRESULT STDMETHODCALLTYPE Save(IStream *pStm, BOOL fClearDirty)
virtual HRESULT STDMETHODCALLTYPE GetNavigateTarget(long paramC, long param10, long param14)
virtual HRESULT STDMETHODCALLTYPE UIActivateIO(BOOL fActivate, LPMSG lpMsg)
virtual HRESULT STDMETHODCALLTYPE DragLeave()
virtual HRESULT STDMETHODCALLTYPE Select(long paramC)
void InitializeExplorerBand()
virtual HRESULT STDMETHODCALLTYPE QueryService(REFGUID guidService, REFIID riid, void **ppvObject)
HTREEITEM m_childTargetNode
virtual HRESULT STDMETHODCALLTYPE IsWindowOwner(HWND hWnd)
virtual HRESULT STDMETHODCALLTYPE Load(IStream *pStm)
static int CALLBACK CompareTreeItems(LPARAM p1, LPARAM p2, LPARAM p3)
virtual HRESULT STDMETHODCALLTYPE CacheItem(long paramC)
virtual HRESULT STDMETHODCALLTYPE GetBandInfo(DWORD dwBandID, DWORD dwViewMode, DESKBANDINFO *pdbi)
BOOL DeleteItem(LPITEMIDLIST toDelete)
HRESULT UpdateBrowser(LPITEMIDLIST pidlGoto)
virtual HRESULT STDMETHODCALLTYPE ShowDW(BOOL fShow)
BOOL NavigateToCurrentFolder()
LPITEMIDLIST m_pidlCurrent
virtual HRESULT STDMETHODCALLTYPE OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult)
virtual HRESULT STDMETHODCALLTYPE HasFocusIO()
virtual HRESULT STDMETHODCALLTYPE SetSite(IUnknown *pUnkSite)
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)
virtual HRESULT STDMETHODCALLTYPE GetWindow(HWND *lphwnd)
virtual HRESULT STDMETHODCALLTYPE GetSizeMax(ULARGE_INTEGER *pcbSize)
BOOL NavigateToPIDL(LPITEMIDLIST dest, HTREEITEM *item, BOOL bExpand, BOOL bInsert, BOOL bSelect)
virtual HRESULT STDMETHODCALLTYPE GiveFeedback(DWORD dwEffect)
LRESULT OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
LRESULT ContextMenuHack(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
virtual HRESULT STDMETHODCALLTYPE GetSite(REFIID riid, void **ppvSite)
CComPtr< IShellFolder > m_pDesktop
BOOL OnTreeItemDeleted(LPNMTREEVIEW pnmtv)
CComPtr< IDropTarget > m_pDropTarget
virtual HRESULT STDMETHODCALLTYPE CloseDW(DWORD dwReserved)
virtual HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(BOOL fEnterMode)
virtual HRESULT STDMETHODCALLTYPE DragEnter(IDataObject *pObj, DWORD glfKeyState, POINTL pt, DWORD *pdwEffect)
LRESULT OnShellEvent(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
BOOL InsertSubitems(HTREEITEM hItem, NodeInfo *pNodeInfo)
virtual HRESULT STDMETHODCALLTYPE Invoke(long paramC)
virtual HRESULT STDMETHODCALLTYPE IsDirty()
virtual HRESULT STDMETHODCALLTYPE ResizeBorderDW(const RECT *prcBorder, IUnknown *punkToolbarSite, BOOL fReserved)
BOOL RenameItem(HTREEITEM toRename, LPITEMIDLIST newPidl)
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)
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_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)
int WINAPI lstrcmpiW(LPCWSTR lpString1, LPCWSTR lpString2)
#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 FAILED_UNEXPECTEDLY(hr)
#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)
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)