4 * Copyright 1998,1999 <juergen.schmied@debitel.net>
6 * This is the view visualizing the data provied 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 * FIXME: The order by part of the background context menu should be
24 * buily according to the columns shown.
26 * FIXME: Load/Save the view state from/into the stream provied by
29 * FIXME: CheckToolbar: handle the "new folder" and "folder up" button
31 * FIXME: ShellView_FillList: consider sort orders
33 * FIXME: implement the drag and drop in the old (msg-based) way
35 * FIXME: when the ShellView_WndProc gets a WM_NCDESTROY should we do a
40 #include "wine/port.h"
55 #include "undocshell.h"
57 #include "wine/debug.h"
61 #include "shell32_main.h"
62 #include "shellfolder.h"
64 WINE_DEFAULT_DEBUG_CHANNEL(shell
);
70 }LISTVIEW_SORT_INFO
, *LPLISTVIEW_SORT_INFO
;
73 { ICOM_VFIELD(IShellView
);
75 ICOM_VTABLE(IOleCommandTarget
)* lpvtblOleCommandTarget
;
76 ICOM_VTABLE(IDropTarget
)* lpvtblDropTarget
;
77 ICOM_VTABLE(IDropSource
)* lpvtblDropSource
;
78 ICOM_VTABLE(IViewObject
)* lpvtblViewObject
;
79 IShellFolder
* pSFParent
;
80 IShellFolder2
* pSF2Parent
;
81 IShellBrowser
* pShellBrowser
;
82 ICommDlgBrowser
* pCommDlgBrowser
;
83 HWND hWnd
; /* SHELLDLL_DefView */
84 HWND hWndList
; /* ListView control */
86 FOLDERSETTINGS FolderSettings
;
91 LISTVIEW_SORT_INFO ListViewSortInfo
;
92 HANDLE hNotify
; /* change notification handle */
96 static struct ICOM_VTABLE(IShellView
) svvt
;
98 static struct ICOM_VTABLE(IOleCommandTarget
) ctvt
;
99 #define _IOleCommandTarget_Offset ((int)(&(((IShellViewImpl*)0)->lpvtblOleCommandTarget)))
100 #define _ICOM_THIS_From_IOleCommandTarget(class, name) class* This = (class*)(((char*)name)-_IOleCommandTarget_Offset);
102 static struct ICOM_VTABLE(IDropTarget
) dtvt
;
103 #define _IDropTarget_Offset ((int)(&(((IShellViewImpl*)0)->lpvtblDropTarget)))
104 #define _ICOM_THIS_From_IDropTarget(class, name) class* This = (class*)(((char*)name)-_IDropTarget_Offset);
106 static struct ICOM_VTABLE(IDropSource
) dsvt
;
107 #define _IDropSource_Offset ((int)(&(((IShellViewImpl*)0)->lpvtblDropSource)))
108 #define _ICOM_THIS_From_IDropSource(class, name) class* This = (class*)(((char*)name)-_IDropSource_Offset);
110 static struct ICOM_VTABLE(IViewObject
) vovt
;
111 #define _IViewObject_Offset ((int)(&(((IShellViewImpl*)0)->lpvtblViewObject)))
112 #define _ICOM_THIS_From_IViewObject(class, name) class* This = (class*)(((char*)name)-_IViewObject_Offset);
114 /* ListView Header ID's */
115 #define LISTVIEW_COLUMN_NAME 0
116 #define LISTVIEW_COLUMN_SIZE 1
117 #define LISTVIEW_COLUMN_TYPE 2
118 #define LISTVIEW_COLUMN_TIME 3
119 #define LISTVIEW_COLUMN_ATTRIB 4
122 #define IDM_VIEW_FILES (FCIDM_SHVIEWFIRST + 0x500)
123 #define IDM_VIEW_IDW (FCIDM_SHVIEWFIRST + 0x501)
124 #define IDM_MYFILEITEM (FCIDM_SHVIEWFIRST + 0x502)
126 #define ID_LISTVIEW 2000
128 #define SHV_CHANGE_NOTIFY WM_USER + 0x1111
131 #define GET_WM_COMMAND_ID(wp, lp) LOWORD(wp)
132 #define GET_WM_COMMAND_HWND(wp, lp) (HWND)(lp)
133 #define GET_WM_COMMAND_CMD(wp, lp) HIWORD(wp)
135 extern void WINAPI
_InsertMenuItem (HMENU hmenu
, UINT indexMenu
, BOOL fByPosition
,
136 UINT wID
, UINT fType
, LPSTR dwTypeData
, UINT fState
);
139 Items merged into the toolbar and and the filemenu
148 } MYTOOLINFO
, *LPMYTOOLINFO
;
152 { FCIDM_SHVIEW_BIGICON
, 0, 0, IDS_VIEW_LARGE
, TBSTATE_ENABLED
, TBSTYLE_BUTTON
},
153 { FCIDM_SHVIEW_SMALLICON
, 0, 0, IDS_VIEW_SMALL
, TBSTATE_ENABLED
, TBSTYLE_BUTTON
},
154 { FCIDM_SHVIEW_LISTVIEW
, 0, 0, IDS_VIEW_LIST
, TBSTATE_ENABLED
, TBSTYLE_BUTTON
},
155 { FCIDM_SHVIEW_REPORTVIEW
, 0, 0, IDS_VIEW_DETAILS
, TBSTATE_ENABLED
, TBSTYLE_BUTTON
},
159 typedef void (CALLBACK
*PFNSHGETSETTINGSPROC
)(LPSHELLFLAGSTATE lpsfs
, DWORD dwMask
);
161 /**********************************************************
162 * IShellView_Constructor
164 IShellView
* IShellView_Constructor( IShellFolder
* pFolder
)
165 { IShellViewImpl
* sv
;
166 sv
=(IShellViewImpl
*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(IShellViewImpl
));
169 sv
->lpvtblOleCommandTarget
=&ctvt
;
170 sv
->lpvtblDropTarget
=&dtvt
;
171 sv
->lpvtblDropSource
=&dsvt
;
172 sv
->lpvtblViewObject
=&vovt
;
174 sv
->pSFParent
= pFolder
;
175 if(pFolder
) IShellFolder_AddRef(pFolder
);
176 IShellFolder_QueryInterface(sv
->pSFParent
, &IID_IShellFolder2
, (LPVOID
*)&sv
->pSF2Parent
);
178 TRACE("(%p)->(%p)\n",sv
, pFolder
);
179 return (IShellView
*) sv
;
182 /**********************************************************
184 * ##### helperfunctions for communication with ICommDlgBrowser #####
186 static BOOL
IsInCommDlg(IShellViewImpl
* This
)
187 { return(This
->pCommDlgBrowser
!= NULL
);
190 static HRESULT
IncludeObject(IShellViewImpl
* This
, LPCITEMIDLIST pidl
)
194 if ( IsInCommDlg(This
) )
196 TRACE("ICommDlgBrowser::IncludeObject pidl=%p\n", pidl
);
197 ret
= ICommDlgBrowser_IncludeObject(This
->pCommDlgBrowser
, (IShellView
*)This
, pidl
);
198 TRACE("--0x%08lx\n", ret
);
203 static HRESULT
OnDefaultCommand(IShellViewImpl
* This
)
205 HRESULT ret
= S_FALSE
;
207 if (IsInCommDlg(This
))
209 TRACE("ICommDlgBrowser::OnDefaultCommand\n");
210 ret
= ICommDlgBrowser_OnDefaultCommand(This
->pCommDlgBrowser
, (IShellView
*)This
);
216 static HRESULT
OnStateChange(IShellViewImpl
* This
, UINT uFlags
)
218 HRESULT ret
= S_FALSE
;
220 if (IsInCommDlg(This
))
222 TRACE("ICommDlgBrowser::OnStateChange flags=%x\n", uFlags
);
223 ret
= ICommDlgBrowser_OnStateChange(This
->pCommDlgBrowser
, (IShellView
*)This
, uFlags
);
228 /**********************************************************
229 * set the toolbar of the filedialog buttons
231 * - activates the buttons from the shellbrowser according to
234 static void CheckToolbar(IShellViewImpl
* This
)
240 if (IsInCommDlg(This
))
242 IShellBrowser_SendControlMsg(This
->pShellBrowser
, FCW_TOOLBAR
, TB_CHECKBUTTON
,
243 FCIDM_TB_SMALLICON
, (This
->FolderSettings
.ViewMode
==FVM_LIST
)? TRUE
: FALSE
, &result
);
244 IShellBrowser_SendControlMsg(This
->pShellBrowser
, FCW_TOOLBAR
, TB_CHECKBUTTON
,
245 FCIDM_TB_REPORTVIEW
, (This
->FolderSettings
.ViewMode
==FVM_DETAILS
)? TRUE
: FALSE
, &result
);
246 IShellBrowser_SendControlMsg(This
->pShellBrowser
, FCW_TOOLBAR
, TB_ENABLEBUTTON
,
247 FCIDM_TB_SMALLICON
, TRUE
, &result
);
248 IShellBrowser_SendControlMsg(This
->pShellBrowser
, FCW_TOOLBAR
, TB_ENABLEBUTTON
,
249 FCIDM_TB_REPORTVIEW
, TRUE
, &result
);
253 /**********************************************************
255 * ##### helperfunctions for initializing the view #####
257 /**********************************************************
258 * change the style of the listview control
260 static void SetStyle(IShellViewImpl
* This
, DWORD dwAdd
, DWORD dwRemove
)
264 TRACE("(%p)\n", This
);
266 tmpstyle
= GetWindowLongA(This
->hWndList
, GWL_STYLE
);
267 SetWindowLongA(This
->hWndList
, GWL_STYLE
, dwAdd
| (tmpstyle
& ~dwRemove
));
270 /**********************************************************
271 * ShellView_CreateList()
273 * - creates the list view window
275 static BOOL
ShellView_CreateList (IShellViewImpl
* This
)
280 dwStyle
= WS_TABSTOP
| WS_VISIBLE
| WS_CHILDWINDOW
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
|
281 LVS_SHAREIMAGELISTS
| LVS_EDITLABELS
| LVS_ALIGNLEFT
| LVS_AUTOARRANGE
;
283 switch (This
->FolderSettings
.ViewMode
)
285 case FVM_ICON
: dwStyle
|= LVS_ICON
; break;
286 case FVM_DETAILS
: dwStyle
|= LVS_REPORT
; break;
287 case FVM_SMALLICON
: dwStyle
|= LVS_SMALLICON
; break;
288 case FVM_LIST
: dwStyle
|= LVS_LIST
; break;
289 default: dwStyle
|= LVS_LIST
; break;
292 if (This
->FolderSettings
.fFlags
& FWF_AUTOARRANGE
) dwStyle
|= LVS_AUTOARRANGE
;
293 /*if (This->FolderSettings.fFlags && FWF_DESKTOP); used from explorer*/
294 if (This
->FolderSettings
.fFlags
& FWF_SINGLESEL
) dwStyle
|= LVS_SINGLESEL
;
296 This
->hWndList
=CreateWindowExA( WS_EX_CLIENTEDGE
,
309 This
->ListViewSortInfo
.bIsAscending
= TRUE
;
310 This
->ListViewSortInfo
.nHeaderID
= -1;
311 This
->ListViewSortInfo
.nLastHeaderID
= -1;
313 /* UpdateShellSettings(); */
317 /**********************************************************
318 * ShellView_InitList()
320 * - adds all needed columns to the shellview
322 static BOOL
ShellView_InitList(IShellViewImpl
* This
)
331 ListView_DeleteAllItems(This
->hWndList
);
333 lvColumn
.mask
= LVCF_FMT
| LVCF_WIDTH
| LVCF_TEXT
;
334 lvColumn
.pszText
= szTemp
;
336 if (This
->pSF2Parent
)
340 if (!SUCCEEDED(IShellFolder2_GetDetailsOf(This
->pSF2Parent
, NULL
, i
, &sd
)))
342 lvColumn
.fmt
= sd
.fmt
;
343 lvColumn
.cx
= sd
.cxChar
*8; /* chars->pixel */
344 StrRetToStrNA( szTemp
, 50, &sd
.str
, NULL
);
345 ListView_InsertColumnA(This
->hWndList
, i
, &lvColumn
);
353 ListView_SetImageList(This
->hWndList
, ShellSmallIconList
, LVSIL_SMALL
);
354 ListView_SetImageList(This
->hWndList
, ShellBigIconList
, LVSIL_NORMAL
);
358 /**********************************************************
359 * ShellView_CompareItems()
362 * internal, CALLBACK for DSA_Sort
364 static INT CALLBACK
ShellView_CompareItems(LPVOID lParam1
, LPVOID lParam2
, LPARAM lpData
)
367 TRACE("pidl1=%p pidl2=%p lpsf=%p\n", lParam1
, lParam2
, (LPVOID
) lpData
);
369 if(!lpData
) return 0;
371 ret
= (SHORT
) SCODE_CODE(IShellFolder_CompareIDs((LPSHELLFOLDER
)lpData
, 0, (LPITEMIDLIST
)lParam1
, (LPITEMIDLIST
)lParam2
));
372 TRACE("ret=%i\n",ret
);
376 /*************************************************************************
377 * ShellView_ListViewCompareItems
379 * Compare Function for the Listview (FileOpen Dialog)
382 * lParam1 [I] the first ItemIdList to compare with
383 * lParam2 [I] the second ItemIdList to compare with
384 * lpData [I] The column ID for the header Ctrl to process
387 * A negative value if the first item should precede the second,
388 * a positive value if the first item should follow the second,
389 * or zero if the two items are equivalent
392 * FIXME: function does what ShellView_CompareItems is supposed to do.
393 * unify it and figure out how to use the undocumented first parameter
394 * of IShellFolder_CompareIDs to do the job this function does and
395 * move this code to IShellFolder.
396 * make LISTVIEW_SORT_INFO obsolete
397 * the way this function works is only usable if we had only
398 * filesystemfolders (25/10/99 jsch)
400 static INT CALLBACK
ShellView_ListViewCompareItems(LPVOID lParam1
, LPVOID lParam2
, LPARAM lpData
)
404 char strName1
[MAX_PATH
], strName2
[MAX_PATH
];
405 BOOL bIsFolder1
, bIsFolder2
,bIsBothFolder
;
406 LPITEMIDLIST pItemIdList1
= (LPITEMIDLIST
) lParam1
;
407 LPITEMIDLIST pItemIdList2
= (LPITEMIDLIST
) lParam2
;
408 LISTVIEW_SORT_INFO
*pSortInfo
= (LPLISTVIEW_SORT_INFO
) lpData
;
411 bIsFolder1
= _ILIsFolder(pItemIdList1
);
412 bIsFolder2
= _ILIsFolder(pItemIdList2
);
413 bIsBothFolder
= bIsFolder1
&& bIsFolder2
;
415 /* When sorting between a File and a Folder, the Folder gets sorted first */
416 if( (bIsFolder1
|| bIsFolder2
) && !bIsBothFolder
)
418 nDiff
= bIsFolder1
? -1 : 1;
422 /* Sort by Time: Folders or Files can be sorted */
424 if(pSortInfo
->nHeaderID
== LISTVIEW_COLUMN_TIME
)
426 _ILGetFileDateTime(pItemIdList1
, &fd1
);
427 _ILGetFileDateTime(pItemIdList2
, &fd2
);
428 nDiff
= CompareFileTime(&fd2
, &fd1
);
430 /* Sort by Attribute: Folder or Files can be sorted */
431 else if(pSortInfo
->nHeaderID
== LISTVIEW_COLUMN_ATTRIB
)
433 _ILGetFileAttributes(pItemIdList1
, strName1
, MAX_PATH
);
434 _ILGetFileAttributes(pItemIdList2
, strName2
, MAX_PATH
);
435 nDiff
= strcasecmp(strName1
, strName2
);
437 /* Sort by FileName: Folder or Files can be sorted */
438 else if(pSortInfo
->nHeaderID
== LISTVIEW_COLUMN_NAME
|| bIsBothFolder
)
441 _ILSimpleGetText(pItemIdList1
, strName1
, MAX_PATH
);
442 _ILSimpleGetText(pItemIdList2
, strName2
, MAX_PATH
);
443 nDiff
= strcasecmp(strName1
, strName2
);
445 /* Sort by File Size, Only valid for Files */
446 else if(pSortInfo
->nHeaderID
== LISTVIEW_COLUMN_SIZE
)
448 nDiff
= (INT
)(_ILGetFileSize(pItemIdList1
, NULL
, 0) - _ILGetFileSize(pItemIdList2
, NULL
, 0));
450 /* Sort by File Type, Only valid for Files */
451 else if(pSortInfo
->nHeaderID
== LISTVIEW_COLUMN_TYPE
)
454 _ILGetFileType(pItemIdList1
, strName1
, MAX_PATH
);
455 _ILGetFileType(pItemIdList2
, strName2
, MAX_PATH
);
456 nDiff
= strcasecmp(strName1
, strName2
);
459 /* If the Date, FileSize, FileType, Attrib was the same, sort by FileName */
463 _ILSimpleGetText(pItemIdList1
, strName1
, MAX_PATH
);
464 _ILSimpleGetText(pItemIdList2
, strName2
, MAX_PATH
);
465 nDiff
= strcasecmp(strName1
, strName2
);
468 if(!pSortInfo
->bIsAscending
)
477 /**********************************************************
478 * LV_FindItemByPidl()
480 static int LV_FindItemByPidl(
481 IShellViewImpl
* This
,
485 ZeroMemory(&lvItem
, sizeof(LVITEMA
));
486 lvItem
.mask
= LVIF_PARAM
;
487 for(lvItem
.iItem
= 0; ListView_GetItemA(This
->hWndList
, &lvItem
); lvItem
.iItem
++)
489 LPITEMIDLIST currentpidl
= (LPITEMIDLIST
) lvItem
.lParam
;
490 HRESULT hr
= IShellFolder_CompareIDs(This
->pSFParent
, 0, pidl
, currentpidl
);
491 if(SUCCEEDED(hr
) && !HRESULT_CODE(hr
))
499 /**********************************************************
502 static BOOLEAN
LV_AddItem(IShellViewImpl
* This
, LPCITEMIDLIST pidl
)
506 TRACE("(%p)(pidl=%p)\n", This
, pidl
);
508 ZeroMemory(&lvItem
, sizeof(lvItem
)); /* create the listview item*/
509 lvItem
.mask
= LVIF_TEXT
| LVIF_IMAGE
| LVIF_PARAM
; /*set the mask*/
510 lvItem
.iItem
= ListView_GetItemCount(This
->hWndList
); /*add the item to the end of the list*/
511 lvItem
.lParam
= (LPARAM
) ILClone(ILFindLastID(pidl
)); /*set the item's data*/
512 lvItem
.pszText
= LPSTR_TEXTCALLBACKA
; /*get text on a callback basis*/
513 lvItem
.iImage
= I_IMAGECALLBACK
; /*get the image on a callback basis*/
514 return (-1==ListView_InsertItemA(This
->hWndList
, &lvItem
))? FALSE
: TRUE
;
517 /**********************************************************
520 static BOOLEAN
LV_DeleteItem(IShellViewImpl
* This
, LPCITEMIDLIST pidl
)
524 TRACE("(%p)(pidl=%p)\n", This
, pidl
);
526 nIndex
= LV_FindItemByPidl(This
, ILFindLastID(pidl
));
527 return (-1==ListView_DeleteItem(This
->hWndList
, nIndex
))? FALSE
: TRUE
;
530 /**********************************************************
533 static BOOLEAN
LV_RenameItem(IShellViewImpl
* This
, LPCITEMIDLIST pidlOld
, LPCITEMIDLIST pidlNew
)
538 TRACE("(%p)(pidlold=%p pidlnew=%p)\n", This
, pidlOld
, pidlNew
);
540 nItem
= LV_FindItemByPidl(This
, ILFindLastID(pidlOld
));
543 ZeroMemory(&lvItem
, sizeof(lvItem
)); /* create the listview item*/
544 lvItem
.mask
= LVIF_PARAM
; /* only the pidl */
545 lvItem
.iItem
= nItem
;
546 ListView_GetItemA(This
->hWndList
, &lvItem
);
548 SHFree((LPITEMIDLIST
)lvItem
.lParam
);
549 lvItem
.mask
= LVIF_PARAM
;
550 lvItem
.iItem
= nItem
;
551 lvItem
.lParam
= (LPARAM
) ILClone(ILFindLastID(pidlNew
)); /* set the item's data */
552 ListView_SetItemA(This
->hWndList
, &lvItem
);
553 ListView_Update(This
->hWndList
, nItem
);
554 return TRUE
; /* FIXME: better handling */
558 /**********************************************************
559 * ShellView_FillList()
561 * - gets the objectlist from the shellfolder
563 * - fills the list into the view
566 static HRESULT
ShellView_FillList(IShellViewImpl
* This
)
568 LPENUMIDLIST pEnumIDList
;
577 /* get the itemlist from the shfolder*/
578 hRes
= IShellFolder_EnumObjects(This
->pSFParent
,This
->hWnd
, SHCONTF_NONFOLDERS
| SHCONTF_FOLDERS
, &pEnumIDList
);
586 /* create a pointer array */
587 hdpa
= DPA_Create(16);
590 return(E_OUTOFMEMORY
);
593 /* copy the items into the array*/
594 while((S_OK
== IEnumIDList_Next(pEnumIDList
,1, &pidl
, &dwFetched
)) && dwFetched
)
596 if (DPA_InsertPtr(hdpa
, 0x7fff, pidl
) == -1)
603 DPA_Sort(hdpa
, ShellView_CompareItems
, (LPARAM
)This
->pSFParent
);
605 /*turn the listview's redrawing off*/
606 SendMessageA(This
->hWndList
, WM_SETREDRAW
, FALSE
, 0);
608 for (i
=0; i
< DPA_GetPtrCount(hdpa
); ++i
) /* DPA_GetPtrCount is a macro*/
610 pidl
= (LPITEMIDLIST
)DPA_GetPtr(hdpa
, i
);
612 /* in a commdlg This works as a filemask*/
613 if ( IncludeObject(This
, pidl
)==S_OK
)
614 LV_AddItem(This
, pidl
);
618 /*turn the listview's redrawing back on and force it to draw*/
619 SendMessageA(This
->hWndList
, WM_SETREDRAW
, TRUE
, 0);
621 IEnumIDList_Release(pEnumIDList
); /* destroy the list*/
627 /**********************************************************
628 * ShellView_OnCreate()
630 static LRESULT
ShellView_OnCreate(IShellViewImpl
* This
)
633 NOTIFYREGISTER ntreg
;
634 IPersistFolder2
* ppf2
= NULL
;
638 if(ShellView_CreateList(This
))
640 if(ShellView_InitList(This
))
642 ShellView_FillList(This
);
646 if(GetShellOle() && pRegisterDragDrop
)
648 if (SUCCEEDED(IShellFolder_CreateViewObject(This
->pSFParent
, This
->hWnd
, &IID_IDropTarget
, (LPVOID
*)&pdt
)))
650 pRegisterDragDrop(This
->hWnd
, pdt
);
651 IDropTarget_Release(pdt
);
655 /* register for receiving notifications */
656 IShellFolder_QueryInterface(This
->pSFParent
, &IID_IPersistFolder2
, (LPVOID
*)&ppf2
);
659 IPersistFolder2_GetCurFolder(ppf2
, &ntreg
.pidlPath
);
660 ntreg
.bWatchSubtree
= FALSE
;
661 This
->hNotify
= SHChangeNotifyRegister(This
->hWnd
, SHCNF_IDLIST
, SHCNE_ALLEVENTS
, SHV_CHANGE_NOTIFY
, 1, &ntreg
);
662 SHFree(ntreg
.pidlPath
);
663 IPersistFolder2_Release(ppf2
);
666 This
->hAccel
= LoadAcceleratorsA(shell32_hInstance
, "shv_accel");
671 /**********************************************************
672 * #### Handling of the menus ####
675 /**********************************************************
676 * ShellView_BuildFileMenu()
678 static HMENU
ShellView_BuildFileMenu(IShellViewImpl
* This
)
679 { CHAR szText
[MAX_PATH
];
684 TRACE("(%p)\n",This
);
686 hSubMenu
= CreatePopupMenu();
688 { /*get the number of items in our global array*/
689 for(nTools
= 0; Tools
[nTools
].idCommand
!= -1; nTools
++){}
691 /*add the menu items*/
692 for(i
= 0; i
< nTools
; i
++)
694 LoadStringA(shell32_hInstance
, Tools
[i
].idMenuString
, szText
, MAX_PATH
);
696 ZeroMemory(&mii
, sizeof(mii
));
697 mii
.cbSize
= sizeof(mii
);
698 mii
.fMask
= MIIM_TYPE
| MIIM_ID
| MIIM_STATE
;
700 if(TBSTYLE_SEP
!= Tools
[i
].bStyle
) /* no separator*/
702 mii
.fType
= MFT_STRING
;
703 mii
.fState
= MFS_ENABLED
;
704 mii
.dwTypeData
= szText
;
705 mii
.wID
= Tools
[i
].idCommand
;
709 mii
.fType
= MFT_SEPARATOR
;
711 /* tack This item onto the end of the menu */
712 InsertMenuItemA(hSubMenu
, (UINT
)-1, TRUE
, &mii
);
715 TRACE("-- return (menu=%p)\n",hSubMenu
);
718 /**********************************************************
719 * ShellView_MergeFileMenu()
721 static void ShellView_MergeFileMenu(IShellViewImpl
* This
, HMENU hSubMenu
)
722 { TRACE("(%p)->(submenu=%p) stub\n",This
,hSubMenu
);
725 { /*insert This item at the beginning of the menu */
726 _InsertMenuItem(hSubMenu
, 0, TRUE
, 0, MFT_SEPARATOR
, NULL
, MFS_ENABLED
);
727 _InsertMenuItem(hSubMenu
, 0, TRUE
, IDM_MYFILEITEM
, MFT_STRING
, "dummy45", MFS_ENABLED
);
733 /**********************************************************
734 * ShellView_MergeViewMenu()
737 static void ShellView_MergeViewMenu(IShellViewImpl
* This
, HMENU hSubMenu
)
740 TRACE("(%p)->(submenu=%p)\n",This
,hSubMenu
);
743 { /*add a separator at the correct position in the menu*/
744 _InsertMenuItem(hSubMenu
, FCIDM_MENU_VIEW_SEP_OPTIONS
, FALSE
, 0, MFT_SEPARATOR
, NULL
, MFS_ENABLED
);
746 ZeroMemory(&mii
, sizeof(mii
));
747 mii
.cbSize
= sizeof(mii
);
748 mii
.fMask
= MIIM_SUBMENU
| MIIM_TYPE
| MIIM_DATA
;
749 mii
.fType
= MFT_STRING
;
750 mii
.dwTypeData
= "View";
751 mii
.hSubMenu
= LoadMenuA(shell32_hInstance
, "MENU_001");
752 InsertMenuItemA(hSubMenu
, FCIDM_MENU_VIEW_SEP_OPTIONS
, FALSE
, &mii
);
756 /**********************************************************
757 * ShellView_GetSelections()
759 * - fills the this->apidl list with the selected objects
762 * number of selected items
764 static UINT
ShellView_GetSelections(IShellViewImpl
* This
)
774 This
->cidl
= ListView_GetSelectedCount(This
->hWndList
);
775 This
->apidl
= (LPITEMIDLIST
*)SHAlloc(This
->cidl
* sizeof(LPITEMIDLIST
));
777 TRACE("selected=%i\n", This
->cidl
);
781 TRACE("-- Items selected =%u\n", This
->cidl
);
783 ZeroMemory(&lvItem
, sizeof(lvItem
));
784 lvItem
.mask
= LVIF_STATE
| LVIF_PARAM
;
785 lvItem
.stateMask
= LVIS_SELECTED
;
787 while(ListView_GetItemA(This
->hWndList
, &lvItem
) && (i
< This
->cidl
))
789 if(lvItem
.state
& LVIS_SELECTED
)
791 This
->apidl
[i
] = (LPITEMIDLIST
)lvItem
.lParam
;
793 TRACE("-- selected Item found\n");
801 /**********************************************************
802 * ShellView_DoContextMenu()
804 static void ShellView_DoContextMenu(IShellViewImpl
* This
, WORD x
, WORD y
, BOOL bDefault
)
808 BOOL fExplore
= FALSE
;
810 LPCONTEXTMENU pContextMenu
= NULL
;
811 IContextMenu2
*pCM
= NULL
;
812 CMINVOKECOMMANDINFO cmi
;
814 TRACE("(%p)->(0x%08x 0x%08x 0x%08x) stub\n",This
, x
, y
, bDefault
);
816 /* look, what's selected and create a context menu object of it*/
817 if( ShellView_GetSelections(This
) )
819 IShellFolder_GetUIObjectOf( This
->pSFParent
, This
->hWndParent
, This
->cidl
, (LPCITEMIDLIST
*)This
->apidl
,
820 (REFIID
)&IID_IContextMenu
, NULL
, (LPVOID
*)&pContextMenu
);
824 TRACE("-- pContextMenu\n");
825 hMenu
= CreatePopupMenu();
829 /* See if we are in Explore or Open mode. If the browser's tree is present, we are in Explore mode.*/
830 if(SUCCEEDED(IShellBrowser_GetControlWindow(This
->pShellBrowser
,FCW_TREE
, &hwndTree
)) && hwndTree
)
832 TRACE("-- explore mode\n");
836 /* build the flags depending on what we can do with the selected item */
837 wFlags
= CMF_NORMAL
| (This
->cidl
!= 1 ? 0 : CMF_CANRENAME
) | (fExplore
? CMF_EXPLORE
: 0);
839 /* let the ContextMenu merge its items in */
840 if (SUCCEEDED(IContextMenu_QueryContextMenu( pContextMenu
, hMenu
, 0, FCIDM_SHVIEWFIRST
, FCIDM_SHVIEWLAST
, wFlags
)))
844 TRACE("-- get menu default command\n");
845 uCommand
= GetMenuDefaultItem(hMenu
, FALSE
, GMDI_GOINTOPOPUPS
);
849 TRACE("-- track popup\n");
850 uCommand
= TrackPopupMenu( hMenu
,TPM_LEFTALIGN
| TPM_RETURNCMD
,x
,y
,0,This
->hWnd
,NULL
);
855 TRACE("-- uCommand=%u\n", uCommand
);
856 if (IsInCommDlg(This
) && ((uCommand
==FCIDM_SHVIEW_EXPLORE
) || (uCommand
==FCIDM_SHVIEW_OPEN
)))
858 TRACE("-- dlg: OnDefaultCommand\n");
859 OnDefaultCommand(This
);
863 TRACE("-- explore -- invoke command\n");
864 ZeroMemory(&cmi
, sizeof(cmi
));
865 cmi
.cbSize
= sizeof(cmi
);
866 cmi
.hwnd
= This
->hWndParent
; /* this window has to answer CWM_GETISHELLBROWSER */
867 cmi
.lpVerb
= (LPCSTR
)MAKEINTRESOURCEA(uCommand
);
868 IContextMenu_InvokeCommand(pContextMenu
, &cmi
);
875 IContextMenu_Release(pContextMenu
);
878 else /* background context menu */
880 hMenu
= CreatePopupMenu();
882 pCM
= ISvBgCm_Constructor(This
->pSFParent
);
883 IContextMenu2_QueryContextMenu(pCM
, hMenu
, 0, FCIDM_SHVIEWFIRST
, FCIDM_SHVIEWLAST
, 0);
885 uCommand
= TrackPopupMenu( hMenu
, TPM_LEFTALIGN
| TPM_RETURNCMD
,x
,y
,0,This
->hWnd
,NULL
);
888 TRACE("-- (%p)->(uCommand=0x%08x )\n",This
, uCommand
);
890 ZeroMemory(&cmi
, sizeof(cmi
));
891 cmi
.cbSize
= sizeof(cmi
);
892 cmi
.lpVerb
= (LPCSTR
)MAKEINTRESOURCEA(uCommand
);
893 cmi
.hwnd
= This
->hWndParent
;
894 IContextMenu2_InvokeCommand(pCM
, &cmi
);
896 IContextMenu2_Release(pCM
);
900 /**********************************************************
901 * ##### message handling #####
904 /**********************************************************
907 static LRESULT
ShellView_OnSize(IShellViewImpl
* This
, WORD wWidth
, WORD wHeight
)
909 TRACE("%p width=%u height=%u\n",This
, wWidth
,wHeight
);
911 /*resize the ListView to fit our window*/
914 MoveWindow(This
->hWndList
, 0, 0, wWidth
, wHeight
, TRUE
);
919 /**********************************************************
920 * ShellView_OnDeactivate()
925 static void ShellView_OnDeactivate(IShellViewImpl
* This
)
929 if(This
->uState
!= SVUIA_DEACTIVATE
)
933 IShellBrowser_SetMenuSB(This
->pShellBrowser
,0, 0, 0);
934 IShellBrowser_RemoveMenusSB(This
->pShellBrowser
,This
->hMenu
);
935 DestroyMenu(This
->hMenu
);
939 This
->uState
= SVUIA_DEACTIVATE
;
943 /**********************************************************
944 * ShellView_OnActivate()
946 static LRESULT
ShellView_OnActivate(IShellViewImpl
* This
, UINT uState
)
947 { OLEMENUGROUPWIDTHS omw
= { {0, 0, 0, 0, 0, 0} };
949 CHAR szText
[MAX_PATH
];
951 TRACE("%p uState=%x\n",This
,uState
);
953 /*don't do anything if the state isn't really changing */
954 if(This
->uState
== uState
)
959 ShellView_OnDeactivate(This
);
961 /*only do This if we are active */
962 if(uState
!= SVUIA_DEACTIVATE
)
965 This
->hMenu
= CreateMenu();
969 IShellBrowser_InsertMenusSB(This
->pShellBrowser
, This
->hMenu
, &omw
);
970 TRACE("-- after fnInsertMenusSB\n");
972 /*build the top level menu get the menu item's text*/
973 strcpy(szText
,"dummy 31");
975 ZeroMemory(&mii
, sizeof(mii
));
976 mii
.cbSize
= sizeof(mii
);
977 mii
.fMask
= MIIM_SUBMENU
| MIIM_TYPE
| MIIM_STATE
;
978 mii
.fType
= MFT_STRING
;
979 mii
.fState
= MFS_ENABLED
;
980 mii
.dwTypeData
= szText
;
981 mii
.hSubMenu
= ShellView_BuildFileMenu(This
);
983 /*insert our menu into the menu bar*/
986 InsertMenuItemA(This
->hMenu
, FCIDM_MENU_HELP
, FALSE
, &mii
);
989 /*get the view menu so we can merge with it*/
990 ZeroMemory(&mii
, sizeof(mii
));
991 mii
.cbSize
= sizeof(mii
);
992 mii
.fMask
= MIIM_SUBMENU
;
994 if(GetMenuItemInfoA(This
->hMenu
, FCIDM_MENU_VIEW
, FALSE
, &mii
))
996 ShellView_MergeViewMenu(This
, mii
.hSubMenu
);
999 /*add the items that should only be added if we have the focus*/
1000 if(SVUIA_ACTIVATE_FOCUS
== uState
)
1002 /*get the file menu so we can merge with it */
1003 ZeroMemory(&mii
, sizeof(mii
));
1004 mii
.cbSize
= sizeof(mii
);
1005 mii
.fMask
= MIIM_SUBMENU
;
1007 if(GetMenuItemInfoA(This
->hMenu
, FCIDM_MENU_FILE
, FALSE
, &mii
))
1009 ShellView_MergeFileMenu(This
, mii
.hSubMenu
);
1012 TRACE("-- before fnSetMenuSB\n");
1013 IShellBrowser_SetMenuSB(This
->pShellBrowser
, This
->hMenu
, 0, This
->hWnd
);
1016 This
->uState
= uState
;
1021 /**********************************************************
1022 * ShellView_OnSetFocus()
1025 static LRESULT
ShellView_OnSetFocus(IShellViewImpl
* This
)
1029 /* Tell the browser one of our windows has received the focus. This
1030 should always be done before merging menus (OnActivate merges the
1031 menus) if one of our windows has the focus.*/
1033 IShellBrowser_OnViewWindowActive(This
->pShellBrowser
,(IShellView
*) This
);
1034 ShellView_OnActivate(This
, SVUIA_ACTIVATE_FOCUS
);
1036 /* Set the focus to the listview */
1037 SetFocus(This
->hWndList
);
1039 /* Notify the ICommDlgBrowser interface */
1040 OnStateChange(This
,CDBOSC_SETFOCUS
);
1045 /**********************************************************
1046 * ShellView_OnKillFocus()
1048 static LRESULT
ShellView_OnKillFocus(IShellViewImpl
* This
)
1050 TRACE("(%p) stub\n",This
);
1052 ShellView_OnActivate(This
, SVUIA_ACTIVATE_NOFOCUS
);
1053 /* Notify the ICommDlgBrowser */
1054 OnStateChange(This
,CDBOSC_KILLFOCUS
);
1059 /**********************************************************
1060 * ShellView_OnCommand()
1063 * the CmdID's are the ones from the context menu
1065 static LRESULT
ShellView_OnCommand(IShellViewImpl
* This
,DWORD dwCmdID
, DWORD dwCmd
, HWND hwndCmd
)
1067 TRACE("(%p)->(0x%08lx 0x%08lx %p) stub\n",This
, dwCmdID
, dwCmd
, hwndCmd
);
1071 case FCIDM_SHVIEW_SMALLICON
:
1072 This
->FolderSettings
.ViewMode
= FVM_SMALLICON
;
1073 SetStyle (This
, LVS_SMALLICON
, LVS_TYPEMASK
);
1077 case FCIDM_SHVIEW_BIGICON
:
1078 This
->FolderSettings
.ViewMode
= FVM_ICON
;
1079 SetStyle (This
, LVS_ICON
, LVS_TYPEMASK
);
1083 case FCIDM_SHVIEW_LISTVIEW
:
1084 This
->FolderSettings
.ViewMode
= FVM_LIST
;
1085 SetStyle (This
, LVS_LIST
, LVS_TYPEMASK
);
1089 case FCIDM_SHVIEW_REPORTVIEW
:
1090 This
->FolderSettings
.ViewMode
= FVM_DETAILS
;
1091 SetStyle (This
, LVS_REPORT
, LVS_TYPEMASK
);
1095 /* the menu-ID's for sorting are 0x30... see shrec.rc */
1100 This
->ListViewSortInfo
.nHeaderID
= (LPARAM
) (dwCmdID
- 0x30);
1101 This
->ListViewSortInfo
.bIsAscending
= TRUE
;
1102 This
->ListViewSortInfo
.nLastHeaderID
= This
->ListViewSortInfo
.nHeaderID
;
1103 ListView_SortItems(This
->hWndList
, ShellView_ListViewCompareItems
, (LPARAM
) (&(This
->ListViewSortInfo
)));
1107 TRACE("-- COMMAND 0x%04lx unhandled\n", dwCmdID
);
1112 /**********************************************************
1113 * ShellView_OnNotify()
1116 static LRESULT
ShellView_OnNotify(IShellViewImpl
* This
, UINT CtlID
, LPNMHDR lpnmh
)
1117 { LPNMLISTVIEW lpnmlv
= (LPNMLISTVIEW
)lpnmh
;
1118 NMLVDISPINFOA
*lpdi
= (NMLVDISPINFOA
*)lpnmh
;
1121 TRACE("%p CtlID=%u lpnmh->code=%x\n",This
,CtlID
,lpnmh
->code
);
1126 TRACE("-- NM_SETFOCUS %p\n",This
);
1127 ShellView_OnSetFocus(This
);
1131 TRACE("-- NM_KILLFOCUS %p\n",This
);
1132 ShellView_OnDeactivate(This
);
1133 /* Notify the ICommDlgBrowser interface */
1134 OnStateChange(This
,CDBOSC_KILLFOCUS
);
1138 TRACE("-- HDN_ENDTRACKA %p\n",This
);
1139 /*nColumn1 = ListView_GetColumnWidth(This->hWndList, 0);
1140 nColumn2 = ListView_GetColumnWidth(This->hWndList, 1);*/
1143 case LVN_DELETEITEM
:
1144 TRACE("-- LVN_DELETEITEM %p\n",This
);
1145 SHFree((LPITEMIDLIST
)lpnmlv
->lParam
); /*delete the pidl because we made a copy of it*/
1148 case LVN_INSERTITEM
:
1149 TRACE("-- LVN_INSERTITEM (STUB)%p\n",This
);
1152 case LVN_ITEMACTIVATE
:
1153 TRACE("-- LVN_ITEMACTIVATE %p\n",This
);
1154 OnStateChange(This
, CDBOSC_SELCHANGE
); /* the browser will get the IDataObject now */
1155 ShellView_DoContextMenu(This
, 0, 0, TRUE
);
1158 case LVN_COLUMNCLICK
:
1159 This
->ListViewSortInfo
.nHeaderID
= lpnmlv
->iSubItem
;
1160 if(This
->ListViewSortInfo
.nLastHeaderID
== This
->ListViewSortInfo
.nHeaderID
)
1162 This
->ListViewSortInfo
.bIsAscending
= !This
->ListViewSortInfo
.bIsAscending
;
1166 This
->ListViewSortInfo
.bIsAscending
= TRUE
;
1168 This
->ListViewSortInfo
.nLastHeaderID
= This
->ListViewSortInfo
.nHeaderID
;
1170 ListView_SortItems(lpnmlv
->hdr
.hwndFrom
, ShellView_ListViewCompareItems
, (LPARAM
) (&(This
->ListViewSortInfo
)));
1173 case LVN_GETDISPINFOA
:
1174 case LVN_GETDISPINFOW
:
1175 TRACE("-- LVN_GETDISPINFO %p\n",This
);
1176 pidl
= (LPITEMIDLIST
)lpdi
->item
.lParam
;
1178 if(lpdi
->item
.mask
& LVIF_TEXT
) /* text requested */
1180 if (This
->pSF2Parent
)
1183 IShellFolder2_GetDetailsOf(This
->pSF2Parent
, pidl
, lpdi
->item
.iSubItem
, &sd
);
1184 if (lpnmh
->code
== LVN_GETDISPINFOA
)
1186 StrRetToStrNA( lpdi
->item
.pszText
, lpdi
->item
.cchTextMax
, &sd
.str
, NULL
);
1187 TRACE("-- text=%s\n",lpdi
->item
.pszText
);
1189 else /* LVN_GETDISPINFOW */
1191 StrRetToStrNW( lpdi
->item
.pszText
, lpdi
->item
.cchTextMax
, &sd
.str
, NULL
);
1192 TRACE("-- text=%s\n",debugstr_w((WCHAR
*)(lpdi
->item
.pszText
)));
1200 if(lpdi
->item
.mask
& LVIF_IMAGE
) /* image requested */
1202 lpdi
->item
.iImage
= SHMapPIDLToSystemImageListIndex(This
->pSFParent
, pidl
, 0);
1206 case LVN_ITEMCHANGED
:
1207 TRACE("-- LVN_ITEMCHANGED %p\n",This
);
1208 OnStateChange(This
, CDBOSC_SELCHANGE
); /* the browser will get the IDataObject now */
1212 case LVN_BEGINRDRAG
:
1213 TRACE("-- LVN_BEGINDRAG\n");
1215 if (ShellView_GetSelections(This
))
1218 DWORD dwAttributes
= SFGAO_CANLINK
;
1219 DWORD dwEffect
= DROPEFFECT_COPY
| DROPEFFECT_MOVE
;
1221 if(GetShellOle() && pDoDragDrop
)
1223 if (SUCCEEDED(IShellFolder_GetUIObjectOf(This
->pSFParent
, This
->hWnd
, This
->cidl
, (LPCITEMIDLIST
*)This
->apidl
, &IID_IDataObject
,0,(LPVOID
*)&pda
)))
1225 IDropSource
* pds
= (IDropSource
*)&(This
->lpvtblDropSource
); /* own DropSource interface */
1227 if (SUCCEEDED(IShellFolder_GetAttributesOf(This
->pSFParent
, This
->cidl
, (LPCITEMIDLIST
*)This
->apidl
, &dwAttributes
)))
1229 if (dwAttributes
& SFGAO_CANLINK
)
1231 dwEffect
|= DROPEFFECT_LINK
;
1238 pDoDragDrop(pda
, pds
, dwEffect
, &dwEffect
);
1240 IDataObject_Release(pda
);
1246 case LVN_BEGINLABELEDITA
:
1248 DWORD dwAttr
= SFGAO_CANRENAME
;
1249 pidl
= (LPITEMIDLIST
)lpdi
->item
.lParam
;
1251 TRACE("-- LVN_BEGINLABELEDITA %p\n",This
);
1253 IShellFolder_GetAttributesOf(This
->pSFParent
, 1, (LPCITEMIDLIST
*)&pidl
, &dwAttr
);
1254 if (SFGAO_CANRENAME
& dwAttr
)
1262 case LVN_ENDLABELEDITA
:
1264 TRACE("-- LVN_ENDLABELEDITA %p\n",This
);
1265 if (lpdi
->item
.pszText
)
1268 WCHAR wszNewName
[MAX_PATH
];
1271 ZeroMemory(&lvItem
, sizeof(LVITEMA
));
1272 lvItem
.iItem
= lpdi
->item
.iItem
;
1273 lvItem
.mask
= LVIF_PARAM
;
1274 ListView_GetItemA(This
->hWndList
, &lvItem
);
1276 pidl
= (LPITEMIDLIST
)lpdi
->item
.lParam
;
1277 if (!MultiByteToWideChar( CP_ACP
, 0, lpdi
->item
.pszText
, -1, wszNewName
, MAX_PATH
))
1278 wszNewName
[MAX_PATH
-1] = 0;
1279 hr
= IShellFolder_SetNameOf(This
->pSFParent
, 0, pidl
, wszNewName
, SHGDN_INFOLDER
, &pidl
);
1281 if(SUCCEEDED(hr
) && pidl
)
1283 lvItem
.mask
= LVIF_PARAM
;
1284 lvItem
.lParam
= (LPARAM
)pidl
;
1285 ListView_SetItemA(This
->hWndList
, &lvItem
);
1296 msg.hwnd = This->hWnd;
1297 msg.message = WM_KEYDOWN;
1298 msg.wParam = plvKeyDown->wVKey;
1303 LPNMLVKEYDOWN plvKeyDown
= (LPNMLVKEYDOWN
) lpnmh
;
1305 /* initiate a rename of the selected file or directory */
1306 if(plvKeyDown
->wVKey
== VK_F2
)
1308 /* see how many files are selected */
1309 int i
= ListView_GetSelectedCount(This
->hWndList
);
1311 /* get selected item */
1314 /* get selected item */
1315 i
= ListView_GetNextItem(This
->hWndList
, -1,
1318 ListView_EnsureVisible(This
->hWndList
, i
, 0);
1319 ListView_EditLabelA(This
->hWndList
, i
);
1323 TranslateAccelerator(This
->hWnd
, This
->hAccel
, &msg
)
1325 else if(plvKeyDown
->wVKey
== VK_DELETE
)
1330 LPITEMIDLIST
* pItems
;
1333 IShellFolder_QueryInterface(This
->pSFParent
, &IID_ISFHelper
,
1336 if(!(i
= ListView_GetSelectedCount(This
->hWndList
)))
1339 /* allocate memory for the pidl array */
1340 pItems
= HeapAlloc(GetProcessHeap(), 0,
1341 sizeof(LPITEMIDLIST
) * i
);
1343 /* retrieve all selected items */
1346 while(ListView_GetSelectedCount(This
->hWndList
) > i
)
1348 /* get selected item */
1349 item_index
= ListView_GetNextItem(This
->hWndList
,
1350 item_index
, LVNI_SELECTED
);
1351 item
.iItem
= item_index
;
1352 ListView_GetItemA(This
->hWndList
, &item
);
1355 pItems
[i
] = (LPITEMIDLIST
)item
.lParam
;
1360 /* perform the item deletion */
1361 ISFHelper_DeleteItems(psfhlp
, i
, (LPCITEMIDLIST
*)pItems
);
1363 /* free pidl array memory */
1364 HeapFree(GetProcessHeap(), 0, pItems
);
1367 FIXME("LVN_KEYDOWN key=0x%08x\n",plvKeyDown
->wVKey
);
1372 FIXME("-- %p WM_COMMAND %x unhandled\n", This
, lpnmh
->code
);
1378 /**********************************************************
1379 * ShellView_OnChange()
1382 static LRESULT
ShellView_OnChange(IShellViewImpl
* This
, LPITEMIDLIST
* Pidls
, LONG wEventId
)
1385 TRACE("(%p)(%p,%p,0x%08lx)\n", This
, Pidls
[0], Pidls
[1], wEventId
);
1390 LV_AddItem(This
, Pidls
[0]);
1394 LV_DeleteItem(This
, Pidls
[0]);
1396 case SHCNE_RENAMEFOLDER
:
1397 case SHCNE_RENAMEITEM
:
1398 LV_RenameItem(This
, Pidls
[0], Pidls
[1]);
1400 case SHCNE_UPDATEITEM
:
1405 /**********************************************************
1409 static LRESULT CALLBACK
ShellView_WndProc(HWND hWnd
, UINT uMessage
, WPARAM wParam
, LPARAM lParam
)
1411 IShellViewImpl
* pThis
= (IShellViewImpl
*)GetWindowLongA(hWnd
, GWL_USERDATA
);
1412 LPCREATESTRUCTA lpcs
;
1414 TRACE("(hwnd=%p msg=%x wparm=%x lparm=%lx)\n",hWnd
, uMessage
, wParam
, lParam
);
1419 lpcs
= (LPCREATESTRUCTA
)lParam
;
1420 pThis
= (IShellViewImpl
*)(lpcs
->lpCreateParams
);
1421 SetWindowLongA(hWnd
, GWL_USERDATA
, (LONG
)pThis
);
1422 pThis
->hWnd
= hWnd
; /*set the window handle*/
1425 case WM_SIZE
: return ShellView_OnSize(pThis
,LOWORD(lParam
), HIWORD(lParam
));
1426 case WM_SETFOCUS
: return ShellView_OnSetFocus(pThis
);
1427 case WM_KILLFOCUS
: return ShellView_OnKillFocus(pThis
);
1428 case WM_CREATE
: return ShellView_OnCreate(pThis
);
1429 case WM_ACTIVATE
: return ShellView_OnActivate(pThis
, SVUIA_ACTIVATE_FOCUS
);
1430 case WM_NOTIFY
: return ShellView_OnNotify(pThis
,(UINT
)wParam
, (LPNMHDR
)lParam
);
1431 case WM_COMMAND
: return ShellView_OnCommand(pThis
,
1432 GET_WM_COMMAND_ID(wParam
, lParam
),
1433 GET_WM_COMMAND_CMD(wParam
, lParam
),
1434 GET_WM_COMMAND_HWND(wParam
, lParam
));
1435 case SHV_CHANGE_NOTIFY
: return ShellView_OnChange(pThis
, (LPITEMIDLIST
*)wParam
, (LONG
)lParam
);
1437 case WM_CONTEXTMENU
: ShellView_DoContextMenu(pThis
, LOWORD(lParam
), HIWORD(lParam
), FALSE
);
1440 case WM_SHOWWINDOW
: UpdateWindow(pThis
->hWndList
);
1443 case WM_GETDLGCODE
: return SendMessageA(pThis
->hWndList
,uMessage
,0,0);
1445 case WM_DESTROY
: if(GetShellOle() && pRevokeDragDrop
)
1447 pRevokeDragDrop(pThis
->hWnd
);
1449 SHChangeNotifyDeregister(pThis
->hNotify
);
1453 return DefWindowProcA (hWnd
, uMessage
, wParam
, lParam
);
1455 /**********************************************************
1458 * The INTERFACE of the IShellView object
1461 **********************************************************
1462 * IShellView_QueryInterface
1464 static HRESULT WINAPI
IShellView_fnQueryInterface(IShellView
* iface
,REFIID riid
, LPVOID
*ppvObj
)
1466 ICOM_THIS(IShellViewImpl
, iface
);
1468 TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This
,debugstr_guid(riid
),ppvObj
);
1472 if(IsEqualIID(riid
, &IID_IUnknown
))
1476 else if(IsEqualIID(riid
, &IID_IShellView
))
1478 *ppvObj
= (IShellView
*)This
;
1480 else if(IsEqualIID(riid
, &IID_IOleCommandTarget
))
1482 *ppvObj
= (IOleCommandTarget
*)&(This
->lpvtblOleCommandTarget
);
1484 else if(IsEqualIID(riid
, &IID_IDropTarget
))
1486 *ppvObj
= (IDropTarget
*)&(This
->lpvtblDropTarget
);
1488 else if(IsEqualIID(riid
, &IID_IDropSource
))
1490 *ppvObj
= (IDropSource
*)&(This
->lpvtblDropSource
);
1492 else if(IsEqualIID(riid
, &IID_IViewObject
))
1494 *ppvObj
= (IViewObject
*)&(This
->lpvtblViewObject
);
1499 IUnknown_AddRef( (IUnknown
*)*ppvObj
);
1500 TRACE("-- Interface: (%p)->(%p)\n",ppvObj
,*ppvObj
);
1503 TRACE("-- Interface: E_NOINTERFACE\n");
1504 return E_NOINTERFACE
;
1507 /**********************************************************
1510 static ULONG WINAPI
IShellView_fnAddRef(IShellView
* iface
)
1512 ICOM_THIS(IShellViewImpl
, iface
);
1514 TRACE("(%p)->(count=%lu)\n",This
,This
->ref
);
1516 return ++(This
->ref
);
1518 /**********************************************************
1519 * IShellView_Release
1521 static ULONG WINAPI
IShellView_fnRelease(IShellView
* iface
)
1523 ICOM_THIS(IShellViewImpl
, iface
);
1525 TRACE("(%p)->()\n",This
);
1529 TRACE(" destroying IShellView(%p)\n",This
);
1532 IShellFolder_Release(This
->pSFParent
);
1534 if(This
->pSF2Parent
)
1535 IShellFolder2_Release(This
->pSF2Parent
);
1538 SHFree(This
->apidl
);
1540 HeapFree(GetProcessHeap(),0,This
);
1546 /**********************************************************
1547 * ShellView_GetWindow
1549 static HRESULT WINAPI
IShellView_fnGetWindow(IShellView
* iface
,HWND
* phWnd
)
1551 ICOM_THIS(IShellViewImpl
, iface
);
1553 TRACE("(%p)\n",This
);
1555 *phWnd
= This
->hWnd
;
1560 static HRESULT WINAPI
IShellView_fnContextSensitiveHelp(IShellView
* iface
,BOOL fEnterMode
)
1562 ICOM_THIS(IShellViewImpl
, iface
);
1564 FIXME("(%p) stub\n",This
);
1569 /**********************************************************
1570 * IShellView_TranslateAccelerator
1573 * use the accel functions
1575 static HRESULT WINAPI
IShellView_fnTranslateAccelerator(IShellView
* iface
,LPMSG lpmsg
)
1578 ICOM_THIS(IShellViewImpl
, iface
);
1580 FIXME("(%p)->(%p: hwnd=%x msg=%x lp=%lx wp=%x) stub\n",This
,lpmsg
, lpmsg
->hwnd
, lpmsg
->message
, lpmsg
->lParam
, lpmsg
->wParam
);
1583 if ((lpmsg
->message
>=WM_KEYFIRST
) && (lpmsg
->message
>=WM_KEYLAST
))
1585 TRACE("-- key=0x04%x\n",lpmsg
->wParam
) ;
1587 return S_FALSE
; /* not handled */
1590 static HRESULT WINAPI
IShellView_fnEnableModeless(IShellView
* iface
,BOOL fEnable
)
1592 ICOM_THIS(IShellViewImpl
, iface
);
1594 FIXME("(%p) stub\n",This
);
1599 static HRESULT WINAPI
IShellView_fnUIActivate(IShellView
* iface
,UINT uState
)
1601 ICOM_THIS(IShellViewImpl
, iface
);
1604 CHAR szName[MAX_PATH];
1607 int nPartArray
[1] = {-1};
1609 TRACE("(%p)->(state=%x) stub\n",This
, uState
);
1611 /*don't do anything if the state isn't really changing*/
1612 if(This
->uState
== uState
)
1617 /*OnActivate handles the menu merging and internal state*/
1618 ShellView_OnActivate(This
, uState
);
1620 /*only do This if we are active*/
1621 if(uState
!= SVUIA_DEACTIVATE
)
1625 GetFolderPath is not a method of IShellFolder
1626 IShellFolder_GetFolderPath( This->pSFParent, szName, sizeof(szName) );
1628 /* set the number of parts */
1629 IShellBrowser_SendControlMsg(This
->pShellBrowser
, FCW_STATUS
, SB_SETPARTS
, 1,
1630 (LPARAM
)nPartArray
, &lResult
);
1632 /* set the text for the parts */
1634 IShellBrowser_SendControlMsg(This->pShellBrowser, FCW_STATUS, SB_SETTEXTA,
1635 0, (LPARAM)szName, &lResult);
1642 static HRESULT WINAPI
IShellView_fnRefresh(IShellView
* iface
)
1644 ICOM_THIS(IShellViewImpl
, iface
);
1646 TRACE("(%p)\n",This
);
1648 ListView_DeleteAllItems(This
->hWndList
);
1649 ShellView_FillList(This
);
1654 static HRESULT WINAPI
IShellView_fnCreateViewWindow(
1656 IShellView
*lpPrevView
,
1657 LPCFOLDERSETTINGS lpfs
,
1658 IShellBrowser
* psb
,
1662 ICOM_THIS(IShellViewImpl
, iface
);
1668 TRACE("(%p)->(shlview=%p set=%p shlbrs=%p rec=%p hwnd=%p) incomplete\n",This
, lpPrevView
,lpfs
, psb
, prcView
, phWnd
);
1669 TRACE("-- vmode=%x flags=%x left=%li top=%li right=%li bottom=%li\n",lpfs
->ViewMode
, lpfs
->fFlags
,prcView
->left
,prcView
->top
, prcView
->right
, prcView
->bottom
);
1671 /*set up the member variables*/
1672 This
->pShellBrowser
= psb
;
1673 This
->FolderSettings
= *lpfs
;
1675 /*get our parent window*/
1676 IShellBrowser_AddRef(This
->pShellBrowser
);
1677 IShellBrowser_GetWindow(This
->pShellBrowser
, &(This
->hWndParent
));
1679 /* try to get the ICommDlgBrowserInterface, adds a reference !!! */
1680 This
->pCommDlgBrowser
=NULL
;
1681 if ( SUCCEEDED (IShellBrowser_QueryInterface( This
->pShellBrowser
,
1682 (REFIID
)&IID_ICommDlgBrowser
, (LPVOID
*) &This
->pCommDlgBrowser
)))
1684 TRACE("-- CommDlgBrowser\n");
1687 /*if our window class has not been registered, then do so*/
1688 if(!GetClassInfoA(shell32_hInstance
, SV_CLASS_NAME
, &wc
))
1690 ZeroMemory(&wc
, sizeof(wc
));
1691 wc
.style
= CS_HREDRAW
| CS_VREDRAW
;
1692 wc
.lpfnWndProc
= (WNDPROC
) ShellView_WndProc
;
1695 wc
.hInstance
= shell32_hInstance
;
1697 wc
.hCursor
= LoadCursorA (0, IDC_ARROWA
);
1698 wc
.hbrBackground
= (HBRUSH
) (COLOR_WINDOW
+ 1);
1699 wc
.lpszMenuName
= NULL
;
1700 wc
.lpszClassName
= SV_CLASS_NAME
;
1702 if(!RegisterClassA(&wc
))
1706 *phWnd
= CreateWindowExA(0,
1709 WS_CHILD
| WS_VISIBLE
| WS_TABSTOP
,
1712 prcView
->right
- prcView
->left
,
1713 prcView
->bottom
- prcView
->top
,
1721 if(!*phWnd
) return E_FAIL
;
1726 static HRESULT WINAPI
IShellView_fnDestroyViewWindow(IShellView
* iface
)
1728 ICOM_THIS(IShellViewImpl
, iface
);
1730 TRACE("(%p)\n",This
);
1732 /*Make absolutely sure all our UI is cleaned up.*/
1733 IShellView_UIActivate((IShellView
*)This
, SVUIA_DEACTIVATE
);
1737 DestroyMenu(This
->hMenu
);
1740 DestroyWindow(This
->hWnd
);
1741 if(This
->pShellBrowser
) IShellBrowser_Release(This
->pShellBrowser
);
1742 if(This
->pCommDlgBrowser
) ICommDlgBrowser_Release(This
->pCommDlgBrowser
);
1748 static HRESULT WINAPI
IShellView_fnGetCurrentInfo(IShellView
* iface
, LPFOLDERSETTINGS lpfs
)
1750 ICOM_THIS(IShellViewImpl
, iface
);
1752 TRACE("(%p)->(%p) vmode=%x flags=%x\n",This
, lpfs
,
1753 This
->FolderSettings
.ViewMode
, This
->FolderSettings
.fFlags
);
1755 if (!lpfs
) return E_INVALIDARG
;
1757 *lpfs
= This
->FolderSettings
;
1761 static HRESULT WINAPI
IShellView_fnAddPropertySheetPages(IShellView
* iface
, DWORD dwReserved
,LPFNADDPROPSHEETPAGE lpfn
, LPARAM lparam
)
1763 ICOM_THIS(IShellViewImpl
, iface
);
1765 FIXME("(%p) stub\n",This
);
1770 static HRESULT WINAPI
IShellView_fnSaveViewState(IShellView
* iface
)
1772 ICOM_THIS(IShellViewImpl
, iface
);
1774 FIXME("(%p) stub\n",This
);
1779 static HRESULT WINAPI
IShellView_fnSelectItem(
1784 ICOM_THIS(IShellViewImpl
, iface
);
1787 TRACE("(%p)->(pidl=%p, 0x%08x) stub\n",This
, pidl
, uFlags
);
1789 i
= LV_FindItemByPidl(This
, pidl
);
1795 if(uFlags
& SVSI_ENSUREVISIBLE
)
1796 ListView_EnsureVisible(This
->hWndList
, i
, 0);
1798 ZeroMemory(&lvItem
, sizeof(LVITEMA
));
1799 lvItem
.mask
= LVIF_STATE
;
1802 while(ListView_GetItemA(This
->hWndList
, &lvItem
))
1804 if (lvItem
.iItem
== i
)
1806 if (uFlags
& SVSI_SELECT
)
1807 lvItem
.state
|= LVIS_SELECTED
;
1809 lvItem
.state
&= ~LVIS_SELECTED
;
1811 if(uFlags
& SVSI_FOCUSED
)
1812 lvItem
.state
&= ~LVIS_FOCUSED
;
1816 if (uFlags
& SVSI_DESELECTOTHERS
)
1817 lvItem
.state
&= ~LVIS_SELECTED
;
1819 ListView_SetItemA(This
->hWndList
, &lvItem
);
1824 if(uFlags
& SVSI_EDIT
)
1825 ListView_EditLabelA(This
->hWndList
, i
);
1831 static HRESULT WINAPI
IShellView_fnGetItemObject(IShellView
* iface
, UINT uItem
, REFIID riid
, LPVOID
*ppvOut
)
1833 ICOM_THIS(IShellViewImpl
, iface
);
1835 TRACE("(%p)->(uItem=0x%08x,\n\tIID=%s, ppv=%p)\n",This
, uItem
, debugstr_guid(riid
), ppvOut
);
1841 case SVGIO_BACKGROUND
:
1842 *ppvOut
= ISvBgCm_Constructor(This
->pSFParent
);
1845 case SVGIO_SELECTION
:
1846 ShellView_GetSelections(This
);
1847 IShellFolder_GetUIObjectOf(This
->pSFParent
, This
->hWnd
, This
->cidl
, (LPCITEMIDLIST
*)This
->apidl
, riid
, 0, ppvOut
);
1850 TRACE("-- (%p)->(interface=%p)\n",This
, *ppvOut
);
1852 if(!*ppvOut
) return E_OUTOFMEMORY
;
1857 static struct ICOM_VTABLE(IShellView
) svvt
=
1859 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
1860 IShellView_fnQueryInterface
,
1861 IShellView_fnAddRef
,
1862 IShellView_fnRelease
,
1863 IShellView_fnGetWindow
,
1864 IShellView_fnContextSensitiveHelp
,
1865 IShellView_fnTranslateAccelerator
,
1866 IShellView_fnEnableModeless
,
1867 IShellView_fnUIActivate
,
1868 IShellView_fnRefresh
,
1869 IShellView_fnCreateViewWindow
,
1870 IShellView_fnDestroyViewWindow
,
1871 IShellView_fnGetCurrentInfo
,
1872 IShellView_fnAddPropertySheetPages
,
1873 IShellView_fnSaveViewState
,
1874 IShellView_fnSelectItem
,
1875 IShellView_fnGetItemObject
1879 /**********************************************************
1880 * ISVOleCmdTarget_QueryInterface (IUnknown)
1882 static HRESULT WINAPI
ISVOleCmdTarget_QueryInterface(
1883 IOleCommandTarget
* iface
,
1887 _ICOM_THIS_From_IOleCommandTarget(IShellViewImpl
, iface
);
1889 return IShellFolder_QueryInterface((IShellFolder
*)This
, iid
, ppvObj
);
1892 /**********************************************************
1893 * ISVOleCmdTarget_AddRef (IUnknown)
1895 static ULONG WINAPI
ISVOleCmdTarget_AddRef(
1896 IOleCommandTarget
* iface
)
1898 _ICOM_THIS_From_IOleCommandTarget(IShellFolder
, iface
);
1900 return IShellFolder_AddRef((IShellFolder
*)This
);
1903 /**********************************************************
1904 * ISVOleCmdTarget_Release (IUnknown)
1906 static ULONG WINAPI
ISVOleCmdTarget_Release(
1907 IOleCommandTarget
* iface
)
1909 _ICOM_THIS_From_IOleCommandTarget(IShellViewImpl
, iface
);
1911 return IShellFolder_Release((IShellFolder
*)This
);
1914 /**********************************************************
1915 * ISVOleCmdTarget_QueryStatus (IOleCommandTarget)
1917 static HRESULT WINAPI
ISVOleCmdTarget_QueryStatus(
1918 IOleCommandTarget
*iface
,
1919 const GUID
* pguidCmdGroup
,
1922 OLECMDTEXT
* pCmdText
)
1925 _ICOM_THIS_From_IOleCommandTarget(IShellViewImpl
, iface
);
1927 FIXME("(%p)->(%p(%s) 0x%08lx %p %p\n",
1928 This
, pguidCmdGroup
, debugstr_guid(pguidCmdGroup
), cCmds
, prgCmds
, pCmdText
);
1932 for (i
= 0; i
< cCmds
; i
++)
1934 FIXME("\tprgCmds[%d].cmdID = %ld\n", i
, prgCmds
[i
].cmdID
);
1935 prgCmds
[i
].cmdf
= 0;
1937 return OLECMDERR_E_UNKNOWNGROUP
;
1940 /**********************************************************
1941 * ISVOleCmdTarget_Exec (IOleCommandTarget)
1943 * nCmdID is the OLECMDID_* enumeration
1945 static HRESULT WINAPI
ISVOleCmdTarget_Exec(
1946 IOleCommandTarget
*iface
,
1947 const GUID
* pguidCmdGroup
,
1953 _ICOM_THIS_From_IOleCommandTarget(IShellViewImpl
, iface
);
1955 FIXME("(%p)->(\n\tTarget GUID:%s Command:0x%08lx Opt:0x%08lx %p %p)\n",
1956 This
, debugstr_guid(pguidCmdGroup
), nCmdID
, nCmdexecopt
, pvaIn
, pvaOut
);
1958 if (IsEqualIID(pguidCmdGroup
, &CGID_Explorer
) &&
1960 (nCmdexecopt
== 4) && pvaOut
)
1962 if (IsEqualIID(pguidCmdGroup
, &CGID_ShellDocView
) &&
1967 return OLECMDERR_E_UNKNOWNGROUP
;
1970 static ICOM_VTABLE(IOleCommandTarget
) ctvt
=
1972 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
1973 ISVOleCmdTarget_QueryInterface
,
1974 ISVOleCmdTarget_AddRef
,
1975 ISVOleCmdTarget_Release
,
1976 ISVOleCmdTarget_QueryStatus
,
1977 ISVOleCmdTarget_Exec
1980 /**********************************************************
1981 * ISVDropTarget implementation
1984 static HRESULT WINAPI
ISVDropTarget_QueryInterface(
1989 _ICOM_THIS_From_IDropTarget(IShellViewImpl
, iface
);
1991 TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This
,debugstr_guid(riid
),ppvObj
);
1993 return IShellFolder_QueryInterface((IShellFolder
*)This
, riid
, ppvObj
);
1996 static ULONG WINAPI
ISVDropTarget_AddRef( IDropTarget
*iface
)
1998 _ICOM_THIS_From_IDropTarget(IShellViewImpl
, iface
);
2000 TRACE("(%p)->(count=%lu)\n",This
,This
->ref
);
2002 return IShellFolder_AddRef((IShellFolder
*)This
);
2005 static ULONG WINAPI
ISVDropTarget_Release( IDropTarget
*iface
)
2007 _ICOM_THIS_From_IDropTarget(IShellViewImpl
, iface
);
2009 TRACE("(%p)->(count=%lu)\n",This
,This
->ref
);
2011 return IShellFolder_Release((IShellFolder
*)This
);
2014 static HRESULT WINAPI
ISVDropTarget_DragEnter(
2016 IDataObject
*pDataObject
,
2022 _ICOM_THIS_From_IDropTarget(IShellViewImpl
, iface
);
2024 FIXME("Stub: This=%p, DataObject=%p\n",This
,pDataObject
);
2029 static HRESULT WINAPI
ISVDropTarget_DragOver(
2035 _ICOM_THIS_From_IDropTarget(IShellViewImpl
, iface
);
2037 FIXME("Stub: This=%p\n",This
);
2042 static HRESULT WINAPI
ISVDropTarget_DragLeave(
2045 _ICOM_THIS_From_IDropTarget(IShellViewImpl
, iface
);
2047 FIXME("Stub: This=%p\n",This
);
2052 static HRESULT WINAPI
ISVDropTarget_Drop(
2054 IDataObject
* pDataObject
,
2059 _ICOM_THIS_From_IDropTarget(IShellViewImpl
, iface
);
2061 FIXME("Stub: This=%p\n",This
);
2066 static struct ICOM_VTABLE(IDropTarget
) dtvt
=
2068 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
2069 ISVDropTarget_QueryInterface
,
2070 ISVDropTarget_AddRef
,
2071 ISVDropTarget_Release
,
2072 ISVDropTarget_DragEnter
,
2073 ISVDropTarget_DragOver
,
2074 ISVDropTarget_DragLeave
,
2078 /**********************************************************
2079 * ISVDropSource implementation
2082 static HRESULT WINAPI
ISVDropSource_QueryInterface(
2087 _ICOM_THIS_From_IDropSource(IShellViewImpl
, iface
);
2089 TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This
,debugstr_guid(riid
),ppvObj
);
2091 return IShellFolder_QueryInterface((IShellFolder
*)This
, riid
, ppvObj
);
2094 static ULONG WINAPI
ISVDropSource_AddRef( IDropSource
*iface
)
2096 _ICOM_THIS_From_IDropSource(IShellViewImpl
, iface
);
2098 TRACE("(%p)->(count=%lu)\n",This
,This
->ref
);
2100 return IShellFolder_AddRef((IShellFolder
*)This
);
2103 static ULONG WINAPI
ISVDropSource_Release( IDropSource
*iface
)
2105 _ICOM_THIS_From_IDropSource(IShellViewImpl
, iface
);
2107 TRACE("(%p)->(count=%lu)\n",This
,This
->ref
);
2109 return IShellFolder_Release((IShellFolder
*)This
);
2111 static HRESULT WINAPI
ISVDropSource_QueryContinueDrag(
2113 BOOL fEscapePressed
,
2116 _ICOM_THIS_From_IDropSource(IShellViewImpl
, iface
);
2117 TRACE("(%p)\n",This
);
2120 return DRAGDROP_S_CANCEL
;
2121 else if (!(grfKeyState
& MK_LBUTTON
) && !(grfKeyState
& MK_RBUTTON
))
2122 return DRAGDROP_S_DROP
;
2127 static HRESULT WINAPI
ISVDropSource_GiveFeedback(
2131 _ICOM_THIS_From_IDropSource(IShellViewImpl
, iface
);
2132 TRACE("(%p)\n",This
);
2134 return DRAGDROP_S_USEDEFAULTCURSORS
;
2137 static struct ICOM_VTABLE(IDropSource
) dsvt
=
2139 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
2140 ISVDropSource_QueryInterface
,
2141 ISVDropSource_AddRef
,
2142 ISVDropSource_Release
,
2143 ISVDropSource_QueryContinueDrag
,
2144 ISVDropSource_GiveFeedback
2146 /**********************************************************
2147 * ISVViewObject implementation
2150 static HRESULT WINAPI
ISVViewObject_QueryInterface(
2155 _ICOM_THIS_From_IViewObject(IShellViewImpl
, iface
);
2157 TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This
,debugstr_guid(riid
),ppvObj
);
2159 return IShellFolder_QueryInterface((IShellFolder
*)This
, riid
, ppvObj
);
2162 static ULONG WINAPI
ISVViewObject_AddRef( IViewObject
*iface
)
2164 _ICOM_THIS_From_IViewObject(IShellViewImpl
, iface
);
2166 TRACE("(%p)->(count=%lu)\n",This
,This
->ref
);
2168 return IShellFolder_AddRef((IShellFolder
*)This
);
2171 static ULONG WINAPI
ISVViewObject_Release( IViewObject
*iface
)
2173 _ICOM_THIS_From_IViewObject(IShellViewImpl
, iface
);
2175 TRACE("(%p)->(count=%lu)\n",This
,This
->ref
);
2177 return IShellFolder_Release((IShellFolder
*)This
);
2180 static HRESULT WINAPI
ISVViewObject_Draw(
2185 DVTARGETDEVICE
* ptd
,
2188 LPCRECTL lprcBounds
,
2189 LPCRECTL lprcWBounds
,
2190 BOOL (CALLBACK
*pfnContinue
)(ULONG_PTR dwContinue
),
2194 _ICOM_THIS_From_IViewObject(IShellViewImpl
, iface
);
2196 FIXME("Stub: This=%p\n",This
);
2200 static HRESULT WINAPI
ISVViewObject_GetColorSet(
2205 DVTARGETDEVICE
* ptd
,
2206 HDC hicTargetDevice
,
2207 LOGPALETTE
** ppColorSet
)
2210 _ICOM_THIS_From_IViewObject(IShellViewImpl
, iface
);
2212 FIXME("Stub: This=%p\n",This
);
2216 static HRESULT WINAPI
ISVViewObject_Freeze(
2224 _ICOM_THIS_From_IViewObject(IShellViewImpl
, iface
);
2226 FIXME("Stub: This=%p\n",This
);
2230 static HRESULT WINAPI
ISVViewObject_Unfreeze(
2235 _ICOM_THIS_From_IViewObject(IShellViewImpl
, iface
);
2237 FIXME("Stub: This=%p\n",This
);
2241 static HRESULT WINAPI
ISVViewObject_SetAdvise(
2245 IAdviseSink
* pAdvSink
)
2248 _ICOM_THIS_From_IViewObject(IShellViewImpl
, iface
);
2250 FIXME("Stub: This=%p\n",This
);
2254 static HRESULT WINAPI
ISVViewObject_GetAdvise(
2258 IAdviseSink
** ppAdvSink
)
2261 _ICOM_THIS_From_IViewObject(IShellViewImpl
, iface
);
2263 FIXME("Stub: This=%p\n",This
);
2269 static struct ICOM_VTABLE(IViewObject
) vovt
=
2271 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
2272 ISVViewObject_QueryInterface
,
2273 ISVViewObject_AddRef
,
2274 ISVViewObject_Release
,
2276 ISVViewObject_GetColorSet
,
2277 ISVViewObject_Freeze
,
2278 ISVViewObject_Unfreeze
,
2279 ISVViewObject_SetAdvise
,
2280 ISVViewObject_GetAdvise