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: CheckToolbar: handle the "new folder" and "folder up" button
28 - Load/Save the view state from/into the stream provided by the ShellBrowser.
29 - When editing starts on item, set edit text to for editing value.
30 - Fix shell view to handle view mode popup exec.
31 - The background context menu should have a pidl just like foreground menus. This
32 causes crashes when dynamic handlers try to use the NULL pidl.
33 - Reorder of columns doesn't work - might be bug in comctl32
41 WINE_DEFAULT_DEBUG_CHANNEL(shell
);
45 static const WCHAR SV_CLASS_NAME
[] = {'S', 'H', 'E', 'L', 'L', 'D', 'L', 'L', '_', 'D', 'e', 'f', 'V', 'i', 'e', 'w', 0};
52 } LISTVIEW_SORT_INFO
, *LPLISTVIEW_SORT_INFO
;
54 #define SHV_CHANGE_NOTIFY WM_USER + 0x1111
56 /* For the context menu of the def view, the id of the items are based on 1 because we need
57 to call TrackPopupMenu and let it use the 0 value as an indication that the menu was canceled */
58 #define CONTEXT_MENU_BASE_ID 1
61 public CWindowImpl
<CDefView
, CWindow
, CControlWinTraits
>,
62 public CComObjectRootEx
<CComMultiThreadModelNoCS
>,
65 public IShellFolderView
,
66 public IOleCommandTarget
,
70 public IServiceProvider
73 CComPtr
<IShellFolder
> m_pSFParent
;
74 CComPtr
<IShellFolder2
> m_pSF2Parent
;
75 CComPtr
<IShellFolderViewCB
> m_pShellFolderViewCB
;
76 CComPtr
<IShellBrowser
> m_pShellBrowser
;
77 CComPtr
<ICommDlgBrowser
> m_pCommDlgBrowser
;
78 CComPtr
<IShellFolderViewDual
> m_pShellFolderViewDual
;
81 FOLDERSETTINGS m_FolderSettings
;
82 HMENU m_hMenu
; /* Handle to the menu bar of the browser */
83 HMENU m_hMenuArrangeModes
; /* Handle to the popup menu with the arrange modes */
84 HMENU m_hMenuViewModes
; /* Handle to the popup menu with the view modes */
85 HMENU m_hContextMenu
; /* Handle to the open context menu */
86 BOOL m_bmenuBarInitialized
;
89 PCUITEMID_CHILD
*m_apidl
;
90 PIDLIST_ABSOLUTE m_pidlParent
;
91 LISTVIEW_SORT_INFO m_sortInfo
;
92 ULONG m_hNotify
; /* Change notification handle */
96 CComPtr
<IAdviseSink
> m_pAdvSink
;
98 CComPtr
<IDataObject
> m_pSourceDataObject
;
99 CComPtr
<IDropTarget
> m_pCurDropTarget
; /* The sub-item, which is currently dragged over */
100 CComPtr
<IDataObject
> m_pCurDataObject
; /* The dragged data-object */
101 LONG m_iDragOverItem
; /* Dragged over item's index, iff m_pCurDropTarget != NULL */
102 UINT m_cScrollDelay
; /* Send a WM_*SCROLL msg every 250 ms during drag-scroll */
103 POINT m_ptLastMousePos
; /* Mouse position at last DragOver call */
104 POINT m_ptFirstMousePos
; /* Mouse position when the drag operation started */
107 CComPtr
<IContextMenu
> m_pCM
;
113 SFVM_CUSTOMVIEWINFO_DATA m_viewinfo_data
;
116 HRESULT
_MergeToolbar();
118 HRESULT
_DoFolderViewCB(UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
123 HRESULT WINAPI
Initialize(IShellFolder
*shellFolder
);
124 HRESULT
IncludeObject(PCUITEMID_CHILD pidl
);
125 HRESULT
OnDefaultCommand();
126 HRESULT
OnStateChange(UINT uFlags
);
127 void UpdateStatusbar();
130 void UpdateListColors();
132 HRESULT
DefMessageSFVCB(UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
133 static INT CALLBACK
ListViewCompareItems(LPARAM lParam1
, LPARAM lParam2
, LPARAM lpData
);
135 PCUITEMID_CHILD
_PidlByItem(int i
);
136 PCUITEMID_CHILD
_PidlByItem(LVITEM
& lvItem
);
137 int LV_FindItemByPidl(PCUITEMID_CHILD pidl
);
138 BOOLEAN
LV_AddItem(PCUITEMID_CHILD pidl
);
139 BOOLEAN
LV_DeleteItem(PCUITEMID_CHILD pidl
);
140 BOOLEAN
LV_RenameItem(PCUITEMID_CHILD pidlOld
, PCUITEMID_CHILD pidlNew
);
141 BOOLEAN
LV_ProdItem(PCUITEMID_CHILD pidl
);
142 static INT CALLBACK
fill_list(LPVOID ptr
, LPVOID arg
);
144 HRESULT
FillFileMenu();
145 HRESULT
FillEditMenu();
146 HRESULT
FillViewMenu();
147 HRESULT
FillArrangeAsMenu(HMENU hmenuArrange
);
148 HRESULT
CheckViewMode(HMENU hmenuView
);
149 UINT
GetSelections();
150 HRESULT
OpenSelectedItems();
152 void DoActivate(UINT uState
);
153 HRESULT
drag_notify_subitem(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
154 HRESULT
InvokeContextMenuCommand(UINT uCommand
);
155 LRESULT
OnExplorerCommand(UINT uCommand
, BOOL bUseSelection
);
157 // *** IOleWindow methods ***
158 virtual HRESULT STDMETHODCALLTYPE
GetWindow(HWND
*lphwnd
);
159 virtual HRESULT STDMETHODCALLTYPE
ContextSensitiveHelp(BOOL fEnterMode
);
161 // *** IShellView methods ***
162 virtual HRESULT STDMETHODCALLTYPE
TranslateAccelerator(MSG
*pmsg
);
163 virtual HRESULT STDMETHODCALLTYPE
EnableModeless(BOOL fEnable
);
164 virtual HRESULT STDMETHODCALLTYPE
UIActivate(UINT uState
);
165 virtual HRESULT STDMETHODCALLTYPE
Refresh();
166 virtual HRESULT STDMETHODCALLTYPE
CreateViewWindow(IShellView
*psvPrevious
, LPCFOLDERSETTINGS pfs
, IShellBrowser
*psb
, RECT
*prcView
, HWND
*phWnd
);
167 virtual HRESULT STDMETHODCALLTYPE
DestroyViewWindow();
168 virtual HRESULT STDMETHODCALLTYPE
GetCurrentInfo(LPFOLDERSETTINGS pfs
);
169 virtual HRESULT STDMETHODCALLTYPE
AddPropertySheetPages(DWORD dwReserved
, LPFNSVADDPROPSHEETPAGE pfn
, LPARAM lparam
);
170 virtual HRESULT STDMETHODCALLTYPE
SaveViewState();
171 virtual HRESULT STDMETHODCALLTYPE
SelectItem(PCUITEMID_CHILD pidlItem
, SVSIF uFlags
);
172 virtual HRESULT STDMETHODCALLTYPE
GetItemObject(UINT uItem
, REFIID riid
, void **ppv
);
174 // *** IShellView2 methods ***
175 virtual HRESULT STDMETHODCALLTYPE
GetView(SHELLVIEWID
*view_guid
, ULONG view_type
);
176 virtual HRESULT STDMETHODCALLTYPE
CreateViewWindow2(LPSV2CVW2_PARAMS view_params
);
177 virtual HRESULT STDMETHODCALLTYPE
HandleRename(LPCITEMIDLIST new_pidl
);
178 virtual HRESULT STDMETHODCALLTYPE
SelectAndPositionItem(LPCITEMIDLIST item
, UINT flags
, POINT
*point
);
180 // *** IShellView3 methods ***
181 virtual HRESULT STDMETHODCALLTYPE
CreateViewWindow3(IShellBrowser
*psb
, IShellView
*psvPrevious
, SV3CVW3_FLAGS view_flags
, FOLDERFLAGS mask
, FOLDERFLAGS flags
, FOLDERVIEWMODE mode
, const SHELLVIEWID
*view_id
, RECT
*prcView
, HWND
*hwnd
);
183 // *** IFolderView methods ***
184 virtual HRESULT STDMETHODCALLTYPE
GetCurrentViewMode(UINT
*pViewMode
);
185 virtual HRESULT STDMETHODCALLTYPE
SetCurrentViewMode(UINT ViewMode
);
186 virtual HRESULT STDMETHODCALLTYPE
GetFolder(REFIID riid
, void **ppv
);
187 virtual HRESULT STDMETHODCALLTYPE
Item(int iItemIndex
, PITEMID_CHILD
*ppidl
);
188 virtual HRESULT STDMETHODCALLTYPE
ItemCount(UINT uFlags
, int *pcItems
);
189 virtual HRESULT STDMETHODCALLTYPE
Items(UINT uFlags
, REFIID riid
, void **ppv
);
190 virtual HRESULT STDMETHODCALLTYPE
GetSelectionMarkedItem(int *piItem
);
191 virtual HRESULT STDMETHODCALLTYPE
GetFocusedItem(int *piItem
);
192 virtual HRESULT STDMETHODCALLTYPE
GetItemPosition(PCUITEMID_CHILD pidl
, POINT
*ppt
);
193 virtual HRESULT STDMETHODCALLTYPE
GetSpacing(POINT
*ppt
);
194 virtual HRESULT STDMETHODCALLTYPE
GetDefaultSpacing(POINT
*ppt
);
195 virtual HRESULT STDMETHODCALLTYPE
GetAutoArrange();
196 virtual HRESULT STDMETHODCALLTYPE
SelectItem(int iItem
, DWORD dwFlags
);
197 virtual HRESULT STDMETHODCALLTYPE
SelectAndPositionItems(UINT cidl
, PCUITEMID_CHILD_ARRAY apidl
, POINT
*apt
, DWORD dwFlags
);
199 // *** IShellFolderView methods ***
200 virtual HRESULT STDMETHODCALLTYPE
Rearrange(LPARAM sort
);
201 virtual HRESULT STDMETHODCALLTYPE
GetArrangeParam(LPARAM
*sort
);
202 virtual HRESULT STDMETHODCALLTYPE
ArrangeGrid();
203 virtual HRESULT STDMETHODCALLTYPE
AutoArrange();
204 virtual HRESULT STDMETHODCALLTYPE
AddObject(PITEMID_CHILD pidl
, UINT
*item
);
205 virtual HRESULT STDMETHODCALLTYPE
GetObject(PITEMID_CHILD
*pidl
, UINT item
);
206 virtual HRESULT STDMETHODCALLTYPE
RemoveObject(PITEMID_CHILD pidl
, UINT
*item
);
207 virtual HRESULT STDMETHODCALLTYPE
GetObjectCount(UINT
*count
);
208 virtual HRESULT STDMETHODCALLTYPE
SetObjectCount(UINT count
, UINT flags
);
209 virtual HRESULT STDMETHODCALLTYPE
UpdateObject(PITEMID_CHILD pidl_old
, PITEMID_CHILD pidl_new
, UINT
*item
);
210 virtual HRESULT STDMETHODCALLTYPE
RefreshObject(PITEMID_CHILD pidl
, UINT
*item
);
211 virtual HRESULT STDMETHODCALLTYPE
SetRedraw(BOOL redraw
);
212 virtual HRESULT STDMETHODCALLTYPE
GetSelectedCount(UINT
*count
);
213 virtual HRESULT STDMETHODCALLTYPE
GetSelectedObjects(PCUITEMID_CHILD
**pidl
, UINT
*items
);
214 virtual HRESULT STDMETHODCALLTYPE
IsDropOnSource(IDropTarget
*drop_target
);
215 virtual HRESULT STDMETHODCALLTYPE
GetDragPoint(POINT
*pt
);
216 virtual HRESULT STDMETHODCALLTYPE
GetDropPoint(POINT
*pt
);
217 virtual HRESULT STDMETHODCALLTYPE
MoveIcons(IDataObject
*obj
);
218 virtual HRESULT STDMETHODCALLTYPE
SetItemPos(PCUITEMID_CHILD pidl
, POINT
*pt
);
219 virtual HRESULT STDMETHODCALLTYPE
IsBkDropTarget(IDropTarget
*drop_target
);
220 virtual HRESULT STDMETHODCALLTYPE
SetClipboard(BOOL move
);
221 virtual HRESULT STDMETHODCALLTYPE
SetPoints(IDataObject
*obj
);
222 virtual HRESULT STDMETHODCALLTYPE
GetItemSpacing(ITEMSPACING
*spacing
);
223 virtual HRESULT STDMETHODCALLTYPE
SetCallback(IShellFolderViewCB
*new_cb
, IShellFolderViewCB
**old_cb
);
224 virtual HRESULT STDMETHODCALLTYPE
Select(UINT flags
);
225 virtual HRESULT STDMETHODCALLTYPE
QuerySupport(UINT
*support
);
226 virtual HRESULT STDMETHODCALLTYPE
SetAutomationObject(IDispatch
*disp
);
228 // *** IOleCommandTarget methods ***
229 virtual HRESULT STDMETHODCALLTYPE
QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
, OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
);
230 virtual HRESULT STDMETHODCALLTYPE
Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
);
232 // *** IDropTarget methods ***
233 virtual HRESULT STDMETHODCALLTYPE
DragEnter(IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
234 virtual HRESULT STDMETHODCALLTYPE
DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
235 virtual HRESULT STDMETHODCALLTYPE
DragLeave();
236 virtual HRESULT STDMETHODCALLTYPE
Drop(IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
238 // *** IDropSource methods ***
239 virtual HRESULT STDMETHODCALLTYPE
QueryContinueDrag(BOOL fEscapePressed
, DWORD grfKeyState
);
240 virtual HRESULT STDMETHODCALLTYPE
GiveFeedback(DWORD dwEffect
);
242 // *** IViewObject methods ***
243 virtual HRESULT STDMETHODCALLTYPE
Draw(DWORD dwDrawAspect
, LONG lindex
, void *pvAspect
, DVTARGETDEVICE
*ptd
,
244 HDC hdcTargetDev
, HDC hdcDraw
, LPCRECTL lprcBounds
, LPCRECTL lprcWBounds
,
245 BOOL ( STDMETHODCALLTYPE
*pfnContinue
)(ULONG_PTR dwContinue
), ULONG_PTR dwContinue
);
246 virtual HRESULT STDMETHODCALLTYPE
GetColorSet(DWORD dwDrawAspect
, LONG lindex
, void *pvAspect
,
247 DVTARGETDEVICE
*ptd
, HDC hicTargetDev
, LOGPALETTE
**ppColorSet
);
248 virtual HRESULT STDMETHODCALLTYPE
Freeze(DWORD dwDrawAspect
, LONG lindex
, void *pvAspect
, DWORD
*pdwFreeze
);
249 virtual HRESULT STDMETHODCALLTYPE
Unfreeze(DWORD dwFreeze
);
250 virtual HRESULT STDMETHODCALLTYPE
SetAdvise(DWORD aspects
, DWORD advf
, IAdviseSink
*pAdvSink
);
251 virtual HRESULT STDMETHODCALLTYPE
GetAdvise(DWORD
*pAspects
, DWORD
*pAdvf
, IAdviseSink
**ppAdvSink
);
253 // *** IServiceProvider methods ***
254 virtual HRESULT STDMETHODCALLTYPE
QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
);
257 LRESULT
OnShowWindow(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
258 LRESULT
OnGetDlgCode(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
259 LRESULT
OnDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
260 LRESULT
OnEraseBackground(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
261 LRESULT
OnPrintClient(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
262 LRESULT
OnSysColorChange(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
263 LRESULT
OnGetShellBrowser(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
264 LRESULT
OnNCCreate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
265 LRESULT
OnNCDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
266 LRESULT
OnCreate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
267 LRESULT
OnContextMenu(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
268 LRESULT
OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
269 LRESULT
OnActivate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
270 LRESULT
OnSetFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
271 LRESULT
OnKillFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
272 LRESULT
OnCommand(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
273 LRESULT
OnNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
274 LRESULT
OnChangeNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
275 LRESULT
OnCustomItem(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
276 LRESULT
OnSettingChange(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
277 LRESULT
OnInitMenuPopup(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
279 static ATL::CWndClassInfo
& GetWndClassInfo()
281 static ATL::CWndClassInfo wc
=
283 { sizeof(WNDCLASSEX
), CS_PARENTDC
, StartWindowProc
,
285 LoadCursor(NULL
, IDC_ARROW
), NULL
, NULL
, SV_CLASS_NAME
, NULL
287 NULL
, NULL
, IDC_ARROW
, TRUE
, 0, _T("")
292 virtual WNDPROC
GetWindowProc()
297 static LRESULT CALLBACK
WindowProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
302 // Must hold a reference during message handling
303 pThis
= reinterpret_cast<CDefView
*>(hWnd
);
305 result
= CWindowImpl
<CDefView
, CWindow
, CControlWinTraits
>::WindowProc(hWnd
, uMsg
, wParam
, lParam
);
310 BEGIN_MSG_MAP(CDefView
)
311 MESSAGE_HANDLER(WM_SIZE
, OnSize
)
312 MESSAGE_HANDLER(WM_SETFOCUS
, OnSetFocus
)
313 MESSAGE_HANDLER(WM_KILLFOCUS
, OnKillFocus
)
314 MESSAGE_HANDLER(WM_NCCREATE
, OnNCCreate
)
315 MESSAGE_HANDLER(WM_NCDESTROY
, OnNCDestroy
)
316 MESSAGE_HANDLER(WM_CREATE
, OnCreate
)
317 MESSAGE_HANDLER(WM_ACTIVATE
, OnActivate
)
318 MESSAGE_HANDLER(WM_NOTIFY
, OnNotify
)
319 MESSAGE_HANDLER(WM_COMMAND
, OnCommand
)
320 MESSAGE_HANDLER(SHV_CHANGE_NOTIFY
, OnChangeNotify
)
321 MESSAGE_HANDLER(WM_CONTEXTMENU
, OnContextMenu
)
322 MESSAGE_HANDLER(WM_DRAWITEM
, OnCustomItem
)
323 MESSAGE_HANDLER(WM_MEASUREITEM
, OnCustomItem
)
324 MESSAGE_HANDLER(WM_SHOWWINDOW
, OnShowWindow
)
325 MESSAGE_HANDLER(WM_GETDLGCODE
, OnGetDlgCode
)
326 MESSAGE_HANDLER(WM_DESTROY
, OnDestroy
)
327 MESSAGE_HANDLER(WM_ERASEBKGND
, OnEraseBackground
)
328 MESSAGE_HANDLER(WM_PRINTCLIENT
, OnPrintClient
)
329 MESSAGE_HANDLER(WM_SYSCOLORCHANGE
, OnSysColorChange
)
330 MESSAGE_HANDLER(CWM_GETISHELLBROWSER
, OnGetShellBrowser
)
331 MESSAGE_HANDLER(WM_SETTINGCHANGE
, OnSettingChange
)
332 MESSAGE_HANDLER(WM_INITMENUPOPUP
, OnInitMenuPopup
)
335 BEGIN_COM_MAP(CDefView
)
336 // Windows returns E_NOINTERFACE for IOleWindow
337 // COM_INTERFACE_ENTRY_IID(IID_IOleWindow, IOleWindow)
338 COM_INTERFACE_ENTRY_IID(IID_IShellView
, IShellView
)
339 COM_INTERFACE_ENTRY_IID(IID_CDefView
, IShellView
)
340 COM_INTERFACE_ENTRY_IID(IID_IShellView2
, IShellView2
)
341 COM_INTERFACE_ENTRY_IID(IID_IFolderView
, IFolderView
)
342 COM_INTERFACE_ENTRY_IID(IID_IShellFolderView
, IShellFolderView
)
343 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget
, IOleCommandTarget
)
344 COM_INTERFACE_ENTRY_IID(IID_IDropTarget
, IDropTarget
)
345 COM_INTERFACE_ENTRY_IID(IID_IDropSource
, IDropSource
)
346 COM_INTERFACE_ENTRY_IID(IID_IViewObject
, IViewObject
)
347 COM_INTERFACE_ENTRY_IID(IID_IServiceProvider
, IServiceProvider
)
352 #define IDM_VIEW_FILES (FCIDM_SHVIEWFIRST + 0x500)
353 #define IDM_VIEW_IDW (FCIDM_SHVIEWFIRST + 0x501)
354 #define IDM_MYFILEITEM (FCIDM_SHVIEWFIRST + 0x502)
356 #define ID_LISTVIEW 1
359 #define GET_WM_COMMAND_ID(wp, lp) LOWORD(wp)
360 #define GET_WM_COMMAND_HWND(wp, lp) (HWND)(lp)
361 #define GET_WM_COMMAND_CMD(wp, lp) HIWORD(wp)
363 typedef void (CALLBACK
*PFNSHGETSETTINGSPROC
)(LPSHELLFLAGSTATE lpsfs
, DWORD dwMask
);
365 CDefView::CDefView() :
369 m_hMenuArrangeModes(NULL
),
370 m_hMenuViewModes(NULL
),
371 m_hContextMenu(NULL
),
372 m_bmenuBarInitialized(FALSE
),
386 ZeroMemory(&m_FolderSettings
, sizeof(m_FolderSettings
));
387 ZeroMemory(&m_sortInfo
, sizeof(m_sortInfo
));
388 ZeroMemory(&m_ptLastMousePos
, sizeof(m_ptLastMousePos
));
389 ZeroMemory(&m_Category
, sizeof(m_Category
));
390 m_viewinfo_data
.clrText
= GetSysColor(COLOR_WINDOWTEXT
);
391 m_viewinfo_data
.clrTextBack
= GetSysColor(COLOR_WINDOW
);
392 m_viewinfo_data
.hbmBack
= NULL
;
395 CDefView::~CDefView()
397 TRACE(" destroying IShellView(%p)\n", this);
399 if (m_viewinfo_data
.hbmBack
)
401 ::DeleteObject(m_viewinfo_data
.hbmBack
);
402 m_viewinfo_data
.hbmBack
= NULL
;
413 HRESULT WINAPI
CDefView::Initialize(IShellFolder
*shellFolder
)
415 m_pSFParent
= shellFolder
;
416 shellFolder
->QueryInterface(IID_PPV_ARG(IShellFolder2
, &m_pSF2Parent
));
421 /**********************************************************
423 * ##### helperfunctions for communication with ICommDlgBrowser #####
425 HRESULT
CDefView::IncludeObject(PCUITEMID_CHILD pidl
)
429 if (m_pCommDlgBrowser
.p
!= NULL
)
431 TRACE("ICommDlgBrowser::IncludeObject pidl=%p\n", pidl
);
432 ret
= m_pCommDlgBrowser
->IncludeObject(this, pidl
);
433 TRACE("-- returns 0x%08x\n", ret
);
439 HRESULT
CDefView::OnDefaultCommand()
441 HRESULT ret
= S_FALSE
;
443 if (m_pCommDlgBrowser
.p
!= NULL
)
445 TRACE("ICommDlgBrowser::OnDefaultCommand\n");
446 ret
= m_pCommDlgBrowser
->OnDefaultCommand(this);
447 TRACE("-- returns 0x%08x\n", ret
);
453 HRESULT
CDefView::OnStateChange(UINT uFlags
)
455 HRESULT ret
= S_FALSE
;
457 if (m_pCommDlgBrowser
.p
!= NULL
)
459 TRACE("ICommDlgBrowser::OnStateChange flags=%x\n", uFlags
);
460 ret
= m_pCommDlgBrowser
->OnStateChange(this, uFlags
);
466 /**********************************************************
467 * set the toolbar of the filedialog buttons
469 * - activates the buttons from the shellbrowser according to
472 void CDefView::CheckToolbar()
478 if (m_pCommDlgBrowser
!= NULL
)
480 m_pShellBrowser
->SendControlMsg(FCW_TOOLBAR
, TB_CHECKBUTTON
,
481 FCIDM_TB_SMALLICON
, (m_FolderSettings
.ViewMode
== FVM_LIST
) ? TRUE
: FALSE
, &result
);
482 m_pShellBrowser
->SendControlMsg(FCW_TOOLBAR
, TB_CHECKBUTTON
,
483 FCIDM_TB_REPORTVIEW
, (m_FolderSettings
.ViewMode
== FVM_DETAILS
) ? TRUE
: FALSE
, &result
);
484 m_pShellBrowser
->SendControlMsg(FCW_TOOLBAR
, TB_ENABLEBUTTON
,
485 FCIDM_TB_SMALLICON
, TRUE
, &result
);
486 m_pShellBrowser
->SendControlMsg(FCW_TOOLBAR
, TB_ENABLEBUTTON
,
487 FCIDM_TB_REPORTVIEW
, TRUE
, &result
);
491 void CDefView::UpdateStatusbar()
493 WCHAR szFormat
[MAX_PATH
] = {0};
494 WCHAR szObjects
[MAX_PATH
] = {0};
497 cSelectedItems
= m_ListView
.GetSelectedCount();
500 LoadStringW(shell32_hInstance
, IDS_OBJECTS_SELECTED
, szFormat
, _countof(szFormat
));
501 StringCchPrintfW(szObjects
, MAX_PATH
, szFormat
, cSelectedItems
);
505 LoadStringW(shell32_hInstance
, IDS_OBJECTS
, szFormat
, _countof(szFormat
));
506 StringCchPrintfW(szObjects
, MAX_PATH
, szFormat
, m_ListView
.GetItemCount());
508 m_pShellBrowser
->SetStatusTextSB(szObjects
);
511 /**********************************************************
513 * ##### helperfunctions for initializing the view #####
516 /**********************************************************
517 * ShellView_CreateList()
519 * - creates the list view window
521 BOOL
CDefView::CreateList()
524 DWORD dwStyle
, dwExStyle
;
529 dwStyle
= WS_TABSTOP
| WS_VISIBLE
| WS_CHILDWINDOW
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
|
530 LVS_SHAREIMAGELISTS
| LVS_EDITLABELS
| LVS_AUTOARRANGE
;
531 dwExStyle
= WS_EX_CLIENTEDGE
;
533 if (m_FolderSettings
.fFlags
& FWF_DESKTOP
)
534 dwStyle
|= LVS_ALIGNLEFT
;
536 dwStyle
|= LVS_ALIGNTOP
| LVS_SHOWSELALWAYS
;
538 ViewMode
= m_FolderSettings
.ViewMode
;
539 hr
= _DoFolderViewCB(SFVM_DEFVIEWMODE
, NULL
, (LPARAM
)&ViewMode
);
542 if (ViewMode
>= FVM_FIRST
&& ViewMode
<= FVM_LAST
)
543 m_FolderSettings
.ViewMode
= ViewMode
;
545 ERR("Ignoring invalid ViewMode from SFVM_DEFVIEWMODE: %u (was: %u)\n", ViewMode
, m_FolderSettings
.ViewMode
);
548 switch (m_FolderSettings
.ViewMode
)
555 dwStyle
|= LVS_REPORT
;
559 dwStyle
|= LVS_SMALLICON
;
571 if (m_FolderSettings
.fFlags
& FWF_AUTOARRANGE
)
572 dwStyle
|= LVS_AUTOARRANGE
;
574 if (m_FolderSettings
.fFlags
& FWF_DESKTOP
)
575 m_FolderSettings
.fFlags
|= FWF_NOCLIENTEDGE
| FWF_NOSCROLL
;
577 if (m_FolderSettings
.fFlags
& FWF_SINGLESEL
)
578 dwStyle
|= LVS_SINGLESEL
;
580 if (m_FolderSettings
.fFlags
& FWF_NOCLIENTEDGE
)
581 dwExStyle
&= ~WS_EX_CLIENTEDGE
;
583 RECT rcListView
= {0,0,0,0};
584 m_ListView
.Create(m_hWnd
, rcListView
, L
"FolderView", dwStyle
, dwExStyle
, ID_LISTVIEW
);
589 m_sortInfo
.bIsAscending
= TRUE
;
590 m_sortInfo
.nHeaderID
= -1;
591 m_sortInfo
.nLastHeaderID
= -1;
593 /* UpdateShellSettings(); */
597 void CDefView::UpdateListColors()
599 if (m_FolderSettings
.fFlags
& FWF_DESKTOP
)
601 /* Check if drop shadows option is enabled */
602 BOOL bDropShadow
= FALSE
;
603 DWORD cbDropShadow
= sizeof(bDropShadow
);
606 * The desktop ListView always take the default desktop colours, by
607 * remaining transparent and letting user32/win32k paint itself the
608 * desktop background color, if any.
610 m_ListView
.SetBkColor(CLR_NONE
);
612 SHGetValueW(HKEY_CURRENT_USER
, L
"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced",
613 L
"ListviewShadow", NULL
, &bDropShadow
, &cbDropShadow
);
616 /* Set the icon background transparent */
617 m_ListView
.SetTextBkColor(CLR_NONE
);
618 m_ListView
.SetTextColor(RGB(255, 255, 255));
619 m_ListView
.SetExtendedListViewStyle(LVS_EX_TRANSPARENTSHADOWTEXT
, LVS_EX_TRANSPARENTSHADOWTEXT
);
623 /* Set the icon background as the same colour as the desktop */
624 COLORREF crDesktop
= GetSysColor(COLOR_DESKTOP
);
625 m_ListView
.SetTextBkColor(crDesktop
);
626 if (GetRValue(crDesktop
) + GetGValue(crDesktop
) + GetBValue(crDesktop
) > 128 * 3)
627 m_ListView
.SetTextColor(RGB(0, 0, 0));
629 m_ListView
.SetTextColor(RGB(255, 255, 255));
630 m_ListView
.SetExtendedListViewStyle(0, LVS_EX_TRANSPARENTSHADOWTEXT
);
635 // text background color
636 COLORREF clrTextBack
= m_viewinfo_data
.clrTextBack
;
637 m_ListView
.SetTextBkColor(clrTextBack
);
641 if (m_viewinfo_data
.clrText
!= CLR_INVALID
)
642 clrText
= m_viewinfo_data
.clrText
;
644 clrText
= GetSysColor(COLOR_WINDOWTEXT
);
646 m_ListView
.SetTextColor(clrText
);
648 // Background is painted by the parent via WM_PRINTCLIENT.
649 m_ListView
.SetExtendedListViewStyle(LVS_EX_TRANSPARENTBKGND
, LVS_EX_TRANSPARENTBKGND
);
653 /**********************************************************
654 * ShellView_InitList()
656 * - adds all needed columns to the shellview
658 BOOL
CDefView::InitList()
662 HIMAGELIST big_icons
, small_icons
;
666 m_ListView
.DeleteAllItems();
668 m_hMenuArrangeModes
= CreateMenu();
672 for (int i
= 0; 1; i
++)
674 if (FAILED(m_pSF2Parent
->GetDetailsOf(NULL
, i
, &sd
)))
676 StrRetToStrNW( szTemp
, 50, &sd
.str
, NULL
);
677 m_ListView
.InsertColumn(i
, szTemp
, sd
.fmt
, sd
.cxChar
* 8);
679 InsertMenuW(m_hMenuArrangeModes
, -1, MF_STRING
, 0x30 + i
, szTemp
);
682 InsertMenuW(m_hMenuArrangeModes
, -1, MF_BYPOSITION
| MF_SEPARATOR
, 0, 0);
686 FIXME("no m_pSF2Parent\n");
689 Shell_GetImageLists(&big_icons
, &small_icons
);
690 m_ListView
.SetImageList(big_icons
, LVSIL_NORMAL
);
691 m_ListView
.SetImageList(small_icons
, LVSIL_SMALL
);
696 /*************************************************************************
697 * ShellView_ListViewCompareItems
699 * Compare Function for the Listview (FileOpen Dialog)
702 * lParam1 [I] the first ItemIdList to compare with
703 * lParam2 [I] the second ItemIdList to compare with
704 * lpData [I] The column ID for the header Ctrl to process
707 * A negative value if the first item should precede the second,
708 * a positive value if the first item should follow the second,
709 * or zero if the two items are equivalent
711 INT CALLBACK
CDefView::ListViewCompareItems(LPARAM lParam1
, LPARAM lParam2
, LPARAM lpData
)
713 PCUIDLIST_RELATIVE pidl1
= reinterpret_cast<PCUIDLIST_RELATIVE
>(lParam1
);
714 PCUIDLIST_RELATIVE pidl2
= reinterpret_cast<PCUIDLIST_RELATIVE
>(lParam2
);
715 CDefView
*pThis
= reinterpret_cast<CDefView
*>(lpData
);
717 HRESULT hres
= pThis
->m_pSFParent
->CompareIDs(pThis
->m_sortInfo
.nHeaderID
, pidl1
, pidl2
);
718 if (FAILED_UNEXPECTEDLY(hres
))
721 SHORT nDiff
= HRESULT_CODE(hres
);
722 if (!pThis
->m_sortInfo
.bIsAscending
)
727 BOOL
CDefView::_Sort()
732 if (m_ListView
.GetWindowLongPtr(GWL_STYLE
) & LVS_NOSORTHEADER
)
735 hHeader
= (HWND
)m_ListView
.SendMessage(LVM_GETHEADER
, 0, 0);
736 ZeroMemory(&hColumn
, sizeof(hColumn
));
738 /* If the sorting column changed, remove the sorting style from the old column */
739 if ( (m_sortInfo
.nLastHeaderID
!= -1) &&
740 (m_sortInfo
.nLastHeaderID
!= m_sortInfo
.nHeaderID
) )
742 hColumn
.mask
= HDI_FORMAT
;
743 Header_GetItem(hHeader
, m_sortInfo
.nLastHeaderID
, &hColumn
);
744 hColumn
.fmt
&= ~(HDF_SORTUP
| HDF_SORTDOWN
);
745 Header_SetItem(hHeader
, m_sortInfo
.nLastHeaderID
, &hColumn
);
748 /* Set the sorting style to the new column */
749 hColumn
.mask
= HDI_FORMAT
;
750 Header_GetItem(hHeader
, m_sortInfo
.nHeaderID
, &hColumn
);
752 hColumn
.fmt
&= (m_sortInfo
.bIsAscending
? ~HDF_SORTDOWN
: ~HDF_SORTUP
);
753 hColumn
.fmt
|= (m_sortInfo
.bIsAscending
? HDF_SORTUP
: HDF_SORTDOWN
);
754 Header_SetItem(hHeader
, m_sortInfo
.nHeaderID
, &hColumn
);
756 /* Sort the list, using the current values of nHeaderID and bIsAscending */
757 m_sortInfo
.nLastHeaderID
= m_sortInfo
.nHeaderID
;
758 return m_ListView
.SortItems(ListViewCompareItems
, this);
761 PCUITEMID_CHILD
CDefView::_PidlByItem(int i
)
763 return reinterpret_cast<PCUITEMID_CHILD
>(m_ListView
.GetItemData(i
));
766 PCUITEMID_CHILD
CDefView::_PidlByItem(LVITEM
& lvItem
)
768 return reinterpret_cast<PCUITEMID_CHILD
>(lvItem
.lParam
);
771 /**********************************************************
772 * LV_FindItemByPidl()
774 int CDefView::LV_FindItemByPidl(PCUITEMID_CHILD pidl
)
776 int cItems
= m_ListView
.GetItemCount();
778 for (int i
= 0; i
<cItems
; i
++)
780 PCUITEMID_CHILD currentpidl
= _PidlByItem(i
);
781 HRESULT hr
= m_pSFParent
->CompareIDs(0, pidl
, currentpidl
);
783 if (SUCCEEDED(hr
) && !HRESULT_CODE(hr
))
791 /**********************************************************
794 BOOLEAN
CDefView::LV_AddItem(PCUITEMID_CHILD pidl
)
798 TRACE("(%p)(pidl=%p)\n", this, pidl
);
800 lvItem
.mask
= LVIF_TEXT
| LVIF_IMAGE
| LVIF_PARAM
; /*set the mask*/
801 lvItem
.iItem
= m_ListView
.GetItemCount(); /*add the item to the end of the list*/
803 lvItem
.lParam
= reinterpret_cast<LPARAM
>(ILClone(pidl
)); /*set the item's data*/
804 lvItem
.pszText
= LPSTR_TEXTCALLBACKW
; /*get text on a callback basis*/
805 lvItem
.iImage
= I_IMAGECALLBACK
; /*get the image on a callback basis*/
806 lvItem
.stateMask
= LVIS_CUT
;
808 if (m_ListView
.InsertItem(&lvItem
) == -1)
814 /**********************************************************
817 BOOLEAN
CDefView::LV_DeleteItem(PCUITEMID_CHILD pidl
)
821 TRACE("(%p)(pidl=%p)\n", this, pidl
);
823 nIndex
= LV_FindItemByPidl(pidl
);
825 return (-1 == m_ListView
.DeleteItem(nIndex
)) ? FALSE
: TRUE
;
828 /**********************************************************
831 BOOLEAN
CDefView::LV_RenameItem(PCUITEMID_CHILD pidlOld
, PCUITEMID_CHILD pidlNew
)
836 TRACE("(%p)(pidlold=%p pidlnew=%p)\n", this, pidlOld
, pidlNew
);
838 nItem
= LV_FindItemByPidl(pidlOld
);
842 lvItem
.mask
= LVIF_PARAM
; /* only the pidl */
843 lvItem
.iItem
= nItem
;
845 m_ListView
.GetItem(&lvItem
);
847 SHFree(reinterpret_cast<LPVOID
>(lvItem
.lParam
));
848 lvItem
.mask
= LVIF_PARAM
|LVIF_IMAGE
;
849 lvItem
.iItem
= nItem
;
851 lvItem
.lParam
= reinterpret_cast<LPARAM
>(ILClone(pidlNew
)); /* set the item's data */
852 lvItem
.iImage
= SHMapPIDLToSystemImageListIndex(m_pSFParent
, pidlNew
, 0);
853 m_ListView
.SetItem(&lvItem
);
854 m_ListView
.Update(nItem
);
855 return TRUE
; /* FIXME: better handling */
861 /**********************************************************
864 BOOLEAN
CDefView::LV_ProdItem(PCUITEMID_CHILD pidl
)
869 TRACE("(%p)(pidl=%p)\n", this, pidl
);
871 nItem
= LV_FindItemByPidl(pidl
);
875 lvItem
.mask
= LVIF_IMAGE
;
876 lvItem
.iItem
= nItem
;
878 lvItem
.iImage
= SHMapPIDLToSystemImageListIndex(m_pSFParent
, pidl
, 0);
879 m_ListView
.SetItem(&lvItem
);
880 m_ListView
.Update(nItem
);
887 /**********************************************************
888 * ShellView_FillList()
890 * - gets the objectlist from the shellfolder
892 * - fills the list into the view
894 INT CALLBACK
CDefView::fill_list(LPVOID ptr
, LPVOID arg
)
896 PITEMID_CHILD pidl
= static_cast<PITEMID_CHILD
>(ptr
);
897 CDefView
*pThis
= static_cast<CDefView
*>(arg
);
899 /* in a commdlg This works as a filemask*/
900 if (pThis
->IncludeObject(pidl
) == S_OK
)
901 pThis
->LV_AddItem(pidl
);
907 HRESULT
CDefView::FillList()
909 CComPtr
<IEnumIDList
> pEnumIDList
;
915 DWORD dFlags
= SHCONTF_NONFOLDERS
| SHCONTF_FOLDERS
;
919 /* determine if there is a setting to show all the hidden files/folders */
920 if (RegOpenKeyExW(HKEY_CURRENT_USER
, L
"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced", 0, KEY_QUERY_VALUE
, &hKey
) == ERROR_SUCCESS
)
922 DWORD dataLength
, flagVal
;
924 dataLength
= sizeof(flagVal
);
925 if (RegQueryValueExW(hKey
, L
"Hidden", NULL
, NULL
, (LPBYTE
)&flagVal
, &dataLength
) == ERROR_SUCCESS
)
927 /* if the value is 1, then show all hidden files/folders */
930 dFlags
|= SHCONTF_INCLUDEHIDDEN
;
931 m_ListView
.SendMessageW(LVM_SETCALLBACKMASK
, LVIS_CUT
, 0);
939 /* get the itemlist from the shfolder */
940 hRes
= m_pSFParent
->EnumObjects(m_hWnd
, dFlags
, &pEnumIDList
);
948 /* create a pointer array */
949 hdpa
= DPA_Create(16);
952 return(E_OUTOFMEMORY
);
955 /* copy the items into the array*/
956 while((S_OK
== pEnumIDList
->Next(1, &pidl
, &dwFetched
)) && dwFetched
)
958 if (DPA_InsertPtr(hdpa
, 0x7fff, pidl
) == -1)
964 /*turn the listview's redrawing off*/
965 m_ListView
.SetRedraw(FALSE
);
967 DPA_DestroyCallback( hdpa
, fill_list
, this);
972 m_pSF2Parent
->GetDefaultColumn(NULL
, (ULONG
*)&m_sortInfo
.nHeaderID
, NULL
);
976 FIXME("no m_pSF2Parent\n");
978 m_sortInfo
.bIsAscending
= TRUE
;
981 if (m_viewinfo_data
.hbmBack
)
983 ::DeleteObject(m_viewinfo_data
.hbmBack
);
984 m_viewinfo_data
.hbmBack
= NULL
;
987 // load custom background image and custom text color
988 m_viewinfo_data
.cbSize
= sizeof(m_viewinfo_data
);
989 _DoFolderViewCB(SFVM_GET_CUSTOMVIEWINFO
, 0, (LPARAM
)&m_viewinfo_data
);
991 /*turn the listview's redrawing back on and force it to draw*/
992 m_ListView
.SetRedraw(TRUE
);
996 if (!(m_FolderSettings
.fFlags
& FWF_DESKTOP
))
999 m_ListView
.InvalidateRect(NULL
, TRUE
);
1002 _DoFolderViewCB(SFVM_LISTREFRESHED
, NULL
, NULL
);
1007 LRESULT
CDefView::OnShowWindow(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1009 m_ListView
.UpdateWindow();
1014 LRESULT
CDefView::OnGetDlgCode(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1016 return m_ListView
.SendMessageW(uMsg
, 0, 0);
1019 LRESULT
CDefView::OnDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1026 DestroyMenu(m_hMenu
);
1029 RevokeDragDrop(m_hWnd
);
1030 SHChangeNotifyDeregister(m_hNotify
);
1032 SHFree(m_pidlParent
);
1033 m_pidlParent
= NULL
;
1039 LRESULT
CDefView::OnEraseBackground(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1041 /* redirect to parent */
1042 if (m_FolderSettings
.fFlags
& (FWF_DESKTOP
| FWF_TRANSPARENT
))
1043 return SendMessageW(GetParent(), WM_ERASEBKGND
, wParam
, lParam
);
1050 DrawTileBitmap(HDC hDC
, LPCRECT prc
, HBITMAP hbm
, INT nWidth
, INT nHeight
, INT dx
, INT dy
)
1052 INT x0
= prc
->left
, y0
= prc
->top
, x1
= prc
->right
, y1
= prc
->bottom
;
1056 HDC hMemDC
= CreateCompatibleDC(hDC
);
1057 HGDIOBJ hbmOld
= SelectObject(hMemDC
, hbm
);
1059 for (INT y
= y0
; y
< y1
; y
+= nHeight
)
1061 for (INT x
= x0
; x
< x1
; x
+= nWidth
)
1063 BitBlt(hDC
, x
, y
, nWidth
, nHeight
, hMemDC
, 0, 0, SRCCOPY
);
1067 SelectObject(hMemDC
, hbmOld
);
1071 LRESULT
CDefView::OnPrintClient(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1073 HDC hDC
= (HDC
)wParam
;
1076 ::GetClientRect(m_ListView
, &rc
);
1078 if (m_viewinfo_data
.hbmBack
)
1081 if (::GetObject(m_viewinfo_data
.hbmBack
, sizeof(BITMAP
), &bm
))
1083 INT dx
= -(::GetScrollPos(m_ListView
, SB_HORZ
) % bm
.bmWidth
);
1084 INT dy
= -(::GetScrollPos(m_ListView
, SB_VERT
) % bm
.bmHeight
);
1085 DrawTileBitmap(hDC
, &rc
, m_viewinfo_data
.hbmBack
, bm
.bmWidth
, bm
.bmHeight
, dx
, dy
);
1090 FillRect(hDC
, &rc
, GetSysColorBrush(COLOR_WINDOW
));
1098 LRESULT
CDefView::OnSysColorChange(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1100 /* Update desktop labels color */
1103 /* Forward WM_SYSCOLORCHANGE to common controls */
1104 return m_ListView
.SendMessageW(uMsg
, 0, 0);
1107 LRESULT
CDefView::OnGetShellBrowser(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1109 return reinterpret_cast<LRESULT
>(m_pShellBrowser
.p
);
1112 LRESULT
CDefView::OnNCCreate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1119 LRESULT
CDefView::OnNCDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1126 /**********************************************************
1127 * ShellView_OnCreate()
1129 LRESULT
CDefView::OnCreate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1131 CComPtr
<IDropTarget
> pdt
;
1132 SHChangeNotifyEntry ntreg
;
1133 CComPtr
<IPersistFolder2
> ppf2
;
1135 TRACE("%p\n", this);
1137 if (SUCCEEDED(QueryInterface(IID_PPV_ARG(IDropTarget
, &pdt
))))
1139 if (FAILED(RegisterDragDrop(m_hWnd
, pdt
)))
1140 ERR("Registering Drag Drop Failed");
1143 /* register for receiving notifications */
1144 m_pSFParent
->QueryInterface(IID_PPV_ARG(IPersistFolder2
, &ppf2
));
1147 ppf2
->GetCurFolder(&m_pidlParent
);
1148 ntreg
.fRecursive
= TRUE
;
1149 ntreg
.pidl
= m_pidlParent
;
1150 m_hNotify
= SHChangeNotifyRegister(m_hWnd
, SHCNRF_InterruptLevel
| SHCNRF_ShellLevel
, SHCNE_ALLEVENTS
, SHV_CHANGE_NOTIFY
, 1, &ntreg
);
1161 /* _DoFolderViewCB(SFVM_GETNOTIFY, ?? ??) */
1163 m_hAccel
= LoadAcceleratorsW(shell32_hInstance
, MAKEINTRESOURCEW(IDA_SHELLVIEW
));
1170 /**********************************************************
1171 * #### Handling of the menus ####
1174 extern "C" DWORD WINAPI
SHMenuIndexFromID(HMENU hMenu
, UINT uID
);
1176 HMENU
GetSubmenuByID(HMENU hmenu
, UINT id
)
1178 MENUITEMINFOW mii
= {sizeof(mii
), MIIM_SUBMENU
};
1179 if (::GetMenuItemInfoW(hmenu
, id
, FALSE
, &mii
))
1180 return mii
.hSubMenu
;
1185 /* ReallyGetMenuItemID returns the id of an item even if it opens a submenu,
1186 GetMenuItemID returns -1 if the specified item opens a submenu */
1187 UINT
ReallyGetMenuItemID(HMENU hmenu
, int i
)
1189 MENUITEMINFOW mii
= {sizeof(mii
), MIIM_ID
};
1190 if (::GetMenuItemInfoW(hmenu
, i
, TRUE
, &mii
))
1196 HRESULT
CDefView::FillFileMenu()
1198 HMENU hFileMenu
= GetSubmenuByID(m_hMenu
, FCIDM_MENU_FILE
);
1202 /* Cleanup the items added previously */
1203 for (int i
= GetMenuItemCount(hFileMenu
) - 1; i
>= 0; i
--)
1205 UINT id
= GetMenuItemID(hFileMenu
, i
);
1206 if (id
< FCIDM_BROWSERFIRST
|| id
> FCIDM_BROWSERLAST
)
1207 DeleteMenu(hFileMenu
, i
, MF_BYPOSITION
);
1210 /* Store the context menu in m_pCM and keep it in order to invoke the selected command later on */
1211 HRESULT hr
= GetItemObject(SVGIO_SELECTION
, IID_PPV_ARG(IContextMenu
, &m_pCM
));
1212 if (FAILED_UNEXPECTEDLY(hr
))
1215 HMENU hmenu
= CreatePopupMenu();
1217 hr
= m_pCM
->QueryContextMenu(hmenu
, 0, FCIDM_SHVIEWFIRST
, FCIDM_SHVIEWLAST
, 0);
1218 if (FAILED_UNEXPECTEDLY(hr
))
1221 // TODO: filter or something
1223 Shell_MergeMenus(hFileMenu
, hmenu
, 0, 0, 0xFFFF, MM_ADDSEPARATOR
| MM_SUBMENUSHAVEIDS
);
1225 ::DestroyMenu(hmenu
);
1230 HRESULT
CDefView::FillEditMenu()
1232 HMENU hEditMenu
= GetSubmenuByID(m_hMenu
, FCIDM_MENU_EDIT
);
1236 HMENU hmenuContents
= ::LoadMenuW(shell32_hInstance
, L
"MENU_003");
1240 Shell_MergeMenus(hEditMenu
, hmenuContents
, 0, 0, 0xFFFF, 0);
1242 ::DestroyMenu(hmenuContents
);
1247 HRESULT
CDefView::FillViewMenu()
1249 HMENU hViewMenu
= GetSubmenuByID(m_hMenu
, FCIDM_MENU_VIEW
);
1253 m_hMenuViewModes
= ::LoadMenuW(shell32_hInstance
, L
"MENU_001");
1254 if (!m_hMenuViewModes
)
1257 UINT i
= SHMenuIndexFromID(hViewMenu
, FCIDM_MENU_VIEW_SEP_OPTIONS
);
1258 Shell_MergeMenus(hViewMenu
, m_hMenuViewModes
, i
, 0, 0xFFFF, MM_ADDSEPARATOR
| MM_DONTREMOVESEPS
| MM_SUBMENUSHAVEIDS
);
1263 HRESULT
CDefView::FillArrangeAsMenu(HMENU hmenuArrange
)
1265 /* We only need to fill this once */
1266 if (GetMenuItemID(hmenuArrange
, 0) == FCIDM_SHVIEW_AUTOARRANGE
)
1268 Shell_MergeMenus(hmenuArrange
, m_hMenuArrangeModes
, 0, 0, 0xFFFF,0);
1271 /* Also check the menu item according to which we sort */
1272 CheckMenuRadioItem(hmenuArrange
,
1275 m_sortInfo
.nHeaderID
+ 0x30,
1278 if (m_FolderSettings
.ViewMode
== FVM_DETAILS
|| m_FolderSettings
.ViewMode
== FVM_LIST
)
1280 EnableMenuItem(hmenuArrange
, FCIDM_SHVIEW_AUTOARRANGE
, MF_BYCOMMAND
| MF_GRAYED
);
1284 EnableMenuItem(hmenuArrange
, FCIDM_SHVIEW_AUTOARRANGE
, MF_BYCOMMAND
);
1286 if (GetAutoArrange() == S_OK
)
1287 CheckMenuItem(hmenuArrange
, FCIDM_SHVIEW_AUTOARRANGE
, MF_CHECKED
);
1294 HRESULT
CDefView::CheckViewMode(HMENU hmenuView
)
1296 if (m_FolderSettings
.ViewMode
>= FVM_FIRST
&& m_FolderSettings
.ViewMode
<= FVM_LAST
)
1298 UINT iItemFirst
= FCIDM_SHVIEW_BIGICON
;
1299 UINT iItemLast
= iItemFirst
+ FVM_LAST
- FVM_FIRST
;
1300 UINT iItem
= iItemFirst
+ m_FolderSettings
.ViewMode
- FVM_FIRST
;
1301 CheckMenuRadioItem(hmenuView
, iItemFirst
, iItemLast
, iItem
, MF_BYCOMMAND
);
1307 /**********************************************************
1308 * ShellView_GetSelections()
1310 * - fills the m_apidl list with the selected objects
1313 * number of selected items
1315 UINT
CDefView::GetSelections()
1319 m_cidl
= m_ListView
.GetSelectedCount();
1320 m_apidl
= static_cast<PCUITEMID_CHILD
*>(SHAlloc(m_cidl
* sizeof(PCUITEMID_CHILD
)));
1327 TRACE("-- Items selected =%u\n", m_cidl
);
1331 while ((lvIndex
= m_ListView
.GetNextItem(lvIndex
, LVNI_SELECTED
)) > -1)
1333 m_apidl
[i
] = _PidlByItem(lvIndex
);
1337 TRACE("-- selected Item found\n");
1343 HRESULT
CDefView::InvokeContextMenuCommand(UINT uCommand
)
1345 CMINVOKECOMMANDINFO cmi
;
1347 ZeroMemory(&cmi
, sizeof(cmi
));
1348 cmi
.cbSize
= sizeof(cmi
);
1349 cmi
.lpVerb
= MAKEINTRESOURCEA(uCommand
);
1352 if (GetKeyState(VK_SHIFT
) & 0x8000)
1353 cmi
.fMask
|= CMIC_MASK_SHIFT_DOWN
;
1355 if (GetKeyState(VK_CONTROL
) & 0x8000)
1356 cmi
.fMask
|= CMIC_MASK_CONTROL_DOWN
;
1358 HRESULT hr
= m_pCM
->InvokeCommand(&cmi
);
1359 if (FAILED_UNEXPECTEDLY(hr
))
1365 /**********************************************************
1366 * ShellView_OpenSelectedItems()
1368 HRESULT
CDefView::OpenSelectedItems()
1374 m_cidl
= m_ListView
.GetSelectedCount();
1378 hResult
= OnDefaultCommand();
1379 if (hResult
== S_OK
)
1382 hMenu
= CreatePopupMenu();
1386 hResult
= GetItemObject(SVGIO_SELECTION
, IID_PPV_ARG(IContextMenu
, &m_pCM
));
1387 if (FAILED_UNEXPECTEDLY(hResult
))
1390 hResult
= m_pCM
->QueryContextMenu(hMenu
, 0, FCIDM_SHVIEWFIRST
, FCIDM_SHVIEWLAST
, CMF_DEFAULTONLY
);
1391 if (FAILED_UNEXPECTEDLY(hResult
))
1394 uCommand
= GetMenuDefaultItem(hMenu
, FALSE
, 0);
1395 if (uCommand
== (UINT
)-1)
1401 InvokeContextMenuCommand(uCommand
);
1410 IUnknown_SetSite(m_pCM
, NULL
);
1417 /**********************************************************
1418 * ShellView_DoContextMenu()
1420 LRESULT
CDefView::OnContextMenu(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1426 TRACE("(%p)\n", this);
1428 m_hContextMenu
= CreatePopupMenu();
1429 if (!m_hContextMenu
)
1432 m_cidl
= m_ListView
.GetSelectedCount();
1434 hResult
= GetItemObject( m_cidl
? SVGIO_SELECTION
: SVGIO_BACKGROUND
, IID_PPV_ARG(IContextMenu
, &m_pCM
));
1435 if (FAILED_UNEXPECTEDLY(hResult
))
1438 /* Use 1 as the first id as we want 0 the mean that the user canceled the menu */
1439 hResult
= m_pCM
->QueryContextMenu(m_hContextMenu
, 0, CONTEXT_MENU_BASE_ID
, FCIDM_SHVIEWLAST
, CMF_NORMAL
);
1440 if (FAILED_UNEXPECTEDLY(hResult
))
1443 /* There is no position requested, so try to find one */
1449 /* Do we have a focused item, */
1450 if ((lvIndex
= m_ListView
.GetNextItem(-1, LVIS_FOCUSED
)) < 0)
1452 /* or a selected item? */
1453 lvIndex
= m_ListView
.GetNextItem(-1, LVIS_SELECTED
);
1455 /* We got something */
1458 /* Let's find the center of the icon */
1459 RECT rc
= { LVIR_ICON
};
1460 m_ListView
.SendMessage(LVM_GETITEMRECT
, lvIndex
, (LPARAM
)&rc
);
1461 pt
.x
= (rc
.right
+ rc
.left
) / 2;
1462 pt
.y
= (rc
.bottom
+ rc
.top
) / 2;
1466 /* We have to drop it somewhere.. */
1470 m_ListView
.ClientToScreen(&pt
);
1476 x
= GET_X_LPARAM(lParam
);
1477 y
= GET_Y_LPARAM(lParam
);
1480 uCommand
= TrackPopupMenu(m_hContextMenu
,
1481 TPM_LEFTALIGN
| TPM_RETURNCMD
| TPM_LEFTBUTTON
| TPM_RIGHTBUTTON
,
1482 x
, y
, 0, m_hWnd
, NULL
);
1486 if (uCommand
== FCIDM_SHVIEW_OPEN
&& OnDefaultCommand() == S_OK
)
1489 InvokeContextMenuCommand(uCommand
- CONTEXT_MENU_BASE_ID
);
1494 IUnknown_SetSite(m_pCM
, NULL
);
1500 DestroyMenu(m_hContextMenu
);
1501 m_hContextMenu
= NULL
;
1507 LRESULT
CDefView::OnExplorerCommand(UINT uCommand
, BOOL bUseSelection
)
1512 hMenu
= CreatePopupMenu();
1516 hResult
= GetItemObject( bUseSelection
? SVGIO_SELECTION
: SVGIO_BACKGROUND
, IID_PPV_ARG(IContextMenu
, &m_pCM
));
1517 if (FAILED_UNEXPECTEDLY( hResult
))
1520 hResult
= m_pCM
->QueryContextMenu(hMenu
, 0, FCIDM_SHVIEWFIRST
, FCIDM_SHVIEWLAST
, CMF_NORMAL
);
1521 if (FAILED_UNEXPECTEDLY( hResult
))
1524 InvokeContextMenuCommand(uCommand
);
1529 IUnknown_SetSite(m_pCM
, NULL
);
1539 /**********************************************************
1540 * ##### message handling #####
1543 /**********************************************************
1544 * ShellView_OnSize()
1546 LRESULT
CDefView::OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1548 WORD wWidth
, wHeight
;
1550 wWidth
= LOWORD(lParam
);
1551 wHeight
= HIWORD(lParam
);
1553 TRACE("%p width=%u height=%u\n", this, wWidth
, wHeight
);
1555 /* Resize the ListView to fit our window */
1558 ::MoveWindow(m_ListView
, 0, 0, wWidth
, wHeight
, TRUE
);
1561 _DoFolderViewCB(SFVM_SIZE
, 0, 0);
1566 /**********************************************************
1567 * ShellView_OnDeactivate()
1572 void CDefView::OnDeactivate()
1574 TRACE("%p\n", this);
1576 if (m_uState
!= SVUIA_DEACTIVATE
)
1578 // TODO: cleanup menu after deactivation
1580 m_uState
= SVUIA_DEACTIVATE
;
1584 void CDefView::DoActivate(UINT uState
)
1586 TRACE("%p uState=%x\n", this, uState
);
1588 /*don't do anything if the state isn't really changing */
1589 if (m_uState
== uState
)
1594 if (uState
== SVUIA_DEACTIVATE
)
1600 if(m_hMenu
&& !m_bmenuBarInitialized
)
1604 m_pShellBrowser
->SetMenuSB(m_hMenu
, 0, m_hWnd
);
1605 m_bmenuBarInitialized
= TRUE
;
1608 if (SVUIA_ACTIVATE_FOCUS
== uState
)
1610 m_ListView
.SetFocus();
1618 /**********************************************************
1619 * ShellView_OnActivate()
1621 LRESULT
CDefView::OnActivate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1623 DoActivate(SVUIA_ACTIVATE_FOCUS
);
1627 /**********************************************************
1628 * ShellView_OnSetFocus()
1631 LRESULT
CDefView::OnSetFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1633 TRACE("%p\n", this);
1635 /* Tell the browser one of our windows has received the focus. This
1636 should always be done before merging menus (OnActivate merges the
1637 menus) if one of our windows has the focus.*/
1639 m_pShellBrowser
->OnViewWindowActive(this);
1640 DoActivate(SVUIA_ACTIVATE_FOCUS
);
1642 /* Set the focus to the listview */
1643 m_ListView
.SetFocus();
1645 /* Notify the ICommDlgBrowser interface */
1646 OnStateChange(CDBOSC_SETFOCUS
);
1651 /**********************************************************
1652 * ShellView_OnKillFocus()
1654 LRESULT
CDefView::OnKillFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1656 TRACE("(%p) stub\n", this);
1658 DoActivate(SVUIA_ACTIVATE_NOFOCUS
);
1659 /* Notify the ICommDlgBrowser */
1660 OnStateChange(CDBOSC_KILLFOCUS
);
1665 /**********************************************************
1666 * ShellView_OnCommand()
1669 * the CmdID's are the ones from the context menu
1671 LRESULT
CDefView::OnCommand(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1678 dwCmdID
= GET_WM_COMMAND_ID(wParam
, lParam
);
1679 dwCmd
= GET_WM_COMMAND_CMD(wParam
, lParam
);
1680 hwndCmd
= GET_WM_COMMAND_HWND(wParam
, lParam
);
1682 TRACE("(%p)->(0x%08x 0x%08x %p) stub\n", this, dwCmdID
, dwCmd
, hwndCmd
);
1686 case FCIDM_SHVIEW_SMALLICON
:
1687 m_FolderSettings
.ViewMode
= FVM_SMALLICON
;
1688 m_ListView
.ModifyStyle(LVS_TYPEMASK
, LVS_SMALLICON
);
1692 case FCIDM_SHVIEW_BIGICON
:
1693 m_FolderSettings
.ViewMode
= FVM_ICON
;
1694 m_ListView
.ModifyStyle(LVS_TYPEMASK
, LVS_ICON
);
1698 case FCIDM_SHVIEW_LISTVIEW
:
1699 m_FolderSettings
.ViewMode
= FVM_LIST
;
1700 m_ListView
.ModifyStyle(LVS_TYPEMASK
, LVS_LIST
);
1704 case FCIDM_SHVIEW_REPORTVIEW
:
1705 m_FolderSettings
.ViewMode
= FVM_DETAILS
;
1706 m_ListView
.ModifyStyle(LVS_TYPEMASK
, LVS_REPORT
);
1710 /* the menu-ID's for sorting are 0x30... see shrec.rc */
1715 m_sortInfo
.nHeaderID
= dwCmdID
- 0x30;
1716 m_sortInfo
.bIsAscending
= TRUE
;
1720 case FCIDM_SHVIEW_SNAPTOGRID
:
1723 case FCIDM_SHVIEW_AUTOARRANGE
:
1724 if (GetAutoArrange() == S_OK
)
1725 m_ListView
.ModifyStyle(LVS_AUTOARRANGE
, 0);
1729 case FCIDM_SHVIEW_SELECTALL
:
1730 m_ListView
.SetItemState(-1, LVIS_SELECTED
, LVIS_SELECTED
);
1733 case FCIDM_SHVIEW_INVERTSELECTION
:
1734 nCount
= m_ListView
.GetItemCount();
1735 for (int i
=0; i
< nCount
; i
++)
1736 m_ListView
.SetItemState(i
, m_ListView
.GetItemState(i
, LVIS_SELECTED
) ? 0 : LVIS_SELECTED
, LVIS_SELECTED
);
1739 case FCIDM_SHVIEW_REFRESH
:
1743 case FCIDM_SHVIEW_DELETE
:
1744 case FCIDM_SHVIEW_CUT
:
1745 case FCIDM_SHVIEW_COPY
:
1746 case FCIDM_SHVIEW_RENAME
:
1747 case FCIDM_SHVIEW_PROPERTIES
:
1748 return OnExplorerCommand(dwCmdID
, TRUE
);
1750 case FCIDM_SHVIEW_INSERT
:
1751 case FCIDM_SHVIEW_UNDO
:
1752 case FCIDM_SHVIEW_INSERTLINK
:
1753 case FCIDM_SHVIEW_NEWFOLDER
:
1754 return OnExplorerCommand(dwCmdID
, FALSE
);
1756 /* WM_COMMAND messages from the file menu are routed to the CDefView so as to let m_pCM handle the command */
1757 if (m_pCM
&& dwCmd
== 0)
1759 InvokeContextMenuCommand(dwCmdID
);
1766 /**********************************************************
1767 * ShellView_OnNotify()
1770 LRESULT
CDefView::OnNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1774 LPNMLISTVIEW lpnmlv
;
1775 NMLVDISPINFOW
*lpdi
;
1776 PCUITEMID_CHILD pidl
;
1780 lpnmh
= (LPNMHDR
)lParam
;
1781 lpnmlv
= (LPNMLISTVIEW
)lpnmh
;
1782 lpdi
= (NMLVDISPINFOW
*)lpnmh
;
1784 TRACE("%p CtlID=%u lpnmh->code=%x\n", this, CtlID
, lpnmh
->code
);
1786 switch (lpnmh
->code
)
1789 TRACE("-- NM_SETFOCUS %p\n", this);
1790 OnSetFocus(0, 0, 0, unused
);
1794 TRACE("-- NM_KILLFOCUS %p\n", this);
1796 /* Notify the ICommDlgBrowser interface */
1797 OnStateChange(CDBOSC_KILLFOCUS
);
1801 TRACE("-- NM_CUSTOMDRAW %p\n", this);
1802 return CDRF_DODEFAULT
;
1804 case NM_RELEASEDCAPTURE
:
1805 TRACE("-- NM_RELEASEDCAPTURE %p\n", this);
1809 TRACE("-- NM_CLICK %p\n", this);
1813 TRACE("-- NM_RCLICK %p\n", this);
1817 TRACE("-- NM_DBLCLK %p\n", this);
1818 OpenSelectedItems();
1822 TRACE("-- NM_RETURN %p\n", this);
1823 OpenSelectedItems();
1827 TRACE("-- HDN_ENDTRACKW %p\n", this);
1828 /*nColumn1 = m_ListView.GetColumnWidth(0);
1829 nColumn2 = m_ListView.GetColumnWidth(1);*/
1832 case LVN_DELETEITEM
:
1833 TRACE("-- LVN_DELETEITEM %p\n", this);
1835 /*delete the pidl because we made a copy of it*/
1836 SHFree(reinterpret_cast<LPVOID
>(lpnmlv
->lParam
));
1840 case LVN_DELETEALLITEMS
:
1841 TRACE("-- LVN_DELETEALLITEMS %p\n", this);
1844 case LVN_INSERTITEM
:
1845 TRACE("-- LVN_INSERTITEM (STUB)%p\n", this);
1848 case LVN_ITEMACTIVATE
:
1849 TRACE("-- LVN_ITEMACTIVATE %p\n", this);
1850 OnStateChange(CDBOSC_SELCHANGE
); /* the browser will get the IDataObject now */
1853 case LVN_COLUMNCLICK
:
1854 m_sortInfo
.nHeaderID
= lpnmlv
->iSubItem
;
1855 if (m_sortInfo
.nLastHeaderID
== m_sortInfo
.nHeaderID
)
1856 m_sortInfo
.bIsAscending
= !m_sortInfo
.bIsAscending
;
1858 m_sortInfo
.bIsAscending
= TRUE
;
1862 case LVN_GETDISPINFOA
:
1863 case LVN_GETDISPINFOW
:
1864 TRACE("-- LVN_GETDISPINFO %p\n", this);
1865 pidl
= _PidlByItem(lpdi
->item
);
1867 if (lpdi
->item
.mask
& LVIF_TEXT
) /* text requested */
1872 if (FAILED_UNEXPECTEDLY(m_pSF2Parent
->GetDetailsOf(pidl
, lpdi
->item
.iSubItem
, &sd
)))
1875 if (lpnmh
->code
== LVN_GETDISPINFOA
)
1877 /* shouldn't happen */
1878 NMLVDISPINFOA
*lpdiA
= (NMLVDISPINFOA
*)lpnmh
;
1879 StrRetToStrNA( lpdiA
->item
.pszText
, lpdiA
->item
.cchTextMax
, &sd
.str
, NULL
);
1880 TRACE("-- text=%s\n", lpdiA
->item
.pszText
);
1882 else /* LVN_GETDISPINFOW */
1884 StrRetToStrNW( lpdi
->item
.pszText
, lpdi
->item
.cchTextMax
, &sd
.str
, NULL
);
1885 TRACE("-- text=%s\n", debugstr_w(lpdi
->item
.pszText
));
1890 FIXME("no m_pSF2Parent\n");
1893 if(lpdi
->item
.mask
& LVIF_IMAGE
) /* image requested */
1895 lpdi
->item
.iImage
= SHMapPIDLToSystemImageListIndex(m_pSFParent
, pidl
, 0);
1897 if(lpdi
->item
.mask
& LVIF_STATE
)
1899 ULONG attributes
= SFGAO_HIDDEN
;
1900 if (SUCCEEDED(m_pSFParent
->GetAttributesOf(1, &pidl
, &attributes
)))
1902 if (attributes
& SFGAO_HIDDEN
)
1904 lpdi
->item
.state
|= LVIS_CUT
;
1908 lpdi
->item
.mask
|= LVIF_DI_SETITEM
;
1911 case LVN_ITEMCHANGED
:
1912 TRACE("-- LVN_ITEMCHANGED %p\n", this);
1913 OnStateChange(CDBOSC_SELCHANGE
); /* the browser will get the IDataObject now */
1915 _DoFolderViewCB(SFVM_SELECTIONCHANGED
, NULL
/* FIXME */, NULL
/* FIXME */);
1919 case LVN_BEGINRDRAG
:
1920 TRACE("-- LVN_BEGINDRAG\n");
1922 if (GetSelections())
1924 CComPtr
<IDataObject
> pda
;
1925 DWORD dwAttributes
= SFGAO_CANCOPY
| SFGAO_CANLINK
;
1926 DWORD dwEffect
= DROPEFFECT_MOVE
;
1928 if (SUCCEEDED(m_pSFParent
->GetUIObjectOf(m_hWnd
, m_cidl
, m_apidl
, IID_NULL_PPV_ARG(IDataObject
, &pda
))))
1930 LPNMLISTVIEW params
= (LPNMLISTVIEW
)lParam
;
1932 if (SUCCEEDED(m_pSFParent
->GetAttributesOf(m_cidl
, m_apidl
, &dwAttributes
)))
1934 dwEffect
|= dwAttributes
& (SFGAO_CANCOPY
| SFGAO_CANLINK
);
1937 CComPtr
<IAsyncOperation
> piaso
;
1938 if (SUCCEEDED(pda
->QueryInterface(IID_PPV_ARG(IAsyncOperation
, &piaso
))))
1940 piaso
->SetAsyncMode(TRUE
);
1945 m_pSourceDataObject
= pda
;
1946 m_ptFirstMousePos
= params
->ptAction
;
1947 ClientToScreen(&m_ptFirstMousePos
);
1949 HIMAGELIST big_icons
, small_icons
;
1950 Shell_GetImageLists(&big_icons
, &small_icons
);
1951 PCUITEMID_CHILD pidl
= _PidlByItem(params
->iItem
);
1952 int iIcon
= SHMapPIDLToSystemImageListIndex(m_pSFParent
, pidl
, 0);
1954 m_ListView
.GetItemPosition(params
->iItem
, &ptItem
);
1956 ImageList_BeginDrag(big_icons
, iIcon
, params
->ptAction
.x
- ptItem
.x
, params
->ptAction
.y
- ptItem
.y
);
1958 DoDragDrop(pda
, this, dwEffect
, &dwEffect2
);
1960 m_pSourceDataObject
.Release();
1965 case LVN_BEGINLABELEDITW
:
1967 DWORD dwAttr
= SFGAO_CANRENAME
;
1968 pidl
= _PidlByItem(lpdi
->item
);
1970 TRACE("-- LVN_BEGINLABELEDITW %p\n", this);
1972 m_pSFParent
->GetAttributesOf(1, &pidl
, &dwAttr
);
1973 if (SFGAO_CANRENAME
& dwAttr
)
1981 case LVN_ENDLABELEDITW
:
1983 TRACE("-- LVN_ENDLABELEDITW %p\n", this);
1985 m_isEditing
= FALSE
;
1987 if (lpdi
->item
.pszText
)
1992 pidl
= _PidlByItem(lpdi
->item
);
1993 PITEMID_CHILD pidlNew
= NULL
;
1994 hr
= m_pSFParent
->SetNameOf(0, pidl
, lpdi
->item
.pszText
, SHGDN_INFOLDER
, &pidlNew
);
1996 if (SUCCEEDED(hr
) && pidlNew
)
1998 lvItem
.mask
= LVIF_PARAM
|LVIF_IMAGE
;
1999 lvItem
.iItem
= lpdi
->item
.iItem
;
2000 lvItem
.iSubItem
= 0;
2001 lvItem
.lParam
= reinterpret_cast<LPARAM
>(pidlNew
);
2002 lvItem
.iImage
= SHMapPIDLToSystemImageListIndex(m_pSFParent
, pidlNew
, 0);
2003 m_ListView
.SetItem(&lvItem
);
2004 m_ListView
.Update(lpdi
->item
.iItem
);
2013 TRACE("-- %p WM_COMMAND %x unhandled\n", this, lpnmh
->code
);
2021 * This is just a quick hack to make the desktop work correctly.
2022 * ITranslateShellChangeNotify's IsChildID is undocumented, but most likely the way that
2023 * a folder should know if it should update upon a change notification.
2024 * It is exported by merged folders at a minimum.
2026 static BOOL
ILIsParentOrSpecialParent(PCIDLIST_ABSOLUTE pidl1
, PCIDLIST_ABSOLUTE pidl2
)
2028 if (!pidl1
|| !pidl2
)
2030 if (ILIsParent(pidl1
, pidl2
, TRUE
))
2033 if (_ILIsDesktop(pidl1
))
2035 PIDLIST_ABSOLUTE deskpidl
;
2036 SHGetFolderLocation(NULL
, CSIDL_DESKTOPDIRECTORY
, NULL
, 0, &deskpidl
);
2037 if (ILIsParent(deskpidl
, pidl2
, TRUE
))
2043 SHGetFolderLocation(NULL
, CSIDL_COMMON_DESKTOPDIRECTORY
, NULL
, 0, &deskpidl
);
2044 if (ILIsParent(deskpidl
, pidl2
, TRUE
))
2054 /**********************************************************
2055 * ShellView_OnChange()
2057 LRESULT
CDefView::OnChangeNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
2059 PCIDLIST_ABSOLUTE
*Pidls
= reinterpret_cast<PCIDLIST_ABSOLUTE
*>(wParam
);
2060 BOOL bParent0
= ILIsParentOrSpecialParent(m_pidlParent
, Pidls
[0]);
2061 BOOL bParent1
= ILIsParentOrSpecialParent(m_pidlParent
, Pidls
[1]);
2063 TRACE("(%p)(%p,%p,0x%08x)\n", this, Pidls
[0], Pidls
[1], lParam
);
2065 switch (lParam
&~ SHCNE_INTERRUPT
)
2071 if (LV_FindItemByPidl(ILFindLastID(Pidls
[0])) == -1)
2073 LV_AddItem(ILFindLastID(Pidls
[0]));
2077 LV_ProdItem(ILFindLastID(Pidls
[0]));
2085 LV_DeleteItem(ILFindLastID(Pidls
[0]));
2088 case SHCNE_RENAMEFOLDER
:
2089 case SHCNE_RENAMEITEM
:
2090 if (bParent0
&& bParent1
)
2091 LV_RenameItem(ILFindLastID(Pidls
[0]), ILFindLastID(Pidls
[1]));
2093 LV_DeleteItem(ILFindLastID(Pidls
[0]));
2095 LV_AddItem(ILFindLastID(Pidls
[1]));
2098 case SHCNE_UPDATEITEM
:
2100 LV_RenameItem(ILFindLastID(Pidls
[0]), ILFindLastID(Pidls
[0]));
2103 case SHCNE_UPDATEDIR
:
2110 HRESULT
SHGetMenuIdFromMenuMsg(UINT uMsg
, LPARAM lParam
, UINT
*CmdId
);
2111 HRESULT
SHSetMenuIdInMenuMsg(UINT uMsg
, LPARAM lParam
, UINT CmdId
);
2113 /**********************************************************
2114 * CDefView::OnCustomItem
2116 LRESULT
CDefView::OnCustomItem(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
2121 ERR("no menu!!!\n");
2125 /* The lParam of WM_DRAWITEM WM_MEASUREITEM contain a menu id and this also needs to
2126 be changed to a menu identifier offset */
2128 HRESULT hres
= SHGetMenuIdFromMenuMsg(uMsg
, lParam
, &CmdID
);
2129 if (SUCCEEDED(hres
))
2130 SHSetMenuIdInMenuMsg(uMsg
, lParam
, CmdID
- CONTEXT_MENU_BASE_ID
);
2132 /* Forward the message to the IContextMenu2 */
2134 hres
= SHForwardContextMenuMsg(m_pCM
, uMsg
, wParam
, lParam
, &result
, TRUE
);
2136 return (SUCCEEDED(hres
));
2139 LRESULT
CDefView::OnSettingChange(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
2141 /* Wallpaper setting affects drop shadows effect */
2142 if (wParam
== SPI_SETDESKWALLPAPER
|| wParam
== 0)
2148 /**********************************************************
2149 * CDefView::OnInitMenuPopup
2151 LRESULT
CDefView::OnInitMenuPopup(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
2153 HMENU hmenu
= (HMENU
) wParam
;
2154 int nPos
= LOWORD(lParam
);
2157 OnCustomItem(uMsg
, wParam
, lParam
, bHandled
);
2159 HMENU hViewMenu
= GetSubmenuByID(m_hMenu
, FCIDM_MENU_VIEW
);
2161 /* Lets try to find out what the hell wParam is */
2162 if (hmenu
== GetSubMenu(m_hMenu
, nPos
))
2163 menuItemId
= ReallyGetMenuItemID(m_hMenu
, nPos
);
2164 else if (hViewMenu
&& hmenu
== GetSubMenu(hViewMenu
, nPos
))
2165 menuItemId
= ReallyGetMenuItemID(hViewMenu
, nPos
);
2166 else if (m_hContextMenu
&& hmenu
== GetSubMenu(m_hContextMenu
, nPos
))
2167 menuItemId
= ReallyGetMenuItemID(m_hContextMenu
, nPos
);
2173 case FCIDM_MENU_FILE
:
2176 case FCIDM_MENU_VIEW
:
2177 case FCIDM_SHVIEW_VIEW
:
2178 CheckViewMode(hmenu
);
2180 case FCIDM_SHVIEW_ARRANGE
:
2181 FillArrangeAsMenu(hmenu
);
2188 /**********************************************************
2191 * The INTERFACE of the IShellView object
2194 **********************************************************
2197 /**********************************************************
2198 * ShellView_GetWindow
2200 HRESULT WINAPI
CDefView::GetWindow(HWND
*phWnd
)
2202 TRACE("(%p)\n", this);
2209 HRESULT WINAPI
CDefView::ContextSensitiveHelp(BOOL fEnterMode
)
2211 FIXME("(%p) stub\n", this);
2216 /**********************************************************
2217 * IShellView_TranslateAccelerator
2220 * use the accel functions
2222 HRESULT WINAPI
CDefView::TranslateAccelerator(LPMSG lpmsg
)
2227 if (lpmsg
->message
>= WM_KEYFIRST
&& lpmsg
->message
<= WM_KEYLAST
)
2229 if (::TranslateAcceleratorW(m_hWnd
, m_hAccel
, lpmsg
) != 0)
2232 TRACE("-- key=0x%04lx\n", lpmsg
->wParam
) ;
2235 return m_pShellBrowser
->TranslateAcceleratorSB(lpmsg
, 0);
2238 HRESULT WINAPI
CDefView::EnableModeless(BOOL fEnable
)
2240 FIXME("(%p) stub\n", this);
2245 HRESULT WINAPI
CDefView::UIActivate(UINT uState
)
2247 // CHAR szName[MAX_PATH];
2249 int nPartArray
[1] = { -1};
2251 TRACE("(%p)->(state=%x) stub\n", this, uState
);
2253 /* don't do anything if the state isn't really changing */
2254 if (m_uState
== uState
)
2259 /* OnActivate handles the menu merging and internal state */
2262 /* only do This if we are active */
2263 if (uState
!= SVUIA_DEACTIVATE
)
2267 GetFolderPath is not a method of IShellFolder
2268 IShellFolder_GetFolderPath( m_pSFParent, szName, sizeof(szName) );
2270 /* set the number of parts */
2271 m_pShellBrowser
->SendControlMsg(FCW_STATUS
, SB_SETPARTS
, 1, (LPARAM
)nPartArray
, &lResult
);
2273 /* set the text for the parts */
2275 m_pShellBrowser->SendControlMsg(FCW_STATUS, SB_SETTEXTA, 0, (LPARAM)szName, &lResult);
2282 HRESULT WINAPI
CDefView::Refresh()
2284 TRACE("(%p)\n", this);
2286 m_ListView
.DeleteAllItems();
2292 HRESULT WINAPI
CDefView::CreateViewWindow(IShellView
*lpPrevView
, LPCFOLDERSETTINGS lpfs
, IShellBrowser
*psb
, RECT
*prcView
, HWND
*phWnd
)
2294 return CreateViewWindow3(psb
, lpPrevView
, SV3CVW3_DEFAULT
,
2295 (FOLDERFLAGS
)lpfs
->fFlags
, (FOLDERFLAGS
)lpfs
->fFlags
, (FOLDERVIEWMODE
)lpfs
->ViewMode
, NULL
, prcView
, phWnd
);
2298 HRESULT WINAPI
CDefView::DestroyViewWindow()
2300 TRACE("(%p)\n", this);
2302 /* Make absolutely sure all our UI is cleaned up */
2303 UIActivate(SVUIA_DEACTIVATE
);
2307 // "Accelerator tables loaded from resources are freed automatically when the application terminates." -- MSDN
2311 if (m_hMenuArrangeModes
)
2313 DestroyMenu(m_hMenuArrangeModes
);
2314 m_hMenuArrangeModes
= NULL
;
2317 if (m_hMenuViewModes
)
2319 DestroyMenu(m_hMenuViewModes
);
2320 m_hMenuViewModes
= NULL
;
2325 DestroyMenu(m_hMenu
);
2331 m_ListView
.DestroyWindow();
2339 m_pShellBrowser
.Release();
2340 m_pCommDlgBrowser
.Release();
2345 HRESULT WINAPI
CDefView::GetCurrentInfo(LPFOLDERSETTINGS lpfs
)
2347 TRACE("(%p)->(%p) vmode=%x flags=%x\n", this, lpfs
,
2348 m_FolderSettings
.ViewMode
, m_FolderSettings
.fFlags
);
2351 return E_INVALIDARG
;
2353 *lpfs
= m_FolderSettings
;
2357 HRESULT WINAPI
CDefView::AddPropertySheetPages(DWORD dwReserved
, LPFNADDPROPSHEETPAGE lpfn
, LPARAM lparam
)
2359 FIXME("(%p) stub\n", this);
2364 HRESULT WINAPI
CDefView::SaveViewState()
2366 FIXME("(%p) stub\n", this);
2371 HRESULT WINAPI
CDefView::SelectItem(PCUITEMID_CHILD pidl
, UINT uFlags
)
2375 TRACE("(%p)->(pidl=%p, 0x%08x) stub\n", this, pidl
, uFlags
);
2377 i
= LV_FindItemByPidl(pidl
);
2381 if(uFlags
& SVSI_ENSUREVISIBLE
)
2382 m_ListView
.EnsureVisible(i
, FALSE
);
2384 LVITEMW lvItem
= {0};
2385 lvItem
.mask
= LVIF_STATE
;
2386 lvItem
.stateMask
= LVIS_SELECTED
| LVIS_FOCUSED
;
2388 while (m_ListView
.GetItem(&lvItem
))
2390 if (lvItem
.iItem
== i
)
2392 if (uFlags
& SVSI_SELECT
)
2393 lvItem
.state
|= LVIS_SELECTED
;
2395 lvItem
.state
&= ~LVIS_SELECTED
;
2397 if (uFlags
& SVSI_FOCUSED
)
2398 lvItem
.state
&= ~LVIS_FOCUSED
;
2402 if (uFlags
& SVSI_DESELECTOTHERS
)
2403 lvItem
.state
&= ~LVIS_SELECTED
;
2406 m_ListView
.SetItem(&lvItem
);
2410 if((uFlags
& SVSI_EDIT
) == SVSI_EDIT
)
2411 m_ListView
.EditLabel(i
);
2416 HRESULT WINAPI
CDefView::GetItemObject(UINT uItem
, REFIID riid
, LPVOID
*ppvOut
)
2418 HRESULT hr
= E_NOINTERFACE
;
2420 TRACE("(%p)->(uItem=0x%08x,\n\tIID=%s, ppv=%p)\n", this, uItem
, debugstr_guid(&riid
), ppvOut
);
2426 case SVGIO_BACKGROUND
:
2427 if (IsEqualIID(riid
, IID_IContextMenu
))
2432 hr
= CDefViewBckgrndMenu_CreateInstance(m_pSF2Parent
, riid
, ppvOut
);
2433 if (FAILED_UNEXPECTEDLY(hr
))
2436 IUnknown_SetSite(*((IUnknown
**)ppvOut
), (IShellView
*)this);
2438 else if (IsEqualIID(riid
, IID_IDispatch
))
2440 if (m_pShellFolderViewDual
== NULL
)
2442 hr
= CDefViewDual_Constructor(riid
, (LPVOID
*)&m_pShellFolderViewDual
);
2443 if (FAILED_UNEXPECTEDLY(hr
))
2446 hr
= m_pShellFolderViewDual
->QueryInterface(riid
, ppvOut
);
2450 case SVGIO_SELECTION
:
2452 hr
= m_pSFParent
->GetUIObjectOf(m_hWnd
, m_cidl
, m_apidl
, riid
, 0, ppvOut
);
2453 if (FAILED_UNEXPECTEDLY(hr
))
2456 if (IsEqualIID(riid
, IID_IContextMenu
))
2457 IUnknown_SetSite(*((IUnknown
**)ppvOut
), (IShellView
*)this);
2462 TRACE("-- (%p)->(interface=%p)\n", this, *ppvOut
);
2467 HRESULT STDMETHODCALLTYPE
CDefView::GetCurrentViewMode(UINT
*pViewMode
)
2469 TRACE("(%p)->(%p), stub\n", this, pViewMode
);
2472 return E_INVALIDARG
;
2474 *pViewMode
= m_FolderSettings
.ViewMode
;
2478 HRESULT STDMETHODCALLTYPE
CDefView::SetCurrentViewMode(UINT ViewMode
)
2481 TRACE("(%p)->(%u), stub\n", this, ViewMode
);
2483 /* It's not redundant to check FVM_AUTO because it's a (UINT)-1 */
2484 if (((INT
)ViewMode
< FVM_FIRST
|| (INT
)ViewMode
> FVM_LAST
) && ((INT
)ViewMode
!= FVM_AUTO
))
2485 return E_INVALIDARG
;
2487 /* Windows before Vista uses LVM_SETVIEW and possibly
2488 LVM_SETEXTENDEDLISTVIEWSTYLE to set the style of the listview,
2489 while later versions seem to accomplish this through other
2497 dwStyle
= LVS_REPORT
;
2500 dwStyle
= LVS_SMALLICON
;
2507 FIXME("ViewMode %d not implemented\n", ViewMode
);
2513 m_ListView
.ModifyStyle(LVS_TYPEMASK
, dwStyle
);
2515 /* This will not necessarily be the actual mode set above.
2516 This mimics the behavior of Windows XP. */
2517 m_FolderSettings
.ViewMode
= ViewMode
;
2522 HRESULT STDMETHODCALLTYPE
CDefView::GetFolder(REFIID riid
, void **ppv
)
2524 if (m_pSFParent
== NULL
)
2527 return m_pSFParent
->QueryInterface(riid
, ppv
);
2530 HRESULT STDMETHODCALLTYPE
CDefView::Item(int iItemIndex
, PITEMID_CHILD
*ppidl
)
2532 PCUITEMID_CHILD pidl
= _PidlByItem(iItemIndex
);
2535 *ppidl
= ILClone(pidl
);
2540 return E_INVALIDARG
;
2543 HRESULT STDMETHODCALLTYPE
CDefView::ItemCount(UINT uFlags
, int *pcItems
)
2545 TRACE("(%p)->(%u %p)\n", this, uFlags
, pcItems
);
2547 if (uFlags
!= SVGIO_ALLVIEW
)
2548 FIXME("some flags unsupported, %x\n", uFlags
& ~SVGIO_ALLVIEW
);
2550 *pcItems
= m_ListView
.GetItemCount();
2555 HRESULT STDMETHODCALLTYPE
CDefView::Items(UINT uFlags
, REFIID riid
, void **ppv
)
2560 HRESULT STDMETHODCALLTYPE
CDefView::GetSelectionMarkedItem(int *piItem
)
2562 TRACE("(%p)->(%p)\n", this, piItem
);
2564 *piItem
= m_ListView
.GetSelectionMark();
2569 HRESULT STDMETHODCALLTYPE
CDefView::GetFocusedItem(int *piItem
)
2571 TRACE("(%p)->(%p)\n", this, piItem
);
2573 *piItem
= m_ListView
.GetNextItem(-1, LVNI_FOCUSED
);
2578 HRESULT STDMETHODCALLTYPE
CDefView::GetItemPosition(PCUITEMID_CHILD pidl
, POINT
*ppt
)
2580 int lvIndex
= LV_FindItemByPidl(pidl
);
2581 if (lvIndex
== -1 || ppt
== NULL
)
2582 return E_INVALIDARG
;
2584 m_ListView
.GetItemPosition(lvIndex
, ppt
);
2588 HRESULT STDMETHODCALLTYPE
CDefView::GetSpacing(POINT
*ppt
)
2590 TRACE("(%p)->(%p)\n", this, ppt
);
2598 m_ListView
.GetItemSpacing(spacing
);
2600 ppt
->x
= spacing
.cx
;
2601 ppt
->y
= spacing
.cy
;
2607 HRESULT STDMETHODCALLTYPE
CDefView::GetDefaultSpacing(POINT
*ppt
)
2612 HRESULT STDMETHODCALLTYPE
CDefView::GetAutoArrange()
2614 return ((m_ListView
.GetStyle() & LVS_AUTOARRANGE
) ? S_OK
: S_FALSE
);
2617 HRESULT STDMETHODCALLTYPE
CDefView::SelectItem(int iItem
, DWORD dwFlags
)
2621 TRACE("(%p)->(%d, %x)\n", this, iItem
, dwFlags
);
2624 lvItem
.stateMask
= LVIS_SELECTED
;
2626 if (dwFlags
& SVSI_ENSUREVISIBLE
)
2627 m_ListView
.EnsureVisible(iItem
, 0);
2630 if (dwFlags
& SVSI_DESELECTOTHERS
)
2631 m_ListView
.SetItemState(-1, 0, LVIS_SELECTED
);
2634 if (dwFlags
& SVSI_SELECT
)
2635 lvItem
.state
|= LVIS_SELECTED
;
2637 if (dwFlags
& SVSI_FOCUSED
)
2638 lvItem
.stateMask
|= LVIS_FOCUSED
;
2640 m_ListView
.SetItemState(iItem
, lvItem
.state
, lvItem
.stateMask
);
2642 if ((dwFlags
& SVSI_EDIT
) == SVSI_EDIT
)
2643 m_ListView
.EditLabel(iItem
);
2648 HRESULT STDMETHODCALLTYPE
CDefView::SelectAndPositionItems(UINT cidl
, PCUITEMID_CHILD_ARRAY apidl
, POINT
*apt
, DWORD dwFlags
)
2650 /* Reset the selection */
2651 m_ListView
.SetItemState(-1, 0, LVIS_SELECTED
);
2654 for (UINT i
= 0 ; i
< m_cidl
; i
++)
2656 lvIndex
= LV_FindItemByPidl(apidl
[i
]);
2659 SelectItem(lvIndex
, dwFlags
);
2660 m_ListView
.SetItemPosition(lvIndex
, &apt
[i
]);
2667 /**********************************************************
2668 * IShellView2 implementation
2671 HRESULT STDMETHODCALLTYPE
CDefView::GetView(SHELLVIEWID
*view_guid
, ULONG view_type
)
2673 FIXME("(%p)->(%p, %lu) stub\n", this, view_guid
, view_type
);
2677 HRESULT STDMETHODCALLTYPE
CDefView::CreateViewWindow2(LPSV2CVW2_PARAMS view_params
)
2679 return CreateViewWindow3(view_params
->psbOwner
, view_params
->psvPrev
,
2680 SV3CVW3_DEFAULT
, (FOLDERFLAGS
)view_params
->pfs
->fFlags
, (FOLDERFLAGS
)view_params
->pfs
->fFlags
,
2681 (FOLDERVIEWMODE
)view_params
->pfs
->ViewMode
, view_params
->pvid
, view_params
->prcView
, &view_params
->hwndView
);
2684 HRESULT STDMETHODCALLTYPE
CDefView::CreateViewWindow3(IShellBrowser
*psb
, IShellView
*psvPrevious
, SV3CVW3_FLAGS view_flags
, FOLDERFLAGS mask
, FOLDERFLAGS flags
, FOLDERVIEWMODE mode
, const SHELLVIEWID
*view_id
, RECT
*prcView
, HWND
*hwnd
)
2686 OLEMENUGROUPWIDTHS omw
= { { 0, 0, 0, 0, 0, 0 } };
2690 TRACE("(%p)->(shlview=%p shlbrs=%p rec=%p hwnd=%p vmode=%x flags=%x)\n", this, psvPrevious
, psb
, prcView
, hwnd
, mode
, flags
);
2691 if (prcView
!= NULL
)
2692 TRACE("-- left=%i top=%i right=%i bottom=%i\n", prcView
->left
, prcView
->top
, prcView
->right
, prcView
->bottom
);
2694 /* Validate the Shell Browser */
2695 if (psb
== NULL
|| m_hWnd
)
2696 return E_UNEXPECTED
;
2698 if (view_flags
!= SV3CVW3_DEFAULT
)
2699 FIXME("unsupported view flags 0x%08x\n", view_flags
);
2701 /* Set up the member variables */
2702 m_pShellBrowser
= psb
;
2703 m_FolderSettings
.ViewMode
= mode
;
2704 m_FolderSettings
.fFlags
= mask
& flags
;
2708 if (IsEqualIID(*view_id
, VID_LargeIcons
))
2709 m_FolderSettings
.ViewMode
= FVM_ICON
;
2710 else if (IsEqualIID(*view_id
, VID_SmallIcons
))
2711 m_FolderSettings
.ViewMode
= FVM_SMALLICON
;
2712 else if (IsEqualIID(*view_id
, VID_List
))
2713 m_FolderSettings
.ViewMode
= FVM_LIST
;
2714 else if (IsEqualIID(*view_id
, VID_Details
))
2715 m_FolderSettings
.ViewMode
= FVM_DETAILS
;
2716 else if (IsEqualIID(*view_id
, VID_Thumbnails
))
2717 m_FolderSettings
.ViewMode
= FVM_THUMBNAIL
;
2718 else if (IsEqualIID(*view_id
, VID_Tile
))
2719 m_FolderSettings
.ViewMode
= FVM_TILE
;
2720 else if (IsEqualIID(*view_id
, VID_ThumbStrip
))
2721 m_FolderSettings
.ViewMode
= FVM_THUMBSTRIP
;
2723 FIXME("Ignoring unrecognized VID %s\n", debugstr_guid(view_id
));
2726 /* Get our parent window */
2727 m_pShellBrowser
->GetWindow(&m_hWndParent
);
2729 /* Try to get the ICommDlgBrowserInterface, adds a reference !!! */
2730 m_pCommDlgBrowser
= NULL
;
2731 if (SUCCEEDED(m_pShellBrowser
->QueryInterface(IID_PPV_ARG(ICommDlgBrowser
, &m_pCommDlgBrowser
))))
2733 TRACE("-- CommDlgBrowser\n");
2736 Create(m_hWndParent
, prcView
, NULL
, WS_CHILD
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
| WS_TABSTOP
, 0, 0U);
2747 _DoFolderViewCB(SFVM_WINDOWCREATED
, (WPARAM
)m_hWnd
, NULL
);
2749 SetWindowPos(HWND_TOP
, 0, 0, 0, 0, SWP_NOMOVE
| SWP_NOSIZE
| SWP_SHOWWINDOW
);
2754 m_hMenu
= CreateMenu();
2755 m_pShellBrowser
->InsertMenusSB(m_hMenu
, &omw
);
2756 TRACE("-- after fnInsertMenusSB\n");
2764 HRESULT STDMETHODCALLTYPE
CDefView::HandleRename(LPCITEMIDLIST new_pidl
)
2766 FIXME("(%p)->(%p) stub\n", this, new_pidl
);
2770 HRESULT STDMETHODCALLTYPE
CDefView::SelectAndPositionItem(LPCITEMIDLIST item
, UINT flags
, POINT
*point
)
2772 FIXME("(%p)->(%p, %u, %p) stub\n", this, item
, flags
, point
);
2776 /**********************************************************
2777 * IShellFolderView implementation
2779 HRESULT STDMETHODCALLTYPE
CDefView::Rearrange(LPARAM sort
)
2781 FIXME("(%p)->(%ld) stub\n", this, sort
);
2785 HRESULT STDMETHODCALLTYPE
CDefView::GetArrangeParam(LPARAM
*sort
)
2787 FIXME("(%p)->(%p) stub\n", this, sort
);
2791 HRESULT STDMETHODCALLTYPE
CDefView::ArrangeGrid()
2793 FIXME("(%p) stub\n", this);
2797 HRESULT STDMETHODCALLTYPE
CDefView::AutoArrange()
2799 m_ListView
.ModifyStyle(0, LVS_AUTOARRANGE
);
2800 m_ListView
.Arrange(LVA_DEFAULT
);
2804 HRESULT STDMETHODCALLTYPE
CDefView::AddObject(PITEMID_CHILD pidl
, UINT
*item
)
2806 FIXME("(%p)->(%p %p) stub\n", this, pidl
, item
);
2810 HRESULT STDMETHODCALLTYPE
CDefView::GetObject(PITEMID_CHILD
*pidl
, UINT item
)
2812 TRACE("(%p)->(%p %d)\n", this, pidl
, item
);
2813 return Item(item
, pidl
);
2816 HRESULT STDMETHODCALLTYPE
CDefView::RemoveObject(PITEMID_CHILD pidl
, UINT
*item
)
2819 TRACE("(%p)->(%p %p)\n", this, pidl
, item
);
2823 *item
= LV_FindItemByPidl(ILFindLastID(pidl
));
2824 m_ListView
.DeleteItem(*item
);
2829 m_ListView
.DeleteAllItems();
2835 HRESULT STDMETHODCALLTYPE
CDefView::GetObjectCount(UINT
*count
)
2837 TRACE("(%p)->(%p)\n", this, count
);
2838 *count
= m_ListView
.GetItemCount();
2842 HRESULT STDMETHODCALLTYPE
CDefView::SetObjectCount(UINT count
, UINT flags
)
2844 FIXME("(%p)->(%d %x) stub\n", this, count
, flags
);
2848 HRESULT STDMETHODCALLTYPE
CDefView::UpdateObject(PITEMID_CHILD pidl_old
, PITEMID_CHILD pidl_new
, UINT
*item
)
2850 FIXME("(%p)->(%p %p %p) stub\n", this, pidl_old
, pidl_new
, item
);
2854 HRESULT STDMETHODCALLTYPE
CDefView::RefreshObject(PITEMID_CHILD pidl
, UINT
*item
)
2856 FIXME("(%p)->(%p %p) stub\n", this, pidl
, item
);
2860 HRESULT STDMETHODCALLTYPE
CDefView::SetRedraw(BOOL redraw
)
2862 TRACE("(%p)->(%d)\n", this, redraw
);
2863 m_ListView
.SetRedraw(redraw
);
2867 HRESULT STDMETHODCALLTYPE
CDefView::GetSelectedCount(UINT
*count
)
2869 FIXME("(%p)->(%p) stub\n", this, count
);
2873 HRESULT STDMETHODCALLTYPE
CDefView::GetSelectedObjects(PCUITEMID_CHILD
**pidl
, UINT
*items
)
2875 TRACE("(%p)->(%p %p)\n", this, pidl
, items
);
2877 *items
= GetSelections();
2881 *pidl
= static_cast<PCUITEMID_CHILD
*>(LocalAlloc(0, *items
* sizeof(PCUITEMID_CHILD
)));
2884 return E_OUTOFMEMORY
;
2887 /* it's documented that caller shouldn't PIDLs, only array itself */
2888 memcpy(*pidl
, m_apidl
, *items
* sizeof(PCUITEMID_CHILD
));
2894 HRESULT STDMETHODCALLTYPE
CDefView::IsDropOnSource(IDropTarget
*drop_target
)
2896 if ((m_iDragOverItem
== -1 || m_pCurDropTarget
== NULL
) &&
2897 (m_pSourceDataObject
.p
))
2905 HRESULT STDMETHODCALLTYPE
CDefView::GetDragPoint(POINT
*pt
)
2908 return E_INVALIDARG
;
2910 *pt
= m_ptFirstMousePos
;
2914 HRESULT STDMETHODCALLTYPE
CDefView::GetDropPoint(POINT
*pt
)
2916 FIXME("(%p)->(%p) stub\n", this, pt
);
2920 HRESULT STDMETHODCALLTYPE
CDefView::MoveIcons(IDataObject
*obj
)
2922 TRACE("(%p)->(%p)\n", this, obj
);
2926 HRESULT STDMETHODCALLTYPE
CDefView::SetItemPos(PCUITEMID_CHILD pidl
, POINT
*pt
)
2928 FIXME("(%p)->(%p %p) stub\n", this, pidl
, pt
);
2932 HRESULT STDMETHODCALLTYPE
CDefView::IsBkDropTarget(IDropTarget
*drop_target
)
2934 FIXME("(%p)->(%p) stub\n", this, drop_target
);
2938 HRESULT STDMETHODCALLTYPE
CDefView::SetClipboard(BOOL move
)
2940 FIXME("(%p)->(%d) stub\n", this, move
);
2944 HRESULT STDMETHODCALLTYPE
CDefView::SetPoints(IDataObject
*obj
)
2946 FIXME("(%p)->(%p) stub\n", this, obj
);
2950 HRESULT STDMETHODCALLTYPE
CDefView::GetItemSpacing(ITEMSPACING
*spacing
)
2952 FIXME("(%p)->(%p) stub\n", this, spacing
);
2956 HRESULT STDMETHODCALLTYPE
CDefView::SetCallback(IShellFolderViewCB
*new_cb
, IShellFolderViewCB
**old_cb
)
2959 *old_cb
= m_pShellFolderViewCB
.Detach();
2961 m_pShellFolderViewCB
= new_cb
;
2965 HRESULT STDMETHODCALLTYPE
CDefView::Select(UINT flags
)
2967 FIXME("(%p)->(%d) stub\n", this, flags
);
2971 HRESULT STDMETHODCALLTYPE
CDefView::QuerySupport(UINT
*support
)
2973 TRACE("(%p)->(%p)\n", this, support
);
2977 HRESULT STDMETHODCALLTYPE
CDefView::SetAutomationObject(IDispatch
*disp
)
2979 FIXME("(%p)->(%p) stub\n", this, disp
);
2983 /**********************************************************
2984 * ISVOleCmdTarget_QueryStatus (IOleCommandTarget)
2986 HRESULT WINAPI
CDefView::QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
, OLECMD
*prgCmds
, OLECMDTEXT
*pCmdText
)
2988 FIXME("(%p)->(%p(%s) 0x%08x %p %p\n",
2989 this, pguidCmdGroup
, debugstr_guid(pguidCmdGroup
), cCmds
, prgCmds
, pCmdText
);
2992 return E_INVALIDARG
;
2994 for (UINT i
= 0; i
< cCmds
; i
++)
2996 FIXME("\tprgCmds[%d].cmdID = %d\n", i
, prgCmds
[i
].cmdID
);
2997 prgCmds
[i
].cmdf
= 0;
3000 return OLECMDERR_E_UNKNOWNGROUP
;
3003 /**********************************************************
3004 * ISVOleCmdTarget_Exec (IOleCommandTarget)
3006 * nCmdID is the OLECMDID_* enumeration
3008 HRESULT WINAPI
CDefView::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
3010 FIXME("(%p)->(\n\tTarget GUID:%s Command:0x%08x Opt:0x%08x %p %p)\n",
3011 this, debugstr_guid(pguidCmdGroup
), nCmdID
, nCmdexecopt
, pvaIn
, pvaOut
);
3014 return OLECMDERR_E_UNKNOWNGROUP
;
3016 if (IsEqualCLSID(*pguidCmdGroup
, m_Category
))
3018 if (nCmdID
== FCIDM_SHVIEW_AUTOARRANGE
)
3020 if (V_VT(pvaIn
) != VT_INT_PTR
)
3021 return OLECMDERR_E_NOTSUPPORTED
;
3024 params
.cbSize
= sizeof(params
);
3025 params
.rcExclude
= *(RECT
*) V_INTREF(pvaIn
);
3027 if (m_hMenuViewModes
)
3029 /* Duplicate all but the last two items of the view modes menu */
3030 HMENU hmenuViewPopup
= CreatePopupMenu();
3031 Shell_MergeMenus(hmenuViewPopup
, m_hMenuViewModes
, 0, 0, 0xFFFF, 0);
3032 DeleteMenu(hmenuViewPopup
, GetMenuItemCount(hmenuViewPopup
) - 1, MF_BYPOSITION
);
3033 DeleteMenu(hmenuViewPopup
, GetMenuItemCount(hmenuViewPopup
) - 1, MF_BYPOSITION
);
3034 CheckViewMode(hmenuViewPopup
);
3035 TrackPopupMenuEx(hmenuViewPopup
, TPM_LEFTALIGN
| TPM_TOPALIGN
, params
.rcExclude
.left
, params
.rcExclude
.bottom
, m_hWndParent
, ¶ms
);
3036 ::DestroyMenu(hmenuViewPopup
);
3039 // pvaOut is VT_I4 with value 0x403 (cmd id of the new mode maybe?)
3040 V_VT(pvaOut
) = VT_I4
;
3041 V_I4(pvaOut
) = 0x403;
3045 if (IsEqualIID(*pguidCmdGroup
, CGID_Explorer
) &&
3047 (nCmdexecopt
== 4) && pvaOut
)
3050 if (IsEqualIID(*pguidCmdGroup
, CGID_ShellDocView
) &&
3055 return OLECMDERR_E_UNKNOWNGROUP
;
3058 /**********************************************************
3059 * ISVDropTarget implementation
3062 /******************************************************************************
3063 * drag_notify_subitem [Internal]
3065 * Figure out the shellfolder object, which is currently under the mouse cursor
3066 * and notify it via the IDropTarget interface.
3069 #define SCROLLAREAWIDTH 20
3071 HRESULT
CDefView::drag_notify_subitem(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
3077 /* The key state on drop doesn't have MK_LBUTTON or MK_RBUTTON because it
3078 reflects the key state after the user released the button, so we need
3079 to remember the last key state when the button was pressed */
3080 m_grfKeyState
= grfKeyState
;
3082 /* Map from global to client coordinates and query the index of the listview-item, which is
3083 * currently under the mouse cursor. */
3084 LVHITTESTINFO htinfo
= {{pt
.x
, pt
.y
}, LVHT_ONITEM
};
3085 ScreenToClient(&htinfo
.pt
);
3086 lResult
= m_ListView
.HitTest(&htinfo
);
3088 /* Send WM_*SCROLL messages every 250 ms during drag-scrolling */
3089 ::GetClientRect(m_ListView
, &clientRect
);
3090 if (htinfo
.pt
.x
== m_ptLastMousePos
.x
&& htinfo
.pt
.y
== m_ptLastMousePos
.y
&&
3091 (htinfo
.pt
.x
< SCROLLAREAWIDTH
|| htinfo
.pt
.x
> clientRect
.right
- SCROLLAREAWIDTH
||
3092 htinfo
.pt
.y
< SCROLLAREAWIDTH
|| htinfo
.pt
.y
> clientRect
.bottom
- SCROLLAREAWIDTH
))
3094 m_cScrollDelay
= (m_cScrollDelay
+ 1) % 5; /* DragOver is called every 50 ms */
3095 if (m_cScrollDelay
== 0)
3097 /* Mouse did hover another 250 ms over the scroll-area */
3098 if (htinfo
.pt
.x
< SCROLLAREAWIDTH
)
3099 m_ListView
.SendMessageW(WM_HSCROLL
, SB_LINEUP
, 0);
3101 if (htinfo
.pt
.x
> clientRect
.right
- SCROLLAREAWIDTH
)
3102 m_ListView
.SendMessageW(WM_HSCROLL
, SB_LINEDOWN
, 0);
3104 if (htinfo
.pt
.y
< SCROLLAREAWIDTH
)
3105 m_ListView
.SendMessageW(WM_VSCROLL
, SB_LINEUP
, 0);
3107 if (htinfo
.pt
.y
> clientRect
.bottom
- SCROLLAREAWIDTH
)
3108 m_ListView
.SendMessageW(WM_VSCROLL
, SB_LINEDOWN
, 0);
3113 m_cScrollDelay
= 0; /* Reset, if the cursor is not over the listview's scroll-area */
3116 m_ptLastMousePos
= htinfo
.pt
;
3118 /* We need to check if we drag the selection over itself */
3119 if (lResult
!= -1 && m_pSourceDataObject
.p
!= NULL
)
3121 PCUITEMID_CHILD pidl
= _PidlByItem(lResult
);
3123 for (UINT i
= 0; i
< m_cidl
; i
++)
3125 if (pidl
== m_apidl
[i
])
3127 /* The item that is being draged is hovering itself. */
3134 /* If we are still over the previous sub-item, notify it via DragOver and return. */
3135 if (m_pCurDropTarget
&& lResult
== m_iDragOverItem
)
3136 return m_pCurDropTarget
->DragOver(grfKeyState
, pt
, pdwEffect
);
3138 /* We've left the previous sub-item, notify it via DragLeave and Release it. */
3139 if (m_pCurDropTarget
)
3141 PCUITEMID_CHILD pidl
= _PidlByItem(m_iDragOverItem
);
3143 SelectItem(pidl
, 0);
3145 m_pCurDropTarget
->DragLeave();
3146 m_pCurDropTarget
.Release();
3149 m_iDragOverItem
= lResult
;
3153 /* We are not above one of the listview's subitems. Bind to the parent folder's
3154 * DropTarget interface. */
3155 hr
= m_pSFParent
->CreateViewObject(NULL
, IID_PPV_ARG(IDropTarget
,&m_pCurDropTarget
));
3159 /* Query the relative PIDL of the shellfolder object represented by the currently
3160 * dragged over listview-item ... */
3161 PCUITEMID_CHILD pidl
= _PidlByItem(lResult
);
3163 /* ... and bind m_pCurDropTarget to the IDropTarget interface of an UIObject of this object */
3164 hr
= m_pSFParent
->GetUIObjectOf(m_ListView
, 1, &pidl
, IID_NULL_PPV_ARG(IDropTarget
, &m_pCurDropTarget
));
3167 IUnknown_SetSite(m_pCurDropTarget
, (IShellView
*)this);
3169 /* If anything failed, m_pCurDropTarget should be NULL now, which ought to be a save state. */
3172 *pdwEffect
= DROPEFFECT_NONE
;
3176 if (m_iDragOverItem
!= -1)
3178 SelectItem(m_iDragOverItem
, SVSI_SELECT
);
3181 /* Notify the item just entered via DragEnter. */
3182 return m_pCurDropTarget
->DragEnter(m_pCurDataObject
, grfKeyState
, pt
, pdwEffect
);
3185 HRESULT WINAPI
CDefView::DragEnter(IDataObject
*pDataObject
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
3187 /* Get a hold on the data object for later calls to DragEnter on the sub-folders */
3188 m_pCurDataObject
= pDataObject
;
3190 HRESULT hr
= drag_notify_subitem(grfKeyState
, pt
, pdwEffect
);
3193 POINT ptClient
= {pt
.x
, pt
.y
};
3194 ScreenToClient(&ptClient
);
3195 ImageList_DragEnter(m_hWnd
, ptClient
.x
, ptClient
.y
);
3201 HRESULT WINAPI
CDefView::DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
3203 POINT ptClient
= {pt
.x
, pt
.y
};
3204 ScreenToClient(&ptClient
);
3205 ImageList_DragMove(ptClient
.x
, ptClient
.y
);
3206 return drag_notify_subitem(grfKeyState
, pt
, pdwEffect
);
3209 HRESULT WINAPI
CDefView::DragLeave()
3211 ImageList_DragLeave(m_hWnd
);
3213 if (m_pCurDropTarget
)
3215 m_pCurDropTarget
->DragLeave();
3216 m_pCurDropTarget
.Release();
3219 if (m_pCurDataObject
!= NULL
)
3221 m_pCurDataObject
.Release();
3224 m_iDragOverItem
= 0;
3229 HRESULT WINAPI
CDefView::Drop(IDataObject
* pDataObject
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
3231 ImageList_DragLeave(m_hWnd
);
3232 ImageList_EndDrag();
3234 if ((IsDropOnSource(NULL
) == S_OK
) &&
3235 (*pdwEffect
& DROPEFFECT_MOVE
) &&
3236 (m_grfKeyState
& MK_LBUTTON
))
3238 if (m_pCurDropTarget
)
3240 m_pCurDropTarget
->DragLeave();
3241 m_pCurDropTarget
.Release();
3244 /* Restore the selection */
3245 m_ListView
.SetItemState(-1, 0, LVIS_SELECTED
);
3246 for (UINT i
= 0 ; i
< m_cidl
; i
++)
3247 SelectItem(m_apidl
[i
], SVSI_SELECT
);
3249 /* Reposition the items */
3251 while ((lvIndex
= m_ListView
.GetNextItem(lvIndex
, LVNI_SELECTED
)) > -1)
3254 if (m_ListView
.GetItemPosition(lvIndex
, &ptItem
))
3256 ptItem
.x
+= pt
.x
- m_ptFirstMousePos
.x
;
3257 ptItem
.y
+= pt
.y
- m_ptFirstMousePos
.y
;
3258 m_ListView
.SetItemPosition(lvIndex
, &ptItem
);
3262 else if (m_pCurDropTarget
)
3264 m_pCurDropTarget
->Drop(pDataObject
, grfKeyState
, pt
, pdwEffect
);
3265 m_pCurDropTarget
.Release();
3268 m_pCurDataObject
.Release();
3269 m_iDragOverItem
= 0;
3273 /**********************************************************
3274 * ISVDropSource implementation
3277 HRESULT WINAPI
CDefView::QueryContinueDrag(BOOL fEscapePressed
, DWORD grfKeyState
)
3279 TRACE("(%p)\n", this);
3282 return DRAGDROP_S_CANCEL
;
3283 else if (!(grfKeyState
& MK_LBUTTON
) && !(grfKeyState
& MK_RBUTTON
))
3284 return DRAGDROP_S_DROP
;
3289 HRESULT WINAPI
CDefView::GiveFeedback(DWORD dwEffect
)
3291 TRACE("(%p)\n", this);
3293 return DRAGDROP_S_USEDEFAULTCURSORS
;
3296 /**********************************************************
3297 * ISVViewObject implementation
3300 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
)
3302 FIXME("Stub: this=%p\n", this);
3307 HRESULT WINAPI
CDefView::GetColorSet(DWORD dwDrawAspect
, LONG lindex
, void *pvAspect
, DVTARGETDEVICE
*ptd
, HDC hicTargetDevice
, LOGPALETTE
**ppColorSet
)
3309 FIXME("Stub: this=%p\n", this);
3314 HRESULT WINAPI
CDefView::Freeze(DWORD dwDrawAspect
, LONG lindex
, void *pvAspect
, DWORD
*pdwFreeze
)
3316 FIXME("Stub: this=%p\n", this);
3321 HRESULT WINAPI
CDefView::Unfreeze(DWORD dwFreeze
)
3323 FIXME("Stub: this=%p\n", this);
3328 HRESULT WINAPI
CDefView::SetAdvise(DWORD aspects
, DWORD advf
, IAdviseSink
*pAdvSink
)
3330 FIXME("partial stub: %p 0x%08x 0x%08x %p\n", this, aspects
, advf
, pAdvSink
);
3332 /* FIXME: we set the AdviseSink, but never use it to send any advice */
3333 m_pAdvSink
= pAdvSink
;
3334 m_dwAspects
= aspects
;
3340 HRESULT WINAPI
CDefView::GetAdvise(DWORD
*pAspects
, DWORD
*pAdvf
, IAdviseSink
**ppAdvSink
)
3342 TRACE("this=%p pAspects=%p pAdvf=%p ppAdvSink=%p\n", this, pAspects
, pAdvf
, ppAdvSink
);
3346 *ppAdvSink
= m_pAdvSink
;
3347 m_pAdvSink
.p
->AddRef();
3351 *pAspects
= m_dwAspects
;
3359 HRESULT STDMETHODCALLTYPE
CDefView::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
3361 if (IsEqualIID(guidService
, SID_IShellBrowser
))
3362 return m_pShellBrowser
->QueryInterface(riid
, ppvObject
);
3363 else if(IsEqualIID(guidService
, SID_IFolderView
))
3364 return QueryInterface(riid
, ppvObject
);
3366 return E_NOINTERFACE
;
3369 HRESULT
CDefView::_MergeToolbar()
3371 CComPtr
<IExplorerToolbar
> ptb
;
3374 hr
= IUnknown_QueryService(m_pShellBrowser
, IID_IExplorerToolbar
, IID_PPV_ARG(IExplorerToolbar
, &ptb
));
3378 m_Category
= CGID_DefViewFrame
;
3380 hr
= ptb
->SetCommandTarget(static_cast<IOleCommandTarget
*>(this), &m_Category
, 0);
3388 hr
= ptb
->AddButtons(&m_Category
, buttonsCount
, buttons
);
3396 // The default processing of IShellFolderView callbacks
3397 HRESULT
CDefView::DefMessageSFVCB(UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
3399 // TODO: SFVM_GET_CUSTOMVIEWINFO, SFVM_WINDOWCREATED
3400 TRACE("CDefView::DefMessageSFVCB uMsg=%u\n", uMsg
);
3404 HRESULT
CDefView::_DoFolderViewCB(UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
3406 HRESULT hr
= E_NOTIMPL
;
3408 if (m_pShellFolderViewCB
)
3410 hr
= m_pShellFolderViewCB
->MessageSFVCB(uMsg
, wParam
, lParam
);
3413 if (hr
== E_NOTIMPL
)
3415 hr
= DefMessageSFVCB(uMsg
, wParam
, lParam
);
3421 HRESULT
CDefView_CreateInstance(IShellFolder
*pFolder
, REFIID riid
, LPVOID
* ppvOut
)
3423 return ShellObjectCreatorInit
<CDefView
>(pFolder
, riid
, ppvOut
);
3426 HRESULT WINAPI
SHCreateShellFolderViewEx(
3427 LPCSFV psvcbi
, /* [in] shelltemplate struct */
3428 IShellView
**ppsv
) /* [out] IShellView pointer */
3430 CComPtr
<IShellView
> psv
;
3433 TRACE("sf=%p pidl=%p cb=%p mode=0x%08x parm=%p\n",
3434 psvcbi
->pshf
, psvcbi
->pidl
, psvcbi
->pfnCallback
,
3435 psvcbi
->fvm
, psvcbi
->psvOuter
);
3438 hRes
= CDefView_CreateInstance(psvcbi
->pshf
, IID_PPV_ARG(IShellView
, &psv
));
3439 if (FAILED_UNEXPECTEDLY(hRes
))
3442 *ppsv
= psv
.Detach();
3446 HRESULT WINAPI
SHCreateShellFolderView(const SFV_CREATE
*pcsfv
,
3449 CComPtr
<IShellView
> psv
;
3453 if (!pcsfv
|| pcsfv
->cbSize
!= sizeof(*pcsfv
))
3454 return E_INVALIDARG
;
3456 TRACE("sf=%p outer=%p callback=%p\n",
3457 pcsfv
->pshf
, pcsfv
->psvOuter
, pcsfv
->psfvcb
);
3459 hRes
= CDefView_CreateInstance(pcsfv
->pshf
, IID_PPV_ARG(IShellView
, &psv
));
3465 CComPtr
<IShellFolderView
> sfv
;
3466 if (SUCCEEDED(psv
->QueryInterface(IID_PPV_ARG(IShellFolderView
, &sfv
))))
3468 sfv
->SetCallback(pcsfv
->psfvcb
, NULL
);
3472 *ppsv
= psv
.Detach();