Handling for listviewstyles, view mode buttons in filedialogs
enabled and handled.
New listview columns Size, Type, Modified for reportview
created and handled.

diff --git a/dlls/shell32/shlview.c b/dlls/shell32/shlview.c
index 26ea728..8ef84f9 100644
--- a/dlls/shell32/shlview.c
+++ b/dlls/shell32/shlview.c
@@ -22,6 +22,7 @@
 #include "shell32_main.h"
 #include "pidl.h"
 #include "shresdef.h"
+#include "if_macros.h"
 
 /***********************************************************************
 *   IShellView implementation
@@ -83,6 +84,8 @@
 #define GET_WM_COMMAND_CMD(wp, lp)              HIWORD(wp)
 // winuser.h
 #define WM_SETTINGCHANGE                WM_WININICHANGE
+extern void WINAPI _InsertMenuItem (HMENU32 hmenu, UINT32 indexMenu, BOOL32 fByPosition, 
+			UINT32 wID, UINT32 fType, LPSTR dwTypeData, UINT32 fState);
 
 typedef struct
 {  int   idCommand;
@@ -113,7 +116,7 @@
 	sv->lpvtbl=&svvt;
   
 	sv->mpidl	= ILClone(pidl);
-	sv->hMenu	=0;
+	sv->hMenu	= 0;
 	sv->pSFParent	= pFolder;
 	sv->uSelected = 0;
 	sv->aSelectedItems = NULL;
@@ -152,6 +155,83 @@
 	}
 	return S_FALSE;
 }
+static void SetStyle(LPSHELLVIEW this, DWORD dwAdd, DWORD dwRemove)
+{	DWORD tmpstyle;
+
+	TRACE(shell,"(%p)\n", this);
+
+	tmpstyle = GetWindowLong32A(this->hWndList, GWL_STYLE);
+	SetWindowLong32A(this->hWndList, GWL_STYLE, dwAdd | (tmpstyle & ~dwRemove));
+}
+
+static void CheckToolbar(LPSHELLVIEW this)
+{	LRESULT result;
+
+	TRACE(shell,"\n");
+	
+	IShellBrowser_SendControlMsg(this->pShellBrowser, FCW_TOOLBAR, TB_CHECKBUTTON,
+		FCIDM_TB_SMALLICON, (this->FolderSettings.ViewMode==FVM_LIST)? TRUE : FALSE, &result);
+	IShellBrowser_SendControlMsg(this->pShellBrowser, FCW_TOOLBAR, TB_CHECKBUTTON,
+		FCIDM_TB_REPORTVIEW, (this->FolderSettings.ViewMode==FVM_DETAILS)? TRUE : FALSE, &result);
+	IShellBrowser_SendControlMsg(this->pShellBrowser, FCW_TOOLBAR, TB_ENABLEBUTTON,
+		FCIDM_TB_SMALLICON, TRUE, &result);
+	IShellBrowser_SendControlMsg(this->pShellBrowser, FCW_TOOLBAR, TB_ENABLEBUTTON,
+		FCIDM_TB_REPORTVIEW, TRUE, &result);
+	TRACE(shell,"--\n");
+}
+
+static void MergeToolBar(LPSHELLVIEW this)
+{	LRESULT iStdBMOffset;
+	LRESULT iViewBMOffset;
+	TBADDBITMAP ab;
+	TBBUTTON tbActual[6];
+	int i;
+	enum
+	{ IN_STD_BMP = 0x4000,
+	  IN_VIEW_BMP = 0x8000,
+	} ;
+	static const TBBUTTON c_tbDefault[] =
+	{ { STD_COPY | IN_STD_BMP, FCIDM_SHVIEW_COPY, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0,0}, 0, -1},
+	  { 0,	0,	TBSTATE_ENABLED, TBSTYLE_SEP, {0,0}, 0, -1 },
+	  { VIEW_LARGEICONS | IN_VIEW_BMP, FCIDM_SHVIEW_BIGICON,	TBSTATE_ENABLED, TBSTYLE_BUTTON, {0,0}, 0L, -1 },
+	  { VIEW_SMALLICONS | IN_VIEW_BMP, FCIDM_SHVIEW_SMALLICON,	TBSTATE_ENABLED, TBSTYLE_BUTTON, {0,0}, 0L, -1 },
+	  { VIEW_LIST       | IN_VIEW_BMP, FCIDM_SHVIEW_LISTVIEW,	TBSTATE_ENABLED, TBSTYLE_BUTTON, {0,0}, 0L, -1 },
+	  { VIEW_DETAILS    | IN_VIEW_BMP, FCIDM_SHVIEW_REPORTVIEW,	TBSTATE_ENABLED, TBSTYLE_BUTTON, {0,0}, 0L, -1 },
+	} ;
+
+	TRACE(shell,"\n");
+
+	ab.hInst = HINST_COMMCTRL;		// hinstCommctrl
+	ab.nID   = IDB_STD_SMALL_COLOR;	// std bitmaps
+	IShellBrowser_SendControlMsg(this->pShellBrowser,FCW_TOOLBAR,
+				 TB_ADDBITMAP, 8, (LPARAM)&ab, &iStdBMOffset);
+
+	TRACE(shell,"TB_ADDBITMAP returns %x\n", iStdBMOffset);
+
+	ab.nID   = IDB_VIEW_SMALL_COLOR;	// std view bitmaps
+	IShellBrowser_SendControlMsg(this->pShellBrowser,FCW_TOOLBAR,
+				 TB_ADDBITMAP, 8, (LPARAM)&ab, &iViewBMOffset);
+
+	TRACE(shell,"TB_ADDBITMAP returns %x\n", iViewBMOffset);
+
+	for (i=0; i<6; ++i)
+	{ tbActual[i] = c_tbDefault[i];
+	  if (!(tbActual[i].fsStyle & TBSTYLE_SEP))
+	  { if (tbActual[i].iBitmap & IN_VIEW_BMP)
+	    { tbActual[i].iBitmap = (tbActual[i].iBitmap & ~IN_VIEW_BMP) + iViewBMOffset;
+	    }
+	    else if (tbActual[i].iBitmap & IN_STD_BMP)
+	    { tbActual[i].iBitmap = (tbActual[i].iBitmap & ~IN_STD_BMP) + iStdBMOffset;
+	    }
+	  }
+	}
+
+	IShellBrowser_SetToolbarItems(this->pShellBrowser,tbActual, 6, FCT_MERGE);
+
+	CheckToolbar(this);
+	TRACE(shell,"--\n");
+
+}
 
 /**************************************************************************
 * ShellView_CreateList()
@@ -163,7 +243,8 @@
 
 	TRACE(shell,"%p\n",this);
 
-	dwStyle = WS_TABSTOP | WS_VISIBLE | WS_CHILD | WS_BORDER | LVS_SHAREIMAGELISTS | LVS_EDITLABELS;
+	dwStyle = WS_TABSTOP | WS_VISIBLE | WS_CHILD | WS_BORDER |
+		  LVS_SHAREIMAGELISTS | LVS_EDITLABELS;
 	switch (this->FolderSettings.ViewMode)
 	{ case FVM_ICON:	dwStyle |= LVS_ICON;		break;
 	  case FVM_SMALLICON: 	dwStyle |= LVS_SMALLICON;	break;
@@ -202,41 +283,39 @@
 int  nColumn4=100;
 
 BOOL32 ShellView_InitList(LPSHELLVIEW this)
-{ LVCOLUMN32A lvColumn;
-  CHAR        szString[50];
+{	LVCOLUMN32A lvColumn;
+	CHAR        szString[50];
 
-  TRACE(shell,"%p\n",this);
+	TRACE(shell,"%p\n",this);
 
+	ListView_DeleteAllItems(this->hWndList);
 
-  ListView_DeleteAllItems(this->hWndList);		/*empty the list*/
+	//initialize the columns
+	lvColumn.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT;	/*  |  LVCF_SUBITEM;*/
+	lvColumn.fmt = LVCFMT_LEFT;
+	lvColumn.pszText = szString;
 
