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
56 WINE_DEFAULT_DEBUG_CHANNEL(shell
);
60 static const WCHAR SV_CLASS_NAME
[] = {'S', 'H', 'E', 'L', 'L', 'D', 'L', 'L', '_', 'D', 'e', 'f', 'V', 'i', 'e', 'w', 0};
67 } LISTVIEW_SORT_INFO
, *LPLISTVIEW_SORT_INFO
;
69 #define SHV_CHANGE_NOTIFY WM_USER + 0x1111
72 public CWindowImpl
<CDefView
, CWindow
, CControlWinTraits
>,
73 public CComObjectRootEx
<CComMultiThreadModelNoCS
>,
76 public IShellFolderView
,
77 public IOleCommandTarget
,
81 public IServiceProvider
84 CComPtr
<IShellFolder
> m_pSFParent
;
85 CComPtr
<IShellFolder2
> m_pSF2Parent
;
86 CComPtr
<IShellBrowser
> m_pShellBrowser
;
87 CComPtr
<ICommDlgBrowser
> m_pCommDlgBrowser
;
90 FOLDERSETTINGS m_FolderSettings
;
95 PCUITEMID_CHILD_ARRAY m_apidl
;
96 LISTVIEW_SORT_INFO m_sortInfo
;
97 ULONG m_hNotify
; /* change notification handle */
101 CComPtr
<IAdviseSink
> m_pAdvSink
;
103 CComPtr
<IDropTarget
> m_pCurDropTarget
; /* The sub-item, which is currently dragged over */
104 CComPtr
<IDataObject
> m_pCurDataObject
; /* The dragged data-object */
105 LONG m_iDragOverItem
; /* Dragged over item's index, iff m_pCurDropTarget != NULL */
106 UINT m_cScrollDelay
; /* Send a WM_*SCROLL msg every 250 ms during drag-scroll */
107 POINT m_ptLastMousePos
; /* Mouse position at last DragOver call */
109 CComPtr
<IContextMenu
> m_pCM
;
117 HRESULT
_MergeToolbar();
122 HRESULT WINAPI
Initialize(IShellFolder
*shellFolder
);
123 HRESULT
IncludeObject(PCUITEMID_CHILD pidl
);
124 HRESULT
OnDefaultCommand();
125 HRESULT
OnStateChange(UINT uFlags
);
127 void SetStyle(DWORD dwAdd
, DWORD dwRemove
);
129 void UpdateListColors();
131 static INT CALLBACK
CompareItems(LPVOID lParam1
, LPVOID lParam2
, LPARAM lpData
);
132 static INT CALLBACK
ListViewCompareItems(LPARAM lParam1
, LPARAM lParam2
, LPARAM lpData
);
134 PCUITEMID_CHILD
_PidlByItem(int i
);
135 PCUITEMID_CHILD
_PidlByItem(LVITEM
& lvItem
);
136 int LV_FindItemByPidl(PCUITEMID_CHILD pidl
);
137 BOOLEAN
LV_AddItem(PCUITEMID_CHILD pidl
);
138 BOOLEAN
LV_DeleteItem(PCUITEMID_CHILD pidl
);
139 BOOLEAN
LV_RenameItem(PCUITEMID_CHILD pidlOld
, PCUITEMID_CHILD pidlNew
);
140 static INT CALLBACK
fill_list(LPVOID ptr
, LPVOID arg
);
142 HMENU
BuildFileMenu();
143 void PrepareShowFileMenu(HMENU hSubMenu
);
144 void PrepareShowViewMenu(HMENU hSubMenu
);
145 UINT
GetSelections();
146 HRESULT
OpenSelectedItems();
148 void DoActivate(UINT uState
);
149 HRESULT
drag_notify_subitem(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
150 LRESULT
OnExplorerCommand(UINT uCommand
, BOOL bUseSelection
);
152 // *** IOleWindow methods ***
153 virtual HRESULT STDMETHODCALLTYPE
GetWindow(HWND
*lphwnd
);
154 virtual HRESULT STDMETHODCALLTYPE
ContextSensitiveHelp(BOOL fEnterMode
);
156 // *** IShellView methods ***
157 virtual HRESULT STDMETHODCALLTYPE
TranslateAccelerator(MSG
*pmsg
);
158 virtual HRESULT STDMETHODCALLTYPE
EnableModeless(BOOL fEnable
);
159 virtual HRESULT STDMETHODCALLTYPE
UIActivate(UINT uState
);
160 virtual HRESULT STDMETHODCALLTYPE
Refresh();
161 virtual HRESULT STDMETHODCALLTYPE
CreateViewWindow(IShellView
*psvPrevious
, LPCFOLDERSETTINGS pfs
, IShellBrowser
*psb
, RECT
*prcView
, HWND
*phWnd
);
162 virtual HRESULT STDMETHODCALLTYPE
DestroyViewWindow();
163 virtual HRESULT STDMETHODCALLTYPE
GetCurrentInfo(LPFOLDERSETTINGS pfs
);
164 virtual HRESULT STDMETHODCALLTYPE
AddPropertySheetPages(DWORD dwReserved
, LPFNSVADDPROPSHEETPAGE pfn
, LPARAM lparam
);
165 virtual HRESULT STDMETHODCALLTYPE
SaveViewState();
166 virtual HRESULT STDMETHODCALLTYPE
SelectItem(PCUITEMID_CHILD pidlItem
, SVSIF uFlags
);
167 virtual HRESULT STDMETHODCALLTYPE
GetItemObject(UINT uItem
, REFIID riid
, void **ppv
);
169 // *** IFolderView methods ***
170 virtual HRESULT STDMETHODCALLTYPE
GetCurrentViewMode(UINT
*pViewMode
);
171 virtual HRESULT STDMETHODCALLTYPE
SetCurrentViewMode(UINT ViewMode
);
172 virtual HRESULT STDMETHODCALLTYPE
GetFolder(REFIID riid
, void **ppv
);
173 virtual HRESULT STDMETHODCALLTYPE
Item(int iItemIndex
, PITEMID_CHILD
*ppidl
);
174 virtual HRESULT STDMETHODCALLTYPE
ItemCount(UINT uFlags
, int *pcItems
);
175 virtual HRESULT STDMETHODCALLTYPE
Items(UINT uFlags
, REFIID riid
, void **ppv
);
176 virtual HRESULT STDMETHODCALLTYPE
GetSelectionMarkedItem(int *piItem
);
177 virtual HRESULT STDMETHODCALLTYPE
GetFocusedItem(int *piItem
);
178 virtual HRESULT STDMETHODCALLTYPE
GetItemPosition(PCUITEMID_CHILD pidl
, POINT
*ppt
);
179 virtual HRESULT STDMETHODCALLTYPE
GetSpacing(POINT
*ppt
);
180 virtual HRESULT STDMETHODCALLTYPE
GetDefaultSpacing(POINT
*ppt
);
181 virtual HRESULT STDMETHODCALLTYPE
GetAutoArrange();
182 virtual HRESULT STDMETHODCALLTYPE
SelectItem(int iItem
, DWORD dwFlags
);
183 virtual HRESULT STDMETHODCALLTYPE
SelectAndPositionItems(UINT cidl
, PCUITEMID_CHILD_ARRAY apidl
, POINT
*apt
, DWORD dwFlags
);
185 // *** IShellFolderView methods ***
186 virtual HRESULT STDMETHODCALLTYPE
Rearrange(LPARAM sort
);
187 virtual HRESULT STDMETHODCALLTYPE
GetArrangeParam(LPARAM
*sort
);
188 virtual HRESULT STDMETHODCALLTYPE
ArrangeGrid();
189 virtual HRESULT STDMETHODCALLTYPE
AutoArrange();
190 virtual HRESULT STDMETHODCALLTYPE
AddObject(PITEMID_CHILD pidl
, UINT
*item
);
191 virtual HRESULT STDMETHODCALLTYPE
GetObject(PITEMID_CHILD
*pidl
, UINT item
);
192 virtual HRESULT STDMETHODCALLTYPE
RemoveObject(PITEMID_CHILD pidl
, UINT
*item
);
193 virtual HRESULT STDMETHODCALLTYPE
GetObjectCount(UINT
*count
);
194 virtual HRESULT STDMETHODCALLTYPE
SetObjectCount(UINT count
, UINT flags
);
195 virtual HRESULT STDMETHODCALLTYPE
UpdateObject(PITEMID_CHILD pidl_old
, PITEMID_CHILD pidl_new
, UINT
*item
);
196 virtual HRESULT STDMETHODCALLTYPE
RefreshObject(PITEMID_CHILD pidl
, UINT
*item
);
197 virtual HRESULT STDMETHODCALLTYPE
SetRedraw(BOOL redraw
);
198 virtual HRESULT STDMETHODCALLTYPE
GetSelectedCount(UINT
*count
);
199 virtual HRESULT STDMETHODCALLTYPE
GetSelectedObjects(PCUITEMID_CHILD
**pidl
, UINT
*items
);
200 virtual HRESULT STDMETHODCALLTYPE
IsDropOnSource(IDropTarget
*drop_target
);
201 virtual HRESULT STDMETHODCALLTYPE
GetDragPoint(POINT
*pt
);
202 virtual HRESULT STDMETHODCALLTYPE
GetDropPoint(POINT
*pt
);
203 virtual HRESULT STDMETHODCALLTYPE
MoveIcons(IDataObject
*obj
);
204 virtual HRESULT STDMETHODCALLTYPE
SetItemPos(PCUITEMID_CHILD pidl
, POINT
*pt
);
205 virtual HRESULT STDMETHODCALLTYPE
IsBkDropTarget(IDropTarget
*drop_target
);
206 virtual HRESULT STDMETHODCALLTYPE
SetClipboard(BOOL move
);
207 virtual HRESULT STDMETHODCALLTYPE
SetPoints(IDataObject
*obj
);
208 virtual HRESULT STDMETHODCALLTYPE
GetItemSpacing(ITEMSPACING
*spacing
);
209 virtual HRESULT STDMETHODCALLTYPE
SetCallback(IShellFolderViewCB
*new_cb
, IShellFolderViewCB
**old_cb
);
210 virtual HRESULT STDMETHODCALLTYPE
Select(UINT flags
);
211 virtual HRESULT STDMETHODCALLTYPE
QuerySupport(UINT
*support
);
212 virtual HRESULT STDMETHODCALLTYPE
SetAutomationObject(IDispatch
*disp
);
214 // *** IOleCommandTarget methods ***
215 virtual HRESULT STDMETHODCALLTYPE
QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
, OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
);
216 virtual HRESULT STDMETHODCALLTYPE
Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
);
218 // *** IDropTarget methods ***
219 virtual HRESULT STDMETHODCALLTYPE
DragEnter(IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
220 virtual HRESULT STDMETHODCALLTYPE
DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
221 virtual HRESULT STDMETHODCALLTYPE
DragLeave();
222 virtual HRESULT STDMETHODCALLTYPE
Drop(IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
224 // *** IDropSource methods ***
225 virtual HRESULT STDMETHODCALLTYPE
QueryContinueDrag(BOOL fEscapePressed
, DWORD grfKeyState
);
226 virtual HRESULT STDMETHODCALLTYPE
GiveFeedback(DWORD dwEffect
);
228 // *** IViewObject methods ***
229 virtual HRESULT STDMETHODCALLTYPE
Draw(DWORD dwDrawAspect
, LONG lindex
, void *pvAspect
, DVTARGETDEVICE
*ptd
,
230 HDC hdcTargetDev
, HDC hdcDraw
, LPCRECTL lprcBounds
, LPCRECTL lprcWBounds
,
231 BOOL ( STDMETHODCALLTYPE
*pfnContinue
)(ULONG_PTR dwContinue
), ULONG_PTR dwContinue
);
232 virtual HRESULT STDMETHODCALLTYPE
GetColorSet(DWORD dwDrawAspect
, LONG lindex
, void *pvAspect
,
233 DVTARGETDEVICE
*ptd
, HDC hicTargetDev
, LOGPALETTE
**ppColorSet
);
234 virtual HRESULT STDMETHODCALLTYPE
Freeze(DWORD dwDrawAspect
, LONG lindex
, void *pvAspect
, DWORD
*pdwFreeze
);
235 virtual HRESULT STDMETHODCALLTYPE
Unfreeze(DWORD dwFreeze
);
236 virtual HRESULT STDMETHODCALLTYPE
SetAdvise(DWORD aspects
, DWORD advf
, IAdviseSink
*pAdvSink
);
237 virtual HRESULT STDMETHODCALLTYPE
GetAdvise(DWORD
*pAspects
, DWORD
*pAdvf
, IAdviseSink
**ppAdvSink
);
239 // *** IServiceProvider methods ***
240 virtual HRESULT STDMETHODCALLTYPE
QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
);
243 LRESULT
OnShowWindow(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
244 LRESULT
OnGetDlgCode(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
245 LRESULT
OnDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
246 LRESULT
OnEraseBackground(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
247 LRESULT
OnSysColorChange(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
248 LRESULT
OnGetShellBrowser(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
249 LRESULT
OnCreate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
250 LRESULT
OnContextMenu(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
251 LRESULT
OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
252 LRESULT
OnActivate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
253 LRESULT
OnSetFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
254 LRESULT
OnKillFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
255 LRESULT
OnCommand(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
256 LRESULT
OnNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
257 LRESULT
OnChangeNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
258 LRESULT
OnCustomItem(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
259 LRESULT
OnSettingChange(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
260 LRESULT
OnInitMenuPopup(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
262 static ATL::CWndClassInfo
& GetWndClassInfo()
264 static ATL::CWndClassInfo wc
=
266 { sizeof(WNDCLASSEX
), 0, StartWindowProc
,
268 LoadCursor(NULL
, IDC_ARROW
), (HBRUSH
)(COLOR_BACKGROUND
+ 1), NULL
, SV_CLASS_NAME
, NULL
270 NULL
, NULL
, IDC_ARROW
, TRUE
, 0, _T("")
275 virtual WNDPROC
GetWindowProc()
280 static LRESULT CALLBACK
WindowProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
285 // must hold a reference during message handling
286 pThis
= reinterpret_cast<CDefView
*>(hWnd
);
288 result
= CWindowImpl
<CDefView
, CWindow
, CControlWinTraits
>::WindowProc(hWnd
, uMsg
, wParam
, lParam
);
293 BEGIN_MSG_MAP(CDefView
)
294 MESSAGE_HANDLER(WM_SIZE
, OnSize
)
295 MESSAGE_HANDLER(WM_SETFOCUS
, OnSetFocus
)
296 MESSAGE_HANDLER(WM_KILLFOCUS
, OnKillFocus
)
297 MESSAGE_HANDLER(WM_CREATE
, OnCreate
)
298 MESSAGE_HANDLER(WM_ACTIVATE
, OnActivate
)
299 MESSAGE_HANDLER(WM_NOTIFY
, OnNotify
)
300 MESSAGE_HANDLER(WM_COMMAND
, OnCommand
)
301 MESSAGE_HANDLER(SHV_CHANGE_NOTIFY
, OnChangeNotify
)
302 MESSAGE_HANDLER(WM_CONTEXTMENU
, OnContextMenu
)
303 MESSAGE_HANDLER(WM_DRAWITEM
, OnCustomItem
)
304 MESSAGE_HANDLER(WM_MEASUREITEM
, OnCustomItem
)
305 MESSAGE_HANDLER(WM_SHOWWINDOW
, OnShowWindow
)
306 MESSAGE_HANDLER(WM_GETDLGCODE
, OnGetDlgCode
)
307 MESSAGE_HANDLER(WM_DESTROY
, OnDestroy
)
308 MESSAGE_HANDLER(WM_ERASEBKGND
, OnEraseBackground
)
309 MESSAGE_HANDLER(WM_SYSCOLORCHANGE
, OnSysColorChange
)
310 MESSAGE_HANDLER(CWM_GETISHELLBROWSER
, OnGetShellBrowser
)
311 MESSAGE_HANDLER(WM_SETTINGCHANGE
, OnSettingChange
)
312 MESSAGE_HANDLER(WM_INITMENUPOPUP
, OnInitMenuPopup
)
315 BEGIN_COM_MAP(CDefView
)
316 COM_INTERFACE_ENTRY_IID(IID_IOleWindow
, IOleWindow
)
317 COM_INTERFACE_ENTRY_IID(IID_IShellView
, IShellView
)
318 COM_INTERFACE_ENTRY_IID(IID_IFolderView
, IFolderView
)
319 COM_INTERFACE_ENTRY_IID(IID_IShellFolderView
, IShellFolderView
)
320 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget
, IOleCommandTarget
)
321 COM_INTERFACE_ENTRY_IID(IID_IDropTarget
, IDropTarget
)
322 COM_INTERFACE_ENTRY_IID(IID_IDropSource
, IDropSource
)
323 COM_INTERFACE_ENTRY_IID(IID_IViewObject
, IViewObject
)
324 COM_INTERFACE_ENTRY_IID(IID_IServiceProvider
, IServiceProvider
)
328 /* ListView Header ID's */
329 #define LISTVIEW_COLUMN_NAME 0
330 #define LISTVIEW_COLUMN_SIZE 1
331 #define LISTVIEW_COLUMN_TYPE 2
332 #define LISTVIEW_COLUMN_TIME 3
333 #define LISTVIEW_COLUMN_ATTRIB 4
336 #define IDM_VIEW_FILES (FCIDM_SHVIEWFIRST + 0x500)
337 #define IDM_VIEW_IDW (FCIDM_SHVIEWFIRST + 0x501)
338 #define IDM_MYFILEITEM (FCIDM_SHVIEWFIRST + 0x502)
340 #define ID_LISTVIEW 1
343 #define GET_WM_COMMAND_ID(wp, lp) LOWORD(wp)
344 #define GET_WM_COMMAND_HWND(wp, lp) (HWND)(lp)
345 #define GET_WM_COMMAND_CMD(wp, lp) HIWORD(wp)
347 typedef void (CALLBACK
*PFNSHGETSETTINGSPROC
)(LPSHELLFLAGSTATE lpsfs
, DWORD dwMask
);
349 CDefView::CDefView() :
353 m_menusLoaded(FALSE
),
366 ZeroMemory(&m_FolderSettings
, sizeof(m_FolderSettings
));
367 ZeroMemory(&m_sortInfo
, sizeof(m_sortInfo
));
368 ZeroMemory(&m_ptLastMousePos
, sizeof(m_ptLastMousePos
));
369 ZeroMemory(&m_Category
, sizeof(m_Category
));
372 CDefView::~CDefView()
374 TRACE(" destroying IShellView(%p)\n", this);
384 HRESULT WINAPI
CDefView::Initialize(IShellFolder
*shellFolder
)
386 m_pSFParent
= shellFolder
;
387 shellFolder
->QueryInterface(IID_PPV_ARG(IShellFolder2
, &m_pSF2Parent
));
392 /**********************************************************
394 * ##### helperfunctions for communication with ICommDlgBrowser #####
396 HRESULT
CDefView::IncludeObject(PCUITEMID_CHILD pidl
)
400 if (m_pCommDlgBrowser
.p
!= NULL
)
402 TRACE("ICommDlgBrowser::IncludeObject pidl=%p\n", pidl
);
403 ret
= m_pCommDlgBrowser
->IncludeObject(this, pidl
);
404 TRACE("--0x%08x\n", ret
);
410 HRESULT
CDefView::OnDefaultCommand()
412 HRESULT ret
= S_FALSE
;
414 if (m_pCommDlgBrowser
.p
!= NULL
)
416 TRACE("ICommDlgBrowser::OnDefaultCommand\n");
417 ret
= m_pCommDlgBrowser
->OnDefaultCommand(this);
418 TRACE("-- returns %08x\n", ret
);
424 HRESULT
CDefView::OnStateChange(UINT uFlags
)
426 HRESULT ret
= S_FALSE
;
428 if (m_pCommDlgBrowser
.p
!= NULL
)
430 TRACE("ICommDlgBrowser::OnStateChange flags=%x\n", uFlags
);
431 ret
= m_pCommDlgBrowser
->OnStateChange(this, uFlags
);
437 /**********************************************************
438 * set the toolbar of the filedialog buttons
440 * - activates the buttons from the shellbrowser according to
443 void CDefView::CheckToolbar()
449 if (m_pCommDlgBrowser
!= NULL
)
451 m_pShellBrowser
->SendControlMsg(FCW_TOOLBAR
, TB_CHECKBUTTON
,
452 FCIDM_TB_SMALLICON
, (m_FolderSettings
.ViewMode
== FVM_LIST
) ? TRUE
: FALSE
, &result
);
453 m_pShellBrowser
->SendControlMsg(FCW_TOOLBAR
, TB_CHECKBUTTON
,
454 FCIDM_TB_REPORTVIEW
, (m_FolderSettings
.ViewMode
== FVM_DETAILS
) ? TRUE
: FALSE
, &result
);
455 m_pShellBrowser
->SendControlMsg(FCW_TOOLBAR
, TB_ENABLEBUTTON
,
456 FCIDM_TB_SMALLICON
, TRUE
, &result
);
457 m_pShellBrowser
->SendControlMsg(FCW_TOOLBAR
, TB_ENABLEBUTTON
,
458 FCIDM_TB_REPORTVIEW
, TRUE
, &result
);
462 /**********************************************************
464 * ##### helperfunctions for initializing the view #####
466 /**********************************************************
467 * change the style of the listview control
469 void CDefView::SetStyle(DWORD dwAdd
, DWORD dwRemove
)
473 TRACE("(%p)\n", this);
475 tmpstyle
= ::GetWindowLongPtrW(m_ListView
, GWL_STYLE
);
476 ::SetWindowLongPtrW(m_ListView
, GWL_STYLE
, dwAdd
| (tmpstyle
& ~dwRemove
));
479 /**********************************************************
480 * ShellView_CreateList()
482 * - creates the list view window
484 BOOL
CDefView::CreateList()
485 { DWORD dwStyle
, dwExStyle
;
489 dwStyle
= WS_TABSTOP
| WS_VISIBLE
| WS_CHILDWINDOW
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
|
490 LVS_SHAREIMAGELISTS
| LVS_EDITLABELS
| LVS_AUTOARRANGE
;
491 dwExStyle
= WS_EX_CLIENTEDGE
;
493 if (m_FolderSettings
.fFlags
& FWF_DESKTOP
)
494 dwStyle
|= LVS_ALIGNLEFT
;
496 dwStyle
|= LVS_ALIGNTOP
| LVS_SHOWSELALWAYS
;
498 switch (m_FolderSettings
.ViewMode
)
505 dwStyle
|= LVS_REPORT
;
509 dwStyle
|= LVS_SMALLICON
;
521 if (m_FolderSettings
.fFlags
& FWF_AUTOARRANGE
)
522 dwStyle
|= LVS_AUTOARRANGE
;
524 if (m_FolderSettings
.fFlags
& FWF_DESKTOP
)
525 m_FolderSettings
.fFlags
|= FWF_NOCLIENTEDGE
| FWF_NOSCROLL
;
527 if (m_FolderSettings
.fFlags
& FWF_SINGLESEL
)
528 dwStyle
|= LVS_SINGLESEL
;
530 if (m_FolderSettings
.fFlags
& FWF_NOCLIENTEDGE
)
531 dwExStyle
&= ~WS_EX_CLIENTEDGE
;
533 RECT rcListView
= {0,0,0,0};
534 m_ListView
.Create(m_hWnd
, rcListView
, NULL
,dwStyle
, dwExStyle
, ID_LISTVIEW
);
539 m_sortInfo
.bIsAscending
= TRUE
;
540 m_sortInfo
.nHeaderID
= -1;
541 m_sortInfo
.nLastHeaderID
= -1;
545 /* UpdateShellSettings(); */
549 void CDefView::UpdateListColors()
551 if (m_FolderSettings
.fFlags
& FWF_DESKTOP
)
553 /* Check if drop shadows option is enabled */
554 BOOL bDropShadow
= FALSE
;
555 DWORD cbDropShadow
= sizeof(bDropShadow
);
556 WCHAR wszBuf
[16] = L
"";
558 RegGetValueW(HKEY_CURRENT_USER
, L
"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced",
559 L
"ListviewShadow", RRF_RT_DWORD
, NULL
, &bDropShadow
, &cbDropShadow
);
560 if (bDropShadow
&& SystemParametersInfoW(SPI_GETDESKWALLPAPER
, _countof(wszBuf
), wszBuf
, 0) && wszBuf
[0])
562 m_ListView
.SetTextBkColor(CLR_NONE
);
563 m_ListView
.SetBkColor(CLR_NONE
);
564 m_ListView
.SetTextColor(RGB(255, 255, 255));
565 m_ListView
.SetExtendedListViewStyle(LVS_EX_TRANSPARENTSHADOWTEXT
, LVS_EX_TRANSPARENTSHADOWTEXT
);
569 COLORREF crDesktop
= GetSysColor(COLOR_DESKTOP
);
570 m_ListView
.SetTextBkColor(crDesktop
);
571 m_ListView
.SetBkColor(crDesktop
);
572 if (GetRValue(crDesktop
) + GetGValue(crDesktop
) + GetBValue(crDesktop
) > 128 * 3)
573 m_ListView
.SetTextColor(RGB(0, 0, 0));
575 m_ListView
.SetTextColor(RGB(255, 255, 255));
576 m_ListView
.SetExtendedListViewStyle(LVS_EX_TRANSPARENTSHADOWTEXT
);
581 /**********************************************************
582 * ShellView_InitList()
584 * - adds all needed columns to the shellview
586 BOOL
CDefView::InitList()
590 HIMAGELIST big_icons
, small_icons
;
594 m_ListView
.DeleteAllItems();
598 for (int i
= 0; 1; i
++)
600 if (FAILED(m_pSF2Parent
->GetDetailsOf(NULL
, i
, &sd
)))
602 StrRetToStrNW( szTemp
, 50, &sd
.str
, NULL
);
603 m_ListView
.InsertColumn(i
, szTemp
, sd
.fmt
, sd
.cxChar
* 8);
612 Shell_GetImageLists(&big_icons
, &small_icons
);
613 m_ListView
.SetImageList(big_icons
, LVSIL_NORMAL
);
614 m_ListView
.SetImageList(small_icons
, LVSIL_SMALL
);
619 /**********************************************************
620 * ShellView_CompareItems()
623 * internal, CALLBACK for DSA_Sort
625 INT CALLBACK
CDefView::CompareItems(LPVOID lParam1
, LPVOID lParam2
, LPARAM lpData
)
628 TRACE("pidl1=%p pidl2=%p lpsf=%p\n", lParam1
, lParam2
, (LPVOID
) lpData
);
633 IShellFolder
* psf
= reinterpret_cast<IShellFolder
*>(lpData
);
634 PCUIDLIST_RELATIVE pidl1
= reinterpret_cast<PCUIDLIST_RELATIVE
>(lParam1
);
635 PCUIDLIST_RELATIVE pidl2
= reinterpret_cast<PCUIDLIST_RELATIVE
>(lParam2
);
637 ret
= (SHORT
)SCODE_CODE(psf
->CompareIDs(0, pidl1
, pidl2
));
638 TRACE("ret=%i\n", ret
);
643 /*************************************************************************
644 * ShellView_ListViewCompareItems
646 * Compare Function for the Listview (FileOpen Dialog)
649 * lParam1 [I] the first ItemIdList to compare with
650 * lParam2 [I] the second ItemIdList to compare with
651 * lpData [I] The column ID for the header Ctrl to process
654 * A negative value if the first item should precede the second,
655 * a positive value if the first item should follow the second,
656 * or zero if the two items are equivalent
659 * FIXME: function does what ShellView_CompareItems is supposed to do.
660 * unify it and figure out how to use the undocumented first parameter
661 * of IShellFolder_CompareIDs to do the job this function does and
662 * move this code to IShellFolder.
663 * make LISTVIEW_SORT_INFO obsolete
664 * the way this function works is only usable if we had only
665 * filesystemfolders (25/10/99 jsch)
667 INT CALLBACK
CDefView::ListViewCompareItems(LPARAM lParam1
, LPARAM lParam2
, LPARAM lpData
)
671 char strName1
[MAX_PATH
], strName2
[MAX_PATH
];
672 BOOL bIsFolder1
, bIsFolder2
, bIsBothFolder
;
673 PCUIDLIST_RELATIVE pidl1
= reinterpret_cast<PCUIDLIST_RELATIVE
>(lParam1
);
674 PCUIDLIST_RELATIVE pidl2
= reinterpret_cast<PCUIDLIST_RELATIVE
>(lParam2
);
675 LISTVIEW_SORT_INFO
*pSortInfo
= reinterpret_cast<LPLISTVIEW_SORT_INFO
>(lpData
);
678 bIsFolder1
= _ILIsFolder(pidl1
);
679 bIsFolder2
= _ILIsFolder(pidl2
);
680 bIsBothFolder
= bIsFolder1
&& bIsFolder2
;
682 /* When sorting between a File and a Folder, the Folder gets sorted first */
683 if ( (bIsFolder1
|| bIsFolder2
) && !bIsBothFolder
)
685 nDiff
= bIsFolder1
? -1 : 1;
689 /* Sort by Time: Folders or Files can be sorted */
691 if(pSortInfo
->nHeaderID
== LISTVIEW_COLUMN_TIME
)
693 _ILGetFileDateTime(pidl1
, &fd1
);
694 _ILGetFileDateTime(pidl2
, &fd2
);
695 nDiff
= CompareFileTime(&fd2
, &fd1
);
697 /* Sort by Attribute: Folder or Files can be sorted */
698 else if(pSortInfo
->nHeaderID
== LISTVIEW_COLUMN_ATTRIB
)
700 _ILGetFileAttributes(pidl1
, strName1
, MAX_PATH
);
701 _ILGetFileAttributes(pidl2
, strName2
, MAX_PATH
);
702 nDiff
= lstrcmpiA(strName1
, strName2
);
704 /* Sort by FileName: Folder or Files can be sorted */
705 else if (pSortInfo
->nHeaderID
== LISTVIEW_COLUMN_NAME
|| bIsBothFolder
)
708 _ILSimpleGetText(pidl1
, strName1
, MAX_PATH
);
709 _ILSimpleGetText(pidl2
, strName2
, MAX_PATH
);
710 nDiff
= lstrcmpiA(strName1
, strName2
);
712 /* Sort by File Size, Only valid for Files */
713 else if (pSortInfo
->nHeaderID
== LISTVIEW_COLUMN_SIZE
)
715 nDiff
= (INT
)(_ILGetFileSize(pidl1
, NULL
, 0) - _ILGetFileSize(pidl2
, NULL
, 0));
717 /* Sort by File Type, Only valid for Files */
718 else if (pSortInfo
->nHeaderID
== LISTVIEW_COLUMN_TYPE
)
721 _ILGetFileType(pidl1
, strName1
, MAX_PATH
);
722 _ILGetFileType(pidl2
, strName2
, MAX_PATH
);
723 nDiff
= lstrcmpiA(strName1
, strName2
);
726 /* If the Date, FileSize, FileType, Attrib was the same, sort by FileName */
730 _ILSimpleGetText(pidl1
, strName1
, MAX_PATH
);
731 _ILSimpleGetText(pidl2
, strName2
, MAX_PATH
);
732 nDiff
= lstrcmpiA(strName1
, strName2
);
735 if (!pSortInfo
->bIsAscending
)
743 PCUITEMID_CHILD
CDefView::_PidlByItem(int i
)
745 return reinterpret_cast<PCUITEMID_CHILD
>(m_ListView
.GetItemData(i
));
748 PCUITEMID_CHILD
CDefView::_PidlByItem(LVITEM
& lvItem
)
750 return reinterpret_cast<PCUITEMID_CHILD
>(lvItem
.lParam
);
753 /**********************************************************
754 * LV_FindItemByPidl()
756 int CDefView::LV_FindItemByPidl(PCUITEMID_CHILD pidl
)
758 int cItems
= m_ListView
.GetItemCount();
760 for (int i
= 0; i
<cItems
; i
++)
762 PCUITEMID_CHILD currentpidl
= _PidlByItem(i
);
763 HRESULT hr
= m_pSFParent
->CompareIDs(0, pidl
, currentpidl
);
765 if (SUCCEEDED(hr
) && !HRESULT_CODE(hr
))
773 /**********************************************************
776 BOOLEAN
CDefView::LV_AddItem(PCUITEMID_CHILD pidl
)
780 TRACE("(%p)(pidl=%p)\n", this, pidl
);
782 lvItem
.mask
= LVIF_TEXT
| LVIF_IMAGE
| LVIF_PARAM
; /*set the mask*/
783 lvItem
.iItem
= m_ListView
.GetItemCount(); /*add the item to the end of the list*/
785 lvItem
.lParam
= reinterpret_cast<LPARAM
>(ILClone(pidl
)); /*set the item's data*/
786 lvItem
.pszText
= LPSTR_TEXTCALLBACKW
; /*get text on a callback basis*/
787 lvItem
.iImage
= I_IMAGECALLBACK
; /*get the image on a callback basis*/
789 if (m_ListView
.InsertItem(&lvItem
) == -1)
795 /**********************************************************
798 BOOLEAN
CDefView::LV_DeleteItem(PCUITEMID_CHILD pidl
)
802 TRACE("(%p)(pidl=%p)\n", this, pidl
);
804 nIndex
= LV_FindItemByPidl(pidl
);
806 return (-1 == m_ListView
.DeleteItem(nIndex
)) ? FALSE
: TRUE
;
809 /**********************************************************
812 BOOLEAN
CDefView::LV_RenameItem(PCUITEMID_CHILD pidlOld
, PCUITEMID_CHILD pidlNew
)
817 TRACE("(%p)(pidlold=%p pidlnew=%p)\n", this, pidlOld
, pidlNew
);
819 nItem
= LV_FindItemByPidl(pidlOld
);
823 lvItem
.mask
= LVIF_PARAM
; /* only the pidl */
824 lvItem
.iItem
= nItem
;
825 m_ListView
.GetItem(&lvItem
);
827 SHFree(reinterpret_cast<LPVOID
>(lvItem
.lParam
));
828 lvItem
.mask
= LVIF_PARAM
|LVIF_IMAGE
;
829 lvItem
.iItem
= nItem
;
830 lvItem
.lParam
= reinterpret_cast<LPARAM
>(ILClone(pidlNew
)); /* set the item's data */
831 lvItem
.iImage
= SHMapPIDLToSystemImageListIndex(m_pSFParent
, pidlNew
, 0);
832 m_ListView
.SetItem(&lvItem
);
833 m_ListView
.Update(nItem
);
834 return TRUE
; /* FIXME: better handling */
840 /**********************************************************
841 * ShellView_FillList()
843 * - gets the objectlist from the shellfolder
845 * - fills the list into the view
847 INT CALLBACK
CDefView::fill_list( LPVOID ptr
, LPVOID arg
)
849 PITEMID_CHILD pidl
= static_cast<PITEMID_CHILD
>(ptr
);
850 CDefView
*pThis
= static_cast<CDefView
*>(arg
);
852 /* in a commdlg This works as a filemask*/
853 if (pThis
->IncludeObject(pidl
) == S_OK
)
854 pThis
->LV_AddItem(pidl
);
860 HRESULT
CDefView::FillList()
862 CComPtr
<IEnumIDList
> pEnumIDList
;
870 /* get the itemlist from the shfolder*/
871 hRes
= m_pSFParent
->EnumObjects(m_hWnd
, SHCONTF_NONFOLDERS
| SHCONTF_FOLDERS
, &pEnumIDList
);
879 /* create a pointer array */
880 hdpa
= DPA_Create(16);
883 return(E_OUTOFMEMORY
);
886 /* copy the items into the array*/
887 while((S_OK
== pEnumIDList
->Next(1, &pidl
, &dwFetched
)) && dwFetched
)
889 if (DPA_InsertPtr(hdpa
, 0x7fff, pidl
) == -1)
896 DPA_Sort(hdpa
, CompareItems
, reinterpret_cast<LPARAM
>(m_pSFParent
.p
));
898 /*turn the listview's redrawing off*/
899 m_ListView
.SetRedraw(FALSE
);
901 DPA_DestroyCallback( hdpa
, fill_list
, this);
903 /*turn the listview's redrawing back on and force it to draw*/
904 m_ListView
.SetRedraw(TRUE
);
909 LRESULT
CDefView::OnShowWindow(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
911 m_ListView
.UpdateWindow();
916 LRESULT
CDefView::OnGetDlgCode(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
918 return m_ListView
.SendMessageW(uMsg
, 0, 0);
921 LRESULT
CDefView::OnDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
924 DestroyMenu(m_hMenu
);
925 RevokeDragDrop(m_hWnd
);
926 SHChangeNotifyDeregister(m_hNotify
);
931 LRESULT
CDefView::OnEraseBackground(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
933 /* redirect to parent */
934 if (m_FolderSettings
.fFlags
& (FWF_DESKTOP
| FWF_TRANSPARENT
))
935 return SendMessageW(GetParent(), WM_ERASEBKGND
, wParam
, lParam
);
941 LRESULT
CDefView::OnSysColorChange(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
943 /* Update desktop labels color */
946 /* Forward WM_SYSCOLORCHANGE to common controls */
947 return m_ListView
.SendMessageW(uMsg
, 0, 0);
950 LRESULT
CDefView::OnGetShellBrowser(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
952 return reinterpret_cast<LRESULT
>(m_pShellBrowser
.p
);
955 /**********************************************************
956 * ShellView_OnCreate()
958 LRESULT
CDefView::OnCreate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
960 CComPtr
<IDropTarget
> pdt
;
961 SHChangeNotifyEntry ntreg
;
962 CComPtr
<IPersistFolder2
> ppf2
;
974 if (SUCCEEDED(QueryInterface(IID_PPV_ARG(IDropTarget
, &pdt
))))
976 if (FAILED(RegisterDragDrop(m_hWnd
, pdt
)))
977 ERR("Registering Drag Drop Failed");
980 /* register for receiving notifications */
981 m_pSFParent
->QueryInterface(IID_PPV_ARG(IPersistFolder2
, &ppf2
));
984 PIDLIST_ABSOLUTE pidlParent
;
985 ppf2
->GetCurFolder(&pidlParent
);
986 ntreg
.fRecursive
= TRUE
;
987 ntreg
.pidl
= pidlParent
;
988 m_hNotify
= SHChangeNotifyRegister(m_hWnd
, SHCNF_IDLIST
, SHCNE_ALLEVENTS
, SHV_CHANGE_NOTIFY
, 1, &ntreg
);
992 m_hAccel
= LoadAcceleratorsW(shell32_hInstance
, MAKEINTRESOURCEW(IDA_SHELLVIEW
));
997 /**********************************************************
998 * #### Handling of the menus ####
1001 HMENU
CDefView::BuildFileMenu()
1004 CComPtr
<IContextMenu
> cm
;
1008 hr
= m_pSFParent
->GetUIObjectOf(m_hWnd
, m_cidl
, m_apidl
, IID_NULL_PPV_ARG(IContextMenu
, &cm
));
1012 HMENU hmenu
= CreatePopupMenu();
1014 //FIXME: get proper numbers ?
1015 const UINT first
= 0x7800;
1016 const UINT last
= 0x7A00;
1017 hr
= cm
->QueryContextMenu(hmenu
, 0, first
, last
, 0);
1021 // TODO: filter or something
1026 void CDefView::PrepareShowFileMenu(HMENU hSubMenu
)
1028 TRACE("(%p)->(submenu=%p) stub\n", this, hSubMenu
);
1033 /* Cleanup the items added previously */
1034 for (int i
= 0; i
< GetMenuItemCount(hSubMenu
); )
1037 mii
.cbSize
= sizeof(mii
);
1038 mii
.fMask
= MIIM_ID
;
1039 GetMenuItemInfoW(hSubMenu
, i
, TRUE
, &mii
);
1041 if (mii
.wID
< 0x8000)
1043 DeleteMenu(hSubMenu
, i
, MF_BYPOSITION
);
1051 /* Insert This item at the beginning of the menu. */
1052 _InsertMenuItemW(hSubMenu
, 0, TRUE
, 0, MFT_SEPARATOR
, NULL
, MFS_ENABLED
);
1053 _InsertMenuItemW(hSubMenu
, 0, TRUE
, IDM_MYFILEITEM
+ 4, MFT_STRING
, L
"Properties", MFS_DISABLED
);
1054 _InsertMenuItemW(hSubMenu
, 0, TRUE
, IDM_MYFILEITEM
+ 3, MFT_STRING
, L
"Rename", MFS_DISABLED
);
1055 _InsertMenuItemW(hSubMenu
, 0, TRUE
, IDM_MYFILEITEM
+ 2, MFT_STRING
, L
"Delete", MFS_DISABLED
);
1056 _InsertMenuItemW(hSubMenu
, 0, TRUE
, IDM_MYFILEITEM
+ 1, MFT_STRING
, L
"Create Shortcut", MFS_DISABLED
);
1057 _InsertMenuItemW(hSubMenu
, 0, TRUE
, 0, MFT_SEPARATOR
, NULL
, MFS_ENABLED
);
1058 _InsertMenuItemW(hSubMenu
, 0, TRUE
, IDM_MYFILEITEM
, MFT_STRING
, L
"New", MFS_ENABLED
);
1060 HMENU menubase
= BuildFileMenu();
1063 int count
= ::GetMenuItemCount(menubase
);
1065 for (int i
= 0; i
< count
; i
++)
1069 MENUITEMINFOW mii
= { 0 };
1070 mii
.cbSize
= sizeof(mii
);
1071 mii
.fMask
= MIIM_STATE
| MIIM_ID
| MIIM_SUBMENU
| MIIM_CHECKMARKS
| MIIM_DATA
| MIIM_STRING
| MIIM_BITMAP
| MIIM_FTYPE
;
1072 mii
.dwTypeData
= label
;
1073 mii
.cch
= _countof(label
);
1074 ::GetMenuItemInfoW(menubase
, i
, TRUE
, &mii
);
1076 TRACE("Adding item %d label %S type %d\n", mii
.wID
, mii
.dwTypeData
, mii
.fType
);
1078 mii
.fType
|= MFT_RADIOCHECK
;
1080 ::InsertMenuItemW(hSubMenu
, IDM_MYFILEITEM
, FALSE
, &mii
);
1083 _InsertMenuItemW(hSubMenu
, IDM_MYFILEITEM
, FALSE
, 0, MFT_SEPARATOR
, NULL
, MFS_ENABLED
);
1085 ::DestroyMenu(menubase
);
1090 void CDefView::PrepareShowViewMenu(HMENU hSubMenu
)
1092 TRACE("(%p)->(submenu=%p)\n", this, hSubMenu
);
1097 if (m_FolderSettings
.ViewMode
>= FVM_FIRST
&& m_FolderSettings
.ViewMode
<= FVM_LAST
)
1099 UINT iItemFirst
= FCIDM_SHVIEW_BIGICON
;
1100 UINT iItemLast
= iItemFirst
+ FVM_LAST
- FVM_FIRST
;
1101 UINT iItem
= iItemFirst
+ m_FolderSettings
.ViewMode
- FVM_FIRST
;
1102 CheckMenuRadioItem(hSubMenu
, iItemFirst
, iItemLast
, iItem
, MF_BYCOMMAND
);
1106 /**********************************************************
1107 * ShellView_GetSelections()
1109 * - fills the m_apidl list with the selected objects
1112 * number of selected items
1114 UINT
CDefView::GetSelections()
1118 m_cidl
= m_ListView
.GetSelectedCount();
1119 m_apidl
= reinterpret_cast<PCUITEMID_CHILD_ARRAY
>(SHAlloc(m_cidl
* sizeof(PCUITEMID_CHILD
)));
1126 TRACE("-- Items selected =%u\n", m_cidl
);
1130 while ((lvIndex
= m_ListView
.GetNextItem(lvIndex
, LVNI_SELECTED
)) > -1)
1132 m_apidl
[i
] = _PidlByItem(lvIndex
);
1136 TRACE("-- selected Item found\n");
1142 /**********************************************************
1143 * ShellView_OpenSelectedItems()
1145 HRESULT
CDefView::OpenSelectedItems()
1148 CMINVOKECOMMANDINFO cmi
;
1152 m_cidl
= m_ListView
.GetSelectedCount();
1156 hResult
= OnDefaultCommand();
1157 if (hResult
== S_OK
)
1160 hMenu
= CreatePopupMenu();
1164 hResult
= GetItemObject(SVGIO_SELECTION
, IID_PPV_ARG(IContextMenu
, &m_pCM
));
1165 if (FAILED(hResult
))
1168 hResult
= IUnknown_SetSite(m_pCM
, (IShellView
*)this);
1169 //if (FAILED( hResult))
1172 hResult
= m_pCM
->QueryContextMenu(hMenu
, 0, 0x20, 0x7fff, CMF_DEFAULTONLY
);
1173 if (FAILED(hResult
))
1176 uCommand
= GetMenuDefaultItem(hMenu
, FALSE
, 0);
1177 if (uCommand
== (UINT
)-1)
1183 ZeroMemory(&cmi
, sizeof(cmi
));
1184 cmi
.cbSize
= sizeof(cmi
);
1185 cmi
.lpVerb
= (LPCSTR
)MAKEINTRESOURCEA(uCommand
);
1188 hResult
= m_pCM
->InvokeCommand(&cmi
);
1197 IUnknown_SetSite(m_pCM
, NULL
);
1204 /**********************************************************
1205 * ShellView_DoContextMenu()
1207 LRESULT
CDefView::OnContextMenu(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1213 CMINVOKECOMMANDINFO cmi
;
1216 // for some reason I haven't figured out, we sometimes recurse into this method
1223 TRACE("(%p)->(0x%08x 0x%08x) stub\n", this, x
, y
);
1225 hMenu
= CreatePopupMenu();
1229 m_cidl
= m_ListView
.GetSelectedCount();
1231 hResult
= GetItemObject( m_cidl
? SVGIO_SELECTION
: SVGIO_BACKGROUND
, IID_PPV_ARG(IContextMenu
, &m_pCM
));
1232 if (FAILED( hResult
))
1235 hResult
= IUnknown_SetSite(m_pCM
, (IShellView
*)this);
1236 //if (FAILED( hResult))
1239 hResult
= m_pCM
->QueryContextMenu(hMenu
, 0, FCIDM_SHVIEWFIRST
, FCIDM_SHVIEWLAST
, CMF_NORMAL
);
1240 if (FAILED( hResult
))
1243 if (m_FolderSettings
.fFlags
& FWF_DESKTOP
)
1244 SetMenuDefaultItem(hMenu
, FCIDM_SHVIEW_OPEN
, MF_BYCOMMAND
);
1246 uCommand
= TrackPopupMenu(hMenu
,
1247 TPM_LEFTALIGN
| TPM_RETURNCMD
| TPM_LEFTBUTTON
| TPM_RIGHTBUTTON
,
1248 x
, y
, 0, m_hWnd
, NULL
);
1252 if (uCommand
== FCIDM_SHVIEW_OPEN
&& OnDefaultCommand() == S_OK
)
1255 ZeroMemory(&cmi
, sizeof(cmi
));
1256 cmi
.cbSize
= sizeof(cmi
);
1257 cmi
.lpVerb
= MAKEINTRESOURCEA(uCommand
);
1259 m_pCM
->InvokeCommand(&cmi
);
1265 IUnknown_SetSite(m_pCM
, NULL
);
1275 LRESULT
CDefView::OnExplorerCommand(UINT uCommand
, BOOL bUseSelection
)
1278 CMINVOKECOMMANDINFO cmi
;
1281 hMenu
= CreatePopupMenu();
1285 hResult
= GetItemObject( bUseSelection
? SVGIO_SELECTION
: SVGIO_BACKGROUND
, IID_PPV_ARG(IContextMenu
, &m_pCM
));
1286 if (FAILED( hResult
))
1289 hResult
= IUnknown_SetSite(m_pCM
, (IShellView
*)this);
1290 //if (FAILED( hResult))
1293 hResult
= m_pCM
->QueryContextMenu(hMenu
, 0, FCIDM_SHVIEWFIRST
, FCIDM_SHVIEWLAST
, CMF_NORMAL
);
1294 if (FAILED( hResult
))
1297 ZeroMemory(&cmi
, sizeof(cmi
));
1298 cmi
.cbSize
= sizeof(cmi
);
1299 cmi
.lpVerb
= MAKEINTRESOURCEA(uCommand
);
1301 m_pCM
->InvokeCommand(&cmi
);
1307 IUnknown_SetSite(m_pCM
, NULL
);
1317 /**********************************************************
1318 * ##### message handling #####
1321 /**********************************************************
1322 * ShellView_OnSize()
1324 LRESULT
CDefView::OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1329 wWidth
= LOWORD(lParam
);
1330 wHeight
= HIWORD(lParam
);
1332 TRACE("%p width=%u height=%u\n", this, wWidth
, wHeight
);
1334 /*resize the ListView to fit our window*/
1337 ::MoveWindow(m_ListView
, 0, 0, wWidth
, wHeight
, TRUE
);
1343 /**********************************************************
1344 * ShellView_OnDeactivate()
1349 void CDefView::OnDeactivate()
1351 TRACE("%p\n", this);
1353 if (m_uState
!= SVUIA_DEACTIVATE
)
1355 // TODO: cleanup menu after deactivation
1357 m_uState
= SVUIA_DEACTIVATE
;
1361 void CDefView::DoActivate(UINT uState
)
1363 TRACE("%p uState=%x\n", this, uState
);
1365 /*don't do anything if the state isn't really changing */
1366 if (m_uState
== uState
)
1371 if (uState
== SVUIA_DEACTIVATE
)
1381 MENUITEMINFOW mii
= { 0 };
1383 /* initialize EDIT menu */
1384 mii
.cbSize
= sizeof(mii
);
1385 mii
.fMask
= MIIM_SUBMENU
;
1386 if (::GetMenuItemInfoW(m_hMenu
, FCIDM_MENU_EDIT
, FALSE
, &mii
))
1388 HMENU hSubMenu
= mii
.hSubMenu
;
1390 HMENU menubase
= ::LoadMenuW(shell32_hInstance
, L
"MENU_003");
1392 int count
= ::GetMenuItemCount(menubase
);
1393 for (int i
= 0; i
< count
; i
++)
1397 ZeroMemory(&mii
, sizeof(mii
));
1398 mii
.cbSize
= sizeof(mii
);
1399 mii
.fMask
= MIIM_STATE
| MIIM_ID
| MIIM_SUBMENU
| MIIM_CHECKMARKS
| MIIM_DATA
| MIIM_STRING
| MIIM_BITMAP
| MIIM_FTYPE
;
1400 mii
.dwTypeData
= label
;
1401 mii
.cch
= _countof(label
);
1402 ::GetMenuItemInfoW(menubase
, i
, TRUE
, &mii
);
1404 TRACE("Adding item %d label %S type %d\n", mii
.wID
, mii
.dwTypeData
, mii
.fType
);
1406 mii
.fType
|= MFT_RADIOCHECK
;
1408 ::InsertMenuItemW(hSubMenu
, FCIDM_MENU_VIEW_SEP_OPTIONS
, FALSE
, &mii
);
1411 ::DestroyMenu(menubase
);
1414 /* initialize VIEW menu */
1416 mii
.cbSize
= sizeof(mii
);
1417 mii
.fMask
= MIIM_SUBMENU
;
1418 if (::GetMenuItemInfoW(m_hMenu
, FCIDM_MENU_VIEW
, FALSE
, &mii
))
1420 HMENU menubase
= ::LoadMenuW(shell32_hInstance
, L
"MENU_001");
1422 HMENU hSubMenu
= mii
.hSubMenu
;
1424 m_hView
= CreatePopupMenu();
1426 _InsertMenuItemW(hSubMenu
, FCIDM_MENU_VIEW_SEP_OPTIONS
, FALSE
, 0, MFT_SEPARATOR
, NULL
, MFS_ENABLED
);
1428 int count
= ::GetMenuItemCount(menubase
);
1429 for (int i
= 0; i
< count
; i
++)
1433 ZeroMemory(&mii
, sizeof(mii
));
1434 mii
.cbSize
= sizeof(mii
);
1435 mii
.fMask
= MIIM_STATE
| MIIM_ID
| MIIM_SUBMENU
| MIIM_CHECKMARKS
| MIIM_DATA
| MIIM_STRING
| MIIM_BITMAP
| MIIM_FTYPE
;
1436 mii
.dwTypeData
= label
;
1437 mii
.cch
= _countof(label
);
1438 ::GetMenuItemInfoW(menubase
, i
, TRUE
, &mii
);
1440 ::AppendMenuW(m_hView
, mii
.fType
, mii
.wID
, mii
.dwTypeData
);
1442 TRACE("Adding item %d label %S type %d\n", mii
.wID
, mii
.dwTypeData
, mii
.fType
);
1444 mii
.fType
|= MFT_RADIOCHECK
;
1446 ::InsertMenuItemW(hSubMenu
, FCIDM_MENU_VIEW_SEP_OPTIONS
, FALSE
, &mii
);
1449 ::DestroyMenu(menubase
);
1453 TRACE("-- before fnSetMenuSB\n");
1454 m_pShellBrowser
->SetMenuSB(m_hMenu
, 0, m_hWnd
);
1456 m_menusLoaded
= TRUE
;
1460 if (SVUIA_ACTIVATE_FOCUS
== uState
)
1462 m_ListView
.SetFocus();
1470 /**********************************************************
1471 * ShellView_OnActivate()
1473 LRESULT
CDefView::OnActivate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1475 DoActivate(SVUIA_ACTIVATE_FOCUS
);
1479 /**********************************************************
1480 * ShellView_OnSetFocus()
1483 LRESULT
CDefView::OnSetFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1485 TRACE("%p\n", this);
1487 /* Tell the browser one of our windows has received the focus. This
1488 should always be done before merging menus (OnActivate merges the
1489 menus) if one of our windows has the focus.*/
1491 m_pShellBrowser
->OnViewWindowActive(this);
1492 DoActivate(SVUIA_ACTIVATE_FOCUS
);
1494 /* Set the focus to the listview */
1495 m_ListView
.SetFocus();
1497 /* Notify the ICommDlgBrowser interface */
1498 OnStateChange(CDBOSC_SETFOCUS
);
1503 /**********************************************************
1504 * ShellView_OnKillFocus()
1506 LRESULT
CDefView::OnKillFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1508 TRACE("(%p) stub\n", this);
1510 DoActivate(SVUIA_ACTIVATE_NOFOCUS
);
1511 /* Notify the ICommDlgBrowser */
1512 OnStateChange(CDBOSC_KILLFOCUS
);
1517 /**********************************************************
1518 * ShellView_OnCommand()
1521 * the CmdID's are the ones from the context menu
1523 LRESULT
CDefView::OnCommand(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1529 dwCmdID
= GET_WM_COMMAND_ID(wParam
, lParam
);
1530 dwCmd
= GET_WM_COMMAND_CMD(wParam
, lParam
);
1531 hwndCmd
= GET_WM_COMMAND_HWND(wParam
, lParam
);
1533 TRACE("(%p)->(0x%08x 0x%08x %p) stub\n", this, dwCmdID
, dwCmd
, hwndCmd
);
1537 case FCIDM_SHVIEW_SMALLICON
:
1538 m_FolderSettings
.ViewMode
= FVM_SMALLICON
;
1539 SetStyle (LVS_SMALLICON
, LVS_TYPEMASK
);
1543 case FCIDM_SHVIEW_BIGICON
:
1544 m_FolderSettings
.ViewMode
= FVM_ICON
;
1545 SetStyle (LVS_ICON
, LVS_TYPEMASK
);
1549 case FCIDM_SHVIEW_LISTVIEW
:
1550 m_FolderSettings
.ViewMode
= FVM_LIST
;
1551 SetStyle (LVS_LIST
, LVS_TYPEMASK
);
1555 case FCIDM_SHVIEW_REPORTVIEW
:
1556 m_FolderSettings
.ViewMode
= FVM_DETAILS
;
1557 SetStyle (LVS_REPORT
, LVS_TYPEMASK
);
1561 /* the menu-ID's for sorting are 0x30... see shrec.rc */
1566 m_sortInfo
.nHeaderID
= dwCmdID
- 0x30;
1567 m_sortInfo
.bIsAscending
= TRUE
;
1568 m_sortInfo
.nLastHeaderID
= m_sortInfo
.nHeaderID
;
1569 m_ListView
.SortItems(ListViewCompareItems
, &m_sortInfo
);
1572 case FCIDM_SHVIEW_REFRESH
:
1576 case FCIDM_SHVIEW_DELETE
:
1577 case FCIDM_SHVIEW_CUT
:
1578 case FCIDM_SHVIEW_COPY
:
1579 case FCIDM_SHVIEW_RENAME
:
1580 return OnExplorerCommand(dwCmdID
, TRUE
);
1582 case FCIDM_SHVIEW_INSERT
:
1583 case FCIDM_SHVIEW_UNDO
:
1584 case FCIDM_SHVIEW_INSERTLINK
:
1585 case FCIDM_SHVIEW_NEWFOLDER
:
1586 return OnExplorerCommand(dwCmdID
, FALSE
);
1588 TRACE("-- COMMAND 0x%04x unhandled\n", dwCmdID
);
1594 /**********************************************************
1595 * ShellView_OnNotify()
1598 LRESULT
CDefView::OnNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1602 LPNMLISTVIEW lpnmlv
;
1603 NMLVDISPINFOW
*lpdi
;
1604 PCUITEMID_CHILD pidl
;
1608 lpnmh
= (LPNMHDR
)lParam
;
1609 lpnmlv
= (LPNMLISTVIEW
)lpnmh
;
1610 lpdi
= (NMLVDISPINFOW
*)lpnmh
;
1612 TRACE("%p CtlID=%u lpnmh->code=%x\n", this, CtlID
, lpnmh
->code
);
1614 switch (lpnmh
->code
)
1617 TRACE("-- NM_SETFOCUS %p\n", this);
1618 OnSetFocus(0, 0, 0, unused
);
1622 TRACE("-- NM_KILLFOCUS %p\n", this);
1624 /* Notify the ICommDlgBrowser interface */
1625 OnStateChange(CDBOSC_KILLFOCUS
);
1629 TRACE("-- NM_CUSTOMDRAW %p\n", this);
1630 return CDRF_DODEFAULT
;
1632 case NM_RELEASEDCAPTURE
:
1633 TRACE("-- NM_RELEASEDCAPTURE %p\n", this);
1637 TRACE("-- NM_CLICK %p\n", this);
1641 TRACE("-- NM_RCLICK %p\n", this);
1645 TRACE("-- NM_DBLCLK %p\n", this);
1646 OpenSelectedItems();
1650 TRACE("-- NM_RETURN %p\n", this);
1651 OpenSelectedItems();
1655 TRACE("-- HDN_ENDTRACKW %p\n", this);
1656 /*nColumn1 = m_ListView.GetColumnWidth(0);
1657 nColumn2 = m_ListView.GetColumnWidth(1);*/
1660 case LVN_DELETEITEM
:
1661 TRACE("-- LVN_DELETEITEM %p\n", this);
1663 /*delete the pidl because we made a copy of it*/
1664 SHFree(reinterpret_cast<LPVOID
>(lpnmlv
->lParam
));
1668 case LVN_DELETEALLITEMS
:
1669 TRACE("-- LVN_DELETEALLITEMS %p\n", this);
1672 case LVN_INSERTITEM
:
1673 TRACE("-- LVN_INSERTITEM (STUB)%p\n", this);
1676 case LVN_ITEMACTIVATE
:
1677 TRACE("-- LVN_ITEMACTIVATE %p\n", this);
1678 OnStateChange(CDBOSC_SELCHANGE
); /* the browser will get the IDataObject now */
1681 case LVN_COLUMNCLICK
:
1682 m_sortInfo
.nHeaderID
= lpnmlv
->iSubItem
;
1683 if (m_sortInfo
.nLastHeaderID
== m_sortInfo
.nHeaderID
)
1684 m_sortInfo
.bIsAscending
= !m_sortInfo
.bIsAscending
;
1686 m_sortInfo
.bIsAscending
= TRUE
;
1687 m_sortInfo
.nLastHeaderID
= m_sortInfo
.nHeaderID
;
1689 m_ListView
.SortItems(ListViewCompareItems
, &m_sortInfo
);
1692 case LVN_GETDISPINFOA
:
1693 case LVN_GETDISPINFOW
:
1694 TRACE("-- LVN_GETDISPINFO %p\n", this);
1695 pidl
= _PidlByItem(lpdi
->item
);
1697 if (lpdi
->item
.mask
& LVIF_TEXT
) /* text requested */
1702 if (FAILED(m_pSF2Parent
->GetDetailsOf(pidl
, lpdi
->item
.iSubItem
, &sd
)))
1704 FIXME("failed to get details\n");
1708 if (lpnmh
->code
== LVN_GETDISPINFOA
)
1710 /* shouldn't happen */
1711 NMLVDISPINFOA
*lpdiA
= (NMLVDISPINFOA
*)lpnmh
;
1712 StrRetToStrNA( lpdiA
->item
.pszText
, lpdiA
->item
.cchTextMax
, &sd
.str
, NULL
);
1713 TRACE("-- text=%s\n", lpdiA
->item
.pszText
);
1715 else /* LVN_GETDISPINFOW */
1717 StrRetToStrNW( lpdi
->item
.pszText
, lpdi
->item
.cchTextMax
, &sd
.str
, NULL
);
1718 TRACE("-- text=%s\n", debugstr_w(lpdi
->item
.pszText
));
1726 if(lpdi
->item
.mask
& LVIF_IMAGE
) /* image requested */
1728 lpdi
->item
.iImage
= SHMapPIDLToSystemImageListIndex(m_pSFParent
, pidl
, 0);
1730 lpdi
->item
.mask
|= LVIF_DI_SETITEM
;
1733 case LVN_ITEMCHANGED
:
1734 TRACE("-- LVN_ITEMCHANGED %p\n", this);
1735 OnStateChange(CDBOSC_SELCHANGE
); /* the browser will get the IDataObject now */
1739 case LVN_BEGINRDRAG
:
1740 TRACE("-- LVN_BEGINDRAG\n");
1742 if (GetSelections())
1744 CComPtr
<IDataObject
> pda
;
1745 DWORD dwAttributes
= SFGAO_CANLINK
;
1746 DWORD dwEffect
= DROPEFFECT_COPY
| DROPEFFECT_MOVE
;
1748 if (SUCCEEDED(m_pSFParent
->GetUIObjectOf(m_hWnd
, m_cidl
, m_apidl
, IID_NULL_PPV_ARG(IDataObject
, &pda
))))
1750 if (SUCCEEDED(m_pSFParent
->GetAttributesOf(m_cidl
, m_apidl
, &dwAttributes
)))
1752 if (dwAttributes
& SFGAO_CANLINK
)
1754 dwEffect
|= DROPEFFECT_LINK
;
1758 CComPtr
<IAsyncOperation
> piaso
;
1759 if (SUCCEEDED(pda
->QueryInterface(IID_PPV_ARG(IAsyncOperation
, &piaso
))))
1761 piaso
->SetAsyncMode(TRUE
);
1765 DoDragDrop(pda
, this, dwEffect
, &dwEffect2
);
1770 case LVN_BEGINLABELEDITW
:
1772 DWORD dwAttr
= SFGAO_CANRENAME
;
1773 pidl
= _PidlByItem(lpdi
->item
);
1775 TRACE("-- LVN_BEGINLABELEDITW %p\n", this);
1777 m_pSFParent
->GetAttributesOf(1, &pidl
, &dwAttr
);
1778 if (SFGAO_CANRENAME
& dwAttr
)
1786 case LVN_ENDLABELEDITW
:
1788 TRACE("-- LVN_ENDLABELEDITW %p\n", this);
1790 m_isEditing
= FALSE
;
1792 if (lpdi
->item
.pszText
)
1797 pidl
= _PidlByItem(lpdi
->item
);
1798 PITEMID_CHILD pidlNew
;
1799 hr
= m_pSFParent
->SetNameOf(0, pidl
, lpdi
->item
.pszText
, SHGDN_INFOLDER
, &pidlNew
);
1801 if (SUCCEEDED(hr
) && pidlNew
)
1803 lvItem
.mask
= LVIF_PARAM
|LVIF_IMAGE
;
1804 lvItem
.iItem
= lpdi
->item
.iItem
;
1805 lvItem
.lParam
= reinterpret_cast<LPARAM
>(pidlNew
);
1806 lvItem
.iImage
= SHMapPIDLToSystemImageListIndex(m_pSFParent
, pidlNew
, 0);
1807 m_ListView
.SetItem(&lvItem
);
1808 m_ListView
.Update(lpdi
->item
.iItem
);
1817 TRACE("-- %p WM_COMMAND %x unhandled\n", this, lpnmh
->code
);
1824 /**********************************************************
1825 * ShellView_OnChange()
1827 LRESULT
CDefView::OnChangeNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1829 PCIDLIST_ABSOLUTE
*Pidls
= reinterpret_cast<PCIDLIST_ABSOLUTE
*>(wParam
);
1831 TRACE("(%p)(%p,%p,0x%08x)\n", this, Pidls
[0], Pidls
[1], lParam
);
1837 LV_AddItem(ILFindLastID(Pidls
[0]));
1842 LV_DeleteItem(ILFindLastID(Pidls
[0]));
1845 case SHCNE_RENAMEFOLDER
:
1846 case SHCNE_RENAMEITEM
:
1847 LV_RenameItem(ILFindLastID(Pidls
[0]), ILFindLastID(Pidls
[1]));
1850 case SHCNE_UPDATEITEM
:
1851 LV_RenameItem(ILFindLastID(Pidls
[0]), ILFindLastID(Pidls
[0]));
1854 case SHCNE_UPDATEDIR
:
1861 /**********************************************************
1862 * CDefView::OnCustomItem
1864 LRESULT
CDefView::OnCustomItem(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1869 ERR("no menu!!!\n");
1873 CComPtr
<IContextMenu2
> pCM2
;
1874 HRESULT hres
= m_pCM
.p
->QueryInterface(IID_PPV_ARG(IContextMenu2
, &pCM2
));
1878 if (pCM2
.p
->HandleMenuMsg(uMsg
, (WPARAM
)m_hWnd
, lParam
) == S_OK
)
1884 LRESULT
CDefView::OnSettingChange(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1886 /* Wallpaper setting affects drop shadows effect */
1887 if (wParam
== SPI_SETDESKWALLPAPER
|| wParam
== 0)
1893 /**********************************************************
1894 * CDefView::OnInitMenuPopup
1896 LRESULT
CDefView::OnInitMenuPopup(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1898 MENUITEMINFOW mii
= { 0 };
1899 HMENU hSubmenu
= (HMENU
) wParam
;
1901 DbgPrint("OnInitMenuPopup lParam=%d\n", lParam
);
1903 mii
.cbSize
= sizeof(mii
);
1904 mii
.fMask
= MIIM_ID
| MIIM_SUBMENU
;
1906 if (!GetMenuItemInfoW(this->m_hMenu
, lParam
, TRUE
, &mii
))
1908 DbgPrint("OnInitMenuPopup GetMenuItemInfoW failed!\n");
1912 UINT menuItemId
= mii
.wID
;
1914 if (mii
.hSubMenu
!= hSubmenu
)
1916 DbgPrint("OnInitMenuPopup submenu does not match!!!!\n");
1920 DbgPrint("OnInitMenuPopup id=%d\n", menuItemId
);
1924 case FCIDM_MENU_FILE
:
1925 PrepareShowFileMenu(hSubmenu
);
1927 case FCIDM_MENU_EDIT
:
1928 //PrepareShowEditMenu(hSubmenu);
1930 case FCIDM_MENU_VIEW
:
1931 PrepareShowViewMenu(hSubmenu
);
1938 /**********************************************************
1941 * The INTERFACE of the IShellView object
1944 **********************************************************
1947 /**********************************************************
1948 * ShellView_GetWindow
1950 HRESULT WINAPI
CDefView::GetWindow(HWND
*phWnd
)
1952 TRACE("(%p)\n", this);
1959 HRESULT WINAPI
CDefView::ContextSensitiveHelp(BOOL fEnterMode
)
1961 FIXME("(%p) stub\n", this);
1966 /**********************************************************
1967 * IShellView_TranslateAccelerator
1970 * use the accel functions
1972 HRESULT WINAPI
CDefView::TranslateAccelerator(LPMSG lpmsg
)
1977 if (lpmsg
->message
>= WM_KEYFIRST
&& lpmsg
->message
<= WM_KEYLAST
)
1979 if (::TranslateAcceleratorW(m_hWnd
, m_hAccel
, lpmsg
) != 0)
1982 TRACE("-- key=0x04%lx\n", lpmsg
->wParam
) ;
1985 return m_pShellBrowser
->TranslateAcceleratorSB(lpmsg
, 0);
1988 HRESULT WINAPI
CDefView::EnableModeless(BOOL fEnable
)
1990 FIXME("(%p) stub\n", this);
1995 HRESULT WINAPI
CDefView::UIActivate(UINT uState
)
1998 CHAR szName[MAX_PATH];
2001 int nPartArray
[1] = { -1};
2003 TRACE("(%p)->(state=%x) stub\n", this, uState
);
2005 /*don't do anything if the state isn't really changing*/
2006 if (m_uState
== uState
)
2011 /*OnActivate handles the menu merging and internal state*/
2014 /*only do This if we are active*/
2015 if (uState
!= SVUIA_DEACTIVATE
)
2019 GetFolderPath is not a method of IShellFolder
2020 IShellFolder_GetFolderPath( m_pSFParent, szName, sizeof(szName) );
2022 /* set the number of parts */
2023 m_pShellBrowser
->SendControlMsg(FCW_STATUS
, SB_SETPARTS
, 1, (LPARAM
)nPartArray
, &lResult
);
2025 /* set the text for the parts */
2027 m_pShellBrowser->SendControlMsg(FCW_STATUS, SB_SETTEXTA, 0, (LPARAM)szName, &lResult);
2034 HRESULT WINAPI
CDefView::Refresh()
2036 TRACE("(%p)\n", this);
2038 m_ListView
.DeleteAllItems();
2044 HRESULT WINAPI
CDefView::CreateViewWindow(IShellView
*lpPrevView
, LPCFOLDERSETTINGS lpfs
, IShellBrowser
*psb
, RECT
*prcView
, HWND
*phWnd
)
2046 OLEMENUGROUPWIDTHS omw
= { { 0, 0, 0, 0, 0, 0 } };
2050 TRACE("(%p)->(shlview=%p set=%p shlbrs=%p rec=%p hwnd=%p) incomplete\n", this, lpPrevView
, lpfs
, psb
, prcView
, phWnd
);
2053 TRACE("-- vmode=%x flags=%x\n", lpfs
->ViewMode
, lpfs
->fFlags
);
2054 if (prcView
!= NULL
)
2055 TRACE("-- left=%i top=%i right=%i bottom=%i\n", prcView
->left
, prcView
->top
, prcView
->right
, prcView
->bottom
);
2057 /* Validate the Shell Browser */
2059 return E_UNEXPECTED
;
2061 /*set up the member variables*/
2062 m_pShellBrowser
= psb
;
2063 m_FolderSettings
= *lpfs
;
2065 /*get our parent window*/
2066 m_pShellBrowser
->GetWindow(&m_hWndParent
);
2068 /* try to get the ICommDlgBrowserInterface, adds a reference !!! */
2069 m_pCommDlgBrowser
= NULL
;
2070 if (SUCCEEDED(m_pShellBrowser
->QueryInterface(IID_PPV_ARG(ICommDlgBrowser
, &m_pCommDlgBrowser
))))
2072 TRACE("-- CommDlgBrowser\n");
2075 Create(m_hWndParent
, prcView
, NULL
, WS_CHILD
| WS_TABSTOP
, 0, 0U);
2086 SetWindowPos(HWND_TOP
, 0, 0, 0, 0, SWP_NOMOVE
| SWP_NOSIZE
| SWP_SHOWWINDOW
);
2091 m_hMenu
= CreateMenu();
2092 m_pShellBrowser
->InsertMenusSB(m_hMenu
, &omw
);
2093 TRACE("-- after fnInsertMenusSB\n");
2101 HRESULT WINAPI
CDefView::DestroyViewWindow()
2103 TRACE("(%p)\n", this);
2105 /*Make absolutely sure all our UI is cleaned up.*/
2106 UIActivate(SVUIA_DEACTIVATE
);
2110 // "Accelerator tables loaded from resources are freed automatically when the application terminates." -- MSDN
2116 DestroyMenu(m_hView
);
2122 DestroyMenu(m_hMenu
);
2128 m_ListView
.DestroyWindow();
2136 m_pShellBrowser
.Release();
2137 m_pCommDlgBrowser
.Release();
2142 HRESULT WINAPI
CDefView::GetCurrentInfo(LPFOLDERSETTINGS lpfs
)
2144 TRACE("(%p)->(%p) vmode=%x flags=%x\n", this, lpfs
,
2145 m_FolderSettings
.ViewMode
, m_FolderSettings
.fFlags
);
2148 return E_INVALIDARG
;
2150 *lpfs
= m_FolderSettings
;
2154 HRESULT WINAPI
CDefView::AddPropertySheetPages(DWORD dwReserved
, LPFNADDPROPSHEETPAGE lpfn
, LPARAM lparam
)
2156 FIXME("(%p) stub\n", this);
2161 HRESULT WINAPI
CDefView::SaveViewState()
2163 FIXME("(%p) stub\n", this);
2168 HRESULT WINAPI
CDefView::SelectItem(PCUITEMID_CHILD pidl
, UINT uFlags
)
2172 TRACE("(%p)->(pidl=%p, 0x%08x) stub\n", this, pidl
, uFlags
);
2174 i
= LV_FindItemByPidl(pidl
);
2178 if(uFlags
& SVSI_ENSUREVISIBLE
)
2179 m_ListView
.EnsureVisible(i
, FALSE
);
2181 LVITEMW lvItem
= {0};
2182 lvItem
.mask
= LVIF_STATE
;
2183 lvItem
.stateMask
= LVIS_SELECTED
| LVIS_FOCUSED
;
2185 while (m_ListView
.GetItem(&lvItem
))
2187 if (lvItem
.iItem
== i
)
2189 if (uFlags
& SVSI_SELECT
)
2190 lvItem
.state
|= LVIS_SELECTED
;
2192 lvItem
.state
&= ~LVIS_SELECTED
;
2194 if (uFlags
& SVSI_FOCUSED
)
2195 lvItem
.state
&= ~LVIS_FOCUSED
;
2199 if (uFlags
& SVSI_DESELECTOTHERS
)
2200 lvItem
.state
&= ~LVIS_SELECTED
;
2203 m_ListView
.SetItem(&lvItem
);
2207 if(uFlags
& SVSI_EDIT
)
2208 m_ListView
.EditLabel(i
);
2213 HRESULT WINAPI
CDefView::GetItemObject(UINT uItem
, REFIID riid
, LPVOID
*ppvOut
)
2215 HRESULT hr
= E_NOINTERFACE
;
2217 TRACE("(%p)->(uItem=0x%08x,\n\tIID=%s, ppv=%p)\n", this, uItem
, debugstr_guid(&riid
), ppvOut
);
2223 case SVGIO_BACKGROUND
:
2224 if (IsEqualIID(riid
, IID_IContextMenu
))
2226 //*ppvOut = ISvBgCm_Constructor(m_pSFParent, FALSE);
2231 hr
= CDefFolderMenu_Create2(NULL
, NULL
, 0, NULL
, m_pSFParent
, NULL
, 0, NULL
, &pcm
);
2238 case SVGIO_SELECTION
:
2240 hr
= m_pSFParent
->GetUIObjectOf(m_hWnd
, m_cidl
, m_apidl
, riid
, 0, ppvOut
);
2244 TRACE("-- (%p)->(interface=%p)\n", this, *ppvOut
);
2249 HRESULT STDMETHODCALLTYPE
CDefView::GetCurrentViewMode(UINT
*pViewMode
)
2251 TRACE("(%p)->(%p), stub\n", this, pViewMode
);
2254 return E_INVALIDARG
;
2256 *pViewMode
= m_FolderSettings
.ViewMode
;
2260 HRESULT STDMETHODCALLTYPE
CDefView::SetCurrentViewMode(UINT ViewMode
)
2263 TRACE("(%p)->(%u), stub\n", this, ViewMode
);
2265 /* It's not redundant to check FVM_AUTO because it's a (UINT)-1 */
2266 if (((INT
)ViewMode
< FVM_FIRST
|| (INT
)ViewMode
> FVM_LAST
) && ((INT
)ViewMode
!= FVM_AUTO
))
2267 return E_INVALIDARG
;
2269 /* Windows before Vista uses LVM_SETVIEW and possibly
2270 LVM_SETEXTENDEDLISTVIEWSTYLE to set the style of the listview,
2271 while later versions seem to accomplish this through other
2279 dwStyle
= LVS_REPORT
;
2282 dwStyle
= LVS_SMALLICON
;
2289 FIXME("ViewMode %d not implemented\n", ViewMode
);
2295 SetStyle(dwStyle
, LVS_TYPEMASK
);
2297 /* This will not necessarily be the actual mode set above.
2298 This mimics the behavior of Windows XP. */
2299 m_FolderSettings
.ViewMode
= ViewMode
;
2304 HRESULT STDMETHODCALLTYPE
CDefView::GetFolder(REFIID riid
, void **ppv
)
2306 if (m_pSFParent
== NULL
)
2309 return m_pSFParent
->QueryInterface(riid
, ppv
);
2312 HRESULT STDMETHODCALLTYPE
CDefView::Item(int iItemIndex
, PITEMID_CHILD
*ppidl
)
2314 PCUITEMID_CHILD pidl
= _PidlByItem(iItemIndex
);
2317 *ppidl
= ILClone(pidl
);
2322 return E_INVALIDARG
;
2325 HRESULT STDMETHODCALLTYPE
CDefView::ItemCount(UINT uFlags
, int *pcItems
)
2327 TRACE("(%p)->(%u %p)\n", this, uFlags
, pcItems
);
2329 if (uFlags
!= SVGIO_ALLVIEW
)
2330 FIXME("some flags unsupported, %x\n", uFlags
& ~SVGIO_ALLVIEW
);
2332 *pcItems
= m_ListView
.GetItemCount();
2337 HRESULT STDMETHODCALLTYPE
CDefView::Items(UINT uFlags
, REFIID riid
, void **ppv
)
2342 HRESULT STDMETHODCALLTYPE
CDefView::GetSelectionMarkedItem(int *piItem
)
2344 TRACE("(%p)->(%p)\n", this, piItem
);
2346 *piItem
= m_ListView
.GetSelectionMark();
2351 HRESULT STDMETHODCALLTYPE
CDefView::GetFocusedItem(int *piItem
)
2353 TRACE("(%p)->(%p)\n", this, piItem
);
2355 *piItem
= m_ListView
.GetNextItem(-1, LVNI_FOCUSED
);
2360 HRESULT STDMETHODCALLTYPE
CDefView::GetItemPosition(PCUITEMID_CHILD pidl
, POINT
*ppt
)
2365 HRESULT STDMETHODCALLTYPE
CDefView::GetSpacing(POINT
*ppt
)
2367 TRACE("(%p)->(%p)\n", this, ppt
);
2375 m_ListView
.GetItemSpacing(spacing
);
2377 ppt
->x
= spacing
.cx
;
2378 ppt
->y
= spacing
.cy
;
2384 HRESULT STDMETHODCALLTYPE
CDefView::GetDefaultSpacing(POINT
*ppt
)
2389 HRESULT STDMETHODCALLTYPE
CDefView::GetAutoArrange()
2394 HRESULT STDMETHODCALLTYPE
CDefView::SelectItem(int iItem
, DWORD dwFlags
)
2398 TRACE("(%p)->(%d, %x)\n", this, iItem
, dwFlags
);
2401 lvItem
.stateMask
= LVIS_SELECTED
;
2403 if (dwFlags
& SVSI_ENSUREVISIBLE
)
2404 m_ListView
.EnsureVisible(iItem
, 0);
2407 if (dwFlags
& SVSI_DESELECTOTHERS
)
2408 m_ListView
.SetItemState(-1, 0, LVIS_SELECTED
);
2411 if (dwFlags
& SVSI_SELECT
)
2412 lvItem
.state
|= LVIS_SELECTED
;
2414 if (dwFlags
& SVSI_FOCUSED
)
2415 lvItem
.stateMask
|= LVIS_FOCUSED
;
2417 m_ListView
.SetItemState(iItem
, lvItem
.state
, lvItem
.stateMask
);
2419 if (dwFlags
& SVSI_EDIT
)
2420 m_ListView
.EditLabel(iItem
);
2425 HRESULT STDMETHODCALLTYPE
CDefView::SelectAndPositionItems(UINT cidl
, PCUITEMID_CHILD_ARRAY apidl
, POINT
*apt
, DWORD dwFlags
)
2430 /**********************************************************
2431 * IShellFolderView implementation
2433 HRESULT STDMETHODCALLTYPE
CDefView::Rearrange(LPARAM sort
)
2435 FIXME("(%p)->(%ld) stub\n", this, sort
);
2439 HRESULT STDMETHODCALLTYPE
CDefView::GetArrangeParam(LPARAM
*sort
)
2441 FIXME("(%p)->(%p) stub\n", this, sort
);
2445 HRESULT STDMETHODCALLTYPE
CDefView::ArrangeGrid()
2447 FIXME("(%p) stub\n", this);
2451 HRESULT STDMETHODCALLTYPE
CDefView::AutoArrange()
2453 FIXME("(%p) stub\n", this);
2457 HRESULT STDMETHODCALLTYPE
CDefView::AddObject(PITEMID_CHILD pidl
, UINT
*item
)
2459 FIXME("(%p)->(%p %p) stub\n", this, pidl
, item
);
2463 HRESULT STDMETHODCALLTYPE
CDefView::GetObject(PITEMID_CHILD
*pidl
, UINT item
)
2465 TRACE("(%p)->(%p %d)\n", this, pidl
, item
);
2466 return Item(item
, pidl
);
2469 HRESULT STDMETHODCALLTYPE
CDefView::RemoveObject(PITEMID_CHILD pidl
, UINT
*item
)
2472 TRACE("(%p)->(%p %p)\n", this, pidl
, item
);
2476 *item
= LV_FindItemByPidl(ILFindLastID(pidl
));
2477 m_ListView
.DeleteItem(*item
);
2482 m_ListView
.DeleteAllItems();
2488 HRESULT STDMETHODCALLTYPE
CDefView::GetObjectCount(UINT
*count
)
2490 TRACE("(%p)->(%p)\n", this, count
);
2491 *count
= m_ListView
.GetItemCount();
2495 HRESULT STDMETHODCALLTYPE
CDefView::SetObjectCount(UINT count
, UINT flags
)
2497 FIXME("(%p)->(%d %x) stub\n", this, count
, flags
);
2501 HRESULT STDMETHODCALLTYPE
CDefView::UpdateObject(PITEMID_CHILD pidl_old
, PITEMID_CHILD pidl_new
, UINT
*item
)
2503 FIXME("(%p)->(%p %p %p) stub\n", this, pidl_old
, pidl_new
, item
);
2507 HRESULT STDMETHODCALLTYPE
CDefView::RefreshObject(PITEMID_CHILD pidl
, UINT
*item
)
2509 FIXME("(%p)->(%p %p) stub\n", this, pidl
, item
);
2513 HRESULT STDMETHODCALLTYPE
CDefView::SetRedraw(BOOL redraw
)
2515 TRACE("(%p)->(%d)\n", this, redraw
);
2516 m_ListView
.SetRedraw(redraw
);
2520 HRESULT STDMETHODCALLTYPE
CDefView::GetSelectedCount(UINT
*count
)
2522 FIXME("(%p)->(%p) stub\n", this, count
);
2526 HRESULT STDMETHODCALLTYPE
CDefView::GetSelectedObjects(PCUITEMID_CHILD
**pidl
, UINT
*items
)
2528 TRACE("(%p)->(%p %p)\n", this, pidl
, items
);
2530 *items
= GetSelections();
2534 *pidl
= static_cast<PCUITEMID_CHILD
*>(LocalAlloc(0, *items
* sizeof(PCUITEMID_CHILD
)));
2537 return E_OUTOFMEMORY
;
2540 /* it's documented that caller shouldn't PIDLs, only array itself */
2541 memcpy(*pidl
, m_apidl
, *items
* sizeof(PCUITEMID_CHILD
));
2547 HRESULT STDMETHODCALLTYPE
CDefView::IsDropOnSource(IDropTarget
*drop_target
)
2549 FIXME("(%p)->(%p) stub\n", this, drop_target
);
2553 HRESULT STDMETHODCALLTYPE
CDefView::GetDragPoint(POINT
*pt
)
2555 FIXME("(%p)->(%p) stub\n", this, pt
);
2559 HRESULT STDMETHODCALLTYPE
CDefView::GetDropPoint(POINT
*pt
)
2561 FIXME("(%p)->(%p) stub\n", this, pt
);
2565 HRESULT STDMETHODCALLTYPE
CDefView::MoveIcons(IDataObject
*obj
)
2567 TRACE("(%p)->(%p)\n", this, obj
);
2571 HRESULT STDMETHODCALLTYPE
CDefView::SetItemPos(PCUITEMID_CHILD pidl
, POINT
*pt
)
2573 FIXME("(%p)->(%p %p) stub\n", this, pidl
, pt
);
2577 HRESULT STDMETHODCALLTYPE
CDefView::IsBkDropTarget(IDropTarget
*drop_target
)
2579 FIXME("(%p)->(%p) stub\n", this, drop_target
);
2583 HRESULT STDMETHODCALLTYPE
CDefView::SetClipboard(BOOL move
)
2585 FIXME("(%p)->(%d) stub\n", this, move
);
2589 HRESULT STDMETHODCALLTYPE
CDefView::SetPoints(IDataObject
*obj
)
2591 FIXME("(%p)->(%p) stub\n", this, obj
);
2595 HRESULT STDMETHODCALLTYPE
CDefView::GetItemSpacing(ITEMSPACING
*spacing
)
2597 FIXME("(%p)->(%p) stub\n", this, spacing
);
2601 HRESULT STDMETHODCALLTYPE
CDefView::SetCallback(IShellFolderViewCB
*new_cb
, IShellFolderViewCB
**old_cb
)
2603 FIXME("(%p)->(%p %p) stub\n", this, new_cb
, old_cb
);
2607 HRESULT STDMETHODCALLTYPE
CDefView::Select(UINT flags
)
2609 FIXME("(%p)->(%d) stub\n", this, flags
);
2613 HRESULT STDMETHODCALLTYPE
CDefView::QuerySupport(UINT
*support
)
2615 TRACE("(%p)->(%p)\n", this, support
);
2619 HRESULT STDMETHODCALLTYPE
CDefView::SetAutomationObject(IDispatch
*disp
)
2621 FIXME("(%p)->(%p) stub\n", this, disp
);
2625 /**********************************************************
2626 * ISVOleCmdTarget_QueryStatus (IOleCommandTarget)
2628 HRESULT WINAPI
CDefView::QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
, OLECMD
*prgCmds
, OLECMDTEXT
*pCmdText
)
2630 FIXME("(%p)->(%p(%s) 0x%08x %p %p\n",
2631 this, pguidCmdGroup
, debugstr_guid(pguidCmdGroup
), cCmds
, prgCmds
, pCmdText
);
2634 return E_INVALIDARG
;
2636 for (UINT i
= 0; i
< cCmds
; i
++)
2638 FIXME("\tprgCmds[%d].cmdID = %d\n", i
, prgCmds
[i
].cmdID
);
2639 prgCmds
[i
].cmdf
= 0;
2642 return OLECMDERR_E_UNKNOWNGROUP
;
2645 /**********************************************************
2646 * ISVOleCmdTarget_Exec (IOleCommandTarget)
2648 * nCmdID is the OLECMDID_* enumeration
2650 HRESULT WINAPI
CDefView::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
2652 FIXME("(%p)->(\n\tTarget GUID:%s Command:0x%08x Opt:0x%08x %p %p)\n",
2653 this, debugstr_guid(pguidCmdGroup
), nCmdID
, nCmdexecopt
, pvaIn
, pvaOut
);
2656 return OLECMDERR_E_UNKNOWNGROUP
;
2658 if (IsEqualCLSID(*pguidCmdGroup
, m_Category
))
2660 if (nCmdID
== FCIDM_SHVIEW_AUTOARRANGE
)
2662 if (V_VT(pvaIn
) != VT_INT_PTR
)
2663 return OLECMDERR_E_NOTSUPPORTED
;
2667 params
.cbSize
= sizeof(params
);
2668 params
.rcExclude
= *(RECT
*) V_INTREF(pvaIn
);
2670 HMENU hView
= m_hView
;
2672 hView
= CreatePopupMenu();
2673 AppendMenuW(hView
, MF_STRING
, FCIDM_SHVIEW_BIGICON
, L
"Big!");
2674 AppendMenuW(hView
, MF_STRING
, FCIDM_SHVIEW_SMALLICON
, L
"Small!");
2675 AppendMenuW(hView
, MF_STRING
, FCIDM_SHVIEW_LISTVIEW
, L
"List!");
2676 AppendMenuW(hView
, MF_STRING
, FCIDM_SHVIEW_REPORTVIEW
, L
"Report!");
2681 PrepareShowViewMenu(hView
);
2683 TrackPopupMenuEx(hView
, TPM_LEFTALIGN
| TPM_TOPALIGN
, params
.rcExclude
.left
, params
.rcExclude
.bottom
, m_hWndParent
, ¶ms
);
2686 // pvaOut is VT_I4 with value 0x403 (cmd id of the new mode maybe?)
2687 V_VT(pvaOut
) = VT_I4
;
2688 V_I4(pvaOut
) = 0x403;
2692 if (IsEqualIID(*pguidCmdGroup
, CGID_Explorer
) &&
2694 (nCmdexecopt
== 4) && pvaOut
)
2697 if (IsEqualIID(*pguidCmdGroup
, CGID_ShellDocView
) &&
2702 return OLECMDERR_E_UNKNOWNGROUP
;
2705 /**********************************************************
2706 * ISVDropTarget implementation
2709 /******************************************************************************
2710 * drag_notify_subitem [Internal]
2712 * Figure out the shellfolder object, which is currently under the mouse cursor
2713 * and notify it via the IDropTarget interface.
2716 #define SCROLLAREAWIDTH 20
2718 HRESULT
CDefView::drag_notify_subitem(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2720 LVHITTESTINFO htinfo
;
2725 /* Map from global to client coordinates and query the index of the listview-item, which is
2726 * currently under the mouse cursor. */
2729 htinfo
.flags
= LVHT_ONITEM
;
2730 ::ScreenToClient(m_ListView
, &htinfo
.pt
);
2731 lResult
= m_ListView
.HitTest(&htinfo
);
2733 /* Send WM_*SCROLL messages every 250 ms during drag-scrolling */
2734 ::GetClientRect(m_ListView
, &clientRect
);
2735 if (htinfo
.pt
.x
== m_ptLastMousePos
.x
&& htinfo
.pt
.y
== m_ptLastMousePos
.y
&&
2736 (htinfo
.pt
.x
< SCROLLAREAWIDTH
|| htinfo
.pt
.x
> clientRect
.right
- SCROLLAREAWIDTH
||
2737 htinfo
.pt
.y
< SCROLLAREAWIDTH
|| htinfo
.pt
.y
> clientRect
.bottom
- SCROLLAREAWIDTH
))
2739 m_cScrollDelay
= (m_cScrollDelay
+ 1) % 5; /* DragOver is called every 50 ms */
2740 if (m_cScrollDelay
== 0)
2742 /* Mouse did hover another 250 ms over the scroll-area */
2743 if (htinfo
.pt
.x
< SCROLLAREAWIDTH
)
2744 m_ListView
.SendMessageW(WM_HSCROLL
, SB_LINEUP
, 0);
2746 if (htinfo
.pt
.x
> clientRect
.right
- SCROLLAREAWIDTH
)
2747 m_ListView
.SendMessageW(WM_HSCROLL
, SB_LINEDOWN
, 0);
2749 if (htinfo
.pt
.y
< SCROLLAREAWIDTH
)
2750 m_ListView
.SendMessageW(WM_VSCROLL
, SB_LINEUP
, 0);
2752 if (htinfo
.pt
.y
> clientRect
.bottom
- SCROLLAREAWIDTH
)
2753 m_ListView
.SendMessageW(WM_VSCROLL
, SB_LINEDOWN
, 0);
2758 m_cScrollDelay
= 0; /* Reset, if the cursor is not over the listview's scroll-area */
2761 m_ptLastMousePos
= htinfo
.pt
;
2763 /* If we are still over the previous sub-item, notify it via DragOver and return. */
2764 if (m_pCurDropTarget
&& lResult
== m_iDragOverItem
)
2765 return m_pCurDropTarget
->DragOver(grfKeyState
, pt
, pdwEffect
);
2767 /* We've left the previous sub-item, notify it via DragLeave and Release it. */
2768 if (m_pCurDropTarget
)
2770 m_pCurDropTarget
->DragLeave();
2771 m_pCurDropTarget
.Release();
2774 m_iDragOverItem
= lResult
;
2777 /* We are not above one of the listview's subitems. Bind to the parent folder's
2778 * DropTarget interface. */
2779 hr
= m_pSFParent
->QueryInterface(IID_PPV_ARG(IDropTarget
,&m_pCurDropTarget
));
2783 /* Query the relative PIDL of the shellfolder object represented by the currently
2784 * dragged over listview-item ... */
2785 PCUITEMID_CHILD pidl
= _PidlByItem(lResult
);
2787 /* ... and bind m_pCurDropTarget to the IDropTarget interface of an UIObject of this object */
2788 hr
= m_pSFParent
->GetUIObjectOf(m_ListView
, 1, &pidl
, IID_NULL_PPV_ARG(IDropTarget
, &m_pCurDropTarget
));
2791 /* If anything failed, m_pCurDropTarget should be NULL now, which ought to be a save state. */
2795 /* Notify the item just entered via DragEnter. */
2796 return m_pCurDropTarget
->DragEnter(m_pCurDataObject
, grfKeyState
, pt
, pdwEffect
);
2799 HRESULT WINAPI
CDefView::DragEnter(IDataObject
*pDataObject
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2801 /* Get a hold on the data object for later calls to DragEnter on the sub-folders */
2802 m_pCurDataObject
= pDataObject
;
2803 pDataObject
->AddRef();
2805 return drag_notify_subitem(grfKeyState
, pt
, pdwEffect
);
2808 HRESULT WINAPI
CDefView::DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2810 return drag_notify_subitem(grfKeyState
, pt
, pdwEffect
);
2813 HRESULT WINAPI
CDefView::DragLeave()
2815 if (m_pCurDropTarget
)
2817 m_pCurDropTarget
->DragLeave();
2818 m_pCurDropTarget
.Release();
2821 if (m_pCurDataObject
!= NULL
)
2823 m_pCurDataObject
.Release();
2826 m_iDragOverItem
= 0;
2831 HRESULT WINAPI
CDefView::Drop(IDataObject
* pDataObject
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2833 if (m_pCurDropTarget
)
2835 m_pCurDropTarget
->Drop(pDataObject
, grfKeyState
, pt
, pdwEffect
);
2836 m_pCurDropTarget
.Release();
2839 m_pCurDataObject
.Release();
2840 m_iDragOverItem
= 0;
2844 /**********************************************************
2845 * ISVDropSource implementation
2848 HRESULT WINAPI
CDefView::QueryContinueDrag(BOOL fEscapePressed
, DWORD grfKeyState
)
2850 TRACE("(%p)\n", this);
2853 return DRAGDROP_S_CANCEL
;
2854 else if (!(grfKeyState
& MK_LBUTTON
) && !(grfKeyState
& MK_RBUTTON
))
2855 return DRAGDROP_S_DROP
;
2860 HRESULT WINAPI
CDefView::GiveFeedback(DWORD dwEffect
)
2862 TRACE("(%p)\n", this);
2864 return DRAGDROP_S_USEDEFAULTCURSORS
;
2867 /**********************************************************
2868 * ISVViewObject implementation
2871 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
)
2873 FIXME("Stub: this=%p\n", this);
2878 HRESULT WINAPI
CDefView::GetColorSet(DWORD dwDrawAspect
, LONG lindex
, void *pvAspect
, DVTARGETDEVICE
*ptd
, HDC hicTargetDevice
, LOGPALETTE
**ppColorSet
)
2880 FIXME("Stub: this=%p\n", this);
2885 HRESULT WINAPI
CDefView::Freeze(DWORD dwDrawAspect
, LONG lindex
, void *pvAspect
, DWORD
*pdwFreeze
)
2887 FIXME("Stub: this=%p\n", this);
2892 HRESULT WINAPI
CDefView::Unfreeze(DWORD dwFreeze
)
2894 FIXME("Stub: this=%p\n", this);
2899 HRESULT WINAPI
CDefView::SetAdvise(DWORD aspects
, DWORD advf
, IAdviseSink
*pAdvSink
)
2901 FIXME("partial stub: %p %08x %08x %p\n", this, aspects
, advf
, pAdvSink
);
2903 /* FIXME: we set the AdviseSink, but never use it to send any advice */
2904 m_pAdvSink
= pAdvSink
;
2905 m_dwAspects
= aspects
;
2911 HRESULT WINAPI
CDefView::GetAdvise(DWORD
*pAspects
, DWORD
*pAdvf
, IAdviseSink
**ppAdvSink
)
2913 TRACE("this=%p pAspects=%p pAdvf=%p ppAdvSink=%p\n", this, pAspects
, pAdvf
, ppAdvSink
);
2917 *ppAdvSink
= m_pAdvSink
;
2918 m_pAdvSink
.p
->AddRef();
2922 *pAspects
= m_dwAspects
;
2930 HRESULT STDMETHODCALLTYPE
CDefView::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
2932 if (IsEqualIID(guidService
, SID_IShellBrowser
))
2933 return m_pShellBrowser
->QueryInterface(riid
, ppvObject
);
2934 else if(IsEqualIID(guidService
, SID_IFolderView
))
2935 return QueryInterface(riid
, ppvObject
);
2937 return E_NOINTERFACE
;
2940 HRESULT
CDefView::_MergeToolbar()
2942 CComPtr
<IExplorerToolbar
> ptb
; // [sp+8h] [bp-4h]@1
2946 hr
= IUnknown_QueryService(m_pShellBrowser
, IID_IExplorerToolbar
, IID_PPV_ARG(IExplorerToolbar
, &ptb
));
2950 m_Category
= CGID_DefViewFrame
;
2952 hr
= ptb
->SetCommandTarget(static_cast<IOleCommandTarget
*>(this), &m_Category
, 0);
2960 hr
= ptb
->AddButtons(&m_Category
, buttonsCount
, buttons
);
2967 /**********************************************************
2968 * IShellView_Constructor
2970 HRESULT WINAPI
IShellView_Constructor(IShellFolder
*pFolder
, IShellView
**newView
)
2972 return ShellObjectCreatorInit
<CDefView
>(pFolder
, IID_IShellView
, newView
);