4 * Copyright 1998 <juergen.schmied@metronet.de>
6 * FIXME: when the ShellView_WndProc gets a WM_NCDESTROY should we do a
21 #include "if_macros.h"
22 #include "shell32_main.h"
25 /***********************************************************************
26 * IShellView implementation
28 static HRESULT WINAPI IShellView_QueryInterface(LPSHELLVIEW,REFIID, LPVOID *);
29 static ULONG WINAPI IShellView_AddRef(LPSHELLVIEW) ;
30 static ULONG WINAPI IShellView_Release(LPSHELLVIEW);
31 /* IOleWindow methods */
32 static HRESULT WINAPI IShellView_GetWindow(LPSHELLVIEW,HWND32 * lphwnd);
33 static HRESULT WINAPI IShellView_ContextSensitiveHelp(LPSHELLVIEW,BOOL32 fEnterMode);
34 /* IShellView methods */
35 static HRESULT WINAPI IShellView_TranslateAccelerator(LPSHELLVIEW,LPMSG32 lpmsg);
36 static HRESULT WINAPI IShellView_EnableModeless(LPSHELLVIEW,BOOL32 fEnable);
37 static HRESULT WINAPI IShellView_UIActivate(LPSHELLVIEW,UINT32 uState);
38 static HRESULT WINAPI IShellView_Refresh(LPSHELLVIEW);
39 static HRESULT WINAPI IShellView_CreateViewWindow(LPSHELLVIEW, IShellView *lpPrevView,LPCFOLDERSETTINGS lpfs, IShellBrowser * psb,RECT32 * prcView, HWND32 *phWnd);
40 static HRESULT WINAPI IShellView_DestroyViewWindow(LPSHELLVIEW);
41 static HRESULT WINAPI IShellView_GetCurrentInfo(LPSHELLVIEW, LPFOLDERSETTINGS lpfs);
42 static HRESULT WINAPI IShellView_AddPropertySheetPages(LPSHELLVIEW, DWORD dwReserved,LPFNADDPROPSHEETPAGE lpfn, LPARAM lparam);
43 static HRESULT WINAPI IShellView_SaveViewState(LPSHELLVIEW);
44 static HRESULT WINAPI IShellView_SelectItem(LPSHELLVIEW, LPCITEMIDLIST pidlItem, UINT32 uFlags);
45 static HRESULT WINAPI IShellView_GetItemObject(LPSHELLVIEW, UINT32 uItem, REFIID riid,LPVOID *ppv);
47 static BOOL32 ShellView_CanDoIDockingWindow(LPSHELLVIEW);
49 static struct IShellView_VTable svvt =
50 { IShellView_QueryInterface,
54 IShellView_ContextSensitiveHelp,
55 IShellView_TranslateAccelerator,
56 IShellView_EnableModeless,
57 IShellView_UIActivate,
59 IShellView_CreateViewWindow,
60 IShellView_DestroyViewWindow,
61 IShellView_GetCurrentInfo,
62 IShellView_AddPropertySheetPages,
63 IShellView_SaveViewState,
64 IShellView_SelectItem,
65 IShellView_GetItemObject
69 #define IDM_VIEW_FILES (FCIDM_SHVIEWFIRST + 0x500)
70 #define IDM_VIEW_IDW (FCIDM_SHVIEWFIRST + 0x501)
71 #define IDM_MYFILEITEM (FCIDM_SHVIEWFIRST + 0x502)
73 #define ID_LISTVIEW 2000
78 #define TOOLBAR_ID (L"SHELLDLL_DefView")
80 #define GET_WM_COMMAND_ID(wp, lp) LOWORD(wp)
81 #define GET_WM_COMMAND_HWND(wp, lp) (HWND32)(lp)
82 #define GET_WM_COMMAND_CMD(wp, lp) HIWORD(wp)
84 #define WM_SETTINGCHANGE WM_WININICHANGE
85 extern void WINAPI _InsertMenuItem (HMENU32 hmenu, UINT32 indexMenu, BOOL32 fByPosition,
86 UINT32 wID, UINT32 fType, LPSTR dwTypeData, UINT32 fState);
96 } MYTOOLINFO, *LPMYTOOLINFO;
98 extern LPCVOID _Resource_Men_MENU_001_0_data;
99 extern LPCVOID _Resource_Men_MENU_002_0_data;
101 MYTOOLINFO g_Tools[] =
102 { {IDM_VIEW_FILES, 0, IDS_TB_VIEW_FILES, IDS_MI_VIEW_FILES, 0, TBSTATE_ENABLED, TBSTYLE_BUTTON},
103 {-1, 0, 0, 0, 0, 0, 0}
108 typedef void (CALLBACK *PFNSHGETSETTINGSPROC)(LPSHELLFLAGSTATE lpsfs, DWORD dwMask);
110 /**************************************************************************
111 * IShellView_Constructor
113 LPSHELLVIEW IShellView_Constructor( LPSHELLFOLDER pFolder, LPCITEMIDLIST pidl)
115 sv=(LPSHELLVIEW)HeapAlloc(GetProcessHeap(),0,sizeof(IShellView));
119 sv->mpidl = ILClone(pidl);
121 sv->pSFParent = pFolder;
123 sv->aSelectedItems = NULL;
126 sv->pSFParent->lpvtbl->fnAddRef(sv->pSFParent);
128 TRACE(shell,"(%p)->(%p pidl=%p)\n",sv, pFolder, pidl);
132 /**************************************************************************
133 * helperfunctions for communication with ICommDlgBrowser
136 static BOOL32 IsInCommDlg(LPSHELLVIEW this)
137 { return(this->pCommDlgBrowser != NULL);
139 static HRESULT IncludeObject(LPSHELLVIEW this, LPCITEMIDLIST pidl)
140 { if ( IsInCommDlg(this) )
141 { TRACE(shell,"ICommDlgBrowser::IncludeObject pidl=%p\n", pidl);
142 return (this->pCommDlgBrowser->lpvtbl->fnIncludeObject(this->pCommDlgBrowser, this, pidl));
146 static HRESULT OnDefaultCommand(LPSHELLVIEW this)
147 { if (IsInCommDlg(this))
148 { TRACE(shell,"ICommDlgBrowser::OnDefaultCommand\n");
149 return (this->pCommDlgBrowser->lpvtbl->fnOnDefaultCommand(this->pCommDlgBrowser, this));
153 static HRESULT OnStateChange(LPSHELLVIEW this, UINT32 uFlags)
154 { if (IsInCommDlg(this))
155 { TRACE(shell,"ICommDlgBrowser::OnStateChange flags=%x\n", uFlags);
156 return (this->pCommDlgBrowser->lpvtbl->fnOnStateChange(this->pCommDlgBrowser, this, uFlags));
160 static void SetStyle(LPSHELLVIEW this, DWORD dwAdd, DWORD dwRemove)
163 TRACE(shell,"(%p)\n", this);
165 tmpstyle = GetWindowLong32A(this->hWndList, GWL_STYLE);
166 SetWindowLong32A(this->hWndList, GWL_STYLE, dwAdd | (tmpstyle & ~dwRemove));
169 static void CheckToolbar(LPSHELLVIEW this)
174 IShellBrowser_SendControlMsg(this->pShellBrowser, FCW_TOOLBAR, TB_CHECKBUTTON,
175 FCIDM_TB_SMALLICON, (this->FolderSettings.ViewMode==FVM_LIST)? TRUE : FALSE, &result);
176 IShellBrowser_SendControlMsg(this->pShellBrowser, FCW_TOOLBAR, TB_CHECKBUTTON,
177 FCIDM_TB_REPORTVIEW, (this->FolderSettings.ViewMode==FVM_DETAILS)? TRUE : FALSE, &result);
178 IShellBrowser_SendControlMsg(this->pShellBrowser, FCW_TOOLBAR, TB_ENABLEBUTTON,
179 FCIDM_TB_SMALLICON, TRUE, &result);
180 IShellBrowser_SendControlMsg(this->pShellBrowser, FCW_TOOLBAR, TB_ENABLEBUTTON,
181 FCIDM_TB_REPORTVIEW, TRUE, &result);
185 static void MergeToolBar(LPSHELLVIEW this)
186 { LRESULT iStdBMOffset;
187 LRESULT iViewBMOffset;
189 TBBUTTON tbActual[6];
192 { IN_STD_BMP = 0x4000,
193 IN_VIEW_BMP = 0x8000,
195 static const TBBUTTON c_tbDefault[] =
196 { { STD_COPY | IN_STD_BMP, FCIDM_SHVIEW_COPY, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0,0}, 0, -1},
197 { 0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, {0,0}, 0, -1 },
198 { VIEW_LARGEICONS | IN_VIEW_BMP, FCIDM_SHVIEW_BIGICON, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0,0}, 0L, -1 },
199 { VIEW_SMALLICONS | IN_VIEW_BMP, FCIDM_SHVIEW_SMALLICON, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0,0}, 0L, -1 },
200 { VIEW_LIST | IN_VIEW_BMP, FCIDM_SHVIEW_LISTVIEW, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0,0}, 0L, -1 },
201 { VIEW_DETAILS | IN_VIEW_BMP, FCIDM_SHVIEW_REPORTVIEW, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0,0}, 0L, -1 },
206 ab.hInst = HINST_COMMCTRL; /* hinstCommctrl */
207 ab.nID = IDB_STD_SMALL_COLOR; /* std bitmaps */
208 IShellBrowser_SendControlMsg(this->pShellBrowser,FCW_TOOLBAR,
209 TB_ADDBITMAP, 8, (LPARAM)&ab, &iStdBMOffset);
211 TRACE(shell,"TB_ADDBITMAP returns %lx\n", iStdBMOffset);
213 ab.nID = IDB_VIEW_SMALL_COLOR; /* std view bitmaps */
214 IShellBrowser_SendControlMsg(this->pShellBrowser,FCW_TOOLBAR,
215 TB_ADDBITMAP, 8, (LPARAM)&ab, &iViewBMOffset);
217 TRACE(shell,"TB_ADDBITMAP returns %lx\n", iViewBMOffset);
220 { tbActual[i] = c_tbDefault[i];
221 if (!(tbActual[i].fsStyle & TBSTYLE_SEP))
222 { if (tbActual[i].iBitmap & IN_VIEW_BMP)
223 { tbActual[i].iBitmap = (tbActual[i].iBitmap & ~IN_VIEW_BMP) + iViewBMOffset;
225 else if (tbActual[i].iBitmap & IN_STD_BMP)
226 { tbActual[i].iBitmap = (tbActual[i].iBitmap & ~IN_STD_BMP) + iStdBMOffset;
231 IShellBrowser_SetToolbarItems(this->pShellBrowser,tbActual, 6, FCT_MERGE);
238 /**************************************************************************
239 * ShellView_CreateList()
243 BOOL32 ShellView_CreateList (LPSHELLVIEW this)
246 TRACE(shell,"%p\n",this);
248 dwStyle = WS_TABSTOP | WS_VISIBLE | WS_CHILD | WS_BORDER |
249 LVS_SHAREIMAGELISTS | LVS_EDITLABELS | LVS_ALIGNLEFT;
250 switch (this->FolderSettings.ViewMode)
251 { case FVM_ICON: dwStyle |= LVS_ICON; break;
252 case FVM_DETAILS: dwStyle |= LVS_REPORT; break;
253 case FVM_SMALLICON: dwStyle |= LVS_SMALLICON; break;
254 case FVM_LIST: dwStyle |= LVS_LIST; break;
255 default: dwStyle |= LVS_LIST; break;
257 if (this->FolderSettings.fFlags && FWF_AUTOARRANGE) dwStyle |= LVS_AUTOARRANGE;
258 /*if (this->FolderSettings.fFlags && FWF_DESKTOP); used from explorer*/
259 if (this->FolderSettings.fFlags && FWF_SINGLESEL) dwStyle |= LVS_SINGLESEL;
261 this->hWndList=CreateWindowEx32A( WS_EX_CLIENTEDGE,
267 (HMENU32)ID_LISTVIEW,
274 /* UpdateShellSettings(); */
277 /**************************************************************************
278 * ShellView_InitList()
283 int nColumn1=120; /* width of column */
288 BOOL32 ShellView_InitList(LPSHELLVIEW this)
289 { LVCOLUMN32A lvColumn;
292 TRACE(shell,"%p\n",this);
294 ListView_DeleteAllItems(this->hWndList);
296 /*initialize the columns */
297 lvColumn.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT; /* | LVCF_SUBITEM;*/
298 lvColumn.fmt = LVCFMT_LEFT;
299 lvColumn.pszText = szString;
301 lvColumn.cx = nColumn1;
302 strcpy(szString,"File");
303 /*LoadString32A(shell32_hInstance, IDS_COLUMN1, szString, sizeof(szString));*/
304 ListView_InsertColumn32A(this->hWndList, 0, &lvColumn);
306 lvColumn.cx = nColumn2;
307 strcpy(szString,"Size");
308 ListView_InsertColumn32A(this->hWndList, 1, &lvColumn);
310 lvColumn.cx = nColumn3;
311 strcpy(szString,"Type");
312 ListView_InsertColumn32A(this->hWndList, 2, &lvColumn);
314 lvColumn.cx = nColumn4;
315 strcpy(szString,"Modified");
316 ListView_InsertColumn32A(this->hWndList, 3, &lvColumn);
318 ListView_SetImageList(this->hWndList, ShellSmallIconList, LVSIL_SMALL);
319 ListView_SetImageList(this->hWndList, ShellBigIconList, LVSIL_NORMAL);
323 /**************************************************************************
324 * ShellView_CompareItems()
327 * internal, CALLBACK for DSA_Sort
329 INT32 CALLBACK ShellView_CompareItems(LPVOID lParam1, LPVOID lParam2, LPARAM lpData)
331 TRACE(shell,"pidl1=%p pidl2=%p lpsf=%p\n", lParam1, lParam2, (LPVOID) lpData);
336 ret = (int)((LPSHELLFOLDER)lpData)->lpvtbl->fnCompareIDs((LPSHELLFOLDER)lpData, 0, (LPITEMIDLIST)lParam1, (LPITEMIDLIST)lParam2);
337 TRACE(shell,"ret=%i\n",ret);
341 /**************************************************************************
342 * ShellView_FillList()
348 static HRESULT ShellView_FillList(LPSHELLVIEW this)
349 { LPENUMIDLIST pEnumIDList;
357 TRACE(shell,"%p\n",this);
359 /* get the itemlist from the shfolder*/
360 hRes = this->pSFParent->lpvtbl->fnEnumObjects(this->pSFParent,this->hWnd, SHCONTF_NONFOLDERS | SHCONTF_FOLDERS, &pEnumIDList);
367 /* create a pointer array */
368 hdpa = pDPA_Create(16);
370 { return(E_OUTOFMEMORY);
373 /* copy the items into the array*/
374 while((S_OK == pEnumIDList->lpvtbl->fnNext(pEnumIDList,1, &pidl, &dwFetched)) && dwFetched)
375 { if (pDPA_InsertPtr(hdpa, 0x7fff, pidl) == -1)
381 pDPA_Sort(hdpa, ShellView_CompareItems, (LPARAM)this->pSFParent);
383 /*turn the listview's redrawing off*/
384 SendMessage32A(this->hWndList, WM_SETREDRAW, FALSE, 0);
386 for (i=0; i < DPA_GetPtrCount(hdpa); ++i) /* DPA_GetPtrCount is a macro*/
387 { pidl = (LPITEMIDLIST)DPA_GetPtr(hdpa, i);
388 if (IncludeObject(this, pidl) == S_OK) /* in a commdlg this works as a filemask*/
389 { ZeroMemory(&lvItem, sizeof(lvItem)); /* create the listviewitem*/
390 lvItem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM; /*set the mask*/
391 lvItem.iItem = ListView_GetItemCount(this->hWndList); /*add the item to the end of the list*/
392 lvItem.lParam = (LPARAM) pidl; /*set the item's data*/
393 lvItem.pszText = LPSTR_TEXTCALLBACK32A; /*get text on a callback basis*/
394 lvItem.iImage = I_IMAGECALLBACK; /*get the image on a callback basis*/
395 ListView_InsertItem32A(this->hWndList, &lvItem);
398 SHFree(pidl); /* the listview has the COPY*/
401 /*turn the listview's redrawing back on and force it to draw*/
402 SendMessage32A(this->hWndList, WM_SETREDRAW, TRUE, 0);
403 InvalidateRect32(this->hWndList, NULL, TRUE);
404 UpdateWindow32(this->hWndList);
406 pEnumIDList->lpvtbl->fnRelease(pEnumIDList); /* destroy the list*/
412 /**************************************************************************
413 * ShellView_OnCreate()
418 LRESULT ShellView_OnCreate(LPSHELLVIEW this)
419 { TRACE(shell,"%p\n",this);
421 if(ShellView_CreateList(this))
422 { if(ShellView_InitList(this))
423 { ShellView_FillList(this);
429 /**************************************************************************
432 LRESULT ShellView_OnSize(LPSHELLVIEW this, WORD wWidth, WORD wHeight)
433 { TRACE(shell,"%p width=%u height=%u\n",this, wWidth,wHeight);
435 /*resize the ListView to fit our window*/
437 { MoveWindow32(this->hWndList, 0, 0, wWidth, wHeight, TRUE);
442 /**************************************************************************
443 * ShellView_BuildFileMenu()
445 HMENU32 ShellView_BuildFileMenu(LPSHELLVIEW this)
446 { CHAR szText[MAX_PATH];
451 TRACE(shell,"(%p) semi-stub\n",this);
453 hSubMenu = CreatePopupMenu32();
455 { /*get the number of items in our global array*/
456 for(nTools = 0; g_Tools[nTools].idCommand != -1; nTools++){}
458 /*add the menu items*/
459 for(i = 0; i < nTools; i++)
460 { strcpy(szText, "dummy BuildFileMenu");
462 ZeroMemory(&mii, sizeof(mii));
463 mii.cbSize = sizeof(mii);
464 mii.fMask = MIIM_TYPE | MIIM_ID | MIIM_STATE;
466 if(TBSTYLE_SEP != g_Tools[i].bStyle) /* no seperator*/
467 { mii.fType = MFT_STRING;
468 mii.fState = MFS_ENABLED;
469 mii.dwTypeData = szText;
470 mii.wID = g_Tools[i].idCommand;
473 { mii.fType = MFT_SEPARATOR;
475 /* tack this item onto the end of the menu */
476 InsertMenuItem32A(hSubMenu, (UINT32)-1, TRUE, &mii);
479 TRACE(shell,"-- return (menu=0x%x)\n",hSubMenu);
482 /**************************************************************************
483 * ShellView_MergeFileMenu()
485 void ShellView_MergeFileMenu(LPSHELLVIEW this, HMENU32 hSubMenu)
486 { TRACE(shell,"(%p)->(submenu=0x%08x) stub\n",this,hSubMenu);
489 { /*insert this item at the beginning of the menu */
490 _InsertMenuItem(hSubMenu, 0, TRUE, 0, MFT_SEPARATOR, NULL, MFS_ENABLED);
491 _InsertMenuItem(hSubMenu, 0, TRUE, IDM_MYFILEITEM, MFT_STRING, "dummy45", MFS_ENABLED);
497 /**************************************************************************
498 * ShellView_MergeViewMenu()
501 void ShellView_MergeViewMenu(LPSHELLVIEW this, HMENU32 hSubMenu)
502 { MENUITEMINFO32A mii;
504 TRACE(shell,"(%p)->(submenu=0x%08x)\n",this,hSubMenu);
507 { /*add a separator at the correct position in the menu*/
508 _InsertMenuItem(hSubMenu, FCIDM_MENU_VIEW_SEP_OPTIONS, FALSE, 0, MFT_SEPARATOR, NULL, MFS_ENABLED);
510 ZeroMemory(&mii, sizeof(mii));
511 mii.cbSize = sizeof(mii);
512 mii.fMask = MIIM_SUBMENU | MIIM_TYPE | MIIM_DATA;;
513 mii.fType = MFT_STRING;
514 mii.dwTypeData = "View";
515 mii.hSubMenu = LoadMenuIndirect32A(&_Resource_Men_MENU_001_0_data);
516 InsertMenuItem32A(hSubMenu, FCIDM_MENU_VIEW_SEP_OPTIONS, FALSE, &mii);
519 /**************************************************************************
520 * ShellView_UpdateMenu()
522 LRESULT ShellView_UpdateMenu(LPSHELLVIEW this, HMENU32 hMenu)
523 { TRACE(shell,"(%p)->(menu=0x%08x)\n",this,hMenu);
524 CheckMenuItem32(hMenu, IDM_VIEW_FILES, MF_BYCOMMAND | (g_bViewKeys ? MF_CHECKED: MF_UNCHECKED));
526 if(ShellView_CanDoIDockingWindow(this))
527 { EnableMenuItem32(hMenu, IDM_VIEW_IDW, MF_BYCOMMAND | MF_ENABLED);
528 CheckMenuItem32(hMenu, IDM_VIEW_IDW, MF_BYCOMMAND | (g_bShowIDW ? MF_CHECKED: MF_UNCHECKED));
531 { EnableMenuItem32(hMenu, IDM_VIEW_IDW, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
532 CheckMenuItem32(hMenu, IDM_VIEW_IDW, MF_BYCOMMAND | MF_UNCHECKED);
537 /**************************************************************************
538 * ShellView_OnDeactivate()
543 void ShellView_OnDeactivate(LPSHELLVIEW this)
544 { TRACE(shell,"%p\n",this);
545 if(this->uState != SVUIA_DEACTIVATE)
547 { IShellBrowser_SetMenuSB(this->pShellBrowser,0, 0, 0);
548 IShellBrowser_RemoveMenusSB(this->pShellBrowser,this->hMenu);
549 DestroyMenu32(this->hMenu);
553 this->uState = SVUIA_DEACTIVATE;
557 /**************************************************************************
558 * ShellView_OnActivate()
560 LRESULT ShellView_OnActivate(LPSHELLVIEW this, UINT32 uState)
561 { OLEMENUGROUPWIDTHS32 omw = { {0, 0, 0, 0, 0, 0} };
563 CHAR szText[MAX_PATH];
565 TRACE(shell,"%p uState=%x\n",this,uState);
567 /*don't do anything if the state isn't really changing */
568 if(this->uState == uState)
572 ShellView_OnDeactivate(this);
574 /*only do this if we are active */
575 if(uState != SVUIA_DEACTIVATE)
576 { /*merge the menus */
577 this->hMenu = CreateMenu32();
580 { IShellBrowser_InsertMenusSB(this->pShellBrowser, this->hMenu, &omw);
581 TRACE(shell,"-- after fnInsertMenusSB\n");
582 /*build the top level menu get the menu item's text*/
583 strcpy(szText,"dummy 31");
585 ZeroMemory(&mii, sizeof(mii));
586 mii.cbSize = sizeof(mii);
587 mii.fMask = MIIM_SUBMENU | MIIM_TYPE | MIIM_STATE;
588 mii.fType = MFT_STRING;
589 mii.fState = MFS_ENABLED;
590 mii.dwTypeData = szText;
591 mii.hSubMenu = ShellView_BuildFileMenu(this);
593 /*insert our menu into the menu bar*/
595 { InsertMenuItem32A(this->hMenu, FCIDM_MENU_HELP, FALSE, &mii);
598 /*get the view menu so we can merge with it*/
599 ZeroMemory(&mii, sizeof(mii));
600 mii.cbSize = sizeof(mii);
601 mii.fMask = MIIM_SUBMENU;
603 if(GetMenuItemInfo32A(this->hMenu, FCIDM_MENU_VIEW, FALSE, &mii))
604 { ShellView_MergeViewMenu(this, mii.hSubMenu);
607 /*add the items that should only be added if we have the focus*/
608 if(SVUIA_ACTIVATE_FOCUS == uState)
609 { /*get the file menu so we can merge with it */
610 ZeroMemory(&mii, sizeof(mii));
611 mii.cbSize = sizeof(mii);
612 mii.fMask = MIIM_SUBMENU;
614 if(GetMenuItemInfo32A(this->hMenu, FCIDM_MENU_FILE, FALSE, &mii))
615 { ShellView_MergeFileMenu(this, mii.hSubMenu);
618 TRACE(shell,"-- before fnSetMenuSB\n");
619 IShellBrowser_SetMenuSB(this->pShellBrowser, this->hMenu, 0, this->hWnd);
622 this->uState = uState;
627 /**************************************************************************
628 * ShellView_OnSetFocus()
633 LRESULT ShellView_OnSetFocus(LPSHELLVIEW this)
634 { TRACE(shell,"%p\n",this);
635 /* Tell the browser one of our windows has received the focus. This should always
636 be done before merging menus (OnActivate merges the menus) if one of our
637 windows has the focus.*/
638 IShellBrowser_OnViewWindowActive(this->pShellBrowser,this);
639 ShellView_OnActivate(this, SVUIA_ACTIVATE_FOCUS);
644 /**************************************************************************
645 * ShellView_OnKillFocus()
647 LRESULT ShellView_OnKillFocus(LPSHELLVIEW this)
648 { TRACE(shell,"(%p) stub\n",this);
649 ShellView_OnActivate(this, SVUIA_ACTIVATE_NOFOCUS);
653 /**************************************************************************
654 * ShellView_AddRemoveDockingWindow()
656 BOOL32 ShellView_AddRemoveDockingWindow(LPSHELLVIEW this, BOOL32 bAdd)
657 { BOOL32 bReturn = FALSE;
659 LPSERVICEPROVIDER pSP;
660 LPDOCKINGWINDOWFRAME pFrame;
662 WARN(shell,"(%p)->(badd=0x%08x) semi-stub\n",this,bAdd);
664 /* get the browser's IServiceProvider */
665 hr = IShellBrowser_QueryInterface(this->pShellBrowser, (REFIID)&IID_IServiceProvider, (LPVOID*)&pSP);
667 { /*get the IDockingWindowFrame pointer*/
668 hr = IServiceProvider_QueryService(pSP, (REFGUID)&SID_SShellBrowser, (REFIID)&IID_IDockingWindowFrame, (LPVOID*)&pFrame);
672 FIXME(shell,"no docking implemented\n");
674 if(!this->pDockingWindow)
675 { /* create the toolbar object */
676 this->pDockingWindow = DockingWindow_Constructor(this, this->hWnd);
679 if(this->pDockingWindow)
680 { /*add the toolbar object */
681 hr = pFrame->lpvtbl->fnAddToolbar(pFrame, (IDockingWindow*)this->pDockingWindow, TOOLBAR_ID, 0);
690 { FIXME(shell,"no docking implemented\n");
692 if(this->pDockingWindow)
693 { hr = pFrame->lpvtbl->fnRemoveToolbar(pFrame, (IDockingWindow*)this->pDockingWindow, DWFRF_NORMAL);
696 { /* RemoveToolbar should release the toolbar object which will cause */
697 /*it to destroy itself. Our toolbar object is no longer valid at */
700 this->pDockingWindow = NULL;
706 pFrame->lpvtbl->fnRelease(pFrame);
708 IServiceProvider_Release(pSP);
713 /**************************************************************************
714 * ShellView_CanDoIDockingWindow()
716 BOOL32 ShellView_CanDoIDockingWindow(LPSHELLVIEW this)
717 { BOOL32 bReturn = FALSE;
719 LPSERVICEPROVIDER pSP;
720 LPDOCKINGWINDOWFRAME pFrame;
722 FIXME(shell,"(%p) stub\n",this);
724 /*get the browser's IServiceProvider*/
725 hr = IShellBrowser_QueryInterface(this->pShellBrowser, (REFIID)&IID_IServiceProvider, (LPVOID*)&pSP);
727 { hr = IServiceProvider_QueryService(pSP, (REFGUID)&SID_SShellBrowser, (REFIID)&IID_IDockingWindowFrame, (LPVOID*)&pFrame);
730 pFrame->lpvtbl->fnRelease(pFrame);
732 IServiceProvider_Release(pSP);
737 /**************************************************************************
738 * ShellView_UpdateShellSettings()
740 void ShellView_UpdateShellSettings(LPSHELLVIEW this)
741 { FIXME(shell,"(%p) stub\n",this);
745 HINSTANCE hinstShell32;
747 /* Since SHGetSettings is not implemented in all versions of the shell, get the
748 function address manually at run time. This allows the code to run on all
751 ZeroMemory(&sfs, sizeof(sfs));
753 /* The default, in case any of the following steps fails, is classic Windows 95
756 sfs.fWin95Classic = TRUE;
758 hinstShell32 = LoadLibrary("shell32.dll");
760 { PFNSHGETSETTINGSPROC pfnSHGetSettings;
762 pfnSHGetSettings = (PFNSHGETSETTINGSPROC)GetProcAddress(hinstShell32, "SHGetSettings");
764 { (*pfnSHGetSettings)(&sfs, SSF_DOUBLECLICKINWEBVIEW | SSF_WIN95CLASSIC);
766 FreeLibrary(hinstShell32);
769 DWORD dwExStyles = 0;
771 if(!sfs.fWin95Classic && !sfs.fDoubleClickInWebView)
772 dwExStyles |= LVS_EX_ONECLICKACTIVATE | LVS_EX_TRACKSELECT | LVS_EX_UNDERLINEHOT;
774 ListView_SetExtendedListViewStyle(this->hWndList, dwExStyles);
778 /**************************************************************************
779 * ShellView_OnSettingChange()
781 LRESULT ShellView_OnSettingChange(LPSHELLVIEW this, LPCSTR lpszSection)
782 { TRACE(shell,"(%p) stub\n",this);
783 /*if(0 == lstrcmpi(lpszSection, "ShellState"))*/
784 { ShellView_UpdateShellSettings(this);
789 /**************************************************************************
790 * ShellView_OnCommand()
792 LRESULT ShellView_OnCommand(LPSHELLVIEW this,DWORD dwCmdID, DWORD dwCmd, HWND32 hwndCmd)
793 { TRACE(shell,"(%p)->(0x%08lx 0x%08lx 0x%08x) stub\n",this, dwCmdID, dwCmd, hwndCmd);
795 { case IDM_VIEW_FILES:
796 g_bViewKeys = ! g_bViewKeys;
797 IShellView_Refresh(this);
801 g_bShowIDW = ! g_bShowIDW;
802 ShellView_AddRemoveDockingWindow(this, g_bShowIDW);
806 MessageBeep32(MB_OK);
809 case FCIDM_SHVIEW_SMALLICON:
810 this->FolderSettings.ViewMode = FVM_SMALLICON;
811 SetStyle (this, LVS_SMALLICON, LVS_TYPEMASK);
814 case FCIDM_SHVIEW_BIGICON:
815 this->FolderSettings.ViewMode = FVM_ICON;
816 SetStyle (this, LVS_ICON, LVS_TYPEMASK);
819 case FCIDM_SHVIEW_LISTVIEW:
820 this->FolderSettings.ViewMode = FVM_LIST;
821 SetStyle (this, LVS_LIST, LVS_TYPEMASK);
824 case FCIDM_SHVIEW_REPORTVIEW:
825 this->FolderSettings.ViewMode = FVM_DETAILS;
826 SetStyle (this, LVS_REPORT, LVS_TYPEMASK);
830 FIXME(shell,"-- COMMAND unhandled\n");
835 /**************************************************************************
836 * ShellView_GetSelections()
839 * number of selected items
841 UINT32 ShellView_GetSelections(LPSHELLVIEW this)
846 if (this->aSelectedItems)
847 { SHFree(this->aSelectedItems);
850 this->uSelected = ListView_GetSelectedCount(this->hWndList);
851 this->aSelectedItems = (LPITEMIDLIST*)SHAlloc(this->uSelected * sizeof(LPITEMIDLIST));
853 TRACE(shell,"selected=%i\n", this->uSelected);
855 if(this->aSelectedItems)
856 { TRACE(shell,"-- Items selected =%u\n", this->uSelected);
857 ZeroMemory(&lvItem, sizeof(lvItem));
858 lvItem.mask = LVIF_STATE | LVIF_PARAM;
859 lvItem.stateMask = LVIS_SELECTED;
864 while(ListView_GetItem32A(this->hWndList, &lvItem) && (i < this->uSelected))
865 { if(lvItem.state & LVIS_SELECTED)
866 { this->aSelectedItems[i] = (LPITEMIDLIST)lvItem.lParam;
868 TRACE(shell,"-- selected Item found\n");
873 return this->uSelected;
876 /**************************************************************************
877 * ShellView_DoContextMenu()
879 void ShellView_DoContextMenu(LPSHELLVIEW this, WORD x, WORD y, BOOL32 fDefault)
883 BOOL32 fExplore = FALSE;
887 LPCONTEXTMENU pContextMenu = NULL;
888 CMINVOKECOMMANDINFO32 cmi;
890 TRACE(shell,"(%p)->(0x%08x 0x%08x 0x%08x) stub\n",this, x, y, fDefault);
892 /* look, what's selected and create a context menu object of it*/
893 if(ShellView_GetSelections(this))
894 { this->pSFParent->lpvtbl->fnGetUIObjectOf( this->pSFParent, this->hWndParent, this->uSelected,
895 this->aSelectedItems, (REFIID)&IID_IContextMenu,
896 NULL, (LPVOID *)&pContextMenu);
899 { TRACE(shell,"-- pContextMenu\n");
900 hMenu = CreatePopupMenu32();
903 { /* See if we are in Explore or Open mode. If the browser's tree
904 is present, then we are in Explore mode.*/
906 if(SUCCEEDED(IShellBrowser_GetControlWindow(this->pShellBrowser,FCW_TREE, &hwndTree)) && hwndTree)
907 { TRACE(shell,"-- explore mode\n");
911 wFlags = CMF_NORMAL | (this->uSelected != 1 ? 0 : CMF_CANRENAME) | (fExplore ? CMF_EXPLORE : 0);
913 if (SUCCEEDED(pContextMenu->lpvtbl->fnQueryContextMenu( pContextMenu, hMenu, 0, MENU_OFFSET, MENU_MAX, wFlags )))
915 { TRACE(shell,"-- get menu default command\n");
917 uCommand = nMenuIndex = 0;
918 ZeroMemory(&mii, sizeof(mii));
919 mii.cbSize = sizeof(mii);
920 mii.fMask = MIIM_STATE | MIIM_ID;
922 while(GetMenuItemInfo32A(hMenu, nMenuIndex, TRUE, &mii)) /*find the default item in the menu*/
923 { if(mii.fState & MFS_DEFAULT)
924 { uCommand = mii.wID;
931 { TRACE(shell,"-- track popup\n");
932 uCommand = TrackPopupMenu32( hMenu,TPM_LEFTALIGN | TPM_RETURNCMD,x,y,0,this->hWnd,NULL);
936 { TRACE(shell,"-- uCommand=%u\n", uCommand);
937 if (IsInCommDlg(this) && (((uCommand-MENU_OFFSET)==IDM_EXPLORE) || ((uCommand-MENU_OFFSET)==IDM_OPEN)))
938 { TRACE(shell,"-- dlg: OnDefaultCommand\n");
939 OnDefaultCommand(this);
942 { TRACE(shell,"-- explore -- invoke command\n");
943 ZeroMemory(&cmi, sizeof(cmi));
944 cmi.cbSize = sizeof(cmi);
945 cmi.hwnd = this->hWndParent;
946 cmi.lpVerb = (LPCSTR)MAKEINTRESOURCE32A(uCommand - MENU_OFFSET);
947 pContextMenu->lpvtbl->fnInvokeCommand(pContextMenu, &cmi);
950 DestroyMenu32(hMenu);
954 pContextMenu->lpvtbl->fnRelease(pContextMenu);
957 else /* background context menu */
958 { hMenu = LoadMenuIndirect32A(&_Resource_Men_MENU_002_0_data);
959 uCommand = TrackPopupMenu32( GetSubMenu32(hMenu,0),TPM_LEFTALIGN | TPM_RETURNCMD,x,y,0,this->hWnd,NULL);
960 ShellView_OnCommand(this, uCommand, 0,0);
961 DestroyMenu32(hMenu);
965 /**************************************************************************
966 * ShellView_OnNotify()
969 LRESULT ShellView_OnNotify(LPSHELLVIEW this, UINT32 CtlID, LPNMHDR lpnmh)
970 { NM_LISTVIEW *lpnmlv = (NM_LISTVIEW*)lpnmh;
971 NMLVDISPINFO32A *lpdi = (NMLVDISPINFO32A *)lpnmh;
978 TRACE(shell,"%p CtlID=%u lpnmh->code=%x\n",this,CtlID,lpnmh->code);
982 TRACE(shell,"-- NM_SETFOCUS %p\n",this);
983 ShellView_OnSetFocus(this);
987 TRACE(shell,"-- NM_KILLFOCUS %p\n",this);
988 ShellView_OnDeactivate(this);
991 case HDN_ENDTRACK32A:
992 TRACE(shell,"-- HDN_ENDTRACK32A %p\n",this);
993 /*nColumn1 = ListView_GetColumnWidth(this->hWndList, 0);
994 nColumn2 = ListView_GetColumnWidth(this->hWndList, 1);*/
998 TRACE(shell,"-- LVN_DELETEITEM %p\n",this);
999 SHFree((LPITEMIDLIST)lpnmlv->lParam); /*delete the pidl because we made a copy of it*/
1004 TRACE(shell,"-- NM_RETURN|NM_DBLCLK ignored, waiting for LVN_ITEMACTIVATE\n");
1007 case LVN_ITEMACTIVATE:
1008 TRACE(shell,"-- LVN_ITEMACTIVATE %p\n",this);
1009 OnStateChange(this, CDBOSC_SELCHANGE); /* the browser will get the IDataObject now */
1010 ShellView_DoContextMenu(this, 0, 0, TRUE);
1014 TRACE(shell,"-- NM_RCLICK %p\n",this);
1015 dwCursor = GetMessagePos();
1016 ShellView_DoContextMenu(this, LOWORD(dwCursor), HIWORD(dwCursor), FALSE);
1019 case LVN_GETDISPINFO32A:
1020 TRACE(shell,"-- LVN_GETDISPINFO32A %p\n",this);
1021 pidl = (LPITEMIDLIST)lpdi->item.lParam;
1024 if(lpdi->item.iSubItem) /*is the sub-item information being requested?*/
1025 { if(lpdi->item.mask & LVIF_TEXT) /*is the text being requested?*/
1026 { if(_ILIsValue(pidl)) /*is this a value or a folder?*/
1027 { switch (lpdi->item.iSubItem)
1028 { case 1: /* size */
1029 _ILGetFileSize (pidl, lpdi->item.pszText, lpdi->item.cchTextMax);
1031 case 2: /* extension */
1033 if (_ILGetExtension (pidl, sTemp, 64))
1034 { if (!( HCR_MapTypeToValue(sTemp, sTemp, 64)
1035 && HCR_MapTypeToValue(sTemp, lpdi->item.pszText, lpdi->item.cchTextMax )))
1036 { strncpy (lpdi->item.pszText, sTemp, lpdi->item.cchTextMax);
1037 strncat (lpdi->item.pszText, "-file", lpdi->item.cchTextMax);
1040 else /* no extension found */
1041 { lpdi->item.pszText[0]=0x00;
1046 _ILGetFileDate (pidl, lpdi->item.pszText, lpdi->item.cchTextMax);
1050 else /*its a folder*/
1051 { switch (lpdi->item.iSubItem)
1053 strcpy(lpdi->item.pszText, "");
1056 strncpy (lpdi->item.pszText, "Folder", lpdi->item.cchTextMax);
1059 _ILGetFileDate (pidl, lpdi->item.pszText, lpdi->item.cchTextMax);
1063 TRACE(shell,"-- text=%s\n",lpdi->item.pszText);
1066 else /*the item text is being requested*/
1067 { if(lpdi->item.mask & LVIF_TEXT) /*is the text being requested?*/
1068 { if(SUCCEEDED(this->pSFParent->lpvtbl->fnGetDisplayNameOf(this->pSFParent,pidl, SHGDN_NORMAL | SHGDN_INFOLDER, &str)))
1069 { if(STRRET_WSTR == str.uType)
1070 { WideCharToLocal32(lpdi->item.pszText, str.u.pOleStr, lpdi->item.cchTextMax);
1071 SHFree(str.u.pOleStr);
1073 else if(STRRET_CSTRA == str.uType)
1074 { strncpy(lpdi->item.pszText, str.u.cStr, lpdi->item.cchTextMax);
1077 { FIXME(shell,"type wrong\n");
1080 TRACE(shell,"-- text=%s\n",lpdi->item.pszText);
1083 if(lpdi->item.mask & LVIF_IMAGE) /*is the image being requested?*/
1084 { if(SUCCEEDED(this->pSFParent->lpvtbl->fnGetUIObjectOf(this->pSFParent,this->hWnd,1,
1085 (LPCITEMIDLIST*)&pidl, (REFIID)&IID_IExtractIcon, NULL, (LPVOID*)&pei)))
1086 { pei->lpvtbl->fnGetIconLocation(pei, GIL_FORSHELL, NULL, 0, &lpdi->item.iImage, &uFlags);
1087 pei->lpvtbl->fnRelease(pei);
1088 TRACE(shell,"-- image=%x\n",lpdi->item.iImage);
1095 WARN(shell,"-- NM_CLICK %p\n",this);
1098 case LVN_ITEMCHANGING:
1099 WARN(shell,"-- LVN_ITEMCHANGING %p\n",this);
1102 case LVN_ITEMCHANGED:
1103 TRACE(shell,"-- LVN_ITEMCHANGED %p\n",this);
1104 ShellView_GetSelections(this);
1105 OnStateChange(this, CDBOSC_SELCHANGE); /* the browser will get the IDataObject now */
1108 case LVN_DELETEALLITEMS:
1109 WARN(shell,"-- LVN_DELETEALLITEMS %p\n",this);
1112 case LVN_INSERTITEM:
1113 WARN(shell,"-- LVN_INSERTITEM %p\n",this);
1117 WARN(shell,"-- LVN_BEGINDRAG %p\n",this);
1121 WARN(shell,"NM_CUSTOMDRAW %p\n",this);
1125 FIXME (shell,"-- WM_NOTIFY unhandled\n");
1131 /**************************************************************************
1135 LRESULT CALLBACK ShellView_WndProc(HWND32 hWnd, UINT32 uMessage, WPARAM32 wParam, LPARAM lParam)
1136 { LPSHELLVIEW pThis = (LPSHELLVIEW)GetWindowLong32A(hWnd, GWL_USERDATA);
1137 LPCREATESTRUCT32A lpcs;
1140 TRACE(shell,"(hwnd=%x msg=%x wparm=%x lparm=%lx)\n",hWnd, uMessage, wParam, lParam);
1144 { TRACE(shell,"-- WM_NCCREATE\n");
1145 lpcs = (LPCREATESTRUCT32A)lParam;
1146 pThis = (LPSHELLVIEW)(lpcs->lpCreateParams);
1147 SetWindowLong32A(hWnd, GWL_USERDATA, (LONG)pThis);
1148 pThis->hWnd = hWnd; /*set the window handle*/
1153 TRACE(shell,"-- WM_SIZE\n");
1154 return ShellView_OnSize(pThis,LOWORD(lParam), HIWORD(lParam));
1157 TRACE(shell,"-- WM_SETFOCUS\n");
1158 return ShellView_OnSetFocus(pThis);
1161 TRACE(shell,"-- WM_KILLFOCUS\n");
1162 return ShellView_OnKillFocus(pThis);
1165 TRACE(shell,"-- WM_CREATE\n");
1166 return ShellView_OnCreate(pThis);
1169 TRACE(shell,"-- WM_SHOWWINDOW\n");
1170 UpdateWindow32(pThis->hWndList);
1174 TRACE(shell,"-- WM_ACTIVATE\n");
1175 return ShellView_OnActivate(pThis, SVUIA_ACTIVATE_FOCUS);
1178 TRACE(shell,"-- WM_COMMAND\n");
1179 return ShellView_OnCommand(pThis, GET_WM_COMMAND_ID(wParam, lParam),
1180 GET_WM_COMMAND_CMD(wParam, lParam),
1181 GET_WM_COMMAND_HWND(wParam, lParam));
1183 case WM_INITMENUPOPUP:
1184 TRACE(shell,"-- WM_INITMENUPOPUP\n");
1185 return ShellView_UpdateMenu(pThis, (HMENU32)wParam);
1188 TRACE(shell,"-- WM_NOTIFY\n");
1189 return ShellView_OnNotify(pThis,(UINT32)wParam, (LPNMHDR)lParam);
1191 case WM_SETTINGCHANGE:
1192 TRACE(shell,"-- WM_SETTINGCHANGE\n");
1193 return ShellView_OnSettingChange(pThis,(LPCSTR)lParam);
1195 case WM_PARENTNOTIFY:
1196 TRACE(shell,"-- WM_PARENTNOTIFY\n");
1197 if ( LOWORD(wParam) == WM_RBUTTONDOWN ) /* fixme: should not be handled here*/
1198 { dwCursor = GetMessagePos();
1199 ShellView_DoContextMenu(pThis, LOWORD(dwCursor), HIWORD(dwCursor), FALSE);
1206 WARN(shell,"-- WM_MOVE\n");
1209 case WM_ACTIVATEAPP:
1210 WARN(shell,"-- WM_ACTIVATEAPP\n");
1213 case WM_NOTIFYFORMAT:
1214 WARN(shell,"-- WM_NOTIFYFORMAT\n");
1218 WARN(shell,"-- WM_NCPAINT\n");
1222 WARN(shell,"-- WM_ERASEBKGND\n");
1226 WARN(shell,"-- WM_PAINT\n");
1230 WARN(shell,"-- WM_NCCALCSIZE\n");
1233 case WM_WINDOWPOSCHANGING:
1234 WARN(shell,"-- WM_WINDOWPOSCHANGING\n");
1237 case WM_WINDOWPOSCHANGED:
1238 WARN(shell,"-- WM_WINDOWPOSCHANGED\n");
1241 case WM_MOUSEACTIVATE:
1242 WARN(shell,"-- WM_MOUSEACTIVATE\n");
1246 WARN(shell,"-- WM_SETCURSOR\n");
1250 WARN(shell,"-- WM_DESTROY\n");
1254 WARN(shell,"-- WM_NCDESTROY\n");
1257 case WM_CONTEXTMENU:
1258 WARN(shell,"-- WM_CONTEXTMENU\n");
1262 WARN(shell,"-- WM_MENUSELECT\n");
1265 case WM_CAPTURECHANGED:
1266 WARN(shell,"-- WM_CAPTURECHANGED\n");
1269 case WM_CHILDACTIVATE:
1270 WARN(shell,"-- WM_CHILDACTIVATE\n");
1274 WARN(shell,"-- WM_ENTERIDLE\n");
1278 FIXME(shell,"-- MESSAGE unhandled\n");
1281 return DefWindowProc32A (hWnd, uMessage, wParam, lParam);
1283 /**************************************************************************
1286 * The INTERFACE of the IShellView object
1289 ***************************************************************************
1290 * IShellView_QueryInterface
1292 static HRESULT WINAPI IShellView_QueryInterface(LPSHELLVIEW this,REFIID riid, LPVOID *ppvObj)
1294 WINE_StringFromCLSID((LPCLSID)riid,xriid);
1295 TRACE(shell,"(%p)->(\n\tIID:\t%s,%p)\n",this,xriid,ppvObj);
1299 if(IsEqualIID(riid, &IID_IUnknown)) /*IUnknown*/
1302 else if(IsEqualIID(riid, &IID_IShellView)) /*IShellView*/
1303 { *ppvObj = (IShellView*)this;
1307 { (*(LPSHELLVIEW*)ppvObj)->lpvtbl->fnAddRef(this);
1308 TRACE(shell,"-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
1311 TRACE(shell,"-- Interface: E_NOINTERFACE\n");
1312 return E_NOINTERFACE;
1314 /**************************************************************************
1315 * IShellView::AddRef
1317 static ULONG WINAPI IShellView_AddRef(LPSHELLVIEW this)
1318 { TRACE(shell,"(%p)->(count=%lu)\n",this,(this->ref)+1);
1321 return ++(this->ref);
1323 /**************************************************************************
1324 * IShellView_Release
1326 static ULONG WINAPI IShellView_Release(LPSHELLVIEW this)
1327 { TRACE(shell,"(%p)->()\n",this);
1331 { TRACE(shell," destroying IShellView(%p)\n",this);
1334 this->pSFParent->lpvtbl->fnRelease(this->pSFParent);
1336 if (this->aSelectedItems)
1337 SHFree(this->aSelectedItems);
1339 if (this->pCommDlgBrowser)
1340 this->pCommDlgBrowser->lpvtbl->fnRelease(this->pCommDlgBrowser);
1342 HeapFree(GetProcessHeap(),0,this);
1347 /**************************************************************************
1348 * ShellView_GetWindow
1350 static HRESULT WINAPI IShellView_GetWindow(LPSHELLVIEW this,HWND32 * phWnd)
1351 { TRACE(shell,"(%p)\n",this);
1352 *phWnd = this->hWnd;
1356 static HRESULT WINAPI IShellView_ContextSensitiveHelp(LPSHELLVIEW this,BOOL32 fEnterMode)
1357 { FIXME(shell,"(%p) stub\n",this);
1360 /**************************************************************************
1361 * IShellView_TranslateAccelerator
1364 * use the accel functions
1366 static HRESULT WINAPI IShellView_TranslateAccelerator(LPSHELLVIEW this,LPMSG32 lpmsg)
1367 { FIXME(shell,"(%p)->(%p: hwnd=%x msg=%x lp=%lx wp=%x) stub\n",this,lpmsg, lpmsg->hwnd, lpmsg->message, lpmsg->lParam, lpmsg->wParam);
1370 switch (lpmsg->message)
1371 { case WM_KEYDOWN: TRACE(shell,"-- key=0x04%x",lpmsg->wParam) ;
1375 static HRESULT WINAPI IShellView_EnableModeless(LPSHELLVIEW this,BOOL32 fEnable)
1376 { FIXME(shell,"(%p) stub\n",this);
1379 static HRESULT WINAPI IShellView_UIActivate(LPSHELLVIEW this,UINT32 uState)
1380 { CHAR szName[MAX_PATH];
1382 int nPartArray[1] = {-1};
1384 TRACE(shell,"(%p)->(state=%x) stub\n",this, uState);
1385 /*don't do anything if the state isn't really changing*/
1386 if(this->uState == uState)
1390 /*OnActivate handles the menu merging and internal state*/
1391 ShellView_OnActivate(this, uState);
1393 /*remove the docking window*/
1395 { ShellView_AddRemoveDockingWindow(this, FALSE);
1398 /*only do this if we are active*/
1399 if(uState != SVUIA_DEACTIVATE)
1400 { /*update the status bar */
1401 strcpy(szName, "dummy32");
1403 this->pSFParent->lpvtbl->fnGetFolderPath( this->pSFParent,
1404 szName + strlen(szName),
1405 sizeof(szName) - strlen(szName));
1407 /* set the number of parts */
1408 IShellBrowser_SendControlMsg(this->pShellBrowser, FCW_STATUS, SB_SETPARTS, 1,
1409 (LPARAM)nPartArray, &lResult);
1411 /* set the text for the parts */
1412 IShellBrowser_SendControlMsg(this->pShellBrowser, FCW_STATUS, SB_SETTEXT32A,
1413 0, (LPARAM)szName, &lResult);
1415 /*add the docking window if necessary */
1417 { ShellView_AddRemoveDockingWindow(this, TRUE);
1422 static HRESULT WINAPI IShellView_Refresh(LPSHELLVIEW this)
1423 { TRACE(shell,"(%p)\n",this);
1425 ListView_DeleteAllItems(this->hWndList);
1426 ShellView_FillList(this);
1430 static HRESULT WINAPI IShellView_CreateViewWindow(LPSHELLVIEW this, IShellView *lpPrevView,
1431 LPCFOLDERSETTINGS lpfs, IShellBrowser * psb, RECT32 * prcView, HWND32 *phWnd)
1433 /* LRESULT dwResult;*/
1437 TRACE(shell,"(%p)->(shlview=%p set=%p shlbrs=%p rec=%p hwnd=%p) incomplete\n",this, lpPrevView,lpfs, psb, prcView, phWnd);
1438 TRACE(shell,"-- 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);
1440 /*set up the member variables*/
1441 this->pShellBrowser = psb;
1442 this->FolderSettings = *lpfs;
1444 /*get our parent window*/
1445 IShellBrowser_AddRef(this->pShellBrowser);
1446 IShellBrowser_GetWindow(this->pShellBrowser, &(this->hWndParent));
1448 /* try to get the ICommDlgBrowserInterface, adds a reference !!! */
1449 this->pCommDlgBrowser=NULL;
1450 if ( SUCCEEDED (IShellBrowser_QueryInterface( this->pShellBrowser,
1451 (REFIID)&IID_ICommDlgBrowser, (LPVOID*) &this->pCommDlgBrowser)))
1452 { TRACE(shell,"-- CommDlgBrowser\n");
1455 /*if our window class has not been registered, then do so*/
1456 if(!GetClassInfo32A(shell32_hInstance, SV_CLASS_NAME, &wc))
1457 { ZeroMemory(&wc, sizeof(wc));
1458 wc.style = CS_HREDRAW | CS_VREDRAW;
1459 wc.lpfnWndProc = (WNDPROC32) ShellView_WndProc;
1462 wc.hInstance = shell32_hInstance;
1464 wc.hCursor = LoadCursor32A (0, IDC_ARROW32A);
1465 wc.hbrBackground = (HBRUSH32) (COLOR_WINDOW + 1);
1466 wc.lpszMenuName = NULL;
1467 wc.lpszClassName = SV_CLASS_NAME;
1469 if(!RegisterClass32A(&wc))
1473 *phWnd = CreateWindowEx32A(0, SV_CLASS_NAME, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS,
1474 prcView->left, prcView->top, prcView->right - prcView->left, prcView->bottom - prcView->top,
1475 this->hWndParent, 0, shell32_hInstance, (LPVOID)this);
1485 static HRESULT WINAPI IShellView_DestroyViewWindow(LPSHELLVIEW this)
1486 { TRACE(shell,"(%p)\n",this);
1488 /*Make absolutely sure all our UI is cleaned up.*/
1489 IShellView_UIActivate(this, SVUIA_DEACTIVATE);
1491 { DestroyMenu32(this->hMenu);
1493 DestroyWindow32(this->hWnd);
1494 IShellBrowser_Release(this->pShellBrowser);
1497 static HRESULT WINAPI IShellView_GetCurrentInfo(LPSHELLVIEW this, LPFOLDERSETTINGS lpfs)
1498 { TRACE(shell,"(%p)->(%p) vmode=%x flags=%x\n",this, lpfs,
1499 this->FolderSettings.ViewMode, this->FolderSettings.fFlags);
1502 { *lpfs = this->FolderSettings;
1506 return E_INVALIDARG;
1508 static HRESULT WINAPI IShellView_AddPropertySheetPages(LPSHELLVIEW this, DWORD dwReserved,LPFNADDPROPSHEETPAGE lpfn, LPARAM lparam)
1509 { FIXME(shell,"(%p) stub\n",this);
1512 static HRESULT WINAPI IShellView_SaveViewState(LPSHELLVIEW this)
1513 { FIXME(shell,"(%p) stub\n",this);
1516 static HRESULT WINAPI IShellView_SelectItem(LPSHELLVIEW this, LPCITEMIDLIST pidlItem, UINT32 uFlags)
1517 { FIXME(shell,"(%p)->(pidl=%p, 0x%08x) stub\n",this, pidlItem, uFlags);
1520 static HRESULT WINAPI IShellView_GetItemObject(LPSHELLVIEW this, UINT32 uItem, REFIID riid, LPVOID *ppvOut)
1521 { LPUNKNOWN pObj = NULL;
1524 WINE_StringFromCLSID((LPCLSID)riid,xriid);
1525 TRACE(shell,"(%p)->(uItem=0x%08x,\n\tIID=%s, ppv=%p)\n",this, uItem, xriid, ppvOut);
1528 if(IsEqualIID(riid, &IID_IContextMenu))
1529 { ShellView_GetSelections(this);
1530 pObj =(LPUNKNOWN)IContextMenu_Constructor(this->pSFParent,this->aSelectedItems,this->uSelected);
1532 else if (IsEqualIID(riid, &IID_IDataObject))
1533 { ShellView_GetSelections(this);
1534 pObj =(LPUNKNOWN)IDataObject_Constructor(this->hWndParent, this->pSFParent,this->aSelectedItems,this->uSelected);
1537 TRACE(shell,"-- (%p)->(interface=%p)\n",this, ppvOut);
1540 return E_OUTOFMEMORY;