ReactOS 0.4.16-dev-1255-g6dd0406
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
48CNSCBand::CNSCBand()
49{
51
54}
55
56CNSCBand::~CNSCBand()
57{
58 if (m_hToolbarImageList)
59 {
60 ImageList_Destroy(m_hToolbarImageList);
61 m_hToolbarImageList = NULL;
62 }
63 SHFree(m_OriginalRename);
65}
66
67VOID CNSCBand::OnFinalMessage(HWND)
68{
69 // The message loop is finished, now we can safely destruct!
70 // HACKFIX: Who did this AddRef? Commenting out Release...
71 //static_cast<IDeskBand *>(this)->Release();
72}
73
74// *** helper methods ***
75
76CNSCBand::CItemData* CNSCBand::_GetItemData(_In_ HTREEITEM hItem)
77{
78 if (hItem == TVI_ROOT)
79 return NULL;
80
81 TVITEMW tvItem = { TVIF_PARAM, hItem };
82 if (!TreeView_GetItem(m_hwndTreeView, &tvItem))
83 return NULL;
84
85 return reinterpret_cast<CItemData*>(tvItem.lParam);
86}
87
88CNSCBand::CItemData* CNSCBand::_GetItemData(_In_ UINT ItemSpec)
89{
90 HTREEITEM hItem = m_hwndTreeView.GetNextItem(NULL, ItemSpec);
91 return hItem ? _GetItemData(hItem) : NULL;
92}
93
94SFGAOF CNSCBand::_GetAttributesOfItem(_In_ CItemData *pData, _In_ SFGAOF Query)
95{
96 if (!pData)
97 return 0;
98 CComPtr<IShellFolder> pFolder;
99 LPCITEMIDLIST pidlChild;
100 HRESULT hr = SHBindToParent(pData->absolutePidl, IID_PPV_ARG(IShellFolder, &pFolder), &pidlChild);
102 return 0;
104 if (FAILED_UNEXPECTEDLY(hr = pFolder->GetAttributesOf(1, &pidlChild, &Attributes)))
105 return 0;
106 return Attributes & Query;
107}
108
109HRESULT CNSCBand::_GetNameOfItem(IShellFolder *pSF, PCUITEMID_CHILD pidl, UINT Flags, PWSTR Name)
110{
111 STRRET strret;
112 HRESULT hr = pSF->GetDisplayNameOf(pidl, Flags, &strret);
114 return hr;
115 hr = StrRetToBufW(&strret, pidl, Name, MAX_PATH);
117 return hr;
118 return hr;
119}
120
121HRESULT CNSCBand::_GetNameOfItem(IShellFolder *pSF, PCUITEMID_CHILD pidl, PWSTR Name)
122{
123 return _GetNameOfItem(pSF, pidl, SHGDN_NORMAL | SHGDN_INFOLDER, Name);
124}
125
126static HRESULT
128{
129 CComPtr<IFolderView> pfv;
130 CComPtr<IShellFolder> psf;
132 if (SUCCEEDED(hr) && SUCCEEDED(hr = pfv->GetFolder(IID_PPV_ARG(IShellFolder, &psf))))
133 hr = SHELL_GetIDListFromObject(psf, ppidl);
134 return hr;
135}
136
137HRESULT CNSCBand::_GetCurrentLocation(_Out_ PIDLIST_ABSOLUTE *ppidl)
138{
139 *ppidl = NULL;
140 CComPtr<IShellBrowser> psb;
141 HRESULT hr = IUnknown_QueryService(m_pSite, SID_STopLevelBrowser, IID_PPV_ARG(IShellBrowser, &psb));
143 return hr;
144
145 CComPtr<IBrowserService> pbs;
147 if (SUCCEEDED(hr = pbs->GetPidl(ppidl)) && *ppidl)
148 return hr;
149
150 CComPtr<IShellView> psv;
151 if (!FAILED_UNEXPECTEDLY(hr = psb->QueryActiveShellView(&psv)))
152 if (SUCCEEDED(hr = psv.p ? SHDOCVW_GetCurrentLocationFromView(*psv.p, ppidl) : E_FAIL))
153 return hr;
154 return hr;
155}
156
157HRESULT CNSCBand::_IsCurrentLocation(_In_ PCIDLIST_ABSOLUTE pidl)
158{
159 if (!pidl)
160 return E_INVALIDARG;
161 HRESULT hr = E_FAIL;
163 hr = _GetCurrentLocation(&location);
164 if (SUCCEEDED(hr))
167 return hr;
168}
169
170HRESULT CNSCBand::_ExecuteCommand(_In_ CComPtr<IContextMenu>& menu, _In_ UINT nCmd)
171{
172 CComPtr<IOleWindow> pBrowserOleWnd;
174 IID_PPV_ARG(IOleWindow, &pBrowserOleWnd));
176 return hr;
177
178 HWND browserWnd;
179 hr = pBrowserOleWnd->GetWindow(&browserWnd);
181 return hr;
182
183 CMINVOKECOMMANDINFO cmi = { sizeof(cmi) };
184 cmi.lpVerb = MAKEINTRESOURCEA(nCmd);
185 cmi.hwnd = browserWnd;
186 cmi.nShow = SW_SHOW;
187 if (::GetKeyState(VK_SHIFT) < 0)
188 cmi.fMask |= CMIC_MASK_SHIFT_DOWN;
189 if (::GetKeyState(VK_CONTROL) < 0)
190 cmi.fMask |= CMIC_MASK_CONTROL_DOWN;
191
192 return menu->InvokeCommand(&cmi);
193}
194
195void CNSCBand::_RegisterChangeNotify()
196{
197#define TARGET_EVENTS ( \
198 SHCNE_DRIVEADD | SHCNE_MKDIR | SHCNE_CREATE | SHCNE_DRIVEREMOVED | SHCNE_RMDIR | \
199 SHCNE_DELETE | SHCNE_RENAMEFOLDER | SHCNE_RENAMEITEM | SHCNE_UPDATEDIR | \
200 SHCNE_UPDATEITEM | SHCNE_ASSOCCHANGED \
201)
202 // Register shell notification
203 SHChangeNotifyEntry shcne = { m_pidlRoot, TRUE };
204 m_shellRegID = SHChangeNotifyRegister(m_hWnd,
208 1, &shcne);
209 if (!m_shellRegID)
210 {
211 ERR("Something went wrong, error %08x\n", GetLastError());
212 }
213}
214
215void CNSCBand::_UnregisterChangeNotify()
216{
217 SHChangeNotifyDeregister(m_shellRegID);
218 m_shellRegID = 0;
219}
220
221void CNSCBand::_DestroyTreeView()
222{
223 TRACE("Cleaning up treeview...\n");
224 /* Remove all items of the treeview */
225 ::RevokeDragDrop(m_hwndTreeView);
226 TreeView_DeleteAllItems(m_hwndTreeView);
227 m_hwndTreeView.DestroyWindow();
228 m_pDesktop = NULL;
229 m_hRoot = NULL;
230 TRACE("Cleanup ok\n");
231}
232
233void CNSCBand::_DestroyToolbar()
234{
235 m_hwndToolbar.DestroyWindow();
236}
237
238HRESULT CNSCBand::_CreateTreeView(HWND hwndParent)
239{
240 RefreshFlags(&m_dwTVStyle, &m_dwTVExStyle, &m_dwEnumFlags);
241 HWND hwndTV = ::CreateWindowExW(m_dwTVExStyle, WC_TREEVIEWW, NULL, m_dwTVStyle, 0, 0, 0, 0,
243 ATLASSERT(hwndTV);
244 if (!hwndTV)
245 return E_FAIL;
246
247 m_hwndTreeView.Attach(hwndTV);
248 ::RegisterDragDrop(m_hwndTreeView, dynamic_cast<IDropTarget*>(this));
249
250 // Init the treeview here
251 HRESULT hr = SHGetDesktopFolder(&m_pDesktop);
253 return hr;
254
255 m_pidlRoot.Free();
256 hr = SHGetFolderLocation(m_hWnd, _GetRootCsidl(), NULL, 0, &m_pidlRoot);
258 return hr;
259
260 // Create image list and set
261 IImageList *piml;
264 return hr;
265
266 TreeView_SetImageList(m_hwndTreeView, (HIMAGELIST)piml, TVSIL_NORMAL);
267 return S_OK;
268}
269
270BOOL
271CNSCBand::_IsTreeItemInEnum(
273 _In_ IEnumIDList *pEnum)
274{
275 CItemData* pItemData = _GetItemData(hItem);
276 if (!pItemData)
277 return FALSE;
278
279 pEnum->Reset();
280
281 CComHeapPtr<ITEMIDLIST_RELATIVE> pidlTemp;
282 while (pEnum->Next(1, &pidlTemp, NULL) == S_OK)
283 {
284 if (ILIsEqual(pidlTemp, pItemData->relativePidl))
285 return TRUE;
286
287 pidlTemp.Free();
288 }
289
290 return FALSE;
291}
292
293BOOL
294CNSCBand::_TreeItemHasThisChild(
296 _In_ PCITEMID_CHILD pidlChild)
297{
298 for (hItem = TreeView_GetChild(m_hwndTreeView, hItem); hItem;
299 hItem = TreeView_GetNextSibling(m_hwndTreeView, hItem))
300 {
301 CItemData* pItemData = _GetItemData(hItem);
302 if (ILIsEqual(pItemData->relativePidl, pidlChild))
303 return TRUE;
304 }
305
306 return FALSE;
307}
308
310CNSCBand::_GetItemEnum(
311 _Out_ CComPtr<IEnumIDList>& pEnum,
313 _Out_opt_ IShellFolder **ppFolder)
314{
315 CComPtr<IShellFolder> psfDesktop;
316 HRESULT hr = SHGetDesktopFolder(&psfDesktop);
318 return hr;
319
320 CComPtr<IShellFolder> pFolder;
321 if (!ppFolder)
322 ppFolder = &pFolder;
323
324 if (hItem == m_hRoot && hItem)
325 {
326 *ppFolder = psfDesktop;
327 (*ppFolder)->AddRef();
328 }
329 else
330 {
331 CItemData* pItemData = _GetItemData(hItem);
332 if (!pItemData && hItem == TVI_ROOT && !_WantsRootItem())
333 hr = psfDesktop->BindToObject(m_pidlRoot, NULL, IID_PPV_ARG(IShellFolder, ppFolder));
334 else
335 hr = psfDesktop->BindToObject(pItemData->absolutePidl, NULL, IID_PPV_ARG(IShellFolder, ppFolder));
337 return hr;
338 }
339
340 return (*ppFolder)->EnumObjects(NULL, _GetEnumFlags(), &pEnum);
341}
342
343BOOL CNSCBand::_ItemHasAnyChild(_In_ HTREEITEM hItem)
344{
345 CComPtr<IEnumIDList> pEnum;
346 HRESULT hr = _GetItemEnum(pEnum, hItem);
347 if (FAILED(hr))
348 return FALSE;
349
350 CComHeapPtr<ITEMIDLIST_RELATIVE> pidlTemp;
351 hr = pEnum->Next(1, &pidlTemp, NULL);
352 return SUCCEEDED(hr);
353}
354
355void CNSCBand::_RefreshRecurse(_In_ HTREEITEM hTarget)
356{
357 CComPtr<IEnumIDList> pEnum;
358 HRESULT hrEnum = _GetItemEnum(pEnum, hTarget);
359
360 // Delete zombie items
361 HTREEITEM hItem, hNextItem;
362 for (hItem = TreeView_GetChild(m_hwndTreeView, hTarget); hItem; hItem = hNextItem)
363 {
364 hNextItem = TreeView_GetNextSibling(m_hwndTreeView, hItem);
365
366 if (SUCCEEDED(hrEnum) && !_IsTreeItemInEnum(hItem, pEnum))
367 TreeView_DeleteItem(m_hwndTreeView, hItem);
368 }
369
370 pEnum = NULL;
371 hrEnum = _GetItemEnum(pEnum, hTarget);
372
373 CItemData* pItemData = ((hTarget == TVI_ROOT) ? NULL : _GetItemData(hTarget));
374
375 // Insert new items and update items
376 if (SUCCEEDED(hrEnum))
377 {
378 CComHeapPtr<ITEMIDLIST_RELATIVE> pidlTemp;
379 while (pEnum->Next(1, &pidlTemp, NULL) == S_OK)
380 {
381 if (!_TreeItemHasThisChild(hTarget, pidlTemp))
382 {
383 if (pItemData)
384 {
385 CComHeapPtr<ITEMIDLIST> pidlAbsolute(ILCombine(pItemData->absolutePidl, pidlTemp));
386 _InsertItem(hTarget, pidlAbsolute, pidlTemp, TRUE);
387 }
388 else
389 {
390 CComHeapPtr<ITEMIDLIST> pidlAbsolute(ILCombine(m_pidlRoot, pidlTemp));
391 _InsertItem(hTarget, pidlAbsolute, pidlTemp, TRUE);
392 }
393 }
394 pidlTemp.Free();
395 }
396 }
397
398 // Update children and recurse
399 for (hItem = TreeView_GetChild(m_hwndTreeView, hTarget); hItem; hItem = hNextItem)
400 {
401 hNextItem = TreeView_GetNextSibling(m_hwndTreeView, hItem);
402
404 item.hItem = hItem;
405 item.cChildren = _ItemHasAnyChild(hItem);
406 TreeView_SetItem(m_hwndTreeView, &item);
407
409 _RefreshRecurse(hItem);
410 }
411}
412
413void CNSCBand::_Refresh()
414{
415 m_hwndTreeView.SendMessage(WM_SETREDRAW, FALSE, 0);
416 _RefreshRecurse(_WantsRootItem() ? m_hRoot : TVI_ROOT);
417 m_hwndTreeView.SendMessage(WM_SETREDRAW, TRUE, 0);
418}
419
420LRESULT CNSCBand::OnTimer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
421{
423
425 _Refresh();
426
427 return 0;
428}
429
430void
431CNSCBand::OnChangeNotify(
435{
436 switch (lEvent)
437 {
438 case SHCNE_DRIVEADD:
439 case SHCNE_MKDIR:
440 case SHCNE_CREATE:
442 case SHCNE_RMDIR:
443 case SHCNE_DELETE:
445 case SHCNE_RENAMEITEM:
446 case SHCNE_UPDATEDIR:
447 case SHCNE_UPDATEITEM:
449 {
452 break;
453 }
454 default:
455 {
456 TRACE("lEvent: 0x%08lX\n", lEvent);
457 break;
458 }
459 }
460}
461
463CNSCBand::_InsertItem(
464 _In_opt_ HTREEITEM hParent,
465 _Inout_ IShellFolder *psfParent,
466 _In_ LPCITEMIDLIST pElt,
467 _In_ LPCITEMIDLIST pEltRelative,
468 _In_ BOOL bSort)
469{
470 /* Get the attributes of the node */
471 SFGAOF attrs = SFGAO_STREAM | SFGAO_HASSUBFOLDER;
472 HRESULT hr = psfParent->GetAttributesOf(1, &pEltRelative, &attrs);
474 return NULL;
475
476 WCHAR wszDisplayName[MAX_PATH];
477 if (FAILED_UNEXPECTEDLY(hr = _GetNameOfItem(psfParent, pEltRelative, wszDisplayName)))
478 return NULL;
479
480 INT iSelIcon = -1;
481 INT iIcon = SHMapPIDLToSystemImageListIndex(psfParent, pEltRelative, &iSelIcon);
482
483 CItemData* pChildInfo = new CItemData;
484 if (!pChildInfo)
485 {
486 ERR("Failed to allocate CItemData\n");
487 return NULL;
488 }
489 pChildInfo->absolutePidl.Attach(ILClone(pElt));
490 pChildInfo->relativePidl.Attach(ILClone(pEltRelative));
491
492 // Set up our treeview template
493 TV_INSERTSTRUCT tvInsert = { hParent, TVI_LAST };
495 tvInsert.item.cchTextMax = MAX_PATH;
496 tvInsert.item.pszText = wszDisplayName;
497 tvInsert.item.iImage = iIcon;
498 tvInsert.item.iSelectedImage = iSelIcon >= 0 ? iSelIcon : iIcon;
499 tvInsert.item.lParam = (LPARAM)pChildInfo;
500
501 if (!(attrs & SFGAO_STREAM) && (attrs & SFGAO_HASSUBFOLDER))
502 tvInsert.item.cChildren = 1;
503
504 HTREEITEM htiCreated = TreeView_InsertItem(m_hwndTreeView, &tvInsert);
505
506 if (bSort)
507 _SortItems(hParent);
508
509 return htiCreated;
510}
511
512/* This is the slow version of the above method */
514CNSCBand::_InsertItem(
515 _In_opt_ HTREEITEM hParent,
516 _In_ LPCITEMIDLIST pElt,
517 _In_ LPCITEMIDLIST pEltRelative,
518 _In_ BOOL bSort)
519{
520 CComPtr<IShellFolder> psfFolder;
521 HRESULT hr = SHBindToParent(pElt, IID_PPV_ARG(IShellFolder, &psfFolder), NULL);
523 return NULL;
524
525 return _InsertItem(hParent, psfFolder, pElt, pEltRelative, bSort);
526}
527
528BOOL CNSCBand::_InsertSubitems(HTREEITEM hItem, LPCITEMIDLIST entry)
529{
530 ULONG fetched = 1, uItemCount = 0;
531
532 CComPtr<IEnumIDList> pEnum;
533 CComPtr<IShellFolder> pFolder;
534 HRESULT hr = _GetItemEnum(pEnum, hItem, &pFolder);
536 return FALSE;
537
538 /* Don't redraw while we add stuff into the tree */
539 m_hwndTreeView.SendMessage(WM_SETREDRAW, FALSE, 0);
540
541 LPITEMIDLIST pidlSub;
542 while (SUCCEEDED(pEnum->Next(1, &pidlSub, &fetched)) && pidlSub && fetched)
543 {
544 LPITEMIDLIST pidlSubComplete;
545 pidlSubComplete = ILCombine(entry, pidlSub);
546
547 if (_InsertItem(hItem, pFolder, pidlSubComplete, pidlSub, FALSE))
548 ++uItemCount;
549
550 ILFree(pidlSubComplete);
551 ILFree(pidlSub);
552 }
553
554 /* Let's do sorting */
555 _SortItems(hItem);
556
557 /* Now we can redraw */
558 m_hwndTreeView.SendMessage(WM_SETREDRAW, TRUE, 0);
559
560 return (uItemCount > 0);
561}
562
563// *** message handlers ***
564
565LRESULT CNSCBand::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
566{
567 if (FAILED_UNEXPECTEDLY(_CreateToolbar(m_hWnd)))
568 return -1;
569 if (FAILED_UNEXPECTEDLY(_CreateTreeView(m_hWnd)))
570 return -1;
571 return 0;
572}
573
574LRESULT CNSCBand::OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
575{
576 _DestroyTreeView();
577 _DestroyToolbar();
578 _UnregisterChangeNotify();
579 return 0;
580}
581
582LRESULT CNSCBand::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
583{
584 if (!m_hwndTreeView)
585 return 0;
586
587 RECT rc;
588 GetClientRect(&rc);
589 LONG cx = rc.right, cy = rc.bottom;
590
591 RECT rcTB;
592 LONG cyTB = 0;
593 if (m_hwndToolbar)
594 {
595 m_hwndToolbar.SendMessage(TB_AUTOSIZE, 0, 0);
596 m_hwndToolbar.GetWindowRect(&rcTB);
597 cyTB = rcTB.bottom - rcTB.top;
598 }
599
600 m_hwndTreeView.MoveWindow(0, cyTB, cx, cy - cyTB);
601 return 0;
602}
603
604LRESULT CNSCBand::OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
605{
606 m_bFocused = TRUE;
607 IUnknown_OnFocusChangeIS(m_pSite, reinterpret_cast<IUnknown*>(this), TRUE);
608 bHandled = FALSE;
609 return 0;
610}
611
612LRESULT CNSCBand::OnKillFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
613{
614 IUnknown_OnFocusChangeIS(m_pSite, reinterpret_cast<IUnknown*>(this), FALSE);
615 m_bFocused = FALSE;
616 return 0;
617}
618
619HRESULT CNSCBand::_AddFavorite()
620{
621 CComHeapPtr<ITEMIDLIST> pidlCurrent;
622 _GetCurrentLocation(&pidlCurrent);
623
624 CComPtr<IShellFolder> pParent;
625 LPCITEMIDLIST pidlLast;
626 HRESULT hr = SHBindToParent(pidlCurrent, IID_PPV_ARG(IShellFolder, &pParent), &pidlLast);
628 return hr;
629
630 STRRET strret;
631 hr = pParent->GetDisplayNameOf(pidlLast, SHGDN_FORPARSING, &strret);
633 return hr;
634
635 CComHeapPtr<WCHAR> pszURL;
636 hr = StrRetToStrW(&strret, NULL, &pszURL);
638 return hr;
639
640 return AddUrlToFavorites(m_hWnd, pszURL, NULL, TRUE);
641}
642
643LRESULT CNSCBand::OnCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
644{
645 switch (LOWORD(wParam))
646 {
647 case ID_ADD:
648 {
649 _AddFavorite();
650 break;
651 }
652 case ID_ORGANIZE:
653 {
654 SHELLEXECUTEINFOW sei = { sizeof(sei), SEE_MASK_INVOKEIDLIST };
655 sei.hwnd = m_hWnd;
656 sei.nShow = SW_SHOWNORMAL;
657 sei.lpIDList = m_pidlRoot;
658 ::ShellExecuteExW(&sei);
659 break;
660 }
661 }
662 return 0;
663}
664
665BOOL CNSCBand::OnTreeItemExpanding(_In_ LPNMTREEVIEW pnmtv)
666{
667 CItemData *pItemData;
668
669 if (pnmtv->action == TVE_COLLAPSE)
670 {
671 if (pnmtv->itemNew.hItem == m_hRoot)
672 {
673 // Prenvent root from collapsing
674 pnmtv->itemNew.mask |= TVIF_STATE;
675 pnmtv->itemNew.stateMask |= TVIS_EXPANDED;
676 pnmtv->itemNew.state &= ~TVIS_EXPANDED;
677 pnmtv->action = TVE_EXPAND;
678 return TRUE;
679 }
680 }
681
682 if (pnmtv->action == TVE_EXPAND)
683 {
684 // Grab our directory PIDL
685 pItemData = _GetItemData(pnmtv->itemNew.hItem);
686 // We have it, let's try
687 if (pItemData && !pItemData->expanded)
688 {
689 if (_InsertSubitems(pnmtv->itemNew.hItem, pItemData->absolutePidl))
690 {
691 pItemData->expanded = TRUE;
692 }
693 else
694 {
695 // remove subitem "+" since we failed to add subitems
696 TVITEMW tvItem = { TVIF_CHILDREN, pnmtv->itemNew.hItem };
697 tvItem.cChildren = 0;
698 TreeView_SetItem(m_hwndTreeView, &tvItem);
699 }
700 }
701 }
702 return FALSE;
703}
704
705BOOL CNSCBand::OnTreeItemDeleted(_In_ LPNMTREEVIEW pnmtv)
706{
707 // Navigate to parent when deleting selected item
708 HTREEITEM hItem = pnmtv->itemOld.hItem;
709 HTREEITEM hParent = TreeView_GetParent(m_hwndTreeView, hItem);
710 if (hParent && TreeView_GetSelection(m_hwndTreeView) == hItem)
711 TreeView_SelectItem(m_hwndTreeView, hParent);
712
713 /* Destroy memory associated to our node */
714 CItemData* pItemData = _GetItemData(hItem);
715 if (!pItemData)
716 return FALSE;
717
718 delete pItemData;
719
720 return TRUE;
721}
722
723void CNSCBand::_OnSelectionChanged(_In_ LPNMTREEVIEW pnmtv)
724{
725 HTREEITEM hItem = pnmtv->itemNew.hItem;
726 if (!hItem)
727 return;
728 CItemData* pItemData = _GetItemData(hItem);
729 if (pItemData)
730 OnSelectionChanged(pItemData->absolutePidl);
731}
732
733void CNSCBand::OnTreeItemDragging(_In_ LPNMTREEVIEW pnmtv, _In_ BOOL isRightClick)
734{
735 CItemData* pItemData = _GetItemData(pnmtv->itemNew.hItem);
736 if (!pItemData)
737 return;
738
739 HRESULT hr;
740 CComPtr<IShellFolder> pSrcFolder;
741 LPCITEMIDLIST pLast;
742 hr = SHBindToParent(pItemData->absolutePidl, IID_PPV_ARG(IShellFolder, &pSrcFolder), &pLast);
744 return;
745
746 SFGAOF attrs = SFGAO_CANCOPY | SFGAO_CANMOVE | SFGAO_CANLINK;
747 pSrcFolder->GetAttributesOf(1, &pLast, &attrs);
748
749 DWORD dwEffect = 0;
750 if (attrs & SFGAO_CANCOPY)
751 dwEffect |= DROPEFFECT_COPY;
752 if (attrs & SFGAO_CANMOVE)
753 dwEffect |= DROPEFFECT_MOVE;
754 if (attrs & SFGAO_CANLINK)
755 dwEffect |= DROPEFFECT_LINK;
756
757 CComPtr<IDataObject> pObj;
758 hr = pSrcFolder->GetUIObjectOf(m_hWnd, 1, &pLast, IID_IDataObject, 0, (LPVOID*)&pObj);
760 return;
761
762 DoDragDrop(pObj, this, dwEffect, &dwEffect);
763}
764
765LRESULT CNSCBand::OnBeginLabelEdit(_In_ LPNMTVDISPINFO dispInfo)
766{
767 // TODO: put this in a function ? (mostly copypasta from CDefView)
768 DWORD dwAttr = SFGAO_CANRENAME;
769 CComPtr<IShellFolder> pParent;
770 LPCITEMIDLIST pChild;
771 HRESULT hr;
772 HWND hWndEdit = TreeView_GetEditControl(dispInfo->hdr.hwndFrom);
773
774 SHFree(m_OriginalRename);
775 m_OriginalRename = NULL;
776 CItemData *info = _GetItemData(dispInfo->item.hItem);
777 if (!info || !hWndEdit)
778 return TRUE;
779
780 hr = SHBindToParent(info->absolutePidl, IID_PPV_ARG(IShellFolder, &pParent), &pChild);
782 return TRUE;
783
784 hr = pParent->GetAttributesOf(1, &pChild, &dwAttr);
785 if (SUCCEEDED(hr) && (dwAttr & SFGAO_CANRENAME))
786 {
788 if (SUCCEEDED(_GetNameOfItem(pParent, pChild, SHGDN_FOREDITING | SHGDN_INFOLDER, szName)))
789 {
790 ::SetWindowTextW(hWndEdit, szName);
791 SHStrDupW(szName, &m_OriginalRename);
792 }
793 m_isEditing = TRUE;
794 m_oldSelected = NULL;
795 return FALSE;
796 }
797 return TRUE;
798}
799
800HRESULT CNSCBand::_UpdateBrowser(LPCITEMIDLIST pidlGoto, BOOL IgnoreSelfNavigation)
801{
802 CComPtr<IShellBrowser> pBrowserService;
803 HRESULT hr = IUnknown_QueryService(m_pSite, SID_STopLevelBrowser,
804 IID_PPV_ARG(IShellBrowser, &pBrowserService));
806 return hr;
807
808 if (_IsCurrentLocation(pidlGoto) == S_OK) // Don't add duplicates to the travel log
809 {
810 if (IgnoreSelfNavigation)
811 return S_FALSE;
812
813 CComPtr<IShellView> psv;
814 if (SUCCEEDED(hr = pBrowserService->QueryActiveShellView(&psv)))
815 hr = psv->Refresh();
816 if (SUCCEEDED(hr))
817 return hr;
818 }
819 hr = pBrowserService->BrowseObject(pidlGoto, SBSP_SAMEBROWSER | SBSP_ABSOLUTE);
821 return hr;
822
823 return S_OK;
824}
825
826LRESULT CNSCBand::OnEndLabelEdit(_In_ LPNMTVDISPINFO dispInfo)
827{
828 CItemData *info = _GetItemData(dispInfo->item.hItem);
829 HRESULT hr;
830 BOOL AllowTreeSetNewName = TRUE;
831
832 m_isEditing = FALSE;
833 if (m_oldSelected)
834 {
835 ++m_mtxBlockNavigate;
836 TreeView_SelectItem(m_hwndTreeView, m_oldSelected);
837 --m_mtxBlockNavigate;
838 }
839
840 if (!dispInfo->item.pszText)
841 return FALSE;
842
843 if (m_OriginalRename)
844 {
845 BOOL same = !lstrcmpW(m_OriginalRename, dispInfo->item.pszText); // Case-sensitive
846 SHFree(m_OriginalRename);
847 m_OriginalRename = NULL;
848 if (same)
849 return FALSE;
850 }
851
852 CComPtr<IShellFolder> pParent;
853 LPCITEMIDLIST pidlChild;
854 BOOL RenamedCurrent = _IsCurrentLocation(info->absolutePidl) == S_OK;
855
856 hr = SHBindToParent(info->absolutePidl, IID_PPV_ARG(IShellFolder, &pParent), &pidlChild);
858 return FALSE;
859
860 CComHeapPtr<ITEMIDLIST> pidlNew;
861 hr = pParent->SetNameOf(m_hWnd, pidlChild, dispInfo->item.pszText, SHGDN_INFOLDER, &pidlNew);
862 if (SUCCEEDED(hr) && pidlNew)
863 {
864 CComPtr<IPersistFolder2> pPersist;
867 return FALSE;
868
869 CComHeapPtr<ITEMIDLIST> pidlParent;
870 hr = pPersist->GetCurFolder(&pidlParent);
872 return FALSE;
873
874 CComHeapPtr<ITEMIDLIST> pidlNewAbs(ILCombine(pidlParent, pidlNew));
875 if (RenamedCurrent)
876 {
877 // Get the new item name from the folder because RegItems can be renamed to their
878 // default name by the folder (which is not the string we have in NMTVDISPINFO).
879 WCHAR wszDisplayName[MAX_PATH];
880 if (SUCCEEDED(_GetNameOfItem(pParent, pidlNew, wszDisplayName)))
881 {
882 TVITEMW tvi;
883 tvi.mask = TVIF_TEXT;
884 tvi.hItem = dispInfo->item.hItem;
885 tvi.pszText = wszDisplayName;
886 AllowTreeSetNewName = !m_hwndTreeView.SetItem(&tvi);
887 }
888
889 _UpdateBrowser(pidlNewAbs, TRUE);
890 }
891 else
892 {
893 // Tell everyone if SetNameOf forgot, this causes IShellView to update itself when we rename a child
894 SHChangeNotify(SHCNE_RENAMEFOLDER, SHCNF_IDLIST, info->absolutePidl, pidlNewAbs);
895 }
896
897 return AllowTreeSetNewName;
898 }
899
900 return FALSE;
901}
902
903LRESULT CNSCBand::OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
904{
905 NMHDR *pnmhdr = (NMHDR*)lParam;
906 switch (pnmhdr->code)
907 {
909 return OnTreeItemExpanding((LPNMTREEVIEW)lParam);
910 //case TVN_SINGLEEXPAND:
911 case TVN_SELCHANGED:
912 if (pnmhdr->hwndFrom == m_hwndTreeView)
913 _OnSelectionChanged((LPNMTREEVIEW)lParam);
914 break;
915 case TVN_DELETEITEM:
916 OnTreeItemDeleted((LPNMTREEVIEW)lParam);
917 break;
918 case NM_CLICK:
919 case NM_RCLICK:
920 if (pnmhdr->hwndFrom == m_hwndTreeView)
921 {
922 TVHITTESTINFO HitTest;
923 ::GetCursorPos(&HitTest.pt);
924 ::ScreenToClient(m_hwndTreeView, &HitTest.pt);
925 TreeView_HitTest(m_hwndTreeView, &HitTest);
926
927 if (HitTest.flags & (TVHT_ABOVE | TVHT_BELOW | TVHT_NOWHERE))
928 return TRUE; // Prevents click processing
929
930 if (HitTest.flags & TVHT_ONITEMBUTTON) // [+] / [-]
931 break; // Do default processing
932
933 // Generate selection notification even if same item
934 m_hwndTreeView.SendMessage(WM_SETREDRAW, FALSE, 0);
935 TreeView_SelectItem(m_hwndTreeView, NULL);
936 TreeView_SelectItem(m_hwndTreeView, HitTest.hItem);
937 m_hwndTreeView.SendMessage(WM_SETREDRAW, TRUE, 0);
938
939 if (pnmhdr->code == NM_CLICK)
940 return TRUE; // Prevents click processing
941 }
942 break;
943 case TVN_BEGINDRAG:
944 case TVN_BEGINRDRAG:
945 OnTreeItemDragging((LPNMTREEVIEW)lParam, pnmhdr->code == TVN_BEGINRDRAG);
946 break;
951 default:
952 break;
953 }
954
955 return 0;
956}
957
958// Temporary menu
960{
962 CMenuTemp(HMENU hMenu) : m_hMenu(hMenu)
963 {
964 }
966 {
967 if (m_hMenu)
969 }
970 operator HMENU() const
971 {
972 return m_hMenu;
973 }
974};
975
977{
978 LRESULT ret = 0;
980 if (uMsg == WM_DESTROY)
981 SetWindowLongPtrW(hWnd, 0, 0);
982 else if (pCM && SHForwardContextMenuMsg(pCM, uMsg, wParam, lParam, &ret, TRUE) == S_OK)
983 return ret;
984 return DefWindowProcW(hWnd, uMsg, wParam, lParam);
985}
986
987// *** ATL event handlers ***
988LRESULT CNSCBand::OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
989{
990 HWND hwndTarget = reinterpret_cast<HWND>(wParam);
991 if (hwndTarget && (hwndTarget == m_hwndToolbar || hwndTarget == m_hWnd))
992 {
993 FIXME("Show 'Close Toolbar' menu\n");
994 return 0;
995 }
996
997 HTREEITEM hItem = TreeView_GetSelection(m_hwndTreeView);
998 if (!hItem)
999 return 0;
1000
1002 if ((UINT)lParam == (UINT)-1)
1003 {
1004 RECT rc;
1005 if (TreeView_GetItemRect(m_hwndTreeView, hItem, &rc, TRUE))
1006 {
1007 // Center of item rectangle
1008 pt.x = (rc.left + rc.right) / 2;
1009 pt.y = (rc.top + rc.bottom) / 2;
1010 }
1012 }
1013
1014 CItemData *info = _GetItemData(hItem);
1015 if (!info)
1016 {
1017 ERR("No node data, something has gone wrong\n");
1018 return 0;
1019 }
1020
1021 CComPtr<IShellFolder> pFolder;
1022 LPCITEMIDLIST pidlChild;
1023 HRESULT hr = SHBindToParent(info->absolutePidl, IID_PPV_ARG(IShellFolder, &pFolder), &pidlChild);
1025 return 0;
1026
1027 CComPtr<IContextMenu> contextMenu;
1028 hr = pFolder->GetUIObjectOf(m_hWnd, 1, &pidlChild, IID_NULL_PPV_ARG(IContextMenu, &contextMenu));
1030 return 0;
1031
1032 IUnknown_SetSite(contextMenu, (IDeskBand *)this);
1033
1034 UINT cmf = CMF_EXPLORE;
1035 SFGAOF attr = SFGAO_CANRENAME;
1036 hr = pFolder->GetAttributesOf(1, &pidlChild, &attr);
1037 if (SUCCEEDED(hr) && (attr & SFGAO_CANRENAME))
1038 cmf |= CMF_CANRENAME;
1039
1040 CMenuTemp menuTemp(::CreatePopupMenu());
1041 UINT idCmdFirst = max(FCIDM_SHVIEWFIRST, 1);
1042 hr = contextMenu->QueryContextMenu(menuTemp, 0, idCmdFirst, FCIDM_SHVIEWLAST, cmf);
1044 return 0;
1045 SHELL_RemoveVerb(contextMenu, idCmdFirst, menuTemp, L"link");
1046
1049 (LONG_PTR)static_cast<IContextMenu*>(contextMenu));
1050 HWND hWndMenuOwner = hWndWorker ? hWndWorker : m_hWnd;
1051
1053 UINT uCommand = ::TrackPopupMenu(menuTemp, flags, pt.x, pt.y, 0, hWndMenuOwner, NULL);
1054 if (uCommand)
1055 {
1056 uCommand -= idCmdFirst;
1057
1058 // Do DFM_CMD_RENAME in the treeview
1059 if ((cmf & CMF_CANRENAME) && SHELL_IsVerb(contextMenu, uCommand, L"rename"))
1060 {
1061 m_hwndTreeView.SetFocus();
1062 if (TreeView_EditLabel(m_hwndTreeView, hItem))
1063 m_oldSelected = hItem;
1064 return 0;
1065 }
1066
1067 hr = _ExecuteCommand(contextMenu, uCommand);
1068 }
1069 if (hWndWorker)
1070 ::DestroyWindow(hWndWorker);
1071
1072 return TRUE;
1073}
1074
1075// WM_USER_SHELLEVENT
1076LRESULT CNSCBand::OnShellEvent(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
1077{
1078 // We use SHCNRF_NewDelivery method
1079 HANDLE hChange = (HANDLE)wParam;
1080 DWORD dwProcID = (DWORD)lParam;
1081
1082 PIDLIST_ABSOLUTE *ppidl = NULL;
1083 LONG lEvent;
1084 HANDLE hLock = SHChangeNotification_Lock(hChange, dwProcID, &ppidl, &lEvent);
1085 if (!hLock)
1086 {
1087 ERR("!hLock\n");
1088 return 0;
1089 }
1090
1091 OnChangeNotify(ppidl[0], ppidl[1], (lEvent & ~SHCNE_INTERRUPT));
1092
1094 return 0;
1095}
1096
1097// *** IOleWindow ***
1098
1099STDMETHODIMP CNSCBand::GetWindow(HWND *lphwnd)
1100{
1101 if (!lphwnd)
1102 return E_INVALIDARG;
1103 *lphwnd = m_hWnd;
1104 return S_OK;
1105}
1106
1107STDMETHODIMP CNSCBand::ContextSensitiveHelp(BOOL fEnterMode)
1108{
1110 return E_NOTIMPL;
1111}
1112
1113// *** IDockingWindow ***
1114
1115STDMETHODIMP CNSCBand::CloseDW(DWORD dwReserved)
1116{
1117 // We do nothing, we don't have anything to save yet
1118 TRACE("CloseDW called\n");
1119 return S_OK;
1120}
1121
1122STDMETHODIMP CNSCBand::ResizeBorderDW(const RECT *prcBorder, IUnknown *punkToolbarSite, BOOL fReserved)
1123{
1124 /* Must return E_NOTIMPL according to MSDN */
1125 return E_NOTIMPL;
1126}
1127
1128STDMETHODIMP CNSCBand::ShowDW(BOOL fShow)
1129{
1130 m_fVisible = fShow;
1131 ShowWindow(fShow ? SW_SHOW : SW_HIDE);
1132 return S_OK;
1133}
1134
1135// *** IDeskBand ***
1136
1137STDMETHODIMP CNSCBand::GetBandInfo(DWORD dwBandID, DWORD dwViewMode, DESKBANDINFO *pdbi)
1138{
1139 if (!pdbi)
1140 return E_INVALIDARG;
1141
1142 m_dwBandID = dwBandID;
1143
1144 if (pdbi->dwMask & DBIM_MINSIZE)
1145 {
1146 pdbi->ptMinSize.x = 200;
1147 pdbi->ptMinSize.y = 30;
1148 }
1149
1150 if (pdbi->dwMask & DBIM_MAXSIZE)
1151 pdbi->ptMaxSize.y = -1;
1152
1153 if (pdbi->dwMask & DBIM_INTEGRAL)
1154 pdbi->ptIntegral.y = 1;
1155
1156 if (pdbi->dwMask & DBIM_ACTUAL)
1157 {
1158 pdbi->ptActual.x = 200;
1159 pdbi->ptActual.y = 30;
1160 }
1161
1162 if (pdbi->dwMask & DBIM_TITLE)
1163 {
1164 _GetTitle(pdbi->wszTitle, _countof(pdbi->wszTitle));
1165 }
1166
1167 if (pdbi->dwMask & DBIM_MODEFLAGS)
1168 pdbi->dwModeFlags = DBIMF_NORMAL | DBIMF_VARIABLEHEIGHT;
1169
1170 if (pdbi->dwMask & DBIM_BKCOLOR)
1171 pdbi->dwMask &= ~DBIM_BKCOLOR;
1172
1173 return S_OK;
1174}
1175
1176// *** IObjectWithSite ***
1177
1178STDMETHODIMP CNSCBand::SetSite(IUnknown *pUnkSite)
1179{
1180 HRESULT hr;
1181
1182 if (pUnkSite == m_pSite)
1183 return S_OK;
1184
1185 TRACE("SetSite called\n");
1186
1187 if (!pUnkSite)
1188 {
1189 DestroyWindow();
1190 m_hWnd = NULL;
1191 }
1192
1193 if (pUnkSite != m_pSite)
1194 m_pSite = NULL;
1195
1196 if (!pUnkSite)
1197 return S_OK;
1198
1200 hr = IUnknown_GetWindow(pUnkSite, &hwndParent);
1202 return E_INVALIDARG;
1203
1204 m_pSite = pUnkSite;
1205
1206 if (m_hWnd)
1207 {
1208 SetParent(hwndParent); // Change its parent
1209 }
1210 else
1211 {
1213 this->Create(hwndParent, NULL, NULL, style, 0, 0U, NULL);
1214 }
1215
1216 _RegisterChangeNotify();
1217
1218 return S_OK;
1219}
1220
1221STDMETHODIMP CNSCBand::GetSite(REFIID riid, void **ppvSite)
1222{
1223 if (!ppvSite)
1224 return E_POINTER;
1225 *ppvSite = m_pSite;
1226 return S_OK;
1227}
1228
1229// *** IOleCommandTarget ***
1230
1231STDMETHODIMP CNSCBand::QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds [], OLECMDTEXT *pCmdText)
1232{
1234 return E_NOTIMPL;
1235}
1236
1237STDMETHODIMP CNSCBand::Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
1238{
1240 return E_NOTIMPL;
1241}
1242
1243// *** IServiceProvider ***
1244
1245STDMETHODIMP CNSCBand::QueryService(REFGUID guidService, REFIID riid, void **ppvObject)
1246{
1247 return IUnknown_QueryService(m_pSite, guidService, riid, ppvObject);
1248}
1249
1250// *** IContextMenu ***
1251
1252STDMETHODIMP CNSCBand::QueryContextMenu(
1253 HMENU hmenu,
1254 UINT indexMenu,
1255 UINT idCmdFirst,
1256 UINT idCmdLast,
1257 UINT uFlags)
1258{
1260 return E_NOTIMPL;
1261}
1262
1263STDMETHODIMP CNSCBand::InvokeCommand(
1264 LPCMINVOKECOMMANDINFO lpici)
1265{
1267 return E_NOTIMPL;
1268}
1269
1270STDMETHODIMP CNSCBand::GetCommandString(
1271 UINT_PTR idCmd,
1272 UINT uType,
1273 UINT *pwReserved,
1274 LPSTR pszName,
1275 UINT cchMax)
1276{
1278 return E_NOTIMPL;
1279}
1280
1281// *** IInputObject ***
1282
1283STDMETHODIMP CNSCBand::UIActivateIO(BOOL fActivate, LPMSG lpMsg)
1284{
1285 if (fActivate)
1286 {
1287 m_hwndTreeView.SetFocus();
1288 }
1289
1290 if (lpMsg)
1291 {
1292 TranslateMessage(lpMsg);
1293 DispatchMessage(lpMsg);
1294 }
1295
1296 return S_OK;
1297}
1298
1299STDMETHODIMP CNSCBand::HasFocusIO()
1300{
1301 return m_bFocused ? S_OK : S_FALSE;
1302}
1303
1304STDMETHODIMP CNSCBand::TranslateAcceleratorIO(LPMSG lpMsg)
1305{
1306 BOOL SkipAccelerators = m_isEditing || (!IsChild(lpMsg->hwnd) && lpMsg->hwnd != m_hWnd);
1307 if (lpMsg->message == WM_KEYDOWN && lpMsg->wParam == VK_F2 && !SkipAccelerators)
1308 {
1309 if (HTREEITEM hItem = m_hwndTreeView.GetNextItem(NULL, TVGN_CARET))
1310 {
1311 if (_GetAttributesOfItem(_GetItemData(hItem), SFGAO_CANRENAME))
1312 {
1313 m_hwndTreeView.SetFocus();
1314 m_hwndTreeView.EditLabel(hItem);
1315 return S_OK;
1316 }
1317 }
1318 }
1319
1320 if (lpMsg->message == WM_SYSKEYDOWN && lpMsg->wParam == VK_RETURN && !SkipAccelerators)
1321 {
1322 CItemData *pItem = _GetItemData(TVGN_CARET);
1323 if (pItem && _GetAttributesOfItem(pItem, SFGAO_HASPROPSHEET))
1324 {
1325 SHELLEXECUTEINFOW sei = { sizeof(sei), SEE_MASK_INVOKEIDLIST, m_hwndTreeView };
1326 sei.lpVerb = L"properties";
1327 sei.lpIDList = pItem->absolutePidl;
1328 sei.nShow = SW_SHOW;
1329 ShellExecuteExW(&sei);
1330 return S_OK;
1331 }
1332 else
1333 {
1334 MessageBeep(0xFFFFFFFF);
1335 }
1336 }
1337
1338 if (lpMsg->hwnd == m_hWnd ||
1339 (m_isEditing && IsChild(lpMsg->hwnd)))
1340 {
1341 // TODO: Why is it doing this for m_hWnd for all messages?!
1342 TranslateMessage(lpMsg);
1343 DispatchMessage(lpMsg);
1344 return S_OK;
1345 }
1346 return S_FALSE;
1347}
1348
1349// *** IPersist ***
1350
1351STDMETHODIMP CNSCBand::GetClassID(CLSID *pClassID)
1352{
1353 return E_NOTIMPL;
1354}
1355
1356// *** IPersistStream ***
1357
1358STDMETHODIMP CNSCBand::IsDirty()
1359{
1361 return E_NOTIMPL;
1362}
1363
1364STDMETHODIMP CNSCBand::Load(IStream *pStm)
1365{
1367 return E_NOTIMPL;
1368}
1369
1370STDMETHODIMP CNSCBand::Save(IStream *pStm, BOOL fClearDirty)
1371{
1373 return E_NOTIMPL;
1374}
1375
1376STDMETHODIMP CNSCBand::GetSizeMax(ULARGE_INTEGER *pcbSize)
1377{
1379 return E_NOTIMPL;
1380}
1381
1382// *** IWinEventHandler ***
1383
1384STDMETHODIMP CNSCBand::OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult)
1385{
1386 return S_OK;
1387}
1388
1389STDMETHODIMP CNSCBand::IsWindowOwner(HWND hWnd)
1390{
1391 return SHIsChildOrSelf(m_hWnd, hWnd);
1392}
1393
1394// *** IBandNavigate ***
1395
1396STDMETHODIMP CNSCBand::Select(LPCITEMIDLIST pidl)
1397{
1399 return E_NOTIMPL;
1400}
1401
1402// *** INamespaceProxy ***
1403
1404// Returns the ITEMIDLIST that should be navigated when an item is invoked.
1405STDMETHODIMP CNSCBand::GetNavigateTarget(
1407 _Out_ PIDLIST_ABSOLUTE *ppidlTarget,
1408 _Out_ ULONG *pulAttrib)
1409{
1410 *pulAttrib = 0;
1412 if (!SHGetPathFromIDListW(pidl, szPath))
1413 return E_FAIL;
1414
1415 if (lstrcmpiW(PathFindExtensionW(szPath), L".lnk") == 0) // shortcut file?
1416 {
1417 WCHAR szTarget[MAX_PATH];
1418 HRESULT hr = SHDOCVW_GetPathOfShortcut(m_hWnd, szPath, szTarget);
1419 if (SUCCEEDED(hr))
1420 {
1421 lstrcpynW(szPath, szTarget, _countof(szPath));
1422 *pulAttrib |= SFGAO_LINK;
1423 }
1424 }
1425
1427 *pulAttrib |= SFGAO_FOLDER;
1428
1429 *ppidlTarget = ILCreateFromPathW(szPath);
1430 return S_OK;
1431}
1432
1433// Handles a user action on an item.
1434STDMETHODIMP CNSCBand::Invoke(_In_ PCIDLIST_ABSOLUTE pidl)
1435{
1437 return E_NOTIMPL;
1438}
1439
1440// Called when the user has selected an item.
1441STDMETHODIMP CNSCBand::OnSelectionChanged(_In_ PCIDLIST_ABSOLUTE pidl)
1442{
1443 return S_OK;
1444}
1445
1446// Returns flags used to update the tree control.
1447STDMETHODIMP CNSCBand::RefreshFlags(
1448 _Out_ DWORD *pdwStyle,
1449 _Out_ DWORD *pdwExStyle,
1450 _Out_ DWORD *dwEnum)
1451{
1452 *pdwStyle = _GetTVStyle();
1453 *pdwExStyle = _GetTVExStyle();
1454 *dwEnum = _GetEnumFlags();
1455 return S_OK;
1456}
1457
1458STDMETHODIMP CNSCBand::CacheItem(
1460{
1462 return E_NOTIMPL;
1463}
1464
1465// *** IDropTarget methods ***
1466STDMETHODIMP CNSCBand::DragEnter(IDataObject *pObj, DWORD glfKeyState, POINTL pt, DWORD *pdwEffect)
1467{
1468 ERR("Entering drag\n");
1469 m_pCurObject = pObj;
1470 m_oldSelected = TreeView_GetSelection(m_hwndTreeView);
1471 return DragOver(glfKeyState, pt, pdwEffect);
1472}
1473
1474STDMETHODIMP CNSCBand::DragOver(DWORD glfKeyState, POINTL pt, DWORD *pdwEffect)
1475{
1477 info.pt.x = pt.x;
1478 info.pt.y = pt.y;
1479 info.flags = TVHT_ONITEM;
1480 info.hItem = NULL;
1481 ScreenToClient(&info.pt);
1482
1483 // Move to the item selected by the treeview (don't change right pane)
1484 TreeView_HitTest(m_hwndTreeView, &info);
1485
1486 HRESULT hr;
1487 if (!info.hItem)
1488 {
1489 m_childTargetNode = NULL;
1490 m_pDropTarget = NULL;
1491 *pdwEffect = DROPEFFECT_NONE;
1492 return S_OK;
1493 }
1494
1495 ++m_mtxBlockNavigate;
1496 TreeView_SelectItem(m_hwndTreeView, info.hItem);
1497 --m_mtxBlockNavigate;
1498
1499 // Delegate to shell folder
1500 if (m_pDropTarget && info.hItem != m_childTargetNode)
1501 m_pDropTarget = NULL;
1502
1503 if (info.hItem != m_childTargetNode)
1504 {
1505 CItemData *pItemData = _GetItemData(info.hItem);
1506 if (!pItemData)
1507 return E_FAIL;
1508
1509 CComPtr<IShellFolder> pFolder;
1510 if (_ILIsDesktop(pItemData->absolutePidl))
1511 {
1512 pFolder = m_pDesktop;
1513 }
1514 else
1515 {
1516 hr = m_pDesktop->BindToObject(pItemData->absolutePidl, 0, IID_PPV_ARG(IShellFolder, &pFolder));
1517 if (!SUCCEEDED(hr))
1518 {
1519 /* Don't allow dnd since we couldn't get our folder object */
1520 ERR("Can't bind to folder object\n");
1521 *pdwEffect = DROPEFFECT_NONE;
1522 return E_FAIL;
1523 }
1524 }
1525
1526 hr = pFolder->CreateViewObject(m_hWnd, IID_PPV_ARG(IDropTarget, &m_pDropTarget));
1527 if (!SUCCEEDED(hr))
1528 {
1529 /* Don't allow dnd since we couldn't get our drop target */
1530 ERR("Can't get drop target for folder object\n");
1531 *pdwEffect = DROPEFFECT_NONE;
1532 return E_FAIL;
1533 }
1534
1535 hr = m_pDropTarget->DragEnter(m_pCurObject, glfKeyState, pt, pdwEffect);
1536 m_childTargetNode = info.hItem;
1537 }
1538
1539 if (m_pDropTarget)
1540 hr = m_pDropTarget->DragOver(glfKeyState, pt, pdwEffect);
1541
1542 return S_OK;
1543}
1544
1545STDMETHODIMP CNSCBand::DragLeave()
1546{
1547 ++m_mtxBlockNavigate;
1548 TreeView_SelectItem(m_hwndTreeView, m_oldSelected);
1549 --m_mtxBlockNavigate;
1550 m_childTargetNode = NULL;
1551 if (m_pCurObject)
1552 m_pCurObject = NULL;
1553 return S_OK;
1554}
1555
1556STDMETHODIMP CNSCBand::Drop(IDataObject *pObj, DWORD glfKeyState, POINTL pt, DWORD *pdwEffect)
1557{
1558 if (!m_pDropTarget)
1559 return E_FAIL;
1560 m_pDropTarget->Drop(pObj, glfKeyState, pt, pdwEffect);
1561 DragLeave();
1562 return S_OK;
1563}
1564
1565// *** IDropSource methods ***
1566
1567STDMETHODIMP CNSCBand::QueryContinueDrag(BOOL fEscapePressed, DWORD grfKeyState)
1568{
1569 if (fEscapePressed)
1570 return DRAGDROP_S_CANCEL;
1571 if ((grfKeyState & MK_LBUTTON) || (grfKeyState & MK_RBUTTON))
1572 return S_OK;
1573 return DRAGDROP_S_DROP;
1574}
1575
1576STDMETHODIMP CNSCBand::GiveFeedback(DWORD dwEffect)
1577{
1579}
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 HRESULT SHDOCVW_GetCurrentLocationFromView(_In_ IShellView &View, _In_ PIDLIST_ABSOLUTE *ppidl)
Definition: CNSCBand.cpp:127
#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:976
#define WM_USER_SHELLEVENT
Definition: CNSCBand.h:12
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:97
#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:300
static TAGID TAGID find
Definition: db.cpp:155
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
LPWSTR Name
Definition: desk.c:124
#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
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:4243
int WINAPI lstrcmpiW(LPCWSTR str1, LPCWSTR str2)
Definition: locale.c:4262
LPWSTR WINAPI PathFindExtensionW(const WCHAR *path)
Definition: path.c:1217
BOOL WINAPI PathIsRootW(const WCHAR *path)
Definition: path.c:1044
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID iid, LPVOID *ppv)
Definition: compobj.c:3325
HRESULT WINAPI RegisterDragDrop(HWND hwnd, LPDROPTARGET pDropTarget)
Definition: ole2.c:557
HRESULT WINAPI DoDragDrop(IDataObject *pDataObject, IDropSource *pDropSource, DWORD dwOKEffect, DWORD *pdwEffect)
Definition: ole2.c:753
HRESULT WINAPI RevokeDragDrop(HWND hwnd)
Definition: ole2.c:639
#define ID_ADD
Definition: resource.h:9
#define IDW_TREEVIEW
Definition: resource.h:7
#define ID_ORGANIZE
Definition: resource.h:10
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
void WINAPI SHFree(LPVOID pv)
Definition: shellole.c:326
HRESULT WINAPI SHGetFolderLocation(HWND hwndOwner, int nFolder, HANDLE hToken, DWORD dwReserved, LPITEMIDLIST *ppidl)
Definition: shellpath.c:3277
HRESULT WINAPI IUnknown_QueryService(IUnknown *, REFGUID, REFIID, LPVOID *)
Definition: ordinal.c:1501
BOOL WINAPI SHIsChildOrSelf(HWND hParent, HWND hChild)
Definition: ordinal.c:2254
HWND WINAPI SHCreateWorkerWindowW(WNDPROC wndProc, HWND hWndParent, DWORD dwExStyle, DWORD dwStyle, HMENU hMenu, LONG_PTR wnd_extra)
Definition: ordinal.c:3004
HRESULT WINAPI IUnknown_GetWindow(IUnknown *lpUnknown, HWND *lphWnd)
Definition: ordinal.c:1336
HRESULT WINAPI IUnknown_OnFocusChangeIS(LPUNKNOWN lpUnknown, LPUNKNOWN pFocusObject, BOOL bFocus)
Definition: ordinal.c:4804
HRESULT WINAPI IUnknown_SetSite(IUnknown *obj, IUnknown *site)
Definition: ordinal.c:1411
BOOL WINAPI PathIsDirectoryW(LPCWSTR lpszPath)
Definition: path.c:1729
HRESULT WINAPI SHStrDupW(LPCWSTR src, LPWSTR *dest)
Definition: string.c:2018
HRESULT WINAPI StrRetToBufW(LPSTRRET src, const ITEMIDLIST *pidl, LPWSTR dest, UINT len)
Definition: string.c:1530
HRESULT WINAPI StrRetToStrW(LPSTRRET lpStrRet, const ITEMIDLIST *pidl, LPWSTR *ppszName)
Definition: string.c:1631
#define FAILED_UNEXPECTEDLY
Definition: utils.cpp:30
#define pt(x, y)
Definition: drawing.c:79
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
FxObject * pParent
Definition: fxdpcapi.cpp:86
GLbitfield flags
Definition: glext.h:7161
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
LPCWSTR szPath
Definition: env.c:37
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:63
static ATOM item
Definition: dde.c:856
static HMENU hmenu
Definition: win.c:66
__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
unsigned int UINT
Definition: ndis.h:50
#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 L(x)
Definition: ntvdm.h:50
#define STGM_READ
Definition: objbase.h:917
const GUID IID_IDataObject
#define LOWORD(l)
Definition: pedump.c:82
#define WS_CHILD
Definition: pedump.c:617
#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
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:237
void WINAPI ILFree(LPITEMIDLIST pidl)
Definition: pidl.c:1044
LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: pidl.c:816
HRESULT WINAPI SHBindToParent(LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppv, LPCITEMIDLIST *ppidlLast)
Definition: pidl.c:1497
BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath)
Definition: pidl.c:1489
LPITEMIDLIST WINAPI ILCreateFromPathW(LPCWSTR path)
Definition: pidl.c:1101
BOOL WINAPI ILIsEqual(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: pidl.c:582
static const WCHAR szName[]
Definition: powrprof.c:45
#define TVN_DELETEITEM
Definition: commctrl.h:3747
_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 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
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:2674
BOOL WINAPI DECLSPEC_HOTPATCH ShellExecuteExW(LPSHELLEXECUTEINFOW sei)
Definition: shlexec.cpp:2461
HRESULT hr
Definition: shlfolder.c:183
#define SID_SShellBrowser
Definition: shlguid.h:128
#define SHCNE_DRIVEREMOVED
Definition: shlobj.h:1905
#define SHCNE_RMDIR
Definition: shlobj.h:1902
#define SHCNE_DELETE
Definition: shlobj.h:1900
#define SHCNE_MKDIR
Definition: shlobj.h:1901
#define SHCNE_UPDATEITEM
Definition: shlobj.h:1911
#define SHCNE_RENAMEITEM
Definition: shlobj.h:1898
#define SHCNE_UPDATEDIR
Definition: shlobj.h:1910
#define SHCNE_CREATE
Definition: shlobj.h:1899
#define SHCNE_RENAMEFOLDER
Definition: shlobj.h:1915
#define SHCNRF_NewDelivery
Definition: shlobj.h:1946
#define SHCNRF_ShellLevel
Definition: shlobj.h:1944
#define SHCNE_DRIVEADD
Definition: shlobj.h:1906
#define SHCNE_ASSOCCHANGED
Definition: shlobj.h:1919
#define FCIDM_SHVIEWFIRST
Definition: shlobj.h:588
#define SHCNE_INTERRUPT
Definition: shlobj.h:1923
#define FCIDM_SHVIEWLAST
Definition: shlobj.h:622
#define SHCNF_IDLIST
Definition: shlobj.h:1929
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:961
CMenuTemp(HMENU hMenu)
Definition: CNSCBand.cpp:962
Definition: scsiwmi.h:51
LONG y
Definition: windef.h:330
LONG x
Definition: windef.h:329
Definition: cookie.c:202
WCHAR wszTitle[256]
Definition: shobjidl.idl:2502
UINT message
Definition: winuser.h:3191
HWND hwnd
Definition: winuser.h:3190
WPARAM wParam
Definition: winuser.h:3192
UINT code
Definition: winuser.h:3235
HWND hwndFrom
Definition: winuser.h:3233
LONG right
Definition: windef.h:308
LONG bottom
Definition: windef.h:309
LONG top
Definition: windef.h:307
LONG left
Definition: windef.h:306
HTREEITEM hItem
Definition: commctrl.h:3526
HTREEITEM hItem
Definition: commctrl.h:3322
LPARAM lParam
Definition: commctrl.h:3330
UINT mask
Definition: commctrl.h:3321
LPWSTR pszText
Definition: commctrl.h:3325
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
PVOID HANDLE
Definition: typedefs.h:73
int32_t INT
Definition: typedefs.h:58
uint32_t ULONG
Definition: typedefs.h:59
#define HIWORD(l)
Definition: typedefs.h:247
int ret
_Must_inspect_result_ _In_ WDFDMAENABLER _In_ _In_opt_ PWDF_OBJECT_ATTRIBUTES Attributes
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
_In_ void _In_ PCCERT_CONTEXT _In_opt_ LPFILETIME _In_ DWORD _In_ DWORD _Outptr_opt_ void ** ppvObject
Definition: wincrypt.h:6082
LONG_PTR LPARAM
Definition: windef.h:208
LONG_PTR LRESULT
Definition: windef.h:209
UINT_PTR WPARAM
Definition: windef.h:207
#define S_FALSE
Definition: winerror.h:2357
#define DRAGDROP_S_USEDEFAULTCURSORS
Definition: winerror.h:2648
#define DRAGDROP_S_DROP
Definition: winerror.h:2646
#define DRAGDROP_S_CANCEL
Definition: winerror.h:2647
#define E_POINTER
Definition: winerror.h:2365
#define SW_SHOWNORMAL
Definition: winuser.h:781
#define MK_RBUTTON
Definition: winuser.h:2387
HMENU WINAPI CreatePopupMenu(void)
Definition: menu.c:838
#define SW_HIDE
Definition: winuser.h:779
#define GetWindowLongPtrW
Definition: winuser.h:4905
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:2399
HWND WINAPI SetParent(_In_ HWND, _In_opt_ HWND)
#define VK_CONTROL
Definition: winuser.h:2222
BOOL WINAPI GetCursorPos(_Out_ LPPOINT)
Definition: cursoricon.c:3032
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:2220
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:2396
#define TPM_LEFTBUTTON
Definition: winuser.h:2398
#define MAKEINTRESOURCEA(i)
Definition: winuser.h:581
BOOL WINAPI DestroyMenu(_In_ HMENU)
#define MK_LBUTTON
Definition: winuser.h:2386
#define VK_SHIFT
Definition: winuser.h:2221
#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:1628
#define WM_KEYDOWN
Definition: winuser.h:1734
#define DispatchMessage
Definition: winuser.h:5850
#define TPM_RETURNCMD
Definition: winuser.h:2406
BOOL WINAPI KillTimer(_In_opt_ HWND, _In_ UINT_PTR)
#define SetWindowLongPtrW
Definition: winuser.h:5431
BOOL WINAPI DestroyWindow(_In_ HWND)
#define WM_SYSKEYDOWN
Definition: winuser.h:1738
SHORT WINAPI GetKeyState(_In_ int)
#define WM_SETREDRAW
Definition: winuser.h:1635
BOOL WINAPI ScreenToClient(_In_ HWND, _Inout_ LPPOINT)
#define VK_F2
Definition: winuser.h:2275
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
#define IID_PPV_ARG(Itype, ppType)
#define IID_NULL_PPV_ARG(Itype, ppType)
char * LPSTR
Definition: xmlstorage.h:182
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185