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
= GetSysColor(COLOR_WINDOW
);
637 if (m_viewinfo_data
.clrTextBack
!= CLR_INVALID
)
639 clrTextBack
= m_viewinfo_data
.clrTextBack
;
641 m_ListView
.SetTextBkColor(clrTextBack
);
644 COLORREF clrText
= GetSysColor(COLOR_WINDOWTEXT
);
645 if (m_viewinfo_data
.clrText
!= CLR_INVALID
)
647 clrText
= m_viewinfo_data
.clrText
;
649 m_ListView
.SetTextColor(clrText
);
651 // Background is painted by the parent via WM_PRINTCLIENT.
652 m_ListView
.SetExtendedListViewStyle(LVS_EX_TRANSPARENTBKGND
, LVS_EX_TRANSPARENTBKGND
);
656 /**********************************************************
657 * ShellView_InitList()
659 * - adds all needed columns to the shellview
661 BOOL
CDefView::InitList()
665 HIMAGELIST big_icons
, small_icons
;
669 m_ListView
.DeleteAllItems();
671 m_hMenuArrangeModes
= CreateMenu();
675 for (int i
= 0; 1; i
++)
677 if (FAILED(m_pSF2Parent
->GetDetailsOf(NULL
, i
, &sd
)))
679 StrRetToStrNW( szTemp
, 50, &sd
.str
, NULL
);
680 m_ListView
.InsertColumn(i
, szTemp
, sd
.fmt
, sd
.cxChar
* 8);
682 InsertMenuW(m_hMenuArrangeModes
, -1, MF_STRING
, 0x30 + i
, szTemp
);
685 InsertMenuW(m_hMenuArrangeModes
, -1, MF_BYPOSITION
| MF_SEPARATOR
, 0, 0);
689 FIXME("no m_pSF2Parent\n");
692 Shell_GetImageLists(&big_icons
, &small_icons
);
693 m_ListView
.SetImageList(big_icons
, LVSIL_NORMAL
);
694 m_ListView
.SetImageList(small_icons
, LVSIL_SMALL
);
699 /*************************************************************************
700 * ShellView_ListViewCompareItems
702 * Compare Function for the Listview (FileOpen Dialog)
705 * lParam1 [I] the first ItemIdList to compare with
706 * lParam2 [I] the second ItemIdList to compare with
707 * lpData [I] The column ID for the header Ctrl to process
710 * A negative value if the first item should precede the second,
711 * a positive value if the first item should follow the second,
712 * or zero if the two items are equivalent
714 INT CALLBACK
CDefView::ListViewCompareItems(LPARAM lParam1
, LPARAM lParam2
, LPARAM lpData
)
716 PCUIDLIST_RELATIVE pidl1
= reinterpret_cast<PCUIDLIST_RELATIVE
>(lParam1
);
717 PCUIDLIST_RELATIVE pidl2
= reinterpret_cast<PCUIDLIST_RELATIVE
>(lParam2
);
718 CDefView
*pThis
= reinterpret_cast<CDefView
*>(lpData
);
720 HRESULT hres
= pThis
->m_pSFParent
->CompareIDs(pThis
->m_sortInfo
.nHeaderID
, pidl1
, pidl2
);
721 if (FAILED_UNEXPECTEDLY(hres
))
724 SHORT nDiff
= HRESULT_CODE(hres
);
725 if (!pThis
->m_sortInfo
.bIsAscending
)
730 BOOL
CDefView::_Sort()
735 if (m_ListView
.GetWindowLongPtr(GWL_STYLE
) & LVS_NOSORTHEADER
)
738 hHeader
= (HWND
)m_ListView
.SendMessage(LVM_GETHEADER
, 0, 0);
739 ZeroMemory(&hColumn
, sizeof(hColumn
));
741 /* If the sorting column changed, remove the sorting style from the old column */
742 if ( (m_sortInfo
.nLastHeaderID
!= -1) &&
743 (m_sortInfo
.nLastHeaderID
!= m_sortInfo
.nHeaderID
) )
745 hColumn
.mask
= HDI_FORMAT
;
746 Header_GetItem(hHeader
, m_sortInfo
.nLastHeaderID
, &hColumn
);
747 hColumn
.fmt
&= ~(HDF_SORTUP
| HDF_SORTDOWN
);
748 Header_SetItem(hHeader
, m_sortInfo
.nLastHeaderID
, &hColumn
);
751 /* Set the sorting style to the new column */
752 hColumn
.mask
= HDI_FORMAT
;
753 Header_GetItem(hHeader
, m_sortInfo
.nHeaderID
, &hColumn
);
755 hColumn
.fmt
&= (m_sortInfo
.bIsAscending
? ~HDF_SORTDOWN
: ~HDF_SORTUP
);
756 hColumn
.fmt
|= (m_sortInfo
.bIsAscending
? HDF_SORTUP
: HDF_SORTDOWN
);
757 Header_SetItem(hHeader
, m_sortInfo
.nHeaderID
, &hColumn
);
759 /* Sort the list, using the current values of nHeaderID and bIsAscending */
760 m_sortInfo
.nLastHeaderID
= m_sortInfo
.nHeaderID
;
761 return m_ListView
.SortItems(ListViewCompareItems
, this);
764 PCUITEMID_CHILD
CDefView::_PidlByItem(int i
)
766 return reinterpret_cast<PCUITEMID_CHILD
>(m_ListView
.GetItemData(i
));
769 PCUITEMID_CHILD
CDefView::_PidlByItem(LVITEM
& lvItem
)
771 return reinterpret_cast<PCUITEMID_CHILD
>(lvItem
.lParam
);
774 /**********************************************************
775 * LV_FindItemByPidl()
777 int CDefView::LV_FindItemByPidl(PCUITEMID_CHILD pidl
)
779 int cItems
= m_ListView
.GetItemCount();
781 for (int i
= 0; i
<cItems
; i
++)
783 PCUITEMID_CHILD currentpidl
= _PidlByItem(i
);
784 HRESULT hr
= m_pSFParent
->CompareIDs(0, pidl
, currentpidl
);
786 if (SUCCEEDED(hr
) && !HRESULT_CODE(hr
))
794 /**********************************************************
797 BOOLEAN
CDefView::LV_AddItem(PCUITEMID_CHILD pidl
)
801 TRACE("(%p)(pidl=%p)\n", this, pidl
);
803 lvItem
.mask
= LVIF_TEXT
| LVIF_IMAGE
| LVIF_PARAM
; /*set the mask*/
804 lvItem
.iItem
= m_ListView
.GetItemCount(); /*add the item to the end of the list*/
806 lvItem
.lParam
= reinterpret_cast<LPARAM
>(ILClone(pidl
)); /*set the item's data*/
807 lvItem
.pszText
= LPSTR_TEXTCALLBACKW
; /*get text on a callback basis*/
808 lvItem
.iImage
= I_IMAGECALLBACK
; /*get the image on a callback basis*/
809 lvItem
.stateMask
= LVIS_CUT
;
811 if (m_ListView
.InsertItem(&lvItem
) == -1)
817 /**********************************************************
820 BOOLEAN
CDefView::LV_DeleteItem(PCUITEMID_CHILD pidl
)
824 TRACE("(%p)(pidl=%p)\n", this, pidl
);
826 nIndex
= LV_FindItemByPidl(pidl
);
828 return (-1 == m_ListView
.DeleteItem(nIndex
)) ? FALSE
: TRUE
;
831 /**********************************************************
834 BOOLEAN
CDefView::LV_RenameItem(PCUITEMID_CHILD pidlOld
, PCUITEMID_CHILD pidlNew
)
839 TRACE("(%p)(pidlold=%p pidlnew=%p)\n", this, pidlOld
, pidlNew
);
841 nItem
= LV_FindItemByPidl(pidlOld
);
845 lvItem
.mask
= LVIF_PARAM
; /* only the pidl */
846 lvItem
.iItem
= nItem
;
848 m_ListView
.GetItem(&lvItem
);
850 SHFree(reinterpret_cast<LPVOID
>(lvItem
.lParam
));
851 lvItem
.mask
= LVIF_PARAM
|LVIF_IMAGE
;
852 lvItem
.iItem
= nItem
;
854 lvItem
.lParam
= reinterpret_cast<LPARAM
>(ILClone(pidlNew
)); /* set the item's data */
855 lvItem
.iImage
= SHMapPIDLToSystemImageListIndex(m_pSFParent
, pidlNew
, 0);
856 m_ListView
.SetItem(&lvItem
);
857 m_ListView
.Update(nItem
);
858 return TRUE
; /* FIXME: better handling */
864 /**********************************************************
867 BOOLEAN
CDefView::LV_ProdItem(PCUITEMID_CHILD pidl
)
872 TRACE("(%p)(pidl=%p)\n", this, pidl
);
874 nItem
= LV_FindItemByPidl(pidl
);
878 lvItem
.mask
= LVIF_IMAGE
;
879 lvItem
.iItem
= nItem
;
881 lvItem
.iImage
= SHMapPIDLToSystemImageListIndex(m_pSFParent
, pidl
, 0);
882 m_ListView
.SetItem(&lvItem
);
883 m_ListView
.Update(nItem
);
890 /**********************************************************
891 * ShellView_FillList()
893 * - gets the objectlist from the shellfolder
895 * - fills the list into the view
897 INT CALLBACK
CDefView::fill_list(LPVOID ptr
, LPVOID arg
)
899 PITEMID_CHILD pidl
= static_cast<PITEMID_CHILD
>(ptr
);
900 CDefView
*pThis
= static_cast<CDefView
*>(arg
);
902 /* in a commdlg This works as a filemask*/
903 if (pThis
->IncludeObject(pidl
) == S_OK
)
904 pThis
->LV_AddItem(pidl
);
910 HRESULT
CDefView::FillList()
912 CComPtr
<IEnumIDList
> pEnumIDList
;
918 DWORD dFlags
= SHCONTF_NONFOLDERS
| SHCONTF_FOLDERS
;
922 /* determine if there is a setting to show all the hidden files/folders */
923 if (RegOpenKeyExW(HKEY_CURRENT_USER
, L
"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced", 0, KEY_QUERY_VALUE
, &hKey
) == ERROR_SUCCESS
)
925 DWORD dataLength
, flagVal
;
927 dataLength
= sizeof(flagVal
);
928 if (RegQueryValueExW(hKey
, L
"Hidden", NULL
, NULL
, (LPBYTE
)&flagVal
, &dataLength
) == ERROR_SUCCESS
)
930 /* if the value is 1, then show all hidden files/folders */
933 dFlags
|= SHCONTF_INCLUDEHIDDEN
;
934 m_ListView
.SendMessageW(LVM_SETCALLBACKMASK
, LVIS_CUT
, 0);
942 /* get the itemlist from the shfolder */
943 hRes
= m_pSFParent
->EnumObjects(m_hWnd
, dFlags
, &pEnumIDList
);
951 /* create a pointer array */
952 hdpa
= DPA_Create(16);
955 return(E_OUTOFMEMORY
);
958 /* copy the items into the array*/
959 while((S_OK
== pEnumIDList
->Next(1, &pidl
, &dwFetched
)) && dwFetched
)
961 if (DPA_InsertPtr(hdpa
, 0x7fff, pidl
) == -1)
967 /*turn the listview's redrawing off*/
968 m_ListView
.SetRedraw(FALSE
);
970 DPA_DestroyCallback( hdpa
, fill_list
, this);
975 m_pSF2Parent
->GetDefaultColumn(NULL
, (ULONG
*)&m_sortInfo
.nHeaderID
, NULL
);
979 FIXME("no m_pSF2Parent\n");
981 m_sortInfo
.bIsAscending
= TRUE
;
984 if (m_viewinfo_data
.hbmBack
)
986 ::DeleteObject(m_viewinfo_data
.hbmBack
);
987 m_viewinfo_data
.hbmBack
= NULL
;
990 // load custom background image and custom text color
991 m_viewinfo_data
.cbSize
= sizeof(m_viewinfo_data
);
992 _DoFolderViewCB(SFVM_GET_CUSTOMVIEWINFO
, 0, (LPARAM
)&m_viewinfo_data
);
994 /*turn the listview's redrawing back on and force it to draw*/
995 m_ListView
.SetRedraw(TRUE
);
999 if (!(m_FolderSettings
.fFlags
& FWF_DESKTOP
))
1002 m_ListView
.InvalidateRect(NULL
, TRUE
);
1005 _DoFolderViewCB(SFVM_LISTREFRESHED
, NULL
, NULL
);
1010 LRESULT
CDefView::OnShowWindow(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1012 m_ListView
.UpdateWindow();
1017 LRESULT
CDefView::OnGetDlgCode(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1019 return m_ListView
.SendMessageW(uMsg
, 0, 0);
1022 LRESULT
CDefView::OnDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1029 DestroyMenu(m_hMenu
);
1032 RevokeDragDrop(m_hWnd
);
1033 SHChangeNotifyDeregister(m_hNotify
);
1035 SHFree(m_pidlParent
);
1036 m_pidlParent
= NULL
;
1042 LRESULT
CDefView::OnEraseBackground(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1044 /* redirect to parent */
1045 if (m_FolderSettings
.fFlags
& (FWF_DESKTOP
| FWF_TRANSPARENT
))
1046 return SendMessageW(GetParent(), WM_ERASEBKGND
, wParam
, lParam
);
1053 DrawTileBitmap(HDC hDC
, LPCRECT prc
, HBITMAP hbm
, INT nWidth
, INT nHeight
, INT dx
, INT dy
)
1055 INT x0
= prc
->left
, y0
= prc
->top
, x1
= prc
->right
, y1
= prc
->bottom
;
1059 HDC hMemDC
= CreateCompatibleDC(hDC
);
1060 HGDIOBJ hbmOld
= SelectObject(hMemDC
, hbm
);
1062 for (INT y
= y0
; y
< y1
; y
+= nHeight
)
1064 for (INT x
= x0
; x
< x1
; x
+= nWidth
)
1066 BitBlt(hDC
, x
, y
, nWidth
, nHeight
, hMemDC
, 0, 0, SRCCOPY
);
1070 SelectObject(hMemDC
, hbmOld
);
1074 LRESULT
CDefView::OnPrintClient(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1076 HDC hDC
= (HDC
)wParam
;
1079 ::GetClientRect(m_ListView
, &rc
);
1081 if (m_viewinfo_data
.hbmBack
)
1084 if (::GetObject(m_viewinfo_data
.hbmBack
, sizeof(BITMAP
), &bm
))
1086 INT dx
= -(::GetScrollPos(m_ListView
, SB_HORZ
) % bm
.bmWidth
);
1087 INT dy
= -(::GetScrollPos(m_ListView
, SB_VERT
) % bm
.bmHeight
);
1088 DrawTileBitmap(hDC
, &rc
, m_viewinfo_data
.hbmBack
, bm
.bmWidth
, bm
.bmHeight
, dx
, dy
);
1093 FillRect(hDC
, &rc
, GetSysColorBrush(COLOR_WINDOW
));
1101 LRESULT
CDefView::OnSysColorChange(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1103 /* Update desktop labels color */
1106 /* Forward WM_SYSCOLORCHANGE to common controls */
1107 return m_ListView
.SendMessageW(uMsg
, 0, 0);
1110 LRESULT
CDefView::OnGetShellBrowser(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1112 return reinterpret_cast<LRESULT
>(m_pShellBrowser
.p
);
1115 LRESULT
CDefView::OnNCCreate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1122 LRESULT
CDefView::OnNCDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1129 /**********************************************************
1130 * ShellView_OnCreate()
1132 LRESULT
CDefView::OnCreate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1134 CComPtr
<IDropTarget
> pdt
;
1135 SHChangeNotifyEntry ntreg
;
1136 CComPtr
<IPersistFolder2
> ppf2
;
1138 TRACE("%p\n", this);
1140 if (SUCCEEDED(QueryInterface(IID_PPV_ARG(IDropTarget
, &pdt
))))
1142 if (FAILED(RegisterDragDrop(m_hWnd
, pdt
)))
1143 ERR("Registering Drag Drop Failed");
1146 /* register for receiving notifications */
1147 m_pSFParent
->QueryInterface(IID_PPV_ARG(IPersistFolder2
, &ppf2
));
1150 ppf2
->GetCurFolder(&m_pidlParent
);
1151 ntreg
.fRecursive
= TRUE
;
1152 ntreg
.pidl
= m_pidlParent
;
1153 m_hNotify
= SHChangeNotifyRegister(m_hWnd
, SHCNRF_InterruptLevel
| SHCNRF_ShellLevel
, SHCNE_ALLEVENTS
, SHV_CHANGE_NOTIFY
, 1, &ntreg
);
1164 /* _DoFolderViewCB(SFVM_GETNOTIFY, ?? ??) */
1166 m_hAccel
= LoadAcceleratorsW(shell32_hInstance
, MAKEINTRESOURCEW(IDA_SHELLVIEW
));
1173 /**********************************************************
1174 * #### Handling of the menus ####
1177 extern "C" DWORD WINAPI
SHMenuIndexFromID(HMENU hMenu
, UINT uID
);
1179 HMENU
GetSubmenuByID(HMENU hmenu
, UINT id
)
1181 MENUITEMINFOW mii
= {sizeof(mii
), MIIM_SUBMENU
};
1182 if (::GetMenuItemInfoW(hmenu
, id
, FALSE
, &mii
))
1183 return mii
.hSubMenu
;
1188 /* ReallyGetMenuItemID returns the id of an item even if it opens a submenu,
1189 GetMenuItemID returns -1 if the specified item opens a submenu */
1190 UINT
ReallyGetMenuItemID(HMENU hmenu
, int i
)
1192 MENUITEMINFOW mii
= {sizeof(mii
), MIIM_ID
};
1193 if (::GetMenuItemInfoW(hmenu
, i
, TRUE
, &mii
))
1199 HRESULT
CDefView::FillFileMenu()
1201 HMENU hFileMenu
= GetSubmenuByID(m_hMenu
, FCIDM_MENU_FILE
);
1205 /* Cleanup the items added previously */
1206 for (int i
= GetMenuItemCount(hFileMenu
) - 1; i
>= 0; i
--)
1208 UINT id
= GetMenuItemID(hFileMenu
, i
);
1209 if (id
< FCIDM_BROWSERFIRST
|| id
> FCIDM_BROWSERLAST
)
1210 DeleteMenu(hFileMenu
, i
, MF_BYPOSITION
);
1213 /* Store the context menu in m_pCM and keep it in order to invoke the selected command later on */
1214 HRESULT hr
= GetItemObject(SVGIO_SELECTION
, IID_PPV_ARG(IContextMenu
, &m_pCM
));
1215 if (FAILED_UNEXPECTEDLY(hr
))
1218 HMENU hmenu
= CreatePopupMenu();
1220 hr
= m_pCM
->QueryContextMenu(hmenu
, 0, FCIDM_SHVIEWFIRST
, FCIDM_SHVIEWLAST
, 0);
1221 if (FAILED_UNEXPECTEDLY(hr
))
1224 // TODO: filter or something
1226 Shell_MergeMenus(hFileMenu
, hmenu
, 0, 0, 0xFFFF, MM_ADDSEPARATOR
| MM_SUBMENUSHAVEIDS
);
1228 ::DestroyMenu(hmenu
);
1233 HRESULT
CDefView::FillEditMenu()
1235 HMENU hEditMenu
= GetSubmenuByID(m_hMenu
, FCIDM_MENU_EDIT
);
1239 HMENU hmenuContents
= ::LoadMenuW(shell32_hInstance
, L
"MENU_003");
1243 Shell_MergeMenus(hEditMenu
, hmenuContents
, 0, 0, 0xFFFF, 0);
1245 ::DestroyMenu(hmenuContents
);
1250 HRESULT
CDefView::FillViewMenu()
1252 HMENU hViewMenu
= GetSubmenuByID(m_hMenu
, FCIDM_MENU_VIEW
);
1256 m_hMenuViewModes
= ::LoadMenuW(shell32_hInstance
, L
"MENU_001");
1257 if (!m_hMenuViewModes
)
1260 UINT i
= SHMenuIndexFromID(hViewMenu
, FCIDM_MENU_VIEW_SEP_OPTIONS
);
1261 Shell_MergeMenus(hViewMenu
, m_hMenuViewModes
, i
, 0, 0xFFFF, MM_ADDSEPARATOR
| MM_DONTREMOVESEPS
| MM_SUBMENUSHAVEIDS
);
1266 HRESULT
CDefView::FillArrangeAsMenu(HMENU hmenuArrange
)
1268 /* We only need to fill this once */
1269 if (GetMenuItemID(hmenuArrange
, 0) == FCIDM_SHVIEW_AUTOARRANGE
)
1271 Shell_MergeMenus(hmenuArrange
, m_hMenuArrangeModes
, 0, 0, 0xFFFF,0);
1274 /* Also check the menu item according to which we sort */
1275 CheckMenuRadioItem(hmenuArrange
,
1278 m_sortInfo
.nHeaderID
+ 0x30,
1281 if (m_FolderSettings
.ViewMode
== FVM_DETAILS
|| m_FolderSettings
.ViewMode
== FVM_LIST
)
1283 EnableMenuItem(hmenuArrange
, FCIDM_SHVIEW_AUTOARRANGE
, MF_BYCOMMAND
| MF_GRAYED
);
1287 EnableMenuItem(hmenuArrange
, FCIDM_SHVIEW_AUTOARRANGE
, MF_BYCOMMAND
);
1289 if (GetAutoArrange() == S_OK
)
1290 CheckMenuItem(hmenuArrange
, FCIDM_SHVIEW_AUTOARRANGE
, MF_CHECKED
);
1297 HRESULT
CDefView::CheckViewMode(HMENU hmenuView
)
1299 if (m_FolderSettings
.ViewMode
>= FVM_FIRST
&& m_FolderSettings
.ViewMode
<= FVM_LAST
)
1301 UINT iItemFirst
= FCIDM_SHVIEW_BIGICON
;
1302 UINT iItemLast
= iItemFirst
+ FVM_LAST
- FVM_FIRST
;
1303 UINT iItem
= iItemFirst
+ m_FolderSettings
.ViewMode
- FVM_FIRST
;
1304 CheckMenuRadioItem(hmenuView
, iItemFirst
, iItemLast
, iItem
, MF_BYCOMMAND
);
1310 /**********************************************************
1311 * ShellView_GetSelections()
1313 * - fills the m_apidl list with the selected objects
1316 * number of selected items
1318 UINT
CDefView::GetSelections()
1322 m_cidl
= m_ListView
.GetSelectedCount();
1323 m_apidl
= static_cast<PCUITEMID_CHILD
*>(SHAlloc(m_cidl
* sizeof(PCUITEMID_CHILD
)));
1330 TRACE("-- Items selected =%u\n", m_cidl
);
1334 while ((lvIndex
= m_ListView
.GetNextItem(lvIndex
, LVNI_SELECTED
)) > -1)
1336 m_apidl
[i
] = _PidlByItem(lvIndex
);
1340 TRACE("-- selected Item found\n");
1346 HRESULT
CDefView::InvokeContextMenuCommand(UINT uCommand
)
1348 CMINVOKECOMMANDINFO cmi
;
1350 ZeroMemory(&cmi
, sizeof(cmi
));
1351 cmi
.cbSize
= sizeof(cmi
);
1352 cmi
.lpVerb
= MAKEINTRESOURCEA(uCommand
);
1355 if (GetKeyState(VK_SHIFT
) & 0x8000)
1356 cmi
.fMask
|= CMIC_MASK_SHIFT_DOWN
;
1358 if (GetKeyState(VK_CONTROL
) & 0x8000)
1359 cmi
.fMask
|= CMIC_MASK_CONTROL_DOWN
;
1361 HRESULT hr
= m_pCM
->InvokeCommand(&cmi
);
1362 if (FAILED_UNEXPECTEDLY(hr
))
1368 /**********************************************************
1369 * ShellView_OpenSelectedItems()
1371 HRESULT
CDefView::OpenSelectedItems()
1377 m_cidl
= m_ListView
.GetSelectedCount();
1381 hResult
= OnDefaultCommand();
1382 if (hResult
== S_OK
)
1385 hMenu
= CreatePopupMenu();
1389 hResult
= GetItemObject(SVGIO_SELECTION
, IID_PPV_ARG(IContextMenu
, &m_pCM
));
1390 if (FAILED_UNEXPECTEDLY(hResult
))
1393 hResult
= m_pCM
->QueryContextMenu(hMenu
, 0, FCIDM_SHVIEWFIRST
, FCIDM_SHVIEWLAST
, CMF_DEFAULTONLY
);
1394 if (FAILED_UNEXPECTEDLY(hResult
))
1397 uCommand
= GetMenuDefaultItem(hMenu
, FALSE
, 0);
1398 if (uCommand
== (UINT
)-1)
1404 InvokeContextMenuCommand(uCommand
);
1413 IUnknown_SetSite(m_pCM
, NULL
);
1420 /**********************************************************
1421 * ShellView_DoContextMenu()
1423 LRESULT
CDefView::OnContextMenu(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1429 TRACE("(%p)\n", this);
1431 m_hContextMenu
= CreatePopupMenu();
1432 if (!m_hContextMenu
)
1435 m_cidl
= m_ListView
.GetSelectedCount();
1437 hResult
= GetItemObject( m_cidl
? SVGIO_SELECTION
: SVGIO_BACKGROUND
, IID_PPV_ARG(IContextMenu
, &m_pCM
));
1438 if (FAILED_UNEXPECTEDLY(hResult
))
1441 /* Use 1 as the first id as we want 0 the mean that the user canceled the menu */
1442 hResult
= m_pCM
->QueryContextMenu(m_hContextMenu
, 0, CONTEXT_MENU_BASE_ID
, FCIDM_SHVIEWLAST
, CMF_NORMAL
);
1443 if (FAILED_UNEXPECTEDLY(hResult
))
1446 /* There is no position requested, so try to find one */
1452 /* Do we have a focused item, */
1453 if ((lvIndex
= m_ListView
.GetNextItem(-1, LVIS_FOCUSED
)) < 0)
1455 /* or a selected item? */
1456 lvIndex
= m_ListView
.GetNextItem(-1, LVIS_SELECTED
);
1458 /* We got something */
1461 /* Let's find the center of the icon */
1462 RECT rc
= { LVIR_ICON
};
1463 m_ListView
.SendMessage(LVM_GETITEMRECT
, lvIndex
, (LPARAM
)&rc
);
1464 pt
.x
= (rc
.right
+ rc
.left
) / 2;
1465 pt
.y
= (rc
.bottom
+ rc
.top
) / 2;
1469 /* We have to drop it somewhere.. */
1473 m_ListView
.ClientToScreen(&pt
);
1479 x
= GET_X_LPARAM(lParam
);
1480 y
= GET_Y_LPARAM(lParam
);
1483 uCommand
= TrackPopupMenu(m_hContextMenu
,
1484 TPM_LEFTALIGN
| TPM_RETURNCMD
| TPM_LEFTBUTTON
| TPM_RIGHTBUTTON
,
1485 x
, y
, 0, m_hWnd
, NULL
);
1489 if (uCommand
== FCIDM_SHVIEW_OPEN
&& OnDefaultCommand() == S_OK
)
1492 InvokeContextMenuCommand(uCommand
- CONTEXT_MENU_BASE_ID
);
1497 IUnknown_SetSite(m_pCM
, NULL
);
1503 DestroyMenu(m_hContextMenu
);
1504 m_hContextMenu
= NULL
;
1510 LRESULT
CDefView::OnExplorerCommand(UINT uCommand
, BOOL bUseSelection
)
1515 hMenu
= CreatePopupMenu();
1519 hResult
= GetItemObject( bUseSelection
? SVGIO_SELECTION
: SVGIO_BACKGROUND
, IID_PPV_ARG(IContextMenu
, &m_pCM
));
1520 if (FAILED_UNEXPECTEDLY( hResult
))
1523 hResult
= m_pCM
->QueryContextMenu(hMenu
, 0, FCIDM_SHVIEWFIRST
, FCIDM_SHVIEWLAST
, CMF_NORMAL
);
1524 if (FAILED_UNEXPECTEDLY( hResult
))
1527 InvokeContextMenuCommand(uCommand
);
1532 IUnknown_SetSite(m_pCM
, NULL
);
1542 /**********************************************************
1543 * ##### message handling #####
1546 /**********************************************************
1547 * ShellView_OnSize()
1549 LRESULT
CDefView::OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1551 WORD wWidth
, wHeight
;
1553 wWidth
= LOWORD(lParam
);
1554 wHeight
= HIWORD(lParam
);
1556 TRACE("%p width=%u height=%u\n", this, wWidth
, wHeight
);
1558 /* Resize the ListView to fit our window */
1561 ::MoveWindow(m_ListView
, 0, 0, wWidth
, wHeight
, TRUE
);
1564 _DoFolderViewCB(SFVM_SIZE
, 0, 0);
1569 /**********************************************************
1570 * ShellView_OnDeactivate()
1575 void CDefView::OnDeactivate()
1577 TRACE("%p\n", this);
1579 if (m_uState
!= SVUIA_DEACTIVATE
)
1581 // TODO: cleanup menu after deactivation
1583 m_uState
= SVUIA_DEACTIVATE
;
1587 void CDefView::DoActivate(UINT uState
)
1589 TRACE("%p uState=%x\n", this, uState
);
1591 /*don't do anything if the state isn't really changing */
1592 if (m_uState
== uState
)
1597 if (uState
== SVUIA_DEACTIVATE
)
1603 if(m_hMenu
&& !m_bmenuBarInitialized
)
1607 m_pShellBrowser
->SetMenuSB(m_hMenu
, 0, m_hWnd
);
1608 m_bmenuBarInitialized
= TRUE
;
1611 if (SVUIA_ACTIVATE_FOCUS
== uState
)
1613 m_ListView
.SetFocus();
1621 /**********************************************************
1622 * ShellView_OnActivate()
1624 LRESULT
CDefView::OnActivate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1626 DoActivate(SVUIA_ACTIVATE_FOCUS
);
1630 /**********************************************************
1631 * ShellView_OnSetFocus()
1634 LRESULT
CDefView::OnSetFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1636 TRACE("%p\n", this);
1638 /* Tell the browser one of our windows has received the focus. This
1639 should always be done before merging menus (OnActivate merges the
1640 menus) if one of our windows has the focus.*/
1642 m_pShellBrowser
->OnViewWindowActive(this);
1643 DoActivate(SVUIA_ACTIVATE_FOCUS
);
1645 /* Set the focus to the listview */
1646 m_ListView
.SetFocus();
1648 /* Notify the ICommDlgBrowser interface */
1649 OnStateChange(CDBOSC_SETFOCUS
);
1654 /**********************************************************
1655 * ShellView_OnKillFocus()
1657 LRESULT
CDefView::OnKillFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1659 TRACE("(%p) stub\n", this);
1661 DoActivate(SVUIA_ACTIVATE_NOFOCUS
);
1662 /* Notify the ICommDlgBrowser */
1663 OnStateChange(CDBOSC_KILLFOCUS
);
1668 /**********************************************************
1669 * ShellView_OnCommand()
1672 * the CmdID's are the ones from the context menu
1674 LRESULT
CDefView::OnCommand(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1681 dwCmdID
= GET_WM_COMMAND_ID(wParam
, lParam
);
1682 dwCmd
= GET_WM_COMMAND_CMD(wParam
, lParam
);
1683 hwndCmd
= GET_WM_COMMAND_HWND(wParam
, lParam
);
1685 TRACE("(%p)->(0x%08x 0x%08x %p) stub\n", this, dwCmdID
, dwCmd
, hwndCmd
);
1689 case FCIDM_SHVIEW_SMALLICON
:
1690 m_FolderSettings
.ViewMode
= FVM_SMALLICON
;
1691 m_ListView
.ModifyStyle(LVS_TYPEMASK
, LVS_SMALLICON
);
1695 case FCIDM_SHVIEW_BIGICON
:
1696 m_FolderSettings
.ViewMode
= FVM_ICON
;
1697 m_ListView
.ModifyStyle(LVS_TYPEMASK
, LVS_ICON
);
1701 case FCIDM_SHVIEW_LISTVIEW
:
1702 m_FolderSettings
.ViewMode
= FVM_LIST
;
1703 m_ListView
.ModifyStyle(LVS_TYPEMASK
, LVS_LIST
);
1707 case FCIDM_SHVIEW_REPORTVIEW
:
1708 m_FolderSettings
.ViewMode
= FVM_DETAILS
;
1709 m_ListView
.ModifyStyle(LVS_TYPEMASK
, LVS_REPORT
);
1713 /* the menu-ID's for sorting are 0x30... see shrec.rc */
1718 m_sortInfo
.nHeaderID
= dwCmdID
- 0x30;
1719 m_sortInfo
.bIsAscending
= TRUE
;
1723 case FCIDM_SHVIEW_SNAPTOGRID
:
1726 case FCIDM_SHVIEW_AUTOARRANGE
:
1727 if (GetAutoArrange() == S_OK
)
1728 m_ListView
.ModifyStyle(LVS_AUTOARRANGE
, 0);
1732 case FCIDM_SHVIEW_SELECTALL
:
1733 m_ListView
.SetItemState(-1, LVIS_SELECTED
, LVIS_SELECTED
);
1736 case FCIDM_SHVIEW_INVERTSELECTION
:
1737 nCount
= m_ListView
.GetItemCount();
1738 for (int i
=0; i
< nCount
; i
++)
1739 m_ListView
.SetItemState(i
, m_ListView
.GetItemState(i
, LVIS_SELECTED
) ? 0 : LVIS_SELECTED
, LVIS_SELECTED
);
1742 case FCIDM_SHVIEW_REFRESH
:
1746 case FCIDM_SHVIEW_DELETE
:
1747 case FCIDM_SHVIEW_CUT
:
1748 case FCIDM_SHVIEW_COPY
:
1749 case FCIDM_SHVIEW_RENAME
:
1750 case FCIDM_SHVIEW_PROPERTIES
:
1751 return OnExplorerCommand(dwCmdID
, TRUE
);
1753 case FCIDM_SHVIEW_INSERT
:
1754 case FCIDM_SHVIEW_UNDO
:
1755 case FCIDM_SHVIEW_INSERTLINK
:
1756 case FCIDM_SHVIEW_NEWFOLDER
:
1757 return OnExplorerCommand(dwCmdID
, FALSE
);
1759 /* WM_COMMAND messages from the file menu are routed to the CDefView so as to let m_pCM handle the command */
1760 if (m_pCM
&& dwCmd
== 0)
1762 InvokeContextMenuCommand(dwCmdID
);
1769 /**********************************************************
1770 * ShellView_OnNotify()
1773 LRESULT
CDefView::OnNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1777 LPNMLISTVIEW lpnmlv
;
1778 NMLVDISPINFOW
*lpdi
;
1779 PCUITEMID_CHILD pidl
;
1783 lpnmh
= (LPNMHDR
)lParam
;
1784 lpnmlv
= (LPNMLISTVIEW
)lpnmh
;
1785 lpdi
= (NMLVDISPINFOW
*)lpnmh
;
1787 TRACE("%p CtlID=%u lpnmh->code=%x\n", this, CtlID
, lpnmh
->code
);
1789 switch (lpnmh
->code
)
1792 TRACE("-- NM_SETFOCUS %p\n", this);
1793 OnSetFocus(0, 0, 0, unused
);
1797 TRACE("-- NM_KILLFOCUS %p\n", this);
1799 /* Notify the ICommDlgBrowser interface */
1800 OnStateChange(CDBOSC_KILLFOCUS
);
1804 TRACE("-- NM_CUSTOMDRAW %p\n", this);
1805 return CDRF_DODEFAULT
;
1807 case NM_RELEASEDCAPTURE
:
1808 TRACE("-- NM_RELEASEDCAPTURE %p\n", this);
1812 TRACE("-- NM_CLICK %p\n", this);
1816 TRACE("-- NM_RCLICK %p\n", this);
1820 TRACE("-- NM_DBLCLK %p\n", this);
1821 OpenSelectedItems();
1825 TRACE("-- NM_RETURN %p\n", this);
1826 OpenSelectedItems();
1830 TRACE("-- HDN_ENDTRACKW %p\n", this);
1831 /*nColumn1 = m_ListView.GetColumnWidth(0);
1832 nColumn2 = m_ListView.GetColumnWidth(1);*/
1835 case LVN_DELETEITEM
:
1836 TRACE("-- LVN_DELETEITEM %p\n", this);
1838 /*delete the pidl because we made a copy of it*/
1839 SHFree(reinterpret_cast<LPVOID
>(lpnmlv
->lParam
));
1843 case LVN_DELETEALLITEMS
:
1844 TRACE("-- LVN_DELETEALLITEMS %p\n", this);
1847 case LVN_INSERTITEM
:
1848 TRACE("-- LVN_INSERTITEM (STUB)%p\n", this);
1851 case LVN_ITEMACTIVATE
:
1852 TRACE("-- LVN_ITEMACTIVATE %p\n", this);
1853 OnStateChange(CDBOSC_SELCHANGE
); /* the browser will get the IDataObject now */
1856 case LVN_COLUMNCLICK
:
1857 m_sortInfo
.nHeaderID
= lpnmlv
->iSubItem
;
1858 if (m_sortInfo
.nLastHeaderID
== m_sortInfo
.nHeaderID
)
1859 m_sortInfo
.bIsAscending
= !m_sortInfo
.bIsAscending
;
1861 m_sortInfo
.bIsAscending
= TRUE
;
1865 case LVN_GETDISPINFOA
:
1866 case LVN_GETDISPINFOW
:
1867 TRACE("-- LVN_GETDISPINFO %p\n", this);
1868 pidl
= _PidlByItem(lpdi
->item
);
1870 if (lpdi
->item
.mask
& LVIF_TEXT
) /* text requested */
1875 if (FAILED_UNEXPECTEDLY(m_pSF2Parent
->GetDetailsOf(pidl
, lpdi
->item
.iSubItem
, &sd
)))
1878 if (lpnmh
->code
== LVN_GETDISPINFOA
)
1880 /* shouldn't happen */
1881 NMLVDISPINFOA
*lpdiA
= (NMLVDISPINFOA
*)lpnmh
;
1882 StrRetToStrNA( lpdiA
->item
.pszText
, lpdiA
->item
.cchTextMax
, &sd
.str
, NULL
);
1883 TRACE("-- text=%s\n", lpdiA
->item
.pszText
);
1885 else /* LVN_GETDISPINFOW */
1887 StrRetToStrNW( lpdi
->item
.pszText
, lpdi
->item
.cchTextMax
, &sd
.str
, NULL
);
1888 TRACE("-- text=%s\n", debugstr_w(lpdi
->item
.pszText
));
1893 FIXME("no m_pSF2Parent\n");
1896 if(lpdi
->item
.mask
& LVIF_IMAGE
) /* image requested */
1898 lpdi
->item
.iImage
= SHMapPIDLToSystemImageListIndex(m_pSFParent
, pidl
, 0);
1900 if(lpdi
->item
.mask
& LVIF_STATE
)
1902 ULONG attributes
= SFGAO_HIDDEN
;
1903 if (SUCCEEDED(m_pSFParent
->GetAttributesOf(1, &pidl
, &attributes
)))
1905 if (attributes
& SFGAO_HIDDEN
)
1907 lpdi
->item
.state
|= LVIS_CUT
;
1911 lpdi
->item
.mask
|= LVIF_DI_SETITEM
;
1914 case LVN_ITEMCHANGED
:
1915 TRACE("-- LVN_ITEMCHANGED %p\n", this);
1916 OnStateChange(CDBOSC_SELCHANGE
); /* the browser will get the IDataObject now */
1918 _DoFolderViewCB(SFVM_SELECTIONCHANGED
, NULL
/* FIXME */, NULL
/* FIXME */);
1922 case LVN_BEGINRDRAG
:
1923 TRACE("-- LVN_BEGINDRAG\n");
1925 if (GetSelections())
1927 CComPtr
<IDataObject
> pda
;
1928 DWORD dwAttributes
= SFGAO_CANCOPY
| SFGAO_CANLINK
;
1929 DWORD dwEffect
= DROPEFFECT_MOVE
;
1931 if (SUCCEEDED(m_pSFParent
->GetUIObjectOf(m_hWnd
, m_cidl
, m_apidl
, IID_NULL_PPV_ARG(IDataObject
, &pda
))))
1933 LPNMLISTVIEW params
= (LPNMLISTVIEW
)lParam
;
1935 if (SUCCEEDED(m_pSFParent
->GetAttributesOf(m_cidl
, m_apidl
, &dwAttributes
)))
1937 dwEffect
|= dwAttributes
& (SFGAO_CANCOPY
| SFGAO_CANLINK
);
1940 CComPtr
<IAsyncOperation
> piaso
;
1941 if (SUCCEEDED(pda
->QueryInterface(IID_PPV_ARG(IAsyncOperation
, &piaso
))))
1943 piaso
->SetAsyncMode(TRUE
);
1948 m_pSourceDataObject
= pda
;
1949 m_ptFirstMousePos
= params
->ptAction
;
1950 ClientToScreen(&m_ptFirstMousePos
);
1952 HIMAGELIST big_icons
, small_icons
;
1953 Shell_GetImageLists(&big_icons
, &small_icons
);
1954 PCUITEMID_CHILD pidl
= _PidlByItem(params
->iItem
);
1955 int iIcon
= SHMapPIDLToSystemImageListIndex(m_pSFParent
, pidl
, 0);
1957 m_ListView
.GetItemPosition(params
->iItem
, &ptItem
);
1959 ImageList_BeginDrag(big_icons
, iIcon
, params
->ptAction
.x
- ptItem
.x
, params
->ptAction
.y
- ptItem
.y
);
1961 DoDragDrop(pda
, this, dwEffect
, &dwEffect2
);
1963 m_pSourceDataObject
.Release();
1968 case LVN_BEGINLABELEDITW
:
1970 DWORD dwAttr
= SFGAO_CANRENAME
;
1971 pidl
= _PidlByItem(lpdi
->item
);
1973 TRACE("-- LVN_BEGINLABELEDITW %p\n", this);
1975 m_pSFParent
->GetAttributesOf(1, &pidl
, &dwAttr
);
1976 if (SFGAO_CANRENAME
& dwAttr
)
1984 case LVN_ENDLABELEDITW
:
1986 TRACE("-- LVN_ENDLABELEDITW %p\n", this);
1988 m_isEditing
= FALSE
;
1990 if (lpdi
->item
.pszText
)
1995 pidl
= _PidlByItem(lpdi
->item
);
1996 PITEMID_CHILD pidlNew
= NULL
;
1997 hr
= m_pSFParent
->SetNameOf(0, pidl
, lpdi
->item
.pszText
, SHGDN_INFOLDER
, &pidlNew
);
1999 if (SUCCEEDED(hr
) && pidlNew
)
2001 lvItem
.mask
= LVIF_PARAM
|LVIF_IMAGE
;
2002 lvItem
.iItem
= lpdi
->item
.iItem
;
2003 lvItem
.iSubItem
= 0;
2004 lvItem
.lParam
= reinterpret_cast<LPARAM
>(pidlNew
);
2005 lvItem
.iImage
= SHMapPIDLToSystemImageListIndex(m_pSFParent
, pidlNew
, 0);
2006 m_ListView
.SetItem(&lvItem
);
2007 m_ListView
.Update(lpdi
->item
.iItem
);
2016 TRACE("-- %p WM_COMMAND %x unhandled\n", this, lpnmh
->code
);
2024 * This is just a quick hack to make the desktop work correctly.
2025 * ITranslateShellChangeNotify's IsChildID is undocumented, but most likely the way that
2026 * a folder should know if it should update upon a change notification.
2027 * It is exported by merged folders at a minimum.
2029 static BOOL
ILIsParentOrSpecialParent(PCIDLIST_ABSOLUTE pidl1
, PCIDLIST_ABSOLUTE pidl2
)
2031 if (!pidl1
|| !pidl2
)
2033 if (ILIsParent(pidl1
, pidl2
, TRUE
))
2036 if (_ILIsDesktop(pidl1
))
2038 PIDLIST_ABSOLUTE deskpidl
;
2039 SHGetFolderLocation(NULL
, CSIDL_DESKTOPDIRECTORY
, NULL
, 0, &deskpidl
);
2040 if (ILIsParent(deskpidl
, pidl2
, TRUE
))
2046 SHGetFolderLocation(NULL
, CSIDL_COMMON_DESKTOPDIRECTORY
, NULL
, 0, &deskpidl
);
2047 if (ILIsParent(deskpidl
, pidl2
, TRUE
))
2057 /**********************************************************
2058 * ShellView_OnChange()
2060 LRESULT
CDefView::OnChangeNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
2062 PCIDLIST_ABSOLUTE
*Pidls
= reinterpret_cast<PCIDLIST_ABSOLUTE
*>(wParam
);
2063 BOOL bParent0
= ILIsParentOrSpecialParent(m_pidlParent
, Pidls
[0]);
2064 BOOL bParent1
= ILIsParentOrSpecialParent(m_pidlParent
, Pidls
[1]);
2066 TRACE("(%p)(%p,%p,0x%08x)\n", this, Pidls
[0], Pidls
[1], lParam
);
2068 switch (lParam
&~ SHCNE_INTERRUPT
)
2074 if (LV_FindItemByPidl(ILFindLastID(Pidls
[0])) == -1)
2076 LV_AddItem(ILFindLastID(Pidls
[0]));
2080 LV_ProdItem(ILFindLastID(Pidls
[0]));
2088 LV_DeleteItem(ILFindLastID(Pidls
[0]));
2091 case SHCNE_RENAMEFOLDER
:
2092 case SHCNE_RENAMEITEM
:
2093 if (bParent0
&& bParent1
)
2094 LV_RenameItem(ILFindLastID(Pidls
[0]), ILFindLastID(Pidls
[1]));
2096 LV_DeleteItem(ILFindLastID(Pidls
[0]));
2098 LV_AddItem(ILFindLastID(Pidls
[1]));
2101 case SHCNE_UPDATEITEM
:
2103 LV_RenameItem(ILFindLastID(Pidls
[0]), ILFindLastID(Pidls
[0]));
2106 case SHCNE_UPDATEDIR
:
2113 HRESULT
SHGetMenuIdFromMenuMsg(UINT uMsg
, LPARAM lParam
, UINT
*CmdId
);
2114 HRESULT
SHSetMenuIdInMenuMsg(UINT uMsg
, LPARAM lParam
, UINT CmdId
);
2116 /**********************************************************
2117 * CDefView::OnCustomItem
2119 LRESULT
CDefView::OnCustomItem(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
2124 ERR("no menu!!!\n");
2128 /* The lParam of WM_DRAWITEM WM_MEASUREITEM contain a menu id and this also needs to
2129 be changed to a menu identifier offset */
2131 HRESULT hres
= SHGetMenuIdFromMenuMsg(uMsg
, lParam
, &CmdID
);
2132 if (SUCCEEDED(hres
))
2133 SHSetMenuIdInMenuMsg(uMsg
, lParam
, CmdID
- CONTEXT_MENU_BASE_ID
);
2135 /* Forward the message to the IContextMenu2 */
2137 hres
= SHForwardContextMenuMsg(m_pCM
, uMsg
, wParam
, lParam
, &result
, TRUE
);
2139 return (SUCCEEDED(hres
));
2142 LRESULT
CDefView::OnSettingChange(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
2144 /* Wallpaper setting affects drop shadows effect */
2145 if (wParam
== SPI_SETDESKWALLPAPER
|| wParam
== 0)
2151 /**********************************************************
2152 * CDefView::OnInitMenuPopup
2154 LRESULT
CDefView::OnInitMenuPopup(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
2156 HMENU hmenu
= (HMENU
) wParam
;
2157 int nPos
= LOWORD(lParam
);
2160 OnCustomItem(uMsg
, wParam
, lParam
, bHandled
);
2162 HMENU hViewMenu
= GetSubmenuByID(m_hMenu
, FCIDM_MENU_VIEW
);
2164 /* Lets try to find out what the hell wParam is */
2165 if (hmenu
== GetSubMenu(m_hMenu
, nPos
))
2166 menuItemId
= ReallyGetMenuItemID(m_hMenu
, nPos
);
2167 else if (hViewMenu
&& hmenu
== GetSubMenu(hViewMenu
, nPos
))
2168 menuItemId
= ReallyGetMenuItemID(hViewMenu
, nPos
);
2169 else if (m_hContextMenu
&& hmenu
== GetSubMenu(m_hContextMenu
, nPos
))
2170 menuItemId
= ReallyGetMenuItemID(m_hContextMenu
, nPos
);
2176 case FCIDM_MENU_FILE
:
2179 case FCIDM_MENU_VIEW
:
2180 case FCIDM_SHVIEW_VIEW
:
2181 CheckViewMode(hmenu
);
2183 case FCIDM_SHVIEW_ARRANGE
:
2184 FillArrangeAsMenu(hmenu
);
2191 /**********************************************************
2194 * The INTERFACE of the IShellView object
2197 **********************************************************
2200 /**********************************************************
2201 * ShellView_GetWindow
2203 HRESULT WINAPI
CDefView::GetWindow(HWND
*phWnd
)
2205 TRACE("(%p)\n", this);
2212 HRESULT WINAPI
CDefView::ContextSensitiveHelp(BOOL fEnterMode
)
2214 FIXME("(%p) stub\n", this);
2219 /**********************************************************
2220 * IShellView_TranslateAccelerator
2223 * use the accel functions
2225 HRESULT WINAPI
CDefView::TranslateAccelerator(LPMSG lpmsg
)
2230 if (lpmsg
->message
>= WM_KEYFIRST
&& lpmsg
->message
<= WM_KEYLAST
)
2232 if (::TranslateAcceleratorW(m_hWnd
, m_hAccel
, lpmsg
) != 0)
2235 TRACE("-- key=0x%04lx\n", lpmsg
->wParam
) ;
2238 return m_pShellBrowser
->TranslateAcceleratorSB(lpmsg
, 0);
2241 HRESULT WINAPI
CDefView::EnableModeless(BOOL fEnable
)
2243 FIXME("(%p) stub\n", this);
2248 HRESULT WINAPI
CDefView::UIActivate(UINT uState
)
2250 // CHAR szName[MAX_PATH];
2252 int nPartArray
[1] = { -1};
2254 TRACE("(%p)->(state=%x) stub\n", this, uState
);
2256 /* don't do anything if the state isn't really changing */
2257 if (m_uState
== uState
)
2262 /* OnActivate handles the menu merging and internal state */
2265 /* only do This if we are active */
2266 if (uState
!= SVUIA_DEACTIVATE
)
2270 GetFolderPath is not a method of IShellFolder
2271 IShellFolder_GetFolderPath( m_pSFParent, szName, sizeof(szName) );
2273 /* set the number of parts */
2274 m_pShellBrowser
->SendControlMsg(FCW_STATUS
, SB_SETPARTS
, 1, (LPARAM
)nPartArray
, &lResult
);
2276 /* set the text for the parts */
2278 m_pShellBrowser->SendControlMsg(FCW_STATUS, SB_SETTEXTA, 0, (LPARAM)szName, &lResult);
2285 HRESULT WINAPI
CDefView::Refresh()
2287 TRACE("(%p)\n", this);
2289 m_ListView
.DeleteAllItems();
2295 HRESULT WINAPI
CDefView::CreateViewWindow(IShellView
*lpPrevView
, LPCFOLDERSETTINGS lpfs
, IShellBrowser
*psb
, RECT
*prcView
, HWND
*phWnd
)
2297 return CreateViewWindow3(psb
, lpPrevView
, SV3CVW3_DEFAULT
,
2298 (FOLDERFLAGS
)lpfs
->fFlags
, (FOLDERFLAGS
)lpfs
->fFlags
, (FOLDERVIEWMODE
)lpfs
->ViewMode
, NULL
, prcView
, phWnd
);
2301 HRESULT WINAPI
CDefView::DestroyViewWindow()
2303 TRACE("(%p)\n", this);
2305 /* Make absolutely sure all our UI is cleaned up */
2306 UIActivate(SVUIA_DEACTIVATE
);
2310 // "Accelerator tables loaded from resources are freed automatically when the application terminates." -- MSDN
2314 if (m_hMenuArrangeModes
)
2316 DestroyMenu(m_hMenuArrangeModes
);
2317 m_hMenuArrangeModes
= NULL
;
2320 if (m_hMenuViewModes
)
2322 DestroyMenu(m_hMenuViewModes
);
2323 m_hMenuViewModes
= NULL
;
2328 DestroyMenu(m_hMenu
);
2334 m_ListView
.DestroyWindow();
2342 m_pShellBrowser
.Release();
2343 m_pCommDlgBrowser
.Release();
2348 HRESULT WINAPI
CDefView::GetCurrentInfo(LPFOLDERSETTINGS lpfs
)
2350 TRACE("(%p)->(%p) vmode=%x flags=%x\n", this, lpfs
,
2351 m_FolderSettings
.ViewMode
, m_FolderSettings
.fFlags
);
2354 return E_INVALIDARG
;
2356 *lpfs
= m_FolderSettings
;
2360 HRESULT WINAPI
CDefView::AddPropertySheetPages(DWORD dwReserved
, LPFNADDPROPSHEETPAGE lpfn
, LPARAM lparam
)
2362 FIXME("(%p) stub\n", this);
2367 HRESULT WINAPI
CDefView::SaveViewState()
2369 FIXME("(%p) stub\n", this);
2374 HRESULT WINAPI
CDefView::SelectItem(PCUITEMID_CHILD pidl
, UINT uFlags
)
2378 TRACE("(%p)->(pidl=%p, 0x%08x) stub\n", this, pidl
, uFlags
);
2380 i
= LV_FindItemByPidl(pidl
);
2384 if(uFlags
& SVSI_ENSUREVISIBLE
)
2385 m_ListView
.EnsureVisible(i
, FALSE
);
2387 LVITEMW lvItem
= {0};
2388 lvItem
.mask
= LVIF_STATE
;
2389 lvItem
.stateMask
= LVIS_SELECTED
| LVIS_FOCUSED
;
2391 while (m_ListView
.GetItem(&lvItem
))
2393 if (lvItem
.iItem
== i
)
2395 if (uFlags
& SVSI_SELECT
)
2396 lvItem
.state
|= LVIS_SELECTED
;
2398 lvItem
.state
&= ~LVIS_SELECTED
;
2400 if (uFlags
& SVSI_FOCUSED
)
2401 lvItem
.state
&= ~LVIS_FOCUSED
;
2405 if (uFlags
& SVSI_DESELECTOTHERS
)
2406 lvItem
.state
&= ~LVIS_SELECTED
;
2409 m_ListView
.SetItem(&lvItem
);
2413 if((uFlags
& SVSI_EDIT
) == SVSI_EDIT
)
2414 m_ListView
.EditLabel(i
);
2419 HRESULT WINAPI
CDefView::GetItemObject(UINT uItem
, REFIID riid
, LPVOID
*ppvOut
)
2421 HRESULT hr
= E_NOINTERFACE
;
2423 TRACE("(%p)->(uItem=0x%08x,\n\tIID=%s, ppv=%p)\n", this, uItem
, debugstr_guid(&riid
), ppvOut
);
2429 case SVGIO_BACKGROUND
:
2430 if (IsEqualIID(riid
, IID_IContextMenu
))
2435 hr
= CDefViewBckgrndMenu_CreateInstance(m_pSF2Parent
, riid
, ppvOut
);
2436 if (FAILED_UNEXPECTEDLY(hr
))
2439 IUnknown_SetSite(*((IUnknown
**)ppvOut
), (IShellView
*)this);
2441 else if (IsEqualIID(riid
, IID_IDispatch
))
2443 if (m_pShellFolderViewDual
== NULL
)
2445 hr
= CDefViewDual_Constructor(riid
, (LPVOID
*)&m_pShellFolderViewDual
);
2446 if (FAILED_UNEXPECTEDLY(hr
))
2449 hr
= m_pShellFolderViewDual
->QueryInterface(riid
, ppvOut
);
2453 case SVGIO_SELECTION
:
2455 hr
= m_pSFParent
->GetUIObjectOf(m_hWnd
, m_cidl
, m_apidl
, riid
, 0, ppvOut
);
2456 if (FAILED_UNEXPECTEDLY(hr
))
2459 if (IsEqualIID(riid
, IID_IContextMenu
))
2460 IUnknown_SetSite(*((IUnknown
**)ppvOut
), (IShellView
*)this);
2465 TRACE("-- (%p)->(interface=%p)\n", this, *ppvOut
);
2470 HRESULT STDMETHODCALLTYPE
CDefView::GetCurrentViewMode(UINT
*pViewMode
)
2472 TRACE("(%p)->(%p), stub\n", this, pViewMode
);
2475 return E_INVALIDARG
;
2477 *pViewMode
= m_FolderSettings
.ViewMode
;
2481 HRESULT STDMETHODCALLTYPE
CDefView::SetCurrentViewMode(UINT ViewMode
)
2484 TRACE("(%p)->(%u), stub\n", this, ViewMode
);
2486 /* It's not redundant to check FVM_AUTO because it's a (UINT)-1 */
2487 if (((INT
)ViewMode
< FVM_FIRST
|| (INT
)ViewMode
> FVM_LAST
) && ((INT
)ViewMode
!= FVM_AUTO
))
2488 return E_INVALIDARG
;
2490 /* Windows before Vista uses LVM_SETVIEW and possibly
2491 LVM_SETEXTENDEDLISTVIEWSTYLE to set the style of the listview,
2492 while later versions seem to accomplish this through other
2500 dwStyle
= LVS_REPORT
;
2503 dwStyle
= LVS_SMALLICON
;
2510 FIXME("ViewMode %d not implemented\n", ViewMode
);
2516 m_ListView
.ModifyStyle(LVS_TYPEMASK
, dwStyle
);
2518 /* This will not necessarily be the actual mode set above.
2519 This mimics the behavior of Windows XP. */
2520 m_FolderSettings
.ViewMode
= ViewMode
;
2525 HRESULT STDMETHODCALLTYPE
CDefView::GetFolder(REFIID riid
, void **ppv
)
2527 if (m_pSFParent
== NULL
)
2530 return m_pSFParent
->QueryInterface(riid
, ppv
);
2533 HRESULT STDMETHODCALLTYPE
CDefView::Item(int iItemIndex
, PITEMID_CHILD
*ppidl
)
2535 PCUITEMID_CHILD pidl
= _PidlByItem(iItemIndex
);
2538 *ppidl
= ILClone(pidl
);
2543 return E_INVALIDARG
;
2546 HRESULT STDMETHODCALLTYPE
CDefView::ItemCount(UINT uFlags
, int *pcItems
)
2548 TRACE("(%p)->(%u %p)\n", this, uFlags
, pcItems
);
2550 if (uFlags
!= SVGIO_ALLVIEW
)
2551 FIXME("some flags unsupported, %x\n", uFlags
& ~SVGIO_ALLVIEW
);
2553 *pcItems
= m_ListView
.GetItemCount();
2558 HRESULT STDMETHODCALLTYPE
CDefView::Items(UINT uFlags
, REFIID riid
, void **ppv
)
2563 HRESULT STDMETHODCALLTYPE
CDefView::GetSelectionMarkedItem(int *piItem
)
2565 TRACE("(%p)->(%p)\n", this, piItem
);
2567 *piItem
= m_ListView
.GetSelectionMark();
2572 HRESULT STDMETHODCALLTYPE
CDefView::GetFocusedItem(int *piItem
)
2574 TRACE("(%p)->(%p)\n", this, piItem
);
2576 *piItem
= m_ListView
.GetNextItem(-1, LVNI_FOCUSED
);
2581 HRESULT STDMETHODCALLTYPE
CDefView::GetItemPosition(PCUITEMID_CHILD pidl
, POINT
*ppt
)
2583 int lvIndex
= LV_FindItemByPidl(pidl
);
2584 if (lvIndex
== -1 || ppt
== NULL
)
2585 return E_INVALIDARG
;
2587 m_ListView
.GetItemPosition(lvIndex
, ppt
);
2591 HRESULT STDMETHODCALLTYPE
CDefView::GetSpacing(POINT
*ppt
)
2593 TRACE("(%p)->(%p)\n", this, ppt
);
2601 m_ListView
.GetItemSpacing(spacing
);
2603 ppt
->x
= spacing
.cx
;
2604 ppt
->y
= spacing
.cy
;
2610 HRESULT STDMETHODCALLTYPE
CDefView::GetDefaultSpacing(POINT
*ppt
)
2615 HRESULT STDMETHODCALLTYPE
CDefView::GetAutoArrange()
2617 return ((m_ListView
.GetStyle() & LVS_AUTOARRANGE
) ? S_OK
: S_FALSE
);
2620 HRESULT STDMETHODCALLTYPE
CDefView::SelectItem(int iItem
, DWORD dwFlags
)
2624 TRACE("(%p)->(%d, %x)\n", this, iItem
, dwFlags
);
2627 lvItem
.stateMask
= LVIS_SELECTED
;
2629 if (dwFlags
& SVSI_ENSUREVISIBLE
)
2630 m_ListView
.EnsureVisible(iItem
, 0);
2633 if (dwFlags
& SVSI_DESELECTOTHERS
)
2634 m_ListView
.SetItemState(-1, 0, LVIS_SELECTED
);
2637 if (dwFlags
& SVSI_SELECT
)
2638 lvItem
.state
|= LVIS_SELECTED
;
2640 if (dwFlags
& SVSI_FOCUSED
)
2641 lvItem
.stateMask
|= LVIS_FOCUSED
;
2643 m_ListView
.SetItemState(iItem
, lvItem
.state
, lvItem
.stateMask
);
2645 if ((dwFlags
& SVSI_EDIT
) == SVSI_EDIT
)
2646 m_ListView
.EditLabel(iItem
);
2651 HRESULT STDMETHODCALLTYPE
CDefView::SelectAndPositionItems(UINT cidl
, PCUITEMID_CHILD_ARRAY apidl
, POINT
*apt
, DWORD dwFlags
)
2653 /* Reset the selection */
2654 m_ListView
.SetItemState(-1, 0, LVIS_SELECTED
);
2657 for (UINT i
= 0 ; i
< m_cidl
; i
++)
2659 lvIndex
= LV_FindItemByPidl(apidl
[i
]);
2662 SelectItem(lvIndex
, dwFlags
);
2663 m_ListView
.SetItemPosition(lvIndex
, &apt
[i
]);
2670 /**********************************************************
2671 * IShellView2 implementation
2674 HRESULT STDMETHODCALLTYPE
CDefView::GetView(SHELLVIEWID
*view_guid
, ULONG view_type
)
2676 FIXME("(%p)->(%p, %lu) stub\n", this, view_guid
, view_type
);
2680 HRESULT STDMETHODCALLTYPE
CDefView::CreateViewWindow2(LPSV2CVW2_PARAMS view_params
)
2682 return CreateViewWindow3(view_params
->psbOwner
, view_params
->psvPrev
,
2683 SV3CVW3_DEFAULT
, (FOLDERFLAGS
)view_params
->pfs
->fFlags
, (FOLDERFLAGS
)view_params
->pfs
->fFlags
,
2684 (FOLDERVIEWMODE
)view_params
->pfs
->ViewMode
, view_params
->pvid
, view_params
->prcView
, &view_params
->hwndView
);
2687 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
)
2689 OLEMENUGROUPWIDTHS omw
= { { 0, 0, 0, 0, 0, 0 } };
2693 TRACE("(%p)->(shlview=%p shlbrs=%p rec=%p hwnd=%p vmode=%x flags=%x)\n", this, psvPrevious
, psb
, prcView
, hwnd
, mode
, flags
);
2694 if (prcView
!= NULL
)
2695 TRACE("-- left=%i top=%i right=%i bottom=%i\n", prcView
->left
, prcView
->top
, prcView
->right
, prcView
->bottom
);
2697 /* Validate the Shell Browser */
2698 if (psb
== NULL
|| m_hWnd
)
2699 return E_UNEXPECTED
;
2701 if (view_flags
!= SV3CVW3_DEFAULT
)
2702 FIXME("unsupported view flags 0x%08x\n", view_flags
);
2704 /* Set up the member variables */
2705 m_pShellBrowser
= psb
;
2706 m_FolderSettings
.ViewMode
= mode
;
2707 m_FolderSettings
.fFlags
= mask
& flags
;
2711 if (IsEqualIID(*view_id
, VID_LargeIcons
))
2712 m_FolderSettings
.ViewMode
= FVM_ICON
;
2713 else if (IsEqualIID(*view_id
, VID_SmallIcons
))
2714 m_FolderSettings
.ViewMode
= FVM_SMALLICON
;
2715 else if (IsEqualIID(*view_id
, VID_List
))
2716 m_FolderSettings
.ViewMode
= FVM_LIST
;
2717 else if (IsEqualIID(*view_id
, VID_Details
))
2718 m_FolderSettings
.ViewMode
= FVM_DETAILS
;
2719 else if (IsEqualIID(*view_id
, VID_Thumbnails
))
2720 m_FolderSettings
.ViewMode
= FVM_THUMBNAIL
;
2721 else if (IsEqualIID(*view_id
, VID_Tile
))
2722 m_FolderSettings
.ViewMode
= FVM_TILE
;
2723 else if (IsEqualIID(*view_id
, VID_ThumbStrip
))
2724 m_FolderSettings
.ViewMode
= FVM_THUMBSTRIP
;
2726 FIXME("Ignoring unrecognized VID %s\n", debugstr_guid(view_id
));
2729 /* Get our parent window */
2730 m_pShellBrowser
->GetWindow(&m_hWndParent
);
2732 /* Try to get the ICommDlgBrowserInterface, adds a reference !!! */
2733 m_pCommDlgBrowser
= NULL
;
2734 if (SUCCEEDED(m_pShellBrowser
->QueryInterface(IID_PPV_ARG(ICommDlgBrowser
, &m_pCommDlgBrowser
))))
2736 TRACE("-- CommDlgBrowser\n");
2739 Create(m_hWndParent
, prcView
, NULL
, WS_CHILD
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
| WS_TABSTOP
, 0, 0U);
2750 _DoFolderViewCB(SFVM_WINDOWCREATED
, (WPARAM
)m_hWnd
, NULL
);
2752 SetWindowPos(HWND_TOP
, 0, 0, 0, 0, SWP_NOMOVE
| SWP_NOSIZE
| SWP_SHOWWINDOW
);
2757 m_hMenu
= CreateMenu();
2758 m_pShellBrowser
->InsertMenusSB(m_hMenu
, &omw
);
2759 TRACE("-- after fnInsertMenusSB\n");
2767 HRESULT STDMETHODCALLTYPE
CDefView::HandleRename(LPCITEMIDLIST new_pidl
)
2769 FIXME("(%p)->(%p) stub\n", this, new_pidl
);
2773 HRESULT STDMETHODCALLTYPE
CDefView::SelectAndPositionItem(LPCITEMIDLIST item
, UINT flags
, POINT
*point
)
2775 FIXME("(%p)->(%p, %u, %p) stub\n", this, item
, flags
, point
);
2779 /**********************************************************
2780 * IShellFolderView implementation
2782 HRESULT STDMETHODCALLTYPE
CDefView::Rearrange(LPARAM sort
)
2784 FIXME("(%p)->(%ld) stub\n", this, sort
);
2788 HRESULT STDMETHODCALLTYPE
CDefView::GetArrangeParam(LPARAM
*sort
)
2790 FIXME("(%p)->(%p) stub\n", this, sort
);
2794 HRESULT STDMETHODCALLTYPE
CDefView::ArrangeGrid()
2796 FIXME("(%p) stub\n", this);
2800 HRESULT STDMETHODCALLTYPE
CDefView::AutoArrange()
2802 m_ListView
.ModifyStyle(0, LVS_AUTOARRANGE
);
2803 m_ListView
.Arrange(LVA_DEFAULT
);
2807 HRESULT STDMETHODCALLTYPE
CDefView::AddObject(PITEMID_CHILD pidl
, UINT
*item
)
2809 FIXME("(%p)->(%p %p) stub\n", this, pidl
, item
);
2813 HRESULT STDMETHODCALLTYPE
CDefView::GetObject(PITEMID_CHILD
*pidl
, UINT item
)
2815 TRACE("(%p)->(%p %d)\n", this, pidl
, item
);
2816 return Item(item
, pidl
);
2819 HRESULT STDMETHODCALLTYPE
CDefView::RemoveObject(PITEMID_CHILD pidl
, UINT
*item
)
2822 TRACE("(%p)->(%p %p)\n", this, pidl
, item
);
2826 *item
= LV_FindItemByPidl(ILFindLastID(pidl
));
2827 m_ListView
.DeleteItem(*item
);
2832 m_ListView
.DeleteAllItems();
2838 HRESULT STDMETHODCALLTYPE
CDefView::GetObjectCount(UINT
*count
)
2840 TRACE("(%p)->(%p)\n", this, count
);
2841 *count
= m_ListView
.GetItemCount();
2845 HRESULT STDMETHODCALLTYPE
CDefView::SetObjectCount(UINT count
, UINT flags
)
2847 FIXME("(%p)->(%d %x) stub\n", this, count
, flags
);
2851 HRESULT STDMETHODCALLTYPE
CDefView::UpdateObject(PITEMID_CHILD pidl_old
, PITEMID_CHILD pidl_new
, UINT
*item
)
2853 FIXME("(%p)->(%p %p %p) stub\n", this, pidl_old
, pidl_new
, item
);
2857 HRESULT STDMETHODCALLTYPE
CDefView::RefreshObject(PITEMID_CHILD pidl
, UINT
*item
)
2859 FIXME("(%p)->(%p %p) stub\n", this, pidl
, item
);
2863 HRESULT STDMETHODCALLTYPE
CDefView::SetRedraw(BOOL redraw
)
2865 TRACE("(%p)->(%d)\n", this, redraw
);
2866 m_ListView
.SetRedraw(redraw
);
2870 HRESULT STDMETHODCALLTYPE
CDefView::GetSelectedCount(UINT
*count
)
2872 FIXME("(%p)->(%p) stub\n", this, count
);
2876 HRESULT STDMETHODCALLTYPE
CDefView::GetSelectedObjects(PCUITEMID_CHILD
**pidl
, UINT
*items
)
2878 TRACE("(%p)->(%p %p)\n", this, pidl
, items
);
2880 *items
= GetSelections();
2884 *pidl
= static_cast<PCUITEMID_CHILD
*>(LocalAlloc(0, *items
* sizeof(PCUITEMID_CHILD
)));
2887 return E_OUTOFMEMORY
;
2890 /* it's documented that caller shouldn't PIDLs, only array itself */
2891 memcpy(*pidl
, m_apidl
, *items
* sizeof(PCUITEMID_CHILD
));
2897 HRESULT STDMETHODCALLTYPE
CDefView::IsDropOnSource(IDropTarget
*drop_target
)
2899 if ((m_iDragOverItem
== -1 || m_pCurDropTarget
== NULL
) &&
2900 (m_pSourceDataObject
.p
))
2908 HRESULT STDMETHODCALLTYPE
CDefView::GetDragPoint(POINT
*pt
)
2911 return E_INVALIDARG
;
2913 *pt
= m_ptFirstMousePos
;
2917 HRESULT STDMETHODCALLTYPE
CDefView::GetDropPoint(POINT
*pt
)
2919 FIXME("(%p)->(%p) stub\n", this, pt
);
2923 HRESULT STDMETHODCALLTYPE
CDefView::MoveIcons(IDataObject
*obj
)
2925 TRACE("(%p)->(%p)\n", this, obj
);
2929 HRESULT STDMETHODCALLTYPE
CDefView::SetItemPos(PCUITEMID_CHILD pidl
, POINT
*pt
)
2931 FIXME("(%p)->(%p %p) stub\n", this, pidl
, pt
);
2935 HRESULT STDMETHODCALLTYPE
CDefView::IsBkDropTarget(IDropTarget
*drop_target
)
2937 FIXME("(%p)->(%p) stub\n", this, drop_target
);
2941 HRESULT STDMETHODCALLTYPE
CDefView::SetClipboard(BOOL move
)
2943 FIXME("(%p)->(%d) stub\n", this, move
);
2947 HRESULT STDMETHODCALLTYPE
CDefView::SetPoints(IDataObject
*obj
)
2949 FIXME("(%p)->(%p) stub\n", this, obj
);
2953 HRESULT STDMETHODCALLTYPE
CDefView::GetItemSpacing(ITEMSPACING
*spacing
)
2955 FIXME("(%p)->(%p) stub\n", this, spacing
);
2959 HRESULT STDMETHODCALLTYPE
CDefView::SetCallback(IShellFolderViewCB
*new_cb
, IShellFolderViewCB
**old_cb
)
2962 *old_cb
= m_pShellFolderViewCB
.Detach();
2964 m_pShellFolderViewCB
= new_cb
;
2968 HRESULT STDMETHODCALLTYPE
CDefView::Select(UINT flags
)
2970 FIXME("(%p)->(%d) stub\n", this, flags
);
2974 HRESULT STDMETHODCALLTYPE
CDefView::QuerySupport(UINT
*support
)
2976 TRACE("(%p)->(%p)\n", this, support
);
2980 HRESULT STDMETHODCALLTYPE
CDefView::SetAutomationObject(IDispatch
*disp
)
2982 FIXME("(%p)->(%p) stub\n", this, disp
);
2986 /**********************************************************
2987 * ISVOleCmdTarget_QueryStatus (IOleCommandTarget)
2989 HRESULT WINAPI
CDefView::QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
, OLECMD
*prgCmds
, OLECMDTEXT
*pCmdText
)
2991 FIXME("(%p)->(%p(%s) 0x%08x %p %p\n",
2992 this, pguidCmdGroup
, debugstr_guid(pguidCmdGroup
), cCmds
, prgCmds
, pCmdText
);
2995 return E_INVALIDARG
;
2997 for (UINT i
= 0; i
< cCmds
; i
++)
2999 FIXME("\tprgCmds[%d].cmdID = %d\n", i
, prgCmds
[i
].cmdID
);
3000 prgCmds
[i
].cmdf
= 0;
3003 return OLECMDERR_E_UNKNOWNGROUP
;
3006 /**********************************************************
3007 * ISVOleCmdTarget_Exec (IOleCommandTarget)
3009 * nCmdID is the OLECMDID_* enumeration
3011 HRESULT WINAPI
CDefView::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
3013 FIXME("(%p)->(\n\tTarget GUID:%s Command:0x%08x Opt:0x%08x %p %p)\n",
3014 this, debugstr_guid(pguidCmdGroup
), nCmdID
, nCmdexecopt
, pvaIn
, pvaOut
);
3017 return OLECMDERR_E_UNKNOWNGROUP
;
3019 if (IsEqualCLSID(*pguidCmdGroup
, m_Category
))
3021 if (nCmdID
== FCIDM_SHVIEW_AUTOARRANGE
)
3023 if (V_VT(pvaIn
) != VT_INT_PTR
)
3024 return OLECMDERR_E_NOTSUPPORTED
;
3027 params
.cbSize
= sizeof(params
);
3028 params
.rcExclude
= *(RECT
*) V_INTREF(pvaIn
);
3030 if (m_hMenuViewModes
)
3032 /* Duplicate all but the last two items of the view modes menu */
3033 HMENU hmenuViewPopup
= CreatePopupMenu();
3034 Shell_MergeMenus(hmenuViewPopup
, m_hMenuViewModes
, 0, 0, 0xFFFF, 0);
3035 DeleteMenu(hmenuViewPopup
, GetMenuItemCount(hmenuViewPopup
) - 1, MF_BYPOSITION
);
3036 DeleteMenu(hmenuViewPopup
, GetMenuItemCount(hmenuViewPopup
) - 1, MF_BYPOSITION
);
3037 CheckViewMode(hmenuViewPopup
);
3038 TrackPopupMenuEx(hmenuViewPopup
, TPM_LEFTALIGN
| TPM_TOPALIGN
, params
.rcExclude
.left
, params
.rcExclude
.bottom
, m_hWndParent
, ¶ms
);
3039 ::DestroyMenu(hmenuViewPopup
);
3042 // pvaOut is VT_I4 with value 0x403 (cmd id of the new mode maybe?)
3043 V_VT(pvaOut
) = VT_I4
;
3044 V_I4(pvaOut
) = 0x403;
3048 if (IsEqualIID(*pguidCmdGroup
, CGID_Explorer
) &&
3050 (nCmdexecopt
== 4) && pvaOut
)
3053 if (IsEqualIID(*pguidCmdGroup
, CGID_ShellDocView
) &&
3058 return OLECMDERR_E_UNKNOWNGROUP
;
3061 /**********************************************************
3062 * ISVDropTarget implementation
3065 /******************************************************************************
3066 * drag_notify_subitem [Internal]
3068 * Figure out the shellfolder object, which is currently under the mouse cursor
3069 * and notify it via the IDropTarget interface.
3072 #define SCROLLAREAWIDTH 20
3074 HRESULT
CDefView::drag_notify_subitem(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
3080 /* The key state on drop doesn't have MK_LBUTTON or MK_RBUTTON because it
3081 reflects the key state after the user released the button, so we need
3082 to remember the last key state when the button was pressed */
3083 m_grfKeyState
= grfKeyState
;
3085 /* Map from global to client coordinates and query the index of the listview-item, which is
3086 * currently under the mouse cursor. */
3087 LVHITTESTINFO htinfo
= {{pt
.x
, pt
.y
}, LVHT_ONITEM
};
3088 ScreenToClient(&htinfo
.pt
);
3089 lResult
= m_ListView
.HitTest(&htinfo
);
3091 /* Send WM_*SCROLL messages every 250 ms during drag-scrolling */
3092 ::GetClientRect(m_ListView
, &clientRect
);
3093 if (htinfo
.pt
.x
== m_ptLastMousePos
.x
&& htinfo
.pt
.y
== m_ptLastMousePos
.y
&&
3094 (htinfo
.pt
.x
< SCROLLAREAWIDTH
|| htinfo
.pt
.x
> clientRect
.right
- SCROLLAREAWIDTH
||
3095 htinfo
.pt
.y
< SCROLLAREAWIDTH
|| htinfo
.pt
.y
> clientRect
.bottom
- SCROLLAREAWIDTH
))
3097 m_cScrollDelay
= (m_cScrollDelay
+ 1) % 5; /* DragOver is called every 50 ms */
3098 if (m_cScrollDelay
== 0)
3100 /* Mouse did hover another 250 ms over the scroll-area */
3101 if (htinfo
.pt
.x
< SCROLLAREAWIDTH
)
3102 m_ListView
.SendMessageW(WM_HSCROLL
, SB_LINEUP
, 0);
3104 if (htinfo
.pt
.x
> clientRect
.right
- SCROLLAREAWIDTH
)
3105 m_ListView
.SendMessageW(WM_HSCROLL
, SB_LINEDOWN
, 0);
3107 if (htinfo
.pt
.y
< SCROLLAREAWIDTH
)
3108 m_ListView
.SendMessageW(WM_VSCROLL
, SB_LINEUP
, 0);
3110 if (htinfo
.pt
.y
> clientRect
.bottom
- SCROLLAREAWIDTH
)
3111 m_ListView
.SendMessageW(WM_VSCROLL
, SB_LINEDOWN
, 0);
3116 m_cScrollDelay
= 0; /* Reset, if the cursor is not over the listview's scroll-area */
3119 m_ptLastMousePos
= htinfo
.pt
;
3121 /* We need to check if we drag the selection over itself */
3122 if (lResult
!= -1 && m_pSourceDataObject
.p
!= NULL
)
3124 PCUITEMID_CHILD pidl
= _PidlByItem(lResult
);
3126 for (UINT i
= 0; i
< m_cidl
; i
++)
3128 if (pidl
== m_apidl
[i
])
3130 /* The item that is being draged is hovering itself. */
3137 /* If we are still over the previous sub-item, notify it via DragOver and return. */
3138 if (m_pCurDropTarget
&& lResult
== m_iDragOverItem
)
3139 return m_pCurDropTarget
->DragOver(grfKeyState
, pt
, pdwEffect
);
3141 /* We've left the previous sub-item, notify it via DragLeave and Release it. */
3142 if (m_pCurDropTarget
)
3144 PCUITEMID_CHILD pidl
= _PidlByItem(m_iDragOverItem
);
3146 SelectItem(pidl
, 0);
3148 m_pCurDropTarget
->DragLeave();
3149 m_pCurDropTarget
.Release();
3152 m_iDragOverItem
= lResult
;
3156 /* We are not above one of the listview's subitems. Bind to the parent folder's
3157 * DropTarget interface. */
3158 hr
= m_pSFParent
->CreateViewObject(NULL
, IID_PPV_ARG(IDropTarget
,&m_pCurDropTarget
));
3162 /* Query the relative PIDL of the shellfolder object represented by the currently
3163 * dragged over listview-item ... */
3164 PCUITEMID_CHILD pidl
= _PidlByItem(lResult
);
3166 /* ... and bind m_pCurDropTarget to the IDropTarget interface of an UIObject of this object */
3167 hr
= m_pSFParent
->GetUIObjectOf(m_ListView
, 1, &pidl
, IID_NULL_PPV_ARG(IDropTarget
, &m_pCurDropTarget
));
3170 IUnknown_SetSite(m_pCurDropTarget
, (IShellView
*)this);
3172 /* If anything failed, m_pCurDropTarget should be NULL now, which ought to be a save state. */
3175 *pdwEffect
= DROPEFFECT_NONE
;
3179 if (m_iDragOverItem
!= -1)
3181 SelectItem(m_iDragOverItem
, SVSI_SELECT
);
3184 /* Notify the item just entered via DragEnter. */
3185 return m_pCurDropTarget
->DragEnter(m_pCurDataObject
, grfKeyState
, pt
, pdwEffect
);
3188 HRESULT WINAPI
CDefView::DragEnter(IDataObject
*pDataObject
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
3190 /* Get a hold on the data object for later calls to DragEnter on the sub-folders */
3191 m_pCurDataObject
= pDataObject
;
3193 HRESULT hr
= drag_notify_subitem(grfKeyState
, pt
, pdwEffect
);
3196 POINT ptClient
= {pt
.x
, pt
.y
};
3197 ScreenToClient(&ptClient
);
3198 ImageList_DragEnter(m_hWnd
, ptClient
.x
, ptClient
.y
);
3204 HRESULT WINAPI
CDefView::DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
3206 POINT ptClient
= {pt
.x
, pt
.y
};
3207 ScreenToClient(&ptClient
);
3208 ImageList_DragMove(ptClient
.x
, ptClient
.y
);
3209 return drag_notify_subitem(grfKeyState
, pt
, pdwEffect
);
3212 HRESULT WINAPI
CDefView::DragLeave()
3214 ImageList_DragLeave(m_hWnd
);
3216 if (m_pCurDropTarget
)
3218 m_pCurDropTarget
->DragLeave();
3219 m_pCurDropTarget
.Release();
3222 if (m_pCurDataObject
!= NULL
)
3224 m_pCurDataObject
.Release();
3227 m_iDragOverItem
= 0;
3232 HRESULT WINAPI
CDefView::Drop(IDataObject
* pDataObject
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
3234 ImageList_DragLeave(m_hWnd
);
3235 ImageList_EndDrag();
3237 if ((IsDropOnSource(NULL
) == S_OK
) &&
3238 (*pdwEffect
& DROPEFFECT_MOVE
) &&
3239 (m_grfKeyState
& MK_LBUTTON
))
3241 if (m_pCurDropTarget
)
3243 m_pCurDropTarget
->DragLeave();
3244 m_pCurDropTarget
.Release();
3247 /* Restore the selection */
3248 m_ListView
.SetItemState(-1, 0, LVIS_SELECTED
);
3249 for (UINT i
= 0 ; i
< m_cidl
; i
++)
3250 SelectItem(m_apidl
[i
], SVSI_SELECT
);
3252 /* Reposition the items */
3254 while ((lvIndex
= m_ListView
.GetNextItem(lvIndex
, LVNI_SELECTED
)) > -1)
3257 if (m_ListView
.GetItemPosition(lvIndex
, &ptItem
))
3259 ptItem
.x
+= pt
.x
- m_ptFirstMousePos
.x
;
3260 ptItem
.y
+= pt
.y
- m_ptFirstMousePos
.y
;
3261 m_ListView
.SetItemPosition(lvIndex
, &ptItem
);
3265 else if (m_pCurDropTarget
)
3267 m_pCurDropTarget
->Drop(pDataObject
, grfKeyState
, pt
, pdwEffect
);
3268 m_pCurDropTarget
.Release();
3271 m_pCurDataObject
.Release();
3272 m_iDragOverItem
= 0;
3276 /**********************************************************
3277 * ISVDropSource implementation
3280 HRESULT WINAPI
CDefView::QueryContinueDrag(BOOL fEscapePressed
, DWORD grfKeyState
)
3282 TRACE("(%p)\n", this);
3285 return DRAGDROP_S_CANCEL
;
3286 else if (!(grfKeyState
& MK_LBUTTON
) && !(grfKeyState
& MK_RBUTTON
))
3287 return DRAGDROP_S_DROP
;
3292 HRESULT WINAPI
CDefView::GiveFeedback(DWORD dwEffect
)
3294 TRACE("(%p)\n", this);
3296 return DRAGDROP_S_USEDEFAULTCURSORS
;
3299 /**********************************************************
3300 * ISVViewObject implementation
3303 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
)
3305 FIXME("Stub: this=%p\n", this);
3310 HRESULT WINAPI
CDefView::GetColorSet(DWORD dwDrawAspect
, LONG lindex
, void *pvAspect
, DVTARGETDEVICE
*ptd
, HDC hicTargetDevice
, LOGPALETTE
**ppColorSet
)
3312 FIXME("Stub: this=%p\n", this);
3317 HRESULT WINAPI
CDefView::Freeze(DWORD dwDrawAspect
, LONG lindex
, void *pvAspect
, DWORD
*pdwFreeze
)
3319 FIXME("Stub: this=%p\n", this);
3324 HRESULT WINAPI
CDefView::Unfreeze(DWORD dwFreeze
)
3326 FIXME("Stub: this=%p\n", this);
3331 HRESULT WINAPI
CDefView::SetAdvise(DWORD aspects
, DWORD advf
, IAdviseSink
*pAdvSink
)
3333 FIXME("partial stub: %p 0x%08x 0x%08x %p\n", this, aspects
, advf
, pAdvSink
);
3335 /* FIXME: we set the AdviseSink, but never use it to send any advice */
3336 m_pAdvSink
= pAdvSink
;
3337 m_dwAspects
= aspects
;
3343 HRESULT WINAPI
CDefView::GetAdvise(DWORD
*pAspects
, DWORD
*pAdvf
, IAdviseSink
**ppAdvSink
)
3345 TRACE("this=%p pAspects=%p pAdvf=%p ppAdvSink=%p\n", this, pAspects
, pAdvf
, ppAdvSink
);
3349 *ppAdvSink
= m_pAdvSink
;
3350 m_pAdvSink
.p
->AddRef();
3354 *pAspects
= m_dwAspects
;
3362 HRESULT STDMETHODCALLTYPE
CDefView::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
3364 if (IsEqualIID(guidService
, SID_IShellBrowser
))
3365 return m_pShellBrowser
->QueryInterface(riid
, ppvObject
);
3366 else if(IsEqualIID(guidService
, SID_IFolderView
))
3367 return QueryInterface(riid
, ppvObject
);
3369 return E_NOINTERFACE
;
3372 HRESULT
CDefView::_MergeToolbar()
3374 CComPtr
<IExplorerToolbar
> ptb
;
3377 hr
= IUnknown_QueryService(m_pShellBrowser
, IID_IExplorerToolbar
, IID_PPV_ARG(IExplorerToolbar
, &ptb
));
3381 m_Category
= CGID_DefViewFrame
;
3383 hr
= ptb
->SetCommandTarget(static_cast<IOleCommandTarget
*>(this), &m_Category
, 0);
3391 hr
= ptb
->AddButtons(&m_Category
, buttonsCount
, buttons
);
3399 // The default processing of IShellFolderView callbacks
3400 HRESULT
CDefView::DefMessageSFVCB(UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
3402 // TODO: SFVM_GET_CUSTOMVIEWINFO, SFVM_WINDOWCREATED
3403 TRACE("CDefView::DefMessageSFVCB uMsg=%u\n", uMsg
);
3407 HRESULT
CDefView::_DoFolderViewCB(UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
3409 HRESULT hr
= E_NOTIMPL
;
3411 if (m_pShellFolderViewCB
)
3413 hr
= m_pShellFolderViewCB
->MessageSFVCB(uMsg
, wParam
, lParam
);
3416 if (hr
== E_NOTIMPL
)
3418 hr
= DefMessageSFVCB(uMsg
, wParam
, lParam
);
3424 HRESULT
CDefView_CreateInstance(IShellFolder
*pFolder
, REFIID riid
, LPVOID
* ppvOut
)
3426 return ShellObjectCreatorInit
<CDefView
>(pFolder
, riid
, ppvOut
);
3429 HRESULT WINAPI
SHCreateShellFolderViewEx(
3430 LPCSFV psvcbi
, /* [in] shelltemplate struct */
3431 IShellView
**ppsv
) /* [out] IShellView pointer */
3433 CComPtr
<IShellView
> psv
;
3436 TRACE("sf=%p pidl=%p cb=%p mode=0x%08x parm=%p\n",
3437 psvcbi
->pshf
, psvcbi
->pidl
, psvcbi
->pfnCallback
,
3438 psvcbi
->fvm
, psvcbi
->psvOuter
);
3441 hRes
= CDefView_CreateInstance(psvcbi
->pshf
, IID_PPV_ARG(IShellView
, &psv
));
3442 if (FAILED_UNEXPECTEDLY(hRes
))
3445 *ppsv
= psv
.Detach();
3449 HRESULT WINAPI
SHCreateShellFolderView(const SFV_CREATE
*pcsfv
,
3452 CComPtr
<IShellView
> psv
;
3456 if (!pcsfv
|| pcsfv
->cbSize
!= sizeof(*pcsfv
))
3457 return E_INVALIDARG
;
3459 TRACE("sf=%p outer=%p callback=%p\n",
3460 pcsfv
->pshf
, pcsfv
->psvOuter
, pcsfv
->psfvcb
);
3462 hRes
= CDefView_CreateInstance(pcsfv
->pshf
, IID_PPV_ARG(IShellView
, &psv
));
3468 CComPtr
<IShellFolderView
> sfv
;
3469 if (SUCCEEDED(psv
->QueryInterface(IID_PPV_ARG(IShellFolderView
, &sfv
))))
3471 sfv
->SetCallback(pcsfv
->psfvcb
, NULL
);
3475 *ppsv
= psv
.Detach();