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;
110 return reinterpret_cast<CItemData*
>(tvItem.
lParam);
116 CComPtr<IFolderView> pfv;
117 CComPtr<IShellFolder> psf;
127 CComPtr<IShellBrowser> psb;
132 CComPtr<IBrowserService> pbs;
137 CComPtr<IShellView> psv;
159 CComPtr<IOleWindow> pBrowserOleWnd;
166 hr = pBrowserOleWnd->GetWindow(&browserWnd);
170 CMINVOKECOMMANDINFO cmi = {
sizeof(cmi) };
172 cmi.hwnd = browserWnd;
175 cmi.fMask |= CMIC_MASK_SHIFT_DOWN;
177 cmi.fMask |= CMIC_MASK_CONTROL_DOWN;
179 return menu->InvokeCommand(&cmi);
182void CNSCBand::_RegisterChangeNotify()
184#define TARGET_EVENTS ( \
185 SHCNE_DRIVEADD | SHCNE_MKDIR | SHCNE_CREATE | SHCNE_DRIVEREMOVED | SHCNE_RMDIR | \
186 SHCNE_DELETE | SHCNE_RENAMEFOLDER | SHCNE_RENAMEITEM | SHCNE_UPDATEDIR | \
187 SHCNE_UPDATEITEM | SHCNE_ASSOCCHANGED \
202void CNSCBand::_UnregisterChangeNotify()
208void CNSCBand::_DestroyTreeView()
210 TRACE(
"Cleaning up treeview...\n");
214 m_hwndTreeView.DestroyWindow();
217 TRACE(
"Cleanup ok\n");
220void CNSCBand::_DestroyToolbar()
222 m_hwndToolbar.DestroyWindow();
227 RefreshFlags(&m_dwTVStyle, &m_dwTVExStyle, &m_dwEnumFlags);
234 m_hwndTreeView.Attach(hwndTV);
258CNSCBand::_IsTreeItemInEnum(
262 CItemData* pItemData = GetItemData(
hItem);
268 CComHeapPtr<ITEMIDLIST_RELATIVE> pidlTemp;
269 while (pEnum->Next(1, &pidlTemp,
NULL) ==
S_OK)
271 if (
ILIsEqual(pidlTemp, pItemData->relativePidl))
281CNSCBand::_TreeItemHasThisChild(
288 CItemData* pItemData = GetItemData(
hItem);
289 if (
ILIsEqual(pItemData->relativePidl, pidlChild))
297CNSCBand::_GetItemEnum(
298 _Out_ CComPtr<IEnumIDList>& pEnum,
302 CComPtr<IShellFolder> psfDesktop;
307 CComPtr<IShellFolder> pFolder;
313 *ppFolder = psfDesktop;
318 CItemData* pItemData = GetItemData(
hItem);
327 return (*ppFolder)->EnumObjects(
NULL, _GetEnumFlags(), &pEnum);
332 CComPtr<IEnumIDList> pEnum;
337 CComHeapPtr<ITEMIDLIST_RELATIVE> pidlTemp;
338 hr = pEnum->Next(1, &pidlTemp,
NULL);
344 CComPtr<IEnumIDList> pEnum;
345 HRESULT hrEnum = _GetItemEnum(pEnum, hTarget);
358 hrEnum = _GetItemEnum(pEnum, hTarget);
360 CItemData* pItemData = ((hTarget ==
TVI_ROOT) ?
NULL : GetItemData(hTarget));
365 CComHeapPtr<ITEMIDLIST_RELATIVE> pidlTemp;
366 while (pEnum->Next(1, &pidlTemp,
NULL) ==
S_OK)
368 if (!_TreeItemHasThisChild(hTarget, pidlTemp))
372 CComHeapPtr<ITEMIDLIST> pidlAbsolute(
ILCombine(pItemData->absolutePidl, pidlTemp));
373 _InsertItem(hTarget, pidlAbsolute, pidlTemp,
TRUE);
377 CComHeapPtr<ITEMIDLIST> pidlAbsolute(
ILCombine(m_pidlRoot, pidlTemp));
378 _InsertItem(hTarget, pidlAbsolute, pidlTemp,
TRUE);
392 item.cChildren = _ItemHasAnyChild(
hItem);
396 _RefreshRecurse(
hItem);
400void CNSCBand::_Refresh()
403 _RefreshRecurse(_WantsRootItem() ? m_hRoot :
TVI_ROOT);
418CNSCBand::OnChangeNotify(
450CNSCBand::_InsertItem(
458 SFGAOF attrs = SFGAO_STREAM | SFGAO_HASSUBFOLDER;
459 HRESULT hr = psfParent->GetAttributesOf(1, &pEltRelative, &attrs);
466 hr = psfParent->GetDisplayNameOf(pEltRelative, SHGDN_INFOLDER, &strret);
477 CItemData* pChildInfo =
new CItemData;
480 ERR(
"Failed to allocate CItemData\n");
483 pChildInfo->absolutePidl.Attach(
ILClone(pElt));
484 pChildInfo->relativePidl.Attach(
ILClone(pEltRelative));
489 tvInsert.item.cchTextMax =
MAX_PATH;
490 tvInsert.item.pszText = wszDisplayName;
491 tvInsert.item.iImage = tvInsert.item.iSelectedImage = iIcon;
492 tvInsert.item.lParam = (
LPARAM)pChildInfo;
494 if (!(attrs & SFGAO_STREAM) && (attrs & SFGAO_HASSUBFOLDER))
495 tvInsert.item.cChildren = 1;
507CNSCBand::_InsertItem(
513 CComPtr<IShellFolder> psfFolder;
518 return _InsertItem(hParent, psfFolder, pElt, pEltRelative, bSort);
523 ULONG fetched = 1, uItemCount = 0;
525 CComPtr<IEnumIDList> pEnum;
526 CComPtr<IShellFolder> pFolder;
535 while (
SUCCEEDED(pEnum->Next(1, &pidlSub, &fetched)) && pidlSub && fetched)
540 if (_InsertItem(
hItem, pFolder, pidlSubComplete, pidlSub,
FALSE))
553 return (uItemCount > 0);
571 _UnregisterChangeNotify();
589 m_hwndToolbar.GetWindowRect(&rcTB);
593 m_hwndTreeView.MoveWindow(0, cyTB,
cx,
cy - cyTB);
612HRESULT CNSCBand::_AddFavorite()
614 CComHeapPtr<ITEMIDLIST> pidlCurrent;
615 _GetCurrentLocation(&pidlCurrent);
629 for (
INT iTry = 2; iTry <= 9999; ++iTry)
668 CItemData *pItemData;
672 if (pnmtv->itemNew.hItem == m_hRoot)
677 pnmtv->itemNew.state &= ~TVIS_EXPANDED;
686 pItemData = GetItemData(pnmtv->itemNew.hItem);
688 if (pItemData && !pItemData->expanded)
690 if (_InsertSubitems(pnmtv->itemNew.hItem, pItemData->absolutePidl))
692 pItemData->expanded =
TRUE;
715 CItemData* pItemData = GetItemData(
hItem);
729 CItemData* pItemData = GetItemData(
hItem);
731 OnSelectionChanged(pItemData->absolutePidl);
736 CItemData* pItemData = GetItemData(pnmtv->itemNew.hItem);
741 CComPtr<IShellFolder> pSrcFolder;
747 SFGAOF attrs = SFGAO_CANCOPY | SFGAO_CANMOVE | SFGAO_CANLINK;
751 if (attrs & SFGAO_CANCOPY)
752 dwEffect |= DROPEFFECT_COPY;
753 if (attrs & SFGAO_CANMOVE)
754 dwEffect |= DROPEFFECT_MOVE;
755 if (attrs & SFGAO_CANLINK)
756 dwEffect |= DROPEFFECT_LINK;
758 CComPtr<IDataObject> pObj;
769 DWORD dwAttr = SFGAO_CANRENAME;
774 CItemData *
info = GetItemData(dispInfo->item.hItem);
782 hr =
pParent->GetAttributesOf(1, &pChild, &dwAttr);
786 m_oldSelected =
NULL;
795 CComPtr<IShellBrowser> pBrowserService;
801 hr = pBrowserService->BrowseObject(pidlGoto, SBSP_SAMEBROWSER | SBSP_ABSOLUTE);
810 CItemData *
info = GetItemData(dispInfo->item.hItem);
816 ++m_mtxBlockNavigate;
818 --m_mtxBlockNavigate;
821 if (!dispInfo->item.pszText)
826 BOOL RenamedCurrent = _IsCurrentLocation(
info->absolutePidl) ==
S_OK;
832 CComHeapPtr<ITEMIDLIST> pidlNew;
833 hr =
pParent->SetNameOf(m_hWnd, pidlChild, dispInfo->item.pszText, SHGDN_INFOLDER, &pidlNew);
836 CComPtr<IPersistFolder2> pPersist;
841 CComHeapPtr<ITEMIDLIST> pidlParent;
842 hr = pPersist->GetCurFolder(&pidlParent);
846 CComHeapPtr<ITEMIDLIST> pidlNewAbs(
ILCombine(pidlParent, pidlNew));
849 _UpdateBrowser(pidlNewAbs);
866 switch (pnmhdr->
code)
872 if (pnmhdr->
hwndFrom == m_hwndTreeView)
880 if (pnmhdr->
hwndFrom == m_hwndTreeView)
940 if (hwndTarget && (hwndTarget == m_hwndToolbar || hwndTarget == m_hWnd))
942 FIXME(
"Show 'Close Toolbar' menu\n");
966 ERR(
"No node data, something has gone wrong\n");
970 CComPtr<IShellFolder> pFolder;
976 CComPtr<IContextMenu> contextMenu;
983 UINT cmf = CMF_EXPLORE;
985 hr = pFolder->GetAttributesOf(1, &pidlChild, &
attr);
987 cmf |= CMF_CANRENAME;
999 uCommand -= idCmdFirst;
1002 if ((cmf & CMF_CANRENAME) &&
SHELL_IsVerb(contextMenu, uCommand,
L"rename"))
1004 m_hwndTreeView.SetFocus();
1006 m_oldSelected =
hItem;
1010 hr = _ExecuteCommand(contextMenu, uCommand);
1059 TRACE(
"CloseDW called\n");
1083 m_dwBandID = dwBandID;
1085 if (pdbi->
dwMask & DBIM_MINSIZE)
1091 if (pdbi->
dwMask & DBIM_MAXSIZE)
1094 if (pdbi->
dwMask & DBIM_INTEGRAL)
1097 if (pdbi->
dwMask & DBIM_ACTUAL)
1103 if (pdbi->
dwMask & DBIM_TITLE)
1108 if (pdbi->
dwMask & DBIM_MODEFLAGS)
1109 pdbi->
dwModeFlags = DBIMF_NORMAL | DBIMF_VARIABLEHEIGHT;
1111 if (pdbi->
dwMask & DBIM_BKCOLOR)
1112 pdbi->
dwMask &= ~DBIM_BKCOLOR;
1123 if (pUnkSite == m_pSite)
1126 TRACE(
"SetSite called\n");
1134 if (pUnkSite != m_pSite)
1157 _RegisterChangeNotify();
1172STDMETHODIMP CNSCBand::QueryStatus(
const GUID *pguidCmdGroup,
ULONG cCmds, OLECMD prgCmds [], OLECMDTEXT *pCmdText)
1205 LPCMINVOKECOMMANDINFO lpici)
1228 m_hwndTreeView.SetFocus();
1247 if (lpMsg->
hwnd == m_hWnd ||
1331 *pulAttrib |= SFGAO_LINK;
1336 *pulAttrib |= SFGAO_FOLDER;
1361 *pdwStyle = _GetTVStyle();
1362 *pdwExStyle = _GetTVExStyle();
1363 *dwEnum = _GetEnumFlags();
1377 ERR(
"Entering drag\n");
1378 m_pCurObject = pObj;
1380 return DragOver(glfKeyState,
pt, pdwEffect);
1398 m_childTargetNode =
NULL;
1399 m_pDropTarget =
NULL;
1400 *pdwEffect = DROPEFFECT_NONE;
1404 ++m_mtxBlockNavigate;
1406 --m_mtxBlockNavigate;
1409 if (m_pDropTarget &&
info.hItem != m_childTargetNode)
1410 m_pDropTarget =
NULL;
1412 if (
info.hItem != m_childTargetNode)
1414 CItemData *pItemData = GetItemData(
info.hItem);
1418 CComPtr<IShellFolder> pFolder;
1421 pFolder = m_pDesktop;
1429 ERR(
"Can't bind to folder object\n");
1430 *pdwEffect = DROPEFFECT_NONE;
1439 ERR(
"Can't get drop target for folder object\n");
1440 *pdwEffect = DROPEFFECT_NONE;
1444 hr = m_pDropTarget->DragEnter(m_pCurObject, glfKeyState,
pt, pdwEffect);
1445 m_childTargetNode =
info.hItem;
1449 hr = m_pDropTarget->DragOver(glfKeyState,
pt, pdwEffect);
1456 ++m_mtxBlockNavigate;
1458 --m_mtxBlockNavigate;
1459 m_childTargetNode =
NULL;
1461 m_pCurObject =
NULL;
1469 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)