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