ReactOS 0.4.17-dev-804-g023d8af
CNSCBand.cpp
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS shdocvw
3 * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
4 * PURPOSE: NameSpace Control Band
5 * COPYRIGHT: Copyright 2024 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
6 */
7
8#include "objects.h"
9#include <shlobj.h>
10#include <commoncontrols.h>
11#include <undocshell.h>
12
13#define TIMER_ID_REFRESH 9999
14
15#include <wine/debug.h>
17
21 _In_ LPCWSTR pszLnkFile,
22 _Out_ LPWSTR pszPath)
23{
24 *pszPath = UNICODE_NULL;
25 CComPtr<IShellLink> pShellLink;
26 HRESULT hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
27 IID_PPV_ARG(IShellLink, &pShellLink));
29 return hr;
30
31 CComPtr<IPersistFile> pPersistFile;
32 hr = pShellLink->QueryInterface(IID_PPV_ARG(IPersistFile, &pPersistFile));
34 return hr;
35
36 hr = pPersistFile->Load(pszLnkFile, STGM_READ);
38 return hr;
39
41 hr = pShellLink->GetPath(pszPath, MAX_PATH, &find, 0);
43 return hr;
44
45 return S_OK;
46}
47
49{
50 tvi.iImage = SHMapPIDLToSystemImageListIndex(pSF, pidlItem, &tvi.iSelectedImage);
51 tvi.iSelectedImage = tvi.iSelectedImage >= 0 ? tvi.iSelectedImage : tvi.iImage;
52 return tvi.iImage >= 0;
53}
54
55CNSCBand::CNSCBand()
56{
58
61}
62
63CNSCBand::~CNSCBand()
64{
65 if (m_hToolbarImageList)
66 {
67 ImageList_Destroy(m_hToolbarImageList);
68 m_hToolbarImageList = NULL;
69 }
70 SHFree(m_OriginalRename);
72}
73
74VOID CNSCBand::OnFinalMessage(HWND)
75{
76 // The message loop is finished, now we can safely destruct!
77 // HACKFIX: Who did this AddRef? Commenting out Release...
78 //static_cast<IDeskBand *>(this)->Release();
79}
80
81// *** helper methods ***
82
83CNSCBand::CItemData* CNSCBand::_GetItemData(_In_ HTREEITEM hItem)
84{
85 if (hItem == TVI_ROOT)
86 return NULL;
87
88 TVITEMW tvItem = { TVIF_PARAM, hItem };
89 if (!TreeView_GetItem(m_hwndTreeView, &tvItem))
90 return NULL;
91
92 return reinterpret_cast<CItemData*>(tvItem.lParam);
93}
94
95CNSCBand::CItemData* CNSCBand::_GetItemData(_In_ UINT ItemSpec)
96{
97 HTREEITEM hItem = m_hwndTreeView.GetNextItem(NULL, ItemSpec);
98 return hItem ? _GetItemData(hItem) : NULL;
99}
100
101SFGAOF CNSCBand::_GetAttributesOfItem(_In_ CItemData *pData, _In_ SFGAOF Query)
102{
103 if (!pData)
104 return 0;
105 CComPtr<IShellFolder> pFolder;
106 LPCITEMIDLIST pidlChild;
107 HRESULT hr = SHBindToParent(pData->absolutePidl, IID_PPV_ARG(IShellFolder, &pFolder), &pidlChild);
109 return 0;
111 if (FAILED_UNEXPECTEDLY(hr = pFolder->GetAttributesOf(1, &pidlChild, &Attributes)))
112 return 0;
113 return Attributes & Query;
114}
115
116HRESULT CNSCBand::_GetNameOfItem(IShellFolder *pSF, PCUITEMID_CHILD pidl, UINT Flags, PWSTR Name)
117{
118 STRRET strret;
119 HRESULT hr = pSF->GetDisplayNameOf(pidl, Flags, &strret);
121 return hr;
122 hr = StrRetToBufW(&strret, pidl, Name, MAX_PATH);
124 return hr;
125 return hr;
126}
127
128HRESULT CNSCBand::_GetNameOfItem(IShellFolder *pSF, PCUITEMID_CHILD pidl, PWSTR Name)
129{
130 return _GetNameOfItem(pSF, pidl, SHGDN_NORMAL | SHGDN_INFOLDER, Name);
131}
132
133static HRESULT
135{
136 CComPtr<IFolderView> pfv;
137 CComPtr<IShellFolder> psf;
139 if (SUCCEEDED(hr) && SUCCEEDED(hr = pfv->GetFolder(IID_PPV_ARG(IShellFolder, &psf))))
140 hr = SHELL_GetIDListFromObject(psf, ppidl);
141 return hr;
142}
143
144HRESULT CNSCBand::_GetCurrentLocation(_Out_ PIDLIST_ABSOLUTE *ppidl)
145{
146 *ppidl = NULL;
147 CComPtr<IShellBrowser> psb;
148 HRESULT hr = IUnknown_QueryService(m_pSite, SID_STopLevelBrowser, IID_PPV_ARG(IShellBrowser, &psb));
150 return hr;
151
152 CComPtr<IBrowserService> pbs;
154 if (SUCCEEDED(hr = pbs->GetPidl(ppidl)) && *ppidl)
155 return hr;
156
157 CComPtr<IShellView> psv;
158 if (!FAILED_UNEXPECTEDLY(hr = psb->QueryActiveShellView(&psv)))
159 if (SUCCEEDED(hr = psv.p ? SHDOCVW_GetCurrentLocationFromView(*psv.p, ppidl) : E_FAIL))
160 return hr;
161 return hr;
162}
163
164HRESULT CNSCBand::_IsCurrentLocation(_In_ PCIDLIST_ABSOLUTE pidl)
165{
166 if (!pidl)
167 return E_INVALIDARG;
168 HRESULT hr = E_FAIL;
170 hr = _GetCurrentLocation(&location);
171 if (SUCCEEDED(hr))
174 return hr;
175}
176
177HRESULT CNSCBand::_ExecuteCommand(_In_ CComPtr<IContextMenu>& menu, _In_ UINT nCmd)
178{
179 CComPtr<IOleWindow> pBrowserOleWnd;
181 IID_PPV_ARG(IOleWindow, &pBrowserOleWnd));
183 return hr;
184
185 HWND browserWnd;
186 hr = pBrowserOleWnd->GetWindow(&browserWnd);
188 return hr;
189
190 CMINVOKECOMMANDINFO cmi = { sizeof(cmi) };
191 cmi.lpVerb = MAKEINTRESOURCEA(nCmd);
192 cmi.hwnd = browserWnd;
193 cmi.nShow = SW_SHOW;
194 if (::GetKeyState(VK_SHIFT) < 0)
195 cmi.fMask |= CMIC_MASK_SHIFT_DOWN;
196 if (::GetKeyState(VK_CONTROL) < 0)
197 cmi.fMask |= CMIC_MASK_CONTROL_DOWN;
198
199 return menu->InvokeCommand(&cmi);
200}
201
202void CNSCBand::_RegisterChangeNotify()
203{
204#define TARGET_EVENTS ( \
205 SHCNE_DRIVEADD | SHCNE_MKDIR | SHCNE_CREATE | SHCNE_DRIVEREMOVED | SHCNE_RMDIR | \
206 SHCNE_DELETE | SHCNE_RENAMEFOLDER | SHCNE_RENAMEITEM | SHCNE_UPDATEDIR | \
207 SHCNE_UPDATEITEM | SHCNE_ASSOCCHANGED \
208)
209 // Register shell notification
210 SHChangeNotifyEntry shcne = { m_pidlRoot, TRUE };
211 m_shellRegID = SHChangeNotifyRegister(m_hWnd,
215 1, &shcne);
216 if (!m_shellRegID)
217 {
218 ERR("Something went wrong, error %08x\n", GetLastError());
219 }
220}
221
222void CNSCBand::_UnregisterChangeNotify()
223{
224 SHChangeNotifyDeregister(m_shellRegID);
225 m_shellRegID = 0;
226}
227
228void CNSCBand::_DestroyTreeView()
229{
230 TRACE("Cleaning up treeview...\n");
231 /* Remove all items of the treeview */
232 ::RevokeDragDrop(m_hwndTreeView);
233 TreeView_DeleteAllItems(m_hwndTreeView);
234 m_hwndTreeView.DestroyWindow();
235 m_pDesktop = NULL;
236 m_hRoot = NULL;
237 TRACE("Cleanup ok\n");
238}
239
240void CNSCBand::_DestroyToolbar()
241{
242 m_hwndToolbar.DestroyWindow();
243}
244
245HRESULT CNSCBand::_CreateTreeView(HWND hwndParent)
246{
247 RefreshFlags(&m_dwTVStyle, &m_dwTVExStyle, &m_dwEnumFlags);
248 HWND hwndTV = ::CreateWindowExW(m_dwTVExStyle, WC_TREEVIEWW, NULL, m_dwTVStyle, 0, 0, 0, 0,
250 ATLASSERT(hwndTV);
251 if (!hwndTV)
252 return E_FAIL;
253
254 m_hwndTreeView.Attach(hwndTV);
255 ::RegisterDragDrop(m_hwndTreeView, dynamic_cast<IDropTarget*>(this));
256
257 // Init the treeview here
258 HRESULT hr = SHGetDesktopFolder(&m_pDesktop);
260 return hr;
261
262 m_pidlRoot.Free();
263 hr = SHGetFolderLocation(m_hWnd, _GetRootCsidl(), NULL, 0, &m_pidlRoot);
265 return hr;
266
267 // Create image list and set
268 IImageList *piml;
271 return hr;
272
273 TreeView_SetImageList(m_hwndTreeView, (HIMAGELIST)piml, TVSIL_NORMAL);
274 return S_OK;
275}
276
277BOOL
278CNSCBand::_IsTreeItemInEnum(
280 _In_ IEnumIDList *pEnum)
281{
282 CItemData* pItemData = _GetItemData(hItem);
283 if (!pItemData)
284 return FALSE;
285
286 pEnum->Reset();
287
288 CComHeapPtr<ITEMIDLIST_RELATIVE> pidlTemp;
289 while (pEnum->Next(1, &pidlTemp, NULL) == S_OK)
290 {
291 if (ILIsEqual(pidlTemp, pItemData->GetLeaf()))
292 return TRUE;
293
294 pidlTemp.Free();
295 }
296
297 return FALSE;
298}
299
300BOOL
301CNSCBand::_TreeItemHasThisChild(
303 _In_ PCITEMID_CHILD pidlChild)
304{
305 for (hItem = TreeView_GetChild(m_hwndTreeView, hItem); hItem;
306 hItem = TreeView_GetNextSibling(m_hwndTreeView, hItem))
307 {
308 CItemData* pItemData = _GetItemData(hItem);
309 if (ILIsEqual(pItemData->GetLeaf(), pidlChild))
310 return TRUE;
311 }
312
313 return FALSE;
314}
315
317CNSCBand::_FindItem(
319 _Out_opt_ CItemData **ppData,
320 _In_ HTREEITEM hBase)
321{
322 HTREEITEM hItem = hBase ? hBase : TreeView_GetRoot(m_hwndTreeView);
323 for (; hItem; hItem = TreeView_GetNextSibling(m_hwndTreeView, hItem))
324 {
325 CItemData *pData = _GetItemData(hItem);
326 if (ILIsEqual(pData->absolutePidl, pidl))
327 {
328 if (ppData)
329 *ppData = pData;
330 return hItem;
331 }
332 HTREEITEM hChild = TreeView_GetChild(m_hwndTreeView, hItem);
333 if (hChild && (hChild = _FindItem(pidl, ppData, hChild)) != NULL)
334 return hChild;
335 }
336 return NULL;
337}
338
340CNSCBand::_UpdateItem(
342 _In_ CItemData *pData,
344 _In_ UINT UIF)
345{
346 HRESULT hr = S_OK;
347 CComPtr<IShellFolder> pSF;
348 PCUITEMID_CHILD pidlItem;
349 CComHeapPtr<ITEMIDLIST> absolutePidl, childPidl, tempPidl;
350 if (FAILED(hr = SHILClone(pidl, &absolutePidl)))
351 return hr;
352 if (UIF & (UIF_TEXT | UIF_IMAGE | UIF_GETREAL))
353 hr = SHBindToParent(pidl, IID_PPV_ARG(IShellFolder, &pSF), &pidlItem);
355 return hr;
356 if (UIF & UIF_GETREAL)
357 {
358 if (FAILED_UNEXPECTEDLY(hr = SHGetRealIDL(pSF, pidlItem, &childPidl)))
359 return hr;
360 ILRemoveLastID(absolutePidl);
361 if (FAILED(hr = SHILCombine(absolutePidl, childPidl, &tempPidl)))
362 return hr;
363 absolutePidl = tempPidl;
364 pidlItem = childPidl;
365 }
366
368 if ((UIF & UIF_TEXT) && FAILED_UNEXPECTEDLY(hr = _GetNameOfItem(pSF, pidlItem, szName)))
369 return hr;
370 TVITEM tvi;
371 tvi.hItem = hItem;
372 tvi.mask = TVIF_HANDLE | (UIF & (TVIF_TEXT));
373 tvi.pszText = szName;
374 if ((UIF & UIF_IMAGE) && GetImageListIndex(pSF, pidlItem, tvi))
375 tvi.mask |= TVIF_IMAGE | TVIF_SELECTEDIMAGE;
376 if (!TreeView_SetItem(m_hwndTreeView, &tvi))
377 return E_FAIL;
378 pData->Attach(absolutePidl.Detach());
379 _SortItems(TreeView_GetParent(m_hwndTreeView, hItem));
380 return S_OK;
381}
382
384CNSCBand::_GetItemEnum(
385 _Out_ CComPtr<IEnumIDList>& pEnum,
387 _Out_opt_ IShellFolder **ppFolder)
388{
389 CComPtr<IShellFolder> psfDesktop;
390 HRESULT hr = SHGetDesktopFolder(&psfDesktop);
392 return hr;
393
394 CComPtr<IShellFolder> pFolder;
395 if (!ppFolder)
396 ppFolder = &pFolder;
397
398 if (hItem == m_hRoot && hItem)
399 {
400 *ppFolder = psfDesktop;
401 (*ppFolder)->AddRef();
402 }
403 else
404 {
405 CItemData* pItemData = _GetItemData(hItem);
406 if (!pItemData && hItem == TVI_ROOT && !_WantsRootItem())
407 hr = psfDesktop->BindToObject(m_pidlRoot, NULL, IID_PPV_ARG(IShellFolder, ppFolder));
408 else
409 hr = psfDesktop->BindToObject(pItemData->absolutePidl, NULL, IID_PPV_ARG(IShellFolder, ppFolder));
411 return hr;
412 }
413
414 return (*ppFolder)->EnumObjects(NULL, _GetEnumFlags(), &pEnum);
415}
416
417BOOL CNSCBand::_ItemHasAnyChild(_In_ HTREEITEM hItem)
418{
419 CComPtr<IEnumIDList> pEnum;
420 HRESULT hr = _GetItemEnum(pEnum, hItem);
421 if (FAILED(hr))
422 return FALSE;
423
424 CComHeapPtr<ITEMIDLIST_RELATIVE> pidlTemp;
425 hr = pEnum->Next(1, &pidlTemp, NULL);
426 return SUCCEEDED(hr);
427}
428
429void CNSCBand::_RefreshRecurse(_In_ HTREEITEM hTarget)
430{
431 CComPtr<IEnumIDList> pEnum;
432 HRESULT hrEnum = _GetItemEnum(pEnum, hTarget);
433
434 // Delete zombie items
435 HTREEITEM hItem, hNextItem;
436 for (hItem = TreeView_GetChild(m_hwndTreeView, hTarget); hItem; hItem = hNextItem)
437 {
438 hNextItem = TreeView_GetNextSibling(m_hwndTreeView, hItem);
439
440 if (SUCCEEDED(hrEnum) && !_IsTreeItemInEnum(hItem, pEnum))
441 TreeView_DeleteItem(m_hwndTreeView, hItem);
442 }
443
444 pEnum = NULL;
445 hrEnum = _GetItemEnum(pEnum, hTarget);
446
447 CItemData* pItemData = ((hTarget == TVI_ROOT) ? NULL : _GetItemData(hTarget));
448
449 // Insert new items and update items
450 if (SUCCEEDED(hrEnum))
451 {
452 CComHeapPtr<ITEMIDLIST_RELATIVE> pidlTemp;
453 while (pEnum->Next(1, &pidlTemp, NULL) == S_OK)
454 {
455 if (!_TreeItemHasThisChild(hTarget, pidlTemp))
456 {
457 if (pItemData)
458 {
459 CComHeapPtr<ITEMIDLIST> pidlAbsolute(ILCombine(pItemData->absolutePidl, pidlTemp));
460 _InsertItem(hTarget, pidlAbsolute, pidlTemp, TRUE);
461 }
462 else
463 {
464 CComHeapPtr<ITEMIDLIST> pidlAbsolute(ILCombine(m_pidlRoot, pidlTemp));
465 _InsertItem(hTarget, pidlAbsolute, pidlTemp, TRUE);
466 }
467 }
468 pidlTemp.Free();
469 }
470 }
471
472 // Update children and recurse
473 for (hItem = TreeView_GetChild(m_hwndTreeView, hTarget); hItem; hItem = hNextItem)
474 {
475 hNextItem = TreeView_GetNextSibling(m_hwndTreeView, hItem);
476
478 item.hItem = hItem;
479 item.cChildren = _ItemHasAnyChild(hItem);
480 TreeView_SetItem(m_hwndTreeView, &item);
481
483 _RefreshRecurse(hItem);
484 }
485}
486
487void CNSCBand::_Refresh()
488{
489 m_hwndTreeView.SendMessage(WM_SETREDRAW, FALSE, 0);
490 _RefreshRecurse(_WantsRootItem() ? m_hRoot : TVI_ROOT);
491 m_hwndTreeView.SendMessage(WM_SETREDRAW, TRUE, 0);
492}
493
494LRESULT CNSCBand::OnTimer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
495{
497
499 _Refresh();
500
501 return 0;
502}
503
504void
505CNSCBand::OnChangeNotify(
509{
511 CItemData* pID;
512 switch (lEvent) // Try to handle events without doing a full refresh
513 {
514 case SHCNE_UPDATEITEM:
515 case SHCNE_UPDATEDIR:
516 pidl1 = pidl0;
519 if ((hItem = _FindItem(pidl0, &pID)) != NULL && SUCCEEDED(_UpdateItem(hItem, pID, pidl1, UIF_ALL | UIF_GETREAL)))
520 return;
521 break;
523 case SHCNE_RMDIR:
524 if ((hItem = _FindItem(pidl0, &pID)) != NULL && TreeView_DeleteItem(m_hwndTreeView, hItem))
525 return;
526 break;
527 // TODO: SHCNE_DRIVEADD, SHCNE_MKDIR
528 // TODO: SHCNE_UPDATEIMAGE
529 }
530 switch (lEvent)
531 {
532 case SHCNE_DRIVEADD:
533 case SHCNE_MKDIR:
534 case SHCNE_CREATE:
536 case SHCNE_RMDIR:
537 case SHCNE_DELETE:
539 case SHCNE_RENAMEITEM:
540 case SHCNE_UPDATEDIR:
541 case SHCNE_UPDATEITEM:
543 {
546 break;
547 }
548 default:
549 {
550 TRACE("lEvent: 0x%08lX\n", lEvent);
551 break;
552 }
553 }
554}
555
557CNSCBand::_InsertItem(
558 _In_opt_ HTREEITEM hParent,
559 _Inout_ IShellFolder *psfParent,
560 _In_ LPCITEMIDLIST pElt,
561 _In_ LPCITEMIDLIST pEltRelative,
562 _In_ BOOL bSort)
563{
564 /* Get the attributes of the node */
565 SFGAOF attrs = SFGAO_STREAM | SFGAO_HASSUBFOLDER;
566 HRESULT hr = psfParent->GetAttributesOf(1, &pEltRelative, &attrs);
568 return NULL;
569
570 WCHAR wszDisplayName[MAX_PATH];
571 if (FAILED_UNEXPECTEDLY(hr = _GetNameOfItem(psfParent, pEltRelative, wszDisplayName)))
572 return NULL;
573
574 INT iSelIcon = -1;
575 INT iIcon = SHMapPIDLToSystemImageListIndex(psfParent, pEltRelative, &iSelIcon);
576
577 CItemData* pChildInfo = new CItemData;
578 if (!pChildInfo)
579 {
580 ERR("Failed to allocate CItemData\n");
581 return NULL;
582 }
583 pChildInfo->expanded = FALSE;
584 if (FAILED(pChildInfo->Set(pElt))) // TODO: Optimize this by taking ownership of pElt and call Attach
585 {
586 delete pChildInfo;
587 return NULL;
588 }
589
590 // Set up our treeview template
591 TV_INSERTSTRUCT tvInsert = { hParent, TVI_LAST };
593 tvInsert.item.cchTextMax = MAX_PATH;
594 tvInsert.item.pszText = wszDisplayName;
595 tvInsert.item.iImage = iIcon;
596 tvInsert.item.iSelectedImage = iSelIcon >= 0 ? iSelIcon : iIcon;
597 tvInsert.item.lParam = (LPARAM)pChildInfo;
598
599 if (!(attrs & SFGAO_STREAM) && (attrs & SFGAO_HASSUBFOLDER))
600 tvInsert.item.cChildren = 1;
601
602 HTREEITEM htiCreated = TreeView_InsertItem(m_hwndTreeView, &tvInsert);
603
604 if (bSort)
605 _SortItems(hParent);
606
607 return htiCreated;
608}
609
610/* This is the slow version of the above method */
612CNSCBand::_InsertItem(
613 _In_opt_ HTREEITEM hParent,
614 _In_ LPCITEMIDLIST pElt,
615 _In_ LPCITEMIDLIST pEltRelative,
616 _In_ BOOL bSort)
617{
618 CComPtr<IShellFolder> psfFolder;
619 HRESULT hr = SHBindToParent(pElt, IID_PPV_ARG(IShellFolder, &psfFolder), NULL);
621 return NULL;
622
623 return _InsertItem(hParent, psfFolder, pElt, pEltRelative, bSort);
624}
625
626BOOL CNSCBand::_InsertSubitems(HTREEITEM hItem, LPCITEMIDLIST entry)
627{
628 ULONG fetched = 1, uItemCount = 0;
629
630 CComPtr<IEnumIDList> pEnum;
631 CComPtr<IShellFolder> pFolder;
632 HRESULT hr = _GetItemEnum(pEnum, hItem, &pFolder);
634 return FALSE;
635
636 /* Don't redraw while we add stuff into the tree */
637 m_hwndTreeView.SendMessage(WM_SETREDRAW, FALSE, 0);
638
639 LPITEMIDLIST pidlSub;
640 while (SUCCEEDED(pEnum->Next(1, &pidlSub, &fetched)) && pidlSub && fetched)
641 {
642 LPITEMIDLIST pidlSubComplete;
643 pidlSubComplete = ILCombine(entry, pidlSub);
644
645 if (_InsertItem(hItem, pFolder, pidlSubComplete, pidlSub, FALSE))
646 ++uItemCount;
647
648 ILFree(pidlSubComplete);
649 ILFree(pidlSub);
650 }
651
652 /* Let's do sorting */
653 _SortItems(hItem);
654
655 /* Now we can redraw */
656 m_hwndTreeView.SendMessage(WM_SETREDRAW, TRUE, 0);
657
658 return (uItemCount > 0);
659}
660
661// *** message handlers ***
662
663LRESULT CNSCBand::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
664{
665 if (FAILED_UNEXPECTEDLY(_CreateToolbar(m_hWnd)))
666 return -1;
667 if (FAILED_UNEXPECTEDLY(_CreateTreeView(m_hWnd)))
668 return -1;
669 return 0;
670}
671
672LRESULT CNSCBand::OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
673{
674 _DestroyTreeView();
675 _DestroyToolbar();
676 _UnregisterChangeNotify();
677 return 0;
678}
679
680LRESULT CNSCBand::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
681{
682 if (!m_hwndTreeView)
683 return 0;
684
685 RECT rc;
686 GetClientRect(&rc);
687 LONG cx = rc.right, cy = rc.bottom;
688
689 RECT rcTB;
690 LONG cyTB = 0;
691 if (m_hwndToolbar)
692 {
693 m_hwndToolbar.SendMessage(TB_AUTOSIZE, 0, 0);
694 m_hwndToolbar.GetWindowRect(&rcTB);
695 cyTB = rcTB.bottom - rcTB.top;
696 }
697
698 m_hwndTreeView.MoveWindow(0, cyTB, cx, cy - cyTB);
699 return 0;
700}
701
702LRESULT CNSCBand::OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
703{
704 m_bFocused = TRUE;
705 IUnknown_OnFocusChangeIS(m_pSite, reinterpret_cast<IUnknown*>(this), TRUE);
706 bHandled = FALSE;
707 return 0;
708}
709
710LRESULT CNSCBand::OnKillFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
711{
712 IUnknown_OnFocusChangeIS(m_pSite, reinterpret_cast<IUnknown*>(this), FALSE);
713 m_bFocused = FALSE;
714 return 0;
715}
716
717HRESULT CNSCBand::_AddFavorite()
718{
719 CComHeapPtr<ITEMIDLIST> pidlCurrent;
720 _GetCurrentLocation(&pidlCurrent);
721
722 CComPtr<IShellFolder> pParent;
723 LPCITEMIDLIST pidlLast;
724 HRESULT hr = SHBindToParent(pidlCurrent, IID_PPV_ARG(IShellFolder, &pParent), &pidlLast);
726 return hr;
727
728 STRRET strret;
729 hr = pParent->GetDisplayNameOf(pidlLast, SHGDN_FORPARSING, &strret);
731 return hr;
732
733 CComHeapPtr<WCHAR> pszURL;
734 hr = StrRetToStrW(&strret, NULL, &pszURL);
736 return hr;
737
738 return AddUrlToFavorites(m_hWnd, pszURL, NULL, TRUE);
739}
740
741LRESULT CNSCBand::OnCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
742{
743 switch (LOWORD(wParam))
744 {
745 case ID_ADD:
746 {
747 _AddFavorite();
748 break;
749 }
750 case ID_ORGANIZE:
751 {
752 SHELLEXECUTEINFOW sei = { sizeof(sei), SEE_MASK_INVOKEIDLIST };
753 sei.hwnd = m_hWnd;
754 sei.nShow = SW_SHOWNORMAL;
755 sei.lpIDList = m_pidlRoot;
756 ::ShellExecuteExW(&sei);
757 break;
758 }
759 }
760 return 0;
761}
762
763BOOL CNSCBand::OnTreeItemExpanding(_In_ LPNMTREEVIEW pnmtv)
764{
765 CItemData *pItemData;
766
767 if (pnmtv->action == TVE_COLLAPSE)
768 {
769 if (pnmtv->itemNew.hItem == m_hRoot)
770 {
771 // Prenvent root from collapsing
772 pnmtv->itemNew.mask |= TVIF_STATE;
773 pnmtv->itemNew.stateMask |= TVIS_EXPANDED;
774 pnmtv->itemNew.state &= ~TVIS_EXPANDED;
775 pnmtv->action = TVE_EXPAND;
776 return TRUE;
777 }
778 }
779
780 if (pnmtv->action == TVE_EXPAND)
781 {
782 // Grab our directory PIDL
783 pItemData = _GetItemData(pnmtv->itemNew.hItem);
784 // We have it, let's try
785 if (pItemData && !pItemData->expanded)
786 {
787 if (_InsertSubitems(pnmtv->itemNew.hItem, pItemData->absolutePidl))
788 {
789 pItemData->expanded = TRUE;
790 }
791 else
792 {
793 // remove subitem "+" since we failed to add subitems
794 TVITEMW tvItem = { TVIF_CHILDREN, pnmtv->itemNew.hItem };
795 tvItem.cChildren = 0;
796 TreeView_SetItem(m_hwndTreeView, &tvItem);
797 }
798 }
799 }
800 return FALSE;
801}
802
803BOOL CNSCBand::OnTreeItemDeleted(_In_ LPNMTREEVIEW pnmtv)
804{
805 // Navigate to parent when deleting selected item
806 HTREEITEM hItem = pnmtv->itemOld.hItem;
807 HTREEITEM hParent = TreeView_GetParent(m_hwndTreeView, hItem);
808 if (hParent && TreeView_GetSelection(m_hwndTreeView) == hItem)
809 TreeView_SelectItem(m_hwndTreeView, hParent);
810
811 /* Destroy memory associated to our node */
812 CItemData* pItemData = _GetItemData(hItem);
813 if (!pItemData)
814 return FALSE;
815
816 delete pItemData;
817
818 return TRUE;
819}
820
821void CNSCBand::_OnSelectionChanged(_In_ LPNMTREEVIEW pnmtv)
822{
823 HTREEITEM hItem = pnmtv->itemNew.hItem;
824 if (!hItem)
825 return;
826 CItemData* pItemData = _GetItemData(hItem);
827 if (pItemData)
828 OnSelectionChanged(pItemData->absolutePidl);
829}
830
831void CNSCBand::OnTreeItemDragging(_In_ LPNMTREEVIEW pnmtv, _In_ BOOL isRightClick)
832{
833 CItemData* pItemData = _GetItemData(pnmtv->itemNew.hItem);
834 if (!pItemData)
835 return;
836
837 HRESULT hr;
838 CComPtr<IShellFolder> pSrcFolder;
839 LPCITEMIDLIST pLast;
840 hr = SHBindToParent(pItemData->absolutePidl, IID_PPV_ARG(IShellFolder, &pSrcFolder), &pLast);
842 return;
843
844 SFGAOF attrs = SFGAO_CANCOPY | SFGAO_CANMOVE | SFGAO_CANLINK;
845 pSrcFolder->GetAttributesOf(1, &pLast, &attrs);
846
847 DWORD dwEffect = 0;
848 if (attrs & SFGAO_CANCOPY)
849 dwEffect |= DROPEFFECT_COPY;
850 if (attrs & SFGAO_CANMOVE)
851 dwEffect |= DROPEFFECT_MOVE;
852 if (attrs & SFGAO_CANLINK)
853 dwEffect |= DROPEFFECT_LINK;
854
855 CComPtr<IDataObject> pObj;
856 hr = pSrcFolder->GetUIObjectOf(m_hWnd, 1, &pLast, IID_IDataObject, 0, (LPVOID*)&pObj);
858 return;
859
860 DoDragDrop(pObj, this, dwEffect, &dwEffect);
861}
862
863LRESULT CNSCBand::OnBeginLabelEdit(_In_ LPNMTVDISPINFO dispInfo)
864{
865 // TODO: put this in a function ? (mostly copypasta from CDefView)
866 DWORD dwAttr = SFGAO_CANRENAME;
867 CComPtr<IShellFolder> pParent;
868 LPCITEMIDLIST pChild;
869 HRESULT hr;
870 HWND hWndEdit = TreeView_GetEditControl(dispInfo->hdr.hwndFrom);
871
872 SHFree(m_OriginalRename);
873 m_OriginalRename = NULL;
874 CItemData *info = _GetItemData(dispInfo->item.hItem);
875 if (!info || !hWndEdit)
876 return TRUE;
877
878 hr = SHBindToParent(info->absolutePidl, IID_PPV_ARG(IShellFolder, &pParent), &pChild);
880 return TRUE;
881
882 hr = pParent->GetAttributesOf(1, &pChild, &dwAttr);
883 if (SUCCEEDED(hr) && (dwAttr & SFGAO_CANRENAME))
884 {
886 if (SUCCEEDED(_GetNameOfItem(pParent, pChild, SHGDN_FOREDITING | SHGDN_INFOLDER, szName)))
887 {
888 int cchLimit = MAX_PATH;
889 CComPtr<IItemNameLimits> pINL;
891 pINL->GetMaxLength(szName, &cchLimit);
892 SendMessageW(hWndEdit, EM_LIMITTEXT, cchLimit, 0);
893 SHLimitInputEdit(hWndEdit, pParent);
894 ::SetWindowTextW(hWndEdit, szName);
895 SHStrDupW(szName, &m_OriginalRename);
896 }
897 m_isEditing = TRUE;
898 m_oldSelected = NULL;
899 return FALSE;
900 }
901 return TRUE;
902}
903
904HRESULT CNSCBand::_UpdateBrowser(LPCITEMIDLIST pidlGoto, BOOL IgnoreSelfNavigation, UINT SBSP)
905{
906 CComPtr<IShellBrowser> pBrowserService;
907 HRESULT hr = IUnknown_QueryService(m_pSite, SID_STopLevelBrowser,
908 IID_PPV_ARG(IShellBrowser, &pBrowserService));
910 return hr;
911
912 if (_IsCurrentLocation(pidlGoto) == S_OK) // Don't add duplicates to the travel log
913 {
914 if (IgnoreSelfNavigation)
915 return S_FALSE;
916
917 CComPtr<IShellView> psv;
918 if (SUCCEEDED(hr = pBrowserService->QueryActiveShellView(&psv)))
919 hr = psv->Refresh();
920 if (SUCCEEDED(hr))
921 return hr;
922 }
923 hr = pBrowserService->BrowseObject(pidlGoto, SBSP_SAMEBROWSER | SBSP_ABSOLUTE | SBSP);
925 return hr;
926
927 return S_OK;
928}
929
930LRESULT CNSCBand::OnEndLabelEdit(_In_ LPNMTVDISPINFO dispInfo)
931{
932 CItemData *info = _GetItemData(dispInfo->item.hItem);
933 HRESULT hr;
934 BOOL AllowTreeSetNewName = TRUE;
935
936 m_isEditing = FALSE;
937 if (m_oldSelected)
938 {
939 ++m_mtxBlockNavigate;
940 TreeView_SelectItem(m_hwndTreeView, m_oldSelected);
941 --m_mtxBlockNavigate;
942 }
943
944 if (!dispInfo->item.pszText)
945 return FALSE;
946
947 if (m_OriginalRename)
948 {
949 BOOL same = !lstrcmpW(m_OriginalRename, dispInfo->item.pszText); // Case-sensitive
950 SHFree(m_OriginalRename);
951 m_OriginalRename = NULL;
952 if (same)
953 return FALSE;
954 }
955
956 CComPtr<IShellFolder> pParent;
957 LPCITEMIDLIST pidlChild;
958 BOOL RenamedCurrent = _IsCurrentLocation(info->absolutePidl) == S_OK;
959
960 hr = SHBindToParent(info->absolutePidl, IID_PPV_ARG(IShellFolder, &pParent), &pidlChild);
962 return FALSE;
963
964 CComHeapPtr<ITEMIDLIST> pidlNew;
965 hr = pParent->SetNameOf(m_hWnd, pidlChild, dispInfo->item.pszText, SHGDN_INFOLDER, &pidlNew);
966 if (SUCCEEDED(hr) && pidlNew)
967 {
968 CComPtr<IPersistFolder2> pPersist;
971 return FALSE;
972
973 CComHeapPtr<ITEMIDLIST> pidlParent;
974 hr = pPersist->GetCurFolder(&pidlParent);
976 return FALSE;
977
978 CComHeapPtr<ITEMIDLIST> pidlNewAbs(ILCombine(pidlParent, pidlNew));
979
980 // RegItems can be renamed to their default name (not the string we have in NMTVDISPINFO) by IShellFolder.
981 // We should therefore try to manually update the name instead of letting the treeview do it for us.
982 AllowTreeSetNewName = FAILED(_UpdateItem(dispInfo->item.hItem, info, pidlNewAbs));
983 if (RenamedCurrent)
984 {
985 _UpdateBrowser(pidlNewAbs, TRUE, SBSP_ACTIVATE_NOFOCUS); // The PIDL changed, the view needs to update
986 }
987 else
988 {
989 // Tell everyone if SetNameOf forgot, this causes IShellView to update itself when we rename a child
990 SHChangeNotify(SHCNE_RENAMEFOLDER, SHCNF_IDLIST, info->absolutePidl, pidlNewAbs);
991 }
992 return AllowTreeSetNewName;
993 }
994 return FALSE;
995}
996
997LRESULT CNSCBand::OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
998{
999 NMHDR *pnmhdr = (NMHDR*)lParam;
1000 switch (pnmhdr->code)
1001 {
1002 case TVN_ITEMEXPANDING:
1003 return OnTreeItemExpanding((LPNMTREEVIEW)lParam);
1004 //case TVN_SINGLEEXPAND:
1005 case TVN_SELCHANGED:
1006 if (pnmhdr->hwndFrom == m_hwndTreeView)
1007 _OnSelectionChanged((LPNMTREEVIEW)lParam);
1008 break;
1009 case TVN_DELETEITEM:
1010 OnTreeItemDeleted((LPNMTREEVIEW)lParam);
1011 break;
1012 case NM_CLICK:
1013 case NM_RCLICK:
1014 if (pnmhdr->hwndFrom == m_hwndTreeView)
1015 {
1016 TVHITTESTINFO HitTest;
1017 ::GetCursorPos(&HitTest.pt);
1018 ::ScreenToClient(m_hwndTreeView, &HitTest.pt);
1019 TreeView_HitTest(m_hwndTreeView, &HitTest);
1020
1021 if (HitTest.flags & (TVHT_ABOVE | TVHT_BELOW | TVHT_NOWHERE))
1022 return TRUE; // Prevents click processing
1023
1024 if (HitTest.flags & TVHT_ONITEMBUTTON) // [+] / [-]
1025 break; // Do default processing
1026
1027 HTREEITEM hCurrent = TreeView_GetSelection(m_hwndTreeView);
1028 // Generate selection notification even if same item
1029 m_hwndTreeView.SendMessage(WM_SETREDRAW, FALSE, 0);
1030 // FIXME: This is incorrect, it's legal to right-click another item without causing a navigation
1031 TreeView_SelectItem(m_hwndTreeView, NULL);
1032 TreeView_SelectItem(m_hwndTreeView, HitTest.hItem);
1033 m_hwndTreeView.SendMessage(WM_SETREDRAW, TRUE, 0);
1034
1035 if (pnmhdr->code == NM_CLICK && HitTest.hItem != hCurrent)
1036 return TRUE; // Prevents click processing
1037 }
1038 break;
1039 case TVN_BEGINDRAG:
1040 case TVN_BEGINRDRAG:
1041 OnTreeItemDragging((LPNMTREEVIEW)lParam, pnmhdr->code == TVN_BEGINRDRAG);
1042 break;
1045 case TVN_ENDLABELEDITW:
1047 default:
1048 break;
1049 }
1050
1051 return 0;
1052}
1053
1054// Temporary menu
1056{
1058 CMenuTemp(HMENU hMenu) : m_hMenu(hMenu)
1059 {
1060 }
1062 {
1063 if (m_hMenu)
1065 }
1066 operator HMENU() const
1067 {
1068 return m_hMenu;
1069 }
1070};
1071
1073{
1074 LRESULT ret = 0;
1076 if (uMsg == WM_DESTROY)
1077 SetWindowLongPtrW(hWnd, 0, 0);
1078 else if (pCM && SHForwardContextMenuMsg(pCM, uMsg, wParam, lParam, &ret, TRUE) == S_OK)
1079 return ret;
1080 return DefWindowProcW(hWnd, uMsg, wParam, lParam);
1081}
1082
1083// *** ATL event handlers ***
1084LRESULT CNSCBand::OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
1085{
1086 HWND hwndTarget = reinterpret_cast<HWND>(wParam);
1087 if (hwndTarget && (hwndTarget == m_hwndToolbar || hwndTarget == m_hWnd))
1088 {
1089 FIXME("Show 'Close Toolbar' menu\n");
1090 return 0;
1091 }
1092
1093 HTREEITEM hItem = TreeView_GetSelection(m_hwndTreeView);
1094 if (!hItem)
1095 return 0;
1096
1098 if ((UINT)lParam == (UINT)-1)
1099 {
1100 RECT rc;
1101 if (TreeView_GetItemRect(m_hwndTreeView, hItem, &rc, TRUE))
1102 {
1103 // Center of item rectangle
1104 pt.x = (rc.left + rc.right) / 2;
1105 pt.y = (rc.top + rc.bottom) / 2;
1106 }
1108 }
1109
1110 CItemData *info = _GetItemData(hItem);
1111 if (!info)
1112 {
1113 ERR("No node data, something has gone wrong\n");
1114 return 0;
1115 }
1116
1117 CComPtr<IShellFolder> pFolder;
1118 LPCITEMIDLIST pidlChild;
1119 HRESULT hr = SHBindToParent(info->absolutePidl, IID_PPV_ARG(IShellFolder, &pFolder), &pidlChild);
1121 return 0;
1122
1123 CComPtr<IContextMenu> contextMenu;
1124 hr = pFolder->GetUIObjectOf(m_hWnd, 1, &pidlChild, IID_NULL_PPV_ARG(IContextMenu, &contextMenu));
1126 return 0;
1127
1128 IUnknown_SetSite(contextMenu, (IDeskBand *)this);
1129
1130 UINT cmf = CMF_EXPLORE;
1131 SFGAOF attr = SFGAO_CANRENAME;
1132 hr = pFolder->GetAttributesOf(1, &pidlChild, &attr);
1133 if (SUCCEEDED(hr) && (attr & SFGAO_CANRENAME))
1134 cmf |= CMF_CANRENAME;
1135
1136 CMenuTemp menuTemp(::CreatePopupMenu());
1137 UINT idCmdFirst = max(FCIDM_SHVIEWFIRST, 1);
1138 hr = contextMenu->QueryContextMenu(menuTemp, 0, idCmdFirst, FCIDM_SHVIEWLAST, cmf);
1140 return 0;
1141 SHELL_RemoveVerb(contextMenu, idCmdFirst, menuTemp, L"link");
1142
1145 (LONG_PTR)static_cast<IContextMenu*>(contextMenu));
1146 HWND hWndMenuOwner = hWndWorker ? hWndWorker : m_hWnd;
1147
1149 UINT uCommand = ::TrackPopupMenu(menuTemp, flags, pt.x, pt.y, 0, hWndMenuOwner, NULL);
1150 if (uCommand)
1151 {
1152 uCommand -= idCmdFirst;
1153
1154 // Do DFM_CMD_RENAME in the treeview
1155 if ((cmf & CMF_CANRENAME) && SHELL_IsVerb(contextMenu, uCommand, L"rename"))
1156 {
1157 m_hwndTreeView.SetFocus();
1158 if (TreeView_EditLabel(m_hwndTreeView, hItem))
1159 m_oldSelected = hItem;
1160 return 0;
1161 }
1162
1163 hr = _ExecuteCommand(contextMenu, uCommand);
1164 }
1165 if (hWndWorker)
1166 ::DestroyWindow(hWndWorker);
1167
1168 return TRUE;
1169}
1170
1171// WM_USER_SHELLEVENT
1172LRESULT CNSCBand::OnShellEvent(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
1173{
1174 // We use SHCNRF_NewDelivery method
1175 HANDLE hChange = (HANDLE)wParam;
1176 DWORD dwProcID = (DWORD)lParam;
1177
1178 PIDLIST_ABSOLUTE *ppidl = NULL;
1179 LONG lEvent;
1180 HANDLE hLock = SHChangeNotification_Lock(hChange, dwProcID, &ppidl, &lEvent);
1181 if (!hLock)
1182 {
1183 ERR("!hLock\n");
1184 return 0;
1185 }
1186
1187 OnChangeNotify(ppidl[0], ppidl[1], (lEvent & ~SHCNE_INTERRUPT));
1188
1190 return 0;
1191}
1192
1193// *** IOleWindow ***
1194
1195STDMETHODIMP CNSCBand::GetWindow(HWND *lphwnd)
1196{
1197 if (!lphwnd)
1198 return E_INVALIDARG;
1199 *lphwnd = m_hWnd;
1200 return S_OK;
1201}
1202
1203STDMETHODIMP CNSCBand::ContextSensitiveHelp(BOOL fEnterMode)
1204{
1206 return E_NOTIMPL;
1207}
1208
1209// *** IDockingWindow ***
1210
1211STDMETHODIMP CNSCBand::CloseDW(DWORD dwReserved)
1212{
1213 // We do nothing, we don't have anything to save yet
1214 TRACE("CloseDW called\n");
1215 return S_OK;
1216}
1217
1218STDMETHODIMP CNSCBand::ResizeBorderDW(const RECT *prcBorder, IUnknown *punkToolbarSite, BOOL fReserved)
1219{
1220 /* Must return E_NOTIMPL according to MSDN */
1221 return E_NOTIMPL;
1222}
1223
1224STDMETHODIMP CNSCBand::ShowDW(BOOL fShow)
1225{
1226 m_fVisible = fShow;
1227 ShowWindow(fShow ? SW_SHOW : SW_HIDE);
1228 return S_OK;
1229}
1230
1231// *** IDeskBand ***
1232
1233STDMETHODIMP CNSCBand::GetBandInfo(DWORD dwBandID, DWORD dwViewMode, DESKBANDINFO *pdbi)
1234{
1235 if (!pdbi)
1236 return E_INVALIDARG;
1237
1238 m_dwBandID = dwBandID;
1239
1240 if (pdbi->dwMask & DBIM_MINSIZE)
1241 {
1242 pdbi->ptMinSize.x = 200;
1243 pdbi->ptMinSize.y = 30;
1244 }
1245
1246 if (pdbi->dwMask & DBIM_MAXSIZE)
1247 pdbi->ptMaxSize.y = -1;
1248
1249 if (pdbi->dwMask & DBIM_INTEGRAL)
1250 pdbi->ptIntegral.y = 1;
1251
1252 if (pdbi->dwMask & DBIM_ACTUAL)
1253 {
1254 pdbi->ptActual.x = 200;
1255 pdbi->ptActual.y = 30;
1256 }
1257
1258 if (pdbi->dwMask & DBIM_TITLE)
1259 {
1260 _GetTitle(pdbi->wszTitle, _countof(pdbi->wszTitle));
1261 }
1262
1263 if (pdbi->dwMask & DBIM_MODEFLAGS)
1264 pdbi->dwModeFlags = DBIMF_NORMAL | DBIMF_VARIABLEHEIGHT;
1265
1266 if (pdbi->dwMask & DBIM_BKCOLOR)
1267 pdbi->dwMask &= ~DBIM_BKCOLOR;
1268
1269 return S_OK;
1270}
1271
1272// *** IObjectWithSite ***
1273
1274STDMETHODIMP CNSCBand::SetSite(IUnknown *pUnkSite)
1275{
1276 HRESULT hr;
1277
1278 if (pUnkSite == m_pSite)
1279 return S_OK;
1280
1281 TRACE("SetSite called\n");
1282
1283 if (!pUnkSite)
1284 {
1285 DestroyWindow();
1286 m_hWnd = NULL;
1287 }
1288
1289 if (pUnkSite != m_pSite)
1290 m_pSite = NULL;
1291
1292 if (!pUnkSite)
1293 return S_OK;
1294
1296 hr = IUnknown_GetWindow(pUnkSite, &hwndParent);
1298 return E_INVALIDARG;
1299
1300 m_pSite = pUnkSite;
1301
1302 if (m_hWnd)
1303 {
1304 SetParent(hwndParent); // Change its parent
1305 }
1306 else
1307 {
1309 this->Create(hwndParent, NULL, NULL, style, 0, 0U, NULL);
1310 }
1311
1312 _RegisterChangeNotify();
1313
1314 return S_OK;
1315}
1316
1317STDMETHODIMP CNSCBand::GetSite(REFIID riid, void **ppvSite)
1318{
1319 if (!ppvSite)
1320 return E_POINTER;
1321 *ppvSite = m_pSite;
1322 return S_OK;
1323}
1324
1325// *** IOleCommandTarget ***
1326
1327STDMETHODIMP CNSCBand::QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds [], OLECMDTEXT *pCmdText)
1328{
1330 return E_NOTIMPL;
1331}
1332
1333STDMETHODIMP CNSCBand::Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
1334{
1336 return E_NOTIMPL;
1337}
1338
1339// *** IServiceProvider ***
1340
1341STDMETHODIMP CNSCBand::QueryService(REFGUID guidService, REFIID riid, void **ppvObject)
1342{
1343 return IUnknown_QueryService(m_pSite, guidService, riid, ppvObject);
1344}
1345
1346// *** IContextMenu ***
1347
1348STDMETHODIMP CNSCBand::QueryContextMenu(
1349 HMENU hmenu,
1350 UINT indexMenu,
1351 UINT idCmdFirst,
1352 UINT idCmdLast,
1353 UINT uFlags)
1354{
1356 return E_NOTIMPL;
1357}
1358
1359STDMETHODIMP CNSCBand::InvokeCommand(
1360 LPCMINVOKECOMMANDINFO lpici)
1361{
1363 return E_NOTIMPL;
1364}
1365
1366STDMETHODIMP CNSCBand::GetCommandString(
1367 UINT_PTR idCmd,
1368 UINT uType,
1369 UINT *pwReserved,
1370 LPSTR pszName,
1371 UINT cchMax)
1372{
1374 return E_NOTIMPL;
1375}
1376
1377// *** IInputObject ***
1378
1379STDMETHODIMP CNSCBand::UIActivateIO(BOOL fActivate, LPMSG lpMsg)
1380{
1381 if (fActivate)
1382 {
1383 m_hwndTreeView.SetFocus();
1384 }
1385
1386 if (lpMsg)
1387 {
1388 TranslateMessage(lpMsg);
1389 DispatchMessage(lpMsg);
1390 }
1391
1392 return S_OK;
1393}
1394
1395STDMETHODIMP CNSCBand::HasFocusIO()
1396{
1397 return m_bFocused ? S_OK : S_FALSE;
1398}
1399
1400STDMETHODIMP CNSCBand::TranslateAcceleratorIO(LPMSG lpMsg)
1401{
1402 BOOL SkipAccelerators = m_isEditing || (!IsChild(lpMsg->hwnd) && lpMsg->hwnd != m_hWnd);
1403 if (lpMsg->message == WM_KEYDOWN && lpMsg->wParam == VK_F2 && !SkipAccelerators)
1404 {
1405 if (HTREEITEM hItem = m_hwndTreeView.GetNextItem(NULL, TVGN_CARET))
1406 {
1407 if (_GetAttributesOfItem(_GetItemData(hItem), SFGAO_CANRENAME))
1408 {
1409 m_hwndTreeView.SetFocus();
1410 m_hwndTreeView.EditLabel(hItem);
1411 return S_OK;
1412 }
1413 }
1414 }
1415
1416 if (lpMsg->message == WM_SYSKEYDOWN && lpMsg->wParam == VK_RETURN && !SkipAccelerators)
1417 {
1418 CItemData *pItem = _GetItemData(TVGN_CARET);
1419 if (pItem && _GetAttributesOfItem(pItem, SFGAO_HASPROPSHEET))
1420 {
1421 SHELLEXECUTEINFOW sei = { sizeof(sei), SEE_MASK_INVOKEIDLIST, m_hwndTreeView };
1422 sei.lpVerb = L"properties";
1423 sei.lpIDList = pItem->absolutePidl;
1424 sei.nShow = SW_SHOW;
1425 ShellExecuteExW(&sei);
1426 return S_OK;
1427 }
1428 else
1429 {
1430 MessageBeep(0xFFFFFFFF);
1431 }
1432 }
1433
1434 if (lpMsg->hwnd == m_hWnd ||
1435 (m_isEditing && IsChild(lpMsg->hwnd)))
1436 {
1437 // TODO: Why is it doing this for m_hWnd for all messages?!
1438 TranslateMessage(lpMsg);
1439 DispatchMessage(lpMsg);
1440 return S_OK;
1441 }
1442 return S_FALSE;
1443}
1444
1445// *** IPersist ***
1446
1447STDMETHODIMP CNSCBand::GetClassID(CLSID *pClassID)
1448{
1449 return E_NOTIMPL;
1450}
1451
1452// *** IPersistStream ***
1453
1454STDMETHODIMP CNSCBand::IsDirty()
1455{
1457 return E_NOTIMPL;
1458}
1459
1460STDMETHODIMP CNSCBand::Load(IStream *pStm)
1461{
1463 return E_NOTIMPL;
1464}
1465
1466STDMETHODIMP CNSCBand::Save(IStream *pStm, BOOL fClearDirty)
1467{
1469 return E_NOTIMPL;
1470}
1471
1472STDMETHODIMP CNSCBand::GetSizeMax(ULARGE_INTEGER *pcbSize)
1473{
1475 return E_NOTIMPL;
1476}
1477
1478// *** IWinEventHandler ***
1479
1480STDMETHODIMP CNSCBand::OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult)
1481{
1482 return S_OK;
1483}
1484
1485STDMETHODIMP CNSCBand::IsWindowOwner(HWND hWnd)
1486{
1487 return SHIsChildOrSelf(m_hWnd, hWnd);
1488}
1489
1490// *** IBandNavigate ***
1491
1492STDMETHODIMP CNSCBand::Select(LPCITEMIDLIST pidl)
1493{
1494 return _UpdateBrowser(pidl, TRUE);
1495}
1496
1497// *** INamespaceProxy ***
1498
1499// Returns the ITEMIDLIST that should be navigated when an item is invoked.
1500STDMETHODIMP CNSCBand::GetNavigateTarget(
1502 _Out_ PIDLIST_ABSOLUTE *ppidlTarget,
1503 _Out_ ULONG *pulAttrib)
1504{
1505 *pulAttrib = 0;
1507 if (!SHGetPathFromIDListW(pidl, szPath))
1508 return E_FAIL;
1509
1510 if (lstrcmpiW(PathFindExtensionW(szPath), L".lnk") == 0) // shortcut file?
1511 {
1512 WCHAR szTarget[MAX_PATH];
1513 HRESULT hr = SHDOCVW_GetPathOfShortcut(m_hWnd, szPath, szTarget);
1514 if (SUCCEEDED(hr))
1515 {
1516 lstrcpynW(szPath, szTarget, _countof(szPath));
1517 *pulAttrib |= SFGAO_LINK;
1518 }
1519 }
1520
1522 *pulAttrib |= SFGAO_FOLDER;
1523
1524 *ppidlTarget = ILCreateFromPathW(szPath);
1525 return S_OK;
1526}
1527
1528// Handles a user action on an item.
1529STDMETHODIMP CNSCBand::Invoke(_In_ PCIDLIST_ABSOLUTE pidl)
1530{
1532 return E_NOTIMPL;
1533}
1534
1535// Called when the user has selected an item.
1536STDMETHODIMP CNSCBand::OnSelectionChanged(_In_ PCIDLIST_ABSOLUTE pidl)
1537{
1538 return S_OK;
1539}
1540
1541// Returns flags used to update the tree control.
1542STDMETHODIMP CNSCBand::RefreshFlags(
1543 _Out_ DWORD *pdwStyle,
1544 _Out_ DWORD *pdwExStyle,
1545 _Out_ DWORD *dwEnum)
1546{
1547 *pdwStyle = _GetTVStyle();
1548 *pdwExStyle = _GetTVExStyle();
1549 *dwEnum = _GetEnumFlags();
1550 return S_OK;
1551}
1552
1553STDMETHODIMP CNSCBand::CacheItem(
1555{
1557 return E_NOTIMPL;
1558}
1559
1560// *** IDropTarget methods ***
1561STDMETHODIMP CNSCBand::DragEnter(IDataObject *pObj, DWORD glfKeyState, POINTL pt, DWORD *pdwEffect)
1562{
1563 ERR("Entering drag\n");
1564 m_pCurObject = pObj;
1565 m_oldSelected = TreeView_GetSelection(m_hwndTreeView);
1566 return DragOver(glfKeyState, pt, pdwEffect);
1567}
1568
1569STDMETHODIMP CNSCBand::DragOver(DWORD glfKeyState, POINTL pt, DWORD *pdwEffect)
1570{
1572 info.pt.x = pt.x;
1573 info.pt.y = pt.y;
1574 info.flags = TVHT_ONITEM;
1575 info.hItem = NULL;
1576 ScreenToClient(&info.pt);
1577
1578 // Move to the item selected by the treeview (don't change right pane)
1579 TreeView_HitTest(m_hwndTreeView, &info);
1580
1581 HRESULT hr;
1582 if (!info.hItem)
1583 {
1584 m_childTargetNode = NULL;
1585 m_pDropTarget = NULL;
1586 *pdwEffect = DROPEFFECT_NONE;
1587 return S_OK;
1588 }
1589
1590 ++m_mtxBlockNavigate;
1591 TreeView_SelectItem(m_hwndTreeView, info.hItem);
1592 --m_mtxBlockNavigate;
1593
1594 // Delegate to shell folder
1595 if (m_pDropTarget && info.hItem != m_childTargetNode)
1596 m_pDropTarget = NULL;
1597
1598 if (info.hItem != m_childTargetNode)
1599 {
1600 CItemData *pItemData = _GetItemData(info.hItem);
1601 if (!pItemData)
1602 return E_FAIL;
1603
1604 CComPtr<IShellFolder> pFolder;
1605 if (_ILIsDesktop(pItemData->absolutePidl))
1606 {
1607 pFolder = m_pDesktop;
1608 }
1609 else
1610 {
1611 hr = m_pDesktop->BindToObject(pItemData->absolutePidl, 0, IID_PPV_ARG(IShellFolder, &pFolder));
1612 if (!SUCCEEDED(hr))
1613 {
1614 /* Don't allow dnd since we couldn't get our folder object */
1615 ERR("Can't bind to folder object\n");
1616 *pdwEffect = DROPEFFECT_NONE;
1617 return E_FAIL;
1618 }
1619 }
1620
1621 hr = pFolder->CreateViewObject(m_hWnd, IID_PPV_ARG(IDropTarget, &m_pDropTarget));
1622 if (!SUCCEEDED(hr))
1623 {
1624 /* Don't allow dnd since we couldn't get our drop target */
1625 ERR("Can't get drop target for folder object\n");
1626 *pdwEffect = DROPEFFECT_NONE;
1627 return E_FAIL;
1628 }
1629
1630 hr = m_pDropTarget->DragEnter(m_pCurObject, glfKeyState, pt, pdwEffect);
1631 m_childTargetNode = info.hItem;
1632 }
1633
1634 if (m_pDropTarget)
1635 hr = m_pDropTarget->DragOver(glfKeyState, pt, pdwEffect);
1636
1637 return S_OK;
1638}
1639
1640STDMETHODIMP CNSCBand::DragLeave()
1641{
1642 ++m_mtxBlockNavigate;
1643 TreeView_SelectItem(m_hwndTreeView, m_oldSelected);
1644 --m_mtxBlockNavigate;
1645 m_childTargetNode = NULL;
1646 if (m_pCurObject)
1647 m_pCurObject = NULL;
1648 return S_OK;
1649}
1650
1651STDMETHODIMP CNSCBand::Drop(IDataObject *pObj, DWORD glfKeyState, POINTL pt, DWORD *pdwEffect)
1652{
1653 if (!m_pDropTarget)
1654 return E_FAIL;
1655 m_pDropTarget->Drop(pObj, glfKeyState, pt, pdwEffect);
1656 DragLeave();
1657 return S_OK;
1658}
1659
1660// *** IDropSource methods ***
1661
1662STDMETHODIMP CNSCBand::QueryContinueDrag(BOOL fEscapePressed, DWORD grfKeyState)
1663{
1664 if (fEscapePressed)
1665 return DRAGDROP_S_CANCEL;
1666 if ((grfKeyState & MK_LBUTTON) || (grfKeyState & MK_RBUTTON))
1667 return S_OK;
1668 return DRAGDROP_S_DROP;
1669}
1670
1671STDMETHODIMP CNSCBand::GiveFeedback(DWORD dwEffect)
1672{
1674}
BOOL _ILIsDesktop(LPCITEMIDLIST pidl)
Definition: CBandSite.h:24
#define ATLASSERT(x)
Definition: CComVariant.cpp:10
HRESULT WINAPI SHGetDesktopFolder(IShellFolder **psf)
#define TIMER_ID_REFRESH
Definition: CNSCBand.cpp:13
static bool GetImageListIndex(_In_ IShellFolder *pSF, _In_ LPCITEMIDLIST pidlItem, _Out_ TVITEMW &tvi)
Definition: CNSCBand.cpp:48
static HRESULT SHDOCVW_GetCurrentLocationFromView(_In_ IShellView &View, _In_ PIDLIST_ABSOLUTE *ppidl)
Definition: CNSCBand.cpp:134
#define TARGET_EVENTS
HRESULT SHDOCVW_GetPathOfShortcut(_In_opt_ HWND hWnd, _In_ LPCWSTR pszLnkFile, _Out_ LPWSTR pszPath)
Definition: CNSCBand.cpp:19
static LRESULT CALLBACK MenuMessageForwarderWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: CNSCBand.cpp:1072
#define WM_USER_SHELLEVENT
Definition: CNSCBand.h:12
#define IID_PPV_ARG(Itype, ppType)
UINT cchMax
Arabic default style
Definition: afstyles.h:94
HWND hWnd
Definition: settings.c:17
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
BOOL Query(LPCTSTR *ServiceArgs, DWORD ArgCount, BOOL bExtended)
Definition: query.c:292
#define U(x)
Definition: wordpad.c:45
@ Create
Definition: registry.c:563
#define FIXME(fmt,...)
Definition: precomp.h:53
#define ERR(fmt,...)
Definition: precomp.h:57
#define UlongToHandle(ul)
Definition: basetsd.h:91
#define STDMETHODIMP
Definition: basetyps.h:43
#define UNIMPLEMENTED
Definition: ntoskrnl.c:15
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)
Definition: fxobject.cpp:255
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
BOOL WINAPI InitCommonControlsEx(const INITCOMMONCONTROLSEX *lpInitCtrls)
Definition: commctrl.c:904
static HWND hwndParent
Definition: cryptui.c:299
static TAGID TAGID find
Definition: db.cpp:156
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
HRESULT hr
Definition: delayimp.cpp:582
LPWSTR Name
Definition: desk.c:124
_In_ ULONG Attributes
Definition: dispmprt.h:1077
_In_ D3DDDI_VIDEO_PRESENT_TARGET_ID _In_ ULONG _In_ ULONG Flags
Definition: dispmprt.h:245
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
static BOOL OnEndLabelEdit(NMLVDISPINFO *pnmv)
Definition: environment.c:666
static BOOL OnBeginLabelEdit(NMLVDISPINFO *pnmv)
Definition: environment.c:650
static HINSTANCE instance
Definition: main.c:40
UINT uFlags
Definition: api.c:59
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, IUnknown *outer, DWORD cls_context, REFIID riid, void **obj)
Definition: combase.c:1685
BOOL WINAPI ImageList_Destroy(HIMAGELIST himl)
Definition: imagelist.c:941
#define MAX_PATH
Definition: compat.h:34
#define CALLBACK
Definition: compat.h:35
#define lstrcpynW
Definition: compat.h:738
int WINAPI lstrcmpW(LPCWSTR str1, LPCWSTR str2)
Definition: locale.c:4152
int WINAPI lstrcmpiW(LPCWSTR str1, LPCWSTR str2)
Definition: locale.c:4171
LPWSTR WINAPI PathFindExtensionW(const WCHAR *path)
Definition: path.c:1250
BOOL WINAPI PathIsRootW(const WCHAR *path)
Definition: path.c:1077
HRESULT WINAPI RegisterDragDrop(HWND hwnd, LPDROPTARGET pDropTarget)
Definition: ole2.c:547
HRESULT WINAPI DoDragDrop(IDataObject *pDataObject, IDropSource *pDropSource, DWORD dwOKEffect, DWORD *pdwEffect)
Definition: ole2.c:737
HRESULT WINAPI RevokeDragDrop(HWND hwnd)
Definition: ole2.c:629
HRESULT WINAPI IUnknown_QueryService(IUnknown *obj, REFGUID sid, REFIID iid, void **out)
Definition: main.c:181
HRESULT WINAPI SHStrDupW(const WCHAR *src, WCHAR **dest)
Definition: main.c:1692
HRESULT WINAPI IUnknown_SetSite(IUnknown *obj, IUnknown *site)
Definition: main.c:222
#define ID_ADD
Definition: resource.h:9
#define IDW_TREEVIEW
Definition: resource.h:7
#define ID_ORGANIZE
Definition: resource.h:10
EXTERN_C HRESULT WINAPI SHGetRealIDL(_In_ IShellFolder *psf, _In_ PCUITEMID_CHILD pidlSimple, _Outptr_ PITEMID_CHILD *ppidlReal)
Definition: utils.cpp:1691
void WINAPI SHFree(LPVOID pv)
Definition: shellole.c:370
HRESULT WINAPI SHGetFolderLocation(HWND hwndOwner, int nFolder, HANDLE hToken, DWORD dwReserved, LPITEMIDLIST *ppidl)
Definition: shellpath.c:3278
BOOL WINAPI SHIsChildOrSelf(HWND hParent, HWND hChild)
Definition: ordinal.c:1941
HWND WINAPI SHCreateWorkerWindowW(WNDPROC wndProc, HWND hWndParent, DWORD dwExStyle, DWORD dwStyle, HMENU hMenu, LONG_PTR wnd_extra)
Definition: ordinal.c:2552
HRESULT WINAPI IUnknown_GetWindow(IUnknown *lpUnknown, HWND *lphWnd)
Definition: ordinal.c:988
HRESULT WINAPI IUnknown_OnFocusChangeIS(LPUNKNOWN lpUnknown, LPUNKNOWN pFocusObject, BOOL bFocus)
Definition: ordinal.c:4231
BOOL WINAPI PathIsDirectoryW(LPCWSTR lpszPath)
Definition: path.c:669
HRESULT WINAPI StrRetToBufW(LPSTRRET src, const ITEMIDLIST *pidl, LPWSTR dest, UINT len)
Definition: string.c:248
HRESULT WINAPI StrRetToStrW(LPSTRRET lpStrRet, const ITEMIDLIST *pidl, LPWSTR *ppszName)
Definition: string.c:349
#define FAILED_UNEXPECTEDLY
Definition: utils.cpp:33
#define pt(x, y)
Definition: drawing.c:79
return ret
Definition: mutex.c:147
#define L(x)
Definition: resources.c:13
static IShellFolder IShellItem **static IBindCtx LPITEMIDLIST SFGAOF
Definition: ebrowser.c:83
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
FxString * pID
FxObject * pParent
Definition: fxdpcapi.cpp:86
GLbitfield flags
Definition: glext.h:7161
unsigned int UINT
Definition: sysinfo.c:13
int WINAPI SHMapPIDLToSystemImageListIndex(IShellFolder *sh, LPCITEMIDLIST pidl, int *pIndex)
Definition: iconcache.cpp:772
REFIID riid
Definition: atlbase.h:39
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)
ULONG AddRef()
HRESULT QueryInterface([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
uint32_t entry
Definition: isohybrid.c:63
if(dx< 0)
Definition: linetemp.h:194
LONG_PTR LPARAM
Definition: minwindef.h:175
LONG_PTR LRESULT
Definition: minwindef.h:176
UINT_PTR WPARAM
Definition: minwindef.h:174
PSDBQUERYRESULT_VISTA PVOID * ppData
Definition: env.c:56
LPCWSTR szPath
Definition: env.c:37
static HTREEITEM hChild
Definition: treeview.c:383
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:60
#define menu
Definition: input.c:3282
static HMENU hmenu
Definition: win.c:78
__int3264 LONG_PTR
Definition: mstsclib_h.h:276
unsigned __int3264 UINT_PTR
Definition: mstsclib_h.h:274
_In_ HANDLE _In_ DWORD _In_ DWORD _Inout_opt_ LPOVERLAPPED _In_opt_ LPTRANSMIT_FILE_BUFFERS _In_ DWORD dwReserved
Definition: mswsock.h:95
#define _Out_opt_
Definition: no_sal2.h:214
#define _Inout_
Definition: no_sal2.h:162
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
#define _In_opt_
Definition: no_sal2.h:212
#define DWORD
Definition: nt_native.h:44
#define UNICODE_NULL
#define STGM_READ
Definition: objbase.h:936
const GUID IID_IDataObject
#define LOWORD(l)
Definition: pedump.c:82
#define WS_CHILD
Definition: pedump.c:617
short WCHAR
Definition: pedump.c:58
#define WS_VISIBLE
Definition: pedump.c:620
short SHORT
Definition: pedump.c:59
long LONG
Definition: pedump.c:60
#define WS_CLIPSIBLINGS
Definition: pedump.c:618
#define WS_CLIPCHILDREN
Definition: pedump.c:619
void WINAPI ILFree(LPITEMIDLIST pidl)
Definition: pidl.c:1051
LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: pidl.c:817
BOOL WINAPI ILRemoveLastID(LPITEMIDLIST pidl)
Definition: pidl.c:222
HRESULT WINAPI SHBindToParent(LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppv, LPCITEMIDLIST *ppidlLast)
Definition: pidl.c:1504
BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath)
Definition: pidl.c:1496
LPITEMIDLIST WINAPI ILCreateFromPathW(LPCWSTR path)
Definition: pidl.c:1108
BOOL WINAPI ILIsEqual(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: pidl.c:583
static const WCHAR szName[]
Definition: powrprof.c:45
#define TVN_DELETEITEM
Definition: commctrl.h:3747
#define TVITEM
Definition: commctrl.h:3370
_Out_opt_ int _Out_opt_ int * cy
Definition: commctrl.h:586
#define TVHT_NOWHERE
Definition: commctrl.h:3529
#define TVN_SELCHANGED
Definition: commctrl.h:3740
#define TVHT_BELOW
Definition: commctrl.h:3539
#define TVN_BEGINDRAG
Definition: commctrl.h:3745
#define TVI_LAST
Definition: commctrl.h:3375
#define TreeView_DeleteAllItems(hwnd)
Definition: commctrl.h:3422
#define TVHT_ABOVE
Definition: commctrl.h:3538
#define TB_AUTOSIZE
Definition: commctrl.h:1137
#define TVIF_TEXT
Definition: commctrl.h:3271
#define TreeView_SelectItem(hwnd, hitem)
Definition: commctrl.h:3486
#define TVHT_ONITEM
Definition: commctrl.h:3532
#define ICC_TREEVIEW_CLASSES
Definition: commctrl.h:59
#define TreeView_GetChild(hwnd, hitem)
Definition: commctrl.h:3471
#define TreeView_GetEditControl(hwnd)
Definition: commctrl.h:3512
#define TVIF_IMAGE
Definition: commctrl.h:3272
#define TVIS_EXPANDEDONCE
Definition: commctrl.h:3290
#define TVSIL_NORMAL
Definition: commctrl.h:3448
#define LPNMTREEVIEW
Definition: commctrl.h:3648
#define TreeView_GetItemState(hwndTV, hti, mask)
Definition: commctrl.h:3600
#define TVHT_ONITEMBUTTON
Definition: commctrl.h:3534
_Out_opt_ int * cx
Definition: commctrl.h:585
#define TreeView_GetParent(hwnd, hitem)
Definition: commctrl.h:3474
#define TreeView_GetSelection(hwnd)
Definition: commctrl.h:3478
#define TreeView_GetItem(hwnd, pitem)
Definition: commctrl.h:3495
#define NM_CLICK
Definition: commctrl.h:130
#define TreeView_GetItemRect(hwnd, hitem, prc, code)
Definition: commctrl.h:3434
#define TVE_EXPAND
Definition: commctrl.h:3428
#define TV_INSERTSTRUCT
Definition: commctrl.h:3382
#define TVI_ROOT
Definition: commctrl.h:3373
#define TV_ITEMW
Definition: commctrl.h:3302
#define TVN_BEGINRDRAG
Definition: commctrl.h:3746
#define TreeView_GetRoot(hwnd)
Definition: commctrl.h:3480
#define WC_TREEVIEWW
Definition: commctrl.h:3248
#define TVIF_HANDLE
Definition: commctrl.h:3275
#define TVE_COLLAPSE
Definition: commctrl.h:3427
#define TreeView_GetNextSibling(hwnd, hitem)
Definition: commctrl.h:3472
#define TVIS_EXPANDED
Definition: commctrl.h:3289
#define NM_RCLICK
Definition: commctrl.h:133
#define TVN_ITEMEXPANDING
Definition: commctrl.h:3743
#define TVGN_CARET
Definition: commctrl.h:3466
#define TVN_BEGINLABELEDITW
Definition: commctrl.h:3715
#define TreeView_EditLabel(hwnd, hitem)
Definition: commctrl.h:3509
#define TVIF_PARAM
Definition: commctrl.h:3273
#define ICC_BAR_CLASSES
Definition: commctrl.h:60
#define LPNMTVDISPINFO
Definition: commctrl.h:3681
#define TreeView_SetImageList(hwnd, himl, iImage)
Definition: commctrl.h:3452
#define TVIF_CHILDREN
Definition: commctrl.h:3277
#define TreeView_HitTest(hwnd, lpht)
Definition: commctrl.h:3518
#define TreeView_InsertItem(hwnd, lpis)
Definition: commctrl.h:3417
#define TVIF_SELECTEDIMAGE
Definition: commctrl.h:3276
#define TVN_ENDLABELEDITW
Definition: commctrl.h:3717
#define TreeView_SetItem(hwnd, pitem)
Definition: commctrl.h:3502
#define TVIF_STATE
Definition: commctrl.h:3274
#define TreeView_DeleteItem(hwnd, hitem)
Definition: commctrl.h:3420
#define REFIID
Definition: guiddef.h:118
HRESULT WINAPI SHForwardContextMenuMsg(IUnknown *pUnk, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *pResult, BOOL useIContextMenu2)
Definition: rosordinal.c:11
#define __fallthrough
Definition: sal_old.h:314
static void SHDOCVW_LockModule(void)
Definition: shdocvw.h:59
static void SHDOCVW_UnlockModule(void)
Definition: shdocvw.h:60
#define SHIL_SMALL
Definition: shellapi.h:185
#define SEE_MASK_INVOKEIDLIST
Definition: shellapi.h:28
HRESULT WINAPI SHGetImageList(int iImageList, REFIID riid, void **ppv)
Definition: shellord.c:2760
HRESULT WINAPI SHLimitInputEdit(HWND hWnd, IShellFolder *psf)
Definition: shellord.c:3134
BOOL WINAPI DECLSPEC_HOTPATCH ShellExecuteExW(LPSHELLEXECUTEINFOW sei)
Definition: shlexec.cpp:2732
#define SID_SShellBrowser
Definition: shlguid.h:128
#define SHCNE_DRIVEREMOVED
Definition: shlobj.h:1914
#define SHCNE_RMDIR
Definition: shlobj.h:1911
#define SHCNE_DELETE
Definition: shlobj.h:1909
#define SHCNE_MKDIR
Definition: shlobj.h:1910
#define SHCNE_UPDATEITEM
Definition: shlobj.h:1920
#define SHCNE_RENAMEITEM
Definition: shlobj.h:1907
#define SHCNE_UPDATEDIR
Definition: shlobj.h:1919
#define SHCNE_CREATE
Definition: shlobj.h:1908
#define SHCNE_RENAMEFOLDER
Definition: shlobj.h:1924
#define SHCNRF_NewDelivery
Definition: shlobj.h:1956
#define SHCNRF_ShellLevel
Definition: shlobj.h:1954
#define SHCNE_DRIVEADD
Definition: shlobj.h:1915
#define SHCNE_ASSOCCHANGED
Definition: shlobj.h:1928
#define FCIDM_SHVIEWFIRST
Definition: shlobj.h:590
#define SHCNE_INTERRUPT
Definition: shlobj.h:1932
#define FCIDM_SHVIEWLAST
Definition: shlobj.h:621
#define SHCNF_IDLIST
Definition: shlobj.h:1939
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41
const ITEMID_CHILD UNALIGNED * PCUITEMID_CHILD
Definition: shtypes.idl:70
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
Definition: shtypes.idl:42
#define _countof(array)
Definition: sndvol32.h:70
#define TRACE(s)
Definition: solgame.cpp:4
HMENU m_hMenu
Definition: CNSCBand.cpp:1057
CMenuTemp(HMENU hMenu)
Definition: CNSCBand.cpp:1058
Definition: scsiwmi.h:51
LONG y
Definition: windef.h:130
LONG x
Definition: windef.h:129
Definition: cookie.c:202
WCHAR wszTitle[256]
Definition: shobjidl.idl:2563
UINT message
Definition: winuser.h:3223
HWND hwnd
Definition: winuser.h:3222
WPARAM wParam
Definition: winuser.h:3224
UINT code
Definition: winuser.h:3267
HWND hwndFrom
Definition: winuser.h:3265
LONG right
Definition: windef.h:108
LONG bottom
Definition: windef.h:109
LONG top
Definition: windef.h:107
LONG left
Definition: windef.h:106
HTREEITEM hItem
Definition: commctrl.h:3526
LPARAM lParam
Definition: commctrl.h:3330
int cChildren
Definition: commctrl.h:3329
#define max(a, b)
Definition: svc.c:63
HANDLE lEvent
Definition: tftpd.cpp:56
HTREEITEM hItem
Definition: treelist.h:37
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1830
uint16_t * PWSTR
Definition: typedefs.h:56
const uint16_t * LPCWSTR
Definition: typedefs.h:57
uint16_t * LPWSTR
Definition: typedefs.h:56
PVOID HANDLE
Definition: typedefs.h:73
char * LPSTR
Definition: typedefs.h:51
int32_t INT
Definition: typedefs.h:58
uint32_t ULONG
Definition: typedefs.h:59
#define HIWORD(l)
Definition: typedefs.h:247
EXTERN_C VOID SHELL_RemoveVerb(IContextMenu *pcm, UINT idCmdFirst, HMENU hMenu, LPCWSTR Verb)
Definition: utility.cpp:105
EXTERN_C BOOL SHELL_IsVerb(IContextMenu *pcm, UINT_PTR idCmd, LPCWSTR Verb)
Definition: utility.cpp:76
EXTERN_C BOOL SHELL_IsEqualAbsoluteID(PCIDLIST_ABSOLUTE a, PCIDLIST_ABSOLUTE b)
Definition: utility.cpp:70
EXTERN_C HRESULT SHELL_GetIDListFromObject(IUnknown *punk, PIDLIST_ABSOLUTE *ppidl)
Definition: utility.cpp:36
EXTERN_C HRESULT WINAPI AddUrlToFavorites(_In_ HWND hwnd, _In_ LPCWSTR pszUrlW, _In_opt_ LPCWSTR pszTitleW, _In_ BOOL fDisplayUI)
Definition: utility.cpp:192
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define S_FALSE
Definition: winerror.h:3451
#define DRAGDROP_S_USEDEFAULTCURSORS
Definition: winerror.h:3763
#define DRAGDROP_S_DROP
Definition: winerror.h:3758
#define DRAGDROP_S_CANCEL
Definition: winerror.h:3761
#define E_POINTER
Definition: winerror.h:3480
#define SW_SHOWNORMAL
Definition: winuser.h:781
#define MK_RBUTTON
Definition: winuser.h:2404
HMENU WINAPI CreatePopupMenu(void)
Definition: menu.c:838
#define SW_HIDE
Definition: winuser.h:779
#define EM_LIMITTEXT
Definition: winuser.h:2029
#define GetWindowLongPtrW
Definition: winuser.h:4983
BOOL WINAPI TranslateMessage(_In_ const MSG *)
BOOL WINAPI ShowWindow(_In_ HWND, _In_ int)
LRESULT WINAPI DefWindowProcW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define TPM_RIGHTBUTTON
Definition: winuser.h:2416
HWND WINAPI SetParent(_In_ HWND, _In_opt_ HWND)
#define VK_CONTROL
Definition: winuser.h:2239
BOOL WINAPI GetCursorPos(_Out_ LPPOINT)
Definition: cursoricon.c:3074
BOOL WINAPI MessageBeep(_In_ UINT uType)
BOOL WINAPI ClientToScreen(_In_ HWND, _Inout_ LPPOINT)
UINT_PTR WINAPI SetTimer(_In_opt_ HWND, _In_ UINT_PTR, _In_ UINT, _In_opt_ TIMERPROC)
BOOL WINAPI SetWindowTextW(_In_ HWND, _In_opt_ LPCWSTR)
BOOL WINAPI GetClientRect(_In_ HWND, _Out_ LPRECT)
#define VK_RETURN
Definition: winuser.h:2237
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 TPM_LEFTALIGN
Definition: winuser.h:2413
#define TPM_LEFTBUTTON
Definition: winuser.h:2415
#define MAKEINTRESOURCEA(i)
Definition: winuser.h:581
BOOL WINAPI DestroyMenu(_In_ HMENU)
#define MK_LBUTTON
Definition: winuser.h:2403
#define VK_SHIFT
Definition: winuser.h:2238
#define SW_SHOW
Definition: winuser.h:786
BOOL WINAPI TrackPopupMenu(_In_ HMENU, _In_ UINT, _In_ int, _In_ int, _Reserved_ int, _In_ HWND, _Reserved_ LPCRECT)
#define WM_DESTROY
Definition: winuser.h:1637
#define WM_KEYDOWN
Definition: winuser.h:1743
#define DispatchMessage
Definition: winuser.h:5931
#define TPM_RETURNCMD
Definition: winuser.h:2423
BOOL WINAPI KillTimer(_In_opt_ HWND, _In_ UINT_PTR)
#define SetWindowLongPtrW
Definition: winuser.h:5512
BOOL WINAPI DestroyWindow(_In_ HWND)
#define WM_SYSKEYDOWN
Definition: winuser.h:1747
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
SHORT WINAPI GetKeyState(_In_ int)
#define WM_SETREDRAW
Definition: winuser.h:1644
BOOL WINAPI ScreenToClient(_In_ HWND, _Inout_ LPPOINT)
#define VK_F2
Definition: winuser.h:2292
#define IID_NULL_PPV_ARG(Itype, ppType)