4 * Copyright 1998,1999 <juergen.schmied@debitel.net>
6 * This is the view visualizing the data provided by the shellfolder.
7 * No direct access to data from pidls should be done from here.
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with this library; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
23 * FIXME: The order by part of the background context menu should be
24 * built according to the columns shown.
26 * FIXME: CheckToolbar: handle the "new folder" and "folder up" button
28 * FIXME: ShellView_FillList: consider sort orders
33 1. Load/Save the view state from/into the stream provided by the ShellBrowser.
34 2. Let the shell folder sort items.
35 3. Code to merge menus in the shellbrowser is incorrect.
36 4. Move the background context menu creation into shell view. It should store the
37 shell view HWND to send commands.
38 5. Send init, measure, and draw messages to context menu during tracking.
39 6. Shell view should do SetCommandTarget on internet toolbar.
40 7. When editing starts on item, set edit text to for editing value.
41 8. When shell view is called back for item info, let listview save the value.
42 9. Shell view should update status bar.
43 10. Fix shell view to handle view mode popup exec.
44 11. The background context menu should have a pidl just like foreground menus. This
45 causes crashes when dynamic handlers try to use the NULL pidl.
46 12. The SHELLDLL_DefView should not be filled with blue unconditionally. This causes
47 annoying flashing of blue even on XP, and is not correct.
48 13. Reorder of columns doesn't work - might be bug in comctl32
55 WINE_DEFAULT_DEBUG_CHANNEL(shell
);
59 static const WCHAR SV_CLASS_NAME
[] = {'S', 'H', 'E', 'L', 'L', 'D', 'L', 'L', '_', 'D', 'e', 'f', 'V', 'i', 'e', 'w', 0};
66 } LISTVIEW_SORT_INFO
, *LPLISTVIEW_SORT_INFO
;
68 #define SHV_CHANGE_NOTIFY WM_USER + 0x1111
71 public CWindowImpl
<CDefView
, CWindow
, CControlWinTraits
>,
72 public CComObjectRootEx
<CComMultiThreadModelNoCS
>,
75 public IShellFolderView
,
76 public IOleCommandTarget
,
80 public IServiceProvider
83 CComPtr
<IShellFolder
> m_pSFParent
;
84 CComPtr
<IShellFolder2
> m_pSF2Parent
;
85 CComPtr
<IShellBrowser
> m_pShellBrowser
;
86 CComPtr
<ICommDlgBrowser
> m_pCommDlgBrowser
;
87 HWND m_hWndList
; /* ListView control */
89 FOLDERSETTINGS m_FolderSettings
;
94 LPITEMIDLIST
*m_apidl
;
95 LISTVIEW_SORT_INFO m_sortInfo
;
96 ULONG m_hNotify
; /* change notification handle */
100 CComPtr
<IAdviseSink
> m_pAdvSink
;
102 CComPtr
<IDropTarget
> m_pCurDropTarget
; /* The sub-item, which is currently dragged over */
103 CComPtr
<IDataObject
> m_pCurDataObject
; /* The dragged data-object */
104 LONG m_iDragOverItem
; /* Dragged over item's index, iff m_pCurDropTarget != NULL */
105 UINT m_cScrollDelay
; /* Send a WM_*SCROLL msg every 250 ms during drag-scroll */
106 POINT m_ptLastMousePos
; /* Mouse position at last DragOver call */
108 CComPtr
<IContextMenu
> m_pCM
;
116 HRESULT
_MergeToolbar();
121 HRESULT WINAPI
Initialize(IShellFolder
*shellFolder
);
122 HRESULT
IncludeObject(LPCITEMIDLIST pidl
);
123 HRESULT
OnDefaultCommand();
124 HRESULT
OnStateChange(UINT uFlags
);
126 void SetStyle(DWORD dwAdd
, DWORD dwRemove
);
128 void UpdateListColors();
130 static INT CALLBACK
CompareItems(LPVOID lParam1
, LPVOID lParam2
, LPARAM lpData
);
131 static INT CALLBACK
ListViewCompareItems(LPVOID lParam1
, LPVOID lParam2
, LPARAM lpData
);
132 int LV_FindItemByPidl(LPCITEMIDLIST pidl
);
133 BOOLEAN
LV_AddItem(LPCITEMIDLIST pidl
);
134 BOOLEAN
LV_DeleteItem(LPCITEMIDLIST pidl
);
135 BOOLEAN
LV_RenameItem(LPCITEMIDLIST pidlOld
, LPCITEMIDLIST pidlNew
);
136 static INT CALLBACK
fill_list(LPVOID ptr
, LPVOID arg
);
138 HMENU
BuildFileMenu();
139 void PrepareShowFileMenu(HMENU hSubMenu
);
140 void PrepareShowViewMenu(HMENU hSubMenu
);
141 UINT
GetSelections();
142 HRESULT
OpenSelectedItems();
144 void DoActivate(UINT uState
);
145 HRESULT
drag_notify_subitem(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
146 LRESULT
OnExplorerCommand(UINT uCommand
, BOOL bUseSelection
);
148 // *** IOleWindow methods ***
149 virtual HRESULT STDMETHODCALLTYPE
GetWindow(HWND
*lphwnd
);
150 virtual HRESULT STDMETHODCALLTYPE
ContextSensitiveHelp(BOOL fEnterMode
);
152 // *** IShellView methods ***
153 virtual HRESULT STDMETHODCALLTYPE
TranslateAccelerator(MSG
*pmsg
);
154 virtual HRESULT STDMETHODCALLTYPE
EnableModeless(BOOL fEnable
);
155 virtual HRESULT STDMETHODCALLTYPE
UIActivate(UINT uState
);
156 virtual HRESULT STDMETHODCALLTYPE
Refresh();
157 virtual HRESULT STDMETHODCALLTYPE
CreateViewWindow(IShellView
*psvPrevious
, LPCFOLDERSETTINGS pfs
, IShellBrowser
*psb
, RECT
*prcView
, HWND
*phWnd
);
158 virtual HRESULT STDMETHODCALLTYPE
DestroyViewWindow();
159 virtual HRESULT STDMETHODCALLTYPE
GetCurrentInfo(LPFOLDERSETTINGS pfs
);
160 virtual HRESULT STDMETHODCALLTYPE
AddPropertySheetPages(DWORD dwReserved
, LPFNSVADDPROPSHEETPAGE pfn
, LPARAM lparam
);
161 virtual HRESULT STDMETHODCALLTYPE
SaveViewState();
162 virtual HRESULT STDMETHODCALLTYPE
SelectItem(LPCITEMIDLIST pidlItem
, SVSIF uFlags
);
163 virtual HRESULT STDMETHODCALLTYPE
GetItemObject(UINT uItem
, REFIID riid
, void **ppv
);
165 // *** IFolderView methods ***
166 virtual HRESULT STDMETHODCALLTYPE
GetCurrentViewMode(UINT
*pViewMode
);
167 virtual HRESULT STDMETHODCALLTYPE
SetCurrentViewMode(UINT ViewMode
);
168 virtual HRESULT STDMETHODCALLTYPE
GetFolder(REFIID riid
, void **ppv
);
169 virtual HRESULT STDMETHODCALLTYPE
Item(int iItemIndex
, LPITEMIDLIST
*ppidl
);
170 virtual HRESULT STDMETHODCALLTYPE
ItemCount(UINT uFlags
, int *pcItems
);
171 virtual HRESULT STDMETHODCALLTYPE
Items(UINT uFlags
, REFIID riid
, void **ppv
);
172 virtual HRESULT STDMETHODCALLTYPE
GetSelectionMarkedItem(int *piItem
);
173 virtual HRESULT STDMETHODCALLTYPE
GetFocusedItem(int *piItem
);
174 virtual HRESULT STDMETHODCALLTYPE
GetItemPosition(LPCITEMIDLIST pidl
, POINT
*ppt
);
175 virtual HRESULT STDMETHODCALLTYPE
GetSpacing(POINT
*ppt
);
176 virtual HRESULT STDMETHODCALLTYPE
GetDefaultSpacing(POINT
*ppt
);
177 virtual HRESULT STDMETHODCALLTYPE
GetAutoArrange();
178 virtual HRESULT STDMETHODCALLTYPE
SelectItem(int iItem
, DWORD dwFlags
);
179 virtual HRESULT STDMETHODCALLTYPE
SelectAndPositionItems(UINT cidl
, PCUITEMID_CHILD_ARRAY apidl
, POINT
*apt
, DWORD dwFlags
);
181 // *** IShellFolderView methods ***
182 virtual HRESULT STDMETHODCALLTYPE
Rearrange(LPARAM sort
);
183 virtual HRESULT STDMETHODCALLTYPE
GetArrangeParam(LPARAM
*sort
);
184 virtual HRESULT STDMETHODCALLTYPE
ArrangeGrid();
185 virtual HRESULT STDMETHODCALLTYPE
AutoArrange();
186 virtual HRESULT STDMETHODCALLTYPE
AddObject(PITEMID_CHILD pidl
, UINT
*item
);
187 virtual HRESULT STDMETHODCALLTYPE
GetObject(PITEMID_CHILD
*pidl
, UINT item
);
188 virtual HRESULT STDMETHODCALLTYPE
RemoveObject(PITEMID_CHILD pidl
, UINT
*item
);
189 virtual HRESULT STDMETHODCALLTYPE
GetObjectCount(UINT
*count
);
190 virtual HRESULT STDMETHODCALLTYPE
SetObjectCount(UINT count
, UINT flags
);
191 virtual HRESULT STDMETHODCALLTYPE
UpdateObject(PITEMID_CHILD pidl_old
, PITEMID_CHILD pidl_new
, UINT
*item
);
192 virtual HRESULT STDMETHODCALLTYPE
RefreshObject(PITEMID_CHILD pidl
, UINT
*item
);
193 virtual HRESULT STDMETHODCALLTYPE
SetRedraw(BOOL redraw
);
194 virtual HRESULT STDMETHODCALLTYPE
GetSelectedCount(UINT
*count
);
195 virtual HRESULT STDMETHODCALLTYPE
GetSelectedObjects(PCUITEMID_CHILD
**pidl
, UINT
*items
);
196 virtual HRESULT STDMETHODCALLTYPE
IsDropOnSource(IDropTarget
*drop_target
);
197 virtual HRESULT STDMETHODCALLTYPE
GetDragPoint(POINT
*pt
);
198 virtual HRESULT STDMETHODCALLTYPE
GetDropPoint(POINT
*pt
);
199 virtual HRESULT STDMETHODCALLTYPE
MoveIcons(IDataObject
*obj
);
200 virtual HRESULT STDMETHODCALLTYPE
SetItemPos(PCUITEMID_CHILD pidl
, POINT
*pt
);
201 virtual HRESULT STDMETHODCALLTYPE
IsBkDropTarget(IDropTarget
*drop_target
);
202 virtual HRESULT STDMETHODCALLTYPE
SetClipboard(BOOL move
);
203 virtual HRESULT STDMETHODCALLTYPE
SetPoints(IDataObject
*obj
);
204 virtual HRESULT STDMETHODCALLTYPE
GetItemSpacing(ITEMSPACING
*spacing
);
205 virtual HRESULT STDMETHODCALLTYPE
SetCallback(IShellFolderViewCB
*new_cb
, IShellFolderViewCB
**old_cb
);
206 virtual HRESULT STDMETHODCALLTYPE
Select(UINT flags
);
207 virtual HRESULT STDMETHODCALLTYPE
QuerySupport(UINT
*support
);
208 virtual HRESULT STDMETHODCALLTYPE
SetAutomationObject(IDispatch
*disp
);
210 // *** IOleCommandTarget methods ***
211 virtual HRESULT STDMETHODCALLTYPE
QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
, OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
);
212 virtual HRESULT STDMETHODCALLTYPE
Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
);
214 // *** IDropTarget methods ***
215 virtual HRESULT STDMETHODCALLTYPE
DragEnter(IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
216 virtual HRESULT STDMETHODCALLTYPE
DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
217 virtual HRESULT STDMETHODCALLTYPE
DragLeave();
218 virtual HRESULT STDMETHODCALLTYPE
Drop(IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
220 // *** IDropSource methods ***
221 virtual HRESULT STDMETHODCALLTYPE
QueryContinueDrag(BOOL fEscapePressed
, DWORD grfKeyState
);
222 virtual HRESULT STDMETHODCALLTYPE
GiveFeedback(DWORD dwEffect
);
224 // *** IViewObject methods ***
225 virtual HRESULT STDMETHODCALLTYPE
Draw(DWORD dwDrawAspect
, LONG lindex
, void *pvAspect
, DVTARGETDEVICE
*ptd
,
226 HDC hdcTargetDev
, HDC hdcDraw
, LPCRECTL lprcBounds
, LPCRECTL lprcWBounds
,
227 BOOL ( STDMETHODCALLTYPE
*pfnContinue
)(ULONG_PTR dwContinue
), ULONG_PTR dwContinue
);
228 virtual HRESULT STDMETHODCALLTYPE
GetColorSet(DWORD dwDrawAspect
, LONG lindex
, void *pvAspect
,
229 DVTARGETDEVICE
*ptd
, HDC hicTargetDev
, LOGPALETTE
**ppColorSet
);
230 virtual HRESULT STDMETHODCALLTYPE
Freeze(DWORD dwDrawAspect
, LONG lindex
, void *pvAspect
, DWORD
*pdwFreeze
);
231 virtual HRESULT STDMETHODCALLTYPE
Unfreeze(DWORD dwFreeze
);
232 virtual HRESULT STDMETHODCALLTYPE
SetAdvise(DWORD aspects
, DWORD advf
, IAdviseSink
*pAdvSink
);
233 virtual HRESULT STDMETHODCALLTYPE
GetAdvise(DWORD
*pAspects
, DWORD
*pAdvf
, IAdviseSink
**ppAdvSink
);
235 // *** IServiceProvider methods ***
236 virtual HRESULT STDMETHODCALLTYPE
QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
);
239 LRESULT
OnShowWindow(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
240 LRESULT
OnGetDlgCode(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
241 LRESULT
OnDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
242 LRESULT
OnEraseBackground(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
243 LRESULT
OnSysColorChange(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
244 LRESULT
OnGetShellBrowser(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
245 LRESULT
OnCreate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
246 LRESULT
OnContextMenu(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
247 LRESULT
OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
248 LRESULT
OnActivate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
249 LRESULT
OnSetFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
250 LRESULT
OnKillFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
251 LRESULT
OnCommand(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
252 LRESULT
OnNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
253 LRESULT
OnChangeNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
254 LRESULT
OnCustomItem(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
255 LRESULT
OnSettingChange(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
256 LRESULT
OnInitMenuPopup(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
258 static ATL::CWndClassInfo
& GetWndClassInfo()
260 static ATL::CWndClassInfo wc
=
262 { sizeof(WNDCLASSEX
), 0, StartWindowProc
,
264 LoadCursor(NULL
, IDC_ARROW
), (HBRUSH
)(COLOR_BACKGROUND
+ 1), NULL
, SV_CLASS_NAME
, NULL
266 NULL
, NULL
, IDC_ARROW
, TRUE
, 0, _T("")
271 virtual WNDPROC
GetWindowProc()
276 static LRESULT CALLBACK
WindowProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
281 // must hold a reference during message handling
282 pThis
= reinterpret_cast<CDefView
*>(hWnd
);
284 result
= CWindowImpl
<CDefView
, CWindow
, CControlWinTraits
>::WindowProc(hWnd
, uMsg
, wParam
, lParam
);
289 BEGIN_MSG_MAP(CDefView
)
290 MESSAGE_HANDLER(WM_SIZE
, OnSize
)
291 MESSAGE_HANDLER(WM_SETFOCUS
, OnSetFocus
)
292 MESSAGE_HANDLER(WM_KILLFOCUS
, OnKillFocus
)
293 MESSAGE_HANDLER(WM_CREATE
, OnCreate
)
294 MESSAGE_HANDLER(WM_ACTIVATE
, OnActivate
)
295 MESSAGE_HANDLER(WM_NOTIFY
, OnNotify
)
296 MESSAGE_HANDLER(WM_COMMAND
, OnCommand
)
297 MESSAGE_HANDLER(SHV_CHANGE_NOTIFY
, OnChangeNotify
)
298 MESSAGE_HANDLER(WM_CONTEXTMENU
, OnContextMenu
)
299 MESSAGE_HANDLER(WM_DRAWITEM
, OnCustomItem
)
300 MESSAGE_HANDLER(WM_MEASUREITEM
, OnCustomItem
)
301 MESSAGE_HANDLER(WM_SHOWWINDOW
, OnShowWindow
)
302 MESSAGE_HANDLER(WM_GETDLGCODE
, OnGetDlgCode
)
303 MESSAGE_HANDLER(WM_DESTROY
, OnDestroy
)
304 MESSAGE_HANDLER(WM_ERASEBKGND
, OnEraseBackground
)
305 MESSAGE_HANDLER(WM_SYSCOLORCHANGE
, OnSysColorChange
)
306 MESSAGE_HANDLER(CWM_GETISHELLBROWSER
, OnGetShellBrowser
)
307 MESSAGE_HANDLER(WM_SETTINGCHANGE
, OnSettingChange
)
308 MESSAGE_HANDLER(WM_INITMENUPOPUP
, OnInitMenuPopup
)
311 BEGIN_COM_MAP(CDefView
)
312 COM_INTERFACE_ENTRY_IID(IID_IOleWindow
, IOleWindow
)
313 COM_INTERFACE_ENTRY_IID(IID_IShellView
, IShellView
)
314 COM_INTERFACE_ENTRY_IID(IID_IFolderView
, IFolderView
)
315 COM_INTERFACE_ENTRY_IID(IID_IShellFolderView
, IShellFolderView
)
316 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget
, IOleCommandTarget
)
317 COM_INTERFACE_ENTRY_IID(IID_IDropTarget
, IDropTarget
)
318 COM_INTERFACE_ENTRY_IID(IID_IDropSource
, IDropSource
)
319 COM_INTERFACE_ENTRY_IID(IID_IViewObject
, IViewObject
)
320 COM_INTERFACE_ENTRY_IID(IID_IServiceProvider
, IServiceProvider
)
324 /* ListView Header ID's */
325 #define LISTVIEW_COLUMN_NAME 0
326 #define LISTVIEW_COLUMN_SIZE 1
327 #define LISTVIEW_COLUMN_TYPE 2
328 #define LISTVIEW_COLUMN_TIME 3
329 #define LISTVIEW_COLUMN_ATTRIB 4
332 #define IDM_VIEW_FILES (FCIDM_SHVIEWFIRST + 0x500)
333 #define IDM_VIEW_IDW (FCIDM_SHVIEWFIRST + 0x501)
334 #define IDM_MYFILEITEM (FCIDM_SHVIEWFIRST + 0x502)
336 #define ID_LISTVIEW 1
339 #define GET_WM_COMMAND_ID(wp, lp) LOWORD(wp)
340 #define GET_WM_COMMAND_HWND(wp, lp) (HWND)(lp)
341 #define GET_WM_COMMAND_CMD(wp, lp) HIWORD(wp)
343 typedef void (CALLBACK
*PFNSHGETSETTINGSPROC
)(LPSHELLFLAGSTATE lpsfs
, DWORD dwMask
);
345 CDefView::CDefView() :
349 m_menusLoaded(FALSE
),
362 ZeroMemory(&m_FolderSettings
, sizeof(m_FolderSettings
));
363 ZeroMemory(&m_sortInfo
, sizeof(m_sortInfo
));
364 ZeroMemory(&m_ptLastMousePos
, sizeof(m_ptLastMousePos
));
365 ZeroMemory(&m_Category
, sizeof(m_Category
));
368 CDefView::~CDefView()
370 TRACE(" destroying IShellView(%p)\n", this);
380 HRESULT WINAPI
CDefView::Initialize(IShellFolder
*shellFolder
)
382 m_pSFParent
= shellFolder
;
383 shellFolder
->QueryInterface(IID_PPV_ARG(IShellFolder2
, &m_pSF2Parent
));
388 /**********************************************************
390 * ##### helperfunctions for communication with ICommDlgBrowser #####
392 HRESULT
CDefView::IncludeObject(LPCITEMIDLIST pidl
)
396 if (m_pCommDlgBrowser
.p
!= NULL
)
398 TRACE("ICommDlgBrowser::IncludeObject pidl=%p\n", pidl
);
399 ret
= m_pCommDlgBrowser
->IncludeObject((IShellView
*)this, pidl
);
400 TRACE("--0x%08x\n", ret
);
406 HRESULT
CDefView::OnDefaultCommand()
408 HRESULT ret
= S_FALSE
;
410 if (m_pCommDlgBrowser
.p
!= NULL
)
412 TRACE("ICommDlgBrowser::OnDefaultCommand\n");
413 ret
= m_pCommDlgBrowser
->OnDefaultCommand((IShellView
*)this);
414 TRACE("-- returns %08x\n", ret
);
420 HRESULT
CDefView::OnStateChange(UINT uFlags
)
422 HRESULT ret
= S_FALSE
;
424 if (m_pCommDlgBrowser
.p
!= NULL
)
426 TRACE("ICommDlgBrowser::OnStateChange flags=%x\n", uFlags
);
427 ret
= m_pCommDlgBrowser
->OnStateChange((IShellView
*)this, uFlags
);
433 /**********************************************************
434 * set the toolbar of the filedialog buttons
436 * - activates the buttons from the shellbrowser according to
439 void CDefView::CheckToolbar()
445 if (m_pCommDlgBrowser
!= NULL
)
447 m_pShellBrowser
->SendControlMsg(FCW_TOOLBAR
, TB_CHECKBUTTON
,
448 FCIDM_TB_SMALLICON
, (m_FolderSettings
.ViewMode
== FVM_LIST
) ? TRUE
: FALSE
, &result
);
449 m_pShellBrowser
->SendControlMsg(FCW_TOOLBAR
, TB_CHECKBUTTON
,
450 FCIDM_TB_REPORTVIEW
, (m_FolderSettings
.ViewMode
== FVM_DETAILS
) ? TRUE
: FALSE
, &result
);
451 m_pShellBrowser
->SendControlMsg(FCW_TOOLBAR
, TB_ENABLEBUTTON
,
452 FCIDM_TB_SMALLICON
, TRUE
, &result
);
453 m_pShellBrowser
->SendControlMsg(FCW_TOOLBAR
, TB_ENABLEBUTTON
,
454 FCIDM_TB_REPORTVIEW
, TRUE
, &result
);
458 /**********************************************************
460 * ##### helperfunctions for initializing the view #####
462 /**********************************************************
463 * change the style of the listview control
465 void CDefView::SetStyle(DWORD dwAdd
, DWORD dwRemove
)
469 TRACE("(%p)\n", this);
471 tmpstyle
= ::GetWindowLongPtrW(m_hWndList
, GWL_STYLE
);
472 ::SetWindowLongPtrW(m_hWndList
, GWL_STYLE
, dwAdd
| (tmpstyle
& ~dwRemove
));
475 /**********************************************************
476 * ShellView_CreateList()
478 * - creates the list view window
480 BOOL
CDefView::CreateList()
481 { DWORD dwStyle
, dwExStyle
;
485 dwStyle
= WS_TABSTOP
| WS_VISIBLE
| WS_CHILDWINDOW
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
|
486 LVS_SHAREIMAGELISTS
| LVS_EDITLABELS
| LVS_AUTOARRANGE
;
487 dwExStyle
= WS_EX_CLIENTEDGE
;
489 if (m_FolderSettings
.fFlags
& FWF_DESKTOP
)
490 dwStyle
|= LVS_ALIGNLEFT
;
492 dwStyle
|= LVS_ALIGNTOP
| LVS_SHOWSELALWAYS
;
494 switch (m_FolderSettings
.ViewMode
)
501 dwStyle
|= LVS_REPORT
;
505 dwStyle
|= LVS_SMALLICON
;
517 if (m_FolderSettings
.fFlags
& FWF_AUTOARRANGE
)
518 dwStyle
|= LVS_AUTOARRANGE
;
520 if (m_FolderSettings
.fFlags
& FWF_DESKTOP
)
521 m_FolderSettings
.fFlags
|= FWF_NOCLIENTEDGE
| FWF_NOSCROLL
;
523 if (m_FolderSettings
.fFlags
& FWF_SINGLESEL
)
524 dwStyle
|= LVS_SINGLESEL
;
526 if (m_FolderSettings
.fFlags
& FWF_NOCLIENTEDGE
)
527 dwExStyle
&= ~WS_EX_CLIENTEDGE
;
529 m_hWndList
= CreateWindowExW( dwExStyle
,
542 m_sortInfo
.bIsAscending
= TRUE
;
543 m_sortInfo
.nHeaderID
= -1;
544 m_sortInfo
.nLastHeaderID
= -1;
548 /* UpdateShellSettings(); */
552 void CDefView::UpdateListColors()
554 if (m_FolderSettings
.fFlags
& FWF_DESKTOP
)
556 /* Check if drop shadows option is enabled */
557 BOOL bDropShadow
= FALSE
;
558 DWORD cbDropShadow
= sizeof(bDropShadow
);
559 WCHAR wszBuf
[16] = L
"";
561 RegGetValueW(HKEY_CURRENT_USER
, L
"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced",
562 L
"ListviewShadow", RRF_RT_DWORD
, NULL
, &bDropShadow
, &cbDropShadow
);
563 if (bDropShadow
&& SystemParametersInfoW(SPI_GETDESKWALLPAPER
, _countof(wszBuf
), wszBuf
, 0) && wszBuf
[0])
565 SendMessageW(m_hWndList
, LVM_SETTEXTBKCOLOR
, 0, CLR_NONE
);
566 SendMessageW(m_hWndList
, LVM_SETBKCOLOR
, 0, CLR_NONE
);
567 SendMessageW(m_hWndList
, LVM_SETTEXTCOLOR
, 0, RGB(255, 255, 255));
568 SendMessageW(m_hWndList
, LVM_SETEXTENDEDLISTVIEWSTYLE
, LVS_EX_TRANSPARENTSHADOWTEXT
, LVS_EX_TRANSPARENTSHADOWTEXT
);
572 COLORREF crDesktop
= GetSysColor(COLOR_DESKTOP
);
573 SendMessageW(m_hWndList
, LVM_SETTEXTBKCOLOR
, 0, crDesktop
);
574 SendMessageW(m_hWndList
, LVM_SETBKCOLOR
, 0, crDesktop
);
575 if (GetRValue(crDesktop
) + GetGValue(crDesktop
) + GetBValue(crDesktop
) > 128 * 3)
576 SendMessageW(m_hWndList
, LVM_SETTEXTCOLOR
, 0, RGB(0, 0, 0));
578 SendMessageW(m_hWndList
, LVM_SETTEXTCOLOR
, 0, RGB(255, 255, 255));
579 SendMessageW(m_hWndList
, LVM_SETEXTENDEDLISTVIEWSTYLE
, LVS_EX_TRANSPARENTSHADOWTEXT
, 0);
584 /**********************************************************
585 * ShellView_InitList()
587 * - adds all needed columns to the shellview
589 BOOL
CDefView::InitList()
597 SendMessageW(m_hWndList
, LVM_DELETEALLITEMS
, 0, 0);
599 lvColumn
.mask
= LVCF_FMT
| LVCF_WIDTH
| LVCF_TEXT
;
600 lvColumn
.pszText
= szTemp
;
604 for (int i
= 0; 1; i
++)
606 if (FAILED(m_pSF2Parent
->GetDetailsOf(NULL
, i
, &sd
)))
609 lvColumn
.fmt
= sd
.fmt
;
610 lvColumn
.cx
= sd
.cxChar
* 8; /* chars->pixel */
611 StrRetToStrNW( szTemp
, 50, &sd
.str
, NULL
);
612 SendMessageW(m_hWndList
, LVM_INSERTCOLUMNW
, i
, (LPARAM
) &lvColumn
);
620 SendMessageW(m_hWndList
, LVM_SETIMAGELIST
, LVSIL_SMALL
, (LPARAM
)ShellSmallIconList
);
621 SendMessageW(m_hWndList
, LVM_SETIMAGELIST
, LVSIL_NORMAL
, (LPARAM
)ShellBigIconList
);
626 /**********************************************************
627 * ShellView_CompareItems()
630 * internal, CALLBACK for DSA_Sort
632 INT CALLBACK
CDefView::CompareItems(LPVOID lParam1
, LPVOID lParam2
, LPARAM lpData
)
635 TRACE("pidl1=%p pidl2=%p lpsf=%p\n", lParam1
, lParam2
, (LPVOID
) lpData
);
640 ret
= (SHORT
)SCODE_CODE(((IShellFolder
*)lpData
)->CompareIDs(0, (LPITEMIDLIST
)lParam1
, (LPITEMIDLIST
)lParam2
));
641 TRACE("ret=%i\n", ret
);
646 /*************************************************************************
647 * ShellView_ListViewCompareItems
649 * Compare Function for the Listview (FileOpen Dialog)
652 * lParam1 [I] the first ItemIdList to compare with
653 * lParam2 [I] the second ItemIdList to compare with
654 * lpData [I] The column ID for the header Ctrl to process
657 * A negative value if the first item should precede the second,
658 * a positive value if the first item should follow the second,
659 * or zero if the two items are equivalent
662 * FIXME: function does what ShellView_CompareItems is supposed to do.
663 * unify it and figure out how to use the undocumented first parameter
664 * of IShellFolder_CompareIDs to do the job this function does and
665 * move this code to IShellFolder.
666 * make LISTVIEW_SORT_INFO obsolete
667 * the way this function works is only usable if we had only
668 * filesystemfolders (25/10/99 jsch)
670 INT CALLBACK
CDefView::ListViewCompareItems(LPVOID lParam1
, LPVOID lParam2
, LPARAM lpData
)
674 char strName1
[MAX_PATH
], strName2
[MAX_PATH
];
675 BOOL bIsFolder1
, bIsFolder2
, bIsBothFolder
;
676 LPITEMIDLIST pItemIdList1
= (LPITEMIDLIST
) lParam1
;
677 LPITEMIDLIST pItemIdList2
= (LPITEMIDLIST
) lParam2
;
678 LISTVIEW_SORT_INFO
*pSortInfo
= (LPLISTVIEW_SORT_INFO
) lpData
;
681 bIsFolder1
= _ILIsFolder(pItemIdList1
);
682 bIsFolder2
= _ILIsFolder(pItemIdList2
);
683 bIsBothFolder
= bIsFolder1
&& bIsFolder2
;
685 /* When sorting between a File and a Folder, the Folder gets sorted first */
686 if ( (bIsFolder1
|| bIsFolder2
) && !bIsBothFolder
)
688 nDiff
= bIsFolder1
? -1 : 1;
692 /* Sort by Time: Folders or Files can be sorted */
694 if(pSortInfo
->nHeaderID
== LISTVIEW_COLUMN_TIME
)
696 _ILGetFileDateTime(pItemIdList1
, &fd1
);
697 _ILGetFileDateTime(pItemIdList2
, &fd2
);
698 nDiff
= CompareFileTime(&fd2
, &fd1
);
700 /* Sort by Attribute: Folder or Files can be sorted */
701 else if(pSortInfo
->nHeaderID
== LISTVIEW_COLUMN_ATTRIB
)
703 _ILGetFileAttributes(pItemIdList1
, strName1
, MAX_PATH
);
704 _ILGetFileAttributes(pItemIdList2
, strName2
, MAX_PATH
);
705 nDiff
= lstrcmpiA(strName1
, strName2
);
707 /* Sort by FileName: Folder or Files can be sorted */
708 else if (pSortInfo
->nHeaderID
== LISTVIEW_COLUMN_NAME
|| bIsBothFolder
)
711 _ILSimpleGetText(pItemIdList1
, strName1
, MAX_PATH
);
712 _ILSimpleGetText(pItemIdList2
, strName2
, MAX_PATH
);
713 nDiff
= lstrcmpiA(strName1
, strName2
);
715 /* Sort by File Size, Only valid for Files */
716 else if (pSortInfo
->nHeaderID
== LISTVIEW_COLUMN_SIZE
)
718 nDiff
= (INT
)(_ILGetFileSize(pItemIdList1
, NULL
, 0) - _ILGetFileSize(pItemIdList2
, NULL
, 0));
720 /* Sort by File Type, Only valid for Files */
721 else if (pSortInfo
->nHeaderID
== LISTVIEW_COLUMN_TYPE
)
724 _ILGetFileType(pItemIdList1
, strName1
, MAX_PATH
);
725 _ILGetFileType(pItemIdList2
, strName2
, MAX_PATH
);
726 nDiff
= lstrcmpiA(strName1
, strName2
);
729 /* If the Date, FileSize, FileType, Attrib was the same, sort by FileName */
733 _ILSimpleGetText(pItemIdList1
, strName1
, MAX_PATH
);
734 _ILSimpleGetText(pItemIdList2
, strName2
, MAX_PATH
);
735 nDiff
= lstrcmpiA(strName1
, strName2
);
738 if (!pSortInfo
->bIsAscending
)
746 /**********************************************************
747 * LV_FindItemByPidl()
749 int CDefView::LV_FindItemByPidl(LPCITEMIDLIST pidl
)
753 lvItem
.mask
= LVIF_PARAM
;
755 for (lvItem
.iItem
= 0;
756 SendMessageW(m_hWndList
, LVM_GETITEMW
, 0, (LPARAM
) &lvItem
);
759 LPITEMIDLIST currentpidl
= (LPITEMIDLIST
) lvItem
.lParam
;
760 HRESULT hr
= m_pSFParent
->CompareIDs(0, pidl
, currentpidl
);
762 if (SUCCEEDED(hr
) && !HRESULT_CODE(hr
))
770 /**********************************************************
773 BOOLEAN
CDefView::LV_AddItem(LPCITEMIDLIST pidl
)
777 TRACE("(%p)(pidl=%p)\n", this, pidl
);
779 lvItem
.mask
= LVIF_TEXT
| LVIF_IMAGE
| LVIF_PARAM
; /*set the mask*/
780 lvItem
.iItem
= ListView_GetItemCount(m_hWndList
); /*add the item to the end of the list*/
782 lvItem
.lParam
= (LPARAM
) ILClone(ILFindLastID(pidl
)); /*set the item's data*/
783 lvItem
.pszText
= LPSTR_TEXTCALLBACKW
; /*get text on a callback basis*/
784 lvItem
.iImage
= I_IMAGECALLBACK
; /*get the image on a callback basis*/
786 if (SendMessageW(m_hWndList
, LVM_INSERTITEMW
, 0, (LPARAM
)&lvItem
) == -1)
792 /**********************************************************
795 BOOLEAN
CDefView::LV_DeleteItem(LPCITEMIDLIST pidl
)
799 TRACE("(%p)(pidl=%p)\n", this, pidl
);
801 nIndex
= LV_FindItemByPidl(ILFindLastID(pidl
));
803 return (-1 == ListView_DeleteItem(m_hWndList
, nIndex
)) ? FALSE
: TRUE
;
806 /**********************************************************
809 BOOLEAN
CDefView::LV_RenameItem(LPCITEMIDLIST pidlOld
, LPCITEMIDLIST pidlNew
)
814 TRACE("(%p)(pidlold=%p pidlnew=%p)\n", this, pidlOld
, pidlNew
);
816 nItem
= LV_FindItemByPidl(ILFindLastID(pidlOld
));
820 lvItem
.mask
= LVIF_PARAM
; /* only the pidl */
821 lvItem
.iItem
= nItem
;
822 SendMessageW(m_hWndList
, LVM_GETITEMW
, 0, (LPARAM
) &lvItem
);
824 SHFree((LPITEMIDLIST
)lvItem
.lParam
);
825 lvItem
.mask
= LVIF_PARAM
|LVIF_IMAGE
;
826 lvItem
.iItem
= nItem
;
827 lvItem
.lParam
= (LPARAM
) ILClone(ILFindLastID(pidlNew
)); /* set the item's data */
828 lvItem
.iImage
= SHMapPIDLToSystemImageListIndex(m_pSFParent
, pidlNew
, 0);
829 SendMessageW(m_hWndList
, LVM_SETITEMW
, 0, (LPARAM
) &lvItem
);
830 SendMessageW(m_hWndList
, LVM_UPDATE
, nItem
, 0);
831 return TRUE
; /* FIXME: better handling */
837 /**********************************************************
838 * ShellView_FillList()
840 * - gets the objectlist from the shellfolder
842 * - fills the list into the view
844 INT CALLBACK
CDefView::fill_list( LPVOID ptr
, LPVOID arg
)
846 LPITEMIDLIST pidl
= (LPITEMIDLIST
)ptr
;
847 CDefView
*pThis
= static_cast<CDefView
*>(arg
);
848 /* in a commdlg This works as a filemask*/
849 if (pThis
->IncludeObject(pidl
) == S_OK
)
850 pThis
->LV_AddItem(pidl
);
856 HRESULT
CDefView::FillList()
858 LPENUMIDLIST pEnumIDList
;
866 /* get the itemlist from the shfolder*/
867 hRes
= m_pSFParent
->EnumObjects(m_hWnd
, SHCONTF_NONFOLDERS
| SHCONTF_FOLDERS
, &pEnumIDList
);
875 /* create a pointer array */
876 hdpa
= DPA_Create(16);
879 return(E_OUTOFMEMORY
);
882 /* copy the items into the array*/
883 while((S_OK
== pEnumIDList
->Next(1, &pidl
, &dwFetched
)) && dwFetched
)
885 if (DPA_InsertPtr(hdpa
, 0x7fff, pidl
) == -1)
892 DPA_Sort(hdpa
, CompareItems
, (LPARAM
)m_pSFParent
.p
);
894 /*turn the listview's redrawing off*/
895 SendMessageA(m_hWndList
, WM_SETREDRAW
, FALSE
, 0);
897 DPA_DestroyCallback( hdpa
, fill_list
, (void *)this);
899 /*turn the listview's redrawing back on and force it to draw*/
900 SendMessageA(m_hWndList
, WM_SETREDRAW
, TRUE
, 0);
902 pEnumIDList
->Release(); /* destroy the list*/
907 LRESULT
CDefView::OnShowWindow(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
909 ::UpdateWindow(m_hWndList
);
914 LRESULT
CDefView::OnGetDlgCode(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
916 return SendMessageW(m_hWndList
, uMsg
, 0, 0);
919 LRESULT
CDefView::OnDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
922 DestroyMenu(m_hMenu
);
923 RevokeDragDrop(m_hWnd
);
924 SHChangeNotifyDeregister(m_hNotify
);
929 LRESULT
CDefView::OnEraseBackground(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
931 if (m_FolderSettings
.fFlags
& (FWF_DESKTOP
| FWF_TRANSPARENT
))
932 return SendMessageW(GetParent(), WM_ERASEBKGND
, wParam
, lParam
); /* redirect to parent */
938 LRESULT
CDefView::OnSysColorChange(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
940 /* Update desktop labels color */
943 /* Forward WM_SYSCOLORCHANGE to common controls */
944 return SendMessageW(m_hWndList
, uMsg
, 0, 0);
947 LRESULT
CDefView::OnGetShellBrowser(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
949 return (LRESULT
)m_pShellBrowser
.p
;
952 /**********************************************************
953 * ShellView_OnCreate()
955 LRESULT
CDefView::OnCreate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
957 CComPtr
<IDropTarget
> pdt
;
958 SHChangeNotifyEntry ntreg
;
959 CComPtr
<IPersistFolder2
> ppf2
;
971 if (SUCCEEDED(QueryInterface(IID_PPV_ARG(IDropTarget
, &pdt
))))
973 if (FAILED(RegisterDragDrop(m_hWnd
, pdt
)))
974 ERR("Registering Drag Drop Failed");
977 /* register for receiving notifications */
978 m_pSFParent
->QueryInterface(IID_PPV_ARG(IPersistFolder2
, &ppf2
));
981 ppf2
->GetCurFolder((LPITEMIDLIST
*)&ntreg
.pidl
);
982 ntreg
.fRecursive
= TRUE
;
983 m_hNotify
= SHChangeNotifyRegister(m_hWnd
, SHCNF_IDLIST
, SHCNE_ALLEVENTS
, SHV_CHANGE_NOTIFY
, 1, &ntreg
);
984 SHFree((LPITEMIDLIST
)ntreg
.pidl
);
987 m_hAccel
= LoadAcceleratorsW(shell32_hInstance
, MAKEINTRESOURCEW(IDA_SHELLVIEW
));
992 /**********************************************************
993 * #### Handling of the menus ####
996 HMENU
CDefView::BuildFileMenu()
999 CComPtr
<IContextMenu
> cm
;
1003 LPCITEMIDLIST
* apidl
= (LPCITEMIDLIST
*)m_apidl
;
1005 hr
= m_pSFParent
->GetUIObjectOf(m_hWnd
, m_cidl
, apidl
, IID_NULL_PPV_ARG(IContextMenu
, &cm
));
1009 HMENU hmenu
= CreatePopupMenu();
1011 //FIXME: get proper numbers ?
1012 const UINT first
= 0x7800;
1013 const UINT last
= 0x7A00;
1014 hr
= cm
->QueryContextMenu(hmenu
, 0, first
, last
, 0);
1018 // TODO: filter or something
1023 void CDefView::PrepareShowFileMenu(HMENU hSubMenu
)
1025 TRACE("(%p)->(submenu=%p) stub\n", this, hSubMenu
);
1030 /* Cleanup the items added previously */
1031 for (int i
= 0; i
< GetMenuItemCount(hSubMenu
); )
1034 mii
.cbSize
= sizeof(mii
);
1035 mii
.fMask
= MIIM_ID
;
1036 GetMenuItemInfoW(hSubMenu
, i
, TRUE
, &mii
);
1038 if (mii
.wID
< 0x8000)
1040 DeleteMenu(hSubMenu
, i
, MF_BYPOSITION
);
1048 /* Insert This item at the beginning of the menu. */
1049 _InsertMenuItemW(hSubMenu
, 0, TRUE
, 0, MFT_SEPARATOR
, NULL
, MFS_ENABLED
);
1050 _InsertMenuItemW(hSubMenu
, 0, TRUE
, IDM_MYFILEITEM
+ 4, MFT_STRING
, L
"Properties", MFS_DISABLED
);
1051 _InsertMenuItemW(hSubMenu
, 0, TRUE
, IDM_MYFILEITEM
+ 3, MFT_STRING
, L
"Rename", MFS_DISABLED
);
1052 _InsertMenuItemW(hSubMenu
, 0, TRUE
, IDM_MYFILEITEM
+ 2, MFT_STRING
, L
"Delete", MFS_DISABLED
);
1053 _InsertMenuItemW(hSubMenu
, 0, TRUE
, IDM_MYFILEITEM
+ 1, MFT_STRING
, L
"Create Shortcut", MFS_DISABLED
);
1054 _InsertMenuItemW(hSubMenu
, 0, TRUE
, 0, MFT_SEPARATOR
, NULL
, MFS_ENABLED
);
1055 _InsertMenuItemW(hSubMenu
, 0, TRUE
, IDM_MYFILEITEM
, MFT_STRING
, L
"New", MFS_ENABLED
);
1057 HMENU menubase
= BuildFileMenu();
1060 int count
= ::GetMenuItemCount(menubase
);
1062 for (int i
= 0; i
< count
; i
++)
1066 MENUITEMINFOW mii
= { 0 };
1067 mii
.cbSize
= sizeof(mii
);
1068 mii
.fMask
= MIIM_STATE
| MIIM_ID
| MIIM_SUBMENU
| MIIM_CHECKMARKS
| MIIM_DATA
| MIIM_STRING
| MIIM_BITMAP
| MIIM_FTYPE
;
1069 mii
.dwTypeData
= label
;
1070 mii
.cch
= _countof(label
);
1071 ::GetMenuItemInfoW(menubase
, i
, TRUE
, &mii
);
1073 TRACE("Adding item %d label %S type %d\n", mii
.wID
, mii
.dwTypeData
, mii
.fType
);
1075 mii
.fType
|= MFT_RADIOCHECK
;
1077 ::InsertMenuItemW(hSubMenu
, IDM_MYFILEITEM
, FALSE
, &mii
);
1080 _InsertMenuItemW(hSubMenu
, IDM_MYFILEITEM
, FALSE
, 0, MFT_SEPARATOR
, NULL
, MFS_ENABLED
);
1082 ::DestroyMenu(menubase
);
1087 void CDefView::PrepareShowViewMenu(HMENU hSubMenu
)
1089 TRACE("(%p)->(submenu=%p)\n", this, hSubMenu
);
1094 if (m_FolderSettings
.ViewMode
>= FVM_FIRST
&& m_FolderSettings
.ViewMode
<= FVM_LAST
)
1096 UINT iItemFirst
= FCIDM_SHVIEW_BIGICON
;
1097 UINT iItemLast
= iItemFirst
+ FVM_LAST
- FVM_FIRST
;
1098 UINT iItem
= iItemFirst
+ m_FolderSettings
.ViewMode
- FVM_FIRST
;
1099 CheckMenuRadioItem(hSubMenu
, iItemFirst
, iItemLast
, iItem
, MF_BYCOMMAND
);
1103 /**********************************************************
1104 * ShellView_GetSelections()
1106 * - fills the m_apidl list with the selected objects
1109 * number of selected items
1111 UINT
CDefView::GetSelections()
1118 m_cidl
= ListView_GetSelectedCount(m_hWndList
);
1119 m_apidl
= (LPITEMIDLIST
*)SHAlloc(m_cidl
* sizeof(LPITEMIDLIST
));
1121 TRACE("selected=%i\n", m_cidl
);
1125 TRACE("-- Items selected =%u\n", m_cidl
);
1127 lvItem
.mask
= LVIF_STATE
| LVIF_PARAM
;
1128 lvItem
.stateMask
= LVIS_SELECTED
;
1130 lvItem
.iSubItem
= 0;
1133 while(SendMessageW(m_hWndList
, LVM_GETITEMW
, 0, (LPARAM
)&lvItem
) && (i
< m_cidl
))
1135 if(lvItem
.state
& LVIS_SELECTED
)
1137 m_apidl
[i
] = (LPITEMIDLIST
)lvItem
.lParam
;
1141 TRACE("-- selected Item found\n");
1150 /**********************************************************
1151 * ShellView_OpenSelectedItems()
1153 HRESULT
CDefView::OpenSelectedItems()
1156 CMINVOKECOMMANDINFO cmi
;
1160 m_cidl
= ListView_GetSelectedCount(m_hWndList
);
1164 hResult
= OnDefaultCommand();
1165 if (hResult
== S_OK
)
1168 hMenu
= CreatePopupMenu();
1172 hResult
= GetItemObject( SVGIO_SELECTION
, IID_PPV_ARG(IContextMenu
, &m_pCM
));
1173 if (FAILED(hResult
))
1176 hResult
= IUnknown_SetSite(m_pCM
, (IShellView
*)this);
1177 //if (FAILED( hResult))
1180 hResult
= m_pCM
->QueryContextMenu(hMenu
, 0, 0x20, 0x7fff, CMF_DEFAULTONLY
);
1181 if (FAILED(hResult
))
1184 uCommand
= GetMenuDefaultItem(hMenu
, FALSE
, 0);
1185 if (uCommand
== (UINT
)-1)
1191 ZeroMemory(&cmi
, sizeof(cmi
));
1192 cmi
.cbSize
= sizeof(cmi
);
1193 cmi
.lpVerb
= (LPCSTR
)MAKEINTRESOURCEA(uCommand
);
1196 hResult
= m_pCM
->InvokeCommand(&cmi
);
1205 IUnknown_SetSite(m_pCM
, NULL
);
1212 /**********************************************************
1213 * ShellView_DoContextMenu()
1215 LRESULT
CDefView::OnContextMenu(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1221 CMINVOKECOMMANDINFO cmi
;
1224 // for some reason I haven't figured out, we sometimes recurse into this method
1231 TRACE("(%p)->(0x%08x 0x%08x) stub\n", this, x
, y
);
1233 hMenu
= CreatePopupMenu();
1237 m_cidl
= ListView_GetSelectedCount(m_hWndList
);
1239 hResult
= GetItemObject( m_cidl
? SVGIO_SELECTION
: SVGIO_BACKGROUND
, IID_PPV_ARG(IContextMenu
, &m_pCM
));
1240 if (FAILED( hResult
))
1243 hResult
= IUnknown_SetSite(m_pCM
, (IShellView
*)this);
1244 //if (FAILED( hResult))
1247 hResult
= m_pCM
->QueryContextMenu(hMenu
, 0, FCIDM_SHVIEWFIRST
, FCIDM_SHVIEWLAST
, CMF_NORMAL
);
1248 if (FAILED( hResult
))
1251 if (m_FolderSettings
.fFlags
& FWF_DESKTOP
)
1252 SetMenuDefaultItem(hMenu
, FCIDM_SHVIEW_OPEN
, MF_BYCOMMAND
);
1254 uCommand
= TrackPopupMenu(hMenu
,
1255 TPM_LEFTALIGN
| TPM_RETURNCMD
| TPM_LEFTBUTTON
| TPM_RIGHTBUTTON
,
1256 x
, y
, 0, m_hWnd
, NULL
);
1260 if (uCommand
== FCIDM_SHVIEW_OPEN
&& OnDefaultCommand() == S_OK
)
1263 ZeroMemory(&cmi
, sizeof(cmi
));
1264 cmi
.cbSize
= sizeof(cmi
);
1265 cmi
.lpVerb
= (LPCSTR
)MAKEINTRESOURCEA(uCommand
);
1267 m_pCM
->InvokeCommand(&cmi
);
1273 IUnknown_SetSite(m_pCM
, NULL
);
1283 LRESULT
CDefView::OnExplorerCommand(UINT uCommand
, BOOL bUseSelection
)
1286 CMINVOKECOMMANDINFO cmi
;
1289 hMenu
= CreatePopupMenu();
1293 hResult
= GetItemObject( bUseSelection
? SVGIO_SELECTION
: SVGIO_BACKGROUND
, IID_PPV_ARG(IContextMenu
, &m_pCM
));
1294 if (FAILED( hResult
))
1297 hResult
= IUnknown_SetSite(m_pCM
, (IShellView
*)this);
1298 //if (FAILED( hResult))
1301 hResult
= m_pCM
->QueryContextMenu(hMenu
, 0, FCIDM_SHVIEWFIRST
, FCIDM_SHVIEWLAST
, CMF_NORMAL
);
1302 if (FAILED( hResult
))
1305 ZeroMemory(&cmi
, sizeof(cmi
));
1306 cmi
.cbSize
= sizeof(cmi
);
1307 cmi
.lpVerb
= (LPCSTR
)MAKEINTRESOURCEA(uCommand
);
1309 m_pCM
->InvokeCommand(&cmi
);
1315 IUnknown_SetSite(m_pCM
, NULL
);
1325 /**********************************************************
1326 * ##### message handling #####
1329 /**********************************************************
1330 * ShellView_OnSize()
1332 LRESULT
CDefView::OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1337 wWidth
= LOWORD(lParam
);
1338 wHeight
= HIWORD(lParam
);
1340 TRACE("%p width=%u height=%u\n", this, wWidth
, wHeight
);
1342 /*resize the ListView to fit our window*/
1345 ::MoveWindow(m_hWndList
, 0, 0, wWidth
, wHeight
, TRUE
);
1351 /**********************************************************
1352 * ShellView_OnDeactivate()
1357 void CDefView::OnDeactivate()
1359 TRACE("%p\n", this);
1361 if (m_uState
!= SVUIA_DEACTIVATE
)
1363 // TODO: cleanup menu after deactivation
1365 m_uState
= SVUIA_DEACTIVATE
;
1369 void CDefView::DoActivate(UINT uState
)
1371 TRACE("%p uState=%x\n", this, uState
);
1373 /*don't do anything if the state isn't really changing */
1374 if (m_uState
== uState
)
1379 if (uState
== SVUIA_DEACTIVATE
)
1389 MENUITEMINFOW mii
= { 0 };
1391 /* initialize EDIT menu */
1392 mii
.cbSize
= sizeof(mii
);
1393 mii
.fMask
= MIIM_SUBMENU
;
1394 if (::GetMenuItemInfoW(m_hMenu
, FCIDM_MENU_EDIT
, FALSE
, &mii
))
1396 HMENU hSubMenu
= mii
.hSubMenu
;
1398 HMENU menubase
= ::LoadMenuW(shell32_hInstance
, L
"MENU_003");
1400 int count
= ::GetMenuItemCount(menubase
);
1401 for (int i
= 0; i
< count
; i
++)
1405 ZeroMemory(&mii
, sizeof(mii
));
1406 mii
.cbSize
= sizeof(mii
);
1407 mii
.fMask
= MIIM_STATE
| MIIM_ID
| MIIM_SUBMENU
| MIIM_CHECKMARKS
| MIIM_DATA
| MIIM_STRING
| MIIM_BITMAP
| MIIM_FTYPE
;
1408 mii
.dwTypeData
= label
;
1409 mii
.cch
= _countof(label
);
1410 ::GetMenuItemInfoW(menubase
, i
, TRUE
, &mii
);
1412 TRACE("Adding item %d label %S type %d\n", mii
.wID
, mii
.dwTypeData
, mii
.fType
);
1414 mii
.fType
|= MFT_RADIOCHECK
;
1416 ::InsertMenuItemW(hSubMenu
, FCIDM_MENU_VIEW_SEP_OPTIONS
, FALSE
, &mii
);
1419 ::DestroyMenu(menubase
);
1422 /* initialize VIEW menu */
1424 mii
.cbSize
= sizeof(mii
);
1425 mii
.fMask
= MIIM_SUBMENU
;
1426 if (::GetMenuItemInfoW(m_hMenu
, FCIDM_MENU_VIEW
, FALSE
, &mii
))
1428 HMENU menubase
= ::LoadMenuW(shell32_hInstance
, L
"MENU_001");
1430 HMENU hSubMenu
= mii
.hSubMenu
;
1432 m_hView
= CreatePopupMenu();
1434 _InsertMenuItemW(hSubMenu
, FCIDM_MENU_VIEW_SEP_OPTIONS
, FALSE
, 0, MFT_SEPARATOR
, NULL
, MFS_ENABLED
);
1436 int count
= ::GetMenuItemCount(menubase
);
1437 for (int i
= 0; i
< count
; i
++)
1441 ZeroMemory(&mii
, sizeof(mii
));
1442 mii
.cbSize
= sizeof(mii
);
1443 mii
.fMask
= MIIM_STATE
| MIIM_ID
| MIIM_SUBMENU
| MIIM_CHECKMARKS
| MIIM_DATA
| MIIM_STRING
| MIIM_BITMAP
| MIIM_FTYPE
;
1444 mii
.dwTypeData
= label
;
1445 mii
.cch
= _countof(label
);
1446 ::GetMenuItemInfoW(menubase
, i
, TRUE
, &mii
);
1448 ::AppendMenuW(m_hView
, mii
.fType
, mii
.wID
, mii
.dwTypeData
);
1450 TRACE("Adding item %d label %S type %d\n", mii
.wID
, mii
.dwTypeData
, mii
.fType
);
1452 mii
.fType
|= MFT_RADIOCHECK
;
1454 ::InsertMenuItemW(hSubMenu
, FCIDM_MENU_VIEW_SEP_OPTIONS
, FALSE
, &mii
);
1457 ::DestroyMenu(menubase
);
1461 TRACE("-- before fnSetMenuSB\n");
1462 m_pShellBrowser
->SetMenuSB(m_hMenu
, 0, m_hWnd
);
1464 m_menusLoaded
= TRUE
;
1468 if (SVUIA_ACTIVATE_FOCUS
== uState
)
1470 ::SetFocus(m_hWndList
);
1478 /**********************************************************
1479 * ShellView_OnActivate()
1481 LRESULT
CDefView::OnActivate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1483 DoActivate(SVUIA_ACTIVATE_FOCUS
);
1487 /**********************************************************
1488 * ShellView_OnSetFocus()
1491 LRESULT
CDefView::OnSetFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1493 TRACE("%p\n", this);
1495 /* Tell the browser one of our windows has received the focus. This
1496 should always be done before merging menus (OnActivate merges the
1497 menus) if one of our windows has the focus.*/
1499 m_pShellBrowser
->OnViewWindowActive((IShellView
*)this);
1500 DoActivate(SVUIA_ACTIVATE_FOCUS
);
1502 /* Set the focus to the listview */
1503 ::SetFocus(m_hWndList
);
1505 /* Notify the ICommDlgBrowser interface */
1506 OnStateChange(CDBOSC_SETFOCUS
);
1511 /**********************************************************
1512 * ShellView_OnKillFocus()
1514 LRESULT
CDefView::OnKillFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1516 TRACE("(%p) stub\n", this);
1518 DoActivate(SVUIA_ACTIVATE_NOFOCUS
);
1519 /* Notify the ICommDlgBrowser */
1520 OnStateChange(CDBOSC_KILLFOCUS
);
1525 /**********************************************************
1526 * ShellView_OnCommand()
1529 * the CmdID's are the ones from the context menu
1531 LRESULT
CDefView::OnCommand(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1537 dwCmdID
= GET_WM_COMMAND_ID(wParam
, lParam
);
1538 dwCmd
= GET_WM_COMMAND_CMD(wParam
, lParam
);
1539 hwndCmd
= GET_WM_COMMAND_HWND(wParam
, lParam
);
1541 TRACE("(%p)->(0x%08x 0x%08x %p) stub\n", this, dwCmdID
, dwCmd
, hwndCmd
);
1545 case FCIDM_SHVIEW_SMALLICON
:
1546 m_FolderSettings
.ViewMode
= FVM_SMALLICON
;
1547 SetStyle (LVS_SMALLICON
, LVS_TYPEMASK
);
1551 case FCIDM_SHVIEW_BIGICON
:
1552 m_FolderSettings
.ViewMode
= FVM_ICON
;
1553 SetStyle (LVS_ICON
, LVS_TYPEMASK
);
1557 case FCIDM_SHVIEW_LISTVIEW
:
1558 m_FolderSettings
.ViewMode
= FVM_LIST
;
1559 SetStyle (LVS_LIST
, LVS_TYPEMASK
);
1563 case FCIDM_SHVIEW_REPORTVIEW
:
1564 m_FolderSettings
.ViewMode
= FVM_DETAILS
;
1565 SetStyle (LVS_REPORT
, LVS_TYPEMASK
);
1569 /* the menu-ID's for sorting are 0x30... see shrec.rc */
1574 m_sortInfo
.nHeaderID
= (LPARAM
) (dwCmdID
- 0x30);
1575 m_sortInfo
.bIsAscending
= TRUE
;
1576 m_sortInfo
.nLastHeaderID
= m_sortInfo
.nHeaderID
;
1577 SendMessageA(m_hWndList
, LVM_SORTITEMS
, (WPARAM
) &m_sortInfo
, (LPARAM
)ListViewCompareItems
);
1580 case FCIDM_SHVIEW_REFRESH
:
1584 case FCIDM_SHVIEW_DELETE
:
1585 case FCIDM_SHVIEW_CUT
:
1586 case FCIDM_SHVIEW_COPY
:
1587 case FCIDM_SHVIEW_RENAME
:
1588 return OnExplorerCommand(dwCmdID
, TRUE
);
1590 case FCIDM_SHVIEW_INSERT
:
1591 case FCIDM_SHVIEW_UNDO
:
1592 case FCIDM_SHVIEW_INSERTLINK
:
1593 case FCIDM_SHVIEW_NEWFOLDER
:
1594 return OnExplorerCommand(dwCmdID
, FALSE
);
1596 TRACE("-- COMMAND 0x%04x unhandled\n", dwCmdID
);
1602 /**********************************************************
1603 * ShellView_OnNotify()
1606 LRESULT
CDefView::OnNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1610 LPNMLISTVIEW lpnmlv
;
1611 NMLVDISPINFOW
*lpdi
;
1616 lpnmh
= (LPNMHDR
)lParam
;
1617 lpnmlv
= (LPNMLISTVIEW
)lpnmh
;
1618 lpdi
= (NMLVDISPINFOW
*)lpnmh
;
1620 TRACE("%p CtlID=%u lpnmh->code=%x\n", this, CtlID
, lpnmh
->code
);
1622 switch (lpnmh
->code
)
1625 TRACE("-- NM_SETFOCUS %p\n", this);
1626 OnSetFocus(0, 0, 0, unused
);
1630 TRACE("-- NM_KILLFOCUS %p\n", this);
1632 /* Notify the ICommDlgBrowser interface */
1633 OnStateChange(CDBOSC_KILLFOCUS
);
1637 TRACE("-- NM_CUSTOMDRAW %p\n", this);
1638 return CDRF_DODEFAULT
;
1640 case NM_RELEASEDCAPTURE
:
1641 TRACE("-- NM_RELEASEDCAPTURE %p\n", this);
1645 TRACE("-- NM_CLICK %p\n", this);
1649 TRACE("-- NM_RCLICK %p\n", this);
1653 TRACE("-- NM_DBLCLK %p\n", this);
1654 OpenSelectedItems();
1658 TRACE("-- NM_RETURN %p\n", this);
1659 OpenSelectedItems();
1663 TRACE("-- HDN_ENDTRACKW %p\n", this);
1664 /*nColumn1 = ListView_GetColumnWidth(m_hWndList, 0);
1665 nColumn2 = ListView_GetColumnWidth(m_hWndList, 1);*/
1668 case LVN_DELETEITEM
:
1669 TRACE("-- LVN_DELETEITEM %p\n", this);
1670 SHFree((LPITEMIDLIST
)lpnmlv
->lParam
); /*delete the pidl because we made a copy of it*/
1673 case LVN_DELETEALLITEMS
:
1674 TRACE("-- LVN_DELETEALLITEMS %p\n", this);
1677 case LVN_INSERTITEM
:
1678 TRACE("-- LVN_INSERTITEM (STUB)%p\n", this);
1681 case LVN_ITEMACTIVATE
:
1682 TRACE("-- LVN_ITEMACTIVATE %p\n", this);
1683 OnStateChange(CDBOSC_SELCHANGE
); /* the browser will get the IDataObject now */
1686 case LVN_COLUMNCLICK
:
1687 m_sortInfo
.nHeaderID
= lpnmlv
->iSubItem
;
1688 if (m_sortInfo
.nLastHeaderID
== m_sortInfo
.nHeaderID
)
1690 m_sortInfo
.bIsAscending
= !m_sortInfo
.bIsAscending
;
1694 m_sortInfo
.bIsAscending
= TRUE
;
1696 m_sortInfo
.nLastHeaderID
= m_sortInfo
.nHeaderID
;
1698 SendMessageW(lpnmlv
->hdr
.hwndFrom
, LVM_SORTITEMS
, (WPARAM
) &m_sortInfo
, (LPARAM
)ListViewCompareItems
);
1701 case LVN_GETDISPINFOA
:
1702 case LVN_GETDISPINFOW
:
1703 TRACE("-- LVN_GETDISPINFO %p\n", this);
1704 pidl
= (LPITEMIDLIST
)lpdi
->item
.lParam
;
1706 if (lpdi
->item
.mask
& LVIF_TEXT
) /* text requested */
1711 if (FAILED(m_pSF2Parent
->GetDetailsOf(pidl
, lpdi
->item
.iSubItem
, &sd
)))
1713 FIXME("failed to get details\n");
1717 if (lpnmh
->code
== LVN_GETDISPINFOA
)
1719 /* shouldn't happen */
1720 NMLVDISPINFOA
*lpdiA
= (NMLVDISPINFOA
*)lpnmh
;
1721 StrRetToStrNA( lpdiA
->item
.pszText
, lpdiA
->item
.cchTextMax
, &sd
.str
, NULL
);
1722 TRACE("-- text=%s\n", lpdiA
->item
.pszText
);
1724 else /* LVN_GETDISPINFOW */
1726 StrRetToStrNW( lpdi
->item
.pszText
, lpdi
->item
.cchTextMax
, &sd
.str
, NULL
);
1727 TRACE("-- text=%s\n", debugstr_w(lpdi
->item
.pszText
));
1735 if(lpdi
->item
.mask
& LVIF_IMAGE
) /* image requested */
1737 lpdi
->item
.iImage
= SHMapPIDLToSystemImageListIndex(m_pSFParent
, pidl
, 0);
1739 lpdi
->item
.mask
|= LVIF_DI_SETITEM
;
1742 case LVN_ITEMCHANGED
:
1743 TRACE("-- LVN_ITEMCHANGED %p\n", this);
1744 OnStateChange(CDBOSC_SELCHANGE
); /* the browser will get the IDataObject now */
1748 case LVN_BEGINRDRAG
:
1749 TRACE("-- LVN_BEGINDRAG\n");
1751 if (GetSelections())
1753 CComPtr
<IDataObject
> pda
;
1754 DWORD dwAttributes
= SFGAO_CANLINK
;
1755 DWORD dwEffect
= DROPEFFECT_COPY
| DROPEFFECT_MOVE
;
1757 if (SUCCEEDED(m_pSFParent
->GetUIObjectOf(m_hWnd
, m_cidl
, (LPCITEMIDLIST
*)m_apidl
, IID_NULL_PPV_ARG(IDataObject
, &pda
))))
1759 CComPtr
<IDropSource
> pds
= static_cast<IDropSource
*>(this); /* own DropSource interface */
1761 if (SUCCEEDED(m_pSFParent
->GetAttributesOf(m_cidl
, (LPCITEMIDLIST
*)m_apidl
, &dwAttributes
)))
1763 if (dwAttributes
& SFGAO_CANLINK
)
1765 dwEffect
|= DROPEFFECT_LINK
;
1769 CComPtr
<IAsyncOperation
> piaso
;
1770 if (SUCCEEDED(pda
->QueryInterface(IID_PPV_ARG(IAsyncOperation
, &piaso
))))
1772 piaso
->SetAsyncMode(TRUE
);
1777 DoDragDrop(pda
, pds
, dwEffect
, &dwEffect2
);
1783 case LVN_BEGINLABELEDITW
:
1785 DWORD dwAttr
= SFGAO_CANRENAME
;
1786 pidl
= (LPITEMIDLIST
)lpdi
->item
.lParam
;
1788 TRACE("-- LVN_BEGINLABELEDITW %p\n", this);
1790 m_pSFParent
->GetAttributesOf(1, (LPCITEMIDLIST
*)&pidl
, &dwAttr
);
1791 if (SFGAO_CANRENAME
& dwAttr
)
1799 case LVN_ENDLABELEDITW
:
1801 TRACE("-- LVN_ENDLABELEDITW %p\n", this);
1803 m_isEditing
= FALSE
;
1805 if (lpdi
->item
.pszText
)
1810 lvItem
.iItem
= lpdi
->item
.iItem
;
1811 lvItem
.iSubItem
= 0;
1812 lvItem
.mask
= LVIF_PARAM
;
1813 SendMessageW(m_hWndList
, LVM_GETITEMW
, 0, (LPARAM
) &lvItem
);
1815 pidl
= (LPITEMIDLIST
)lpdi
->item
.lParam
;
1816 hr
= m_pSFParent
->SetNameOf(0, pidl
, lpdi
->item
.pszText
, SHGDN_INFOLDER
, &pidl
);
1818 if (SUCCEEDED(hr
) && pidl
)
1820 lvItem
.mask
= LVIF_PARAM
|LVIF_IMAGE
;
1821 lvItem
.lParam
= (LPARAM
)pidl
;
1822 lvItem
.iImage
= SHMapPIDLToSystemImageListIndex(m_pSFParent
, pidl
, 0);
1823 SendMessageW(m_hWndList
, LVM_SETITEMW
, 0, (LPARAM
) &lvItem
);
1824 SendMessageW(m_hWndList
, LVM_UPDATE
, lpdi
->item
.iItem
, 0);
1834 TRACE("-- %p WM_COMMAND %x unhandled\n", this, lpnmh
->code
);
1841 /**********************************************************
1842 * ShellView_OnChange()
1844 LRESULT
CDefView::OnChangeNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1846 LPITEMIDLIST
*Pidls
;
1848 Pidls
= (LPITEMIDLIST
*)wParam
;
1850 TRACE("(%p)(%p,%p,0x%08x)\n", this, Pidls
[0], Pidls
[1], lParam
);
1856 LV_AddItem(Pidls
[0]);
1861 LV_DeleteItem(Pidls
[0]);
1864 case SHCNE_RENAMEFOLDER
:
1865 case SHCNE_RENAMEITEM
:
1866 LV_RenameItem(Pidls
[0], Pidls
[1]);
1869 case SHCNE_UPDATEITEM
:
1870 LV_RenameItem(Pidls
[0], Pidls
[0]);
1873 case SHCNE_UPDATEDIR
:
1880 /**********************************************************
1881 * CDefView::OnCustomItem
1883 LRESULT
CDefView::OnCustomItem(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1888 ERR("no menu!!!\n");
1892 CComPtr
<IContextMenu2
> pCM2
;
1893 HRESULT hres
= m_pCM
.p
->QueryInterface(IID_PPV_ARG(IContextMenu2
, &pCM2
));
1897 if (pCM2
.p
->HandleMenuMsg(uMsg
, (WPARAM
)m_hWnd
, lParam
) == S_OK
)
1903 LRESULT
CDefView::OnSettingChange(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1905 /* Wallpaper setting affects drop shadows effect */
1906 if (wParam
== SPI_SETDESKWALLPAPER
|| wParam
== 0)
1912 /**********************************************************
1913 * CDefView::OnInitMenuPopup
1915 LRESULT
CDefView::OnInitMenuPopup(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1917 MENUITEMINFOW mii
= { 0 };
1918 HMENU hSubmenu
= (HMENU
) wParam
;
1920 DbgPrint("OnInitMenuPopup lParam=%d\n", lParam
);
1922 mii
.cbSize
= sizeof(mii
);
1923 mii
.fMask
= MIIM_ID
| MIIM_SUBMENU
;
1925 if (!GetMenuItemInfoW(this->m_hMenu
, lParam
, TRUE
, &mii
))
1927 DbgPrint("OnInitMenuPopup GetMenuItemInfoW failed!\n");
1931 UINT menuItemId
= mii
.wID
;
1933 if (mii
.hSubMenu
!= hSubmenu
)
1935 DbgPrint("OnInitMenuPopup submenu does not match!!!!\n");
1939 DbgPrint("OnInitMenuPopup id=%d\n", menuItemId
);
1943 case FCIDM_MENU_FILE
:
1944 PrepareShowFileMenu(hSubmenu
);
1946 case FCIDM_MENU_EDIT
:
1947 //PrepareShowEditMenu(hSubmenu);
1949 case FCIDM_MENU_VIEW
:
1950 PrepareShowViewMenu(hSubmenu
);
1957 /**********************************************************
1960 * The INTERFACE of the IShellView object
1963 **********************************************************
1966 /**********************************************************
1967 * ShellView_GetWindow
1969 HRESULT WINAPI
CDefView::GetWindow(HWND
*phWnd
)
1971 TRACE("(%p)\n", this);
1978 HRESULT WINAPI
CDefView::ContextSensitiveHelp(BOOL fEnterMode
)
1980 FIXME("(%p) stub\n", this);
1985 /**********************************************************
1986 * IShellView_TranslateAccelerator
1989 * use the accel functions
1991 HRESULT WINAPI
CDefView::TranslateAccelerator(LPMSG lpmsg
)
1996 if (lpmsg
->message
>= WM_KEYFIRST
&& lpmsg
->message
<= WM_KEYLAST
)
1998 if (::TranslateAcceleratorW(m_hWnd
, m_hAccel
, lpmsg
) != 0)
2001 TRACE("-- key=0x04%lx\n", lpmsg
->wParam
) ;
2004 return m_pShellBrowser
->TranslateAcceleratorSB(lpmsg
, 0);
2007 HRESULT WINAPI
CDefView::EnableModeless(BOOL fEnable
)
2009 FIXME("(%p) stub\n", this);
2014 HRESULT WINAPI
CDefView::UIActivate(UINT uState
)
2017 CHAR szName[MAX_PATH];
2020 int nPartArray
[1] = { -1};
2022 TRACE("(%p)->(state=%x) stub\n", this, uState
);
2024 /*don't do anything if the state isn't really changing*/
2025 if (m_uState
== uState
)
2030 /*OnActivate handles the menu merging and internal state*/
2033 /*only do This if we are active*/
2034 if (uState
!= SVUIA_DEACTIVATE
)
2038 GetFolderPath is not a method of IShellFolder
2039 IShellFolder_GetFolderPath( m_pSFParent, szName, sizeof(szName) );
2041 /* set the number of parts */
2042 m_pShellBrowser
->SendControlMsg(FCW_STATUS
, SB_SETPARTS
, 1, (LPARAM
)nPartArray
, &lResult
);
2044 /* set the text for the parts */
2046 m_pShellBrowser->SendControlMsg(FCW_STATUS, SB_SETTEXTA, 0, (LPARAM)szName, &lResult);
2053 HRESULT WINAPI
CDefView::Refresh()
2055 TRACE("(%p)\n", this);
2057 SendMessageW(m_hWndList
, LVM_DELETEALLITEMS
, 0, 0);
2063 HRESULT WINAPI
CDefView::CreateViewWindow(IShellView
*lpPrevView
, LPCFOLDERSETTINGS lpfs
, IShellBrowser
*psb
, RECT
*prcView
, HWND
*phWnd
)
2065 OLEMENUGROUPWIDTHS omw
= { { 0, 0, 0, 0, 0, 0 } };
2069 TRACE("(%p)->(shlview=%p set=%p shlbrs=%p rec=%p hwnd=%p) incomplete\n", this, lpPrevView
, lpfs
, psb
, prcView
, phWnd
);
2072 TRACE("-- vmode=%x flags=%x\n", lpfs
->ViewMode
, lpfs
->fFlags
);
2073 if (prcView
!= NULL
)
2074 TRACE("-- left=%i top=%i right=%i bottom=%i\n", prcView
->left
, prcView
->top
, prcView
->right
, prcView
->bottom
);
2076 /* Validate the Shell Browser */
2078 return E_UNEXPECTED
;
2080 /*set up the member variables*/
2081 m_pShellBrowser
= psb
;
2082 m_FolderSettings
= *lpfs
;
2084 /*get our parent window*/
2085 m_pShellBrowser
->GetWindow(&m_hWndParent
);
2087 /* try to get the ICommDlgBrowserInterface, adds a reference !!! */
2088 m_pCommDlgBrowser
= NULL
;
2089 if (SUCCEEDED(m_pShellBrowser
->QueryInterface(IID_PPV_ARG(ICommDlgBrowser
, &m_pCommDlgBrowser
))))
2091 TRACE("-- CommDlgBrowser\n");
2094 Create(m_hWndParent
, prcView
, NULL
, WS_CHILD
| WS_TABSTOP
, 0, 0U);
2105 SetWindowPos(HWND_TOP
, 0, 0, 0, 0, SWP_NOMOVE
| SWP_NOSIZE
| SWP_SHOWWINDOW
);
2110 m_hMenu
= CreateMenu();
2111 m_pShellBrowser
->InsertMenusSB(m_hMenu
, &omw
);
2112 TRACE("-- after fnInsertMenusSB\n");
2120 HRESULT WINAPI
CDefView::DestroyViewWindow()
2122 TRACE("(%p)\n", this);
2124 /*Make absolutely sure all our UI is cleaned up.*/
2125 UIActivate(SVUIA_DEACTIVATE
);
2129 // "Accelerator tables loaded from resources are freed automatically when the application terminates." -- MSDN
2135 DestroyMenu(m_hView
);
2141 DestroyMenu(m_hMenu
);
2147 ::DestroyWindow(m_hWndList
);
2156 m_pShellBrowser
.Release();
2157 m_pCommDlgBrowser
.Release();
2162 HRESULT WINAPI
CDefView::GetCurrentInfo(LPFOLDERSETTINGS lpfs
)
2164 TRACE("(%p)->(%p) vmode=%x flags=%x\n", this, lpfs
,
2165 m_FolderSettings
.ViewMode
, m_FolderSettings
.fFlags
);
2168 return E_INVALIDARG
;
2170 *lpfs
= m_FolderSettings
;
2174 HRESULT WINAPI
CDefView::AddPropertySheetPages(DWORD dwReserved
, LPFNADDPROPSHEETPAGE lpfn
, LPARAM lparam
)
2176 FIXME("(%p) stub\n", this);
2181 HRESULT WINAPI
CDefView::SaveViewState()
2183 FIXME("(%p) stub\n", this);
2188 HRESULT WINAPI
CDefView::SelectItem(LPCITEMIDLIST pidl
, UINT uFlags
)
2192 TRACE("(%p)->(pidl=%p, 0x%08x) stub\n", this, pidl
, uFlags
);
2194 i
= LV_FindItemByPidl(pidl
);
2200 if(uFlags
& SVSI_ENSUREVISIBLE
)
2201 SendMessageW(m_hWndList
, LVM_ENSUREVISIBLE
, i
, 0);
2203 lvItem
.mask
= LVIF_STATE
;
2204 lvItem
.stateMask
= LVIS_SELECTED
| LVIS_FOCUSED
;
2206 lvItem
.iSubItem
= 0;
2208 while (SendMessageW(m_hWndList
, LVM_GETITEMW
, 0, (LPARAM
) &lvItem
))
2210 if (lvItem
.iItem
== i
)
2212 if (uFlags
& SVSI_SELECT
)
2213 lvItem
.state
|= LVIS_SELECTED
;
2215 lvItem
.state
&= ~LVIS_SELECTED
;
2217 if (uFlags
& SVSI_FOCUSED
)
2218 lvItem
.state
&= ~LVIS_FOCUSED
;
2222 if (uFlags
& SVSI_DESELECTOTHERS
)
2223 lvItem
.state
&= ~LVIS_SELECTED
;
2226 SendMessageW(m_hWndList
, LVM_SETITEMW
, 0, (LPARAM
) &lvItem
);
2231 if(uFlags
& SVSI_EDIT
)
2232 SendMessageW(m_hWndList
, LVM_EDITLABELW
, i
, 0);
2238 HRESULT WINAPI
CDefView::GetItemObject(UINT uItem
, REFIID riid
, LPVOID
*ppvOut
)
2240 HRESULT hr
= E_NOINTERFACE
;
2242 TRACE("(%p)->(uItem=0x%08x,\n\tIID=%s, ppv=%p)\n", this, uItem
, debugstr_guid(&riid
), ppvOut
);
2248 case SVGIO_BACKGROUND
:
2249 if (IsEqualIID(riid
, IID_IContextMenu
))
2251 //*ppvOut = ISvBgCm_Constructor(m_pSFParent, FALSE);
2252 CDefFolderMenu_Create2(NULL
, NULL
, 0, NULL
, m_pSFParent
, NULL
, 0, NULL
, (IContextMenu
**)ppvOut
);
2260 case SVGIO_SELECTION
:
2262 hr
= m_pSFParent
->GetUIObjectOf(m_hWnd
, m_cidl
, (LPCITEMIDLIST
*)m_apidl
, riid
, 0, ppvOut
);
2266 TRACE("-- (%p)->(interface=%p)\n", this, *ppvOut
);
2271 HRESULT STDMETHODCALLTYPE
CDefView::GetCurrentViewMode(UINT
*pViewMode
)
2273 TRACE("(%p)->(%p), stub\n", this, pViewMode
);
2276 return E_INVALIDARG
;
2278 *pViewMode
= m_FolderSettings
.ViewMode
;
2282 HRESULT STDMETHODCALLTYPE
CDefView::SetCurrentViewMode(UINT ViewMode
)
2285 TRACE("(%p)->(%u), stub\n", this, ViewMode
);
2287 /* It's not redundant to check FVM_AUTO because it's a (UINT)-1 */
2288 if ((ViewMode
< FVM_FIRST
|| ViewMode
> FVM_LAST
) && (ViewMode
!= (UINT
)FVM_AUTO
))
2289 return E_INVALIDARG
;
2291 /* Windows before Vista uses LVM_SETVIEW and possibly
2292 LVM_SETEXTENDEDLISTVIEWSTYLE to set the style of the listview,
2293 while later versions seem to accomplish this through other
2301 dwStyle
= LVS_REPORT
;
2304 dwStyle
= LVS_SMALLICON
;
2311 FIXME("ViewMode %d not implemented\n", ViewMode
);
2317 SetStyle(dwStyle
, LVS_TYPEMASK
);
2319 /* This will not necessarily be the actual mode set above.
2320 This mimics the behavior of Windows XP. */
2321 m_FolderSettings
.ViewMode
= ViewMode
;
2326 HRESULT STDMETHODCALLTYPE
CDefView::GetFolder(REFIID riid
, void **ppv
)
2328 if (m_pSFParent
== NULL
)
2331 return m_pSFParent
->QueryInterface(riid
, ppv
);
2334 HRESULT STDMETHODCALLTYPE
CDefView::Item(int iItemIndex
, LPITEMIDLIST
*ppidl
)
2338 TRACE("(%p)->(%d %p)\n", this, iItemIndex
, ppidl
);
2340 item
.mask
= LVIF_PARAM
;
2341 item
.iItem
= iItemIndex
;
2343 if (SendMessageW(m_hWndList
, LVM_GETITEMW
, 0, (LPARAM
)&item
))
2345 *ppidl
= ILClone((PITEMID_CHILD
)item
.lParam
);
2351 return E_INVALIDARG
;
2354 HRESULT STDMETHODCALLTYPE
CDefView::ItemCount(UINT uFlags
, int *pcItems
)
2356 TRACE("(%p)->(%u %p)\n", this, uFlags
, pcItems
);
2358 if (uFlags
!= SVGIO_ALLVIEW
)
2359 FIXME("some flags unsupported, %x\n", uFlags
& ~SVGIO_ALLVIEW
);
2361 *pcItems
= SendMessageW(m_hWndList
, LVM_GETITEMCOUNT
, 0, 0);
2366 HRESULT STDMETHODCALLTYPE
CDefView::Items(UINT uFlags
, REFIID riid
, void **ppv
)
2371 HRESULT STDMETHODCALLTYPE
CDefView::GetSelectionMarkedItem(int *piItem
)
2373 TRACE("(%p)->(%p)\n", this, piItem
);
2375 *piItem
= SendMessageW(m_hWndList
, LVM_GETSELECTIONMARK
, 0, 0);
2380 HRESULT STDMETHODCALLTYPE
CDefView::GetFocusedItem(int *piItem
)
2382 TRACE("(%p)->(%p)\n", this, piItem
);
2384 *piItem
= SendMessageW(m_hWndList
, LVM_GETNEXTITEM
, -1, LVNI_FOCUSED
);
2389 HRESULT STDMETHODCALLTYPE
CDefView::GetItemPosition(LPCITEMIDLIST pidl
, POINT
*ppt
)
2394 HRESULT STDMETHODCALLTYPE
CDefView::GetSpacing(POINT
*ppt
)
2396 TRACE("(%p)->(%p)\n", this, ppt
);
2398 if (NULL
== m_hWndList
) return S_FALSE
;
2402 const DWORD ret
= SendMessageW(m_hWndList
, LVM_GETITEMSPACING
, 0, 0);
2404 ppt
->x
= LOWORD(ret
);
2405 ppt
->y
= HIWORD(ret
);
2411 HRESULT STDMETHODCALLTYPE
CDefView::GetDefaultSpacing(POINT
*ppt
)
2416 HRESULT STDMETHODCALLTYPE
CDefView::GetAutoArrange()
2421 HRESULT STDMETHODCALLTYPE
CDefView::SelectItem(int iItem
, DWORD dwFlags
)
2425 TRACE("(%p)->(%d, %x)\n", this, iItem
, dwFlags
);
2428 lvItem
.stateMask
= LVIS_SELECTED
;
2430 if (dwFlags
& SVSI_ENSUREVISIBLE
)
2431 SendMessageW(m_hWndList
, LVM_ENSUREVISIBLE
, iItem
, 0);
2434 if (dwFlags
& SVSI_DESELECTOTHERS
)
2435 SendMessageW(m_hWndList
, LVM_SETITEMSTATE
, -1, (LPARAM
)&lvItem
);
2438 if (dwFlags
& SVSI_SELECT
)
2439 lvItem
.state
|= LVIS_SELECTED
;
2441 if (dwFlags
& SVSI_FOCUSED
)
2442 lvItem
.stateMask
|= LVIS_FOCUSED
;
2444 SendMessageW(m_hWndList
, LVM_SETITEMSTATE
, iItem
, (LPARAM
)&lvItem
);
2446 if (dwFlags
& SVSI_EDIT
)
2447 SendMessageW(m_hWndList
, LVM_EDITLABELW
, iItem
, 0);
2452 HRESULT STDMETHODCALLTYPE
CDefView::SelectAndPositionItems(UINT cidl
, PCUITEMID_CHILD_ARRAY apidl
, POINT
*apt
, DWORD dwFlags
)
2457 /**********************************************************
2458 * IShellFolderView implementation
2460 HRESULT STDMETHODCALLTYPE
CDefView::Rearrange(LPARAM sort
)
2462 FIXME("(%p)->(%ld) stub\n", this, sort
);
2466 HRESULT STDMETHODCALLTYPE
CDefView::GetArrangeParam(LPARAM
*sort
)
2468 FIXME("(%p)->(%p) stub\n", this, sort
);
2472 HRESULT STDMETHODCALLTYPE
CDefView::ArrangeGrid()
2474 FIXME("(%p) stub\n", this);
2478 HRESULT STDMETHODCALLTYPE
CDefView::AutoArrange()
2480 FIXME("(%p) stub\n", this);
2484 HRESULT STDMETHODCALLTYPE
CDefView::AddObject(PITEMID_CHILD pidl
, UINT
*item
)
2486 FIXME("(%p)->(%p %p) stub\n", this, pidl
, item
);
2490 HRESULT STDMETHODCALLTYPE
CDefView::GetObject(PITEMID_CHILD
*pidl
, UINT item
)
2492 TRACE("(%p)->(%p %d)\n", this, pidl
, item
);
2493 return Item(item
, pidl
);
2496 HRESULT STDMETHODCALLTYPE
CDefView::RemoveObject(PITEMID_CHILD pidl
, UINT
*item
)
2499 TRACE("(%p)->(%p %p)\n", this, pidl
, item
);
2503 *item
= LV_FindItemByPidl(ILFindLastID(pidl
));
2504 SendMessageW(m_hWndList
, LVM_DELETEITEM
, *item
, 0);
2509 SendMessageW(m_hWndList
, LVM_DELETEALLITEMS
, 0, 0);
2515 HRESULT STDMETHODCALLTYPE
CDefView::GetObjectCount(UINT
*count
)
2517 TRACE("(%p)->(%p)\n", this, count
);
2518 return ItemCount(SVGIO_ALLVIEW
, reinterpret_cast<INT
*>(count
));
2521 HRESULT STDMETHODCALLTYPE
CDefView::SetObjectCount(UINT count
, UINT flags
)
2523 FIXME("(%p)->(%d %x) stub\n", this, count
, flags
);
2527 HRESULT STDMETHODCALLTYPE
CDefView::UpdateObject(PITEMID_CHILD pidl_old
, PITEMID_CHILD pidl_new
, UINT
*item
)
2529 FIXME("(%p)->(%p %p %p) stub\n", this, pidl_old
, pidl_new
, item
);
2533 HRESULT STDMETHODCALLTYPE
CDefView::RefreshObject(PITEMID_CHILD pidl
, UINT
*item
)
2535 FIXME("(%p)->(%p %p) stub\n", this, pidl
, item
);
2539 HRESULT STDMETHODCALLTYPE
CDefView::SetRedraw(BOOL redraw
)
2541 TRACE("(%p)->(%d)\n", this, redraw
);
2542 SendMessageW(m_hWndList
, WM_SETREDRAW
, redraw
, 0);
2546 HRESULT STDMETHODCALLTYPE
CDefView::GetSelectedCount(UINT
*count
)
2548 FIXME("(%p)->(%p) stub\n", this, count
);
2552 HRESULT STDMETHODCALLTYPE
CDefView::GetSelectedObjects(PCUITEMID_CHILD
**pidl
, UINT
*items
)
2554 TRACE("(%p)->(%p %p)\n", this, pidl
, items
);
2556 *items
= GetSelections();
2560 *pidl
= static_cast<PCUITEMID_CHILD
*>(LocalAlloc(0, *items
* sizeof(LPITEMIDLIST
)));
2563 return E_OUTOFMEMORY
;
2566 /* it's documented that caller shouldn't PIDLs, only array itself */
2567 memcpy(static_cast<PCUITEMID_CHILD
*>(*pidl
), m_apidl
, *items
* sizeof(LPITEMIDLIST
));
2573 HRESULT STDMETHODCALLTYPE
CDefView::IsDropOnSource(IDropTarget
*drop_target
)
2575 FIXME("(%p)->(%p) stub\n", this, drop_target
);
2579 HRESULT STDMETHODCALLTYPE
CDefView::GetDragPoint(POINT
*pt
)
2581 FIXME("(%p)->(%p) stub\n", this, pt
);
2585 HRESULT STDMETHODCALLTYPE
CDefView::GetDropPoint(POINT
*pt
)
2587 FIXME("(%p)->(%p) stub\n", this, pt
);
2591 HRESULT STDMETHODCALLTYPE
CDefView::MoveIcons(IDataObject
*obj
)
2593 TRACE("(%p)->(%p)\n", this, obj
);
2597 HRESULT STDMETHODCALLTYPE
CDefView::SetItemPos(PCUITEMID_CHILD pidl
, POINT
*pt
)
2599 FIXME("(%p)->(%p %p) stub\n", this, pidl
, pt
);
2603 HRESULT STDMETHODCALLTYPE
CDefView::IsBkDropTarget(IDropTarget
*drop_target
)
2605 FIXME("(%p)->(%p) stub\n", this, drop_target
);
2609 HRESULT STDMETHODCALLTYPE
CDefView::SetClipboard(BOOL move
)
2611 FIXME("(%p)->(%d) stub\n", this, move
);
2615 HRESULT STDMETHODCALLTYPE
CDefView::SetPoints(IDataObject
*obj
)
2617 FIXME("(%p)->(%p) stub\n", this, obj
);
2621 HRESULT STDMETHODCALLTYPE
CDefView::GetItemSpacing(ITEMSPACING
*spacing
)
2623 FIXME("(%p)->(%p) stub\n", this, spacing
);
2627 HRESULT STDMETHODCALLTYPE
CDefView::SetCallback(IShellFolderViewCB
*new_cb
, IShellFolderViewCB
**old_cb
)
2629 FIXME("(%p)->(%p %p) stub\n", this, new_cb
, old_cb
);
2633 HRESULT STDMETHODCALLTYPE
CDefView::Select(UINT flags
)
2635 FIXME("(%p)->(%d) stub\n", this, flags
);
2639 HRESULT STDMETHODCALLTYPE
CDefView::QuerySupport(UINT
*support
)
2641 TRACE("(%p)->(%p)\n", this, support
);
2645 HRESULT STDMETHODCALLTYPE
CDefView::SetAutomationObject(IDispatch
*disp
)
2647 FIXME("(%p)->(%p) stub\n", this, disp
);
2651 /**********************************************************
2652 * ISVOleCmdTarget_QueryStatus (IOleCommandTarget)
2654 HRESULT WINAPI
CDefView::QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
, OLECMD
*prgCmds
, OLECMDTEXT
*pCmdText
)
2656 FIXME("(%p)->(%p(%s) 0x%08x %p %p\n",
2657 this, pguidCmdGroup
, debugstr_guid(pguidCmdGroup
), cCmds
, prgCmds
, pCmdText
);
2660 return E_INVALIDARG
;
2662 for (UINT i
= 0; i
< cCmds
; i
++)
2664 FIXME("\tprgCmds[%d].cmdID = %d\n", i
, prgCmds
[i
].cmdID
);
2665 prgCmds
[i
].cmdf
= 0;
2668 return OLECMDERR_E_UNKNOWNGROUP
;
2671 /**********************************************************
2672 * ISVOleCmdTarget_Exec (IOleCommandTarget)
2674 * nCmdID is the OLECMDID_* enumeration
2676 HRESULT WINAPI
CDefView::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
2678 FIXME("(%p)->(\n\tTarget GUID:%s Command:0x%08x Opt:0x%08x %p %p)\n",
2679 this, debugstr_guid(pguidCmdGroup
), nCmdID
, nCmdexecopt
, pvaIn
, pvaOut
);
2682 return OLECMDERR_E_UNKNOWNGROUP
;
2684 if (IsEqualCLSID(*pguidCmdGroup
, m_Category
))
2686 if (nCmdID
== FCIDM_SHVIEW_AUTOARRANGE
)
2688 if (V_VT(pvaIn
) != VT_INT_PTR
)
2689 return OLECMDERR_E_NOTSUPPORTED
;
2693 params
.cbSize
= sizeof(params
);
2694 params
.rcExclude
= *(RECT
*) V_INTREF(pvaIn
);
2696 HMENU hView
= m_hView
;
2698 hView
= CreatePopupMenu();
2699 AppendMenuW(hView
, MF_STRING
, FCIDM_SHVIEW_BIGICON
, L
"Big!");
2700 AppendMenuW(hView
, MF_STRING
, FCIDM_SHVIEW_SMALLICON
, L
"Small!");
2701 AppendMenuW(hView
, MF_STRING
, FCIDM_SHVIEW_LISTVIEW
, L
"List!");
2702 AppendMenuW(hView
, MF_STRING
, FCIDM_SHVIEW_REPORTVIEW
, L
"Report!");
2707 PrepareShowViewMenu(hView
);
2709 TrackPopupMenuEx(hView
, TPM_LEFTALIGN
| TPM_TOPALIGN
, params
.rcExclude
.left
, params
.rcExclude
.bottom
, m_hWndParent
, ¶ms
);
2712 // pvaOut is VT_I4 with value 0x403 (cmd id of the new mode maybe?)
2713 V_VT(pvaOut
) = VT_I4
;
2714 V_I4(pvaOut
) = 0x403;
2718 if (IsEqualIID(*pguidCmdGroup
, CGID_Explorer
) &&
2720 (nCmdexecopt
== 4) && pvaOut
)
2723 if (IsEqualIID(*pguidCmdGroup
, CGID_ShellDocView
) &&
2728 return OLECMDERR_E_UNKNOWNGROUP
;
2731 /**********************************************************
2732 * ISVDropTarget implementation
2735 /******************************************************************************
2736 * drag_notify_subitem [Internal]
2738 * Figure out the shellfolder object, which is currently under the mouse cursor
2739 * and notify it via the IDropTarget interface.
2742 #define SCROLLAREAWIDTH 20
2744 HRESULT
CDefView::drag_notify_subitem(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2746 LVHITTESTINFO htinfo
;
2752 /* Map from global to client coordinates and query the index of the listview-item, which is
2753 * currently under the mouse cursor. */
2756 htinfo
.flags
= LVHT_ONITEM
;
2757 ::ScreenToClient(m_hWndList
, &htinfo
.pt
);
2758 lResult
= SendMessageW(m_hWndList
, LVM_HITTEST
, 0, (LPARAM
)&htinfo
);
2760 /* Send WM_*SCROLL messages every 250 ms during drag-scrolling */
2761 ::GetClientRect(m_hWndList
, &clientRect
);
2762 if (htinfo
.pt
.x
== m_ptLastMousePos
.x
&& htinfo
.pt
.y
== m_ptLastMousePos
.y
&&
2763 (htinfo
.pt
.x
< SCROLLAREAWIDTH
|| htinfo
.pt
.x
> clientRect
.right
- SCROLLAREAWIDTH
||
2764 htinfo
.pt
.y
< SCROLLAREAWIDTH
|| htinfo
.pt
.y
> clientRect
.bottom
- SCROLLAREAWIDTH
))
2766 m_cScrollDelay
= (m_cScrollDelay
+ 1) % 5; /* DragOver is called every 50 ms */
2767 if (m_cScrollDelay
== 0)
2769 /* Mouse did hover another 250 ms over the scroll-area */
2770 if (htinfo
.pt
.x
< SCROLLAREAWIDTH
)
2771 SendMessageW(m_hWndList
, WM_HSCROLL
, SB_LINEUP
, 0);
2773 if (htinfo
.pt
.x
> clientRect
.right
- SCROLLAREAWIDTH
)
2774 SendMessageW(m_hWndList
, WM_HSCROLL
, SB_LINEDOWN
, 0);
2776 if (htinfo
.pt
.y
< SCROLLAREAWIDTH
)
2777 SendMessageW(m_hWndList
, WM_VSCROLL
, SB_LINEUP
, 0);
2779 if (htinfo
.pt
.y
> clientRect
.bottom
- SCROLLAREAWIDTH
)
2780 SendMessageW(m_hWndList
, WM_VSCROLL
, SB_LINEDOWN
, 0);
2785 m_cScrollDelay
= 0; /* Reset, if the cursor is not over the listview's scroll-area */
2788 m_ptLastMousePos
= htinfo
.pt
;
2790 /* If we are still over the previous sub-item, notify it via DragOver and return. */
2791 if (m_pCurDropTarget
&& lResult
== m_iDragOverItem
)
2792 return m_pCurDropTarget
->DragOver(grfKeyState
, pt
, pdwEffect
);
2794 /* We've left the previous sub-item, notify it via DragLeave and Release it. */
2795 if (m_pCurDropTarget
)
2797 m_pCurDropTarget
->DragLeave();
2798 m_pCurDropTarget
.Release();
2801 m_iDragOverItem
= lResult
;
2804 /* We are not above one of the listview's subitems. Bind to the parent folder's
2805 * DropTarget interface. */
2806 hr
= m_pSFParent
->QueryInterface(IID_PPV_ARG(IDropTarget
,&m_pCurDropTarget
));
2810 /* Query the relative PIDL of the shellfolder object represented by the currently
2811 * dragged over listview-item ... */
2812 lvItem
.mask
= LVIF_PARAM
;
2813 lvItem
.iItem
= lResult
;
2814 lvItem
.iSubItem
= 0;
2815 SendMessageW(m_hWndList
, LVM_GETITEMW
, 0, (LPARAM
) &lvItem
);
2817 /* ... and bind m_pCurDropTarget to the IDropTarget interface of an UIObject of this object */
2818 hr
= m_pSFParent
->GetUIObjectOf(m_hWndList
, 1, (LPCITEMIDLIST
*)&lvItem
.lParam
, IID_NULL_PPV_ARG(IDropTarget
, &m_pCurDropTarget
));
2821 /* If anything failed, m_pCurDropTarget should be NULL now, which ought to be a save state. */
2825 /* Notify the item just entered via DragEnter. */
2826 return m_pCurDropTarget
->DragEnter(m_pCurDataObject
, grfKeyState
, pt
, pdwEffect
);
2829 HRESULT WINAPI
CDefView::DragEnter(IDataObject
*pDataObject
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2831 /* Get a hold on the data object for later calls to DragEnter on the sub-folders */
2832 m_pCurDataObject
= pDataObject
;
2833 pDataObject
->AddRef();
2835 return drag_notify_subitem(grfKeyState
, pt
, pdwEffect
);
2838 HRESULT WINAPI
CDefView::DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2840 return drag_notify_subitem(grfKeyState
, pt
, pdwEffect
);
2843 HRESULT WINAPI
CDefView::DragLeave()
2845 if (m_pCurDropTarget
)
2847 m_pCurDropTarget
->DragLeave();
2848 m_pCurDropTarget
.Release();
2851 if (m_pCurDataObject
!= NULL
)
2853 m_pCurDataObject
.Release();
2856 m_iDragOverItem
= 0;
2861 HRESULT WINAPI
CDefView::Drop(IDataObject
* pDataObject
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2863 if (m_pCurDropTarget
)
2865 m_pCurDropTarget
->Drop(pDataObject
, grfKeyState
, pt
, pdwEffect
);
2866 m_pCurDropTarget
.Release();
2869 m_pCurDataObject
.Release();
2870 m_iDragOverItem
= 0;
2874 /**********************************************************
2875 * ISVDropSource implementation
2878 HRESULT WINAPI
CDefView::QueryContinueDrag(BOOL fEscapePressed
, DWORD grfKeyState
)
2880 TRACE("(%p)\n", this);
2883 return DRAGDROP_S_CANCEL
;
2884 else if (!(grfKeyState
& MK_LBUTTON
) && !(grfKeyState
& MK_RBUTTON
))
2885 return DRAGDROP_S_DROP
;
2890 HRESULT WINAPI
CDefView::GiveFeedback(DWORD dwEffect
)
2892 TRACE("(%p)\n", this);
2894 return DRAGDROP_S_USEDEFAULTCURSORS
;
2897 /**********************************************************
2898 * ISVViewObject implementation
2901 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
)
2903 FIXME("Stub: this=%p\n", this);
2908 HRESULT WINAPI
CDefView::GetColorSet(DWORD dwDrawAspect
, LONG lindex
, void *pvAspect
, DVTARGETDEVICE
*ptd
, HDC hicTargetDevice
, LOGPALETTE
**ppColorSet
)
2910 FIXME("Stub: this=%p\n", this);
2915 HRESULT WINAPI
CDefView::Freeze(DWORD dwDrawAspect
, LONG lindex
, void *pvAspect
, DWORD
*pdwFreeze
)
2917 FIXME("Stub: this=%p\n", this);
2922 HRESULT WINAPI
CDefView::Unfreeze(DWORD dwFreeze
)
2924 FIXME("Stub: this=%p\n", this);
2929 HRESULT WINAPI
CDefView::SetAdvise(DWORD aspects
, DWORD advf
, IAdviseSink
*pAdvSink
)
2931 FIXME("partial stub: %p %08x %08x %p\n", this, aspects
, advf
, pAdvSink
);
2933 /* FIXME: we set the AdviseSink, but never use it to send any advice */
2934 m_pAdvSink
= pAdvSink
;
2935 m_dwAspects
= aspects
;
2941 HRESULT WINAPI
CDefView::GetAdvise(DWORD
*pAspects
, DWORD
*pAdvf
, IAdviseSink
**ppAdvSink
)
2943 TRACE("this=%p pAspects=%p pAdvf=%p ppAdvSink=%p\n", this, pAspects
, pAdvf
, ppAdvSink
);
2947 *ppAdvSink
= m_pAdvSink
;
2948 m_pAdvSink
.p
->AddRef();
2952 *pAspects
= m_dwAspects
;
2960 HRESULT STDMETHODCALLTYPE
CDefView::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
2962 if (IsEqualIID(guidService
, SID_IShellBrowser
))
2963 return m_pShellBrowser
->QueryInterface(riid
, ppvObject
);
2964 else if(IsEqualIID(guidService
, SID_IFolderView
))
2965 return QueryInterface(riid
, ppvObject
);
2967 return E_NOINTERFACE
;
2970 HRESULT
CDefView::_MergeToolbar()
2972 CComPtr
<IExplorerToolbar
> ptb
; // [sp+8h] [bp-4h]@1
2976 hr
= IUnknown_QueryService(m_pShellBrowser
, IID_IExplorerToolbar
, IID_PPV_ARG(IExplorerToolbar
, &ptb
));
2980 m_Category
= CGID_DefViewFrame
;
2982 hr
= ptb
->SetCommandTarget(static_cast<IOleCommandTarget
*>(this), &m_Category
, 0);
2990 hr
= ptb
->AddButtons(&m_Category
, buttonsCount
, buttons
);
2997 /**********************************************************
2998 * IShellView_Constructor
3000 HRESULT WINAPI
IShellView_Constructor(IShellFolder
*pFolder
, IShellView
**newView
)
3002 return ShellObjectCreatorInit
<CDefView
>(pFolder
, IID_IShellView
, newView
);