10#include <commoncontrols.h>
13#define TIMER_ID_REFRESH 9999
25 CComPtr<IShellLink> pShellLink;
31 CComPtr<IPersistFile> pPersistFile;
56 CComPtr<IShellLink> psl;
62 psl->SetIDList(pidlTarget);
65 psl->SetDescription(pszDescription);
67 CComPtr<IPersistFile> ppf;
72 return ppf->Save(pszLnkFileName,
TRUE);
85 if (m_hToolbarImageList)
88 m_hToolbarImageList =
NULL;
111 return reinterpret_cast<CItemData*
>(tvItem.
lParam);
117 CComPtr<IFolderView> pfv;
118 CComPtr<IShellFolder> psf;
128 CComPtr<IShellBrowser> psb;
133 CComPtr<IBrowserService> pbs;
138 CComPtr<IShellView> psv;
160 CComPtr<IOleWindow> pBrowserOleWnd;
167 hr = pBrowserOleWnd->GetWindow(&browserWnd);
171 CMINVOKECOMMANDINFO cmi = {
sizeof(cmi) };
173 cmi.hwnd = browserWnd;
176 cmi.fMask |= CMIC_MASK_SHIFT_DOWN;
178 cmi.fMask |= CMIC_MASK_CONTROL_DOWN;
180 return menu->InvokeCommand(&cmi);
183void CNSCBand::_RegisterChangeNotify()
185#define TARGET_EVENTS ( \
186 SHCNE_DRIVEADD | SHCNE_MKDIR | SHCNE_CREATE | SHCNE_DRIVEREMOVED | SHCNE_RMDIR | \
187 SHCNE_DELETE | SHCNE_RENAMEFOLDER | SHCNE_RENAMEITEM | SHCNE_UPDATEDIR | \
188 SHCNE_UPDATEITEM | SHCNE_ASSOCCHANGED \
203void CNSCBand::_UnregisterChangeNotify()
209void CNSCBand::_DestroyTreeView()
211 TRACE(
"Cleaning up treeview...\n");
215 m_hwndTreeView.DestroyWindow();
218 TRACE(
"Cleanup ok\n");
221void CNSCBand::_DestroyToolbar()
223 m_hwndToolbar.DestroyWindow();
228 RefreshFlags(&m_dwTVStyle, &m_dwTVExStyle, &m_dwEnumFlags);
235 m_hwndTreeView.Attach(hwndTV);
259CNSCBand::_IsTreeItemInEnum(
263 CItemData* pItemData = GetItemData(
hItem);
269 CComHeapPtr<ITEMIDLIST_RELATIVE> pidlTemp;
270 while (pEnum->Next(1, &pidlTemp,
NULL) ==
S_OK)
272 if (
ILIsEqual(pidlTemp, pItemData->relativePidl))
282CNSCBand::_TreeItemHasThisChild(
289 CItemData* pItemData = GetItemData(
hItem);
290 if (
ILIsEqual(pItemData->relativePidl, pidlChild))
298CNSCBand::_GetItemEnum(
299 _Out_ CComPtr<IEnumIDList>& pEnum,
303 CComPtr<IShellFolder> psfDesktop;
308 CComPtr<IShellFolder> pFolder;
314 *ppFolder = psfDesktop;
319 CItemData* pItemData = GetItemData(
hItem);
328 return (*ppFolder)->EnumObjects(
NULL, _GetEnumFlags(), &pEnum);
333 CComPtr<IEnumIDList> pEnum;
338 CComHeapPtr<ITEMIDLIST_RELATIVE> pidlTemp;
339 hr = pEnum->Next(1, &pidlTemp,
NULL);
345 CComPtr<IEnumIDList> pEnum;
346 HRESULT hrEnum = _GetItemEnum(pEnum, hTarget);
359 hrEnum = _GetItemEnum(pEnum, hTarget);
361 CItemData* pItemData = ((hTarget ==
TVI_ROOT) ?
NULL : GetItemData(hTarget));
366 CComHeapPtr<ITEMIDLIST_RELATIVE> pidlTemp;
367 while (pEnum->Next(1, &pidlTemp,
NULL) ==
S_OK)
369 if (!_TreeItemHasThisChild(hTarget, pidlTemp))
373 CComHeapPtr<ITEMIDLIST> pidlAbsolute(
ILCombine(pItemData->absolutePidl, pidlTemp));
374 _InsertItem(hTarget, pidlAbsolute, pidlTemp,
TRUE);
378 CComHeapPtr<ITEMIDLIST> pidlAbsolute(
ILCombine(m_pidlRoot, pidlTemp));
379 _InsertItem(hTarget, pidlAbsolute, pidlTemp,
TRUE);
393 item.cChildren = _ItemHasAnyChild(
hItem);
397 _RefreshRecurse(
hItem);
401void CNSCBand::_Refresh()
404 _RefreshRecurse(_WantsRootItem() ? m_hRoot :
TVI_ROOT);
419CNSCBand::OnChangeNotify(
451CNSCBand::_InsertItem(
459 SFGAOF attrs = SFGAO_STREAM | SFGAO_HASSUBFOLDER;
460 HRESULT hr = psfParent->GetAttributesOf(1, &pEltRelative, &attrs);
467 hr = psfParent->GetDisplayNameOf(pEltRelative, SHGDN_INFOLDER, &strret);
478 CItemData* pChildInfo =
new CItemData;
481 ERR(
"Failed to allocate CItemData\n");
484 pChildInfo->absolutePidl.Attach(
ILClone(pElt));
485 pChildInfo->relativePidl.Attach(
ILClone(pEltRelative));
490 tvInsert.item.cchTextMax =
MAX_PATH;
491 tvInsert.item.pszText = wszDisplayName;
492 tvInsert.item.iImage = tvInsert.item.iSelectedImage = iIcon;
493 tvInsert.item.lParam = (
LPARAM)pChildInfo;
495 if (!(attrs & SFGAO_STREAM) && (attrs & SFGAO_HASSUBFOLDER))
496 tvInsert.item.cChildren = 1;
508CNSCBand::_InsertItem(
514 CComPtr<IShellFolder> psfFolder;
519 return _InsertItem(hParent, psfFolder, pElt, pEltRelative, bSort);
524 ULONG fetched = 1, uItemCount = 0;
526 CComPtr<IEnumIDList> pEnum;
527 CComPtr<IShellFolder> pFolder;
536 while (
SUCCEEDED(pEnum->Next(1, &pidlSub, &fetched)) && pidlSub && fetched)
541 if (_InsertItem(
hItem, pFolder, pidlSubComplete, pidlSub,
FALSE))
554 return (uItemCount > 0);
572 _UnregisterChangeNotify();
590 m_hwndToolbar.GetWindowRect(&rcTB);
594 m_hwndTreeView.MoveWindow(0, cyTB,
cx,
cy - cyTB);
613HRESULT CNSCBand::_AddFavorite()
615 CComHeapPtr<ITEMIDLIST> pidlCurrent;
616 _GetCurrentLocation(&pidlCurrent);
630 for (
INT iTry = 2; iTry <= 9999; ++iTry)
669 CItemData *pItemData;
673 if (pnmtv->itemNew.hItem == m_hRoot)
678 pnmtv->itemNew.state &= ~TVIS_EXPANDED;
687 pItemData = GetItemData(pnmtv->itemNew.hItem);
689 if (pItemData && !pItemData->expanded)
691 if (_InsertSubitems(pnmtv->itemNew.hItem, pItemData->absolutePidl))
693 pItemData->expanded =
TRUE;
716 CItemData* pItemData = GetItemData(
hItem);
730 CItemData* pItemData = GetItemData(
hItem);
732 OnSelectionChanged(pItemData->absolutePidl);
737 CItemData* pItemData = GetItemData(pnmtv->itemNew.hItem);
742 CComPtr<IShellFolder> pSrcFolder;
748 SFGAOF attrs = SFGAO_CANCOPY | SFGAO_CANMOVE | SFGAO_CANLINK;
752 if (attrs & SFGAO_CANCOPY)
753 dwEffect |= DROPEFFECT_COPY;
754 if (attrs & SFGAO_CANMOVE)
755 dwEffect |= DROPEFFECT_MOVE;
756 if (attrs & SFGAO_CANLINK)
757 dwEffect |= DROPEFFECT_LINK;
759 CComPtr<IDataObject> pObj;
770 DWORD dwAttr = SFGAO_CANRENAME;
775 CItemData *
info = GetItemData(dispInfo->item.hItem);
783 hr =
pParent->GetAttributesOf(1, &pChild, &dwAttr);
787 m_oldSelected =
NULL;
796 CComPtr<IShellBrowser> pBrowserService;
802 hr = pBrowserService->BrowseObject(pidlGoto, SBSP_SAMEBROWSER | SBSP_ABSOLUTE);
811 CItemData *
info = GetItemData(dispInfo->item.hItem);
817 ++m_mtxBlockNavigate;
819 --m_mtxBlockNavigate;
822 if (!dispInfo->item.pszText)
827 BOOL RenamedCurrent = _IsCurrentLocation(
info->absolutePidl) ==
S_OK;
833 CComHeapPtr<ITEMIDLIST> pidlNew;
834 hr =
pParent->SetNameOf(m_hWnd, pidlChild, dispInfo->item.pszText, SHGDN_INFOLDER, &pidlNew);
837 CComPtr<IPersistFolder2> pPersist;
842 CComHeapPtr<ITEMIDLIST> pidlParent;
843 hr = pPersist->GetCurFolder(&pidlParent);
847 CComHeapPtr<ITEMIDLIST> pidlNewAbs(
ILCombine(pidlParent, pidlNew));
850 _UpdateBrowser(pidlNewAbs);
867 switch (pnmhdr->
code)
873 if (pnmhdr->
hwndFrom == m_hwndTreeView)
881 if (pnmhdr->
hwndFrom == m_hwndTreeView)
941 if (hwndTarget && (hwndTarget == m_hwndToolbar || hwndTarget == m_hWnd))
943 FIXME(
"Show 'Close Toolbar' menu\n");
967 ERR(
"No node data, something has gone wrong\n");
971 CComPtr<IShellFolder> pFolder;
977 CComPtr<IContextMenu> contextMenu;
984 UINT cmf = CMF_EXPLORE;
986 hr = pFolder->GetAttributesOf(1, &pidlChild, &
attr);
988 cmf |= CMF_CANRENAME;
1000 uCommand -= idCmdFirst;
1003 if ((cmf & CMF_CANRENAME) &&
SHELL_IsVerb(contextMenu, uCommand,
L"rename"))
1005 m_hwndTreeView.SetFocus();
1007 m_oldSelected =
hItem;
1011 hr = _ExecuteCommand(contextMenu, uCommand);
1060 TRACE(
"CloseDW called\n");
1084 m_dwBandID = dwBandID;
1086 if (pdbi->
dwMask & DBIM_MINSIZE)
1092 if (pdbi->
dwMask & DBIM_MAXSIZE)
1095 if (pdbi->
dwMask & DBIM_INTEGRAL)
1098 if (pdbi->
dwMask & DBIM_ACTUAL)
1104 if (pdbi->
dwMask & DBIM_TITLE)
1109 if (pdbi->
dwMask & DBIM_MODEFLAGS)
1110 pdbi->
dwModeFlags = DBIMF_NORMAL | DBIMF_VARIABLEHEIGHT;
1112 if (pdbi->
dwMask & DBIM_BKCOLOR)
1113 pdbi->
dwMask &= ~DBIM_BKCOLOR;
1124 if (pUnkSite == m_pSite)
1127 TRACE(
"SetSite called\n");
1135 if (pUnkSite != m_pSite)
1158 _RegisterChangeNotify();
1173STDMETHODIMP CNSCBand::QueryStatus(
const GUID *pguidCmdGroup,
ULONG cCmds, OLECMD prgCmds [], OLECMDTEXT *pCmdText)
1206 LPCMINVOKECOMMANDINFO lpici)
1229 m_hwndTreeView.SetFocus();
1248 if (lpMsg->
hwnd == m_hWnd ||
1332 *pulAttrib |= SFGAO_LINK;
1337 *pulAttrib |= SFGAO_FOLDER;
1362 *pdwStyle = _GetTVStyle();
1363 *pdwExStyle = _GetTVExStyle();
1364 *dwEnum = _GetEnumFlags();
1378 ERR(
"Entering drag\n");
1379 m_pCurObject = pObj;
1381 return DragOver(glfKeyState,
pt, pdwEffect);
1399 m_childTargetNode =
NULL;
1400 m_pDropTarget =
NULL;
1401 *pdwEffect = DROPEFFECT_NONE;
1405 ++m_mtxBlockNavigate;
1407 --m_mtxBlockNavigate;
1410 if (m_pDropTarget &&
info.hItem != m_childTargetNode)
1411 m_pDropTarget =
NULL;
1413 if (
info.hItem != m_childTargetNode)
1415 CItemData *pItemData = GetItemData(
info.hItem);
1419 CComPtr<IShellFolder> pFolder;
1422 pFolder = m_pDesktop;
1430 ERR(
"Can't bind to folder object\n");
1431 *pdwEffect = DROPEFFECT_NONE;
1440 ERR(
"Can't get drop target for folder object\n");
1441 *pdwEffect = DROPEFFECT_NONE;
1445 hr = m_pDropTarget->DragEnter(m_pCurObject, glfKeyState,
pt, pdwEffect);
1446 m_childTargetNode =
info.hItem;
1450 hr = m_pDropTarget->DragOver(glfKeyState,
pt, pdwEffect);
1457 ++m_mtxBlockNavigate;
1459 --m_mtxBlockNavigate;
1460 m_childTargetNode =
NULL;
1462 m_pCurObject =
NULL;
1470 m_pDropTarget->Drop(pObj, glfKeyState,
pt, pdwEffect);
BOOL _ILIsDesktop(LPCITEMIDLIST pidl)
HRESULT WINAPI SHGetDesktopFolder(IShellFolder **psf)
static HRESULT SHDOCVW_GetCurrentLocationFromView(_In_ IShellView &View, _In_ PIDLIST_ABSOLUTE *ppidl)
HRESULT SHDOCVW_CreateShortcut(_In_ LPCWSTR pszLnkFileName, _In_ PCIDLIST_ABSOLUTE pidlTarget, _In_opt_ LPCWSTR pszDescription)
HRESULT SHDOCVW_GetPathOfShortcut(_In_opt_ HWND hWnd, _In_ LPCWSTR pszLnkFile, _Out_ LPWSTR pszPath)
#define WM_USER_SHELLEVENT
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
#define UlongToHandle(ul)
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)
EXTERN_C BOOL WINAPI SHChangeNotifyDeregister(ULONG hNotify)
virtual _Must_inspect_result_ NTSTATUS QueryInterface(__in FxQueryInterfaceParams *Params)
BOOL WINAPI InitCommonControlsEx(const INITCOMMONCONTROLSEX *lpInitCtrls)
static BOOL OnEndLabelEdit(NMLVDISPINFO *pnmv)
static BOOL OnBeginLabelEdit(NMLVDISPINFO *pnmv)
static HINSTANCE instance
BOOL WINAPI ImageList_Destroy(HIMAGELIST himl)
#define FAILED_UNEXPECTEDLY(hr)
int WINAPI lstrcmpiW(LPCWSTR str1, LPCWSTR str2)
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID iid, LPVOID *ppv)
HRESULT WINAPI RegisterDragDrop(HWND hwnd, LPDROPTARGET pDropTarget)
HRESULT WINAPI DoDragDrop(IDataObject *pDataObject, IDropSource *pDropSource, DWORD dwOKEffect, DWORD *pdwEffect)
HRESULT WINAPI RevokeDragDrop(HWND hwnd)
EXTERN_C BOOL SHELL_IsVerb(IContextMenu *pcm, UINT_PTR idCmd, LPCWSTR Verb)
EXTERN_C BOOL SHELL_IsEqualAbsoluteID(PCIDLIST_ABSOLUTE a, PCIDLIST_ABSOLUTE b)
EXTERN_C HRESULT SHELL_GetIDListFromObject(IUnknown *punk, PIDLIST_ABSOLUTE *ppidl)
HRESULT WINAPI SHGetFolderLocation(HWND hwndOwner, int nFolder, HANDLE hToken, DWORD dwReserved, LPITEMIDLIST *ppidl)
BOOL WINAPI SHGetSpecialFolderPathW(HWND hwndOwner, LPWSTR szPath, int nFolder, BOOL bCreate)
HRESULT WINAPI IUnknown_QueryService(IUnknown *, REFGUID, REFIID, LPVOID *)
BOOL WINAPI SHIsChildOrSelf(HWND hParent, HWND hChild)
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)
LPWSTR WINAPI PathFindFileNameW(LPCWSTR lpszPath)
LPWSTR WINAPI PathFindExtensionW(LPCWSTR lpszPath)
BOOL WINAPI PathIsRootW(LPCWSTR lpszPath)
BOOL WINAPI PathFileExistsW(LPCWSTR lpszPath)
BOOL WINAPI PathIsDirectoryW(LPCWSTR lpszPath)
HRESULT WINAPI StrRetToBufW(LPSTRRET src, const ITEMIDLIST *pidl, LPWSTR dest, UINT len)
static IShellFolder IShellItem **static IBindCtx LPITEMIDLIST SFGAOF
int WINAPI SHMapPIDLToSystemImageListIndex(IShellFolder *sh, LPCITEMIDLIST pidl, int *pIndex)
HRESULT GetAttributesOf([in] UINT cidl, [in, size_is(cidl)] PCUITEMID_CHILD_ARRAY apidl, [in, out] SFGAOF *rgfInOut)
HRESULT QueryInterface([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
LPWSTR WINAPI lstrcatW(LPWSTR lpString1, LPCWSTR lpString2)
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
unsigned __int3264 UINT_PTR
_In_ HANDLE _In_ DWORD _In_ DWORD _Inout_opt_ LPOVERLAPPED _In_opt_ LPTRANSMIT_FILE_BUFFERS _In_ DWORD dwReserved
const GUID IID_IDataObject
#define PathAddExtensionW
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
void WINAPI ILFree(LPITEMIDLIST pidl)
LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
HRESULT WINAPI SHBindToParent(LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppv, LPCITEMIDLIST *ppidlLast)
BOOL WINAPI ILGetDisplayName(LPCITEMIDLIST pidl, LPVOID path)
BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath)
LPITEMIDLIST WINAPI ILCreateFromPathW(LPCWSTR path)
BOOL WINAPI ILIsEqual(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
_Out_opt_ int _Out_opt_ int * cy
#define TreeView_DeleteAllItems(hwnd)
#define TreeView_SelectItem(hwnd, hitem)
#define ICC_TREEVIEW_CLASSES
#define TreeView_GetChild(hwnd, hitem)
#define TVIS_EXPANDEDONCE
#define TreeView_GetItemState(hwndTV, hti, mask)
#define TVHT_ONITEMBUTTON
#define TreeView_GetParent(hwnd, hitem)
#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)
static void SHDOCVW_LockModule(void)
static void SHDOCVW_UnlockModule(void)
#define SEE_MASK_INVOKEIDLIST
HRESULT WINAPI SHGetImageList(int iImageList, REFIID riid, void **ppv)
BOOL WINAPI DECLSPEC_HOTPATCH ShellExecuteExW(LPSHELLEXECUTEINFOW sei)
#define SID_SShellBrowser
#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
DWORD WINAPI GetLastError(void)
_In_ void _In_ PCCERT_CONTEXT _In_opt_ LPFILETIME _In_ DWORD _In_ DWORD _Outptr_opt_ void ** ppvObject
#define DRAGDROP_S_USEDEFAULTCURSORS
#define DRAGDROP_S_CANCEL
HMENU WINAPI CreatePopupMenu(void)
BOOL WINAPI TranslateMessage(_In_ const MSG *)
BOOL WINAPI ShowWindow(_In_ HWND, _In_ int)
int WINAPIV wsprintfW(_Out_ LPWSTR, _In_ _Printf_format_string_ LPCWSTR,...)
HWND WINAPI SetParent(_In_ HWND, _In_opt_ HWND)
BOOL WINAPI GetCursorPos(_Out_ LPPOINT)
BOOL WINAPI ClientToScreen(_In_ HWND, _Inout_ LPPOINT)
UINT_PTR WINAPI SetTimer(_In_opt_ HWND, _In_ UINT_PTR, _In_ UINT, _In_opt_ TIMERPROC)
BOOL WINAPI GetClientRect(_In_ HWND, _Out_ LPRECT)
BOOL WINAPI IsChild(_In_ HWND, _In_ HWND)
HWND WINAPI CreateWindowExW(_In_ DWORD dwExStyle, _In_opt_ LPCWSTR lpClassName, _In_opt_ LPCWSTR lpWindowName, _In_ DWORD dwStyle, _In_ int X, _In_ int Y, _In_ int nWidth, _In_ int nHeight, _In_opt_ HWND hWndParent, _In_opt_ HMENU hMenu, _In_opt_ HINSTANCE hInstance, _In_opt_ LPVOID lpParam)
#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 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)
#define IID_NULL_PPV_ARG(Itype, ppType)