source: trunk/src/shell32/new/shlview.cpp@ 898

Last change on this file since 898 was 898, checked in by phaller, 26 years ago

.

File size: 46.3 KB
Line 
1/*
2 * ShellView
3 *
4 * Copyright 1998,1999 <juergen.schmied@metronet.de>
5 *
6 * FIXME: when the ShellView_WndProc gets a WM_NCDESTROY should we do a
7 * Release() ???
8 *
9 */
10
11#include <stdlib.h>
12#include <string.h>
13#include <odin.h>
14
15#define ICOM_CINTERFACE 1
16#define CINTERFACE 1
17
18#include "servprov.h"
19#include "wine/obj_base.h"
20#include "wine/obj_shellfolder.h"
21#include "wine/obj_shellview.h"
22#include "wine/obj_oleview.h"
23#include "wine/obj_commdlgbrowser.h"
24#include "wine/obj_shellbrowser.h"
25#include "wine/obj_dockingwindowframe.h"
26#include "wine/obj_extracticon.h"
27#include "wine/obj_dragdrop.h"
28#include "wine/undocshell.h"
29#include "docobj.h"
30#include "shresdef.h"
31#include "spy.h"
32#include "debugtools.h"
33#include "winerror.h"
34
35#include "pidl.h"
36#include "shell32_main.h"
37
38#include <misc.h>
39
40DEFAULT_DEBUG_CHANNEL(shell)
41
42
43typedef struct
44{ ICOM_VTABLE(IShellView)* lpvtbl;
45 DWORD ref;
46 ICOM_VTABLE(IOleCommandTarget)* lpvtblOleCommandTarget;
47 ICOM_VTABLE(IDropTarget)* lpvtblDropTarget;
48 ICOM_VTABLE(IDropSource)* lpvtblDropSource;
49 ICOM_VTABLE(IViewObject)* lpvtblViewObject;
50 IShellFolder* pSFParent;
51 IShellBrowser* pShellBrowser;
52 ICommDlgBrowser* pCommDlgBrowser;
53 HWND hWnd;
54 HWND hWndList;
55 HWND hWndParent;
56 FOLDERSETTINGS FolderSettings;
57 HMENU hMenu;
58 UINT uState;
59 UINT cidl;
60 LPITEMIDLIST *apidl;
61} IShellViewImpl;
62
63extern struct ICOM_VTABLE(IShellView) svvt;
64extern struct ICOM_VTABLE(IOleCommandTarget) ctvt;
65#define _IOleCommandTarget_Offset ((int)(&(((IShellViewImpl*)0)->lpvtblOleCommandTarget)))
66#define _ICOM_THIS_From_IOleCommandTarget(myClass, name) myClass* This = (myClass*)(((char*)name)-_IOleCommandTarget_Offset);
67
68extern struct ICOM_VTABLE(IDropTarget) dtvt;
69#define _IDropTarget_Offset ((int)(&(((IShellViewImpl*)0)->lpvtblDropTarget)))
70#define _ICOM_THIS_From_IDropTarget(myClass, name) myClass* This = (myClass*)(((char*)name)-_IDropTarget_Offset);
71
72extern struct ICOM_VTABLE(IDropSource) dsvt;
73#define _IDropSource_Offset ((int)(&(((IShellViewImpl*)0)->lpvtblDropSource)))
74#define _ICOM_THIS_From_IDropSource(myClass, name) myClass* This = (myClass*)(((char*)name)-_IDropSource_Offset);
75
76extern struct ICOM_VTABLE(IViewObject) vovt;
77#define _IViewObject_Offset ((int)(&(((IShellViewImpl*)0)->lpvtblViewObject)))
78#define _ICOM_THIS_From_IViewObject(myClass, name) myClass* This = (myClass*)(((char*)name)-_IViewObject_Offset);
79
80/*menu items */
81#define IDM_VIEW_FILES (FCIDM_SHVIEWFIRST + 0x500)
82#define IDM_VIEW_IDW (FCIDM_SHVIEWFIRST + 0x501)
83#define IDM_MYFILEITEM (FCIDM_SHVIEWFIRST + 0x502)
84
85#define ID_LISTVIEW 2000
86
87#define TOOLBAR_ID (L"SHELLDLL_DefView")
88/*windowsx.h */
89#define GET_WM_COMMAND_ID(wp, lp) LOWORD(wp)
90#define GET_WM_COMMAND_HWND(wp, lp) (HWND)(lp)
91#define GET_WM_COMMAND_CMD(wp, lp) HIWORD(wp)
92/* winuser.h */
93#define WM_SETTINGCHANGE WM_WININICHANGE
94extern void WINAPI _InsertMenuItem (HMENU hmenu, UINT indexMenu, BOOL fByPosition,
95 UINT wID, UINT fType, LPSTR dwTypeData, UINT fState);
96
97/*
98 Items merged into the toolbar and and the filemenu
99*/
100typedef struct
101{ int idCommand;
102 int iImage;
103 int idButtonString;
104 int idMenuString;
105 BYTE bState;
106 BYTE bStyle;
107} MYTOOLINFO, *LPMYTOOLINFO;
108
109MYTOOLINFO Tools[] =
110{
111{ FCIDM_SHVIEW_BIGICON, 0, 0, IDS_VIEW_LARGE, TBSTATE_ENABLED, TBSTYLE_BUTTON },
112{ FCIDM_SHVIEW_SMALLICON, 0, 0, IDS_VIEW_SMALL, TBSTATE_ENABLED, TBSTYLE_BUTTON },
113{ FCIDM_SHVIEW_LISTVIEW, 0, 0, IDS_VIEW_LIST, TBSTATE_ENABLED, TBSTYLE_BUTTON },
114{ FCIDM_SHVIEW_REPORTVIEW, 0, 0, IDS_VIEW_DETAILS, TBSTATE_ENABLED, TBSTYLE_BUTTON },
115{ -1, 0, 0, 0, 0, 0}
116};
117
118typedef void (CALLBACK *PFNSHGETSETTINGSPROC)(LPSHELLFLAGSTATE lpsfs, DWORD dwMask);
119
120/**********************************************************
121 * IShellView_Constructor
122 */
123IShellView * IShellView_Constructor( IShellFolder * pFolder)
124{ IShellViewImpl * sv;
125 sv=(IShellViewImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IShellViewImpl));
126 sv->ref=1;
127 sv->lpvtbl=&svvt;
128 sv->lpvtblOleCommandTarget=&ctvt;
129 sv->lpvtblDropTarget=&dtvt;
130 sv->lpvtblDropSource=&dsvt;
131 sv->lpvtblViewObject=&vovt;
132
133 sv->pSFParent = pFolder;
134
135 if(pFolder)
136 IShellFolder_AddRef(pFolder);
137
138 TRACE("(%p)->(%p)\n",sv, pFolder);
139 shell32_ObjCount++;
140 return (IShellView *) sv;
141}
142
143/**********************************************************
144 *
145 * ##### helperfunctions for communication with ICommDlgBrowser #####
146 */
147static BOOL IsInCommDlg(IShellViewImpl * This)
148{ return(This->pCommDlgBrowser != NULL);
149}
150
151static HRESULT IncludeObject(IShellViewImpl * This, LPCITEMIDLIST pidl)
152{
153 HRESULT ret = S_OK;
154
155 if ( IsInCommDlg(This) )
156 {
157 TRACE("ICommDlgBrowser::IncludeObject pidl=%p\n", pidl);
158 ret = ICommDlgBrowser_IncludeObject(This->pCommDlgBrowser, (IShellView*)This, pidl);
159 TRACE("--0x%08lx\n", ret);
160 }
161 return ret;
162}
163
164static HRESULT OnDefaultCommand(IShellViewImpl * This)
165{
166 HRESULT ret = S_FALSE;
167
168 if (IsInCommDlg(This))
169 {
170 TRACE("ICommDlgBrowser::OnDefaultCommand\n");
171 ret = ICommDlgBrowser_OnDefaultCommand(This->pCommDlgBrowser, (IShellView*)This);
172 TRACE("--\n");
173 }
174 return ret;
175}
176
177static HRESULT OnStateChange(IShellViewImpl * This, UINT uFlags)
178{
179 HRESULT ret = S_FALSE;
180
181 if (IsInCommDlg(This))
182 {
183 TRACE("ICommDlgBrowser::OnStateChange flags=%x\n", uFlags);
184 ret = ICommDlgBrowser_OnStateChange(This->pCommDlgBrowser, (IShellView*)This, uFlags);
185 TRACE("--\n");
186 }
187 return ret;
188}
189/**********************************************************
190 *
191 * ##### helperfunctions for initializing the view #####
192 */
193/**********************************************************
194 * set the toolbar buttons
195 */
196static void CheckToolbar(IShellViewImpl * This)
197{
198 LRESULT result;
199
200 TRACE("\n");
201
202 IShellBrowser_SendControlMsg(This->pShellBrowser, FCW_TOOLBAR, TB_CHECKBUTTON,
203 FCIDM_TB_SMALLICON, (This->FolderSettings.ViewMode==FVM_LIST)? TRUE : FALSE, &result);
204 IShellBrowser_SendControlMsg(This->pShellBrowser, FCW_TOOLBAR, TB_CHECKBUTTON,
205 FCIDM_TB_REPORTVIEW, (This->FolderSettings.ViewMode==FVM_DETAILS)? TRUE : FALSE, &result);
206 IShellBrowser_SendControlMsg(This->pShellBrowser, FCW_TOOLBAR, TB_ENABLEBUTTON,
207 FCIDM_TB_SMALLICON, TRUE, &result);
208 IShellBrowser_SendControlMsg(This->pShellBrowser, FCW_TOOLBAR, TB_ENABLEBUTTON,
209 FCIDM_TB_REPORTVIEW, TRUE, &result);
210}
211
212/**********************************************************
213 * change the style of the listview control
214 */
215
216static void SetStyle(IShellViewImpl * This, DWORD dwAdd, DWORD dwRemove)
217{
218 DWORD tmpstyle;
219
220 TRACE("(%p)\n", This);
221
222 tmpstyle = GetWindowLongA(This->hWndList, GWL_STYLE);
223 SetWindowLongA(This->hWndList, GWL_STYLE, dwAdd | (tmpstyle & ~dwRemove));
224}
225
226/**********************************************************
227* ShellView_CreateList()
228*
229*/
230static BOOL ShellView_CreateList (IShellViewImpl * This)
231{ DWORD dwStyle;
232
233 TRACE("%p\n",This);
234
235 dwStyle = WS_TABSTOP | WS_VISIBLE | WS_CHILD | WS_BORDER |
236 LVS_SHAREIMAGELISTS | LVS_EDITLABELS | LVS_ALIGNLEFT | LVS_AUTOARRANGE;
237
238 switch (This->FolderSettings.ViewMode)
239 {
240 case FVM_ICON: dwStyle |= LVS_ICON; break;
241 case FVM_DETAILS: dwStyle |= LVS_REPORT; break;
242 case FVM_SMALLICON: dwStyle |= LVS_SMALLICON; break;
243 case FVM_LIST: dwStyle |= LVS_LIST; break;
244 default: dwStyle |= LVS_LIST; break;
245 }
246
247 if (This->FolderSettings.fFlags && FWF_AUTOARRANGE) dwStyle |= LVS_AUTOARRANGE;
248 /*if (This->FolderSettings.fFlags && FWF_DESKTOP); used from explorer*/
249 if (This->FolderSettings.fFlags && FWF_SINGLESEL) dwStyle |= LVS_SINGLESEL;
250
251 This->hWndList=CreateWindowExA( WS_EX_CLIENTEDGE,
252 WC_LISTVIEWA,
253 NULL,
254 dwStyle,
255 0,0,0,0,
256 This->hWnd,
257 (HMENU)ID_LISTVIEW,
258 shell32_hInstance,
259 NULL);
260
261 if(!This->hWndList)
262 return FALSE;
263
264 /* UpdateShellSettings(); */
265 return TRUE;
266}
267/**********************************************************
268* ShellView_InitList()
269*/
270static BOOL ShellView_InitList(IShellViewImpl * This)
271{
272 LVCOLUMNA lvColumn;
273 CHAR szString[50];
274
275 TRACE("%p\n",This);
276
277 ListView_DeleteAllItems(This->hWndList);
278
279 /*initialize the columns */
280 lvColumn.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT; /* | LVCF_SUBITEM;*/
281 lvColumn.fmt = LVCFMT_LEFT;
282 lvColumn.pszText = szString;
283
284 lvColumn.cx = 120;
285 LoadStringA(shell32_hInstance, IDS_SHV_COLUMN1, szString, sizeof(szString));
286 ListView_InsertColumnA(This->hWndList, 0, &lvColumn);
287
288 lvColumn.cx = 80;
289 LoadStringA(shell32_hInstance, IDS_SHV_COLUMN2, szString, sizeof(szString));
290 ListView_InsertColumnA(This->hWndList, 1, &lvColumn);
291
292 lvColumn.cx = 170;
293 LoadStringA(shell32_hInstance, IDS_SHV_COLUMN3, szString, sizeof(szString));
294 ListView_InsertColumnA(This->hWndList, 2, &lvColumn);
295
296 lvColumn.cx = 60;
297 LoadStringA(shell32_hInstance, IDS_SHV_COLUMN4, szString, sizeof(szString));
298 ListView_InsertColumnA(This->hWndList, 3, &lvColumn);
299
300 ListView_SetImageList(This->hWndList, ShellSmallIconList, LVSIL_SMALL);
301 ListView_SetImageList(This->hWndList, ShellBigIconList, LVSIL_NORMAL);
302
303 return TRUE;
304}
305/**********************************************************
306* ShellView_CompareItems()
307*
308* NOTES
309* internal, CALLBACK for DSA_Sort
310*/
311static INT CALLBACK ShellView_CompareItems(LPVOID lParam1, LPVOID lParam2, LPARAM lpData)
312{
313 int ret;
314 TRACE("pidl1=%p pidl2=%p lpsf=%p\n", lParam1, lParam2, (LPVOID) lpData);
315
316 if(!lpData) return 0;
317
318 ret = (SHORT) SCODE_CODE(IShellFolder_CompareIDs((LPSHELLFOLDER)lpData, 0, (LPITEMIDLIST)lParam1, (LPITEMIDLIST)lParam2));
319 TRACE("ret=%i\n",ret);
320 return ret;
321}
322
323/**********************************************************
324* ShellView_FillList()
325*
326* NOTES
327* internal
328*/
329
330static HRESULT ShellView_FillList(IShellViewImpl * This)
331{
332 LPENUMIDLIST pEnumIDList;
333 LPITEMIDLIST pidl;
334 DWORD dwFetched;
335 UINT i;
336 LVITEMA lvItem;
337 HRESULT hRes;
338 HDPA hdpa;
339
340 TRACE("%p\n",This);
341
342 /* get the itemlist from the shfolder*/
343 hRes = IShellFolder_EnumObjects(This->pSFParent,This->hWnd, SHCONTF_NONFOLDERS | SHCONTF_FOLDERS, &pEnumIDList);
344 if (hRes != S_OK)
345 {
346 if (hRes==S_FALSE)
347 return(NOERROR);
348 return(hRes);
349 }
350
351 /* create a pointer array */
352 hdpa = pDPA_Create(16);
353 if (!hdpa)
354 {
355 return(E_OUTOFMEMORY);
356 }
357
358 /* copy the items into the array*/
359 while((S_OK == IEnumIDList_Next(pEnumIDList,1, &pidl, &dwFetched)) && dwFetched)
360 {
361 if (pDPA_InsertPtr(hdpa, 0x7fff, pidl) == -1)
362 {
363 SHFree(pidl);
364 }
365 }
366
367 /*sort the array*/
368 pDPA_Sort(hdpa, (PFNDPACOMPARE)ShellView_CompareItems, (LPARAM)This->pSFParent);
369
370 /*turn the listview's redrawing off*/
371 SendMessageA(This->hWndList, WM_SETREDRAW, FALSE, 0);
372
373 for (i=0; i < DPA_GetPtrCount(hdpa); ++i) /* DPA_GetPtrCount is a macro*/
374 {
375 pidl = (LPITEMIDLIST)DPA_GetPtr(hdpa, i);
376 if (IncludeObject(This, pidl) == S_OK) /* in a commdlg This works as a filemask*/
377 {
378 ZeroMemory(&lvItem, sizeof(lvItem)); /* create the listviewitem*/
379 lvItem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM; /*set the mask*/
380 lvItem.iItem = ListView_GetItemCount(This->hWndList); /*add the item to the end of the list*/
381 lvItem.lParam = (LPARAM) pidl; /*set the item's data*/
382 lvItem.pszText = LPSTR_TEXTCALLBACKA; /*get text on a callback basis*/
383 lvItem.iImage = I_IMAGECALLBACK; /*get the image on a callback basis*/
384 ListView_InsertItemA(This->hWndList, &lvItem);
385 }
386 else
387 SHFree(pidl); /* the listview has the COPY*/
388 }
389
390 /*turn the listview's redrawing back on and force it to draw*/
391 SendMessageA(This->hWndList, WM_SETREDRAW, TRUE, 0);
392 InvalidateRect(This->hWndList, NULL, TRUE);
393 UpdateWindow(This->hWndList);
394
395 IEnumIDList_Release(pEnumIDList); /* destroy the list*/
396 pDPA_Destroy(hdpa);
397
398 return S_OK;
399}
400
401/**********************************************************
402* ShellView_OnCreate()
403*/
404static LRESULT ShellView_OnCreate(IShellViewImpl * This)
405{
406#if 0
407 IDropTarget* pdt;
408#endif
409 TRACE("%p\n",This);
410
411 if(ShellView_CreateList(This))
412 {
413 if(ShellView_InitList(This))
414 {
415 ShellView_FillList(This);
416 }
417 }
418
419#if 0
420 /* This makes a chrash since we havn't called OleInititialize. But if we
421 do this call in DllMain it breaks some apps. The native shell32 does not
422 call OleInitialize and not even depend on ole32.dll.
423 But for some apps it works...*/
424 if (SUCCEEDED(IShellFolder_CreateViewObject(This->pSFParent, This->hWnd, &IID_IDropTarget, (LPVOID*)&pdt)))
425 {
426 pRegisterDragDrop(This->hWnd, pdt);
427 IDropTarget_Release(pdt);
428 }
429#endif
430 return S_OK;
431}
432
433/**********************************************************
434 * #### Handling of the menus ####
435 */
436
437/**********************************************************
438* ShellView_BuildFileMenu()
439*/
440static HMENU ShellView_BuildFileMenu(IShellViewImpl * This)
441{ CHAR szText[MAX_PATH];
442 MENUITEMINFOA mii;
443 int nTools,i;
444 HMENU hSubMenu;
445
446 TRACE("(%p)\n",This);
447
448 hSubMenu = CreatePopupMenu();
449 if(hSubMenu)
450 { /*get the number of items in our global array*/
451 for(nTools = 0; Tools[nTools].idCommand != -1; nTools++){}
452
453 /*add the menu items*/
454 for(i = 0; i < nTools; i++)
455 {
456 LoadStringA(shell32_hInstance, Tools[i].idMenuString, szText, MAX_PATH);
457
458 ZeroMemory(&mii, sizeof(mii));
459 mii.cbSize = sizeof(mii);
460 mii.fMask = MIIM_TYPE | MIIM_ID | MIIM_STATE;
461
462 if(TBSTYLE_SEP != Tools[i].bStyle) /* no seperator*/
463 {
464 mii.fType = MFT_STRING;
465 mii.fState = MFS_ENABLED;
466 mii.dwTypeData = szText;
467 mii.wID = Tools[i].idCommand;
468 }
469 else
470 {
471 mii.fType = MFT_SEPARATOR;
472 }
473 /* tack This item onto the end of the menu */
474 InsertMenuItemA(hSubMenu, (UINT)-1, TRUE, &mii);
475 }
476 }
477 TRACE("-- return (menu=0x%x)\n",hSubMenu);
478 return hSubMenu;
479}
480/**********************************************************
481* ShellView_MergeFileMenu()
482*/
483static void ShellView_MergeFileMenu(IShellViewImpl * This, HMENU hSubMenu)
484{ TRACE("(%p)->(submenu=0x%08x) stub\n",This,hSubMenu);
485
486 if(hSubMenu)
487 { /*insert This item at the beginning of the menu */
488 _InsertMenuItem(hSubMenu, 0, TRUE, 0, MFT_SEPARATOR, NULL, MFS_ENABLED);
489 _InsertMenuItem(hSubMenu, 0, TRUE, IDM_MYFILEITEM, MFT_STRING, "dummy45", MFS_ENABLED);
490
491 }
492 TRACE("--\n");
493}
494
495/**********************************************************
496* ShellView_MergeViewMenu()
497*/
498
499static void ShellView_MergeViewMenu(IShellViewImpl * This, HMENU hSubMenu)
500{ MENUITEMINFOA mii;
501
502 TRACE("(%p)->(submenu=0x%08x)\n",This,hSubMenu);
503
504 if(hSubMenu)
505 { /*add a separator at the correct position in the menu*/
506 _InsertMenuItem(hSubMenu, FCIDM_MENU_VIEW_SEP_OPTIONS, FALSE, 0, MFT_SEPARATOR, NULL, MFS_ENABLED);
507
508 ZeroMemory(&mii, sizeof(mii));
509 mii.cbSize = sizeof(mii);
510 mii.fMask = MIIM_SUBMENU | MIIM_TYPE | MIIM_DATA;;
511 mii.fType = MFT_STRING;
512 mii.dwTypeData = "View";
513 mii.hSubMenu = LoadMenuA(shell32_hInstance, "MENU_001");
514 InsertMenuItemA(hSubMenu, FCIDM_MENU_VIEW_SEP_OPTIONS, FALSE, &mii);
515 }
516}
517
518/**********************************************************
519* ShellView_GetSelections()
520*
521* RETURNS
522* number of selected items
523*/
524static UINT ShellView_GetSelections(IShellViewImpl * This)
525{
526 LVITEMA lvItem;
527 UINT i = 0;
528
529 if (This->apidl)
530 {
531 SHFree(This->apidl);
532 }
533
534 This->cidl = ListView_GetSelectedCount(This->hWndList);
535 This->apidl = (LPITEMIDLIST*)SHAlloc(This->cidl * sizeof(LPITEMIDLIST));
536
537 TRACE("selected=%i\n", This->cidl);
538
539 if(This->apidl)
540 {
541 TRACE("-- Items selected =%u\n", This->cidl);
542
543 ZeroMemory(&lvItem, sizeof(lvItem));
544 lvItem.mask = LVIF_STATE | LVIF_PARAM;
545 lvItem.stateMask = LVIS_SELECTED;
546
547 while(ListView_GetItemA(This->hWndList, &lvItem) && (i < This->cidl))
548 {
549 if(lvItem.state & LVIS_SELECTED)
550 {
551 This->apidl[i] = (LPITEMIDLIST)lvItem.lParam;
552 i++;
553 TRACE("-- selected Item found\n");
554 }
555 lvItem.iItem++;
556 }
557 }
558 return This->cidl;
559
560}
561/**********************************************************
562 * ShellView_DoContextMenu()
563 */
564static void ShellView_DoContextMenu(IShellViewImpl * This, WORD x, WORD y, BOOL bDefault)
565{ UINT uCommand;
566 DWORD wFlags;
567 HMENU hMenu;
568 BOOL fExplore = FALSE;
569 HWND hwndTree = 0;
570 LPCONTEXTMENU pContextMenu = NULL;
571 IContextMenu * pCM = NULL;
572 CMINVOKECOMMANDINFO cmi;
573
574 TRACE("(%p)->(0x%08x 0x%08x 0x%08x) stub\n",This, x, y, bDefault);
575
576 /* look, what's selected and create a context menu object of it*/
577 if( ShellView_GetSelections(This) )
578 {
579 IShellFolder_GetUIObjectOf( This->pSFParent, This->hWndParent, This->cidl, This->apidl,
580 (REFIID)&IID_IContextMenu, NULL, (LPVOID *)&pContextMenu);
581
582 if(pContextMenu)
583 {
584 TRACE("-- pContextMenu\n");
585 hMenu = CreatePopupMenu();
586
587 if( hMenu )
588 {
589 /* See if we are in Explore or Open mode. If the browser's tree is present, we are in Explore mode.*/
590 if(SUCCEEDED(IShellBrowser_GetControlWindow(This->pShellBrowser,FCW_TREE, &hwndTree)) && hwndTree)
591 {
592 TRACE("-- explore mode\n");
593 fExplore = TRUE;
594 }
595
596 /* build the flags depending on what we can do with the selected item */
597 wFlags = CMF_NORMAL | (This->cidl != 1 ? 0 : CMF_CANRENAME) | (fExplore ? CMF_EXPLORE : 0);
598
599 /* let the ContextMenu merge its items in */
600 if (SUCCEEDED(IContextMenu_QueryContextMenu( pContextMenu, hMenu, 0, FCIDM_SHVIEWFIRST, FCIDM_SHVIEWLAST, wFlags )))
601 {
602 if( bDefault )
603 {
604 TRACE("-- get menu default command\n");
605 uCommand = GetMenuDefaultItem(hMenu, FALSE, GMDI_GOINTOPOPUPS);
606 }
607 else
608 {
609 TRACE("-- track popup\n");
610 uCommand = TrackPopupMenu( hMenu,TPM_LEFTALIGN | TPM_RETURNCMD,x,y,0,This->hWnd,NULL);
611 }
612
613 if(uCommand > 0)
614 {
615 TRACE("-- uCommand=%u\n", uCommand);
616 if (IsInCommDlg(This) && ((uCommand==IDM_EXPLORE) || (uCommand==IDM_OPEN)))
617 {
618 TRACE("-- dlg: OnDefaultCommand\n");
619 OnDefaultCommand(This);
620 }
621 else
622 {
623 TRACE("-- explore -- invoke command\n");
624 ZeroMemory(&cmi, sizeof(cmi));
625 cmi.cbSize = sizeof(cmi);
626 cmi.hwnd = This->hWndParent;
627 cmi.lpVerb = (LPCSTR)MAKEINTRESOURCEA(uCommand);
628 IContextMenu_InvokeCommand(pContextMenu, &cmi);
629 }
630 }
631 DestroyMenu(hMenu);
632 }
633 }
634 if (pContextMenu)
635 IContextMenu_Release(pContextMenu);
636 }
637 }
638 else /* background context menu */
639 {
640 hMenu = CreatePopupMenu();
641
642 pCM = ISvBgCm_Constructor();
643 IContextMenu_QueryContextMenu(pCM, hMenu, 0, FCIDM_SHVIEWFIRST, FCIDM_SHVIEWLAST, 0);
644
645 uCommand = TrackPopupMenu( hMenu, TPM_LEFTALIGN | TPM_RETURNCMD,x,y,0,This->hWnd,NULL);
646 DestroyMenu(hMenu);
647
648 TRACE("-- (%p)->(uCommand=0x%08x )\n",This, uCommand);
649
650 ZeroMemory(&cmi, sizeof(cmi));
651 cmi.cbSize = sizeof(cmi);
652 cmi.lpVerb = (LPCSTR)MAKEINTRESOURCEA(uCommand);
653 cmi.hwnd = This->hWndParent;
654 IContextMenu_InvokeCommand(pCM, &cmi);
655
656 IContextMenu_Release(pCM);
657 }
658}
659
660/**********************************************************
661 * ##### message handling #####
662 */
663
664/**********************************************************
665* ShellView_OnSize()
666*/
667static LRESULT ShellView_OnSize(IShellViewImpl * This, WORD wWidth, WORD wHeight)
668{
669 TRACE("%p width=%u height=%u\n",This, wWidth,wHeight);
670
671 /*resize the ListView to fit our window*/
672 if(This->hWndList)
673 {
674 MoveWindow(This->hWndList, 0, 0, wWidth, wHeight, TRUE);
675 }
676
677 return S_OK;
678}
679/**********************************************************
680* ShellView_OnDeactivate()
681*
682* NOTES
683* internal
684*/
685static void ShellView_OnDeactivate(IShellViewImpl * This)
686{
687 TRACE("%p\n",This);
688
689 if(This->uState != SVUIA_DEACTIVATE)
690 {
691 if(This->hMenu)
692 {
693 IShellBrowser_SetMenuSB(This->pShellBrowser,0, 0, 0);
694 IShellBrowser_RemoveMenusSB(This->pShellBrowser,This->hMenu);
695 DestroyMenu(This->hMenu);
696 This->hMenu = 0;
697 }
698
699 This->uState = SVUIA_DEACTIVATE;
700 }
701}
702
703/**********************************************************
704* ShellView_OnActivate()
705*/
706static LRESULT ShellView_OnActivate(IShellViewImpl * This, UINT uState)
707{ OLEMENUGROUPWIDTHS omw = { {0, 0, 0, 0, 0, 0} };
708 MENUITEMINFOA mii;
709 CHAR szText[MAX_PATH];
710
711 TRACE("%p uState=%x\n",This,uState);
712
713 /*don't do anything if the state isn't really changing */
714 if(This->uState == uState)
715 {
716 return S_OK;
717 }
718
719 ShellView_OnDeactivate(This);
720
721 /*only do This if we are active */
722 if(uState != SVUIA_DEACTIVATE)
723 {
724 /*merge the menus */
725 This->hMenu = CreateMenu();
726
727 if(This->hMenu)
728 {
729 IShellBrowser_InsertMenusSB(This->pShellBrowser, This->hMenu, &omw);
730 TRACE("-- after fnInsertMenusSB\n");
731
732 /*build the top level menu get the menu item's text*/
733 strcpy(szText,"dummy 31");
734
735 ZeroMemory(&mii, sizeof(mii));
736 mii.cbSize = sizeof(mii);
737 mii.fMask = MIIM_SUBMENU | MIIM_TYPE | MIIM_STATE;
738 mii.fType = MFT_STRING;
739 mii.fState = MFS_ENABLED;
740 mii.dwTypeData = szText;
741 mii.hSubMenu = ShellView_BuildFileMenu(This);
742
743 /*insert our menu into the menu bar*/
744 if(mii.hSubMenu)
745 {
746 InsertMenuItemA(This->hMenu, FCIDM_MENU_HELP, FALSE, &mii);
747 }
748
749 /*get the view menu so we can merge with it*/
750 ZeroMemory(&mii, sizeof(mii));
751 mii.cbSize = sizeof(mii);
752 mii.fMask = MIIM_SUBMENU;
753
754 if(GetMenuItemInfoA(This->hMenu, FCIDM_MENU_VIEW, FALSE, &mii))
755 {
756 ShellView_MergeViewMenu(This, mii.hSubMenu);
757 }
758
759 /*add the items that should only be added if we have the focus*/
760 if(SVUIA_ACTIVATE_FOCUS == uState)
761 {
762 /*get the file menu so we can merge with it */
763 ZeroMemory(&mii, sizeof(mii));
764 mii.cbSize = sizeof(mii);
765 mii.fMask = MIIM_SUBMENU;
766
767 if(GetMenuItemInfoA(This->hMenu, FCIDM_MENU_FILE, FALSE, &mii))
768 {
769 ShellView_MergeFileMenu(This, mii.hSubMenu);
770 }
771 }
772 TRACE("-- before fnSetMenuSB\n");
773 IShellBrowser_SetMenuSB(This->pShellBrowser, This->hMenu, 0, This->hWnd);
774 }
775 }
776 This->uState = uState;
777 TRACE("--\n");
778 return S_OK;
779}
780
781/**********************************************************
782* ShellView_OnSetFocus()
783*
784*/
785static LRESULT ShellView_OnSetFocus(IShellViewImpl * This)
786{
787 TRACE("%p\n",This);
788
789 /* Tell the browser one of our windows has received the focus. This
790 should always be done before merging menus (OnActivate merges the
791 menus) if one of our windows has the focus.*/
792
793 IShellBrowser_OnViewWindowActive(This->pShellBrowser,(IShellView*) This);
794 ShellView_OnActivate(This, SVUIA_ACTIVATE_FOCUS);
795
796 return 0;
797}
798
799/**********************************************************
800* ShellView_OnKillFocus()
801*/
802static LRESULT ShellView_OnKillFocus(IShellViewImpl * This)
803{
804 TRACE("(%p) stub\n",This);
805
806 ShellView_OnActivate(This, SVUIA_ACTIVATE_NOFOCUS);
807
808 return 0;
809}
810
811/**********************************************************
812* ShellView_OnCommand()
813*/
814static LRESULT ShellView_OnCommand(IShellViewImpl * This,DWORD dwCmdID, DWORD dwCmd, HWND hwndCmd)
815{
816 TRACE("(%p)->(0x%08lx 0x%08lx 0x%08x) stub\n",This, dwCmdID, dwCmd, hwndCmd);
817
818 switch(dwCmdID)
819 {
820 case FCIDM_SHVIEW_SMALLICON:
821 This->FolderSettings.ViewMode = FVM_SMALLICON;
822 SetStyle (This, LVS_SMALLICON, LVS_TYPEMASK);
823 break;
824
825 case FCIDM_SHVIEW_BIGICON:
826 This->FolderSettings.ViewMode = FVM_ICON;
827 SetStyle (This, LVS_ICON, LVS_TYPEMASK);
828 break;
829
830 case FCIDM_SHVIEW_LISTVIEW:
831 This->FolderSettings.ViewMode = FVM_LIST;
832 SetStyle (This, LVS_LIST, LVS_TYPEMASK);
833 break;
834
835 case FCIDM_SHVIEW_REPORTVIEW:
836 This->FolderSettings.ViewMode = FVM_DETAILS;
837 SetStyle (This, LVS_REPORT, LVS_TYPEMASK);
838 break;
839
840 default:
841 TRACE("-- COMMAND 0x%04lx unhandled\n", dwCmdID);
842 }
843 return 0;
844}
845
846/**********************************************************
847* ShellView_OnNotify()
848*/
849
850static LRESULT ShellView_OnNotify(IShellViewImpl * This, UINT CtlID, LPNMHDR lpnmh)
851{ NM_LISTVIEW *lpnmlv = (NM_LISTVIEW*)lpnmh;
852 NMLVDISPINFOA *lpdi = (NMLVDISPINFOA *)lpnmh;
853 LPITEMIDLIST pidl;
854 STRRET str;
855
856 TRACE("%p CtlID=%u lpnmh->code=%x\n",This,CtlID,lpnmh->code);
857
858 switch(lpnmh->code)
859 {
860 case NM_SETFOCUS:
861 TRACE("-- NM_SETFOCUS %p\n",This);
862 ShellView_OnSetFocus(This);
863 break;
864
865 case NM_KILLFOCUS:
866 TRACE("-- NM_KILLFOCUS %p\n",This);
867 ShellView_OnDeactivate(This);
868 break;
869
870 case HDN_ENDTRACKA:
871 TRACE("-- HDN_ENDTRACKA %p\n",This);
872 /*nColumn1 = ListView_GetColumnWidth(This->hWndList, 0);
873 nColumn2 = ListView_GetColumnWidth(This->hWndList, 1);*/
874 break;
875
876 case LVN_DELETEITEM:
877 TRACE("-- LVN_DELETEITEM %p\n",This);
878 SHFree((LPITEMIDLIST)lpnmlv->lParam); /*delete the pidl because we made a copy of it*/
879 break;
880
881 case LVN_ITEMACTIVATE:
882 TRACE("-- LVN_ITEMACTIVATE %p\n",This);
883 OnStateChange(This, CDBOSC_SELCHANGE); /* the browser will get the IDataObject now */
884 ShellView_DoContextMenu(This, 0, 0, TRUE);
885 break;
886
887 case LVN_GETDISPINFOA:
888 TRACE("-- LVN_GETDISPINFOA %p\n",This);
889 pidl = (LPITEMIDLIST)lpdi->item.lParam;
890
891
892 if(lpdi->item.iSubItem) /*is the sub-item information being requested?*/
893 { if(lpdi->item.mask & LVIF_TEXT) /*is the text being requested?*/
894 { if(_ILIsValue(pidl)) /*is This a value or a folder?*/
895 { switch (lpdi->item.iSubItem)
896 { case 1: /* size */
897 _ILGetFileSize (pidl, lpdi->item.pszText, lpdi->item.cchTextMax);
898 break;
899 case 2: /* extension */
900 { char sTemp[64];
901 if (_ILGetExtension (pidl, sTemp, 64))
902 { if (!( HCR_MapTypeToValue(sTemp, sTemp, 64, TRUE)
903 && HCR_MapTypeToValue(sTemp, lpdi->item.pszText, lpdi->item.cchTextMax, FALSE )))
904 { lstrcpynA (lpdi->item.pszText, sTemp, lpdi->item.cchTextMax);
905 strncat (lpdi->item.pszText, "-file", lpdi->item.cchTextMax);
906 }
907 }
908 else /* no extension found */
909 { lpdi->item.pszText[0]=0x00;
910 }
911 }
912 break;
913 case 3: /* date */
914 _ILGetFileDate (pidl, lpdi->item.pszText, lpdi->item.cchTextMax);
915 break;
916 }
917 }
918 else /*its a folder*/
919 { switch (lpdi->item.iSubItem)
920 { case 1:
921 strcpy(lpdi->item.pszText, "");
922 break;
923 case 2:
924 lstrcpynA (lpdi->item.pszText, "Folder", lpdi->item.cchTextMax);
925 break;
926 case 3:
927 _ILGetFileDate (pidl, lpdi->item.pszText, lpdi->item.cchTextMax);
928 break;
929 }
930 }
931 TRACE("-- text=%s\n",lpdi->item.pszText);
932 }
933 }
934 else /*the item text is being requested*/
935 {
936 if(lpdi->item.mask & LVIF_TEXT) /*is the text being requested?*/
937 {
938 if(SUCCEEDED(IShellFolder_GetDisplayNameOf(This->pSFParent,pidl, SHGDN_NORMAL | SHGDN_INFOLDER, &str)))
939 {
940 StrRetToStrNA(lpdi->item.pszText, lpdi->item.cchTextMax, &str, pidl);
941 }
942 TRACE("-- text=%s\n",lpdi->item.pszText);
943 }
944
945 if(lpdi->item.mask & LVIF_IMAGE) /*is the image being requested?*/
946 {
947 lpdi->item.iImage = SHMapPIDLToSystemImageListIndex(This->pSFParent, pidl, 0);
948 }
949 }
950 break;
951
952 case LVN_ITEMCHANGED:
953 TRACE("-- LVN_ITEMCHANGED %p\n",This);
954 OnStateChange(This, CDBOSC_SELCHANGE); /* the browser will get the IDataObject now */
955 break;
956
957 case LVN_BEGINDRAG:
958 case LVN_BEGINRDRAG:
959
960 if (ShellView_GetSelections(This))
961 {
962 IDataObject * pda;
963 DWORD dwAttributes;
964 DWORD dwEffect = DROPEFFECT_COPY | DROPEFFECT_MOVE;
965
966 if (SUCCEEDED(IShellFolder_GetUIObjectOf(This->pSFParent, This->hWnd, This->cidl, This->apidl, &IID_IDataObject,0,(LPVOID *)&pda)))
967 {
968 IDropSource * pds = (IDropSource*)&(This->lpvtblDropSource); /* own DropSource interface */
969
970 if (SUCCEEDED(IShellFolder_GetAttributesOf(This->pSFParent, This->cidl, This->apidl, &dwAttributes)))
971 {
972 if (dwAttributes & SFGAO_CANLINK)
973 {
974 dwEffect |= DROPEFFECT_LINK;
975 }
976 }
977
978 if (pds)
979 {
980 DWORD dwEffect;
981 pDoDragDrop(pda, pds, dwEffect, &dwEffect);
982 }
983
984 IDataObject_Release(pda);
985 }
986 }
987 break;
988
989 case LVN_BEGINLABELEDITA:
990 case LVN_ENDLABELEDITA:
991 FIXME("labeledit\n");
992 break;
993
994 default:
995// TRACE("-- %p WM_COMMAND %s unhandled\n", This, SPY_GetMsgName(lpnmh->code));
996 break;;
997 }
998 return 0;
999}
1000
1001/**********************************************************
1002* ShellView_WndProc
1003*/
1004
1005static LRESULT CALLBACK ShellView_WndProc(HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam)
1006{
1007 IShellViewImpl * pThis = (IShellViewImpl*)GetWindowLongA(hWnd, GWL_USERDATA);
1008 LPCREATESTRUCTA lpcs;
1009
1010 TRACE("(hwnd=%x msg=%x wparm=%x lparm=%lx)\n",hWnd, uMessage, wParam, lParam);
1011
1012 switch (uMessage)
1013 {
1014 case WM_NCCREATE:
1015 lpcs = (LPCREATESTRUCTA)lParam;
1016 pThis = (IShellViewImpl*)(lpcs->lpCreateParams);
1017 SetWindowLongA(hWnd, GWL_USERDATA, (LONG)pThis);
1018 pThis->hWnd = hWnd; /*set the window handle*/
1019 break;
1020
1021 case WM_SIZE: return ShellView_OnSize(pThis,LOWORD(lParam), HIWORD(lParam));
1022 case WM_SETFOCUS: return ShellView_OnSetFocus(pThis);
1023 case WM_KILLFOCUS: return ShellView_OnKillFocus(pThis);
1024 case WM_CREATE: return ShellView_OnCreate(pThis);
1025 case WM_ACTIVATE: return ShellView_OnActivate(pThis, SVUIA_ACTIVATE_FOCUS);
1026 case WM_NOTIFY: return ShellView_OnNotify(pThis,(UINT)wParam, (LPNMHDR)lParam);
1027 case WM_COMMAND: return ShellView_OnCommand(pThis,
1028 GET_WM_COMMAND_ID(wParam, lParam),
1029 GET_WM_COMMAND_CMD(wParam, lParam),
1030 GET_WM_COMMAND_HWND(wParam, lParam));
1031
1032 case WM_CONTEXTMENU: ShellView_DoContextMenu(pThis, LOWORD(lParam), HIWORD(lParam), FALSE);
1033 return 0;
1034
1035 case WM_SHOWWINDOW: UpdateWindow(pThis->hWndList);
1036 break;
1037
1038 case WM_DESTROY: pRevokeDragDrop(pThis->hWnd);
1039 break;
1040 }
1041
1042 return DefWindowProcA (hWnd, uMessage, wParam, lParam);
1043}
1044/**********************************************************
1045*
1046*
1047* The INTERFACE of the IShellView object
1048*
1049*
1050**********************************************************
1051* IShellView_QueryInterface
1052*/
1053static HRESULT WINAPI IShellView_fnQueryInterface(IShellView * iface,REFIID riid, LPVOID *ppvObj)
1054{
1055 ICOM_THIS(IShellViewImpl, iface);
1056
1057 char xriid[50];
1058 WINE_StringFromCLSID((LPCLSID)riid,xriid);
1059 TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,xriid,ppvObj);
1060
1061 *ppvObj = NULL;
1062
1063 if(IsEqualIID(riid, &IID_IUnknown))
1064 {
1065 *ppvObj = This;
1066 }
1067 else if(IsEqualIID(riid, &IID_IShellView))
1068 {
1069 *ppvObj = (IShellView*)This;
1070 }
1071 else if(IsEqualIID(riid, &IID_IOleCommandTarget))
1072 {
1073 *ppvObj = (IOleCommandTarget*)&(This->lpvtblOleCommandTarget);
1074 }
1075 else if(IsEqualIID(riid, &IID_IDropTarget))
1076 {
1077 *ppvObj = (IDropTarget*)&(This->lpvtblDropTarget);
1078 }
1079 else if(IsEqualIID(riid, &IID_IDropSource))
1080 {
1081 *ppvObj = (IDropSource*)&(This->lpvtblDropSource);
1082 }
1083 else if(IsEqualIID(riid, &IID_IViewObject))
1084 {
1085 *ppvObj = (IViewObject*)&(This->lpvtblViewObject);
1086 }
1087
1088 if(*ppvObj)
1089 {
1090 IUnknown_AddRef( (IUnknown*)*ppvObj );
1091 TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
1092 return S_OK;
1093 }
1094 TRACE("-- Interface: E_NOINTERFACE\n");
1095 return E_NOINTERFACE;
1096}
1097
1098/**********************************************************
1099* IShellView_AddRef
1100*/
1101static ULONG WINAPI IShellView_fnAddRef(IShellView * iface)
1102{
1103 ICOM_THIS(IShellViewImpl, iface);
1104
1105 TRACE("(%p)->(count=%lu)\n",This,This->ref);
1106
1107 shell32_ObjCount++;
1108 return ++(This->ref);
1109}
1110/**********************************************************
1111* IShellView_Release
1112*/
1113static ULONG WINAPI IShellView_fnRelease(IShellView * iface)
1114{
1115 ICOM_THIS(IShellViewImpl, iface);
1116
1117 TRACE("(%p)->()\n",This);
1118
1119 shell32_ObjCount--;
1120
1121 if (!--(This->ref))
1122 {
1123 TRACE(" destroying IShellView(%p)\n",This);
1124
1125 if(This->pSFParent)
1126 IShellFolder_Release(This->pSFParent);
1127
1128 if (This->apidl)
1129 SHFree(This->apidl);
1130
1131 if (This->pCommDlgBrowser)
1132 ICommDlgBrowser_Release(This->pCommDlgBrowser);
1133
1134 HeapFree(GetProcessHeap(),0,This);
1135 return 0;
1136 }
1137 return This->ref;
1138}
1139
1140/**********************************************************
1141* ShellView_GetWindow
1142*/
1143static HRESULT WINAPI IShellView_fnGetWindow(IShellView * iface,HWND * phWnd)
1144{
1145 ICOM_THIS(IShellViewImpl, iface);
1146
1147 TRACE("(%p)\n",This);
1148
1149 *phWnd = This->hWnd;
1150
1151 return S_OK;
1152}
1153
1154static HRESULT WINAPI IShellView_fnContextSensitiveHelp(IShellView * iface,BOOL fEnterMode)
1155{
1156 ICOM_THIS(IShellViewImpl, iface);
1157
1158 FIXME("(%p) stub\n",This);
1159
1160 return E_NOTIMPL;
1161}
1162
1163/**********************************************************
1164* IShellView_TranslateAccelerator
1165*
1166* FIXME:
1167* use the accel functions
1168*/
1169static HRESULT WINAPI IShellView_fnTranslateAccelerator(IShellView * iface,LPMSG lpmsg)
1170{
1171 ICOM_THIS(IShellViewImpl, iface);
1172
1173 FIXME("(%p)->(%p: hwnd=%x msg=%x lp=%lx wp=%x) stub\n",This,lpmsg, lpmsg->hwnd, lpmsg->message, lpmsg->lParam, lpmsg->wParam);
1174
1175
1176 switch (lpmsg->message)
1177 { case WM_KEYDOWN: TRACE("-- key=0x04%x",lpmsg->wParam) ;
1178 }
1179 return NOERROR;
1180}
1181
1182static HRESULT WINAPI IShellView_fnEnableModeless(IShellView * iface,BOOL fEnable)
1183{
1184 ICOM_THIS(IShellViewImpl, iface);
1185
1186 FIXME("(%p) stub\n",This);
1187
1188 return E_NOTIMPL;
1189}
1190
1191static HRESULT WINAPI IShellView_fnUIActivate(IShellView * iface,UINT uState)
1192{
1193 ICOM_THIS(IShellViewImpl, iface);
1194
1195 CHAR szName[MAX_PATH];
1196 LRESULT lResult;
1197 int nPartArray[1] = {-1};
1198
1199 TRACE("(%p)->(state=%x) stub\n",This, uState);
1200
1201 /*don't do anything if the state isn't really changing*/
1202 if(This->uState == uState)
1203 {
1204 return S_OK;
1205 }
1206
1207 /*OnActivate handles the menu merging and internal state*/
1208 ShellView_OnActivate(This, uState);
1209
1210 /*only do This if we are active*/
1211 if(uState != SVUIA_DEACTIVATE)
1212 {
1213
1214 IShellFolder_GetFolderPath( This->pSFParent, szName, sizeof(szName) );
1215
1216 /* set the number of parts */
1217 IShellBrowser_SendControlMsg(This->pShellBrowser, FCW_STATUS, SB_SETPARTS, 1,
1218 (LPARAM)nPartArray, &lResult);
1219
1220 /* set the text for the parts */
1221 IShellBrowser_SendControlMsg(This->pShellBrowser, FCW_STATUS, SB_SETTEXTA,
1222 0, (LPARAM)szName, &lResult);
1223 }
1224
1225 return S_OK;
1226}
1227
1228static HRESULT WINAPI IShellView_fnRefresh(IShellView * iface)
1229{
1230 ICOM_THIS(IShellViewImpl, iface);
1231
1232 TRACE("(%p)\n",This);
1233
1234 ListView_DeleteAllItems(This->hWndList);
1235 ShellView_FillList(This);
1236
1237 return S_OK;
1238}
1239
1240static HRESULT WINAPI IShellView_fnCreateViewWindow(
1241 IShellView * iface,
1242 IShellView *lpPrevView,
1243 LPCFOLDERSETTINGS lpfs,
1244 IShellBrowser * psb,
1245 RECT * prcView,
1246 HWND *phWnd)
1247{
1248 ICOM_THIS(IShellViewImpl, iface);
1249
1250 WNDCLASSA wc;
1251 *phWnd = 0;
1252
1253
1254 TRACE("(%p)->(shlview=%p set=%p shlbrs=%p rec=%p hwnd=%p) incomplete\n",This, lpPrevView,lpfs, psb, prcView, phWnd);
1255 TRACE("-- vmode=%x flags=%x left=%i top=%i right=%i bottom=%i\n",lpfs->ViewMode, lpfs->fFlags ,prcView->left,prcView->top, prcView->right, prcView->bottom);
1256
1257 /*set up the member variables*/
1258 This->pShellBrowser = psb;
1259 This->FolderSettings = *lpfs;
1260
1261 /*get our parent window*/
1262 IShellBrowser_AddRef(This->pShellBrowser);
1263 IShellBrowser_GetWindow(This->pShellBrowser, &(This->hWndParent));
1264
1265 /* try to get the ICommDlgBrowserInterface, adds a reference !!! */
1266 This->pCommDlgBrowser=NULL;
1267 if ( SUCCEEDED (IShellBrowser_QueryInterface( This->pShellBrowser,
1268 (REFIID)&IID_ICommDlgBrowser, (LPVOID*) &This->pCommDlgBrowser)))
1269 {
1270 TRACE("-- CommDlgBrowser\n");
1271 }
1272
1273 /*if our window class has not been registered, then do so*/
1274 if(!GetClassInfoA(shell32_hInstance, SV_CLASS_NAME, &wc))
1275 {
1276 ZeroMemory(&wc, sizeof(wc));
1277 wc.style = CS_HREDRAW | CS_VREDRAW;
1278 wc.lpfnWndProc = (WNDPROC) ShellView_WndProc;
1279 wc.cbClsExtra = 0;
1280 wc.cbWndExtra = 0;
1281 wc.hInstance = shell32_hInstance;
1282 wc.hIcon = 0;
1283 wc.hCursor = LoadCursorA (0, IDC_ARROWA);
1284 wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);
1285 wc.lpszMenuName = NULL;
1286 wc.lpszClassName = SV_CLASS_NAME;
1287
1288 if(!RegisterClassA(&wc))
1289 return E_FAIL;
1290 }
1291
1292 *phWnd = CreateWindowExA(0,
1293 SV_CLASS_NAME,
1294 NULL,
1295 WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS,
1296 prcView->left,
1297 prcView->top,
1298 prcView->right - prcView->left,
1299 prcView->bottom - prcView->top,
1300 This->hWndParent,
1301 0,
1302 shell32_hInstance,
1303 (LPVOID)This);
1304
1305 CheckToolbar(This);
1306
1307 if(!*phWnd)
1308 return E_FAIL;
1309
1310 return S_OK;
1311}
1312
1313static HRESULT WINAPI IShellView_fnDestroyViewWindow(IShellView * iface)
1314{
1315 ICOM_THIS(IShellViewImpl, iface);
1316
1317 TRACE("(%p)\n",This);
1318
1319 /*Make absolutely sure all our UI is cleaned up.*/
1320 IShellView_UIActivate((IShellView*)This, SVUIA_DEACTIVATE);
1321
1322 if(This->hMenu)
1323 {
1324 DestroyMenu(This->hMenu);
1325 }
1326
1327 DestroyWindow(This->hWnd);
1328 IShellBrowser_Release(This->pShellBrowser);
1329
1330 return S_OK;
1331}
1332
1333static HRESULT WINAPI IShellView_fnGetCurrentInfo(IShellView * iface, LPFOLDERSETTINGS lpfs)
1334{
1335 ICOM_THIS(IShellViewImpl, iface);
1336
1337 TRACE("(%p)->(%p) vmode=%x flags=%x\n",This, lpfs,
1338 This->FolderSettings.ViewMode, This->FolderSettings.fFlags);
1339
1340 if (!lpfs) return E_INVALIDARG;
1341
1342 *lpfs = This->FolderSettings;
1343 return NOERROR;
1344}
1345
1346static HRESULT WINAPI IShellView_fnAddPropertySheetPages(IShellView * iface, DWORD dwReserved,LPFNADDPROPSHEETPAGE lpfn, LPARAM lparam)
1347{
1348 ICOM_THIS(IShellViewImpl, iface);
1349
1350 FIXME("(%p) stub\n",This);
1351
1352 return E_NOTIMPL;
1353}
1354
1355static HRESULT WINAPI IShellView_fnSaveViewState(IShellView * iface)
1356{
1357 ICOM_THIS(IShellViewImpl, iface);
1358
1359 FIXME("(%p) stub\n",This);
1360
1361 return S_OK;
1362}
1363
1364static HRESULT WINAPI IShellView_fnSelectItem(IShellView * iface, LPCITEMIDLIST pidlItem, UINT uFlags)
1365{ ICOM_THIS(IShellViewImpl, iface);
1366
1367 FIXME("(%p)->(pidl=%p, 0x%08x) stub\n",This, pidlItem, uFlags);
1368
1369 return E_NOTIMPL;
1370}
1371
1372static HRESULT WINAPI IShellView_fnGetItemObject(IShellView * iface, UINT uItem, REFIID riid, LPVOID *ppvOut)
1373{
1374 ICOM_THIS(IShellViewImpl, iface);
1375
1376 char xriid[50];
1377
1378 WINE_StringFromCLSID((LPCLSID)riid,xriid);
1379 TRACE("(%p)->(uItem=0x%08x,\n\tIID=%s, ppv=%p)\n",This, uItem, xriid, ppvOut);
1380
1381 *ppvOut = NULL;
1382
1383 switch(uItem)
1384 {
1385 case SVGIO_BACKGROUND:
1386 *ppvOut = ISvBgCm_Constructor();
1387 break;
1388
1389 case SVGIO_SELECTION:
1390 ShellView_GetSelections(This);
1391 IShellFolder_GetUIObjectOf(This->pSFParent, This->hWnd, This->cidl, This->apidl, riid, 0, ppvOut);
1392 break;
1393 }
1394 TRACE("-- (%p)->(interface=%p)\n",This, *ppvOut);
1395
1396 if(!*ppvOut) return E_OUTOFMEMORY;
1397
1398 return S_OK;
1399}
1400
1401struct ICOM_VTABLE(IShellView) svvt =
1402{
1403 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
1404 IShellView_fnQueryInterface,
1405 IShellView_fnAddRef,
1406 IShellView_fnRelease,
1407 IShellView_fnGetWindow,
1408 IShellView_fnContextSensitiveHelp,
1409 IShellView_fnTranslateAccelerator,
1410 IShellView_fnEnableModeless,
1411 IShellView_fnUIActivate,
1412 IShellView_fnRefresh,
1413 IShellView_fnCreateViewWindow,
1414 IShellView_fnDestroyViewWindow,
1415 IShellView_fnGetCurrentInfo,
1416 IShellView_fnAddPropertySheetPages,
1417 IShellView_fnSaveViewState,
1418 IShellView_fnSelectItem,
1419 IShellView_fnGetItemObject
1420};
1421
1422
1423/**********************************************************
1424 * ISVOleCmdTarget_QueryInterface (IUnknown)
1425 */
1426static HRESULT WINAPI ISVOleCmdTarget_QueryInterface(
1427 IOleCommandTarget * iface,
1428 REFIID iid,
1429 LPVOID* ppvObj)
1430{
1431 _ICOM_THIS_From_IOleCommandTarget(IShellViewImpl, iface);
1432
1433 return IShellFolder_QueryInterface((IShellFolder*)This, iid, ppvObj);
1434}
1435
1436/**********************************************************
1437 * ISVOleCmdTarget_AddRef (IUnknown)
1438 */
1439static ULONG WINAPI ISVOleCmdTarget_AddRef(
1440 IOleCommandTarget * iface)
1441{
1442 _ICOM_THIS_From_IOleCommandTarget(IShellFolder, iface);
1443
1444 return IShellFolder_AddRef((IShellFolder*)This);
1445}
1446
1447/**********************************************************
1448 * ISVOleCmdTarget_Release (IUnknown)
1449 */
1450static ULONG WINAPI ISVOleCmdTarget_Release(
1451 IOleCommandTarget * iface)
1452{
1453 _ICOM_THIS_From_IOleCommandTarget(IShellViewImpl, iface);
1454
1455 return IShellFolder_Release((IShellFolder*)This);
1456}
1457
1458/**********************************************************
1459 * ISVOleCmdTarget_QueryStatus (IOleCommandTarget)
1460 */
1461static HRESULT WINAPI ISVOleCmdTarget_QueryStatus(
1462 IOleCommandTarget *iface,
1463 const GUID* pguidCmdGroup,
1464 ULONG cCmds,
1465 OLECMD * prgCmds,
1466 OLECMDTEXT* pCmdText)
1467{
1468 char xguid[50];
1469
1470 _ICOM_THIS_From_IOleCommandTarget(IShellViewImpl, iface);
1471
1472 WINE_StringFromCLSID((LPCLSID)pguidCmdGroup,xguid);
1473
1474 FIXME("(%p)->(%p(%s) 0x%08lx %p %p\n", This, pguidCmdGroup, xguid, cCmds, prgCmds, pCmdText);
1475 return E_NOTIMPL;
1476}
1477
1478/**********************************************************
1479 * ISVOleCmdTarget_Exec (IOleCommandTarget)
1480 *
1481 * nCmdID is the OLECMDID_* enumeration
1482 */
1483static HRESULT WINAPI ISVOleCmdTarget_Exec(
1484 IOleCommandTarget *iface,
1485 const GUID* pguidCmdGroup,
1486 DWORD nCmdID,
1487 DWORD nCmdexecopt,
1488 VARIANT* pvaIn,
1489 VARIANT* pvaOut)
1490{
1491 char xguid[50];
1492
1493 _ICOM_THIS_From_IOleCommandTarget(IShellViewImpl, iface);
1494
1495 WINE_StringFromCLSID((LPCLSID)pguidCmdGroup,xguid);
1496
1497 FIXME("(%p)->(\n\tTarget GUID:%s Command:0x%08lx Opt:0x%08lx %p %p)\n", This, xguid, nCmdID, nCmdexecopt, pvaIn, pvaOut);
1498 return E_NOTIMPL;
1499}
1500
1501ICOM_VTABLE(IOleCommandTarget) ctvt =
1502{
1503 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
1504 ISVOleCmdTarget_QueryInterface,
1505 ISVOleCmdTarget_AddRef,
1506 ISVOleCmdTarget_Release,
1507 ISVOleCmdTarget_QueryStatus,
1508 ISVOleCmdTarget_Exec
1509};
1510
1511/**********************************************************
1512 * ISVDropTarget implementation
1513 */
1514
1515static HRESULT WINAPI ISVDropTarget_QueryInterface(
1516 IDropTarget *iface,
1517 REFIID riid,
1518 LPVOID *ppvObj)
1519{
1520 char xriid[50];
1521
1522 _ICOM_THIS_From_IDropTarget(IShellViewImpl, iface);
1523
1524 WINE_StringFromCLSID((LPCLSID)riid,xriid);
1525
1526 TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,xriid,ppvObj);
1527
1528 return IShellFolder_QueryInterface((IShellFolder*)This, riid, ppvObj);
1529}
1530
1531static ULONG WINAPI ISVDropTarget_AddRef( IDropTarget *iface)
1532{
1533 _ICOM_THIS_From_IDropTarget(IShellViewImpl, iface);
1534
1535 TRACE("(%p)->(count=%lu)\n",This,This->ref);
1536
1537 return IShellFolder_AddRef((IShellFolder*)This);
1538}
1539
1540static ULONG WINAPI ISVDropTarget_Release( IDropTarget *iface)
1541{
1542 _ICOM_THIS_From_IDropTarget(IShellViewImpl, iface);
1543
1544 TRACE("(%p)->(count=%lu)\n",This,This->ref);
1545
1546 return IShellFolder_Release((IShellFolder*)This);
1547}
1548
1549static HRESULT WINAPI ISVDropTarget_DragEnter(
1550 IDropTarget *iface,
1551 IDataObject *pDataObject,
1552 DWORD grfKeyState,
1553 POINTL pt,
1554 DWORD *pdwEffect)
1555{
1556
1557 _ICOM_THIS_From_IDropTarget(IShellViewImpl, iface);
1558
1559 FIXME("Stub: This=%p, DataObject=%p\n",This,pDataObject);
1560
1561 return E_NOTIMPL;
1562}
1563
1564static HRESULT WINAPI ISVDropTarget_DragOver(
1565 IDropTarget *iface,
1566 DWORD grfKeyState,
1567 POINTL pt,
1568 DWORD *pdwEffect)
1569{
1570 _ICOM_THIS_From_IDropTarget(IShellViewImpl, iface);
1571
1572 FIXME("Stub: This=%p\n",This);
1573
1574 return E_NOTIMPL;
1575}
1576
1577static HRESULT WINAPI ISVDropTarget_DragLeave(
1578 IDropTarget *iface)
1579{
1580 _ICOM_THIS_From_IDropTarget(IShellViewImpl, iface);
1581
1582 FIXME("Stub: This=%p\n",This);
1583
1584 return E_NOTIMPL;
1585}
1586
1587static HRESULT WINAPI ISVDropTarget_Drop(
1588 IDropTarget *iface,
1589 IDataObject* pDataObject,
1590 DWORD grfKeyState,
1591 POINTL pt,
1592 DWORD *pdwEffect)
1593{
1594 _ICOM_THIS_From_IDropTarget(IShellViewImpl, iface);
1595
1596 FIXME("Stub: This=%p\n",This);
1597
1598 return E_NOTIMPL;
1599}
1600
1601struct ICOM_VTABLE(IDropTarget) dtvt =
1602{
1603 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
1604 ISVDropTarget_QueryInterface,
1605 ISVDropTarget_AddRef,
1606 ISVDropTarget_Release,
1607 ISVDropTarget_DragEnter,
1608 ISVDropTarget_DragOver,
1609 ISVDropTarget_DragLeave,
1610 ISVDropTarget_Drop
1611};
1612
1613/**********************************************************
1614 * ISVDropSource implementation
1615 */
1616
1617static HRESULT WINAPI ISVDropSource_QueryInterface(
1618 IDropSource *iface,
1619 REFIID riid,
1620 LPVOID *ppvObj)
1621{
1622 char xriid[50];
1623
1624 _ICOM_THIS_From_IDropSource(IShellViewImpl, iface);
1625
1626 WINE_StringFromCLSID((LPCLSID)riid,xriid);
1627
1628 TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,xriid,ppvObj);
1629
1630 return IShellFolder_QueryInterface((IShellFolder*)This, riid, ppvObj);
1631}
1632
1633static ULONG WINAPI ISVDropSource_AddRef( IDropSource *iface)
1634{
1635 _ICOM_THIS_From_IDropSource(IShellViewImpl, iface);
1636
1637 TRACE("(%p)->(count=%lu)\n",This,This->ref);
1638
1639 return IShellFolder_AddRef((IShellFolder*)This);
1640}
1641
1642static ULONG WINAPI ISVDropSource_Release( IDropSource *iface)
1643{
1644 _ICOM_THIS_From_IDropSource(IShellViewImpl, iface);
1645
1646 TRACE("(%p)->(count=%lu)\n",This,This->ref);
1647
1648 return IShellFolder_Release((IShellFolder*)This);
1649}
1650static HRESULT WINAPI ISVDropSource_QueryContinueDrag(
1651 IDropSource *iface,
1652 BOOL fEscapePressed,
1653 DWORD grfKeyState)
1654{
1655 _ICOM_THIS_From_IDropSource(IShellViewImpl, iface);
1656 TRACE("(%p)\n",This);
1657
1658 if (fEscapePressed)
1659 return DRAGDROP_S_CANCEL;
1660 else if (!(grfKeyState & MK_LBUTTON) && !(grfKeyState & MK_RBUTTON))
1661 return DRAGDROP_S_DROP;
1662 else
1663 return NOERROR;
1664}
1665
1666static HRESULT WINAPI ISVDropSource_GiveFeedback(
1667 IDropSource *iface,
1668 DWORD dwEffect)
1669{
1670 _ICOM_THIS_From_IDropSource(IShellViewImpl, iface);
1671 TRACE("(%p)\n",This);
1672
1673 return DRAGDROP_S_USEDEFAULTCURSORS;
1674}
1675
1676struct ICOM_VTABLE(IDropSource) dsvt =
1677{
1678 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
1679 ISVDropSource_QueryInterface,
1680 ISVDropSource_AddRef,
1681 ISVDropSource_Release,
1682 ISVDropSource_QueryContinueDrag,
1683 ISVDropSource_GiveFeedback
1684};
1685/**********************************************************
1686 * ISVViewObject implementation
1687 */
1688
1689static HRESULT WINAPI ISVViewObject_QueryInterface(
1690 IViewObject *iface,
1691 REFIID riid,
1692 LPVOID *ppvObj)
1693{
1694 char xriid[50];
1695
1696 _ICOM_THIS_From_IViewObject(IShellViewImpl, iface);
1697
1698 WINE_StringFromCLSID((LPCLSID)riid,xriid);
1699
1700 TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,xriid,ppvObj);
1701
1702 return IShellFolder_QueryInterface((IShellFolder*)This, riid, ppvObj);
1703}
1704
1705static ULONG WINAPI ISVViewObject_AddRef( IViewObject *iface)
1706{
1707 _ICOM_THIS_From_IViewObject(IShellViewImpl, iface);
1708
1709 TRACE("(%p)->(count=%lu)\n",This,This->ref);
1710
1711 return IShellFolder_AddRef((IShellFolder*)This);
1712}
1713
1714static ULONG WINAPI ISVViewObject_Release( IViewObject *iface)
1715{
1716 _ICOM_THIS_From_IViewObject(IShellViewImpl, iface);
1717
1718 TRACE("(%p)->(count=%lu)\n",This,This->ref);
1719
1720 return IShellFolder_Release((IShellFolder*)This);
1721}
1722
1723static HRESULT WINAPI ISVViewObject_Draw(
1724 IViewObject *iface,
1725 DWORD dwDrawAspect,
1726 LONG lindex,
1727 void* pvAspect,
1728 DVTARGETDEVICE* ptd,
1729 HDC hdcTargetDev,
1730 HDC hdcDraw,
1731 LPCRECTL lprcBounds,
1732 LPCRECTL lprcWBounds,
1733 IVO_ContCallback pfnContinue,
1734 DWORD dwContinue)
1735{
1736
1737 _ICOM_THIS_From_IViewObject(IShellViewImpl, iface);
1738
1739 FIXME("Stub: This=%p\n",This);
1740
1741 return E_NOTIMPL;
1742}
1743static HRESULT WINAPI ISVViewObject_GetColorSet(
1744 IViewObject *iface,
1745 DWORD dwDrawAspect,
1746 LONG lindex,
1747 void *pvAspect,
1748 DVTARGETDEVICE* ptd,
1749 HDC hicTargetDevice,
1750 tagLOGPALETTE** ppColorSet)
1751{
1752
1753 _ICOM_THIS_From_IViewObject(IShellViewImpl, iface);
1754
1755 FIXME("Stub: This=%p\n",This);
1756
1757 return E_NOTIMPL;
1758}
1759static HRESULT WINAPI ISVViewObject_Freeze(
1760 IViewObject *iface,
1761 DWORD dwDrawAspect,
1762 LONG lindex,
1763 void* pvAspect,
1764 DWORD* pdwFreeze)
1765{
1766
1767 _ICOM_THIS_From_IViewObject(IShellViewImpl, iface);
1768
1769 FIXME("Stub: This=%p\n",This);
1770
1771 return E_NOTIMPL;
1772}
1773static HRESULT WINAPI ISVViewObject_Unfreeze(
1774 IViewObject *iface,
1775 DWORD dwFreeze)
1776{
1777
1778 _ICOM_THIS_From_IViewObject(IShellViewImpl, iface);
1779
1780 FIXME("Stub: This=%p\n",This);
1781
1782 return E_NOTIMPL;
1783}
1784static HRESULT WINAPI ISVViewObject_SetAdvise(
1785 IViewObject *iface,
1786 DWORD aspects,
1787 DWORD advf,
1788 IAdviseSink* pAdvSink)
1789{
1790
1791 _ICOM_THIS_From_IViewObject(IShellViewImpl, iface);
1792
1793 FIXME("Stub: This=%p\n",This);
1794
1795 return E_NOTIMPL;
1796}
1797static HRESULT WINAPI ISVViewObject_GetAdvise(
1798 IViewObject *iface,
1799 DWORD* pAspects,
1800 DWORD* pAdvf,
1801 IAdviseSink** ppAdvSink)
1802{
1803
1804 _ICOM_THIS_From_IViewObject(IShellViewImpl, iface);
1805
1806 FIXME("Stub: This=%p\n",This);
1807
1808 return E_NOTIMPL;
1809}
1810
1811
1812struct ICOM_VTABLE(IViewObject) vovt =
1813{
1814 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
1815 ISVViewObject_QueryInterface,
1816 ISVViewObject_AddRef,
1817 ISVViewObject_Release,
1818 ISVViewObject_Draw,
1819 ISVViewObject_GetColorSet,
1820 ISVViewObject_Freeze,
1821 ISVViewObject_Unfreeze,
1822 ISVViewObject_SetAdvise,
1823 ISVViewObject_GetAdvise
1824};
1825
Note: See TracBrowser for help on using the repository browser.