4 * Copyright 1998,1999 <juergen.schmied@debitel.net>
6 * This is the view visualizing the data provided by the shellfolder.
7 * No direct access to data from pidls should be done from here.
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with this library; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
23 * FIXME: The order by part of the background context menu should be
24 * built according to the columns shown.
26 * FIXME: CheckToolbar: handle the "new folder" and "folder up" button
28 * FIXME: ShellView_FillList: consider sort orders
33 1. Load/Save the view state from/into the stream provided by the ShellBrowser.
34 2. Let the shell folder sort items.
35 3. Code to merge menus in the shellbrowser is incorrect.
36 4. Move the background context menu creation into shell view. It should store the
37 shell view HWND to send commands.
38 5. Send init, measure, and draw messages to context menu during tracking.
39 6. Shell view should do SetCommandTarget on internet toolbar.
40 7. When editing starts on item, set edit text to for editing value.
41 8. When shell view is called back for item info, let listview save the value.
42 9. Shell view should update status bar.
43 10. Fix shell view to handle view mode popup exec.
44 11. The background context menu should have a pidl just like foreground menus. This
45 causes crashes when dynamic handlers try to use the NULL pidl.
46 12. The SHELLDLL_DefView should not be filled with blue unconditionally. This causes
47 annoying flashing of blue even on XP, and is not correct.
48 13. Reorder of columns doesn't work - might be bug in comctl32
55 WINE_DEFAULT_DEBUG_CHANNEL(shell
);
59 static const WCHAR SV_CLASS_NAME
[] = {'S', 'H', 'E', 'L', 'L', 'D', 'L', 'L', '_', 'D', 'e', 'f', 'V', 'i', 'e', 'w', 0};
65 } LISTVIEW_SORT_INFO
, *LPLISTVIEW_SORT_INFO
;
67 #define SHV_CHANGE_NOTIFY WM_USER + 0x1111
70 public CWindowImpl
<CDefView
, CWindow
, CControlWinTraits
>,
71 public CComObjectRootEx
<CComMultiThreadModelNoCS
>,
74 public IShellFolderView
,
75 public IOleCommandTarget
,
79 public IServiceProvider
82 CComPtr
<IShellFolder
> m_pSFParent
;
83 CComPtr
<IShellFolder2
> m_pSF2Parent
;
84 CComPtr
<IShellBrowser
> m_pShellBrowser
;
85 CComPtr
<ICommDlgBrowser
> m_pCommDlgBrowser
;
86 HWND m_hWndList
; /* ListView control */
88 FOLDERSETTINGS m_FolderSettings
;
92 LPITEMIDLIST
*m_apidl
;
93 LISTVIEW_SORT_INFO m_sortInfo
;
94 ULONG m_hNotify
; /* change notification handle */
98 CComPtr
<IAdviseSink
> m_pAdvSink
;
100 CComPtr
<IDropTarget
> m_pCurDropTarget
; /* The sub-item, which is currently dragged over */
101 CComPtr
<IDataObject
> m_pCurDataObject
; /* The dragged data-object */
102 LONG m_iDragOverItem
; /* Dragged over item's index, iff m_pCurDropTarget != NULL */
103 UINT m_cScrollDelay
; /* Send a WM_*SCROLL msg every 250 ms during drag-scroll */
104 POINT m_ptLastMousePos
; /* Mouse position at last DragOver call */
106 CComPtr
<IContextMenu
> m_pCM
;
110 HRESULT WINAPI
Initialize(IShellFolder
*shellFolder
);
111 HRESULT
IncludeObject(LPCITEMIDLIST pidl
);
112 HRESULT
OnDefaultCommand();
113 HRESULT
OnStateChange(UINT uFlags
);
115 void SetStyle(DWORD dwAdd
, DWORD dwRemove
);
117 void UpdateListColors();
119 static INT CALLBACK
CompareItems(LPVOID lParam1
, LPVOID lParam2
, LPARAM lpData
);
120 static INT CALLBACK
ListViewCompareItems(LPVOID lParam1
, LPVOID lParam2
, LPARAM lpData
);
121 int LV_FindItemByPidl(LPCITEMIDLIST pidl
);
122 BOOLEAN
LV_AddItem(LPCITEMIDLIST pidl
);
123 BOOLEAN
LV_DeleteItem(LPCITEMIDLIST pidl
);
124 BOOLEAN
LV_RenameItem(LPCITEMIDLIST pidlOld
, LPCITEMIDLIST pidlNew
);
125 static INT CALLBACK
fill_list(LPVOID ptr
, LPVOID arg
);
127 HMENU
BuildFileMenu();
128 void MergeFileMenu(HMENU hSubMenu
);
129 void MergeViewMenu(HMENU hSubMenu
);
130 UINT
GetSelections();
131 HRESULT
OpenSelectedItems();
133 void DoActivate(UINT uState
);
134 HRESULT
drag_notify_subitem(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
135 LRESULT
OnExplorerCommand(UINT uCommand
, BOOL bUseSelection
);
137 // *** IOleWindow methods ***
138 virtual HRESULT STDMETHODCALLTYPE
GetWindow(HWND
*lphwnd
);
139 virtual HRESULT STDMETHODCALLTYPE
ContextSensitiveHelp(BOOL fEnterMode
);
141 // *** IShellView methods ***
142 virtual HRESULT STDMETHODCALLTYPE
TranslateAccelerator(MSG
*pmsg
);
143 virtual HRESULT STDMETHODCALLTYPE
EnableModeless(BOOL fEnable
);
144 virtual HRESULT STDMETHODCALLTYPE
UIActivate(UINT uState
);
145 virtual HRESULT STDMETHODCALLTYPE
Refresh();
146 virtual HRESULT STDMETHODCALLTYPE
CreateViewWindow(IShellView
*psvPrevious
, LPCFOLDERSETTINGS pfs
, IShellBrowser
*psb
, RECT
*prcView
, HWND
*phWnd
);
147 virtual HRESULT STDMETHODCALLTYPE
DestroyViewWindow();
148 virtual HRESULT STDMETHODCALLTYPE
GetCurrentInfo(LPFOLDERSETTINGS pfs
);
149 virtual HRESULT STDMETHODCALLTYPE
AddPropertySheetPages(DWORD dwReserved
, LPFNSVADDPROPSHEETPAGE pfn
, LPARAM lparam
);
150 virtual HRESULT STDMETHODCALLTYPE
SaveViewState();
151 virtual HRESULT STDMETHODCALLTYPE
SelectItem(LPCITEMIDLIST pidlItem
, SVSIF uFlags
);
152 virtual HRESULT STDMETHODCALLTYPE
GetItemObject(UINT uItem
, REFIID riid
, void **ppv
);
154 // *** IFolderView methods ***
155 virtual HRESULT STDMETHODCALLTYPE
GetCurrentViewMode(UINT
*pViewMode
);
156 virtual HRESULT STDMETHODCALLTYPE
SetCurrentViewMode(UINT ViewMode
);
157 virtual HRESULT STDMETHODCALLTYPE
GetFolder(REFIID riid
, void **ppv
);
158 virtual HRESULT STDMETHODCALLTYPE
Item(int iItemIndex
, LPITEMIDLIST
*ppidl
);
159 virtual HRESULT STDMETHODCALLTYPE
ItemCount(UINT uFlags
, int *pcItems
);
160 virtual HRESULT STDMETHODCALLTYPE
Items(UINT uFlags
, REFIID riid
, void **ppv
);
161 virtual HRESULT STDMETHODCALLTYPE
GetSelectionMarkedItem(int *piItem
);
162 virtual HRESULT STDMETHODCALLTYPE
GetFocusedItem(int *piItem
);
163 virtual HRESULT STDMETHODCALLTYPE
GetItemPosition(LPCITEMIDLIST pidl
, POINT
*ppt
);
164 virtual HRESULT STDMETHODCALLTYPE
GetSpacing(POINT
*ppt
);
165 virtual HRESULT STDMETHODCALLTYPE
GetDefaultSpacing(POINT
*ppt
);
166 virtual HRESULT STDMETHODCALLTYPE
GetAutoArrange();
167 virtual HRESULT STDMETHODCALLTYPE
SelectItem(int iItem
, DWORD dwFlags
);
168 virtual HRESULT STDMETHODCALLTYPE
SelectAndPositionItems(UINT cidl
, LPCITEMIDLIST
*apidl
, POINT
*apt
, DWORD dwFlags
);
170 // *** IShellFolderView methods ***
171 virtual HRESULT STDMETHODCALLTYPE
Rearrange(LPARAM sort
);
172 virtual HRESULT STDMETHODCALLTYPE
GetArrangeParam(LPARAM
*sort
);
173 virtual HRESULT STDMETHODCALLTYPE
ArrangeGrid();
174 virtual HRESULT STDMETHODCALLTYPE
AutoArrange();
175 virtual HRESULT STDMETHODCALLTYPE
IShellFolderView_GetAutoArrange();
176 virtual HRESULT STDMETHODCALLTYPE
AddObject(PITEMID_CHILD pidl
, UINT
*item
);
177 virtual HRESULT STDMETHODCALLTYPE
GetObject(PITEMID_CHILD
*pidl
, UINT item
);
178 virtual HRESULT STDMETHODCALLTYPE
RemoveObject(PITEMID_CHILD pidl
, UINT
*item
);
179 virtual HRESULT STDMETHODCALLTYPE
GetObjectCount(UINT
*count
);
180 virtual HRESULT STDMETHODCALLTYPE
SetObjectCount(UINT count
, UINT flags
);
181 virtual HRESULT STDMETHODCALLTYPE
UpdateObject(PITEMID_CHILD pidl_old
, PITEMID_CHILD pidl_new
, UINT
*item
);
182 virtual HRESULT STDMETHODCALLTYPE
RefreshObject(PITEMID_CHILD pidl
, UINT
*item
);
183 virtual HRESULT STDMETHODCALLTYPE
SetRedraw(BOOL redraw
);
184 virtual HRESULT STDMETHODCALLTYPE
GetSelectedCount(UINT
*count
);
185 virtual HRESULT STDMETHODCALLTYPE
GetSelectedObjects(PCUITEMID_CHILD
**pidl
, UINT
*items
);
186 virtual HRESULT STDMETHODCALLTYPE
IsDropOnSource(IDropTarget
*drop_target
);
187 virtual HRESULT STDMETHODCALLTYPE
GetDragPoint(POINT
*pt
);
188 virtual HRESULT STDMETHODCALLTYPE
GetDropPoint(POINT
*pt
);
189 virtual HRESULT STDMETHODCALLTYPE
MoveIcons(IDataObject
*obj
);
190 virtual HRESULT STDMETHODCALLTYPE
SetItemPos(PCUITEMID_CHILD pidl
, POINT
*pt
);
191 virtual HRESULT STDMETHODCALLTYPE
IsBkDropTarget(IDropTarget
*drop_target
);
192 virtual HRESULT STDMETHODCALLTYPE
SetClipboard(BOOL move
);
193 virtual HRESULT STDMETHODCALLTYPE
SetPoints(IDataObject
*obj
);
194 virtual HRESULT STDMETHODCALLTYPE
GetItemSpacing(ITEMSPACING
*spacing
);
195 virtual HRESULT STDMETHODCALLTYPE
SetCallback(IShellFolderViewCB
*new_cb
, IShellFolderViewCB
**old_cb
);
196 virtual HRESULT STDMETHODCALLTYPE
Select(UINT flags
);
197 virtual HRESULT STDMETHODCALLTYPE
QuerySupport(UINT
*support
);
198 virtual HRESULT STDMETHODCALLTYPE
SetAutomationObject(IDispatch
*disp
);
200 // *** IOleCommandTarget methods ***
201 virtual HRESULT STDMETHODCALLTYPE
QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
, OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
);
202 virtual HRESULT STDMETHODCALLTYPE
Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
);
204 // *** IDropTarget methods ***
205 virtual HRESULT STDMETHODCALLTYPE
DragEnter(IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
206 virtual HRESULT STDMETHODCALLTYPE
DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
207 virtual HRESULT STDMETHODCALLTYPE
DragLeave();
208 virtual HRESULT STDMETHODCALLTYPE
Drop(IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
210 // *** IDropSource methods ***
211 virtual HRESULT STDMETHODCALLTYPE
QueryContinueDrag(BOOL fEscapePressed
, DWORD grfKeyState
);
212 virtual HRESULT STDMETHODCALLTYPE
GiveFeedback(DWORD dwEffect
);
214 // *** IViewObject methods ***
215 virtual HRESULT STDMETHODCALLTYPE
Draw(DWORD dwDrawAspect
, LONG lindex
, void *pvAspect
, DVTARGETDEVICE
*ptd
,
216 HDC hdcTargetDev
, HDC hdcDraw
, LPCRECTL lprcBounds
, LPCRECTL lprcWBounds
,
217 BOOL ( STDMETHODCALLTYPE
*pfnContinue
)(ULONG_PTR dwContinue
), ULONG_PTR dwContinue
);
218 virtual HRESULT STDMETHODCALLTYPE
GetColorSet(DWORD dwDrawAspect
, LONG lindex
, void *pvAspect
,
219 DVTARGETDEVICE
*ptd
, HDC hicTargetDev
, LOGPALETTE
**ppColorSet
);
220 virtual HRESULT STDMETHODCALLTYPE
Freeze(DWORD dwDrawAspect
, LONG lindex
, void *pvAspect
, DWORD
*pdwFreeze
);
221 virtual HRESULT STDMETHODCALLTYPE
Unfreeze(DWORD dwFreeze
);
222 virtual HRESULT STDMETHODCALLTYPE
SetAdvise(DWORD aspects
, DWORD advf
, IAdviseSink
*pAdvSink
);
223 virtual HRESULT STDMETHODCALLTYPE
GetAdvise(DWORD
*pAspects
, DWORD
*pAdvf
, IAdviseSink
**ppAdvSink
);
225 // *** IServiceProvider methods ***
226 virtual HRESULT STDMETHODCALLTYPE
QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
);
229 LRESULT
OnShowWindow(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
230 LRESULT
OnGetDlgCode(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
231 LRESULT
OnDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
232 LRESULT
OnEraseBackground(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
233 LRESULT
OnSysColorChange(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
234 LRESULT
OnGetShellBrowser(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
235 LRESULT
OnCreate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
236 LRESULT
OnContextMenu(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
237 LRESULT
OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
238 LRESULT
OnActivate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
239 LRESULT
OnSetFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
240 LRESULT
OnKillFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
241 LRESULT
OnCommand(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
242 LRESULT
OnNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
243 LRESULT
OnChangeNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
244 LRESULT
OnCustomItem(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
245 LRESULT
OnSettingChange(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
246 LRESULT
OnInitMenuPopup(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
248 static ATL::CWndClassInfo
& GetWndClassInfo()
250 static ATL::CWndClassInfo wc
=
252 { sizeof(WNDCLASSEX
), 0, StartWindowProc
,
254 LoadCursor(NULL
, IDC_ARROW
), (HBRUSH
)(COLOR_BACKGROUND
+ 1), NULL
, SV_CLASS_NAME
, NULL
256 NULL
, NULL
, IDC_ARROW
, TRUE
, 0, _T("")
261 virtual WNDPROC
GetWindowProc()
266 static LRESULT CALLBACK
WindowProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
271 // must hold a reference during message handling
272 pThis
= reinterpret_cast<CDefView
*>(hWnd
);
274 result
= CWindowImpl
<CDefView
, CWindow
, CControlWinTraits
>::WindowProc(hWnd
, uMsg
, wParam
, lParam
);
279 BEGIN_MSG_MAP(CDefView
)
280 MESSAGE_HANDLER(WM_SIZE
, OnSize
)
281 MESSAGE_HANDLER(WM_SETFOCUS
, OnSetFocus
)
282 MESSAGE_HANDLER(WM_KILLFOCUS
, OnKillFocus
)
283 MESSAGE_HANDLER(WM_CREATE
, OnCreate
)
284 MESSAGE_HANDLER(WM_ACTIVATE
, OnActivate
)
285 MESSAGE_HANDLER(WM_NOTIFY
, OnNotify
)
286 MESSAGE_HANDLER(WM_COMMAND
, OnCommand
)
287 MESSAGE_HANDLER(SHV_CHANGE_NOTIFY
, OnChangeNotify
)
288 MESSAGE_HANDLER(WM_CONTEXTMENU
, OnContextMenu
)
289 MESSAGE_HANDLER(WM_DRAWITEM
, OnCustomItem
)
290 MESSAGE_HANDLER(WM_MEASUREITEM
, OnCustomItem
)
291 MESSAGE_HANDLER(WM_SHOWWINDOW
, OnShowWindow
)
292 MESSAGE_HANDLER(WM_GETDLGCODE
, OnGetDlgCode
)
293 MESSAGE_HANDLER(WM_DESTROY
, OnDestroy
)
294 MESSAGE_HANDLER(WM_ERASEBKGND
, OnEraseBackground
)
295 MESSAGE_HANDLER(WM_SYSCOLORCHANGE
, OnSysColorChange
)
296 MESSAGE_HANDLER(CWM_GETISHELLBROWSER
, OnGetShellBrowser
)
297 MESSAGE_HANDLER(WM_SETTINGCHANGE
, OnSettingChange
)
298 MESSAGE_HANDLER(WM_INITMENUPOPUP
, OnInitMenuPopup
)
301 BEGIN_COM_MAP(CDefView
)
302 COM_INTERFACE_ENTRY_IID(IID_IOleWindow
, IOleWindow
)
303 COM_INTERFACE_ENTRY_IID(IID_IShellView
, IShellView
)
304 COM_INTERFACE_ENTRY_IID(IID_IFolderView
, IFolderView
)
305 COM_INTERFACE_ENTRY_IID(IID_IShellFolderView
, IShellFolderView
)
306 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget
, IOleCommandTarget
)
307 COM_INTERFACE_ENTRY_IID(IID_IDropTarget
, IDropTarget
)
308 COM_INTERFACE_ENTRY_IID(IID_IDropSource
, IDropSource
)
309 COM_INTERFACE_ENTRY_IID(IID_IViewObject
, IViewObject
)
310 COM_INTERFACE_ENTRY_IID(IID_IServiceProvider
, IServiceProvider
)
314 /* ListView Header ID's */
315 #define LISTVIEW_COLUMN_NAME 0
316 #define LISTVIEW_COLUMN_SIZE 1
317 #define LISTVIEW_COLUMN_TYPE 2
318 #define LISTVIEW_COLUMN_TIME 3
319 #define LISTVIEW_COLUMN_ATTRIB 4
322 #define IDM_VIEW_FILES (FCIDM_SHVIEWFIRST + 0x500)
323 #define IDM_VIEW_IDW (FCIDM_SHVIEWFIRST + 0x501)
324 #define IDM_MYFILEITEM (FCIDM_SHVIEWFIRST + 0x502)
326 #define ID_LISTVIEW 1
329 #define GET_WM_COMMAND_ID(wp, lp) LOWORD(wp)
330 #define GET_WM_COMMAND_HWND(wp, lp) (HWND)(lp)
331 #define GET_WM_COMMAND_CMD(wp, lp) HIWORD(wp)
334 Items merged into the toolbar and the filemenu
343 } MYTOOLINFO
, *LPMYTOOLINFO
;
345 static const MYTOOLINFO Tools
[] =
347 { FCIDM_SHVIEW_BIGICON
, 0, 0, IDS_VIEW_LARGE
, TBSTATE_ENABLED
, BTNS_BUTTON
},
348 { FCIDM_SHVIEW_SMALLICON
, 0, 0, IDS_VIEW_SMALL
, TBSTATE_ENABLED
, BTNS_BUTTON
},
349 { FCIDM_SHVIEW_LISTVIEW
, 0, 0, IDS_VIEW_LIST
, TBSTATE_ENABLED
, BTNS_BUTTON
},
350 { FCIDM_SHVIEW_REPORTVIEW
, 0, 0, IDS_VIEW_DETAILS
, TBSTATE_ENABLED
, BTNS_BUTTON
},
354 typedef void (CALLBACK
*PFNSHGETSETTINGSPROC
)(LPSHELLFLAGSTATE lpsfs
, DWORD dwMask
);
360 m_FolderSettings
.fFlags
= 0;
361 m_FolderSettings
.ViewMode
= 0;
366 m_sortInfo
.bIsAscending
= FALSE
;
367 m_sortInfo
.nHeaderID
= 0;
368 m_sortInfo
.nLastHeaderID
= 0;
375 m_ptLastMousePos
.x
= 0;
376 m_ptLastMousePos
.y
= 0;
379 CDefView::~CDefView()
381 TRACE(" destroying IShellView(%p)\n", this);
386 HRESULT WINAPI
CDefView::Initialize(IShellFolder
*shellFolder
)
388 m_pSFParent
= shellFolder
;
389 shellFolder
->QueryInterface(IID_PPV_ARG(IShellFolder2
, &m_pSF2Parent
));
394 /**********************************************************
396 * ##### helperfunctions for communication with ICommDlgBrowser #####
398 HRESULT
CDefView::IncludeObject(LPCITEMIDLIST pidl
)
402 if (m_pCommDlgBrowser
.p
!= NULL
)
404 TRACE("ICommDlgBrowser::IncludeObject pidl=%p\n", pidl
);
405 ret
= m_pCommDlgBrowser
->IncludeObject((IShellView
*)this, pidl
);
406 TRACE("--0x%08x\n", ret
);
412 HRESULT
CDefView::OnDefaultCommand()
414 HRESULT ret
= S_FALSE
;
416 if (m_pCommDlgBrowser
.p
!= NULL
)
418 TRACE("ICommDlgBrowser::OnDefaultCommand\n");
419 ret
= m_pCommDlgBrowser
->OnDefaultCommand((IShellView
*)this);
420 TRACE("-- returns %08x\n", ret
);
426 HRESULT
CDefView::OnStateChange(UINT uFlags
)
428 HRESULT ret
= S_FALSE
;
430 if (m_pCommDlgBrowser
.p
!= NULL
)
432 TRACE("ICommDlgBrowser::OnStateChange flags=%x\n", uFlags
);
433 ret
= m_pCommDlgBrowser
->OnStateChange((IShellView
*)this, uFlags
);
439 /**********************************************************
440 * set the toolbar of the filedialog buttons
442 * - activates the buttons from the shellbrowser according to
445 void CDefView::CheckToolbar()
451 if (m_pCommDlgBrowser
!= NULL
)
453 m_pShellBrowser
->SendControlMsg(FCW_TOOLBAR
, TB_CHECKBUTTON
,
454 FCIDM_TB_SMALLICON
, (m_FolderSettings
.ViewMode
== FVM_LIST
) ? TRUE
: FALSE
, &result
);
455 m_pShellBrowser
->SendControlMsg(FCW_TOOLBAR
, TB_CHECKBUTTON
,
456 FCIDM_TB_REPORTVIEW
, (m_FolderSettings
.ViewMode
== FVM_DETAILS
) ? TRUE
: FALSE
, &result
);
457 m_pShellBrowser
->SendControlMsg(FCW_TOOLBAR
, TB_ENABLEBUTTON
,
458 FCIDM_TB_SMALLICON
, TRUE
, &result
);
459 m_pShellBrowser
->SendControlMsg(FCW_TOOLBAR
, TB_ENABLEBUTTON
,
460 FCIDM_TB_REPORTVIEW
, TRUE
, &result
);
464 /**********************************************************
466 * ##### helperfunctions for initializing the view #####
468 /**********************************************************
469 * change the style of the listview control
471 void CDefView::SetStyle(DWORD dwAdd
, DWORD dwRemove
)
475 TRACE("(%p)\n", this);
477 tmpstyle
= ::GetWindowLongPtrW(m_hWndList
, GWL_STYLE
);
478 ::SetWindowLongPtrW(m_hWndList
, GWL_STYLE
, dwAdd
| (tmpstyle
& ~dwRemove
));
481 /**********************************************************
482 * ShellView_CreateList()
484 * - creates the list view window
486 BOOL
CDefView::CreateList()
487 { DWORD dwStyle
, dwExStyle
;
491 dwStyle
= WS_TABSTOP
| WS_VISIBLE
| WS_CHILDWINDOW
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
|
492 LVS_SHAREIMAGELISTS
| LVS_EDITLABELS
| LVS_AUTOARRANGE
;
493 dwExStyle
= WS_EX_CLIENTEDGE
;
495 if (m_FolderSettings
.fFlags
& FWF_DESKTOP
)
496 dwStyle
|= LVS_ALIGNLEFT
;
498 dwStyle
|= LVS_ALIGNTOP
;
500 switch (m_FolderSettings
.ViewMode
)
507 dwStyle
|= LVS_REPORT
;
511 dwStyle
|= LVS_SMALLICON
;
523 if (m_FolderSettings
.fFlags
& FWF_AUTOARRANGE
)
524 dwStyle
|= LVS_AUTOARRANGE
;
526 if (m_FolderSettings
.fFlags
& FWF_DESKTOP
)
527 m_FolderSettings
.fFlags
|= FWF_NOCLIENTEDGE
| FWF_NOSCROLL
;
529 if (m_FolderSettings
.fFlags
& FWF_SINGLESEL
)
530 dwStyle
|= LVS_SINGLESEL
;
532 if (m_FolderSettings
.fFlags
& FWF_NOCLIENTEDGE
)
533 dwExStyle
&= ~WS_EX_CLIENTEDGE
;
535 m_hWndList
= CreateWindowExW( dwExStyle
,
548 m_sortInfo
.bIsAscending
= TRUE
;
549 m_sortInfo
.nHeaderID
= -1;
550 m_sortInfo
.nLastHeaderID
= -1;
554 /* UpdateShellSettings(); */
558 void CDefView::UpdateListColors()
560 if (m_FolderSettings
.fFlags
& FWF_DESKTOP
)
562 /* Check if drop shadows option is enabled */
563 BOOL bDropShadow
= FALSE
;
564 DWORD cbDropShadow
= sizeof(bDropShadow
);
565 WCHAR wszBuf
[16] = L
"";
567 RegGetValueW(HKEY_CURRENT_USER
, L
"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced",
568 L
"ListviewShadow", RRF_RT_DWORD
, NULL
, &bDropShadow
, &cbDropShadow
);
569 if (bDropShadow
&& SystemParametersInfoW(SPI_GETDESKWALLPAPER
, _countof(wszBuf
), wszBuf
, 0) && wszBuf
[0])
571 SendMessageW(m_hWndList
, LVM_SETTEXTBKCOLOR
, 0, CLR_NONE
);
572 SendMessageW(m_hWndList
, LVM_SETBKCOLOR
, 0, CLR_NONE
);
573 SendMessageW(m_hWndList
, LVM_SETTEXTCOLOR
, 0, RGB(255, 255, 255));
574 SendMessageW(m_hWndList
, LVM_SETEXTENDEDLISTVIEWSTYLE
, LVS_EX_TRANSPARENTSHADOWTEXT
, LVS_EX_TRANSPARENTSHADOWTEXT
);
578 COLORREF crDesktop
= GetSysColor(COLOR_DESKTOP
);
579 SendMessageW(m_hWndList
, LVM_SETTEXTBKCOLOR
, 0, crDesktop
);
580 SendMessageW(m_hWndList
, LVM_SETBKCOLOR
, 0, crDesktop
);
581 if (GetRValue(crDesktop
) + GetGValue(crDesktop
) + GetBValue(crDesktop
) > 128 * 3)
582 SendMessageW(m_hWndList
, LVM_SETTEXTCOLOR
, 0, RGB(0, 0, 0));
584 SendMessageW(m_hWndList
, LVM_SETTEXTCOLOR
, 0, RGB(255, 255, 255));
585 SendMessageW(m_hWndList
, LVM_SETEXTENDEDLISTVIEWSTYLE
, LVS_EX_TRANSPARENTSHADOWTEXT
, 0);
590 /**********************************************************
591 * ShellView_InitList()
593 * - adds all needed columns to the shellview
595 BOOL
CDefView::InitList()
603 SendMessageW(m_hWndList
, LVM_DELETEALLITEMS
, 0, 0);
605 lvColumn
.mask
= LVCF_FMT
| LVCF_WIDTH
| LVCF_TEXT
;
606 lvColumn
.pszText
= szTemp
;
610 for (int i
= 0; 1; i
++)
612 if (FAILED(m_pSF2Parent
->GetDetailsOf(NULL
, i
, &sd
)))
615 lvColumn
.fmt
= sd
.fmt
;
616 lvColumn
.cx
= sd
.cxChar
* 8; /* chars->pixel */
617 StrRetToStrNW( szTemp
, 50, &sd
.str
, NULL
);
618 SendMessageW(m_hWndList
, LVM_INSERTCOLUMNW
, i
, (LPARAM
) &lvColumn
);
626 SendMessageW(m_hWndList
, LVM_SETIMAGELIST
, LVSIL_SMALL
, (LPARAM
)ShellSmallIconList
);
627 SendMessageW(m_hWndList
, LVM_SETIMAGELIST
, LVSIL_NORMAL
, (LPARAM
)ShellBigIconList
);
632 /**********************************************************
633 * ShellView_CompareItems()
636 * internal, CALLBACK for DSA_Sort
638 INT CALLBACK
CDefView::CompareItems(LPVOID lParam1
, LPVOID lParam2
, LPARAM lpData
)
641 TRACE("pidl1=%p pidl2=%p lpsf=%p\n", lParam1
, lParam2
, (LPVOID
) lpData
);
646 ret
= (SHORT
)SCODE_CODE(((IShellFolder
*)lpData
)->CompareIDs(0, (LPITEMIDLIST
)lParam1
, (LPITEMIDLIST
)lParam2
));
647 TRACE("ret=%i\n", ret
);
652 /*************************************************************************
653 * ShellView_ListViewCompareItems
655 * Compare Function for the Listview (FileOpen Dialog)
658 * lParam1 [I] the first ItemIdList to compare with
659 * lParam2 [I] the second ItemIdList to compare with
660 * lpData [I] The column ID for the header Ctrl to process
663 * A negative value if the first item should precede the second,
664 * a positive value if the first item should follow the second,
665 * or zero if the two items are equivalent
668 * FIXME: function does what ShellView_CompareItems is supposed to do.
669 * unify it and figure out how to use the undocumented first parameter
670 * of IShellFolder_CompareIDs to do the job this function does and
671 * move this code to IShellFolder.
672 * make LISTVIEW_SORT_INFO obsolete
673 * the way this function works is only usable if we had only
674 * filesystemfolders (25/10/99 jsch)
676 INT CALLBACK
CDefView::ListViewCompareItems(LPVOID lParam1
, LPVOID lParam2
, LPARAM lpData
)
680 char strName1
[MAX_PATH
], strName2
[MAX_PATH
];
681 BOOL bIsFolder1
, bIsFolder2
, bIsBothFolder
;
682 LPITEMIDLIST pItemIdList1
= (LPITEMIDLIST
) lParam1
;
683 LPITEMIDLIST pItemIdList2
= (LPITEMIDLIST
) lParam2
;
684 LISTVIEW_SORT_INFO
*pSortInfo
= (LPLISTVIEW_SORT_INFO
) lpData
;
687 bIsFolder1
= _ILIsFolder(pItemIdList1
);
688 bIsFolder2
= _ILIsFolder(pItemIdList2
);
689 bIsBothFolder
= bIsFolder1
&& bIsFolder2
;
691 /* When sorting between a File and a Folder, the Folder gets sorted first */
692 if ( (bIsFolder1
|| bIsFolder2
) && !bIsBothFolder
)
694 nDiff
= bIsFolder1
? -1 : 1;
698 /* Sort by Time: Folders or Files can be sorted */
700 if(pSortInfo
->nHeaderID
== LISTVIEW_COLUMN_TIME
)
702 _ILGetFileDateTime(pItemIdList1
, &fd1
);
703 _ILGetFileDateTime(pItemIdList2
, &fd2
);
704 nDiff
= CompareFileTime(&fd2
, &fd1
);
706 /* Sort by Attribute: Folder or Files can be sorted */
707 else if(pSortInfo
->nHeaderID
== LISTVIEW_COLUMN_ATTRIB
)
709 _ILGetFileAttributes(pItemIdList1
, strName1
, MAX_PATH
);
710 _ILGetFileAttributes(pItemIdList2
, strName2
, MAX_PATH
);
711 nDiff
= lstrcmpiA(strName1
, strName2
);
713 /* Sort by FileName: Folder or Files can be sorted */
714 else if (pSortInfo
->nHeaderID
== LISTVIEW_COLUMN_NAME
|| bIsBothFolder
)
717 _ILSimpleGetText(pItemIdList1
, strName1
, MAX_PATH
);
718 _ILSimpleGetText(pItemIdList2
, strName2
, MAX_PATH
);
719 nDiff
= lstrcmpiA(strName1
, strName2
);
721 /* Sort by File Size, Only valid for Files */
722 else if (pSortInfo
->nHeaderID
== LISTVIEW_COLUMN_SIZE
)
724 nDiff
= (INT
)(_ILGetFileSize(pItemIdList1
, NULL
, 0) - _ILGetFileSize(pItemIdList2
, NULL
, 0));
726 /* Sort by File Type, Only valid for Files */
727 else if (pSortInfo
->nHeaderID
== LISTVIEW_COLUMN_TYPE
)
730 _ILGetFileType(pItemIdList1
, strName1
, MAX_PATH
);
731 _ILGetFileType(pItemIdList2
, strName2
, MAX_PATH
);
732 nDiff
= lstrcmpiA(strName1
, strName2
);
735 /* If the Date, FileSize, FileType, Attrib was the same, sort by FileName */
739 _ILSimpleGetText(pItemIdList1
, strName1
, MAX_PATH
);
740 _ILSimpleGetText(pItemIdList2
, strName2
, MAX_PATH
);
741 nDiff
= lstrcmpiA(strName1
, strName2
);
744 if (!pSortInfo
->bIsAscending
)
752 /**********************************************************
753 * LV_FindItemByPidl()
755 int CDefView::LV_FindItemByPidl(LPCITEMIDLIST pidl
)
759 lvItem
.mask
= LVIF_PARAM
;
761 for (lvItem
.iItem
= 0;
762 SendMessageW(m_hWndList
, LVM_GETITEMW
, 0, (LPARAM
) &lvItem
);
765 LPITEMIDLIST currentpidl
= (LPITEMIDLIST
) lvItem
.lParam
;
766 HRESULT hr
= m_pSFParent
->CompareIDs(0, pidl
, currentpidl
);
768 if (SUCCEEDED(hr
) && !HRESULT_CODE(hr
))
776 /**********************************************************
779 BOOLEAN
CDefView::LV_AddItem(LPCITEMIDLIST pidl
)
783 TRACE("(%p)(pidl=%p)\n", this, pidl
);
785 lvItem
.mask
= LVIF_TEXT
| LVIF_IMAGE
| LVIF_PARAM
; /*set the mask*/
786 lvItem
.iItem
= ListView_GetItemCount(m_hWndList
); /*add the item to the end of the list*/
788 lvItem
.lParam
= (LPARAM
) ILClone(ILFindLastID(pidl
)); /*set the item's data*/
789 lvItem
.pszText
= LPSTR_TEXTCALLBACKW
; /*get text on a callback basis*/
790 lvItem
.iImage
= I_IMAGECALLBACK
; /*get the image on a callback basis*/
792 if (SendMessageW(m_hWndList
, LVM_INSERTITEMW
, 0, (LPARAM
)&lvItem
) == -1)
798 /**********************************************************
801 BOOLEAN
CDefView::LV_DeleteItem(LPCITEMIDLIST pidl
)
805 TRACE("(%p)(pidl=%p)\n", this, pidl
);
807 nIndex
= LV_FindItemByPidl(ILFindLastID(pidl
));
809 return (-1 == ListView_DeleteItem(m_hWndList
, nIndex
)) ? FALSE
: TRUE
;
812 /**********************************************************
815 BOOLEAN
CDefView::LV_RenameItem(LPCITEMIDLIST pidlOld
, LPCITEMIDLIST pidlNew
)
820 TRACE("(%p)(pidlold=%p pidlnew=%p)\n", this, pidlOld
, pidlNew
);
822 nItem
= LV_FindItemByPidl(ILFindLastID(pidlOld
));
826 lvItem
.mask
= LVIF_PARAM
; /* only the pidl */
827 lvItem
.iItem
= nItem
;
828 SendMessageW(m_hWndList
, LVM_GETITEMW
, 0, (LPARAM
) &lvItem
);
830 SHFree((LPITEMIDLIST
)lvItem
.lParam
);
831 lvItem
.mask
= LVIF_PARAM
|LVIF_IMAGE
;
832 lvItem
.iItem
= nItem
;
833 lvItem
.lParam
= (LPARAM
) ILClone(ILFindLastID(pidlNew
)); /* set the item's data */
834 lvItem
.iImage
= SHMapPIDLToSystemImageListIndex(m_pSFParent
, pidlNew
, 0);
835 SendMessageW(m_hWndList
, LVM_SETITEMW
, 0, (LPARAM
) &lvItem
);
836 SendMessageW(m_hWndList
, LVM_UPDATE
, nItem
, 0);
837 return TRUE
; /* FIXME: better handling */
843 /**********************************************************
844 * ShellView_FillList()
846 * - gets the objectlist from the shellfolder
848 * - fills the list into the view
850 INT CALLBACK
CDefView::fill_list( LPVOID ptr
, LPVOID arg
)
852 LPITEMIDLIST pidl
= (LPITEMIDLIST
)ptr
;
853 CDefView
*pThis
= static_cast<CDefView
*>(arg
);
854 /* in a commdlg This works as a filemask*/
855 if (pThis
->IncludeObject(pidl
) == S_OK
)
856 pThis
->LV_AddItem(pidl
);
862 HRESULT
CDefView::FillList()
864 LPENUMIDLIST pEnumIDList
;
872 /* get the itemlist from the shfolder*/
873 hRes
= m_pSFParent
->EnumObjects(m_hWnd
, SHCONTF_NONFOLDERS
| SHCONTF_FOLDERS
, &pEnumIDList
);
881 /* create a pointer array */
882 hdpa
= DPA_Create(16);
885 return(E_OUTOFMEMORY
);
888 /* copy the items into the array*/
889 while((S_OK
== pEnumIDList
->Next(1, &pidl
, &dwFetched
)) && dwFetched
)
891 if (DPA_InsertPtr(hdpa
, 0x7fff, pidl
) == -1)
898 DPA_Sort(hdpa
, CompareItems
, (LPARAM
)m_pSFParent
.p
);
900 /*turn the listview's redrawing off*/
901 SendMessageA(m_hWndList
, WM_SETREDRAW
, FALSE
, 0);
903 DPA_DestroyCallback( hdpa
, fill_list
, (void *)this);
905 /*turn the listview's redrawing back on and force it to draw*/
906 SendMessageA(m_hWndList
, WM_SETREDRAW
, TRUE
, 0);
908 pEnumIDList
->Release(); /* destroy the list*/
913 LRESULT
CDefView::OnShowWindow(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
915 ::UpdateWindow(m_hWndList
);
920 LRESULT
CDefView::OnGetDlgCode(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
922 return SendMessageW(m_hWndList
, uMsg
, 0, 0);
925 LRESULT
CDefView::OnDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
928 DestroyMenu(m_hMenu
);
929 RevokeDragDrop(m_hWnd
);
930 SHChangeNotifyDeregister(m_hNotify
);
935 LRESULT
CDefView::OnEraseBackground(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
937 if (m_FolderSettings
.fFlags
& (FWF_DESKTOP
| FWF_TRANSPARENT
))
938 return SendMessageW(GetParent(), WM_ERASEBKGND
, wParam
, lParam
); /* redirect to parent */
944 LRESULT
CDefView::OnSysColorChange(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
946 /* Update desktop labels color */
949 /* Forward WM_SYSCOLORCHANGE to common controls */
950 return SendMessageW(m_hWndList
, uMsg
, 0, 0);
953 LRESULT
CDefView::OnGetShellBrowser(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
955 return (LRESULT
)m_pShellBrowser
.p
;
958 /**********************************************************
959 * ShellView_OnCreate()
961 LRESULT
CDefView::OnCreate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
963 CComPtr
<IDropTarget
> pdt
;
964 SHChangeNotifyEntry ntreg
;
965 CComPtr
<IPersistFolder2
> ppf2
;
977 if (SUCCEEDED(QueryInterface(IID_PPV_ARG(IDropTarget
, &pdt
))))
979 if (FAILED(RegisterDragDrop(m_hWnd
, pdt
)))
980 ERR("Registering Drag Drop Failed");
983 /* register for receiving notifications */
984 m_pSFParent
->QueryInterface(IID_PPV_ARG(IPersistFolder2
, &ppf2
));
987 ppf2
->GetCurFolder((LPITEMIDLIST
*)&ntreg
.pidl
);
988 ntreg
.fRecursive
= TRUE
;
989 m_hNotify
= SHChangeNotifyRegister(m_hWnd
, SHCNF_IDLIST
, SHCNE_ALLEVENTS
, SHV_CHANGE_NOTIFY
, 1, &ntreg
);
990 SHFree((LPITEMIDLIST
)ntreg
.pidl
);
993 m_hAccel
= LoadAcceleratorsA(shell32_hInstance
, MAKEINTRESOURCEA( IDA_SHELLVIEW
));
998 /**********************************************************
999 * #### Handling of the menus ####
1002 /**********************************************************
1003 * ShellView_BuildFileMenu()
1005 HMENU
CDefView::BuildFileMenu()
1006 { WCHAR szText
[MAX_PATH
];
1011 TRACE("(%p)\n", this);
1013 hSubMenu
= CreatePopupMenu();
1016 /*get the number of items in our global array*/
1017 for(nTools
= 0; Tools
[nTools
].idCommand
!= -1; nTools
++) {}
1019 /*add the menu items*/
1020 for(i
= 0; i
< nTools
; i
++)
1022 LoadStringW(shell32_hInstance
, Tools
[i
].idMenuString
, szText
, MAX_PATH
);
1024 ZeroMemory(&mii
, sizeof(mii
));
1025 mii
.cbSize
= sizeof(mii
);
1026 mii
.fMask
= MIIM_TYPE
| MIIM_ID
| MIIM_STATE
;
1028 if(BTNS_SEP
!= Tools
[i
].bStyle
) /* no separator*/
1030 mii
.fType
= MFT_STRING
;
1031 mii
.fState
= MFS_ENABLED
;
1032 mii
.dwTypeData
= szText
;
1033 mii
.wID
= Tools
[i
].idCommand
;
1037 mii
.fType
= MFT_SEPARATOR
;
1039 /* tack This item onto the end of the menu */
1040 InsertMenuItemW(hSubMenu
, (UINT
) - 1, TRUE
, &mii
);
1044 TRACE("-- return (menu=%p)\n", hSubMenu
);
1048 /**********************************************************
1049 * ShellView_MergeFileMenu()
1051 void CDefView::MergeFileMenu(HMENU hSubMenu
)
1053 TRACE("(%p)->(submenu=%p) stub\n", this, hSubMenu
);
1058 /* Cleanup the items added previously */
1059 for (int i
= 0; i
< GetMenuItemCount(hSubMenu
); )
1062 mii
.cbSize
= sizeof(mii
);
1063 mii
.fMask
= MIIM_ID
;
1064 GetMenuItemInfoW(hSubMenu
, i
, TRUE
, &mii
);
1066 if (mii
.wID
< 0x8000)
1068 DeleteMenu(hSubMenu
, i
, MF_BYPOSITION
);
1076 /* Insert This item at the beginning of the menu. */
1077 _InsertMenuItemW(hSubMenu
, 0, TRUE
, 0, MFT_SEPARATOR
, NULL
, MFS_ENABLED
);
1078 _InsertMenuItemW(hSubMenu
, 0, TRUE
, IDM_MYFILEITEM
+4, MFT_STRING
, L
"Properties", MFS_DISABLED
);
1079 _InsertMenuItemW(hSubMenu
, 0, TRUE
, IDM_MYFILEITEM
+3, MFT_STRING
, L
"Rename", MFS_DISABLED
);
1080 _InsertMenuItemW(hSubMenu
, 0, TRUE
, IDM_MYFILEITEM
+2, MFT_STRING
, L
"Delete", MFS_DISABLED
);
1081 _InsertMenuItemW(hSubMenu
, 0, TRUE
, IDM_MYFILEITEM
+1, MFT_STRING
, L
"Create Shortcut", MFS_DISABLED
);
1082 _InsertMenuItemW(hSubMenu
, 0, TRUE
, 0, MFT_SEPARATOR
, NULL
, MFS_ENABLED
);
1083 _InsertMenuItemW(hSubMenu
, 0, TRUE
, IDM_MYFILEITEM
, MFT_STRING
, L
"New", MFS_ENABLED
);
1088 /**********************************************************
1089 * ShellView_MergeViewMenu()
1091 void CDefView::MergeViewMenu(HMENU hSubMenu
)
1093 TRACE("(%p)->(submenu=%p)\n", this, hSubMenu
);
1101 item
|= SHCheckMenuItem(hSubMenu
, FCIDM_SHVIEW_BIGICON
, FALSE
);
1102 item
|= SHCheckMenuItem(hSubMenu
, FCIDM_SHVIEW_SMALLICON
, FALSE
);
1103 item
|= SHCheckMenuItem(hSubMenu
, FCIDM_SHVIEW_LISTVIEW
, FALSE
);
1104 item
|= SHCheckMenuItem(hSubMenu
, FCIDM_SHVIEW_REPORTVIEW
, FALSE
);
1108 HMENU menubase
= ::LoadMenuW(shell32_hInstance
, L
"MENU_001");
1110 _InsertMenuItemW(hSubMenu
, FCIDM_MENU_VIEW_SEP_OPTIONS
, FALSE
, 0, MFT_SEPARATOR
, NULL
, MFS_ENABLED
);
1112 INT count
= ::GetMenuItemCount(menubase
);
1113 for (int i
= 0; i
< count
; i
++)
1115 MENUITEMINFOW mii
= { 0 };
1118 mii
.cbSize
= sizeof(mii
);
1119 mii
.fMask
= MIIM_STATE
| MIIM_ID
| MIIM_SUBMENU
| MIIM_CHECKMARKS
| MIIM_DATA
| MIIM_STRING
| MIIM_BITMAP
| MIIM_FTYPE
;
1120 mii
.dwTypeData
= label
;
1121 mii
.cch
= _countof(label
);
1122 ::GetMenuItemInfoW(menubase
, i
, TRUE
, &mii
);
1124 DbgPrint("Adding item %d label %S type %d\n", mii
.wID
, mii
.dwTypeData
, mii
.fType
);
1126 mii
.fType
|= MFT_RADIOCHECK
;
1128 ::InsertMenuItemW(hSubMenu
, FCIDM_MENU_VIEW_SEP_OPTIONS
, FALSE
, &mii
);
1131 ::DestroyMenu(menubase
);
1134 DbgPrint("View mode is %d\n", m_FolderSettings
.ViewMode
);
1136 if (m_FolderSettings
.ViewMode
>= FVM_FIRST
&& m_FolderSettings
.ViewMode
<= FVM_LAST
)
1138 UINT iItem
= FCIDM_SHVIEW_BIGICON
+ m_FolderSettings
.ViewMode
- FVM_FIRST
;
1139 DbgPrint("Checking item %d ...\n", iItem
);
1140 item
= SHCheckMenuItem(hSubMenu
, iItem
, TRUE
);
1141 DbgPrint("SHCheckMenuItem returned %d\n", item
);
1144 DbgPrint("GetLastError returned %d\n", GetLastError());
1149 /**********************************************************
1150 * ShellView_GetSelections()
1152 * - fills the m_apidl list with the selected objects
1155 * number of selected items
1157 UINT
CDefView::GetSelections()
1164 m_cidl
= ListView_GetSelectedCount(m_hWndList
);
1165 m_apidl
= (LPITEMIDLIST
*)SHAlloc(m_cidl
* sizeof(LPITEMIDLIST
));
1167 TRACE("selected=%i\n", m_cidl
);
1171 TRACE("-- Items selected =%u\n", m_cidl
);
1173 lvItem
.mask
= LVIF_STATE
| LVIF_PARAM
;
1174 lvItem
.stateMask
= LVIS_SELECTED
;
1176 lvItem
.iSubItem
= 0;
1179 while(SendMessageW(m_hWndList
, LVM_GETITEMW
, 0, (LPARAM
)&lvItem
) && (i
< m_cidl
))
1181 if(lvItem
.state
& LVIS_SELECTED
)
1183 m_apidl
[i
] = (LPITEMIDLIST
)lvItem
.lParam
;
1187 TRACE("-- selected Item found\n");
1196 /**********************************************************
1197 * ShellView_OpenSelectedItems()
1199 HRESULT
CDefView::OpenSelectedItems()
1202 CMINVOKECOMMANDINFO cmi
;
1206 m_cidl
= ListView_GetSelectedCount(m_hWndList
);
1210 hResult
= OnDefaultCommand();
1211 if (hResult
== S_OK
)
1214 hMenu
= CreatePopupMenu();
1218 hResult
= GetItemObject( SVGIO_SELECTION
, IID_PPV_ARG(IContextMenu
, &m_pCM
));
1219 if (FAILED(hResult
))
1222 hResult
= IUnknown_SetSite(m_pCM
, (IShellView
*)this);
1223 //if (FAILED( hResult))
1226 hResult
= m_pCM
->QueryContextMenu(hMenu
, 0, 0x20, 0x7fff, CMF_DEFAULTONLY
);
1227 if (FAILED(hResult
))
1230 uCommand
= GetMenuDefaultItem(hMenu
, FALSE
, 0);
1231 if (uCommand
== (UINT
)-1)
1237 ZeroMemory(&cmi
, sizeof(cmi
));
1238 cmi
.cbSize
= sizeof(cmi
);
1239 cmi
.lpVerb
= (LPCSTR
)MAKEINTRESOURCEA(uCommand
);
1242 hResult
= m_pCM
->InvokeCommand(&cmi
);
1251 IUnknown_SetSite(m_pCM
, NULL
);
1258 /**********************************************************
1259 * ShellView_DoContextMenu()
1261 LRESULT
CDefView::OnContextMenu(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1267 CMINVOKECOMMANDINFO cmi
;
1270 // for some reason I haven't figured out, we sometimes recurse into this method
1277 TRACE("(%p)->(0x%08x 0x%08x) stub\n", this, x
, y
);
1279 hMenu
= CreatePopupMenu();
1283 m_cidl
= ListView_GetSelectedCount(m_hWndList
);
1285 hResult
= GetItemObject( m_cidl
? 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 if (m_FolderSettings
.fFlags
& FWF_DESKTOP
)
1298 SetMenuDefaultItem(hMenu
, FCIDM_SHVIEW_OPEN
, MF_BYCOMMAND
);
1300 uCommand
= TrackPopupMenu(hMenu
,
1301 TPM_LEFTALIGN
| TPM_RETURNCMD
| TPM_LEFTBUTTON
| TPM_RIGHTBUTTON
,
1302 x
, y
, 0, m_hWnd
, NULL
);
1306 if (uCommand
== FCIDM_SHVIEW_OPEN
&& OnDefaultCommand() == S_OK
)
1309 ZeroMemory(&cmi
, sizeof(cmi
));
1310 cmi
.cbSize
= sizeof(cmi
);
1311 cmi
.lpVerb
= (LPCSTR
)MAKEINTRESOURCEA(uCommand
);
1313 m_pCM
->InvokeCommand(&cmi
);
1319 IUnknown_SetSite(m_pCM
, NULL
);
1329 LRESULT
CDefView::OnExplorerCommand(UINT uCommand
, BOOL bUseSelection
)
1332 CMINVOKECOMMANDINFO cmi
;
1335 hMenu
= CreatePopupMenu();
1339 hResult
= GetItemObject( bUseSelection
? SVGIO_SELECTION
: SVGIO_BACKGROUND
, IID_PPV_ARG(IContextMenu
, &m_pCM
));
1340 if (FAILED( hResult
))
1343 hResult
= IUnknown_SetSite(m_pCM
, (IShellView
*)this);
1344 //if (FAILED( hResult))
1347 hResult
= m_pCM
->QueryContextMenu(hMenu
, 0, FCIDM_SHVIEWFIRST
, FCIDM_SHVIEWLAST
, CMF_NORMAL
);
1348 if (FAILED( hResult
))
1351 ZeroMemory(&cmi
, sizeof(cmi
));
1352 cmi
.cbSize
= sizeof(cmi
);
1353 cmi
.lpVerb
= (LPCSTR
)MAKEINTRESOURCEA(uCommand
);
1355 m_pCM
->InvokeCommand(&cmi
);
1361 IUnknown_SetSite(m_pCM
, NULL
);
1371 /**********************************************************
1372 * ##### message handling #####
1375 /**********************************************************
1376 * ShellView_OnSize()
1378 LRESULT
CDefView::OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1383 wWidth
= LOWORD(lParam
);
1384 wHeight
= HIWORD(lParam
);
1386 TRACE("%p width=%u height=%u\n", this, wWidth
, wHeight
);
1388 /*resize the ListView to fit our window*/
1391 ::MoveWindow(m_hWndList
, 0, 0, wWidth
, wHeight
, TRUE
);
1397 /**********************************************************
1398 * ShellView_OnDeactivate()
1403 void CDefView::OnDeactivate()
1405 TRACE("%p\n", this);
1407 if (m_uState
!= SVUIA_DEACTIVATE
)
1409 // TODO: cleanup menu after deactivation
1411 m_uState
= SVUIA_DEACTIVATE
;
1415 void CDefView::DoActivate(UINT uState
)
1417 TRACE("%p uState=%x\n", this, uState
);
1419 /*don't do anything if the state isn't really changing */
1420 if (m_uState
== uState
)
1425 if (uState
== SVUIA_DEACTIVATE
)
1433 TRACE("-- before fnSetMenuSB\n");
1434 m_pShellBrowser
->SetMenuSB(m_hMenu
, 0, m_hWnd
);
1437 if (SVUIA_ACTIVATE_FOCUS
== uState
)
1439 ::SetFocus(m_hWndList
);
1447 /**********************************************************
1448 * ShellView_OnActivate()
1450 LRESULT
CDefView::OnActivate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1452 DoActivate(SVUIA_ACTIVATE_FOCUS
);
1456 /**********************************************************
1457 * ShellView_OnSetFocus()
1460 LRESULT
CDefView::OnSetFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1462 TRACE("%p\n", this);
1464 /* Tell the browser one of our windows has received the focus. This
1465 should always be done before merging menus (OnActivate merges the
1466 menus) if one of our windows has the focus.*/
1468 m_pShellBrowser
->OnViewWindowActive((IShellView
*)this);
1469 DoActivate(SVUIA_ACTIVATE_FOCUS
);
1471 /* Set the focus to the listview */
1472 ::SetFocus(m_hWndList
);
1474 /* Notify the ICommDlgBrowser interface */
1475 OnStateChange(CDBOSC_SETFOCUS
);
1480 /**********************************************************
1481 * ShellView_OnKillFocus()
1483 LRESULT
CDefView::OnKillFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1485 TRACE("(%p) stub\n", this);
1487 DoActivate(SVUIA_ACTIVATE_NOFOCUS
);
1488 /* Notify the ICommDlgBrowser */
1489 OnStateChange(CDBOSC_KILLFOCUS
);
1494 /**********************************************************
1495 * ShellView_OnCommand()
1498 * the CmdID's are the ones from the context menu
1500 LRESULT
CDefView::OnCommand(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1506 dwCmdID
= GET_WM_COMMAND_ID(wParam
, lParam
);
1507 dwCmd
= GET_WM_COMMAND_CMD(wParam
, lParam
);
1508 hwndCmd
= GET_WM_COMMAND_HWND(wParam
, lParam
);
1510 TRACE("(%p)->(0x%08x 0x%08x %p) stub\n", this, dwCmdID
, dwCmd
, hwndCmd
);
1514 case FCIDM_SHVIEW_SMALLICON
:
1515 m_FolderSettings
.ViewMode
= FVM_SMALLICON
;
1516 SetStyle (LVS_SMALLICON
, LVS_TYPEMASK
);
1520 case FCIDM_SHVIEW_BIGICON
:
1521 m_FolderSettings
.ViewMode
= FVM_ICON
;
1522 SetStyle (LVS_ICON
, LVS_TYPEMASK
);
1526 case FCIDM_SHVIEW_LISTVIEW
:
1527 m_FolderSettings
.ViewMode
= FVM_LIST
;
1528 SetStyle (LVS_LIST
, LVS_TYPEMASK
);
1532 case FCIDM_SHVIEW_REPORTVIEW
:
1533 m_FolderSettings
.ViewMode
= FVM_DETAILS
;
1534 SetStyle (LVS_REPORT
, LVS_TYPEMASK
);
1538 /* the menu-ID's for sorting are 0x30... see shrec.rc */
1543 m_sortInfo
.nHeaderID
= (LPARAM
) (dwCmdID
- 0x30);
1544 m_sortInfo
.bIsAscending
= TRUE
;
1545 m_sortInfo
.nLastHeaderID
= m_sortInfo
.nHeaderID
;
1546 SendMessageA(m_hWndList
, LVM_SORTITEMS
, (WPARAM
) &m_sortInfo
, (LPARAM
)ListViewCompareItems
);
1549 case FCIDM_SHVIEW_REFRESH
:
1553 case FCIDM_SHVIEW_DELETE
:
1554 case FCIDM_SHVIEW_CUT
:
1555 case FCIDM_SHVIEW_COPY
:
1556 case FCIDM_SHVIEW_RENAME
:
1557 return OnExplorerCommand(dwCmdID
, TRUE
);
1559 case FCIDM_SHVIEW_INSERT
:
1560 case FCIDM_SHVIEW_UNDO
:
1561 case FCIDM_SHVIEW_INSERTLINK
:
1562 case FCIDM_SHVIEW_NEWFOLDER
:
1563 return OnExplorerCommand(dwCmdID
, FALSE
);
1565 TRACE("-- COMMAND 0x%04x unhandled\n", dwCmdID
);
1571 /**********************************************************
1572 * ShellView_OnNotify()
1575 LRESULT
CDefView::OnNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1579 LPNMLISTVIEW lpnmlv
;
1580 NMLVDISPINFOW
*lpdi
;
1585 lpnmh
= (LPNMHDR
)lParam
;
1586 lpnmlv
= (LPNMLISTVIEW
)lpnmh
;
1587 lpdi
= (NMLVDISPINFOW
*)lpnmh
;
1589 TRACE("%p CtlID=%u lpnmh->code=%x\n", this, CtlID
, lpnmh
->code
);
1591 switch (lpnmh
->code
)
1594 TRACE("-- NM_SETFOCUS %p\n", this);
1595 OnSetFocus(0, 0, 0, unused
);
1599 TRACE("-- NM_KILLFOCUS %p\n", this);
1601 /* Notify the ICommDlgBrowser interface */
1602 OnStateChange(CDBOSC_KILLFOCUS
);
1606 TRACE("-- NM_CUSTOMDRAW %p\n", this);
1607 return CDRF_DODEFAULT
;
1609 case NM_RELEASEDCAPTURE
:
1610 TRACE("-- NM_RELEASEDCAPTURE %p\n", this);
1614 TRACE("-- NM_CLICK %p\n", this);
1618 TRACE("-- NM_RCLICK %p\n", this);
1622 TRACE("-- NM_DBLCLK %p\n", this);
1623 OpenSelectedItems();
1627 TRACE("-- NM_RETURN %p\n", this);
1628 OpenSelectedItems();
1632 TRACE("-- HDN_ENDTRACKW %p\n", this);
1633 /*nColumn1 = ListView_GetColumnWidth(m_hWndList, 0);
1634 nColumn2 = ListView_GetColumnWidth(m_hWndList, 1);*/
1637 case LVN_DELETEITEM
:
1638 TRACE("-- LVN_DELETEITEM %p\n", this);
1639 SHFree((LPITEMIDLIST
)lpnmlv
->lParam
); /*delete the pidl because we made a copy of it*/
1642 case LVN_DELETEALLITEMS
:
1643 TRACE("-- LVN_DELETEALLITEMS %p\n", this);
1646 case LVN_INSERTITEM
:
1647 TRACE("-- LVN_INSERTITEM (STUB)%p\n", this);
1650 case LVN_ITEMACTIVATE
:
1651 TRACE("-- LVN_ITEMACTIVATE %p\n", this);
1652 OnStateChange(CDBOSC_SELCHANGE
); /* the browser will get the IDataObject now */
1655 case LVN_COLUMNCLICK
:
1656 m_sortInfo
.nHeaderID
= lpnmlv
->iSubItem
;
1657 if (m_sortInfo
.nLastHeaderID
== m_sortInfo
.nHeaderID
)
1659 m_sortInfo
.bIsAscending
= !m_sortInfo
.bIsAscending
;
1663 m_sortInfo
.bIsAscending
= TRUE
;
1665 m_sortInfo
.nLastHeaderID
= m_sortInfo
.nHeaderID
;
1667 SendMessageW(lpnmlv
->hdr
.hwndFrom
, LVM_SORTITEMS
, (WPARAM
) &m_sortInfo
, (LPARAM
)ListViewCompareItems
);
1670 case LVN_GETDISPINFOA
:
1671 case LVN_GETDISPINFOW
:
1672 TRACE("-- LVN_GETDISPINFO %p\n", this);
1673 pidl
= (LPITEMIDLIST
)lpdi
->item
.lParam
;
1675 if (lpdi
->item
.mask
& LVIF_TEXT
) /* text requested */
1680 if (FAILED(m_pSF2Parent
->GetDetailsOf(pidl
, lpdi
->item
.iSubItem
, &sd
)))
1682 FIXME("failed to get details\n");
1686 if (lpnmh
->code
== LVN_GETDISPINFOA
)
1688 /* shouldn't happen */
1689 NMLVDISPINFOA
*lpdiA
= (NMLVDISPINFOA
*)lpnmh
;
1690 StrRetToStrNA( lpdiA
->item
.pszText
, lpdiA
->item
.cchTextMax
, &sd
.str
, NULL
);
1691 TRACE("-- text=%s\n", lpdiA
->item
.pszText
);
1693 else /* LVN_GETDISPINFOW */
1695 StrRetToStrNW( lpdi
->item
.pszText
, lpdi
->item
.cchTextMax
, &sd
.str
, NULL
);
1696 TRACE("-- text=%s\n", debugstr_w(lpdi
->item
.pszText
));
1704 if(lpdi
->item
.mask
& LVIF_IMAGE
) /* image requested */
1706 lpdi
->item
.iImage
= SHMapPIDLToSystemImageListIndex(m_pSFParent
, pidl
, 0);
1708 lpdi
->item
.mask
|= LVIF_DI_SETITEM
;
1711 case LVN_ITEMCHANGED
:
1712 TRACE("-- LVN_ITEMCHANGED %p\n", this);
1713 OnStateChange(CDBOSC_SELCHANGE
); /* the browser will get the IDataObject now */
1717 case LVN_BEGINRDRAG
:
1718 TRACE("-- LVN_BEGINDRAG\n");
1720 if (GetSelections())
1723 DWORD dwAttributes
= SFGAO_CANLINK
;
1724 DWORD dwEffect
= DROPEFFECT_COPY
| DROPEFFECT_MOVE
;
1726 if (SUCCEEDED(m_pSFParent
->GetUIObjectOf(m_hWnd
, m_cidl
, (LPCITEMIDLIST
*)m_apidl
, IID_NULL_PPV_ARG(IDataObject
, &pda
))))
1728 IDropSource
* pds
= (IDropSource
*)this; /* own DropSource interface */
1730 if (SUCCEEDED(m_pSFParent
->GetAttributesOf(m_cidl
, (LPCITEMIDLIST
*)m_apidl
, &dwAttributes
)))
1732 if (dwAttributes
& SFGAO_CANLINK
)
1734 dwEffect
|= DROPEFFECT_LINK
;
1738 CComPtr
<IAsyncOperation
> piaso
;
1739 if (SUCCEEDED(pda
->QueryInterface(IID_PPV_ARG(IAsyncOperation
, &piaso
))))
1741 piaso
->SetAsyncMode(TRUE
);
1747 DoDragDrop(pda
, pds
, dwEffect
, &dwEffect2
);
1754 case LVN_BEGINLABELEDITW
:
1756 DWORD dwAttr
= SFGAO_CANRENAME
;
1757 pidl
= (LPITEMIDLIST
)lpdi
->item
.lParam
;
1759 TRACE("-- LVN_BEGINLABELEDITW %p\n", this);
1761 m_pSFParent
->GetAttributesOf(1, (LPCITEMIDLIST
*)&pidl
, &dwAttr
);
1762 if (SFGAO_CANRENAME
& dwAttr
)
1769 case LVN_ENDLABELEDITW
:
1771 TRACE("-- LVN_ENDLABELEDITW %p\n", this);
1772 if (lpdi
->item
.pszText
)
1777 lvItem
.iItem
= lpdi
->item
.iItem
;
1778 lvItem
.iSubItem
= 0;
1779 lvItem
.mask
= LVIF_PARAM
;
1780 SendMessageW(m_hWndList
, LVM_GETITEMW
, 0, (LPARAM
) &lvItem
);
1782 pidl
= (LPITEMIDLIST
)lpdi
->item
.lParam
;
1783 hr
= m_pSFParent
->SetNameOf(0, pidl
, lpdi
->item
.pszText
, SHGDN_INFOLDER
, &pidl
);
1785 if (SUCCEEDED(hr
) && pidl
)
1787 lvItem
.mask
= LVIF_PARAM
|LVIF_IMAGE
;
1788 lvItem
.lParam
= (LPARAM
)pidl
;
1789 lvItem
.iImage
= SHMapPIDLToSystemImageListIndex(m_pSFParent
, pidl
, 0);
1790 SendMessageW(m_hWndList
, LVM_SETITEMW
, 0, (LPARAM
) &lvItem
);
1791 SendMessageW(m_hWndList
, LVM_UPDATE
, lpdi
->item
.iItem
, 0);
1801 TRACE("-- %p WM_COMMAND %x unhandled\n", this, lpnmh
->code
);
1808 /**********************************************************
1809 * ShellView_OnChange()
1811 LRESULT
CDefView::OnChangeNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1813 LPITEMIDLIST
*Pidls
;
1815 Pidls
= (LPITEMIDLIST
*)wParam
;
1817 TRACE("(%p)(%p,%p,0x%08x)\n", this, Pidls
[0], Pidls
[1], lParam
);
1823 LV_AddItem(Pidls
[0]);
1828 LV_DeleteItem(Pidls
[0]);
1831 case SHCNE_RENAMEFOLDER
:
1832 case SHCNE_RENAMEITEM
:
1833 LV_RenameItem(Pidls
[0], Pidls
[1]);
1836 case SHCNE_UPDATEITEM
:
1837 LV_RenameItem(Pidls
[0], Pidls
[0]);
1840 case SHCNE_UPDATEDIR
:
1847 /**********************************************************
1848 * CDefView::OnCustomItem
1850 LRESULT
CDefView::OnCustomItem(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1855 ERR("no menu!!!\n");
1859 CComPtr
<IContextMenu2
> pCM2
;
1860 HRESULT hres
= m_pCM
.p
->QueryInterface(IID_PPV_ARG(IContextMenu2
, &pCM2
));
1864 if (pCM2
.p
->HandleMenuMsg(uMsg
, (WPARAM
)m_hWnd
, lParam
) == S_OK
)
1870 LRESULT
CDefView::OnSettingChange(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1872 /* Wallpaper setting affects drop shadows effect */
1873 if (wParam
== SPI_SETDESKWALLPAPER
|| wParam
== 0)
1879 /**********************************************************
1880 * CDefView::OnInitMenuPopup
1882 LRESULT
CDefView::OnInitMenuPopup(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1884 MENUITEMINFOW mii
= { 0 };
1885 HMENU hSubmenu
= (HMENU
) wParam
;
1887 DbgPrint("OnInitMenuPopup lParam=%d\n", lParam
);
1889 mii
.cbSize
= sizeof(mii
);
1890 mii
.fMask
= MIIM_ID
| MIIM_SUBMENU
;
1892 if (!GetMenuItemInfoW(this->m_hMenu
, lParam
, TRUE
, &mii
))
1894 DbgPrint("OnInitMenuPopup GetMenuItemInfoW failed!\n");
1898 UINT menuItemId
= mii
.wID
;
1900 if (mii
.hSubMenu
!= hSubmenu
)
1902 DbgPrint("OnInitMenuPopup submenu does not match!!!!\n");
1906 DbgPrint("OnInitMenuPopup id=%d\n", menuItemId
);
1910 case FCIDM_MENU_FILE
:
1911 MergeFileMenu(hSubmenu
);
1913 case FCIDM_MENU_EDIT
:
1914 //MergeEditMenu(hSubmenu);
1916 case FCIDM_MENU_VIEW
:
1917 MergeViewMenu(hSubmenu
);
1924 /**********************************************************
1927 * The INTERFACE of the IShellView object
1930 **********************************************************
1933 /**********************************************************
1934 * ShellView_GetWindow
1936 HRESULT WINAPI
CDefView::GetWindow(HWND
*phWnd
)
1938 TRACE("(%p)\n", this);
1945 HRESULT WINAPI
CDefView::ContextSensitiveHelp(BOOL fEnterMode
)
1947 FIXME("(%p) stub\n", this);
1952 /**********************************************************
1953 * IShellView_TranslateAccelerator
1956 * use the accel functions
1958 HRESULT WINAPI
CDefView::TranslateAccelerator(LPMSG lpmsg
)
1960 if (lpmsg
->message
>= WM_KEYFIRST
&& lpmsg
->message
<= WM_KEYLAST
)
1962 if (::TranslateAcceleratorW(m_hWnd
, m_hAccel
, lpmsg
) != 0)
1965 TRACE("-- key=0x04%lx\n", lpmsg
->wParam
) ;
1968 return S_FALSE
; /* not handled */
1971 HRESULT WINAPI
CDefView::EnableModeless(BOOL fEnable
)
1973 FIXME("(%p) stub\n", this);
1978 HRESULT WINAPI
CDefView::UIActivate(UINT uState
)
1981 CHAR szName[MAX_PATH];
1984 int nPartArray
[1] = { -1};
1986 TRACE("(%p)->(state=%x) stub\n", this, uState
);
1988 /*don't do anything if the state isn't really changing*/
1989 if (m_uState
== uState
)
1994 /*OnActivate handles the menu merging and internal state*/
1997 /*only do This if we are active*/
1998 if (uState
!= SVUIA_DEACTIVATE
)
2002 GetFolderPath is not a method of IShellFolder
2003 IShellFolder_GetFolderPath( m_pSFParent, szName, sizeof(szName) );
2005 /* set the number of parts */
2006 m_pShellBrowser
->SendControlMsg(FCW_STATUS
, SB_SETPARTS
, 1, (LPARAM
)nPartArray
, &lResult
);
2008 /* set the text for the parts */
2010 m_pShellBrowser->SendControlMsg(FCW_STATUS, SB_SETTEXTA, 0, (LPARAM)szName, &lResult);
2017 HRESULT WINAPI
CDefView::Refresh()
2019 TRACE("(%p)\n", this);
2021 SendMessageW(m_hWndList
, LVM_DELETEALLITEMS
, 0, 0);
2027 HRESULT WINAPI
CDefView::CreateViewWindow(IShellView
*lpPrevView
, LPCFOLDERSETTINGS lpfs
, IShellBrowser
*psb
, RECT
*prcView
, HWND
*phWnd
)
2029 OLEMENUGROUPWIDTHS omw
= { { 0, 0, 0, 0, 0, 0 } };
2033 TRACE("(%p)->(shlview=%p set=%p shlbrs=%p rec=%p hwnd=%p) incomplete\n", this, lpPrevView
, lpfs
, psb
, prcView
, phWnd
);
2036 TRACE("-- vmode=%x flags=%x\n", lpfs
->ViewMode
, lpfs
->fFlags
);
2037 if (prcView
!= NULL
)
2038 TRACE("-- left=%i top=%i right=%i bottom=%i\n", prcView
->left
, prcView
->top
, prcView
->right
, prcView
->bottom
);
2040 /* Validate the Shell Browser */
2042 return E_UNEXPECTED
;
2044 /*set up the member variables*/
2045 m_pShellBrowser
= psb
;
2046 m_FolderSettings
= *lpfs
;
2048 /*get our parent window*/
2049 m_pShellBrowser
->GetWindow(&m_hWndParent
);
2051 /* try to get the ICommDlgBrowserInterface, adds a reference !!! */
2052 m_pCommDlgBrowser
= NULL
;
2053 if (SUCCEEDED(m_pShellBrowser
->QueryInterface(IID_PPV_ARG(ICommDlgBrowser
, &m_pCommDlgBrowser
))))
2055 TRACE("-- CommDlgBrowser\n");
2058 Create(m_hWndParent
, prcView
, NULL
, WS_CHILD
| WS_TABSTOP
, 0, 0U);
2069 SetWindowPos(HWND_TOP
, 0, 0, 0, 0, SWP_NOMOVE
| SWP_NOSIZE
| SWP_SHOWWINDOW
);
2074 m_hMenu
= CreateMenu();
2075 m_pShellBrowser
->InsertMenusSB(m_hMenu
, &omw
);
2076 TRACE("-- after fnInsertMenusSB\n");
2082 HRESULT WINAPI
CDefView::DestroyViewWindow()
2084 TRACE("(%p)\n", this);
2086 /*Make absolutely sure all our UI is cleaned up.*/
2087 UIActivate(SVUIA_DEACTIVATE
);
2091 DestroyMenu(m_hMenu
);
2095 m_pShellBrowser
.Release();
2096 m_pCommDlgBrowser
.Release();
2101 HRESULT WINAPI
CDefView::GetCurrentInfo(LPFOLDERSETTINGS lpfs
)
2103 TRACE("(%p)->(%p) vmode=%x flags=%x\n", this, lpfs
,
2104 m_FolderSettings
.ViewMode
, m_FolderSettings
.fFlags
);
2107 return E_INVALIDARG
;
2109 *lpfs
= m_FolderSettings
;
2113 HRESULT WINAPI
CDefView::AddPropertySheetPages(DWORD dwReserved
, LPFNADDPROPSHEETPAGE lpfn
, LPARAM lparam
)
2115 FIXME("(%p) stub\n", this);
2120 HRESULT WINAPI
CDefView::SaveViewState()
2122 FIXME("(%p) stub\n", this);
2127 HRESULT WINAPI
CDefView::SelectItem(LPCITEMIDLIST pidl
, UINT uFlags
)
2131 TRACE("(%p)->(pidl=%p, 0x%08x) stub\n", this, pidl
, uFlags
);
2133 i
= LV_FindItemByPidl(pidl
);
2139 if(uFlags
& SVSI_ENSUREVISIBLE
)
2140 SendMessageW(m_hWndList
, LVM_ENSUREVISIBLE
, i
, 0);
2142 lvItem
.mask
= LVIF_STATE
;
2143 lvItem
.stateMask
= LVIS_SELECTED
| LVIS_FOCUSED
;
2145 lvItem
.iSubItem
= 0;
2147 while (SendMessageW(m_hWndList
, LVM_GETITEMW
, 0, (LPARAM
) &lvItem
))
2149 if (lvItem
.iItem
== i
)
2151 if (uFlags
& SVSI_SELECT
)
2152 lvItem
.state
|= LVIS_SELECTED
;
2154 lvItem
.state
&= ~LVIS_SELECTED
;
2156 if (uFlags
& SVSI_FOCUSED
)
2157 lvItem
.state
&= ~LVIS_FOCUSED
;
2161 if (uFlags
& SVSI_DESELECTOTHERS
)
2162 lvItem
.state
&= ~LVIS_SELECTED
;
2165 SendMessageW(m_hWndList
, LVM_SETITEMW
, 0, (LPARAM
) &lvItem
);
2170 if(uFlags
& SVSI_EDIT
)
2171 SendMessageW(m_hWndList
, LVM_EDITLABELW
, i
, 0);
2177 HRESULT WINAPI
CDefView::GetItemObject(UINT uItem
, REFIID riid
, LPVOID
*ppvOut
)
2179 HRESULT hr
= E_NOINTERFACE
;
2181 TRACE("(%p)->(uItem=0x%08x,\n\tIID=%s, ppv=%p)\n", this, uItem
, debugstr_guid(&riid
), ppvOut
);
2187 case SVGIO_BACKGROUND
:
2188 if (IsEqualIID(riid
, IID_IContextMenu
))
2190 //*ppvOut = ISvBgCm_Constructor(m_pSFParent, FALSE);
2191 CDefFolderMenu_Create2(NULL
, NULL
, 0, NULL
, m_pSFParent
, NULL
, 0, NULL
, (IContextMenu
**)ppvOut
);
2199 case SVGIO_SELECTION
:
2201 hr
= m_pSFParent
->GetUIObjectOf(m_hWnd
, m_cidl
, (LPCITEMIDLIST
*)m_apidl
, riid
, 0, ppvOut
);
2205 TRACE("-- (%p)->(interface=%p)\n", this, *ppvOut
);
2210 HRESULT STDMETHODCALLTYPE
CDefView::GetCurrentViewMode(UINT
*pViewMode
)
2212 TRACE("(%p)->(%p), stub\n", this, pViewMode
);
2215 return E_INVALIDARG
;
2217 *pViewMode
= m_FolderSettings
.ViewMode
;
2221 HRESULT STDMETHODCALLTYPE
CDefView::SetCurrentViewMode(UINT ViewMode
)
2224 TRACE("(%p)->(%u), stub\n", this, ViewMode
);
2226 /* It's not redundant to check FVM_AUTO because it's a (UINT)-1 */
2227 if ((ViewMode
< FVM_FIRST
|| ViewMode
> FVM_LAST
) && (ViewMode
!= (UINT
)FVM_AUTO
))
2228 return E_INVALIDARG
;
2230 /* Windows before Vista uses LVM_SETVIEW and possibly
2231 LVM_SETEXTENDEDLISTVIEWSTYLE to set the style of the listview,
2232 while later versions seem to accomplish this through other
2240 dwStyle
= LVS_REPORT
;
2243 dwStyle
= LVS_SMALLICON
;
2250 FIXME("ViewMode %d not implemented\n", ViewMode
);
2256 SetStyle(dwStyle
, LVS_TYPEMASK
);
2258 /* This will not necessarily be the actual mode set above.
2259 This mimics the behavior of Windows XP. */
2260 m_FolderSettings
.ViewMode
= ViewMode
;
2265 HRESULT STDMETHODCALLTYPE
CDefView::GetFolder(REFIID riid
, void **ppv
)
2267 if (m_pSFParent
== NULL
)
2270 return m_pSFParent
->QueryInterface(riid
, ppv
);
2273 HRESULT STDMETHODCALLTYPE
CDefView::Item(int iItemIndex
, LPITEMIDLIST
*ppidl
)
2277 TRACE("(%p)->(%d %p)\n", this, iItemIndex
, ppidl
);
2279 item
.mask
= LVIF_PARAM
;
2280 item
.iItem
= iItemIndex
;
2282 if (SendMessageW(m_hWndList
, LVM_GETITEMW
, 0, (LPARAM
)&item
))
2284 *ppidl
= ILClone((PITEMID_CHILD
)item
.lParam
);
2290 return E_INVALIDARG
;
2293 HRESULT STDMETHODCALLTYPE
CDefView::ItemCount(UINT uFlags
, int *pcItems
)
2295 TRACE("(%p)->(%u %p)\n", this, uFlags
, pcItems
);
2297 if (uFlags
!= SVGIO_ALLVIEW
)
2298 FIXME("some flags unsupported, %x\n", uFlags
& ~SVGIO_ALLVIEW
);
2300 *pcItems
= SendMessageW(m_hWndList
, LVM_GETITEMCOUNT
, 0, 0);
2305 HRESULT STDMETHODCALLTYPE
CDefView::Items(UINT uFlags
, REFIID riid
, void **ppv
)
2310 HRESULT STDMETHODCALLTYPE
CDefView::GetSelectionMarkedItem(int *piItem
)
2312 TRACE("(%p)->(%p)\n", this, piItem
);
2314 *piItem
= SendMessageW(m_hWndList
, LVM_GETSELECTIONMARK
, 0, 0);
2319 HRESULT STDMETHODCALLTYPE
CDefView::GetFocusedItem(int *piItem
)
2321 TRACE("(%p)->(%p)\n", this, piItem
);
2323 *piItem
= SendMessageW(m_hWndList
, LVM_GETNEXTITEM
, -1, LVNI_FOCUSED
);
2328 HRESULT STDMETHODCALLTYPE
CDefView::GetItemPosition(LPCITEMIDLIST pidl
, POINT
*ppt
)
2333 HRESULT STDMETHODCALLTYPE
CDefView::GetSpacing(POINT
*ppt
)
2335 TRACE("(%p)->(%p)\n", this, ppt
);
2337 if (NULL
== m_hWndList
) return S_FALSE
;
2341 const DWORD ret
= SendMessageW(m_hWndList
, LVM_GETITEMSPACING
, 0, 0);
2343 ppt
->x
= LOWORD(ret
);
2344 ppt
->y
= HIWORD(ret
);
2350 HRESULT STDMETHODCALLTYPE
CDefView::GetDefaultSpacing(POINT
*ppt
)
2355 HRESULT STDMETHODCALLTYPE
CDefView::GetAutoArrange()
2360 HRESULT STDMETHODCALLTYPE
CDefView::SelectItem(int iItem
, DWORD dwFlags
)
2364 TRACE("(%p)->(%d, %x)\n", this, iItem
, dwFlags
);
2367 lvItem
.stateMask
= LVIS_SELECTED
;
2369 if (dwFlags
& SVSI_ENSUREVISIBLE
)
2370 SendMessageW(m_hWndList
, LVM_ENSUREVISIBLE
, iItem
, 0);
2373 if (dwFlags
& SVSI_DESELECTOTHERS
)
2374 SendMessageW(m_hWndList
, LVM_SETITEMSTATE
, -1, (LPARAM
)&lvItem
);
2377 if (dwFlags
& SVSI_SELECT
)
2378 lvItem
.state
|= LVIS_SELECTED
;
2380 if (dwFlags
& SVSI_FOCUSED
)
2381 lvItem
.stateMask
|= LVIS_FOCUSED
;
2383 SendMessageW(m_hWndList
, LVM_SETITEMSTATE
, iItem
, (LPARAM
)&lvItem
);
2385 if (dwFlags
& SVSI_EDIT
)
2386 SendMessageW(m_hWndList
, LVM_EDITLABELW
, iItem
, 0);
2391 HRESULT STDMETHODCALLTYPE
CDefView::SelectAndPositionItems(UINT cidl
, LPCITEMIDLIST
*apidl
, POINT
*apt
, DWORD dwFlags
)
2396 /**********************************************************
2397 * IShellFolderView implementation
2399 HRESULT STDMETHODCALLTYPE
CDefView::Rearrange(LPARAM sort
)
2401 FIXME("(%p)->(%ld) stub\n", this, sort
);
2405 HRESULT STDMETHODCALLTYPE
CDefView::GetArrangeParam(LPARAM
*sort
)
2407 FIXME("(%p)->(%p) stub\n", this, sort
);
2411 HRESULT STDMETHODCALLTYPE
CDefView::ArrangeGrid()
2413 FIXME("(%p) stub\n", this);
2417 HRESULT STDMETHODCALLTYPE
CDefView::AutoArrange()
2419 FIXME("(%p) stub\n", this);
2423 HRESULT STDMETHODCALLTYPE
CDefView::IShellFolderView_GetAutoArrange()
2425 TRACE("(%p)\n", this);
2426 return GetAutoArrange();
2429 HRESULT STDMETHODCALLTYPE
CDefView::AddObject(PITEMID_CHILD pidl
, UINT
*item
)
2431 FIXME("(%p)->(%p %p) stub\n", this, pidl
, item
);
2435 HRESULT STDMETHODCALLTYPE
CDefView::GetObject(PITEMID_CHILD
*pidl
, UINT item
)
2437 TRACE("(%p)->(%p %d)\n", this, pidl
, item
);
2438 return Item(item
, pidl
);
2441 HRESULT STDMETHODCALLTYPE
CDefView::RemoveObject(PITEMID_CHILD pidl
, UINT
*item
)
2444 TRACE("(%p)->(%p %p)\n", this, pidl
, item
);
2448 *item
= LV_FindItemByPidl(ILFindLastID(pidl
));
2449 SendMessageW(m_hWndList
, LVM_DELETEITEM
, *item
, 0);
2454 SendMessageW(m_hWndList
, LVM_DELETEALLITEMS
, 0, 0);
2460 HRESULT STDMETHODCALLTYPE
CDefView::GetObjectCount(UINT
*count
)
2462 TRACE("(%p)->(%p)\n", this, count
);
2463 return ItemCount(SVGIO_ALLVIEW
, reinterpret_cast<INT
*>(count
));
2466 HRESULT STDMETHODCALLTYPE
CDefView::SetObjectCount(UINT count
, UINT flags
)
2468 FIXME("(%p)->(%d %x) stub\n", this, count
, flags
);
2472 HRESULT STDMETHODCALLTYPE
CDefView::UpdateObject(PITEMID_CHILD pidl_old
, PITEMID_CHILD pidl_new
, UINT
*item
)
2474 FIXME("(%p)->(%p %p %p) stub\n", this, pidl_old
, pidl_new
, item
);
2478 HRESULT STDMETHODCALLTYPE
CDefView::RefreshObject(PITEMID_CHILD pidl
, UINT
*item
)
2480 FIXME("(%p)->(%p %p) stub\n", this, pidl
, item
);
2484 HRESULT STDMETHODCALLTYPE
CDefView::SetRedraw(BOOL redraw
)
2486 TRACE("(%p)->(%d)\n", this, redraw
);
2487 SendMessageW(m_hWndList
, WM_SETREDRAW
, redraw
, 0);
2491 HRESULT STDMETHODCALLTYPE
CDefView::GetSelectedCount(UINT
*count
)
2493 FIXME("(%p)->(%p) stub\n", this, count
);
2497 HRESULT STDMETHODCALLTYPE
CDefView::GetSelectedObjects(PCUITEMID_CHILD
**pidl
, UINT
*items
)
2499 TRACE("(%p)->(%p %p)\n", this, pidl
, items
);
2501 *items
= GetSelections();
2505 *pidl
= static_cast<PCUITEMID_CHILD
*>(LocalAlloc(0, *items
* sizeof(LPITEMIDLIST
)));
2508 return E_OUTOFMEMORY
;
2511 /* it's documented that caller shouldn't PIDLs, only array itself */
2512 memcpy(static_cast<PCUITEMID_CHILD
*>(*pidl
), m_apidl
, *items
* sizeof(LPITEMIDLIST
));
2518 HRESULT STDMETHODCALLTYPE
CDefView::IsDropOnSource(IDropTarget
*drop_target
)
2520 FIXME("(%p)->(%p) stub\n", this, drop_target
);
2524 HRESULT STDMETHODCALLTYPE
CDefView::GetDragPoint(POINT
*pt
)
2526 FIXME("(%p)->(%p) stub\n", this, pt
);
2530 HRESULT STDMETHODCALLTYPE
CDefView::GetDropPoint(POINT
*pt
)
2532 FIXME("(%p)->(%p) stub\n", this, pt
);
2536 HRESULT STDMETHODCALLTYPE
CDefView::MoveIcons(IDataObject
*obj
)
2538 TRACE("(%p)->(%p)\n", this, obj
);
2542 HRESULT STDMETHODCALLTYPE
CDefView::SetItemPos(PCUITEMID_CHILD pidl
, POINT
*pt
)
2544 FIXME("(%p)->(%p %p) stub\n", this, pidl
, pt
);
2548 HRESULT STDMETHODCALLTYPE
CDefView::IsBkDropTarget(IDropTarget
*drop_target
)
2550 FIXME("(%p)->(%p) stub\n", this, drop_target
);
2554 HRESULT STDMETHODCALLTYPE
CDefView::SetClipboard(BOOL move
)
2556 FIXME("(%p)->(%d) stub\n", this, move
);
2560 HRESULT STDMETHODCALLTYPE
CDefView::SetPoints(IDataObject
*obj
)
2562 FIXME("(%p)->(%p) stub\n", this, obj
);
2566 HRESULT STDMETHODCALLTYPE
CDefView::GetItemSpacing(ITEMSPACING
*spacing
)
2568 FIXME("(%p)->(%p) stub\n", this, spacing
);
2572 HRESULT STDMETHODCALLTYPE
CDefView::SetCallback(IShellFolderViewCB
*new_cb
, IShellFolderViewCB
**old_cb
)
2574 FIXME("(%p)->(%p %p) stub\n", this, new_cb
, old_cb
);
2578 HRESULT STDMETHODCALLTYPE
CDefView::Select(UINT flags
)
2580 FIXME("(%p)->(%d) stub\n", this, flags
);
2584 HRESULT STDMETHODCALLTYPE
CDefView::QuerySupport(UINT
*support
)
2586 TRACE("(%p)->(%p)\n", this, support
);
2590 HRESULT STDMETHODCALLTYPE
CDefView::SetAutomationObject(IDispatch
*disp
)
2592 FIXME("(%p)->(%p) stub\n", this, disp
);
2596 /**********************************************************
2597 * ISVOleCmdTarget_QueryStatus (IOleCommandTarget)
2599 HRESULT WINAPI
CDefView::QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
, OLECMD
*prgCmds
, OLECMDTEXT
*pCmdText
)
2601 FIXME("(%p)->(%p(%s) 0x%08x %p %p\n",
2602 this, pguidCmdGroup
, debugstr_guid(pguidCmdGroup
), cCmds
, prgCmds
, pCmdText
);
2605 return E_INVALIDARG
;
2607 for (UINT i
= 0; i
< cCmds
; i
++)
2609 FIXME("\tprgCmds[%d].cmdID = %d\n", i
, prgCmds
[i
].cmdID
);
2610 prgCmds
[i
].cmdf
= 0;
2613 return OLECMDERR_E_UNKNOWNGROUP
;
2616 /**********************************************************
2617 * ISVOleCmdTarget_Exec (IOleCommandTarget)
2619 * nCmdID is the OLECMDID_* enumeration
2621 HRESULT WINAPI
CDefView::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
2623 FIXME("(%p)->(\n\tTarget GUID:%s Command:0x%08x Opt:0x%08x %p %p)\n",
2624 this, debugstr_guid(pguidCmdGroup
), nCmdID
, nCmdexecopt
, pvaIn
, pvaOut
);
2627 return OLECMDERR_E_UNKNOWNGROUP
;
2629 if (IsEqualIID(*pguidCmdGroup
, CGID_Explorer
) &&
2631 (nCmdexecopt
== 4) && pvaOut
)
2634 if (IsEqualIID(*pguidCmdGroup
, CGID_ShellDocView
) &&
2639 return OLECMDERR_E_UNKNOWNGROUP
;
2642 /**********************************************************
2643 * ISVDropTarget implementation
2646 /******************************************************************************
2647 * drag_notify_subitem [Internal]
2649 * Figure out the shellfolder object, which is currently under the mouse cursor
2650 * and notify it via the IDropTarget interface.
2653 #define SCROLLAREAWIDTH 20
2655 HRESULT
CDefView::drag_notify_subitem(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2657 LVHITTESTINFO htinfo
;
2663 /* Map from global to client coordinates and query the index of the listview-item, which is
2664 * currently under the mouse cursor. */
2667 htinfo
.flags
= LVHT_ONITEM
;
2668 ::ScreenToClient(m_hWndList
, &htinfo
.pt
);
2669 lResult
= SendMessageW(m_hWndList
, LVM_HITTEST
, 0, (LPARAM
)&htinfo
);
2671 /* Send WM_*SCROLL messages every 250 ms during drag-scrolling */
2672 ::GetClientRect(m_hWndList
, &clientRect
);
2673 if (htinfo
.pt
.x
== m_ptLastMousePos
.x
&& htinfo
.pt
.y
== m_ptLastMousePos
.y
&&
2674 (htinfo
.pt
.x
< SCROLLAREAWIDTH
|| htinfo
.pt
.x
> clientRect
.right
- SCROLLAREAWIDTH
||
2675 htinfo
.pt
.y
< SCROLLAREAWIDTH
|| htinfo
.pt
.y
> clientRect
.bottom
- SCROLLAREAWIDTH
))
2677 m_cScrollDelay
= (m_cScrollDelay
+ 1) % 5; /* DragOver is called every 50 ms */
2678 if (m_cScrollDelay
== 0)
2680 /* Mouse did hover another 250 ms over the scroll-area */
2681 if (htinfo
.pt
.x
< SCROLLAREAWIDTH
)
2682 SendMessageW(m_hWndList
, WM_HSCROLL
, SB_LINEUP
, 0);
2684 if (htinfo
.pt
.x
> clientRect
.right
- SCROLLAREAWIDTH
)
2685 SendMessageW(m_hWndList
, WM_HSCROLL
, SB_LINEDOWN
, 0);
2687 if (htinfo
.pt
.y
< SCROLLAREAWIDTH
)
2688 SendMessageW(m_hWndList
, WM_VSCROLL
, SB_LINEUP
, 0);
2690 if (htinfo
.pt
.y
> clientRect
.bottom
- SCROLLAREAWIDTH
)
2691 SendMessageW(m_hWndList
, WM_VSCROLL
, SB_LINEDOWN
, 0);
2696 m_cScrollDelay
= 0; /* Reset, if the cursor is not over the listview's scroll-area */
2699 m_ptLastMousePos
= htinfo
.pt
;
2701 /* If we are still over the previous sub-item, notify it via DragOver and return. */
2702 if (m_pCurDropTarget
&& lResult
== m_iDragOverItem
)
2703 return m_pCurDropTarget
->DragOver(grfKeyState
, pt
, pdwEffect
);
2705 /* We've left the previous sub-item, notify it via DragLeave and Release it. */
2706 if (m_pCurDropTarget
)
2708 m_pCurDropTarget
->DragLeave();
2709 m_pCurDropTarget
.Release();
2712 m_iDragOverItem
= lResult
;
2715 /* We are not above one of the listview's subitems. Bind to the parent folder's
2716 * DropTarget interface. */
2717 hr
= m_pSFParent
->QueryInterface(IID_PPV_ARG(IDropTarget
,&m_pCurDropTarget
));
2721 /* Query the relative PIDL of the shellfolder object represented by the currently
2722 * dragged over listview-item ... */
2723 lvItem
.mask
= LVIF_PARAM
;
2724 lvItem
.iItem
= lResult
;
2725 lvItem
.iSubItem
= 0;
2726 SendMessageW(m_hWndList
, LVM_GETITEMW
, 0, (LPARAM
) &lvItem
);
2728 /* ... and bind m_pCurDropTarget to the IDropTarget interface of an UIObject of this object */
2729 hr
= m_pSFParent
->GetUIObjectOf(m_hWndList
, 1, (LPCITEMIDLIST
*)&lvItem
.lParam
, IID_NULL_PPV_ARG(IDropTarget
, &m_pCurDropTarget
));
2732 /* If anything failed, m_pCurDropTarget should be NULL now, which ought to be a save state. */
2736 /* Notify the item just entered via DragEnter. */
2737 return m_pCurDropTarget
->DragEnter(m_pCurDataObject
, grfKeyState
, pt
, pdwEffect
);
2740 HRESULT WINAPI
CDefView::DragEnter(IDataObject
*pDataObject
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2742 /* Get a hold on the data object for later calls to DragEnter on the sub-folders */
2743 m_pCurDataObject
= pDataObject
;
2744 pDataObject
->AddRef();
2746 return drag_notify_subitem(grfKeyState
, pt
, pdwEffect
);
2749 HRESULT WINAPI
CDefView::DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2751 return drag_notify_subitem(grfKeyState
, pt
, pdwEffect
);
2754 HRESULT WINAPI
CDefView::DragLeave()
2756 if (m_pCurDropTarget
)
2758 m_pCurDropTarget
->DragLeave();
2759 m_pCurDropTarget
.Release();
2762 if (m_pCurDataObject
!= NULL
)
2764 m_pCurDataObject
.Release();
2767 m_iDragOverItem
= 0;
2772 HRESULT WINAPI
CDefView::Drop(IDataObject
* pDataObject
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2774 if (m_pCurDropTarget
)
2776 m_pCurDropTarget
->Drop(pDataObject
, grfKeyState
, pt
, pdwEffect
);
2777 m_pCurDropTarget
.Release();
2780 m_pCurDataObject
.Release();
2781 m_iDragOverItem
= 0;
2785 /**********************************************************
2786 * ISVDropSource implementation
2789 HRESULT WINAPI
CDefView::QueryContinueDrag(BOOL fEscapePressed
, DWORD grfKeyState
)
2791 TRACE("(%p)\n", this);
2794 return DRAGDROP_S_CANCEL
;
2795 else if (!(grfKeyState
& MK_LBUTTON
) && !(grfKeyState
& MK_RBUTTON
))
2796 return DRAGDROP_S_DROP
;
2801 HRESULT WINAPI
CDefView::GiveFeedback(DWORD dwEffect
)
2803 TRACE("(%p)\n", this);
2805 return DRAGDROP_S_USEDEFAULTCURSORS
;
2808 /**********************************************************
2809 * ISVViewObject implementation
2812 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
)
2814 FIXME("Stub: this=%p\n", this);
2819 HRESULT WINAPI
CDefView::GetColorSet(DWORD dwDrawAspect
, LONG lindex
, void *pvAspect
, DVTARGETDEVICE
*ptd
, HDC hicTargetDevice
, LOGPALETTE
**ppColorSet
)
2821 FIXME("Stub: this=%p\n", this);
2826 HRESULT WINAPI
CDefView::Freeze(DWORD dwDrawAspect
, LONG lindex
, void *pvAspect
, DWORD
*pdwFreeze
)
2828 FIXME("Stub: this=%p\n", this);
2833 HRESULT WINAPI
CDefView::Unfreeze(DWORD dwFreeze
)
2835 FIXME("Stub: this=%p\n", this);
2840 HRESULT WINAPI
CDefView::SetAdvise(DWORD aspects
, DWORD advf
, IAdviseSink
*pAdvSink
)
2842 FIXME("partial stub: %p %08x %08x %p\n", this, aspects
, advf
, pAdvSink
);
2844 /* FIXME: we set the AdviseSink, but never use it to send any advice */
2845 m_pAdvSink
= pAdvSink
;
2846 m_dwAspects
= aspects
;
2852 HRESULT WINAPI
CDefView::GetAdvise(DWORD
*pAspects
, DWORD
*pAdvf
, IAdviseSink
**ppAdvSink
)
2854 TRACE("this=%p pAspects=%p pAdvf=%p ppAdvSink=%p\n", this, pAspects
, pAdvf
, ppAdvSink
);
2858 *ppAdvSink
= m_pAdvSink
;
2859 m_pAdvSink
.p
->AddRef();
2863 *pAspects
= m_dwAspects
;
2871 HRESULT STDMETHODCALLTYPE
CDefView::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
2873 if (IsEqualIID(guidService
, SID_IShellBrowser
))
2874 return m_pShellBrowser
->QueryInterface(riid
, ppvObject
);
2875 else if(IsEqualIID(guidService
, SID_IFolderView
))
2876 return QueryInterface(riid
, ppvObject
);
2878 return E_NOINTERFACE
;
2881 /**********************************************************
2882 * IShellView_Constructor
2884 HRESULT WINAPI
IShellView_Constructor(IShellFolder
*pFolder
, IShellView
**newView
)
2886 CComObject
<CDefView
> *theView
;
2887 CComPtr
<IShellView
> result
;
2890 if (newView
== NULL
)
2894 ATLTRY (theView
= new CComObject
<CDefView
>);
2896 if (theView
== NULL
)
2897 return E_OUTOFMEMORY
;
2899 hResult
= theView
->QueryInterface(IID_PPV_ARG(IShellView
, &result
));
2900 if (FAILED (hResult
))
2906 hResult
= theView
->Initialize (pFolder
);
2907 if (FAILED (hResult
))
2909 *newView
= result
.Detach ();