-  //initialize the columns
-  lvColumn.mask = LVCF_FMT | LVCF_WIDTH  |  LVCF_SUBITEM;
+	lvColumn.cx = nColumn1;
+	strcpy(szString,"File");
+	/*LoadString32A(shell32_hInstance, IDS_COLUMN1, szString, sizeof(szString));*/
+	ListView_InsertColumn32A(this->hWndList, 0, &lvColumn);
 
-  lvColumn.fmt = LVCFMT_LEFT;
-  lvColumn.pszText = szString;
+	lvColumn.cx = nColumn2;
+	strcpy(szString,"Size");
+	ListView_InsertColumn32A(this->hWndList, 1, &lvColumn);
 
-  lvColumn.cx = nColumn1;
-  strcpy(szString,"File");
-  /*LoadString32A(shell32_hInstance, IDS_COLUMN1, szString, sizeof(szString));*/
-  ListView_InsertColumn32A(this->hWndList, 0, &lvColumn);
+	lvColumn.cx = nColumn3;
+	strcpy(szString,"Type");
+	ListView_InsertColumn32A(this->hWndList, 2, &lvColumn);
 
-  lvColumn.cx = nColumn2;
-  strcpy(szString,"COLUMN2");
-  ListView_InsertColumn32A(this->hWndList, 1, &lvColumn);
+	lvColumn.cx = nColumn4;
+	strcpy(szString,"Modified");
+	ListView_InsertColumn32A(this->hWndList, 3, &lvColumn);
 
