ReactOS 0.4.15-dev-7958-gcd0bb1a
CDefView.cpp
Go to the documentation of this file.
1/*
2 * ShellView
3 *
4 * Copyright 1998,1999 <juergen.schmied@debitel.net>
5 * Copyright 2022 Russell Johnson <russell.johnson@superdark.net>
6 *
7 * This is the view visualizing the data provided by the shellfolder.
8 * No direct access to data from pidls should be done from here.
9 *
10 * This library is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public
12 * License as published by the Free Software Foundation; either
13 * version 2.1 of the License, or (at your option) any later version.
14 *
15 * This library is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Lesser General Public License for more details.
19 *
20 * You should have received a copy of the GNU Lesser General Public
21 * License along with this library; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
23 *
24 * FIXME: CheckToolbar: handle the "new folder" and "folder up" button
25 */
26
27/*
28TODO:
29- Load/Save the view state from/into the stream provided by the ShellBrowser.
30- When editing starts on item, set edit text to for editing value.
31- Fix shell view to handle view mode popup exec.
32- The background context menu should have a pidl just like foreground menus. This
33 causes crashes when dynamic handlers try to use the NULL pidl.
34- Reorder of columns doesn't work - might be bug in comctl32
35*/
36
37#include "precomp.h"
38
39#include <atlwin.h>
40#include <ui/rosctrls.h>
41
43
44typedef struct
45{
50
51#define SHV_CHANGE_NOTIFY WM_USER + 0x1111
52
53// For the context menu of the def view, the id of the items are based on 1 because we need
54// to call TrackPopupMenu and let it use the 0 value as an indication that the menu was canceled
55#define CONTEXT_MENU_BASE_ID 1
56
57// Convert client coordinates to listview coordinates
58static void
60{
61 POINT Origin = {};
62
63 // FIXME: LVM_GETORIGIN is broken. See CORE-17266
64 if (!ListView_GetOrigin(hwndLV, &Origin))
65 return;
66
67 ppt->x += Origin.x;
68 ppt->y += Origin.y;
69}
70
71// Helper struct to automatically cleanup the IContextMenu
72// We want to explicitly reset the Site, so there are no circular references
74{
77
79 : m_pCM(pCM), m_hMenu(menu)
80 {
81 }
83 {
84 if (m_hMenu)
85 {
87 m_hMenu = NULL;
88 }
89 if (m_pCM)
90 {
92 m_pCM.Release();
93 }
94 }
95};
96
97class CDefView :
98 public CWindowImpl<CDefView, CWindow, CControlWinTraits>,
99 public CComObjectRootEx<CComMultiThreadModelNoCS>,
100 public IShellView3,
101 public IFolderView,
102 public IShellFolderView,
103 public IOleCommandTarget,
104 public IDropTarget,
105 public IDropSource,
106 public IViewObject,
107 public IServiceProvider
108{
109private:
119 HMENU m_hMenu; // Handle to the menu bar of the browser
120 HMENU m_hMenuArrangeModes; // Handle to the popup menu with the arrange modes
121 HMENU m_hMenuViewModes; // Handle to the popup menu with the view modes
122 HMENU m_hContextMenu; // Handle to the open context menu
129 ULONG m_hNotify; // Change notification handle
130 HACCEL m_hAccel;
134 // for drag and drop
136 CComPtr<IDropTarget> m_pCurDropTarget; // The sub-item, which is currently dragged over
137 CComPtr<IDataObject> m_pCurDataObject; // The dragged data-object
138 LONG m_iDragOverItem; // Dragged over item's index, if m_pCurDropTarget != NULL
139 UINT m_cScrollDelay; // Send a WM_*SCROLL msg every 250 ms during drag-scroll
140 POINT m_ptLastMousePos; // Mouse position at last DragOver call
141 POINT m_ptFirstMousePos; // Mouse position when the drag operation started
143 //
146
149
153
155
157 BOOL _Sort();
164 void _DoCopyToMoveToFolder(BOOL bCopy);
165
166public:
167 CDefView();
168 ~CDefView();
173 void UpdateStatusbar();
174 void CheckToolbar();
176 void UpdateListColors();
177 BOOL InitList();
178 static INT CALLBACK ListViewCompareItems(LPARAM lParam1, LPARAM lParam2, LPARAM lpData);
179
183 int LV_AddItem(PCUITEMID_CHILD pidl);
192 HRESULT FillArrangeAsMenu(HMENU hmenuArrange);
193 HRESULT CheckViewMode(HMENU hmenuView);
196 void OnDeactivate();
197 void DoActivate(UINT uState);
198 HRESULT drag_notify_subitem(DWORD grfKeyState, POINTL pt, DWORD *pdwEffect);
200 LRESULT OnExplorerCommand(UINT uCommand, BOOL bUseSelection);
201
202 // *** IOleWindow methods ***
203 STDMETHOD(GetWindow)(HWND *lphwnd) override;
204 STDMETHOD(ContextSensitiveHelp)(BOOL fEnterMode) override;
205
206 // *** IShellView methods ***
207 STDMETHOD(TranslateAccelerator)(MSG *pmsg) override;
208 STDMETHOD(EnableModeless)(BOOL fEnable) override;
209 STDMETHOD(UIActivate)(UINT uState) override;
210 STDMETHOD(Refresh)() override;
211 STDMETHOD(CreateViewWindow)(IShellView *psvPrevious, LPCFOLDERSETTINGS pfs, IShellBrowser *psb, RECT *prcView, HWND *phWnd) override;
212 STDMETHOD(DestroyViewWindow)() override;
215 STDMETHOD(SaveViewState)() override;
216 STDMETHOD(SelectItem)(PCUITEMID_CHILD pidlItem, SVSIF uFlags) override;
217 STDMETHOD(GetItemObject)(UINT uItem, REFIID riid, void **ppv) override;
218
219 // *** IShellView2 methods ***
220 STDMETHOD(GetView)(SHELLVIEWID *view_guid, ULONG view_type) override;
221 STDMETHOD(CreateViewWindow2)(LPSV2CVW2_PARAMS view_params) override;
222 STDMETHOD(HandleRename)(LPCITEMIDLIST new_pidl) override;
224
225 // *** IShellView3 methods ***
227 IShellBrowser *psb,
228 IShellView *psvPrevious,
229 SV3CVW3_FLAGS view_flags,
233 const SHELLVIEWID *view_id,
234 const RECT *prcView,
235 HWND *hwnd) override;
236
237 // *** IFolderView methods ***
238 STDMETHOD(GetCurrentViewMode)(UINT *pViewMode) override;
239 STDMETHOD(SetCurrentViewMode)(UINT ViewMode) override;
240 STDMETHOD(GetFolder)(REFIID riid, void **ppv) override;
241 STDMETHOD(Item)(int iItemIndex, PITEMID_CHILD *ppidl) override;
242 STDMETHOD(ItemCount)(UINT uFlags, int *pcItems) override;
243 STDMETHOD(Items)(UINT uFlags, REFIID riid, void **ppv) override;
244 STDMETHOD(GetSelectionMarkedItem)(int *piItem) override;
245 STDMETHOD(GetFocusedItem)(int *piItem) override;
246 STDMETHOD(GetItemPosition)(PCUITEMID_CHILD pidl, POINT *ppt) override;
247 STDMETHOD(GetSpacing)(POINT *ppt) override;
248 STDMETHOD(GetDefaultSpacing)(POINT *ppt) override;
249 STDMETHOD(GetAutoArrange)() override;
250 STDMETHOD(SelectItem)(int iItem, DWORD dwFlags) override;
252
253 // *** IShellFolderView methods ***
254 STDMETHOD(Rearrange)(LPARAM sort) override;
256 STDMETHOD(ArrangeGrid)() override;
257 STDMETHOD(AutoArrange)() override;
258 STDMETHOD(AddObject)(PITEMID_CHILD pidl, UINT *item) override;
259 STDMETHOD(GetObject)(PITEMID_CHILD *pidl, UINT item) override;
260 STDMETHOD(RemoveObject)(PITEMID_CHILD pidl, UINT *item) override;
263 STDMETHOD(UpdateObject)(PITEMID_CHILD pidl_old, PITEMID_CHILD pidl_new, UINT *item) override;
265 STDMETHOD(SetRedraw)(BOOL redraw) override;
268 STDMETHOD(IsDropOnSource)(IDropTarget *drop_target) override;
269 STDMETHOD(GetDragPoint)(POINT *pt) override;
270 STDMETHOD(GetDropPoint)(POINT *pt) override;
272 STDMETHOD(SetItemPos)(PCUITEMID_CHILD pidl, POINT *pt) override;
273 STDMETHOD(IsBkDropTarget)(IDropTarget *drop_target) override;
274 STDMETHOD(SetClipboard)(BOOL move) override;
276 STDMETHOD(GetItemSpacing)(ITEMSPACING *spacing) override;
277 STDMETHOD(SetCallback)(IShellFolderViewCB *new_cb, IShellFolderViewCB **old_cb) override;
278 STDMETHOD(Select)(UINT flags) override;
279 STDMETHOD(QuerySupport)(UINT *support) override;
280 STDMETHOD(SetAutomationObject)(IDispatch *disp) override;
281
282 // *** IOleCommandTarget methods ***
283 STDMETHOD(QueryStatus)(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT *pCmdText) override;
284 STDMETHOD(Exec)(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut) override;
285
286 // *** IDropTarget methods ***
287 STDMETHOD(DragEnter)(IDataObject *pDataObj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect) override;
288 STDMETHOD(DragOver)(DWORD grfKeyState, POINTL pt, DWORD *pdwEffect) override;
289 STDMETHOD(DragLeave)() override;
290 STDMETHOD(Drop)(IDataObject *pDataObj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect) override;
291
292 // *** IDropSource methods ***
293 STDMETHOD(QueryContinueDrag)(BOOL fEscapePressed, DWORD grfKeyState) override;
294 STDMETHOD(GiveFeedback)(DWORD dwEffect) override;
295
296 // *** IViewObject methods ***
297 STDMETHOD(Draw)(DWORD dwDrawAspect, LONG lindex, void *pvAspect, DVTARGETDEVICE *ptd,
298 HDC hdcTargetDev, HDC hdcDraw, LPCRECTL lprcBounds, LPCRECTL lprcWBounds,
299 BOOL (STDMETHODCALLTYPE *pfnContinue)(ULONG_PTR dwContinue), ULONG_PTR dwContinue) override;
300 STDMETHOD(GetColorSet)(DWORD dwDrawAspect, LONG lindex, void *pvAspect,
301 DVTARGETDEVICE *ptd, HDC hicTargetDev, LOGPALETTE **ppColorSet) override;
302 STDMETHOD(Freeze)(DWORD dwDrawAspect, LONG lindex, void *pvAspect, DWORD *pdwFreeze) override;
303 STDMETHOD(Unfreeze)(DWORD dwFreeze) override;
304 STDMETHOD(SetAdvise)(DWORD aspects, DWORD advf, IAdviseSink *pAdvSink) override;
305 STDMETHOD(GetAdvise)(DWORD *pAspects, DWORD *pAdvf, IAdviseSink **ppAdvSink) override;
306
307 // *** IServiceProvider methods ***
308 STDMETHOD(QueryService)(REFGUID guidService, REFIID riid, void **ppvObject) override;
309
310 // Message handlers
313 LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
319 LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
321 LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
325 LRESULT OnCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
326 LRESULT OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
331
332 virtual VOID OnFinalMessage(HWND) override;
333
335 {
336 static ATL::CWndClassInfo wc =
337 {
339 0, 0, NULL, NULL,
340 LoadCursor(NULL, IDC_ARROW), NULL, NULL, L"SHELLDLL_DefView", NULL
341 },
342 NULL, NULL, IDC_ARROW, TRUE, 0, _T("")
343 };
344 return wc;
345 }
346
348 {
349 return WindowProc;
350 }
351
353 {
354 CDefView *pThis;
356
357 // Must hold a reference during message handling
358 pThis = reinterpret_cast<CDefView *>(hWnd);
359 pThis->AddRef();
361 pThis->Release();
362 return result;
363 }
364
388
390 // Windows returns E_NOINTERFACE for IOleWindow
391 // COM_INTERFACE_ENTRY_IID(IID_IOleWindow, IOleWindow)
392 COM_INTERFACE_ENTRY_IID(IID_IShellView, IShellView)
394 COM_INTERFACE_ENTRY_IID(IID_IShellView2, IShellView2)
395 COM_INTERFACE_ENTRY_IID(IID_IShellView3, IShellView3)
396 COM_INTERFACE_ENTRY_IID(IID_IFolderView, IFolderView)
397 COM_INTERFACE_ENTRY_IID(IID_IShellFolderView, IShellFolderView)
398 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget, IOleCommandTarget)
399 COM_INTERFACE_ENTRY_IID(IID_IDropTarget, IDropTarget)
400 COM_INTERFACE_ENTRY_IID(IID_IDropSource, IDropSource)
402 COM_INTERFACE_ENTRY_IID(IID_IServiceProvider, IServiceProvider)
404};
405
406// menu items
407#define IDM_VIEW_FILES (FCIDM_SHVIEWFIRST + 0x500)
408#define IDM_VIEW_IDW (FCIDM_SHVIEWFIRST + 0x501)
409#define IDM_MYFILEITEM (FCIDM_SHVIEWFIRST + 0x502)
410
411#define ID_LISTVIEW 1
412
413// windowsx.h
414#define GET_WM_COMMAND_ID(wp, lp) LOWORD(wp)
415#define GET_WM_COMMAND_HWND(wp, lp) (HWND)(lp)
416#define GET_WM_COMMAND_CMD(wp, lp) HIWORD(wp)
417
419
421 m_ListView(),
423 m_hMenu(NULL),
428 m_uState(0),
429 m_cidl(0),
430 m_apidl(NULL),
432 m_hNotify(0),
433 m_hAccel(NULL),
434 m_dwAspects(0),
435 m_dwAdvf(0),
441{
449
451}
452
454{
455 TRACE(" destroying IShellView(%p)\n", this);
456
458
460 {
463 }
464
465 if (m_hWnd)
466 {
468 }
469
471}
472
474{
475 m_pSFParent = shellFolder;
477
478 return S_OK;
479}
480
481// ##### helperfunctions for communication with ICommDlgBrowser #####
482
484{
485 HRESULT ret = S_OK;
486
487 if (m_pCommDlgBrowser.p != NULL)
488 {
489 TRACE("ICommDlgBrowser::IncludeObject pidl=%p\n", pidl);
490 ret = m_pCommDlgBrowser->IncludeObject(this, pidl);
491 TRACE("-- returns 0x%08x\n", ret);
492 }
493
494 return ret;
495}
496
498{
500
501 if (m_pCommDlgBrowser.p != NULL)
502 {
503 TRACE("ICommDlgBrowser::OnDefaultCommand\n");
504 ret = m_pCommDlgBrowser->OnDefaultCommand(this);
505 TRACE("-- returns 0x%08x\n", ret);
506 }
507
508 return ret;
509}
510
512{
514
515 if (m_pCommDlgBrowser.p != NULL)
516 {
517 TRACE("ICommDlgBrowser::OnStateChange flags=%x\n", uFlags);
518 ret = m_pCommDlgBrowser->OnStateChange(this, uFlags);
519 TRACE("--\n");
520 }
521
522 return ret;
523}
524/**********************************************************
525 * set the toolbar of the filedialog buttons
526 *
527 * - activates the buttons from the shellbrowser according to
528 * the view state
529 */
531{
533
534 TRACE("\n");
535
536 if (m_pCommDlgBrowser != NULL)
537 {
538 m_pShellBrowser->SendControlMsg(FCW_TOOLBAR, TB_CHECKBUTTON,
540 m_pShellBrowser->SendControlMsg(FCW_TOOLBAR, TB_CHECKBUTTON,
542 m_pShellBrowser->SendControlMsg(FCW_TOOLBAR, TB_ENABLEBUTTON,
544 m_pShellBrowser->SendControlMsg(FCW_TOOLBAR, TB_ENABLEBUTTON,
546 }
547}
548
550{
551 WCHAR szFormat[MAX_PATH] = {0};
552 WCHAR szPartText[MAX_PATH] = {0};
553 UINT cSelectedItems;
554
555 if (!m_ListView)
556 return;
557
558 cSelectedItems = m_ListView.GetSelectedCount();
559 if (cSelectedItems)
560 {
562 StringCchPrintfW(szPartText, _countof(szPartText), szFormat, cSelectedItems);
563 }
564 else
565 {
566 LoadStringW(shell32_hInstance, IDS_OBJECTS, szFormat, _countof(szFormat));
567 StringCchPrintfW(szPartText, _countof(szPartText), szFormat, m_ListView.GetItemCount());
568 }
569
570 LRESULT lResult;
571 m_pShellBrowser->SendControlMsg(FCW_STATUS, SB_SETTEXT, 0, (LPARAM)szPartText, &lResult);
572
573 // Don't bother with the extra processing if we only have one StatusBar part
575 {
576 DWORD uTotalFileSize = 0;
577 WORD uFileFlags = LVNI_ALL;
578 LPARAM pIcon = NULL;
579 INT nItem = -1;
580 bool bIsOnlyFoldersSelected = true;
581
582 // If we have something selected then only count selected file sizes
583 if (cSelectedItems)
584 {
585 uFileFlags = LVNI_SELECTED;
586 }
587
588 while ((nItem = m_ListView.GetNextItem(nItem, uFileFlags)) >= 0)
589 {
590 PCUITEMID_CHILD pidl = _PidlByItem(nItem);
591
592 uTotalFileSize += _ILGetFileSize(pidl, NULL, 0);
593
594 if (!_ILIsFolder(pidl))
595 {
596 bIsOnlyFoldersSelected = false;
597 }
598 }
599
600 // Don't show the file size text if there is 0 bytes in the folder
601 // OR we only have folders selected
602 if ((cSelectedItems && !bIsOnlyFoldersSelected) || uTotalFileSize)
603 {
604 StrFormatByteSizeW(uTotalFileSize, szPartText, _countof(szPartText));
605 }
606 else
607 {
608 *szPartText = 0;
609 }
610
611 m_pShellBrowser->SendControlMsg(FCW_STATUS, SB_SETTEXT, 1, (LPARAM)szPartText, &lResult);
612
613 // If we are in a Recycle Bin then show no text for the location part
615 {
616 LoadStringW(shell32_hInstance, IDS_MYCOMPUTER, szPartText, _countof(szPartText));
617 pIcon = (LPARAM)m_hMyComputerIcon;
618 }
619
620 m_pShellBrowser->SendControlMsg(FCW_STATUS, SB_SETICON, 2, pIcon, &lResult);
621 m_pShellBrowser->SendControlMsg(FCW_STATUS, SB_SETTEXT, 2, (LPARAM)szPartText, &lResult);
622 }
623}
624
625
626// ##### helperfunctions for initializing the view #####
627
628// creates the list view window
630{
631 HRESULT hr;
632 DWORD dwStyle, dwExStyle, ListExStyle;
633 UINT ViewMode;
634
635 TRACE("%p\n", this);
636
638 LVS_SHAREIMAGELISTS | LVS_EDITLABELS | LVS_AUTOARRANGE; // FIXME: Why is LVS_AUTOARRANGE here?
639 dwExStyle = WS_EX_CLIENTEDGE;
640 ListExStyle = 0;
641
643 {
645 dwStyle |= LVS_ALIGNLEFT;
646 }
647 else
648 {
649 dwStyle |= LVS_SHOWSELALWAYS; // MSDN says FWF_SHOWSELALWAYS is deprecated, always turn on for folders
651 ListExStyle = LVS_EX_DOUBLEBUFFER;
652 }
653
654 ViewMode = m_FolderSettings.ViewMode;
655 hr = _DoFolderViewCB(SFVM_DEFVIEWMODE, 0, (LPARAM)&ViewMode);
656 if (SUCCEEDED(hr))
657 {
658 if (ViewMode >= FVM_FIRST && ViewMode <= FVM_LAST)
659 m_FolderSettings.ViewMode = ViewMode;
660 else
661 ERR("Ignoring invalid ViewMode from SFVM_DEFVIEWMODE: %u (was: %u)\n", ViewMode, m_FolderSettings.ViewMode);
662 }
663
665 {
666 case FVM_ICON:
667 dwStyle |= LVS_ICON;
668 break;
669 case FVM_DETAILS:
670 dwStyle |= LVS_REPORT;
671 break;
672 case FVM_SMALLICON:
673 dwStyle |= LVS_SMALLICON;
674 break;
675 case FVM_LIST:
676 dwStyle |= LVS_LIST;
677 break;
678 default:
679 dwStyle |= LVS_LIST;
680 break;
681 }
682
684 dwStyle |= LVS_AUTOARRANGE;
685
687 ListExStyle |= LVS_EX_SNAPTOGRID;
688
690 dwStyle |= LVS_SINGLESEL;
691
693 ListExStyle |= LVS_EX_FULLROWSELECT;
694
697
699 dwStyle |= LVS_NOCOLUMNHEADER;
700
701#if 0
702 // FIXME: Because this is a negative, everyone gets the new flag by default unless they
703 // opt out. This code should be enabled when shell looks like Vista instead of 2003
705 ListExStyle |= LVS_EX_HEADERINALLVIEWS;
706#endif
707
709 dwExStyle &= ~WS_EX_CLIENTEDGE;
710
711 RECT rcListView = {0,0,0,0};
712 m_ListView.Create(m_hWnd, rcListView, L"FolderView", dwStyle, dwExStyle, ID_LISTVIEW);
713
714 if (!m_ListView)
715 return FALSE;
716
718
722
723 /* UpdateShellSettings(); */
724 return TRUE;
725}
726
728{
730 {
731 /* Check if drop shadows option is enabled */
732 BOOL bDropShadow = FALSE;
733 DWORD cbDropShadow = sizeof(bDropShadow);
734
735 /*
736 * The desktop ListView always take the default desktop colours, by
737 * remaining transparent and letting user32/win32k paint itself the
738 * desktop background color, if any.
739 */
741
742 SHGetValueW(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced",
743 L"ListviewShadow", NULL, &bDropShadow, &cbDropShadow);
744 if (bDropShadow)
745 {
746 /* Set the icon background transparent */
748 m_ListView.SetTextColor(RGB(255, 255, 255));
749 m_ListView.SetExtendedListViewStyle(LVS_EX_TRANSPARENTSHADOWTEXT, LVS_EX_TRANSPARENTSHADOWTEXT);
750 }
751 else
752 {
753 /* Set the icon background as the same colour as the desktop */
755 m_ListView.SetTextBkColor(crDesktop);
756 if (GetRValue(crDesktop) + GetGValue(crDesktop) + GetBValue(crDesktop) > 128 * 3)
757 m_ListView.SetTextColor(RGB(0, 0, 0));
758 else
759 m_ListView.SetTextColor(RGB(255, 255, 255));
760 m_ListView.SetExtendedListViewStyle(0, LVS_EX_TRANSPARENTSHADOWTEXT);
761 }
762 }
763 else
764 {
765 // text background color
767 m_ListView.SetTextBkColor(clrTextBack);
768
769 // text color
770 COLORREF clrText;
772 clrText = m_viewinfo_data.clrText;
773 else
774 clrText = GetSysColor(COLOR_WINDOWTEXT);
775
776 m_ListView.SetTextColor(clrText);
777
778 // Background is painted by the parent via WM_PRINTCLIENT
779 m_ListView.SetExtendedListViewStyle(LVS_EX_TRANSPARENTBKGND, LVS_EX_TRANSPARENTBKGND);
780 }
781}
782
783// adds all needed columns to the shellview
785{
787 WCHAR szTemp[50];
788 HIMAGELIST big_icons, small_icons;
789
790 TRACE("%p\n", this);
791
793
795
796 if (m_pSF2Parent)
797 {
798 for (int i = 0; 1; i++)
799 {
800 if (FAILED(m_pSF2Parent->GetDetailsOf(NULL, i, &sd)))
801 break;
802 StrRetToStrNW( szTemp, 50, &sd.str, NULL);
803 m_ListView.InsertColumn(i, szTemp, sd.fmt, sd.cxChar * 8);
804
805 InsertMenuW(m_hMenuArrangeModes, -1, MF_STRING, 0x30 + i, szTemp);
806 }
807
809 }
810 else
811 {
812 FIXME("no m_pSF2Parent\n");
813 }
814
815 Shell_GetImageLists(&big_icons, &small_icons);
817 m_ListView.SetImageList(small_icons, LVSIL_SMALL);
818
819 return TRUE;
820}
821
822/*************************************************************************
823 * ShellView_ListViewCompareItems
824 *
825 * Compare Function for the Listview (FileOpen Dialog)
826 *
827 * PARAMS
828 * lParam1 [I] the first ItemIdList to compare with
829 * lParam2 [I] the second ItemIdList to compare with
830 * lpData [I] The column ID for the header Ctrl to process
831 *
832 * RETURNS
833 * A negative value if the first item should precede the second,
834 * a positive value if the first item should follow the second,
835 * or zero if the two items are equivalent
836 */
838{
839 PCUIDLIST_RELATIVE pidl1 = reinterpret_cast<PCUIDLIST_RELATIVE>(lParam1);
840 PCUIDLIST_RELATIVE pidl2 = reinterpret_cast<PCUIDLIST_RELATIVE>(lParam2);
841 CDefView *pThis = reinterpret_cast<CDefView*>(lpData);
842
843 HRESULT hres = pThis->m_pSFParent->CompareIDs(pThis->m_sortInfo.nHeaderID, pidl1, pidl2);
845 return 0;
846
847 SHORT nDiff = HRESULT_CODE(hres);
848 if (!pThis->m_sortInfo.bIsAscending)
849 nDiff = -nDiff;
850 return nDiff;
851}
852
854{
855 HWND hHeader;
856 HDITEM hColumn;
857
858 if (m_ListView.GetWindowLongPtr(GWL_STYLE) & LVS_NOSORTHEADER)
859 return TRUE;
860
861 hHeader = (HWND)m_ListView.SendMessage(LVM_GETHEADER, 0, 0);
862 ZeroMemory(&hColumn, sizeof(hColumn));
863
864 // If the sorting column changed, remove sorting style from the old column
865 if ( (m_sortInfo.nLastHeaderID != -1) &&
867 {
868 hColumn.mask = HDI_FORMAT;
869 Header_GetItem(hHeader, m_sortInfo.nLastHeaderID, &hColumn);
870 hColumn.fmt &= ~(HDF_SORTUP | HDF_SORTDOWN);
871 Header_SetItem(hHeader, m_sortInfo.nLastHeaderID, &hColumn);
872 }
873
874 /* Set the sorting style to the new column */
875 hColumn.mask = HDI_FORMAT;
876 Header_GetItem(hHeader, m_sortInfo.nHeaderID, &hColumn);
877
878 hColumn.fmt &= (m_sortInfo.bIsAscending ? ~HDF_SORTDOWN : ~HDF_SORTUP );
879 hColumn.fmt |= (m_sortInfo.bIsAscending ? HDF_SORTUP : HDF_SORTDOWN);
880 Header_SetItem(hHeader, m_sortInfo.nHeaderID, &hColumn);
881
882 /* Sort the list, using the current values of nHeaderID and bIsAscending */
885}
886
888{
889 if (!m_ListView)
890 return nullptr;
891 return reinterpret_cast<PCUITEMID_CHILD>(m_ListView.GetItemData(i));
892}
893
895{
896 if (!m_ListView)
897 return nullptr;
898 return reinterpret_cast<PCUITEMID_CHILD>(lvItem.lParam);
899}
900
902{
904
905 int cItems = m_ListView.GetItemCount();
906
907 for (int i = 0; i<cItems; i++)
908 {
909 PCUITEMID_CHILD currentpidl = _PidlByItem(i);
910 if (ILIsEqual(pidl, currentpidl))
911 return i;
912 }
913 return -1;
914}
915
917{
918 LVITEMW lvItem;
919
920 TRACE("(%p)(pidl=%p)\n", this, pidl);
921
923
925 return -1;
926
927 lvItem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM; // set mask
928 lvItem.iItem = m_ListView.GetItemCount(); // add item to lists end
929 lvItem.iSubItem = 0;
930 lvItem.lParam = reinterpret_cast<LPARAM>(ILClone(pidl)); // set item's data
931 lvItem.pszText = LPSTR_TEXTCALLBACKW; // get text on a callback basis
932 lvItem.iImage = I_IMAGECALLBACK; // get image on a callback basis
933 lvItem.stateMask = LVIS_CUT;
934
935 return m_ListView.InsertItem(&lvItem);
936}
937
939{
940 int nIndex;
941
942 TRACE("(%p)(pidl=%p)\n", this, pidl);
943
945
946 nIndex = LV_FindItemByPidl(pidl);
947 if (nIndex < 0)
948 return FALSE;
949
950 return m_ListView.DeleteItem(nIndex);
951}
952
954{
955 int nItem;
956 LVITEMW lvItem;
957
958 TRACE("(%p)(pidlold=%p pidlnew=%p)\n", this, pidlOld, pidlNew);
959
961
962 nItem = LV_FindItemByPidl(pidlOld);
963
964 if (-1 != nItem)
965 {
966 lvItem.mask = LVIF_PARAM; // only the pidl
967 lvItem.iItem = nItem;
968 lvItem.iSubItem = 0;
969 m_ListView.GetItem(&lvItem);
970
971 // Store old pidl until new item is replaced
972 LPVOID oldPidl = reinterpret_cast<LPVOID>(lvItem.lParam);
973
974 lvItem.mask = LVIF_PARAM | LVIF_IMAGE | LVIF_TEXT;
975 lvItem.iItem = nItem;
976 lvItem.iSubItem = 0;
977 lvItem.lParam = reinterpret_cast<LPARAM>(ILClone(pidlNew)); // set item's data
980 m_ListView.SetItem(&lvItem);
981 m_ListView.Update(nItem);
982
983 // Now that the new item is in place, we can safely release the old pidl
984 SHFree(oldPidl);
985
986 return TRUE; // FIXME: better handling
987 }
988
989 return FALSE;
990}
991
993{
994 int nItem;
995 LVITEMW lvItem;
996
997 TRACE("(%p)(pidl=%p)\n", this, pidl);
998
1000
1001 nItem = LV_FindItemByPidl(pidl);
1002
1003 if (-1 != nItem)
1004 {
1005 lvItem.mask = LVIF_IMAGE;
1006 lvItem.iItem = nItem;
1007 lvItem.iSubItem = 0;
1009 m_ListView.SetItem(&lvItem);
1010 m_ListView.Update(nItem);
1011 return TRUE;
1012 }
1013
1014 return FALSE;
1015}
1016
1018{
1019 PITEMID_CHILD pidl = static_cast<PITEMID_CHILD>(ptr);
1020 CDefView *pThis = static_cast<CDefView *>(arg);
1021
1022 // in a commdlg this works as a filemask
1023 if (pThis->IncludeObject(pidl) == S_OK && pThis->m_ListView)
1024 pThis->LV_AddItem(pidl);
1025
1026 SHFree(pidl);
1027 return TRUE;
1028}
1029
1031// - gets the objectlist from the shellfolder
1032// - sorts the list
1033// - fills the list into the view
1035{
1036 CComPtr<IEnumIDList> pEnumIDList;
1037 PITEMID_CHILD pidl;
1038 DWORD dwFetched;
1039 HRESULT hRes;
1040 HDPA hdpa;
1041 DWORD dFlags = SHCONTF_NONFOLDERS | SHCONTF_FOLDERS;
1042 DWORD dwValue, cbValue;
1043
1044 TRACE("%p\n", this);
1045
1046 // determine if there is a setting to show all the hidden files/folders
1047 dwValue = 1;
1048 cbValue = sizeof(dwValue);
1050 L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced",
1051 L"Hidden", NULL, &dwValue, &cbValue);
1052 if (dwValue == 1)
1053 {
1054 dFlags |= SHCONTF_INCLUDEHIDDEN;
1055 m_ListView.SendMessageW(LVM_SETCALLBACKMASK, LVIS_CUT, 0);
1056 }
1057
1058 dwValue = 0;
1059 cbValue = sizeof(dwValue);
1061 L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced",
1062 L"ShowSuperHidden", NULL, &dwValue, &cbValue);
1063 if (dwValue)
1064 {
1065 dFlags |= SHCONTF_INCLUDESUPERHIDDEN;
1066 m_ListView.SendMessageW(LVM_SETCALLBACKMASK, LVIS_CUT, 0);
1067 }
1068
1069 // get the itemlist from the shfolder
1070 hRes = m_pSFParent->EnumObjects(m_hWnd, dFlags, &pEnumIDList);
1071 if (hRes != S_OK)
1072 {
1073 if (hRes == S_FALSE)
1074 return(NOERROR);
1075 return(hRes);
1076 }
1077
1078 // create a pointer array
1079 hdpa = DPA_Create(16);
1080 if (!hdpa)
1081 return(E_OUTOFMEMORY);
1082
1083 // copy the items into the array
1084 while((S_OK == pEnumIDList->Next(1, &pidl, &dwFetched)) && dwFetched)
1085 {
1086 if (DPA_InsertPtr(hdpa, 0x7fff, pidl) == -1)
1087 {
1088 SHFree(pidl);
1089 }
1090 }
1091
1092 // turn listview's redrawing off
1094
1095 DPA_DestroyCallback( hdpa, fill_list, this);
1096
1097 /* sort the array */
1098 if (m_pSF2Parent)
1099 {
1100 m_pSF2Parent->GetDefaultColumn(NULL, (ULONG*)&m_sortInfo.nHeaderID, NULL);
1101 }
1102 else
1103 {
1104 FIXME("no m_pSF2Parent\n");
1105 }
1107 _Sort();
1108
1110 {
1113 }
1114
1115 // load custom background image and custom text color
1118
1119 // turn listview's redrawing back on and force it to draw
1121
1123
1125 {
1126 // redraw now
1127 m_ListView.InvalidateRect(NULL, TRUE);
1128 }
1129
1131
1132 return S_OK;
1133}
1134
1136{
1137 if (m_ListView.IsWindow())
1138 m_ListView.UpdateWindow();
1139 bHandled = FALSE;
1140 return 0;
1141}
1142
1144{
1145 return m_ListView.SendMessageW(uMsg, 0, 0);
1146}
1147
1149{
1150 if (!m_Destroyed)
1151 {
1152 m_Destroyed = TRUE;
1153 if (m_hMenu)
1154 {
1156 m_hMenu = NULL;
1157 }
1160 m_hNotify = NULL;
1163 }
1164 bHandled = FALSE;
1165 return 0;
1166}
1167
1169{
1170 /* redirect to parent */
1173
1174 bHandled = FALSE;
1175 return 0;
1176}
1177
1178static VOID
1180{
1181 INT x0 = prc->left, y0 = prc->top, x1 = prc->right, y1 = prc->bottom;
1182 x0 += dx;
1183 y0 += dy;
1184
1185 HDC hMemDC = CreateCompatibleDC(hDC);
1186 HGDIOBJ hbmOld = SelectObject(hMemDC, hbm);
1187
1188 for (INT y = y0; y < y1; y += nHeight)
1189 {
1190 for (INT x = x0; x < x1; x += nWidth)
1191 {
1192 BitBlt(hDC, x, y, nWidth, nHeight, hMemDC, 0, 0, SRCCOPY);
1193 }
1194 }
1195
1196 SelectObject(hMemDC, hbmOld);
1197 DeleteDC(hMemDC);
1198}
1199
1201{
1202 HDC hDC = (HDC)wParam;
1203
1204 RECT rc;
1206
1208 {
1209 BITMAP bm;
1210 if (::GetObject(m_viewinfo_data.hbmBack, sizeof(BITMAP), &bm))
1211 {
1212 INT dx = -(::GetScrollPos(m_ListView, SB_HORZ) % bm.bmWidth);
1213 INT dy = -(::GetScrollPos(m_ListView, SB_VERT) % bm.bmHeight);
1214 DrawTileBitmap(hDC, &rc, m_viewinfo_data.hbmBack, bm.bmWidth, bm.bmHeight, dx, dy);
1215 }
1216 }
1217 else
1218 {
1220 }
1221
1222 bHandled = TRUE;
1223
1224 return TRUE;
1225}
1226
1228{
1229 /* Update desktop labels color */
1231
1232 /* Forward WM_SYSCOLORCHANGE to common controls */
1233 return m_ListView.SendMessageW(uMsg, 0, 0);
1234}
1235
1237{
1238 return reinterpret_cast<LRESULT>(m_pShellBrowser.p);
1239}
1240
1242{
1243 this->AddRef();
1244 bHandled = FALSE;
1245 return 0;
1246}
1247
1249{
1250 this->Release();
1251}
1252
1254{
1257
1258 TRACE("%p\n", this);
1259
1261 {
1262 if (FAILED(RegisterDragDrop(m_hWnd, pdt)))
1263 ERR("Error Registering DragDrop\n");
1264 }
1265
1266 /* register for receiving notifications */
1267 m_pSFParent->QueryInterface(IID_PPV_ARG(IPersistFolder2, &ppf2));
1268 if (ppf2)
1269 {
1270 ppf2->GetCurFolder(&m_pidlParent);
1271 }
1272
1273 if (CreateList())
1274 {
1275 if (InitList())
1276 {
1277 FillList();
1278 }
1279 }
1280
1282 {
1283 HWND hwndSB;
1284 m_pShellBrowser->GetWindow(&hwndSB);
1286 }
1287
1288 SHChangeNotifyEntry ntreg[1];
1289 ntreg[0].fRecursive = FALSE;
1290 ntreg[0].pidl = m_pidlParent;
1295 1, ntreg);
1296
1297 //_DoFolderViewCB(SFVM_GETNOTIFY, ?? ??)
1298
1300
1301 BOOL bPreviousParentSpecial = m_isParentFolderSpecial;
1302
1303 // A folder is special if it is the Desktop folder,
1304 // a network folder, or a Control Panel folder
1307
1308 // Only force StatusBar part refresh if the state
1309 // changed from the previous folder
1310 if (bPreviousParentSpecial != m_isParentFolderSpecial)
1311 {
1312 // This handles changing StatusBar parts
1314 }
1315
1317
1318 return S_OK;
1319}
1320
1321// #### Handling of the menus ####
1322
1323extern "C" DWORD WINAPI SHMenuIndexFromID(HMENU hMenu, UINT uID);
1324
1326{
1327 MENUITEMINFOW mii = {sizeof(mii), MIIM_SUBMENU};
1328 if (::GetMenuItemInfoW(hmenu, id, FALSE, &mii))
1329 return mii.hSubMenu;
1330
1331 return NULL;
1332}
1333
1334// ReallyGetMenuItemID returns the id of an item even if it opens a submenu,
1335// GetMenuItemID returns -1 if the specified item opens a submenu
1337{
1338 MENUITEMINFOW mii = {sizeof(mii), MIIM_ID};
1339 if (::GetMenuItemInfoW(hmenu, i, TRUE, &mii))
1340 return mii.wID;
1341
1342 return UINT_MAX;
1343}
1344
1346{
1348 if (!hFileMenu)
1349 return E_FAIL;
1350
1351 /* Cleanup the items added previously */
1352 for (int i = GetMenuItemCount(hFileMenu) - 1; i >= 0; i--)
1353 {
1354 UINT id = GetMenuItemID(hFileMenu, i);
1355 if (id < FCIDM_BROWSERFIRST || id > FCIDM_BROWSERLAST)
1356 DeleteMenu(hFileMenu, i, MF_BYPOSITION);
1357 }
1358
1359 // In case we still have this left over, clean it up
1360 if (m_pFileMenu)
1361 {
1364 }
1365 // Store context menu in m_pFileMenu and keep it to invoke the selected command later on
1368 return hr;
1369
1371
1372 hr = m_pFileMenu->QueryContextMenu(hmenu, 0, FCIDM_SHVIEWFIRST, FCIDM_SHVIEWLAST, 0);
1374 return hr;
1375
1376 // TODO: filter or something
1377
1378 Shell_MergeMenus(hFileMenu, hmenu, 0, 0, 0xFFFF, MM_ADDSEPARATOR | MM_SUBMENUSHAVEIDS);
1379
1381
1382 return S_OK;
1383}
1384
1386{
1388 if (!hEditMenu)
1389 return E_FAIL;
1390
1391 HMENU hmenuContents = ::LoadMenuW(shell32_hInstance, L"MENU_003");
1392 if (!hmenuContents)
1393 return E_FAIL;
1394
1395 Shell_MergeMenus(hEditMenu, hmenuContents, 0, 0, 0xFFFF, 0);
1396
1397 ::DestroyMenu(hmenuContents);
1398
1399 return S_OK;
1400}
1401
1403{
1405 if (!hViewMenu)
1406 return E_FAIL;
1407
1409 if (!m_hMenuViewModes)
1410 return E_FAIL;
1411
1414
1415 return S_OK;
1416}
1417
1419{
1420 /* We only need to fill this once */
1421 if (GetMenuItemID(hmenuArrange, 0) == FCIDM_SHVIEW_AUTOARRANGE)
1422 {
1423 Shell_MergeMenus(hmenuArrange, m_hMenuArrangeModes, 0, 0, 0xFFFF,0);
1424 }
1425
1426 /* Also check the menu item according to which we sort */
1427 CheckMenuRadioItem(hmenuArrange,
1428 0x30,
1429 0x100,
1430 m_sortInfo.nHeaderID + 0x30,
1431 MF_BYCOMMAND);
1432
1434 {
1437 }
1438 else
1439 {
1442
1443 if (GetAutoArrange() == S_OK)
1445 else
1447
1448 if (_GetSnapToGrid() == S_OK)
1450 else
1452 }
1453
1454 return S_OK;
1455}
1456
1458{
1460 {
1461 UINT iItemFirst = FCIDM_SHVIEW_BIGICON;
1462 UINT iItemLast = iItemFirst + FVM_LAST - FVM_FIRST;
1463 UINT iItem = iItemFirst + m_FolderSettings.ViewMode - FVM_FIRST;
1464 CheckMenuRadioItem(hmenuView, iItemFirst, iItemLast, iItem, MF_BYCOMMAND);
1465 }
1466
1467 return S_OK;
1468}
1469
1471// - fills the m_apidl list with the selected objects
1472//
1473// RETURNS
1474// number of selected items
1476{
1477 SHFree(m_apidl);
1478
1480 m_apidl = static_cast<PCUITEMID_CHILD*>(SHAlloc(m_cidl * sizeof(PCUITEMID_CHILD)));
1481 if (!m_apidl)
1482 {
1483 m_cidl = 0;
1484 return 0;
1485 }
1486
1487 TRACE("-- Items selected =%u\n", m_cidl);
1488
1490
1491 UINT i = 0;
1492 int lvIndex = -1;
1493 while ((lvIndex = m_ListView.GetNextItem(lvIndex, LVNI_SELECTED)) > -1)
1494 {
1495 m_apidl[i] = _PidlByItem(lvIndex);
1496 i++;
1497 if (i == m_cidl)
1498 break;
1499 TRACE("-- selected Item found\n");
1500 }
1501
1502 return m_cidl;
1503}
1504
1506{
1507 CMINVOKECOMMANDINFOEX cmi;
1508
1509 ZeroMemory(&cmi, sizeof(cmi));
1510 cmi.cbSize = sizeof(cmi);
1511 cmi.hwnd = m_hWnd;
1512 cmi.lpVerb = lpVerb;
1513
1514 if (GetKeyState(VK_SHIFT) & 0x8000)
1515 cmi.fMask |= CMIC_MASK_SHIFT_DOWN;
1516
1517 if (GetKeyState(VK_CONTROL) & 0x8000)
1518 cmi.fMask |= CMIC_MASK_CONTROL_DOWN;
1519
1520 if (pt)
1521 {
1522 cmi.fMask |= CMIC_MASK_PTINVOKE;
1523 cmi.ptInvoke = *pt;
1524 }
1525
1526 HRESULT hr = pCM->InvokeCommand((LPCMINVOKECOMMANDINFO)&cmi);
1527 // Most of our callers will do this, but if they would forget (File menu!)
1528 IUnknown_SetSite(pCM, NULL);
1529 pCM.Release();
1530
1532 return hr;
1533
1534 return S_OK;
1535}
1536
1538{
1539 HMENU hMenu;
1540 UINT uCommand;
1541 HRESULT hResult;
1542
1544 if (m_cidl == 0)
1545 return S_OK;
1546
1547 hResult = OnDefaultCommand();
1548 if (hResult == S_OK)
1549 return hResult;
1550
1551 hMenu = CreatePopupMenu();
1552 if (!hMenu)
1553 return E_FAIL;
1554
1557 MenuCleanup _(pCM, hMenu);
1558 if (FAILED_UNEXPECTEDLY(hResult))
1559 return hResult;
1560
1561 hResult = pCM->QueryContextMenu(hMenu, 0, FCIDM_SHVIEWFIRST, FCIDM_SHVIEWLAST, CMF_DEFAULTONLY);
1562 if (FAILED_UNEXPECTEDLY(hResult))
1563 return hResult;
1564
1565 uCommand = GetMenuDefaultItem(hMenu, FALSE, 0);
1566 if (uCommand == (UINT)-1)
1567 {
1568 ERR("GetMenuDefaultItem returned -1\n");
1569 return E_FAIL;
1570 }
1571
1573
1574 return hResult;
1575}
1576
1578{
1579 POINT pt;
1580 UINT uCommand;
1581 HRESULT hResult;
1582
1583 TRACE("(%p)\n", this);
1584
1585 if (m_hContextMenu != NULL)
1586 {
1587 ERR("HACK: Aborting context menu in nested call\n");
1588 return 0;
1589 }
1590
1592 if (!m_hContextMenu)
1593 return E_FAIL;
1594
1595 if (lParam != ~0) // unless app key (menu key) was pressed
1596 {
1597 pt.x = GET_X_LPARAM(lParam);
1598 pt.y = GET_Y_LPARAM(lParam);
1599
1600 LV_HITTESTINFO hittest = { pt };
1601 ScreenToClient(&hittest.pt);
1602 m_ListView.HitTest(&hittest);
1603
1604 // Right-Clicked item is selected? If selected, no selection change.
1605 // If not selected, then reset the selection and select the item.
1606 if ((hittest.flags & LVHT_ONITEM) &&
1608 {
1609 SelectItem(hittest.iItem, SVSI_SELECT | SVSI_DESELECTOTHERS | SVSI_ENSUREVISIBLE);
1610 }
1611 }
1612
1614 // In case we still have this left over, clean it up
1617 if (FAILED_UNEXPECTEDLY(hResult))
1618 return 0;
1619
1620 // Use 1 as the first id we want. 0 means that user canceled the menu
1621 hResult = m_pCM->QueryContextMenu(m_hContextMenu, 0, CONTEXT_MENU_BASE_ID, FCIDM_SHVIEWLAST, CMF_NORMAL);
1622 if (FAILED_UNEXPECTEDLY(hResult))
1623 return 0;
1624
1625 // There is no position requested, so try to find one
1626 if (lParam == ~0)
1627 {
1628 HWND hFocus = ::GetFocus();
1629 int lvIndex = -1;
1630
1631 if (hFocus == m_ListView.m_hWnd || m_ListView.IsChild(hFocus))
1632 {
1633 // Is there an item focused and selected?
1635 // If not, find the first selected item
1636 if (lvIndex < 0)
1637 lvIndex = m_ListView.GetNextItem(-1, LVIS_SELECTED);
1638 }
1639
1640 // We got something
1641 if (lvIndex > -1)
1642 {
1643 // Find the center of the icon
1644 RECT rc = { LVIR_ICON };
1645 m_ListView.SendMessage(LVM_GETITEMRECT, lvIndex, (LPARAM)&rc);
1646 pt.x = (rc.right + rc.left) / 2;
1647 pt.y = (rc.bottom + rc.top) / 2;
1648 }
1649 else
1650 {
1651 // We have to drop it somewhere
1652 pt.x = pt.y = 0;
1653 }
1654
1655 m_ListView.ClientToScreen(&pt);
1656 }
1657
1658 // This runs the message loop, calling back to us with f.e. WM_INITPOPUP (hence why m_hContextMenu and m_pCM exist)
1659 uCommand = TrackPopupMenu(m_hContextMenu,
1661 pt.x, pt.y, 0, m_hWnd, NULL);
1662 if (uCommand == 0)
1663 return 0;
1664
1665 if (uCommand == FCIDM_SHVIEW_OPEN && OnDefaultCommand() == S_OK)
1666 return 0;
1667
1669
1670 return 0;
1671}
1672
1674{
1675 HRESULT hResult;
1676 HMENU hMenu = NULL;
1677
1679 hResult = GetItemObject(bUseSelection ? SVGIO_SELECTION : SVGIO_BACKGROUND, IID_PPV_ARG(IContextMenu, &pCM));
1680 if (FAILED_UNEXPECTEDLY(hResult))
1681 return 0;
1682
1683 MenuCleanup _(pCM, hMenu);
1684
1685 if ((uCommand != FCIDM_SHVIEW_DELETE) && (uCommand != FCIDM_SHVIEW_RENAME))
1686 {
1687 hMenu = CreatePopupMenu();
1688 if (!hMenu)
1689 return 0;
1690
1691 hResult = pCM->QueryContextMenu(hMenu, 0, FCIDM_SHVIEWFIRST, FCIDM_SHVIEWLAST, CMF_NORMAL);
1692 if (FAILED_UNEXPECTEDLY(hResult))
1693 return 0;
1694 }
1695
1696 if (bUseSelection)
1697 {
1698 // FIXME: we should cache this
1699 SFGAOF rfg = SFGAO_BROWSABLE | SFGAO_CANCOPY | SFGAO_CANLINK | SFGAO_CANMOVE | SFGAO_CANDELETE | SFGAO_CANRENAME | SFGAO_HASPROPSHEET | SFGAO_FILESYSTEM | SFGAO_FOLDER;
1700 hResult = m_pSFParent->GetAttributesOf(m_cidl, m_apidl, &rfg);
1701 if (FAILED_UNEXPECTEDLY(hResult))
1702 return 0;
1703
1704 if (!(rfg & SFGAO_CANMOVE) && uCommand == FCIDM_SHVIEW_CUT)
1705 return 0;
1706 if (!(rfg & SFGAO_CANCOPY) && uCommand == FCIDM_SHVIEW_COPY)
1707 return 0;
1708 if (!(rfg & SFGAO_CANDELETE) && uCommand == FCIDM_SHVIEW_DELETE)
1709 return 0;
1710 if (!(rfg & SFGAO_CANRENAME) && uCommand == FCIDM_SHVIEW_RENAME)
1711 return 0;
1712 if (!(rfg & SFGAO_HASPROPSHEET) && uCommand == FCIDM_SHVIEW_PROPERTIES)
1713 return 0;
1714 }
1715
1716 // FIXME: We should probably use the objects position?
1718 return 0;
1719}
1720
1721// ##### message handling #####
1722
1724{
1725 WORD wWidth, wHeight;
1726
1727 wWidth = LOWORD(lParam);
1728 wHeight = HIWORD(lParam);
1729
1730 TRACE("%p width=%u height=%u\n", this, wWidth, wHeight);
1731
1732 // WM_SIZE can come before WM_CREATE
1733 if (!m_ListView)
1734 return 0;
1735
1736 /* Resize the ListView to fit our window */
1737 ::MoveWindow(m_ListView, 0, 0, wWidth, wHeight, TRUE);
1738
1740
1743
1744 return 0;
1745}
1746
1747// internal
1749{
1750 TRACE("%p\n", this);
1751
1753 {
1754 // TODO: cleanup menu after deactivation
1756 }
1757}
1758
1760{
1761 TRACE("%p uState=%x\n", this, uState);
1762
1763 // don't do anything if the state isn't really changing
1764 if (m_uState == uState)
1765 {
1766 return;
1767 }
1768
1769 if (uState == SVUIA_DEACTIVATE)
1770 {
1771 OnDeactivate();
1772 }
1773 else
1774 {
1776 {
1777 FillEditMenu();
1778 FillViewMenu();
1779 m_pShellBrowser->SetMenuSB(m_hMenu, 0, m_hWnd);
1781 }
1782
1783 if (SVUIA_ACTIVATE_FOCUS == uState)
1784 {
1785 m_ListView.SetFocus();
1786 }
1787 }
1788
1789 m_uState = uState;
1790 TRACE("--\n");
1791}
1792
1794{
1795 if (!GetSelections())
1796 return;
1797
1798 SFGAOF rfg = SFGAO_CANCOPY | SFGAO_CANMOVE | SFGAO_FILESYSTEM;
1799 HRESULT hr = m_pSFParent->GetAttributesOf(m_cidl, m_apidl, &rfg);
1801 return;
1802
1803 if (!bCopy && !(rfg & SFGAO_CANMOVE))
1804 return;
1805 if (bCopy && !(rfg & SFGAO_CANCOPY))
1806 return;
1807
1809 hr = m_pSFParent->GetUIObjectOf(m_hWnd, m_cidl, m_apidl, IID_IContextMenu, 0, (void **)&pCM);
1811 return;
1812
1813 InvokeContextMenuCommand(pCM, (bCopy ? "copyto" : "moveto"), NULL);
1814}
1815
1817{
1819 return 0;
1820}
1821
1823{
1824 TRACE("%p\n", this);
1825
1826 /* Tell the browser one of our windows has received the focus. This
1827 should always be done before merging menus (OnActivate merges the
1828 menus) if one of our windows has the focus.*/
1829
1830 m_pShellBrowser->OnViewWindowActive(this);
1832
1833 /* Set the focus to the listview */
1834 m_ListView.SetFocus();
1835
1836 /* Notify the ICommDlgBrowser interface */
1837 OnStateChange(CDBOSC_SETFOCUS);
1838
1839 return 0;
1840}
1841
1843{
1844 TRACE("(%p) stub\n", this);
1845
1847 /* Notify the ICommDlgBrowser */
1848 OnStateChange(CDBOSC_KILLFOCUS);
1849
1850 return 0;
1851}
1852
1853// the CmdID's are the ones from the context menu
1855{
1856 DWORD dwCmdID;
1857 DWORD dwCmd;
1858 HWND hwndCmd;
1859 int nCount;
1860
1861 dwCmdID = GET_WM_COMMAND_ID(wParam, lParam);
1863 hwndCmd = GET_WM_COMMAND_HWND(wParam, lParam);
1864
1865 TRACE("(%p)->(0x%08x 0x%08x %p) stub\n", this, dwCmdID, dwCmd, hwndCmd);
1866
1867 switch (dwCmdID)
1868 {
1872 CheckToolbar();
1873 break;
1876 m_ListView.ModifyStyle(LVS_TYPEMASK, LVS_ICON);
1877 CheckToolbar();
1878 break;
1881 m_ListView.ModifyStyle(LVS_TYPEMASK, LVS_LIST);
1882 CheckToolbar();
1883 break;
1886 m_ListView.ModifyStyle(LVS_TYPEMASK, LVS_REPORT);
1887 CheckToolbar();
1888 break;
1889 /* the menu-ID's for sorting are 0x30... see shrec.rc */
1890 case 0x30:
1891 case 0x31:
1892 case 0x32:
1893 case 0x33:
1894 m_sortInfo.nHeaderID = dwCmdID - 0x30;
1896 _Sort();
1897 break;
1900 break;
1902 if (_GetSnapToGrid() == S_OK)
1904 else
1905 ArrangeGrid();
1906 break;
1908 if (GetAutoArrange() == S_OK)
1909 m_ListView.ModifyStyle(LVS_AUTOARRANGE, 0);
1910 else
1911 AutoArrange();
1912 break;
1915 break;
1917 nCount = m_ListView.GetItemCount();
1918 for (int i=0; i < nCount; i++)
1920 break;
1922 Refresh();
1923 break;
1925 case FCIDM_SHVIEW_CUT:
1926 case FCIDM_SHVIEW_COPY:
1930 return 0;
1931 return OnExplorerCommand(dwCmdID, TRUE);
1935 return 0;
1937 case FCIDM_SHVIEW_UNDO:
1940 return OnExplorerCommand(dwCmdID, FALSE);
1941 default:
1942 // WM_COMMAND messages from file menu are routed to CDefView to let m_pFileMenu handle them
1943 if (m_pFileMenu && dwCmd == 0)
1944 {
1945 HMENU Dummy = NULL;
1946 MenuCleanup _(m_pFileMenu, Dummy);
1948 }
1949 }
1950
1951 return 0;
1952}
1953
1954static BOOL
1956{
1957 HKEY hKey;
1958 LONG error;
1959 DWORD dwValue = FALSE, cbValue;
1960
1962 L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer",
1963 0, KEY_READ, &hKey);
1964 if (error)
1965 return dwValue;
1966
1967 cbValue = sizeof(dwValue);
1968 RegQueryValueExW(hKey, L"SelectExtOnRename", NULL, NULL, (LPBYTE)&dwValue, &cbValue);
1969
1971 return !!dwValue;
1972}
1973
1975{
1976 UINT CtlID;
1977 LPNMHDR lpnmh;
1978 LPNMLISTVIEW lpnmlv;
1979 NMLVDISPINFOW *lpdi;
1980 PCUITEMID_CHILD pidl;
1981 BOOL unused;
1982
1983 CtlID = wParam;
1984 lpnmh = (LPNMHDR)lParam;
1985 lpnmlv = (LPNMLISTVIEW)lpnmh;
1986 lpdi = (NMLVDISPINFOW *)lpnmh;
1987
1988 TRACE("%p CtlID=%u lpnmh->code=%x\n", this, CtlID, lpnmh->code);
1989
1990 switch (lpnmh->code)
1991 {
1992 case NM_SETFOCUS:
1993 TRACE("-- NM_SETFOCUS %p\n", this);
1994 OnSetFocus(0, 0, 0, unused);
1995 break;
1996 case NM_KILLFOCUS:
1997 TRACE("-- NM_KILLFOCUS %p\n", this);
1998 OnDeactivate();
1999 /* Notify the ICommDlgBrowser interface */
2000 OnStateChange(CDBOSC_KILLFOCUS);
2001 break;
2002 case NM_CUSTOMDRAW:
2003 TRACE("-- NM_CUSTOMDRAW %p\n", this);
2004 return CDRF_DODEFAULT;
2005 case NM_RELEASEDCAPTURE:
2006 TRACE("-- NM_RELEASEDCAPTURE %p\n", this);
2007 break;
2008 case NM_CLICK:
2009 TRACE("-- NM_CLICK %p\n", this);
2010 break;
2011 case NM_RCLICK:
2012 TRACE("-- NM_RCLICK %p\n", this);
2013 break;
2014 case NM_DBLCLK:
2015 TRACE("-- NM_DBLCLK %p\n", this);
2017 break;
2018 case NM_RETURN:
2019 TRACE("-- NM_RETURN %p\n", this);
2021 break;
2022 case HDN_ENDTRACKW:
2023 TRACE("-- HDN_ENDTRACKW %p\n", this);
2024 //nColumn1 = m_ListView.GetColumnWidth(0);
2025 //nColumn2 = m_ListView.GetColumnWidth(1);
2026 break;
2027 case LVN_DELETEITEM:
2028 TRACE("-- LVN_DELETEITEM %p\n", this);
2029 /*delete the pidl because we made a copy of it*/
2030 SHFree(reinterpret_cast<LPVOID>(lpnmlv->lParam));
2031 break;
2032 case LVN_DELETEALLITEMS:
2033 TRACE("-- LVN_DELETEALLITEMS %p\n", this);
2034 return FALSE;
2035 case LVN_INSERTITEM:
2036 TRACE("-- LVN_INSERTITEM (STUB)%p\n", this);
2037 break;
2038 case LVN_ITEMACTIVATE:
2039 TRACE("-- LVN_ITEMACTIVATE %p\n", this);
2040 OnStateChange(CDBOSC_SELCHANGE); // browser will get the IDataObject
2041 break;
2042 case LVN_COLUMNCLICK:
2043 m_sortInfo.nHeaderID = lpnmlv->iSubItem;
2046 else
2048 _Sort();
2049 break;
2050 case LVN_GETDISPINFOA:
2051 case LVN_GETDISPINFOW:
2052 TRACE("-- LVN_GETDISPINFO %p\n", this);
2053 pidl = _PidlByItem(lpdi->item);
2054
2055 if (lpdi->item.mask & LVIF_TEXT) /* text requested */
2056 {
2057 if (m_pSF2Parent)
2058 {
2060 if (FAILED_UNEXPECTEDLY(m_pSF2Parent->GetDetailsOf(pidl, lpdi->item.iSubItem, &sd)))
2061 break;
2062
2063 if (lpnmh->code == LVN_GETDISPINFOA)
2064 {
2065 /* shouldn't happen */
2066 NMLVDISPINFOA *lpdiA = (NMLVDISPINFOA *)lpnmh;
2067 StrRetToStrNA( lpdiA->item.pszText, lpdiA->item.cchTextMax, &sd.str, NULL);
2068 TRACE("-- text=%s\n", lpdiA->item.pszText);
2069 }
2070 else /* LVN_GETDISPINFOW */
2071 {
2072 StrRetToStrNW( lpdi->item.pszText, lpdi->item.cchTextMax, &sd.str, NULL);
2073 TRACE("-- text=%s\n", debugstr_w(lpdi->item.pszText));
2074 }
2075 }
2076 else
2077 {
2078 FIXME("no m_pSF2Parent\n");
2079 }
2080 }
2081 if(lpdi->item.mask & LVIF_IMAGE) /* image requested */
2082 {
2084 }
2085 if(lpdi->item.mask & LVIF_STATE)
2086 {
2087 ULONG attributes = SFGAO_HIDDEN;
2088 if (SUCCEEDED(m_pSFParent->GetAttributesOf(1, &pidl, &attributes)))
2089 {
2090 if (attributes & SFGAO_HIDDEN)
2091 lpdi->item.state |= LVIS_CUT;
2092 }
2093 }
2094 lpdi->item.mask |= LVIF_DI_SETITEM;
2095 break;
2096 case LVN_ITEMCHANGED:
2097 TRACE("-- LVN_ITEMCHANGED %p\n", this);
2098 OnStateChange(CDBOSC_SELCHANGE); // browser will get the IDataObject
2100 _DoFolderViewCB(SFVM_SELECTIONCHANGED, NULL/* FIXME */, NULL/* FIXME */);
2101 break;
2102 case LVN_BEGINDRAG:
2103 case LVN_BEGINRDRAG:
2104 TRACE("-- LVN_BEGINDRAG\n");
2105 if (GetSelections())
2106 {
2108 DWORD dwAttributes = SFGAO_CANCOPY | SFGAO_CANLINK;
2109 DWORD dwEffect = DROPEFFECT_MOVE;
2110
2111 if (SUCCEEDED(m_pSFParent->GetUIObjectOf(m_hWnd, m_cidl, m_apidl, IID_NULL_PPV_ARG(IDataObject, &pda))))
2112 {
2114
2115 if (SUCCEEDED(m_pSFParent->GetAttributesOf(m_cidl, m_apidl, &dwAttributes)))
2116 dwEffect |= dwAttributes & (SFGAO_CANCOPY | SFGAO_CANLINK);
2117
2119 if (SUCCEEDED(pda->QueryInterface(IID_PPV_ARG(IAsyncOperation, &piaso))))
2120 piaso->SetAsyncMode(TRUE);
2121
2122 DWORD dwEffect2;
2123
2124 m_pSourceDataObject = pda;
2125 m_ptFirstMousePos = params->ptAction;
2128
2129 HIMAGELIST big_icons, small_icons;
2130 Shell_GetImageLists(&big_icons, &small_icons);
2131 PCUITEMID_CHILD pidl = _PidlByItem(params->iItem);
2132 int iIcon = SHMapPIDLToSystemImageListIndex(m_pSFParent, pidl, 0);
2133 POINT ptItem;
2134 m_ListView.GetItemPosition(params->iItem, &ptItem);
2135
2136 ImageList_BeginDrag(big_icons, iIcon, params->ptAction.x - ptItem.x, params->ptAction.y - ptItem.y);
2137 DoDragDrop(pda, this, dwEffect, &dwEffect2);
2139 }
2140 }
2141 break;
2143 {
2144 DWORD dwAttr = SFGAO_CANRENAME;
2145 pidl = _PidlByItem(lpdi->item);
2146
2147 TRACE("-- LVN_BEGINLABELEDITW %p\n", this);
2148
2149 m_pSFParent->GetAttributesOf(1, &pidl, &dwAttr);
2150 if (SFGAO_CANRENAME & dwAttr)
2151 {
2152 HWND hEdit = reinterpret_cast<HWND>(m_ListView.SendMessage(LVM_GETEDITCONTROL));
2154
2155 // smartass-renaming: See CORE-15242
2156 if (!(dwAttr & SFGAO_FOLDER) && (dwAttr & SFGAO_FILESYSTEM) &&
2157 (lpdi->item.mask & LVIF_TEXT) && !SelectExtOnRename())
2158 {
2159 WCHAR szFullPath[MAX_PATH];
2160 PIDLIST_ABSOLUTE pidlFull = ILCombine(m_pidlParent, pidl);
2161 SHGetPathFromIDListW(pidlFull, szFullPath);
2162
2163 if (!SHELL_FS_HideExtension(szFullPath))
2164 {
2165 LPWSTR pszText = lpdi->item.pszText;
2166 LPWSTR pchDotExt = PathFindExtensionW(pszText);
2167 ::PostMessageW(hEdit, EM_SETSEL, 0, pchDotExt - pszText);
2169 }
2170
2171 ILFree(pidlFull);
2172 }
2173
2174 m_isEditing = TRUE;
2175 return FALSE;
2176 }
2177 return TRUE;
2178 }
2179 case LVN_ENDLABELEDITW:
2180 {
2181 TRACE("-- LVN_ENDLABELEDITW %p\n", this);
2183
2184 if (lpdi->item.pszText)
2185 {
2186 HRESULT hr;
2187 LVITEMW lvItem;
2188
2189 pidl = _PidlByItem(lpdi->item);
2190 PITEMID_CHILD pidlNew = NULL;
2191 hr = m_pSFParent->SetNameOf(0, pidl, lpdi->item.pszText, SHGDN_INFOLDER, &pidlNew);
2192
2193 if (SUCCEEDED(hr) && pidlNew)
2194 {
2195 lvItem.mask = LVIF_PARAM|LVIF_IMAGE;
2196 lvItem.iItem = lpdi->item.iItem;
2197 lvItem.iSubItem = 0;
2198 lvItem.lParam = reinterpret_cast<LPARAM>(pidlNew);
2200 m_ListView.SetItem(&lvItem);
2201 m_ListView.Update(lpdi->item.iItem);
2202 return TRUE;
2203 }
2204 }
2205
2206 return FALSE;
2207 }
2208 default:
2209 TRACE("-- %p WM_COMMAND %x unhandled\n", this, lpnmh->code);
2210 break;
2211 }
2212
2213 return 0;
2214}
2215
2216// This is just a quick hack to make the desktop work correctly.
2217// ITranslateShellChangeNotify's IsChildID is undocumented, but most likely the
2218// way that a folder should know if it should update upon a change notification.
2219// It is exported by merged folders at a minimum.
2221{
2222 if (!pidl1 || !pidl2)
2223 return FALSE;
2224 if (ILIsParent(pidl1, pidl2, TRUE))
2225 return TRUE;
2226
2227 if (_ILIsDesktop(pidl1))
2228 {
2229 PIDLIST_ABSOLUTE deskpidl;
2231 if (ILIsParent(deskpidl, pidl2, TRUE))
2232 {
2233 ILFree(deskpidl);
2234 return TRUE;
2235 }
2236 ILFree(deskpidl);
2238 if (ILIsParent(deskpidl, pidl2, TRUE))
2239 {
2240 ILFree(deskpidl);
2241 return TRUE;
2242 }
2243 ILFree(deskpidl);
2244 }
2245
2246 WCHAR szPath1[MAX_PATH], szPath2[MAX_PATH];
2247 LPITEMIDLIST pidl2Clone = ILClone(pidl2);
2248 ILRemoveLastID(pidl2Clone);
2249 if (SHGetPathFromIDListW(pidl1, szPath1) &&
2250 SHGetPathFromIDListW(pidl2Clone, szPath2))
2251 {
2252 if (lstrcmpiW(szPath1, szPath2) == 0)
2253 {
2254 ILFree(pidl2Clone);
2255 return TRUE;
2256 }
2257 }
2258 ILFree(pidl2Clone);
2259
2260 return FALSE;
2261}
2262
2264{
2265 // The change notify can come before WM_CREATE
2266 if (!m_ListView)
2267 return FALSE;
2268
2269 HANDLE hChange = (HANDLE)wParam;
2270 DWORD dwProcID = (DWORD)lParam;
2271 PIDLIST_ABSOLUTE *Pidls;
2272 LONG lEvent;
2273 HANDLE hLock = SHChangeNotification_Lock(hChange, dwProcID, &Pidls, &lEvent);
2274 if (hLock == NULL)
2275 {
2276 ERR("hLock == NULL\n");
2277 return FALSE;
2278 }
2279
2280 BOOL bParent0 = ILIsParentOrSpecialParent(m_pidlParent, Pidls[0]);
2281 BOOL bParent1 = ILIsParentOrSpecialParent(m_pidlParent, Pidls[1]);
2282
2283 TRACE("(%p)(%p,%p,0x%08x)\n", this, Pidls[0], Pidls[1], lParam);
2284
2285 lEvent &= ~SHCNE_INTERRUPT;
2286 switch (lEvent)
2287 {
2288 case SHCNE_MKDIR:
2289 case SHCNE_CREATE:
2290 case SHCNE_DRIVEADD:
2291 if (bParent0)
2292 {
2293 if (LV_FindItemByPidl(ILFindLastID(Pidls[0])) == -1)
2294 LV_AddItem(ILFindLastID(Pidls[0]));
2295 else
2296 LV_ProdItem(ILFindLastID(Pidls[0]));
2297 }
2298 break;
2299 case SHCNE_RMDIR:
2300 case SHCNE_DELETE:
2301 case SHCNE_DRIVEREMOVED:
2302 if (bParent0)
2303 LV_DeleteItem(ILFindLastID(Pidls[0]));
2304 break;
2305 case SHCNE_RENAMEFOLDER:
2306 case SHCNE_RENAMEITEM:
2307 if (bParent0 && bParent1)
2308 LV_RenameItem(ILFindLastID(Pidls[0]), ILFindLastID(Pidls[1]));
2309 else if (bParent0)
2310 LV_DeleteItem(ILFindLastID(Pidls[0]));
2311 else if (bParent1)
2312 LV_AddItem(ILFindLastID(Pidls[1]));
2313 break;
2314 case SHCNE_UPDATEITEM:
2315 if (bParent0)
2316 LV_RenameItem(ILFindLastID(Pidls[0]), ILFindLastID(Pidls[0]));
2317 break;
2318 case SHCNE_UPDATEDIR:
2319 Refresh();
2320 break;
2321 }
2322
2324 return TRUE;
2325}
2326
2329
2331{
2332 if (!m_pCM)
2333 {
2334 /* no menu */
2335 ERR("no context menu\n");
2336 return FALSE;
2337 }
2338
2339 // lParam of WM_DRAWITEM WM_MEASUREITEM contains a menu id and
2340 // this also needs to be changed to a menu identifier offset
2341 UINT CmdID;
2342 HRESULT hres = SHGetMenuIdFromMenuMsg(uMsg, lParam, &CmdID);
2343 if (SUCCEEDED(hres))
2345
2346 /* Forward the message to the IContextMenu2 */
2349
2350 return (SUCCEEDED(hres));
2351}
2352
2354{
2355 /* Wallpaper setting affects drop shadows effect */
2356 if (wParam == SPI_SETDESKWALLPAPER || wParam == 0)
2358
2359 return S_OK;
2360}
2361
2363{
2364 HMENU hmenu = (HMENU) wParam;
2365 int nPos = LOWORD(lParam);
2366 UINT menuItemId;
2367
2368 if (m_pCM)
2369 OnCustomItem(uMsg, wParam, lParam, bHandled);
2370
2372
2373 if (GetSelections() == 0)
2374 {
2381 }
2382 else
2383 {
2384 // FIXME: Check copyable
2391 }
2392
2393 /* Lets try to find out what the hell wParam is */
2394 if (hmenu == GetSubMenu(m_hMenu, nPos))
2395 menuItemId = ReallyGetMenuItemID(m_hMenu, nPos);
2396 else if (hViewMenu && hmenu == GetSubMenu(hViewMenu, nPos))
2397 menuItemId = ReallyGetMenuItemID(hViewMenu, nPos);
2398 else if (m_hContextMenu && hmenu == GetSubMenu(m_hContextMenu, nPos))
2399 menuItemId = ReallyGetMenuItemID(m_hContextMenu, nPos);
2400 else
2401 return FALSE;
2402
2403 switch (menuItemId)
2404 {
2405 case FCIDM_MENU_FILE:
2406 FillFileMenu();
2407 break;
2408 case FCIDM_MENU_VIEW:
2409 case FCIDM_SHVIEW_VIEW:
2411 break;
2414 break;
2415 }
2416
2417 return FALSE;
2418}
2419
2420
2421// The INTERFACE of the IShellView object
2422
2424{
2425 TRACE("(%p)\n", this);
2426
2427 *phWnd = m_hWnd;
2428
2429 return S_OK;
2430}
2431
2433{
2434 FIXME("(%p) stub\n", this);
2435
2436 return E_NOTIMPL;
2437}
2438
2439// FIXME: use the accel functions
2441{
2442 if (m_isEditing)
2443 return S_FALSE;
2444
2445 if (lpmsg->message >= WM_KEYFIRST && lpmsg->message <= WM_KEYLAST)
2446 {
2447 if (::TranslateAcceleratorW(m_hWnd, m_hAccel, lpmsg) != 0)
2448 return S_OK;
2449
2450 TRACE("-- key=0x%04lx\n", lpmsg->wParam);
2451 }
2452
2453 return m_pShellBrowser->TranslateAcceleratorSB(lpmsg, 0);
2454}
2455
2457{
2458 FIXME("(%p)\n", this);
2459 return E_NOTIMPL;
2460}
2461
2463{
2464 TRACE("(%p)->(state=%x)\n", this, uState);
2465
2466 // don't do anything if the state isn't changing
2467 if (m_uState == uState)
2468 return S_OK;
2469
2470 // OnActivate handles the menu merging and internal state
2471 DoActivate(uState);
2472
2473 // only do this if we are active
2474 if (uState != SVUIA_DEACTIVATE)
2475 {
2477
2478 // Set the text for the status bar
2480 }
2481
2482 return S_OK;
2483}
2484
2486{
2487 TRACE("(%p)\n", this);
2488
2490
2492 FillList();
2493
2494 return S_OK;
2495}
2496
2498{
2499 return CreateViewWindow3(psb, lpPrevView, SV3CVW3_DEFAULT,
2500 (FOLDERFLAGS)lpfs->fFlags, (FOLDERFLAGS)lpfs->fFlags, (FOLDERVIEWMODE)lpfs->ViewMode, NULL, prcView, phWnd);
2501}
2502
2504{
2505 TRACE("(%p)\n", this);
2506
2507 /* Make absolutely sure all our UI is cleaned up */
2509
2510 if (m_hAccel)
2511 {
2512 // MSDN: Accelerator tables loaded from resources are freed automatically when application terminates
2513 m_hAccel = NULL;
2514 }
2515
2517 {
2520 }
2521
2522 if (m_hMenuViewModes)
2523 {
2526 }
2527
2528 if (m_hMenu)
2529 {
2531 m_hMenu = NULL;
2532 }
2533
2534 if (m_ListView)
2535 {
2536 m_ListView.DestroyWindow();
2537 }
2538
2539 if (m_hWnd)
2540 {
2542 DestroyWindow();
2543 }
2544
2547
2548 return S_OK;
2549}
2550
2552{
2553 TRACE("(%p)->(%p) vmode=%x flags=%x\n", this, lpfs,
2555
2556 if (!lpfs)
2557 return E_INVALIDARG;
2558
2559 *lpfs = m_FolderSettings;
2560 return S_OK;
2561}
2562
2564{
2565 FIXME("(%p) stub\n", this);
2566
2567 return E_NOTIMPL;
2568}
2569
2571{
2572 FIXME("(%p) stub\n", this);
2573
2574 return S_OK;
2575}
2576
2578{
2579 int i;
2580
2581 TRACE("(%p)->(pidl=%p, 0x%08x) stub\n", this, pidl, uFlags);
2582
2583 if (!m_ListView)
2584 {
2585 ERR("!m_ListView\n");
2586 return E_FAIL;
2587 }
2588
2589 i = LV_FindItemByPidl(pidl);
2590 if (i == -1)
2591 return S_OK;
2592
2593 LVITEMW lvItem = {0};
2594 lvItem.mask = LVIF_STATE;
2596
2597 while (m_ListView.GetItem(&lvItem))
2598 {
2599 if (lvItem.iItem == i)
2600 {
2601 if (uFlags & SVSI_SELECT)
2602 lvItem.state |= LVIS_SELECTED;
2603 else
2604 lvItem.state &= ~LVIS_SELECTED;
2605
2606 if (uFlags & SVSI_FOCUSED)
2607 lvItem.state |= LVIS_FOCUSED;
2608 else
2609 lvItem.state &= ~LVIS_FOCUSED;
2610 }
2611 else
2612 {
2613 if (uFlags & SVSI_DESELECTOTHERS)
2614 {
2615 lvItem.state &= ~LVIS_SELECTED;
2616 }
2617 lvItem.state &= ~LVIS_FOCUSED;
2618 }
2619
2620 m_ListView.SetItem(&lvItem);
2621 lvItem.iItem++;
2622 }
2623
2624 if (uFlags & SVSI_ENSUREVISIBLE)
2626
2627 if((uFlags & SVSI_EDIT) == SVSI_EDIT)
2629
2630 return S_OK;
2631}
2632
2634{
2636
2637 TRACE("(%p)->(uItem=0x%08x,\n\tIID=%s, ppv=%p)\n", this, uItem, debugstr_guid(&riid), ppvOut);
2638
2639 if (!ppvOut)
2640 return E_INVALIDARG;
2641
2642 *ppvOut = NULL;
2643
2644 switch (uItem)
2645 {
2646 case SVGIO_BACKGROUND:
2647 if (IsEqualIID(riid, IID_IContextMenu))
2648 {
2651 return hr;
2652
2653 IUnknown_SetSite(*((IUnknown**)ppvOut), (IShellView *)this);
2654 }
2655 else if (IsEqualIID(riid, IID_IDispatch))
2656 {
2658 {
2661 return hr;
2662 }
2663 hr = m_pShellFolderViewDual->QueryInterface(riid, ppvOut);
2664 }
2665 break;
2666 case SVGIO_SELECTION:
2667 GetSelections();
2668 hr = m_pSFParent->GetUIObjectOf(m_hWnd, m_cidl, m_apidl, riid, 0, ppvOut);
2670 return hr;
2671
2672 if (IsEqualIID(riid, IID_IContextMenu))
2673 IUnknown_SetSite(*((IUnknown**)ppvOut), (IShellView *)this);
2674
2675 break;
2676 }
2677
2678 TRACE("-- (%p)->(interface=%p)\n", this, *ppvOut);
2679
2680 return hr;
2681}
2682
2684{
2685 TRACE("(%p)->(%p), stub\n", this, pViewMode);
2686
2687 if (!pViewMode)
2688 return E_INVALIDARG;
2689
2690 *pViewMode = m_FolderSettings.ViewMode;
2691 return S_OK;
2692}
2693
2695{
2696 DWORD dwStyle;
2697 TRACE("(%p)->(%u), stub\n", this, ViewMode);
2698
2699 /* It's not redundant to check FVM_AUTO because it's a (UINT)-1 */
2700 if (((INT)ViewMode < FVM_FIRST || (INT)ViewMode > FVM_LAST) && ((INT)ViewMode != FVM_AUTO))
2701 return E_INVALIDARG;
2702
2703 /* Windows before Vista uses LVM_SETVIEW and possibly
2704 LVM_SETEXTENDEDLISTVIEWSTYLE to set the style of the listview,
2705 while later versions seem to accomplish this through other
2706 means. */
2707 switch (ViewMode)
2708 {
2709 case FVM_ICON:
2710 dwStyle = LVS_ICON;
2711 break;
2712 case FVM_DETAILS:
2713 dwStyle = LVS_REPORT;
2714 break;
2715 case FVM_SMALLICON:
2716 dwStyle = LVS_SMALLICON;
2717 break;
2718 case FVM_LIST:
2719 dwStyle = LVS_LIST;
2720 break;
2721 default:
2722 {
2723 FIXME("ViewMode %d not implemented\n", ViewMode);
2724 dwStyle = LVS_LIST;
2725 break;
2726 }
2727 }
2728
2729 m_ListView.ModifyStyle(LVS_TYPEMASK, dwStyle);
2730
2731 /* This will not necessarily be the actual mode set above.
2732 This mimics the behavior of Windows XP. */
2733 m_FolderSettings.ViewMode = ViewMode;
2734
2735 return S_OK;
2736}
2737
2739{
2740 if (m_pSFParent == NULL)
2741 return E_FAIL;
2742
2743 return m_pSFParent->QueryInterface(riid, ppv);
2744}
2745
2747{
2748 PCUITEMID_CHILD pidl = _PidlByItem(iItemIndex);
2749 if (pidl)
2750 {
2751 *ppidl = ILClone(pidl);
2752 return S_OK;
2753 }
2754
2755 *ppidl = 0;
2756 return E_INVALIDARG;
2757}
2758
2760{
2761 TRACE("(%p)->(%u %p)\n", this, uFlags, pcItems);
2762
2763 if (uFlags != SVGIO_ALLVIEW)
2764 FIXME("some flags unsupported, %x\n", uFlags & ~SVGIO_ALLVIEW);
2765
2767
2768 return S_OK;
2769}
2770
2772{
2773 return E_NOTIMPL;
2774}
2775
2777{
2778 TRACE("(%p)->(%p)\n", this, piItem);
2779
2780 *piItem = m_ListView.GetSelectionMark();
2781
2782 return S_OK;
2783}
2784
2786{
2787 TRACE("(%p)->(%p)\n", this, piItem);
2788
2789 *piItem = m_ListView.GetNextItem(-1, LVNI_FOCUSED);
2790
2791 return S_OK;
2792}
2793
2795{
2796 if (!m_ListView)
2797 {
2798 ERR("!m_ListView\n");
2799 return E_FAIL;
2800 }
2801
2802 int lvIndex = LV_FindItemByPidl(pidl);
2803 if (lvIndex == -1 || ppt == NULL)
2804 return E_INVALIDARG;
2805
2806 m_ListView.GetItemPosition(lvIndex, ppt);
2807 return S_OK;
2808}
2809
2811{
2812 TRACE("(%p)->(%p)\n", this, ppt);
2813
2814 if (!m_ListView)
2815 {
2816 ERR("!m_ListView\n");
2817 return S_FALSE;
2818 }
2819
2820 if (ppt)
2821 {
2822 SIZE spacing;
2823 m_ListView.GetItemSpacing(spacing);
2824
2825 ppt->x = spacing.cx;
2826 ppt->y = spacing.cy;
2827 }
2828
2829 return S_OK;
2830}
2831
2833{
2834 return E_NOTIMPL;
2835}
2836
2838{
2839 return ((m_ListView.GetStyle() & LVS_AUTOARRANGE) ? S_OK : S_FALSE);
2840}
2841
2843{
2844 DWORD dwExStyle = (DWORD)m_ListView.SendMessage(LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0);
2845 return ((dwExStyle & LVS_EX_SNAPTOGRID) ? S_OK : S_FALSE);
2846}
2847
2849{
2850 LVITEMW lvItem;
2851
2852 TRACE("(%p)->(%d, %x)\n", this, iItem, dwFlags);
2853
2854 lvItem.state = 0;
2855 lvItem.stateMask = LVIS_SELECTED;
2856
2857 if (dwFlags & SVSI_ENSUREVISIBLE)
2858 m_ListView.EnsureVisible(iItem, 0);
2859
2860 /* all items */
2861 if (dwFlags & SVSI_DESELECTOTHERS)
2863
2864 /* this item */
2865 if (dwFlags & SVSI_SELECT)
2866 lvItem.state |= LVIS_SELECTED;
2867
2868 if (dwFlags & SVSI_FOCUSED)
2869 lvItem.stateMask |= LVIS_FOCUSED;
2870
2871 m_ListView.SetItemState(iItem, lvItem.state, lvItem.stateMask);
2872
2873 if ((dwFlags & SVSI_EDIT) == SVSI_EDIT)
2874 m_ListView.EditLabel(iItem);
2875
2876 return S_OK;
2877}
2878
2880{
2882
2883 /* Reset the selection */
2885
2886 int lvIndex;
2887 for (UINT i = 0 ; i < m_cidl; i++)
2888 {
2889 lvIndex = LV_FindItemByPidl(apidl[i]);
2890 if (lvIndex != -1)
2891 {
2892 SelectItem(lvIndex, dwFlags);
2893 m_ListView.SetItemPosition(lvIndex, &apt[i]);
2894 }
2895 }
2896
2897 return S_OK;
2898}
2899
2900
2901// IShellView2 implementation
2902
2904{
2905 FIXME("(%p)->(%p, %lu) stub\n", this, view_guid, view_type);
2906 return E_NOTIMPL;
2907}
2908
2910{
2911 return CreateViewWindow3(view_params->psbOwner, view_params->psvPrev,
2912 SV3CVW3_DEFAULT, (FOLDERFLAGS)view_params->pfs->fFlags, (FOLDERFLAGS)view_params->pfs->fFlags,
2913 (FOLDERVIEWMODE)view_params->pfs->ViewMode, view_params->pvid, view_params->prcView, &view_params->hwndView);
2914}
2915
2917{
2918 OLEMENUGROUPWIDTHS omw = { { 0, 0, 0, 0, 0, 0 } };
2919
2920 *hwnd = NULL;
2921
2922 TRACE("(%p)->(shlview=%p shlbrs=%p rec=%p hwnd=%p vmode=%x flags=%x)\n", this, psvPrevious, psb, prcView, hwnd, mode, flags);
2923 if (prcView != NULL)
2924 TRACE("-- left=%i top=%i right=%i bottom=%i\n", prcView->left, prcView->top, prcView->right, prcView->bottom);
2925
2926 /* Validate the Shell Browser */
2927 if (psb == NULL || m_hWnd)
2928 return E_UNEXPECTED;
2929
2930 if (view_flags != SV3CVW3_DEFAULT)
2931 FIXME("unsupported view flags 0x%08x\n", view_flags);
2932
2933 /* Set up the member variables */
2934 m_pShellBrowser = psb;
2937
2938 if (view_id)
2939 {
2940 if (IsEqualIID(*view_id, VID_LargeIcons))
2942 else if (IsEqualIID(*view_id, VID_SmallIcons))
2944 else if (IsEqualIID(*view_id, VID_List))
2946 else if (IsEqualIID(*view_id, VID_Details))
2948 else if (IsEqualIID(*view_id, VID_Thumbnails))
2950 else if (IsEqualIID(*view_id, VID_Tile))
2952 else if (IsEqualIID(*view_id, VID_ThumbStrip))
2954 else
2955 FIXME("Ignoring unrecognized VID %s\n", debugstr_guid(view_id));
2956 }
2957
2958 /* Get our parent window */
2959 m_pShellBrowser->GetWindow(&m_hWndParent);
2960
2961 /* Try to get the ICommDlgBrowserInterface, adds a reference !!! */
2964 {
2965 TRACE("-- CommDlgBrowser\n");
2966 }
2967
2968 RECT rcView = *prcView;
2970 if (m_hWnd == NULL)
2971 return E_FAIL;
2972
2973 *hwnd = m_hWnd;
2974
2975 CheckToolbar();
2976
2977 if (!*hwnd)
2978 return E_FAIL;
2979
2981
2983 UpdateWindow();
2984
2985 if (!m_hMenu)
2986 {
2987 m_hMenu = CreateMenu();
2988 m_pShellBrowser->InsertMenusSB(m_hMenu, &omw);
2989 TRACE("-- after fnInsertMenusSB\n");
2990 }
2991
2992 _MergeToolbar();
2993
2994 return S_OK;
2995}
2996
2998{
2999 FIXME("(%p)->(%p) stub\n", this, new_pidl);
3000 return E_NOTIMPL;
3001}
3002
3004{
3005 FIXME("(%p)->(%p, %u, %p) stub\n", this, item, flags, point);
3006 return E_NOTIMPL;
3007}
3008
3009// IShellFolderView implementation
3010
3012{
3013 FIXME("(%p)->(%ld) stub\n", this, sort);
3014 return E_NOTIMPL;
3015}
3016
3018{
3019 FIXME("(%p)->(%p) stub\n", this, sort);
3020 return E_NOTIMPL;
3021}
3022
3024{
3026 return S_OK;
3027}
3028
3030{
3031 m_ListView.ModifyStyle(0, LVS_AUTOARRANGE);
3033 return S_OK;
3034}
3035
3037{
3038 TRACE("(%p)->(%p %p)\n", this, pidl, item);
3039 if (!m_ListView)
3040 {
3041 ERR("!m_ListView\n");
3042 return E_FAIL;
3043 }
3044 *item = LV_AddItem(pidl);
3045 return (int)*item >= 0 ? S_OK : E_OUTOFMEMORY;
3046}
3047
3049{
3050 TRACE("(%p)->(%p %d)\n", this, pidl, item);
3051 return Item(item, pidl);
3052}
3053
3055{
3056 TRACE("(%p)->(%p %p)\n", this, pidl, item);
3057
3058 if (!m_ListView)
3059 {
3060 ERR("!m_ListView\n");
3061 return E_FAIL;
3062 }
3063
3064 if (pidl)
3065 {
3068 }
3069 else
3070 {
3071 *item = 0;
3073 }
3074
3075 return S_OK;
3076}
3077
3079{
3080 TRACE("(%p)->(%p)\n", this, count);
3082 return S_OK;
3083}
3084
3086{
3087 FIXME("(%p)->(%d %x) stub\n", this, count, flags);
3088 return E_NOTIMPL;
3089}
3090
3092{
3093 FIXME("(%p)->(%p %p %p) stub\n", this, pidl_old, pidl_new, item);
3094 return E_NOTIMPL;
3095}
3096
3098{
3099 FIXME("(%p)->(%p %p) stub\n", this, pidl, item);
3100 return E_NOTIMPL;
3101}
3102
3104{
3105 TRACE("(%p)->(%d)\n", this, redraw);
3106 if (m_ListView)
3108 return S_OK;
3109}
3110
3112{
3113 FIXME("(%p)->(%p) stub\n", this, count);
3114 return E_NOTIMPL;
3115}
3116
3118{
3119 TRACE("(%p)->(%p %p)\n", this, pidl, items);
3120
3121 *items = GetSelections();
3122
3123 if (*items)
3124 {
3125 *pidl = static_cast<PCUITEMID_CHILD *>(LocalAlloc(0, *items * sizeof(PCUITEMID_CHILD)));
3126 if (!*pidl)
3127 {
3128 return E_OUTOFMEMORY;
3129 }
3130
3131 /* it's documented that caller shouldn't PIDLs, only array itself */
3132 memcpy(*pidl, m_apidl, *items * sizeof(PCUITEMID_CHILD));
3133 }
3134
3135 return S_OK;
3136}
3137
3139{
3140 if ((m_iDragOverItem == -1 || m_pCurDropTarget == NULL) &&
3142 {
3143 return S_OK;
3144 }
3145
3146 return S_FALSE;
3147}
3148
3150{
3151 if (!pt)
3152 return E_INVALIDARG;
3153
3155 return S_OK;
3156}
3157
3159{
3160 FIXME("(%p)->(%p) stub\n", this, pt);
3161 return E_NOTIMPL;
3162}
3163
3165{
3166 TRACE("(%p)->(%p)\n", this, obj);
3167 return E_NOTIMPL;
3168}
3169
3171{
3172 FIXME("(%p)->(%p %p) stub\n", this, pidl, pt);
3173 return E_NOTIMPL;
3174}
3175
3177{
3178 FIXME("(%p)->(%p) stub\n", this, drop_target);
3179 return E_NOTIMPL;
3180}
3181
3183{
3184 FIXME("(%p)->(%d) stub\n", this, move);
3185 return E_NOTIMPL;
3186}
3187
3189{
3190 FIXME("(%p)->(%p) stub\n", this, obj);
3191 return E_NOTIMPL;
3192}
3193
3195{
3196 FIXME("(%p)->(%p) stub\n", this, spacing);
3197 return E_NOTIMPL;
3198}
3199
3200HRESULT STDMETHODCALLTYPE CDefView::SetCallback(IShellFolderViewCB *new_cb, IShellFolderViewCB **old_cb)
3201{
3202 if (old_cb)
3203 *old_cb = m_pShellFolderViewCB.Detach();
3204
3205 m_pShellFolderViewCB = new_cb;
3206 return S_OK;
3207}
3208
3210{
3211 FIXME("(%p)->(%d) stub\n", this, flags);
3212 return E_NOTIMPL;
3213}
3214
3216{
3217 TRACE("(%p)->(%p)\n", this, support);
3218 return S_OK;
3219}
3220
3222{
3223 FIXME("(%p)->(%p) stub\n", this, disp);
3224 return E_NOTIMPL;
3225}
3226
3227HRESULT WINAPI CDefView::QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD *prgCmds, OLECMDTEXT *pCmdText)
3228{
3229 FIXME("(%p)->(%p(%s) 0x%08x %p %p\n",
3230 this, pguidCmdGroup, debugstr_guid(pguidCmdGroup), cCmds, prgCmds, pCmdText);
3231
3232 if (!prgCmds)
3233 return E_INVALIDARG;
3234
3235 for (UINT i = 0; i < cCmds; i++)
3236 {
3237 FIXME("\tprgCmds[%d].cmdID = %d\n", i, prgCmds[i].cmdID);
3238 prgCmds[i].cmdf = 0;
3239 }
3240
3241 return OLECMDERR_E_UNKNOWNGROUP;
3242}
3243
3245// ISVOleCmdTarget_Exec(IOleCommandTarget)
3246//
3247// nCmdID is the OLECMDID_* enumeration
3248HRESULT WINAPI CDefView::Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
3249{
3250 FIXME("(%p)->(\n\tTarget GUID:%s Command:0x%08x Opt:0x%08x %p %p)\n",
3251 this, debugstr_guid(pguidCmdGroup), nCmdID, nCmdexecopt, pvaIn, pvaOut);
3252
3253 if (!pguidCmdGroup)
3254 return OLECMDERR_E_UNKNOWNGROUP;
3255
3256 if (IsEqualCLSID(*pguidCmdGroup, m_Category))
3257 {
3258 if (nCmdID == FCIDM_SHVIEW_AUTOARRANGE)
3259 {
3260 if (V_VT(pvaIn) != VT_INT_PTR)
3261 return OLECMDERR_E_NOTSUPPORTED;
3262
3264 params.cbSize = sizeof(params);
3265 params.rcExclude = *(RECT*) V_INTREF(pvaIn);
3266
3267 if (m_hMenuViewModes)
3268 {
3269 // Duplicate all but the last two items of the view modes menu
3270 HMENU hmenuViewPopup = CreatePopupMenu();
3271 Shell_MergeMenus(hmenuViewPopup, m_hMenuViewModes, 0, 0, 0xFFFF, 0);
3272 DeleteMenu(hmenuViewPopup, GetMenuItemCount(hmenuViewPopup) - 1, MF_BYPOSITION);
3273 DeleteMenu(hmenuViewPopup, GetMenuItemCount(hmenuViewPopup) - 1, MF_BYPOSITION);
3274 CheckViewMode(hmenuViewPopup);
3275 TrackPopupMenuEx(hmenuViewPopup, TPM_LEFTALIGN | TPM_TOPALIGN, params.rcExclude.left, params.rcExclude.bottom, m_hWndParent, &params);
3276 ::DestroyMenu(hmenuViewPopup);
3277 }
3278
3279 // pvaOut is VT_I4 with value 0x403 (cmd id of the new mode maybe?)
3280 V_VT(pvaOut) = VT_I4;
3281 V_I4(pvaOut) = 0x403;
3282 }
3283 }
3284
3285 if (IsEqualIID(*pguidCmdGroup, CGID_Explorer) &&
3286 (nCmdID == 0x29) &&
3287 (nCmdexecopt == 4) && pvaOut)
3288 return S_OK;
3289
3290 if (IsEqualIID(*pguidCmdGroup, CGID_ShellDocView) &&
3291 (nCmdID == 9) &&
3292 (nCmdexecopt == 0))
3293 return 1;
3294
3295 return OLECMDERR_E_UNKNOWNGROUP;
3296}
3297
3298/**********************************************************
3299 * ISVDropTarget implementation
3300 */
3301
3302/******************************************************************************
3303 * drag_notify_subitem [Internal]
3304 *
3305 * Figure out the shellfolder object, which is currently under the mouse cursor
3306 * and notify it via the IDropTarget interface.
3307 */
3308
3309#define SCROLLAREAWIDTH 20
3310
3312{
3313 LONG lResult;
3314 HRESULT hr;
3315 RECT clientRect;
3316
3317 /* The key state on drop doesn't have MK_LBUTTON or MK_RBUTTON because it
3318 reflects the key state after the user released the button, so we need
3319 to remember the last key state when the button was pressed */
3320 m_grfKeyState = grfKeyState;
3321
3322 // Map from global to client coordinates and query the index of the
3323 // listview-item, which is currently under the mouse cursor.
3324 LVHITTESTINFO htinfo = {{pt.x, pt.y}, LVHT_ONITEM};
3325 ScreenToClient(&htinfo.pt);
3326 lResult = m_ListView.HitTest(&htinfo);
3327
3328 /* Send WM_*SCROLL messages every 250 ms during drag-scrolling */
3329 ::GetClientRect(m_ListView, &clientRect);
3330 if (htinfo.pt.x == m_ptLastMousePos.x && htinfo.pt.y == m_ptLastMousePos.y &&
3331 (htinfo.pt.x < SCROLLAREAWIDTH || htinfo.pt.x > clientRect.right - SCROLLAREAWIDTH ||
3332 htinfo.pt.y < SCROLLAREAWIDTH || htinfo.pt.y > clientRect.bottom - SCROLLAREAWIDTH))
3333 {
3334 m_cScrollDelay = (m_cScrollDelay + 1) % 5; // DragOver is called every 50 ms
3335 if (m_cScrollDelay == 0)
3336 {
3337 /* Mouse did hover another 250 ms over the scroll-area */
3338 if (htinfo.pt.x < SCROLLAREAWIDTH)
3339 m_ListView.SendMessageW(WM_HSCROLL, SB_LINEUP, 0);
3340
3341 if (htinfo.pt.x > clientRect.right - SCROLLAREAWIDTH)
3342 m_ListView.SendMessageW(WM_HSCROLL, SB_LINEDOWN, 0);
3343
3344 if (htinfo.pt.y < SCROLLAREAWIDTH)
3345 m_ListView.SendMessageW(WM_VSCROLL, SB_LINEUP, 0);
3346
3347 if (htinfo.pt.y > clientRect.bottom - SCROLLAREAWIDTH)
3348 m_ListView.SendMessageW(WM_VSCROLL, SB_LINEDOWN, 0);
3349 }
3350 }
3351 else
3352 {
3353 m_cScrollDelay = 0; // Reset, if cursor is not over the listview's scroll-area
3354 }
3355
3356 m_ptLastMousePos = htinfo.pt;
3358
3359 /* We need to check if we drag the selection over itself */
3360 if (lResult != -1 && m_pSourceDataObject.p != NULL)
3361 {
3362 PCUITEMID_CHILD pidl = _PidlByItem(lResult);
3363
3364 for (UINT i = 0; i < m_cidl; i++)
3365 {
3366 if (pidl == m_apidl[i])
3367 {
3368 /* The item that is being draged is hovering itself. */
3369 lResult = -1;
3370 break;
3371 }
3372 }
3373 }
3374
3375 // If we are still over the previous sub-item, notify it via DragOver and return
3376 if (m_pCurDropTarget && lResult == m_iDragOverItem)
3377 return m_pCurDropTarget->DragOver(grfKeyState, pt, pdwEffect);
3378
3379 // We've left the previous sub-item, notify it via DragLeave and release it
3380 if (m_pCurDropTarget)
3381 {
3383 if (pidl)
3384 SelectItem(pidl, 0);
3385
3386 m_pCurDropTarget->DragLeave();
3388 }
3389
3390 m_iDragOverItem = lResult;
3391
3392 if (lResult == -1)
3393 {
3394 // We are not above one of the listview's subitems. Bind to the
3395 // parent folder's DropTarget interface.
3397 }
3398 else
3399 {
3400 // Query the relative PIDL of the shellfolder object represented
3401 // by the currently dragged over listview-item ...
3402 PCUITEMID_CHILD pidl = _PidlByItem(lResult);
3403
3404 // ... and bind m_pCurDropTarget to the IDropTarget interface of an UIObject of this object
3405 hr = m_pSFParent->GetUIObjectOf(m_ListView, 1, &pidl, IID_NULL_PPV_ARG(IDropTarget, &m_pCurDropTarget));
3406 }
3407
3409
3410 // If anything failed, m_pCurDropTarget should be NULL now, which ought to be a save state
3411 if (FAILED(hr))
3412 {
3413 *pdwEffect = DROPEFFECT_NONE;
3414 return hr;
3415 }
3416
3417 if (m_iDragOverItem != -1)
3418 {
3419 SelectItem(m_iDragOverItem, SVSI_SELECT);
3420 }
3421
3422 // Notify the item just entered via DragEnter
3423 return m_pCurDropTarget->DragEnter(m_pCurDataObject, grfKeyState, pt, pdwEffect);
3424}
3425
3426HRESULT WINAPI CDefView::DragEnter(IDataObject *pDataObject, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect)
3427{
3428 if (*pdwEffect == DROPEFFECT_NONE)
3429 return S_OK;
3430
3431 /* Get a hold on the data object for later calls to DragEnter on the sub-folders */
3432 m_pCurDataObject = pDataObject;
3433
3434 HRESULT hr = drag_notify_subitem(grfKeyState, pt, pdwEffect);
3435 if (SUCCEEDED(hr))
3436 {
3437 POINT ptClient = {pt.x, pt.y};
3438 ScreenToClient(&ptClient);
3439 ImageList_DragEnter(m_hWnd, ptClient.x, ptClient.y);
3440 }
3441
3442 return hr;
3443}
3444
3446{
3447 POINT ptClient = {pt.x, pt.y};
3448 ScreenToClient(&ptClient);
3449 ImageList_DragMove(ptClient.x, ptClient.y);
3450 return drag_notify_subitem(grfKeyState, pt, pdwEffect);
3451}
3452
3454{
3456
3457 if (m_pCurDropTarget)
3458 {
3459 m_pCurDropTarget->DragLeave();
3461 }
3462
3463 if (m_pCurDataObject != NULL)
3464 {
3466 }
3467
3468 m_iDragOverItem = 0;
3469
3470 return S_OK;
3471}
3472
3474{
3475 RECT rcBound;
3476 INT i, nCount = m_ListView.GetItemCount();
3477 DWORD dwSpacing;
3478 INT dx, dy;
3479 BOOL bSmall = ((m_ListView.GetStyle() & LVS_TYPEMASK) != LVS_ICON);
3480
3481 // FIXME: LVM_GETORIGIN is broken. See CORE-17266
3482 pt.x += m_ListView.GetScrollPos(SB_HORZ);
3483 pt.y += m_ListView.GetScrollPos(SB_VERT);
3484
3485 if (m_ListView.GetStyle() & LVS_ALIGNLEFT)
3486 {
3487 // vertically
3488 for (i = 0; i < nCount; ++i)
3489 {
3490 dwSpacing = ListView_GetItemSpacing(m_ListView, bSmall);
3491 dx = LOWORD(dwSpacing);
3492 dy = HIWORD(dwSpacing);
3494 rcBound.right = rcBound.left + dx;
3495 rcBound.bottom = rcBound.top + dy;
3496 if (pt.x < rcBound.right && pt.y < (rcBound.top + rcBound.bottom) / 2)
3497 {
3498 return i;
3499 }
3500 }
3501 for (i = nCount - 1; i >= 0; --i)
3502 {
3504 if (rcBound.left < pt.x && rcBound.top < pt.y)
3505 {
3506 return i + 1;
3507 }
3508 }
3509 }
3510 else
3511 {
3512 // horizontally
3513 for (i = 0; i < nCount; ++i)
3514 {
3515 dwSpacing = ListView_GetItemSpacing(m_ListView, bSmall);
3516 dx = LOWORD(dwSpacing);
3517 dy = HIWORD(dwSpacing);
3519 rcBound.right = rcBound.left + dx;
3520 rcBound.bottom = rcBound.top + dy;
3521 if (pt.y < rcBound.bottom && pt.x < rcBound.left)
3522 {
3523 return i;
3524 }
3525 if (pt.y < rcBound.bottom && pt.x < rcBound.right)
3526 {
3527 return i + 1;
3528 }
3529 }
3530 for (i = nCount - 1; i >= 0; --i)
3531 {
3533 if (rcBound.left < pt.x && rcBound.top < pt.y)
3534 {
3535 return i + 1;
3536 }
3537 }
3538 }
3539
3540 return nCount;
3541}
3542
3544{
3545 LRESULT lResult;
3546
3548 {
3549 int nPartArray[] = {-1};
3550 m_pShellBrowser->SendControlMsg(FCW_STATUS, SB_SETPARTS, _countof(nPartArray), (LPARAM)nPartArray, &lResult);
3551 return;
3552 }
3553
3554 int nFileSizePartLength = 125;
3555 const int nLocationPartLength = 150;
3556 const int nRightPartsLength = nFileSizePartLength + nLocationPartLength;
3557 int nObjectsPartLength = nWidth - nRightPartsLength;
3558
3559 // If the window is small enough just divide each part into thirds
3560 // to match the behavior of Windows Server 2003
3561 if (nObjectsPartLength <= nLocationPartLength)
3562 nObjectsPartLength = nFileSizePartLength = nWidth / 3;
3563
3564 int nPartArray[] = {nObjectsPartLength, nObjectsPartLength + nFileSizePartLength, -1};
3565
3566 m_pShellBrowser->SendControlMsg(FCW_STATUS, SB_SETPARTS, _countof(nPartArray), (LPARAM)nPartArray, &lResult);
3567}
3568
3570{
3571 // Get the handle for the status bar
3572 HWND fStatusBar;
3573 m_pShellBrowser->GetControlWindow(FCW_STATUS, &fStatusBar);
3574
3575 // Get the size of our status bar
3576 RECT statusBarSize;
3577 ::GetWindowRect(fStatusBar, &statusBarSize);
3578
3579 // Resize the status bar
3580 _HandleStatusBarResize(statusBarSize.right - statusBarSize.left);
3581}
3582
3584
3585static INT CALLBACK
3586SelectionMoveCompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
3587{
3588 CLParamIndexMap *pmap = (CLParamIndexMap *)lParamSort;
3589 INT i1 = pmap->Lookup(lParam1), i2 = pmap->Lookup(lParam2);
3590 if (i1 < i2)
3591 return -1;
3592 if (i1 > i2)
3593 return 1;
3594 return 0;
3595}
3596
3598{
3599 // get insertable index from position
3601
3602 // create identity mapping of indexes
3604 INT nCount = m_ListView.GetItemCount();
3605 for (INT i = 0; i < nCount; ++i)
3606 {
3607 array.Add(i);
3608 }
3609
3610 // re-ordering mapping
3611 INT iItem = -1;
3612 while ((iItem = m_ListView.GetNextItem(iItem, LVNI_SELECTED)) >= 0)
3613 {
3614 INT iFrom = iItem, iTo = iPosition;
3615 if (iFrom < iTo)
3616 --iTo;
3617 if (iFrom >= nCount)
3618 iFrom = nCount - 1;
3619 if (iTo >= nCount)
3620 iTo = nCount - 1;
3621
3622 // shift indexes by swapping (like a bucket relay)
3623 if (iFrom < iTo)
3624 {
3625 for (INT i = iFrom; i < iTo; ++i)
3626 {
3627 // swap array[i] and array[i + 1]
3628 INT tmp = array[i];
3629 array[i] = array[i + 1];
3630 array[i + 1] = tmp;
3631 }
3632 }
3633 else
3634 {
3635 for (INT i = iFrom; i > iTo; --i)
3636 {
3637 // swap array[i] and array[i - 1]
3638 INT tmp = array[i];
3639 array[i] = array[i - 1];
3640 array[i - 1] = tmp;
3641 }
3642 }
3643 }
3644
3645 // create mapping (ListView's lParam to index) from array
3647 for (INT i = 0; i < nCount; ++i)
3648 {
3650 map.Add(lParam, i);
3651 }
3652
3653 // finally sort
3655}
3656
3657HRESULT WINAPI CDefView::Drop(IDataObject* pDataObject, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect)
3658{
3661
3662 if ((IsDropOnSource(NULL) == S_OK) &&
3663 (*pdwEffect & DROPEFFECT_MOVE) &&
3665 {
3666 if (m_pCurDropTarget)
3667 {
3668 m_pCurDropTarget->DragLeave();
3670 }
3671
3672 POINT ptDrop = { pt.x, pt.y };
3673 ::ScreenToClient(m_ListView, &ptDrop);
3675 m_ptLastMousePos = ptDrop;
3676
3678 if (m_ListView.GetStyle() & LVS_AUTOARRANGE)
3679 {
3681 }
3682 else
3683 {
3684 POINT ptItem;
3685 INT iItem = -1;
3686 while ((iItem = m_ListView.GetNextItem(iItem, LVNI_SELECTED)) >= 0)
3687 {
3688 if (m_ListView.GetItemPosition(iItem, &ptItem))
3689 {
3692 m_ListView.SetItemPosition(iItem, &ptItem);
3693 }
3694 }
3695 }
3697 }
3698 else if (m_pCurDropTarget)
3699 {
3700 m_pCurDropTarget->Drop(pDataObject, grfKeyState, pt, pdwEffect);
3702 }
3703
3705 m_iDragOverItem = 0;
3706 return S_OK;
3707}
3708
3710{
3711 TRACE("(%p)\n", this);
3712
3713 if (fEscapePressed)
3714 return DRAGDROP_S_CANCEL;
3715 else if (!(grfKeyState & MK_LBUTTON) && !(grfKeyState & MK_RBUTTON))
3716 return DRAGDROP_S_DROP;
3717 else
3718 return S_OK;
3719}
3720
3722{
3723 TRACE("(%p)\n", this);
3724
3726}
3727
3728HRESULT WINAPI CDefView::Draw(DWORD dwDrawAspect, LONG lindex, void *pvAspect, DVTARGETDEVICE *ptd, HDC hdcTargetDev, HDC hdcDraw, LPCRECTL lprcBounds, LPCRECTL lprcWBounds, BOOL (CALLBACK *pfnContinue)(ULONG_PTR dwContinue), ULONG_PTR dwContinue)
3729{
3730 FIXME("Stub: this=%p\n", this);
3731 return E_NOTIMPL;
3732}
3733
3734HRESULT WINAPI CDefView::GetColorSet(DWORD dwDrawAspect, LONG lindex, void *pvAspect, DVTARGETDEVICE *ptd, HDC hicTargetDevice, LOGPALETTE **ppColorSet)
3735{
3736 FIXME("Stub: this=%p\n", this);
3737 return E_NOTIMPL;
3738}
3739
3740HRESULT WINAPI CDefView::Freeze(DWORD dwDrawAspect, LONG lindex, void *pvAspect, DWORD *pdwFreeze)
3741{
3742 FIXME("Stub: this=%p\n", this);
3743 return E_NOTIMPL;
3744}
3745
3747{
3748 FIXME("Stub: this=%p\n", this);
3749 return E_NOTIMPL;
3750}
3751
3753{
3754 FIXME("partial stub: %p 0x%08x 0x%08x %p\n", this, aspects, advf, pAdvSink);
3755
3756 // FIXME: we set the AdviseSink, but never use it to send any advice
3757 m_pAdvSink = pAdvSink;
3758 m_dwAspects = aspects;
3759 m_dwAdvf = advf;
3760
3761 return S_OK;
3762}
3763
3765{
3766 TRACE("this=%p pAspects=%p pAdvf=%p ppAdvSink=%p\n", this, pAspects, pAdvf, ppAdvSink);
3767
3768 if (ppAdvSink)
3769 {
3770 *ppAdvSink = m_pAdvSink;
3771 m_pAdvSink.p->AddRef();
3772 }
3773
3774 if (pAspects)
3775 *pAspects = m_dwAspects;
3776
3777 if (pAdvf)
3778 *pAdvf = m_dwAdvf;
3779
3780 return S_OK;
3781}
3782
3784{
3785 if (IsEqualIID(guidService, SID_IShellBrowser))
3786 return m_pShellBrowser->QueryInterface(riid, ppvObject);
3787 else if(IsEqualIID(guidService, SID_IFolderView))
3788 return QueryInterface(riid, ppvObject);
3789
3790 return E_NOINTERFACE;
3791}
3792
3794{
3796 HRESULT hr = S_OK;
3797
3798 hr = IUnknown_QueryService(m_pShellBrowser, IID_IExplorerToolbar, IID_PPV_ARG(IExplorerToolbar, &ptb));
3799 if (FAILED(hr))
3800 return hr;
3801
3802 m_Category = CGID_DefViewFrame;
3803
3804 hr = ptb->SetCommandTarget(static_cast<IOleCommandTarget*>(this), &m_Category, 0);
3805 if (FAILED(hr))
3806 return hr;
3807
3808 if (hr == S_FALSE)
3809 return S_OK;
3810
3811#if 0
3812 hr = ptb->AddButtons(&m_Category, buttonsCount, buttons);
3813 if (FAILED(hr))
3814 return hr;
3815#endif
3816
3817 return S_OK;
3818}
3819
3821{
3823
3825 {
3826 hr = m_pShellFolderViewCB->MessageSFVCB(uMsg, wParam, lParam);
3827 }
3828
3829 return hr;
3830}
3831
3833{
3834 return ShellObjectCreatorInit<CDefView>(pFolder, riid, ppvOut);
3835}
3836
3838 LPCSFV psvcbi, // [in] shelltemplate struct
3839 IShellView **ppsv) // [out] IShellView pointer
3840{
3842 HRESULT hRes;
3843
3844 TRACE("sf=%p pidl=%p cb=%p mode=0x%08x parm=%p\n",
3845 psvcbi->pshf, psvcbi->pidl, psvcbi->pfnCallback,
3846 psvcbi->fvm, psvcbi->psvOuter);
3847
3848 *ppsv = NULL;
3849 hRes = CDefView_CreateInstance(psvcbi->pshf, IID_PPV_ARG(IShellView, &psv));
3850 if (FAILED_UNEXPECTEDLY(hRes))
3851 return hRes;
3852
3853 *ppsv = psv.Detach();
3854 return hRes;
3855}
3856
3858 IShellView **ppsv)
3859{
3861 HRESULT hRes;
3862
3863 if (!ppsv)
3864 return E_INVALIDARG;
3865
3866 *ppsv = NULL;
3867
3868 if (!pcsfv || pcsfv->cbSize != sizeof(*pcsfv))
3869 return E_INVALIDARG;
3870
3871 TRACE("sf=%p outer=%p callback=%p\n",
3872 pcsfv->pshf, pcsfv->psvOuter, pcsfv->psfvcb);
3873
3874 hRes = CDefView_CreateInstance(pcsfv->pshf, IID_PPV_ARG(IShellView, &psv));
3875 if (FAILED(hRes))
3876 return hRes;
3877
3878 if (pcsfv->psfvcb)
3879 {
3881 if (SUCCEEDED(psv->QueryInterface(IID_PPV_ARG(IShellFolderView, &sfv))))
3882 {
3883 sfv->SetCallback(pcsfv->psfvcb, NULL);
3884 }
3885 }
3886
3887 *ppsv = psv.Detach();
3888 return hRes;
3889}
static HDC hDC
Definition: 3dtext.c:33
BOOL _ILIsDesktop(LPCITEMIDLIST pidl)
Definition: CBandSite.h:24
HRESULT CDefViewBckgrndMenu_CreateInstance(IShellFolder *psf, REFIID riid, void **ppv)
HRESULT WINAPI CDefViewDual_Constructor(REFIID riid, LPVOID *ppvOut)
#define GET_WM_COMMAND_HWND(wp, lp)
Definition: CDefView.cpp:415
HMENU GetSubmenuByID(HMENU hmenu, UINT id)
Definition: CDefView.cpp:1325
CSimpleMap< LPARAM, INT > CLParamIndexMap
Definition: CDefView.cpp:3583
#define SCROLLAREAWIDTH
Definition: CDefView.cpp:3309
struct LISTVIEW_SORT_INFO * LPLISTVIEW_SORT_INFO
static BOOL ILIsParentOrSpecialParent(PCIDLIST_ABSOLUTE pidl1, PCIDLIST_ABSOLUTE pidl2)
Definition: CDefView.cpp:2220
void(CALLBACK * PFNSHGETSETTINGSPROC)(LPSHELLFLAGSTATE lpsfs, DWORD dwMask)
Definition: CDefView.cpp:418
#define SHV_CHANGE_NOTIFY
Definition: CDefView.cpp:51
#define GET_WM_COMMAND_ID(wp, lp)
Definition: CDefView.cpp:414
#define CONTEXT_MENU_BASE_ID
Definition: CDefView.cpp:55
HRESULT SHSetMenuIdInMenuMsg(UINT uMsg, LPARAM lParam, UINT CmdId)
HRESULT CDefView_CreateInstance(IShellFolder *pFolder, REFIID riid, LPVOID *ppvOut)
Definition: CDefView.cpp:3832
#define ID_LISTVIEW
Definition: CDefView.cpp:411
#define GET_WM_COMMAND_CMD(wp, lp)
Definition: CDefView.cpp:416
UINT ReallyGetMenuItemID(HMENU hmenu, int i)
Definition: CDefView.cpp:1336
static INT CALLBACK SelectionMoveCompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
Definition: CDefView.cpp:3586
HRESULT WINAPI SHCreateShellFolderView(const SFV_CREATE *pcsfv, IShellView **ppsv)
Definition: CDefView.cpp:3857
static VOID DrawTileBitmap(HDC hDC, LPCRECT prc, HBITMAP hbm, INT nWidth, INT nHeight, INT dx, INT dy)
Definition: CDefView.cpp:1179
static void ClientToListView(HWND hwndLV, POINT *ppt)
Definition: CDefView.cpp:59
DWORD WINAPI SHMenuIndexFromID(HMENU hMenu, UINT uID)
Definition: ordinal.c:4504
static BOOL SelectExtOnRename(void)
Definition: CDefView.cpp:1955
HRESULT WINAPI SHCreateShellFolderViewEx(LPCSFV psvcbi, IShellView **ppsv)
Definition: CDefView.cpp:3837
HRESULT SHGetMenuIdFromMenuMsg(UINT uMsg, LPARAM lParam, UINT *CmdId)
#define SFVM_GET_CUSTOMVIEWINFO
#define SFVM_VIEWRELEASE
#define SFVM_ADDINGOBJECT
#define SFVM_LISTREFRESHED
#define SFVM_WINDOWCLOSING
#define SFVM_SELECTIONCHANGED
unsigned char BOOLEAN
#define shell32_hInstance
@ lparam
Definition: SystemMenu.c:31
_STLP_MOVE_TO_STD_NAMESPACE void sort(_RandomAccessIter __first, _RandomAccessIter __last)
Definition: _algo.c:993
HWND hWnd
Definition: settings.c:17
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
void shell(int argc, const char *argv[])
Definition: cmds.c:1231
#define U(x)
Definition: wordpad.c:45
@ Create
Definition: registry.c:563
#define STDMETHOD(m)
Definition: basetyps.h:62
#define STDMETHODCALLTYPE
Definition: bdasup.h:9
#define FIXME(fmt,...)
Definition: debug.h:111
#define ERR(fmt,...)
Definition: debug.h:110
#define RegCloseKey(hKey)
Definition: registry.h:49
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 BOOL WINAPI SHChangeNotification_Unlock(HANDLE hLock)
EXTERN_C BOOL WINAPI SHChangeNotifyDeregister(ULONG hNotify)
void Release()
Definition: atlcomcli.h:170
T * Detach()
Definition: atlcomcli.h:186
static LRESULT CALLBACK StartWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: atlwin.h:1619
BOOL DestroyWindow()
Definition: atlwin.h:462
CWindow GetParent() const
Definition: atlwin.h:700
BOOL UpdateWindow()
Definition: atlwin.h:1345
HWND m_hWnd
Definition: atlwin.h:273
STDMETHOD() Drop(IDataObject *pDataObj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect) override
Definition: CDefView.cpp:3657
STDMETHOD() Unfreeze(DWORD dwFreeze) override
Definition: CDefView.cpp:3746
HMENU m_hMenu
Definition: CDefView.cpp:119
LRESULT OnShowWindow(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: CDefView.cpp:1135
CComPtr< IShellFolder > m_pSFParent
Definition: CDefView.cpp:110
LRESULT OnKillFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: CDefView.cpp:1842
STDMETHOD() GetAutoArrange() override
Definition: CDefView.cpp:2837
LRESULT OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: CDefView.cpp:1822
STDMETHOD() SelectAndPositionItem(LPCITEMIDLIST item, UINT flags, POINT *point) override
Definition: CDefView.cpp:3003
HRESULT OnStateChange(UINT uFlags)
Definition: CDefView.cpp:511
static INT CALLBACK fill_list(LPVOID ptr, LPVOID arg)
Definition: CDefView.cpp:1017
STDMETHOD() DestroyViewWindow() override
Definition: CDefView.cpp:2503
LRESULT OnSysColorChange(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: CDefView.cpp:1227
LRESULT OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: CDefView.cpp:1577
int LV_AddItem(PCUITEMID_CHILD pidl)
Definition: CDefView.cpp:916
STDMETHOD() SetItemPos(PCUITEMID_CHILD pidl, POINT *pt) override
Definition: CDefView.cpp:3170
HRESULT FillFileMenu()
Definition: CDefView.cpp:1345
STDMETHOD() RemoveObject(PITEMID_CHILD pidl, UINT *item) override
Definition: CDefView.cpp:3054
void UpdateStatusbar()
Definition: CDefView.cpp:549
HMENU m_hMenuArrangeModes
Definition: CDefView.cpp:120
CComPtr< IDataObject > m_pCurDataObject
Definition: CDefView.cpp:137
HRESULT FillEditMenu()
Definition: CDefView.cpp:1385
STDMETHOD() SetAutomationObject(IDispatch *disp) override
Definition: CDefView.cpp:3221
CComPtr< IShellFolderViewDual > m_pShellFolderViewDual
Definition: CDefView.cpp:115
STDMETHOD() DragLeave() override
Definition: CDefView.cpp:3453
LRESULT OnNCCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: CDefView.cpp:1241
STDMETHOD() AutoArrange() override
Definition: CDefView.cpp:3029
BOOL CreateList()
Definition: CDefView.cpp:629
void UpdateListColors()
Definition: CDefView.cpp:727
HWND m_hWndParent
Definition: CDefView.cpp:117
STDMETHOD() ContextSensitiveHelp(BOOL fEnterMode) override
Definition: CDefView.cpp:2432
STDMETHOD() AddPropertySheetPages(DWORD dwReserved, LPFNSVADDPROPSHEETPAGE pfn, LPARAM lparam) override
Definition: CDefView.cpp:2563
STDMETHOD() QueryService(REFGUID guidService, REFIID riid, void **ppvObject) override
Definition: CDefView.cpp:3783
BOOLEAN LV_DeleteItem(PCUITEMID_CHILD pidl)
Definition: CDefView.cpp:938
STDMETHOD() GetItemObject(UINT uItem, REFIID riid, void **ppv) override
Definition: CDefView.cpp:2633
STDMETHOD() GetObjectCount(UINT *count) override
Definition: CDefView.cpp:3078
HRESULT _MergeToolbar()
Definition: CDefView.cpp:3793
STDMETHOD() SetCallback(IShellFolderViewCB *new_cb, IShellFolderViewCB **old_cb) override
Definition: CDefView.cpp:3200
HRESULT drag_notify_subitem(DWORD grfKeyState, POINTL pt, DWORD *pdwEffect)
Definition: CDefView.cpp:3311
DWORD m_dwAdvf
Definition: CDefView.cpp:132
HRESULT _DoFolderViewCB(UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: CDefView.cpp:3820
STDMETHOD() Items(UINT uFlags, REFIID riid, void **ppv) override
Definition: CDefView.cpp:2771
STDMETHOD() CreateViewWindow2(LPSV2CVW2_PARAMS view_params) override
Definition: CDefView.cpp:2909
STDMETHOD() SelectItem(PCUITEMID_CHILD pidlItem, SVSIF uFlags) override
Definition: CDefView.cpp:2577
LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: CDefView.cpp:1723
STDMETHOD() GetAdvise(DWORD *pAspects, DWORD *pAdvf, IAdviseSink **ppAdvSink) override
Definition: CDefView.cpp:3764
LRESULT OnGetDlgCode(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: CDefView.cpp:1143
void CheckToolbar()
Definition: CDefView.cpp:530
HRESULT IncludeObject(PCUITEMID_CHILD pidl)
Definition: CDefView.cpp:483
DWORD m_dwAspects
Definition: CDefView.cpp:131
STDMETHOD() SaveViewState() override
Definition: CDefView.cpp:2570
CComPtr< IContextMenu > m_pCM
Definition: CDefView.cpp:144
CComPtr< IShellBrowser > m_pShellBrowser
Definition: CDefView.cpp:113
void _DoCopyToMoveToFolder(BOOL bCopy)
Definition: CDefView.cpp:1793
BOOL m_isParentFolderSpecial
Definition: CDefView.cpp:148
INT _FindInsertableIndexFromPoint(POINT pt)
Definition: CDefView.cpp:3473
LRESULT OnPrintClient(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: CDefView.cpp:1200
UINT m_cScrollDelay
Definition: CDefView.cpp:139
LISTVIEW_SORT_INFO m_sortInfo
Definition: CDefView.cpp:128
CComPtr< IDataObject > m_pSourceDataObject
Definition: CDefView.cpp:135
HRESULT CheckViewMode(HMENU hmenuView)
Definition: CDefView.cpp:1457
CComPtr< IAdviseSink > m_pAdvSink
Definition: CDefView.cpp:133
void _HandleStatusBarResize(int width)
Definition: CDefView.cpp:3543
STDMETHOD() SetCurrentViewMode(UINT ViewMode) override
Definition: CDefView.cpp:2694
LRESULT OnInitMenuPopup(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: CDefView.cpp:2362
POINT m_ptFirstMousePos
Definition: CDefView.cpp:141
LRESULT OnExplorerCommand(UINT uCommand, BOOL bUseSelection)
Definition: CDefView.cpp:1673
LRESULT OnSettingChange(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: CDefView.cpp:2353
STDMETHOD() GetItemPosition(PCUITEMID_CHILD pidl, POINT *ppt) override
Definition: CDefView.cpp:2794
STDMETHOD() SetPoints(IDataObject *obj) override
Definition: CDefView.cpp:3188
STDMETHOD() IsDropOnSource(IDropTarget *drop_target) override
Definition: CDefView.cpp:3138
CComPtr< IDropTarget > m_pCurDropTarget
Definition: CDefView.cpp:136
PIDLIST_ABSOLUTE m_pidlParent
Definition: CDefView.cpp:127
STDMETHOD() GetSelectionMarkedItem(int *piItem) override
Definition: CDefView.cpp:2776
STDMETHOD() TranslateAccelerator(MSG *pmsg) override
Definition: CDefView.cpp:2440
STDMETHOD() QueryContinueDrag(BOOL fEscapePressed, DWORD grfKeyState) override
Definition: CDefView.cpp:3709
virtual WNDPROC GetWindowProc()
Definition: CDefView.cpp:347
BOOLEAN LV_ProdItem(PCUITEMID_CHILD pidl)
Definition: CDefView.cpp:992
BOOL _Sort()
Definition: CDefView.cpp:853
STDMETHOD() Draw(DWORD dwDrawAspect, LONG lindex, void *pvAspect, DVTARGETDEVICE *ptd, HDC hdcTargetDev, HDC hdcDraw, LPCRECTL lprcBounds, LPCRECTL lprcWBounds, BOOL(STDMETHODCALLTYPE *pfnContinue)(ULONG_PTR dwContinue), ULONG_PTR dwContinue) override
Definition: CDefView.cpp:3728
LRESULT OnCustomItem(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: CDefView.cpp:2330
HMENU m_hContextMenu
Definition: CDefView.cpp:122
CComPtr< IShellFolderViewCB > m_pShellFolderViewCB
Definition: CDefView.cpp:112
STDMETHOD() GiveFeedback(DWORD dwEffect) override
Definition: CDefView.cpp:3721
STDMETHOD() ArrangeGrid() override
Definition: CDefView.cpp:3023
STDMETHOD() SetRedraw(BOOL redraw) override
Definition: CDefView.cpp:3103
HRESULT OpenSelectedItems()
Definition: CDefView.cpp:1537
void _ForceStatusBarResize()
Definition: CDefView.cpp:3569
BOOL m_Destroyed
Definition: CDefView.cpp:151
CComPtr< IContextMenu > m_pFileMenu
Definition: CDefView.cpp:145
HRESULT WINAPI Initialize(IShellFolder *shellFolder)
Definition: CDefView.cpp:473
PCUITEMID_CHILD * m_apidl
Definition: CDefView.cpp:126
LRESULT OnActivate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: CDefView.cpp:1816
STDMETHOD() GetSelectedObjects(PCUITEMID_CHILD **pidl, UINT *items) override
Definition: CDefView.cpp:3117
STDMETHOD() QuerySupport(UINT *support) override
Definition: CDefView.cpp:3215
void OnDeactivate()
Definition: CDefView.cpp:1748
LRESULT OnEraseBackground(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: CDefView.cpp:1168
void _MoveSelectionOnAutoArrange(POINT pt)
Definition: CDefView.cpp:3597
static INT CALLBACK ListViewCompareItems(LPARAM lParam1, LPARAM lParam2, LPARAM lpData)
Definition: CDefView.cpp:837
STDMETHOD() GetDefaultSpacing(POINT *ppt) override
Definition: CDefView.cpp:2832
CLSID m_Category
Definition: CDefView.cpp:150
HRESULT FillArrangeAsMenu(HMENU hmenuArrange)
Definition: CDefView.cpp:1418
STDMETHOD() UpdateObject(PITEMID_CHILD pidl_old, PITEMID_CHILD pidl_new, UINT *item) override
Definition: CDefView.cpp:3091
STDMETHOD() GetItemSpacing(ITEMSPACING *spacing) override
Definition: CDefView.cpp:3194
static ATL::CWndClassInfo & GetWndClassInfo()
Definition: CDefView.cpp:334
CComPtr< IShellFolder2 > m_pSF2Parent
Definition: CDefView.cpp:111
LRESULT OnCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: CDefView.cpp:1854
STDMETHOD() AddObject(PITEMID_CHILD pidl, UINT *item) override
Definition: CDefView.cpp:3036
STDMETHOD() GetDropPoint(POINT *pt) override
Definition: CDefView.cpp:3158
HICON m_hMyComputerIcon
Definition: CDefView.cpp:154
STDMETHOD() GetSelectedCount(UINT *count) override
Definition: CDefView.cpp:3111
STDMETHOD() GetFocusedItem(int *piItem) override
Definition: CDefView.cpp:2785
STDMETHOD() GetSpacing(POINT *ppt) override
Definition: CDefView.cpp:2810
LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: CDefView.cpp:1148
STDMETHOD() CreateViewWindow(IShellView *psvPrevious, LPCFOLDERSETTINGS pfs, IShellBrowser *psb, RECT *prcView, HWND *phWnd) override
Definition: CDefView.cpp:2497
STDMETHOD() GetDragPoint(POINT *pt) override
Definition: CDefView.cpp:3149
BOOL m_bmenuBarInitialized
Definition: CDefView.cpp:123
PCUITEMID_CHILD _PidlByItem(int i)
Definition: CDefView.cpp:887
UINT m_cidl
Definition: CDefView.cpp:125
STDMETHOD() GetFolder(REFIID riid, void **ppv) override
Definition: CDefView.cpp:2738
STDMETHOD() Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut) override
Definition: CDefView.cpp:3248
UINT m_uState
Definition: CDefView.cpp:124
STDMETHOD() DragOver(DWORD grfKeyState, POINTL pt, DWORD *pdwEffect) override
Definition: CDefView.cpp:3445
STDMETHOD() Rearrange(LPARAM sort) override
Definition: CDefView.cpp:3011
HRESULT InvokeContextMenuCommand(CComPtr< IContextMenu > &pCM, LPCSTR lpVerb, POINT *pt=NULL)
Definition: CDefView.cpp:1505
DWORD m_grfKeyState
Definition: CDefView.cpp:142
STDMETHOD() GetView(SHELLVIEWID *view_guid, ULONG view_type) override
Definition: CDefView.cpp:2903
STDMETHOD() QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT *pCmdText) override
Definition: CDefView.cpp:3227
HRESULT _GetSnapToGrid()
Definition: CDefView.cpp:2842
STDMETHOD() HandleRename(LPCITEMIDLIST new_pidl) override
Definition: CDefView.cpp:2997
UINT GetSelections()
Definition: CDefView.cpp:1475
BOOL m_isEditing
Definition: CDefView.cpp:147
BOOLEAN LV_RenameItem(PCUITEMID_CHILD pidlOld, PCUITEMID_CHILD pidlNew)
Definition: CDefView.cpp:953
STDMETHOD() GetCurrentInfo(LPFOLDERSETTINGS pfs) override
Definition: CDefView.cpp:2551
CComPtr< ICommDlgBrowser > m_pCommDlgBrowser
Definition: CDefView.cpp:114
STDMETHOD() GetCurrentViewMode(UINT *pViewMode) override
Definition: CDefView.cpp:2683
POINT m_ptLastMousePos
Definition: CDefView.cpp:140
STDMETHOD() RefreshObject(PITEMID_CHILD pidl, UINT *item) override
Definition: CDefView.cpp:3097
BOOL InitList()
Definition: CDefView.cpp:784
ULONG m_hNotify
Definition: CDefView.cpp:129
STDMETHOD() IsBkDropTarget(IDropTarget *drop_target) override
Definition: CDefView.cpp:3176
STDMETHOD() Refresh() override
Definition: CDefView.cpp:2485
STDMETHOD() SelectAndPositionItems(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, POINT *apt, DWORD dwFlags) override
Definition: CDefView.cpp:2879
HRESULT OnDefaultCommand()
Definition: CDefView.cpp:497
STDMETHOD() SetClipboard(BOOL move) override
Definition: CDefView.cpp:3182
HRESULT FillViewMenu()
Definition: CDefView.cpp:1402
LONG m_iDragOverItem
Definition: CDefView.cpp:138
STDMETHOD() ItemCount(UINT uFlags, int *pcItems) override
Definition: CDefView.cpp:2759
virtual VOID OnFinalMessage(HWND) override
Definition: CDefView.cpp:1248
LRESULT OnGetShellBrowser(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: CDefView.cpp:1236
STDMETHOD() MoveIcons(IDataObject *obj) override
Definition: CDefView.cpp:3164
STDMETHOD() GetWindow(HWND *lphwnd) override
Definition: CDefView.cpp:2423
STDMETHOD() CreateViewWindow3(IShellBrowser *psb, IShellView *psvPrevious, SV3CVW3_FLAGS view_flags, FOLDERFLAGS mask, FOLDERFLAGS flags, FOLDERVIEWMODE mode, const SHELLVIEWID *view_id, const RECT *prcView, HWND *hwnd) override
Definition: CDefView.cpp:2916
HMENU m_hMenuViewModes
Definition: CDefView.cpp:121
HACCEL m_hAccel
Definition: CDefView.cpp:130
STDMETHOD() GetArrangeParam(LPARAM *sort) override
Definition: CDefView.cpp:3017
LRESULT OnChangeNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: CDefView.cpp:2263
STDMETHOD() Freeze(DWORD dwDrawAspect, LONG lindex, void *pvAspect, DWORD *pdwFreeze) override
Definition: CDefView.cpp:3740
STDMETHOD() GetColorSet(DWORD dwDrawAspect, LONG lindex, void *pvAspect, DVTARGETDEVICE *ptd, HDC hicTargetDev, LOGPALETTE **ppColorSet) override
Definition: CDefView.cpp:3734
FOLDERSETTINGS m_FolderSettings
Definition: CDefView.cpp:118
STDMETHOD() DragEnter(IDataObject *pDataObj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect) override
Definition: CDefView.cpp:3426
static LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: CDefView.cpp:352
STDMETHOD() SetObjectCount(UINT count, UINT flags) override
Definition: CDefView.cpp:3085
STDMETHOD() GetObject(PITEMID_CHILD *pidl, UINT item) override
Definition: CDefView.cpp:3048
LRESULT OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: CDefView.cpp:1974
STDMETHOD() EnableModeless(BOOL fEnable) override
Definition: CDefView.cpp:2456
CListView m_ListView
Definition: CDefView.cpp:116
STDMETHOD() SetAdvise(DWORD aspects, DWORD advf, IAdviseSink *pAdvSink) override
Definition: CDefView.cpp:3752
LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: CDefView.cpp:1253
STDMETHOD() UIActivate(UINT uState) override
Definition: CDefView.cpp:2462
int LV_FindItemByPidl(PCUITEMID_CHILD pidl)
Definition: CDefView.cpp:901
STDMETHOD() Item(int iItemIndex, PITEMID_CHILD *ppidl) override
Definition: CDefView.cpp:2746
void DoActivate(UINT uState)
Definition: CDefView.cpp:1759
STDMETHOD() Select(UINT flags) override
Definition: CDefView.cpp:3209
SFVM_CUSTOMVIEWINFO_DATA m_viewinfo_data
Definition: CDefView.cpp:152
HRESULT FillList()
Definition: CDefView.cpp:1034
int GetNextItem(int i, WORD flags)
Definition: rosctrls.h:161
UINT GetItemState(int i, UINT mask)
Definition: rosctrls.h:173
BOOL SetTextBkColor(COLORREF cr)
Definition: rosctrls.h:32
BOOL DeleteAllItems()
Definition: rosctrls.h:126
int InsertItem(const LV_ITEM *pitem)
Definition: rosctrls.h:96
DWORD SetExtendedListViewStyle(DWORD dw, DWORD dwMask=0)
Definition: rosctrls.h:47
void SetRedraw(BOOL redraw)
Definition: rosctrls.h:27
BOOL SortItems(PFNLVCOMPARE pfnCompare, PVOID lParam)
Definition: rosctrls.h:141
void SetItemState(int i, UINT state, UINT mask)
Definition: rosctrls.h:178
int GetItemCount()
Definition: rosctrls.h:121
HWND EditLabel(int i)
Definition: rosctrls.h:151
DWORD_PTR GetItemData(int i)
Definition: rosctrls.h:204
BOOL SetTextColor(COLORREF cr)
Definition: rosctrls.h:42
HIMAGELIST SetImageList(HIMAGELIST himl, int iImageList)
Definition: rosctrls.h:91
int InsertColumn(int iCol, LV_COLUMN *pcol)
Definition: rosctrls.h:52
BOOL EnsureVisible(int i, BOOL fPartialOK)
Definition: rosctrls.h:146
BOOL SetItemPosition(int nItem, POINT *pPoint)
Definition: rosctrls.h:236
BOOL GetItem(LV_ITEM *pitem)
Definition: rosctrls.h:106
BOOL Update(int i)
Definition: rosctrls.h:131
UINT GetSelectedCount()
Definition: rosctrls.h:136
BOOL Arrange(UINT nCode)
Definition: rosctrls.h:241
void GetItemSpacing(SIZE &spacing, BOOL bSmallIconView=FALSE)
Definition: rosctrls.h:166
BOOL DeleteItem(int i)
Definition: rosctrls.h:101
BOOL SetItem(const LV_ITEM *pitem)
Definition: rosctrls.h:111
int HitTest(LV_HITTESTINFO *phtInfo)
Definition: rosctrls.h:199
BOOL GetItemPosition(int nItem, POINT *pPoint)
Definition: rosctrls.h:231
BOOL SetBkColor(COLORREF cr)
Definition: rosctrls.h:37
int GetSelectionMark()
Definition: rosctrls.h:156
HWND Create(HWND hWndParent, _U_RECT rect, LPCTSTR szWindowName=NULL, DWORD dwStyle=0, DWORD dwExStyle=0, _U_MENUorID MenuOrID=0U, LPVOID lpCreateParam=NULL)
Definition: rosctrls.h:8
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3333
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4103
UINT uFlags
Definition: api.c:59
void WINAPI DPA_DestroyCallback(HDPA hdpa, PFNDPAENUMCALLBACK enumProc, LPVOID lParam)
Definition: dpa.c:1003
HDPA WINAPI DPA_Create(INT nGrow)
Definition: dpa.c:950
INT WINAPI DPA_InsertPtr(HDPA hdpa, INT i, LPVOID p)
Definition: dpa.c:591
VOID WINAPI ImageList_EndDrag(void)
Definition: imagelist.c:1847
BOOL WINAPI ImageList_DragEnter(HWND hwndLock, INT x, INT y)
Definition: imagelist.c:958
BOOL WINAPI ImageList_DragMove(INT x, INT y)
Definition: imagelist.c:1070
BOOL WINAPI ImageList_DragLeave(HWND hwndLock)
Definition: imagelist.c:992
BOOL WINAPI ImageList_BeginDrag(HIMAGELIST himlTrack, INT iTrack, INT dxHotspot, INT dyHotspot)
Definition: imagelist.c:638
HANDLE HWND
Definition: compat.h:19
#define MAX_PATH
Definition: compat.h:34
#define CALLBACK
Definition: compat.h:35
@ VT_I4
Definition: compat.h:2298
@ VT_INT_PTR
Definition: compat.h:2327
#define FAILED_UNEXPECTEDLY(hr)
Definition: precomp.h:121
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
BOOL SHELL_FS_HideExtension(LPCWSTR szPath)
Definition: CFSFolder.cpp:1353
void WINAPI SHFree(LPVOID pv)
Definition: shellole.c:326
LPVOID WINAPI SHAlloc(SIZE_T len)
Definition: shellole.c:304
HRESULT WINAPI SHGetFolderLocation(HWND hwndOwner, int nFolder, HANDLE hToken, DWORD dwReserved, LPITEMIDLIST *ppidl)
Definition: shellpath.c:3124
#define EnableModeless(type)
Definition: ordinal.c:3532
HRESULT WINAPI IUnknown_QueryService(IUnknown *, REFGUID, REFIID, LPVOID *)
Definition: ordinal.c:1497
HRESULT WINAPI IUnknown_SetSite(IUnknown *obj, IUnknown *site)
Definition: ordinal.c:1407
LPWSTR WINAPI PathFindExtensionW(LPCWSTR lpszPath)
Definition: path.c:447
DWORD WINAPI SHGetValueW(HKEY hKey, LPCWSTR lpszSubKey, LPCWSTR lpszValue, LPDWORD pwType, LPVOID pvData, LPDWORD pcbData)
Definition: reg.c:1236
LPWSTR WINAPI StrFormatByteSizeW(LONGLONG llBytes, LPWSTR lpszDest, UINT cchMax)
Definition: string.c:2388
#define pt(x, y)
Definition: drawing.c:79
static VOID BitBlt(_In_ ULONG Left, _In_ ULONG Top, _In_ ULONG Width, _In_ ULONG Height, _In_reads_bytes_(Delta *Height) PUCHAR Buffer, _In_ ULONG BitsPerPixel, _In_ ULONG Delta)
Definition: common.c:57
#define RGB(r, g, b)
Definition: precomp.h:71
#define GetBValue(quad)
Definition: precomp.h:75
#define GetGValue(quad)
Definition: precomp.h:74
#define GetRValue(quad)
Definition: precomp.h:73
static IShellFolder IShellItem **static IBindCtx LPITEMIDLIST SFGAOF
Definition: ebrowser.c:83
POINTL point
Definition: edittest.c:50
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
unsigned short WORD
Definition: ntddk_ex.h:93
FxAutoRegKey hKey
pKey DeleteObject()
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLint GLint GLsizei width
Definition: gl.h:1546
GLenum GLint GLuint mask
Definition: glext.h:6028
GLenum mode
Definition: glext.h:6217
GLenum const GLfloat * params
Definition: glext.h:5645
GLbitfield flags
Definition: glext.h:7161
GLuint64EXT * result
Definition: glext.h:11304
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint GLenum GLenum GLenum GLint GLuint GLenum GLenum GLfloat GLenum GLfloat GLenum map
Definition: glfuncs.h:262
HLOCAL NTAPI LocalAlloc(UINT uFlags, SIZE_T dwBytes)
Definition: heapmem.c:1390
#define _(X)
Definition: i386-dis.c:35
BOOL WINAPI Shell_GetImageLists(HIMAGELIST *lpBigList, HIMAGELIST *lpSmallList)
Definition: iconcache.cpp:683
int WINAPI SHMapPIDLToSystemImageListIndex(IShellFolder *sh, LPCITEMIDLIST pidl, int *pIndex)
Definition: iconcache.cpp:766
#define UINT_MAX
Definition: limits.h:41
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
const DWORD DROPEFFECT_NONE
Definition: oleidl.idl:929
const DWORD DROPEFFECT_MOVE
Definition: oleidl.idl:931
DWORD SV3CVW3_FLAGS
Definition: shobjidl.idl:836
@ SVUIA_DEACTIVATE
Definition: shobjidl.idl:748
@ SVUIA_ACTIVATE_FOCUS
Definition: shobjidl.idl:750
@ SVUIA_ACTIVATE_NOFOCUS
Definition: shobjidl.idl:749
UINT SVSIF
Definition: shobjidl.idl:734
@ SVGIO_SELECTION
Definition: shobjidl.idl:739
@ SVGIO_BACKGROUND
Definition: shobjidl.idl:738
ULONG AddRef()
HRESULT QueryInterface([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
ULONG Release()
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
#define debugstr_guid
Definition: kernel32.h:35
#define debugstr_w
Definition: kernel32.h:32
#define BEGIN_COM_MAP(x)
Definition: atlcom.h:581
#define COM_INTERFACE_ENTRY_IID(iid, x)
Definition: atlcom.h:601
#define END_COM_MAP()
Definition: atlcom.h:592
#define MESSAGE_HANDLER(msg, func)
Definition: atlwin.h:1926
#define BEGIN_MSG_MAP(theClass)
Definition: atlwin.h:1898
#define END_MSG_MAP()
Definition: atlwin.h:1917
GLint dy
Definition: linetemp.h:97
GLint y0
Definition: linetemp.h:96
if(dx< 0)
Definition: linetemp.h:194
GLint x0
Definition: linetemp.h:95
GLint dx
Definition: linetemp.h:97
int WINAPI lstrcmpiW(LPCWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:194
#define error(str)
Definition: mkdosfs.c:1605
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define ASSERT(a)
Definition: mode.c:44
static PVOID ptr
Definition: dispmode.c:27
static HBITMAP
Definition: button.c:44
static HDC
Definition: imagelist.c:92
static HICON
Definition: imagelist.c:84
HRESULT hres
Definition: protocol.c:465
static const WCHAR sd[]
Definition: suminfo.c:286
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 int int const SCRIPT_CONTROL const SCRIPT_STATE SCRIPT_ITEM ULONG int * pcItems
Definition: usp10.c:62
WORD unused[29]
Definition: crypt.c:1155
_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 BOOL
Definition: nt_native.h:43
#define KEY_READ
Definition: nt_native.h:1023
#define DWORD
Definition: nt_native.h:44
_In_ HBITMAP hbm
Definition: ntgdi.h:2776
_Out_ LPRECT prc
Definition: ntgdi.h:1658
#define L(x)
Definition: ntvdm.h:50
#define V_VT(A)
Definition: oleauto.h:211
#define V_I4(A)
Definition: oleauto.h:247
#define V_INTREF(A)
Definition: oleauto.h:252
const GUID IID_IViewObject
const GUID IID_IDispatch
static TCHAR * items[]
Definition: page1.c:45
#define LOWORD(l)
Definition: pedump.c:82
#define WS_CHILD
Definition: pedump.c:617
#define WS_TABSTOP
Definition: pedump.c:634
#define WS_VISIBLE
Definition: pedump.c:620
short SHORT
Definition: pedump.c:59
long LONG
Definition: pedump.c:60
#define WS_CHILDWINDOW
Definition: pedump.c:639
#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:938
LPITEMIDLIST WINAPI ILFindLastID(LPCITEMIDLIST pidl)
Definition: pidl.c:198
BOOL WINAPI ILIsParent(LPCITEMIDLIST pidlParent, LPCITEMIDLIST pidlChild, BOOL bImmediate)
Definition: pidl.c:605
LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: pidl.c:712
BOOL WINAPI ILRemoveLastID(LPITEMIDLIST pidl)
Definition: pidl.c:221
DWORD _ILGetFileSize(LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize)
Definition: pidl.c:2510
BOOL _ILIsFolder(LPCITEMIDLIST pidl)
Definition: pidl.c:2020
BOOL _ILIsBitBucket(LPCITEMIDLIST pidl)
Definition: pidl.c:1986
BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath)
Definition: pidl.c:1353
BOOL _ILIsNetHood(LPCITEMIDLIST pidl)
Definition: pidl.c:1953
BOOL _ILIsControlPanel(LPCITEMIDLIST pidl)
Definition: pidl.c:1964
BOOL WINAPI ILIsEqual(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: pidl.c:548
BOOL(CALLBACK * LPFNADDPROPSHEETPAGE)(HPROPSHEETPAGE, LPARAM)
Definition: prsht.h:327
#define LVIR_ICON
Definition: commctrl.h:2473
#define NM_RELEASEDCAPTURE
Definition: commctrl.h:141
#define Header_GetItem(hwndHD, i, phdi)
Definition: commctrl.h:751
#define LVSIL_SMALL
Definition: commctrl.h:2299
#define I_IMAGECALLBACK
Definition: commctrl.h:2385
#define LVN_GETDISPINFOA
Definition: commctrl.h:3153
#define LVS_EX_ONECLICKACTIVATE
Definition: commctrl.h:2735
#define ListView_GetItemRect(hwnd, i, prc, code)
Definition: commctrl.h:2478
#define LVS_SINGLESEL
Definition: commctrl.h:2266
#define LVS_ICON
Definition: commctrl.h:2261
#define LVS_SHAREIMAGELISTS
Definition: commctrl.h:2270
#define LVN_BEGINRDRAG
Definition: commctrl.h:3141
#define LVN_COLUMNCLICK
Definition: commctrl.h:3139
#define LVS_NOCOLUMNHEADER
Definition: commctrl.h:2284
#define NM_DBLCLK
Definition: commctrl.h:131
#define LVM_GETHEADER
Definition: commctrl.h:2650
#define LPSTR_TEXTCALLBACKW
Definition: commctrl.h:2380
#define LVIF_STATE
Definition: commctrl.h:2312
#define LVS_EX_SNAPTOGRID
Definition: commctrl.h:2748
#define Header_SetItem(hwndHD, i, phdi)
Definition: commctrl.h:758
#define LVS_TYPEMASK
Definition: commctrl.h:2265
#define LVNI_SELECTED
Definition: commctrl.h:2424
#define LVHT_ONITEM
Definition: commctrl.h:2497
#define CLR_NONE
Definition: commctrl.h:319
#define LVS_SHOWSELALWAYS
Definition: commctrl.h:2267
#define LVS_REPORT
Definition: commctrl.h:2262
#define LVS_SMALLICON
Definition: commctrl.h:2263
#define LVN_DELETEALLITEMS
Definition: commctrl.h:3134
#define LVM_SETCALLBACKMASK
Definition: commctrl.h:2419
#define LVA_DEFAULT
Definition: commctrl.h:2527
#define LVM_GETEDITCONTROL
Definition: commctrl.h:2542
#define CDRF_DODEFAULT
Definition: commctrl.h:268
#define TB_CHECKBUTTON
Definition: commctrl.h:1043
#define LVNI_FOCUSED
Definition: commctrl.h:2423
#define LVN_INSERTITEM
Definition: commctrl.h:3132
#define LVS_ALIGNTOP
Definition: commctrl.h:2279
#define HDN_ENDTRACKW
Definition: commctrl.h:850
#define NM_CLICK
Definition: commctrl.h:130
#define LVN_BEGINDRAG
Definition: commctrl.h:3140
#define LVS_EX_FULLROWSELECT
Definition: commctrl.h:2734
#define NM_KILLFOCUS
Definition: commctrl.h:136
#define SB_SETICON
Definition: commctrl.h:1961
#define LVS_EX_TRACKSELECT
Definition: commctrl.h:2732
#define HDF_SORTUP
Definition: commctrl.h:724
#define ListView_GetOrigin(hwndLV, ppt)
Definition: commctrl.h:2669
#define NM_CUSTOMDRAW
Definition: commctrl.h:137
#define LVN_ENDLABELEDITW
Definition: commctrl.h:3138
#define TB_ENABLEBUTTON
Definition: commctrl.h:1042
#define LVIS_SELECTED
Definition: commctrl.h:2319
#define LVN_BEGINLABELEDITW
Definition: commctrl.h:3136
#define LVITEM
Definition: commctrl.h:2375
#define NM_RETURN
Definition: commctrl.h:132
#define LVIF_PARAM
Definition: commctrl.h:2311
#define HDI_FORMAT
Definition: commctrl.h:705
struct tagNMLISTVIEW * LPNMLISTVIEW
#define LVM_GETITEMRECT
Definition: commctrl.h:2477
#define LVS_NOSORTHEADER
Definition: commctrl.h:2285
#define LVS_EDITLABELS
Definition: commctrl.h:2273
#define LVIF_TEXT
Definition: commctrl.h:2309
#define LVIR_SELECTBOUNDS
Definition: commctrl.h:2475
#define LVM_GETEXTENDEDLISTVIEWSTYLE
Definition: commctrl.h:2727
#define LVA_SNAPTOGRID
Definition: commctrl.h:2530
#define NM_RCLICK
Definition: commctrl.h:133
#define NM_SETFOCUS
Definition: commctrl.h:135
#define LV_HITTESTINFO
Definition: commctrl.h:2504
#define SB_SETTEXT
Definition: commctrl.h:1949
#define SB_SETPARTS
Definition: commctrl.h:1954
#define LVN_GETDISPINFOW
Definition: commctrl.h:3154
#define LVS_EX_DOUBLEBUFFER
Definition: commctrl.h:2745
#define LVIF_IMAGE
Definition: commctrl.h:2310
#define LVS_ALIGNLEFT
Definition: commctrl.h:2280
#define ListView_GetItemSpacing(hwndLV, fSmall)
Definition: commctrl.h:2712
#define LVN_ITEMCHANGED
Definition: commctrl.h:3131
#define LVIF_DI_SETITEM
Definition: commctrl.h:3166
#define LVN_DELETEITEM
Definition: commctrl.h:3133
#define HDITEM
Definition: commctrl.h:697
#define LVIS_FOCUSED
Definition: commctrl.h:2318
#define HDF_SORTDOWN
Definition: commctrl.h:725
#define LVS_AUTOARRANGE
Definition: commctrl.h:2272
#define LVS_LIST
Definition: commctrl.h:2264
#define LVN_ITEMACTIVATE
Definition: commctrl.h:3147
#define LVSIL_NORMAL
Definition: commctrl.h:2298
#define LVIS_CUT
Definition: commctrl.h:2320
#define LVNI_ALL
Definition: commctrl.h:2422
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
#define REFIID
Definition: guiddef.h:118
#define IsEqualCLSID(rclsid1, rclsid2)
Definition: guiddef.h:96
void redraw(int x, int y, int cx, int cy)
Definition: qtewin.cpp:1248
#define EM_SCROLLCARET
Definition: richedit.h:81
#define WM_CONTEXTMENU
Definition: richedit.h:64
#define WM_PRINTCLIENT
Definition: richedit.h:70
#define WM_NOTIFY
Definition: richedit.h:61
HRESULT WINAPI SHForwardContextMenuMsg(IUnknown *pUnk, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *pResult, BOOL useIContextMenu2)
Definition: rosordinal.c:11
static HWND hEdit
Definition: autocomplete.c:34
HRESULT WINAPI SHLimitInputEdit(HWND hWnd, IShellFolder *psf)
Definition: shellord.c:2826
BOOL WINAPI StrRetToStrNW(LPWSTR dest, DWORD len, LPSTRRET src, const ITEMIDLIST *pidl)
Definition: shellstring.c:85
BOOL WINAPI StrRetToStrNA(LPSTR dest, DWORD len, LPSTRRET src, const ITEMIDLIST *pidl)
Definition: shellstring.c:54
HRESULT hr
Definition: shlfolder.c:183
#define SID_IFolderView
#define SID_IShellBrowser
UINT WINAPI Shell_MergeMenus(HMENU hmDst, HMENU hmSrc, UINT uInsert, UINT uIDAdjust, UINT uIDAdjustMax, ULONG uFlags)
Definition: shlmenu.c:856
#define FCIDM_BROWSERLAST
Definition: shlobj.h:616
#define CSIDL_COMMON_DESKTOPDIRECTORY
Definition: shlobj.h:2182
#define SHCNE_DRIVEREMOVED
Definition: shlobj.h:1882
#define CSIDL_DESKTOPDIRECTORY
Definition: shlobj.h:2173
#define SHCNE_RMDIR
Definition: shlobj.h:1879
#define SFVM_DEFVIEWMODE
Definition: shlobj.h:1311
#define SHCNE_DELETE
Definition: shlobj.h:1877
#define SHCNE_MKDIR
Definition: shlobj.h:1878
#define SFVM_WINDOWCREATED
Definition: shlobj.h:1301
#define SHCNE_UPDATEITEM
Definition: shlobj.h:1888
#define SHCNE_RENAMEITEM
Definition: shlobj.h:1875
#define SHCNE_UPDATEDIR
Definition: shlobj.h:1887
#define SFVM_SIZE
Definition: shlobj.h:1330
#define SHCNE_CREATE
Definition: shlobj.h:1876
#define FCIDM_MENU_VIEW_SEP_OPTIONS
Definition: shlobj.h:626
#define SHCNE_RENAMEFOLDER
Definition: shlobj.h:1892
#define SHCNRF_NewDelivery
Definition: shlobj.h:1923
#define MM_SUBMENUSHAVEIDS
Definition: shlobj.h:2514
#define MM_DONTREMOVESEPS
Definition: shlobj.h:2515
#define SHCNRF_ShellLevel
Definition: shlobj.h:1921
#define FCIDM_MENU_FILE
Definition: shlobj.h:623
#define SHCNE_DRIVEADD
Definition: shlobj.h:1883
#define FCIDM_SHVIEWFIRST
Definition: shlobj.h:573
#define FCIDM_MENU_VIEW
Definition: shlobj.h:625
#define SHCNRF_InterruptLevel
Definition: shlobj.h:1920
#define SHCNE_ALLEVENTS
Definition: shlobj.h:1899
#define MM_ADDSEPARATOR
Definition: shlobj.h:2513
#define FCIDM_MENU_EDIT
Definition: shlobj.h:624
@ REST_NOVIEWCONTEXTMENU
Definition: shlobj.h:1654
#define FCIDM_SHVIEWLAST
Definition: shlobj.h:607
FOLDERFLAGS
Definition: shobjidl.idl:636
@ FWF_SNAPTOGRID
Definition: shobjidl.idl:639
@ FWF_AUTOARRANGE
Definition: shobjidl.idl:637
@ FWF_ALIGNLEFT
Definition: shobjidl.idl:648
@ FWF_NOSCROLL
Definition: shobjidl.idl:647
@ FWF_NOHEADERINALLVIEWS
Definition: shobjidl.idl:661
@ FWF_SINGLECLICKACTIVATE
Definition: shobjidl.idl:652
@ FWF_FULLROWSELECT
Definition: shobjidl.idl:658
@ FWF_NOCLIENTEDGE
Definition: shobjidl.idl:646
@ FWF_TRANSPARENT
Definition: shobjidl.idl:645
@ FWF_SINGLESEL
Definition: shobjidl.idl:643
@ FWF_NOCOLUMNHEADER
Definition: shobjidl.idl:660
@ FWF_DESKTOP
Definition: shobjidl.idl:642
LPARAM LPFNSVADDPROPSHEETPAGE
Definition: shobjidl.idl:117
FOLDERVIEWMODE
Definition: shobjidl.idl:672
@ FVM_SMALLICON
Definition: shobjidl.idl:676
@ FVM_AUTO
Definition: shobjidl.idl:673
@ FVM_LIST
Definition: shobjidl.idl:677
@ FVM_TILE
Definition: shobjidl.idl:680
@ FVM_THUMBNAIL
Definition: shobjidl.idl:679
@ FVM_LAST
Definition: shobjidl.idl:683
@ FVM_THUMBSTRIP
Definition: shobjidl.idl:681
@ FVM_ICON
Definition: shobjidl.idl:674
@ FVM_DETAILS
Definition: shobjidl.idl:678
@ FVM_FIRST
Definition: shobjidl.idl:675
DWORD WINAPI SHRestricted(RESTRICTIONS rest)
Definition: shpolicy.c:146
#define FCIDM_SHVIEW_AUTOARRANGE
Definition: shresdef.h:841
#define FCIDM_SHVIEW_SELECTALL
Definition: shresdef.h:833
#define IDS_OBJECTS_SELECTED
Definition: shresdef.h:281
#define FCIDM_SHVIEW_CUT
Definition: shresdef.h:826
#define FCIDM_SHVIEW_OPEN
Definition: shresdef.h:853
#define FCIDM_SHVIEW_LISTVIEW
Definition: shresdef.h:838
#define FCIDM_SHVIEW_UNDO
Definition: shresdef.h:829
#define FCIDM_SHVIEW_ALIGNTOGRID
Definition: shresdef.h:843
#define FCIDM_SHVIEW_COPY
Definition: shresdef.h:827
#define FCIDM_SHVIEW_BIGICON
Definition: shresdef.h:836
#define IDS_MYCOMPUTER
Definition: shresdef.h:277
#define FCIDM_SHVIEW_INSERTLINK
Definition: shresdef.h:830
#define FCIDM_SHVIEW_REFRESH
Definition: shresdef.h:851
#define IDI_SHELL_COMPUTER_DESKTOP
Definition: shresdef.h:645
#define FCIDM_SHVIEW_NEWFOLDER
Definition: shresdef.h:849
#define FCIDM_SHVIEW_SMALLICON
Definition: shresdef.h:837
#define FCIDM_TB_SMALLICON
Definition: shresdef.h:857
#define FCIDM_SHVIEW_PROPERTIES
Definition: shresdef.h:825
#define FCIDM_SHVIEW_SNAPTOGRID
Definition: shresdef.h:842
#define FCIDM_SHVIEW_VIEW
Definition: shresdef.h:823
#define FCIDM_SHVIEW_COPYTO
Definition: shresdef.h:831
#define FCIDM_SHVIEW_MOVETO
Definition: shresdef.h:832
#define FCIDM_SHVIEW_DELETE
Definition: shresdef.h:824
#define FCIDM_SHVIEW_RENAME
Definition: shresdef.h:846
#define IDS_OBJECTS
Definition: shresdef.h:280
#define FCIDM_TB_REPORTVIEW
Definition: shresdef.h:858
#define FCIDM_SHVIEW_REPORTVIEW
Definition: shresdef.h:839
#define IDA_SHELLVIEW
Definition: shresdef.h:26
#define FCIDM_SHVIEW_INVERTSELECTION
Definition: shresdef.h:834
#define FCIDM_SHVIEW_ARRANGE
Definition: shresdef.h:822
#define FCIDM_SHVIEW_INSERT
Definition: shresdef.h:828
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41
const PCUITEMID_CHILD * PCUITEMID_CHILD_ARRAY
Definition: shtypes.idl:71
const ITEMID_CHILD UNALIGNED * PCUITEMID_CHILD
Definition: shtypes.idl:70
const ITEMIDLIST_RELATIVE UNALIGNED * PCUIDLIST_RELATIVE
Definition: shtypes.idl:57
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
Definition: shtypes.idl:42
HWND buttons[5]
Definition: sndrec32.cpp:40
#define _countof(array)
Definition: sndvol32.h:68
#define TRACE(s)
Definition: solgame.cpp:4
STRSAFEAPI StringCchPrintfW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszFormat,...)
Definition: strsafe.h:530
LPCFOLDERSETTINGS pfs
Definition: shobjidl.idl:796
SHELLVIEWID const * pvid
Definition: shobjidl.idl:799
IShellBrowser * psbOwner
Definition: shobjidl.idl:797
HMENU & m_hMenu
Definition: CDefView.cpp:76
CComPtr< IContextMenu > & m_pCM
Definition: CDefView.cpp:75
MenuCleanup(CComPtr< IContextMenu > &pCM, HMENU &menu)
Definition: CDefView.cpp:78
Definition: bl.h:1331
Definition: shlobj.h:1268
FOLDERVIEWMODE fvm
Definition: shlobj.h:1275
IShellView * psvOuter
Definition: shlobj.h:1271
LPFNVIEWCALLBACK pfnCallback
Definition: shlobj.h:1274
PCIDLIST_ABSOLUTE pidl
Definition: shlobj.h:1272
IShellFolder * pshf
Definition: shlobj.h:1270
Definition: dpa.c:49
Definition: scsiwmi.h:51
IShellFolderViewCB * psfvcb
Definition: shlobj.h:1351
IShellView * psvOuter
Definition: shlobj.h:1350
UINT cbSize
Definition: shlobj.h:1348
IShellFolder * pshf
Definition: shlobj.h:1349
PCIDLIST_ABSOLUTE pidl
Definition: shlobj.h:1871
LONG cx
Definition: kdterminal.h:27
LONG cy
Definition: kdterminal.h:28
Definition: pmap_prot.h:88
LVITEMW item
Definition: commctrl.h:3179
LVITEMA item
Definition: commctrl.h:3174
int cchTextMax
Definition: commctrl.h:2349
LPSTR pszText
Definition: commctrl.h:2348
LPWSTR pszText
Definition: commctrl.h:2365
int iSubItem
Definition: commctrl.h:2362
int cchTextMax
Definition: commctrl.h:2366
UINT state
Definition: commctrl.h:2363
UINT mask
Definition: commctrl.h:2360
LPARAM lParam
Definition: commctrl.h:2368
UINT stateMask
Definition: commctrl.h:2364
int iImage
Definition: commctrl.h:2367
UINT message
Definition: winuser.h:3115
WPARAM wParam
Definition: winuser.h:3116
UINT code
Definition: winuser.h:3159
LPARAM lParam
Definition: commctrl.h:3040
long y
Definition: polytest.cpp:48
long x
Definition: polytest.cpp:48
LONG right
Definition: windef.h:308
LONG bottom
Definition: windef.h:309
LONG top
Definition: windef.h:307
LONG left
Definition: windef.h:306
HANDLE lEvent
Definition: tftpd.cpp:56
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1829
unsigned char * LPBYTE
Definition: typedefs.h:53
PVOID HANDLE
Definition: typedefs.h:73
int32_t INT
Definition: typedefs.h:58
uint32_t ULONG_PTR
Definition: typedefs.h:65
uint32_t ULONG
Definition: typedefs.h:59
#define HIWORD(l)
Definition: typedefs.h:247
#define CWM_GETISHELLBROWSER
Definition: undocshell.h:204
BOOL WINAPI SetShellWindowEx(HWND, HWND)
Definition: ntwrapper.h:58
DWORD dwAttributes
Definition: vdmdbg.h:34
#define _T(x)
Definition: vfdio.h:22
view_type
int ret
_In_ WDFCOLLECTION _In_ WDFOBJECT Item
static HMENU hmenu
Definition: win.c:66
#define ZeroMemory
Definition: winbase.h:1712
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1176
_In_ void _In_ PCCERT_CONTEXT _In_opt_ LPFILETIME _In_ DWORD _In_ DWORD _Outptr_opt_ void ** ppvObject
Definition: wincrypt.h:6082
_In_ CLIPOBJ _In_ BRUSHOBJ _In_ LONG _In_ LONG y1
Definition: winddi.h:3709
_In_ CLIPOBJ _In_ BRUSHOBJ _In_ LONG x1
Definition: winddi.h:3708
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
LONG_PTR LPARAM
Definition: windef.h:208
LONG_PTR LRESULT
Definition: windef.h:209
UINT_PTR WPARAM
Definition: windef.h:207
DWORD COLORREF
Definition: windef.h:300
void * arg
Definition: msvc.h:10
#define WINAPI
Definition: msvc.h:6
#define GET_Y_LPARAM(lp)
Definition: windowsx.h:300
#define GET_X_LPARAM(lp)
Definition: windowsx.h:299
#define S_FALSE
Definition: winerror.h:2357
#define DRAGDROP_S_USEDEFAULTCURSORS
Definition: winerror.h:2648
#define DRAGDROP_S_DROP
Definition: winerror.h:2646
#define E_NOINTERFACE
Definition: winerror.h:2364
#define NOERROR
Definition: winerror.h:2354
#define DRAGDROP_S_CANCEL
Definition: winerror.h:2647
#define E_UNEXPECTED
Definition: winerror.h:2456
#define HRESULT_CODE(hr)
Definition: winerror.h:76
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1539
HDC WINAPI CreateCompatibleDC(_In_opt_ HDC hdc)
#define CLR_INVALID
Definition: wingdi.h:883
#define SRCCOPY
Definition: wingdi.h:333
int WINAPI FillRect(HDC, LPCRECT, HBRUSH)
#define GetObject
Definition: wingdi.h:4468
BOOL WINAPI DeleteDC(_In_ HDC)
#define HKEY_CURRENT_USER
Definition: winreg.h:11
HWND WINAPI GetFocus(void)
Definition: window.c:1893
#define WM_ERASEBKGND
Definition: winuser.h:1625
#define MK_RBUTTON
Definition: winuser.h:2368
DWORD WINAPI GetSysColor(_In_ int)
HMENU WINAPI CreatePopupMenu(void)
Definition: menu.c:838
UINT WINAPI GetMenuDefaultItem(_In_ HMENU hMenu, _In_ UINT fByPos, _In_ UINT gmdiFlags)
#define MF_BYCOMMAND
Definition: winuser.h:202
#define SB_LINEUP
Definition: winuser.h:564
#define WM_HSCROLL
Definition: winuser.h:1743
#define MIIM_ID
Definition: winuser.h:722
#define COLOR_WINDOW
Definition: winuser.h:918
int WINAPI GetMenuItemCount(_In_opt_ HMENU)
#define SPI_SETDESKWALLPAPER
Definition: winuser.h:1369
BOOL WINAPI PostMessageW(_In_opt_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define COLOR_WINDOWTEXT
Definition: winuser.h:921
#define WM_VSCROLL
Definition: winuser.h:1744
#define TPM_RIGHTBUTTON
Definition: winuser.h:2380
BOOL WINAPI GetWindowRect(_In_ HWND, _Out_ LPRECT)
#define WM_CREATE
Definition: winuser.h:1608
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
BOOL WINAPI SetWindowPos(_In_ HWND, _In_opt_ HWND, _In_ int, _In_ int, _In_ int, _In_ int, _In_ UINT)
#define WM_SIZE
Definition: winuser.h:1611
BOOL WINAPI InsertMenuW(_In_ HMENU, _In_ UINT, _In_ UINT, _In_ UINT_PTR, _In_opt_ LPCWSTR)
HBRUSH WINAPI GetSysColorBrush(_In_ int)
#define SB_VERT
Definition: winuser.h:553
HMENU WINAPI CreateMenu(void)
Definition: menu.c:829
#define SWP_NOMOVE
Definition: winuser.h:1244
#define WM_COMMAND
Definition: winuser.h:1740
#define MF_STRING
Definition: winuser.h:138
#define IDC_ARROW
Definition: winuser.h:687
#define WM_KEYFIRST
Definition: winuser.h:1714
#define VK_CONTROL
Definition: winuser.h:2203
#define WM_SETFOCUS
Definition: winuser.h:1613
BOOL WINAPI DeleteMenu(_In_ HMENU, _In_ UINT, _In_ UINT)
#define MF_CHECKED
Definition: winuser.h:132
#define SWP_NOSIZE
Definition: winuser.h:1245
UINT WINAPI GetMenuItemID(_In_ HMENU, _In_ int)
#define WM_SYSCOLORCHANGE
Definition: winuser.h:1626
BOOL WINAPI TrackPopupMenuEx(_In_ HMENU, _In_ UINT, _In_ int, _In_ int, _In_ HWND, _In_opt_ LPTPMPARAMS)
BOOL WINAPI ClientToScreen(_In_ HWND, _Inout_ LPPOINT)
#define MF_UNCHECKED
Definition: winuser.h:204
#define TPM_TOPALIGN
Definition: winuser.h:2383
#define WM_DRAWITEM
Definition: winuser.h:1645
DWORD WINAPI CheckMenuItem(_In_ HMENU, _In_ UINT, _In_ UINT)
#define WM_NCCREATE
Definition: winuser.h:1683
#define WM_ACTIVATE
Definition: winuser.h:1612
#define WM_SHOWWINDOW
Definition: winuser.h:1628
#define WM_SETTINGCHANGE
Definition: winuser.h:1629
BOOL WINAPI GetClientRect(_In_ HWND, _Out_ LPRECT)
#define HWND_TOP
Definition: winuser.h:1207
HMENU WINAPI GetSubMenu(_In_ HMENU, _In_ int)
#define MIIM_SUBMENU
Definition: winuser.h:723
#define WM_INITMENUPOPUP
Definition: winuser.h:1746
#define MF_ENABLED
Definition: winuser.h:128
#define MF_SEPARATOR
Definition: winuser.h:137
#define COLOR_DESKTOP
Definition: winuser.h:914
#define TPM_LEFTALIGN
Definition: winuser.h:2377
#define MF_BYPOSITION
Definition: winuser.h:203
struct tagNMHDR * LPNMHDR
#define SWP_SHOWWINDOW
Definition: winuser.h:1248
#define LoadCursor
Definition: winuser.h:5812
WNDCLASSEXA WNDCLASSEX
Definition: winuser.h:5719
#define SB_LINEDOWN
Definition: winuser.h:565
#define EM_SETSEL
Definition: winuser.h:2018
#define TPM_LEFTBUTTON
Definition: winuser.h:2379
#define WM_MEASUREITEM
Definition: winuser.h:1646
BOOL WINAPI CheckMenuRadioItem(_In_ HMENU, _In_ UINT, _In_ UINT, _In_ UINT, _In_ UINT)
#define MAKEINTRESOURCEA(i)
Definition: winuser.h:581
HACCEL WINAPI LoadAcceleratorsW(_In_opt_ HINSTANCE, _In_ LPCWSTR)
BOOL WINAPI DestroyMenu(_In_ HMENU)
BOOL WINAPI GetMenuItemInfoW(_In_ HMENU, _In_ UINT, _In_ BOOL, _Inout_ LPMENUITEMINFOW)
int WINAPI TranslateAcceleratorW(_In_ HWND, _In_ HACCEL, _In_ LPMSG)
#define MK_LBUTTON
Definition: winuser.h:2367
#define VK_SHIFT
Definition: winuser.h:2202
BOOL WINAPI TrackPopupMenu(_In_ HMENU, _In_ UINT, _In_ int, _In_ int, _Reserved_ int, _In_ HWND, _Reserved_ LPCRECT)
#define WM_DESTROY
Definition: winuser.h:1609
#define WS_EX_CLIENTEDGE
Definition: winuser.h:384
int WINAPI GetScrollPos(_In_ HWND, _In_ int)
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
HMENU WINAPI LoadMenuW(_In_opt_ HINSTANCE, _In_ LPCWSTR)
LRESULT(CALLBACK * WNDPROC)(HWND, UINT, WPARAM, LPARAM)
Definition: winuser.h:2906
#define TPM_RETURNCMD
Definition: winuser.h:2387
#define GWL_STYLE
Definition: winuser.h:852
#define CS_PARENTDC
Definition: winuser.h:656
#define TranslateAccelerator
Definition: winuser.h:5860
#define WM_KEYLAST
Definition: winuser.h:1728
BOOL WINAPI EnableMenuItem(_In_ HMENU, _In_ UINT, _In_ UINT)
#define WM_KILLFOCUS
Definition: winuser.h:1614
HICON WINAPI LoadIconW(_In_opt_ HINSTANCE hInstance, _In_ LPCWSTR lpIconName)
Definition: cursoricon.c:2075
BOOL WINAPI MoveWindow(_In_ HWND, _In_ int, _In_ int, _In_ int, _In_ int, _In_ BOOL)
#define WM_GETDLGCODE
Definition: winuser.h:1689
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define SB_HORZ
Definition: winuser.h:552
SHORT WINAPI GetKeyState(_In_ int)
#define MF_GRAYED
Definition: winuser.h:129
BOOL WINAPI ScreenToClient(_In_ HWND, _Inout_ LPPOINT)
static void Initialize()
Definition: xlate.c:212
#define IID_PPV_ARG(Itype, ppType)
#define IID_NULL_PPV_ARG(Itype, ppType)
const char * LPCSTR
Definition: xmlstorage.h:183
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184