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 int 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 int 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 return m_ListView
.InsertItem(&lvItem
);
811 /**********************************************************
814 BOOLEAN
CDefView::LV_DeleteItem(PCUITEMID_CHILD pidl
)
818 TRACE("(%p)(pidl=%p)\n", this, pidl
);
820 nIndex
= LV_FindItemByPidl(pidl
);
822 return (-1 == m_ListView
.DeleteItem(nIndex
)) ? FALSE
: TRUE
;
825 /**********************************************************
828 BOOLEAN
CDefView::LV_RenameItem(PCUITEMID_CHILD pidlOld
, PCUITEMID_CHILD pidlNew
)
833 TRACE("(%p)(pidlold=%p pidlnew=%p)\n", this, pidlOld
, pidlNew
);
835 nItem
= LV_FindItemByPidl(pidlOld
);
839 lvItem
.mask
= LVIF_PARAM
; /* only the pidl */
840 lvItem
.iItem
= nItem
;
842 m_ListView
.GetItem(&lvItem
);
844 SHFree(reinterpret_cast<LPVOID
>(lvItem
.lParam
));
845 lvItem
.mask
= LVIF_PARAM
|LVIF_IMAGE
;
846 lvItem
.iItem
= nItem
;
848 lvItem
.lParam
= reinterpret_cast<LPARAM
>(ILClone(pidlNew
)); /* set the item's data */
849 lvItem
.iImage
= SHMapPIDLToSystemImageListIndex(m_pSFParent
, pidlNew
, 0);
850 m_ListView
.SetItem(&lvItem
);
851 m_ListView
.Update(nItem
);
852 return TRUE
; /* FIXME: better handling */
858 /**********************************************************
861 BOOLEAN
CDefView::LV_ProdItem(PCUITEMID_CHILD pidl
)
866 TRACE("(%p)(pidl=%p)\n", this, pidl
);
868 nItem
= LV_FindItemByPidl(pidl
);
872 lvItem
.mask
= LVIF_IMAGE
;
873 lvItem
.iItem
= nItem
;
875 lvItem
.iImage
= SHMapPIDLToSystemImageListIndex(m_pSFParent
, pidl
, 0);
876 m_ListView
.SetItem(&lvItem
);
877 m_ListView
.Update(nItem
);
884 /**********************************************************
885 * ShellView_FillList()
887 * - gets the objectlist from the shellfolder
889 * - fills the list into the view
891 INT CALLBACK
CDefView::fill_list(LPVOID ptr
, LPVOID arg
)
893 PITEMID_CHILD pidl
= static_cast<PITEMID_CHILD
>(ptr
);
894 CDefView
*pThis
= static_cast<CDefView
*>(arg
);
896 /* in a commdlg This works as a filemask*/
897 if (pThis
->IncludeObject(pidl
) == S_OK
)
898 pThis
->LV_AddItem(pidl
);
904 HRESULT
CDefView::FillList()
906 CComPtr
<IEnumIDList
> pEnumIDList
;
912 DWORD dFlags
= SHCONTF_NONFOLDERS
| SHCONTF_FOLDERS
;
916 /* determine if there is a setting to show all the hidden files/folders */
917 if (RegOpenKeyExW(HKEY_CURRENT_USER
, L
"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced", 0, KEY_QUERY_VALUE
, &hKey
) == ERROR_SUCCESS
)
919 DWORD dataLength
, flagVal
;
921 dataLength
= sizeof(flagVal
);
922 if (RegQueryValueExW(hKey
, L
"Hidden", NULL
, NULL
, (LPBYTE
)&flagVal
, &dataLength
) == ERROR_SUCCESS
)
924 /* if the value is 1, then show all hidden files/folders */
927 dFlags
|= SHCONTF_INCLUDEHIDDEN
;
928 m_ListView
.SendMessageW(LVM_SETCALLBACKMASK
, LVIS_CUT
, 0);
936 /* get the itemlist from the shfolder */
937 hRes
= m_pSFParent
->EnumObjects(m_hWnd
, dFlags
, &pEnumIDList
);
945 /* create a pointer array */
946 hdpa
= DPA_Create(16);
949 return(E_OUTOFMEMORY
);
952 /* copy the items into the array*/
953 while((S_OK
== pEnumIDList
->Next(1, &pidl
, &dwFetched
)) && dwFetched
)
955 if (DPA_InsertPtr(hdpa
, 0x7fff, pidl
) == -1)
961 /*turn the listview's redrawing off*/
962 m_ListView
.SetRedraw(FALSE
);
964 DPA_DestroyCallback( hdpa
, fill_list
, this);
969 m_pSF2Parent
->GetDefaultColumn(NULL
, (ULONG
*)&m_sortInfo
.nHeaderID
, NULL
);
973 FIXME("no m_pSF2Parent\n");
975 m_sortInfo
.bIsAscending
= TRUE
;
978 if (m_viewinfo_data
.hbmBack
)
980 ::DeleteObject(m_viewinfo_data
.hbmBack
);
981 m_viewinfo_data
.hbmBack
= NULL
;
984 // load custom background image and custom text color
985 m_viewinfo_data
.cbSize
= sizeof(m_viewinfo_data
);
986 _DoFolderViewCB(SFVM_GET_CUSTOMVIEWINFO
, 0, (LPARAM
)&m_viewinfo_data
);
988 /*turn the listview's redrawing back on and force it to draw*/
989 m_ListView
.SetRedraw(TRUE
);
993 if (!(m_FolderSettings
.fFlags
& FWF_DESKTOP
))
996 m_ListView
.InvalidateRect(NULL
, TRUE
);
999 _DoFolderViewCB(SFVM_LISTREFRESHED
, NULL
, NULL
);
1004 LRESULT
CDefView::OnShowWindow(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1006 m_ListView
.UpdateWindow();
1011 LRESULT
CDefView::OnGetDlgCode(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1013 return m_ListView
.SendMessageW(uMsg
, 0, 0);
1016 LRESULT
CDefView::OnDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1023 DestroyMenu(m_hMenu
);
1026 RevokeDragDrop(m_hWnd
);
1027 SHChangeNotifyDeregister(m_hNotify
);
1029 SHFree(m_pidlParent
);
1030 m_pidlParent
= NULL
;
1036 LRESULT
CDefView::OnEraseBackground(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1038 /* redirect to parent */
1039 if (m_FolderSettings
.fFlags
& (FWF_DESKTOP
| FWF_TRANSPARENT
))
1040 return SendMessageW(GetParent(), WM_ERASEBKGND
, wParam
, lParam
);
1047 DrawTileBitmap(HDC hDC
, LPCRECT prc
, HBITMAP hbm
, INT nWidth
, INT nHeight
, INT dx
, INT dy
)
1049 INT x0
= prc
->left
, y0
= prc
->top
, x1
= prc
->right
, y1
= prc
->bottom
;
1053 HDC hMemDC
= CreateCompatibleDC(hDC
);
1054 HGDIOBJ hbmOld
= SelectObject(hMemDC
, hbm
);
1056 for (INT y
= y0
; y
< y1
; y
+= nHeight
)
1058 for (INT x
= x0
; x
< x1
; x
+= nWidth
)
1060 BitBlt(hDC
, x
, y
, nWidth
, nHeight
, hMemDC
, 0, 0, SRCCOPY
);
1064 SelectObject(hMemDC
, hbmOld
);
1068 LRESULT
CDefView::OnPrintClient(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1070 HDC hDC
= (HDC
)wParam
;
1073 ::GetClientRect(m_ListView
, &rc
);
1075 if (m_viewinfo_data
.hbmBack
)
1078 if (::GetObject(m_viewinfo_data
.hbmBack
, sizeof(BITMAP
), &bm
))
1080 INT dx
= -(::GetScrollPos(m_ListView
, SB_HORZ
) % bm
.bmWidth
);
1081 INT dy
= -(::GetScrollPos(m_ListView
, SB_VERT
) % bm
.bmHeight
);
1082 DrawTileBitmap(hDC
, &rc
, m_viewinfo_data
.hbmBack
, bm
.bmWidth
, bm
.bmHeight
, dx
, dy
);
1087 FillRect(hDC
, &rc
, GetSysColorBrush(COLOR_WINDOW
));
1095 LRESULT
CDefView::OnSysColorChange(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1097 /* Update desktop labels color */
1100 /* Forward WM_SYSCOLORCHANGE to common controls */
1101 return m_ListView
.SendMessageW(uMsg
, 0, 0);
1104 LRESULT
CDefView::OnGetShellBrowser(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1106 return reinterpret_cast<LRESULT
>(m_pShellBrowser
.p
);
1109 LRESULT
CDefView::OnNCCreate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1116 LRESULT
CDefView::OnNCDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1123 /**********************************************************
1124 * ShellView_OnCreate()
1126 LRESULT
CDefView::OnCreate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1128 CComPtr
<IDropTarget
> pdt
;
1129 SHChangeNotifyEntry ntreg
;
1130 CComPtr
<IPersistFolder2
> ppf2
;
1132 TRACE("%p\n", this);
1134 if (SUCCEEDED(QueryInterface(IID_PPV_ARG(IDropTarget
, &pdt
))))
1136 if (FAILED(RegisterDragDrop(m_hWnd
, pdt
)))
1137 ERR("Registering Drag Drop Failed");
1140 /* register for receiving notifications */
1141 m_pSFParent
->QueryInterface(IID_PPV_ARG(IPersistFolder2
, &ppf2
));
1144 ppf2
->GetCurFolder(&m_pidlParent
);
1145 ntreg
.fRecursive
= TRUE
;
1146 ntreg
.pidl
= m_pidlParent
;
1147 m_hNotify
= SHChangeNotifyRegister(m_hWnd
, SHCNRF_InterruptLevel
| SHCNRF_ShellLevel
, SHCNE_ALLEVENTS
, SHV_CHANGE_NOTIFY
, 1, &ntreg
);
1158 /* _DoFolderViewCB(SFVM_GETNOTIFY, ?? ??) */
1160 m_hAccel
= LoadAcceleratorsW(shell32_hInstance
, MAKEINTRESOURCEW(IDA_SHELLVIEW
));
1167 /**********************************************************
1168 * #### Handling of the menus ####
1171 extern "C" DWORD WINAPI
SHMenuIndexFromID(HMENU hMenu
, UINT uID
);
1173 HMENU
GetSubmenuByID(HMENU hmenu
, UINT id
)
1175 MENUITEMINFOW mii
= {sizeof(mii
), MIIM_SUBMENU
};
1176 if (::GetMenuItemInfoW(hmenu
, id
, FALSE
, &mii
))
1177 return mii
.hSubMenu
;
1182 /* ReallyGetMenuItemID returns the id of an item even if it opens a submenu,
1183 GetMenuItemID returns -1 if the specified item opens a submenu */
1184 UINT
ReallyGetMenuItemID(HMENU hmenu
, int i
)
1186 MENUITEMINFOW mii
= {sizeof(mii
), MIIM_ID
};
1187 if (::GetMenuItemInfoW(hmenu
, i
, TRUE
, &mii
))
1193 HRESULT
CDefView::FillFileMenu()
1195 HMENU hFileMenu
= GetSubmenuByID(m_hMenu
, FCIDM_MENU_FILE
);
1199 /* Cleanup the items added previously */
1200 for (int i
= GetMenuItemCount(hFileMenu
) - 1; i
>= 0; i
--)
1202 UINT id
= GetMenuItemID(hFileMenu
, i
);
1203 if (id
< FCIDM_BROWSERFIRST
|| id
> FCIDM_BROWSERLAST
)
1204 DeleteMenu(hFileMenu
, i
, MF_BYPOSITION
);
1207 /* Store the context menu in m_pCM and keep it in order to invoke the selected command later on */
1208 HRESULT hr
= GetItemObject(SVGIO_SELECTION
, IID_PPV_ARG(IContextMenu
, &m_pCM
));
1209 if (FAILED_UNEXPECTEDLY(hr
))
1212 HMENU hmenu
= CreatePopupMenu();
1214 hr
= m_pCM
->QueryContextMenu(hmenu
, 0, FCIDM_SHVIEWFIRST
, FCIDM_SHVIEWLAST
, 0);
1215 if (FAILED_UNEXPECTEDLY(hr
))
1218 // TODO: filter or something
1220 Shell_MergeMenus(hFileMenu
, hmenu
, 0, 0, 0xFFFF, MM_ADDSEPARATOR
| MM_SUBMENUSHAVEIDS
);
1222 ::DestroyMenu(hmenu
);
1227 HRESULT
CDefView::FillEditMenu()
1229 HMENU hEditMenu
= GetSubmenuByID(m_hMenu
, FCIDM_MENU_EDIT
);
1233 HMENU hmenuContents
= ::LoadMenuW(shell32_hInstance
, L
"MENU_003");
1237 Shell_MergeMenus(hEditMenu
, hmenuContents
, 0, 0, 0xFFFF, 0);
1239 ::DestroyMenu(hmenuContents
);
1244 HRESULT
CDefView::FillViewMenu()
1246 HMENU hViewMenu
= GetSubmenuByID(m_hMenu
, FCIDM_MENU_VIEW
);
1250 m_hMenuViewModes
= ::LoadMenuW(shell32_hInstance
, L
"MENU_001");
1251 if (!m_hMenuViewModes
)
1254 UINT i
= SHMenuIndexFromID(hViewMenu
, FCIDM_MENU_VIEW_SEP_OPTIONS
);
1255 Shell_MergeMenus(hViewMenu
, m_hMenuViewModes
, i
, 0, 0xFFFF, MM_ADDSEPARATOR
| MM_DONTREMOVESEPS
| MM_SUBMENUSHAVEIDS
);
1260 HRESULT
CDefView::FillArrangeAsMenu(HMENU hmenuArrange
)
1262 /* We only need to fill this once */
1263 if (GetMenuItemID(hmenuArrange
, 0) == FCIDM_SHVIEW_AUTOARRANGE
)
1265 Shell_MergeMenus(hmenuArrange
, m_hMenuArrangeModes
, 0, 0, 0xFFFF,0);
1268 /* Also check the menu item according to which we sort */
1269 CheckMenuRadioItem(hmenuArrange
,
1272 m_sortInfo
.nHeaderID
+ 0x30,
1275 if (m_FolderSettings
.ViewMode
== FVM_DETAILS
|| m_FolderSettings
.ViewMode
== FVM_LIST
)
1277 EnableMenuItem(hmenuArrange
, FCIDM_SHVIEW_AUTOARRANGE
, MF_BYCOMMAND
| MF_GRAYED
);
1281 EnableMenuItem(hmenuArrange
, FCIDM_SHVIEW_AUTOARRANGE
, MF_BYCOMMAND
);
1283 if (GetAutoArrange() == S_OK
)
1284 CheckMenuItem(hmenuArrange
, FCIDM_SHVIEW_AUTOARRANGE
, MF_CHECKED
);
1291 HRESULT
CDefView::CheckViewMode(HMENU hmenuView
)
1293 if (m_FolderSettings
.ViewMode
>= FVM_FIRST
&& m_FolderSettings
.ViewMode
<= FVM_LAST
)
1295 UINT iItemFirst
= FCIDM_SHVIEW_BIGICON
;
1296 UINT iItemLast
= iItemFirst
+ FVM_LAST
- FVM_FIRST
;
1297 UINT iItem
= iItemFirst
+ m_FolderSettings
.ViewMode
- FVM_FIRST
;
1298 CheckMenuRadioItem(hmenuView
, iItemFirst
, iItemLast
, iItem
, MF_BYCOMMAND
);
1304 /**********************************************************
1305 * ShellView_GetSelections()
1307 * - fills the m_apidl list with the selected objects
1310 * number of selected items
1312 UINT
CDefView::GetSelections()
1316 m_cidl
= m_ListView
.GetSelectedCount();
1317 m_apidl
= static_cast<PCUITEMID_CHILD
*>(SHAlloc(m_cidl
* sizeof(PCUITEMID_CHILD
)));
1324 TRACE("-- Items selected =%u\n", m_cidl
);
1328 while ((lvIndex
= m_ListView
.GetNextItem(lvIndex
, LVNI_SELECTED
)) > -1)
1330 m_apidl
[i
] = _PidlByItem(lvIndex
);
1334 TRACE("-- selected Item found\n");
1340 HRESULT
CDefView::InvokeContextMenuCommand(UINT uCommand
)
1342 CMINVOKECOMMANDINFO cmi
;
1344 ZeroMemory(&cmi
, sizeof(cmi
));
1345 cmi
.cbSize
= sizeof(cmi
);
1346 cmi
.lpVerb
= MAKEINTRESOURCEA(uCommand
);
1349 if (GetKeyState(VK_SHIFT
) & 0x8000)
1350 cmi
.fMask
|= CMIC_MASK_SHIFT_DOWN
;
1352 if (GetKeyState(VK_CONTROL
) & 0x8000)
1353 cmi
.fMask
|= CMIC_MASK_CONTROL_DOWN
;
1355 HRESULT hr
= m_pCM
->InvokeCommand(&cmi
);
1356 if (FAILED_UNEXPECTEDLY(hr
))
1362 /**********************************************************
1363 * ShellView_OpenSelectedItems()
1365 HRESULT
CDefView::OpenSelectedItems()
1371 m_cidl
= m_ListView
.GetSelectedCount();
1375 hResult
= OnDefaultCommand();
1376 if (hResult
== S_OK
)
1379 hMenu
= CreatePopupMenu();
1383 hResult
= GetItemObject(SVGIO_SELECTION
, IID_PPV_ARG(IContextMenu
, &m_pCM
));
1384 if (FAILED_UNEXPECTEDLY(hResult
))
1387 hResult
= m_pCM
->QueryContextMenu(hMenu
, 0, FCIDM_SHVIEWFIRST
, FCIDM_SHVIEWLAST
, CMF_DEFAULTONLY
);
1388 if (FAILED_UNEXPECTEDLY(hResult
))
1391 uCommand
= GetMenuDefaultItem(hMenu
, FALSE
, 0);
1392 if (uCommand
== (UINT
)-1)
1398 InvokeContextMenuCommand(uCommand
);
1407 IUnknown_SetSite(m_pCM
, NULL
);
1414 /**********************************************************
1415 * ShellView_DoContextMenu()
1417 LRESULT
CDefView::OnContextMenu(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1423 TRACE("(%p)\n", this);
1425 m_hContextMenu
= CreatePopupMenu();
1426 if (!m_hContextMenu
)
1429 m_cidl
= m_ListView
.GetSelectedCount();
1431 hResult
= GetItemObject( m_cidl
? SVGIO_SELECTION
: SVGIO_BACKGROUND
, IID_PPV_ARG(IContextMenu
, &m_pCM
));
1432 if (FAILED_UNEXPECTEDLY(hResult
))
1435 /* Use 1 as the first id as we want 0 the mean that the user canceled the menu */
1436 hResult
= m_pCM
->QueryContextMenu(m_hContextMenu
, 0, CONTEXT_MENU_BASE_ID
, FCIDM_SHVIEWLAST
, CMF_NORMAL
);
1437 if (FAILED_UNEXPECTEDLY(hResult
))
1440 /* There is no position requested, so try to find one */
1443 HWND hFocus
= ::GetFocus();
1447 if (hFocus
== m_ListView
.m_hWnd
|| m_ListView
.IsChild(hFocus
))
1449 /* Is there an item focused and selected? */
1450 lvIndex
= m_ListView
.GetNextItem(-1, LVIS_SELECTED
|LVIS_FOCUSED
);
1451 /* If not, find the first selected item */
1453 lvIndex
= m_ListView
.GetNextItem(-1, LVIS_SELECTED
);
1456 /* We got something */
1459 /* Let's find the center of the icon */
1460 RECT rc
= { LVIR_ICON
};
1461 m_ListView
.SendMessage(LVM_GETITEMRECT
, lvIndex
, (LPARAM
)&rc
);
1462 pt
.x
= (rc
.right
+ rc
.left
) / 2;
1463 pt
.y
= (rc
.bottom
+ rc
.top
) / 2;
1467 /* We have to drop it somewhere.. */
1471 m_ListView
.ClientToScreen(&pt
);
1477 x
= GET_X_LPARAM(lParam
);
1478 y
= GET_Y_LPARAM(lParam
);
1481 uCommand
= TrackPopupMenu(m_hContextMenu
,
1482 TPM_LEFTALIGN
| TPM_RETURNCMD
| TPM_LEFTBUTTON
| TPM_RIGHTBUTTON
,
1483 x
, y
, 0, m_hWnd
, NULL
);
1487 if (uCommand
== FCIDM_SHVIEW_OPEN
&& OnDefaultCommand() == S_OK
)
1490 InvokeContextMenuCommand(uCommand
- CONTEXT_MENU_BASE_ID
);
1495 IUnknown_SetSite(m_pCM
, NULL
);
1501 DestroyMenu(m_hContextMenu
);
1502 m_hContextMenu
= NULL
;
1508 LRESULT
CDefView::OnExplorerCommand(UINT uCommand
, BOOL bUseSelection
)
1513 hMenu
= CreatePopupMenu();
1517 hResult
= GetItemObject( bUseSelection
? SVGIO_SELECTION
: SVGIO_BACKGROUND
, IID_PPV_ARG(IContextMenu
, &m_pCM
));
1518 if (FAILED_UNEXPECTEDLY( hResult
))
1521 hResult
= m_pCM
->QueryContextMenu(hMenu
, 0, FCIDM_SHVIEWFIRST
, FCIDM_SHVIEWLAST
, CMF_NORMAL
);
1522 if (FAILED_UNEXPECTEDLY( hResult
))
1525 InvokeContextMenuCommand(uCommand
);
1530 IUnknown_SetSite(m_pCM
, NULL
);
1540 /**********************************************************
1541 * ##### message handling #####
1544 /**********************************************************
1545 * ShellView_OnSize()
1547 LRESULT
CDefView::OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1549 WORD wWidth
, wHeight
;
1551 wWidth
= LOWORD(lParam
);
1552 wHeight
= HIWORD(lParam
);
1554 TRACE("%p width=%u height=%u\n", this, wWidth
, wHeight
);
1556 /* Resize the ListView to fit our window */
1559 ::MoveWindow(m_ListView
, 0, 0, wWidth
, wHeight
, TRUE
);
1562 _DoFolderViewCB(SFVM_SIZE
, 0, 0);
1567 /**********************************************************
1568 * ShellView_OnDeactivate()
1573 void CDefView::OnDeactivate()
1575 TRACE("%p\n", this);
1577 if (m_uState
!= SVUIA_DEACTIVATE
)
1579 // TODO: cleanup menu after deactivation
1581 m_uState
= SVUIA_DEACTIVATE
;
1585 void CDefView::DoActivate(UINT uState
)
1587 TRACE("%p uState=%x\n", this, uState
);
1589 /*don't do anything if the state isn't really changing */
1590 if (m_uState
== uState
)
1595 if (uState
== SVUIA_DEACTIVATE
)
1601 if(m_hMenu
&& !m_bmenuBarInitialized
)
1605 m_pShellBrowser
->SetMenuSB(m_hMenu
, 0, m_hWnd
);
1606 m_bmenuBarInitialized
= TRUE
;
1609 if (SVUIA_ACTIVATE_FOCUS
== uState
)
1611 m_ListView
.SetFocus();
1619 /**********************************************************
1620 * ShellView_OnActivate()
1622 LRESULT
CDefView::OnActivate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1624 DoActivate(SVUIA_ACTIVATE_FOCUS
);
1628 /**********************************************************
1629 * ShellView_OnSetFocus()
1632 LRESULT
CDefView::OnSetFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1634 TRACE("%p\n", this);
1636 /* Tell the browser one of our windows has received the focus. This
1637 should always be done before merging menus (OnActivate merges the
1638 menus) if one of our windows has the focus.*/
1640 m_pShellBrowser
->OnViewWindowActive(this);
1641 DoActivate(SVUIA_ACTIVATE_FOCUS
);
1643 /* Set the focus to the listview */
1644 m_ListView
.SetFocus();
1646 /* Notify the ICommDlgBrowser interface */
1647 OnStateChange(CDBOSC_SETFOCUS
);
1652 /**********************************************************
1653 * ShellView_OnKillFocus()
1655 LRESULT
CDefView::OnKillFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1657 TRACE("(%p) stub\n", this);
1659 DoActivate(SVUIA_ACTIVATE_NOFOCUS
);
1660 /* Notify the ICommDlgBrowser */
1661 OnStateChange(CDBOSC_KILLFOCUS
);
1666 /**********************************************************
1667 * ShellView_OnCommand()
1670 * the CmdID's are the ones from the context menu
1672 LRESULT
CDefView::OnCommand(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1679 dwCmdID
= GET_WM_COMMAND_ID(wParam
, lParam
);
1680 dwCmd
= GET_WM_COMMAND_CMD(wParam
, lParam
);
1681 hwndCmd
= GET_WM_COMMAND_HWND(wParam
, lParam
);
1683 TRACE("(%p)->(0x%08x 0x%08x %p) stub\n", this, dwCmdID
, dwCmd
, hwndCmd
);
1687 case FCIDM_SHVIEW_SMALLICON
:
1688 m_FolderSettings
.ViewMode
= FVM_SMALLICON
;
1689 m_ListView
.ModifyStyle(LVS_TYPEMASK
, LVS_SMALLICON
);
1693 case FCIDM_SHVIEW_BIGICON
:
1694 m_FolderSettings
.ViewMode
= FVM_ICON
;
1695 m_ListView
.ModifyStyle(LVS_TYPEMASK
, LVS_ICON
);
1699 case FCIDM_SHVIEW_LISTVIEW
:
1700 m_FolderSettings
.ViewMode
= FVM_LIST
;
1701 m_ListView
.ModifyStyle(LVS_TYPEMASK
, LVS_LIST
);
1705 case FCIDM_SHVIEW_REPORTVIEW
:
1706 m_FolderSettings
.ViewMode
= FVM_DETAILS
;
1707 m_ListView
.ModifyStyle(LVS_TYPEMASK
, LVS_REPORT
);
1711 /* the menu-ID's for sorting are 0x30... see shrec.rc */
1716 m_sortInfo
.nHeaderID
= dwCmdID
- 0x30;
1717 m_sortInfo
.bIsAscending
= TRUE
;
1721 case FCIDM_SHVIEW_SNAPTOGRID
:
1724 case FCIDM_SHVIEW_AUTOARRANGE
:
1725 if (GetAutoArrange() == S_OK
)
1726 m_ListView
.ModifyStyle(LVS_AUTOARRANGE
, 0);
1730 case FCIDM_SHVIEW_SELECTALL
:
1731 m_ListView
.SetItemState(-1, LVIS_SELECTED
, LVIS_SELECTED
);
1734 case FCIDM_SHVIEW_INVERTSELECTION
:
1735 nCount
= m_ListView
.GetItemCount();
1736 for (int i
=0; i
< nCount
; i
++)
1737 m_ListView
.SetItemState(i
, m_ListView
.GetItemState(i
, LVIS_SELECTED
) ? 0 : LVIS_SELECTED
, LVIS_SELECTED
);
1740 case FCIDM_SHVIEW_REFRESH
:
1744 case FCIDM_SHVIEW_DELETE
:
1745 case FCIDM_SHVIEW_CUT
:
1746 case FCIDM_SHVIEW_COPY
:
1747 case FCIDM_SHVIEW_RENAME
:
1748 case FCIDM_SHVIEW_PROPERTIES
:
1749 return OnExplorerCommand(dwCmdID
, TRUE
);
1751 case FCIDM_SHVIEW_INSERT
:
1752 case FCIDM_SHVIEW_UNDO
:
1753 case FCIDM_SHVIEW_INSERTLINK
:
1754 case FCIDM_SHVIEW_NEWFOLDER
:
1755 return OnExplorerCommand(dwCmdID
, FALSE
);
1757 /* WM_COMMAND messages from the file menu are routed to the CDefView so as to let m_pCM handle the command */
1758 if (m_pCM
&& dwCmd
== 0)
1760 InvokeContextMenuCommand(dwCmdID
);
1767 /**********************************************************
1768 * ShellView_OnNotify()
1771 LRESULT
CDefView::OnNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1775 LPNMLISTVIEW lpnmlv
;
1776 NMLVDISPINFOW
*lpdi
;
1777 PCUITEMID_CHILD pidl
;
1781 lpnmh
= (LPNMHDR
)lParam
;
1782 lpnmlv
= (LPNMLISTVIEW
)lpnmh
;
1783 lpdi
= (NMLVDISPINFOW
*)lpnmh
;
1785 TRACE("%p CtlID=%u lpnmh->code=%x\n", this, CtlID
, lpnmh
->code
);
1787 switch (lpnmh
->code
)
1790 TRACE("-- NM_SETFOCUS %p\n", this);
1791 OnSetFocus(0, 0, 0, unused
);
1795 TRACE("-- NM_KILLFOCUS %p\n", this);
1797 /* Notify the ICommDlgBrowser interface */
1798 OnStateChange(CDBOSC_KILLFOCUS
);
1802 TRACE("-- NM_CUSTOMDRAW %p\n", this);
1803 return CDRF_DODEFAULT
;
1805 case NM_RELEASEDCAPTURE
:
1806 TRACE("-- NM_RELEASEDCAPTURE %p\n", this);
1810 TRACE("-- NM_CLICK %p\n", this);
1814 TRACE("-- NM_RCLICK %p\n", this);
1818 TRACE("-- NM_DBLCLK %p\n", this);
1819 OpenSelectedItems();
1823 TRACE("-- NM_RETURN %p\n", this);
1824 OpenSelectedItems();
1828 TRACE("-- HDN_ENDTRACKW %p\n", this);
1829 /*nColumn1 = m_ListView.GetColumnWidth(0);
1830 nColumn2 = m_ListView.GetColumnWidth(1);*/
1833 case LVN_DELETEITEM
:
1834 TRACE("-- LVN_DELETEITEM %p\n", this);
1836 /*delete the pidl because we made a copy of it*/
1837 SHFree(reinterpret_cast<LPVOID
>(lpnmlv
->lParam
));
1841 case LVN_DELETEALLITEMS
:
1842 TRACE("-- LVN_DELETEALLITEMS %p\n", this);
1845 case LVN_INSERTITEM
:
1846 TRACE("-- LVN_INSERTITEM (STUB)%p\n", this);
1849 case LVN_ITEMACTIVATE
:
1850 TRACE("-- LVN_ITEMACTIVATE %p\n", this);
1851 OnStateChange(CDBOSC_SELCHANGE
); /* the browser will get the IDataObject now */
1854 case LVN_COLUMNCLICK
:
1855 m_sortInfo
.nHeaderID
= lpnmlv
->iSubItem
;
1856 if (m_sortInfo
.nLastHeaderID
== m_sortInfo
.nHeaderID
)
1857 m_sortInfo
.bIsAscending
= !m_sortInfo
.bIsAscending
;
1859 m_sortInfo
.bIsAscending
= TRUE
;
1863 case LVN_GETDISPINFOA
:
1864 case LVN_GETDISPINFOW
:
1865 TRACE("-- LVN_GETDISPINFO %p\n", this);
1866 pidl
= _PidlByItem(lpdi
->item
);
1868 if (lpdi
->item
.mask
& LVIF_TEXT
) /* text requested */
1873 if (FAILED_UNEXPECTEDLY(m_pSF2Parent
->GetDetailsOf(pidl
, lpdi
->item
.iSubItem
, &sd
)))
1876 if (lpnmh
->code
== LVN_GETDISPINFOA
)
1878 /* shouldn't happen */
1879 NMLVDISPINFOA
*lpdiA
= (NMLVDISPINFOA
*)lpnmh
;
1880 StrRetToStrNA( lpdiA
->item
.pszText
, lpdiA
->item
.cchTextMax
, &sd
.str
, NULL
);
1881 TRACE("-- text=%s\n", lpdiA
->item
.pszText
);
1883 else /* LVN_GETDISPINFOW */
1885 StrRetToStrNW( lpdi
->item
.pszText
, lpdi
->item
.cchTextMax
, &sd
.str
, NULL
);
1886 TRACE("-- text=%s\n", debugstr_w(lpdi
->item
.pszText
));
1891 FIXME("no m_pSF2Parent\n");
1894 if(lpdi
->item
.mask
& LVIF_IMAGE
) /* image requested */
1896 lpdi
->item
.iImage
= SHMapPIDLToSystemImageListIndex(m_pSFParent
, pidl
, 0);
1898 if(lpdi
->item
.mask
& LVIF_STATE
)
1900 ULONG attributes
= SFGAO_HIDDEN
;
1901 if (SUCCEEDED(m_pSFParent
->GetAttributesOf(1, &pidl
, &attributes
)))
1903 if (attributes
& SFGAO_HIDDEN
)
1905 lpdi
->item
.state
|= LVIS_CUT
;
1909 lpdi
->item
.mask
|= LVIF_DI_SETITEM
;
1912 case LVN_ITEMCHANGED
:
1913 TRACE("-- LVN_ITEMCHANGED %p\n", this);
1914 OnStateChange(CDBOSC_SELCHANGE
); /* the browser will get the IDataObject now */
1916 _DoFolderViewCB(SFVM_SELECTIONCHANGED
, NULL
/* FIXME */, NULL
/* FIXME */);
1920 case LVN_BEGINRDRAG
:
1921 TRACE("-- LVN_BEGINDRAG\n");
1923 if (GetSelections())
1925 CComPtr
<IDataObject
> pda
;
1926 DWORD dwAttributes
= SFGAO_CANCOPY
| SFGAO_CANLINK
;
1927 DWORD dwEffect
= DROPEFFECT_MOVE
;
1929 if (SUCCEEDED(m_pSFParent
->GetUIObjectOf(m_hWnd
, m_cidl
, m_apidl
, IID_NULL_PPV_ARG(IDataObject
, &pda
))))
1931 LPNMLISTVIEW params
= (LPNMLISTVIEW
)lParam
;
1933 if (SUCCEEDED(m_pSFParent
->GetAttributesOf(m_cidl
, m_apidl
, &dwAttributes
)))
1935 dwEffect
|= dwAttributes
& (SFGAO_CANCOPY
| SFGAO_CANLINK
);
1938 CComPtr
<IAsyncOperation
> piaso
;
1939 if (SUCCEEDED(pda
->QueryInterface(IID_PPV_ARG(IAsyncOperation
, &piaso
))))
1941 piaso
->SetAsyncMode(TRUE
);
1946 m_pSourceDataObject
= pda
;
1947 m_ptFirstMousePos
= params
->ptAction
;
1948 ClientToScreen(&m_ptFirstMousePos
);
1950 HIMAGELIST big_icons
, small_icons
;
1951 Shell_GetImageLists(&big_icons
, &small_icons
);
1952 PCUITEMID_CHILD pidl
= _PidlByItem(params
->iItem
);
1953 int iIcon
= SHMapPIDLToSystemImageListIndex(m_pSFParent
, pidl
, 0);
1955 m_ListView
.GetItemPosition(params
->iItem
, &ptItem
);
1957 ImageList_BeginDrag(big_icons
, iIcon
, params
->ptAction
.x
- ptItem
.x
, params
->ptAction
.y
- ptItem
.y
);
1959 DoDragDrop(pda
, this, dwEffect
, &dwEffect2
);
1961 m_pSourceDataObject
.Release();
1966 case LVN_BEGINLABELEDITW
:
1968 DWORD dwAttr
= SFGAO_CANRENAME
;
1969 pidl
= _PidlByItem(lpdi
->item
);
1971 TRACE("-- LVN_BEGINLABELEDITW %p\n", this);
1973 m_pSFParent
->GetAttributesOf(1, &pidl
, &dwAttr
);
1974 if (SFGAO_CANRENAME
& dwAttr
)
1982 case LVN_ENDLABELEDITW
:
1984 TRACE("-- LVN_ENDLABELEDITW %p\n", this);
1986 m_isEditing
= FALSE
;
1988 if (lpdi
->item
.pszText
)
1993 pidl
= _PidlByItem(lpdi
->item
);
1994 PITEMID_CHILD pidlNew
= NULL
;
1995 hr
= m_pSFParent
->SetNameOf(0, pidl
, lpdi
->item
.pszText
, SHGDN_INFOLDER
, &pidlNew
);
1997 if (SUCCEEDED(hr
) && pidlNew
)
1999 lvItem
.mask
= LVIF_PARAM
|LVIF_IMAGE
;
2000 lvItem
.iItem
= lpdi
->item
.iItem
;
2001 lvItem
.iSubItem
= 0;
2002 lvItem
.lParam
= reinterpret_cast<LPARAM
>(pidlNew
);
2003 lvItem
.iImage
= SHMapPIDLToSystemImageListIndex(m_pSFParent
, pidlNew
, 0);
2004 m_ListView
.SetItem(&lvItem
);
2005 m_ListView
.Update(lpdi
->item
.iItem
);
2014 TRACE("-- %p WM_COMMAND %x unhandled\n", this, lpnmh
->code
);
2022 * This is just a quick hack to make the desktop work correctly.
2023 * ITranslateShellChangeNotify's IsChildID is undocumented, but most likely the way that
2024 * a folder should know if it should update upon a change notification.
2025 * It is exported by merged folders at a minimum.
2027 static BOOL
ILIsParentOrSpecialParent(PCIDLIST_ABSOLUTE pidl1
, PCIDLIST_ABSOLUTE pidl2
)
2029 if (!pidl1
|| !pidl2
)
2031 if (ILIsParent(pidl1
, pidl2
, TRUE
))
2034 if (_ILIsDesktop(pidl1
))
2036 PIDLIST_ABSOLUTE deskpidl
;
2037 SHGetFolderLocation(NULL
, CSIDL_DESKTOPDIRECTORY
, NULL
, 0, &deskpidl
);
2038 if (ILIsParent(deskpidl
, pidl2
, TRUE
))
2044 SHGetFolderLocation(NULL
, CSIDL_COMMON_DESKTOPDIRECTORY
, NULL
, 0, &deskpidl
);
2045 if (ILIsParent(deskpidl
, pidl2
, TRUE
))
2055 /**********************************************************
2056 * ShellView_OnChange()
2058 LRESULT
CDefView::OnChangeNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
2060 PCIDLIST_ABSOLUTE
*Pidls
= reinterpret_cast<PCIDLIST_ABSOLUTE
*>(wParam
);
2061 BOOL bParent0
= ILIsParentOrSpecialParent(m_pidlParent
, Pidls
[0]);
2062 BOOL bParent1
= ILIsParentOrSpecialParent(m_pidlParent
, Pidls
[1]);
2064 TRACE("(%p)(%p,%p,0x%08x)\n", this, Pidls
[0], Pidls
[1], lParam
);
2066 switch (lParam
&~ SHCNE_INTERRUPT
)
2072 if (LV_FindItemByPidl(ILFindLastID(Pidls
[0])) == -1)
2074 LV_AddItem(ILFindLastID(Pidls
[0]));
2078 LV_ProdItem(ILFindLastID(Pidls
[0]));
2086 LV_DeleteItem(ILFindLastID(Pidls
[0]));
2089 case SHCNE_RENAMEFOLDER
:
2090 case SHCNE_RENAMEITEM
:
2091 if (bParent0
&& bParent1
)
2092 LV_RenameItem(ILFindLastID(Pidls
[0]), ILFindLastID(Pidls
[1]));
2094 LV_DeleteItem(ILFindLastID(Pidls
[0]));
2096 LV_AddItem(ILFindLastID(Pidls
[1]));
2099 case SHCNE_UPDATEITEM
:
2101 LV_RenameItem(ILFindLastID(Pidls
[0]), ILFindLastID(Pidls
[0]));
2104 case SHCNE_UPDATEDIR
:
2111 HRESULT
SHGetMenuIdFromMenuMsg(UINT uMsg
, LPARAM lParam
, UINT
*CmdId
);
2112 HRESULT
SHSetMenuIdInMenuMsg(UINT uMsg
, LPARAM lParam
, UINT CmdId
);
2114 /**********************************************************
2115 * CDefView::OnCustomItem
2117 LRESULT
CDefView::OnCustomItem(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
2122 ERR("no menu!!!\n");
2126 /* The lParam of WM_DRAWITEM WM_MEASUREITEM contain a menu id and this also needs to
2127 be changed to a menu identifier offset */
2129 HRESULT hres
= SHGetMenuIdFromMenuMsg(uMsg
, lParam
, &CmdID
);
2130 if (SUCCEEDED(hres
))
2131 SHSetMenuIdInMenuMsg(uMsg
, lParam
, CmdID
- CONTEXT_MENU_BASE_ID
);
2133 /* Forward the message to the IContextMenu2 */
2135 hres
= SHForwardContextMenuMsg(m_pCM
, uMsg
, wParam
, lParam
, &result
, TRUE
);
2137 return (SUCCEEDED(hres
));
2140 LRESULT
CDefView::OnSettingChange(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
2142 /* Wallpaper setting affects drop shadows effect */
2143 if (wParam
== SPI_SETDESKWALLPAPER
|| wParam
== 0)
2149 /**********************************************************
2150 * CDefView::OnInitMenuPopup
2152 LRESULT
CDefView::OnInitMenuPopup(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
2154 HMENU hmenu
= (HMENU
) wParam
;
2155 int nPos
= LOWORD(lParam
);
2158 OnCustomItem(uMsg
, wParam
, lParam
, bHandled
);
2160 HMENU hViewMenu
= GetSubmenuByID(m_hMenu
, FCIDM_MENU_VIEW
);
2162 /* Lets try to find out what the hell wParam is */
2163 if (hmenu
== GetSubMenu(m_hMenu
, nPos
))
2164 menuItemId
= ReallyGetMenuItemID(m_hMenu
, nPos
);
2165 else if (hViewMenu
&& hmenu
== GetSubMenu(hViewMenu
, nPos
))
2166 menuItemId
= ReallyGetMenuItemID(hViewMenu
, nPos
);
2167 else if (m_hContextMenu
&& hmenu
== GetSubMenu(m_hContextMenu
, nPos
))
2168 menuItemId
= ReallyGetMenuItemID(m_hContextMenu
, nPos
);
2174 case FCIDM_MENU_FILE
:
2177 case FCIDM_MENU_VIEW
:
2178 case FCIDM_SHVIEW_VIEW
:
2179 CheckViewMode(hmenu
);
2181 case FCIDM_SHVIEW_ARRANGE
:
2182 FillArrangeAsMenu(hmenu
);
2189 /**********************************************************
2192 * The INTERFACE of the IShellView object
2195 **********************************************************
2198 /**********************************************************
2199 * ShellView_GetWindow
2201 HRESULT WINAPI
CDefView::GetWindow(HWND
*phWnd
)
2203 TRACE("(%p)\n", this);
2210 HRESULT WINAPI
CDefView::ContextSensitiveHelp(BOOL fEnterMode
)
2212 FIXME("(%p) stub\n", this);
2217 /**********************************************************
2218 * IShellView_TranslateAccelerator
2221 * use the accel functions
2223 HRESULT WINAPI
CDefView::TranslateAccelerator(LPMSG lpmsg
)
2228 if (lpmsg
->message
>= WM_KEYFIRST
&& lpmsg
->message
<= WM_KEYLAST
)
2230 if (::TranslateAcceleratorW(m_hWnd
, m_hAccel
, lpmsg
) != 0)
2233 TRACE("-- key=0x%04lx\n", lpmsg
->wParam
) ;
2236 return m_pShellBrowser
->TranslateAcceleratorSB(lpmsg
, 0);
2239 HRESULT WINAPI
CDefView::EnableModeless(BOOL fEnable
)
2241 FIXME("(%p) stub\n", this);
2246 HRESULT WINAPI
CDefView::UIActivate(UINT uState
)
2248 // CHAR szName[MAX_PATH];
2250 int nPartArray
[1] = { -1};
2252 TRACE("(%p)->(state=%x) stub\n", this, uState
);
2254 /* don't do anything if the state isn't really changing */
2255 if (m_uState
== uState
)
2260 /* OnActivate handles the menu merging and internal state */
2263 /* only do This if we are active */
2264 if (uState
!= SVUIA_DEACTIVATE
)
2268 GetFolderPath is not a method of IShellFolder
2269 IShellFolder_GetFolderPath( m_pSFParent, szName, sizeof(szName) );
2271 /* set the number of parts */
2272 m_pShellBrowser
->SendControlMsg(FCW_STATUS
, SB_SETPARTS
, 1, (LPARAM
)nPartArray
, &lResult
);
2274 /* set the text for the parts */
2276 m_pShellBrowser->SendControlMsg(FCW_STATUS, SB_SETTEXTA, 0, (LPARAM)szName, &lResult);
2283 HRESULT WINAPI
CDefView::Refresh()
2285 TRACE("(%p)\n", this);
2287 m_ListView
.DeleteAllItems();
2293 HRESULT WINAPI
CDefView::CreateViewWindow(IShellView
*lpPrevView
, LPCFOLDERSETTINGS lpfs
, IShellBrowser
*psb
, RECT
*prcView
, HWND
*phWnd
)
2295 return CreateViewWindow3(psb
, lpPrevView
, SV3CVW3_DEFAULT
,
2296 (FOLDERFLAGS
)lpfs
->fFlags
, (FOLDERFLAGS
)lpfs
->fFlags
, (FOLDERVIEWMODE
)lpfs
->ViewMode
, NULL
, prcView
, phWnd
);
2299 HRESULT WINAPI
CDefView::DestroyViewWindow()
2301 TRACE("(%p)\n", this);
2303 /* Make absolutely sure all our UI is cleaned up */
2304 UIActivate(SVUIA_DEACTIVATE
);
2308 // "Accelerator tables loaded from resources are freed automatically when the application terminates." -- MSDN
2312 if (m_hMenuArrangeModes
)
2314 DestroyMenu(m_hMenuArrangeModes
);
2315 m_hMenuArrangeModes
= NULL
;
2318 if (m_hMenuViewModes
)
2320 DestroyMenu(m_hMenuViewModes
);
2321 m_hMenuViewModes
= NULL
;
2326 DestroyMenu(m_hMenu
);
2332 m_ListView
.DestroyWindow();
2340 m_pShellBrowser
.Release();
2341 m_pCommDlgBrowser
.Release();
2346 HRESULT WINAPI
CDefView::GetCurrentInfo(LPFOLDERSETTINGS lpfs
)
2348 TRACE("(%p)->(%p) vmode=%x flags=%x\n", this, lpfs
,
2349 m_FolderSettings
.ViewMode
, m_FolderSettings
.fFlags
);
2352 return E_INVALIDARG
;
2354 *lpfs
= m_FolderSettings
;
2358 HRESULT WINAPI
CDefView::AddPropertySheetPages(DWORD dwReserved
, LPFNADDPROPSHEETPAGE lpfn
, LPARAM lparam
)
2360 FIXME("(%p) stub\n", this);
2365 HRESULT WINAPI
CDefView::SaveViewState()
2367 FIXME("(%p) stub\n", this);
2372 HRESULT WINAPI
CDefView::SelectItem(PCUITEMID_CHILD pidl
, UINT uFlags
)
2376 TRACE("(%p)->(pidl=%p, 0x%08x) stub\n", this, pidl
, uFlags
);
2378 i
= LV_FindItemByPidl(pidl
);
2382 LVITEMW lvItem
= {0};
2383 lvItem
.mask
= LVIF_STATE
;
2384 lvItem
.stateMask
= LVIS_SELECTED
| LVIS_FOCUSED
;
2386 while (m_ListView
.GetItem(&lvItem
))
2388 if (lvItem
.iItem
== i
)
2390 if (uFlags
& SVSI_SELECT
)
2391 lvItem
.state
|= LVIS_SELECTED
;
2393 lvItem
.state
&= ~LVIS_SELECTED
;
2395 if (uFlags
& SVSI_FOCUSED
)
2396 lvItem
.state
|= LVIS_FOCUSED
;
2398 lvItem
.state
&= ~LVIS_FOCUSED
;
2402 if (uFlags
& SVSI_DESELECTOTHERS
)
2404 lvItem
.state
&= ~LVIS_SELECTED
;
2406 lvItem
.state
&= ~LVIS_FOCUSED
;
2409 m_ListView
.SetItem(&lvItem
);
2413 if (uFlags
& SVSI_ENSUREVISIBLE
)
2414 m_ListView
.EnsureVisible(i
, FALSE
);
2416 if((uFlags
& SVSI_EDIT
) == SVSI_EDIT
)
2417 m_ListView
.EditLabel(i
);
2422 HRESULT WINAPI
CDefView::GetItemObject(UINT uItem
, REFIID riid
, LPVOID
*ppvOut
)
2424 HRESULT hr
= E_NOINTERFACE
;
2426 TRACE("(%p)->(uItem=0x%08x,\n\tIID=%s, ppv=%p)\n", this, uItem
, debugstr_guid(&riid
), ppvOut
);
2429 return E_INVALIDARG
;
2435 case SVGIO_BACKGROUND
:
2436 if (IsEqualIID(riid
, IID_IContextMenu
))
2438 hr
= CDefViewBckgrndMenu_CreateInstance(m_pSF2Parent
, riid
, ppvOut
);
2439 if (FAILED_UNEXPECTEDLY(hr
))
2442 IUnknown_SetSite(*((IUnknown
**)ppvOut
), (IShellView
*)this);
2444 else if (IsEqualIID(riid
, IID_IDispatch
))
2446 if (m_pShellFolderViewDual
== NULL
)
2448 hr
= CDefViewDual_Constructor(riid
, (LPVOID
*)&m_pShellFolderViewDual
);
2449 if (FAILED_UNEXPECTEDLY(hr
))
2452 hr
= m_pShellFolderViewDual
->QueryInterface(riid
, ppvOut
);
2456 case SVGIO_SELECTION
:
2458 hr
= m_pSFParent
->GetUIObjectOf(m_hWnd
, m_cidl
, m_apidl
, riid
, 0, ppvOut
);
2459 if (FAILED_UNEXPECTEDLY(hr
))
2462 if (IsEqualIID(riid
, IID_IContextMenu
))
2463 IUnknown_SetSite(*((IUnknown
**)ppvOut
), (IShellView
*)this);
2468 TRACE("-- (%p)->(interface=%p)\n", this, *ppvOut
);
2473 HRESULT STDMETHODCALLTYPE
CDefView::GetCurrentViewMode(UINT
*pViewMode
)
2475 TRACE("(%p)->(%p), stub\n", this, pViewMode
);
2478 return E_INVALIDARG
;
2480 *pViewMode
= m_FolderSettings
.ViewMode
;
2484 HRESULT STDMETHODCALLTYPE
CDefView::SetCurrentViewMode(UINT ViewMode
)
2487 TRACE("(%p)->(%u), stub\n", this, ViewMode
);
2489 /* It's not redundant to check FVM_AUTO because it's a (UINT)-1 */
2490 if (((INT
)ViewMode
< FVM_FIRST
|| (INT
)ViewMode
> FVM_LAST
) && ((INT
)ViewMode
!= FVM_AUTO
))
2491 return E_INVALIDARG
;
2493 /* Windows before Vista uses LVM_SETVIEW and possibly
2494 LVM_SETEXTENDEDLISTVIEWSTYLE to set the style of the listview,
2495 while later versions seem to accomplish this through other
2503 dwStyle
= LVS_REPORT
;
2506 dwStyle
= LVS_SMALLICON
;
2513 FIXME("ViewMode %d not implemented\n", ViewMode
);
2519 m_ListView
.ModifyStyle(LVS_TYPEMASK
, dwStyle
);
2521 /* This will not necessarily be the actual mode set above.
2522 This mimics the behavior of Windows XP. */
2523 m_FolderSettings
.ViewMode
= ViewMode
;
2528 HRESULT STDMETHODCALLTYPE
CDefView::GetFolder(REFIID riid
, void **ppv
)
2530 if (m_pSFParent
== NULL
)
2533 return m_pSFParent
->QueryInterface(riid
, ppv
);
2536 HRESULT STDMETHODCALLTYPE
CDefView::Item(int iItemIndex
, PITEMID_CHILD
*ppidl
)
2538 PCUITEMID_CHILD pidl
= _PidlByItem(iItemIndex
);
2541 *ppidl
= ILClone(pidl
);
2546 return E_INVALIDARG
;
2549 HRESULT STDMETHODCALLTYPE
CDefView::ItemCount(UINT uFlags
, int *pcItems
)
2551 TRACE("(%p)->(%u %p)\n", this, uFlags
, pcItems
);
2553 if (uFlags
!= SVGIO_ALLVIEW
)
2554 FIXME("some flags unsupported, %x\n", uFlags
& ~SVGIO_ALLVIEW
);
2556 *pcItems
= m_ListView
.GetItemCount();
2561 HRESULT STDMETHODCALLTYPE
CDefView::Items(UINT uFlags
, REFIID riid
, void **ppv
)
2566 HRESULT STDMETHODCALLTYPE
CDefView::GetSelectionMarkedItem(int *piItem
)
2568 TRACE("(%p)->(%p)\n", this, piItem
);
2570 *piItem
= m_ListView
.GetSelectionMark();
2575 HRESULT STDMETHODCALLTYPE
CDefView::GetFocusedItem(int *piItem
)
2577 TRACE("(%p)->(%p)\n", this, piItem
);
2579 *piItem
= m_ListView
.GetNextItem(-1, LVNI_FOCUSED
);
2584 HRESULT STDMETHODCALLTYPE
CDefView::GetItemPosition(PCUITEMID_CHILD pidl
, POINT
*ppt
)
2586 int lvIndex
= LV_FindItemByPidl(pidl
);
2587 if (lvIndex
== -1 || ppt
== NULL
)
2588 return E_INVALIDARG
;
2590 m_ListView
.GetItemPosition(lvIndex
, ppt
);
2594 HRESULT STDMETHODCALLTYPE
CDefView::GetSpacing(POINT
*ppt
)
2596 TRACE("(%p)->(%p)\n", this, ppt
);
2604 m_ListView
.GetItemSpacing(spacing
);
2606 ppt
->x
= spacing
.cx
;
2607 ppt
->y
= spacing
.cy
;
2613 HRESULT STDMETHODCALLTYPE
CDefView::GetDefaultSpacing(POINT
*ppt
)
2618 HRESULT STDMETHODCALLTYPE
CDefView::GetAutoArrange()
2620 return ((m_ListView
.GetStyle() & LVS_AUTOARRANGE
) ? S_OK
: S_FALSE
);
2623 HRESULT STDMETHODCALLTYPE
CDefView::SelectItem(int iItem
, DWORD dwFlags
)
2627 TRACE("(%p)->(%d, %x)\n", this, iItem
, dwFlags
);
2630 lvItem
.stateMask
= LVIS_SELECTED
;
2632 if (dwFlags
& SVSI_ENSUREVISIBLE
)
2633 m_ListView
.EnsureVisible(iItem
, 0);
2636 if (dwFlags
& SVSI_DESELECTOTHERS
)
2637 m_ListView
.SetItemState(-1, 0, LVIS_SELECTED
);
2640 if (dwFlags
& SVSI_SELECT
)
2641 lvItem
.state
|= LVIS_SELECTED
;
2643 if (dwFlags
& SVSI_FOCUSED
)
2644 lvItem
.stateMask
|= LVIS_FOCUSED
;
2646 m_ListView
.SetItemState(iItem
, lvItem
.state
, lvItem
.stateMask
);
2648 if ((dwFlags
& SVSI_EDIT
) == SVSI_EDIT
)
2649 m_ListView
.EditLabel(iItem
);
2654 HRESULT STDMETHODCALLTYPE
CDefView::SelectAndPositionItems(UINT cidl
, PCUITEMID_CHILD_ARRAY apidl
, POINT
*apt
, DWORD dwFlags
)
2656 /* Reset the selection */
2657 m_ListView
.SetItemState(-1, 0, LVIS_SELECTED
);
2660 for (UINT i
= 0 ; i
< m_cidl
; i
++)
2662 lvIndex
= LV_FindItemByPidl(apidl
[i
]);
2665 SelectItem(lvIndex
, dwFlags
);
2666 m_ListView
.SetItemPosition(lvIndex
, &apt
[i
]);
2673 /**********************************************************
2674 * IShellView2 implementation
2677 HRESULT STDMETHODCALLTYPE
CDefView::GetView(SHELLVIEWID
*view_guid
, ULONG view_type
)
2679 FIXME("(%p)->(%p, %lu) stub\n", this, view_guid
, view_type
);
2683 HRESULT STDMETHODCALLTYPE
CDefView::CreateViewWindow2(LPSV2CVW2_PARAMS view_params
)
2685 return CreateViewWindow3(view_params
->psbOwner
, view_params
->psvPrev
,
2686 SV3CVW3_DEFAULT
, (FOLDERFLAGS
)view_params
->pfs
->fFlags
, (FOLDERFLAGS
)view_params
->pfs
->fFlags
,
2687 (FOLDERVIEWMODE
)view_params
->pfs
->ViewMode
, view_params
->pvid
, view_params
->prcView
, &view_params
->hwndView
);
2690 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
)
2692 OLEMENUGROUPWIDTHS omw
= { { 0, 0, 0, 0, 0, 0 } };
2696 TRACE("(%p)->(shlview=%p shlbrs=%p rec=%p hwnd=%p vmode=%x flags=%x)\n", this, psvPrevious
, psb
, prcView
, hwnd
, mode
, flags
);
2697 if (prcView
!= NULL
)
2698 TRACE("-- left=%i top=%i right=%i bottom=%i\n", prcView
->left
, prcView
->top
, prcView
->right
, prcView
->bottom
);
2700 /* Validate the Shell Browser */
2701 if (psb
== NULL
|| m_hWnd
)
2702 return E_UNEXPECTED
;
2704 if (view_flags
!= SV3CVW3_DEFAULT
)
2705 FIXME("unsupported view flags 0x%08x\n", view_flags
);
2707 /* Set up the member variables */
2708 m_pShellBrowser
= psb
;
2709 m_FolderSettings
.ViewMode
= mode
;
2710 m_FolderSettings
.fFlags
= mask
& flags
;
2714 if (IsEqualIID(*view_id
, VID_LargeIcons
))
2715 m_FolderSettings
.ViewMode
= FVM_ICON
;
2716 else if (IsEqualIID(*view_id
, VID_SmallIcons
))
2717 m_FolderSettings
.ViewMode
= FVM_SMALLICON
;
2718 else if (IsEqualIID(*view_id
, VID_List
))
2719 m_FolderSettings
.ViewMode
= FVM_LIST
;
2720 else if (IsEqualIID(*view_id
, VID_Details
))
2721 m_FolderSettings
.ViewMode
= FVM_DETAILS
;
2722 else if (IsEqualIID(*view_id
, VID_Thumbnails
))
2723 m_FolderSettings
.ViewMode
= FVM_THUMBNAIL
;
2724 else if (IsEqualIID(*view_id
, VID_Tile
))
2725 m_FolderSettings
.ViewMode
= FVM_TILE
;
2726 else if (IsEqualIID(*view_id
, VID_ThumbStrip
))
2727 m_FolderSettings
.ViewMode
= FVM_THUMBSTRIP
;
2729 FIXME("Ignoring unrecognized VID %s\n", debugstr_guid(view_id
));
2732 /* Get our parent window */
2733 m_pShellBrowser
->GetWindow(&m_hWndParent
);
2735 /* Try to get the ICommDlgBrowserInterface, adds a reference !!! */
2736 m_pCommDlgBrowser
= NULL
;
2737 if (SUCCEEDED(m_pShellBrowser
->QueryInterface(IID_PPV_ARG(ICommDlgBrowser
, &m_pCommDlgBrowser
))))
2739 TRACE("-- CommDlgBrowser\n");
2742 Create(m_hWndParent
, prcView
, NULL
, WS_CHILD
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
| WS_TABSTOP
, 0, 0U);
2753 _DoFolderViewCB(SFVM_WINDOWCREATED
, (WPARAM
)m_hWnd
, NULL
);
2755 SetWindowPos(HWND_TOP
, 0, 0, 0, 0, SWP_NOMOVE
| SWP_NOSIZE
| SWP_SHOWWINDOW
);
2760 m_hMenu
= CreateMenu();
2761 m_pShellBrowser
->InsertMenusSB(m_hMenu
, &omw
);
2762 TRACE("-- after fnInsertMenusSB\n");
2770 HRESULT STDMETHODCALLTYPE
CDefView::HandleRename(LPCITEMIDLIST new_pidl
)
2772 FIXME("(%p)->(%p) stub\n", this, new_pidl
);
2776 HRESULT STDMETHODCALLTYPE
CDefView::SelectAndPositionItem(LPCITEMIDLIST item
, UINT flags
, POINT
*point
)
2778 FIXME("(%p)->(%p, %u, %p) stub\n", this, item
, flags
, point
);
2782 /**********************************************************
2783 * IShellFolderView implementation
2785 HRESULT STDMETHODCALLTYPE
CDefView::Rearrange(LPARAM sort
)
2787 FIXME("(%p)->(%ld) stub\n", this, sort
);
2791 HRESULT STDMETHODCALLTYPE
CDefView::GetArrangeParam(LPARAM
*sort
)
2793 FIXME("(%p)->(%p) stub\n", this, sort
);
2797 HRESULT STDMETHODCALLTYPE
CDefView::ArrangeGrid()
2799 FIXME("(%p) stub\n", this);
2803 HRESULT STDMETHODCALLTYPE
CDefView::AutoArrange()
2805 m_ListView
.ModifyStyle(0, LVS_AUTOARRANGE
);
2806 m_ListView
.Arrange(LVA_DEFAULT
);
2810 HRESULT STDMETHODCALLTYPE
CDefView::AddObject(PITEMID_CHILD pidl
, UINT
*item
)
2812 TRACE("(%p)->(%p %p)\n", this, pidl
, item
);
2813 *item
= LV_AddItem(pidl
);
2814 return (int)*item
>= 0 ? S_OK
: E_OUTOFMEMORY
;
2817 HRESULT STDMETHODCALLTYPE
CDefView::GetObject(PITEMID_CHILD
*pidl
, UINT item
)
2819 TRACE("(%p)->(%p %d)\n", this, pidl
, item
);
2820 return Item(item
, pidl
);
2823 HRESULT STDMETHODCALLTYPE
CDefView::RemoveObject(PITEMID_CHILD pidl
, UINT
*item
)
2826 TRACE("(%p)->(%p %p)\n", this, pidl
, item
);
2830 *item
= LV_FindItemByPidl(ILFindLastID(pidl
));
2831 m_ListView
.DeleteItem(*item
);
2836 m_ListView
.DeleteAllItems();
2842 HRESULT STDMETHODCALLTYPE
CDefView::GetObjectCount(UINT
*count
)
2844 TRACE("(%p)->(%p)\n", this, count
);
2845 *count
= m_ListView
.GetItemCount();
2849 HRESULT STDMETHODCALLTYPE
CDefView::SetObjectCount(UINT count
, UINT flags
)
2851 FIXME("(%p)->(%d %x) stub\n", this, count
, flags
);
2855 HRESULT STDMETHODCALLTYPE
CDefView::UpdateObject(PITEMID_CHILD pidl_old
, PITEMID_CHILD pidl_new
, UINT
*item
)
2857 FIXME("(%p)->(%p %p %p) stub\n", this, pidl_old
, pidl_new
, item
);
2861 HRESULT STDMETHODCALLTYPE
CDefView::RefreshObject(PITEMID_CHILD pidl
, UINT
*item
)
2863 FIXME("(%p)->(%p %p) stub\n", this, pidl
, item
);
2867 HRESULT STDMETHODCALLTYPE
CDefView::SetRedraw(BOOL redraw
)
2869 TRACE("(%p)->(%d)\n", this, redraw
);
2870 m_ListView
.SetRedraw(redraw
);
2874 HRESULT STDMETHODCALLTYPE
CDefView::GetSelectedCount(UINT
*count
)
2876 FIXME("(%p)->(%p) stub\n", this, count
);
2880 HRESULT STDMETHODCALLTYPE
CDefView::GetSelectedObjects(PCUITEMID_CHILD
**pidl
, UINT
*items
)
2882 TRACE("(%p)->(%p %p)\n", this, pidl
, items
);
2884 *items
= GetSelections();
2888 *pidl
= static_cast<PCUITEMID_CHILD
*>(LocalAlloc(0, *items
* sizeof(PCUITEMID_CHILD
)));
2891 return E_OUTOFMEMORY
;
2894 /* it's documented that caller shouldn't PIDLs, only array itself */
2895 memcpy(*pidl
, m_apidl
, *items
* sizeof(PCUITEMID_CHILD
));
2901 HRESULT STDMETHODCALLTYPE
CDefView::IsDropOnSource(IDropTarget
*drop_target
)
2903 if ((m_iDragOverItem
== -1 || m_pCurDropTarget
== NULL
) &&
2904 (m_pSourceDataObject
.p
))
2912 HRESULT STDMETHODCALLTYPE
CDefView::GetDragPoint(POINT
*pt
)
2915 return E_INVALIDARG
;
2917 *pt
= m_ptFirstMousePos
;
2921 HRESULT STDMETHODCALLTYPE
CDefView::GetDropPoint(POINT
*pt
)
2923 FIXME("(%p)->(%p) stub\n", this, pt
);
2927 HRESULT STDMETHODCALLTYPE
CDefView::MoveIcons(IDataObject
*obj
)
2929 TRACE("(%p)->(%p)\n", this, obj
);
2933 HRESULT STDMETHODCALLTYPE
CDefView::SetItemPos(PCUITEMID_CHILD pidl
, POINT
*pt
)
2935 FIXME("(%p)->(%p %p) stub\n", this, pidl
, pt
);
2939 HRESULT STDMETHODCALLTYPE
CDefView::IsBkDropTarget(IDropTarget
*drop_target
)
2941 FIXME("(%p)->(%p) stub\n", this, drop_target
);
2945 HRESULT STDMETHODCALLTYPE
CDefView::SetClipboard(BOOL move
)
2947 FIXME("(%p)->(%d) stub\n", this, move
);
2951 HRESULT STDMETHODCALLTYPE
CDefView::SetPoints(IDataObject
*obj
)
2953 FIXME("(%p)->(%p) stub\n", this, obj
);
2957 HRESULT STDMETHODCALLTYPE
CDefView::GetItemSpacing(ITEMSPACING
*spacing
)
2959 FIXME("(%p)->(%p) stub\n", this, spacing
);
2963 HRESULT STDMETHODCALLTYPE
CDefView::SetCallback(IShellFolderViewCB
*new_cb
, IShellFolderViewCB
**old_cb
)
2966 *old_cb
= m_pShellFolderViewCB
.Detach();
2968 m_pShellFolderViewCB
= new_cb
;
2972 HRESULT STDMETHODCALLTYPE
CDefView::Select(UINT flags
)
2974 FIXME("(%p)->(%d) stub\n", this, flags
);
2978 HRESULT STDMETHODCALLTYPE
CDefView::QuerySupport(UINT
*support
)
2980 TRACE("(%p)->(%p)\n", this, support
);
2984 HRESULT STDMETHODCALLTYPE
CDefView::SetAutomationObject(IDispatch
*disp
)
2986 FIXME("(%p)->(%p) stub\n", this, disp
);
2990 /**********************************************************
2991 * ISVOleCmdTarget_QueryStatus (IOleCommandTarget)
2993 HRESULT WINAPI
CDefView::QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
, OLECMD
*prgCmds
, OLECMDTEXT
*pCmdText
)
2995 FIXME("(%p)->(%p(%s) 0x%08x %p %p\n",
2996 this, pguidCmdGroup
, debugstr_guid(pguidCmdGroup
), cCmds
, prgCmds
, pCmdText
);
2999 return E_INVALIDARG
;
3001 for (UINT i
= 0; i
< cCmds
; i
++)
3003 FIXME("\tprgCmds[%d].cmdID = %d\n", i
, prgCmds
[i
].cmdID
);
3004 prgCmds
[i
].cmdf
= 0;
3007 return OLECMDERR_E_UNKNOWNGROUP
;
3010 /**********************************************************
3011 * ISVOleCmdTarget_Exec (IOleCommandTarget)
3013 * nCmdID is the OLECMDID_* enumeration
3015 HRESULT WINAPI
CDefView::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
3017 FIXME("(%p)->(\n\tTarget GUID:%s Command:0x%08x Opt:0x%08x %p %p)\n",
3018 this, debugstr_guid(pguidCmdGroup
), nCmdID
, nCmdexecopt
, pvaIn
, pvaOut
);
3021 return OLECMDERR_E_UNKNOWNGROUP
;
3023 if (IsEqualCLSID(*pguidCmdGroup
, m_Category
))
3025 if (nCmdID
== FCIDM_SHVIEW_AUTOARRANGE
)
3027 if (V_VT(pvaIn
) != VT_INT_PTR
)
3028 return OLECMDERR_E_NOTSUPPORTED
;
3031 params
.cbSize
= sizeof(params
);
3032 params
.rcExclude
= *(RECT
*) V_INTREF(pvaIn
);
3034 if (m_hMenuViewModes
)
3036 /* Duplicate all but the last two items of the view modes menu */
3037 HMENU hmenuViewPopup
= CreatePopupMenu();
3038 Shell_MergeMenus(hmenuViewPopup
, m_hMenuViewModes
, 0, 0, 0xFFFF, 0);
3039 DeleteMenu(hmenuViewPopup
, GetMenuItemCount(hmenuViewPopup
) - 1, MF_BYPOSITION
);
3040 DeleteMenu(hmenuViewPopup
, GetMenuItemCount(hmenuViewPopup
) - 1, MF_BYPOSITION
);
3041 CheckViewMode(hmenuViewPopup
);
3042 TrackPopupMenuEx(hmenuViewPopup
, TPM_LEFTALIGN
| TPM_TOPALIGN
, params
.rcExclude
.left
, params
.rcExclude
.bottom
, m_hWndParent
, ¶ms
);
3043 ::DestroyMenu(hmenuViewPopup
);
3046 // pvaOut is VT_I4 with value 0x403 (cmd id of the new mode maybe?)
3047 V_VT(pvaOut
) = VT_I4
;
3048 V_I4(pvaOut
) = 0x403;
3052 if (IsEqualIID(*pguidCmdGroup
, CGID_Explorer
) &&
3054 (nCmdexecopt
== 4) && pvaOut
)
3057 if (IsEqualIID(*pguidCmdGroup
, CGID_ShellDocView
) &&
3062 return OLECMDERR_E_UNKNOWNGROUP
;
3065 /**********************************************************
3066 * ISVDropTarget implementation
3069 /******************************************************************************
3070 * drag_notify_subitem [Internal]
3072 * Figure out the shellfolder object, which is currently under the mouse cursor
3073 * and notify it via the IDropTarget interface.
3076 #define SCROLLAREAWIDTH 20
3078 HRESULT
CDefView::drag_notify_subitem(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
3084 /* The key state on drop doesn't have MK_LBUTTON or MK_RBUTTON because it
3085 reflects the key state after the user released the button, so we need
3086 to remember the last key state when the button was pressed */
3087 m_grfKeyState
= grfKeyState
;
3089 /* Map from global to client coordinates and query the index of the listview-item, which is
3090 * currently under the mouse cursor. */
3091 LVHITTESTINFO htinfo
= {{pt
.x
, pt
.y
}, LVHT_ONITEM
};
3092 ScreenToClient(&htinfo
.pt
);
3093 lResult
= m_ListView
.HitTest(&htinfo
);
3095 /* Send WM_*SCROLL messages every 250 ms during drag-scrolling */
3096 ::GetClientRect(m_ListView
, &clientRect
);
3097 if (htinfo
.pt
.x
== m_ptLastMousePos
.x
&& htinfo
.pt
.y
== m_ptLastMousePos
.y
&&
3098 (htinfo
.pt
.x
< SCROLLAREAWIDTH
|| htinfo
.pt
.x
> clientRect
.right
- SCROLLAREAWIDTH
||
3099 htinfo
.pt
.y
< SCROLLAREAWIDTH
|| htinfo
.pt
.y
> clientRect
.bottom
- SCROLLAREAWIDTH
))
3101 m_cScrollDelay
= (m_cScrollDelay
+ 1) % 5; /* DragOver is called every 50 ms */
3102 if (m_cScrollDelay
== 0)
3104 /* Mouse did hover another 250 ms over the scroll-area */
3105 if (htinfo
.pt
.x
< SCROLLAREAWIDTH
)
3106 m_ListView
.SendMessageW(WM_HSCROLL
, SB_LINEUP
, 0);
3108 if (htinfo
.pt
.x
> clientRect
.right
- SCROLLAREAWIDTH
)
3109 m_ListView
.SendMessageW(WM_HSCROLL
, SB_LINEDOWN
, 0);
3111 if (htinfo
.pt
.y
< SCROLLAREAWIDTH
)
3112 m_ListView
.SendMessageW(WM_VSCROLL
, SB_LINEUP
, 0);
3114 if (htinfo
.pt
.y
> clientRect
.bottom
- SCROLLAREAWIDTH
)
3115 m_ListView
.SendMessageW(WM_VSCROLL
, SB_LINEDOWN
, 0);
3120 m_cScrollDelay
= 0; /* Reset, if the cursor is not over the listview's scroll-area */
3123 m_ptLastMousePos
= htinfo
.pt
;
3125 /* We need to check if we drag the selection over itself */
3126 if (lResult
!= -1 && m_pSourceDataObject
.p
!= NULL
)
3128 PCUITEMID_CHILD pidl
= _PidlByItem(lResult
);
3130 for (UINT i
= 0; i
< m_cidl
; i
++)
3132 if (pidl
== m_apidl
[i
])
3134 /* The item that is being draged is hovering itself. */
3141 /* If we are still over the previous sub-item, notify it via DragOver and return. */
3142 if (m_pCurDropTarget
&& lResult
== m_iDragOverItem
)
3143 return m_pCurDropTarget
->DragOver(grfKeyState
, pt
, pdwEffect
);
3145 /* We've left the previous sub-item, notify it via DragLeave and Release it. */
3146 if (m_pCurDropTarget
)
3148 PCUITEMID_CHILD pidl
= _PidlByItem(m_iDragOverItem
);
3150 SelectItem(pidl
, 0);
3152 m_pCurDropTarget
->DragLeave();
3153 m_pCurDropTarget
.Release();
3156 m_iDragOverItem
= lResult
;
3160 /* We are not above one of the listview's subitems. Bind to the parent folder's
3161 * DropTarget interface. */
3162 hr
= m_pSFParent
->CreateViewObject(NULL
, IID_PPV_ARG(IDropTarget
,&m_pCurDropTarget
));
3166 /* Query the relative PIDL of the shellfolder object represented by the currently
3167 * dragged over listview-item ... */
3168 PCUITEMID_CHILD pidl
= _PidlByItem(lResult
);
3170 /* ... and bind m_pCurDropTarget to the IDropTarget interface of an UIObject of this object */
3171 hr
= m_pSFParent
->GetUIObjectOf(m_ListView
, 1, &pidl
, IID_NULL_PPV_ARG(IDropTarget
, &m_pCurDropTarget
));
3174 IUnknown_SetSite(m_pCurDropTarget
, (IShellView
*)this);
3176 /* If anything failed, m_pCurDropTarget should be NULL now, which ought to be a save state. */
3179 *pdwEffect
= DROPEFFECT_NONE
;
3183 if (m_iDragOverItem
!= -1)
3185 SelectItem(m_iDragOverItem
, SVSI_SELECT
);
3188 /* Notify the item just entered via DragEnter. */
3189 return m_pCurDropTarget
->DragEnter(m_pCurDataObject
, grfKeyState
, pt
, pdwEffect
);
3192 HRESULT WINAPI
CDefView::DragEnter(IDataObject
*pDataObject
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
3194 if (*pdwEffect
== DROPEFFECT_NONE
)
3197 /* Get a hold on the data object for later calls to DragEnter on the sub-folders */
3198 m_pCurDataObject
= pDataObject
;
3200 HRESULT hr
= drag_notify_subitem(grfKeyState
, pt
, pdwEffect
);
3203 POINT ptClient
= {pt
.x
, pt
.y
};
3204 ScreenToClient(&ptClient
);
3205 ImageList_DragEnter(m_hWnd
, ptClient
.x
, ptClient
.y
);
3211 HRESULT WINAPI
CDefView::DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
3213 POINT ptClient
= {pt
.x
, pt
.y
};
3214 ScreenToClient(&ptClient
);
3215 ImageList_DragMove(ptClient
.x
, ptClient
.y
);
3216 return drag_notify_subitem(grfKeyState
, pt
, pdwEffect
);
3219 HRESULT WINAPI
CDefView::DragLeave()
3221 ImageList_DragLeave(m_hWnd
);
3223 if (m_pCurDropTarget
)
3225 m_pCurDropTarget
->DragLeave();
3226 m_pCurDropTarget
.Release();
3229 if (m_pCurDataObject
!= NULL
)
3231 m_pCurDataObject
.Release();
3234 m_iDragOverItem
= 0;
3239 HRESULT WINAPI
CDefView::Drop(IDataObject
* pDataObject
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
3241 ImageList_DragLeave(m_hWnd
);
3242 ImageList_EndDrag();
3244 if ((IsDropOnSource(NULL
) == S_OK
) &&
3245 (*pdwEffect
& DROPEFFECT_MOVE
) &&
3246 (m_grfKeyState
& MK_LBUTTON
))
3248 if (m_pCurDropTarget
)
3250 m_pCurDropTarget
->DragLeave();
3251 m_pCurDropTarget
.Release();
3254 /* Restore the selection */
3255 m_ListView
.SetItemState(-1, 0, LVIS_SELECTED
);
3256 for (UINT i
= 0 ; i
< m_cidl
; i
++)
3257 SelectItem(m_apidl
[i
], SVSI_SELECT
);
3259 /* Reposition the items */
3261 while ((lvIndex
= m_ListView
.GetNextItem(lvIndex
, LVNI_SELECTED
)) > -1)
3264 if (m_ListView
.GetItemPosition(lvIndex
, &ptItem
))
3266 ptItem
.x
+= pt
.x
- m_ptFirstMousePos
.x
;
3267 ptItem
.y
+= pt
.y
- m_ptFirstMousePos
.y
;
3268 m_ListView
.SetItemPosition(lvIndex
, &ptItem
);
3272 else if (m_pCurDropTarget
)
3274 m_pCurDropTarget
->Drop(pDataObject
, grfKeyState
, pt
, pdwEffect
);
3275 m_pCurDropTarget
.Release();
3278 m_pCurDataObject
.Release();
3279 m_iDragOverItem
= 0;
3283 /**********************************************************
3284 * ISVDropSource implementation
3287 HRESULT WINAPI
CDefView::QueryContinueDrag(BOOL fEscapePressed
, DWORD grfKeyState
)
3289 TRACE("(%p)\n", this);
3292 return DRAGDROP_S_CANCEL
;
3293 else if (!(grfKeyState
& MK_LBUTTON
) && !(grfKeyState
& MK_RBUTTON
))
3294 return DRAGDROP_S_DROP
;
3299 HRESULT WINAPI
CDefView::GiveFeedback(DWORD dwEffect
)
3301 TRACE("(%p)\n", this);
3303 return DRAGDROP_S_USEDEFAULTCURSORS
;
3306 /**********************************************************
3307 * ISVViewObject implementation
3310 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
)
3312 FIXME("Stub: this=%p\n", this);
3317 HRESULT WINAPI
CDefView::GetColorSet(DWORD dwDrawAspect
, LONG lindex
, void *pvAspect
, DVTARGETDEVICE
*ptd
, HDC hicTargetDevice
, LOGPALETTE
**ppColorSet
)
3319 FIXME("Stub: this=%p\n", this);
3324 HRESULT WINAPI
CDefView::Freeze(DWORD dwDrawAspect
, LONG lindex
, void *pvAspect
, DWORD
*pdwFreeze
)
3326 FIXME("Stub: this=%p\n", this);
3331 HRESULT WINAPI
CDefView::Unfreeze(DWORD dwFreeze
)
3333 FIXME("Stub: this=%p\n", this);
3338 HRESULT WINAPI
CDefView::SetAdvise(DWORD aspects
, DWORD advf
, IAdviseSink
*pAdvSink
)
3340 FIXME("partial stub: %p 0x%08x 0x%08x %p\n", this, aspects
, advf
, pAdvSink
);
3342 /* FIXME: we set the AdviseSink, but never use it to send any advice */
3343 m_pAdvSink
= pAdvSink
;
3344 m_dwAspects
= aspects
;
3350 HRESULT WINAPI
CDefView::GetAdvise(DWORD
*pAspects
, DWORD
*pAdvf
, IAdviseSink
**ppAdvSink
)
3352 TRACE("this=%p pAspects=%p pAdvf=%p ppAdvSink=%p\n", this, pAspects
, pAdvf
, ppAdvSink
);
3356 *ppAdvSink
= m_pAdvSink
;
3357 m_pAdvSink
.p
->AddRef();
3361 *pAspects
= m_dwAspects
;
3369 HRESULT STDMETHODCALLTYPE
CDefView::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
3371 if (IsEqualIID(guidService
, SID_IShellBrowser
))
3372 return m_pShellBrowser
->QueryInterface(riid
, ppvObject
);
3373 else if(IsEqualIID(guidService
, SID_IFolderView
))
3374 return QueryInterface(riid
, ppvObject
);
3376 return E_NOINTERFACE
;
3379 HRESULT
CDefView::_MergeToolbar()
3381 CComPtr
<IExplorerToolbar
> ptb
;
3384 hr
= IUnknown_QueryService(m_pShellBrowser
, IID_IExplorerToolbar
, IID_PPV_ARG(IExplorerToolbar
, &ptb
));
3388 m_Category
= CGID_DefViewFrame
;
3390 hr
= ptb
->SetCommandTarget(static_cast<IOleCommandTarget
*>(this), &m_Category
, 0);
3398 hr
= ptb
->AddButtons(&m_Category
, buttonsCount
, buttons
);
3406 // The default processing of IShellFolderView callbacks
3407 HRESULT
CDefView::DefMessageSFVCB(UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
3409 // TODO: SFVM_GET_CUSTOMVIEWINFO, SFVM_WINDOWCREATED
3410 TRACE("CDefView::DefMessageSFVCB uMsg=%u\n", uMsg
);
3414 HRESULT
CDefView::_DoFolderViewCB(UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
3416 HRESULT hr
= E_NOTIMPL
;
3418 if (m_pShellFolderViewCB
)
3420 hr
= m_pShellFolderViewCB
->MessageSFVCB(uMsg
, wParam
, lParam
);
3423 if (hr
== E_NOTIMPL
)
3425 hr
= DefMessageSFVCB(uMsg
, wParam
, lParam
);
3431 HRESULT
CDefView_CreateInstance(IShellFolder
*pFolder
, REFIID riid
, LPVOID
* ppvOut
)
3433 return ShellObjectCreatorInit
<CDefView
>(pFolder
, riid
, ppvOut
);
3436 HRESULT WINAPI
SHCreateShellFolderViewEx(
3437 LPCSFV psvcbi
, /* [in] shelltemplate struct */
3438 IShellView
**ppsv
) /* [out] IShellView pointer */
3440 CComPtr
<IShellView
> psv
;
3443 TRACE("sf=%p pidl=%p cb=%p mode=0x%08x parm=%p\n",
3444 psvcbi
->pshf
, psvcbi
->pidl
, psvcbi
->pfnCallback
,
3445 psvcbi
->fvm
, psvcbi
->psvOuter
);
3448 hRes
= CDefView_CreateInstance(psvcbi
->pshf
, IID_PPV_ARG(IShellView
, &psv
));
3449 if (FAILED_UNEXPECTEDLY(hRes
))
3452 *ppsv
= psv
.Detach();
3456 HRESULT WINAPI
SHCreateShellFolderView(const SFV_CREATE
*pcsfv
,
3459 CComPtr
<IShellView
> psv
;
3463 return E_INVALIDARG
;
3467 if (!pcsfv
|| pcsfv
->cbSize
!= sizeof(*pcsfv
))
3468 return E_INVALIDARG
;
3470 TRACE("sf=%p outer=%p callback=%p\n",
3471 pcsfv
->pshf
, pcsfv
->psvOuter
, pcsfv
->psfvcb
);
3473 hRes
= CDefView_CreateInstance(pcsfv
->pshf
, IID_PPV_ARG(IShellView
, &psv
));
3479 CComPtr
<IShellFolderView
> sfv
;
3480 if (SUCCEEDED(psv
->QueryInterface(IID_PPV_ARG(IShellFolderView
, &sfv
))))
3482 sfv
->SetCallback(pcsfv
->psfvcb
, NULL
);
3486 *ppsv
= psv
.Detach();