-  lvColumn.cx = nColumn3;
-  strcpy(szString,"COLUMN3");
-  ListView_InsertColumn32A(this->hWndList, 2, &lvColumn);
-
-  lvColumn.cx = nColumn4;
-  strcpy(szString,"COLUMN4");
-  ListView_InsertColumn32A(this->hWndList, 3, &lvColumn);
-
-  ListView_SetImageList(this->hWndList, ShellSmallIconList, LVSIL_SMALL);
-  ListView_SetImageList(this->hWndList, ShellBigIconList, LVSIL_NORMAL);
+	ListView_SetImageList(this->hWndList, ShellSmallIconList, LVSIL_SMALL);
+	ListView_SetImageList(this->hWndList, ShellBigIconList, LVSIL_NORMAL);
   
-  return TRUE;
+	return TRUE;
 }
 /**************************************************************************
 * ShellView_CompareItems() 
@@ -401,33 +480,13 @@
 * ShellView_MergeFileMenu()
 */   
 void ShellView_MergeFileMenu(LPSHELLVIEW this, HMENU32 hSubMenu)
-{	MENUITEMINFO32A   mii;
-	CHAR          szText[MAX_PATH];
+{	TRACE(shell,"(%p)->(submenu=0x%08x) stub\n",this,hSubMenu);
 
-	TRACE(shell,"(%p)->(submenu=0x%08x) stub\n",this,hSubMenu);
 	if(hSubMenu)
-	{ ZeroMemory(&mii, sizeof(mii));
+	{ /*insert this item at the beginning of the menu */
+	  _InsertMenuItem(hSubMenu, 0, TRUE, 0, MFT_SEPARATOR, NULL, MFS_ENABLED);
+	  _InsertMenuItem(hSubMenu, 0, TRUE, IDM_MYFILEITEM, MFT_STRING, TEXT("dummy45"), MFS_ENABLED);
 
-	  /* add a separator */
-	  mii.fMask = MIIM_TYPE | MIIM_ID | MIIM_STATE;
-	  mii.fType = MFT_SEPARATOR;
-	  mii.fState = MFS_ENABLED;
-
-	  /*insert this item at the beginning of the menu */
-	  InsertMenuItem32A(hSubMenu, 0, TRUE, &mii);
-
-	  /*add the file menu items */
-	  strcpy(szText,"dummy 45");
-      
-	  mii.cbSize = sizeof(mii);
-	  mii.fMask = MIIM_TYPE | MIIM_ID | MIIM_STATE;
-	  mii.fType = MFT_STRING;
-	  mii.fState = MFS_ENABLED;
-	  mii.dwTypeData = szText;
-	  mii.wID = IDM_MYFILEITEM;
-
-	  /*insert this item at the beginning of the menu */
-	  InsertMenuItem32A(hSubMenu, 0, TRUE, &mii);
 	}
 	TRACE(shell,"--\n");	
 }
@@ -436,29 +495,11 @@
 * ShellView_MergeViewMenu()
 */   
 void ShellView_MergeViewMenu(LPSHELLVIEW this, HMENU32 hSubMenu)
-{	MENUITEMINFO32A	mii;
-	CHAR	szText[MAX_PATH];
-
-	TRACE(shell,"(%p)->(submenu=0x%08x) stub\n",this,hSubMenu);
+{	TRACE(shell,"(%p)->(submenu=0x%08x) stub\n",this,hSubMenu);
 	if(hSubMenu)
-	{ ZeroMemory(&mii, sizeof(mii));
-
-	  /*add a separator at the correct position in the menu*/
-	  mii.fMask = MIIM_TYPE | MIIM_ID | MIIM_STATE;
-	  mii.fType = MFT_SEPARATOR;
-	  mii.fState = MFS_ENABLED;
-	  InsertMenuItem32A(hSubMenu, FCIDM_MENU_VIEW_SEP_OPTIONS, FALSE, &mii);
-
-	  /*add the view menu items at the correct position in the menu*/
-	  strcpy(szText,"Dummy 46");
-      
-	  mii.cbSize = sizeof(mii);
-	  mii.fMask = MIIM_TYPE | MIIM_ID | MIIM_STATE;
-	  mii.fType = MFT_STRING;
-	  mii.fState = MFS_ENABLED;
-	  mii.dwTypeData = szText;
-	  mii.wID = IDM_VIEW_FILES;
-	  InsertMenuItem32A(hSubMenu, FCIDM_MENU_VIEW_SEP_OPTIONS, FALSE, &mii);
+	{ /*add a separator at the correct position in the menu*/
+	  _InsertMenuItem(hSubMenu, FCIDM_MENU_VIEW_SEP_OPTIONS, FALSE, 0, MFT_SEPARATOR, NULL, MFS_ENABLED);
+	  _InsertMenuItem(hSubMenu, FCIDM_MENU_VIEW_SEP_OPTIONS, FALSE, IDM_VIEW_FILES, MFT_STRING, TEXT("_View"), MFS_ENABLED);
 	}
 }
 /**************************************************************************
@@ -489,8 +530,8 @@
 { TRACE(shell,"%p\n",this);
   if(this->uState != SVUIA_DEACTIVATE)
   { if(this->hMenu)
-    { this->pShellBrowser->lpvtbl->fnSetMenuSB(this->pShellBrowser,0, 0, 0);
-      this->pShellBrowser->lpvtbl->fnRemoveMenusSB(this->pShellBrowser,this->hMenu);
+    { IShellBrowser_SetMenuSB(this->pShellBrowser,0, 0, 0);
+      IShellBrowser_RemoveMenusSB(this->pShellBrowser,this->hMenu);
       DestroyMenu32(this->hMenu);
       this->hMenu = 0;
       }
@@ -522,7 +563,7 @@
 	  this->hMenu = CreateMenu32();
    
 	  if(this->hMenu)
-	  { this->pShellBrowser->lpvtbl->fnInsertMenusSB(this->pShellBrowser, this->hMenu, &omw);
+	  { IShellBrowser_InsertMenusSB(this->pShellBrowser, this->hMenu, &omw);
 	    TRACE(shell,"-- after fnInsertMenusSB\n");    
 	    /*build the top level menu get the menu item's text*/
 	    strcpy(szText,"dummy 31");
@@ -561,7 +602,7 @@
 	      }
 	    }
 	  TRACE(shell,"-- before fnSetMenuSB\n");      
-	  this->pShellBrowser->lpvtbl->fnSetMenuSB(this->pShellBrowser, this->hMenu, 0, this->hWnd);
+	  IShellBrowser_SetMenuSB(this->pShellBrowser, this->hMenu, 0, this->hWnd);
 	  }
 	}
 	this->uState = uState;
