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
;
93 LPITEMIDLIST
*m_apidl
;
94 LISTVIEW_SORT_INFO m_sortInfo
;
95 ULONG m_hNotify
; /* change notification handle */
99 CComPtr
<IAdviseSink
> m_pAdvSink
;
101 CComPtr
<IDropTarget
> m_pCurDropTarget
; /* The sub-item, which is currently dragged over */
102 CComPtr
<IDataObject
> m_pCurDataObject
; /* The dragged data-object */
103 LONG m_iDragOverItem
; /* Dragged over item's index, iff m_pCurDropTarget != NULL */
104 UINT m_cScrollDelay
; /* Send a WM_*SCROLL msg every 250 ms during drag-scroll */
105 POINT m_ptLastMousePos
; /* Mouse position at last DragOver call */
107 CComPtr
<IContextMenu
> m_pCM
;
113 HRESULT WINAPI
Initialize(IShellFolder
*shellFolder
);
114 HRESULT
IncludeObject(LPCITEMIDLIST pidl
);
115 HRESULT
OnDefaultCommand();
116 HRESULT
OnStateChange(UINT uFlags
);
118 void SetStyle(DWORD dwAdd
, DWORD dwRemove
);
120 void UpdateListColors();
122 static INT CALLBACK
CompareItems(LPVOID lParam1
, LPVOID lParam2
, LPARAM lpData
);
123 static INT CALLBACK
ListViewCompareItems(LPVOID lParam1
, LPVOID lParam2
, LPARAM lpData
);
124 int LV_FindItemByPidl(LPCITEMIDLIST pidl
);
125 BOOLEAN
LV_AddItem(LPCITEMIDLIST pidl
);
126 BOOLEAN
LV_DeleteItem(LPCITEMIDLIST pidl
);
127 BOOLEAN
LV_RenameItem(LPCITEMIDLIST pidlOld
, LPCITEMIDLIST pidlNew
);
128 static INT CALLBACK
fill_list(LPVOID ptr
, LPVOID arg
);
130 HMENU
BuildFileMenu();
131 void PrepareShowFileMenu(HMENU hSubMenu
);
132 void PrepareShowViewMenu(HMENU hSubMenu
);
133 UINT
GetSelections();
134 HRESULT
OpenSelectedItems();
136 void DoActivate(UINT uState
);
137 HRESULT
drag_notify_subitem(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
138 LRESULT
OnExplorerCommand(UINT uCommand
, BOOL bUseSelection
);
140 // *** IOleWindow methods ***
141 virtual HRESULT STDMETHODCALLTYPE
GetWindow(HWND
*lphwnd
);
142 virtual HRESULT STDMETHODCALLTYPE
ContextSensitiveHelp(BOOL fEnterMode
);
144 // *** IShellView methods ***
145 virtual HRESULT STDMETHODCALLTYPE
TranslateAccelerator(MSG
*pmsg
);
146 virtual HRESULT STDMETHODCALLTYPE
EnableModeless(BOOL fEnable
);
147 virtual HRESULT STDMETHODCALLTYPE
UIActivate(UINT uState
);
148 virtual HRESULT STDMETHODCALLTYPE
Refresh();
149 virtual HRESULT STDMETHODCALLTYPE
CreateViewWindow(IShellView
*psvPrevious
, LPCFOLDERSETTINGS pfs
, IShellBrowser
*psb
, RECT
*prcView
, HWND
*phWnd
);
150 virtual HRESULT STDMETHODCALLTYPE
DestroyViewWindow();
151 virtual HRESULT STDMETHODCALLTYPE
GetCurrentInfo(LPFOLDERSETTINGS pfs
);
152 virtual HRESULT STDMETHODCALLTYPE
AddPropertySheetPages(DWORD dwReserved
, LPFNSVADDPROPSHEETPAGE pfn
, LPARAM lparam
);
153 virtual HRESULT STDMETHODCALLTYPE
SaveViewState();
154 virtual HRESULT STDMETHODCALLTYPE
SelectItem(LPCITEMIDLIST pidlItem
, SVSIF uFlags
);
155 virtual HRESULT STDMETHODCALLTYPE
GetItemObject(UINT uItem
, REFIID riid
, void **ppv
);
157 // *** IFolderView methods ***
158 virtual HRESULT STDMETHODCALLTYPE
GetCurrentViewMode(UINT
*pViewMode
);
159 virtual HRESULT STDMETHODCALLTYPE
SetCurrentViewMode(UINT ViewMode
);
160 virtual HRESULT STDMETHODCALLTYPE
GetFolder(REFIID riid
, void **ppv
);
161 virtual HRESULT STDMETHODCALLTYPE
Item(int iItemIndex
, LPITEMIDLIST
*ppidl
);
162 virtual HRESULT STDMETHODCALLTYPE
ItemCount(UINT uFlags
, int *pcItems
);
163 virtual HRESULT STDMETHODCALLTYPE
Items(UINT uFlags
, REFIID riid
, void **ppv
);
164 virtual HRESULT STDMETHODCALLTYPE
GetSelectionMarkedItem(int *piItem
);
165 virtual HRESULT STDMETHODCALLTYPE
GetFocusedItem(int *piItem
);
166 virtual HRESULT STDMETHODCALLTYPE
GetItemPosition(LPCITEMIDLIST pidl
, POINT
*ppt
);
167 virtual HRESULT STDMETHODCALLTYPE
GetSpacing(POINT
*ppt
);
168 virtual HRESULT STDMETHODCALLTYPE
GetDefaultSpacing(POINT
*ppt
);
169 virtual HRESULT STDMETHODCALLTYPE
GetAutoArrange();
170 virtual HRESULT STDMETHODCALLTYPE
SelectItem(int iItem
, DWORD dwFlags
);
171 virtual HRESULT STDMETHODCALLTYPE
SelectAndPositionItems(UINT cidl
, PCUITEMID_CHILD_ARRAY apidl
, POINT
*apt
, DWORD dwFlags
);
173 // *** IShellFolderView methods ***
174 virtual HRESULT STDMETHODCALLTYPE
Rearrange(LPARAM sort
);
175 virtual HRESULT STDMETHODCALLTYPE
GetArrangeParam(LPARAM
*sort
);
176 virtual HRESULT STDMETHODCALLTYPE
ArrangeGrid();
177 virtual HRESULT STDMETHODCALLTYPE
AutoArrange();
178 virtual HRESULT STDMETHODCALLTYPE
AddObject(PITEMID_CHILD pidl
, UINT
*item
);
179 virtual HRESULT STDMETHODCALLTYPE
GetObject(PITEMID_CHILD
*pidl
, UINT item
);
180 virtual HRESULT STDMETHODCALLTYPE
RemoveObject(PITEMID_CHILD pidl
, UINT
*item
);
181 virtual HRESULT STDMETHODCALLTYPE
GetObjectCount(UINT
*count
);
182 virtual HRESULT STDMETHODCALLTYPE
SetObjectCount(UINT count
, UINT flags
);
183 virtual HRESULT STDMETHODCALLTYPE
UpdateObject(PITEMID_CHILD pidl_old
, PITEMID_CHILD pidl_new
, UINT
*item
);
184 virtual HRESULT STDMETHODCALLTYPE
RefreshObject(PITEMID_CHILD pidl
, UINT
*item
);
185 virtual HRESULT STDMETHODCALLTYPE
SetRedraw(BOOL redraw
);
186 virtual HRESULT STDMETHODCALLTYPE
GetSelectedCount(UINT
*count
);
187 virtual HRESULT STDMETHODCALLTYPE
GetSelectedObjects(PCUITEMID_CHILD
**pidl
, UINT
*items
);
188 virtual HRESULT STDMETHODCALLTYPE
IsDropOnSource(IDropTarget
*drop_target
);
189 virtual HRESULT STDMETHODCALLTYPE
GetDragPoint(POINT
*pt
);
190 virtual HRESULT STDMETHODCALLTYPE
GetDropPoint(POINT
*pt
);
191 virtual HRESULT STDMETHODCALLTYPE
MoveIcons(IDataObject
*obj
);
192 virtual HRESULT STDMETHODCALLTYPE
SetItemPos(PCUITEMID_CHILD pidl
, POINT
*pt
);
193 virtual HRESULT STDMETHODCALLTYPE
IsBkDropTarget(IDropTarget
*drop_target
);
194 virtual HRESULT STDMETHODCALLTYPE
SetClipboard(BOOL move
);
195 virtual HRESULT STDMETHODCALLTYPE
SetPoints(IDataObject
*obj
);
196 virtual HRESULT STDMETHODCALLTYPE
GetItemSpacing(ITEMSPACING
*spacing
);
197 virtual HRESULT STDMETHODCALLTYPE
SetCallback(IShellFolderViewCB
*new_cb
, IShellFolderViewCB
**old_cb
);
198 virtual HRESULT STDMETHODCALLTYPE
Select(UINT flags
);
199 virtual HRESULT STDMETHODCALLTYPE
QuerySupport(UINT
*support
);
200 virtual HRESULT STDMETHODCALLTYPE
SetAutomationObject(IDispatch
*disp
);
202 // *** IOleCommandTarget methods ***
203 virtual HRESULT STDMETHODCALLTYPE
QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
, OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
);
204 virtual HRESULT STDMETHODCALLTYPE
Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
);
206 // *** IDropTarget methods ***
207 virtual HRESULT STDMETHODCALLTYPE
DragEnter(IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
208 virtual HRESULT STDMETHODCALLTYPE
DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
209 virtual HRESULT STDMETHODCALLTYPE
DragLeave();
210 virtual HRESULT STDMETHODCALLTYPE
Drop(IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
212 // *** IDropSource methods ***
213 virtual HRESULT STDMETHODCALLTYPE
QueryContinueDrag(BOOL fEscapePressed
, DWORD grfKeyState
);
214 virtual HRESULT STDMETHODCALLTYPE
GiveFeedback(DWORD dwEffect
);
216 // *** IViewObject methods ***
217 virtual HRESULT STDMETHODCALLTYPE
Draw(DWORD dwDrawAspect
, LONG lindex
, void *pvAspect
, DVTARGETDEVICE
*ptd
,
218 HDC hdcTargetDev
, HDC hdcDraw
, LPCRECTL lprcBounds
, LPCRECTL lprcWBounds
,
219 BOOL ( STDMETHODCALLTYPE
*pfnContinue
)(ULONG_PTR dwContinue
), ULONG_PTR dwContinue
);
220 virtual HRESULT STDMETHODCALLTYPE
GetColorSet(DWORD dwDrawAspect
, LONG lindex
, void *pvAspect
,
221 DVTARGETDEVICE
*ptd
, HDC hicTargetDev
, LOGPALETTE
**ppColorSet
);
222 virtual HRESULT STDMETHODCALLTYPE
Freeze(DWORD dwDrawAspect
, LONG lindex
, void *pvAspect
, DWORD
*pdwFreeze
);
223 virtual HRESULT STDMETHODCALLTYPE
Unfreeze(DWORD dwFreeze
);
224 virtual HRESULT STDMETHODCALLTYPE
SetAdvise(DWORD aspects
, DWORD advf
, IAdviseSink
*pAdvSink
);
225 virtual HRESULT STDMETHODCALLTYPE
GetAdvise(DWORD
*pAspects
, DWORD
*pAdvf
, IAdviseSink
**ppAdvSink
);
227 // *** IServiceProvider methods ***
228 virtual HRESULT STDMETHODCALLTYPE
QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
);
231 LRESULT
OnShowWindow(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
232 LRESULT
OnGetDlgCode(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
233 LRESULT
OnDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
234 LRESULT
OnEraseBackground(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
235 LRESULT
OnSysColorChange(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
236 LRESULT
OnGetShellBrowser(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
237 LRESULT
OnCreate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
238 LRESULT
OnContextMenu(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
239 LRESULT
OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
240 LRESULT
OnActivate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
241 LRESULT
OnSetFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
242 LRESULT
OnKillFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
243 LRESULT
OnCommand(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
244 LRESULT
OnNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
245 LRESULT
OnChangeNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
246 LRESULT
OnCustomItem(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
247 LRESULT
OnSettingChange(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
248 LRESULT
OnInitMenuPopup(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
250 static ATL::CWndClassInfo
& GetWndClassInfo()
252 static ATL::CWndClassInfo wc
=
254 { sizeof(WNDCLASSEX
), 0, StartWindowProc
,
256 LoadCursor(NULL
, IDC_ARROW
), (HBRUSH
)(COLOR_BACKGROUND
+ 1), NULL
, SV_CLASS_NAME
, NULL
258 NULL
, NULL
, IDC_ARROW
, TRUE
, 0, _T("")
263 virtual WNDPROC
GetWindowProc()
268 static LRESULT CALLBACK
WindowProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
273 // must hold a reference during message handling
274 pThis
= reinterpret_cast<CDefView
*>(hWnd
);
276 result
= CWindowImpl
<CDefView
, CWindow
, CControlWinTraits
>::WindowProc(hWnd
, uMsg
, wParam
, lParam
);
281 BEGIN_MSG_MAP(CDefView
)
282 MESSAGE_HANDLER(WM_SIZE
, OnSize
)
283 MESSAGE_HANDLER(WM_SETFOCUS
, OnSetFocus
)
284 MESSAGE_HANDLER(WM_KILLFOCUS
, OnKillFocus
)
285 MESSAGE_HANDLER(WM_CREATE
, OnCreate
)
286 MESSAGE_HANDLER(WM_ACTIVATE
, OnActivate
)
287 MESSAGE_HANDLER(WM_NOTIFY
, OnNotify
)
288 MESSAGE_HANDLER(WM_COMMAND
, OnCommand
)
289 MESSAGE_HANDLER(SHV_CHANGE_NOTIFY
, OnChangeNotify
)
290 MESSAGE_HANDLER(WM_CONTEXTMENU
, OnContextMenu
)
291 MESSAGE_HANDLER(WM_DRAWITEM
, OnCustomItem
)
292 MESSAGE_HANDLER(WM_MEASUREITEM
, OnCustomItem
)
293 MESSAGE_HANDLER(WM_SHOWWINDOW
, OnShowWindow
)
294 MESSAGE_HANDLER(WM_GETDLGCODE
, OnGetDlgCode
)
295 MESSAGE_HANDLER(WM_DESTROY
, OnDestroy
)
296 MESSAGE_HANDLER(WM_ERASEBKGND
, OnEraseBackground
)
297 MESSAGE_HANDLER(WM_SYSCOLORCHANGE
, OnSysColorChange
)
298 MESSAGE_HANDLER(CWM_GETISHELLBROWSER
, OnGetShellBrowser
)
299 MESSAGE_HANDLER(WM_SETTINGCHANGE
, OnSettingChange
)
300 MESSAGE_HANDLER(WM_INITMENUPOPUP
, OnInitMenuPopup
)
303 BEGIN_COM_MAP(CDefView
)
304 COM_INTERFACE_ENTRY_IID(IID_IOleWindow
, IOleWindow
)
305 COM_INTERFACE_ENTRY_IID(IID_IShellView
, IShellView
)
306 COM_INTERFACE_ENTRY_IID(IID_IFolderView
, IFolderView
)
307 COM_INTERFACE_ENTRY_IID(IID_IShellFolderView
, IShellFolderView
)
308 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget
, IOleCommandTarget
)
309 COM_INTERFACE_ENTRY_IID(IID_IDropTarget
, IDropTarget
)
310 COM_INTERFACE_ENTRY_IID(IID_IDropSource
, IDropSource
)
311 COM_INTERFACE_ENTRY_IID(IID_IViewObject
, IViewObject
)
312 COM_INTERFACE_ENTRY_IID(IID_IServiceProvider
, IServiceProvider
)
316 /* ListView Header ID's */
317 #define LISTVIEW_COLUMN_NAME 0
318 #define LISTVIEW_COLUMN_SIZE 1
319 #define LISTVIEW_COLUMN_TYPE 2
320 #define LISTVIEW_COLUMN_TIME 3
321 #define LISTVIEW_COLUMN_ATTRIB 4
324 #define IDM_VIEW_FILES (FCIDM_SHVIEWFIRST + 0x500)
325 #define IDM_VIEW_IDW (FCIDM_SHVIEWFIRST + 0x501)
326 #define IDM_MYFILEITEM (FCIDM_SHVIEWFIRST + 0x502)
328 #define ID_LISTVIEW 1
331 #define GET_WM_COMMAND_ID(wp, lp) LOWORD(wp)
332 #define GET_WM_COMMAND_HWND(wp, lp) (HWND)(lp)
333 #define GET_WM_COMMAND_CMD(wp, lp) HIWORD(wp)
336 Items merged into the toolbar and the filemenu
345 } MYTOOLINFO
, *LPMYTOOLINFO
;
347 static const MYTOOLINFO Tools
[] =
349 { FCIDM_SHVIEW_BIGICON
, 0, 0, IDS_VIEW_LARGE
, TBSTATE_ENABLED
, BTNS_BUTTON
},
350 { FCIDM_SHVIEW_SMALLICON
, 0, 0, IDS_VIEW_SMALL
, TBSTATE_ENABLED
, BTNS_BUTTON
},
351 { FCIDM_SHVIEW_LISTVIEW
, 0, 0, IDS_VIEW_LIST
, TBSTATE_ENABLED
, BTNS_BUTTON
},
352 { FCIDM_SHVIEW_REPORTVIEW
, 0, 0, IDS_VIEW_DETAILS
, TBSTATE_ENABLED
, BTNS_BUTTON
},
356 typedef void (CALLBACK
*PFNSHGETSETTINGSPROC
)(LPSHELLFLAGSTATE lpsfs
, DWORD dwMask
);
362 m_FolderSettings
.fFlags
= 0;
363 m_FolderSettings
.ViewMode
= 0;
365 m_menusLoaded
= FALSE
;
369 m_sortInfo
.bIsAscending
= FALSE
;
370 m_sortInfo
.nHeaderID
= 0;
371 m_sortInfo
.nLastHeaderID
= 0;
378 m_ptLastMousePos
.x
= 0;
379 m_ptLastMousePos
.y
= 0;
383 CDefView::~CDefView()
385 TRACE(" destroying IShellView(%p)\n", this);
390 HRESULT WINAPI
CDefView::Initialize(IShellFolder
*shellFolder
)
392 m_pSFParent
= shellFolder
;
393 shellFolder
->QueryInterface(IID_PPV_ARG(IShellFolder2
, &m_pSF2Parent
));
398 /**********************************************************
400 * ##### helperfunctions for communication with ICommDlgBrowser #####
402 HRESULT
CDefView::IncludeObject(LPCITEMIDLIST pidl
)
406 if (m_pCommDlgBrowser
.p
!= NULL
)
408 TRACE("ICommDlgBrowser::IncludeObject pidl=%p\n", pidl
);
409 ret
= m_pCommDlgBrowser
->IncludeObject((IShellView
*)this, pidl
);
410 TRACE("--0x%08x\n", ret
);
416 HRESULT
CDefView::OnDefaultCommand()
418 HRESULT ret
= S_FALSE
;
420 if (m_pCommDlgBrowser
.p
!= NULL
)
422 TRACE("ICommDlgBrowser::OnDefaultCommand\n");
423 ret
= m_pCommDlgBrowser
->OnDefaultCommand((IShellView
*)this);
424 TRACE("-- returns %08x\n", ret
);
430 HRESULT
CDefView::OnStateChange(UINT uFlags
)
432 HRESULT ret
= S_FALSE
;
434 if (m_pCommDlgBrowser
.p
!= NULL
)
436 TRACE("ICommDlgBrowser::OnStateChange flags=%x\n", uFlags
);
437 ret
= m_pCommDlgBrowser
->OnStateChange((IShellView
*)this, uFlags
);
443 /**********************************************************
444 * set the toolbar of the filedialog buttons
446 * - activates the buttons from the shellbrowser according to
449 void CDefView::CheckToolbar()
455 if (m_pCommDlgBrowser
!= NULL
)
457 m_pShellBrowser
->SendControlMsg(FCW_TOOLBAR
, TB_CHECKBUTTON
,
458 FCIDM_TB_SMALLICON
, (m_FolderSettings
.ViewMode
== FVM_LIST
) ? TRUE
: FALSE
, &result
);
459 m_pShellBrowser
->SendControlMsg(FCW_TOOLBAR
, TB_CHECKBUTTON
,
460 FCIDM_TB_REPORTVIEW
, (m_FolderSettings
.ViewMode
== FVM_DETAILS
) ? TRUE
: FALSE
, &result
);
461 m_pShellBrowser
->SendControlMsg(FCW_TOOLBAR
, TB_ENABLEBUTTON
,
462 FCIDM_TB_SMALLICON
, TRUE
, &result
);
463 m_pShellBrowser
->SendControlMsg(FCW_TOOLBAR
, TB_ENABLEBUTTON
,
464 FCIDM_TB_REPORTVIEW
, TRUE
, &result
);
468 /**********************************************************
470 * ##### helperfunctions for initializing the view #####
472 /**********************************************************
473 * change the style of the listview control
475 void CDefView::SetStyle(DWORD dwAdd
, DWORD dwRemove
)
479 TRACE("(%p)\n", this);
481 tmpstyle
= ::GetWindowLongPtrW(m_hWndList
, GWL_STYLE
);
482 ::SetWindowLongPtrW(m_hWndList
, GWL_STYLE
, dwAdd
| (tmpstyle
& ~dwRemove
));
485 /**********************************************************
486 * ShellView_CreateList()
488 * - creates the list view window
490 BOOL
CDefView::CreateList()
491 { DWORD dwStyle
, dwExStyle
;
495 dwStyle
= WS_TABSTOP
| WS_VISIBLE
| WS_CHILDWINDOW
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
|
496 LVS_SHAREIMAGELISTS
| LVS_EDITLABELS
| LVS_AUTOARRANGE
;
497 dwExStyle
= WS_EX_CLIENTEDGE
;
499 if (m_FolderSettings
.fFlags
& FWF_DESKTOP
)
500 dwStyle
|= LVS_ALIGNLEFT
;
502 dwStyle
|= LVS_ALIGNTOP
| LVS_SHOWSELALWAYS
;
504 switch (m_FolderSettings
.ViewMode
)
511 dwStyle
|= LVS_REPORT
;
515 dwStyle
|= LVS_SMALLICON
;
527 if (m_FolderSettings
.fFlags
& FWF_AUTOARRANGE
)
528 dwStyle
|= LVS_AUTOARRANGE
;
530 if (m_FolderSettings
.fFlags
& FWF_DESKTOP
)
531 m_FolderSettings
.fFlags
|= FWF_NOCLIENTEDGE
| FWF_NOSCROLL
;
533 if (m_FolderSettings
.fFlags
& FWF_SINGLESEL
)
534 dwStyle
|= LVS_SINGLESEL
;
536 if (m_FolderSettings
.fFlags
& FWF_NOCLIENTEDGE
)
537 dwExStyle
&= ~WS_EX_CLIENTEDGE
;
539 m_hWndList
= CreateWindowExW( dwExStyle
,
552 m_sortInfo
.bIsAscending
= TRUE
;
553 m_sortInfo
.nHeaderID
= -1;
554 m_sortInfo
.nLastHeaderID
= -1;
558 /* UpdateShellSettings(); */
562 void CDefView::UpdateListColors()
564 if (m_FolderSettings
.fFlags
& FWF_DESKTOP
)
566 /* Check if drop shadows option is enabled */
567 BOOL bDropShadow
= FALSE
;
568 DWORD cbDropShadow
= sizeof(bDropShadow
);
569 WCHAR wszBuf
[16] = L
"";
571 RegGetValueW(HKEY_CURRENT_USER
, L
"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced",
572 L
"ListviewShadow", RRF_RT_DWORD
, NULL
, &bDropShadow
, &cbDropShadow
);
573 if (bDropShadow
&& SystemParametersInfoW(SPI_GETDESKWALLPAPER
, _countof(wszBuf
), wszBuf
, 0) && wszBuf
[0])
575 SendMessageW(m_hWndList
, LVM_SETTEXTBKCOLOR
, 0, CLR_NONE
);
576 SendMessageW(m_hWndList
, LVM_SETBKCOLOR
, 0, CLR_NONE
);
577 SendMessageW(m_hWndList
, LVM_SETTEXTCOLOR
, 0, RGB(255, 255, 255));
578 SendMessageW(m_hWndList
, LVM_SETEXTENDEDLISTVIEWSTYLE
, LVS_EX_TRANSPARENTSHADOWTEXT
, LVS_EX_TRANSPARENTSHADOWTEXT
);
582 COLORREF crDesktop
= GetSysColor(COLOR_DESKTOP
);
583 SendMessageW(m_hWndList
, LVM_SETTEXTBKCOLOR
, 0, crDesktop
);
584 SendMessageW(m_hWndList
, LVM_SETBKCOLOR
, 0, crDesktop
);
585 if (GetRValue(crDesktop
) + GetGValue(crDesktop
) + GetBValue(crDesktop
) > 128 * 3)
586 SendMessageW(m_hWndList
, LVM_SETTEXTCOLOR
, 0, RGB(0, 0, 0));
588 SendMessageW(m_hWndList
, LVM_SETTEXTCOLOR
, 0, RGB(255, 255, 255));
589 SendMessageW(m_hWndList
, LVM_SETEXTENDEDLISTVIEWSTYLE
, LVS_EX_TRANSPARENTSHADOWTEXT
, 0);
594 /**********************************************************
595 * ShellView_InitList()
597 * - adds all needed columns to the shellview
599 BOOL
CDefView::InitList()
607 SendMessageW(m_hWndList
, LVM_DELETEALLITEMS
, 0, 0);
609 lvColumn
.mask
= LVCF_FMT
| LVCF_WIDTH
| LVCF_TEXT
;
610 lvColumn
.pszText
= szTemp
;
614 for (int i
= 0; 1; i
++)
616 if (FAILED(m_pSF2Parent
->GetDetailsOf(NULL
, i
, &sd
)))
619 lvColumn
.fmt
= sd
.fmt
;
620 lvColumn
.cx
= sd
.cxChar
* 8; /* chars->pixel */
621 StrRetToStrNW( szTemp
, 50, &sd
.str
, NULL
);
622 SendMessageW(m_hWndList
, LVM_INSERTCOLUMNW
, i
, (LPARAM
) &lvColumn
);
630 SendMessageW(m_hWndList
, LVM_SETIMAGELIST
, LVSIL_SMALL
, (LPARAM
)ShellSmallIconList
);
631 SendMessageW(m_hWndList
, LVM_SETIMAGELIST
, LVSIL_NORMAL
, (LPARAM
)ShellBigIconList
);
636 /**********************************************************
637 * ShellView_CompareItems()
640 * internal, CALLBACK for DSA_Sort
642 INT CALLBACK
CDefView::CompareItems(LPVOID lParam1
, LPVOID lParam2
, LPARAM lpData
)
645 TRACE("pidl1=%p pidl2=%p lpsf=%p\n", lParam1
, lParam2
, (LPVOID
) lpData
);
650 ret
= (SHORT
)SCODE_CODE(((IShellFolder
*)lpData
)->CompareIDs(0, (LPITEMIDLIST
)lParam1
, (LPITEMIDLIST
)lParam2
));
651 TRACE("ret=%i\n", ret
);
656 /*************************************************************************
657 * ShellView_ListViewCompareItems
659 * Compare Function for the Listview (FileOpen Dialog)
662 * lParam1 [I] the first ItemIdList to compare with
663 * lParam2 [I] the second ItemIdList to compare with
664 * lpData [I] The column ID for the header Ctrl to process
667 * A negative value if the first item should precede the second,
668 * a positive value if the first item should follow the second,
669 * or zero if the two items are equivalent
672 * FIXME: function does what ShellView_CompareItems is supposed to do.
673 * unify it and figure out how to use the undocumented first parameter
674 * of IShellFolder_CompareIDs to do the job this function does and
675 * move this code to IShellFolder.
676 * make LISTVIEW_SORT_INFO obsolete
677 * the way this function works is only usable if we had only
678 * filesystemfolders (25/10/99 jsch)
680 INT CALLBACK
CDefView::ListViewCompareItems(LPVOID lParam1
, LPVOID lParam2
, LPARAM lpData
)
684 char strName1
[MAX_PATH
], strName2
[MAX_PATH
];
685 BOOL bIsFolder1
, bIsFolder2
, bIsBothFolder
;
686 LPITEMIDLIST pItemIdList1
= (LPITEMIDLIST
) lParam1
;
687 LPITEMIDLIST pItemIdList2
= (LPITEMIDLIST
) lParam2
;
688 LISTVIEW_SORT_INFO
*pSortInfo
= (LPLISTVIEW_SORT_INFO
) lpData
;
691 bIsFolder1
= _ILIsFolder(pItemIdList1
);
692 bIsFolder2
= _ILIsFolder(pItemIdList2
);
693 bIsBothFolder
= bIsFolder1
&& bIsFolder2
;
695 /* When sorting between a File and a Folder, the Folder gets sorted first */
696 if ( (bIsFolder1
|| bIsFolder2
) && !bIsBothFolder
)
698 nDiff
= bIsFolder1
? -1 : 1;
702 /* Sort by Time: Folders or Files can be sorted */
704 if(pSortInfo
->nHeaderID
== LISTVIEW_COLUMN_TIME
)
706 _ILGetFileDateTime(pItemIdList1
, &fd1
);
707 _ILGetFileDateTime(pItemIdList2
, &fd2
);
708 nDiff
= CompareFileTime(&fd2
, &fd1
);
710 /* Sort by Attribute: Folder or Files can be sorted */
711 else if(pSortInfo
->nHeaderID
== LISTVIEW_COLUMN_ATTRIB
)
713 _ILGetFileAttributes(pItemIdList1
, strName1
, MAX_PATH
);
714 _ILGetFileAttributes(pItemIdList2
, strName2
, MAX_PATH
);
715 nDiff
= lstrcmpiA(strName1
, strName2
);
717 /* Sort by FileName: Folder or Files can be sorted */
718 else if (pSortInfo
->nHeaderID
== LISTVIEW_COLUMN_NAME
|| bIsBothFolder
)
721 _ILSimpleGetText(pItemIdList1
, strName1
, MAX_PATH
);
722 _ILSimpleGetText(pItemIdList2
, strName2
, MAX_PATH
);
723 nDiff
= lstrcmpiA(strName1
, strName2
);
725 /* Sort by File Size, Only valid for Files */
726 else if (pSortInfo
->nHeaderID
== LISTVIEW_COLUMN_SIZE
)
728 nDiff
= (INT
)(_ILGetFileSize(pItemIdList1
, NULL
, 0) - _ILGetFileSize(pItemIdList2
, NULL
, 0));
730 /* Sort by File Type, Only valid for Files */
731 else if (pSortInfo
->nHeaderID
== LISTVIEW_COLUMN_TYPE
)
734 _ILGetFileType(pItemIdList1
, strName1
, MAX_PATH
);
735 _ILGetFileType(pItemIdList2
, strName2
, MAX_PATH
);
736 nDiff
= lstrcmpiA(strName1
, strName2
);
739 /* If the Date, FileSize, FileType, Attrib was the same, sort by FileName */
743 _ILSimpleGetText(pItemIdList1
, strName1
, MAX_PATH
);
744 _ILSimpleGetText(pItemIdList2
, strName2
, MAX_PATH
);
745 nDiff
= lstrcmpiA(strName1
, strName2
);
748 if (!pSortInfo
->bIsAscending
)
756 /**********************************************************
757 * LV_FindItemByPidl()
759 int CDefView::LV_FindItemByPidl(LPCITEMIDLIST pidl
)
763 lvItem
.mask
= LVIF_PARAM
;
765 for (lvItem
.iItem
= 0;
766 SendMessageW(m_hWndList
, LVM_GETITEMW
, 0, (LPARAM
) &lvItem
);
769 LPITEMIDLIST currentpidl
= (LPITEMIDLIST
) lvItem
.lParam
;
770 HRESULT hr
= m_pSFParent
->CompareIDs(0, pidl
, currentpidl
);
772 if (SUCCEEDED(hr
) && !HRESULT_CODE(hr
))
780 /**********************************************************
783 BOOLEAN
CDefView::LV_AddItem(LPCITEMIDLIST pidl
)
787 TRACE("(%p)(pidl=%p)\n", this, pidl
);
789 lvItem
.mask
= LVIF_TEXT
| LVIF_IMAGE
| LVIF_PARAM
; /*set the mask*/
790 lvItem
.iItem
= ListView_GetItemCount(m_hWndList
); /*add the item to the end of the list*/
792 lvItem
.lParam
= (LPARAM
) ILClone(ILFindLastID(pidl
)); /*set the item's data*/
793 lvItem
.pszText
= LPSTR_TEXTCALLBACKW
; /*get text on a callback basis*/
794 lvItem
.iImage
= I_IMAGECALLBACK
; /*get the image on a callback basis*/
796 if (SendMessageW(m_hWndList
, LVM_INSERTITEMW
, 0, (LPARAM
)&lvItem
) == -1)
802 /**********************************************************
805 BOOLEAN
CDefView::LV_DeleteItem(LPCITEMIDLIST pidl
)
809 TRACE("(%p)(pidl=%p)\n", this, pidl
);
811 nIndex
= LV_FindItemByPidl(ILFindLastID(pidl
));
813 return (-1 == ListView_DeleteItem(m_hWndList
, nIndex
)) ? FALSE
: TRUE
;
816 /**********************************************************
819 BOOLEAN
CDefView::LV_RenameItem(LPCITEMIDLIST pidlOld
, LPCITEMIDLIST pidlNew
)
824 TRACE("(%p)(pidlold=%p pidlnew=%p)\n", this, pidlOld
, pidlNew
);
826 nItem
= LV_FindItemByPidl(ILFindLastID(pidlOld
));
830 lvItem
.mask
= LVIF_PARAM
; /* only the pidl */
831 lvItem
.iItem
= nItem
;
832 SendMessageW(m_hWndList
, LVM_GETITEMW
, 0, (LPARAM
) &lvItem
);
834 SHFree((LPITEMIDLIST
)lvItem
.lParam
);
835 lvItem
.mask
= LVIF_PARAM
|LVIF_IMAGE
;
836 lvItem
.iItem
= nItem
;
837 lvItem
.lParam
= (LPARAM
) ILClone(ILFindLastID(pidlNew
)); /* set the item's data */
838 lvItem
.iImage
= SHMapPIDLToSystemImageListIndex(m_pSFParent
, pidlNew
, 0);
839 SendMessageW(m_hWndList
, LVM_SETITEMW
, 0, (LPARAM
) &lvItem
);
840 SendMessageW(m_hWndList
, LVM_UPDATE
, nItem
, 0);
841 return TRUE
; /* FIXME: better handling */
847 /**********************************************************
848 * ShellView_FillList()
850 * - gets the objectlist from the shellfolder
852 * - fills the list into the view
854 INT CALLBACK
CDefView::fill_list( LPVOID ptr
, LPVOID arg
)
856 LPITEMIDLIST pidl
= (LPITEMIDLIST
)ptr
;
857 CDefView
*pThis
= static_cast<CDefView
*>(arg
);
858 /* in a commdlg This works as a filemask*/
859 if (pThis
->IncludeObject(pidl
) == S_OK
)
860 pThis
->LV_AddItem(pidl
);
866 HRESULT
CDefView::FillList()
868 LPENUMIDLIST pEnumIDList
;
876 /* get the itemlist from the shfolder*/
877 hRes
= m_pSFParent
->EnumObjects(m_hWnd
, SHCONTF_NONFOLDERS
| SHCONTF_FOLDERS
, &pEnumIDList
);
885 /* create a pointer array */
886 hdpa
= DPA_Create(16);
889 return(E_OUTOFMEMORY
);
892 /* copy the items into the array*/
893 while((S_OK
== pEnumIDList
->Next(1, &pidl
, &dwFetched
)) && dwFetched
)
895 if (DPA_InsertPtr(hdpa
, 0x7fff, pidl
) == -1)
902 DPA_Sort(hdpa
, CompareItems
, (LPARAM
)m_pSFParent
.p
);
904 /*turn the listview's redrawing off*/
905 SendMessageA(m_hWndList
, WM_SETREDRAW
, FALSE
, 0);
907 DPA_DestroyCallback( hdpa
, fill_list
, (void *)this);
909 /*turn the listview's redrawing back on and force it to draw*/
910 SendMessageA(m_hWndList
, WM_SETREDRAW
, TRUE
, 0);
912 pEnumIDList
->Release(); /* destroy the list*/
917 LRESULT
CDefView::OnShowWindow(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
919 ::UpdateWindow(m_hWndList
);
924 LRESULT
CDefView::OnGetDlgCode(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
926 return SendMessageW(m_hWndList
, uMsg
, 0, 0);
929 LRESULT
CDefView::OnDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
932 DestroyMenu(m_hMenu
);
933 RevokeDragDrop(m_hWnd
);
934 SHChangeNotifyDeregister(m_hNotify
);
939 LRESULT
CDefView::OnEraseBackground(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
941 if (m_FolderSettings
.fFlags
& (FWF_DESKTOP
| FWF_TRANSPARENT
))
942 return SendMessageW(GetParent(), WM_ERASEBKGND
, wParam
, lParam
); /* redirect to parent */
948 LRESULT
CDefView::OnSysColorChange(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
950 /* Update desktop labels color */
953 /* Forward WM_SYSCOLORCHANGE to common controls */
954 return SendMessageW(m_hWndList
, uMsg
, 0, 0);
957 LRESULT
CDefView::OnGetShellBrowser(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
959 return (LRESULT
)m_pShellBrowser
.p
;
962 /**********************************************************
963 * ShellView_OnCreate()
965 LRESULT
CDefView::OnCreate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
967 CComPtr
<IDropTarget
> pdt
;
968 SHChangeNotifyEntry ntreg
;
969 CComPtr
<IPersistFolder2
> ppf2
;
981 if (SUCCEEDED(QueryInterface(IID_PPV_ARG(IDropTarget
, &pdt
))))
983 if (FAILED(RegisterDragDrop(m_hWnd
, pdt
)))
984 ERR("Registering Drag Drop Failed");
987 /* register for receiving notifications */
988 m_pSFParent
->QueryInterface(IID_PPV_ARG(IPersistFolder2
, &ppf2
));
991 ppf2
->GetCurFolder((LPITEMIDLIST
*)&ntreg
.pidl
);
992 ntreg
.fRecursive
= TRUE
;
993 m_hNotify
= SHChangeNotifyRegister(m_hWnd
, SHCNF_IDLIST
, SHCNE_ALLEVENTS
, SHV_CHANGE_NOTIFY
, 1, &ntreg
);
994 SHFree((LPITEMIDLIST
)ntreg
.pidl
);
997 m_hAccel
= LoadAcceleratorsA(shell32_hInstance
, MAKEINTRESOURCEA( IDA_SHELLVIEW
));
1002 /**********************************************************
1003 * #### Handling of the menus ####
1006 HMENU
CDefView::BuildFileMenu()
1009 CComPtr
<IContextMenu
> cm
;
1013 LPCITEMIDLIST
* apidl
= (LPCITEMIDLIST
*)m_apidl
;
1015 hr
= m_pSFParent
->GetUIObjectOf(m_hWnd
, m_cidl
, apidl
, IID_NULL_PPV_ARG(IContextMenu
, &cm
));
1019 HMENU hmenu
= CreatePopupMenu();
1021 //FIXME: get proper numbers ?
1022 const UINT first
= 0x7800;
1023 const UINT last
= 0x7A00;
1024 hr
= cm
->QueryContextMenu(hmenu
, 0, first
, last
, 0);
1028 // TODO: filter or something
1033 void CDefView::PrepareShowFileMenu(HMENU hSubMenu
)
1035 TRACE("(%p)->(submenu=%p) stub\n", this, hSubMenu
);
1040 /* Cleanup the items added previously */
1041 for (int i
= 0; i
< GetMenuItemCount(hSubMenu
); )
1044 mii
.cbSize
= sizeof(mii
);
1045 mii
.fMask
= MIIM_ID
;
1046 GetMenuItemInfoW(hSubMenu
, i
, TRUE
, &mii
);
1048 if (mii
.wID
< 0x8000)
1050 DeleteMenu(hSubMenu
, i
, MF_BYPOSITION
);
1058 /* Insert This item at the beginning of the menu. */
1059 _InsertMenuItemW(hSubMenu
, 0, TRUE
, 0, MFT_SEPARATOR
, NULL
, MFS_ENABLED
);
1060 _InsertMenuItemW(hSubMenu
, 0, TRUE
, IDM_MYFILEITEM
+ 4, MFT_STRING
, L
"Properties", MFS_DISABLED
);
1061 _InsertMenuItemW(hSubMenu
, 0, TRUE
, IDM_MYFILEITEM
+ 3, MFT_STRING
, L
"Rename", MFS_DISABLED
);
1062 _InsertMenuItemW(hSubMenu
, 0, TRUE
, IDM_MYFILEITEM
+ 2, MFT_STRING
, L
"Delete", MFS_DISABLED
);
1063 _InsertMenuItemW(hSubMenu
, 0, TRUE
, IDM_MYFILEITEM
+ 1, MFT_STRING
, L
"Create Shortcut", MFS_DISABLED
);
1064 _InsertMenuItemW(hSubMenu
, 0, TRUE
, 0, MFT_SEPARATOR
, NULL
, MFS_ENABLED
);
1065 _InsertMenuItemW(hSubMenu
, 0, TRUE
, IDM_MYFILEITEM
, MFT_STRING
, L
"New", MFS_ENABLED
);
1067 HMENU menubase
= BuildFileMenu();
1070 int count
= ::GetMenuItemCount(menubase
);
1072 for (int i
= 0; i
< count
; i
++)
1076 MENUITEMINFOW mii
= { 0 };
1077 mii
.cbSize
= sizeof(mii
);
1078 mii
.fMask
= MIIM_STATE
| MIIM_ID
| MIIM_SUBMENU
| MIIM_CHECKMARKS
| MIIM_DATA
| MIIM_STRING
| MIIM_BITMAP
| MIIM_FTYPE
;
1079 mii
.dwTypeData
= label
;
1080 mii
.cch
= _countof(label
);
1081 ::GetMenuItemInfoW(menubase
, i
, TRUE
, &mii
);
1083 TRACE("Adding item %d label %S type %d\n", mii
.wID
, mii
.dwTypeData
, mii
.fType
);
1085 mii
.fType
|= MFT_RADIOCHECK
;
1087 ::InsertMenuItemW(hSubMenu
, IDM_MYFILEITEM
, FALSE
, &mii
);
1090 _InsertMenuItemW(hSubMenu
, IDM_MYFILEITEM
, FALSE
, 0, MFT_SEPARATOR
, NULL
, MFS_ENABLED
);
1092 ::DestroyMenu(menubase
);
1097 void CDefView::PrepareShowViewMenu(HMENU hSubMenu
)
1099 TRACE("(%p)->(submenu=%p)\n", this, hSubMenu
);
1104 if (m_FolderSettings
.ViewMode
>= FVM_FIRST
&& m_FolderSettings
.ViewMode
<= FVM_LAST
)
1106 UINT iItemFirst
= FCIDM_SHVIEW_BIGICON
;
1107 UINT iItemLast
= iItemFirst
+ FVM_LAST
- FVM_FIRST
;
1108 UINT iItem
= iItemFirst
+ m_FolderSettings
.ViewMode
- FVM_FIRST
;
1109 CheckMenuRadioItem(hSubMenu
, iItemFirst
, iItemLast
, iItem
, MF_BYCOMMAND
);
1113 /**********************************************************
1114 * ShellView_GetSelections()
1116 * - fills the m_apidl list with the selected objects
1119 * number of selected items
1121 UINT
CDefView::GetSelections()
1128 m_cidl
= ListView_GetSelectedCount(m_hWndList
);
1129 m_apidl
= (LPITEMIDLIST
*)SHAlloc(m_cidl
* sizeof(LPITEMIDLIST
));
1131 TRACE("selected=%i\n", m_cidl
);
1135 TRACE("-- Items selected =%u\n", m_cidl
);
1137 lvItem
.mask
= LVIF_STATE
| LVIF_PARAM
;
1138 lvItem
.stateMask
= LVIS_SELECTED
;
1140 lvItem
.iSubItem
= 0;
1143 while(SendMessageW(m_hWndList
, LVM_GETITEMW
, 0, (LPARAM
)&lvItem
) && (i
< m_cidl
))
1145 if(lvItem
.state
& LVIS_SELECTED
)
1147 m_apidl
[i
] = (LPITEMIDLIST
)lvItem
.lParam
;
1151 TRACE("-- selected Item found\n");
1160 /**********************************************************
1161 * ShellView_OpenSelectedItems()
1163 HRESULT
CDefView::OpenSelectedItems()
1166 CMINVOKECOMMANDINFO cmi
;
1170 m_cidl
= ListView_GetSelectedCount(m_hWndList
);
1174 hResult
= OnDefaultCommand();
1175 if (hResult
== S_OK
)
1178 hMenu
= CreatePopupMenu();
1182 hResult
= GetItemObject( SVGIO_SELECTION
, IID_PPV_ARG(IContextMenu
, &m_pCM
));
1183 if (FAILED(hResult
))
1186 hResult
= IUnknown_SetSite(m_pCM
, (IShellView
*)this);
1187 //if (FAILED( hResult))
1190 hResult
= m_pCM
->QueryContextMenu(hMenu
, 0, 0x20, 0x7fff, CMF_DEFAULTONLY
);
1191 if (FAILED(hResult
))
1194 uCommand
= GetMenuDefaultItem(hMenu
, FALSE
, 0);
1195 if (uCommand
== (UINT
)-1)
1201 ZeroMemory(&cmi
, sizeof(cmi
));
1202 cmi
.cbSize
= sizeof(cmi
);
1203 cmi
.lpVerb
= (LPCSTR
)MAKEINTRESOURCEA(uCommand
);
1206 hResult
= m_pCM
->InvokeCommand(&cmi
);
1215 IUnknown_SetSite(m_pCM
, NULL
);
1222 /**********************************************************
1223 * ShellView_DoContextMenu()
1225 LRESULT
CDefView::OnContextMenu(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1231 CMINVOKECOMMANDINFO cmi
;
1234 // for some reason I haven't figured out, we sometimes recurse into this method
1241 TRACE("(%p)->(0x%08x 0x%08x) stub\n", this, x
, y
);
1243 hMenu
= CreatePopupMenu();
1247 m_cidl
= ListView_GetSelectedCount(m_hWndList
);
1249 hResult
= GetItemObject( m_cidl
? SVGIO_SELECTION
: SVGIO_BACKGROUND
, IID_PPV_ARG(IContextMenu
, &m_pCM
));
1250 if (FAILED( hResult
))
1253 hResult
= IUnknown_SetSite(m_pCM
, (IShellView
*)this);
1254 //if (FAILED( hResult))
1257 hResult
= m_pCM
->QueryContextMenu(hMenu
, 0, FCIDM_SHVIEWFIRST
, FCIDM_SHVIEWLAST
, CMF_NORMAL
);
1258 if (FAILED( hResult
))
1261 if (m_FolderSettings
.fFlags
& FWF_DESKTOP
)
1262 SetMenuDefaultItem(hMenu
, FCIDM_SHVIEW_OPEN
, MF_BYCOMMAND
);
1264 uCommand
= TrackPopupMenu(hMenu
,
1265 TPM_LEFTALIGN
| TPM_RETURNCMD
| TPM_LEFTBUTTON
| TPM_RIGHTBUTTON
,
1266 x
, y
, 0, m_hWnd
, NULL
);
1270 if (uCommand
== FCIDM_SHVIEW_OPEN
&& OnDefaultCommand() == S_OK
)
1273 ZeroMemory(&cmi
, sizeof(cmi
));
1274 cmi
.cbSize
= sizeof(cmi
);
1275 cmi
.lpVerb
= (LPCSTR
)MAKEINTRESOURCEA(uCommand
);
1277 m_pCM
->InvokeCommand(&cmi
);
1283 IUnknown_SetSite(m_pCM
, NULL
);
1293 LRESULT
CDefView::OnExplorerCommand(UINT uCommand
, BOOL bUseSelection
)
1296 CMINVOKECOMMANDINFO cmi
;
1299 hMenu
= CreatePopupMenu();
1303 hResult
= GetItemObject( bUseSelection
? SVGIO_SELECTION
: SVGIO_BACKGROUND
, IID_PPV_ARG(IContextMenu
, &m_pCM
));
1304 if (FAILED( hResult
))
1307 hResult
= IUnknown_SetSite(m_pCM
, (IShellView
*)this);
1308 //if (FAILED( hResult))
1311 hResult
= m_pCM
->QueryContextMenu(hMenu
, 0, FCIDM_SHVIEWFIRST
, FCIDM_SHVIEWLAST
, CMF_NORMAL
);
1312 if (FAILED( hResult
))
1315 ZeroMemory(&cmi
, sizeof(cmi
));
1316 cmi
.cbSize
= sizeof(cmi
);
1317 cmi
.lpVerb
= (LPCSTR
)MAKEINTRESOURCEA(uCommand
);
1319 m_pCM
->InvokeCommand(&cmi
);
1325 IUnknown_SetSite(m_pCM
, NULL
);
1335 /**********************************************************
1336 * ##### message handling #####
1339 /**********************************************************
1340 * ShellView_OnSize()
1342 LRESULT
CDefView::OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1347 wWidth
= LOWORD(lParam
);
1348 wHeight
= HIWORD(lParam
);
1350 TRACE("%p width=%u height=%u\n", this, wWidth
, wHeight
);
1352 /*resize the ListView to fit our window*/
1355 ::MoveWindow(m_hWndList
, 0, 0, wWidth
, wHeight
, TRUE
);
1361 /**********************************************************
1362 * ShellView_OnDeactivate()
1367 void CDefView::OnDeactivate()
1369 TRACE("%p\n", this);
1371 if (m_uState
!= SVUIA_DEACTIVATE
)
1373 // TODO: cleanup menu after deactivation
1375 m_uState
= SVUIA_DEACTIVATE
;
1379 void CDefView::DoActivate(UINT uState
)
1381 TRACE("%p uState=%x\n", this, uState
);
1383 /*don't do anything if the state isn't really changing */
1384 if (m_uState
== uState
)
1389 if (uState
== SVUIA_DEACTIVATE
)
1399 MENUITEMINFOW mii
= { 0 };
1401 /* initialize EDIT menu */
1402 mii
.cbSize
= sizeof(mii
);
1403 mii
.fMask
= MIIM_SUBMENU
;
1404 if (::GetMenuItemInfoW(m_hMenu
, FCIDM_MENU_EDIT
, FALSE
, &mii
))
1406 HMENU hSubMenu
= mii
.hSubMenu
;
1408 HMENU menubase
= ::LoadMenuW(shell32_hInstance
, L
"MENU_003");
1410 int count
= ::GetMenuItemCount(menubase
);
1411 for (int i
= 0; i
< count
; i
++)
1415 ZeroMemory(&mii
, sizeof(mii
));
1416 mii
.cbSize
= sizeof(mii
);
1417 mii
.fMask
= MIIM_STATE
| MIIM_ID
| MIIM_SUBMENU
| MIIM_CHECKMARKS
| MIIM_DATA
| MIIM_STRING
| MIIM_BITMAP
| MIIM_FTYPE
;
1418 mii
.dwTypeData
= label
;
1419 mii
.cch
= _countof(label
);
1420 ::GetMenuItemInfoW(menubase
, i
, TRUE
, &mii
);
1422 TRACE("Adding item %d label %S type %d\n", mii
.wID
, mii
.dwTypeData
, mii
.fType
);
1424 mii
.fType
|= MFT_RADIOCHECK
;
1426 ::InsertMenuItemW(hSubMenu
, FCIDM_MENU_VIEW_SEP_OPTIONS
, FALSE
, &mii
);
1429 ::DestroyMenu(menubase
);
1432 /* initialize VIEW menu */
1433 mii
.cbSize
= sizeof(mii
);
1434 mii
.fMask
= MIIM_SUBMENU
;
1435 if (::GetMenuItemInfoW(m_hMenu
, FCIDM_MENU_VIEW
, FALSE
, &mii
))
1437 HMENU menubase
= ::LoadMenuW(shell32_hInstance
, L
"MENU_001");
1439 HMENU hSubMenu
= mii
.hSubMenu
;
1441 _InsertMenuItemW(hSubMenu
, FCIDM_MENU_VIEW_SEP_OPTIONS
, FALSE
, 0, MFT_SEPARATOR
, NULL
, MFS_ENABLED
);
1443 int count
= ::GetMenuItemCount(menubase
);
1444 for (int i
= 0; i
< count
; i
++)
1448 ZeroMemory(&mii
, sizeof(mii
));
1449 mii
.cbSize
= sizeof(mii
);
1450 mii
.fMask
= MIIM_STATE
| MIIM_ID
| MIIM_SUBMENU
| MIIM_CHECKMARKS
| MIIM_DATA
| MIIM_STRING
| MIIM_BITMAP
| MIIM_FTYPE
;
1451 mii
.dwTypeData
= label
;
1452 mii
.cch
= _countof(label
);
1453 ::GetMenuItemInfoW(menubase
, i
, TRUE
, &mii
);
1455 TRACE("Adding item %d label %S type %d\n", mii
.wID
, mii
.dwTypeData
, mii
.fType
);
1457 mii
.fType
|= MFT_RADIOCHECK
;
1459 ::InsertMenuItemW(hSubMenu
, FCIDM_MENU_VIEW_SEP_OPTIONS
, FALSE
, &mii
);
1462 ::DestroyMenu(menubase
);
1466 TRACE("-- before fnSetMenuSB\n");
1467 m_pShellBrowser
->SetMenuSB(m_hMenu
, 0, m_hWnd
);
1469 m_menusLoaded
= TRUE
;
1473 if (SVUIA_ACTIVATE_FOCUS
== uState
)
1475 ::SetFocus(m_hWndList
);
1483 /**********************************************************
1484 * ShellView_OnActivate()
1486 LRESULT
CDefView::OnActivate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1488 DoActivate(SVUIA_ACTIVATE_FOCUS
);
1492 /**********************************************************
1493 * ShellView_OnSetFocus()
1496 LRESULT
CDefView::OnSetFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1498 TRACE("%p\n", this);
1500 /* Tell the browser one of our windows has received the focus. This
1501 should always be done before merging menus (OnActivate merges the
1502 menus) if one of our windows has the focus.*/
1504 m_pShellBrowser
->OnViewWindowActive((IShellView
*)this);
1505 DoActivate(SVUIA_ACTIVATE_FOCUS
);
1507 /* Set the focus to the listview */
1508 ::SetFocus(m_hWndList
);
1510 /* Notify the ICommDlgBrowser interface */
1511 OnStateChange(CDBOSC_SETFOCUS
);
1516 /**********************************************************
1517 * ShellView_OnKillFocus()
1519 LRESULT
CDefView::OnKillFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1521 TRACE("(%p) stub\n", this);
1523 DoActivate(SVUIA_ACTIVATE_NOFOCUS
);
1524 /* Notify the ICommDlgBrowser */
1525 OnStateChange(CDBOSC_KILLFOCUS
);
1530 /**********************************************************
1531 * ShellView_OnCommand()
1534 * the CmdID's are the ones from the context menu
1536 LRESULT
CDefView::OnCommand(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1542 dwCmdID
= GET_WM_COMMAND_ID(wParam
, lParam
);
1543 dwCmd
= GET_WM_COMMAND_CMD(wParam
, lParam
);
1544 hwndCmd
= GET_WM_COMMAND_HWND(wParam
, lParam
);
1546 TRACE("(%p)->(0x%08x 0x%08x %p) stub\n", this, dwCmdID
, dwCmd
, hwndCmd
);
1550 case FCIDM_SHVIEW_SMALLICON
:
1551 m_FolderSettings
.ViewMode
= FVM_SMALLICON
;
1552 SetStyle (LVS_SMALLICON
, LVS_TYPEMASK
);
1556 case FCIDM_SHVIEW_BIGICON
:
1557 m_FolderSettings
.ViewMode
= FVM_ICON
;
1558 SetStyle (LVS_ICON
, LVS_TYPEMASK
);
1562 case FCIDM_SHVIEW_LISTVIEW
:
1563 m_FolderSettings
.ViewMode
= FVM_LIST
;
1564 SetStyle (LVS_LIST
, LVS_TYPEMASK
);
1568 case FCIDM_SHVIEW_REPORTVIEW
:
1569 m_FolderSettings
.ViewMode
= FVM_DETAILS
;
1570 SetStyle (LVS_REPORT
, LVS_TYPEMASK
);
1574 /* the menu-ID's for sorting are 0x30... see shrec.rc */
1579 m_sortInfo
.nHeaderID
= (LPARAM
) (dwCmdID
- 0x30);
1580 m_sortInfo
.bIsAscending
= TRUE
;
1581 m_sortInfo
.nLastHeaderID
= m_sortInfo
.nHeaderID
;
1582 SendMessageA(m_hWndList
, LVM_SORTITEMS
, (WPARAM
) &m_sortInfo
, (LPARAM
)ListViewCompareItems
);
1585 case FCIDM_SHVIEW_REFRESH
:
1589 case FCIDM_SHVIEW_DELETE
:
1590 case FCIDM_SHVIEW_CUT
:
1591 case FCIDM_SHVIEW_COPY
:
1592 case FCIDM_SHVIEW_RENAME
:
1593 return OnExplorerCommand(dwCmdID
, TRUE
);
1595 case FCIDM_SHVIEW_INSERT
:
1596 case FCIDM_SHVIEW_UNDO
:
1597 case FCIDM_SHVIEW_INSERTLINK
:
1598 case FCIDM_SHVIEW_NEWFOLDER
:
1599 return OnExplorerCommand(dwCmdID
, FALSE
);
1601 TRACE("-- COMMAND 0x%04x unhandled\n", dwCmdID
);
1607 /**********************************************************
1608 * ShellView_OnNotify()
1611 LRESULT
CDefView::OnNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1615 LPNMLISTVIEW lpnmlv
;
1616 NMLVDISPINFOW
*lpdi
;
1621 lpnmh
= (LPNMHDR
)lParam
;
1622 lpnmlv
= (LPNMLISTVIEW
)lpnmh
;
1623 lpdi
= (NMLVDISPINFOW
*)lpnmh
;
1625 TRACE("%p CtlID=%u lpnmh->code=%x\n", this, CtlID
, lpnmh
->code
);
1627 switch (lpnmh
->code
)
1630 TRACE("-- NM_SETFOCUS %p\n", this);
1631 OnSetFocus(0, 0, 0, unused
);
1635 TRACE("-- NM_KILLFOCUS %p\n", this);
1637 /* Notify the ICommDlgBrowser interface */
1638 OnStateChange(CDBOSC_KILLFOCUS
);
1642 TRACE("-- NM_CUSTOMDRAW %p\n", this);
1643 return CDRF_DODEFAULT
;
1645 case NM_RELEASEDCAPTURE
:
1646 TRACE("-- NM_RELEASEDCAPTURE %p\n", this);
1650 TRACE("-- NM_CLICK %p\n", this);
1654 TRACE("-- NM_RCLICK %p\n", this);
1658 TRACE("-- NM_DBLCLK %p\n", this);
1659 OpenSelectedItems();
1663 TRACE("-- NM_RETURN %p\n", this);
1664 OpenSelectedItems();
1668 TRACE("-- HDN_ENDTRACKW %p\n", this);
1669 /*nColumn1 = ListView_GetColumnWidth(m_hWndList, 0);
1670 nColumn2 = ListView_GetColumnWidth(m_hWndList, 1);*/
1673 case LVN_DELETEITEM
:
1674 TRACE("-- LVN_DELETEITEM %p\n", this);
1675 SHFree((LPITEMIDLIST
)lpnmlv
->lParam
); /*delete the pidl because we made a copy of it*/
1678 case LVN_DELETEALLITEMS
:
1679 TRACE("-- LVN_DELETEALLITEMS %p\n", this);
1682 case LVN_INSERTITEM
:
1683 TRACE("-- LVN_INSERTITEM (STUB)%p\n", this);
1686 case LVN_ITEMACTIVATE
:
1687 TRACE("-- LVN_ITEMACTIVATE %p\n", this);
1688 OnStateChange(CDBOSC_SELCHANGE
); /* the browser will get the IDataObject now */
1691 case LVN_COLUMNCLICK
:
1692 m_sortInfo
.nHeaderID
= lpnmlv
->iSubItem
;
1693 if (m_sortInfo
.nLastHeaderID
== m_sortInfo
.nHeaderID
)
1695 m_sortInfo
.bIsAscending
= !m_sortInfo
.bIsAscending
;
1699 m_sortInfo
.bIsAscending
= TRUE
;
1701 m_sortInfo
.nLastHeaderID
= m_sortInfo
.nHeaderID
;
1703 SendMessageW(lpnmlv
->hdr
.hwndFrom
, LVM_SORTITEMS
, (WPARAM
) &m_sortInfo
, (LPARAM
)ListViewCompareItems
);
1706 case LVN_GETDISPINFOA
:
1707 case LVN_GETDISPINFOW
:
1708 TRACE("-- LVN_GETDISPINFO %p\n", this);
1709 pidl
= (LPITEMIDLIST
)lpdi
->item
.lParam
;
1711 if (lpdi
->item
.mask
& LVIF_TEXT
) /* text requested */
1716 if (FAILED(m_pSF2Parent
->GetDetailsOf(pidl
, lpdi
->item
.iSubItem
, &sd
)))
1718 FIXME("failed to get details\n");
1722 if (lpnmh
->code
== LVN_GETDISPINFOA
)
1724 /* shouldn't happen */
1725 NMLVDISPINFOA
*lpdiA
= (NMLVDISPINFOA
*)lpnmh
;
1726 StrRetToStrNA( lpdiA
->item
.pszText
, lpdiA
->item
.cchTextMax
, &sd
.str
, NULL
);
1727 TRACE("-- text=%s\n", lpdiA
->item
.pszText
);
1729 else /* LVN_GETDISPINFOW */
1731 StrRetToStrNW( lpdi
->item
.pszText
, lpdi
->item
.cchTextMax
, &sd
.str
, NULL
);
1732 TRACE("-- text=%s\n", debugstr_w(lpdi
->item
.pszText
));
1740 if(lpdi
->item
.mask
& LVIF_IMAGE
) /* image requested */
1742 lpdi
->item
.iImage
= SHMapPIDLToSystemImageListIndex(m_pSFParent
, pidl
, 0);
1744 lpdi
->item
.mask
|= LVIF_DI_SETITEM
;
1747 case LVN_ITEMCHANGED
:
1748 TRACE("-- LVN_ITEMCHANGED %p\n", this);
1749 OnStateChange(CDBOSC_SELCHANGE
); /* the browser will get the IDataObject now */
1753 case LVN_BEGINRDRAG
:
1754 TRACE("-- LVN_BEGINDRAG\n");
1756 if (GetSelections())
1758 CComPtr
<IDataObject
> pda
;
1759 DWORD dwAttributes
= SFGAO_CANLINK
;
1760 DWORD dwEffect
= DROPEFFECT_COPY
| DROPEFFECT_MOVE
;
1762 if (SUCCEEDED(m_pSFParent
->GetUIObjectOf(m_hWnd
, m_cidl
, (LPCITEMIDLIST
*)m_apidl
, IID_NULL_PPV_ARG(IDataObject
, &pda
))))
1764 CComPtr
<IDropSource
> pds
= static_cast<IDropSource
*>(this); /* own DropSource interface */
1766 if (SUCCEEDED(m_pSFParent
->GetAttributesOf(m_cidl
, (LPCITEMIDLIST
*)m_apidl
, &dwAttributes
)))
1768 if (dwAttributes
& SFGAO_CANLINK
)
1770 dwEffect
|= DROPEFFECT_LINK
;
1774 CComPtr
<IAsyncOperation
> piaso
;
1775 if (SUCCEEDED(pda
->QueryInterface(IID_PPV_ARG(IAsyncOperation
, &piaso
))))
1777 piaso
->SetAsyncMode(TRUE
);
1782 DoDragDrop(pda
, pds
, dwEffect
, &dwEffect2
);
1788 case LVN_BEGINLABELEDITW
:
1790 DWORD dwAttr
= SFGAO_CANRENAME
;
1791 pidl
= (LPITEMIDLIST
)lpdi
->item
.lParam
;
1793 TRACE("-- LVN_BEGINLABELEDITW %p\n", this);
1795 m_pSFParent
->GetAttributesOf(1, (LPCITEMIDLIST
*)&pidl
, &dwAttr
);
1796 if (SFGAO_CANRENAME
& dwAttr
)
1804 case LVN_ENDLABELEDITW
:
1806 TRACE("-- LVN_ENDLABELEDITW %p\n", this);
1808 m_isEditing
= FALSE
;
1810 if (lpdi
->item
.pszText
)
1815 lvItem
.iItem
= lpdi
->item
.iItem
;
1816 lvItem
.iSubItem
= 0;
1817 lvItem
.mask
= LVIF_PARAM
;
1818 SendMessageW(m_hWndList
, LVM_GETITEMW
, 0, (LPARAM
) &lvItem
);
1820 pidl
= (LPITEMIDLIST
)lpdi
->item
.lParam
;
1821 hr
= m_pSFParent
->SetNameOf(0, pidl
, lpdi
->item
.pszText
, SHGDN_INFOLDER
, &pidl
);
1823 if (SUCCEEDED(hr
) && pidl
)
1825 lvItem
.mask
= LVIF_PARAM
|LVIF_IMAGE
;
1826 lvItem
.lParam
= (LPARAM
)pidl
;
1827 lvItem
.iImage
= SHMapPIDLToSystemImageListIndex(m_pSFParent
, pidl
, 0);
1828 SendMessageW(m_hWndList
, LVM_SETITEMW
, 0, (LPARAM
) &lvItem
);
1829 SendMessageW(m_hWndList
, LVM_UPDATE
, lpdi
->item
.iItem
, 0);
1839 TRACE("-- %p WM_COMMAND %x unhandled\n", this, lpnmh
->code
);
1846 /**********************************************************
1847 * ShellView_OnChange()
1849 LRESULT
CDefView::OnChangeNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1851 LPITEMIDLIST
*Pidls
;
1853 Pidls
= (LPITEMIDLIST
*)wParam
;
1855 TRACE("(%p)(%p,%p,0x%08x)\n", this, Pidls
[0], Pidls
[1], lParam
);
1861 LV_AddItem(Pidls
[0]);
1866 LV_DeleteItem(Pidls
[0]);
1869 case SHCNE_RENAMEFOLDER
:
1870 case SHCNE_RENAMEITEM
:
1871 LV_RenameItem(Pidls
[0], Pidls
[1]);
1874 case SHCNE_UPDATEITEM
:
1875 LV_RenameItem(Pidls
[0], Pidls
[0]);
1878 case SHCNE_UPDATEDIR
:
1885 /**********************************************************
1886 * CDefView::OnCustomItem
1888 LRESULT
CDefView::OnCustomItem(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1893 ERR("no menu!!!\n");
1897 CComPtr
<IContextMenu2
> pCM2
;
1898 HRESULT hres
= m_pCM
.p
->QueryInterface(IID_PPV_ARG(IContextMenu2
, &pCM2
));
1902 if (pCM2
.p
->HandleMenuMsg(uMsg
, (WPARAM
)m_hWnd
, lParam
) == S_OK
)
1908 LRESULT
CDefView::OnSettingChange(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1910 /* Wallpaper setting affects drop shadows effect */
1911 if (wParam
== SPI_SETDESKWALLPAPER
|| wParam
== 0)
1917 /**********************************************************
1918 * CDefView::OnInitMenuPopup
1920 LRESULT
CDefView::OnInitMenuPopup(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1922 MENUITEMINFOW mii
= { 0 };
1923 HMENU hSubmenu
= (HMENU
) wParam
;
1925 DbgPrint("OnInitMenuPopup lParam=%d\n", lParam
);
1927 mii
.cbSize
= sizeof(mii
);
1928 mii
.fMask
= MIIM_ID
| MIIM_SUBMENU
;
1930 if (!GetMenuItemInfoW(this->m_hMenu
, lParam
, TRUE
, &mii
))
1932 DbgPrint("OnInitMenuPopup GetMenuItemInfoW failed!\n");
1936 UINT menuItemId
= mii
.wID
;
1938 if (mii
.hSubMenu
!= hSubmenu
)
1940 DbgPrint("OnInitMenuPopup submenu does not match!!!!\n");
1944 DbgPrint("OnInitMenuPopup id=%d\n", menuItemId
);
1948 case FCIDM_MENU_FILE
:
1949 PrepareShowFileMenu(hSubmenu
);
1951 case FCIDM_MENU_EDIT
:
1952 //PrepareShowEditMenu(hSubmenu);
1954 case FCIDM_MENU_VIEW
:
1955 PrepareShowViewMenu(hSubmenu
);
1962 /**********************************************************
1965 * The INTERFACE of the IShellView object
1968 **********************************************************
1971 /**********************************************************
1972 * ShellView_GetWindow
1974 HRESULT WINAPI
CDefView::GetWindow(HWND
*phWnd
)
1976 TRACE("(%p)\n", this);
1983 HRESULT WINAPI
CDefView::ContextSensitiveHelp(BOOL fEnterMode
)
1985 FIXME("(%p) stub\n", this);
1990 /**********************************************************
1991 * IShellView_TranslateAccelerator
1994 * use the accel functions
1996 HRESULT WINAPI
CDefView::TranslateAccelerator(LPMSG lpmsg
)
2001 if (lpmsg
->message
>= WM_KEYFIRST
&& lpmsg
->message
<= WM_KEYLAST
)
2003 if (::TranslateAcceleratorW(m_hWnd
, m_hAccel
, lpmsg
) != 0)
2006 TRACE("-- key=0x04%lx\n", lpmsg
->wParam
) ;
2009 return m_pShellBrowser
->TranslateAcceleratorSB(lpmsg
, 0);
2012 HRESULT WINAPI
CDefView::EnableModeless(BOOL fEnable
)
2014 FIXME("(%p) stub\n", this);
2019 HRESULT WINAPI
CDefView::UIActivate(UINT uState
)
2022 CHAR szName[MAX_PATH];
2025 int nPartArray
[1] = { -1};
2027 TRACE("(%p)->(state=%x) stub\n", this, uState
);
2029 /*don't do anything if the state isn't really changing*/
2030 if (m_uState
== uState
)
2035 /*OnActivate handles the menu merging and internal state*/
2038 /*only do This if we are active*/
2039 if (uState
!= SVUIA_DEACTIVATE
)
2043 GetFolderPath is not a method of IShellFolder
2044 IShellFolder_GetFolderPath( m_pSFParent, szName, sizeof(szName) );
2046 /* set the number of parts */
2047 m_pShellBrowser
->SendControlMsg(FCW_STATUS
, SB_SETPARTS
, 1, (LPARAM
)nPartArray
, &lResult
);
2049 /* set the text for the parts */
2051 m_pShellBrowser->SendControlMsg(FCW_STATUS, SB_SETTEXTA, 0, (LPARAM)szName, &lResult);
2058 HRESULT WINAPI
CDefView::Refresh()
2060 TRACE("(%p)\n", this);
2062 SendMessageW(m_hWndList
, LVM_DELETEALLITEMS
, 0, 0);
2068 HRESULT WINAPI
CDefView::CreateViewWindow(IShellView
*lpPrevView
, LPCFOLDERSETTINGS lpfs
, IShellBrowser
*psb
, RECT
*prcView
, HWND
*phWnd
)
2070 OLEMENUGROUPWIDTHS omw
= { { 0, 0, 0, 0, 0, 0 } };
2074 TRACE("(%p)->(shlview=%p set=%p shlbrs=%p rec=%p hwnd=%p) incomplete\n", this, lpPrevView
, lpfs
, psb
, prcView
, phWnd
);
2077 TRACE("-- vmode=%x flags=%x\n", lpfs
->ViewMode
, lpfs
->fFlags
);
2078 if (prcView
!= NULL
)
2079 TRACE("-- left=%i top=%i right=%i bottom=%i\n", prcView
->left
, prcView
->top
, prcView
->right
, prcView
->bottom
);
2081 /* Validate the Shell Browser */
2083 return E_UNEXPECTED
;
2085 /*set up the member variables*/
2086 m_pShellBrowser
= psb
;
2087 m_FolderSettings
= *lpfs
;
2089 /*get our parent window*/
2090 m_pShellBrowser
->GetWindow(&m_hWndParent
);
2092 /* try to get the ICommDlgBrowserInterface, adds a reference !!! */
2093 m_pCommDlgBrowser
= NULL
;
2094 if (SUCCEEDED(m_pShellBrowser
->QueryInterface(IID_PPV_ARG(ICommDlgBrowser
, &m_pCommDlgBrowser
))))
2096 TRACE("-- CommDlgBrowser\n");
2099 Create(m_hWndParent
, prcView
, NULL
, WS_CHILD
| WS_TABSTOP
, 0, 0U);
2110 SetWindowPos(HWND_TOP
, 0, 0, 0, 0, SWP_NOMOVE
| SWP_NOSIZE
| SWP_SHOWWINDOW
);
2115 m_hMenu
= CreateMenu();
2116 m_pShellBrowser
->InsertMenusSB(m_hMenu
, &omw
);
2117 TRACE("-- after fnInsertMenusSB\n");
2123 HRESULT WINAPI
CDefView::DestroyViewWindow()
2125 TRACE("(%p)\n", this);
2127 /*Make absolutely sure all our UI is cleaned up.*/
2128 UIActivate(SVUIA_DEACTIVATE
);
2132 DestroyMenu(m_hMenu
);
2136 m_pShellBrowser
.Release();
2137 m_pCommDlgBrowser
.Release();
2142 HRESULT WINAPI
CDefView::GetCurrentInfo(LPFOLDERSETTINGS lpfs
)
2144 TRACE("(%p)->(%p) vmode=%x flags=%x\n", this, lpfs
,
2145 m_FolderSettings
.ViewMode
, m_FolderSettings
.fFlags
);
2148 return E_INVALIDARG
;
2150 *lpfs
= m_FolderSettings
;
2154 HRESULT WINAPI
CDefView::AddPropertySheetPages(DWORD dwReserved
, LPFNADDPROPSHEETPAGE lpfn
, LPARAM lparam
)
2156 FIXME("(%p) stub\n", this);
2161 HRESULT WINAPI
CDefView::SaveViewState()
2163 FIXME("(%p) stub\n", this);
2168 HRESULT WINAPI
CDefView::SelectItem(LPCITEMIDLIST pidl
, UINT uFlags
)
2172 TRACE("(%p)->(pidl=%p, 0x%08x) stub\n", this, pidl
, uFlags
);
2174 i
= LV_FindItemByPidl(pidl
);
2180 if(uFlags
& SVSI_ENSUREVISIBLE
)
2181 SendMessageW(m_hWndList
, LVM_ENSUREVISIBLE
, i
, 0);
2183 lvItem
.mask
= LVIF_STATE
;
2184 lvItem
.stateMask
= LVIS_SELECTED
| LVIS_FOCUSED
;
2186 lvItem
.iSubItem
= 0;
2188 while (SendMessageW(m_hWndList
, LVM_GETITEMW
, 0, (LPARAM
) &lvItem
))
2190 if (lvItem
.iItem
== i
)
2192 if (uFlags
& SVSI_SELECT
)
2193 lvItem
.state
|= LVIS_SELECTED
;
2195 lvItem
.state
&= ~LVIS_SELECTED
;
2197 if (uFlags
& SVSI_FOCUSED
)
2198 lvItem
.state
&= ~LVIS_FOCUSED
;
2202 if (uFlags
& SVSI_DESELECTOTHERS
)
2203 lvItem
.state
&= ~LVIS_SELECTED
;
2206 SendMessageW(m_hWndList
, LVM_SETITEMW
, 0, (LPARAM
) &lvItem
);
2211 if(uFlags
& SVSI_EDIT
)
2212 SendMessageW(m_hWndList
, LVM_EDITLABELW
, i
, 0);
2218 HRESULT WINAPI
CDefView::GetItemObject(UINT uItem
, REFIID riid
, LPVOID
*ppvOut
)
2220 HRESULT hr
= E_NOINTERFACE
;
2222 TRACE("(%p)->(uItem=0x%08x,\n\tIID=%s, ppv=%p)\n", this, uItem
, debugstr_guid(&riid
), ppvOut
);
2228 case SVGIO_BACKGROUND
:
2229 if (IsEqualIID(riid
, IID_IContextMenu
))
2231 //*ppvOut = ISvBgCm_Constructor(m_pSFParent, FALSE);
2232 CDefFolderMenu_Create2(NULL
, NULL
, 0, NULL
, m_pSFParent
, NULL
, 0, NULL
, (IContextMenu
**)ppvOut
);
2240 case SVGIO_SELECTION
:
2242 hr
= m_pSFParent
->GetUIObjectOf(m_hWnd
, m_cidl
, (LPCITEMIDLIST
*)m_apidl
, riid
, 0, ppvOut
);
2246 TRACE("-- (%p)->(interface=%p)\n", this, *ppvOut
);
2251 HRESULT STDMETHODCALLTYPE
CDefView::GetCurrentViewMode(UINT
*pViewMode
)
2253 TRACE("(%p)->(%p), stub\n", this, pViewMode
);
2256 return E_INVALIDARG
;
2258 *pViewMode
= m_FolderSettings
.ViewMode
;
2262 HRESULT STDMETHODCALLTYPE
CDefView::SetCurrentViewMode(UINT ViewMode
)
2265 TRACE("(%p)->(%u), stub\n", this, ViewMode
);
2267 /* It's not redundant to check FVM_AUTO because it's a (UINT)-1 */
2268 if ((ViewMode
< FVM_FIRST
|| ViewMode
> FVM_LAST
) && (ViewMode
!= (UINT
)FVM_AUTO
))
2269 return E_INVALIDARG
;
2271 /* Windows before Vista uses LVM_SETVIEW and possibly
2272 LVM_SETEXTENDEDLISTVIEWSTYLE to set the style of the listview,
2273 while later versions seem to accomplish this through other
2281 dwStyle
= LVS_REPORT
;
2284 dwStyle
= LVS_SMALLICON
;
2291 FIXME("ViewMode %d not implemented\n", ViewMode
);
2297 SetStyle(dwStyle
, LVS_TYPEMASK
);
2299 /* This will not necessarily be the actual mode set above.
2300 This mimics the behavior of Windows XP. */
2301 m_FolderSettings
.ViewMode
= ViewMode
;
2306 HRESULT STDMETHODCALLTYPE
CDefView::GetFolder(REFIID riid
, void **ppv
)
2308 if (m_pSFParent
== NULL
)
2311 return m_pSFParent
->QueryInterface(riid
, ppv
);
2314 HRESULT STDMETHODCALLTYPE
CDefView::Item(int iItemIndex
, LPITEMIDLIST
*ppidl
)
2318 TRACE("(%p)->(%d %p)\n", this, iItemIndex
, ppidl
);
2320 item
.mask
= LVIF_PARAM
;
2321 item
.iItem
= iItemIndex
;
2323 if (SendMessageW(m_hWndList
, LVM_GETITEMW
, 0, (LPARAM
)&item
))
2325 *ppidl
= ILClone((PITEMID_CHILD
)item
.lParam
);
2331 return E_INVALIDARG
;
2334 HRESULT STDMETHODCALLTYPE
CDefView::ItemCount(UINT uFlags
, int *pcItems
)
2336 TRACE("(%p)->(%u %p)\n", this, uFlags
, pcItems
);
2338 if (uFlags
!= SVGIO_ALLVIEW
)
2339 FIXME("some flags unsupported, %x\n", uFlags
& ~SVGIO_ALLVIEW
);
2341 *pcItems
= SendMessageW(m_hWndList
, LVM_GETITEMCOUNT
, 0, 0);
2346 HRESULT STDMETHODCALLTYPE
CDefView::Items(UINT uFlags
, REFIID riid
, void **ppv
)
2351 HRESULT STDMETHODCALLTYPE
CDefView::GetSelectionMarkedItem(int *piItem
)
2353 TRACE("(%p)->(%p)\n", this, piItem
);
2355 *piItem
= SendMessageW(m_hWndList
, LVM_GETSELECTIONMARK
, 0, 0);
2360 HRESULT STDMETHODCALLTYPE
CDefView::GetFocusedItem(int *piItem
)
2362 TRACE("(%p)->(%p)\n", this, piItem
);
2364 *piItem
= SendMessageW(m_hWndList
, LVM_GETNEXTITEM
, -1, LVNI_FOCUSED
);
2369 HRESULT STDMETHODCALLTYPE
CDefView::GetItemPosition(LPCITEMIDLIST pidl
, POINT
*ppt
)
2374 HRESULT STDMETHODCALLTYPE
CDefView::GetSpacing(POINT
*ppt
)
2376 TRACE("(%p)->(%p)\n", this, ppt
);
2378 if (NULL
== m_hWndList
) return S_FALSE
;
2382 const DWORD ret
= SendMessageW(m_hWndList
, LVM_GETITEMSPACING
, 0, 0);
2384 ppt
->x
= LOWORD(ret
);
2385 ppt
->y
= HIWORD(ret
);
2391 HRESULT STDMETHODCALLTYPE
CDefView::GetDefaultSpacing(POINT
*ppt
)
2396 HRESULT STDMETHODCALLTYPE
CDefView::GetAutoArrange()
2401 HRESULT STDMETHODCALLTYPE
CDefView::SelectItem(int iItem
, DWORD dwFlags
)
2405 TRACE("(%p)->(%d, %x)\n", this, iItem
, dwFlags
);
2408 lvItem
.stateMask
= LVIS_SELECTED
;
2410 if (dwFlags
& SVSI_ENSUREVISIBLE
)
2411 SendMessageW(m_hWndList
, LVM_ENSUREVISIBLE
, iItem
, 0);
2414 if (dwFlags
& SVSI_DESELECTOTHERS
)
2415 SendMessageW(m_hWndList
, LVM_SETITEMSTATE
, -1, (LPARAM
)&lvItem
);
2418 if (dwFlags
& SVSI_SELECT
)
2419 lvItem
.state
|= LVIS_SELECTED
;
2421 if (dwFlags
& SVSI_FOCUSED
)
2422 lvItem
.stateMask
|= LVIS_FOCUSED
;
2424 SendMessageW(m_hWndList
, LVM_SETITEMSTATE
, iItem
, (LPARAM
)&lvItem
);
2426 if (dwFlags
& SVSI_EDIT
)
2427 SendMessageW(m_hWndList
, LVM_EDITLABELW
, iItem
, 0);
2432 HRESULT STDMETHODCALLTYPE
CDefView::SelectAndPositionItems(UINT cidl
, PCUITEMID_CHILD_ARRAY apidl
, POINT
*apt
, DWORD dwFlags
)
2437 /**********************************************************
2438 * IShellFolderView implementation
2440 HRESULT STDMETHODCALLTYPE
CDefView::Rearrange(LPARAM sort
)
2442 FIXME("(%p)->(%ld) stub\n", this, sort
);
2446 HRESULT STDMETHODCALLTYPE
CDefView::GetArrangeParam(LPARAM
*sort
)
2448 FIXME("(%p)->(%p) stub\n", this, sort
);
2452 HRESULT STDMETHODCALLTYPE
CDefView::ArrangeGrid()
2454 FIXME("(%p) stub\n", this);
2458 HRESULT STDMETHODCALLTYPE
CDefView::AutoArrange()
2460 FIXME("(%p) stub\n", this);
2464 HRESULT STDMETHODCALLTYPE
CDefView::AddObject(PITEMID_CHILD pidl
, UINT
*item
)
2466 FIXME("(%p)->(%p %p) stub\n", this, pidl
, item
);
2470 HRESULT STDMETHODCALLTYPE
CDefView::GetObject(PITEMID_CHILD
*pidl
, UINT item
)
2472 TRACE("(%p)->(%p %d)\n", this, pidl
, item
);
2473 return Item(item
, pidl
);
2476 HRESULT STDMETHODCALLTYPE
CDefView::RemoveObject(PITEMID_CHILD pidl
, UINT
*item
)
2479 TRACE("(%p)->(%p %p)\n", this, pidl
, item
);
2483 *item
= LV_FindItemByPidl(ILFindLastID(pidl
));
2484 SendMessageW(m_hWndList
, LVM_DELETEITEM
, *item
, 0);
2489 SendMessageW(m_hWndList
, LVM_DELETEALLITEMS
, 0, 0);
2495 HRESULT STDMETHODCALLTYPE
CDefView::GetObjectCount(UINT
*count
)
2497 TRACE("(%p)->(%p)\n", this, count
);
2498 return ItemCount(SVGIO_ALLVIEW
, reinterpret_cast<INT
*>(count
));
2501 HRESULT STDMETHODCALLTYPE
CDefView::SetObjectCount(UINT count
, UINT flags
)
2503 FIXME("(%p)->(%d %x) stub\n", this, count
, flags
);
2507 HRESULT STDMETHODCALLTYPE
CDefView::UpdateObject(PITEMID_CHILD pidl_old
, PITEMID_CHILD pidl_new
, UINT
*item
)
2509 FIXME("(%p)->(%p %p %p) stub\n", this, pidl_old
, pidl_new
, item
);
2513 HRESULT STDMETHODCALLTYPE
CDefView::RefreshObject(PITEMID_CHILD pidl
, UINT
*item
)
2515 FIXME("(%p)->(%p %p) stub\n", this, pidl
, item
);
2519 HRESULT STDMETHODCALLTYPE
CDefView::SetRedraw(BOOL redraw
)
2521 TRACE("(%p)->(%d)\n", this, redraw
);
2522 SendMessageW(m_hWndList
, WM_SETREDRAW
, redraw
, 0);
2526 HRESULT STDMETHODCALLTYPE
CDefView::GetSelectedCount(UINT
*count
)
2528 FIXME("(%p)->(%p) stub\n", this, count
);
2532 HRESULT STDMETHODCALLTYPE
CDefView::GetSelectedObjects(PCUITEMID_CHILD
**pidl
, UINT
*items
)
2534 TRACE("(%p)->(%p %p)\n", this, pidl
, items
);
2536 *items
= GetSelections();
2540 *pidl
= static_cast<PCUITEMID_CHILD
*>(LocalAlloc(0, *items
* sizeof(LPITEMIDLIST
)));
2543 return E_OUTOFMEMORY
;
2546 /* it's documented that caller shouldn't PIDLs, only array itself */
2547 memcpy(static_cast<PCUITEMID_CHILD
*>(*pidl
), m_apidl
, *items
* sizeof(LPITEMIDLIST
));
2553 HRESULT STDMETHODCALLTYPE
CDefView::IsDropOnSource(IDropTarget
*drop_target
)
2555 FIXME("(%p)->(%p) stub\n", this, drop_target
);
2559 HRESULT STDMETHODCALLTYPE
CDefView::GetDragPoint(POINT
*pt
)
2561 FIXME("(%p)->(%p) stub\n", this, pt
);
2565 HRESULT STDMETHODCALLTYPE
CDefView::GetDropPoint(POINT
*pt
)
2567 FIXME("(%p)->(%p) stub\n", this, pt
);
2571 HRESULT STDMETHODCALLTYPE
CDefView::MoveIcons(IDataObject
*obj
)
2573 TRACE("(%p)->(%p)\n", this, obj
);
2577 HRESULT STDMETHODCALLTYPE
CDefView::SetItemPos(PCUITEMID_CHILD pidl
, POINT
*pt
)
2579 FIXME("(%p)->(%p %p) stub\n", this, pidl
, pt
);
2583 HRESULT STDMETHODCALLTYPE
CDefView::IsBkDropTarget(IDropTarget
*drop_target
)
2585 FIXME("(%p)->(%p) stub\n", this, drop_target
);
2589 HRESULT STDMETHODCALLTYPE
CDefView::SetClipboard(BOOL move
)
2591 FIXME("(%p)->(%d) stub\n", this, move
);
2595 HRESULT STDMETHODCALLTYPE
CDefView::SetPoints(IDataObject
*obj
)
2597 FIXME("(%p)->(%p) stub\n", this, obj
);
2601 HRESULT STDMETHODCALLTYPE
CDefView::GetItemSpacing(ITEMSPACING
*spacing
)
2603 FIXME("(%p)->(%p) stub\n", this, spacing
);
2607 HRESULT STDMETHODCALLTYPE
CDefView::SetCallback(IShellFolderViewCB
*new_cb
, IShellFolderViewCB
**old_cb
)
2609 FIXME("(%p)->(%p %p) stub\n", this, new_cb
, old_cb
);
2613 HRESULT STDMETHODCALLTYPE
CDefView::Select(UINT flags
)
2615 FIXME("(%p)->(%d) stub\n", this, flags
);
2619 HRESULT STDMETHODCALLTYPE
CDefView::QuerySupport(UINT
*support
)
2621 TRACE("(%p)->(%p)\n", this, support
);
2625 HRESULT STDMETHODCALLTYPE
CDefView::SetAutomationObject(IDispatch
*disp
)
2627 FIXME("(%p)->(%p) stub\n", this, disp
);
2631 /**********************************************************
2632 * ISVOleCmdTarget_QueryStatus (IOleCommandTarget)
2634 HRESULT WINAPI
CDefView::QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
, OLECMD
*prgCmds
, OLECMDTEXT
*pCmdText
)
2636 FIXME("(%p)->(%p(%s) 0x%08x %p %p\n",
2637 this, pguidCmdGroup
, debugstr_guid(pguidCmdGroup
), cCmds
, prgCmds
, pCmdText
);
2640 return E_INVALIDARG
;
2642 for (UINT i
= 0; i
< cCmds
; i
++)
2644 FIXME("\tprgCmds[%d].cmdID = %d\n", i
, prgCmds
[i
].cmdID
);
2645 prgCmds
[i
].cmdf
= 0;
2648 return OLECMDERR_E_UNKNOWNGROUP
;
2651 /**********************************************************
2652 * ISVOleCmdTarget_Exec (IOleCommandTarget)
2654 * nCmdID is the OLECMDID_* enumeration
2656 HRESULT WINAPI
CDefView::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
2658 FIXME("(%p)->(\n\tTarget GUID:%s Command:0x%08x Opt:0x%08x %p %p)\n",
2659 this, debugstr_guid(pguidCmdGroup
), nCmdID
, nCmdexecopt
, pvaIn
, pvaOut
);
2662 return OLECMDERR_E_UNKNOWNGROUP
;
2664 if (IsEqualIID(*pguidCmdGroup
, CGID_Explorer
) &&
2666 (nCmdexecopt
== 4) && pvaOut
)
2669 if (IsEqualIID(*pguidCmdGroup
, CGID_ShellDocView
) &&
2674 return OLECMDERR_E_UNKNOWNGROUP
;
2677 /**********************************************************
2678 * ISVDropTarget implementation
2681 /******************************************************************************
2682 * drag_notify_subitem [Internal]
2684 * Figure out the shellfolder object, which is currently under the mouse cursor
2685 * and notify it via the IDropTarget interface.
2688 #define SCROLLAREAWIDTH 20
2690 HRESULT
CDefView::drag_notify_subitem(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2692 LVHITTESTINFO htinfo
;
2698 /* Map from global to client coordinates and query the index of the listview-item, which is
2699 * currently under the mouse cursor. */
2702 htinfo
.flags
= LVHT_ONITEM
;
2703 ::ScreenToClient(m_hWndList
, &htinfo
.pt
);
2704 lResult
= SendMessageW(m_hWndList
, LVM_HITTEST
, 0, (LPARAM
)&htinfo
);
2706 /* Send WM_*SCROLL messages every 250 ms during drag-scrolling */
2707 ::GetClientRect(m_hWndList
, &clientRect
);
2708 if (htinfo
.pt
.x
== m_ptLastMousePos
.x
&& htinfo
.pt
.y
== m_ptLastMousePos
.y
&&
2709 (htinfo
.pt
.x
< SCROLLAREAWIDTH
|| htinfo
.pt
.x
> clientRect
.right
- SCROLLAREAWIDTH
||
2710 htinfo
.pt
.y
< SCROLLAREAWIDTH
|| htinfo
.pt
.y
> clientRect
.bottom
- SCROLLAREAWIDTH
))
2712 m_cScrollDelay
= (m_cScrollDelay
+ 1) % 5; /* DragOver is called every 50 ms */
2713 if (m_cScrollDelay
== 0)
2715 /* Mouse did hover another 250 ms over the scroll-area */
2716 if (htinfo
.pt
.x
< SCROLLAREAWIDTH
)
2717 SendMessageW(m_hWndList
, WM_HSCROLL
, SB_LINEUP
, 0);
2719 if (htinfo
.pt
.x
> clientRect
.right
- SCROLLAREAWIDTH
)
2720 SendMessageW(m_hWndList
, WM_HSCROLL
, SB_LINEDOWN
, 0);
2722 if (htinfo
.pt
.y
< SCROLLAREAWIDTH
)
2723 SendMessageW(m_hWndList
, WM_VSCROLL
, SB_LINEUP
, 0);
2725 if (htinfo
.pt
.y
> clientRect
.bottom
- SCROLLAREAWIDTH
)
2726 SendMessageW(m_hWndList
, WM_VSCROLL
, SB_LINEDOWN
, 0);
2731 m_cScrollDelay
= 0; /* Reset, if the cursor is not over the listview's scroll-area */
2734 m_ptLastMousePos
= htinfo
.pt
;
2736 /* If we are still over the previous sub-item, notify it via DragOver and return. */
2737 if (m_pCurDropTarget
&& lResult
== m_iDragOverItem
)
2738 return m_pCurDropTarget
->DragOver(grfKeyState
, pt
, pdwEffect
);
2740 /* We've left the previous sub-item, notify it via DragLeave and Release it. */
2741 if (m_pCurDropTarget
)
2743 m_pCurDropTarget
->DragLeave();
2744 m_pCurDropTarget
.Release();
2747 m_iDragOverItem
= lResult
;
2750 /* We are not above one of the listview's subitems. Bind to the parent folder's
2751 * DropTarget interface. */
2752 hr
= m_pSFParent
->QueryInterface(IID_PPV_ARG(IDropTarget
,&m_pCurDropTarget
));
2756 /* Query the relative PIDL of the shellfolder object represented by the currently
2757 * dragged over listview-item ... */
2758 lvItem
.mask
= LVIF_PARAM
;
2759 lvItem
.iItem
= lResult
;
2760 lvItem
.iSubItem
= 0;
2761 SendMessageW(m_hWndList
, LVM_GETITEMW
, 0, (LPARAM
) &lvItem
);
2763 /* ... and bind m_pCurDropTarget to the IDropTarget interface of an UIObject of this object */
2764 hr
= m_pSFParent
->GetUIObjectOf(m_hWndList
, 1, (LPCITEMIDLIST
*)&lvItem
.lParam
, IID_NULL_PPV_ARG(IDropTarget
, &m_pCurDropTarget
));
2767 /* If anything failed, m_pCurDropTarget should be NULL now, which ought to be a save state. */
2771 /* Notify the item just entered via DragEnter. */
2772 return m_pCurDropTarget
->DragEnter(m_pCurDataObject
, grfKeyState
, pt
, pdwEffect
);
2775 HRESULT WINAPI
CDefView::DragEnter(IDataObject
*pDataObject
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2777 /* Get a hold on the data object for later calls to DragEnter on the sub-folders */
2778 m_pCurDataObject
= pDataObject
;
2779 pDataObject
->AddRef();
2781 return drag_notify_subitem(grfKeyState
, pt
, pdwEffect
);
2784 HRESULT WINAPI
CDefView::DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2786 return drag_notify_subitem(grfKeyState
, pt
, pdwEffect
);
2789 HRESULT WINAPI
CDefView::DragLeave()
2791 if (m_pCurDropTarget
)
2793 m_pCurDropTarget
->DragLeave();
2794 m_pCurDropTarget
.Release();
2797 if (m_pCurDataObject
!= NULL
)
2799 m_pCurDataObject
.Release();
2802 m_iDragOverItem
= 0;
2807 HRESULT WINAPI
CDefView::Drop(IDataObject
* pDataObject
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2809 if (m_pCurDropTarget
)
2811 m_pCurDropTarget
->Drop(pDataObject
, grfKeyState
, pt
, pdwEffect
);
2812 m_pCurDropTarget
.Release();
2815 m_pCurDataObject
.Release();
2816 m_iDragOverItem
= 0;
2820 /**********************************************************
2821 * ISVDropSource implementation
2824 HRESULT WINAPI
CDefView::QueryContinueDrag(BOOL fEscapePressed
, DWORD grfKeyState
)
2826 TRACE("(%p)\n", this);
2829 return DRAGDROP_S_CANCEL
;
2830 else if (!(grfKeyState
& MK_LBUTTON
) && !(grfKeyState
& MK_RBUTTON
))
2831 return DRAGDROP_S_DROP
;
2836 HRESULT WINAPI
CDefView::GiveFeedback(DWORD dwEffect
)
2838 TRACE("(%p)\n", this);
2840 return DRAGDROP_S_USEDEFAULTCURSORS
;
2843 /**********************************************************
2844 * ISVViewObject implementation
2847 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
)
2849 FIXME("Stub: this=%p\n", this);
2854 HRESULT WINAPI
CDefView::GetColorSet(DWORD dwDrawAspect
, LONG lindex
, void *pvAspect
, DVTARGETDEVICE
*ptd
, HDC hicTargetDevice
, LOGPALETTE
**ppColorSet
)
2856 FIXME("Stub: this=%p\n", this);
2861 HRESULT WINAPI
CDefView::Freeze(DWORD dwDrawAspect
, LONG lindex
, void *pvAspect
, DWORD
*pdwFreeze
)
2863 FIXME("Stub: this=%p\n", this);
2868 HRESULT WINAPI
CDefView::Unfreeze(DWORD dwFreeze
)
2870 FIXME("Stub: this=%p\n", this);
2875 HRESULT WINAPI
CDefView::SetAdvise(DWORD aspects
, DWORD advf
, IAdviseSink
*pAdvSink
)
2877 FIXME("partial stub: %p %08x %08x %p\n", this, aspects
, advf
, pAdvSink
);
2879 /* FIXME: we set the AdviseSink, but never use it to send any advice */
2880 m_pAdvSink
= pAdvSink
;
2881 m_dwAspects
= aspects
;
2887 HRESULT WINAPI
CDefView::GetAdvise(DWORD
*pAspects
, DWORD
*pAdvf
, IAdviseSink
**ppAdvSink
)
2889 TRACE("this=%p pAspects=%p pAdvf=%p ppAdvSink=%p\n", this, pAspects
, pAdvf
, ppAdvSink
);
2893 *ppAdvSink
= m_pAdvSink
;
2894 m_pAdvSink
.p
->AddRef();
2898 *pAspects
= m_dwAspects
;
2906 HRESULT STDMETHODCALLTYPE
CDefView::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
2908 if (IsEqualIID(guidService
, SID_IShellBrowser
))
2909 return m_pShellBrowser
->QueryInterface(riid
, ppvObject
);
2910 else if(IsEqualIID(guidService
, SID_IFolderView
))
2911 return QueryInterface(riid
, ppvObject
);
2913 return E_NOINTERFACE
;
2916 /**********************************************************
2917 * IShellView_Constructor
2919 HRESULT WINAPI
IShellView_Constructor(IShellFolder
*pFolder
, IShellView
**newView
)
2921 CComObject
<CDefView
> *theView
;
2922 CComPtr
<IShellView
> result
;
2925 if (newView
== NULL
)
2929 ATLTRY (theView
= new CComObject
<CDefView
>);
2931 if (theView
== NULL
)
2932 return E_OUTOFMEMORY
;
2934 hResult
= theView
->QueryInterface(IID_PPV_ARG(IShellView
, &result
));
2935 if (FAILED (hResult
))
2941 hResult
= theView
->Initialize (pFolder
);
2942 if (FAILED (hResult
))
2944 *newView
= result
.Detach ();