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 /* FIXME: make showing hidden files a setting. */
872 hRes
= m_pSFParent
->EnumObjects(m_hWnd
, SHCONTF_NONFOLDERS
| SHCONTF_FOLDERS
| SHCONTF_INCLUDEHIDDEN
, &pEnumIDList
);
880 /* create a pointer array */
881 hdpa
= DPA_Create(16);
884 return(E_OUTOFMEMORY
);
887 /* copy the items into the array*/
888 while((S_OK
== pEnumIDList
->Next(1, &pidl
, &dwFetched
)) && dwFetched
)
890 if (DPA_InsertPtr(hdpa
, 0x7fff, pidl
) == -1)
897 DPA_Sort(hdpa
, CompareItems
, reinterpret_cast<LPARAM
>(m_pSFParent
.p
));
899 /*turn the listview's redrawing off*/
900 m_ListView
.SetRedraw(FALSE
);
902 DPA_DestroyCallback( hdpa
, fill_list
, this);
904 /*turn the listview's redrawing back on and force it to draw*/
905 m_ListView
.SetRedraw(TRUE
);
910 LRESULT
CDefView::OnShowWindow(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
912 m_ListView
.UpdateWindow();
917 LRESULT
CDefView::OnGetDlgCode(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
919 return m_ListView
.SendMessageW(uMsg
, 0, 0);
922 LRESULT
CDefView::OnDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
925 DestroyMenu(m_hMenu
);
926 RevokeDragDrop(m_hWnd
);
927 SHChangeNotifyDeregister(m_hNotify
);
932 LRESULT
CDefView::OnEraseBackground(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
934 /* redirect to parent */
935 if (m_FolderSettings
.fFlags
& (FWF_DESKTOP
| FWF_TRANSPARENT
))
936 return SendMessageW(GetParent(), WM_ERASEBKGND
, wParam
, lParam
);
942 LRESULT
CDefView::OnSysColorChange(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
944 /* Update desktop labels color */
947 /* Forward WM_SYSCOLORCHANGE to common controls */
948 return m_ListView
.SendMessageW(uMsg
, 0, 0);
951 LRESULT
CDefView::OnGetShellBrowser(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
953 return reinterpret_cast<LRESULT
>(m_pShellBrowser
.p
);
956 /**********************************************************
957 * ShellView_OnCreate()
959 LRESULT
CDefView::OnCreate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
961 CComPtr
<IDropTarget
> pdt
;
962 SHChangeNotifyEntry ntreg
;
963 CComPtr
<IPersistFolder2
> ppf2
;
975 if (SUCCEEDED(QueryInterface(IID_PPV_ARG(IDropTarget
, &pdt
))))
977 if (FAILED(RegisterDragDrop(m_hWnd
, pdt
)))
978 ERR("Registering Drag Drop Failed");
981 /* register for receiving notifications */
982 m_pSFParent
->QueryInterface(IID_PPV_ARG(IPersistFolder2
, &ppf2
));
985 PIDLIST_ABSOLUTE pidlParent
;
986 ppf2
->GetCurFolder(&pidlParent
);
987 ntreg
.fRecursive
= TRUE
;
988 ntreg
.pidl
= pidlParent
;
989 m_hNotify
= SHChangeNotifyRegister(m_hWnd
, SHCNF_IDLIST
, SHCNE_ALLEVENTS
, SHV_CHANGE_NOTIFY
, 1, &ntreg
);
993 m_hAccel
= LoadAcceleratorsW(shell32_hInstance
, MAKEINTRESOURCEW(IDA_SHELLVIEW
));
998 /**********************************************************
999 * #### Handling of the menus ####
1002 HMENU
CDefView::BuildFileMenu()
1005 CComPtr
<IContextMenu
> cm
;
1009 hr
= m_pSFParent
->GetUIObjectOf(m_hWnd
, m_cidl
, m_apidl
, IID_NULL_PPV_ARG(IContextMenu
, &cm
));
1013 HMENU hmenu
= CreatePopupMenu();
1015 //FIXME: get proper numbers ?
1016 const UINT first
= 0x7800;
1017 const UINT last
= 0x7A00;
1018 hr
= cm
->QueryContextMenu(hmenu
, 0, first
, last
, 0);
1022 // TODO: filter or something
1027 void CDefView::PrepareShowFileMenu(HMENU hSubMenu
)
1029 TRACE("(%p)->(submenu=%p) stub\n", this, hSubMenu
);
1034 /* Cleanup the items added previously */
1035 for (int i
= 0; i
< GetMenuItemCount(hSubMenu
); )
1038 mii
.cbSize
= sizeof(mii
);
1039 mii
.fMask
= MIIM_ID
;
1040 GetMenuItemInfoW(hSubMenu
, i
, TRUE
, &mii
);
1042 if (mii
.wID
< 0x8000)
1044 DeleteMenu(hSubMenu
, i
, MF_BYPOSITION
);
1052 /* Insert This item at the beginning of the menu. */
1053 _InsertMenuItemW(hSubMenu
, 0, TRUE
, 0, MFT_SEPARATOR
, NULL
, MFS_ENABLED
);
1054 _InsertMenuItemW(hSubMenu
, 0, TRUE
, IDM_MYFILEITEM
+ 4, MFT_STRING
, L
"Properties", MFS_DISABLED
);
1055 _InsertMenuItemW(hSubMenu
, 0, TRUE
, IDM_MYFILEITEM
+ 3, MFT_STRING
, L
"Rename", MFS_DISABLED
);
1056 _InsertMenuItemW(hSubMenu
, 0, TRUE
, IDM_MYFILEITEM
+ 2, MFT_STRING
, L
"Delete", MFS_DISABLED
);
1057 _InsertMenuItemW(hSubMenu
, 0, TRUE
, IDM_MYFILEITEM
+ 1, MFT_STRING
, L
"Create Shortcut", MFS_DISABLED
);
1058 _InsertMenuItemW(hSubMenu
, 0, TRUE
, 0, MFT_SEPARATOR
, NULL
, MFS_ENABLED
);
1059 _InsertMenuItemW(hSubMenu
, 0, TRUE
, IDM_MYFILEITEM
, MFT_STRING
, L
"New", MFS_ENABLED
);
1061 HMENU menubase
= BuildFileMenu();
1064 int count
= ::GetMenuItemCount(menubase
);
1066 for (int i
= 0; i
< count
; i
++)
1070 MENUITEMINFOW mii
= { 0 };
1071 mii
.cbSize
= sizeof(mii
);
1072 mii
.fMask
= MIIM_STATE
| MIIM_ID
| MIIM_SUBMENU
| MIIM_CHECKMARKS
| MIIM_DATA
| MIIM_STRING
| MIIM_BITMAP
| MIIM_FTYPE
;
1073 mii
.dwTypeData
= label
;
1074 mii
.cch
= _countof(label
);
1075 ::GetMenuItemInfoW(menubase
, i
, TRUE
, &mii
);
1077 TRACE("Adding item %d label %S type %d\n", mii
.wID
, mii
.dwTypeData
, mii
.fType
);
1079 mii
.fType
|= MFT_RADIOCHECK
;
1081 ::InsertMenuItemW(hSubMenu
, IDM_MYFILEITEM
, FALSE
, &mii
);
1084 _InsertMenuItemW(hSubMenu
, IDM_MYFILEITEM
, FALSE
, 0, MFT_SEPARATOR
, NULL
, MFS_ENABLED
);
1086 ::DestroyMenu(menubase
);
1091 void CDefView::PrepareShowViewMenu(HMENU hSubMenu
)
1093 TRACE("(%p)->(submenu=%p)\n", this, hSubMenu
);
1098 if (m_FolderSettings
.ViewMode
>= FVM_FIRST
&& m_FolderSettings
.ViewMode
<= FVM_LAST
)
1100 UINT iItemFirst
= FCIDM_SHVIEW_BIGICON
;
1101 UINT iItemLast
= iItemFirst
+ FVM_LAST
- FVM_FIRST
;
1102 UINT iItem
= iItemFirst
+ m_FolderSettings
.ViewMode
- FVM_FIRST
;
1103 CheckMenuRadioItem(hSubMenu
, iItemFirst
, iItemLast
, iItem
, MF_BYCOMMAND
);
1107 /**********************************************************
1108 * ShellView_GetSelections()
1110 * - fills the m_apidl list with the selected objects
1113 * number of selected items
1115 UINT
CDefView::GetSelections()
1119 m_cidl
= m_ListView
.GetSelectedCount();
1120 m_apidl
= reinterpret_cast<PCUITEMID_CHILD_ARRAY
>(SHAlloc(m_cidl
* sizeof(PCUITEMID_CHILD
)));
1127 TRACE("-- Items selected =%u\n", m_cidl
);
1131 while ((lvIndex
= m_ListView
.GetNextItem(lvIndex
, LVNI_SELECTED
)) > -1)
1133 m_apidl
[i
] = _PidlByItem(lvIndex
);
1137 TRACE("-- selected Item found\n");
1143 /**********************************************************
1144 * ShellView_OpenSelectedItems()
1146 HRESULT
CDefView::OpenSelectedItems()
1149 CMINVOKECOMMANDINFO cmi
;
1153 m_cidl
= m_ListView
.GetSelectedCount();
1157 hResult
= OnDefaultCommand();
1158 if (hResult
== S_OK
)
1161 hMenu
= CreatePopupMenu();
1165 hResult
= GetItemObject(SVGIO_SELECTION
, IID_PPV_ARG(IContextMenu
, &m_pCM
));
1166 if (FAILED(hResult
))
1169 hResult
= IUnknown_SetSite(m_pCM
, (IShellView
*)this);
1170 //if (FAILED( hResult))
1173 hResult
= m_pCM
->QueryContextMenu(hMenu
, 0, 0x20, 0x7fff, CMF_DEFAULTONLY
);
1174 if (FAILED(hResult
))
1177 uCommand
= GetMenuDefaultItem(hMenu
, FALSE
, 0);
1178 if (uCommand
== (UINT
)-1)
1184 ZeroMemory(&cmi
, sizeof(cmi
));
1185 cmi
.cbSize
= sizeof(cmi
);
1186 cmi
.lpVerb
= (LPCSTR
)MAKEINTRESOURCEA(uCommand
);
1189 hResult
= m_pCM
->InvokeCommand(&cmi
);
1198 IUnknown_SetSite(m_pCM
, NULL
);
1205 /**********************************************************
1206 * ShellView_DoContextMenu()
1208 LRESULT
CDefView::OnContextMenu(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1214 CMINVOKECOMMANDINFO cmi
;
1217 // for some reason I haven't figured out, we sometimes recurse into this method
1224 TRACE("(%p)->(0x%08x 0x%08x) stub\n", this, x
, y
);
1226 hMenu
= CreatePopupMenu();
1230 m_cidl
= m_ListView
.GetSelectedCount();
1232 hResult
= GetItemObject( m_cidl
? SVGIO_SELECTION
: SVGIO_BACKGROUND
, IID_PPV_ARG(IContextMenu
, &m_pCM
));
1233 if (FAILED( hResult
))
1236 hResult
= IUnknown_SetSite(m_pCM
, (IShellView
*)this);
1237 //if (FAILED( hResult))
1240 hResult
= m_pCM
->QueryContextMenu(hMenu
, 0, FCIDM_SHVIEWFIRST
, FCIDM_SHVIEWLAST
, CMF_NORMAL
);
1241 if (FAILED( hResult
))
1244 if (m_FolderSettings
.fFlags
& FWF_DESKTOP
)
1245 SetMenuDefaultItem(hMenu
, FCIDM_SHVIEW_OPEN
, MF_BYCOMMAND
);
1247 uCommand
= TrackPopupMenu(hMenu
,
1248 TPM_LEFTALIGN
| TPM_RETURNCMD
| TPM_LEFTBUTTON
| TPM_RIGHTBUTTON
,
1249 x
, y
, 0, m_hWnd
, NULL
);
1253 if (uCommand
== FCIDM_SHVIEW_OPEN
&& OnDefaultCommand() == S_OK
)
1256 ZeroMemory(&cmi
, sizeof(cmi
));
1257 cmi
.cbSize
= sizeof(cmi
);
1258 cmi
.lpVerb
= MAKEINTRESOURCEA(uCommand
);
1260 m_pCM
->InvokeCommand(&cmi
);
1266 IUnknown_SetSite(m_pCM
, NULL
);
1276 LRESULT
CDefView::OnExplorerCommand(UINT uCommand
, BOOL bUseSelection
)
1279 CMINVOKECOMMANDINFO cmi
;
1282 hMenu
= CreatePopupMenu();
1286 hResult
= GetItemObject( bUseSelection
? SVGIO_SELECTION
: SVGIO_BACKGROUND
, IID_PPV_ARG(IContextMenu
, &m_pCM
));
1287 if (FAILED( hResult
))
1290 hResult
= IUnknown_SetSite(m_pCM
, (IShellView
*)this);
1291 //if (FAILED( hResult))
1294 hResult
= m_pCM
->QueryContextMenu(hMenu
, 0, FCIDM_SHVIEWFIRST
, FCIDM_SHVIEWLAST
, CMF_NORMAL
);
1295 if (FAILED( hResult
))
1298 ZeroMemory(&cmi
, sizeof(cmi
));
1299 cmi
.cbSize
= sizeof(cmi
);
1300 cmi
.lpVerb
= MAKEINTRESOURCEA(uCommand
);
1302 m_pCM
->InvokeCommand(&cmi
);
1308 IUnknown_SetSite(m_pCM
, NULL
);
1318 /**********************************************************
1319 * ##### message handling #####
1322 /**********************************************************
1323 * ShellView_OnSize()
1325 LRESULT
CDefView::OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1330 wWidth
= LOWORD(lParam
);
1331 wHeight
= HIWORD(lParam
);
1333 TRACE("%p width=%u height=%u\n", this, wWidth
, wHeight
);
1335 /*resize the ListView to fit our window*/
1338 ::MoveWindow(m_ListView
, 0, 0, wWidth
, wHeight
, TRUE
);
1344 /**********************************************************
1345 * ShellView_OnDeactivate()
1350 void CDefView::OnDeactivate()
1352 TRACE("%p\n", this);
1354 if (m_uState
!= SVUIA_DEACTIVATE
)
1356 // TODO: cleanup menu after deactivation
1358 m_uState
= SVUIA_DEACTIVATE
;
1362 void CDefView::DoActivate(UINT uState
)
1364 TRACE("%p uState=%x\n", this, uState
);
1366 /*don't do anything if the state isn't really changing */
1367 if (m_uState
== uState
)
1372 if (uState
== SVUIA_DEACTIVATE
)
1382 MENUITEMINFOW mii
= { 0 };
1384 /* initialize EDIT menu */
1385 mii
.cbSize
= sizeof(mii
);
1386 mii
.fMask
= MIIM_SUBMENU
;
1387 if (::GetMenuItemInfoW(m_hMenu
, FCIDM_MENU_EDIT
, FALSE
, &mii
))
1389 HMENU hSubMenu
= mii
.hSubMenu
;
1391 HMENU menubase
= ::LoadMenuW(shell32_hInstance
, L
"MENU_003");
1393 int count
= ::GetMenuItemCount(menubase
);
1394 for (int i
= 0; i
< count
; i
++)
1398 ZeroMemory(&mii
, sizeof(mii
));
1399 mii
.cbSize
= sizeof(mii
);
1400 mii
.fMask
= MIIM_STATE
| MIIM_ID
| MIIM_SUBMENU
| MIIM_CHECKMARKS
| MIIM_DATA
| MIIM_STRING
| MIIM_BITMAP
| MIIM_FTYPE
;
1401 mii
.dwTypeData
= label
;
1402 mii
.cch
= _countof(label
);
1403 ::GetMenuItemInfoW(menubase
, i
, TRUE
, &mii
);
1405 TRACE("Adding item %d label %S type %d\n", mii
.wID
, mii
.dwTypeData
, mii
.fType
);
1407 mii
.fType
|= MFT_RADIOCHECK
;
1409 ::InsertMenuItemW(hSubMenu
, FCIDM_MENU_VIEW_SEP_OPTIONS
, FALSE
, &mii
);
1412 ::DestroyMenu(menubase
);
1415 /* initialize VIEW menu */
1417 mii
.cbSize
= sizeof(mii
);
1418 mii
.fMask
= MIIM_SUBMENU
;
1419 if (::GetMenuItemInfoW(m_hMenu
, FCIDM_MENU_VIEW
, FALSE
, &mii
))
1421 HMENU menubase
= ::LoadMenuW(shell32_hInstance
, L
"MENU_001");
1423 HMENU hSubMenu
= mii
.hSubMenu
;
1425 m_hView
= CreatePopupMenu();
1427 _InsertMenuItemW(hSubMenu
, FCIDM_MENU_VIEW_SEP_OPTIONS
, FALSE
, 0, MFT_SEPARATOR
, NULL
, MFS_ENABLED
);
1429 int count
= ::GetMenuItemCount(menubase
);
1430 for (int i
= 0; i
< count
; i
++)
1434 ZeroMemory(&mii
, sizeof(mii
));
1435 mii
.cbSize
= sizeof(mii
);
1436 mii
.fMask
= MIIM_STATE
| MIIM_ID
| MIIM_SUBMENU
| MIIM_CHECKMARKS
| MIIM_DATA
| MIIM_STRING
| MIIM_BITMAP
| MIIM_FTYPE
;
1437 mii
.dwTypeData
= label
;
1438 mii
.cch
= _countof(label
);
1439 ::GetMenuItemInfoW(menubase
, i
, TRUE
, &mii
);
1441 ::AppendMenuW(m_hView
, mii
.fType
, mii
.wID
, mii
.dwTypeData
);
1443 TRACE("Adding item %d label %S type %d\n", mii
.wID
, mii
.dwTypeData
, mii
.fType
);
1445 mii
.fType
|= MFT_RADIOCHECK
;
1447 ::InsertMenuItemW(hSubMenu
, FCIDM_MENU_VIEW_SEP_OPTIONS
, FALSE
, &mii
);
1450 ::DestroyMenu(menubase
);
1454 TRACE("-- before fnSetMenuSB\n");
1455 m_pShellBrowser
->SetMenuSB(m_hMenu
, 0, m_hWnd
);
1457 m_menusLoaded
= TRUE
;
1461 if (SVUIA_ACTIVATE_FOCUS
== uState
)
1463 m_ListView
.SetFocus();
1471 /**********************************************************
1472 * ShellView_OnActivate()
1474 LRESULT
CDefView::OnActivate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1476 DoActivate(SVUIA_ACTIVATE_FOCUS
);
1480 /**********************************************************
1481 * ShellView_OnSetFocus()
1484 LRESULT
CDefView::OnSetFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1486 TRACE("%p\n", this);
1488 /* Tell the browser one of our windows has received the focus. This
1489 should always be done before merging menus (OnActivate merges the
1490 menus) if one of our windows has the focus.*/
1492 m_pShellBrowser
->OnViewWindowActive(this);
1493 DoActivate(SVUIA_ACTIVATE_FOCUS
);
1495 /* Set the focus to the listview */
1496 m_ListView
.SetFocus();
1498 /* Notify the ICommDlgBrowser interface */
1499 OnStateChange(CDBOSC_SETFOCUS
);
1504 /**********************************************************
1505 * ShellView_OnKillFocus()
1507 LRESULT
CDefView::OnKillFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1509 TRACE("(%p) stub\n", this);
1511 DoActivate(SVUIA_ACTIVATE_NOFOCUS
);
1512 /* Notify the ICommDlgBrowser */
1513 OnStateChange(CDBOSC_KILLFOCUS
);
1518 /**********************************************************
1519 * ShellView_OnCommand()
1522 * the CmdID's are the ones from the context menu
1524 LRESULT
CDefView::OnCommand(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1530 dwCmdID
= GET_WM_COMMAND_ID(wParam
, lParam
);
1531 dwCmd
= GET_WM_COMMAND_CMD(wParam
, lParam
);
1532 hwndCmd
= GET_WM_COMMAND_HWND(wParam
, lParam
);
1534 TRACE("(%p)->(0x%08x 0x%08x %p) stub\n", this, dwCmdID
, dwCmd
, hwndCmd
);
1538 case FCIDM_SHVIEW_SMALLICON
:
1539 m_FolderSettings
.ViewMode
= FVM_SMALLICON
;
1540 SetStyle (LVS_SMALLICON
, LVS_TYPEMASK
);
1544 case FCIDM_SHVIEW_BIGICON
:
1545 m_FolderSettings
.ViewMode
= FVM_ICON
;
1546 SetStyle (LVS_ICON
, LVS_TYPEMASK
);
1550 case FCIDM_SHVIEW_LISTVIEW
:
1551 m_FolderSettings
.ViewMode
= FVM_LIST
;
1552 SetStyle (LVS_LIST
, LVS_TYPEMASK
);
1556 case FCIDM_SHVIEW_REPORTVIEW
:
1557 m_FolderSettings
.ViewMode
= FVM_DETAILS
;
1558 SetStyle (LVS_REPORT
, LVS_TYPEMASK
);
1562 /* the menu-ID's for sorting are 0x30... see shrec.rc */
1567 m_sortInfo
.nHeaderID
= dwCmdID
- 0x30;
1568 m_sortInfo
.bIsAscending
= TRUE
;
1569 m_sortInfo
.nLastHeaderID
= m_sortInfo
.nHeaderID
;
1570 m_ListView
.SortItems(ListViewCompareItems
, &m_sortInfo
);
1573 case FCIDM_SHVIEW_REFRESH
:
1577 case FCIDM_SHVIEW_DELETE
:
1578 case FCIDM_SHVIEW_CUT
:
1579 case FCIDM_SHVIEW_COPY
:
1580 case FCIDM_SHVIEW_RENAME
:
1581 return OnExplorerCommand(dwCmdID
, TRUE
);
1583 case FCIDM_SHVIEW_INSERT
:
1584 case FCIDM_SHVIEW_UNDO
:
1585 case FCIDM_SHVIEW_INSERTLINK
:
1586 case FCIDM_SHVIEW_NEWFOLDER
:
1587 return OnExplorerCommand(dwCmdID
, FALSE
);
1589 TRACE("-- COMMAND 0x%04x unhandled\n", dwCmdID
);
1595 /**********************************************************
1596 * ShellView_OnNotify()
1599 LRESULT
CDefView::OnNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1603 LPNMLISTVIEW lpnmlv
;
1604 NMLVDISPINFOW
*lpdi
;
1605 PCUITEMID_CHILD pidl
;
1609 lpnmh
= (LPNMHDR
)lParam
;
1610 lpnmlv
= (LPNMLISTVIEW
)lpnmh
;
1611 lpdi
= (NMLVDISPINFOW
*)lpnmh
;
1613 TRACE("%p CtlID=%u lpnmh->code=%x\n", this, CtlID
, lpnmh
->code
);
1615 switch (lpnmh
->code
)
1618 TRACE("-- NM_SETFOCUS %p\n", this);
1619 OnSetFocus(0, 0, 0, unused
);
1623 TRACE("-- NM_KILLFOCUS %p\n", this);
1625 /* Notify the ICommDlgBrowser interface */
1626 OnStateChange(CDBOSC_KILLFOCUS
);
1630 TRACE("-- NM_CUSTOMDRAW %p\n", this);
1631 return CDRF_DODEFAULT
;
1633 case NM_RELEASEDCAPTURE
:
1634 TRACE("-- NM_RELEASEDCAPTURE %p\n", this);
1638 TRACE("-- NM_CLICK %p\n", this);
1642 TRACE("-- NM_RCLICK %p\n", this);
1646 TRACE("-- NM_DBLCLK %p\n", this);
1647 OpenSelectedItems();
1651 TRACE("-- NM_RETURN %p\n", this);
1652 OpenSelectedItems();
1656 TRACE("-- HDN_ENDTRACKW %p\n", this);
1657 /*nColumn1 = m_ListView.GetColumnWidth(0);
1658 nColumn2 = m_ListView.GetColumnWidth(1);*/
1661 case LVN_DELETEITEM
:
1662 TRACE("-- LVN_DELETEITEM %p\n", this);
1664 /*delete the pidl because we made a copy of it*/
1665 SHFree(reinterpret_cast<LPVOID
>(lpnmlv
->lParam
));
1669 case LVN_DELETEALLITEMS
:
1670 TRACE("-- LVN_DELETEALLITEMS %p\n", this);
1673 case LVN_INSERTITEM
:
1674 TRACE("-- LVN_INSERTITEM (STUB)%p\n", this);
1677 case LVN_ITEMACTIVATE
:
1678 TRACE("-- LVN_ITEMACTIVATE %p\n", this);
1679 OnStateChange(CDBOSC_SELCHANGE
); /* the browser will get the IDataObject now */
1682 case LVN_COLUMNCLICK
:
1683 m_sortInfo
.nHeaderID
= lpnmlv
->iSubItem
;
1684 if (m_sortInfo
.nLastHeaderID
== m_sortInfo
.nHeaderID
)
1685 m_sortInfo
.bIsAscending
= !m_sortInfo
.bIsAscending
;
1687 m_sortInfo
.bIsAscending
= TRUE
;
1688 m_sortInfo
.nLastHeaderID
= m_sortInfo
.nHeaderID
;
1690 m_ListView
.SortItems(ListViewCompareItems
, &m_sortInfo
);
1693 case LVN_GETDISPINFOA
:
1694 case LVN_GETDISPINFOW
:
1695 TRACE("-- LVN_GETDISPINFO %p\n", this);
1696 pidl
= _PidlByItem(lpdi
->item
);
1698 if (lpdi
->item
.mask
& LVIF_TEXT
) /* text requested */
1703 if (FAILED(m_pSF2Parent
->GetDetailsOf(pidl
, lpdi
->item
.iSubItem
, &sd
)))
1705 FIXME("failed to get details\n");
1709 if (lpnmh
->code
== LVN_GETDISPINFOA
)
1711 /* shouldn't happen */
1712 NMLVDISPINFOA
*lpdiA
= (NMLVDISPINFOA
*)lpnmh
;
1713 StrRetToStrNA( lpdiA
->item
.pszText
, lpdiA
->item
.cchTextMax
, &sd
.str
, NULL
);
1714 TRACE("-- text=%s\n", lpdiA
->item
.pszText
);
1716 else /* LVN_GETDISPINFOW */
1718 StrRetToStrNW( lpdi
->item
.pszText
, lpdi
->item
.cchTextMax
, &sd
.str
, NULL
);
1719 TRACE("-- text=%s\n", debugstr_w(lpdi
->item
.pszText
));
1727 if(lpdi
->item
.mask
& LVIF_IMAGE
) /* image requested */
1729 lpdi
->item
.iImage
= SHMapPIDLToSystemImageListIndex(m_pSFParent
, pidl
, 0);
1731 lpdi
->item
.mask
|= LVIF_DI_SETITEM
;
1734 case LVN_ITEMCHANGED
:
1735 TRACE("-- LVN_ITEMCHANGED %p\n", this);
1736 OnStateChange(CDBOSC_SELCHANGE
); /* the browser will get the IDataObject now */
1740 case LVN_BEGINRDRAG
:
1741 TRACE("-- LVN_BEGINDRAG\n");
1743 if (GetSelections())
1745 CComPtr
<IDataObject
> pda
;
1746 DWORD dwAttributes
= SFGAO_CANLINK
;
1747 DWORD dwEffect
= DROPEFFECT_COPY
| DROPEFFECT_MOVE
;
1749 if (SUCCEEDED(m_pSFParent
->GetUIObjectOf(m_hWnd
, m_cidl
, m_apidl
, IID_NULL_PPV_ARG(IDataObject
, &pda
))))
1751 if (SUCCEEDED(m_pSFParent
->GetAttributesOf(m_cidl
, m_apidl
, &dwAttributes
)))
1753 if (dwAttributes
& SFGAO_CANLINK
)
1755 dwEffect
|= DROPEFFECT_LINK
;
1759 CComPtr
<IAsyncOperation
> piaso
;
1760 if (SUCCEEDED(pda
->QueryInterface(IID_PPV_ARG(IAsyncOperation
, &piaso
))))
1762 piaso
->SetAsyncMode(TRUE
);
1766 DoDragDrop(pda
, this, dwEffect
, &dwEffect2
);
1771 case LVN_BEGINLABELEDITW
:
1773 DWORD dwAttr
= SFGAO_CANRENAME
;
1774 pidl
= _PidlByItem(lpdi
->item
);
1776 TRACE("-- LVN_BEGINLABELEDITW %p\n", this);
1778 m_pSFParent
->GetAttributesOf(1, &pidl
, &dwAttr
);
1779 if (SFGAO_CANRENAME
& dwAttr
)
1787 case LVN_ENDLABELEDITW
:
1789 TRACE("-- LVN_ENDLABELEDITW %p\n", this);
1791 m_isEditing
= FALSE
;
1793 if (lpdi
->item
.pszText
)
1798 pidl
= _PidlByItem(lpdi
->item
);
1799 PITEMID_CHILD pidlNew
;
1800 hr
= m_pSFParent
->SetNameOf(0, pidl
, lpdi
->item
.pszText
, SHGDN_INFOLDER
, &pidlNew
);
1802 if (SUCCEEDED(hr
) && pidlNew
)
1804 lvItem
.mask
= LVIF_PARAM
|LVIF_IMAGE
;
1805 lvItem
.iItem
= lpdi
->item
.iItem
;
1806 lvItem
.lParam
= reinterpret_cast<LPARAM
>(pidlNew
);
1807 lvItem
.iImage
= SHMapPIDLToSystemImageListIndex(m_pSFParent
, pidlNew
, 0);
1808 m_ListView
.SetItem(&lvItem
);
1809 m_ListView
.Update(lpdi
->item
.iItem
);
1818 TRACE("-- %p WM_COMMAND %x unhandled\n", this, lpnmh
->code
);
1825 /**********************************************************
1826 * ShellView_OnChange()
1828 LRESULT
CDefView::OnChangeNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1830 PCIDLIST_ABSOLUTE
*Pidls
= reinterpret_cast<PCIDLIST_ABSOLUTE
*>(wParam
);
1832 TRACE("(%p)(%p,%p,0x%08x)\n", this, Pidls
[0], Pidls
[1], lParam
);
1838 LV_AddItem(ILFindLastID(Pidls
[0]));
1843 LV_DeleteItem(ILFindLastID(Pidls
[0]));
1846 case SHCNE_RENAMEFOLDER
:
1847 case SHCNE_RENAMEITEM
:
1848 LV_RenameItem(ILFindLastID(Pidls
[0]), ILFindLastID(Pidls
[1]));
1851 case SHCNE_UPDATEITEM
:
1852 LV_RenameItem(ILFindLastID(Pidls
[0]), ILFindLastID(Pidls
[0]));
1855 case SHCNE_UPDATEDIR
:
1862 /**********************************************************
1863 * CDefView::OnCustomItem
1865 LRESULT
CDefView::OnCustomItem(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1870 ERR("no menu!!!\n");
1874 CComPtr
<IContextMenu2
> pCM2
;
1875 HRESULT hres
= m_pCM
.p
->QueryInterface(IID_PPV_ARG(IContextMenu2
, &pCM2
));
1879 if (pCM2
.p
->HandleMenuMsg(uMsg
, (WPARAM
)m_hWnd
, lParam
) == S_OK
)
1885 LRESULT
CDefView::OnSettingChange(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1887 /* Wallpaper setting affects drop shadows effect */
1888 if (wParam
== SPI_SETDESKWALLPAPER
|| wParam
== 0)
1894 /**********************************************************
1895 * CDefView::OnInitMenuPopup
1897 LRESULT
CDefView::OnInitMenuPopup(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1899 MENUITEMINFOW mii
= { 0 };
1900 HMENU hSubmenu
= (HMENU
) wParam
;
1902 TRACE("OnInitMenuPopup lParam=%d\n", lParam
);
1904 mii
.cbSize
= sizeof(mii
);
1905 mii
.fMask
= MIIM_ID
| MIIM_SUBMENU
;
1907 if (!GetMenuItemInfoW(this->m_hMenu
, lParam
, TRUE
, &mii
))
1909 TRACE("OnInitMenuPopup GetMenuItemInfoW failed!\n");
1913 UINT menuItemId
= mii
.wID
;
1915 if (mii
.hSubMenu
!= hSubmenu
)
1917 TRACE("OnInitMenuPopup submenu does not match!!!!\n");
1921 TRACE("OnInitMenuPopup id=%d\n", menuItemId
);
1925 case FCIDM_MENU_FILE
:
1926 PrepareShowFileMenu(hSubmenu
);
1928 case FCIDM_MENU_EDIT
:
1929 //PrepareShowEditMenu(hSubmenu);
1931 case FCIDM_MENU_VIEW
:
1932 PrepareShowViewMenu(hSubmenu
);
1939 /**********************************************************
1942 * The INTERFACE of the IShellView object
1945 **********************************************************
1948 /**********************************************************
1949 * ShellView_GetWindow
1951 HRESULT WINAPI
CDefView::GetWindow(HWND
*phWnd
)
1953 TRACE("(%p)\n", this);
1960 HRESULT WINAPI
CDefView::ContextSensitiveHelp(BOOL fEnterMode
)
1962 FIXME("(%p) stub\n", this);
1967 /**********************************************************
1968 * IShellView_TranslateAccelerator
1971 * use the accel functions
1973 HRESULT WINAPI
CDefView::TranslateAccelerator(LPMSG lpmsg
)
1978 if (lpmsg
->message
>= WM_KEYFIRST
&& lpmsg
->message
<= WM_KEYLAST
)
1980 if (::TranslateAcceleratorW(m_hWnd
, m_hAccel
, lpmsg
) != 0)
1983 TRACE("-- key=0x04%lx\n", lpmsg
->wParam
) ;
1986 return m_pShellBrowser
->TranslateAcceleratorSB(lpmsg
, 0);
1989 HRESULT WINAPI
CDefView::EnableModeless(BOOL fEnable
)
1991 FIXME("(%p) stub\n", this);
1996 HRESULT WINAPI
CDefView::UIActivate(UINT uState
)
1999 CHAR szName[MAX_PATH];
2002 int nPartArray
[1] = { -1};
2004 TRACE("(%p)->(state=%x) stub\n", this, uState
);
2006 /*don't do anything if the state isn't really changing*/
2007 if (m_uState
== uState
)
2012 /*OnActivate handles the menu merging and internal state*/
2015 /*only do This if we are active*/
2016 if (uState
!= SVUIA_DEACTIVATE
)
2020 GetFolderPath is not a method of IShellFolder
2021 IShellFolder_GetFolderPath( m_pSFParent, szName, sizeof(szName) );
2023 /* set the number of parts */
2024 m_pShellBrowser
->SendControlMsg(FCW_STATUS
, SB_SETPARTS
, 1, (LPARAM
)nPartArray
, &lResult
);
2026 /* set the text for the parts */
2028 m_pShellBrowser->SendControlMsg(FCW_STATUS, SB_SETTEXTA, 0, (LPARAM)szName, &lResult);
2035 HRESULT WINAPI
CDefView::Refresh()
2037 TRACE("(%p)\n", this);
2039 m_ListView
.DeleteAllItems();
2045 HRESULT WINAPI
CDefView::CreateViewWindow(IShellView
*lpPrevView
, LPCFOLDERSETTINGS lpfs
, IShellBrowser
*psb
, RECT
*prcView
, HWND
*phWnd
)
2047 OLEMENUGROUPWIDTHS omw
= { { 0, 0, 0, 0, 0, 0 } };
2051 TRACE("(%p)->(shlview=%p set=%p shlbrs=%p rec=%p hwnd=%p) incomplete\n", this, lpPrevView
, lpfs
, psb
, prcView
, phWnd
);
2054 TRACE("-- vmode=%x flags=%x\n", lpfs
->ViewMode
, lpfs
->fFlags
);
2055 if (prcView
!= NULL
)
2056 TRACE("-- left=%i top=%i right=%i bottom=%i\n", prcView
->left
, prcView
->top
, prcView
->right
, prcView
->bottom
);
2058 /* Validate the Shell Browser */
2060 return E_UNEXPECTED
;
2062 /*set up the member variables*/
2063 m_pShellBrowser
= psb
;
2064 m_FolderSettings
= *lpfs
;
2066 /*get our parent window*/
2067 m_pShellBrowser
->GetWindow(&m_hWndParent
);
2069 /* try to get the ICommDlgBrowserInterface, adds a reference !!! */
2070 m_pCommDlgBrowser
= NULL
;
2071 if (SUCCEEDED(m_pShellBrowser
->QueryInterface(IID_PPV_ARG(ICommDlgBrowser
, &m_pCommDlgBrowser
))))
2073 TRACE("-- CommDlgBrowser\n");
2076 Create(m_hWndParent
, prcView
, NULL
, WS_CHILD
| WS_TABSTOP
, 0, 0U);
2087 SetWindowPos(HWND_TOP
, 0, 0, 0, 0, SWP_NOMOVE
| SWP_NOSIZE
| SWP_SHOWWINDOW
);
2092 m_hMenu
= CreateMenu();
2093 m_pShellBrowser
->InsertMenusSB(m_hMenu
, &omw
);
2094 TRACE("-- after fnInsertMenusSB\n");
2102 HRESULT WINAPI
CDefView::DestroyViewWindow()
2104 TRACE("(%p)\n", this);
2106 /*Make absolutely sure all our UI is cleaned up.*/
2107 UIActivate(SVUIA_DEACTIVATE
);
2111 // "Accelerator tables loaded from resources are freed automatically when the application terminates." -- MSDN
2117 DestroyMenu(m_hView
);
2123 DestroyMenu(m_hMenu
);
2129 m_ListView
.DestroyWindow();
2137 m_pShellBrowser
.Release();
2138 m_pCommDlgBrowser
.Release();
2143 HRESULT WINAPI
CDefView::GetCurrentInfo(LPFOLDERSETTINGS lpfs
)
2145 TRACE("(%p)->(%p) vmode=%x flags=%x\n", this, lpfs
,
2146 m_FolderSettings
.ViewMode
, m_FolderSettings
.fFlags
);
2149 return E_INVALIDARG
;
2151 *lpfs
= m_FolderSettings
;
2155 HRESULT WINAPI
CDefView::AddPropertySheetPages(DWORD dwReserved
, LPFNADDPROPSHEETPAGE lpfn
, LPARAM lparam
)
2157 FIXME("(%p) stub\n", this);
2162 HRESULT WINAPI
CDefView::SaveViewState()
2164 FIXME("(%p) stub\n", this);
2169 HRESULT WINAPI
CDefView::SelectItem(PCUITEMID_CHILD pidl
, UINT uFlags
)
2173 TRACE("(%p)->(pidl=%p, 0x%08x) stub\n", this, pidl
, uFlags
);
2175 i
= LV_FindItemByPidl(pidl
);
2179 if(uFlags
& SVSI_ENSUREVISIBLE
)
2180 m_ListView
.EnsureVisible(i
, FALSE
);
2182 LVITEMW lvItem
= {0};
2183 lvItem
.mask
= LVIF_STATE
;
2184 lvItem
.stateMask
= LVIS_SELECTED
| LVIS_FOCUSED
;
2186 while (m_ListView
.GetItem(&lvItem
))
2188 if (lvItem
.iItem
== i
)
2190 if (uFlags
& SVSI_SELECT
)
2191 lvItem
.state
|= LVIS_SELECTED
;
2193 lvItem
.state
&= ~LVIS_SELECTED
;
2195 if (uFlags
& SVSI_FOCUSED
)
2196 lvItem
.state
&= ~LVIS_FOCUSED
;
2200 if (uFlags
& SVSI_DESELECTOTHERS
)
2201 lvItem
.state
&= ~LVIS_SELECTED
;
2204 m_ListView
.SetItem(&lvItem
);
2208 if(uFlags
& SVSI_EDIT
)
2209 m_ListView
.EditLabel(i
);
2214 HRESULT WINAPI
CDefView::GetItemObject(UINT uItem
, REFIID riid
, LPVOID
*ppvOut
)
2216 HRESULT hr
= E_NOINTERFACE
;
2218 TRACE("(%p)->(uItem=0x%08x,\n\tIID=%s, ppv=%p)\n", this, uItem
, debugstr_guid(&riid
), ppvOut
);
2224 case SVGIO_BACKGROUND
:
2225 if (IsEqualIID(riid
, IID_IContextMenu
))
2227 //*ppvOut = ISvBgCm_Constructor(m_pSFParent, FALSE);
2232 hr
= CDefFolderMenu_Create2(NULL
, NULL
, 0, NULL
, m_pSFParent
, NULL
, 0, NULL
, &pcm
);
2239 case SVGIO_SELECTION
:
2241 hr
= m_pSFParent
->GetUIObjectOf(m_hWnd
, m_cidl
, m_apidl
, riid
, 0, ppvOut
);
2245 TRACE("-- (%p)->(interface=%p)\n", this, *ppvOut
);
2250 HRESULT STDMETHODCALLTYPE
CDefView::GetCurrentViewMode(UINT
*pViewMode
)
2252 TRACE("(%p)->(%p), stub\n", this, pViewMode
);
2255 return E_INVALIDARG
;
2257 *pViewMode
= m_FolderSettings
.ViewMode
;
2261 HRESULT STDMETHODCALLTYPE
CDefView::SetCurrentViewMode(UINT ViewMode
)
2264 TRACE("(%p)->(%u), stub\n", this, ViewMode
);
2266 /* It's not redundant to check FVM_AUTO because it's a (UINT)-1 */
2267 if (((INT
)ViewMode
< FVM_FIRST
|| (INT
)ViewMode
> FVM_LAST
) && ((INT
)ViewMode
!= FVM_AUTO
))
2268 return E_INVALIDARG
;
2270 /* Windows before Vista uses LVM_SETVIEW and possibly
2271 LVM_SETEXTENDEDLISTVIEWSTYLE to set the style of the listview,
2272 while later versions seem to accomplish this through other
2280 dwStyle
= LVS_REPORT
;
2283 dwStyle
= LVS_SMALLICON
;
2290 FIXME("ViewMode %d not implemented\n", ViewMode
);
2296 SetStyle(dwStyle
, LVS_TYPEMASK
);
2298 /* This will not necessarily be the actual mode set above.
2299 This mimics the behavior of Windows XP. */
2300 m_FolderSettings
.ViewMode
= ViewMode
;
2305 HRESULT STDMETHODCALLTYPE
CDefView::GetFolder(REFIID riid
, void **ppv
)
2307 if (m_pSFParent
== NULL
)
2310 return m_pSFParent
->QueryInterface(riid
, ppv
);
2313 HRESULT STDMETHODCALLTYPE
CDefView::Item(int iItemIndex
, PITEMID_CHILD
*ppidl
)
2315 PCUITEMID_CHILD pidl
= _PidlByItem(iItemIndex
);
2318 *ppidl
= ILClone(pidl
);
2323 return E_INVALIDARG
;
2326 HRESULT STDMETHODCALLTYPE
CDefView::ItemCount(UINT uFlags
, int *pcItems
)
2328 TRACE("(%p)->(%u %p)\n", this, uFlags
, pcItems
);
2330 if (uFlags
!= SVGIO_ALLVIEW
)
2331 FIXME("some flags unsupported, %x\n", uFlags
& ~SVGIO_ALLVIEW
);
2333 *pcItems
= m_ListView
.GetItemCount();
2338 HRESULT STDMETHODCALLTYPE
CDefView::Items(UINT uFlags
, REFIID riid
, void **ppv
)
2343 HRESULT STDMETHODCALLTYPE
CDefView::GetSelectionMarkedItem(int *piItem
)
2345 TRACE("(%p)->(%p)\n", this, piItem
);
2347 *piItem
= m_ListView
.GetSelectionMark();
2352 HRESULT STDMETHODCALLTYPE
CDefView::GetFocusedItem(int *piItem
)
2354 TRACE("(%p)->(%p)\n", this, piItem
);
2356 *piItem
= m_ListView
.GetNextItem(-1, LVNI_FOCUSED
);
2361 HRESULT STDMETHODCALLTYPE
CDefView::GetItemPosition(PCUITEMID_CHILD pidl
, POINT
*ppt
)
2366 HRESULT STDMETHODCALLTYPE
CDefView::GetSpacing(POINT
*ppt
)
2368 TRACE("(%p)->(%p)\n", this, ppt
);
2376 m_ListView
.GetItemSpacing(spacing
);
2378 ppt
->x
= spacing
.cx
;
2379 ppt
->y
= spacing
.cy
;
2385 HRESULT STDMETHODCALLTYPE
CDefView::GetDefaultSpacing(POINT
*ppt
)
2390 HRESULT STDMETHODCALLTYPE
CDefView::GetAutoArrange()
2395 HRESULT STDMETHODCALLTYPE
CDefView::SelectItem(int iItem
, DWORD dwFlags
)
2399 TRACE("(%p)->(%d, %x)\n", this, iItem
, dwFlags
);
2402 lvItem
.stateMask
= LVIS_SELECTED
;
2404 if (dwFlags
& SVSI_ENSUREVISIBLE
)
2405 m_ListView
.EnsureVisible(iItem
, 0);
2408 if (dwFlags
& SVSI_DESELECTOTHERS
)
2409 m_ListView
.SetItemState(-1, 0, LVIS_SELECTED
);
2412 if (dwFlags
& SVSI_SELECT
)
2413 lvItem
.state
|= LVIS_SELECTED
;
2415 if (dwFlags
& SVSI_FOCUSED
)
2416 lvItem
.stateMask
|= LVIS_FOCUSED
;
2418 m_ListView
.SetItemState(iItem
, lvItem
.state
, lvItem
.stateMask
);
2420 if (dwFlags
& SVSI_EDIT
)
2421 m_ListView
.EditLabel(iItem
);
2426 HRESULT STDMETHODCALLTYPE
CDefView::SelectAndPositionItems(UINT cidl
, PCUITEMID_CHILD_ARRAY apidl
, POINT
*apt
, DWORD dwFlags
)
2431 /**********************************************************
2432 * IShellFolderView implementation
2434 HRESULT STDMETHODCALLTYPE
CDefView::Rearrange(LPARAM sort
)
2436 FIXME("(%p)->(%ld) stub\n", this, sort
);
2440 HRESULT STDMETHODCALLTYPE
CDefView::GetArrangeParam(LPARAM
*sort
)
2442 FIXME("(%p)->(%p) stub\n", this, sort
);
2446 HRESULT STDMETHODCALLTYPE
CDefView::ArrangeGrid()
2448 FIXME("(%p) stub\n", this);
2452 HRESULT STDMETHODCALLTYPE
CDefView::AutoArrange()
2454 FIXME("(%p) stub\n", this);
2458 HRESULT STDMETHODCALLTYPE
CDefView::AddObject(PITEMID_CHILD pidl
, UINT
*item
)
2460 FIXME("(%p)->(%p %p) stub\n", this, pidl
, item
);
2464 HRESULT STDMETHODCALLTYPE
CDefView::GetObject(PITEMID_CHILD
*pidl
, UINT item
)
2466 TRACE("(%p)->(%p %d)\n", this, pidl
, item
);
2467 return Item(item
, pidl
);
2470 HRESULT STDMETHODCALLTYPE
CDefView::RemoveObject(PITEMID_CHILD pidl
, UINT
*item
)
2473 TRACE("(%p)->(%p %p)\n", this, pidl
, item
);
2477 *item
= LV_FindItemByPidl(ILFindLastID(pidl
));
2478 m_ListView
.DeleteItem(*item
);
2483 m_ListView
.DeleteAllItems();
2489 HRESULT STDMETHODCALLTYPE
CDefView::GetObjectCount(UINT
*count
)
2491 TRACE("(%p)->(%p)\n", this, count
);
2492 *count
= m_ListView
.GetItemCount();
2496 HRESULT STDMETHODCALLTYPE
CDefView::SetObjectCount(UINT count
, UINT flags
)
2498 FIXME("(%p)->(%d %x) stub\n", this, count
, flags
);
2502 HRESULT STDMETHODCALLTYPE
CDefView::UpdateObject(PITEMID_CHILD pidl_old
, PITEMID_CHILD pidl_new
, UINT
*item
)
2504 FIXME("(%p)->(%p %p %p) stub\n", this, pidl_old
, pidl_new
, item
);
2508 HRESULT STDMETHODCALLTYPE
CDefView::RefreshObject(PITEMID_CHILD pidl
, UINT
*item
)
2510 FIXME("(%p)->(%p %p) stub\n", this, pidl
, item
);
2514 HRESULT STDMETHODCALLTYPE
CDefView::SetRedraw(BOOL redraw
)
2516 TRACE("(%p)->(%d)\n", this, redraw
);
2517 m_ListView
.SetRedraw(redraw
);
2521 HRESULT STDMETHODCALLTYPE
CDefView::GetSelectedCount(UINT
*count
)
2523 FIXME("(%p)->(%p) stub\n", this, count
);
2527 HRESULT STDMETHODCALLTYPE
CDefView::GetSelectedObjects(PCUITEMID_CHILD
**pidl
, UINT
*items
)
2529 TRACE("(%p)->(%p %p)\n", this, pidl
, items
);
2531 *items
= GetSelections();
2535 *pidl
= static_cast<PCUITEMID_CHILD
*>(LocalAlloc(0, *items
* sizeof(PCUITEMID_CHILD
)));
2538 return E_OUTOFMEMORY
;
2541 /* it's documented that caller shouldn't PIDLs, only array itself */
2542 memcpy(*pidl
, m_apidl
, *items
* sizeof(PCUITEMID_CHILD
));
2548 HRESULT STDMETHODCALLTYPE
CDefView::IsDropOnSource(IDropTarget
*drop_target
)
2550 FIXME("(%p)->(%p) stub\n", this, drop_target
);
2554 HRESULT STDMETHODCALLTYPE
CDefView::GetDragPoint(POINT
*pt
)
2556 FIXME("(%p)->(%p) stub\n", this, pt
);
2560 HRESULT STDMETHODCALLTYPE
CDefView::GetDropPoint(POINT
*pt
)
2562 FIXME("(%p)->(%p) stub\n", this, pt
);
2566 HRESULT STDMETHODCALLTYPE
CDefView::MoveIcons(IDataObject
*obj
)
2568 TRACE("(%p)->(%p)\n", this, obj
);
2572 HRESULT STDMETHODCALLTYPE
CDefView::SetItemPos(PCUITEMID_CHILD pidl
, POINT
*pt
)
2574 FIXME("(%p)->(%p %p) stub\n", this, pidl
, pt
);
2578 HRESULT STDMETHODCALLTYPE
CDefView::IsBkDropTarget(IDropTarget
*drop_target
)
2580 FIXME("(%p)->(%p) stub\n", this, drop_target
);
2584 HRESULT STDMETHODCALLTYPE
CDefView::SetClipboard(BOOL move
)
2586 FIXME("(%p)->(%d) stub\n", this, move
);
2590 HRESULT STDMETHODCALLTYPE
CDefView::SetPoints(IDataObject
*obj
)
2592 FIXME("(%p)->(%p) stub\n", this, obj
);
2596 HRESULT STDMETHODCALLTYPE
CDefView::GetItemSpacing(ITEMSPACING
*spacing
)
2598 FIXME("(%p)->(%p) stub\n", this, spacing
);
2602 HRESULT STDMETHODCALLTYPE
CDefView::SetCallback(IShellFolderViewCB
*new_cb
, IShellFolderViewCB
**old_cb
)
2604 FIXME("(%p)->(%p %p) stub\n", this, new_cb
, old_cb
);
2608 HRESULT STDMETHODCALLTYPE
CDefView::Select(UINT flags
)
2610 FIXME("(%p)->(%d) stub\n", this, flags
);
2614 HRESULT STDMETHODCALLTYPE
CDefView::QuerySupport(UINT
*support
)
2616 TRACE("(%p)->(%p)\n", this, support
);
2620 HRESULT STDMETHODCALLTYPE
CDefView::SetAutomationObject(IDispatch
*disp
)
2622 FIXME("(%p)->(%p) stub\n", this, disp
);
2626 /**********************************************************
2627 * ISVOleCmdTarget_QueryStatus (IOleCommandTarget)
2629 HRESULT WINAPI
CDefView::QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
, OLECMD
*prgCmds
, OLECMDTEXT
*pCmdText
)
2631 FIXME("(%p)->(%p(%s) 0x%08x %p %p\n",
2632 this, pguidCmdGroup
, debugstr_guid(pguidCmdGroup
), cCmds
, prgCmds
, pCmdText
);
2635 return E_INVALIDARG
;
2637 for (UINT i
= 0; i
< cCmds
; i
++)
2639 FIXME("\tprgCmds[%d].cmdID = %d\n", i
, prgCmds
[i
].cmdID
);
2640 prgCmds
[i
].cmdf
= 0;
2643 return OLECMDERR_E_UNKNOWNGROUP
;
2646 /**********************************************************
2647 * ISVOleCmdTarget_Exec (IOleCommandTarget)
2649 * nCmdID is the OLECMDID_* enumeration
2651 HRESULT WINAPI
CDefView::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
2653 FIXME("(%p)->(\n\tTarget GUID:%s Command:0x%08x Opt:0x%08x %p %p)\n",
2654 this, debugstr_guid(pguidCmdGroup
), nCmdID
, nCmdexecopt
, pvaIn
, pvaOut
);
2657 return OLECMDERR_E_UNKNOWNGROUP
;
2659 if (IsEqualCLSID(*pguidCmdGroup
, m_Category
))
2661 if (nCmdID
== FCIDM_SHVIEW_AUTOARRANGE
)
2663 if (V_VT(pvaIn
) != VT_INT_PTR
)
2664 return OLECMDERR_E_NOTSUPPORTED
;
2668 params
.cbSize
= sizeof(params
);
2669 params
.rcExclude
= *(RECT
*) V_INTREF(pvaIn
);
2671 HMENU hView
= m_hView
;
2673 hView
= CreatePopupMenu();
2674 AppendMenuW(hView
, MF_STRING
, FCIDM_SHVIEW_BIGICON
, L
"Big!");
2675 AppendMenuW(hView
, MF_STRING
, FCIDM_SHVIEW_SMALLICON
, L
"Small!");
2676 AppendMenuW(hView
, MF_STRING
, FCIDM_SHVIEW_LISTVIEW
, L
"List!");
2677 AppendMenuW(hView
, MF_STRING
, FCIDM_SHVIEW_REPORTVIEW
, L
"Report!");
2682 PrepareShowViewMenu(hView
);
2684 TrackPopupMenuEx(hView
, TPM_LEFTALIGN
| TPM_TOPALIGN
, params
.rcExclude
.left
, params
.rcExclude
.bottom
, m_hWndParent
, ¶ms
);
2687 // pvaOut is VT_I4 with value 0x403 (cmd id of the new mode maybe?)
2688 V_VT(pvaOut
) = VT_I4
;
2689 V_I4(pvaOut
) = 0x403;
2693 if (IsEqualIID(*pguidCmdGroup
, CGID_Explorer
) &&
2695 (nCmdexecopt
== 4) && pvaOut
)
2698 if (IsEqualIID(*pguidCmdGroup
, CGID_ShellDocView
) &&
2703 return OLECMDERR_E_UNKNOWNGROUP
;
2706 /**********************************************************
2707 * ISVDropTarget implementation
2710 /******************************************************************************
2711 * drag_notify_subitem [Internal]
2713 * Figure out the shellfolder object, which is currently under the mouse cursor
2714 * and notify it via the IDropTarget interface.
2717 #define SCROLLAREAWIDTH 20
2719 HRESULT
CDefView::drag_notify_subitem(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2721 LVHITTESTINFO htinfo
;
2726 /* Map from global to client coordinates and query the index of the listview-item, which is
2727 * currently under the mouse cursor. */
2730 htinfo
.flags
= LVHT_ONITEM
;
2731 ::ScreenToClient(m_ListView
, &htinfo
.pt
);
2732 lResult
= m_ListView
.HitTest(&htinfo
);
2734 /* Send WM_*SCROLL messages every 250 ms during drag-scrolling */
2735 ::GetClientRect(m_ListView
, &clientRect
);
2736 if (htinfo
.pt
.x
== m_ptLastMousePos
.x
&& htinfo
.pt
.y
== m_ptLastMousePos
.y
&&
2737 (htinfo
.pt
.x
< SCROLLAREAWIDTH
|| htinfo
.pt
.x
> clientRect
.right
- SCROLLAREAWIDTH
||
2738 htinfo
.pt
.y
< SCROLLAREAWIDTH
|| htinfo
.pt
.y
> clientRect
.bottom
- SCROLLAREAWIDTH
))
2740 m_cScrollDelay
= (m_cScrollDelay
+ 1) % 5; /* DragOver is called every 50 ms */
2741 if (m_cScrollDelay
== 0)
2743 /* Mouse did hover another 250 ms over the scroll-area */
2744 if (htinfo
.pt
.x
< SCROLLAREAWIDTH
)
2745 m_ListView
.SendMessageW(WM_HSCROLL
, SB_LINEUP
, 0);
2747 if (htinfo
.pt
.x
> clientRect
.right
- SCROLLAREAWIDTH
)
2748 m_ListView
.SendMessageW(WM_HSCROLL
, SB_LINEDOWN
, 0);
2750 if (htinfo
.pt
.y
< SCROLLAREAWIDTH
)
2751 m_ListView
.SendMessageW(WM_VSCROLL
, SB_LINEUP
, 0);
2753 if (htinfo
.pt
.y
> clientRect
.bottom
- SCROLLAREAWIDTH
)
2754 m_ListView
.SendMessageW(WM_VSCROLL
, SB_LINEDOWN
, 0);
2759 m_cScrollDelay
= 0; /* Reset, if the cursor is not over the listview's scroll-area */
2762 m_ptLastMousePos
= htinfo
.pt
;
2764 /* If we are still over the previous sub-item, notify it via DragOver and return. */
2765 if (m_pCurDropTarget
&& lResult
== m_iDragOverItem
)
2766 return m_pCurDropTarget
->DragOver(grfKeyState
, pt
, pdwEffect
);
2768 /* We've left the previous sub-item, notify it via DragLeave and Release it. */
2769 if (m_pCurDropTarget
)
2771 m_pCurDropTarget
->DragLeave();
2772 m_pCurDropTarget
.Release();
2775 m_iDragOverItem
= lResult
;
2778 /* We are not above one of the listview's subitems. Bind to the parent folder's
2779 * DropTarget interface. */
2780 hr
= m_pSFParent
->QueryInterface(IID_PPV_ARG(IDropTarget
,&m_pCurDropTarget
));
2784 /* Query the relative PIDL of the shellfolder object represented by the currently
2785 * dragged over listview-item ... */
2786 PCUITEMID_CHILD pidl
= _PidlByItem(lResult
);
2788 /* ... and bind m_pCurDropTarget to the IDropTarget interface of an UIObject of this object */
2789 hr
= m_pSFParent
->GetUIObjectOf(m_ListView
, 1, &pidl
, IID_NULL_PPV_ARG(IDropTarget
, &m_pCurDropTarget
));
2792 /* If anything failed, m_pCurDropTarget should be NULL now, which ought to be a save state. */
2796 /* Notify the item just entered via DragEnter. */
2797 return m_pCurDropTarget
->DragEnter(m_pCurDataObject
, grfKeyState
, pt
, pdwEffect
);
2800 HRESULT WINAPI
CDefView::DragEnter(IDataObject
*pDataObject
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2802 /* Get a hold on the data object for later calls to DragEnter on the sub-folders */
2803 m_pCurDataObject
= pDataObject
;
2804 pDataObject
->AddRef();
2806 return drag_notify_subitem(grfKeyState
, pt
, pdwEffect
);
2809 HRESULT WINAPI
CDefView::DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2811 return drag_notify_subitem(grfKeyState
, pt
, pdwEffect
);
2814 HRESULT WINAPI
CDefView::DragLeave()
2816 if (m_pCurDropTarget
)
2818 m_pCurDropTarget
->DragLeave();
2819 m_pCurDropTarget
.Release();
2822 if (m_pCurDataObject
!= NULL
)
2824 m_pCurDataObject
.Release();
2827 m_iDragOverItem
= 0;
2832 HRESULT WINAPI
CDefView::Drop(IDataObject
* pDataObject
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2834 if (m_pCurDropTarget
)
2836 m_pCurDropTarget
->Drop(pDataObject
, grfKeyState
, pt
, pdwEffect
);
2837 m_pCurDropTarget
.Release();
2840 m_pCurDataObject
.Release();
2841 m_iDragOverItem
= 0;
2845 /**********************************************************
2846 * ISVDropSource implementation
2849 HRESULT WINAPI
CDefView::QueryContinueDrag(BOOL fEscapePressed
, DWORD grfKeyState
)
2851 TRACE("(%p)\n", this);
2854 return DRAGDROP_S_CANCEL
;
2855 else if (!(grfKeyState
& MK_LBUTTON
) && !(grfKeyState
& MK_RBUTTON
))
2856 return DRAGDROP_S_DROP
;
2861 HRESULT WINAPI
CDefView::GiveFeedback(DWORD dwEffect
)
2863 TRACE("(%p)\n", this);
2865 return DRAGDROP_S_USEDEFAULTCURSORS
;
2868 /**********************************************************
2869 * ISVViewObject implementation
2872 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
)
2874 FIXME("Stub: this=%p\n", this);
2879 HRESULT WINAPI
CDefView::GetColorSet(DWORD dwDrawAspect
, LONG lindex
, void *pvAspect
, DVTARGETDEVICE
*ptd
, HDC hicTargetDevice
, LOGPALETTE
**ppColorSet
)
2881 FIXME("Stub: this=%p\n", this);
2886 HRESULT WINAPI
CDefView::Freeze(DWORD dwDrawAspect
, LONG lindex
, void *pvAspect
, DWORD
*pdwFreeze
)
2888 FIXME("Stub: this=%p\n", this);
2893 HRESULT WINAPI
CDefView::Unfreeze(DWORD dwFreeze
)
2895 FIXME("Stub: this=%p\n", this);
2900 HRESULT WINAPI
CDefView::SetAdvise(DWORD aspects
, DWORD advf
, IAdviseSink
*pAdvSink
)
2902 FIXME("partial stub: %p %08x %08x %p\n", this, aspects
, advf
, pAdvSink
);
2904 /* FIXME: we set the AdviseSink, but never use it to send any advice */
2905 m_pAdvSink
= pAdvSink
;
2906 m_dwAspects
= aspects
;
2912 HRESULT WINAPI
CDefView::GetAdvise(DWORD
*pAspects
, DWORD
*pAdvf
, IAdviseSink
**ppAdvSink
)
2914 TRACE("this=%p pAspects=%p pAdvf=%p ppAdvSink=%p\n", this, pAspects
, pAdvf
, ppAdvSink
);
2918 *ppAdvSink
= m_pAdvSink
;
2919 m_pAdvSink
.p
->AddRef();
2923 *pAspects
= m_dwAspects
;
2931 HRESULT STDMETHODCALLTYPE
CDefView::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
2933 if (IsEqualIID(guidService
, SID_IShellBrowser
))
2934 return m_pShellBrowser
->QueryInterface(riid
, ppvObject
);
2935 else if(IsEqualIID(guidService
, SID_IFolderView
))
2936 return QueryInterface(riid
, ppvObject
);
2938 return E_NOINTERFACE
;
2941 HRESULT
CDefView::_MergeToolbar()
2943 CComPtr
<IExplorerToolbar
> ptb
; // [sp+8h] [bp-4h]@1
2947 hr
= IUnknown_QueryService(m_pShellBrowser
, IID_IExplorerToolbar
, IID_PPV_ARG(IExplorerToolbar
, &ptb
));
2951 m_Category
= CGID_DefViewFrame
;
2953 hr
= ptb
->SetCommandTarget(static_cast<IOleCommandTarget
*>(this), &m_Category
, 0);
2961 hr
= ptb
->AddButtons(&m_Category
, buttonsCount
, buttons
);
2968 /**********************************************************
2969 * IShellView_Constructor
2971 HRESULT WINAPI
IShellView_Constructor(IShellFolder
*pFolder
, IShellView
**newView
)
2973 return ShellObjectCreatorInit
<CDefView
>(pFolder
, IID_IShellView
, newView
);