@@ -580,7 +621,7 @@
 	/* Tell the browser one of our windows has received the focus. This should always 
 	be done before merging menus (OnActivate merges the menus) if one of our 
 	windows has the focus.*/
-	this->pShellBrowser->lpvtbl->fnOnViewWindowActive(this->pShellBrowser,this);
+	IShellBrowser_OnViewWindowActive(this->pShellBrowser,this);
 	ShellView_OnActivate(this, SVUIA_ACTIVATE_FOCUS);
 
 	return 0;
@@ -607,7 +648,7 @@
 	WARN(shell,"(%p)->(badd=0x%08x) semi-stub\n",this,bAdd);
 
 	/* get the browser's IServiceProvider */
-	hr = this->pShellBrowser->lpvtbl->fnQueryInterface(this->pShellBrowser, (REFIID)&IID_IServiceProvider, (LPVOID*)&pSP);
+	hr = IShellBrowser_QueryInterface(this->pShellBrowser, (REFIID)&IID_IServiceProvider, (LPVOID*)&pSP);
 	if(SUCCEEDED(hr))
 	{ /*get the IDockingWindowFrame pointer*/
 	  hr = pSP->lpvtbl->fnQueryService(pSP, (REFGUID)&SID_SShellBrowser, (REFIID)&IID_IDockingWindowFrame, (LPVOID*)&pFrame);
@@ -663,7 +704,7 @@
 	FIXME(shell,"(%p) stub\n",this);
 	
 	/*get the browser's IServiceProvider*/
-	hr = this->pShellBrowser->lpvtbl->fnQueryInterface(this->pShellBrowser, (REFIID)&IID_IServiceProvider, (LPVOID*)&pSP);
+	hr = IShellBrowser_QueryInterface(this->pShellBrowser, (REFIID)&IID_IServiceProvider, (LPVOID*)&pSP);
 	if(hr==S_OK)
 	{ hr = pSP->lpvtbl->fnQueryService(pSP, (REFGUID)&SID_SShellBrowser, (REFIID)&IID_IDockingWindowFrame, (LPVOID*)&pFrame);
    	  if(SUCCEEDED(hr))
@@ -778,9 +819,8 @@
 	CMINVOKECOMMANDINFO32  cmi;
 	
 	TRACE(shell,"(%p)->(0x%08x 0x%08x 0x%08x) stub\n",this, x, y, fDefault);
-	this->uSelected = ListView_GetSelectedCount(this->hWndList);
-	this->aSelectedItems = (LPITEMIDLIST*)SHAlloc(this->uSelected * sizeof(LPITEMIDLIST));
 
+	/* look, what's selected and create a context menu object of it*/
 	if(ShellView_GetSelections(this))
 	{ this->pSFParent->lpvtbl->fnGetUIObjectOf(	this->pSFParent,
 							this->hWndParent,
@@ -794,12 +834,11 @@
 	  { TRACE(shell,"-- pContextMenu\n");
 	    hMenu = CreatePopupMenu32();
 
-            /* See if we are in Explore or Open mode. If the browser's tree is present, 
-            then we are in Explore mode.*/
+            /* See if we are in Explore or Open mode. If the browser's tree
+	     is present, then we are in Explore mode.*/
         
 	    fExplore = FALSE;
-	    hwndTree = 0;
-	    if(SUCCEEDED(this->pShellBrowser->lpvtbl->fnGetControlWindow(this->pShellBrowser,FCW_TREE, &hwndTree)) && hwndTree)
+	    if(SUCCEEDED(IShellBrowser_GetControlWindow(this->pShellBrowser,FCW_TREE, &hwndTree)) && hwndTree)
 	    { TRACE(shell,"-- fExplore\n");
 	      fExplore = TRUE;
 	    }
@@ -844,7 +883,7 @@
 		  else					/* we are acting with a full featured IShellBrowser */
 		  { TRACE(shell,"-- fnBrowseObject pidl =%p\n", this->aSelectedItems[0]);
 		    wFlags = SBSP_SAMEBROWSER | SBSP_DEFMODE | SBSP_RELATIVE;
-		    this->pShellBrowser->lpvtbl->fnBrowseObject(this->pShellBrowser, 
+		    IShellBrowser_BrowseObject(this->pShellBrowser, 
 								this->aSelectedItems[0], 
 								wFlags);
 		  }
@@ -887,6 +926,26 @@
 	    MessageBeep32(MB_OK);
 	    break;
 
+	  case FCIDM_SHVIEW_SMALLICON:
+	    this->FolderSettings.ViewMode = FVM_SMALLICON;
+	    SetStyle (this, LVS_SMALLICON, LVS_TYPEMASK);
+	    break;
+
+	  case FCIDM_SHVIEW_BIGICON:
+	    this->FolderSettings.ViewMode = FVM_ICON;
+	    SetStyle (this, LVS_ICON, LVS_TYPEMASK);
+	    break;
+
+	  case FCIDM_SHVIEW_LISTVIEW:
+	    this->FolderSettings.ViewMode = FVM_LIST;
+	    SetStyle (this, LVS_LIST, LVS_TYPEMASK);
+	    break;
+
+	  case FCIDM_SHVIEW_REPORTVIEW:
+	    this->FolderSettings.ViewMode = FVM_DETAILS;
+	    SetStyle (this, LVS_REPORT, LVS_TYPEMASK);
+	    break;
+
 	  default:
 	    FIXME(shell,"-- COMMAND unhandled\n");
 	}
@@ -954,12 +1013,30 @@
 	    if(lpdi->item.iSubItem)		  /*is the sub-item information being requested?*/
 	    { if(lpdi->item.mask & LVIF_TEXT)	 /*is the text being requested?*/
 	      { if(_ILIsValue(pidl))	/*is this a value or a folder?*/
-	        {  _ILGetDataText(this->mpidl, pidl, lpdi->item.pszText, lpdi->item.cchTextMax);
-	           if(!*lpdi->item.pszText)
-	           sprintf(lpdi->item.pszText, "file attrib %u", lpdi->item.iSubItem );
+	        { switch (lpdi->item.iSubItem)
+		  { case 1:
+		      _ILGetFileSize (pidl, lpdi->item.pszText, lpdi->item.cchTextMax);
+		      break;
+		    case 2:
+		      strncpy (lpdi->item.pszText, "File", lpdi->item.cchTextMax);
+		      break;
+		    case 3:  
+		      _ILGetFileDate (pidl, lpdi->item.pszText, lpdi->item.cchTextMax);
+		      break;
+		  }
 	        }
 	        else  /*its a folder*/
-	        { sprintf(lpdi->item.pszText, "folder attrib %u", lpdi->item.iSubItem );
+	        { switch (lpdi->item.iSubItem)
+		  { case 1:
+		      sprintf(lpdi->item.pszText, "fixme");
+		      break;
+	            case 2:
+		      strncpy (lpdi->item.pszText, "Folder", lpdi->item.cchTextMax);
+		      break;
+		    case 3:  
+		      _ILGetFileDate (pidl, lpdi->item.pszText, lpdi->item.cchTextMax);
+		      break;
+		  }
 	        }
 	      }
 	    }
@@ -976,19 +1053,19 @@
 		  else
 		  { FIXME(shell,"type wrong\n");
 		  }
+	          TRACE(shell,"-- text=%s\n",lpdi->item.pszText);
 	        }
 	      }
 
 	      if(lpdi->item.mask & LVIF_IMAGE) 		/*is the image being requested?*/
 	      { if(SUCCEEDED(this->pSFParent->lpvtbl->fnGetUIObjectOf(this->pSFParent,this->hWnd,1,
 				(LPCITEMIDLIST*)&pidl, (REFIID)&IID_IExtractIcon, NULL, (LPVOID*)&pei)))
-	        { //GetIconLoaction will give us the index into our image list
-	          pei->lpvtbl->fnGetIconLocation(pei, GIL_FORSHELL, NULL, 0, &lpdi->item.iImage, &uFlags);
+	        { pei->lpvtbl->fnGetIconLocation(pei, GIL_FORSHELL, NULL, 0, &lpdi->item.iImage, &uFlags);
 	          pei->lpvtbl->fnRelease(pei);
+		  TRACE(shell,"-- image=%x\n",lpdi->item.iImage);
 	        }
 	      }
 	    }
-	    TRACE(shell,"-- text=%s image=%x\n",lpdi->item.pszText, lpdi->item.iImage);
 	    break;
 
 	  case NM_CLICK:
@@ -1295,20 +1372,12 @@
 						    sizeof(szName) - strlen(szName));
 
 	  /* set the number of parts */
-	  this->pShellBrowser->lpvtbl->fnSendControlMsg(this->pShellBrowser,
-	  						FCW_STATUS,
-							SB_SETPARTS,
-							1,
-							(LPARAM)nPartArray,
-							&lResult);
+	  IShellBrowser_SendControlMsg(this->pShellBrowser, FCW_STATUS, SB_SETPARTS, 1,
+	  						(LPARAM)nPartArray, &lResult);
 
 	  /* set the text for the parts */
-	  this->pShellBrowser->lpvtbl->fnSendControlMsg(this->pShellBrowser,
-							FCW_STATUS,
-							SB_SETTEXT32A,
-							0,
-							(LPARAM)szName,
-							&lResult);
+	  IShellBrowser_SendControlMsg(this->pShellBrowser, FCW_STATUS, SB_SETTEXT32A,
+							0, (LPARAM)szName, &lResult);
 
 	  //add the docking window if necessary
 	  if(g_bShowIDW)
@@ -1326,7 +1395,7 @@
 	return S_OK;
 }
 static HRESULT WINAPI IShellView_CreateViewWindow(LPSHELLVIEW this, IShellView *lpPrevView,
-                     LPCFOLDERSETTINGS lpfs, IShellBrowser * psb,RECT32 * prcView, HWND32  *phWnd)
+                     LPCFOLDERSETTINGS lpfs, IShellBrowser * psb, RECT32 * prcView, HWND32  *phWnd)
 {	WNDCLASS32A wc;
 /*	LRESULT dwResult;*/
 	*phWnd = 0;
@@ -1340,14 +1409,14 @@
 	this->FolderSettings = *lpfs;
 
 	/*get our parent window*/
-	this->pShellBrowser->lpvtbl->fnAddRef(this->pShellBrowser);
-	this->pShellBrowser->lpvtbl->fnGetWindow(this->pShellBrowser, &(this->hWndParent));
+	IShellBrowser_AddRef(this->pShellBrowser);
+	IShellBrowser_GetWindow(this->pShellBrowser, &(this->hWndParent));
 
-/*	this->pShellBrowser->lpvtbl->fnSendControlMsg(this->pShellBrowser, FCW_TOOLBAR, TB_ENABLEBUTTON, 0xa004, TRUE, &dwResult);
+/*	IShellBrowser_SendControlMsg(this->pShellBrowser, FCW_TOOLBAR, TB_ENABLEBUTTON, 0xa004, TRUE, &dwResult);
 */
 	/* try to get the ICommDlgBrowserInterface */
 	this->pCommDlgBrowser=NULL;
-	if ( SUCCEEDED (this->pShellBrowser->lpvtbl->fnQueryInterface( this->pShellBrowser,
+	if ( SUCCEEDED (IShellBrowser_QueryInterface( this->pShellBrowser,
 								        (REFIID)&IID_ICommDlgBrowser,
 									(LPVOID*) &this->pCommDlgBrowser)))
 	{ TRACE(shell,"-- CommDlgBrowser\n");
@@ -1375,6 +1444,8 @@
                            prcView->left, prcView->top, prcView->right - prcView->left, prcView->bottom - prcView->top,
                            this->hWndParent, 0, shell32_hInstance, (LPVOID)this);
                            
+	MergeToolBar(this);
+	
 	if(!*phWnd)
 	  return E_FAIL;
 
@@ -1390,7 +1461,7 @@
    	{ DestroyMenu32(this->hMenu);
 	}
 	DestroyWindow32(this->hWnd);
-	this->pShellBrowser->lpvtbl->fnRelease(this->pShellBrowser);
+	IShellBrowser_Release(this->pShellBrowser);
 	return S_OK;
 }
 static HRESULT WINAPI IShellView_GetCurrentInfo(LPSHELLVIEW this, LPFOLDERSETTINGS lpfs)
@@ -1425,8 +1496,7 @@
 
 	*ppvOut = NULL;
 	if(IsEqualIID(riid, &IID_IContextMenu))
-	{ TRACE(shell,"-- (%p)->IID_IContextMenu not implemented\n",this);       
-	  return(E_NOTIMPL);
+	{ pObj =(LPUNKNOWN)IContextMenu_Constructor(this->pSFParent,this->aSelectedItems,this->uSelected);	
 	}
 	else if (IsEqualIID(riid, &IID_IDataObject))
 	{ pObj =(LPUNKNOWN)IDataObject_Constructor(this->hWndParent, this->pSFParent,this->aSelectedItems,this->uSelected);