4 * Copyright 1998,1999 <juergen.schmied@debitel.net>
6 * This is the view visualizing the data provided by the shellfolder.
7 * No direct access to data from pidls should be done from here.
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with this library; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
23 * FIXME: CheckToolbar: handle the "new folder" and "folder up" button
28 - Load/Save the view state from/into the stream provided by the ShellBrowser.
29 - When editing starts on item, set edit text to for editing value.
30 - Fix shell view to handle view mode popup exec.
31 - The background context menu should have a pidl just like foreground menus. This
32 causes crashes when dynamic handlers try to use the NULL pidl.
33 - Reorder of columns doesn't work - might be bug in comctl32
41 WINE_DEFAULT_DEBUG_CHANNEL(shell
);
45 static const WCHAR SV_CLASS_NAME
[] = {'S', 'H', 'E', 'L', 'L', 'D', 'L', 'L', '_', 'D', 'e', 'f', 'V', 'i', 'e', 'w', 0};
52 } LISTVIEW_SORT_INFO
, *LPLISTVIEW_SORT_INFO
;
54 #define SHV_CHANGE_NOTIFY WM_USER + 0x1111
56 /* For the context menu of the def view, the id of the items are based on 1 because we need
57 to call TrackPopupMenu and let it use the 0 value as an indication that the menu was canceled */
58 #define CONTEXT_MENU_BASE_ID 1
61 public CWindowImpl
<CDefView
, CWindow
, CControlWinTraits
>,
62 public CComObjectRootEx
<CComMultiThreadModelNoCS
>,
65 public IShellFolderView
,
66 public IOleCommandTarget
,
70 public IServiceProvider
73 CComPtr
<IShellFolder
> m_pSFParent
;
74 CComPtr
<IShellFolder2
> m_pSF2Parent
;
75 CComPtr
<IShellFolderViewCB
> m_pShellFolderViewCB
;
76 CComPtr
<IShellBrowser
> m_pShellBrowser
;
77 CComPtr
<ICommDlgBrowser
> m_pCommDlgBrowser
;
78 CComPtr
<IShellFolderViewDual
> m_pShellFolderViewDual
;
81 FOLDERSETTINGS m_FolderSettings
;
82 HMENU m_hMenu
; /* Handle to the menu bar of the browser */
83 HMENU m_hMenuArrangeModes
; /* Handle to the popup menu with the arrange modes */
84 HMENU m_hMenuViewModes
; /* Handle to the popup menu with the view modes */
85 HMENU m_hContextMenu
; /* Handle to the open context menu */
86 BOOL m_bmenuBarInitialized
;
89 PCUITEMID_CHILD
*m_apidl
;
90 PIDLIST_ABSOLUTE m_pidlParent
;
91 LISTVIEW_SORT_INFO m_sortInfo
;
92 ULONG m_hNotify
; /* Change notification handle */
96 CComPtr
<IAdviseSink
> m_pAdvSink
;
98 CComPtr
<IDataObject
> m_pSourceDataObject
;
99 CComPtr
<IDropTarget
> m_pCurDropTarget
; /* The sub-item, which is currently dragged over */
100 CComPtr
<IDataObject
> m_pCurDataObject
; /* The dragged data-object */
101 LONG m_iDragOverItem
; /* Dragged over item's index, iff m_pCurDropTarget != NULL */
102 UINT m_cScrollDelay
; /* Send a WM_*SCROLL msg every 250 ms during drag-scroll */
103 POINT m_ptLastMousePos
; /* Mouse position at last DragOver call */
104 POINT m_ptFirstMousePos
; /* Mouse position when the drag operation started */
107 CComPtr
<IContextMenu
> m_pCM
;
113 SFVM_CUSTOMVIEWINFO_DATA m_viewinfo_data
;
116 HRESULT
_MergeToolbar();
118 HRESULT
_DoFolderViewCB(UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
123 HRESULT WINAPI
Initialize(IShellFolder
*shellFolder
);
124 HRESULT
IncludeObject(PCUITEMID_CHILD pidl
);
125 HRESULT
OnDefaultCommand();
126 HRESULT
OnStateChange(UINT uFlags
);
127 void UpdateStatusbar();
130 void UpdateListColors();
132 HRESULT
DefMessageSFVCB(UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
133 static INT CALLBACK
ListViewCompareItems(LPARAM lParam1
, LPARAM lParam2
, LPARAM lpData
);
135 PCUITEMID_CHILD
_PidlByItem(int i
);
136 PCUITEMID_CHILD
_PidlByItem(LVITEM
& lvItem
);
137 int LV_FindItemByPidl(PCUITEMID_CHILD pidl
);
138 BOOLEAN
LV_AddItem(PCUITEMID_CHILD pidl
);
139 BOOLEAN
LV_DeleteItem(PCUITEMID_CHILD pidl
);
140 BOOLEAN
LV_RenameItem(PCUITEMID_CHILD pidlOld
, PCUITEMID_CHILD pidlNew
);
141 BOOLEAN
LV_ProdItem(PCUITEMID_CHILD pidl
);
142 static INT CALLBACK
fill_list(LPVOID ptr
, LPVOID arg
);
144 HRESULT
FillFileMenu();
145 HRESULT
FillEditMenu();
146 HRESULT
FillViewMenu();
147 HRESULT
FillArrangeAsMenu(HMENU hmenuArrange
);
148 HRESULT
CheckViewMode(HMENU hmenuView
);
149 UINT
GetSelections();
150 HRESULT
OpenSelectedItems();
152 void DoActivate(UINT uState
);
153 HRESULT
drag_notify_subitem(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
154 HRESULT
InvokeContextMenuCommand(UINT uCommand
);
155 LRESULT
OnExplorerCommand(UINT uCommand
, BOOL bUseSelection
);
157 // *** IOleWindow methods ***
158 virtual HRESULT STDMETHODCALLTYPE
GetWindow(HWND
*lphwnd
);
159 virtual HRESULT STDMETHODCALLTYPE
ContextSensitiveHelp(BOOL fEnterMode
);
161 // *** IShellView methods ***
162 virtual HRESULT STDMETHODCALLTYPE
TranslateAccelerator(MSG
*pmsg
);
163 virtual HRESULT STDMETHODCALLTYPE
EnableModeless(BOOL fEnable
);
164 virtual HRESULT STDMETHODCALLTYPE
UIActivate(UINT uState
);
165 virtual HRESULT STDMETHODCALLTYPE
Refresh();
166 virtual HRESULT STDMETHODCALLTYPE
CreateViewWindow(IShellView
*psvPrevious
, LPCFOLDERSETTINGS pfs
, IShellBrowser
*psb
, RECT
*prcView
, HWND
*phWnd
);
167 virtual HRESULT STDMETHODCALLTYPE
DestroyViewWindow();
168 virtual HRESULT STDMETHODCALLTYPE
GetCurrentInfo(LPFOLDERSETTINGS pfs
);
169 virtual HRESULT STDMETHODCALLTYPE
AddPropertySheetPages(DWORD dwReserved
, LPFNSVADDPROPSHEETPAGE pfn
, LPARAM lparam
);
170 virtual HRESULT STDMETHODCALLTYPE
SaveViewState();
171 virtual HRESULT STDMETHODCALLTYPE
SelectItem(PCUITEMID_CHILD pidlItem
, SVSIF uFlags
);
172 virtual HRESULT STDMETHODCALLTYPE
GetItemObject(UINT uItem
, REFIID riid
, void **ppv
);
174 // *** IShellView2 methods ***
175 virtual HRESULT STDMETHODCALLTYPE
GetView(SHELLVIEWID
*view_guid
, ULONG view_type
);
176 virtual HRESULT STDMETHODCALLTYPE
CreateViewWindow2(LPSV2CVW2_PARAMS view_params
);
177 virtual HRESULT STDMETHODCALLTYPE
HandleRename(LPCITEMIDLIST new_pidl
);
178 virtual HRESULT STDMETHODCALLTYPE
SelectAndPositionItem(LPCITEMIDLIST item
, UINT flags
, POINT
*point
);
180 // *** IShellView3 methods ***
181 virtual HRESULT STDMETHODCALLTYPE
CreateViewWindow3(IShellBrowser
*psb
, IShellView
*psvPrevious
, SV3CVW3_FLAGS view_flags
, FOLDERFLAGS mask
, FOLDERFLAGS flags
, FOLDERVIEWMODE mode
, const SHELLVIEWID
*view_id
, RECT
*prcView
, HWND
*hwnd
);
183 // *** IFolderView methods ***
184 virtual HRESULT STDMETHODCALLTYPE
GetCurrentViewMode(UINT
*pViewMode
);
185 virtual HRESULT STDMETHODCALLTYPE
SetCurrentViewMode(UINT ViewMode
);
186 virtual HRESULT STDMETHODCALLTYPE
GetFolder(REFIID riid
, void **ppv
);
187 virtual HRESULT STDMETHODCALLTYPE
Item(int iItemIndex
, PITEMID_CHILD
*ppidl
);
188 virtual HRESULT STDMETHODCALLTYPE
ItemCount(UINT uFlags
, int *pcItems
);
189 virtual HRESULT STDMETHODCALLTYPE
Items(UINT uFlags
, REFIID riid
, void **ppv
);
190 virtual HRESULT STDMETHODCALLTYPE
GetSelectionMarkedItem(int *piItem
);
191 virtual HRESULT STDMETHODCALLTYPE
GetFocusedItem(int *piItem
);
192 virtual HRESULT STDMETHODCALLTYPE
GetItemPosition(PCUITEMID_CHILD pidl
, POINT
*ppt
);
193 virtual HRESULT STDMETHODCALLTYPE
GetSpacing(POINT
*ppt
);
194 virtual HRESULT STDMETHODCALLTYPE
GetDefaultSpacing(POINT
*ppt
);
195 virtual HRESULT STDMETHODCALLTYPE
GetAutoArrange();
196 virtual HRESULT STDMETHODCALLTYPE
SelectItem(int iItem
, DWORD dwFlags
);
197 virtual HRESULT STDMETHODCALLTYPE
SelectAndPositionItems(UINT cidl
, PCUITEMID_CHILD_ARRAY apidl
, POINT
*apt
, DWORD dwFlags
);
199 // *** IShellFolderView methods ***
200 virtual HRESULT STDMETHODCALLTYPE
Rearrange(LPARAM sort
);
201 virtual HRESULT STDMETHODCALLTYPE
GetArrangeParam(LPARAM
*sort
);
202 virtual HRESULT STDMETHODCALLTYPE
ArrangeGrid();
203 virtual HRESULT STDMETHODCALLTYPE
AutoArrange();
204 virtual HRESULT STDMETHODCALLTYPE
AddObject(PITEMID_CHILD pidl
, UINT
*item
);
205 virtual HRESULT STDMETHODCALLTYPE
GetObject(PITEMID_CHILD
*pidl
, UINT item
);
206 virtual HRESULT STDMETHODCALLTYPE
RemoveObject(PITEMID_CHILD pidl
, UINT
*item
);
207 virtual HRESULT STDMETHODCALLTYPE
GetObjectCount(UINT
*count
);
208 virtual HRESULT STDMETHODCALLTYPE
SetObjectCount(UINT count
, UINT flags
);
209 virtual HRESULT STDMETHODCALLTYPE
UpdateObject(PITEMID_CHILD pidl_old
, PITEMID_CHILD pidl_new
, UINT
*item
);
210 virtual HRESULT STDMETHODCALLTYPE
RefreshObject(PITEMID_CHILD pidl
, UINT
*item
);
211 virtual HRESULT STDMETHODCALLTYPE
SetRedraw(BOOL redraw
);
212 virtual HRESULT STDMETHODCALLTYPE
GetSelectedCount(UINT
*count
);
213 virtual HRESULT STDMETHODCALLTYPE
GetSelectedObjects(PCUITEMID_CHILD
**pidl
, UINT
*items
);
214 virtual HRESULT STDMETHODCALLTYPE
IsDropOnSource(IDropTarget
*drop_target
);
215 virtual HRESULT STDMETHODCALLTYPE
GetDragPoint(POINT
*pt
);
216 virtual HRESULT STDMETHODCALLTYPE
GetDropPoint(POINT
*pt
);
217 virtual HRESULT STDMETHODCALLTYPE
MoveIcons(IDataObject
*obj
);
218 virtual HRESULT STDMETHODCALLTYPE
SetItemPos(PCUITEMID_CHILD pidl
, POINT
*pt
);
219 virtual HRESULT STDMETHODCALLTYPE
IsBkDropTarget(IDropTarget
*drop_target
);
220 virtual HRESULT STDMETHODCALLTYPE
SetClipboard(BOOL move
);
221 virtual HRESULT STDMETHODCALLTYPE
SetPoints(IDataObject
*obj
);
222 virtual HRESULT STDMETHODCALLTYPE
GetItemSpacing(ITEMSPACING
*spacing
);
223 virtual HRESULT STDMETHODCALLTYPE
SetCallback(IShellFolderViewCB
*new_cb
, IShellFolderViewCB
**old_cb
);
224 virtual HRESULT STDMETHODCALLTYPE
Select(UINT flags
);
225 virtual HRESULT STDMETHODCALLTYPE
QuerySupport(UINT
*support
);
226 virtual HRESULT STDMETHODCALLTYPE
SetAutomationObject(IDispatch
*disp
);
228 // *** IOleCommandTarget methods ***
229 virtual HRESULT STDMETHODCALLTYPE
QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
, OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
);
230 virtual HRESULT STDMETHODCALLTYPE
Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
);
232 // *** IDropTarget methods ***
233 virtual HRESULT STDMETHODCALLTYPE
DragEnter(IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
234 virtual HRESULT STDMETHODCALLTYPE
DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
235 virtual HRESULT STDMETHODCALLTYPE
DragLeave();
236 virtual HRESULT STDMETHODCALLTYPE
Drop(IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
238 // *** IDropSource methods ***
239 virtual HRESULT STDMETHODCALLTYPE
QueryContinueDrag(BOOL fEscapePressed
, DWORD grfKeyState
);
240 virtual HRESULT STDMETHODCALLTYPE
GiveFeedback(DWORD dwEffect
);
242 // *** IViewObject methods ***
243 virtual HRESULT STDMETHODCALLTYPE
Draw(DWORD dwDrawAspect
, LONG lindex
, void *pvAspect
, DVTARGETDEVICE
*ptd
,
244 HDC hdcTargetDev
, HDC hdcDraw
, LPCRECTL lprcBounds
, LPCRECTL lprcWBounds
,
245 BOOL ( STDMETHODCALLTYPE
*pfnContinue
)(ULONG_PTR dwContinue
), ULONG_PTR dwContinue
);
246 virtual HRESULT STDMETHODCALLTYPE
GetColorSet(DWORD dwDrawAspect
, LONG lindex
, void *pvAspect
,
247 DVTARGETDEVICE
*ptd
, HDC hicTargetDev
, LOGPALETTE
**ppColorSet
);
248 virtual HRESULT STDMETHODCALLTYPE
Freeze(DWORD dwDrawAspect
, LONG lindex
, void *pvAspect
, DWORD
*pdwFreeze
);
249 virtual HRESULT STDMETHODCALLTYPE
Unfreeze(DWORD dwFreeze
);
250 virtual HRESULT STDMETHODCALLTYPE
SetAdvise(DWORD aspects
, DWORD advf
, IAdviseSink
*pAdvSink
);
251 virtual HRESULT STDMETHODCALLTYPE
GetAdvise(DWORD
*pAspects
, DWORD
*pAdvf
, IAdviseSink
**ppAdvSink
);
253 // *** IServiceProvider methods ***
254 virtual HRESULT STDMETHODCALLTYPE
QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
);
257 LRESULT
OnShowWindow(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
258 LRESULT
OnGetDlgCode(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
259 LRESULT
OnDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
260 LRESULT
OnEraseBackground(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
261 LRESULT
OnPrintClient(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
262 LRESULT
OnSysColorChange(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
263 LRESULT
OnGetShellBrowser(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
264 LRESULT
OnNCCreate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
265 LRESULT
OnNCDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
266 LRESULT
OnCreate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
267 LRESULT
OnContextMenu(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
268 LRESULT
OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
269 LRESULT
OnActivate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
270 LRESULT
OnSetFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
271 LRESULT
OnKillFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
272 LRESULT
OnCommand(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
273 LRESULT
OnNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
274 LRESULT
OnChangeNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
275 LRESULT
OnCustomItem(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
276 LRESULT
OnSettingChange(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
277 LRESULT
OnInitMenuPopup(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
279 static ATL::CWndClassInfo
& GetWndClassInfo()
281 static ATL::CWndClassInfo wc
=
283 { sizeof(WNDCLASSEX
), CS_PARENTDC
, StartWindowProc
,
285 LoadCursor(NULL
, IDC_ARROW
), NULL
, NULL
, SV_CLASS_NAME
, NULL
287 NULL
, NULL
, IDC_ARROW
, TRUE
, 0, _T("")
292 virtual WNDPROC
GetWindowProc()
297 static LRESULT CALLBACK
WindowProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
302 // Must hold a reference during message handling
303 pThis
= reinterpret_cast<CDefView
*>(hWnd
);
305 result
= CWindowImpl
<CDefView
, CWindow
, CControlWinTraits
>::WindowProc(hWnd
, uMsg
, wParam
, lParam
);
310 BEGIN_MSG_MAP(CDefView
)
311 MESSAGE_HANDLER(WM_SIZE
, OnSize
)
312 MESSAGE_HANDLER(WM_SETFOCUS
, OnSetFocus
)
313 MESSAGE_HANDLER(WM_KILLFOCUS
, OnKillFocus
)
314 MESSAGE_HANDLER(WM_NCCREATE
, OnNCCreate
)
315 MESSAGE_HANDLER(WM_NCDESTROY
, OnNCDestroy
)
316 MESSAGE_HANDLER(WM_CREATE
, OnCreate
)
317 MESSAGE_HANDLER(WM_ACTIVATE
, OnActivate
)
318 MESSAGE_HANDLER(WM_NOTIFY
, OnNotify
)
319 MESSAGE_HANDLER(WM_COMMAND
, OnCommand
)
320 MESSAGE_HANDLER(SHV_CHANGE_NOTIFY
, OnChangeNotify
)
321 MESSAGE_HANDLER(WM_CONTEXTMENU
, OnContextMenu
)
322 MESSAGE_HANDLER(WM_DRAWITEM
, OnCustomItem
)
323 MESSAGE_HANDLER(WM_MEASUREITEM
, OnCustomItem
)
324 MESSAGE_HANDLER(WM_SHOWWINDOW
, OnShowWindow
)
325 MESSAGE_HANDLER(WM_GETDLGCODE
, OnGetDlgCode
)
326 MESSAGE_HANDLER(WM_DESTROY
, OnDestroy
)
327 MESSAGE_HANDLER(WM_ERASEBKGND
, OnEraseBackground
)
328 MESSAGE_HANDLER(WM_PRINTCLIENT
, OnPrintClient
)
329 MESSAGE_HANDLER(WM_SYSCOLORCHANGE
, OnSysColorChange
)
330 MESSAGE_HANDLER(CWM_GETISHELLBROWSER
, OnGetShellBrowser
)
331 MESSAGE_HANDLER(WM_SETTINGCHANGE
, OnSettingChange
)
332 MESSAGE_HANDLER(WM_INITMENUPOPUP
, OnInitMenuPopup
)
335 BEGIN_COM_MAP(CDefView
)
336 // Windows returns E_NOINTERFACE for IOleWindow
337 // COM_INTERFACE_ENTRY_IID(IID_IOleWindow, IOleWindow)
338 COM_INTERFACE_ENTRY_IID(IID_IShellView
, IShellView
)
339 COM_INTERFACE_ENTRY_IID(IID_CDefView
, IShellView
)
340 COM_INTERFACE_ENTRY_IID(IID_IShellView2
, IShellView2
)
341 COM_INTERFACE_ENTRY_IID(IID_IFolderView
, IFolderView
)
342 COM_INTERFACE_ENTRY_IID(IID_IShellFolderView
, IShellFolderView
)
343 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget
, IOleCommandTarget
)
344 COM_INTERFACE_ENTRY_IID(IID_IDropTarget
, IDropTarget
)
345 COM_INTERFACE_ENTRY_IID(IID_IDropSource
, IDropSource
)
346 COM_INTERFACE_ENTRY_IID(IID_IViewObject
, IViewObject
)
347 COM_INTERFACE_ENTRY_IID(IID_IServiceProvider
, IServiceProvider
)
352 #define IDM_VIEW_FILES (FCIDM_SHVIEWFIRST + 0x500)
353 #define IDM_VIEW_IDW (FCIDM_SHVIEWFIRST + 0x501)
354 #define IDM_MYFILEITEM (FCIDM_SHVIEWFIRST + 0x502)
356 #define ID_LISTVIEW 1
359 #define GET_WM_COMMAND_ID(wp, lp) LOWORD(wp)
360 #define GET_WM_COMMAND_HWND(wp, lp) (HWND)(lp)
361 #define GET_WM_COMMAND_CMD(wp, lp) HIWORD(wp)
363 typedef void (CALLBACK
*PFNSHGETSETTINGSPROC
)(LPSHELLFLAGSTATE lpsfs
, DWORD dwMask
);
365 CDefView::CDefView() :
369 m_hMenuArrangeModes(NULL
),
370 m_hMenuViewModes(NULL
),
371 m_hContextMenu(NULL
),
372 m_bmenuBarInitialized(FALSE
),
386 ZeroMemory(&m_FolderSettings
, sizeof(m_FolderSettings
));
387 ZeroMemory(&m_sortInfo
, sizeof(m_sortInfo
));
388 ZeroMemory(&m_ptLastMousePos
, sizeof(m_ptLastMousePos
));
389 ZeroMemory(&m_Category
, sizeof(m_Category
));
390 m_viewinfo_data
.clrText
= GetSysColor(COLOR_WINDOWTEXT
);
391 m_viewinfo_data
.clrTextBack
= GetSysColor(COLOR_WINDOW
);
392 m_viewinfo_data
.hbmBack
= NULL
;
395 CDefView::~CDefView()
397 TRACE(" destroying IShellView(%p)\n", this);
399 if (m_viewinfo_data
.hbmBack
)
401 ::DeleteObject(m_viewinfo_data
.hbmBack
);
402 m_viewinfo_data
.hbmBack
= NULL
;
413 HRESULT WINAPI
CDefView::Initialize(IShellFolder
*shellFolder
)
415 m_pSFParent
= shellFolder
;
416 shellFolder
->QueryInterface(IID_PPV_ARG(IShellFolder2
, &m_pSF2Parent
));
421 /**********************************************************
423 * ##### helperfunctions for communication with ICommDlgBrowser #####
425 HRESULT
CDefView::IncludeObject(PCUITEMID_CHILD pidl
)
429 if (m_pCommDlgBrowser
.p
!= NULL
)
431 TRACE("ICommDlgBrowser::IncludeObject pidl=%p\n", pidl
);
432 ret
= m_pCommDlgBrowser
->IncludeObject(this, pidl
);
433 TRACE("-- returns 0x%08x\n", ret
);
439 HRESULT
CDefView::OnDefaultCommand()
441 HRESULT ret
= S_FALSE
;
443 if (m_pCommDlgBrowser
.p
!= NULL
)
445 TRACE("ICommDlgBrowser::OnDefaultCommand\n");
446 ret
= m_pCommDlgBrowser
->OnDefaultCommand(this);
447 TRACE("-- returns 0x%08x\n", ret
);
453 HRESULT
CDefView::OnStateChange(UINT uFlags
)
455 HRESULT ret
= S_FALSE
;
457 if (m_pCommDlgBrowser
.p
!= NULL
)
459 TRACE("ICommDlgBrowser::OnStateChange flags=%x\n", uFlags
);
460 ret
= m_pCommDlgBrowser
->OnStateChange(this, uFlags
);
466 /**********************************************************
467 * set the toolbar of the filedialog buttons
469 * - activates the buttons from the shellbrowser according to
472 void CDefView::CheckToolbar()
478 if (m_pCommDlgBrowser
!= NULL
)
480 m_pShellBrowser
->SendControlMsg(FCW_TOOLBAR
, TB_CHECKBUTTON
,
481 FCIDM_TB_SMALLICON
, (m_FolderSettings
.ViewMode
== FVM_LIST
) ? TRUE
: FALSE
, &result
);
482 m_pShellBrowser
->SendControlMsg(FCW_TOOLBAR
, TB_CHECKBUTTON
,
483 FCIDM_TB_REPORTVIEW
, (m_FolderSettings
.ViewMode
== FVM_DETAILS
) ? TRUE
: FALSE
, &result
);
484 m_pShellBrowser
->SendControlMsg(FCW_TOOLBAR
, TB_ENABLEBUTTON
,
485 FCIDM_TB_SMALLICON
, TRUE
, &result
);
486 m_pShellBrowser
->SendControlMsg(FCW_TOOLBAR
, TB_ENABLEBUTTON
,
487 FCIDM_TB_REPORTVIEW
, TRUE
, &result
);
491 void CDefView::UpdateStatusbar()
493 WCHAR szFormat
[MAX_PATH
] = {0};
494 WCHAR szObjects
[MAX_PATH
] = {0};
497 cSelectedItems
= m_ListView
.GetSelectedCount();
500 LoadStringW(shell32_hInstance
, IDS_OBJECTS_SELECTED
, szFormat
, _countof(szFormat
));
501 StringCchPrintfW(szObjects
, MAX_PATH
, szFormat
, cSelectedItems
);
505 LoadStringW(shell32_hInstance
, IDS_OBJECTS
, szFormat
, _countof(szFormat
));
506 StringCchPrintfW(szObjects
, MAX_PATH
, szFormat
, m_ListView
.GetItemCount());
508 m_pShellBrowser
->SetStatusTextSB(szObjects
);
511 /**********************************************************
513 * ##### helperfunctions for initializing the view #####
516 /**********************************************************
517 * ShellView_CreateList()
519 * - creates the list view window
521 BOOL
CDefView::CreateList()
524 DWORD dwStyle
, dwExStyle
;
529 dwStyle
= WS_TABSTOP
| WS_VISIBLE
| WS_CHILDWINDOW
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
|
530 LVS_SHAREIMAGELISTS
| LVS_EDITLABELS
| LVS_AUTOARRANGE
;
531 dwExStyle
= WS_EX_CLIENTEDGE
;
533 if (m_FolderSettings
.fFlags
& FWF_DESKTOP
)
534 dwStyle
|= LVS_ALIGNLEFT
;
536 dwStyle
|= LVS_ALIGNTOP
| LVS_SHOWSELALWAYS
;
538 ViewMode
= m_FolderSettings
.ViewMode
;
539 hr
= _DoFolderViewCB(SFVM_DEFVIEWMODE
, NULL
, (LPARAM
)&ViewMode
);
542 if (ViewMode
>= FVM_FIRST
&& ViewMode
<= FVM_LAST
)
543 m_FolderSettings
.ViewMode
= ViewMode
;
545 ERR("Ignoring invalid ViewMode from SFVM_DEFVIEWMODE: %u (was: %u)\n", ViewMode
, m_FolderSettings
.ViewMode
);
548 switch (m_FolderSettings
.ViewMode
)
555 dwStyle
|= LVS_REPORT
;
559 dwStyle
|= LVS_SMALLICON
;
571 if (m_FolderSettings
.fFlags
& FWF_AUTOARRANGE
)
572 dwStyle
|= LVS_AUTOARRANGE
;
574 if (m_FolderSettings
.fFlags
& FWF_DESKTOP
)
575 m_FolderSettings
.fFlags
|= FWF_NOCLIENTEDGE
| FWF_NOSCROLL
;
577 if (m_FolderSettings
.fFlags
& FWF_SINGLESEL
)
578 dwStyle
|= LVS_SINGLESEL
;
580 if (m_FolderSettings
.fFlags
& FWF_NOCLIENTEDGE
)
581 dwExStyle
&= ~WS_EX_CLIENTEDGE
;
583 RECT rcListView
= {0,0,0,0};
584 m_ListView
.Create(m_hWnd
, rcListView
, L
"FolderView", dwStyle
, dwExStyle
, ID_LISTVIEW
);
589 m_sortInfo
.bIsAscending
= TRUE
;
590 m_sortInfo
.nHeaderID
= -1;
591 m_sortInfo
.nLastHeaderID
= -1;
593 /* UpdateShellSettings(); */
597 void CDefView::UpdateListColors()
599 if (m_FolderSettings
.fFlags
& FWF_DESKTOP
)
601 /* Check if drop shadows option is enabled */
602 BOOL bDropShadow
= FALSE
;
603 DWORD cbDropShadow
= sizeof(bDropShadow
);
606 * The desktop ListView always take the default desktop colours, by
607 * remaining transparent and letting user32/win32k paint itself the
608 * desktop background color, if any.
610 m_ListView
.SetBkColor(CLR_NONE
);
612 SHGetValueW(HKEY_CURRENT_USER
, L
"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced",
613 L
"ListviewShadow", NULL
, &bDropShadow
, &cbDropShadow
);
616 /* Set the icon background transparent */
617 m_ListView
.SetTextBkColor(CLR_NONE
);
618 m_ListView
.SetTextColor(RGB(255, 255, 255));
619 m_ListView
.SetExtendedListViewStyle(LVS_EX_TRANSPARENTSHADOWTEXT
, LVS_EX_TRANSPARENTSHADOWTEXT
);
623 /* Set the icon background as the same colour as the desktop */
624 COLORREF crDesktop
= GetSysColor(COLOR_DESKTOP
);
625 m_ListView
.SetTextBkColor(crDesktop
);
626 if (GetRValue(crDesktop
) + GetGValue(crDesktop
) + GetBValue(crDesktop
) > 128 * 3)
627 m_ListView
.SetTextColor(RGB(0, 0, 0));
629 m_ListView
.SetTextColor(RGB(255, 255, 255));
630 m_ListView
.SetExtendedListViewStyle(0, LVS_EX_TRANSPARENTSHADOWTEXT
);
635 // text background color
636 COLORREF clrTextBack
= m_viewinfo_data
.clrTextBack
;
637 m_ListView
.SetTextBkColor(clrTextBack
);
641 if (m_viewinfo_data
.clrText
!= CLR_INVALID
)
642 clrText
= m_viewinfo_data
.clrText
;
644 clrText
= GetSysColor(COLOR_WINDOWTEXT
);
646 m_ListView
.SetTextColor(clrText
);
648 // Background is painted by the parent via WM_PRINTCLIENT.
649 m_ListView
.SetExtendedListViewStyle(LVS_EX_TRANSPARENTBKGND
, LVS_EX_TRANSPARENTBKGND
);
653 /**********************************************************
654 * ShellView_InitList()
656 * - adds all needed columns to the shellview
658 BOOL
CDefView::InitList()
662 HIMAGELIST big_icons
, small_icons
;
666 m_ListView
.DeleteAllItems();
668 m_hMenuArrangeModes
= CreateMenu();
672 for (int i
= 0; 1; i
++)
674 if (FAILED(m_pSF2Parent
->GetDetailsOf(NULL
, i
, &sd
)))
676 StrRetToStrNW( szTemp
, 50, &sd
.str
, NULL
);
677 m_ListView
.InsertColumn(i
, szTemp
, sd
.fmt
, sd
.cxChar
* 8);
679 InsertMenuW(m_hMenuArrangeModes
, -1, MF_STRING
, 0x30 + i
, szTemp
);
682 InsertMenuW(m_hMenuArrangeModes
, -1, MF_BYPOSITION
| MF_SEPARATOR
, 0, 0);
686 FIXME("no m_pSF2Parent\n");
689 Shell_GetImageLists(&big_icons
, &small_icons
);
690 m_ListView
.SetImageList(big_icons
, LVSIL_NORMAL
);
691 m_ListView
.SetImageList(small_icons
, LVSIL_SMALL
);
696 /*************************************************************************
697 * ShellView_ListViewCompareItems
699 * Compare Function for the Listview (FileOpen Dialog)
702 * lParam1 [I] the first ItemIdList to compare with
703 * lParam2 [I] the second ItemIdList to compare with
704 * lpData [I] The column ID for the header Ctrl to process
707 * A negative value if the first item should precede the second,
708 * a positive value if the first item should follow the second,
709 * or zero if the two items are equivalent
711 INT CALLBACK
CDefView::ListViewCompareItems(LPARAM lParam1
, LPARAM lParam2
, LPARAM lpData
)
713 PCUIDLIST_RELATIVE pidl1
= reinterpret_cast<PCUIDLIST_RELATIVE
>(lParam1
);
714 PCUIDLIST_RELATIVE pidl2
= reinterpret_cast<PCUIDLIST_RELATIVE
>(lParam2
);
715 CDefView
*pThis
= reinterpret_cast<CDefView
*>(lpData
);
717 HRESULT hres
= pThis
->m_pSFParent
->CompareIDs(pThis
->m_sortInfo
.nHeaderID
, pidl1
, pidl2
);
718 if (FAILED_UNEXPECTEDLY(hres
))
721 SHORT nDiff
= HRESULT_CODE(hres
);
722 if (!pThis
->m_sortInfo
.bIsAscending
)
727 BOOL
CDefView::_Sort()
732 if (m_ListView
.GetWindowLongPtr(GWL_STYLE
) & LVS_NOSORTHEADER
)
735 hHeader
= (HWND
)m_ListView
.SendMessage(LVM_GETHEADER
, 0, 0);
736 ZeroMemory(&hColumn
, sizeof(hColumn
));
738 /* If the sorting column changed, remove the sorting style from the old column */
739 if ( (m_sortInfo
.nLastHeaderID
!= -1) &&
740 (m_sortInfo
.nLastHeaderID
!= m_sortInfo
.nHeaderID
) )
742 hColumn
.mask
= HDI_FORMAT
;
743 Header_GetItem(hHeader
, m_sortInfo
.nLastHeaderID
, &hColumn
);
744 hColumn
.fmt
&= ~(HDF_SORTUP
| HDF_SORTDOWN
);
745 Header_SetItem(hHeader
, m_sortInfo
.nLastHeaderID
, &hColumn
);
748 /* Set the sorting style to the new column */
749 hColumn
.mask
= HDI_FORMAT
;
750 Header_GetItem(hHeader
, m_sortInfo
.nHeaderID
, &hColumn
);
752 hColumn
.fmt
&= (m_sortInfo
.bIsAscending
? ~HDF_SORTDOWN
: ~HDF_SORTUP
);
753 hColumn
.fmt
|= (m_sortInfo
.bIsAscending
? HDF_SORTUP
: HDF_SORTDOWN
);
754 Header_SetItem(hHeader
, m_sortInfo
.nHeaderID
, &hColumn
);
756 /* Sort the list, using the current values of nHeaderID and bIsAscending */
757 m_sortInfo
.nLastHeaderID
= m_sortInfo
.nHeaderID
;
758 return m_ListView
.SortItems(ListViewCompareItems
, this);
761 PCUITEMID_CHILD
CDefView::_PidlByItem(int i
)
763 return reinterpret_cast<PCUITEMID_CHILD
>(m_ListView
.GetItemData(i
));
766 PCUITEMID_CHILD
CDefView::_PidlByItem(LVITEM
& lvItem
)
768 return reinterpret_cast<PCUITEMID_CHILD
>(lvItem
.lParam
);
771 /**********************************************************
772 * LV_FindItemByPidl()
774 int CDefView::LV_FindItemByPidl(PCUITEMID_CHILD pidl
)
776 int cItems
= m_ListView
.GetItemCount();
778 for (int i
= 0; i
<cItems
; i
++)
780 PCUITEMID_CHILD currentpidl
= _PidlByItem(i
);
781 HRESULT hr
= m_pSFParent
->CompareIDs(0, pidl
, currentpidl
);
783 if (SUCCEEDED(hr
) && !HRESULT_CODE(hr
))
791 /**********************************************************
794 BOOLEAN
CDefView::LV_AddItem(PCUITEMID_CHILD pidl
)
798 TRACE("(%p)(pidl=%p)\n", this, pidl
);
800 lvItem
.mask
= LVIF_TEXT
| LVIF_IMAGE
| LVIF_PARAM
; /*set the mask*/
801 lvItem
.iItem
= m_ListView
.GetItemCount(); /*add the item to the end of the list*/
803 lvItem
.lParam
= reinterpret_cast<LPARAM
>(ILClone(pidl
)); /*set the item's data*/
804 lvItem
.pszText
= LPSTR_TEXTCALLBACKW
; /*get text on a callback basis*/
805 lvItem
.iImage
= I_IMAGECALLBACK
; /*get the image on a callback basis*/
806 lvItem
.stateMask
= LVIS_CUT
;
808 if (m_ListView
.InsertItem(&lvItem
) == -1)
814 /**********************************************************
817 BOOLEAN
CDefView::LV_DeleteItem(PCUITEMID_CHILD pidl
)
821 TRACE("(%p)(pidl=%p)\n", this, pidl
);
823 nIndex
= LV_FindItemByPidl(pidl
);
825 return (-1 == m_ListView
.DeleteItem(nIndex
)) ? FALSE
: TRUE
;
828 /**********************************************************
831 BOOLEAN
CDefView::LV_RenameItem(PCUITEMID_CHILD pidlOld
, PCUITEMID_CHILD pidlNew
)
836 TRACE("(%p)(pidlold=%p pidlnew=%p)\n", this, pidlOld
, pidlNew
);
838 nItem
= LV_FindItemByPidl(pidlOld
);
842 lvItem
.mask
= LVIF_PARAM
; /* only the pidl */
843 lvItem
.iItem
= nItem
;
845 m_ListView
.GetItem(&lvItem
);
847 SHFree(reinterpret_cast<LPVOID
>(lvItem
.lParam
));
848 lvItem
.mask
= LVIF_PARAM
|LVIF_IMAGE
;
849 lvItem
.iItem
= nItem
;
851 lvItem
.lParam
= reinterpret_cast<LPARAM
>(ILClone(pidlNew
)); /* set the item's data */
852 lvItem
.iImage
= SHMapPIDLToSystemImageListIndex(m_pSFParent
, pidlNew
, 0);
853 m_ListView
.SetItem(&lvItem
);
854 m_ListView
.Update(nItem
);
855 return TRUE
; /* FIXME: better handling */
861 /**********************************************************
864 BOOLEAN
CDefView::LV_ProdItem(PCUITEMID_CHILD pidl
)
869 TRACE("(%p)(pidl=%p)\n", this, pidl
);
871 nItem
= LV_FindItemByPidl(pidl
);
875 lvItem
.mask
= LVIF_IMAGE
;
876 lvItem
.iItem
= nItem
;
878 lvItem
.iImage
= SHMapPIDLToSystemImageListIndex(m_pSFParent
, pidl
, 0);
879 m_ListView
.SetItem(&lvItem
);
880 m_ListView
.Update(nItem
);
887 /**********************************************************
888 * ShellView_FillList()
890 * - gets the objectlist from the shellfolder
892 * - fills the list into the view
894 INT CALLBACK
CDefView::fill_list(LPVOID ptr
, LPVOID arg
)
896 PITEMID_CHILD pidl
= static_cast<PITEMID_CHILD
>(ptr
);
897 CDefView
*pThis
= static_cast<CDefView
*>(arg
);
899 /* in a commdlg This works as a filemask*/
900 if (pThis
->IncludeObject(pidl
) == S_OK
)
901 pThis
->LV_AddItem(pidl
);
907 HRESULT
CDefView::FillList()
909 CComPtr
<IEnumIDList
> pEnumIDList
;
915 DWORD dFlags
= SHCONTF_NONFOLDERS
| SHCONTF_FOLDERS
;
919 /* determine if there is a setting to show all the hidden files/folders */
920 if (RegOpenKeyExW(HKEY_CURRENT_USER
, L
"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced", 0, KEY_QUERY_VALUE
, &hKey
) == ERROR_SUCCESS
)
922 DWORD dataLength
, flagVal
;
924 dataLength
= sizeof(flagVal
);
925 if (RegQueryValueExW(hKey
, L
"Hidden", NULL
, NULL
, (LPBYTE
)&flagVal
, &dataLength
) == ERROR_SUCCESS
)
927 /* if the value is 1, then show all hidden files/folders */
930 dFlags
|= SHCONTF_INCLUDEHIDDEN
;
931 m_ListView
.SendMessageW(LVM_SETCALLBACKMASK
, LVIS_CUT
, 0);
939 /* get the itemlist from the shfolder */
940 hRes
= m_pSFParent
->EnumObjects(m_hWnd
, dFlags
, &pEnumIDList
);
948 /* create a pointer array */
949 hdpa
= DPA_Create(16);
952 return(E_OUTOFMEMORY
);
955 /* copy the items into the array*/
956 while((S_OK
== pEnumIDList
->Next(1, &pidl
, &dwFetched
)) && dwFetched
)
958 if (DPA_InsertPtr(hdpa
, 0x7fff, pidl
) == -1)
964 /*turn the listview's redrawing off*/
965 m_ListView
.SetRedraw(FALSE
);
967 DPA_DestroyCallback( hdpa
, fill_list
, this);
972 m_pSF2Parent
->GetDefaultColumn(NULL
, (ULONG
*)&m_sortInfo
.nHeaderID
, NULL
);
976 FIXME("no m_pSF2Parent\n");
978 m_sortInfo
.bIsAscending
= TRUE
;
981 if (m_viewinfo_data
.hbmBack
)
983 ::DeleteObject(m_viewinfo_data
.hbmBack
);
984 m_viewinfo_data
.hbmBack
= NULL
;
987 // load custom background image and custom text color
988 m_viewinfo_data
.cbSize
= sizeof(m_viewinfo_data
);
989 _DoFolderViewCB(SFVM_GET_CUSTOMVIEWINFO
, 0, (LPARAM
)&m_viewinfo_data
);
991 /*turn the listview's redrawing back on and force it to draw*/
992 m_ListView
.SetRedraw(TRUE
);
996 if (!(m_FolderSettings
.fFlags
& FWF_DESKTOP
))
999 m_ListView
.InvalidateRect(NULL
, TRUE
);
1002 _DoFolderViewCB(SFVM_LISTREFRESHED
, NULL
, NULL
);
1007 LRESULT
CDefView::OnShowWindow(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1009 m_ListView
.UpdateWindow();
1014 LRESULT
CDefView::OnGetDlgCode(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1016 return m_ListView
.SendMessageW(uMsg
, 0, 0);
1019 LRESULT
CDefView::OnDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1026 DestroyMenu(m_hMenu
);
1029 RevokeDragDrop(m_hWnd
);
1030 SHChangeNotifyDeregister(m_hNotify
);
1032 SHFree(m_pidlParent
);
1033 m_pidlParent
= NULL
;
1039 LRESULT
CDefView::OnEraseBackground(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1041 /* redirect to parent */
1042 if (m_FolderSettings
.fFlags
& (FWF_DESKTOP
| FWF_TRANSPARENT
))
1043 return SendMessageW(GetParent(), WM_ERASEBKGND
, wParam
, lParam
);
1050 DrawTileBitmap(HDC hDC
, LPCRECT prc
, HBITMAP hbm
, INT nWidth
, INT nHeight
, INT dx
, INT dy
)
1052 INT x0
= prc
->left
, y0
= prc
->top
, x1
= prc
->right
, y1
= prc
->bottom
;
1056 HDC hMemDC
= CreateCompatibleDC(hDC
);
1057 HGDIOBJ hbmOld
= SelectObject(hMemDC
, hbm
);
1059 for (INT y
= y0
; y
< y1
; y
+= nHeight
)
1061 for (INT x
= x0
; x
< x1
; x
+= nWidth
)
1063 BitBlt(hDC
, x
, y
, nWidth
, nHeight
, hMemDC
, 0, 0, SRCCOPY
);
1067 SelectObject(hMemDC
, hbmOld
);
1071 LRESULT
CDefView::OnPrintClient(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1073 HDC hDC
= (HDC
)wParam
;
1076 ::GetClientRect(m_ListView
, &rc
);
1078 if (m_viewinfo_data
.hbmBack
)
1081 if (::GetObject(m_viewinfo_data
.hbmBack
, sizeof(BITMAP
), &bm
))
1083 INT dx
= -(::GetScrollPos(m_ListView
, SB_HORZ
) % bm
.bmWidth
);
1084 INT dy
= -(::GetScrollPos(m_ListView
, SB_VERT
) % bm
.bmHeight
);
1085 DrawTileBitmap(hDC
, &rc
, m_viewinfo_data
.hbmBack
, bm
.bmWidth
, bm
.bmHeight
, dx
, dy
);
1090 FillRect(hDC
, &rc
, GetSysColorBrush(COLOR_WINDOW
));
1098 LRESULT
CDefView::OnSysColorChange(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1100 /* Update desktop labels color */
1103 /* Forward WM_SYSCOLORCHANGE to common controls */
1104 return m_ListView
.SendMessageW(uMsg
, 0, 0);
1107 LRESULT
CDefView::OnGetShellBrowser(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1109 return reinterpret_cast<LRESULT
>(m_pShellBrowser
.p
);
1112 LRESULT
CDefView::OnNCCreate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1119 LRESULT
CDefView::OnNCDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1126 /**********************************************************
1127 * ShellView_OnCreate()
1129 LRESULT
CDefView::OnCreate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1131 CComPtr
<IDropTarget
> pdt
;
1132 SHChangeNotifyEntry ntreg
;
1133 CComPtr
<IPersistFolder2
> ppf2
;
1135 TRACE("%p\n", this);
1137 if (SUCCEEDED(QueryInterface(IID_PPV_ARG(IDropTarget
, &pdt
))))
1139 if (FAILED(RegisterDragDrop(m_hWnd
, pdt
)))
1140 ERR("Registering Drag Drop Failed");
1143 /* register for receiving notifications */
1144 m_pSFParent
->QueryInterface(IID_PPV_ARG(IPersistFolder2
, &ppf2
));
1147 ppf2
->GetCurFolder(&m_pidlParent
);
1148 ntreg
.fRecursive
= TRUE
;
1149 ntreg
.pidl
= m_pidlParent
;
1150 m_hNotify
= SHChangeNotifyRegister(m_hWnd
, SHCNRF_InterruptLevel
| SHCNRF_ShellLevel
, SHCNE_ALLEVENTS
, SHV_CHANGE_NOTIFY
, 1, &ntreg
);
1161 /* _DoFolderViewCB(SFVM_GETNOTIFY, ?? ??) */
1163 m_hAccel
= LoadAcceleratorsW(shell32_hInstance
, MAKEINTRESOURCEW(IDA_SHELLVIEW
));
1170 /**********************************************************
1171 * #### Handling of the menus ####
1174 extern "C" DWORD WINAPI
SHMenuIndexFromID(HMENU hMenu
, UINT uID
);
1176 HMENU
GetSubmenuByID(HMENU hmenu
, UINT id
)
1178 MENUITEMINFOW mii
= {sizeof(mii
), MIIM_SUBMENU
};
1179 if (::GetMenuItemInfoW(hmenu
, id
, FALSE
, &mii
))
1180 return mii
.hSubMenu
;
1185 /* ReallyGetMenuItemID returns the id of an item even if it opens a submenu,
1186 GetMenuItemID returns -1 if the specified item opens a submenu */
1187 UINT
ReallyGetMenuItemID(HMENU hmenu
, int i
)
1189 MENUITEMINFOW mii
= {sizeof(mii
), MIIM_ID
};
1190 if (::GetMenuItemInfoW(hmenu
, i
, TRUE
, &mii
))
1196 HRESULT
CDefView::FillFileMenu()
1198 HMENU hFileMenu
= GetSubmenuByID(m_hMenu
, FCIDM_MENU_FILE
);
1202 /* Cleanup the items added previously */
1203 for (int i
= GetMenuItemCount(hFileMenu
) - 1; i
>= 0; i
--)
1205 UINT id
= GetMenuItemID(hFileMenu
, i
);
1206 if (id
< FCIDM_BROWSERFIRST
|| id
> FCIDM_BROWSERLAST
)
1207 DeleteMenu(hFileMenu
, i
, MF_BYPOSITION
);
1210 /* Store the context menu in m_pCM and keep it in order to invoke the selected command later on */
1211 HRESULT hr
= GetItemObject(SVGIO_SELECTION
, IID_PPV_ARG(IContextMenu
, &m_pCM
));
1212 if (FAILED_UNEXPECTEDLY(hr
))
1215 HMENU hmenu
= CreatePopupMenu();
1217 hr
= m_pCM
->QueryContextMenu(hmenu
, 0, FCIDM_SHVIEWFIRST
, FCIDM_SHVIEWLAST
, 0);
1218 if (FAILED_UNEXPECTEDLY(hr
))
1221 // TODO: filter or something
1223 Shell_MergeMenus(hFileMenu
, hmenu
, 0, 0, 0xFFFF, MM_ADDSEPARATOR
| MM_SUBMENUSHAVEIDS
);
1225 ::DestroyMenu(hmenu
);
1230 HRESULT
CDefView::FillEditMenu()
1232 HMENU hEditMenu
= GetSubmenuByID(m_hMenu
, FCIDM_MENU_EDIT
);
1236 HMENU hmenuContents
= ::LoadMenuW(shell32_hInstance
, L
"MENU_003");
1240 Shell_MergeMenus(hEditMenu
, hmenuContents
, 0, 0, 0xFFFF, 0);
1242 ::DestroyMenu(hmenuContents
);
1247 HRESULT
CDefView::FillViewMenu()
1249 HMENU hViewMenu
= GetSubmenuByID(m_hMenu
, FCIDM_MENU_VIEW
);
1253 m_hMenuViewModes
= ::LoadMenuW(shell32_hInstance
, L
"MENU_001");
1254 if (!m_hMenuViewModes
)
1257 UINT i
= SHMenuIndexFromID(hViewMenu
, FCIDM_MENU_VIEW_SEP_OPTIONS
);
1258 Shell_MergeMenus(hViewMenu
, m_hMenuViewModes
, i
, 0, 0xFFFF, MM_ADDSEPARATOR
| MM_DONTREMOVESEPS
| MM_SUBMENUSHAVEIDS
);
1263 HRESULT
CDefView::FillArrangeAsMenu(HMENU hmenuArrange
)
1265 /* We only need to fill this once */
1266 if (GetMenuItemID(hmenuArrange
, 0) == FCIDM_SHVIEW_AUTOARRANGE
)
1268 Shell_MergeMenus(hmenuArrange
, m_hMenuArrangeModes
, 0, 0, 0xFFFF,0);
1271 /* Also check the menu item according to which we sort */
1272 CheckMenuRadioItem(hmenuArrange
,
1275 m_sortInfo
.nHeaderID
+ 0x30,
1278 if (m_FolderSettings
.ViewMode
== FVM_DETAILS
|| m_FolderSettings
.ViewMode
== FVM_LIST
)
1280 EnableMenuItem(hmenuArrange
, FCIDM_SHVIEW_AUTOARRANGE
, MF_BYCOMMAND
| MF_GRAYED
);
1284 EnableMenuItem(hmenuArrange
, FCIDM_SHVIEW_AUTOARRANGE
, MF_BYCOMMAND
);
1286 if (GetAutoArrange() == S_OK
)
1287 CheckMenuItem(hmenuArrange
, FCIDM_SHVIEW_AUTOARRANGE
, MF_CHECKED
);
1294 HRESULT
CDefView::CheckViewMode(HMENU hmenuView
)
1296 if (m_FolderSettings
.ViewMode
>= FVM_FIRST
&& m_FolderSettings
.ViewMode
<= FVM_LAST
)
1298 UINT iItemFirst
= FCIDM_SHVIEW_BIGICON
;
1299 UINT iItemLast
= iItemFirst
+ FVM_LAST
- FVM_FIRST
;
1300 UINT iItem
= iItemFirst
+ m_FolderSettings
.ViewMode
- FVM_FIRST
;
1301 CheckMenuRadioItem(hmenuView
, iItemFirst
, iItemLast
, iItem
, MF_BYCOMMAND
);
1307 /**********************************************************
1308 * ShellView_GetSelections()
1310 * - fills the m_apidl list with the selected objects
1313 * number of selected items
1315 UINT
CDefView::GetSelections()
1319 m_cidl
= m_ListView
.GetSelectedCount();
1320 m_apidl
= static_cast<PCUITEMID_CHILD
*>(SHAlloc(m_cidl
* sizeof(PCUITEMID_CHILD
)));
1327 TRACE("-- Items selected =%u\n", m_cidl
);
1331 while ((lvIndex
= m_ListView
.GetNextItem(lvIndex
, LVNI_SELECTED
)) > -1)
1333 m_apidl
[i
] = _PidlByItem(lvIndex
);
1337 TRACE("-- selected Item found\n");
1343 HRESULT
CDefView::InvokeContextMenuCommand(UINT uCommand
)
1345 CMINVOKECOMMANDINFO cmi
;
1347 ZeroMemory(&cmi
, sizeof(cmi
));
1348 cmi
.cbSize
= sizeof(cmi
);
1349 cmi
.lpVerb
= MAKEINTRESOURCEA(uCommand
);
1352 if (GetKeyState(VK_SHIFT
) & 0x8000)
1353 cmi
.fMask
|= CMIC_MASK_SHIFT_DOWN
;
1355 if (GetKeyState(VK_CONTROL
) & 0x8000)
1356 cmi
.fMask
|= CMIC_MASK_CONTROL_DOWN
;
1358 HRESULT hr
= m_pCM
->InvokeCommand(&cmi
);
1359 if (FAILED_UNEXPECTEDLY(hr
))
1365 /**********************************************************
1366 * ShellView_OpenSelectedItems()
1368 HRESULT
CDefView::OpenSelectedItems()
1374 m_cidl
= m_ListView
.GetSelectedCount();
1378 hResult
= OnDefaultCommand();
1379 if (hResult
== S_OK
)
1382 hMenu
= CreatePopupMenu();
1386 hResult
= GetItemObject(SVGIO_SELECTION
, IID_PPV_ARG(IContextMenu
, &m_pCM
));
1387 if (FAILED_UNEXPECTEDLY(hResult
))
1390 hResult
= m_pCM
->QueryContextMenu(hMenu
, 0, FCIDM_SHVIEWFIRST
, FCIDM_SHVIEWLAST
, CMF_DEFAULTONLY
);
1391 if (FAILED_UNEXPECTEDLY(hResult
))
1394 uCommand
= GetMenuDefaultItem(hMenu
, FALSE
, 0);
1395 if (uCommand
== (UINT
)-1)
1401 InvokeContextMenuCommand(uCommand
);
1410 IUnknown_SetSite(m_pCM
, NULL
);
1417 /**********************************************************
1418 * ShellView_DoContextMenu()
1420 LRESULT
CDefView::OnContextMenu(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1426 TRACE("(%p)\n", this);
1428 m_hContextMenu
= CreatePopupMenu();
1429 if (!m_hContextMenu
)
1432 m_cidl
= m_ListView
.GetSelectedCount();
1434 hResult
= GetItemObject( m_cidl
? SVGIO_SELECTION
: SVGIO_BACKGROUND
, IID_PPV_ARG(IContextMenu
, &m_pCM
));
1435 if (FAILED_UNEXPECTEDLY(hResult
))
1438 /* Use 1 as the first id as we want 0 the mean that the user canceled the menu */
1439 hResult
= m_pCM
->QueryContextMenu(m_hContextMenu
, 0, CONTEXT_MENU_BASE_ID
, FCIDM_SHVIEWLAST
, CMF_NORMAL
);
1440 if (FAILED_UNEXPECTEDLY(hResult
))
1443 /* There is no position requested, so try to find one */
1446 HWND hFocus
= ::GetFocus();
1450 if (hFocus
== m_ListView
.m_hWnd
|| m_ListView
.IsChild(hFocus
))
1452 /* Is there an item focused and selected? */
1453 lvIndex
= m_ListView
.GetNextItem(-1, LVIS_SELECTED
|LVIS_FOCUSED
);
1454 /* If not, find the first selected item */
1456 lvIndex
= m_ListView
.GetNextItem(-1, LVIS_SELECTED
);
1459 /* We got something */
1462 /* Let's find the center of the icon */
1463 RECT rc
= { LVIR_ICON
};
1464 m_ListView
.SendMessage(LVM_GETITEMRECT
, lvIndex
, (LPARAM
)&rc
);
1465 pt
.x
= (rc
.right
+ rc
.left
) / 2;
1466 pt
.y
= (rc
.bottom
+ rc
.top
) / 2;
1470 /* We have to drop it somewhere.. */
1474 m_ListView
.ClientToScreen(&pt
);
1480 x
= GET_X_LPARAM(lParam
);
1481 y
= GET_Y_LPARAM(lParam
);
1484 uCommand
= TrackPopupMenu(m_hContextMenu
,
1485 TPM_LEFTALIGN
| TPM_RETURNCMD
| TPM_LEFTBUTTON
| TPM_RIGHTBUTTON
,
1486 x
, y
, 0, m_hWnd
, NULL
);
1490 if (uCommand
== FCIDM_SHVIEW_OPEN
&& OnDefaultCommand() == S_OK
)
1493 InvokeContextMenuCommand(uCommand
- CONTEXT_MENU_BASE_ID
);
1498 IUnknown_SetSite(m_pCM
, NULL
);
1504 DestroyMenu(m_hContextMenu
);
1505 m_hContextMenu
= NULL
;
1511 LRESULT
CDefView::OnExplorerCommand(UINT uCommand
, BOOL bUseSelection
)
1516 hMenu
= CreatePopupMenu();
1520 hResult
= GetItemObject( bUseSelection
? SVGIO_SELECTION
: SVGIO_BACKGROUND
, IID_PPV_ARG(IContextMenu
, &m_pCM
));
1521 if (FAILED_UNEXPECTEDLY( hResult
))
1524 hResult
= m_pCM
->QueryContextMenu(hMenu
, 0, FCIDM_SHVIEWFIRST
, FCIDM_SHVIEWLAST
, CMF_NORMAL
);
1525 if (FAILED_UNEXPECTEDLY( hResult
))
1528 InvokeContextMenuCommand(uCommand
);
1533 IUnknown_SetSite(m_pCM
, NULL
);
1543 /**********************************************************
1544 * ##### message handling #####
1547 /**********************************************************
1548 * ShellView_OnSize()
1550 LRESULT
CDefView::OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1552 WORD wWidth
, wHeight
;
1554 wWidth
= LOWORD(lParam
);
1555 wHeight
= HIWORD(lParam
);
1557 TRACE("%p width=%u height=%u\n", this, wWidth
, wHeight
);
1559 /* Resize the ListView to fit our window */
1562 ::MoveWindow(m_ListView
, 0, 0, wWidth
, wHeight
, TRUE
);
1565 _DoFolderViewCB(SFVM_SIZE
, 0, 0);
1570 /**********************************************************
1571 * ShellView_OnDeactivate()
1576 void CDefView::OnDeactivate()
1578 TRACE("%p\n", this);
1580 if (m_uState
!= SVUIA_DEACTIVATE
)
1582 // TODO: cleanup menu after deactivation
1584 m_uState
= SVUIA_DEACTIVATE
;
1588 void CDefView::DoActivate(UINT uState
)
1590 TRACE("%p uState=%x\n", this, uState
);
1592 /*don't do anything if the state isn't really changing */
1593 if (m_uState
== uState
)
1598 if (uState
== SVUIA_DEACTIVATE
)
1604 if(m_hMenu
&& !m_bmenuBarInitialized
)
1608 m_pShellBrowser
->SetMenuSB(m_hMenu
, 0, m_hWnd
);
1609 m_bmenuBarInitialized
= TRUE
;
1612 if (SVUIA_ACTIVATE_FOCUS
== uState
)
1614 m_ListView
.SetFocus();
1622 /**********************************************************
1623 * ShellView_OnActivate()
1625 LRESULT
CDefView::OnActivate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1627 DoActivate(SVUIA_ACTIVATE_FOCUS
);
1631 /**********************************************************
1632 * ShellView_OnSetFocus()
1635 LRESULT
CDefView::OnSetFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1637 TRACE("%p\n", this);
1639 /* Tell the browser one of our windows has received the focus. This
1640 should always be done before merging menus (OnActivate merges the
1641 menus) if one of our windows has the focus.*/
1643 m_pShellBrowser
->OnViewWindowActive(this);
1644 DoActivate(SVUIA_ACTIVATE_FOCUS
);
1646 /* Set the focus to the listview */
1647 m_ListView
.SetFocus();
1649 /* Notify the ICommDlgBrowser interface */
1650 OnStateChange(CDBOSC_SETFOCUS
);
1655 /**********************************************************
1656 * ShellView_OnKillFocus()
1658 LRESULT
CDefView::OnKillFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1660 TRACE("(%p) stub\n", this);
1662 DoActivate(SVUIA_ACTIVATE_NOFOCUS
);
1663 /* Notify the ICommDlgBrowser */
1664 OnStateChange(CDBOSC_KILLFOCUS
);
1669 /**********************************************************
1670 * ShellView_OnCommand()
1673 * the CmdID's are the ones from the context menu
1675 LRESULT
CDefView::OnCommand(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1682 dwCmdID
= GET_WM_COMMAND_ID(wParam
, lParam
);
1683 dwCmd
= GET_WM_COMMAND_CMD(wParam
, lParam
);
1684 hwndCmd
= GET_WM_COMMAND_HWND(wParam
, lParam
);
1686 TRACE("(%p)->(0x%08x 0x%08x %p) stub\n", this, dwCmdID
, dwCmd
, hwndCmd
);
1690 case FCIDM_SHVIEW_SMALLICON
:
1691 m_FolderSettings
.ViewMode
= FVM_SMALLICON
;
1692 m_ListView
.ModifyStyle(LVS_TYPEMASK
, LVS_SMALLICON
);
1696 case FCIDM_SHVIEW_BIGICON
:
1697 m_FolderSettings
.ViewMode
= FVM_ICON
;
1698 m_ListView
.ModifyStyle(LVS_TYPEMASK
, LVS_ICON
);
1702 case FCIDM_SHVIEW_LISTVIEW
:
1703 m_FolderSettings
.ViewMode
= FVM_LIST
;
1704 m_ListView
.ModifyStyle(LVS_TYPEMASK
, LVS_LIST
);
1708 case FCIDM_SHVIEW_REPORTVIEW
:
1709 m_FolderSettings
.ViewMode
= FVM_DETAILS
;
1710 m_ListView
.ModifyStyle(LVS_TYPEMASK
, LVS_REPORT
);
1714 /* the menu-ID's for sorting are 0x30... see shrec.rc */
1719 m_sortInfo
.nHeaderID
= dwCmdID
- 0x30;
1720 m_sortInfo
.bIsAscending
= TRUE
;
1724 case FCIDM_SHVIEW_SNAPTOGRID
:
1727 case FCIDM_SHVIEW_AUTOARRANGE
:
1728 if (GetAutoArrange() == S_OK
)
1729 m_ListView
.ModifyStyle(LVS_AUTOARRANGE
, 0);
1733 case FCIDM_SHVIEW_SELECTALL
:
1734 m_ListView
.SetItemState(-1, LVIS_SELECTED
, LVIS_SELECTED
);
1737 case FCIDM_SHVIEW_INVERTSELECTION
:
1738 nCount
= m_ListView
.GetItemCount();
1739 for (int i
=0; i
< nCount
; i
++)
1740 m_ListView
.SetItemState(i
, m_ListView
.GetItemState(i
, LVIS_SELECTED
) ? 0 : LVIS_SELECTED
, LVIS_SELECTED
);
1743 case FCIDM_SHVIEW_REFRESH
:
1747 case FCIDM_SHVIEW_DELETE
:
1748 case FCIDM_SHVIEW_CUT
:
1749 case FCIDM_SHVIEW_COPY
:
1750 case FCIDM_SHVIEW_RENAME
:
1751 case FCIDM_SHVIEW_PROPERTIES
:
1752 return OnExplorerCommand(dwCmdID
, TRUE
);
1754 case FCIDM_SHVIEW_INSERT
:
1755 case FCIDM_SHVIEW_UNDO
:
1756 case FCIDM_SHVIEW_INSERTLINK
:
1757 case FCIDM_SHVIEW_NEWFOLDER
:
1758 return OnExplorerCommand(dwCmdID
, FALSE
);
1760 /* WM_COMMAND messages from the file menu are routed to the CDefView so as to let m_pCM handle the command */
1761 if (m_pCM
&& dwCmd
== 0)
1763 InvokeContextMenuCommand(dwCmdID
);
1770 /**********************************************************
1771 * ShellView_OnNotify()
1774 LRESULT
CDefView::OnNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1778 LPNMLISTVIEW lpnmlv
;
1779 NMLVDISPINFOW
*lpdi
;
1780 PCUITEMID_CHILD pidl
;
1784 lpnmh
= (LPNMHDR
)lParam
;
1785 lpnmlv
= (LPNMLISTVIEW
)lpnmh
;
1786 lpdi
= (NMLVDISPINFOW
*)lpnmh
;
1788 TRACE("%p CtlID=%u lpnmh->code=%x\n", this, CtlID
, lpnmh
->code
);
1790 switch (lpnmh
->code
)
1793 TRACE("-- NM_SETFOCUS %p\n", this);
1794 OnSetFocus(0, 0, 0, unused
);
1798 TRACE("-- NM_KILLFOCUS %p\n", this);
1800 /* Notify the ICommDlgBrowser interface */
1801 OnStateChange(CDBOSC_KILLFOCUS
);
1805 TRACE("-- NM_CUSTOMDRAW %p\n", this);
1806 return CDRF_DODEFAULT
;
1808 case NM_RELEASEDCAPTURE
:
1809 TRACE("-- NM_RELEASEDCAPTURE %p\n", this);
1813 TRACE("-- NM_CLICK %p\n", this);
1817 TRACE("-- NM_RCLICK %p\n", this);
1821 TRACE("-- NM_DBLCLK %p\n", this);
1822 OpenSelectedItems();
1826 TRACE("-- NM_RETURN %p\n", this);
1827 OpenSelectedItems();
1831 TRACE("-- HDN_ENDTRACKW %p\n", this);
1832 /*nColumn1 = m_ListView.GetColumnWidth(0);
1833 nColumn2 = m_ListView.GetColumnWidth(1);*/
1836 case LVN_DELETEITEM
:
1837 TRACE("-- LVN_DELETEITEM %p\n", this);
1839 /*delete the pidl because we made a copy of it*/
1840 SHFree(reinterpret_cast<LPVOID
>(lpnmlv
->lParam
));
1844 case LVN_DELETEALLITEMS
:
1845 TRACE("-- LVN_DELETEALLITEMS %p\n", this);
1848 case LVN_INSERTITEM
:
1849 TRACE("-- LVN_INSERTITEM (STUB)%p\n", this);
1852 case LVN_ITEMACTIVATE
:
1853 TRACE("-- LVN_ITEMACTIVATE %p\n", this);
1854 OnStateChange(CDBOSC_SELCHANGE
); /* the browser will get the IDataObject now */
1857 case LVN_COLUMNCLICK
:
1858 m_sortInfo
.nHeaderID
= lpnmlv
->iSubItem
;
1859 if (m_sortInfo
.nLastHeaderID
== m_sortInfo
.nHeaderID
)
1860 m_sortInfo
.bIsAscending
= !m_sortInfo
.bIsAscending
;
1862 m_sortInfo
.bIsAscending
= TRUE
;
1866 case LVN_GETDISPINFOA
:
1867 case LVN_GETDISPINFOW
:
1868 TRACE("-- LVN_GETDISPINFO %p\n", this);
1869 pidl
= _PidlByItem(lpdi
->item
);
1871 if (lpdi
->item
.mask
& LVIF_TEXT
) /* text requested */
1876 if (FAILED_UNEXPECTEDLY(m_pSF2Parent
->GetDetailsOf(pidl
, lpdi
->item
.iSubItem
, &sd
)))
1879 if (lpnmh
->code
== LVN_GETDISPINFOA
)
1881 /* shouldn't happen */
1882 NMLVDISPINFOA
*lpdiA
= (NMLVDISPINFOA
*)lpnmh
;
1883 StrRetToStrNA( lpdiA
->item
.pszText
, lpdiA
->item
.cchTextMax
, &sd
.str
, NULL
);
1884 TRACE("-- text=%s\n", lpdiA
->item
.pszText
);
1886 else /* LVN_GETDISPINFOW */
1888 StrRetToStrNW( lpdi
->item
.pszText
, lpdi
->item
.cchTextMax
, &sd
.str
, NULL
);
1889 TRACE("-- text=%s\n", debugstr_w(lpdi
->item
.pszText
));
1894 FIXME("no m_pSF2Parent\n");
1897 if(lpdi
->item
.mask
& LVIF_IMAGE
) /* image requested */
1899 lpdi
->item
.iImage
= SHMapPIDLToSystemImageListIndex(m_pSFParent
, pidl
, 0);
1901 if(lpdi
->item
.mask
& LVIF_STATE
)
1903 ULONG attributes
= SFGAO_HIDDEN
;
1904 if (SUCCEEDED(m_pSFParent
->GetAttributesOf(1, &pidl
, &attributes
)))
1906 if (attributes
& SFGAO_HIDDEN
)
1908 lpdi
->item
.state
|= LVIS_CUT
;
1912 lpdi
->item
.mask
|= LVIF_DI_SETITEM
;
1915 case LVN_ITEMCHANGED
:
1916 TRACE("-- LVN_ITEMCHANGED %p\n", this);
1917 OnStateChange(CDBOSC_SELCHANGE
); /* the browser will get the IDataObject now */
1919 _DoFolderViewCB(SFVM_SELECTIONCHANGED
, NULL
/* FIXME */, NULL
/* FIXME */);
1923 case LVN_BEGINRDRAG
:
1924 TRACE("-- LVN_BEGINDRAG\n");
1926 if (GetSelections())
1928 CComPtr
<IDataObject
> pda
;
1929 DWORD dwAttributes
= SFGAO_CANCOPY
| SFGAO_CANLINK
;
1930 DWORD dwEffect
= DROPEFFECT_MOVE
;
1932 if (SUCCEEDED(m_pSFParent
->GetUIObjectOf(m_hWnd
, m_cidl
, m_apidl
, IID_NULL_PPV_ARG(IDataObject
, &pda
))))
1934 LPNMLISTVIEW params
= (LPNMLISTVIEW
)lParam
;
1936 if (SUCCEEDED(m_pSFParent
->GetAttributesOf(m_cidl
, m_apidl
, &dwAttributes
)))
1938 dwEffect
|= dwAttributes
& (SFGAO_CANCOPY
| SFGAO_CANLINK
);
1941 CComPtr
<IAsyncOperation
> piaso
;
1942 if (SUCCEEDED(pda
->QueryInterface(IID_PPV_ARG(IAsyncOperation
, &piaso
))))
1944 piaso
->SetAsyncMode(TRUE
);
1949 m_pSourceDataObject
= pda
;
1950 m_ptFirstMousePos
= params
->ptAction
;
1951 ClientToScreen(&m_ptFirstMousePos
);
1953 HIMAGELIST big_icons
, small_icons
;
1954 Shell_GetImageLists(&big_icons
, &small_icons
);
1955 PCUITEMID_CHILD pidl
= _PidlByItem(params
->iItem
);
1956 int iIcon
= SHMapPIDLToSystemImageListIndex(m_pSFParent
, pidl
, 0);
1958 m_ListView
.GetItemPosition(params
->iItem
, &ptItem
);
1960 ImageList_BeginDrag(big_icons
, iIcon
, params
->ptAction
.x
- ptItem
.x
, params
->ptAction
.y
- ptItem
.y
);
1962 DoDragDrop(pda
, this, dwEffect
, &dwEffect2
);
1964 m_pSourceDataObject
.Release();
1969 case LVN_BEGINLABELEDITW
:
1971 DWORD dwAttr
= SFGAO_CANRENAME
;
1972 pidl
= _PidlByItem(lpdi
->item
);
1974 TRACE("-- LVN_BEGINLABELEDITW %p\n", this);
1976 m_pSFParent
->GetAttributesOf(1, &pidl
, &dwAttr
);
1977 if (SFGAO_CANRENAME
& dwAttr
)
1985 case LVN_ENDLABELEDITW
:
1987 TRACE("-- LVN_ENDLABELEDITW %p\n", this);
1989 m_isEditing
= FALSE
;
1991 if (lpdi
->item
.pszText
)
1996 pidl
= _PidlByItem(lpdi
->item
);
1997 PITEMID_CHILD pidlNew
= NULL
;
1998 hr
= m_pSFParent
->SetNameOf(0, pidl
, lpdi
->item
.pszText
, SHGDN_INFOLDER
, &pidlNew
);
2000 if (SUCCEEDED(hr
) && pidlNew
)
2002 lvItem
.mask
= LVIF_PARAM
|LVIF_IMAGE
;
2003 lvItem
.iItem
= lpdi
->item
.iItem
;
2004 lvItem
.iSubItem
= 0;
2005 lvItem
.lParam
= reinterpret_cast<LPARAM
>(pidlNew
);
2006 lvItem
.iImage
= SHMapPIDLToSystemImageListIndex(m_pSFParent
, pidlNew
, 0);
2007 m_ListView
.SetItem(&lvItem
);
2008 m_ListView
.Update(lpdi
->item
.iItem
);
2017 TRACE("-- %p WM_COMMAND %x unhandled\n", this, lpnmh
->code
);
2025 * This is just a quick hack to make the desktop work correctly.
2026 * ITranslateShellChangeNotify's IsChildID is undocumented, but most likely the way that
2027 * a folder should know if it should update upon a change notification.
2028 * It is exported by merged folders at a minimum.
2030 static BOOL
ILIsParentOrSpecialParent(PCIDLIST_ABSOLUTE pidl1
, PCIDLIST_ABSOLUTE pidl2
)
2032 if (!pidl1
|| !pidl2
)
2034 if (ILIsParent(pidl1
, pidl2
, TRUE
))
2037 if (_ILIsDesktop(pidl1
))
2039 PIDLIST_ABSOLUTE deskpidl
;
2040 SHGetFolderLocation(NULL
, CSIDL_DESKTOPDIRECTORY
, NULL
, 0, &deskpidl
);
2041 if (ILIsParent(deskpidl
, pidl2
, TRUE
))
2047 SHGetFolderLocation(NULL
, CSIDL_COMMON_DESKTOPDIRECTORY
, NULL
, 0, &deskpidl
);
2048 if (ILIsParent(deskpidl
, pidl2
, TRUE
))
2058 /**********************************************************
2059 * ShellView_OnChange()
2061 LRESULT
CDefView::OnChangeNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
2063 PCIDLIST_ABSOLUTE
*Pidls
= reinterpret_cast<PCIDLIST_ABSOLUTE
*>(wParam
);
2064 BOOL bParent0
= ILIsParentOrSpecialParent(m_pidlParent
, Pidls
[0]);
2065 BOOL bParent1
= ILIsParentOrSpecialParent(m_pidlParent
, Pidls
[1]);
2067 TRACE("(%p)(%p,%p,0x%08x)\n", this, Pidls
[0], Pidls
[1], lParam
);
2069 switch (lParam
&~ SHCNE_INTERRUPT
)
2075 if (LV_FindItemByPidl(ILFindLastID(Pidls
[0])) == -1)
2077 LV_AddItem(ILFindLastID(Pidls
[0]));
2081 LV_ProdItem(ILFindLastID(Pidls
[0]));
2089 LV_DeleteItem(ILFindLastID(Pidls
[0]));
2092 case SHCNE_RENAMEFOLDER
:
2093 case SHCNE_RENAMEITEM
:
2094 if (bParent0
&& bParent1
)
2095 LV_RenameItem(ILFindLastID(Pidls
[0]), ILFindLastID(Pidls
[1]));
2097 LV_DeleteItem(ILFindLastID(Pidls
[0]));
2099 LV_AddItem(ILFindLastID(Pidls
[1]));
2102 case SHCNE_UPDATEITEM
:
2104 LV_RenameItem(ILFindLastID(Pidls
[0]), ILFindLastID(Pidls
[0]));
2107 case SHCNE_UPDATEDIR
:
2114 HRESULT
SHGetMenuIdFromMenuMsg(UINT uMsg
, LPARAM lParam
, UINT
*CmdId
);
2115 HRESULT
SHSetMenuIdInMenuMsg(UINT uMsg
, LPARAM lParam
, UINT CmdId
);
2117 /**********************************************************
2118 * CDefView::OnCustomItem
2120 LRESULT
CDefView::OnCustomItem(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
2125 ERR("no menu!!!\n");
2129 /* The lParam of WM_DRAWITEM WM_MEASUREITEM contain a menu id and this also needs to
2130 be changed to a menu identifier offset */
2132 HRESULT hres
= SHGetMenuIdFromMenuMsg(uMsg
, lParam
, &CmdID
);
2133 if (SUCCEEDED(hres
))
2134 SHSetMenuIdInMenuMsg(uMsg
, lParam
, CmdID
- CONTEXT_MENU_BASE_ID
);
2136 /* Forward the message to the IContextMenu2 */
2138 hres
= SHForwardContextMenuMsg(m_pCM
, uMsg
, wParam
, lParam
, &result
, TRUE
);
2140 return (SUCCEEDED(hres
));
2143 LRESULT
CDefView::OnSettingChange(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
2145 /* Wallpaper setting affects drop shadows effect */
2146 if (wParam
== SPI_SETDESKWALLPAPER
|| wParam
== 0)
2152 /**********************************************************
2153 * CDefView::OnInitMenuPopup
2155 LRESULT
CDefView::OnInitMenuPopup(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
2157 HMENU hmenu
= (HMENU
) wParam
;
2158 int nPos
= LOWORD(lParam
);
2161 OnCustomItem(uMsg
, wParam
, lParam
, bHandled
);
2163 HMENU hViewMenu
= GetSubmenuByID(m_hMenu
, FCIDM_MENU_VIEW
);
2165 /* Lets try to find out what the hell wParam is */
2166 if (hmenu
== GetSubMenu(m_hMenu
, nPos
))
2167 menuItemId
= ReallyGetMenuItemID(m_hMenu
, nPos
);
2168 else if (hViewMenu
&& hmenu
== GetSubMenu(hViewMenu
, nPos
))
2169 menuItemId
= ReallyGetMenuItemID(hViewMenu
, nPos
);
2170 else if (m_hContextMenu
&& hmenu
== GetSubMenu(m_hContextMenu
, nPos
))
2171 menuItemId
= ReallyGetMenuItemID(m_hContextMenu
, nPos
);
2177 case FCIDM_MENU_FILE
:
2180 case FCIDM_MENU_VIEW
:
2181 case FCIDM_SHVIEW_VIEW
:
2182 CheckViewMode(hmenu
);
2184 case FCIDM_SHVIEW_ARRANGE
:
2185 FillArrangeAsMenu(hmenu
);
2192 /**********************************************************
2195 * The INTERFACE of the IShellView object
2198 **********************************************************
2201 /**********************************************************
2202 * ShellView_GetWindow
2204 HRESULT WINAPI
CDefView::GetWindow(HWND
*phWnd
)
2206 TRACE("(%p)\n", this);
2213 HRESULT WINAPI
CDefView::ContextSensitiveHelp(BOOL fEnterMode
)
2215 FIXME("(%p) stub\n", this);
2220 /**********************************************************
2221 * IShellView_TranslateAccelerator
2224 * use the accel functions
2226 HRESULT WINAPI
CDefView::TranslateAccelerator(LPMSG lpmsg
)
2231 if (lpmsg
->message
>= WM_KEYFIRST
&& lpmsg
->message
<= WM_KEYLAST
)
2233 if (::TranslateAcceleratorW(m_hWnd
, m_hAccel
, lpmsg
) != 0)
2236 TRACE("-- key=0x%04lx\n", lpmsg
->wParam
) ;
2239 return m_pShellBrowser
->TranslateAcceleratorSB(lpmsg
, 0);
2242 HRESULT WINAPI
CDefView::EnableModeless(BOOL fEnable
)
2244 FIXME("(%p) stub\n", this);
2249 HRESULT WINAPI
CDefView::UIActivate(UINT uState
)
2251 // CHAR szName[MAX_PATH];
2253 int nPartArray
[1] = { -1};
2255 TRACE("(%p)->(state=%x) stub\n", this, uState
);
2257 /* don't do anything if the state isn't really changing */
2258 if (m_uState
== uState
)
2263 /* OnActivate handles the menu merging and internal state */
2266 /* only do This if we are active */
2267 if (uState
!= SVUIA_DEACTIVATE
)
2271 GetFolderPath is not a method of IShellFolder
2272 IShellFolder_GetFolderPath( m_pSFParent, szName, sizeof(szName) );
2274 /* set the number of parts */
2275 m_pShellBrowser
->SendControlMsg(FCW_STATUS
, SB_SETPARTS
, 1, (LPARAM
)nPartArray
, &lResult
);
2277 /* set the text for the parts */
2279 m_pShellBrowser->SendControlMsg(FCW_STATUS, SB_SETTEXTA, 0, (LPARAM)szName, &lResult);
2286 HRESULT WINAPI
CDefView::Refresh()
2288 TRACE("(%p)\n", this);
2290 m_ListView
.DeleteAllItems();
2296 HRESULT WINAPI
CDefView::CreateViewWindow(IShellView
*lpPrevView
, LPCFOLDERSETTINGS lpfs
, IShellBrowser
*psb
, RECT
*prcView
, HWND
*phWnd
)
2298 return CreateViewWindow3(psb
, lpPrevView
, SV3CVW3_DEFAULT
,
2299 (FOLDERFLAGS
)lpfs
->fFlags
, (FOLDERFLAGS
)lpfs
->fFlags
, (FOLDERVIEWMODE
)lpfs
->ViewMode
, NULL
, prcView
, phWnd
);
2302 HRESULT WINAPI
CDefView::DestroyViewWindow()
2304 TRACE("(%p)\n", this);
2306 /* Make absolutely sure all our UI is cleaned up */
2307 UIActivate(SVUIA_DEACTIVATE
);
2311 // "Accelerator tables loaded from resources are freed automatically when the application terminates." -- MSDN
2315 if (m_hMenuArrangeModes
)
2317 DestroyMenu(m_hMenuArrangeModes
);
2318 m_hMenuArrangeModes
= NULL
;
2321 if (m_hMenuViewModes
)
2323 DestroyMenu(m_hMenuViewModes
);
2324 m_hMenuViewModes
= NULL
;
2329 DestroyMenu(m_hMenu
);
2335 m_ListView
.DestroyWindow();
2343 m_pShellBrowser
.Release();
2344 m_pCommDlgBrowser
.Release();
2349 HRESULT WINAPI
CDefView::GetCurrentInfo(LPFOLDERSETTINGS lpfs
)
2351 TRACE("(%p)->(%p) vmode=%x flags=%x\n", this, lpfs
,
2352 m_FolderSettings
.ViewMode
, m_FolderSettings
.fFlags
);
2355 return E_INVALIDARG
;
2357 *lpfs
= m_FolderSettings
;
2361 HRESULT WINAPI
CDefView::AddPropertySheetPages(DWORD dwReserved
, LPFNADDPROPSHEETPAGE lpfn
, LPARAM lparam
)
2363 FIXME("(%p) stub\n", this);
2368 HRESULT WINAPI
CDefView::SaveViewState()
2370 FIXME("(%p) stub\n", this);
2375 HRESULT WINAPI
CDefView::SelectItem(PCUITEMID_CHILD pidl
, UINT uFlags
)
2379 TRACE("(%p)->(pidl=%p, 0x%08x) stub\n", this, pidl
, uFlags
);
2381 i
= LV_FindItemByPidl(pidl
);
2385 if(uFlags
& SVSI_ENSUREVISIBLE
)
2386 m_ListView
.EnsureVisible(i
, FALSE
);
2388 LVITEMW lvItem
= {0};
2389 lvItem
.mask
= LVIF_STATE
;
2390 lvItem
.stateMask
= LVIS_SELECTED
| LVIS_FOCUSED
;
2392 while (m_ListView
.GetItem(&lvItem
))
2394 if (lvItem
.iItem
== i
)
2396 if (uFlags
& SVSI_SELECT
)
2397 lvItem
.state
|= LVIS_SELECTED
;
2399 lvItem
.state
&= ~LVIS_SELECTED
;
2401 if (uFlags
& SVSI_FOCUSED
)
2402 lvItem
.state
&= ~LVIS_FOCUSED
;
2406 if (uFlags
& SVSI_DESELECTOTHERS
)
2407 lvItem
.state
&= ~LVIS_SELECTED
;
2410 m_ListView
.SetItem(&lvItem
);
2414 if((uFlags
& SVSI_EDIT
) == SVSI_EDIT
)
2415 m_ListView
.EditLabel(i
);
2420 HRESULT WINAPI
CDefView::GetItemObject(UINT uItem
, REFIID riid
, LPVOID
*ppvOut
)
2422 HRESULT hr
= E_NOINTERFACE
;
2424 TRACE("(%p)->(uItem=0x%08x,\n\tIID=%s, ppv=%p)\n", this, uItem
, debugstr_guid(&riid
), ppvOut
);
2427 return E_INVALIDARG
;
2433 case SVGIO_BACKGROUND
:
2434 if (IsEqualIID(riid
, IID_IContextMenu
))
2436 hr
= CDefViewBckgrndMenu_CreateInstance(m_pSF2Parent
, riid
, ppvOut
);
2437 if (FAILED_UNEXPECTEDLY(hr
))
2440 IUnknown_SetSite(*((IUnknown
**)ppvOut
), (IShellView
*)this);
2442 else if (IsEqualIID(riid
, IID_IDispatch
))
2444 if (m_pShellFolderViewDual
== NULL
)
2446 hr
= CDefViewDual_Constructor(riid
, (LPVOID
*)&m_pShellFolderViewDual
);
2447 if (FAILED_UNEXPECTEDLY(hr
))
2450 hr
= m_pShellFolderViewDual
->QueryInterface(riid
, ppvOut
);
2454 case SVGIO_SELECTION
:
2456 hr
= m_pSFParent
->GetUIObjectOf(m_hWnd
, m_cidl
, m_apidl
, riid
, 0, ppvOut
);
2457 if (FAILED_UNEXPECTEDLY(hr
))
2460 if (IsEqualIID(riid
, IID_IContextMenu
))
2461 IUnknown_SetSite(*((IUnknown
**)ppvOut
), (IShellView
*)this);
2466 TRACE("-- (%p)->(interface=%p)\n", this, *ppvOut
);
2471 HRESULT STDMETHODCALLTYPE
CDefView::GetCurrentViewMode(UINT
*pViewMode
)
2473 TRACE("(%p)->(%p), stub\n", this, pViewMode
);
2476 return E_INVALIDARG
;
2478 *pViewMode
= m_FolderSettings
.ViewMode
;
2482 HRESULT STDMETHODCALLTYPE
CDefView::SetCurrentViewMode(UINT ViewMode
)
2485 TRACE("(%p)->(%u), stub\n", this, ViewMode
);
2487 /* It's not redundant to check FVM_AUTO because it's a (UINT)-1 */
2488 if (((INT
)ViewMode
< FVM_FIRST
|| (INT
)ViewMode
> FVM_LAST
) && ((INT
)ViewMode
!= FVM_AUTO
))
2489 return E_INVALIDARG
;
2491 /* Windows before Vista uses LVM_SETVIEW and possibly
2492 LVM_SETEXTENDEDLISTVIEWSTYLE to set the style of the listview,
2493 while later versions seem to accomplish this through other
2501 dwStyle
= LVS_REPORT
;
2504 dwStyle
= LVS_SMALLICON
;
2511 FIXME("ViewMode %d not implemented\n", ViewMode
);
2517 m_ListView
.ModifyStyle(LVS_TYPEMASK
, dwStyle
);
2519 /* This will not necessarily be the actual mode set above.
2520 This mimics the behavior of Windows XP. */
2521 m_FolderSettings
.ViewMode
= ViewMode
;
2526 HRESULT STDMETHODCALLTYPE
CDefView::GetFolder(REFIID riid
, void **ppv
)
2528 if (m_pSFParent
== NULL
)
2531 return m_pSFParent
->QueryInterface(riid
, ppv
);
2534 HRESULT STDMETHODCALLTYPE
CDefView::Item(int iItemIndex
, PITEMID_CHILD
*ppidl
)
2536 PCUITEMID_CHILD pidl
= _PidlByItem(iItemIndex
);
2539 *ppidl
= ILClone(pidl
);
2544 return E_INVALIDARG
;
2547 HRESULT STDMETHODCALLTYPE
CDefView::ItemCount(UINT uFlags
, int *pcItems
)
2549 TRACE("(%p)->(%u %p)\n", this, uFlags
, pcItems
);
2551 if (uFlags
!= SVGIO_ALLVIEW
)
2552 FIXME("some flags unsupported, %x\n", uFlags
& ~SVGIO_ALLVIEW
);
2554 *pcItems
= m_ListView
.GetItemCount();
2559 HRESULT STDMETHODCALLTYPE
CDefView::Items(UINT uFlags
, REFIID riid
, void **ppv
)
2564 HRESULT STDMETHODCALLTYPE
CDefView::GetSelectionMarkedItem(int *piItem
)
2566 TRACE("(%p)->(%p)\n", this, piItem
);
2568 *piItem
= m_ListView
.GetSelectionMark();
2573 HRESULT STDMETHODCALLTYPE
CDefView::GetFocusedItem(int *piItem
)
2575 TRACE("(%p)->(%p)\n", this, piItem
);
2577 *piItem
= m_ListView
.GetNextItem(-1, LVNI_FOCUSED
);
2582 HRESULT STDMETHODCALLTYPE
CDefView::GetItemPosition(PCUITEMID_CHILD pidl
, POINT
*ppt
)
2584 int lvIndex
= LV_FindItemByPidl(pidl
);
2585 if (lvIndex
== -1 || ppt
== NULL
)
2586 return E_INVALIDARG
;
2588 m_ListView
.GetItemPosition(lvIndex
, ppt
);
2592 HRESULT STDMETHODCALLTYPE
CDefView::GetSpacing(POINT
*ppt
)
2594 TRACE("(%p)->(%p)\n", this, ppt
);
2602 m_ListView
.GetItemSpacing(spacing
);
2604 ppt
->x
= spacing
.cx
;
2605 ppt
->y
= spacing
.cy
;
2611 HRESULT STDMETHODCALLTYPE
CDefView::GetDefaultSpacing(POINT
*ppt
)
2616 HRESULT STDMETHODCALLTYPE
CDefView::GetAutoArrange()
2618 return ((m_ListView
.GetStyle() & LVS_AUTOARRANGE
) ? S_OK
: S_FALSE
);
2621 HRESULT STDMETHODCALLTYPE
CDefView::SelectItem(int iItem
, DWORD dwFlags
)
2625 TRACE("(%p)->(%d, %x)\n", this, iItem
, dwFlags
);
2628 lvItem
.stateMask
= LVIS_SELECTED
;
2630 if (dwFlags
& SVSI_ENSUREVISIBLE
)
2631 m_ListView
.EnsureVisible(iItem
, 0);
2634 if (dwFlags
& SVSI_DESELECTOTHERS
)
2635 m_ListView
.SetItemState(-1, 0, LVIS_SELECTED
);
2638 if (dwFlags
& SVSI_SELECT
)
2639 lvItem
.state
|= LVIS_SELECTED
;
2641 if (dwFlags
& SVSI_FOCUSED
)
2642 lvItem
.stateMask
|= LVIS_FOCUSED
;
2644 m_ListView
.SetItemState(iItem
, lvItem
.state
, lvItem
.stateMask
);
2646 if ((dwFlags
& SVSI_EDIT
) == SVSI_EDIT
)
2647 m_ListView
.EditLabel(iItem
);
2652 HRESULT STDMETHODCALLTYPE
CDefView::SelectAndPositionItems(UINT cidl
, PCUITEMID_CHILD_ARRAY apidl
, POINT
*apt
, DWORD dwFlags
)
2654 /* Reset the selection */
2655 m_ListView
.SetItemState(-1, 0, LVIS_SELECTED
);
2658 for (UINT i
= 0 ; i
< m_cidl
; i
++)
2660 lvIndex
= LV_FindItemByPidl(apidl
[i
]);
2663 SelectItem(lvIndex
, dwFlags
);
2664 m_ListView
.SetItemPosition(lvIndex
, &apt
[i
]);
2671 /**********************************************************
2672 * IShellView2 implementation
2675 HRESULT STDMETHODCALLTYPE
CDefView::GetView(SHELLVIEWID
*view_guid
, ULONG view_type
)
2677 FIXME("(%p)->(%p, %lu) stub\n", this, view_guid
, view_type
);
2681 HRESULT STDMETHODCALLTYPE
CDefView::CreateViewWindow2(LPSV2CVW2_PARAMS view_params
)
2683 return CreateViewWindow3(view_params
->psbOwner
, view_params
->psvPrev
,
2684 SV3CVW3_DEFAULT
, (FOLDERFLAGS
)view_params
->pfs
->fFlags
, (FOLDERFLAGS
)view_params
->pfs
->fFlags
,
2685 (FOLDERVIEWMODE
)view_params
->pfs
->ViewMode
, view_params
->pvid
, view_params
->prcView
, &view_params
->hwndView
);
2688 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
)
2690 OLEMENUGROUPWIDTHS omw
= { { 0, 0, 0, 0, 0, 0 } };
2694 TRACE("(%p)->(shlview=%p shlbrs=%p rec=%p hwnd=%p vmode=%x flags=%x)\n", this, psvPrevious
, psb
, prcView
, hwnd
, mode
, flags
);
2695 if (prcView
!= NULL
)
2696 TRACE("-- left=%i top=%i right=%i bottom=%i\n", prcView
->left
, prcView
->top
, prcView
->right
, prcView
->bottom
);
2698 /* Validate the Shell Browser */
2699 if (psb
== NULL
|| m_hWnd
)
2700 return E_UNEXPECTED
;
2702 if (view_flags
!= SV3CVW3_DEFAULT
)
2703 FIXME("unsupported view flags 0x%08x\n", view_flags
);
2705 /* Set up the member variables */
2706 m_pShellBrowser
= psb
;
2707 m_FolderSettings
.ViewMode
= mode
;
2708 m_FolderSettings
.fFlags
= mask
& flags
;
2712 if (IsEqualIID(*view_id
, VID_LargeIcons
))
2713 m_FolderSettings
.ViewMode
= FVM_ICON
;
2714 else if (IsEqualIID(*view_id
, VID_SmallIcons
))
2715 m_FolderSettings
.ViewMode
= FVM_SMALLICON
;
2716 else if (IsEqualIID(*view_id
, VID_List
))
2717 m_FolderSettings
.ViewMode
= FVM_LIST
;
2718 else if (IsEqualIID(*view_id
, VID_Details
))
2719 m_FolderSettings
.ViewMode
= FVM_DETAILS
;
2720 else if (IsEqualIID(*view_id
, VID_Thumbnails
))
2721 m_FolderSettings
.ViewMode
= FVM_THUMBNAIL
;
2722 else if (IsEqualIID(*view_id
, VID_Tile
))
2723 m_FolderSettings
.ViewMode
= FVM_TILE
;
2724 else if (IsEqualIID(*view_id
, VID_ThumbStrip
))
2725 m_FolderSettings
.ViewMode
= FVM_THUMBSTRIP
;
2727 FIXME("Ignoring unrecognized VID %s\n", debugstr_guid(view_id
));
2730 /* Get our parent window */
2731 m_pShellBrowser
->GetWindow(&m_hWndParent
);
2733 /* Try to get the ICommDlgBrowserInterface, adds a reference !!! */
2734 m_pCommDlgBrowser
= NULL
;
2735 if (SUCCEEDED(m_pShellBrowser
->QueryInterface(IID_PPV_ARG(ICommDlgBrowser
, &m_pCommDlgBrowser
))))
2737 TRACE("-- CommDlgBrowser\n");
2740 Create(m_hWndParent
, prcView
, NULL
, WS_CHILD
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
| WS_TABSTOP
, 0, 0U);
2751 _DoFolderViewCB(SFVM_WINDOWCREATED
, (WPARAM
)m_hWnd
, NULL
);
2753 SetWindowPos(HWND_TOP
, 0, 0, 0, 0, SWP_NOMOVE
| SWP_NOSIZE
| SWP_SHOWWINDOW
);
2758 m_hMenu
= CreateMenu();
2759 m_pShellBrowser
->InsertMenusSB(m_hMenu
, &omw
);
2760 TRACE("-- after fnInsertMenusSB\n");
2768 HRESULT STDMETHODCALLTYPE
CDefView::HandleRename(LPCITEMIDLIST new_pidl
)
2770 FIXME("(%p)->(%p) stub\n", this, new_pidl
);
2774 HRESULT STDMETHODCALLTYPE
CDefView::SelectAndPositionItem(LPCITEMIDLIST item
, UINT flags
, POINT
*point
)
2776 FIXME("(%p)->(%p, %u, %p) stub\n", this, item
, flags
, point
);
2780 /**********************************************************
2781 * IShellFolderView implementation
2783 HRESULT STDMETHODCALLTYPE
CDefView::Rearrange(LPARAM sort
)
2785 FIXME("(%p)->(%ld) stub\n", this, sort
);
2789 HRESULT STDMETHODCALLTYPE
CDefView::GetArrangeParam(LPARAM
*sort
)
2791 FIXME("(%p)->(%p) stub\n", this, sort
);
2795 HRESULT STDMETHODCALLTYPE
CDefView::ArrangeGrid()
2797 FIXME("(%p) stub\n", this);
2801 HRESULT STDMETHODCALLTYPE
CDefView::AutoArrange()
2803 m_ListView
.ModifyStyle(0, LVS_AUTOARRANGE
);
2804 m_ListView
.Arrange(LVA_DEFAULT
);
2808 HRESULT STDMETHODCALLTYPE
CDefView::AddObject(PITEMID_CHILD pidl
, UINT
*item
)
2810 FIXME("(%p)->(%p %p) stub\n", this, pidl
, item
);
2814 HRESULT STDMETHODCALLTYPE
CDefView::GetObject(PITEMID_CHILD
*pidl
, UINT item
)
2816 TRACE("(%p)->(%p %d)\n", this, pidl
, item
);
2817 return Item(item
, pidl
);
2820 HRESULT STDMETHODCALLTYPE
CDefView::RemoveObject(PITEMID_CHILD pidl
, UINT
*item
)
2823 TRACE("(%p)->(%p %p)\n", this, pidl
, item
);
2827 *item
= LV_FindItemByPidl(ILFindLastID(pidl
));
2828 m_ListView
.DeleteItem(*item
);
2833 m_ListView
.DeleteAllItems();
2839 HRESULT STDMETHODCALLTYPE
CDefView::GetObjectCount(UINT
*count
)
2841 TRACE("(%p)->(%p)\n", this, count
);
2842 *count
= m_ListView
.GetItemCount();
2846 HRESULT STDMETHODCALLTYPE
CDefView::SetObjectCount(UINT count
, UINT flags
)
2848 FIXME("(%p)->(%d %x) stub\n", this, count
, flags
);
2852 HRESULT STDMETHODCALLTYPE
CDefView::UpdateObject(PITEMID_CHILD pidl_old
, PITEMID_CHILD pidl_new
, UINT
*item
)
2854 FIXME("(%p)->(%p %p %p) stub\n", this, pidl_old
, pidl_new
, item
);
2858 HRESULT STDMETHODCALLTYPE
CDefView::RefreshObject(PITEMID_CHILD pidl
, UINT
*item
)
2860 FIXME("(%p)->(%p %p) stub\n", this, pidl
, item
);
2864 HRESULT STDMETHODCALLTYPE
CDefView::SetRedraw(BOOL redraw
)
2866 TRACE("(%p)->(%d)\n", this, redraw
);
2867 m_ListView
.SetRedraw(redraw
);
2871 HRESULT STDMETHODCALLTYPE
CDefView::GetSelectedCount(UINT
*count
)
2873 FIXME("(%p)->(%p) stub\n", this, count
);
2877 HRESULT STDMETHODCALLTYPE
CDefView::GetSelectedObjects(PCUITEMID_CHILD
**pidl
, UINT
*items
)
2879 TRACE("(%p)->(%p %p)\n", this, pidl
, items
);
2881 *items
= GetSelections();
2885 *pidl
= static_cast<PCUITEMID_CHILD
*>(LocalAlloc(0, *items
* sizeof(PCUITEMID_CHILD
)));
2888 return E_OUTOFMEMORY
;
2891 /* it's documented that caller shouldn't PIDLs, only array itself */
2892 memcpy(*pidl
, m_apidl
, *items
* sizeof(PCUITEMID_CHILD
));
2898 HRESULT STDMETHODCALLTYPE
CDefView::IsDropOnSource(IDropTarget
*drop_target
)
2900 if ((m_iDragOverItem
== -1 || m_pCurDropTarget
== NULL
) &&
2901 (m_pSourceDataObject
.p
))
2909 HRESULT STDMETHODCALLTYPE
CDefView::GetDragPoint(POINT
*pt
)
2912 return E_INVALIDARG
;
2914 *pt
= m_ptFirstMousePos
;
2918 HRESULT STDMETHODCALLTYPE
CDefView::GetDropPoint(POINT
*pt
)
2920 FIXME("(%p)->(%p) stub\n", this, pt
);
2924 HRESULT STDMETHODCALLTYPE
CDefView::MoveIcons(IDataObject
*obj
)
2926 TRACE("(%p)->(%p)\n", this, obj
);
2930 HRESULT STDMETHODCALLTYPE
CDefView::SetItemPos(PCUITEMID_CHILD pidl
, POINT
*pt
)
2932 FIXME("(%p)->(%p %p) stub\n", this, pidl
, pt
);
2936 HRESULT STDMETHODCALLTYPE
CDefView::IsBkDropTarget(IDropTarget
*drop_target
)
2938 FIXME("(%p)->(%p) stub\n", this, drop_target
);
2942 HRESULT STDMETHODCALLTYPE
CDefView::SetClipboard(BOOL move
)
2944 FIXME("(%p)->(%d) stub\n", this, move
);
2948 HRESULT STDMETHODCALLTYPE
CDefView::SetPoints(IDataObject
*obj
)
2950 FIXME("(%p)->(%p) stub\n", this, obj
);
2954 HRESULT STDMETHODCALLTYPE
CDefView::GetItemSpacing(ITEMSPACING
*spacing
)
2956 FIXME("(%p)->(%p) stub\n", this, spacing
);
2960 HRESULT STDMETHODCALLTYPE
CDefView::SetCallback(IShellFolderViewCB
*new_cb
, IShellFolderViewCB
**old_cb
)
2963 *old_cb
= m_pShellFolderViewCB
.Detach();
2965 m_pShellFolderViewCB
= new_cb
;
2969 HRESULT STDMETHODCALLTYPE
CDefView::Select(UINT flags
)
2971 FIXME("(%p)->(%d) stub\n", this, flags
);
2975 HRESULT STDMETHODCALLTYPE
CDefView::QuerySupport(UINT
*support
)
2977 TRACE("(%p)->(%p)\n", this, support
);
2981 HRESULT STDMETHODCALLTYPE
CDefView::SetAutomationObject(IDispatch
*disp
)
2983 FIXME("(%p)->(%p) stub\n", this, disp
);
2987 /**********************************************************
2988 * ISVOleCmdTarget_QueryStatus (IOleCommandTarget)
2990 HRESULT WINAPI
CDefView::QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
, OLECMD
*prgCmds
, OLECMDTEXT
*pCmdText
)
2992 FIXME("(%p)->(%p(%s) 0x%08x %p %p\n",
2993 this, pguidCmdGroup
, debugstr_guid(pguidCmdGroup
), cCmds
, prgCmds
, pCmdText
);
2996 return E_INVALIDARG
;
2998 for (UINT i
= 0; i
< cCmds
; i
++)
3000 FIXME("\tprgCmds[%d].cmdID = %d\n", i
, prgCmds
[i
].cmdID
);
3001 prgCmds
[i
].cmdf
= 0;
3004 return OLECMDERR_E_UNKNOWNGROUP
;
3007 /**********************************************************
3008 * ISVOleCmdTarget_Exec (IOleCommandTarget)
3010 * nCmdID is the OLECMDID_* enumeration
3012 HRESULT WINAPI
CDefView::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
3014 FIXME("(%p)->(\n\tTarget GUID:%s Command:0x%08x Opt:0x%08x %p %p)\n",
3015 this, debugstr_guid(pguidCmdGroup
), nCmdID
, nCmdexecopt
, pvaIn
, pvaOut
);
3018 return OLECMDERR_E_UNKNOWNGROUP
;
3020 if (IsEqualCLSID(*pguidCmdGroup
, m_Category
))
3022 if (nCmdID
== FCIDM_SHVIEW_AUTOARRANGE
)
3024 if (V_VT(pvaIn
) != VT_INT_PTR
)
3025 return OLECMDERR_E_NOTSUPPORTED
;
3028 params
.cbSize
= sizeof(params
);
3029 params
.rcExclude
= *(RECT
*) V_INTREF(pvaIn
);
3031 if (m_hMenuViewModes
)
3033 /* Duplicate all but the last two items of the view modes menu */
3034 HMENU hmenuViewPopup
= CreatePopupMenu();
3035 Shell_MergeMenus(hmenuViewPopup
, m_hMenuViewModes
, 0, 0, 0xFFFF, 0);
3036 DeleteMenu(hmenuViewPopup
, GetMenuItemCount(hmenuViewPopup
) - 1, MF_BYPOSITION
);
3037 DeleteMenu(hmenuViewPopup
, GetMenuItemCount(hmenuViewPopup
) - 1, MF_BYPOSITION
);
3038 CheckViewMode(hmenuViewPopup
);
3039 TrackPopupMenuEx(hmenuViewPopup
, TPM_LEFTALIGN
| TPM_TOPALIGN
, params
.rcExclude
.left
, params
.rcExclude
.bottom
, m_hWndParent
, ¶ms
);
3040 ::DestroyMenu(hmenuViewPopup
);
3043 // pvaOut is VT_I4 with value 0x403 (cmd id of the new mode maybe?)
3044 V_VT(pvaOut
) = VT_I4
;
3045 V_I4(pvaOut
) = 0x403;
3049 if (IsEqualIID(*pguidCmdGroup
, CGID_Explorer
) &&
3051 (nCmdexecopt
== 4) && pvaOut
)
3054 if (IsEqualIID(*pguidCmdGroup
, CGID_ShellDocView
) &&
3059 return OLECMDERR_E_UNKNOWNGROUP
;
3062 /**********************************************************
3063 * ISVDropTarget implementation
3066 /******************************************************************************
3067 * drag_notify_subitem [Internal]
3069 * Figure out the shellfolder object, which is currently under the mouse cursor
3070 * and notify it via the IDropTarget interface.
3073 #define SCROLLAREAWIDTH 20
3075 HRESULT
CDefView::drag_notify_subitem(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
3081 /* The key state on drop doesn't have MK_LBUTTON or MK_RBUTTON because it
3082 reflects the key state after the user released the button, so we need
3083 to remember the last key state when the button was pressed */
3084 m_grfKeyState
= grfKeyState
;
3086 /* Map from global to client coordinates and query the index of the listview-item, which is
3087 * currently under the mouse cursor. */
3088 LVHITTESTINFO htinfo
= {{pt
.x
, pt
.y
}, LVHT_ONITEM
};
3089 ScreenToClient(&htinfo
.pt
);
3090 lResult
= m_ListView
.HitTest(&htinfo
);
3092 /* Send WM_*SCROLL messages every 250 ms during drag-scrolling */
3093 ::GetClientRect(m_ListView
, &clientRect
);
3094 if (htinfo
.pt
.x
== m_ptLastMousePos
.x
&& htinfo
.pt
.y
== m_ptLastMousePos
.y
&&
3095 (htinfo
.pt
.x
< SCROLLAREAWIDTH
|| htinfo
.pt
.x
> clientRect
.right
- SCROLLAREAWIDTH
||
3096 htinfo
.pt
.y
< SCROLLAREAWIDTH
|| htinfo
.pt
.y
> clientRect
.bottom
- SCROLLAREAWIDTH
))
3098 m_cScrollDelay
= (m_cScrollDelay
+ 1) % 5; /* DragOver is called every 50 ms */
3099 if (m_cScrollDelay
== 0)
3101 /* Mouse did hover another 250 ms over the scroll-area */
3102 if (htinfo
.pt
.x
< SCROLLAREAWIDTH
)
3103 m_ListView
.SendMessageW(WM_HSCROLL
, SB_LINEUP
, 0);
3105 if (htinfo
.pt
.x
> clientRect
.right
- SCROLLAREAWIDTH
)
3106 m_ListView
.SendMessageW(WM_HSCROLL
, SB_LINEDOWN
, 0);
3108 if (htinfo
.pt
.y
< SCROLLAREAWIDTH
)
3109 m_ListView
.SendMessageW(WM_VSCROLL
, SB_LINEUP
, 0);
3111 if (htinfo
.pt
.y
> clientRect
.bottom
- SCROLLAREAWIDTH
)
3112 m_ListView
.SendMessageW(WM_VSCROLL
, SB_LINEDOWN
, 0);
3117 m_cScrollDelay
= 0; /* Reset, if the cursor is not over the listview's scroll-area */
3120 m_ptLastMousePos
= htinfo
.pt
;
3122 /* We need to check if we drag the selection over itself */
3123 if (lResult
!= -1 && m_pSourceDataObject
.p
!= NULL
)
3125 PCUITEMID_CHILD pidl
= _PidlByItem(lResult
);
3127 for (UINT i
= 0; i
< m_cidl
; i
++)
3129 if (pidl
== m_apidl
[i
])
3131 /* The item that is being draged is hovering itself. */
3138 /* If we are still over the previous sub-item, notify it via DragOver and return. */
3139 if (m_pCurDropTarget
&& lResult
== m_iDragOverItem
)
3140 return m_pCurDropTarget
->DragOver(grfKeyState
, pt
, pdwEffect
);
3142 /* We've left the previous sub-item, notify it via DragLeave and Release it. */
3143 if (m_pCurDropTarget
)
3145 PCUITEMID_CHILD pidl
= _PidlByItem(m_iDragOverItem
);
3147 SelectItem(pidl
, 0);
3149 m_pCurDropTarget
->DragLeave();
3150 m_pCurDropTarget
.Release();
3153 m_iDragOverItem
= lResult
;
3157 /* We are not above one of the listview's subitems. Bind to the parent folder's
3158 * DropTarget interface. */
3159 hr
= m_pSFParent
->CreateViewObject(NULL
, IID_PPV_ARG(IDropTarget
,&m_pCurDropTarget
));
3163 /* Query the relative PIDL of the shellfolder object represented by the currently
3164 * dragged over listview-item ... */
3165 PCUITEMID_CHILD pidl
= _PidlByItem(lResult
);
3167 /* ... and bind m_pCurDropTarget to the IDropTarget interface of an UIObject of this object */
3168 hr
= m_pSFParent
->GetUIObjectOf(m_ListView
, 1, &pidl
, IID_NULL_PPV_ARG(IDropTarget
, &m_pCurDropTarget
));
3171 IUnknown_SetSite(m_pCurDropTarget
, (IShellView
*)this);
3173 /* If anything failed, m_pCurDropTarget should be NULL now, which ought to be a save state. */
3176 *pdwEffect
= DROPEFFECT_NONE
;
3180 if (m_iDragOverItem
!= -1)
3182 SelectItem(m_iDragOverItem
, SVSI_SELECT
);
3185 /* Notify the item just entered via DragEnter. */
3186 return m_pCurDropTarget
->DragEnter(m_pCurDataObject
, grfKeyState
, pt
, pdwEffect
);
3189 HRESULT WINAPI
CDefView::DragEnter(IDataObject
*pDataObject
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
3191 /* Get a hold on the data object for later calls to DragEnter on the sub-folders */
3192 m_pCurDataObject
= pDataObject
;
3194 HRESULT hr
= drag_notify_subitem(grfKeyState
, pt
, pdwEffect
);
3197 POINT ptClient
= {pt
.x
, pt
.y
};
3198 ScreenToClient(&ptClient
);
3199 ImageList_DragEnter(m_hWnd
, ptClient
.x
, ptClient
.y
);
3205 HRESULT WINAPI
CDefView::DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
3207 POINT ptClient
= {pt
.x
, pt
.y
};
3208 ScreenToClient(&ptClient
);
3209 ImageList_DragMove(ptClient
.x
, ptClient
.y
);
3210 return drag_notify_subitem(grfKeyState
, pt
, pdwEffect
);
3213 HRESULT WINAPI
CDefView::DragLeave()
3215 ImageList_DragLeave(m_hWnd
);
3217 if (m_pCurDropTarget
)
3219 m_pCurDropTarget
->DragLeave();
3220 m_pCurDropTarget
.Release();
3223 if (m_pCurDataObject
!= NULL
)
3225 m_pCurDataObject
.Release();
3228 m_iDragOverItem
= 0;
3233 HRESULT WINAPI
CDefView::Drop(IDataObject
* pDataObject
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
3235 ImageList_DragLeave(m_hWnd
);
3236 ImageList_EndDrag();
3238 if ((IsDropOnSource(NULL
) == S_OK
) &&
3239 (*pdwEffect
& DROPEFFECT_MOVE
) &&
3240 (m_grfKeyState
& MK_LBUTTON
))
3242 if (m_pCurDropTarget
)
3244 m_pCurDropTarget
->DragLeave();
3245 m_pCurDropTarget
.Release();
3248 /* Restore the selection */
3249 m_ListView
.SetItemState(-1, 0, LVIS_SELECTED
);
3250 for (UINT i
= 0 ; i
< m_cidl
; i
++)
3251 SelectItem(m_apidl
[i
], SVSI_SELECT
);
3253 /* Reposition the items */
3255 while ((lvIndex
= m_ListView
.GetNextItem(lvIndex
, LVNI_SELECTED
)) > -1)
3258 if (m_ListView
.GetItemPosition(lvIndex
, &ptItem
))
3260 ptItem
.x
+= pt
.x
- m_ptFirstMousePos
.x
;
3261 ptItem
.y
+= pt
.y
- m_ptFirstMousePos
.y
;
3262 m_ListView
.SetItemPosition(lvIndex
, &ptItem
);
3266 else if (m_pCurDropTarget
)
3268 m_pCurDropTarget
->Drop(pDataObject
, grfKeyState
, pt
, pdwEffect
);
3269 m_pCurDropTarget
.Release();
3272 m_pCurDataObject
.Release();
3273 m_iDragOverItem
= 0;
3277 /**********************************************************
3278 * ISVDropSource implementation
3281 HRESULT WINAPI
CDefView::QueryContinueDrag(BOOL fEscapePressed
, DWORD grfKeyState
)
3283 TRACE("(%p)\n", this);
3286 return DRAGDROP_S_CANCEL
;
3287 else if (!(grfKeyState
& MK_LBUTTON
) && !(grfKeyState
& MK_RBUTTON
))
3288 return DRAGDROP_S_DROP
;
3293 HRESULT WINAPI
CDefView::GiveFeedback(DWORD dwEffect
)
3295 TRACE("(%p)\n", this);
3297 return DRAGDROP_S_USEDEFAULTCURSORS
;
3300 /**********************************************************
3301 * ISVViewObject implementation
3304 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
)
3306 FIXME("Stub: this=%p\n", this);
3311 HRESULT WINAPI
CDefView::GetColorSet(DWORD dwDrawAspect
, LONG lindex
, void *pvAspect
, DVTARGETDEVICE
*ptd
, HDC hicTargetDevice
, LOGPALETTE
**ppColorSet
)
3313 FIXME("Stub: this=%p\n", this);
3318 HRESULT WINAPI
CDefView::Freeze(DWORD dwDrawAspect
, LONG lindex
, void *pvAspect
, DWORD
*pdwFreeze
)
3320 FIXME("Stub: this=%p\n", this);
3325 HRESULT WINAPI
CDefView::Unfreeze(DWORD dwFreeze
)
3327 FIXME("Stub: this=%p\n", this);
3332 HRESULT WINAPI
CDefView::SetAdvise(DWORD aspects
, DWORD advf
, IAdviseSink
*pAdvSink
)
3334 FIXME("partial stub: %p 0x%08x 0x%08x %p\n", this, aspects
, advf
, pAdvSink
);
3336 /* FIXME: we set the AdviseSink, but never use it to send any advice */
3337 m_pAdvSink
= pAdvSink
;
3338 m_dwAspects
= aspects
;
3344 HRESULT WINAPI
CDefView::GetAdvise(DWORD
*pAspects
, DWORD
*pAdvf
, IAdviseSink
**ppAdvSink
)
3346 TRACE("this=%p pAspects=%p pAdvf=%p ppAdvSink=%p\n", this, pAspects
, pAdvf
, ppAdvSink
);
3350 *ppAdvSink
= m_pAdvSink
;
3351 m_pAdvSink
.p
->AddRef();
3355 *pAspects
= m_dwAspects
;
3363 HRESULT STDMETHODCALLTYPE
CDefView::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
3365 if (IsEqualIID(guidService
, SID_IShellBrowser
))
3366 return m_pShellBrowser
->QueryInterface(riid
, ppvObject
);
3367 else if(IsEqualIID(guidService
, SID_IFolderView
))
3368 return QueryInterface(riid
, ppvObject
);
3370 return E_NOINTERFACE
;
3373 HRESULT
CDefView::_MergeToolbar()
3375 CComPtr
<IExplorerToolbar
> ptb
;
3378 hr
= IUnknown_QueryService(m_pShellBrowser
, IID_IExplorerToolbar
, IID_PPV_ARG(IExplorerToolbar
, &ptb
));
3382 m_Category
= CGID_DefViewFrame
;
3384 hr
= ptb
->SetCommandTarget(static_cast<IOleCommandTarget
*>(this), &m_Category
, 0);
3392 hr
= ptb
->AddButtons(&m_Category
, buttonsCount
, buttons
);
3400 // The default processing of IShellFolderView callbacks
3401 HRESULT
CDefView::DefMessageSFVCB(UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
3403 // TODO: SFVM_GET_CUSTOMVIEWINFO, SFVM_WINDOWCREATED
3404 TRACE("CDefView::DefMessageSFVCB uMsg=%u\n", uMsg
);
3408 HRESULT
CDefView::_DoFolderViewCB(UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
3410 HRESULT hr
= E_NOTIMPL
;
3412 if (m_pShellFolderViewCB
)
3414 hr
= m_pShellFolderViewCB
->MessageSFVCB(uMsg
, wParam
, lParam
);
3417 if (hr
== E_NOTIMPL
)
3419 hr
= DefMessageSFVCB(uMsg
, wParam
, lParam
);
3425 HRESULT
CDefView_CreateInstance(IShellFolder
*pFolder
, REFIID riid
, LPVOID
* ppvOut
)
3427 return ShellObjectCreatorInit
<CDefView
>(pFolder
, riid
, ppvOut
);
3430 HRESULT WINAPI
SHCreateShellFolderViewEx(
3431 LPCSFV psvcbi
, /* [in] shelltemplate struct */
3432 IShellView
**ppsv
) /* [out] IShellView pointer */
3434 CComPtr
<IShellView
> psv
;
3437 TRACE("sf=%p pidl=%p cb=%p mode=0x%08x parm=%p\n",
3438 psvcbi
->pshf
, psvcbi
->pidl
, psvcbi
->pfnCallback
,
3439 psvcbi
->fvm
, psvcbi
->psvOuter
);
3442 hRes
= CDefView_CreateInstance(psvcbi
->pshf
, IID_PPV_ARG(IShellView
, &psv
));
3443 if (FAILED_UNEXPECTEDLY(hRes
))
3446 *ppsv
= psv
.Detach();
3450 HRESULT WINAPI
SHCreateShellFolderView(const SFV_CREATE
*pcsfv
,
3453 CComPtr
<IShellView
> psv
;
3457 return E_INVALIDARG
;
3461 if (!pcsfv
|| pcsfv
->cbSize
!= sizeof(*pcsfv
))
3462 return E_INVALIDARG
;
3464 TRACE("sf=%p outer=%p callback=%p\n",
3465 pcsfv
->pshf
, pcsfv
->psvOuter
, pcsfv
->psfvcb
);
3467 hRes
= CDefView_CreateInstance(pcsfv
->pshf
, IID_PPV_ARG(IShellView
, &psv
));
3473 CComPtr
<IShellFolderView
> sfv
;
3474 if (SUCCEEDED(psv
->QueryInterface(IID_PPV_ARG(IShellFolderView
, &sfv
))))
3476 sfv
->SetCallback(pcsfv
->psfvcb
, NULL
);
3480 *ppsv
= psv
.Detach();