23 #include <commoncontrols.h> 29 #define UNIMPLEMENTED DbgPrint("%s is UNIMPLEMENTED!\n", __FUNCTION__) 46 #define PT_SHELLEXT 0x2E 47 #define PT_YAGUID 0x70 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");
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)
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)
1071 pdbi->ptMinSize.x = 200;
1072 pdbi->ptMinSize.y = 30;
1075 if (pdbi->dwMask & DBIM_MAXSIZE)
1077 pdbi->ptMaxSize.y = -1;
1080 if (pdbi->dwMask & DBIM_INTEGRAL)
1082 pdbi->ptIntegral.y = 1;
1085 if (pdbi->dwMask & DBIM_ACTUAL)
1087 pdbi->ptActual.x = 200;
1088 pdbi->ptActual.y = 30;
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");
DBIM_BKCOLOR struct tagDESKBANDINFO DESKBANDINFO
LPITEMIDLIST relativePidl
BOOL WINAPI TranslateMessage(_In_ const MSG *)
BOOL OnTreeItemDeleted(LPNMTREEVIEW pnmtv)
BOOL NavigateToPIDL(LPITEMIDLIST dest, HTREEITEM *item, BOOL bExpand, BOOL bInsert, BOOL bSelect)
virtual HRESULT STDMETHODCALLTYPE GetNavigateTarget(long paramC, long param10, long param14)
void WINAPI ILFree(LPITEMIDLIST pidl)
#define HRESULT_FROM_WIN32(x)
HRESULT WINAPI AtlAdvise(IUnknown *pUnkCP, IUnknown *pUnk, const IID *iid, DWORD *pdw)
void OnSelectionChanged(LPNMTREEVIEW pnmtv)
#define TreeView_DeleteAllItems(hwnd)
virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
virtual HRESULT STDMETHODCALLTYPE DragEnter(IDataObject *pObj, DWORD glfKeyState, POINTL pt, DWORD *pdwEffect)
LPITEMIDLIST m_pidlCurrent
HWND WINAPI SetParent(_In_ HWND, _In_opt_ HWND)
#define TVM_SORTCHILDRENCB
HRESULT WINAPI StrRetToBufW(LPSTRRET src, const ITEMIDLIST *pidl, LPWSTR dest, UINT len)
virtual HRESULT STDMETHODCALLTYPE QueryService(REFGUID guidService, REFIID riid, void **ppvObject)
virtual HRESULT STDMETHODCALLTYPE QueryContinueDrag(BOOL fEscapePressed, DWORD grfKeyState)
virtual HRESULT STDMETHODCALLTYPE Load(IStream *pStm)
#define TreeView_GetChild(hwnd, hitem)
HRESULT WINAPI IUnknown_OnFocusChangeIS(LPUNKNOWN lpUnknown, LPUNKNOWN pFocusObject, BOOL bFocus)
virtual HRESULT STDMETHODCALLTYPE TranslateAcceleratorIO(LPMSG lpMsg)
NodeInfo * GetNodeInfo(HTREEITEM hItem)
virtual HRESULT STDMETHODCALLTYPE GetSite(REFIID riid, void **ppvSite)
LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
#define SHCNE_RENAMEFOLDER
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
virtual HRESULT STDMETHODCALLTYPE GetClassID(CLSID *pClassID)
virtual HRESULT STDMETHODCALLTYPE Select(long paramC)
#define DISPID_DOWNLOADCOMPLETE
DWORD WINAPI GetLastError(VOID)
CComPtr< IShellFolder > m_pDesktop
HRESULT _ReparsePIDL(LPITEMIDLIST buggyPidl, LPITEMIDLIST *cleanPidl)
GLint GLint GLint GLint GLint x
#define MAKEINTRESOURCEA(i)
#define FCIDM_SHVIEWFIRST
HWND WINAPI SetFocus(_In_opt_ HWND)
const GUID IID_IDataObject
HRESULT WINAPI RegisterDragDrop(HWND hwnd, LPDROPTARGET pDropTarget)
static int CALLBACK CompareTreeItems(LPARAM p1, LPARAM p2, LPARAM p3)
#define SHCNRF_RecursiveInterrupt
DWORD WINAPI GetMessagePos(void)
#define TreeView_GetNextSibling(hwnd, hitem)
#define TVIF_SELECTEDIMAGE
BOOL WINAPI ShowWindow(_In_ HWND, _In_ int)
#define IID_PPV_ARG(Itype, ppType)
HRESULT WINAPI IUnknown_GetWindow(IUnknown *lpUnknown, HWND *lphWnd)
BOOL WINAPI DestroyWindow(_In_ HWND)
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
HRESULT WINAPI IUnknown_QueryService(IUnknown *, REFGUID, REFIID, LPVOID *)
HRESULT WINAPI RevokeDragDrop(HWND hwnd)
virtual HRESULT STDMETHODCALLTYPE Save(IStream *pStm, BOOL fClearDirty)
#define DRAGDROP_S_CANCEL
HTREEITEM InsertItem(HTREEITEM hParent, IShellFolder *psfParent, LPITEMIDLIST pElt, LPITEMIDLIST pEltRelative, BOOL bSort)
const DWORD DROPEFFECT_COPY
int WINAPI lstrcmpiW(LPCWSTR lpString1, LPCWSTR lpString2)
HRESULT GetDisplayNameOf([in] PCUITEMID_CHILD pidl, [in] SHGDNF uFlags, [out] STRRET *lpName)
HRESULT ExecuteCommand(CComPtr< IContextMenu > &menu, UINT nCmd)
virtual HRESULT STDMETHODCALLTYPE GetWindow(HWND *lphwnd)
#define TreeView_InsertItem(hwnd, lpis)
#define TVN_ENDLABELEDITW
const DWORD DROPEFFECT_NONE
BOOL OnTreeItemExpanding(LPNMTREEVIEW pnmtv)
virtual HRESULT STDMETHODCALLTYPE IsDirty()
#define WM_USER_SHELLEVENT
HWND WINAPI SetActiveWindow(_In_ HWND)
static BOOL _ILIsSpecialFolder(LPCITEMIDLIST pidl)
BOOL RefreshTreePidl(HTREEITEM tree, LPITEMIDLIST pidlParent)
_In_ HANDLE _In_ DWORD _In_ DWORD _Inout_opt_ LPOVERLAPPED _In_opt_ LPTRANSMIT_FILE_BUFFERS _In_ DWORD dwReserved
BOOL NavigateToCurrentFolder()
#define SubclassWindow(hwnd, lpfn)
BOOL DeleteItem(LPITEMIDLIST toDelete)
HRESULT WINAPI SHGetImageList(int iImageList, REFIID riid, void **ppv)
static struct _test_info info[]
HTREEITEM m_childTargetNode
HRESULT WINAPI IUnknown_SetSite(IUnknown *obj, IUnknown *site)
virtual HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
CComPtr< IUnknown > m_pSite
#define DISPID_NAVIGATECOMPLETE2
HRESULT GetAttributesOf([in] UINT cidl, [in, size_is(cidl)] PCUITEMID_CHILD_ARRAY apidl, [in, out] SFGAOF *rgfInOut)
#define SHCNRF_InterruptLevel
#define SID_SWebBrowserApp
LPITEMIDLIST absolutePidl
LPITEMIDLIST WINAPI ILFindLastID(LPCITEMIDLIST pidl)
#define TreeView_SetImageList(hwnd, himl, iImage)
CComPtr< IDataObject > m_pCurObject
BOOL _ILIsDesktop(LPCITEMIDLIST pidl)
SHORT WINAPI GetKeyState(_In_ int)
virtual HRESULT STDMETHODCALLTYPE UIActivateIO(BOOL fActivate, LPMSG lpMsg)
#define TreeView_DeleteItem(hwnd, hitem)
CComPtr< IDropTarget > m_pDropTarget
HRESULT WINAPI AtlUnadvise(IUnknown *pUnkCP, const IID *iid, DWORD dw)
#define TreeView_GetSelection(hwnd)
HRESULT WINAPI SHGetDesktopFolder(IShellFolder **psf)
HRESULT UpdateBrowser(LPITEMIDLIST pidlGoto)
#define TreeView_HitTest(hwnd, lpht)
struct _PIDLDATA PIDLDATA
#define FAILED_UNEXPECTEDLY(hr)
#define SHCNRF_ShellLevel
#define STDMETHODCALLTYPE
#define DRAGDROP_S_USEDEFAULTCURSORS
virtual HRESULT STDMETHODCALLTYPE DragLeave()
LRESULT OnKillFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
virtual HRESULT STDMETHODCALLTYPE ResizeBorderDW(const RECT *prcBorder, IUnknown *punkToolbarSite, BOOL fReserved)
struct task_struct * current
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
virtual HRESULT STDMETHODCALLTYPE Drop(IDataObject *pObj, DWORD glfKeyState, POINTL pt, DWORD *pdwEffect)
void InitializeExplorerBand()
virtual HRESULT STDMETHODCALLTYPE HasFocusIO()
virtual HRESULT STDMETHODCALLTYPE IsWindowOwner(HWND hWnd)
virtual HRESULT STDMETHODCALLTYPE Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
INT WINAPI StrCmpLogicalW(LPCWSTR lpszStr, LPCWSTR lpszComp)
virtual HRESULT STDMETHODCALLTYPE CacheItem(long paramC)
virtual HRESULT STDMETHODCALLTYPE SetSite(IUnknown *pUnkSite)
virtual HRESULT STDMETHODCALLTYPE GetSizeMax(ULARGE_INTEGER *pcbSize)
#define memcpy(s1, s2, n)
#define TreeView_GetParent(hwnd, hitem)
REFIID LPVOID * ppvObject
static const WCHAR Cleanup[]
virtual HRESULT STDMETHODCALLTYPE DragOver(DWORD glfKeyState, POINTL pt, DWORD *pdwEffect)
#define TVN_BEGINLABELEDITW
void OnTreeItemDragging(LPNMTREEVIEW pnmtv, BOOL isRightClick)
virtual HRESULT STDMETHODCALLTYPE Invoke(long paramC)
HRESULT GetDisplayName(LPCITEMIDLIST pidlDirectory, TCHAR *szDisplayName, UINT cchMax, DWORD uFlags)
virtual HRESULT STDMETHODCALLTYPE RefreshFlags(long paramC, long param10, long param14)
BOOL WINAPI DestroyMenu(_In_ HMENU)
_In_ DWORD _Out_ _In_ WORD wFlags
#define TVN_ITEMEXPANDING
struct stdole::EXCEPINFO EXCEPINFO
static VARIANTARG static DISPID
LRESULT OnShellEvent(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
virtual HRESULT STDMETHODCALLTYPE GetBandInfo(DWORD dwBandID, DWORD dwViewMode, DESKBANDINFO *pdbi)
const DWORD DROPEFFECT_MOVE
BOOL InsertSubitems(HTREEITEM hItem, NodeInfo *pNodeInfo)
HRESULT WINAPI SHBindToParent(LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppv, LPCITEMIDLIST *ppidlLast)
virtual HRESULT STDMETHODCALLTYPE OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult)
PUIDLIST_RELATIVE WINAPI ILFindChild(PIDLIST_ABSOLUTE pidl1, PCIDLIST_ABSOLUTE pidl2)
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
#define TreeView_SelectItem(hwnd, hitem)
virtual HRESULT STDMETHODCALLTYPE QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds [], OLECMDTEXT *pCmdText)
HRESULT WINAPI DoDragDrop(IDataObject *pDataObject, IDropSource *pDropSource, DWORD dwOKEffect, DWORD *pdwEffect)
BOOL RenameItem(HTREEITEM toRename, LPITEMIDLIST newPidl)
virtual HRESULT STDMETHODCALLTYPE CloseDW(DWORD dwReserved)
virtual HRESULT STDMETHODCALLTYPE GiveFeedback(DWORD dwEffect)
virtual HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(BOOL fEnterMode)
GLint GLint GLint GLint GLint GLint y
LRESULT OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
#define TreeView_SetItem(hwnd, pitem)
#define TVS_SHOWSELALWAYS
HMENU WINAPI CreatePopupMenu(void)
LRESULT OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
int WINAPI SHMapPIDLToSystemImageListIndex(IShellFolder *sh, LPCITEMIDLIST pidl, int *pIndex)
struct stdole::DISPPARAMS DISPPARAMS
EXTERN_C ULONG WINAPI SHChangeNotifyRegister(HWND hwnd, INT fSources, LONG wEventMask, UINT uMsg, INT cItems, SHChangeNotifyEntry *lpItems)
HRESULT WINAPI SHGetFolderLocation(HWND hwndOwner, int nFolder, HANDLE hToken, DWORD dwReserved, LPITEMIDLIST *ppidl)
virtual _Must_inspect_result_ NTSTATUS QueryInterface(__in FxQueryInterfaceParams *Params)
virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT *pctinfo)
#define SID_SShellBrowser
BOOL WINAPI ScreenToClient(_In_ HWND, _Inout_ LPPOINT)
#define TreeView_Expand(hwnd, hitem, code)
LRESULT ContextMenuHack(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
ITEMIDLIST UNALIGNED * LPITEMIDLIST
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
BOOL WINAPI TrackPopupMenu(_In_ HMENU, _In_ UINT, _In_ int, _In_ int, _Reserved_ int, _In_ HWND, _Reserved_ LPCRECT)
#define TreeView_GetItem(hwnd, pitem)
static IShellFolder IShellItem **static IBindCtx LPITEMIDLIST SFGAOF
void DestroyExplorerBand()
virtual HRESULT STDMETHODCALLTYPE ShowDW(BOOL fShow)
struct _PIDLDATA * LPPIDLDATA