4 * Copyright 1998,1999 <juergen.schmied@debitel.net>
6 * This is the view visualizing the data provided by the shellfolder.
7 * No direct access to data from pidls should be done from here.
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with this library; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
23 * FIXME: The order by part of the background context menu should be
24 * built according to the columns shown.
26 * FIXME: CheckToolbar: handle the "new folder" and "folder up" button
31 - Load/Save the view state from/into the stream provided by the ShellBrowser.
32 - Code to merge menus in the shellbrowser is incorrect.
33 - Move the background context menu creation into shell view. It should store the
34 shell view HWND to send commands.
35 - Shell view should do SetCommandTarget on internet toolbar.
36 - When editing starts on item, set edit text to for editing value.
37 - When shell view is called back for item info, let listview save the value.
38 - Fix shell view to handle view mode popup exec.
39 - The background context menu should have a pidl just like foreground menus. This
40 causes crashes when dynamic handlers try to use the NULL pidl.
41 - The SHELLDLL_DefView should not be filled with blue unconditionally. This causes
42 annoying flashing of blue even on XP, and is not correct.
43 - Reorder of columns doesn't work - might be bug in comctl32
51 WINE_DEFAULT_DEBUG_CHANNEL(shell
);
55 static const WCHAR SV_CLASS_NAME
[] = {'S', 'H', 'E', 'L', 'L', 'D', 'L', 'L', '_', 'D', 'e', 'f', 'V', 'i', 'e', 'w', 0};
62 } LISTVIEW_SORT_INFO
, *LPLISTVIEW_SORT_INFO
;
64 #define SHV_CHANGE_NOTIFY WM_USER + 0x1111
67 public CWindowImpl
<CDefView
, CWindow
, CControlWinTraits
>,
68 public CComObjectRootEx
<CComMultiThreadModelNoCS
>,
71 public IShellFolderView
,
72 public IOleCommandTarget
,
76 public IServiceProvider
79 CComPtr
<IShellFolder
> m_pSFParent
;
80 CComPtr
<IShellFolder2
> m_pSF2Parent
;
81 CComPtr
<IShellBrowser
> m_pShellBrowser
;
82 CComPtr
<ICommDlgBrowser
> m_pCommDlgBrowser
;
83 CComPtr
<IShellFolderViewDual
> m_pShellFolderViewDual
;
86 FOLDERSETTINGS m_FolderSettings
;
91 PCUITEMID_CHILD
*m_apidl
;
92 PIDLIST_ABSOLUTE m_pidlParent
;
93 LISTVIEW_SORT_INFO m_sortInfo
;
94 ULONG m_hNotify
; /* Change notification handle */
98 CComPtr
<IAdviseSink
> m_pAdvSink
;
100 CComPtr
<IDropTarget
> m_pCurDropTarget
; /* The sub-item, which is currently dragged over */
101 CComPtr
<IDataObject
> m_pCurDataObject
; /* The dragged data-object */
102 LONG m_iDragOverItem
; /* Dragged over item's index, iff m_pCurDropTarget != NULL */
103 UINT m_cScrollDelay
; /* Send a WM_*SCROLL msg every 250 ms during drag-scroll */
104 POINT m_ptLastMousePos
; /* Mouse position at last DragOver call */
106 CComPtr
<IContextMenu
> m_pCM
;
115 HRESULT
_MergeToolbar();
120 HRESULT WINAPI
Initialize(IShellFolder
*shellFolder
);
121 HRESULT
IncludeObject(PCUITEMID_CHILD pidl
);
122 HRESULT
OnDefaultCommand();
123 HRESULT
OnStateChange(UINT uFlags
);
124 void UpdateStatusbar();
126 void SetStyle(DWORD dwAdd
, DWORD dwRemove
);
128 void UpdateListColors();
130 static INT CALLBACK
ListViewCompareItems(LPARAM lParam1
, LPARAM lParam2
, LPARAM lpData
);
132 PCUITEMID_CHILD
_PidlByItem(int i
);
133 PCUITEMID_CHILD
_PidlByItem(LVITEM
& lvItem
);
134 int LV_FindItemByPidl(PCUITEMID_CHILD pidl
);
135 BOOLEAN
LV_AddItem(PCUITEMID_CHILD pidl
);
136 BOOLEAN
LV_DeleteItem(PCUITEMID_CHILD pidl
);
137 BOOLEAN
LV_RenameItem(PCUITEMID_CHILD pidlOld
, PCUITEMID_CHILD pidlNew
);
138 BOOLEAN
LV_ProdItem(PCUITEMID_CHILD pidl
);
139 static INT CALLBACK
fill_list(LPVOID ptr
, LPVOID arg
);
141 HMENU
BuildFileMenu();
142 void PrepareShowFileMenu(HMENU hSubMenu
);
143 void PrepareShowViewMenu(HMENU hSubMenu
);
144 UINT
GetSelections();
145 HRESULT
OpenSelectedItems();
147 void DoActivate(UINT uState
);
148 HRESULT
drag_notify_subitem(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
149 HRESULT
InvokeContextMenuCommand(UINT uCommand
);
150 LRESULT
OnExplorerCommand(UINT uCommand
, BOOL bUseSelection
);
152 // *** IOleWindow methods ***
153 virtual HRESULT STDMETHODCALLTYPE
GetWindow(HWND
*lphwnd
);
154 virtual HRESULT STDMETHODCALLTYPE
ContextSensitiveHelp(BOOL fEnterMode
);
156 // *** IShellView methods ***
157 virtual HRESULT STDMETHODCALLTYPE
TranslateAccelerator(MSG
*pmsg
);
158 virtual HRESULT STDMETHODCALLTYPE
EnableModeless(BOOL fEnable
);
159 virtual HRESULT STDMETHODCALLTYPE
UIActivate(UINT uState
);
160 virtual HRESULT STDMETHODCALLTYPE
Refresh();
161 virtual HRESULT STDMETHODCALLTYPE
CreateViewWindow(IShellView
*psvPrevious
, LPCFOLDERSETTINGS pfs
, IShellBrowser
*psb
, RECT
*prcView
, HWND
*phWnd
);
162 virtual HRESULT STDMETHODCALLTYPE
DestroyViewWindow();
163 virtual HRESULT STDMETHODCALLTYPE
GetCurrentInfo(LPFOLDERSETTINGS pfs
);
164 virtual HRESULT STDMETHODCALLTYPE
AddPropertySheetPages(DWORD dwReserved
, LPFNSVADDPROPSHEETPAGE pfn
, LPARAM lparam
);
165 virtual HRESULT STDMETHODCALLTYPE
SaveViewState();
166 virtual HRESULT STDMETHODCALLTYPE
SelectItem(PCUITEMID_CHILD pidlItem
, SVSIF uFlags
);
167 virtual HRESULT STDMETHODCALLTYPE
GetItemObject(UINT uItem
, REFIID riid
, void **ppv
);
169 // *** IShellView2 methods ***
170 virtual HRESULT STDMETHODCALLTYPE
GetView(SHELLVIEWID
*view_guid
, ULONG view_type
);
171 virtual HRESULT STDMETHODCALLTYPE
CreateViewWindow2(LPSV2CVW2_PARAMS view_params
);
172 virtual HRESULT STDMETHODCALLTYPE
HandleRename(LPCITEMIDLIST new_pidl
);
173 virtual HRESULT STDMETHODCALLTYPE
SelectAndPositionItem(LPCITEMIDLIST item
, UINT flags
, POINT
*point
);
175 // *** IFolderView methods ***
176 virtual HRESULT STDMETHODCALLTYPE
GetCurrentViewMode(UINT
*pViewMode
);
177 virtual HRESULT STDMETHODCALLTYPE
SetCurrentViewMode(UINT ViewMode
);
178 virtual HRESULT STDMETHODCALLTYPE
GetFolder(REFIID riid
, void **ppv
);
179 virtual HRESULT STDMETHODCALLTYPE
Item(int iItemIndex
, PITEMID_CHILD
*ppidl
);
180 virtual HRESULT STDMETHODCALLTYPE
ItemCount(UINT uFlags
, int *pcItems
);
181 virtual HRESULT STDMETHODCALLTYPE
Items(UINT uFlags
, REFIID riid
, void **ppv
);
182 virtual HRESULT STDMETHODCALLTYPE
GetSelectionMarkedItem(int *piItem
);
183 virtual HRESULT STDMETHODCALLTYPE
GetFocusedItem(int *piItem
);
184 virtual HRESULT STDMETHODCALLTYPE
GetItemPosition(PCUITEMID_CHILD pidl
, POINT
*ppt
);
185 virtual HRESULT STDMETHODCALLTYPE
GetSpacing(POINT
*ppt
);
186 virtual HRESULT STDMETHODCALLTYPE
GetDefaultSpacing(POINT
*ppt
);
187 virtual HRESULT STDMETHODCALLTYPE
GetAutoArrange();
188 virtual HRESULT STDMETHODCALLTYPE
SelectItem(int iItem
, DWORD dwFlags
);
189 virtual HRESULT STDMETHODCALLTYPE
SelectAndPositionItems(UINT cidl
, PCUITEMID_CHILD_ARRAY apidl
, POINT
*apt
, DWORD dwFlags
);
191 // *** IShellFolderView methods ***
192 virtual HRESULT STDMETHODCALLTYPE
Rearrange(LPARAM sort
);
193 virtual HRESULT STDMETHODCALLTYPE
GetArrangeParam(LPARAM
*sort
);
194 virtual HRESULT STDMETHODCALLTYPE
ArrangeGrid();
195 virtual HRESULT STDMETHODCALLTYPE
AutoArrange();
196 virtual HRESULT STDMETHODCALLTYPE
AddObject(PITEMID_CHILD pidl
, UINT
*item
);
197 virtual HRESULT STDMETHODCALLTYPE
GetObject(PITEMID_CHILD
*pidl
, UINT item
);
198 virtual HRESULT STDMETHODCALLTYPE
RemoveObject(PITEMID_CHILD pidl
, UINT
*item
);
199 virtual HRESULT STDMETHODCALLTYPE
GetObjectCount(UINT
*count
);
200 virtual HRESULT STDMETHODCALLTYPE
SetObjectCount(UINT count
, UINT flags
);
201 virtual HRESULT STDMETHODCALLTYPE
UpdateObject(PITEMID_CHILD pidl_old
, PITEMID_CHILD pidl_new
, UINT
*item
);
202 virtual HRESULT STDMETHODCALLTYPE
RefreshObject(PITEMID_CHILD pidl
, UINT
*item
);
203 virtual HRESULT STDMETHODCALLTYPE
SetRedraw(BOOL redraw
);
204 virtual HRESULT STDMETHODCALLTYPE
GetSelectedCount(UINT
*count
);
205 virtual HRESULT STDMETHODCALLTYPE
GetSelectedObjects(PCUITEMID_CHILD
**pidl
, UINT
*items
);
206 virtual HRESULT STDMETHODCALLTYPE
IsDropOnSource(IDropTarget
*drop_target
);
207 virtual HRESULT STDMETHODCALLTYPE
GetDragPoint(POINT
*pt
);
208 virtual HRESULT STDMETHODCALLTYPE
GetDropPoint(POINT
*pt
);
209 virtual HRESULT STDMETHODCALLTYPE
MoveIcons(IDataObject
*obj
);
210 virtual HRESULT STDMETHODCALLTYPE
SetItemPos(PCUITEMID_CHILD pidl
, POINT
*pt
);
211 virtual HRESULT STDMETHODCALLTYPE
IsBkDropTarget(IDropTarget
*drop_target
);
212 virtual HRESULT STDMETHODCALLTYPE
SetClipboard(BOOL move
);
213 virtual HRESULT STDMETHODCALLTYPE
SetPoints(IDataObject
*obj
);
214 virtual HRESULT STDMETHODCALLTYPE
GetItemSpacing(ITEMSPACING
*spacing
);
215 virtual HRESULT STDMETHODCALLTYPE
SetCallback(IShellFolderViewCB
*new_cb
, IShellFolderViewCB
**old_cb
);
216 virtual HRESULT STDMETHODCALLTYPE
Select(UINT flags
);
217 virtual HRESULT STDMETHODCALLTYPE
QuerySupport(UINT
*support
);
218 virtual HRESULT STDMETHODCALLTYPE
SetAutomationObject(IDispatch
*disp
);
220 // *** IOleCommandTarget methods ***
221 virtual HRESULT STDMETHODCALLTYPE
QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
, OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
);
222 virtual HRESULT STDMETHODCALLTYPE
Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
);
224 // *** IDropTarget methods ***
225 virtual HRESULT STDMETHODCALLTYPE
DragEnter(IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
226 virtual HRESULT STDMETHODCALLTYPE
DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
227 virtual HRESULT STDMETHODCALLTYPE
DragLeave();
228 virtual HRESULT STDMETHODCALLTYPE
Drop(IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
230 // *** IDropSource methods ***
231 virtual HRESULT STDMETHODCALLTYPE
QueryContinueDrag(BOOL fEscapePressed
, DWORD grfKeyState
);
232 virtual HRESULT STDMETHODCALLTYPE
GiveFeedback(DWORD dwEffect
);
234 // *** IViewObject methods ***
235 virtual HRESULT STDMETHODCALLTYPE
Draw(DWORD dwDrawAspect
, LONG lindex
, void *pvAspect
, DVTARGETDEVICE
*ptd
,
236 HDC hdcTargetDev
, HDC hdcDraw
, LPCRECTL lprcBounds
, LPCRECTL lprcWBounds
,
237 BOOL ( STDMETHODCALLTYPE
*pfnContinue
)(ULONG_PTR dwContinue
), ULONG_PTR dwContinue
);
238 virtual HRESULT STDMETHODCALLTYPE
GetColorSet(DWORD dwDrawAspect
, LONG lindex
, void *pvAspect
,
239 DVTARGETDEVICE
*ptd
, HDC hicTargetDev
, LOGPALETTE
**ppColorSet
);
240 virtual HRESULT STDMETHODCALLTYPE
Freeze(DWORD dwDrawAspect
, LONG lindex
, void *pvAspect
, DWORD
*pdwFreeze
);
241 virtual HRESULT STDMETHODCALLTYPE
Unfreeze(DWORD dwFreeze
);
242 virtual HRESULT STDMETHODCALLTYPE
SetAdvise(DWORD aspects
, DWORD advf
, IAdviseSink
*pAdvSink
);
243 virtual HRESULT STDMETHODCALLTYPE
GetAdvise(DWORD
*pAspects
, DWORD
*pAdvf
, IAdviseSink
**ppAdvSink
);
245 // *** IServiceProvider methods ***
246 virtual HRESULT STDMETHODCALLTYPE
QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
);
249 LRESULT
OnShowWindow(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
250 LRESULT
OnGetDlgCode(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
251 LRESULT
OnDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
252 LRESULT
OnEraseBackground(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
253 LRESULT
OnSysColorChange(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
254 LRESULT
OnGetShellBrowser(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
255 LRESULT
OnNCCreate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
256 LRESULT
OnNCDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
257 LRESULT
OnCreate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
258 LRESULT
OnContextMenu(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
259 LRESULT
OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
260 LRESULT
OnActivate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
261 LRESULT
OnSetFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
262 LRESULT
OnKillFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
263 LRESULT
OnCommand(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
264 LRESULT
OnNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
265 LRESULT
OnChangeNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
266 LRESULT
OnCustomItem(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
267 LRESULT
OnSettingChange(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
268 LRESULT
OnInitMenuPopup(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
270 static ATL::CWndClassInfo
& GetWndClassInfo()
272 static ATL::CWndClassInfo wc
=
274 { sizeof(WNDCLASSEX
), 0, StartWindowProc
,
276 LoadCursor(NULL
, IDC_ARROW
), (HBRUSH
)(COLOR_WINDOW
+ 1), NULL
, SV_CLASS_NAME
, NULL
278 NULL
, NULL
, IDC_ARROW
, TRUE
, 0, _T("")
283 virtual WNDPROC
GetWindowProc()
288 static LRESULT CALLBACK
WindowProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
293 // Must hold a reference during message handling
294 pThis
= reinterpret_cast<CDefView
*>(hWnd
);
296 result
= CWindowImpl
<CDefView
, CWindow
, CControlWinTraits
>::WindowProc(hWnd
, uMsg
, wParam
, lParam
);
301 BEGIN_MSG_MAP(CDefView
)
302 MESSAGE_HANDLER(WM_SIZE
, OnSize
)
303 MESSAGE_HANDLER(WM_SETFOCUS
, OnSetFocus
)
304 MESSAGE_HANDLER(WM_KILLFOCUS
, OnKillFocus
)
305 MESSAGE_HANDLER(WM_NCCREATE
, OnNCCreate
)
306 MESSAGE_HANDLER(WM_NCDESTROY
, OnNCDestroy
)
307 MESSAGE_HANDLER(WM_CREATE
, OnCreate
)
308 MESSAGE_HANDLER(WM_ACTIVATE
, OnActivate
)
309 MESSAGE_HANDLER(WM_NOTIFY
, OnNotify
)
310 MESSAGE_HANDLER(WM_COMMAND
, OnCommand
)
311 MESSAGE_HANDLER(SHV_CHANGE_NOTIFY
, OnChangeNotify
)
312 MESSAGE_HANDLER(WM_CONTEXTMENU
, OnContextMenu
)
313 MESSAGE_HANDLER(WM_DRAWITEM
, OnCustomItem
)
314 MESSAGE_HANDLER(WM_MEASUREITEM
, OnCustomItem
)
315 MESSAGE_HANDLER(WM_SHOWWINDOW
, OnShowWindow
)
316 MESSAGE_HANDLER(WM_GETDLGCODE
, OnGetDlgCode
)
317 MESSAGE_HANDLER(WM_DESTROY
, OnDestroy
)
318 MESSAGE_HANDLER(WM_ERASEBKGND
, OnEraseBackground
)
319 MESSAGE_HANDLER(WM_SYSCOLORCHANGE
, OnSysColorChange
)
320 MESSAGE_HANDLER(CWM_GETISHELLBROWSER
, OnGetShellBrowser
)
321 MESSAGE_HANDLER(WM_SETTINGCHANGE
, OnSettingChange
)
322 MESSAGE_HANDLER(WM_INITMENUPOPUP
, OnInitMenuPopup
)
325 BEGIN_COM_MAP(CDefView
)
326 // Windows returns E_NOINTERFACE for IOleWindow
327 // COM_INTERFACE_ENTRY_IID(IID_IOleWindow, IOleWindow)
328 COM_INTERFACE_ENTRY_IID(IID_IShellView
, IShellView
)
329 COM_INTERFACE_ENTRY_IID(IID_IShellView2
, IShellView2
)
330 COM_INTERFACE_ENTRY_IID(IID_IFolderView
, IFolderView
)
331 COM_INTERFACE_ENTRY_IID(IID_IShellFolderView
, IShellFolderView
)
332 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget
, IOleCommandTarget
)
333 COM_INTERFACE_ENTRY_IID(IID_IDropTarget
, IDropTarget
)
334 COM_INTERFACE_ENTRY_IID(IID_IDropSource
, IDropSource
)
335 COM_INTERFACE_ENTRY_IID(IID_IViewObject
, IViewObject
)
336 COM_INTERFACE_ENTRY_IID(IID_IServiceProvider
, IServiceProvider
)
341 #define IDM_VIEW_FILES (FCIDM_SHVIEWFIRST + 0x500)
342 #define IDM_VIEW_IDW (FCIDM_SHVIEWFIRST + 0x501)
343 #define IDM_MYFILEITEM (FCIDM_SHVIEWFIRST + 0x502)
345 #define ID_LISTVIEW 1
348 #define GET_WM_COMMAND_ID(wp, lp) LOWORD(wp)
349 #define GET_WM_COMMAND_HWND(wp, lp) (HWND)(lp)
350 #define GET_WM_COMMAND_CMD(wp, lp) HIWORD(wp)
352 typedef void (CALLBACK
*PFNSHGETSETTINGSPROC
)(LPSHELLFLAGSTATE lpsfs
, DWORD dwMask
);
354 CDefView::CDefView() :
358 m_menusLoaded(FALSE
),
373 ZeroMemory(&m_FolderSettings
, sizeof(m_FolderSettings
));
374 ZeroMemory(&m_sortInfo
, sizeof(m_sortInfo
));
375 ZeroMemory(&m_ptLastMousePos
, sizeof(m_ptLastMousePos
));
376 ZeroMemory(&m_Category
, sizeof(m_Category
));
379 CDefView::~CDefView()
381 TRACE(" destroying IShellView(%p)\n", this);
391 HRESULT WINAPI
CDefView::Initialize(IShellFolder
*shellFolder
)
393 m_pSFParent
= shellFolder
;
394 shellFolder
->QueryInterface(IID_PPV_ARG(IShellFolder2
, &m_pSF2Parent
));
399 /**********************************************************
401 * ##### helperfunctions for communication with ICommDlgBrowser #####
403 HRESULT
CDefView::IncludeObject(PCUITEMID_CHILD pidl
)
407 if (m_pCommDlgBrowser
.p
!= NULL
)
409 TRACE("ICommDlgBrowser::IncludeObject pidl=%p\n", pidl
);
410 ret
= m_pCommDlgBrowser
->IncludeObject(this, pidl
);
411 TRACE("--0x%08x\n", ret
);
417 HRESULT
CDefView::OnDefaultCommand()
419 HRESULT ret
= S_FALSE
;
421 if (m_pCommDlgBrowser
.p
!= NULL
)
423 TRACE("ICommDlgBrowser::OnDefaultCommand\n");
424 ret
= m_pCommDlgBrowser
->OnDefaultCommand(this);
425 TRACE("-- returns %08x\n", ret
);
431 HRESULT
CDefView::OnStateChange(UINT uFlags
)
433 HRESULT ret
= S_FALSE
;
435 if (m_pCommDlgBrowser
.p
!= NULL
)
437 TRACE("ICommDlgBrowser::OnStateChange flags=%x\n", uFlags
);
438 ret
= m_pCommDlgBrowser
->OnStateChange(this, uFlags
);
444 /**********************************************************
445 * set the toolbar of the filedialog buttons
447 * - activates the buttons from the shellbrowser according to
450 void CDefView::CheckToolbar()
456 if (m_pCommDlgBrowser
!= NULL
)
458 m_pShellBrowser
->SendControlMsg(FCW_TOOLBAR
, TB_CHECKBUTTON
,
459 FCIDM_TB_SMALLICON
, (m_FolderSettings
.ViewMode
== FVM_LIST
) ? TRUE
: FALSE
, &result
);
460 m_pShellBrowser
->SendControlMsg(FCW_TOOLBAR
, TB_CHECKBUTTON
,
461 FCIDM_TB_REPORTVIEW
, (m_FolderSettings
.ViewMode
== FVM_DETAILS
) ? TRUE
: FALSE
, &result
);
462 m_pShellBrowser
->SendControlMsg(FCW_TOOLBAR
, TB_ENABLEBUTTON
,
463 FCIDM_TB_SMALLICON
, TRUE
, &result
);
464 m_pShellBrowser
->SendControlMsg(FCW_TOOLBAR
, TB_ENABLEBUTTON
,
465 FCIDM_TB_REPORTVIEW
, TRUE
, &result
);
469 void CDefView::UpdateStatusbar()
471 WCHAR szFormat
[MAX_PATH
] = {0};
472 WCHAR szObjects
[MAX_PATH
] = {0};
475 cSelectedItems
= m_ListView
.GetSelectedCount();
478 LoadStringW(shell32_hInstance
, IDS_OBJECTS_SELECTED
, szFormat
, _countof(szFormat
));
479 StringCchPrintfW(szObjects
, MAX_PATH
, szFormat
, cSelectedItems
);
483 LoadStringW(shell32_hInstance
, IDS_OBJECTS
, szFormat
, _countof(szFormat
));
484 StringCchPrintfW(szObjects
, MAX_PATH
, szFormat
, m_ListView
.GetItemCount());
486 m_pShellBrowser
->SetStatusTextSB(szObjects
);
489 /**********************************************************
491 * ##### helperfunctions for initializing the view #####
493 /**********************************************************
494 * change the style of the listview control
496 void CDefView::SetStyle(DWORD dwAdd
, DWORD dwRemove
)
500 TRACE("(%p)\n", this);
502 tmpstyle
= ::GetWindowLongPtrW(m_ListView
, GWL_STYLE
);
503 ::SetWindowLongPtrW(m_ListView
, GWL_STYLE
, dwAdd
| (tmpstyle
& ~dwRemove
));
506 /**********************************************************
507 * ShellView_CreateList()
509 * - creates the list view window
511 BOOL
CDefView::CreateList()
513 DWORD dwStyle
, dwExStyle
;
517 dwStyle
= WS_TABSTOP
| WS_VISIBLE
| WS_CHILDWINDOW
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
|
518 LVS_SHAREIMAGELISTS
| LVS_EDITLABELS
| LVS_AUTOARRANGE
;
519 dwExStyle
= WS_EX_CLIENTEDGE
;
521 if (m_FolderSettings
.fFlags
& FWF_DESKTOP
)
522 dwStyle
|= LVS_ALIGNLEFT
;
524 dwStyle
|= LVS_ALIGNTOP
| LVS_SHOWSELALWAYS
;
526 switch (m_FolderSettings
.ViewMode
)
533 dwStyle
|= LVS_REPORT
;
537 dwStyle
|= LVS_SMALLICON
;
549 if (m_FolderSettings
.fFlags
& FWF_AUTOARRANGE
)
550 dwStyle
|= LVS_AUTOARRANGE
;
552 if (m_FolderSettings
.fFlags
& FWF_DESKTOP
)
553 m_FolderSettings
.fFlags
|= FWF_NOCLIENTEDGE
| FWF_NOSCROLL
;
555 if (m_FolderSettings
.fFlags
& FWF_SINGLESEL
)
556 dwStyle
|= LVS_SINGLESEL
;
558 if (m_FolderSettings
.fFlags
& FWF_NOCLIENTEDGE
)
559 dwExStyle
&= ~WS_EX_CLIENTEDGE
;
561 RECT rcListView
= {0,0,0,0};
562 m_ListView
.Create(m_hWnd
, rcListView
, L
"FolderView", dwStyle
, dwExStyle
, ID_LISTVIEW
);
567 m_sortInfo
.bIsAscending
= TRUE
;
568 m_sortInfo
.nHeaderID
= -1;
569 m_sortInfo
.nLastHeaderID
= -1;
573 /* UpdateShellSettings(); */
577 void CDefView::UpdateListColors()
579 if (m_FolderSettings
.fFlags
& FWF_DESKTOP
)
581 /* Check if drop shadows option is enabled */
582 BOOL bDropShadow
= FALSE
;
583 DWORD cbDropShadow
= sizeof(bDropShadow
);
586 * The desktop ListView always take the default desktop colours, by
587 * remaining transparent and letting user32/win32k paint itself the
588 * desktop background color, if any.
590 m_ListView
.SetBkColor(CLR_NONE
);
592 RegGetValueW(HKEY_CURRENT_USER
, L
"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced",
593 L
"ListviewShadow", RRF_RT_DWORD
, NULL
, &bDropShadow
, &cbDropShadow
);
596 /* Set the icon background transparent */
597 m_ListView
.SetTextBkColor(CLR_NONE
);
598 m_ListView
.SetTextColor(RGB(255, 255, 255));
599 m_ListView
.SetExtendedListViewStyle(LVS_EX_TRANSPARENTSHADOWTEXT
, LVS_EX_TRANSPARENTSHADOWTEXT
);
603 /* Set the icon background as the same colour as the desktop */
604 COLORREF crDesktop
= GetSysColor(COLOR_DESKTOP
);
605 m_ListView
.SetTextBkColor(crDesktop
);
606 if (GetRValue(crDesktop
) + GetGValue(crDesktop
) + GetBValue(crDesktop
) > 128 * 3)
607 m_ListView
.SetTextColor(RGB(0, 0, 0));
609 m_ListView
.SetTextColor(RGB(255, 255, 255));
610 m_ListView
.SetExtendedListViewStyle(0, LVS_EX_TRANSPARENTSHADOWTEXT
);
615 /**********************************************************
616 * ShellView_InitList()
618 * - adds all needed columns to the shellview
620 BOOL
CDefView::InitList()
624 HIMAGELIST big_icons
, small_icons
;
628 m_ListView
.DeleteAllItems();
632 for (int i
= 0; 1; i
++)
634 if (FAILED(m_pSF2Parent
->GetDetailsOf(NULL
, i
, &sd
)))
636 StrRetToStrNW( szTemp
, 50, &sd
.str
, NULL
);
637 m_ListView
.InsertColumn(i
, szTemp
, sd
.fmt
, sd
.cxChar
* 8);
646 Shell_GetImageLists(&big_icons
, &small_icons
);
647 m_ListView
.SetImageList(big_icons
, LVSIL_NORMAL
);
648 m_ListView
.SetImageList(small_icons
, LVSIL_SMALL
);
653 /*************************************************************************
654 * ShellView_ListViewCompareItems
656 * Compare Function for the Listview (FileOpen Dialog)
659 * lParam1 [I] the first ItemIdList to compare with
660 * lParam2 [I] the second ItemIdList to compare with
661 * lpData [I] The column ID for the header Ctrl to process
664 * A negative value if the first item should precede the second,
665 * a positive value if the first item should follow the second,
666 * or zero if the two items are equivalent
668 INT CALLBACK
CDefView::ListViewCompareItems(LPARAM lParam1
, LPARAM lParam2
, LPARAM lpData
)
670 PCUIDLIST_RELATIVE pidl1
= reinterpret_cast<PCUIDLIST_RELATIVE
>(lParam1
);
671 PCUIDLIST_RELATIVE pidl2
= reinterpret_cast<PCUIDLIST_RELATIVE
>(lParam2
);
672 CDefView
*pThis
= reinterpret_cast<CDefView
*>(lpData
);
674 HRESULT hres
= pThis
->m_pSFParent
->CompareIDs(pThis
->m_sortInfo
.nHeaderID
, pidl1
, pidl2
);
675 if (FAILED_UNEXPECTEDLY(hres
))
678 SHORT nDiff
= HRESULT_CODE(hres
);
679 if (!pThis
->m_sortInfo
.bIsAscending
)
684 PCUITEMID_CHILD
CDefView::_PidlByItem(int i
)
686 return reinterpret_cast<PCUITEMID_CHILD
>(m_ListView
.GetItemData(i
));
689 PCUITEMID_CHILD
CDefView::_PidlByItem(LVITEM
& lvItem
)
691 return reinterpret_cast<PCUITEMID_CHILD
>(lvItem
.lParam
);
694 /**********************************************************
695 * LV_FindItemByPidl()
697 int CDefView::LV_FindItemByPidl(PCUITEMID_CHILD pidl
)
699 int cItems
= m_ListView
.GetItemCount();
701 for (int i
= 0; i
<cItems
; i
++)
703 PCUITEMID_CHILD currentpidl
= _PidlByItem(i
);
704 HRESULT hr
= m_pSFParent
->CompareIDs(0, pidl
, currentpidl
);
706 if (SUCCEEDED(hr
) && !HRESULT_CODE(hr
))
714 /**********************************************************
717 BOOLEAN
CDefView::LV_AddItem(PCUITEMID_CHILD pidl
)
721 TRACE("(%p)(pidl=%p)\n", this, pidl
);
723 lvItem
.mask
= LVIF_TEXT
| LVIF_IMAGE
| LVIF_PARAM
; /*set the mask*/
724 lvItem
.iItem
= m_ListView
.GetItemCount(); /*add the item to the end of the list*/
726 lvItem
.lParam
= reinterpret_cast<LPARAM
>(ILClone(pidl
)); /*set the item's data*/
727 lvItem
.pszText
= LPSTR_TEXTCALLBACKW
; /*get text on a callback basis*/
728 lvItem
.iImage
= I_IMAGECALLBACK
; /*get the image on a callback basis*/
729 lvItem
.stateMask
= LVIS_CUT
;
731 if (m_ListView
.InsertItem(&lvItem
) == -1)
737 /**********************************************************
740 BOOLEAN
CDefView::LV_DeleteItem(PCUITEMID_CHILD pidl
)
744 TRACE("(%p)(pidl=%p)\n", this, pidl
);
746 nIndex
= LV_FindItemByPidl(pidl
);
748 return (-1 == m_ListView
.DeleteItem(nIndex
)) ? FALSE
: TRUE
;
751 /**********************************************************
754 BOOLEAN
CDefView::LV_RenameItem(PCUITEMID_CHILD pidlOld
, PCUITEMID_CHILD pidlNew
)
759 TRACE("(%p)(pidlold=%p pidlnew=%p)\n", this, pidlOld
, pidlNew
);
761 nItem
= LV_FindItemByPidl(pidlOld
);
765 lvItem
.mask
= LVIF_PARAM
; /* only the pidl */
766 lvItem
.iItem
= nItem
;
768 m_ListView
.GetItem(&lvItem
);
770 SHFree(reinterpret_cast<LPVOID
>(lvItem
.lParam
));
771 lvItem
.mask
= LVIF_PARAM
|LVIF_IMAGE
;
772 lvItem
.iItem
= nItem
;
774 lvItem
.lParam
= reinterpret_cast<LPARAM
>(ILClone(pidlNew
)); /* set the item's data */
775 lvItem
.iImage
= SHMapPIDLToSystemImageListIndex(m_pSFParent
, pidlNew
, 0);
776 m_ListView
.SetItem(&lvItem
);
777 m_ListView
.Update(nItem
);
778 return TRUE
; /* FIXME: better handling */
784 /**********************************************************
787 BOOLEAN
CDefView::LV_ProdItem(PCUITEMID_CHILD pidl
)
792 TRACE("(%p)(pidl=%p)\n", this, pidl
);
794 nItem
= LV_FindItemByPidl(pidl
);
798 lvItem
.mask
= LVIF_IMAGE
;
799 lvItem
.iItem
= nItem
;
801 lvItem
.iImage
= SHMapPIDLToSystemImageListIndex(m_pSFParent
, pidl
, 0);
802 m_ListView
.SetItem(&lvItem
);
803 m_ListView
.Update(nItem
);
810 /**********************************************************
811 * ShellView_FillList()
813 * - gets the objectlist from the shellfolder
815 * - fills the list into the view
817 INT CALLBACK
CDefView::fill_list(LPVOID ptr
, LPVOID arg
)
819 PITEMID_CHILD pidl
= static_cast<PITEMID_CHILD
>(ptr
);
820 CDefView
*pThis
= static_cast<CDefView
*>(arg
);
822 /* in a commdlg This works as a filemask*/
823 if (pThis
->IncludeObject(pidl
) == S_OK
)
824 pThis
->LV_AddItem(pidl
);
830 HRESULT
CDefView::FillList()
832 CComPtr
<IEnumIDList
> pEnumIDList
;
838 DWORD dFlags
= SHCONTF_NONFOLDERS
| SHCONTF_FOLDERS
;
842 /* determine if there is a setting to show all the hidden files/folders */
843 if (RegOpenKeyExW(HKEY_CURRENT_USER
, L
"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced", 0, KEY_QUERY_VALUE
, &hKey
) == ERROR_SUCCESS
)
845 DWORD dataLength
, flagVal
;
847 dataLength
= sizeof(flagVal
);
848 if (RegQueryValueExW(hKey
, L
"Hidden", NULL
, NULL
, (LPBYTE
)&flagVal
, &dataLength
) == ERROR_SUCCESS
)
850 /* if the value is 1, then show all hidden files/folders */
853 dFlags
|= SHCONTF_INCLUDEHIDDEN
;
854 m_ListView
.SendMessageW(LVM_SETCALLBACKMASK
, LVIS_CUT
, 0);
862 /* get the itemlist from the shfolder */
863 hRes
= m_pSFParent
->EnumObjects(m_hWnd
, dFlags
, &pEnumIDList
);
871 /* create a pointer array */
872 hdpa
= DPA_Create(16);
875 return(E_OUTOFMEMORY
);
878 /* copy the items into the array*/
879 while((S_OK
== pEnumIDList
->Next(1, &pidl
, &dwFetched
)) && dwFetched
)
881 if (DPA_InsertPtr(hdpa
, 0x7fff, pidl
) == -1)
887 /*turn the listview's redrawing off*/
888 m_ListView
.SetRedraw(FALSE
);
890 DPA_DestroyCallback( hdpa
, fill_list
, this);
893 m_pSF2Parent
->GetDefaultColumn(NULL
, (ULONG
*)&m_sortInfo
.nHeaderID
, NULL
);
894 m_sortInfo
.bIsAscending
= TRUE
;
895 m_sortInfo
.nLastHeaderID
= m_sortInfo
.nHeaderID
;
896 m_ListView
.SortItems(ListViewCompareItems
, this);
898 /*turn the listview's redrawing back on and force it to draw*/
899 m_ListView
.SetRedraw(TRUE
);
904 LRESULT
CDefView::OnShowWindow(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
906 m_ListView
.UpdateWindow();
911 LRESULT
CDefView::OnGetDlgCode(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
913 return m_ListView
.SendMessageW(uMsg
, 0, 0);
916 LRESULT
CDefView::OnDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
923 DestroyMenu(m_hMenu
);
926 RevokeDragDrop(m_hWnd
);
927 SHChangeNotifyDeregister(m_hNotify
);
929 SHFree(m_pidlParent
);
936 LRESULT
CDefView::OnEraseBackground(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
938 /* redirect to parent */
939 if (m_FolderSettings
.fFlags
& (FWF_DESKTOP
| FWF_TRANSPARENT
))
940 return SendMessageW(GetParent(), WM_ERASEBKGND
, wParam
, lParam
);
946 LRESULT
CDefView::OnSysColorChange(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
948 /* Update desktop labels color */
951 /* Forward WM_SYSCOLORCHANGE to common controls */
952 return m_ListView
.SendMessageW(uMsg
, 0, 0);
955 LRESULT
CDefView::OnGetShellBrowser(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
957 return reinterpret_cast<LRESULT
>(m_pShellBrowser
.p
);
960 LRESULT
CDefView::OnNCCreate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
967 LRESULT
CDefView::OnNCDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
974 /**********************************************************
975 * ShellView_OnCreate()
977 LRESULT
CDefView::OnCreate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
979 CComPtr
<IDropTarget
> pdt
;
980 SHChangeNotifyEntry ntreg
;
981 CComPtr
<IPersistFolder2
> ppf2
;
993 if (SUCCEEDED(QueryInterface(IID_PPV_ARG(IDropTarget
, &pdt
))))
995 if (FAILED(RegisterDragDrop(m_hWnd
, pdt
)))
996 ERR("Registering Drag Drop Failed");
999 /* register for receiving notifications */
1000 m_pSFParent
->QueryInterface(IID_PPV_ARG(IPersistFolder2
, &ppf2
));
1003 ppf2
->GetCurFolder(&m_pidlParent
);
1004 ntreg
.fRecursive
= TRUE
;
1005 ntreg
.pidl
= m_pidlParent
;
1006 m_hNotify
= SHChangeNotifyRegister(m_hWnd
, SHCNRF_InterruptLevel
| SHCNRF_ShellLevel
, SHCNE_ALLEVENTS
, SHV_CHANGE_NOTIFY
, 1, &ntreg
);
1009 m_hAccel
= LoadAcceleratorsW(shell32_hInstance
, MAKEINTRESOURCEW(IDA_SHELLVIEW
));
1016 /**********************************************************
1017 * #### Handling of the menus ####
1020 HMENU
CDefView::BuildFileMenu()
1023 CComPtr
<IContextMenu
> cm
;
1027 hr
= m_pSFParent
->GetUIObjectOf(m_hWnd
, m_cidl
, m_apidl
, IID_NULL_PPV_ARG(IContextMenu
, &cm
));
1031 HMENU hmenu
= CreatePopupMenu();
1033 // FIXME: get proper numbers ?
1034 const UINT first
= 0x7800;
1035 const UINT last
= 0x7A00;
1036 hr
= cm
->QueryContextMenu(hmenu
, 0, first
, last
, 0);
1040 // TODO: filter or something
1045 void CDefView::PrepareShowFileMenu(HMENU hSubMenu
)
1047 TRACE("(%p)->(submenu=%p) stub\n", this, hSubMenu
);
1052 /* Cleanup the items added previously */
1053 for (int i
= 0; i
< GetMenuItemCount(hSubMenu
); )
1056 mii
.cbSize
= sizeof(mii
);
1057 mii
.fMask
= MIIM_ID
;
1058 GetMenuItemInfoW(hSubMenu
, i
, TRUE
, &mii
);
1060 if (mii
.wID
< 0x8000)
1062 DeleteMenu(hSubMenu
, i
, MF_BYPOSITION
);
1071 /* FIXME/TODO: Reenable when they implemented AND localizable (not hardcoded). */
1072 /* Insert This item at the beginning of the menu. */
1073 _InsertMenuItemW(hSubMenu
, 0, TRUE
, 0, MFT_SEPARATOR
, NULL
, MFS_ENABLED
);
1074 _InsertMenuItemW(hSubMenu
, 0, TRUE
, IDM_MYFILEITEM
+ 4, MFT_STRING
, L
"Properties", MFS_DISABLED
);
1075 _InsertMenuItemW(hSubMenu
, 0, TRUE
, IDM_MYFILEITEM
+ 3, MFT_STRING
, L
"Rename", MFS_DISABLED
);
1076 _InsertMenuItemW(hSubMenu
, 0, TRUE
, IDM_MYFILEITEM
+ 2, MFT_STRING
, L
"Delete", MFS_DISABLED
);
1077 _InsertMenuItemW(hSubMenu
, 0, TRUE
, IDM_MYFILEITEM
+ 1, MFT_STRING
, L
"Create Shortcut", MFS_DISABLED
);
1078 _InsertMenuItemW(hSubMenu
, 0, TRUE
, 0, MFT_SEPARATOR
, NULL
, MFS_ENABLED
);
1079 _InsertMenuItemW(hSubMenu
, 0, TRUE
, IDM_MYFILEITEM
, MFT_STRING
, L
"New", MFS_ENABLED
);
1082 HMENU menubase
= BuildFileMenu();
1085 int count
= ::GetMenuItemCount(menubase
);
1086 int count2
= ::GetMenuItemCount(hSubMenu
);
1088 if (count2
> 0 && count
> 0)
1090 _InsertMenuItemW(hSubMenu
, 0, TRUE
, 0, MFT_SEPARATOR
, NULL
, MFS_ENABLED
);
1093 for (int i
= count
-1; i
>= 0; i
--)
1097 MENUITEMINFOW mii
= { 0 };
1098 mii
.cbSize
= sizeof(mii
);
1099 mii
.fMask
= MIIM_STATE
| MIIM_ID
| MIIM_SUBMENU
| MIIM_CHECKMARKS
| MIIM_DATA
| MIIM_STRING
| MIIM_BITMAP
| MIIM_FTYPE
;
1100 mii
.dwTypeData
= label
;
1101 mii
.cch
= _countof(label
);
1102 ::GetMenuItemInfoW(menubase
, i
, TRUE
, &mii
);
1104 TRACE("Adding item %d label %S type %d\n", mii
.wID
, mii
.dwTypeData
, mii
.fType
);
1106 mii
.fType
|= MFT_RADIOCHECK
;
1108 ::InsertMenuItemW(hSubMenu
, 0, TRUE
, &mii
);
1112 ::DestroyMenu(menubase
);
1117 void CDefView::PrepareShowViewMenu(HMENU hSubMenu
)
1119 TRACE("(%p)->(submenu=%p)\n", this, hSubMenu
);
1124 if (m_FolderSettings
.ViewMode
>= FVM_FIRST
&& m_FolderSettings
.ViewMode
<= FVM_LAST
)
1126 UINT iItemFirst
= FCIDM_SHVIEW_BIGICON
;
1127 UINT iItemLast
= iItemFirst
+ FVM_LAST
- FVM_FIRST
;
1128 UINT iItem
= iItemFirst
+ m_FolderSettings
.ViewMode
- FVM_FIRST
;
1129 CheckMenuRadioItem(hSubMenu
, iItemFirst
, iItemLast
, iItem
, MF_BYCOMMAND
);
1133 /**********************************************************
1134 * ShellView_GetSelections()
1136 * - fills the m_apidl list with the selected objects
1139 * number of selected items
1141 UINT
CDefView::GetSelections()
1145 m_cidl
= m_ListView
.GetSelectedCount();
1146 m_apidl
= static_cast<PCUITEMID_CHILD
*>(SHAlloc(m_cidl
* sizeof(PCUITEMID_CHILD
)));
1153 TRACE("-- Items selected =%u\n", m_cidl
);
1157 while ((lvIndex
= m_ListView
.GetNextItem(lvIndex
, LVNI_SELECTED
)) > -1)
1159 m_apidl
[i
] = _PidlByItem(lvIndex
);
1163 TRACE("-- selected Item found\n");
1169 HRESULT
CDefView::InvokeContextMenuCommand(UINT uCommand
)
1171 CMINVOKECOMMANDINFO cmi
;
1173 ZeroMemory(&cmi
, sizeof(cmi
));
1174 cmi
.cbSize
= sizeof(cmi
);
1175 cmi
.lpVerb
= MAKEINTRESOURCEA(uCommand
);
1178 if (GetKeyState(VK_SHIFT
) & 0x8000)
1179 cmi
.fMask
|= CMIC_MASK_SHIFT_DOWN
;
1181 if (GetKeyState(VK_CONTROL
) & 0x8000)
1182 cmi
.fMask
|= CMIC_MASK_CONTROL_DOWN
;
1184 return m_pCM
->InvokeCommand(&cmi
);
1187 /**********************************************************
1188 * ShellView_OpenSelectedItems()
1190 HRESULT
CDefView::OpenSelectedItems()
1196 m_cidl
= m_ListView
.GetSelectedCount();
1200 hResult
= OnDefaultCommand();
1201 if (hResult
== S_OK
)
1204 hMenu
= CreatePopupMenu();
1208 hResult
= GetItemObject(SVGIO_SELECTION
, IID_PPV_ARG(IContextMenu
, &m_pCM
));
1209 if (FAILED(hResult
))
1212 hResult
= m_pCM
->QueryContextMenu(hMenu
, 0, 0x20, 0x7fff, CMF_DEFAULTONLY
);
1213 if (FAILED(hResult
))
1216 uCommand
= GetMenuDefaultItem(hMenu
, FALSE
, 0);
1217 if (uCommand
== (UINT
)-1)
1223 InvokeContextMenuCommand(uCommand
);
1236 /**********************************************************
1237 * ShellView_DoContextMenu()
1239 LRESULT
CDefView::OnContextMenu(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1246 // for some reason I haven't figured out, we sometimes recurse into this method
1253 TRACE("(%p)->(0x%08x 0x%08x) stub\n", this, x
, y
);
1255 hMenu
= CreatePopupMenu();
1259 m_cidl
= m_ListView
.GetSelectedCount();
1261 hResult
= GetItemObject( m_cidl
? SVGIO_SELECTION
: SVGIO_BACKGROUND
, IID_PPV_ARG(IContextMenu
, &m_pCM
));
1262 if (FAILED( hResult
))
1265 hResult
= m_pCM
->QueryContextMenu(hMenu
, 0, FCIDM_SHVIEWFIRST
, FCIDM_SHVIEWLAST
, CMF_NORMAL
);
1266 if (FAILED( hResult
))
1269 uCommand
= TrackPopupMenu(hMenu
,
1270 TPM_LEFTALIGN
| TPM_RETURNCMD
| TPM_LEFTBUTTON
| TPM_RIGHTBUTTON
,
1271 x
, y
, 0, m_hWnd
, NULL
);
1275 if (uCommand
== FCIDM_SHVIEW_OPEN
&& OnDefaultCommand() == S_OK
)
1278 InvokeContextMenuCommand(uCommand
);
1290 LRESULT
CDefView::OnExplorerCommand(UINT uCommand
, BOOL bUseSelection
)
1295 hMenu
= CreatePopupMenu();
1299 hResult
= GetItemObject( bUseSelection
? SVGIO_SELECTION
: SVGIO_BACKGROUND
, IID_PPV_ARG(IContextMenu
, &m_pCM
));
1300 if (FAILED( hResult
))
1303 hResult
= m_pCM
->QueryContextMenu(hMenu
, 0, FCIDM_SHVIEWFIRST
, FCIDM_SHVIEWLAST
, CMF_NORMAL
);
1304 if (FAILED( hResult
))
1307 InvokeContextMenuCommand(uCommand
);
1319 /**********************************************************
1320 * ##### message handling #####
1323 /**********************************************************
1324 * ShellView_OnSize()
1326 LRESULT
CDefView::OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1328 WORD wWidth
, wHeight
;
1330 wWidth
= LOWORD(lParam
);
1331 wHeight
= HIWORD(lParam
);
1333 TRACE("%p width=%u height=%u\n", this, wWidth
, wHeight
);
1335 /* Resize the ListView to fit our window */
1338 ::MoveWindow(m_ListView
, 0, 0, wWidth
, wHeight
, TRUE
);
1344 /**********************************************************
1345 * ShellView_OnDeactivate()
1350 void CDefView::OnDeactivate()
1352 TRACE("%p\n", this);
1354 if (m_uState
!= SVUIA_DEACTIVATE
)
1356 // TODO: cleanup menu after deactivation
1358 m_uState
= SVUIA_DEACTIVATE
;
1362 void CDefView::DoActivate(UINT uState
)
1364 TRACE("%p uState=%x\n", this, uState
);
1366 /*don't do anything if the state isn't really changing */
1367 if (m_uState
== uState
)
1372 if (uState
== SVUIA_DEACTIVATE
)
1382 MENUITEMINFOW mii
= { 0 };
1384 /* initialize EDIT menu */
1385 mii
.cbSize
= sizeof(mii
);
1386 mii
.fMask
= MIIM_SUBMENU
;
1387 if (::GetMenuItemInfoW(m_hMenu
, FCIDM_MENU_EDIT
, FALSE
, &mii
))
1389 HMENU hSubMenu
= mii
.hSubMenu
;
1391 HMENU menubase
= ::LoadMenuW(shell32_hInstance
, L
"MENU_003");
1393 int count
= ::GetMenuItemCount(menubase
);
1394 for (int i
= 0; i
< count
; i
++)
1398 ZeroMemory(&mii
, sizeof(mii
));
1399 mii
.cbSize
= sizeof(mii
);
1400 mii
.fMask
= MIIM_STATE
| MIIM_ID
| MIIM_SUBMENU
| MIIM_CHECKMARKS
| MIIM_DATA
| MIIM_STRING
| MIIM_BITMAP
| MIIM_FTYPE
;
1401 mii
.dwTypeData
= label
;
1402 mii
.cch
= _countof(label
);
1403 ::GetMenuItemInfoW(menubase
, i
, TRUE
, &mii
);
1405 TRACE("Adding item %d label %S type %d\n", mii
.wID
, mii
.dwTypeData
, mii
.fType
);
1407 mii
.fType
|= MFT_RADIOCHECK
;
1409 ::InsertMenuItemW(hSubMenu
, FCIDM_MENU_VIEW_SEP_OPTIONS
, FALSE
, &mii
);
1412 ::DestroyMenu(menubase
);
1415 /* initialize VIEW menu */
1417 mii
.cbSize
= sizeof(mii
);
1418 mii
.fMask
= MIIM_SUBMENU
;
1419 if (::GetMenuItemInfoW(m_hMenu
, FCIDM_MENU_VIEW
, FALSE
, &mii
))
1421 HMENU menubase
= ::LoadMenuW(shell32_hInstance
, L
"MENU_001");
1423 HMENU hSubMenu
= mii
.hSubMenu
;
1425 m_hView
= CreatePopupMenu();
1427 _InsertMenuItemW(hSubMenu
, FCIDM_MENU_VIEW_SEP_OPTIONS
, FALSE
, 0, MFT_SEPARATOR
, NULL
, MFS_ENABLED
);
1429 int count
= ::GetMenuItemCount(menubase
);
1430 for (int i
= 0; i
< count
; i
++)
1434 ZeroMemory(&mii
, sizeof(mii
));
1435 mii
.cbSize
= sizeof(mii
);
1436 mii
.fMask
= MIIM_STATE
| MIIM_ID
| MIIM_SUBMENU
| MIIM_CHECKMARKS
| MIIM_DATA
| MIIM_STRING
| MIIM_BITMAP
| MIIM_FTYPE
;
1437 mii
.dwTypeData
= label
;
1438 mii
.cch
= _countof(label
);
1439 ::GetMenuItemInfoW(menubase
, i
, TRUE
, &mii
);
1441 ::AppendMenuW(m_hView
, mii
.fType
, mii
.wID
, mii
.dwTypeData
);
1443 TRACE("Adding item %d label %S type %d\n", mii
.wID
, mii
.dwTypeData
, mii
.fType
);
1445 mii
.fType
|= MFT_RADIOCHECK
;
1447 ::InsertMenuItemW(hSubMenu
, FCIDM_MENU_VIEW_SEP_OPTIONS
, FALSE
, &mii
);
1450 ::DestroyMenu(menubase
);
1454 TRACE("-- before fnSetMenuSB\n");
1455 m_pShellBrowser
->SetMenuSB(m_hMenu
, 0, m_hWnd
);
1457 m_menusLoaded
= TRUE
;
1461 if (SVUIA_ACTIVATE_FOCUS
== uState
)
1463 m_ListView
.SetFocus();
1471 /**********************************************************
1472 * ShellView_OnActivate()
1474 LRESULT
CDefView::OnActivate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1476 DoActivate(SVUIA_ACTIVATE_FOCUS
);
1480 /**********************************************************
1481 * ShellView_OnSetFocus()
1484 LRESULT
CDefView::OnSetFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1486 TRACE("%p\n", this);
1488 /* Tell the browser one of our windows has received the focus. This
1489 should always be done before merging menus (OnActivate merges the
1490 menus) if one of our windows has the focus.*/
1492 m_pShellBrowser
->OnViewWindowActive(this);
1493 DoActivate(SVUIA_ACTIVATE_FOCUS
);
1495 /* Set the focus to the listview */
1496 m_ListView
.SetFocus();
1498 /* Notify the ICommDlgBrowser interface */
1499 OnStateChange(CDBOSC_SETFOCUS
);
1504 /**********************************************************
1505 * ShellView_OnKillFocus()
1507 LRESULT
CDefView::OnKillFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1509 TRACE("(%p) stub\n", this);
1511 DoActivate(SVUIA_ACTIVATE_NOFOCUS
);
1512 /* Notify the ICommDlgBrowser */
1513 OnStateChange(CDBOSC_KILLFOCUS
);
1518 /**********************************************************
1519 * ShellView_OnCommand()
1522 * the CmdID's are the ones from the context menu
1524 LRESULT
CDefView::OnCommand(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1531 dwCmdID
= GET_WM_COMMAND_ID(wParam
, lParam
);
1532 dwCmd
= GET_WM_COMMAND_CMD(wParam
, lParam
);
1533 hwndCmd
= GET_WM_COMMAND_HWND(wParam
, lParam
);
1535 TRACE("(%p)->(0x%08x 0x%08x %p) stub\n", this, dwCmdID
, dwCmd
, hwndCmd
);
1539 case FCIDM_SHVIEW_SMALLICON
:
1540 m_FolderSettings
.ViewMode
= FVM_SMALLICON
;
1541 SetStyle (LVS_SMALLICON
, LVS_TYPEMASK
);
1545 case FCIDM_SHVIEW_BIGICON
:
1546 m_FolderSettings
.ViewMode
= FVM_ICON
;
1547 SetStyle (LVS_ICON
, LVS_TYPEMASK
);
1551 case FCIDM_SHVIEW_LISTVIEW
:
1552 m_FolderSettings
.ViewMode
= FVM_LIST
;
1553 SetStyle (LVS_LIST
, LVS_TYPEMASK
);
1557 case FCIDM_SHVIEW_REPORTVIEW
:
1558 m_FolderSettings
.ViewMode
= FVM_DETAILS
;
1559 SetStyle (LVS_REPORT
, LVS_TYPEMASK
);
1563 /* the menu-ID's for sorting are 0x30... see shrec.rc */
1568 m_sortInfo
.nHeaderID
= dwCmdID
- 0x30;
1569 m_sortInfo
.bIsAscending
= TRUE
;
1570 m_sortInfo
.nLastHeaderID
= m_sortInfo
.nHeaderID
;
1571 m_ListView
.SortItems(ListViewCompareItems
, this);
1574 case FCIDM_SHVIEW_SELECTALL
:
1575 m_ListView
.SetItemState(-1, LVIS_SELECTED
, LVIS_SELECTED
);
1578 case FCIDM_SHVIEW_INVERTSELECTION
:
1579 nCount
= m_ListView
.GetItemCount();
1580 for (int i
=0; i
< nCount
; i
++)
1581 m_ListView
.SetItemState(i
, m_ListView
.GetItemState(i
, LVIS_SELECTED
) ? 0 : LVIS_SELECTED
, LVIS_SELECTED
);
1584 case FCIDM_SHVIEW_REFRESH
:
1588 case FCIDM_SHVIEW_DELETE
:
1589 case FCIDM_SHVIEW_CUT
:
1590 case FCIDM_SHVIEW_COPY
:
1591 case FCIDM_SHVIEW_RENAME
:
1592 return OnExplorerCommand(dwCmdID
, TRUE
);
1594 case FCIDM_SHVIEW_INSERT
:
1595 case FCIDM_SHVIEW_UNDO
:
1596 case FCIDM_SHVIEW_INSERTLINK
:
1597 case FCIDM_SHVIEW_NEWFOLDER
:
1598 return OnExplorerCommand(dwCmdID
, FALSE
);
1600 TRACE("-- COMMAND 0x%04x unhandled\n", dwCmdID
);
1606 /**********************************************************
1607 * ShellView_OnNotify()
1610 LRESULT
CDefView::OnNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1614 LPNMLISTVIEW lpnmlv
;
1615 NMLVDISPINFOW
*lpdi
;
1616 PCUITEMID_CHILD pidl
;
1620 lpnmh
= (LPNMHDR
)lParam
;
1621 lpnmlv
= (LPNMLISTVIEW
)lpnmh
;
1622 lpdi
= (NMLVDISPINFOW
*)lpnmh
;
1624 TRACE("%p CtlID=%u lpnmh->code=%x\n", this, CtlID
, lpnmh
->code
);
1626 switch (lpnmh
->code
)
1629 TRACE("-- NM_SETFOCUS %p\n", this);
1630 OnSetFocus(0, 0, 0, unused
);
1634 TRACE("-- NM_KILLFOCUS %p\n", this);
1636 /* Notify the ICommDlgBrowser interface */
1637 OnStateChange(CDBOSC_KILLFOCUS
);
1641 TRACE("-- NM_CUSTOMDRAW %p\n", this);
1642 return CDRF_DODEFAULT
;
1644 case NM_RELEASEDCAPTURE
:
1645 TRACE("-- NM_RELEASEDCAPTURE %p\n", this);
1649 TRACE("-- NM_CLICK %p\n", this);
1653 TRACE("-- NM_RCLICK %p\n", this);
1657 TRACE("-- NM_DBLCLK %p\n", this);
1658 OpenSelectedItems();
1662 TRACE("-- NM_RETURN %p\n", this);
1663 OpenSelectedItems();
1667 TRACE("-- HDN_ENDTRACKW %p\n", this);
1668 /*nColumn1 = m_ListView.GetColumnWidth(0);
1669 nColumn2 = m_ListView.GetColumnWidth(1);*/
1672 case LVN_DELETEITEM
:
1673 TRACE("-- LVN_DELETEITEM %p\n", this);
1675 /*delete the pidl because we made a copy of it*/
1676 SHFree(reinterpret_cast<LPVOID
>(lpnmlv
->lParam
));
1680 case LVN_DELETEALLITEMS
:
1681 TRACE("-- LVN_DELETEALLITEMS %p\n", this);
1684 case LVN_INSERTITEM
:
1685 TRACE("-- LVN_INSERTITEM (STUB)%p\n", this);
1688 case LVN_ITEMACTIVATE
:
1689 TRACE("-- LVN_ITEMACTIVATE %p\n", this);
1690 OnStateChange(CDBOSC_SELCHANGE
); /* the browser will get the IDataObject now */
1693 case LVN_COLUMNCLICK
:
1694 m_sortInfo
.nHeaderID
= lpnmlv
->iSubItem
;
1695 if (m_sortInfo
.nLastHeaderID
== m_sortInfo
.nHeaderID
)
1696 m_sortInfo
.bIsAscending
= !m_sortInfo
.bIsAscending
;
1698 m_sortInfo
.bIsAscending
= TRUE
;
1699 m_sortInfo
.nLastHeaderID
= m_sortInfo
.nHeaderID
;
1701 m_ListView
.SortItems(ListViewCompareItems
, this);
1704 case LVN_GETDISPINFOA
:
1705 case LVN_GETDISPINFOW
:
1706 TRACE("-- LVN_GETDISPINFO %p\n", this);
1707 pidl
= _PidlByItem(lpdi
->item
);
1709 if (lpdi
->item
.mask
& LVIF_TEXT
) /* text requested */
1714 if (FAILED(m_pSF2Parent
->GetDetailsOf(pidl
, lpdi
->item
.iSubItem
, &sd
)))
1716 FIXME("failed to get details\n");
1720 if (lpnmh
->code
== LVN_GETDISPINFOA
)
1722 /* shouldn't happen */
1723 NMLVDISPINFOA
*lpdiA
= (NMLVDISPINFOA
*)lpnmh
;
1724 StrRetToStrNA( lpdiA
->item
.pszText
, lpdiA
->item
.cchTextMax
, &sd
.str
, NULL
);
1725 TRACE("-- text=%s\n", lpdiA
->item
.pszText
);
1727 else /* LVN_GETDISPINFOW */
1729 StrRetToStrNW( lpdi
->item
.pszText
, lpdi
->item
.cchTextMax
, &sd
.str
, NULL
);
1730 TRACE("-- text=%s\n", debugstr_w(lpdi
->item
.pszText
));
1738 if(lpdi
->item
.mask
& LVIF_IMAGE
) /* image requested */
1740 lpdi
->item
.iImage
= SHMapPIDLToSystemImageListIndex(m_pSFParent
, pidl
, 0);
1742 if(lpdi
->item
.mask
& LVIF_STATE
)
1744 ULONG attributes
= SFGAO_HIDDEN
;
1745 if (SUCCEEDED(m_pSFParent
->GetAttributesOf(1, &pidl
, &attributes
)))
1747 if (attributes
& SFGAO_HIDDEN
)
1749 lpdi
->item
.state
|= LVIS_CUT
;
1753 lpdi
->item
.mask
|= LVIF_DI_SETITEM
;
1756 case LVN_ITEMCHANGED
:
1757 TRACE("-- LVN_ITEMCHANGED %p\n", this);
1758 OnStateChange(CDBOSC_SELCHANGE
); /* the browser will get the IDataObject now */
1763 case LVN_BEGINRDRAG
:
1764 TRACE("-- LVN_BEGINDRAG\n");
1766 if (GetSelections())
1768 CComPtr
<IDataObject
> pda
;
1769 DWORD dwAttributes
= SFGAO_CANLINK
;
1770 DWORD dwEffect
= DROPEFFECT_COPY
| DROPEFFECT_MOVE
;
1772 if (SUCCEEDED(m_pSFParent
->GetUIObjectOf(m_hWnd
, m_cidl
, m_apidl
, IID_NULL_PPV_ARG(IDataObject
, &pda
))))
1774 if (SUCCEEDED(m_pSFParent
->GetAttributesOf(m_cidl
, m_apidl
, &dwAttributes
)))
1776 if (dwAttributes
& SFGAO_CANLINK
)
1778 dwEffect
|= DROPEFFECT_LINK
;
1782 CComPtr
<IAsyncOperation
> piaso
;
1783 if (SUCCEEDED(pda
->QueryInterface(IID_PPV_ARG(IAsyncOperation
, &piaso
))))
1785 piaso
->SetAsyncMode(TRUE
);
1789 DoDragDrop(pda
, this, dwEffect
, &dwEffect2
);
1794 case LVN_BEGINLABELEDITW
:
1796 DWORD dwAttr
= SFGAO_CANRENAME
;
1797 pidl
= _PidlByItem(lpdi
->item
);
1799 TRACE("-- LVN_BEGINLABELEDITW %p\n", this);
1801 m_pSFParent
->GetAttributesOf(1, &pidl
, &dwAttr
);
1802 if (SFGAO_CANRENAME
& dwAttr
)
1810 case LVN_ENDLABELEDITW
:
1812 TRACE("-- LVN_ENDLABELEDITW %p\n", this);
1814 m_isEditing
= FALSE
;
1816 if (lpdi
->item
.pszText
)
1821 pidl
= _PidlByItem(lpdi
->item
);
1822 PITEMID_CHILD pidlNew
;
1823 hr
= m_pSFParent
->SetNameOf(0, pidl
, lpdi
->item
.pszText
, SHGDN_INFOLDER
, &pidlNew
);
1825 if (SUCCEEDED(hr
) && pidlNew
)
1827 lvItem
.mask
= LVIF_PARAM
|LVIF_IMAGE
;
1828 lvItem
.iItem
= lpdi
->item
.iItem
;
1829 lvItem
.iSubItem
= 0;
1830 lvItem
.lParam
= reinterpret_cast<LPARAM
>(pidlNew
);
1831 lvItem
.iImage
= SHMapPIDLToSystemImageListIndex(m_pSFParent
, pidlNew
, 0);
1832 m_ListView
.SetItem(&lvItem
);
1833 m_ListView
.Update(lpdi
->item
.iItem
);
1842 TRACE("-- %p WM_COMMAND %x unhandled\n", this, lpnmh
->code
);
1850 * This is just a quick hack to make the desktop work correctly.
1851 * ITranslateShellChangeNotify's IsChildID is undocumented, but most likely the way that
1852 * a folder should know if it should update upon a change notification.
1853 * It is exported by merged folders at a minimum.
1855 static BOOL
ILIsParentOrSpecialParent(PCIDLIST_ABSOLUTE pidl1
, PCIDLIST_ABSOLUTE pidl2
)
1857 if (!pidl1
|| !pidl2
)
1859 if (ILIsParent(pidl1
, pidl2
, TRUE
))
1862 if (_ILIsDesktop(pidl1
))
1864 PIDLIST_ABSOLUTE deskpidl
;
1865 SHGetFolderLocation(NULL
, CSIDL_DESKTOPDIRECTORY
, NULL
, 0, &deskpidl
);
1866 if (ILIsParent(deskpidl
, pidl2
, TRUE
))
1872 SHGetFolderLocation(NULL
, CSIDL_COMMON_DESKTOPDIRECTORY
, NULL
, 0, &deskpidl
);
1873 if (ILIsParent(deskpidl
, pidl2
, TRUE
))
1883 /**********************************************************
1884 * ShellView_OnChange()
1886 LRESULT
CDefView::OnChangeNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1888 PCIDLIST_ABSOLUTE
*Pidls
= reinterpret_cast<PCIDLIST_ABSOLUTE
*>(wParam
);
1889 BOOL bParent0
= ILIsParentOrSpecialParent(m_pidlParent
, Pidls
[0]);
1890 BOOL bParent1
= ILIsParentOrSpecialParent(m_pidlParent
, Pidls
[1]);
1892 TRACE("(%p)(%p,%p,0x%08x)\n", this, Pidls
[0], Pidls
[1], lParam
);
1894 switch (lParam
&~ SHCNE_INTERRUPT
)
1900 if (LV_FindItemByPidl(ILFindLastID(Pidls
[0])) == -1)
1902 LV_AddItem(ILFindLastID(Pidls
[0]));
1906 LV_ProdItem(ILFindLastID(Pidls
[0]));
1914 LV_DeleteItem(ILFindLastID(Pidls
[0]));
1917 case SHCNE_RENAMEFOLDER
:
1918 case SHCNE_RENAMEITEM
:
1919 if (bParent0
&& bParent1
)
1920 LV_RenameItem(ILFindLastID(Pidls
[0]), ILFindLastID(Pidls
[1]));
1922 LV_DeleteItem(ILFindLastID(Pidls
[0]));
1924 LV_AddItem(ILFindLastID(Pidls
[1]));
1927 case SHCNE_UPDATEITEM
:
1929 LV_RenameItem(ILFindLastID(Pidls
[0]), ILFindLastID(Pidls
[0]));
1932 case SHCNE_UPDATEDIR
:
1939 /**********************************************************
1940 * CDefView::OnCustomItem
1942 LRESULT
CDefView::OnCustomItem(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1947 ERR("no menu!!!\n");
1952 HRESULT hres
= SHForwardContextMenuMsg(m_pCM
, uMsg
, wParam
, lParam
, &result
, TRUE
);
1953 if (SUCCEEDED(hres
))
1959 LRESULT
CDefView::OnSettingChange(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1961 /* Wallpaper setting affects drop shadows effect */
1962 if (wParam
== SPI_SETDESKWALLPAPER
|| wParam
== 0)
1968 /**********************************************************
1969 * CDefView::OnInitMenuPopup
1971 LRESULT
CDefView::OnInitMenuPopup(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1973 MENUITEMINFOW mii
= { 0 };
1974 HMENU hSubmenu
= (HMENU
) wParam
;
1976 TRACE("OnInitMenuPopup lParam=%d\n", lParam
);
1978 mii
.cbSize
= sizeof(mii
);
1979 mii
.fMask
= MIIM_ID
| MIIM_SUBMENU
;
1981 if (!GetMenuItemInfoW(this->m_hMenu
, lParam
, TRUE
, &mii
))
1983 TRACE("OnInitMenuPopup GetMenuItemInfoW failed!\n");
1987 UINT menuItemId
= mii
.wID
;
1989 if (mii
.hSubMenu
!= hSubmenu
)
1991 TRACE("OnInitMenuPopup submenu does not match!!!!\n");
1995 TRACE("OnInitMenuPopup id=%d\n", menuItemId
);
1999 case FCIDM_MENU_FILE
:
2000 PrepareShowFileMenu(hSubmenu
);
2002 case FCIDM_MENU_EDIT
:
2003 //PrepareShowEditMenu(hSubmenu);
2005 case FCIDM_MENU_VIEW
:
2006 PrepareShowViewMenu(hSubmenu
);
2013 /**********************************************************
2016 * The INTERFACE of the IShellView object
2019 **********************************************************
2022 /**********************************************************
2023 * ShellView_GetWindow
2025 HRESULT WINAPI
CDefView::GetWindow(HWND
*phWnd
)
2027 TRACE("(%p)\n", this);
2034 HRESULT WINAPI
CDefView::ContextSensitiveHelp(BOOL fEnterMode
)
2036 FIXME("(%p) stub\n", this);
2041 /**********************************************************
2042 * IShellView_TranslateAccelerator
2045 * use the accel functions
2047 HRESULT WINAPI
CDefView::TranslateAccelerator(LPMSG lpmsg
)
2052 if (lpmsg
->message
>= WM_KEYFIRST
&& lpmsg
->message
<= WM_KEYLAST
)
2054 if (::TranslateAcceleratorW(m_hWnd
, m_hAccel
, lpmsg
) != 0)
2057 TRACE("-- key=0x04%lx\n", lpmsg
->wParam
) ;
2060 return m_pShellBrowser
->TranslateAcceleratorSB(lpmsg
, 0);
2063 HRESULT WINAPI
CDefView::EnableModeless(BOOL fEnable
)
2065 FIXME("(%p) stub\n", this);
2070 HRESULT WINAPI
CDefView::UIActivate(UINT uState
)
2072 // CHAR szName[MAX_PATH];
2074 int nPartArray
[1] = { -1};
2076 TRACE("(%p)->(state=%x) stub\n", this, uState
);
2078 /* don't do anything if the state isn't really changing */
2079 if (m_uState
== uState
)
2084 /* OnActivate handles the menu merging and internal state */
2087 /* only do This if we are active */
2088 if (uState
!= SVUIA_DEACTIVATE
)
2092 GetFolderPath is not a method of IShellFolder
2093 IShellFolder_GetFolderPath( m_pSFParent, szName, sizeof(szName) );
2095 /* set the number of parts */
2096 m_pShellBrowser
->SendControlMsg(FCW_STATUS
, SB_SETPARTS
, 1, (LPARAM
)nPartArray
, &lResult
);
2098 /* set the text for the parts */
2100 m_pShellBrowser->SendControlMsg(FCW_STATUS, SB_SETTEXTA, 0, (LPARAM)szName, &lResult);
2107 HRESULT WINAPI
CDefView::Refresh()
2109 TRACE("(%p)\n", this);
2111 m_ListView
.DeleteAllItems();
2117 HRESULT WINAPI
CDefView::CreateViewWindow(IShellView
*lpPrevView
, LPCFOLDERSETTINGS lpfs
, IShellBrowser
*psb
, RECT
*prcView
, HWND
*phWnd
)
2119 OLEMENUGROUPWIDTHS omw
= { { 0, 0, 0, 0, 0, 0 } };
2123 TRACE("(%p)->(shlview=%p set=%p shlbrs=%p rec=%p hwnd=%p) incomplete\n", this, lpPrevView
, lpfs
, psb
, prcView
, phWnd
);
2126 TRACE("-- vmode=%x flags=%x\n", lpfs
->ViewMode
, lpfs
->fFlags
);
2127 if (prcView
!= NULL
)
2128 TRACE("-- left=%i top=%i right=%i bottom=%i\n", prcView
->left
, prcView
->top
, prcView
->right
, prcView
->bottom
);
2130 /* Validate the Shell Browser */
2131 if (psb
== NULL
|| m_hWnd
)
2132 return E_UNEXPECTED
;
2134 /* Set up the member variables */
2135 m_pShellBrowser
= psb
;
2136 m_FolderSettings
= *lpfs
;
2138 /* Get our parent window */
2139 m_pShellBrowser
->GetWindow(&m_hWndParent
);
2141 /* Try to get the ICommDlgBrowserInterface, adds a reference !!! */
2142 m_pCommDlgBrowser
= NULL
;
2143 if (SUCCEEDED(m_pShellBrowser
->QueryInterface(IID_PPV_ARG(ICommDlgBrowser
, &m_pCommDlgBrowser
))))
2145 TRACE("-- CommDlgBrowser\n");
2148 Create(m_hWndParent
, prcView
, NULL
, WS_CHILD
| WS_TABSTOP
, 0, 0U);
2159 SetWindowPos(HWND_TOP
, 0, 0, 0, 0, SWP_NOMOVE
| SWP_NOSIZE
| SWP_SHOWWINDOW
);
2164 m_hMenu
= CreateMenu();
2165 m_pShellBrowser
->InsertMenusSB(m_hMenu
, &omw
);
2166 TRACE("-- after fnInsertMenusSB\n");
2174 HRESULT WINAPI
CDefView::DestroyViewWindow()
2176 TRACE("(%p)\n", this);
2178 /* Make absolutely sure all our UI is cleaned up */
2179 UIActivate(SVUIA_DEACTIVATE
);
2183 // "Accelerator tables loaded from resources are freed automatically when the application terminates." -- MSDN
2189 DestroyMenu(m_hView
);
2195 DestroyMenu(m_hMenu
);
2201 m_ListView
.DestroyWindow();
2209 m_pShellBrowser
.Release();
2210 m_pCommDlgBrowser
.Release();
2215 HRESULT WINAPI
CDefView::GetCurrentInfo(LPFOLDERSETTINGS lpfs
)
2217 TRACE("(%p)->(%p) vmode=%x flags=%x\n", this, lpfs
,
2218 m_FolderSettings
.ViewMode
, m_FolderSettings
.fFlags
);
2221 return E_INVALIDARG
;
2223 *lpfs
= m_FolderSettings
;
2227 HRESULT WINAPI
CDefView::AddPropertySheetPages(DWORD dwReserved
, LPFNADDPROPSHEETPAGE lpfn
, LPARAM lparam
)
2229 FIXME("(%p) stub\n", this);
2234 HRESULT WINAPI
CDefView::SaveViewState()
2236 FIXME("(%p) stub\n", this);
2241 HRESULT WINAPI
CDefView::SelectItem(PCUITEMID_CHILD pidl
, UINT uFlags
)
2245 TRACE("(%p)->(pidl=%p, 0x%08x) stub\n", this, pidl
, uFlags
);
2247 i
= LV_FindItemByPidl(pidl
);
2251 if(uFlags
& SVSI_ENSUREVISIBLE
)
2252 m_ListView
.EnsureVisible(i
, FALSE
);
2254 LVITEMW lvItem
= {0};
2255 lvItem
.mask
= LVIF_STATE
;
2256 lvItem
.stateMask
= LVIS_SELECTED
| LVIS_FOCUSED
;
2258 while (m_ListView
.GetItem(&lvItem
))
2260 if (lvItem
.iItem
== i
)
2262 if (uFlags
& SVSI_SELECT
)
2263 lvItem
.state
|= LVIS_SELECTED
;
2265 lvItem
.state
&= ~LVIS_SELECTED
;
2267 if (uFlags
& SVSI_FOCUSED
)
2268 lvItem
.state
&= ~LVIS_FOCUSED
;
2272 if (uFlags
& SVSI_DESELECTOTHERS
)
2273 lvItem
.state
&= ~LVIS_SELECTED
;
2276 m_ListView
.SetItem(&lvItem
);
2280 if(uFlags
& SVSI_EDIT
)
2281 m_ListView
.EditLabel(i
);
2286 HRESULT WINAPI
CDefView::GetItemObject(UINT uItem
, REFIID riid
, LPVOID
*ppvOut
)
2288 HRESULT hr
= E_NOINTERFACE
;
2290 TRACE("(%p)->(uItem=0x%08x,\n\tIID=%s, ppv=%p)\n", this, uItem
, debugstr_guid(&riid
), ppvOut
);
2296 case SVGIO_BACKGROUND
:
2297 if (IsEqualIID(riid
, IID_IContextMenu
))
2299 //*ppvOut = ISvBgCm_Constructor(m_pSFParent, FALSE);
2304 hr
= CDefFolderMenu_Create2(NULL
, NULL
, 0, NULL
, m_pSFParent
, NULL
, 0, NULL
, &pcm
);
2309 else if (IsEqualIID(riid
, IID_IDispatch
))
2311 if (m_pShellFolderViewDual
== NULL
)
2312 hr
= CDefViewDual_Constructor(riid
, (LPVOID
*)&m_pShellFolderViewDual
);
2313 hr
= m_pShellFolderViewDual
->QueryInterface(riid
, ppvOut
);
2317 case SVGIO_SELECTION
:
2319 hr
= m_pSFParent
->GetUIObjectOf(m_hWnd
, m_cidl
, m_apidl
, riid
, 0, ppvOut
);
2323 TRACE("-- (%p)->(interface=%p)\n", this, *ppvOut
);
2328 HRESULT STDMETHODCALLTYPE
CDefView::GetCurrentViewMode(UINT
*pViewMode
)
2330 TRACE("(%p)->(%p), stub\n", this, pViewMode
);
2333 return E_INVALIDARG
;
2335 *pViewMode
= m_FolderSettings
.ViewMode
;
2339 HRESULT STDMETHODCALLTYPE
CDefView::SetCurrentViewMode(UINT ViewMode
)
2342 TRACE("(%p)->(%u), stub\n", this, ViewMode
);
2344 /* It's not redundant to check FVM_AUTO because it's a (UINT)-1 */
2345 if (((INT
)ViewMode
< FVM_FIRST
|| (INT
)ViewMode
> FVM_LAST
) && ((INT
)ViewMode
!= FVM_AUTO
))
2346 return E_INVALIDARG
;
2348 /* Windows before Vista uses LVM_SETVIEW and possibly
2349 LVM_SETEXTENDEDLISTVIEWSTYLE to set the style of the listview,
2350 while later versions seem to accomplish this through other
2358 dwStyle
= LVS_REPORT
;
2361 dwStyle
= LVS_SMALLICON
;
2368 FIXME("ViewMode %d not implemented\n", ViewMode
);
2374 SetStyle(dwStyle
, LVS_TYPEMASK
);
2376 /* This will not necessarily be the actual mode set above.
2377 This mimics the behavior of Windows XP. */
2378 m_FolderSettings
.ViewMode
= ViewMode
;
2383 HRESULT STDMETHODCALLTYPE
CDefView::GetFolder(REFIID riid
, void **ppv
)
2385 if (m_pSFParent
== NULL
)
2388 return m_pSFParent
->QueryInterface(riid
, ppv
);
2391 HRESULT STDMETHODCALLTYPE
CDefView::Item(int iItemIndex
, PITEMID_CHILD
*ppidl
)
2393 PCUITEMID_CHILD pidl
= _PidlByItem(iItemIndex
);
2396 *ppidl
= ILClone(pidl
);
2401 return E_INVALIDARG
;
2404 HRESULT STDMETHODCALLTYPE
CDefView::ItemCount(UINT uFlags
, int *pcItems
)
2406 TRACE("(%p)->(%u %p)\n", this, uFlags
, pcItems
);
2408 if (uFlags
!= SVGIO_ALLVIEW
)
2409 FIXME("some flags unsupported, %x\n", uFlags
& ~SVGIO_ALLVIEW
);
2411 *pcItems
= m_ListView
.GetItemCount();
2416 HRESULT STDMETHODCALLTYPE
CDefView::Items(UINT uFlags
, REFIID riid
, void **ppv
)
2421 HRESULT STDMETHODCALLTYPE
CDefView::GetSelectionMarkedItem(int *piItem
)
2423 TRACE("(%p)->(%p)\n", this, piItem
);
2425 *piItem
= m_ListView
.GetSelectionMark();
2430 HRESULT STDMETHODCALLTYPE
CDefView::GetFocusedItem(int *piItem
)
2432 TRACE("(%p)->(%p)\n", this, piItem
);
2434 *piItem
= m_ListView
.GetNextItem(-1, LVNI_FOCUSED
);
2439 HRESULT STDMETHODCALLTYPE
CDefView::GetItemPosition(PCUITEMID_CHILD pidl
, POINT
*ppt
)
2444 HRESULT STDMETHODCALLTYPE
CDefView::GetSpacing(POINT
*ppt
)
2446 TRACE("(%p)->(%p)\n", this, ppt
);
2454 m_ListView
.GetItemSpacing(spacing
);
2456 ppt
->x
= spacing
.cx
;
2457 ppt
->y
= spacing
.cy
;
2463 HRESULT STDMETHODCALLTYPE
CDefView::GetDefaultSpacing(POINT
*ppt
)
2468 HRESULT STDMETHODCALLTYPE
CDefView::GetAutoArrange()
2473 HRESULT STDMETHODCALLTYPE
CDefView::SelectItem(int iItem
, DWORD dwFlags
)
2477 TRACE("(%p)->(%d, %x)\n", this, iItem
, dwFlags
);
2480 lvItem
.stateMask
= LVIS_SELECTED
;
2482 if (dwFlags
& SVSI_ENSUREVISIBLE
)
2483 m_ListView
.EnsureVisible(iItem
, 0);
2486 if (dwFlags
& SVSI_DESELECTOTHERS
)
2487 m_ListView
.SetItemState(-1, 0, LVIS_SELECTED
);
2490 if (dwFlags
& SVSI_SELECT
)
2491 lvItem
.state
|= LVIS_SELECTED
;
2493 if (dwFlags
& SVSI_FOCUSED
)
2494 lvItem
.stateMask
|= LVIS_FOCUSED
;
2496 m_ListView
.SetItemState(iItem
, lvItem
.state
, lvItem
.stateMask
);
2498 if (dwFlags
& SVSI_EDIT
)
2499 m_ListView
.EditLabel(iItem
);
2504 HRESULT STDMETHODCALLTYPE
CDefView::SelectAndPositionItems(UINT cidl
, PCUITEMID_CHILD_ARRAY apidl
, POINT
*apt
, DWORD dwFlags
)
2509 /**********************************************************
2510 * IShellView2 implementation
2513 HRESULT STDMETHODCALLTYPE
CDefView::GetView(SHELLVIEWID
*view_guid
, ULONG view_type
)
2515 FIXME("(%p)->(%p, %lu) stub\n", this, view_guid
, view_type
);
2519 HRESULT STDMETHODCALLTYPE
CDefView::CreateViewWindow2(LPSV2CVW2_PARAMS view_params
)
2521 FIXME("(%p)->(%p) stub\n", this, view_params
);
2525 HRESULT STDMETHODCALLTYPE
CDefView::HandleRename(LPCITEMIDLIST new_pidl
)
2527 FIXME("(%p)->(%p) stub\n", this, new_pidl
);
2531 HRESULT STDMETHODCALLTYPE
CDefView::SelectAndPositionItem(LPCITEMIDLIST item
, UINT flags
, POINT
*point
)
2533 FIXME("(%p)->(%p, %u, %p) stub\n", this, item
, flags
, point
);
2537 /**********************************************************
2538 * IShellFolderView implementation
2540 HRESULT STDMETHODCALLTYPE
CDefView::Rearrange(LPARAM sort
)
2542 FIXME("(%p)->(%ld) stub\n", this, sort
);
2546 HRESULT STDMETHODCALLTYPE
CDefView::GetArrangeParam(LPARAM
*sort
)
2548 FIXME("(%p)->(%p) stub\n", this, sort
);
2552 HRESULT STDMETHODCALLTYPE
CDefView::ArrangeGrid()
2554 FIXME("(%p) stub\n", this);
2558 HRESULT STDMETHODCALLTYPE
CDefView::AutoArrange()
2560 FIXME("(%p) stub\n", this);
2564 HRESULT STDMETHODCALLTYPE
CDefView::AddObject(PITEMID_CHILD pidl
, UINT
*item
)
2566 FIXME("(%p)->(%p %p) stub\n", this, pidl
, item
);
2570 HRESULT STDMETHODCALLTYPE
CDefView::GetObject(PITEMID_CHILD
*pidl
, UINT item
)
2572 TRACE("(%p)->(%p %d)\n", this, pidl
, item
);
2573 return Item(item
, pidl
);
2576 HRESULT STDMETHODCALLTYPE
CDefView::RemoveObject(PITEMID_CHILD pidl
, UINT
*item
)
2579 TRACE("(%p)->(%p %p)\n", this, pidl
, item
);
2583 *item
= LV_FindItemByPidl(ILFindLastID(pidl
));
2584 m_ListView
.DeleteItem(*item
);
2589 m_ListView
.DeleteAllItems();
2595 HRESULT STDMETHODCALLTYPE
CDefView::GetObjectCount(UINT
*count
)
2597 TRACE("(%p)->(%p)\n", this, count
);
2598 *count
= m_ListView
.GetItemCount();
2602 HRESULT STDMETHODCALLTYPE
CDefView::SetObjectCount(UINT count
, UINT flags
)
2604 FIXME("(%p)->(%d %x) stub\n", this, count
, flags
);
2608 HRESULT STDMETHODCALLTYPE
CDefView::UpdateObject(PITEMID_CHILD pidl_old
, PITEMID_CHILD pidl_new
, UINT
*item
)
2610 FIXME("(%p)->(%p %p %p) stub\n", this, pidl_old
, pidl_new
, item
);
2614 HRESULT STDMETHODCALLTYPE
CDefView::RefreshObject(PITEMID_CHILD pidl
, UINT
*item
)
2616 FIXME("(%p)->(%p %p) stub\n", this, pidl
, item
);
2620 HRESULT STDMETHODCALLTYPE
CDefView::SetRedraw(BOOL redraw
)
2622 TRACE("(%p)->(%d)\n", this, redraw
);
2623 m_ListView
.SetRedraw(redraw
);
2627 HRESULT STDMETHODCALLTYPE
CDefView::GetSelectedCount(UINT
*count
)
2629 FIXME("(%p)->(%p) stub\n", this, count
);
2633 HRESULT STDMETHODCALLTYPE
CDefView::GetSelectedObjects(PCUITEMID_CHILD
**pidl
, UINT
*items
)
2635 TRACE("(%p)->(%p %p)\n", this, pidl
, items
);
2637 *items
= GetSelections();
2641 *pidl
= static_cast<PCUITEMID_CHILD
*>(LocalAlloc(0, *items
* sizeof(PCUITEMID_CHILD
)));
2644 return E_OUTOFMEMORY
;
2647 /* it's documented that caller shouldn't PIDLs, only array itself */
2648 memcpy(*pidl
, m_apidl
, *items
* sizeof(PCUITEMID_CHILD
));
2654 HRESULT STDMETHODCALLTYPE
CDefView::IsDropOnSource(IDropTarget
*drop_target
)
2656 FIXME("(%p)->(%p) stub\n", this, drop_target
);
2660 HRESULT STDMETHODCALLTYPE
CDefView::GetDragPoint(POINT
*pt
)
2662 FIXME("(%p)->(%p) stub\n", this, pt
);
2666 HRESULT STDMETHODCALLTYPE
CDefView::GetDropPoint(POINT
*pt
)
2668 FIXME("(%p)->(%p) stub\n", this, pt
);
2672 HRESULT STDMETHODCALLTYPE
CDefView::MoveIcons(IDataObject
*obj
)
2674 TRACE("(%p)->(%p)\n", this, obj
);
2678 HRESULT STDMETHODCALLTYPE
CDefView::SetItemPos(PCUITEMID_CHILD pidl
, POINT
*pt
)
2680 FIXME("(%p)->(%p %p) stub\n", this, pidl
, pt
);
2684 HRESULT STDMETHODCALLTYPE
CDefView::IsBkDropTarget(IDropTarget
*drop_target
)
2686 FIXME("(%p)->(%p) stub\n", this, drop_target
);
2690 HRESULT STDMETHODCALLTYPE
CDefView::SetClipboard(BOOL move
)
2692 FIXME("(%p)->(%d) stub\n", this, move
);
2696 HRESULT STDMETHODCALLTYPE
CDefView::SetPoints(IDataObject
*obj
)
2698 FIXME("(%p)->(%p) stub\n", this, obj
);
2702 HRESULT STDMETHODCALLTYPE
CDefView::GetItemSpacing(ITEMSPACING
*spacing
)
2704 FIXME("(%p)->(%p) stub\n", this, spacing
);
2708 HRESULT STDMETHODCALLTYPE
CDefView::SetCallback(IShellFolderViewCB
*new_cb
, IShellFolderViewCB
**old_cb
)
2710 FIXME("(%p)->(%p %p) stub\n", this, new_cb
, old_cb
);
2714 HRESULT STDMETHODCALLTYPE
CDefView::Select(UINT flags
)
2716 FIXME("(%p)->(%d) stub\n", this, flags
);
2720 HRESULT STDMETHODCALLTYPE
CDefView::QuerySupport(UINT
*support
)
2722 TRACE("(%p)->(%p)\n", this, support
);
2726 HRESULT STDMETHODCALLTYPE
CDefView::SetAutomationObject(IDispatch
*disp
)
2728 FIXME("(%p)->(%p) stub\n", this, disp
);
2732 /**********************************************************
2733 * ISVOleCmdTarget_QueryStatus (IOleCommandTarget)
2735 HRESULT WINAPI
CDefView::QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
, OLECMD
*prgCmds
, OLECMDTEXT
*pCmdText
)
2737 FIXME("(%p)->(%p(%s) 0x%08x %p %p\n",
2738 this, pguidCmdGroup
, debugstr_guid(pguidCmdGroup
), cCmds
, prgCmds
, pCmdText
);
2741 return E_INVALIDARG
;
2743 for (UINT i
= 0; i
< cCmds
; i
++)
2745 FIXME("\tprgCmds[%d].cmdID = %d\n", i
, prgCmds
[i
].cmdID
);
2746 prgCmds
[i
].cmdf
= 0;
2749 return OLECMDERR_E_UNKNOWNGROUP
;
2752 /**********************************************************
2753 * ISVOleCmdTarget_Exec (IOleCommandTarget)
2755 * nCmdID is the OLECMDID_* enumeration
2757 HRESULT WINAPI
CDefView::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
2759 FIXME("(%p)->(\n\tTarget GUID:%s Command:0x%08x Opt:0x%08x %p %p)\n",
2760 this, debugstr_guid(pguidCmdGroup
), nCmdID
, nCmdexecopt
, pvaIn
, pvaOut
);
2763 return OLECMDERR_E_UNKNOWNGROUP
;
2765 if (IsEqualCLSID(*pguidCmdGroup
, m_Category
))
2767 if (nCmdID
== FCIDM_SHVIEW_AUTOARRANGE
)
2769 if (V_VT(pvaIn
) != VT_INT_PTR
)
2770 return OLECMDERR_E_NOTSUPPORTED
;
2774 params
.cbSize
= sizeof(params
);
2775 params
.rcExclude
= *(RECT
*) V_INTREF(pvaIn
);
2777 HMENU hView
= m_hView
;
2779 hView
= CreatePopupMenu();
2780 AppendMenuW(hView
, MF_STRING
, FCIDM_SHVIEW_BIGICON
, L
"Big!");
2781 AppendMenuW(hView
, MF_STRING
, FCIDM_SHVIEW_SMALLICON
, L
"Small!");
2782 AppendMenuW(hView
, MF_STRING
, FCIDM_SHVIEW_LISTVIEW
, L
"List!");
2783 AppendMenuW(hView
, MF_STRING
, FCIDM_SHVIEW_REPORTVIEW
, L
"Report!");
2788 PrepareShowViewMenu(hView
);
2790 TrackPopupMenuEx(hView
, TPM_LEFTALIGN
| TPM_TOPALIGN
, params
.rcExclude
.left
, params
.rcExclude
.bottom
, m_hWndParent
, ¶ms
);
2793 // pvaOut is VT_I4 with value 0x403 (cmd id of the new mode maybe?)
2794 V_VT(pvaOut
) = VT_I4
;
2795 V_I4(pvaOut
) = 0x403;
2799 if (IsEqualIID(*pguidCmdGroup
, CGID_Explorer
) &&
2801 (nCmdexecopt
== 4) && pvaOut
)
2804 if (IsEqualIID(*pguidCmdGroup
, CGID_ShellDocView
) &&
2809 return OLECMDERR_E_UNKNOWNGROUP
;
2812 /**********************************************************
2813 * ISVDropTarget implementation
2816 /******************************************************************************
2817 * drag_notify_subitem [Internal]
2819 * Figure out the shellfolder object, which is currently under the mouse cursor
2820 * and notify it via the IDropTarget interface.
2823 #define SCROLLAREAWIDTH 20
2825 HRESULT
CDefView::drag_notify_subitem(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2827 LVHITTESTINFO htinfo
;
2832 /* Map from global to client coordinates and query the index of the listview-item, which is
2833 * currently under the mouse cursor. */
2836 htinfo
.flags
= LVHT_ONITEM
;
2837 ::ScreenToClient(m_ListView
, &htinfo
.pt
);
2838 lResult
= m_ListView
.HitTest(&htinfo
);
2840 /* Send WM_*SCROLL messages every 250 ms during drag-scrolling */
2841 ::GetClientRect(m_ListView
, &clientRect
);
2842 if (htinfo
.pt
.x
== m_ptLastMousePos
.x
&& htinfo
.pt
.y
== m_ptLastMousePos
.y
&&
2843 (htinfo
.pt
.x
< SCROLLAREAWIDTH
|| htinfo
.pt
.x
> clientRect
.right
- SCROLLAREAWIDTH
||
2844 htinfo
.pt
.y
< SCROLLAREAWIDTH
|| htinfo
.pt
.y
> clientRect
.bottom
- SCROLLAREAWIDTH
))
2846 m_cScrollDelay
= (m_cScrollDelay
+ 1) % 5; /* DragOver is called every 50 ms */
2847 if (m_cScrollDelay
== 0)
2849 /* Mouse did hover another 250 ms over the scroll-area */
2850 if (htinfo
.pt
.x
< SCROLLAREAWIDTH
)
2851 m_ListView
.SendMessageW(WM_HSCROLL
, SB_LINEUP
, 0);
2853 if (htinfo
.pt
.x
> clientRect
.right
- SCROLLAREAWIDTH
)
2854 m_ListView
.SendMessageW(WM_HSCROLL
, SB_LINEDOWN
, 0);
2856 if (htinfo
.pt
.y
< SCROLLAREAWIDTH
)
2857 m_ListView
.SendMessageW(WM_VSCROLL
, SB_LINEUP
, 0);
2859 if (htinfo
.pt
.y
> clientRect
.bottom
- SCROLLAREAWIDTH
)
2860 m_ListView
.SendMessageW(WM_VSCROLL
, SB_LINEDOWN
, 0);
2865 m_cScrollDelay
= 0; /* Reset, if the cursor is not over the listview's scroll-area */
2868 m_ptLastMousePos
= htinfo
.pt
;
2870 /* If we are still over the previous sub-item, notify it via DragOver and return. */
2871 if (m_pCurDropTarget
&& lResult
== m_iDragOverItem
)
2872 return m_pCurDropTarget
->DragOver(grfKeyState
, pt
, pdwEffect
);
2874 /* We've left the previous sub-item, notify it via DragLeave and Release it. */
2875 if (m_pCurDropTarget
)
2877 m_pCurDropTarget
->DragLeave();
2878 m_pCurDropTarget
.Release();
2881 m_iDragOverItem
= lResult
;
2884 /* We are not above one of the listview's subitems. Bind to the parent folder's
2885 * DropTarget interface. */
2886 hr
= m_pSFParent
->CreateViewObject(NULL
, IID_PPV_ARG(IDropTarget
,&m_pCurDropTarget
));
2890 /* Query the relative PIDL of the shellfolder object represented by the currently
2891 * dragged over listview-item ... */
2892 PCUITEMID_CHILD pidl
= _PidlByItem(lResult
);
2894 /* ... and bind m_pCurDropTarget to the IDropTarget interface of an UIObject of this object */
2895 hr
= m_pSFParent
->GetUIObjectOf(m_ListView
, 1, &pidl
, IID_NULL_PPV_ARG(IDropTarget
, &m_pCurDropTarget
));
2898 /* If anything failed, m_pCurDropTarget should be NULL now, which ought to be a save state. */
2902 /* Notify the item just entered via DragEnter. */
2903 return m_pCurDropTarget
->DragEnter(m_pCurDataObject
, grfKeyState
, pt
, pdwEffect
);
2906 HRESULT WINAPI
CDefView::DragEnter(IDataObject
*pDataObject
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2908 /* Get a hold on the data object for later calls to DragEnter on the sub-folders */
2909 m_pCurDataObject
= pDataObject
;
2910 pDataObject
->AddRef();
2912 return drag_notify_subitem(grfKeyState
, pt
, pdwEffect
);
2915 HRESULT WINAPI
CDefView::DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2917 return drag_notify_subitem(grfKeyState
, pt
, pdwEffect
);
2920 HRESULT WINAPI
CDefView::DragLeave()
2922 if (m_pCurDropTarget
)
2924 m_pCurDropTarget
->DragLeave();
2925 m_pCurDropTarget
.Release();
2928 if (m_pCurDataObject
!= NULL
)
2930 m_pCurDataObject
.Release();
2933 m_iDragOverItem
= 0;
2938 HRESULT WINAPI
CDefView::Drop(IDataObject
* pDataObject
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2940 if (m_pCurDropTarget
)
2942 m_pCurDropTarget
->Drop(pDataObject
, grfKeyState
, pt
, pdwEffect
);
2943 m_pCurDropTarget
.Release();
2946 m_pCurDataObject
.Release();
2947 m_iDragOverItem
= 0;
2951 /**********************************************************
2952 * ISVDropSource implementation
2955 HRESULT WINAPI
CDefView::QueryContinueDrag(BOOL fEscapePressed
, DWORD grfKeyState
)
2957 TRACE("(%p)\n", this);
2960 return DRAGDROP_S_CANCEL
;
2961 else if (!(grfKeyState
& MK_LBUTTON
) && !(grfKeyState
& MK_RBUTTON
))
2962 return DRAGDROP_S_DROP
;
2967 HRESULT WINAPI
CDefView::GiveFeedback(DWORD dwEffect
)
2969 TRACE("(%p)\n", this);
2971 return DRAGDROP_S_USEDEFAULTCURSORS
;
2974 /**********************************************************
2975 * ISVViewObject implementation
2978 HRESULT 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
)
2980 FIXME("Stub: this=%p\n", this);
2985 HRESULT WINAPI
CDefView::GetColorSet(DWORD dwDrawAspect
, LONG lindex
, void *pvAspect
, DVTARGETDEVICE
*ptd
, HDC hicTargetDevice
, LOGPALETTE
**ppColorSet
)
2987 FIXME("Stub: this=%p\n", this);
2992 HRESULT WINAPI
CDefView::Freeze(DWORD dwDrawAspect
, LONG lindex
, void *pvAspect
, DWORD
*pdwFreeze
)
2994 FIXME("Stub: this=%p\n", this);
2999 HRESULT WINAPI
CDefView::Unfreeze(DWORD dwFreeze
)
3001 FIXME("Stub: this=%p\n", this);
3006 HRESULT WINAPI
CDefView::SetAdvise(DWORD aspects
, DWORD advf
, IAdviseSink
*pAdvSink
)
3008 FIXME("partial stub: %p %08x %08x %p\n", this, aspects
, advf
, pAdvSink
);
3010 /* FIXME: we set the AdviseSink, but never use it to send any advice */
3011 m_pAdvSink
= pAdvSink
;
3012 m_dwAspects
= aspects
;
3018 HRESULT WINAPI
CDefView::GetAdvise(DWORD
*pAspects
, DWORD
*pAdvf
, IAdviseSink
**ppAdvSink
)
3020 TRACE("this=%p pAspects=%p pAdvf=%p ppAdvSink=%p\n", this, pAspects
, pAdvf
, ppAdvSink
);
3024 *ppAdvSink
= m_pAdvSink
;
3025 m_pAdvSink
.p
->AddRef();
3029 *pAspects
= m_dwAspects
;
3037 HRESULT STDMETHODCALLTYPE
CDefView::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
3039 if (IsEqualIID(guidService
, SID_IShellBrowser
))
3040 return m_pShellBrowser
->QueryInterface(riid
, ppvObject
);
3041 else if(IsEqualIID(guidService
, SID_IFolderView
))
3042 return QueryInterface(riid
, ppvObject
);
3044 return E_NOINTERFACE
;
3047 HRESULT
CDefView::_MergeToolbar()
3049 CComPtr
<IExplorerToolbar
> ptb
;
3052 hr
= IUnknown_QueryService(m_pShellBrowser
, IID_IExplorerToolbar
, IID_PPV_ARG(IExplorerToolbar
, &ptb
));
3056 m_Category
= CGID_DefViewFrame
;
3058 hr
= ptb
->SetCommandTarget(static_cast<IOleCommandTarget
*>(this), &m_Category
, 0);
3066 hr
= ptb
->AddButtons(&m_Category
, buttonsCount
, buttons
);
3073 /**********************************************************
3074 * IShellView_Constructor
3076 HRESULT WINAPI
IShellView_Constructor(IShellFolder
*pFolder
, IShellView
**newView
)
3078 return ShellObjectCreatorInit
<CDefView
>(pFolder
, IID_IShellView
, newView
);
3081 HRESULT WINAPI
CDefView_Constructor(IShellFolder
*pFolder
, REFIID riid
, LPVOID
* ppvOut
)
3083 return ShellObjectCreatorInit
<CDefView
>(pFolder
, riid
, ppvOut
);