ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

shellbrowser.cpp
Go to the documentation of this file.
00001 /*
00002  * ReactOS Explorer
00003  *
00004  * Copyright 2009 Andrew Hill <ash77 at domain reactos.org>
00005  *
00006  * This library is free software; you can redistribute it and/or
00007  * modify it under the terms of the GNU Lesser General Public
00008  * License as published by the Free Software Foundation; either
00009  * version 2.1 of the License, or (at your option) any later version.
00010  *
00011  * This library is distributed in the hope that it will be useful,
00012  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00014  * Lesser General Public License for more details.
00015  *
00016  * You should have received a copy of the GNU Lesser General Public
00017  * License along with this library; if not, write to the Free Software
00018  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00019  */
00020 
00021 #include "precomp.h"
00022 
00023 /*
00024 TODO:
00025   **Provide implementation of new and delete that use LocalAlloc
00026   **Persist history for shell view isn't working correctly, possibly because of the mismatch between traveling and updating the travel log. The
00027         view doesn't restore the selection correctly.
00028   **Build explorer.exe, browseui.dll, comctl32.dll, shdocvw.dll, shell32.dll, shlwapi.dll into a directory and run them for testing...
00029   **Add brand band bitmaps to shell32.dll
00030   **If Go button on address bar is clicked, each time a new duplicate entry is added to travel log
00031 ****The current entry is updated in travel log before doing the travel, which means when traveling back the update of the
00032         current state overwrites the wrong entry's contents. This needs to be changed.
00033 ****Fix close of browser window to release all objects
00034 ****Given only a GUID in ShowBrowserBar, what is the correct way to determine if the bar is vertical or horizontal?
00035   **When a new bar is added to base bar site, how is base bar told so it can resize?
00036   **Does the base bar site have a classid?
00037   **What should refresh command send to views to make them refresh?
00038   **When new bar is created, what status notifications need to be fired?
00039   **How does keyboard filtering dispatch?
00040   **For deferred persist history load, how does the view connect up and get the state?
00041     How does context menu send open, cut, rename commands to its site (the shell view)?
00042   **Fix browser to implement IProfferService and hold onto brand band correctly - this will allow animations.
00043 
00044   **Route View->Toolbars commands to internet toolbar
00045   **Handle travel log items in View->Go
00046   **Fix ShowBrowserBar to pass correct size on when bar is shown
00047 ****Fix SetBorderSpaceDW to cascade resize to subsequent bars
00048 ****Make ShowToolbar check if bar is already created before creating it again
00049 ****Shell should fill in the list of explorer bars in the View submenus
00050   **Add folder menu in the file menu
00051   **Fix CShellBrowser::GetBorderDW to compute available size correctly
00052   **When a new bar is shown, re-fire the navigate event. This makes the explorer band select the correct folder
00053   **Implement support for refresh. Forward refresh to explorer bar (refresh on toolbar and in menu is dispatched different)
00054     Make folders toolbar item update state appropriately
00055     Read list of bands from registry on launch
00056     Read list of bars from registry on launch
00057     If the folders or search bars don't exist, disable the toolbar buttons
00058     If the favorites or history bars don't exist, disable the toolbar butons
00059     Fix Apply to all Folders in Folder Options
00060     Implement close command
00061     Add explorer band context menu to file menu
00062     Add code to allow restore of internet toolbar from registry
00063     Fix code that calls FireNavigateComplete to pass the correct new path
00064 
00065     What are the other command ids for QueryStatus/FireCommandStateChange?
00066 
00067     Add handler for cabinet settings change
00068     Add handler for system metrics change (renegotiate border space?)
00069     Add handler for theme change and forward to contained windows
00070 
00071     When folders are shown, the status bar text should change
00072     Add code to save/restore shell view settings
00073     Implement tabbing between frames
00074     Fix handling of focus everywhere
00075     Most keyboard shortcuts don't work, such as F2 for rename, F5 for refresh (see list in "explorer keyboard shortcuts")
00076 
00077     The status bar doesn't show help text for items owned by frame during menu tracking
00078     Stub out frame command handlers
00079     "Arrange icons by" group is not checked properly
00080 
00081     When folders are hidden, icon is the same as the current shell object being displayed. When folders are shown,
00082         the icon is always an open folder with magnifying glass
00083     Fix bars to calculate height correctly
00084     Hookup policies for everything...
00085     Investigate toolbar message WM_USER+93
00086     Investigate toolbar message WM_USER+100 (Adds extra padding between parts of buttons with BTNS_DROPDOWN | BTNS_SHOWTEXT style
00087 
00088     Vertical Explorer Bar       CATID_InfoBand
00089     Horizontal Explorer Bar     CATID_CommBand
00090     Desk Band                   CATID_DeskBand
00091 
00092     cache of bars
00093     HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Discardable\PostSetup\Component Categories\{00021493-0000-0000-C000-000000000046}\Enum
00094     HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Discardable\PostSetup\Component Categories\{00021494-0000-0000-C000-000000000046}\Enum
00095 
00096     create key here with CLSID of bar to register tool band
00097     HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Toolbar
00098 
00099 */
00100 
00101 #ifndef __GNUC__
00102 #pragma comment(linker, \
00103     "\"/manifestdependency:type='Win32' "\
00104     "name='Microsoft.Windows.Common-Controls' "\
00105     "version='6.0.0.0' "\
00106     "processorArchitecture='*' "\
00107     "publicKeyToken='6595b64144ccf1df' "\
00108     "language='*'\"")
00109 #endif // __GNUC__
00110 
00111 struct categoryCacheHeader
00112 {
00113     long                dwSize;         // size of header only
00114     long                version;        // currently 1
00115     SYSTEMTIME          writeTime;      // time we were written to registry
00116     long                classCount;     // number of classes following
00117 };
00118 
00119 static const unsigned int                   folderOptionsPageCountMax = 20;
00120 static const long                           BTP_UPDATE_CUR_HISTORY = 1;
00121 static const long                           BTP_UPDATE_NEXT_HISTORY = 2;
00122 
00123 BOOL                                        createNewStuff = false;
00124 
00125 
00126 // this class is private to browseui.dll and is not registered externally?
00127 //DEFINE_GUID(CLSID_ShellFldSetExt, 0x6D5313C0, 0x8C62, 0x11D1, 0xB2, 0xCD, 0x00, 0x60, 0x97, 0xDF, 0x8C, 0x11);
00128 
00129 
00130 extern HRESULT CreateTravelLog(REFIID riid, void **ppv);
00131 extern HRESULT CreateBaseBar(REFIID riid, void **ppv);
00132 extern HRESULT CreateBaseBarSite(REFIID riid, void **ppv);
00133 #ifndef ROS_Headers
00134 SHSTDAPI_(void *) SHAlloc(SIZE_T cb);
00135 #endif
00136 
00137 // temporary
00138 extern HRESULT CreateInternetToolbar(REFIID riid, void **ppv);
00139 
00140 
00141 #ifdef SetWindowLongPtr
00142 #undef SetWindowLongPtr
00143 inline LONG_PTR SetWindowLongPtr(HWND hWnd, int nIndex, LONG_PTR dwNewLong)
00144 {
00145     return SetWindowLong(hWnd, nIndex, (LONG)dwNewLong);
00146 }
00147 #endif
00148 
00149 #ifdef GetWindowLongPtr
00150 #undef GetWindowLongPtr
00151 inline LONG_PTR GetWindowLongPtr(HWND hWnd, int nIndex)
00152 {
00153     return (LONG_PTR)GetWindowLong(hWnd, nIndex);
00154 }
00155 #endif
00156 
00157 HMENU SHGetMenuFromID(HMENU topMenu, int theID)
00158 {
00159     MENUITEMINFO                            menuItemInfo;
00160 
00161     menuItemInfo.cbSize = sizeof(menuItemInfo);
00162     menuItemInfo.fMask = MIIM_SUBMENU;
00163     if (GetMenuItemInfo(topMenu, theID, FALSE, &menuItemInfo) == FALSE)
00164         return NULL;
00165     return menuItemInfo.hSubMenu;
00166 }
00167 
00168 void SHCheckMenuItem(HMENU theMenu, int theID, BOOL checked)
00169 {
00170     MENUITEMINFO                            menuItemInfo;
00171 
00172     menuItemInfo.cbSize = sizeof(menuItemInfo);
00173     menuItemInfo.fMask = MIIM_STATE;
00174     if (GetMenuItemInfo(theMenu, theID, FALSE, &menuItemInfo))
00175     {
00176         if (checked)
00177             menuItemInfo.fState |= MF_CHECKED;
00178         else
00179             menuItemInfo.fState &= ~MF_CHECKED;
00180         SetMenuItemInfo(theMenu, theID, FALSE, &menuItemInfo);
00181     }
00182 }
00183 
00184 void DeleteMenuItems(HMENU theMenu, unsigned int firstIDToDelete, unsigned int lastIDToDelete)
00185 {
00186     MENUITEMINFO                            menuItemInfo;
00187     int                                     menuItemCount;
00188     int                                     curIndex;
00189 
00190     menuItemCount = GetMenuItemCount(theMenu);
00191     curIndex = 0;
00192     while (curIndex < menuItemCount)
00193     {
00194         menuItemInfo.cbSize = sizeof(menuItemInfo);
00195         menuItemInfo.fMask = MIIM_ID;
00196         if (GetMenuItemInfo(theMenu, curIndex, TRUE, &menuItemInfo) && menuItemInfo.wID >= firstIDToDelete && menuItemInfo.wID <= lastIDToDelete)
00197         {
00198             DeleteMenu(theMenu, curIndex, MF_BYPOSITION);
00199             menuItemCount--;
00200         }
00201         else
00202             curIndex++;
00203     }
00204 }
00205 
00206 HRESULT WINAPI SHBindToFolder(LPITEMIDLIST path, IShellFolder **newFolder)
00207 {
00208     CComPtr<IShellFolder>                   desktop;
00209 
00210     ::SHGetDesktopFolder(&desktop);
00211     if (desktop == NULL)
00212         return E_FAIL;
00213     if (path == NULL || path->mkid.cb == 0)
00214     {
00215         *newFolder = desktop;
00216         desktop.p->AddRef ();
00217         return S_OK;
00218     }
00219     return desktop->BindToObject (path, NULL, IID_IShellFolder, (void **)newFolder);
00220 }
00221 
00222 static const TCHAR szCabinetWndClass[] = TEXT("CabinetWClassX");
00223 static const TCHAR szExploreWndClass[] = TEXT("ExploreWClassX");
00224 
00225 class CDockManager;
00226 class CShellBrowser;
00227 
00228 class CToolbarProxy :
00229     public CWindowImpl<CToolbarProxy, CWindow, CControlWinTraits>
00230 {
00231 private:
00232     CComPtr<IExplorerToolbar>               fExplorerToolbar;
00233 public:
00234     void Initialize(HWND parent, IUnknown *explorerToolbar);
00235     
00236 private:
00237     
00238     // message handlers
00239     LRESULT OnAddBitmap(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
00240     LRESULT OnForwardMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
00241 
00242 BEGIN_MSG_MAP(CToolbarProxy)
00243     MESSAGE_HANDLER(TB_ADDBITMAP, OnAddBitmap)
00244     MESSAGE_RANGE_HANDLER(WM_USER, 0x7fff, OnForwardMessage)
00245 END_MSG_MAP()
00246 };
00247 
00248 void CToolbarProxy::Initialize(HWND parent, IUnknown *explorerToolbar)
00249 {
00250     HWND                                    myWindow;
00251     HRESULT                                 hResult;
00252 
00253     myWindow = SHCreateWorkerWindowW(0, parent, 0, WS_CHILD, NULL, 0);
00254     if (myWindow != NULL)
00255     {
00256         SubclassWindow(myWindow);
00257         SetWindowPos(NULL, -32000, -32000, 0, 0, SWP_NOOWNERZORDER | SWP_NOZORDER);
00258         hResult = explorerToolbar->QueryInterface(IID_IExplorerToolbar, (void **)&fExplorerToolbar);
00259     }
00260 }
00261 
00262 LRESULT CToolbarProxy::OnAddBitmap(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
00263 {
00264     long int                                result;
00265     HRESULT                                 hResult;
00266 
00267     result = 0;
00268     if (fExplorerToolbar.p != NULL)
00269     {
00270         hResult = fExplorerToolbar->AddBitmap(&CGID_ShellBrowser, 1, (long)wParam, (TBADDBITMAP *)lParam, &result, RGB(192, 192, 192));
00271         hResult = fExplorerToolbar->AddBitmap(&CGID_ShellBrowser, 2, (long)wParam, (TBADDBITMAP *)lParam, &result, RGB(192, 192, 192));
00272     }
00273     return result;
00274 }
00275 
00276 LRESULT CToolbarProxy::OnForwardMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
00277 {
00278     LRESULT                                 result;
00279     HRESULT                                 hResult;
00280 
00281     result = 0;
00282     if (fExplorerToolbar.p != NULL)
00283         hResult = fExplorerToolbar->SendToolbarMsg(&CGID_ShellBrowser, uMsg, wParam, lParam, &result);
00284     return result;
00285 }
00286 
00287 /*
00288 Switch to a new bar when it receives an Exec(CGID_IDeskBand, 1, 1, vaIn, NULL);
00289     where vaIn will be a VT_UNKNOWN with the new bar. It also sends a RB_SHOWBAND to the
00290     rebar
00291 */
00292 
00293 class CShellBrowser :
00294     public CWindowImpl<CShellBrowser, CWindow, CControlWinTraits>,
00295     public CComObjectRootEx<CComMultiThreadModelNoCS>,
00296     public IShellBrowser,
00297     public IDropTarget,
00298     public IServiceProvider,
00299     public IProfferServiceImpl<CShellBrowser>,
00300     public IShellBrowserService,
00301     public IWebBrowser2,
00302     public ITravelLogClient,
00303     public IPersistHistory,
00304     public IDockingWindowSite,
00305     public IOleCommandTarget,
00306     public IBrowserService2,
00307     public IConnectionPointContainerImpl<CShellBrowser>,
00308     public MyIConnectionPointImpl<CShellBrowser, &DIID_DWebBrowserEvents2>,
00309     public MyIConnectionPointImpl<CShellBrowser, &DIID_DWebBrowserEvents>
00310 {
00311 private:
00312     class barInfo
00313     {
00314     public:
00315         RECT                                borderSpace;
00316         CComPtr<IUnknown>                   clientBar;
00317         HWND                                hwnd;
00318     };
00319     static const int                        BIInternetToolbar = 0;
00320     static const int                        BIVerticalBaseBar = 1;
00321     static const int                        BIHorizontalBaseBar = 2;
00322 
00323     HWND                                    fCurrentShellViewWindow;    // our currently hosted shell view window
00324     CComPtr<IShellFolder>                   fCurrentShellFolder;        // 
00325     CComPtr<IShellView>                     fCurrentShellView;          // 
00326     LPITEMIDLIST                            fCurrentDirectoryPIDL;      // 
00327     HWND                                    fStatusBar;
00328     bool                                    fStatusBarVisible;
00329     CToolbarProxy                           fToolbarProxy;
00330     barInfo                                 fClientBars[3];
00331     CComPtr<ITravelLog>                     fTravelLog;
00332     HMENU                                   fCurrentMenuBar;
00333     CABINETSTATE                            fCabinetState;
00334     // The next three fields support persisted history for shell views. They do not need to be reference counted.
00335     IOleObject                              *fHistoryObject;
00336     IStream                                 *fHistoryStream;
00337     IBindCtx                                *fHistoryBindContext;
00338 public:
00339 #if 0
00340     ULONG InternalAddRef()
00341     {
00342         OutputDebugString(_T("AddRef\n"));
00343         return CComObjectRootEx<CComMultiThreadModelNoCS>::InternalAddRef();
00344     }
00345     ULONG InternalRelease()
00346     {
00347         OutputDebugString(_T("Release\n"));
00348         return CComObjectRootEx<CComMultiThreadModelNoCS>::InternalRelease();
00349     }
00350 #endif
00351 
00352     CShellBrowser();
00353     ~CShellBrowser();
00354     HRESULT Initialize(LPITEMIDLIST pidl, long b, long c, long d);
00355 public:
00356     HRESULT BrowseToPIDL(LPCITEMIDLIST pidl, long flags);
00357     HRESULT BrowseToPath(IShellFolder *newShellFolder, LPITEMIDLIST absolutePIDL, FOLDERSETTINGS *folderSettings, long flags);
00358     HRESULT GetMenuBand(REFIID riid, void **shellMenu);
00359     HRESULT GetBaseBar(bool vertical, IUnknown **theBaseBar);
00360     HRESULT ShowBand(const CLSID &classID, bool vertical);
00361     HRESULT NavigateToParent();
00362     HRESULT DoFolderOptions();
00363     static LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
00364     void RepositionBars();
00365     virtual WNDPROC GetWindowProc()
00366     {
00367         return WindowProc;
00368     }
00369     HRESULT FireEvent(DISPID dispIdMember, int argCount, VARIANT *arguments);
00370     HRESULT FireNavigateComplete(const wchar_t *newDirectory);
00371     HRESULT FireCommandStateChange(bool newState, int commandID);
00372     HRESULT FireCommandStateChangeAll();
00373     HRESULT UpdateForwardBackState();
00374     void UpdateGotoMenu(HMENU theMenu);
00375     void UpdateViewMenu(HMENU theMenu);
00376 
00377 /*  // *** IDockingWindowFrame methods ***
00378     virtual HRESULT STDMETHODCALLTYPE AddToolbar(IUnknown *punkSrc, LPCWSTR pwszItem, DWORD dwAddFlags);
00379     virtual HRESULT STDMETHODCALLTYPE RemoveToolbar(IUnknown *punkSrc, DWORD dwRemoveFlags);
00380     virtual HRESULT STDMETHODCALLTYPE FindToolbar(LPCWSTR pwszItem, REFIID riid, void **ppv);
00381     */
00382 
00383     // *** IDockingWindowSite methods ***
00384     virtual HRESULT STDMETHODCALLTYPE GetBorderDW(IUnknown* punkObj, LPRECT prcBorder);
00385     virtual HRESULT STDMETHODCALLTYPE RequestBorderSpaceDW(IUnknown* punkObj, LPCBORDERWIDTHS pbw);
00386     virtual HRESULT STDMETHODCALLTYPE SetBorderSpaceDW(IUnknown* punkObj, LPCBORDERWIDTHS pbw);
00387 
00388     // *** IOleCommandTarget methods ***
00389     virtual HRESULT STDMETHODCALLTYPE QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[  ], OLECMDTEXT *pCmdText);
00390     virtual HRESULT STDMETHODCALLTYPE Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut);
00391 
00392     // *** IOleWindow methods ***
00393     virtual HRESULT STDMETHODCALLTYPE GetWindow(HWND *lphwnd);
00394     virtual HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(BOOL fEnterMode);
00395 
00396     // *** IShellBrowser methods ***
00397     virtual HRESULT STDMETHODCALLTYPE InsertMenusSB(HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths);
00398     virtual HRESULT STDMETHODCALLTYPE SetMenuSB(HMENU hmenuShared, HOLEMENU holemenuRes, HWND hwndActiveObject);
00399     virtual HRESULT STDMETHODCALLTYPE RemoveMenusSB(HMENU hmenuShared);
00400     virtual HRESULT STDMETHODCALLTYPE SetStatusTextSB(LPCOLESTR pszStatusText);
00401     virtual HRESULT STDMETHODCALLTYPE EnableModelessSB(BOOL fEnable);
00402     virtual HRESULT STDMETHODCALLTYPE TranslateAcceleratorSB(MSG *pmsg, WORD wID);
00403     virtual HRESULT STDMETHODCALLTYPE BrowseObject(LPCITEMIDLIST pidl, UINT wFlags);
00404     virtual HRESULT STDMETHODCALLTYPE GetViewStateStream(DWORD grfMode, IStream **ppStrm);
00405     virtual HRESULT STDMETHODCALLTYPE GetControlWindow(UINT id, HWND *lphwnd);
00406     virtual HRESULT STDMETHODCALLTYPE SendControlMsg(UINT id, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *pret);
00407     virtual HRESULT STDMETHODCALLTYPE QueryActiveShellView(struct IShellView **ppshv);
00408     virtual HRESULT STDMETHODCALLTYPE OnViewWindowActive(struct IShellView *ppshv);
00409     virtual HRESULT STDMETHODCALLTYPE SetToolbarItems(LPTBBUTTON lpButtons, UINT nButtons, UINT uFlags);
00410 
00411     // *** IDropTarget methods ***
00412     virtual HRESULT STDMETHODCALLTYPE DragEnter(IDataObject *pDataObj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect);
00413     virtual HRESULT STDMETHODCALLTYPE DragOver(DWORD grfKeyState, POINTL pt, DWORD *pdwEffect);
00414     virtual HRESULT STDMETHODCALLTYPE DragLeave();
00415     virtual HRESULT STDMETHODCALLTYPE Drop(IDataObject *pDataObj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect);
00416 
00417     // *** IServiceProvider methods ***
00418     virtual HRESULT STDMETHODCALLTYPE QueryService(REFGUID guidService, REFIID riid, void **ppvObject);
00419 
00420     // *** IShellBowserService methods ***
00421     virtual HRESULT STDMETHODCALLTYPE GetPropertyBag(long flags, REFIID riid, void **ppvObject);
00422 
00423     // *** IDispatch methods ***
00424     virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT *pctinfo);
00425     virtual HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo);
00426     virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId);
00427     virtual HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr);
00428 
00429     // *** IBrowserService methods ***
00430     virtual HRESULT STDMETHODCALLTYPE GetParentSite(IOleInPlaceSite **ppipsite);
00431     virtual HRESULT STDMETHODCALLTYPE SetTitle(IShellView *psv, LPCWSTR pszName);
00432     virtual HRESULT STDMETHODCALLTYPE GetTitle(IShellView *psv, LPWSTR pszName, DWORD cchName);
00433     virtual HRESULT STDMETHODCALLTYPE GetOleObject(IOleObject **ppobjv);
00434     virtual HRESULT STDMETHODCALLTYPE GetTravelLog(ITravelLog **pptl);
00435     virtual HRESULT STDMETHODCALLTYPE ShowControlWindow(UINT id, BOOL fShow);
00436     virtual HRESULT STDMETHODCALLTYPE IsControlWindowShown(UINT id, BOOL *pfShown);
00437     virtual HRESULT STDMETHODCALLTYPE IEGetDisplayName(LPCITEMIDLIST pidl, LPWSTR pwszName, UINT uFlags);
00438     virtual HRESULT STDMETHODCALLTYPE IEParseDisplayName(UINT uiCP, LPCWSTR pwszPath, LPCITEMIDLIST *ppidlOut);
00439     virtual HRESULT STDMETHODCALLTYPE DisplayParseError(HRESULT hres, LPCWSTR pwszPath);
00440     virtual HRESULT STDMETHODCALLTYPE NavigateToPidl(LPCITEMIDLIST pidl, DWORD grfHLNF);
00441     virtual HRESULT STDMETHODCALLTYPE SetNavigateState(BNSTATE bnstate);
00442     virtual HRESULT STDMETHODCALLTYPE GetNavigateState(BNSTATE *pbnstate);
00443     virtual HRESULT STDMETHODCALLTYPE NotifyRedirect(IShellView *psv, LPCITEMIDLIST pidl, BOOL *pfDidBrowse);
00444     virtual HRESULT STDMETHODCALLTYPE UpdateWindowList();
00445     virtual HRESULT STDMETHODCALLTYPE UpdateBackForwardState();
00446     virtual HRESULT STDMETHODCALLTYPE SetFlags(DWORD dwFlags, DWORD dwFlagMask);
00447     virtual HRESULT STDMETHODCALLTYPE GetFlags(DWORD *pdwFlags);
00448     virtual HRESULT STDMETHODCALLTYPE CanNavigateNow( void);
00449     virtual HRESULT STDMETHODCALLTYPE GetPidl(LPCITEMIDLIST *ppidl);
00450     virtual HRESULT STDMETHODCALLTYPE SetReferrer(LPCITEMIDLIST pidl);
00451     virtual DWORD STDMETHODCALLTYPE GetBrowserIndex();
00452     virtual HRESULT STDMETHODCALLTYPE GetBrowserByIndex(DWORD dwID, IUnknown **ppunk);
00453     virtual HRESULT STDMETHODCALLTYPE GetHistoryObject(IOleObject **ppole, IStream **pstm, IBindCtx **ppbc);
00454     virtual HRESULT STDMETHODCALLTYPE SetHistoryObject(IOleObject *pole, BOOL fIsLocalAnchor);
00455     virtual HRESULT STDMETHODCALLTYPE CacheOLEServer(IOleObject *pole);
00456     virtual HRESULT STDMETHODCALLTYPE GetSetCodePage(VARIANT *pvarIn, VARIANT *pvarOut);
00457     virtual HRESULT STDMETHODCALLTYPE OnHttpEquiv(IShellView *psv, BOOL fDone, VARIANT *pvarargIn, VARIANT *pvarargOut);
00458     virtual HRESULT STDMETHODCALLTYPE GetPalette(HPALETTE *hpal);
00459     virtual HRESULT STDMETHODCALLTYPE RegisterWindow(BOOL fForceRegister, int swc);
00460 
00461     // *** IBrowserService2 methods ***
00462     virtual LRESULT STDMETHODCALLTYPE WndProcBS(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
00463     virtual HRESULT STDMETHODCALLTYPE SetAsDefFolderSettings();
00464     virtual HRESULT STDMETHODCALLTYPE GetViewRect(RECT *prc);
00465     virtual HRESULT STDMETHODCALLTYPE OnSize(WPARAM wParam);
00466     virtual HRESULT STDMETHODCALLTYPE OnCreate(struct tagCREATESTRUCTW *pcs);
00467     virtual LRESULT STDMETHODCALLTYPE OnCommand(WPARAM wParam, LPARAM lParam);
00468     virtual HRESULT STDMETHODCALLTYPE OnDestroy();
00469     virtual LRESULT STDMETHODCALLTYPE OnNotify(struct tagNMHDR *pnm);
00470     virtual HRESULT STDMETHODCALLTYPE OnSetFocus();
00471     virtual HRESULT STDMETHODCALLTYPE OnFrameWindowActivateBS(BOOL fActive);
00472     virtual HRESULT STDMETHODCALLTYPE ReleaseShellView();
00473     virtual HRESULT STDMETHODCALLTYPE ActivatePendingView();
00474     virtual HRESULT STDMETHODCALLTYPE CreateViewWindow(IShellView *psvNew, IShellView *psvOld, LPRECT prcView, HWND *phwnd);
00475     virtual HRESULT STDMETHODCALLTYPE CreateBrowserPropSheetExt(REFIID riid, void **ppv);
00476     virtual HRESULT STDMETHODCALLTYPE GetViewWindow(HWND *phwndView);
00477     virtual HRESULT STDMETHODCALLTYPE GetBaseBrowserData(LPCBASEBROWSERDATA *pbbd);
00478     virtual LPBASEBROWSERDATA STDMETHODCALLTYPE PutBaseBrowserData( void);
00479     virtual HRESULT STDMETHODCALLTYPE InitializeTravelLog(ITravelLog *ptl, DWORD dw);
00480     virtual HRESULT STDMETHODCALLTYPE SetTopBrowser();
00481     virtual HRESULT STDMETHODCALLTYPE Offline(int iCmd);
00482     virtual HRESULT STDMETHODCALLTYPE AllowViewResize(BOOL f);
00483     virtual HRESULT STDMETHODCALLTYPE SetActivateState(UINT u);
00484     virtual HRESULT STDMETHODCALLTYPE UpdateSecureLockIcon(int eSecureLock);
00485     virtual HRESULT STDMETHODCALLTYPE InitializeDownloadManager();
00486     virtual HRESULT STDMETHODCALLTYPE InitializeTransitionSite();
00487     virtual HRESULT STDMETHODCALLTYPE _Initialize(HWND hwnd, IUnknown *pauto);
00488     virtual HRESULT STDMETHODCALLTYPE _CancelPendingNavigationAsync( void);
00489     virtual HRESULT STDMETHODCALLTYPE _CancelPendingView();
00490     virtual HRESULT STDMETHODCALLTYPE _MaySaveChanges();
00491     virtual HRESULT STDMETHODCALLTYPE _PauseOrResumeView(BOOL fPaused);
00492     virtual HRESULT STDMETHODCALLTYPE _DisableModeless();
00493     virtual HRESULT STDMETHODCALLTYPE _NavigateToPidl(LPCITEMIDLIST pidl, DWORD grfHLNF, DWORD dwFlags);
00494     virtual HRESULT STDMETHODCALLTYPE _TryShell2Rename(IShellView *psv, LPCITEMIDLIST pidlNew);
00495     virtual HRESULT STDMETHODCALLTYPE _SwitchActivationNow();
00496     virtual HRESULT STDMETHODCALLTYPE _ExecChildren(IUnknown *punkBar, BOOL fBroadcast, const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANTARG *pvarargIn, VARIANTARG *pvarargOut);
00497     virtual HRESULT STDMETHODCALLTYPE _SendChildren(HWND hwndBar, BOOL fBroadcast, UINT uMsg, WPARAM wParam, LPARAM lParam);
00498     virtual HRESULT STDMETHODCALLTYPE GetFolderSetData(struct tagFolderSetData *pfsd);
00499     virtual HRESULT STDMETHODCALLTYPE _OnFocusChange(UINT itb);
00500     virtual HRESULT STDMETHODCALLTYPE v_ShowHideChildWindows(BOOL fChildOnly);
00501     virtual UINT STDMETHODCALLTYPE _get_itbLastFocus();
00502     virtual HRESULT STDMETHODCALLTYPE _put_itbLastFocus(UINT itbLastFocus);
00503     virtual HRESULT STDMETHODCALLTYPE _UIActivateView(UINT uState);
00504     virtual HRESULT STDMETHODCALLTYPE _GetViewBorderRect(RECT *prc);
00505     virtual HRESULT STDMETHODCALLTYPE _UpdateViewRectSize();
00506     virtual HRESULT STDMETHODCALLTYPE _ResizeNextBorder(UINT itb);
00507     virtual HRESULT STDMETHODCALLTYPE _ResizeView();
00508     virtual HRESULT STDMETHODCALLTYPE _GetEffectiveClientArea(LPRECT lprectBorder, HMONITOR hmon);
00509     virtual IStream *STDMETHODCALLTYPE v_GetViewStream(LPCITEMIDLIST pidl, DWORD grfMode, LPCWSTR pwszName);
00510     virtual LRESULT STDMETHODCALLTYPE ForwardViewMsg(UINT uMsg, WPARAM wParam, LPARAM lParam);
00511     virtual HRESULT STDMETHODCALLTYPE SetAcceleratorMenu(HACCEL hacc);
00512     virtual int STDMETHODCALLTYPE _GetToolbarCount();
00513     virtual LPTOOLBARITEM STDMETHODCALLTYPE _GetToolbarItem(int itb);
00514     virtual HRESULT STDMETHODCALLTYPE _SaveToolbars(IStream *pstm);
00515     virtual HRESULT STDMETHODCALLTYPE _LoadToolbars(IStream *pstm);
00516     virtual HRESULT STDMETHODCALLTYPE _CloseAndReleaseToolbars(BOOL fClose);
00517     virtual HRESULT STDMETHODCALLTYPE v_MayGetNextToolbarFocus(LPMSG lpMsg, UINT itbNext, int citb, LPTOOLBARITEM *pptbi, HWND *phwnd);
00518     virtual HRESULT STDMETHODCALLTYPE _ResizeNextBorderHelper(UINT itb, BOOL bUseHmonitor);
00519     virtual UINT STDMETHODCALLTYPE _FindTBar(IUnknown *punkSrc);
00520     virtual HRESULT STDMETHODCALLTYPE _SetFocus(LPTOOLBARITEM ptbi, HWND hwnd, LPMSG lpMsg);
00521     virtual HRESULT STDMETHODCALLTYPE v_MayTranslateAccelerator(MSG *pmsg);
00522     virtual HRESULT STDMETHODCALLTYPE _GetBorderDWHelper(IUnknown *punkSrc, LPRECT lprectBorder, BOOL bUseHmonitor);
00523     virtual HRESULT STDMETHODCALLTYPE v_CheckZoneCrossing(LPCITEMIDLIST pidl);
00524 
00525     // *** IWebBrowser methods ***
00526     virtual HRESULT STDMETHODCALLTYPE GoBack();
00527     virtual HRESULT STDMETHODCALLTYPE GoForward();
00528     virtual HRESULT STDMETHODCALLTYPE GoHome();
00529     virtual HRESULT STDMETHODCALLTYPE GoSearch();
00530     virtual HRESULT STDMETHODCALLTYPE Navigate(BSTR URL, VARIANT *Flags, VARIANT *TargetFrameName, VARIANT *PostData, VARIANT *Headers);
00531     virtual HRESULT STDMETHODCALLTYPE Refresh();
00532     virtual HRESULT STDMETHODCALLTYPE Refresh2(VARIANT *Level);
00533     virtual HRESULT STDMETHODCALLTYPE Stop();
00534     virtual HRESULT STDMETHODCALLTYPE get_Application(IDispatch **ppDisp);
00535     virtual HRESULT STDMETHODCALLTYPE get_Parent(IDispatch **ppDisp);
00536     virtual HRESULT STDMETHODCALLTYPE get_Container(IDispatch **ppDisp);
00537     virtual HRESULT STDMETHODCALLTYPE get_Document(IDispatch **ppDisp);
00538     virtual HRESULT STDMETHODCALLTYPE get_TopLevelContainer(VARIANT_BOOL *pBool);
00539     virtual HRESULT STDMETHODCALLTYPE get_Type(BSTR *Type);
00540 
00541 // WIDL temp hack : when the interface contains 'long' WIDL writes it out as a 'LONG'
00542 // Setting the prototype to LONG in this class breaks building with MSVC so we use 
00543 // the correct 'long' type here and temp hack it for WIDL generated prototypes.
00544 #ifdef __WIDL_EXDISP_H
00545 #define long LONG
00546 #endif
00547     virtual HRESULT STDMETHODCALLTYPE get_Left(long *pl);
00548     virtual HRESULT STDMETHODCALLTYPE put_Left(long Left);
00549     virtual HRESULT STDMETHODCALLTYPE get_Top(long *pl);
00550     virtual HRESULT STDMETHODCALLTYPE put_Top(long Top);
00551     virtual HRESULT STDMETHODCALLTYPE get_Width(long *pl);
00552     virtual HRESULT STDMETHODCALLTYPE put_Width(long Width);
00553     virtual HRESULT STDMETHODCALLTYPE get_Height(long *pl);
00554     virtual HRESULT STDMETHODCALLTYPE put_Height(long Height);
00555 #ifdef __WIDL_EXDISP_H
00556 #undef long
00557 #endif
00558     virtual HRESULT STDMETHODCALLTYPE get_LocationName(BSTR *LocationName);
00559     virtual HRESULT STDMETHODCALLTYPE get_LocationURL(BSTR *LocationURL);
00560     virtual HRESULT STDMETHODCALLTYPE get_Busy(VARIANT_BOOL *pBool);
00561 
00562     // *** IWebBrowserApp methods ***
00563     virtual HRESULT STDMETHODCALLTYPE Quit();
00564     virtual HRESULT STDMETHODCALLTYPE ClientToWindow(int *pcx, int *pcy);
00565     virtual HRESULT STDMETHODCALLTYPE PutProperty(BSTR Property, VARIANT vtValue);
00566     virtual HRESULT STDMETHODCALLTYPE GetProperty(BSTR Property, VARIANT *pvtValue);
00567     virtual HRESULT STDMETHODCALLTYPE get_Name(BSTR *Name);
00568     virtual HRESULT STDMETHODCALLTYPE get_HWND(SHANDLE_PTR *pHWND);
00569     virtual HRESULT STDMETHODCALLTYPE get_FullName(BSTR *FullName);
00570     virtual HRESULT STDMETHODCALLTYPE get_Path(BSTR *Path);
00571     virtual HRESULT STDMETHODCALLTYPE get_Visible(VARIANT_BOOL *pBool);
00572     virtual HRESULT STDMETHODCALLTYPE put_Visible(VARIANT_BOOL Value);
00573     virtual HRESULT STDMETHODCALLTYPE get_StatusBar(VARIANT_BOOL *pBool);
00574     virtual HRESULT STDMETHODCALLTYPE put_StatusBar(VARIANT_BOOL Value);
00575     virtual HRESULT STDMETHODCALLTYPE get_StatusText(BSTR *StatusText);
00576     virtual HRESULT STDMETHODCALLTYPE put_StatusText(BSTR StatusText);
00577     virtual HRESULT STDMETHODCALLTYPE get_ToolBar(int *Value);
00578     virtual HRESULT STDMETHODCALLTYPE put_ToolBar(int Value);
00579     virtual HRESULT STDMETHODCALLTYPE get_MenuBar(VARIANT_BOOL *Value);
00580     virtual HRESULT STDMETHODCALLTYPE put_MenuBar(VARIANT_BOOL Value);
00581     virtual HRESULT STDMETHODCALLTYPE get_FullScreen(VARIANT_BOOL *pbFullScreen);
00582     virtual HRESULT STDMETHODCALLTYPE put_FullScreen(VARIANT_BOOL bFullScreen);
00583 
00584     // *** IWebBrowser2 methods ***
00585     virtual HRESULT STDMETHODCALLTYPE Navigate2(VARIANT *URL, VARIANT *Flags, VARIANT *TargetFrameName, VARIANT *PostData, VARIANT *Headers);
00586     virtual HRESULT STDMETHODCALLTYPE QueryStatusWB(OLECMDID cmdID, OLECMDF *pcmdf);
00587     virtual HRESULT STDMETHODCALLTYPE ExecWB(OLECMDID cmdID, OLECMDEXECOPT cmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut);
00588     virtual HRESULT STDMETHODCALLTYPE ShowBrowserBar(VARIANT *pvaClsid, VARIANT *pvarShow, VARIANT *pvarSize);
00589     virtual HRESULT STDMETHODCALLTYPE get_ReadyState(READYSTATE *plReadyState);
00590     virtual HRESULT STDMETHODCALLTYPE get_Offline(VARIANT_BOOL *pbOffline);
00591     virtual HRESULT STDMETHODCALLTYPE put_Offline(VARIANT_BOOL bOffline);
00592     virtual HRESULT STDMETHODCALLTYPE get_Silent(VARIANT_BOOL *pbSilent);
00593     virtual HRESULT STDMETHODCALLTYPE put_Silent(VARIANT_BOOL bSilent);
00594     virtual HRESULT STDMETHODCALLTYPE get_RegisterAsBrowser(VARIANT_BOOL *pbRegister);
00595     virtual HRESULT STDMETHODCALLTYPE put_RegisterAsBrowser(VARIANT_BOOL bRegister);
00596     virtual HRESULT STDMETHODCALLTYPE get_RegisterAsDropTarget(VARIANT_BOOL *pbRegister);
00597     virtual HRESULT STDMETHODCALLTYPE put_RegisterAsDropTarget(VARIANT_BOOL bRegister);
00598     virtual HRESULT STDMETHODCALLTYPE get_TheaterMode(VARIANT_BOOL *pbRegister);
00599     virtual HRESULT STDMETHODCALLTYPE put_TheaterMode(VARIANT_BOOL bRegister);
00600     virtual HRESULT STDMETHODCALLTYPE get_AddressBar(VARIANT_BOOL *Value);
00601     virtual HRESULT STDMETHODCALLTYPE put_AddressBar(VARIANT_BOOL Value);
00602     virtual HRESULT STDMETHODCALLTYPE get_Resizable(VARIANT_BOOL *Value);
00603     virtual HRESULT STDMETHODCALLTYPE put_Resizable(VARIANT_BOOL Value);
00604 
00605     // *** ITravelLogClient methods ***
00606     virtual HRESULT STDMETHODCALLTYPE FindWindowByIndex(DWORD dwID, IUnknown **ppunk);
00607     virtual HRESULT STDMETHODCALLTYPE GetWindowData(LPWINDOWDATA pWinData);
00608     virtual HRESULT STDMETHODCALLTYPE LoadHistoryPosition(LPWSTR pszUrlLocation, DWORD dwPosition);
00609 
00610     // *** IPersist methods ***
00611     virtual HRESULT STDMETHODCALLTYPE GetClassID(CLSID *pClassID);
00612 
00613     // *** IPersistHistory methods ***
00614     virtual HRESULT STDMETHODCALLTYPE LoadHistory(IStream *pStream, IBindCtx *pbc);
00615     virtual HRESULT STDMETHODCALLTYPE SaveHistory(IStream *pStream);
00616     virtual HRESULT STDMETHODCALLTYPE SetPositionCookie(DWORD dwPositioncookie);
00617     virtual HRESULT STDMETHODCALLTYPE GetPositionCookie(DWORD *pdwPositioncookie);
00618 
00619     // *** IBrowserService2 methods ***
00620 
00621 
00622     // message handlers
00623     LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
00624     LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
00625     LRESULT OnInitMenuPopup(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
00626     LRESULT RelayMsgToShellView(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
00627     LRESULT OnClose(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
00628     LRESULT OnFolderOptions(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
00629     LRESULT OnMapNetworkDrive(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
00630     LRESULT OnDisconnectNetworkDrive(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
00631     LRESULT OnAboutReactOS(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
00632     LRESULT OnGoBack(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
00633     LRESULT OnGoForward(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
00634     LRESULT OnGoUpLevel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
00635     LRESULT OnGoHome(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
00636     LRESULT OnIsThisLegal(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
00637     LRESULT OnToggleStatusBarVisible(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
00638     LRESULT OnToggleToolbarLock(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
00639     LRESULT OnToggleToolbarBandVisible(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
00640     LRESULT OnToggleAddressBandVisible(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
00641     LRESULT OnToggleLinksBandVisible(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
00642     LRESULT OnToggleTextLabels(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
00643     LRESULT OnToolbarCustomize(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
00644     LRESULT OnGoTravel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
00645     LRESULT RelayCommands(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
00646 
00647     static ATL::CWndClassInfo& GetWndClassInfo()
00648     {
00649         static ATL::CWndClassInfo wc =
00650         {
00651             { sizeof(WNDCLASSEX), CS_DBLCLKS, StartWindowProc,
00652               0, 0, NULL, LoadIcon(_AtlBaseModule.GetResourceInstance(), MAKEINTRESOURCE(IDI_CABINET)),
00653               LoadCursor(NULL, IDC_ARROW), (HBRUSH)(COLOR_WINDOW + 1), NULL, szCabinetWndClass, NULL },
00654             NULL, NULL, IDC_ARROW, TRUE, 0, _T("")
00655         };
00656         return wc;
00657     }
00658 
00659 BEGIN_MSG_MAP(CShellBrowser)
00660     MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
00661     MESSAGE_HANDLER(WM_SIZE, OnSize)
00662     MESSAGE_HANDLER(WM_INITMENUPOPUP, OnInitMenuPopup)
00663     MESSAGE_HANDLER(WM_MEASUREITEM, RelayMsgToShellView)
00664     MESSAGE_HANDLER(WM_DRAWITEM, RelayMsgToShellView)
00665     MESSAGE_HANDLER(WM_MENUSELECT, RelayMsgToShellView)
00666     COMMAND_ID_HANDLER(IDM_FILE_CLOSE, OnClose)
00667     COMMAND_ID_HANDLER(IDM_TOOLS_FOLDEROPTIONS, OnFolderOptions)
00668     COMMAND_ID_HANDLER(IDM_TOOLS_MAPNETWORKDRIVE, OnMapNetworkDrive)
00669     COMMAND_ID_HANDLER(IDM_TOOLS_DISCONNECTNETWORKDRIVE, OnDisconnectNetworkDrive)
00670     COMMAND_ID_HANDLER(IDM_HELP_ABOUT, OnAboutReactOS)
00671     COMMAND_ID_HANDLER(IDM_GOTO_BACK, OnGoBack)
00672     COMMAND_ID_HANDLER(IDM_GOTO_FORWARD, OnGoForward)
00673     COMMAND_ID_HANDLER(IDM_GOTO_UPONELEVEL, OnGoUpLevel)
00674     COMMAND_ID_HANDLER(IDM_GOTO_HOMEPAGE, OnGoHome)
00675     COMMAND_ID_HANDLER(IDM_HELP_ISTHISCOPYLEGAL, OnIsThisLegal)
00676     COMMAND_ID_HANDLER(IDM_VIEW_STATUSBAR, OnToggleStatusBarVisible)
00677     COMMAND_ID_HANDLER(IDM_TOOLBARS_LOCKTOOLBARS, OnToggleToolbarLock)
00678     COMMAND_ID_HANDLER(IDM_TOOLBARS_STANDARDBUTTONS, OnToggleToolbarBandVisible)
00679     COMMAND_ID_HANDLER(IDM_TOOLBARS_ADDRESSBAR, OnToggleAddressBandVisible)
00680     COMMAND_ID_HANDLER(IDM_TOOLBARS_LINKSBAR, OnToggleLinksBandVisible)
00681     COMMAND_ID_HANDLER(IDM_TOOLBARS_TEXTLABELS, OnToggleTextLabels)
00682     COMMAND_ID_HANDLER(IDM_TOOLBARS_CUSTOMIZE, OnToolbarCustomize)
00683     COMMAND_RANGE_HANDLER(IDM_GOTO_TRAVEL_FIRSTTARGET, IDM_GOTO_TRAVEL_LASTTARGET, OnGoTravel)
00684     MESSAGE_HANDLER(WM_COMMAND, RelayCommands)
00685 END_MSG_MAP()
00686 
00687 BEGIN_CONNECTION_POINT_MAP(CShellBrowser)
00688     CONNECTION_POINT_ENTRY(DIID_DWebBrowserEvents2)
00689     CONNECTION_POINT_ENTRY(DIID_DWebBrowserEvents)
00690 END_CONNECTION_POINT_MAP()
00691 
00692 BEGIN_COM_MAP(CShellBrowser)
00693     COM_INTERFACE_ENTRY_IID(IID_IDockingWindowSite, IDockingWindowSite)
00694     COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget, IOleCommandTarget)
00695     COM_INTERFACE_ENTRY2_IID(IID_IOleWindow, IOleWindow, IDockingWindowSite)
00696     COM_INTERFACE_ENTRY_IID(IID_IShellBrowser, IShellBrowser)
00697     COM_INTERFACE_ENTRY_IID(IID_IDropTarget, IDropTarget)
00698     COM_INTERFACE_ENTRY_IID(IID_IServiceProvider, IServiceProvider)
00699     COM_INTERFACE_ENTRY_IID(IID_IProfferService, IProfferService)
00700     COM_INTERFACE_ENTRY_IID(IID_IShellBrowserService, IShellBrowserService)
00701     COM_INTERFACE_ENTRY_IID(IID_IDispatch, IDispatch)
00702     COM_INTERFACE_ENTRY_IID(IID_IConnectionPointContainer, IConnectionPointContainer)
00703     COM_INTERFACE_ENTRY_IID(IID_IWebBrowser, IWebBrowser)
00704     COM_INTERFACE_ENTRY_IID(IID_IWebBrowserApp, IWebBrowserApp)
00705     COM_INTERFACE_ENTRY_IID(IID_IWebBrowser2, IWebBrowser2)
00706     COM_INTERFACE_ENTRY_IID(IID_ITravelLogClient, ITravelLogClient)
00707     COM_INTERFACE_ENTRY_IID(IID_IPersist, IPersist)
00708     COM_INTERFACE_ENTRY_IID(IID_IPersistHistory, IPersistHistory)
00709     COM_INTERFACE_ENTRY_IID(IID_IBrowserService, IBrowserService)
00710     COM_INTERFACE_ENTRY_IID(IID_IBrowserService2, IBrowserService2)
00711 END_COM_MAP()
00712 };
00713 
00714 extern HRESULT CreateProgressDialog(REFIID riid, void **ppv);
00715 
00716 CShellBrowser::CShellBrowser()
00717 {
00718     int                                     x;
00719 
00720     fCurrentShellViewWindow = NULL;
00721     fCurrentDirectoryPIDL = NULL;
00722     fStatusBar = NULL;
00723     fStatusBarVisible = true;
00724     for (x = 0; x < 3; x++)
00725         fClientBars[x].hwnd = NULL;
00726     fCurrentMenuBar = NULL;
00727     fHistoryObject = NULL;
00728     fHistoryStream = NULL;
00729     fHistoryBindContext = NULL;
00730 }
00731 
00732 CShellBrowser::~CShellBrowser()
00733 {
00734 }
00735 
00736 HRESULT CShellBrowser::Initialize(LPITEMIDLIST pidl, long b, long c, long d)
00737 {
00738     CComPtr<IDockingWindow>                 dockingWindow;
00739     CComPtr<IStream>                        settingsStream;
00740     CComPtr<IPersistStreamInit>             persistStreamInit;
00741     CComPtr<IOleCommandTarget>              commandTarget;
00742     CComPtr<IObjectWithSite>                objectSite;
00743     RECT                                    bounds = {0, 0, 800, 591};
00744     HRESULT                                 hResult;
00745 
00746     _AtlInitialConstruct();
00747 
00748     fCabinetState.cLength = sizeof(fCabinetState);
00749     if (ReadCabinetState(&fCabinetState, sizeof(fCabinetState)) == FALSE)
00750     {
00751     }
00752 
00753     Create(HWND_DESKTOP, bounds, NULL, WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, 0, 0U);
00754     if (m_hWnd == NULL)
00755         return E_FAIL;
00756 
00757 #if 0
00758     hResult = CoCreateInstance(CLSID_InternetToolbar, NULL, CLSCTX_INPROC_SERVER, IID_IUnknown, (void **)&fClientBars[BIInternetToolbar].clientBar);
00759     if (FAILED(hResult))
00760         return hResult;
00761 #else
00762     hResult = CreateInternetToolbar(IID_IUnknown, (void **)&fClientBars[BIInternetToolbar].clientBar);
00763     if (FAILED(hResult))
00764         return hResult;
00765 #endif
00766     hResult = fClientBars[BIInternetToolbar].clientBar->QueryInterface(IID_IDockingWindow, (void **)&dockingWindow);
00767     if (FAILED(hResult))
00768         return hResult;
00769     hResult = fClientBars[BIInternetToolbar].clientBar->QueryInterface(IID_IPersistStreamInit, (void **)&persistStreamInit);
00770     if (FAILED(hResult))
00771         return hResult;
00772     hResult = fClientBars[BIInternetToolbar].clientBar->QueryInterface(IID_IOleCommandTarget, (void **)&commandTarget);
00773     if (FAILED(hResult))
00774         return hResult;
00775     hResult = fClientBars[BIInternetToolbar].clientBar->QueryInterface(IID_IObjectWithSite, (void **)&objectSite);
00776     if (FAILED(hResult))
00777         return hResult;
00778     hResult = objectSite->SetSite((IShellBrowser *)this);
00779     if (FAILED(hResult))
00780         return hResult;
00781     hResult = commandTarget->Exec(&CGID_PrivCITCommands, 1, 1 /* or 0 */, NULL, NULL);
00782     if (FAILED(hResult))
00783         return hResult;
00784     // TODO: create settingsStream from registry entry
00785     if (settingsStream.p == NULL)
00786     {
00787         hResult = persistStreamInit->InitNew();
00788         if (FAILED(hResult))
00789             return hResult;
00790     }
00791     else
00792     {
00793         hResult = persistStreamInit->Load(settingsStream);
00794         if (FAILED(hResult))
00795             return hResult;
00796     }
00797     hResult = dockingWindow->ShowDW(TRUE);
00798     if (FAILED(hResult))
00799         return hResult;
00800 
00801     fToolbarProxy.Initialize(m_hWnd, fClientBars[BIInternetToolbar].clientBar);
00802 
00803     fStatusBar = CreateWindow(STATUSCLASSNAMEW, _T(""), WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS |
00804                     SBT_NOBORDERS | SBT_TOOLTIPS, 0, 0, 500, 20, m_hWnd, (HMENU)0xa001, _AtlBaseModule.GetModuleInstance(), 0);
00805     fStatusBarVisible = true;
00806 
00807     LPITEMIDLIST                            desktopPIDL;
00808     FOLDERSETTINGS                          newFolderSettings;
00809 
00810     hResult = SHGetFolderLocation(NULL, CSIDL_DESKTOP, NULL, 0, &desktopPIDL);
00811     if (FAILED(hResult))
00812         return hResult;
00813     newFolderSettings.ViewMode = FVM_LIST;
00814     newFolderSettings.fFlags = 0;
00815     hResult = BrowseToPIDL(desktopPIDL, BTP_UPDATE_NEXT_HISTORY);
00816     ILFree(desktopPIDL);
00817     if (FAILED (hResult))
00818         return hResult;
00819 
00820     ShowWindow(SW_SHOWNORMAL);
00821 
00822 
00823 
00824 
00825     // test code to make brand band animate
00826     {
00827     CComPtr<IOleCommandTarget>              oleCommandTarget;
00828     CComPtr<IServiceProvider>               serviceProvider;
00829     CComPtr<IBandSite>                      bandSite;
00830     CComPtr<IDeskBand>                      deskBand;
00831     CComPtr<IWinEventHandler>               winEventHandler;
00832     HRESULT                                 hResult;
00833 
00834     if (fClientBars[BIInternetToolbar].clientBar.p == NULL)
00835         return 0;
00836     hResult = fClientBars[BIInternetToolbar].clientBar->QueryInterface(IID_IServiceProvider, (void **)&serviceProvider);
00837     hResult = serviceProvider->QueryService(SID_IBandSite, IID_IBandSite, (void **)&bandSite);
00838     hResult = bandSite->QueryBand(5, &deskBand, NULL, NULL, 0);
00839     deskBand->QueryInterface(IID_IWinEventHandler, (void **)&winEventHandler);
00840     winEventHandler->IsWindowOwner(NULL);
00841     deskBand->QueryInterface(IID_IOleCommandTarget, (void **)&oleCommandTarget);
00842     oleCommandTarget->QueryStatus(&CGID_BrandCmdGroup, 0, NULL, NULL);
00843     oleCommandTarget->Exec(&CGID_BrandCmdGroup, BBID_STARTANIMATION, 0, NULL, NULL);
00844     }
00845 
00846 
00847 
00848 
00849     return S_OK;
00850 }
00851 
00852 HRESULT CShellBrowser::BrowseToPIDL(LPCITEMIDLIST pidl, long flags)
00853 {
00854     CComPtr<IShellFolder>                   newFolder;
00855     FOLDERSETTINGS                          newFolderSettings;
00856     HRESULT                                 hResult;
00857 
00858     // called by shell view to browse to new folder
00859     // also called by explorer band to navigate to new folder
00860     hResult = SHBindToFolder((LPITEMIDLIST)pidl, &newFolder);
00861     newFolderSettings.ViewMode = FVM_LIST;
00862     newFolderSettings.fFlags = 0;
00863     hResult = BrowseToPath(newFolder, (LPITEMIDLIST)pidl, &newFolderSettings, flags);
00864     if (FAILED (hResult))
00865         return hResult;
00866     return S_OK;
00867 }
00868 
00869 BOOL WINAPI _ILIsDesktop(LPCITEMIDLIST pidl)
00870 {
00871     return (pidl == NULL || pidl->mkid.cb == 0);
00872 }
00873 
00874 BOOL WINAPI _ILIsPidlSimple(LPCITEMIDLIST pidl)
00875 {
00876     LPCITEMIDLIST                           pidlnext;
00877     WORD                                    length;
00878     BOOL                                    ret;
00879 
00880     ret = TRUE;
00881     if (! _ILIsDesktop(pidl))
00882     {
00883         length = pidl->mkid.cb;
00884         pidlnext = (LPCITEMIDLIST)(((LPBYTE)pidl) + length);
00885         if (pidlnext->mkid.cb != 0)
00886             ret = FALSE;
00887     }
00888     return ret;
00889 }
00890 
00891 HRESULT WINAPI SHBindToFolderIDListParent(IShellFolder *unused, LPCITEMIDLIST pidl, const IID *riid, LPVOID *ppv, LPITEMIDLIST *ppidlLast)
00892 {
00893     CComPtr<IShellFolder>                   psf;
00894     LPITEMIDLIST                            pidlChild;
00895     LPITEMIDLIST                            pidlParent;
00896     HRESULT                                 hResult;
00897 
00898     hResult = E_FAIL;
00899     if (ppv == NULL)
00900         return E_POINTER;
00901     *ppv = NULL;
00902     if (ppidlLast != NULL)
00903         *ppidlLast = NULL;
00904     if (_ILIsPidlSimple(pidl))
00905     {
00906         if (ppidlLast != NULL)
00907             *ppidlLast = ILClone(pidl);
00908         hResult = SHGetDesktopFolder((IShellFolder **)ppv);
00909     }
00910     else
00911     {
00912         pidlChild = ILClone(ILFindLastID(pidl));
00913         pidlParent = ILClone(pidl);
00914         ILRemoveLastID(pidlParent);
00915         hResult = SHGetDesktopFolder(&psf);
00916         if (SUCCEEDED(hResult))
00917             hResult = psf->BindToObject(pidlParent, NULL, *riid, ppv);
00918         if (SUCCEEDED(hResult) && ppidlLast != NULL)
00919             *ppidlLast = pidlChild;
00920         else
00921             ILFree(pidlChild);
00922         ILFree(pidlParent);
00923     }
00924     return hResult;
00925 }
00926 
00927 HRESULT IEGetNameAndFlagsEx(LPITEMIDLIST pidl, SHGDNF uFlags, long param10, LPWSTR pszBuf, UINT cchBuf, SFGAOF *rgfInOut)
00928 {
00929     CComPtr<IShellFolder>                   parentFolder;
00930     LPITEMIDLIST                            childPIDL;
00931     STRRET                                  L108;
00932     HRESULT                                 hResult;
00933 
00934     hResult = SHBindToFolderIDListParent(NULL, pidl, &IID_IShellFolder, (void **)&parentFolder, &childPIDL);
00935     hResult = parentFolder->GetDisplayNameOf(childPIDL, uFlags, &L108);
00936     StrRetToBufW(&L108, childPIDL, pszBuf, cchBuf);
00937     if (rgfInOut)
00938         hResult = parentFolder->GetAttributesOf(1, (LPCITEMIDLIST *)&childPIDL, rgfInOut);
00939     ILFree(childPIDL);
00940     return S_OK;
00941 }
00942 
00943 long IEGetNameAndFlags(LPITEMIDLIST pidl, SHGDNF uFlags, LPWSTR pszBuf, UINT cchBuf, SFGAOF *rgfInOut)
00944 {
00945     return IEGetNameAndFlagsEx(pidl, uFlags, 0, pszBuf, cchBuf, rgfInOut);
00946 }
00947 
00948 HRESULT CShellBrowser::BrowseToPath(IShellFolder *newShellFolder, LPITEMIDLIST absolutePIDL, FOLDERSETTINGS *folderSettings, long flags)
00949 {
00950     CComPtr<IOleCommandTarget>              oleCommandTarget;
00951     CComPtr<IObjectWithSite>                objectWithSite;
00952     CComPtr<IShellFolder>                   saveCurrentShellFolder;
00953     CComPtr<IShellView>                     saveCurrentShellView;
00954     CComPtr<IShellView>                     newShellView;
00955     CComPtr<ITravelLog>                     travelLog;
00956     HWND                                    newShellViewWindow;
00957     BOOL                                    windowUpdateIsLocked;
00958     RECT                                    shellViewWindowBounds;
00959     HWND                                    previousView;
00960     HCURSOR                                 saveCursor;
00961     wchar_t                                 newTitle[MAX_PATH];
00962     SHGDNF                                  nameFlags;
00963     HRESULT                                 hResult;
00964 
00965     if (newShellFolder == NULL)
00966         return E_INVALIDARG;
00967     hResult = GetTravelLog(&travelLog);
00968     if (FAILED (hResult))
00969         return hResult;
00970     if (flags & BTP_UPDATE_CUR_HISTORY)
00971     {
00972         if (travelLog->CountEntries((IDropTarget *)this) > 0)
00973             hResult = travelLog->UpdateEntry((IDropTarget *)this, FALSE);
00974         // what to do with error? Do we want to halt browse because state save failed?
00975     }
00976     hResult = newShellFolder->CreateViewObject(m_hWnd, IID_IShellView, (void **)&newShellView);
00977     if (FAILED (hResult))
00978         return hResult;
00979     previousView = fCurrentShellViewWindow;
00980     saveCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));
00981     windowUpdateIsLocked = LockWindowUpdate(TRUE);
00982     if (fCurrentShellView != NULL)
00983         ::SendMessage(fCurrentShellViewWindow, WM_SETREDRAW, 0, 0);
00984     hResult = newShellView->QueryInterface(IID_IObjectWithSite, (void **)&objectWithSite);
00985     if (SUCCEEDED(hResult) && objectWithSite.p != NULL)
00986         hResult = objectWithSite->SetSite((IDropTarget *)this);
00987     saveCurrentShellFolder = fCurrentShellFolder;
00988     saveCurrentShellView = fCurrentShellView;
00989     fCurrentShellFolder = newShellFolder;
00990     fCurrentShellView = newShellView;
00991     if (previousView != NULL)
00992         ::GetWindowRect(previousView, &shellViewWindowBounds);
00993     else
00994         memset(&shellViewWindowBounds, 0, sizeof(shellViewWindowBounds));
00995     ::MapWindowPoints(0, m_hWnd, (POINT *)&shellViewWindowBounds, 2);
00996     hResult = newShellView->CreateViewWindow(saveCurrentShellView, folderSettings, this, &shellViewWindowBounds, &newShellViewWindow);
00997     if (FAILED (hResult) || newShellViewWindow == NULL)
00998     {
00999         fCurrentShellView = saveCurrentShellView;
01000         fCurrentShellFolder = saveCurrentShellFolder;
01001         ::SendMessage(fCurrentShellViewWindow, WM_SETREDRAW, 1, 0);
01002         if (windowUpdateIsLocked)
01003             LockWindowUpdate(FALSE);
01004         SetCursor(saveCursor);
01005         return hResult;
01006     }
01007     if (objectWithSite.p != NULL)
01008         hResult = objectWithSite->SetSite(NULL);
01009     ILFree(fCurrentDirectoryPIDL);
01010     fCurrentDirectoryPIDL = ILClone(absolutePIDL);
01011     if (saveCurrentShellView != NULL)
01012         saveCurrentShellView->DestroyViewWindow();
01013     fCurrentShellViewWindow = newShellViewWindow;
01014     oleCommandTarget.Release();
01015     hResult = newShellView->QueryInterface(IID_IOleCommandTarget, (void **)&oleCommandTarget);
01016     saveCurrentShellView.Release();
01017     saveCurrentShellFolder.Release();
01018     hResult = newShellView->UIActivate(SVUIA_ACTIVATE_FOCUS);
01019     if (windowUpdateIsLocked)
01020         LockWindowUpdate(FALSE);
01021     SetCursor(saveCursor);
01022     if (flags & BTP_UPDATE_NEXT_HISTORY)
01023     {
01024         hResult = travelLog->AddEntry((IDropTarget *)this, FALSE);
01025         hResult = travelLog->UpdateEntry((IDropTarget *)this, FALSE);
01026     }
01027     FireNavigateComplete(L"c:\\temp");      // TODO: use real path here
01028     if (fCabinetState.fFullPathTitle)
01029         nameFlags = SHGDN_FORADDRESSBAR | SHGDN_FORPARSING;
01030     else
01031         nameFlags = SHGDN_FORADDRESSBAR;
01032     hResult = IEGetNameAndFlags(fCurrentDirectoryPIDL, nameFlags, newTitle, sizeof(newTitle) / sizeof(wchar_t), NULL);
01033     if (SUCCEEDED(hResult))
01034         SetWindowText(newTitle);
01035     // TODO: Update the window icon
01036     FireCommandStateChangeAll();
01037     hResult = UpdateForwardBackState();
01038     return S_OK;
01039 }
01040 
01041 HRESULT CShellBrowser::GetMenuBand(REFIID riid, void **shellMenu)
01042 {
01043     CComPtr<IServiceProvider>               serviceProvider;
01044     CComPtr<IBandSite>                      bandSite;
01045     CComPtr<IDeskBand>                      deskBand;
01046     HRESULT                                 hResult;
01047 
01048     if (fClientBars[BIInternetToolbar].clientBar.p == NULL)
01049         return E_FAIL;
01050     hResult = fClientBars[BIInternetToolbar].clientBar->QueryInterface(IID_IServiceProvider, (void **)&serviceProvider);
01051     if (FAILED(hResult))
01052         return hResult;
01053     hResult = serviceProvider->QueryService(SID_IBandSite, IID_IBandSite, (void **)&bandSite);
01054     if (FAILED(hResult))
01055         return hResult;
01056     hResult = bandSite->QueryBand(1, &deskBand, NULL, NULL, 0);
01057     if (FAILED(hResult))
01058         return hResult;
01059     return deskBand->QueryInterface(riid, shellMenu);
01060 }
01061 
01062 HRESULT CShellBrowser::GetBaseBar(bool vertical, IUnknown **theBaseBar)
01063 {
01064     CComPtr<IUnknown>                       newBaseBar;
01065     CComPtr<IDeskBar>                       deskBar;
01066     CComPtr<IUnknown>                       newBaseBarSite;
01067     CComPtr<IObjectWithSite>                objectWithSite;
01068     CComPtr<IDeskBarClient>                 deskBarClient;
01069     IUnknown                                **cache;
01070     HRESULT                                 hResult;
01071 
01072     if (vertical)
01073         cache = &fClientBars[BIVerticalBaseBar].clientBar.p;
01074     else
01075         cache = &fClientBars[BIHorizontalBaseBar].clientBar.p;
01076     if (*cache == NULL)
01077     {
01078         hResult = CreateBaseBar(IID_IUnknown, (void **)&newBaseBar);
01079         if (FAILED(hResult))
01080             return hResult;
01081         hResult = CreateBaseBarSite(IID_IUnknown, (void **)&newBaseBarSite);
01082         if (FAILED(hResult))
01083             return hResult;
01084 
01085         // tell the new base bar about the shell browser
01086         hResult = newBaseBar->QueryInterface(IID_IObjectWithSite, (void **)&objectWithSite);
01087         if (FAILED(hResult))
01088             return hResult;
01089         hResult = objectWithSite->SetSite((IDropTarget *)this);
01090         if (FAILED(hResult))
01091             return hResult;
01092 
01093         // tell the new base bar about the new base bar site
01094         hResult = newBaseBar->QueryInterface(IID_IDeskBar, (void **)&deskBar);
01095         if (FAILED(hResult))
01096             return hResult;
01097         hResult = deskBar->SetClient(newBaseBarSite);
01098         if (FAILED(hResult))
01099             return hResult;
01100 
01101         // tell the new base bar site about the new base bar
01102         hResult = newBaseBarSite->QueryInterface(IID_IDeskBarClient, (void **)&deskBarClient);
01103         if (FAILED(hResult))
01104             return hResult;
01105         hResult = deskBarClient->SetDeskBarSite(newBaseBar);
01106         if (FAILED(hResult))
01107             return hResult;
01108 
01109         *cache = newBaseBar.Detach();
01110     }
01111     return (*cache)->QueryInterface(IID_IUnknown, (void **)theBaseBar);
01112 }
01113 
01114 HRESULT CShellBrowser::ShowBand(const CLSID &classID, bool vertical)
01115 {
01116     CComPtr<IDockingWindow>                 dockingWindow;
01117     CComPtr<IOleCommandTarget>              oleCommandTarget;
01118     CComPtr<IUnknown>                       baseBarSite;
01119     CComPtr<IUnknown>                       newBand;
01120     CComPtr<IUnknown>                       theBaseBar;
01121     CComPtr<IDeskBar>                       deskBar;
01122     VARIANT                                 vaIn;
01123     HRESULT                                 hResult;
01124 
01125     hResult = GetBaseBar(vertical, (IUnknown **)&theBaseBar);
01126     if (FAILED(hResult))
01127         return hResult;
01128     hResult = CoCreateInstance(classID, NULL, CLSCTX_INPROC_SERVER, IID_IUnknown, (void **)&newBand);
01129     if (FAILED(hResult))
01130         return hResult;
01131     hResult = theBaseBar->QueryInterface(IID_IDeskBar, (void **)&deskBar);
01132     if (FAILED(hResult))
01133         return hResult;
01134     hResult = deskBar->GetClient(&baseBarSite);
01135     if (FAILED(hResult))
01136         return hResult;
01137     hResult = theBaseBar->QueryInterface(IID_IDockingWindow, (void **)&dockingWindow);
01138     if (FAILED(hResult))
01139         return hResult;
01140     hResult = baseBarSite->QueryInterface(IID_IOleCommandTarget, (void **)&oleCommandTarget);
01141     if (FAILED(hResult))
01142         return hResult;
01143     V_VT(&vaIn) = VT_UNKNOWN;
01144     V_UNKNOWN(&vaIn) = newBand.p;
01145     hResult = oleCommandTarget->Exec(&CGID_IDeskBand, 1, 1, &vaIn, NULL);
01146     if (FAILED(hResult))
01147         return hResult;
01148     hResult = dockingWindow->ShowDW(TRUE);
01149     if (FAILED(hResult))
01150         return hResult;
01151     return S_OK;
01152 }
01153 
01154 HRESULT CShellBrowser::NavigateToParent()
01155 {
01156     LPITEMIDLIST                            newDirectory;
01157     HRESULT                                 hResult;
01158 
01159     newDirectory = ILClone(fCurrentDirectoryPIDL);
01160     if (newDirectory == NULL)
01161         return E_OUTOFMEMORY;
01162     ILRemoveLastID(newDirectory);
01163     hResult = BrowseToPIDL((LPITEMIDLIST)newDirectory, BTP_UPDATE_CUR_HISTORY | BTP_UPDATE_NEXT_HISTORY);
01164     ILFree(newDirectory);
01165     if (FAILED (hResult))
01166         return hResult;
01167     return S_OK;
01168 }
01169 
01170 BOOL CALLBACK AddFolderOptionsPage(HPROPSHEETPAGE thePage, LPARAM lParam)
01171 {
01172     PROPSHEETHEADER                         *sheetInfo;
01173 
01174     sheetInfo = (PROPSHEETHEADER *)lParam;
01175     if (sheetInfo->nPages >= folderOptionsPageCountMax)
01176         return FALSE;
01177     sheetInfo->phpage[sheetInfo->nPages] = thePage;
01178     sheetInfo->nPages++;
01179     return TRUE;
01180 }
01181 
01182 HRESULT CShellBrowser::DoFolderOptions()
01183 {
01184     CComPtr<IShellPropSheetExt>             folderOptionsSheet;
01185     CComPtr<IObjectWithSite>                objectWithSite;
01186     PROPSHEETHEADER                         m_PropSheet;
01187     HPROPSHEETPAGE                          m_psp[folderOptionsPageCountMax];
01188 //  CComPtr<IGlobalFolderSettings>          globalSettings;
01189 //  SHELLSTATE2                             shellState;
01190     HRESULT                                 hResult;
01191 
01192     memset(m_psp, 0, sizeof(m_psp));
01193     memset(&m_PropSheet, 0, sizeof(m_PropSheet));
01194 
01195     hResult = CoCreateInstance(CLSID_ShellFldSetExt, NULL, CLSCTX_INPROC_SERVER, IID_IShellPropSheetExt, (void **)&folderOptionsSheet);
01196     if (FAILED(hResult))
01197         return E_FAIL;
01198     // must set site in order for Apply to all Folders on Advanced page to be enabled
01199     hResult = folderOptionsSheet->QueryInterface(IID_IObjectWithSite, (void **)&objectWithSite);
01200     if (SUCCEEDED(hResult) && objectWithSite.p != NULL)
01201         hResult = objectWithSite->SetSite((IDispatch *)this);
01202     m_PropSheet.phpage = m_psp;
01203 #if 0
01204     hResult = CoCreateInstance(CLSID_GlobalFolderSettings, NULL, CLSCTX_INPROC_SERVER, IID_IGlobalFolderSettings, (void **)&globalSettings);
01205     if (FAILED(hResult))
01206         return E_FAIL;
01207     hResult = globalSettings->Get(&shellState, sizeof(shellState));
01208     if (FAILED(hResult))
01209         return E_FAIL;
01210 #endif
01211     hResult = folderOptionsSheet->AddPages(AddFolderOptionsPage, (LPARAM)&m_PropSheet);
01212     if (FAILED(hResult))
01213         return E_FAIL;
01214     if (fCurrentShellView != NULL)
01215     {
01216         hResult = fCurrentShellView->AddPropertySheetPages( 0, AddFolderOptionsPage, (LPARAM)&m_PropSheet);
01217         if (FAILED(hResult))
01218             return E_FAIL;
01219     }
01220 
01221     m_PropSheet.dwSize = sizeof(PROPSHEETHEADER);
01222     m_PropSheet.dwFlags = 0;
01223     m_PropSheet.hwndParent = m_hWnd;
01224     m_PropSheet.hInstance = _AtlBaseModule.GetResourceInstance();
01225     m_PropSheet.pszCaption = _T("Folder Options");
01226     m_PropSheet.nStartPage = 0;
01227 
01228     PropertySheet(&m_PropSheet);
01229     return S_OK;
01230 }
01231 
01232 LRESULT CALLBACK CShellBrowser::WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
01233 {
01234     CShellBrowser                           *pThis = reinterpret_cast<CShellBrowser *>(hWnd);
01235     _ATL_MSG                                msg(pThis->m_hWnd, uMsg, wParam, lParam);
01236     LRESULT                                 lResult;
01237     CComPtr<IMenuBand>                      menuBand;
01238     const _ATL_MSG                          *previousMessage;
01239     BOOL                                    handled;
01240     WNDPROC                                 saveWindowProc;
01241     HRESULT                                 hResult;
01242 
01243     hWnd = pThis->m_hWnd;
01244     previousMessage = pThis->m_pCurrentMsg;
01245     pThis->m_pCurrentMsg = &msg;
01246 
01247     hResult = pThis->GetMenuBand(IID_IMenuBand, (void **)&menuBand);
01248     if (SUCCEEDED(hResult) && menuBand.p != NULL)
01249     {
01250         hResult = menuBand->TranslateMenuMessage(&msg, &lResult);
01251         if (hResult == S_OK)
01252             return lResult;
01253         uMsg = msg.message;
01254         wParam = msg.wParam;
01255         lParam = msg.lParam;
01256     }
01257 
01258     handled = pThis->ProcessWindowMessage(hWnd, uMsg, wParam, lParam, lResult, 0);
01259     ATLASSERT(pThis->m_pCurrentMsg == &msg);
01260     if (handled == FALSE)
01261     {
01262         if (uMsg == WM_NCDESTROY)
01263         {
01264             saveWindowProc = (WNDPROC)GetWindowLongPtr(hWnd, GWL_WNDPROC);
01265             lResult = pThis->DefWindowProc(uMsg, wParam, lParam);
01266             if (saveWindowProc == (WNDPROC)GetWindowLongPtr(hWnd, GWL_WNDPROC))
01267                 SetWindowLongPtr(hWnd, GWL_WNDPROC, (LONG_PTR)pThis->m_pfnSuperWindowProc);
01268             pThis->m_dwState |= WINSTATE_DESTROYED;
01269         }
01270         else
01271             lResult = pThis->DefWindowProc(uMsg, wParam, lParam);
01272     }
01273     pThis->m_pCurrentMsg = previousMessage;
01274     if (previousMessage == NULL && (pThis->m_dwState & WINSTATE_DESTROYED) != 0)
01275     {
01276         pThis->m_dwState &= ~WINSTATE_DESTROYED;
01277         pThis->m_hWnd = NULL;
01278         pThis->OnFinalMessage(hWnd);
01279     }
01280     return lResult;
01281 }
01282 
01283 void CShellBrowser::RepositionBars()
01284 {
01285     RECT                                    clientRect;
01286     RECT                                    statusRect;
01287     RECT                                    toolbarRect;
01288     int                                     x;
01289     HRESULT                                 hResult;
01290 
01291     GetClientRect(&clientRect);
01292 
01293     if (fStatusBarVisible)
01294     {
01295         ::GetWindowRect(fStatusBar, &statusRect);
01296         ::SetWindowPos(fStatusBar, NULL, clientRect.left, clientRect.bottom - (statusRect.bottom - statusRect.top),
01297                             clientRect.right - clientRect.left,
01298                             statusRect.bottom - statusRect.top, SWP_NOOWNERZORDER | SWP_NOZORDER);
01299         clientRect.bottom -= statusRect.bottom - statusRect.top;
01300     }
01301 
01302     for (x = 0; x < 3; x++)
01303     {
01304         CComPtr<IOleWindow>                 oleWindow;
01305 
01306         if (fClientBars[x].hwnd == NULL && fClientBars[x].clientBar != NULL)
01307         {
01308             hResult = fClientBars[x].clientBar->QueryInterface(IID_IOleWindow, (void **)&oleWindow);
01309             if (SUCCEEDED(hResult))
01310                 hResult = oleWindow->GetWindow(&fClientBars[x].hwnd);
01311         }
01312         if (fClientBars[x].hwnd != NULL)
01313         {
01314             toolbarRect = clientRect;
01315             if (fClientBars[x].borderSpace.top != 0)
01316                 toolbarRect.bottom = toolbarRect.top + fClientBars[x].borderSpace.top;
01317             else if (fClientBars[x].borderSpace.bottom != 0)
01318                 toolbarRect.top = toolbarRect.bottom - fClientBars[x].borderSpace.bottom;
01319             if (fClientBars[x].borderSpace.left != 0)
01320                 toolbarRect.right = toolbarRect.left + fClientBars[x].borderSpace.left;
01321             else if (fClientBars[x].borderSpace.right != 0)
01322                 toolbarRect.left = toolbarRect.right - fClientBars[x].borderSpace.right;
01323             ::SetWindowPos(fClientBars[x].hwnd, NULL, toolbarRect.left, toolbarRect.top,
01324                                 toolbarRect.right - toolbarRect.left,
01325                                 toolbarRect.bottom - toolbarRect.top, SWP_NOOWNERZORDER | SWP_NOZORDER);
01326             clientRect.top += fClientBars[x].borderSpace.top;
01327             clientRect.left += fClientBars[x].borderSpace.left;
01328             clientRect.bottom += fClientBars[x].borderSpace.bottom;
01329             clientRect.right += fClientBars[x].borderSpace.right;
01330         }
01331     }
01332     ::SetWindowPos(fCurrentShellViewWindow, NULL, clientRect.left, clientRect.top,
01333                         clientRect.right - clientRect.left,
01334                         clientRect.bottom - clientRect.top, SWP_NOOWNERZORDER | SWP_NOZORDER);
01335 }
01336 
01337 HRESULT CShellBrowser::FireEvent(DISPID dispIdMember, int argCount, VARIANT *arguments)
01338 {
01339     DISPPARAMS                          params;
01340     CComDynamicUnkArray                 &vec = IConnectionPointImpl<CShellBrowser, &DIID_DWebBrowserEvents2>::m_vec;
01341     CComDynamicUnkArray                 &vec2 = IConnectionPointImpl<CShellBrowser, &DIID_DWebBrowserEvents>::m_vec;
01342     HRESULT                             hResult;
01343 
01344     params.rgvarg = arguments;
01345     params.rgdispidNamedArgs = NULL;
01346     params.cArgs = argCount;
01347     params.cNamedArgs = 0;
01348     IUnknown** pp = vec.begin();
01349     while (pp < vec.end())
01350     {
01351         if (*pp != NULL)
01352         {
01353             CComPtr<IDispatch>          theDispatch;
01354 
01355             hResult = (*pp)->QueryInterface(IID_IDispatch, (void **)&theDispatch);
01356             hResult = theDispatch->Invoke(dispIdMember, GUID_NULL, 0, DISPATCH_METHOD, &params, NULL, NULL, NULL);
01357         }
01358         pp++;
01359     }
01360     pp = vec2.begin();
01361     while (pp < vec2.end())
01362     {
01363         if (*pp != NULL)
01364         {
01365             CComPtr<IDispatch>          theDispatch;
01366 
01367             hResult = (*pp)->QueryInterface(IID_IDispatch, (void **)&theDispatch);
01368             hResult = theDispatch->Invoke(dispIdMember, GUID_NULL, 0, DISPATCH_METHOD, &params, NULL, NULL, NULL);
01369         }
01370         pp++;
01371     }
01372     return S_OK;
01373 }
01374 
01375 HRESULT CShellBrowser::FireNavigateComplete(const wchar_t *newDirectory)
01376 {
01377     // these two variants intentionally to do use CComVariant because it would double free/release
01378     // or does not need to dispose at all
01379     VARIANT                             varArg[2];
01380     VARIANT                             varArgs;
01381     CComBSTR                            tempString(newDirectory);
01382 
01383     V_VT(&varArgs) = VT_BSTR;
01384     V_BSTR(&varArgs) = tempString.m_str;
01385 
01386     V_VT(&varArg[0]) = VT_VARIANT | VT_BYREF;
01387     V_VARIANTREF(&varArg[0]) = &varArgs;
01388     V_VT(&varArg[1]) = VT_DISPATCH;
01389     V_DISPATCH(&varArg[1]) = (IDispatch *)this;
01390 
01391     return FireEvent(DISPID_NAVIGATECOMPLETE2, 2, varArg);
01392 }
01393 
01394 HRESULT CShellBrowser::FireCommandStateChange(bool newState, int commandID)
01395 {
01396     VARIANT                             varArg[2];
01397 
01398     V_VT(&varArg[0]) = VT_BOOL;
01399     V_BOOL(&varArg[0]) = newState ? VARIANT_TRUE : VARIANT_FALSE;
01400     V_VT(&varArg[1]) = VT_I4;
01401     V_I4(&varArg[1]) = commandID;
01402 
01403     return FireEvent(DISPID_COMMANDSTATECHANGE, 2, varArg);
01404 }
01405 
01406 HRESULT CShellBrowser::FireCommandStateChangeAll()
01407 {
01408     return FireCommandStateChange(false, -1);
01409 }
01410 
01411 HRESULT CShellBrowser::UpdateForwardBackState()
01412 {
01413     CComPtr<ITravelLog>                     travelLog;
01414     CComPtr<ITravelEntry>                   unusedEntry;
01415     bool                                    canGoBack;
01416     bool                                    canGoForward;
01417     HRESULT                                 hResult;
01418 
01419     canGoBack = false;
01420     canGoForward = false;
01421     hResult = GetTravelLog(&travelLog);
01422     if (FAILED (hResult))
01423         return hResult;
01424     hResult = travelLog->GetTravelEntry((IDropTarget *)this, TLOG_BACK, &unusedEntry);
01425     if (SUCCEEDED(hResult))
01426     {
01427         canGoBack = true;
01428         unusedEntry.Release();
01429     }
01430     hResult = travelLog->GetTravelEntry((IDropTarget *)this, TLOG_FORE, &unusedEntry);
01431     if (SUCCEEDED(hResult))
01432     {
01433         canGoForward = true;
01434         unusedEntry.Release();
01435     }
01436     hResult = FireCommandStateChange(canGoBack, 2);
01437     hResult = FireCommandStateChange(canGoForward, 1);
01438     return S_OK;
01439 }
01440 
01441 void CShellBrowser::UpdateGotoMenu(HMENU theMenu)
01442 {
01443     CComPtr<ITravelLog>                     travelLog;
01444     int                                     position;
01445     MENUITEMINFO                            menuItemInfo;
01446     HRESULT                                 hResult;
01447 
01448     DeleteMenuItems(theMenu, IDM_GOTO_TRAVEL_FIRST, IDM_GOTO_TRAVEL_LAST);
01449 
01450     position = GetMenuItemCount(theMenu);
01451     hResult = GetTravelLog(&travelLog);
01452     if (FAILED (hResult))
01453         return;
01454     hResult = travelLog->InsertMenuEntries((IDropTarget *)this, theMenu, position, IDM_GOTO_TRAVEL_FIRSTTARGET, IDM_GOTO_TRAVEL_LASTTARGET, TLMENUF_BACKANDFORTH | TLMENUF_CHECKCURRENT);
01455     if (SUCCEEDED(hResult))
01456     {
01457         menuItemInfo.cbSize = sizeof(menuItemInfo);
01458         menuItemInfo.fMask = MIIM_TYPE | MIIM_ID;
01459         menuItemInfo.fType = MF_SEPARATOR;
01460         menuItemInfo.wID = IDM_GOTO_TRAVEL_SEP;
01461         InsertMenuItem(theMenu, position, TRUE, &menuItemInfo);
01462     }
01463 }
01464 
01465 void CShellBrowser::UpdateViewMenu(HMENU theMenu)
01466 {
01467     CComPtr<IOleCommandTarget>              oleCommandTarget;
01468     CComPtr<ITravelLog>                     travelLog;
01469     HMENU                                   gotoMenu;
01470     OLECMD                                  commandList[5];
01471     HMENU                                   toolbarMenuBar;
01472     HMENU                                   toolbarMenu;
01473     MENUITEMINFO                            menuItemInfo;
01474     HRESULT                                 hResult;
01475 
01476     gotoMenu = SHGetMenuFromID(theMenu, FCIDM_MENU_EXPLORE);
01477     if (gotoMenu != NULL)
01478         UpdateGotoMenu(gotoMenu);
01479 
01480     commandList[0].cmdID = ITID_TOOLBARBANDSHOWN;
01481     commandList[1].cmdID = ITID_ADDRESSBANDSHOWN;
01482     commandList[2].cmdID = ITID_LINKSBANDSHOWN;
01483     commandList[3].cmdID = ITID_TOOLBARLOCKED;
01484     commandList[4].cmdID = ITID_CUSTOMIZEENABLED;
01485 
01486     hResult = fClientBars[BIInternetToolbar].clientBar->QueryInterface(IID_IOleCommandTarget, (void **)&oleCommandTarget);
01487     if (SUCCEEDED(hResult))
01488         hResult = oleCommandTarget->QueryStatus(&CGID_PrivCITCommands, 5, commandList, NULL);
01489     if (FAILED(hResult))
01490         DeleteMenu(theMenu, IDM_VIEW_TOOLBARS, MF_BYCOMMAND);
01491     else
01492     {
01493         toolbarMenuBar = LoadMenu(_AtlBaseModule.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_CONTEXTMENU));
01494         toolbarMenu = GetSubMenu(toolbarMenuBar, 0);
01495 
01496         SHCheckMenuItem(toolbarMenu, IDM_TOOLBARS_STANDARDBUTTONS, commandList[0].cmdf);
01497         SHCheckMenuItem(toolbarMenu, IDM_TOOLBARS_ADDRESSBAR, commandList[1].cmdf & OLECMDF_ENABLED);
01498         SHCheckMenuItem(toolbarMenu, IDM_TOOLBARS_LINKSBAR, commandList[2].cmdf & OLECMDF_ENABLED);
01499         SHCheckMenuItem(toolbarMenu, IDM_TOOLBARS_LOCKTOOLBARS, commandList[3].cmdf & OLECMDF_ENABLED);
01500         if ((commandList[4].cmdf & OLECMDF_ENABLED) == 0)
01501             DeleteMenu(toolbarMenu, IDM_TOOLBARS_CUSTOMIZE, MF_BYCOMMAND);
01502         DeleteMenu(toolbarMenu, IDM_TOOLBARS_TEXTLABELS, MF_BYCOMMAND);
01503         DeleteMenu(toolbarMenu, IDM_TOOLBARS_GOBUTTON, MF_BYCOMMAND);
01504 
01505         menuItemInfo.cbSize = sizeof(menuItemInfo);
01506         menuItemInfo.fMask = MIIM_SUBMENU;
01507         menuItemInfo.hSubMenu = toolbarMenu;
01508         SetMenuItemInfo(theMenu, IDM_VIEW_TOOLBARS, FALSE, &menuItemInfo);
01509     }
01510     SHCheckMenuItem(theMenu, IDM_VIEW_STATUSBAR, fStatusBarVisible ? TRUE : FALSE);
01511 }
01512 
01513 bool IUnknownIsEqual(IUnknown *int1, IUnknown *int2)
01514 {
01515     CComPtr<IUnknown>                       int1Retry;
01516     CComPtr<IUnknown>                       int2Retry;
01517     HRESULT                                 hResult;
01518 
01519     if (int1 == int2)
01520         return true;
01521     if (int1 == NULL || int2 == NULL)
01522         return false;
01523     hResult = int1->QueryInterface(IID_IUnknown, (void **)&int1Retry);
01524     if (FAILED(hResult))
01525         return false;
01526     hResult = int2->QueryInterface(IID_IUnknown, (void **)&int2Retry);
01527     if (FAILED(hResult))
01528         return false;
01529     if (int1Retry == int2Retry)
01530         return true;
01531     return false;
01532 }
01533 
01534 HRESULT STDMETHODCALLTYPE CShellBrowser::GetBorderDW(IUnknown *punkObj, LPRECT prcBorder)
01535 {
01536     RECT                                    availableBounds;
01537     static const INT                        excludeItems[] = {1, 1, 1, 0xa001, 0, 0};
01538     int                                     x;
01539 
01540     GetEffectiveClientRect(m_hWnd, &availableBounds, (INT *)&excludeItems);
01541     for (x = 0; x < 3; x++)
01542     {
01543         if (fClientBars[x].clientBar.p != NULL && !IUnknownIsEqual(fClientBars[x].clientBar, punkObj))
01544         {
01545             availableBounds.top += fClientBars[x].borderSpace.top;
01546             availableBounds.left += fClientBars[x].borderSpace.left;
01547             availableBounds.bottom -= fClientBars[x].borderSpace.bottom;
01548             availableBounds.right -= fClientBars[x].borderSpace.right;
01549         }
01550     }
01551     *prcBorder = availableBounds;
01552     return S_OK;
01553 }
01554 
01555 HRESULT STDMETHODCALLTYPE CShellBrowser::RequestBorderSpaceDW(IUnknown* punkObj, LPCBORDERWIDTHS pbw)
01556 {
01557     return S_OK;
01558 }
01559 
01560 HRESULT STDMETHODCALLTYPE CShellBrowser::SetBorderSpaceDW(IUnknown* punkObj, LPCBORDERWIDTHS pbw)
01561 {
01562     int                                     x;
01563 
01564     for (x = 0; x < 3; x++)
01565     {
01566         if (IUnknownIsEqual(fClientBars[x].clientBar, punkObj))
01567         {
01568             fClientBars[x].borderSpace = *pbw;
01569             // if this bar changed size, it cascades and forces all subsequent bars to resize
01570             RepositionBars();
01571             return S_OK;
01572         }
01573     }
01574     return E_INVALIDARG;
01575 }
01576 
01577 HRESULT STDMETHODCALLTYPE CShellBrowser::QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[  ], OLECMDTEXT *pCmdText)
01578 {
01579     CComPtr<IOleCommandTarget>              commandTarget;
01580     HRESULT                                 hResult;
01581 
01582     if (prgCmds == NULL)
01583         return E_INVALIDARG;
01584     if (pguidCmdGroup == NULL)
01585     {
01586         if (fCurrentShellView.p != NULL)
01587         {
01588             hResult = fCurrentShellView->QueryInterface(IID_IOleCommandTarget, (void **)&commandTarget);
01589             if (SUCCEEDED(hResult) && commandTarget.p != NULL)
01590                 return commandTarget->QueryStatus(NULL, 1, prgCmds, pCmdText);
01591         }
01592         while (cCmds != 0)
01593         {
01594             prgCmds->cmdf = 0;
01595             prgCmds++;
01596             cCmds--;
01597         }
01598     }
01599     else if (IsEqualIID(*pguidCmdGroup, CGID_Explorer))
01600     {
01601         while (cCmds != 0)
01602         {
01603             switch (prgCmds->cmdID)
01604             {
01605                 case 0x1c:  // search
01606                     prgCmds->cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED;
01607                     break;
01608                 case 0x1d:  // history
01609                     prgCmds->cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED;
01610                     break;
01611                 case 0x1e:  // favorites
01612                     prgCmds->cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED;
01613                     break;
01614                 case 0x23:  // folders
01615                     prgCmds->cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED | OLECMDF_LATCHED;
01616                     break;
01617                 default:
01618                     prgCmds->cmdf = 0;
01619                     break;
01620             }
01621             prgCmds++;
01622             cCmds--;
01623         }
01624     }
01625     else if (IsEqualIID(*pguidCmdGroup, CGID_ShellBrowser))
01626     {
01627         while (cCmds != 0)
01628         {
01629             switch (prgCmds->cmdID)
01630             {
01631                 case 0xa022:    // up level
01632                     prgCmds->cmdf = OLECMDF_SUPPORTED;
01633                     if (fCurrentDirectoryPIDL->mkid.cb != 0)
01634                         prgCmds->cmdf |= OLECMDF_ENABLED;
01635                     break;
01636             }
01637             prgCmds++;
01638             cCmds--;
01639         }
01640     }
01641     return S_OK;
01642 }
01643 
01644 HRESULT STDMETHODCALLTYPE CShellBrowser::Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
01645 {
01646     HRESULT                                 hResult;
01647 
01648     if (IsEqualIID(*pguidCmdGroup, CGID_Explorer))
01649     {
01650         switch (nCmdID)
01651         {
01652             case 0x23:
01653                 hResult = ShowBand(CLSID_ExplorerBand, true);
01654                 return S_OK;
01655             case 0x27:
01656                 if (nCmdexecopt == 1)
01657                 {
01658                     // pvaIn is a VT_UNKNOWN with a band that is being hidden
01659                 }
01660                 else
01661                 {
01662                     // update zones part of the status bar
01663                 }
01664                 return S_OK;
01665             case 0x35: // don't do this, and the internet toolbar doesn't create a menu band
01666                 V_VT(pvaOut) = VT_INT_PTR;
01667                 V_INTREF(pvaOut) = (INT *)LoadMenu(_AtlBaseModule.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU));
01668                 return S_OK;
01669             case 0x38:
01670                 // indicate if this cabinet was opened as a browser
01671                 return S_FALSE;
01672             default:
01673                 return E_NOTIMPL;
01674         }
01675     }
01676     else if (IsEqualIID(*pguidCmdGroup, CGID_InternetButtons))
01677     {
01678         switch (nCmdID)
01679         {
01680             case 0x23:
01681                 // placeholder
01682                 return S_OK;
01683         }
01684     }
01685     else if (IsEqualIID(*pguidCmdGroup, CGID_Theater))
01686     {
01687         switch (nCmdID)
01688         {
01689             case 6:
01690                 // what is theater mode and why do we receive this?
01691                 return E_NOTIMPL;
01692         }
01693     }
01694     else if (IsEqualIID(*pguidCmdGroup, CGID_MenuBand))
01695     {
01696         switch (nCmdID)
01697         {
01698             case 14:
01699                 // initialize favorites menu
01700                 return S_OK;
01701         }
01702     }
01703     else if (IsEqualIID(*pguidCmdGroup, CGID_ShellDocView))
01704     {
01705         switch (nCmdID)
01706         {
01707             case 0x12:
01708                 // refresh on toolbar clicked
01709                 return S_OK;
01710             case 0x4d:
01711                 // tell the view if it should hide the task pane or not
01712                 return (fClientBars[BIVerticalBaseBar].clientBar.p == NULL) ? S_FALSE : S_OK;
01713         }
01714     }
01715     else if (IsEqualIID(*pguidCmdGroup, CGID_ShellBrowser))
01716     {
01717         switch (nCmdID)
01718         {
01719             case 40994:
01720                 return NavigateToParent();
01721         }
01722     }
01723     else if (IsEqualIID(*pguidCmdGroup, CGID_IExplorerToolbar))
01724     {
01725         switch (nCmdID)
01726         {
01727             case 0x7063:
01728                 return DoFolderOptions();
01729         }
01730     }
01731     else if (IsEqualIID(*pguidCmdGroup, CGID_DefView))
01732     {
01733         switch (nCmdID)
01734         {
01735             case 1:
01736                 // Reset All Folders option in Folder Options
01737                 break;
01738         }
01739     }
01740     else
01741     {
01742         return E_NOTIMPL;
01743     }
01744     return E_NOTIMPL;
01745 }
01746 
01747 HRESULT STDMETHODCALLTYPE CShellBrowser::GetWindow(HWND *lphwnd)
01748 {
01749     if (lphwnd == NULL)
01750         return E_POINTER;
01751     *lphwnd = m_hWnd;
01752     return S_OK;
01753 }
01754 
01755 HRESULT STDMETHODCALLTYPE CShellBrowser::ContextSensitiveHelp(BOOL fEnterMode)
01756 {
01757     return E_NOTIMPL;
01758 }
01759 
01760 HRESULT STDMETHODCALLTYPE CShellBrowser::InsertMenusSB(HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths)
01761 {
01762     HMENU mainMenu = LoadMenu(_AtlBaseModule.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU));
01763     Shell_MergeMenus(hmenuShared, mainMenu, 0, 0, FCIDM_BROWSERLAST, MM_SUBMENUSHAVEIDS);
01764 
01765     int GCCU(itemCount3) = GetMenuItemCount(hmenuShared);
01766     Unused(itemCount3);
01767 
01768     lpMenuWidths->width[0] = 2;
01769     lpMenuWidths->width[2] = 3;
01770     lpMenuWidths->width[4] = 1;
01771     return S_OK;
01772 }
01773 
01774 HRESULT STDMETHODCALLTYPE CShellBrowser::SetMenuSB(HMENU hmenuShared, HOLEMENU holemenuRes, HWND hwndActiveObject)
01775 {
01776     CComPtr<IShellMenu>                     shellMenu;
01777     HRESULT                                 hResult;
01778 
01779     if (IsMenu(hmenuShared) == FALSE)
01780         return E_FAIL;
01781     hResult = GetMenuBand(IID_IShellMenu, (void **)&shellMenu);
01782     if (FAILED(hResult))
01783         return hResult;
01784     hResult = shellMenu->SetMenu(hmenuShared, NULL, SMSET_DONTOWN);
01785     if (FAILED(hResult))
01786         return hResult;
01787     fCurrentMenuBar = hmenuShared;
01788     return S_OK;
01789 }
01790 
01791 HRESULT STDMETHODCALLTYPE CShellBrowser::RemoveMenusSB(HMENU hmenuShared)
01792 {
01793     if (hmenuShared == fCurrentMenuBar)
01794         fCurrentMenuBar = NULL;
01795     return S_OK;
01796 }
01797 
01798 HRESULT STDMETHODCALLTYPE CShellBrowser::SetStatusTextSB(LPCOLESTR pszStatusText)
01799 {
01800     return E_NOTIMPL;
01801 }
01802 
01803 HRESULT STDMETHODCALLTYPE CShellBrowser::EnableModelessSB(BOOL fEnable)
01804 {
01805     return E_NOTIMPL;
01806 }
01807 
01808 HRESULT STDMETHODCALLTYPE CShellBrowser::TranslateAcceleratorSB(MSG *pmsg, WORD wID)
01809 {
01810     return E_NOTIMPL;
01811 }
01812 
01813 HRESULT STDMETHODCALLTYPE CShellBrowser::BrowseObject(LPCITEMIDLIST pidl, UINT wFlags)
01814 {
01815     return BrowseToPIDL((LPITEMIDLIST)pidl, BTP_UPDATE_CUR_HISTORY | BTP_UPDATE_NEXT_HISTORY);
01816 }
01817 
01818 HRESULT STDMETHODCALLTYPE CShellBrowser::GetViewStateStream(DWORD grfMode, IStream **ppStrm)
01819 {
01820     return E_NOTIMPL;
01821 }
01822 
01823 HRESULT STDMETHODCALLTYPE CShellBrowser::GetControlWindow(UINT id, HWND *lphwnd)
01824 {
01825     if (lphwnd == NULL)
01826         return E_POINTER;
01827     *lphwnd = NULL;
01828     switch(id)
01829     {
01830         case FCW_TOOLBAR:
01831             *lphwnd = fToolbarProxy.m_hWnd;
01832             return S_OK;
01833         case FCW_STATUS:
01834             *lphwnd = fStatusBar;
01835             return S_OK;
01836         case FCW_TREE:
01837             // find the directory browser and return it
01838             // this should be used only to determine if a tree is present
01839             return S_OK;
01840         case FCW_PROGRESS:
01841             // is this a progress dialog?
01842             return S_OK;
01843     }
01844     return S_OK;
01845 }
01846 
01847 HRESULT STDMETHODCALLTYPE CShellBrowser::SendControlMsg(UINT id, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *pret)
01848 {
01849     LPARAM                                  result;
01850 
01851     if (pret != NULL)
01852         *pret = 0;
01853     switch(id)
01854     {
01855         case FCW_TOOLBAR:
01856             result = fToolbarProxy.SendMessage(uMsg, wParam, lParam);
01857             if (pret != NULL)
01858                 *pret = result;
01859             break;
01860         case FCW_STATUS:
01861             result = SendMessage(fStatusBar, uMsg, wParam, lParam);
01862             if (pret != NULL)
01863                 *pret = result;
01864             break;
01865     }
01866     return S_OK;
01867 }
01868 
01869 HRESULT STDMETHODCALLTYPE CShellBrowser::QueryActiveShellView(struct IShellView **ppshv)
01870 {
01871     if (ppshv == NULL)
01872         return E_POINTER;
01873     *ppshv = fCurrentShellView;
01874     if (fCurrentShellView.p != NULL)
01875         fCurrentShellView.p->AddRef();
01876     return S_OK;
01877 }
01878 
01879 HRESULT STDMETHODCALLTYPE CShellBrowser::OnViewWindowActive(struct IShellView *ppshv)
01880 {
01881     return E_NOTIMPL;
01882 }
01883 
01884 HRESULT STDMETHODCALLTYPE CShellBrowser::SetToolbarItems(LPTBBUTTON lpButtons, UINT nButtons, UINT uFlags)
01885 {
01886     return E_NOTIMPL;
01887 }
01888 
01889 HRESULT STDMETHODCALLTYPE CShellBrowser::DragEnter(IDataObject *pDataObj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect)
01890 {
01891     return E_NOTIMPL;
01892 }
01893 
01894 HRESULT STDMETHODCALLTYPE CShellBrowser::DragOver(DWORD grfKeyState, POINTL pt, DWORD *pdwEffect)
01895 {
01896     return E_NOTIMPL;
01897 }
01898 
01899 HRESULT STDMETHODCALLTYPE CShellBrowser::DragLeave()
01900 {
01901     return E_NOTIMPL;
01902 }
01903 
01904 HRESULT STDMETHODCALLTYPE CShellBrowser::Drop(IDataObject *pDataObj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect)
01905 {
01906     return E_NOTIMPL;
01907 }
01908 
01909 HRESULT STDMETHODCALLTYPE CShellBrowser::QueryService(REFGUID guidService, REFIID riid, void **ppvObject)
01910 {
01911     // view does a query for SID_STopLevelBrowser, IID_IShellBrowserService
01912     // the returned interface has a method GetPropertyBag on it
01913     if (IsEqualIID(guidService, SID_STopLevelBrowser))
01914         return this->QueryInterface(riid, ppvObject);
01915     if (IsEqualIID(guidService, SID_SShellBrowser))
01916         return this->QueryInterface(riid, ppvObject);
01917     if (IsEqualIID(guidService, SID_ITargetFrame2))
01918         return this->QueryInterface(riid, ppvObject);
01919     if (IsEqualIID(guidService, SID_IWebBrowserApp))        // without this, the internet toolbar won't reflect notifications
01920         return this->QueryInterface(riid, ppvObject);
01921     if (IsEqualIID(guidService, SID_SProxyBrowser))
01922         return this->QueryInterface(riid, ppvObject);
01923     if (IsEqualIID(guidService, SID_IExplorerToolbar))
01924         return fClientBars[BIInternetToolbar].clientBar->QueryInterface(riid, ppvObject);
01925     return E_NOINTERFACE;
01926 }
01927 
01928 HRESULT STDMETHODCALLTYPE CShellBrowser::GetPropertyBag(long flags, REFIID riid, void **ppvObject)
01929 {
01930     if (ppvObject == NULL)
01931         return E_POINTER;
01932     *ppvObject = NULL;
01933     return E_NOTIMPL;
01934 }
01935 
01936 HRESULT STDMETHODCALLTYPE CShellBrowser::GetTypeInfoCount(UINT *pctinfo)
01937 {
01938     return E_NOTIMPL;
01939 }
01940 
01941 HRESULT STDMETHODCALLTYPE CShellBrowser::GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
01942 {
01943     return E_NOTIMPL;
01944 }
01945 
01946 HRESULT STDMETHODCALLTYPE CShellBrowser::GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
01947 {
01948     return E_NOTIMPL;
01949 }
01950 
01951 HRESULT STDMETHODCALLTYPE CShellBrowser::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
01952 {
01953     return E_NOTIMPL;
01954 }
01955 
01956 HRESULT STDMETHODCALLTYPE CShellBrowser::GetParentSite(IOleInPlaceSite **ppipsite)
01957 {
01958     return E_NOTIMPL;
01959 }
01960 
01961 HRESULT STDMETHODCALLTYPE CShellBrowser::SetTitle(IShellView *psv, LPCWSTR pszName)
01962 {
01963     return E_NOTIMPL;
01964 }
01965 
01966 HRESULT STDMETHODCALLTYPE CShellBrowser::GetTitle(IShellView *psv, LPWSTR pszName, DWORD cchName)
01967 {
01968     return E_NOTIMPL;
01969 }
01970 
01971 HRESULT STDMETHODCALLTYPE CShellBrowser::GetOleObject(IOleObject **ppobjv)
01972 {
01973     return E_NOTIMPL;
01974 }
01975 
01976 HRESULT STDMETHODCALLTYPE CShellBrowser::GetTravelLog(ITravelLog **pptl)
01977 {
01978     HRESULT                                 hResult;
01979 
01980     // called by toolbar when displaying tooltips
01981     if (pptl != NULL)
01982         *pptl = NULL;
01983     if (fTravelLog.p == NULL)
01984     {
01985         hResult = CreateTravelLog(IID_ITravelLog, (void **)&fTravelLog);
01986         if (FAILED(hResult))
01987             return hResult;
01988     }
01989     *pptl = fTravelLog.p;
01990     fTravelLog.p->AddRef();
01991     return S_OK;
01992 }
01993 
01994 HRESULT STDMETHODCALLTYPE CShellBrowser::ShowControlWindow(UINT id, BOOL fShow)
01995 {
01996     return E_NOTIMPL;
01997 }
01998 
01999 HRESULT STDMETHODCALLTYPE CShellBrowser::IsControlWindowShown(UINT id, BOOL *pfShown)
02000 {
02001     return E_NOTIMPL;
02002 }
02003 
02004 HRESULT STDMETHODCALLTYPE CShellBrowser::IEGetDisplayName(LPCITEMIDLIST pidl, LPWSTR pwszName, UINT uFlags)
02005 {
02006     return E_NOTIMPL;
02007 }
02008 
02009 HRESULT STDMETHODCALLTYPE CShellBrowser::IEParseDisplayName(UINT uiCP, LPCWSTR pwszPath, LPCITEMIDLIST *ppidlOut)
02010 {
02011     return E_NOTIMPL;
02012 }
02013 
02014 HRESULT STDMETHODCALLTYPE CShellBrowser::DisplayParseError(HRESULT hres, LPCWSTR pwszPath)
02015 {
02016     return E_NOTIMPL;
02017 }
02018 
02019 HRESULT STDMETHODCALLTYPE CShellBrowser::NavigateToPidl(LPCITEMIDLIST pidl, DWORD grfHLNF)
02020 {
02021     return E_NOTIMPL;
02022 }
02023 
02024 HRESULT STDMETHODCALLTYPE CShellBrowser::SetNavigateState(BNSTATE bnstate)
02025 {
02026     return E_NOTIMPL;
02027 }
02028 
02029 HRESULT STDMETHODCALLTYPE CShellBrowser::GetNavigateState(BNSTATE *pbnstate)
02030 {
02031     return E_NOTIMPL;
02032 }
02033 
02034 HRESULT STDMETHODCALLTYPE CShellBrowser::NotifyRedirect(IShellView *psv, LPCITEMIDLIST pidl, BOOL *pfDidBrowse)
02035 {
02036     return E_NOTIMPL;
02037 }
02038 
02039 HRESULT STDMETHODCALLTYPE CShellBrowser::UpdateWindowList()
02040 {
02041     return E_NOTIMPL;
02042 }
02043 
02044 HRESULT STDMETHODCALLTYPE CShellBrowser::UpdateBackForwardState()
02045 {
02046     return E_NOTIMPL;
02047 }
02048 
02049 HRESULT STDMETHODCALLTYPE CShellBrowser::SetFlags(DWORD dwFlags, DWORD dwFlagMask)
02050 {
02051     return E_NOTIMPL;
02052 }
02053 
02054 HRESULT STDMETHODCALLTYPE CShellBrowser::GetFlags(DWORD *pdwFlags)
02055 {
02056     return E_NOTIMPL;
02057 }
02058 
02059 HRESULT STDMETHODCALLTYPE CShellBrowser::CanNavigateNow()
02060 {
02061     return E_NOTIMPL;
02062 }
02063 
02064 HRESULT STDMETHODCALLTYPE CShellBrowser::GetPidl(LPCITEMIDLIST *ppidl)
02065 {
02066     // called by explorer bar to get current pidl
02067     if (ppidl == NULL)
02068         return E_POINTER;
02069     *ppidl = ILClone(fCurrentDirectoryPIDL);
02070     return S_OK;
02071 }
02072 
02073 HRESULT STDMETHODCALLTYPE CShellBrowser::SetReferrer(LPCITEMIDLIST pidl)
02074 {
02075     return E_NOTIMPL;
02076 }
02077 
02078 DWORD STDMETHODCALLTYPE CShellBrowser::GetBrowserIndex()
02079 {
02080     return -1;
02081 }
02082 
02083 HRESULT STDMETHODCALLTYPE CShellBrowser::GetBrowserByIndex(DWORD dwID, IUnknown **ppunk)
02084 {
02085     return E_NOTIMPL;
02086 }
02087 
02088 HRESULT STDMETHODCALLTYPE CShellBrowser::GetHistoryObject(IOleObject **ppole, IStream **pstm, IBindCtx **ppbc)
02089 {
02090     if (ppole == NULL || pstm == NULL || ppbc == NULL)
02091         return E_INVALIDARG;
02092     *ppole = fHistoryObject;
02093     if (fHistoryObject != NULL)
02094         fHistoryObject->AddRef();
02095     *pstm = fHistoryStream;
02096     if (fHistoryStream != NULL)
02097         fHistoryStream->AddRef();
02098     *ppbc = fHistoryBindContext;
02099     if (fHistoryBindContext != NULL)
02100         fHistoryBindContext->AddRef();
02101     fHistoryObject = NULL;
02102     fHistoryStream = NULL;
02103     fHistoryBindContext = NULL;
02104     if (*ppole == NULL)
02105         return E_FAIL;
02106     return S_OK;
02107 }
02108 
02109 HRESULT STDMETHODCALLTYPE CShellBrowser::SetHistoryObject(IOleObject *pole, BOOL fIsLocalAnchor)
02110 {
02111     return E_NOTIMPL;
02112 }
02113 
02114 HRESULT STDMETHODCALLTYPE CShellBrowser::CacheOLEServer(IOleObject *pole)
02115 {
02116     return E_NOTIMPL;
02117 }
02118 
02119 HRESULT STDMETHODCALLTYPE CShellBrowser::GetSetCodePage(VARIANT *pvarIn, VARIANT *pvarOut)
02120 {
02121     return E_NOTIMPL;
02122 }
02123 
02124 HRESULT STDMETHODCALLTYPE CShellBrowser::OnHttpEquiv(IShellView *psv, BOOL fDone, VARIANT *pvarargIn, VARIANT *pvarargOut)
02125 {
02126     return E_NOTIMPL;
02127 }
02128 
02129 HRESULT STDMETHODCALLTYPE CShellBrowser::GetPalette(HPALETTE *hpal)
02130 {
02131     return E_NOTIMPL;
02132 }
02133 
02134 HRESULT STDMETHODCALLTYPE CShellBrowser::RegisterWindow(BOOL fForceRegister, int swc)
02135 {
02136     return E_NOTIMPL;
02137 }
02138 
02139 LRESULT STDMETHODCALLTYPE CShellBrowser::WndProcBS(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
02140 {
02141     return E_NOTIMPL;
02142 }
02143 
02144 HRESULT STDMETHODCALLTYPE CShellBrowser::SetAsDefFolderSettings()
02145 {
02146     return E_NOTIMPL;
02147 }
02148 
02149 HRESULT STDMETHODCALLTYPE CShellBrowser::GetViewRect(RECT *prc)
02150 {
02151     return E_NOTIMPL;
02152 }
02153 
02154 HRESULT STDMETHODCALLTYPE CShellBrowser::OnSize(WPARAM wParam)
02155 {
02156     return E_NOTIMPL;
02157 }
02158 
02159 HRESULT STDMETHODCALLTYPE CShellBrowser::OnCreate(struct tagCREATESTRUCTW *pcs)
02160 {
02161     return E_NOTIMPL;
02162 }
02163 
02164 LRESULT STDMETHODCALLTYPE CShellBrowser::OnCommand(WPARAM wParam, LPARAM lParam)
02165 {
02166     return 0;
02167 }
02168 
02169 HRESULT STDMETHODCALLTYPE CShellBrowser::OnDestroy()
02170 {
02171     return E_NOTIMPL;
02172 }
02173 
02174 LRESULT STDMETHODCALLTYPE CShellBrowser::OnNotify(struct tagNMHDR *pnm)
02175 {
02176     return 0;
02177 }
02178 
02179 HRESULT STDMETHODCALLTYPE CShellBrowser::OnSetFocus()
02180 {
02181     return E_NOTIMPL;
02182 }
02183 
02184 HRESULT STDMETHODCALLTYPE CShellBrowser::OnFrameWindowActivateBS(BOOL fActive)
02185 {
02186     return E_NOTIMPL;
02187 }
02188 
02189 HRESULT STDMETHODCALLTYPE CShellBrowser::ReleaseShellView()
02190 {
02191     return E_NOTIMPL;
02192 }
02193 
02194 HRESULT STDMETHODCALLTYPE CShellBrowser::ActivatePendingView()
02195 {
02196     return E_NOTIMPL;
02197 }
02198 
02199 HRESULT STDMETHODCALLTYPE CShellBrowser::CreateViewWindow(IShellView *psvNew, IShellView *psvOld, LPRECT prcView, HWND *phwnd)
02200 {
02201     return E_NOTIMPL;
02202 }
02203 
02204 HRESULT STDMETHODCALLTYPE CShellBrowser::CreateBrowserPropSheetExt(REFIID riid, void **ppv)
02205 {
02206     return E_NOTIMPL;
02207 }
02208 
02209 HRESULT STDMETHODCALLTYPE CShellBrowser::GetViewWindow(HWND *phwndView)
02210 {
02211     return E_NOTIMPL;
02212 }
02213 
02214 HRESULT STDMETHODCALLTYPE CShellBrowser::GetBaseBrowserData(LPCBASEBROWSERDATA *pbbd)
02215 {
02216     return E_NOTIMPL;
02217 }
02218 
02219 LPBASEBROWSERDATA STDMETHODCALLTYPE CShellBrowser::PutBaseBrowserData()
02220 {
02221     return NULL;
02222 }
02223 
02224 HRESULT STDMETHODCALLTYPE CShellBrowser::InitializeTravelLog(ITravelLog *ptl, DWORD dw)
02225 {
02226     return E_NOTIMPL;
02227 }
02228 
02229 HRESULT STDMETHODCALLTYPE CShellBrowser::SetTopBrowser()
02230 {
02231     return E_NOTIMPL;
02232 }
02233 
02234 HRESULT STDMETHODCALLTYPE CShellBrowser::Offline(int iCmd)
02235 {
02236     return E_NOTIMPL;
02237 }
02238 
02239 HRESULT STDMETHODCALLTYPE CShellBrowser::AllowViewResize(BOOL f)
02240 {
02241     return E_NOTIMPL;
02242 }
02243 
02244 HRESULT STDMETHODCALLTYPE CShellBrowser::SetActivateState(UINT u)
02245 {
02246     return E_NOTIMPL;
02247 }
02248 
02249 HRESULT STDMETHODCALLTYPE CShellBrowser::UpdateSecureLockIcon(int eSecureLock)
02250 {
02251     return E_NOTIMPL;
02252 }
02253 
02254 HRESULT STDMETHODCALLTYPE CShellBrowser::InitializeDownloadManager()
02255 {
02256     return E_NOTIMPL;
02257 }
02258 
02259 HRESULT STDMETHODCALLTYPE CShellBrowser::InitializeTransitionSite()
02260 {
02261     return E_NOTIMPL;
02262 }
02263 
02264 HRESULT STDMETHODCALLTYPE CShellBrowser::_Initialize(HWND hwnd, IUnknown *pauto)
02265 {
02266     return E_NOTIMPL;
02267 }
02268 
02269 HRESULT STDMETHODCALLTYPE CShellBrowser::_CancelPendingNavigationAsync()
02270 {
02271     return E_NOTIMPL;
02272 }
02273 
02274 HRESULT STDMETHODCALLTYPE CShellBrowser::_CancelPendingView()
02275 {
02276     return E_NOTIMPL;
02277 }
02278 
02279 HRESULT STDMETHODCALLTYPE CShellBrowser::_MaySaveChanges()
02280 {
02281     return E_NOTIMPL;
02282 }
02283 
02284 HRESULT STDMETHODCALLTYPE CShellBrowser::_PauseOrResumeView(BOOL fPaused)
02285 {
02286     return E_NOTIMPL;
02287 }
02288 
02289 HRESULT STDMETHODCALLTYPE CShellBrowser::_DisableModeless()
02290 {
02291     return E_NOTIMPL;
02292 }
02293 
02294 HRESULT STDMETHODCALLTYPE CShellBrowser::_NavigateToPidl(LPCITEMIDLIST pidl, DWORD grfHLNF, DWORD dwFlags)
02295 {
02296     return E_NOTIMPL;
02297 }
02298 
02299 HRESULT STDMETHODCALLTYPE CShellBrowser::_TryShell2Rename(IShellView *psv, LPCITEMIDLIST pidlNew)
02300 {
02301     return E_NOTIMPL;
02302 }
02303 
02304 HRESULT STDMETHODCALLTYPE CShellBrowser::_SwitchActivationNow()
02305 {
02306     return E_NOTIMPL;
02307 }
02308 
02309 HRESULT STDMETHODCALLTYPE CShellBrowser::_ExecChildren(IUnknown *punkBar, BOOL fBroadcast, const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANTARG *pvarargIn, VARIANTARG *pvarargOut)
02310 {
02311     return E_NOTIMPL;
02312 }
02313 
02314 HRESULT STDMETHODCALLTYPE CShellBrowser::_SendChildren(HWND hwndBar, BOOL fBroadcast, UINT uMsg, WPARAM wParam, LPARAM lParam)
02315 {
02316     return E_NOTIMPL;
02317 }
02318 
02319 HRESULT STDMETHODCALLTYPE CShellBrowser::GetFolderSetData(struct tagFolderSetData *pfsd)
02320 {
02321     return E_NOTIMPL;
02322 }
02323 
02324 HRESULT STDMETHODCALLTYPE CShellBrowser::_OnFocusChange(UINT itb)
02325 {
02326     return E_NOTIMPL;
02327 }
02328 
02329 HRESULT STDMETHODCALLTYPE CShellBrowser::v_ShowHideChildWindows(BOOL fChildOnly)
02330 {
02331     return E_NOTIMPL;
02332 }
02333 
02334 UINT STDMETHODCALLTYPE CShellBrowser::_get_itbLastFocus()
02335 {
02336     return 0;
02337 }
02338 
02339 HRESULT STDMETHODCALLTYPE CShellBrowser::_put_itbLastFocus(UINT itbLastFocus)
02340 {
02341     return E_NOTIMPL;
02342 }
02343 
02344 HRESULT STDMETHODCALLTYPE CShellBrowser::_UIActivateView(UINT uState)
02345 {
02346     return E_NOTIMPL;
02347 }
02348 
02349 HRESULT STDMETHODCALLTYPE CShellBrowser::_GetViewBorderRect(RECT *prc)
02350 {
02351     return E_NOTIMPL;
02352 }
02353 
02354 HRESULT STDMETHODCALLTYPE CShellBrowser::_UpdateViewRectSize()
02355 {
02356     return E_NOTIMPL;
02357 }
02358 
02359 HRESULT STDMETHODCALLTYPE CShellBrowser::_ResizeNextBorder(UINT itb)
02360 {
02361     return E_NOTIMPL;
02362 }
02363 
02364 HRESULT STDMETHODCALLTYPE CShellBrowser::_ResizeView()
02365 {
02366     return E_NOTIMPL;
02367 }
02368 
02369 HRESULT STDMETHODCALLTYPE CShellBrowser::_GetEffectiveClientArea(LPRECT lprectBorder, HMONITOR hmon)
02370 {
02371     return E_NOTIMPL;
02372 }
02373 
02374 IStream *STDMETHODCALLTYPE CShellBrowser::v_GetViewStream(LPCITEMIDLIST pidl, DWORD grfMode, LPCWSTR pwszName)
02375 {
02376     return NULL;
02377 }
02378 
02379 LRESULT STDMETHODCALLTYPE CShellBrowser::ForwardViewMsg(UINT uMsg, WPARAM wParam, LPARAM lParam)
02380 {
02381     return 0;
02382 }
02383 
02384 HRESULT STDMETHODCALLTYPE CShellBrowser::SetAcceleratorMenu(HACCEL hacc)
02385 {
02386     return E_NOTIMPL;
02387 }
02388 
02389 int STDMETHODCALLTYPE CShellBrowser::_GetToolbarCount()
02390 {
02391     return 0;
02392 }
02393 
02394 LPTOOLBARITEM STDMETHODCALLTYPE CShellBrowser::_GetToolbarItem(int itb)
02395 {
02396     return NULL;
02397 }
02398 
02399 HRESULT STDMETHODCALLTYPE CShellBrowser::_SaveToolbars(IStream *pstm)
02400 {
02401     return E_NOTIMPL;
02402 }
02403 
02404 HRESULT STDMETHODCALLTYPE CShellBrowser::_LoadToolbars(IStream *pstm)
02405 {
02406     return E_NOTIMPL;
02407 }
02408 
02409 HRESULT STDMETHODCALLTYPE CShellBrowser::_CloseAndReleaseToolbars(BOOL fClose)
02410 {
02411     return E_NOTIMPL;
02412 }
02413 
02414 HRESULT STDMETHODCALLTYPE CShellBrowser::v_MayGetNextToolbarFocus(LPMSG lpMsg, UINT itbNext, int citb, LPTOOLBARITEM *pptbi, HWND *phwnd)
02415 {
02416     return E_NOTIMPL;
02417 }
02418 
02419 HRESULT STDMETHODCALLTYPE CShellBrowser::_ResizeNextBorderHelper(UINT itb, BOOL bUseHmonitor)
02420 {
02421     return E_NOTIMPL;
02422 }
02423 
02424 UINT STDMETHODCALLTYPE CShellBrowser::_FindTBar(IUnknown *punkSrc)
02425 {
02426     return 0;
02427 }
02428 
02429 HRESULT STDMETHODCALLTYPE CShellBrowser::_SetFocus(LPTOOLBARITEM ptbi, HWND hwnd, LPMSG lpMsg)
02430 {
02431     return E_NOTIMPL;
02432 }
02433 
02434 HRESULT STDMETHODCALLTYPE CShellBrowser::v_MayTranslateAccelerator(MSG *pmsg)
02435 {
02436     return E_NOTIMPL;
02437 }
02438 
02439 HRESULT STDMETHODCALLTYPE CShellBrowser::_GetBorderDWHelper(IUnknown *punkSrc, LPRECT lprectBorder, BOOL bUseHmonitor)
02440 {
02441     return E_NOTIMPL;
02442 }
02443 
02444 HRESULT STDMETHODCALLTYPE CShellBrowser::v_CheckZoneCrossing(LPCITEMIDLIST pidl)
02445 {
02446     return E_NOTIMPL;
02447 }
02448 
02449 HRESULT STDMETHODCALLTYPE CShellBrowser::GoBack()
02450 {
02451     CComPtr<ITravelLog>                     travelLog;
02452     HRESULT                                 hResult;
02453 
02454     hResult = GetTravelLog(&travelLog);
02455     if (FAILED (hResult))
02456         return hResult;
02457     return travelLog->Travel((IDropTarget *)this, TLOG_BACK);
02458 }
02459 
02460 HRESULT STDMETHODCALLTYPE CShellBrowser::GoForward()
02461 {
02462     CComPtr<ITravelLog>                     travelLog;
02463     HRESULT                                 hResult;
02464 
02465     hResult = GetTravelLog(&travelLog);
02466     if (FAILED (hResult))
02467         return hResult;
02468     return travelLog->Travel((IDropTarget *)this, TLOG_FORE);
02469 }
02470 
02471 HRESULT STDMETHODCALLTYPE CShellBrowser::GoHome()
02472 {
02473     return E_NOTIMPL;
02474 }
02475 
02476 HRESULT STDMETHODCALLTYPE CShellBrowser::GoSearch()
02477 {
02478     return E_NOTIMPL;
02479 }
02480 
02481 HRESULT STDMETHODCALLTYPE CShellBrowser::Navigate(BSTR URL, VARIANT *Flags, VARIANT *TargetFrameName, VARIANT *PostData, VARIANT *Headers)
02482 {
02483     return E_NOTIMPL;
02484 }
02485 
02486 HRESULT STDMETHODCALLTYPE CShellBrowser::Refresh()
02487 {
02488     VARIANT                                 level;
02489 
02490     V_VT(&level) = VT_I4;
02491     V_I4(&level) = 4;
02492     return Refresh2(&level);
02493 }
02494 
02495 HRESULT STDMETHODCALLTYPE CShellBrowser::Refresh2(VARIANT *Level)
02496 {
02497     CComPtr<IOleCommandTarget>              oleCommandTarget;
02498     HRESULT                                 hResult;
02499 
02500     hResult = fCurrentShellView->QueryInterface(IID_IOleCommandTarget, (void **)&oleCommandTarget);
02501     if (FAILED (hResult))
02502         return hResult;
02503     return oleCommandTarget->Exec(NULL, 22, 1, Level, NULL);
02504 }
02505 
02506 HRESULT STDMETHODCALLTYPE CShellBrowser::Stop()
02507 {
02508     return E_NOTIMPL;
02509 }
02510 
02511 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Application(IDispatch **ppDisp)
02512 {
02513     return E_NOTIMPL;
02514 }
02515 
02516 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Parent(IDispatch **ppDisp)
02517 {
02518     return E_NOTIMPL;
02519 }
02520 
02521 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Container(IDispatch **ppDisp)
02522 {
02523     return E_NOTIMPL;
02524 }
02525 
02526 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Document(IDispatch **ppDisp)
02527 {
02528     return E_NOTIMPL;
02529 }
02530 
02531 HRESULT STDMETHODCALLTYPE CShellBrowser::get_TopLevelContainer(VARIANT_BOOL *pBool)
02532 {
02533     return E_NOTIMPL;
02534 }
02535 
02536 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Type(BSTR *Type)
02537 {
02538     return E_NOTIMPL;
02539 }
02540 #ifdef __WIDL_EXDISP_H
02541 #define long LONG
02542 #endif
02543 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Left(long *pl)
02544 {
02545     return E_NOTIMPL;
02546 }
02547 
02548 HRESULT STDMETHODCALLTYPE CShellBrowser::put_Left(long Left)
02549 {
02550     return E_NOTIMPL;
02551 }
02552 
02553 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Top(long *pl)
02554 {
02555     return E_NOTIMPL;
02556 }
02557 
02558 HRESULT STDMETHODCALLTYPE CShellBrowser::put_Top(long Top)
02559 {
02560     return E_NOTIMPL;
02561 }
02562 
02563 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Width(long *pl)
02564 {
02565     return E_NOTIMPL;
02566 }
02567 
02568 HRESULT STDMETHODCALLTYPE CShellBrowser::put_Width(long Width)
02569 {
02570     return E_NOTIMPL;
02571 }
02572 
02573 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Height(long *pl)
02574 {
02575     return E_NOTIMPL;
02576 }
02577 
02578 HRESULT STDMETHODCALLTYPE CShellBrowser::put_Height(long Height)
02579 {
02580     return E_NOTIMPL;
02581 }
02582 #ifdef __WIDL_EXDISP_H
02583 #undef long
02584 #endif
02585 HRESULT STDMETHODCALLTYPE CShellBrowser::get_LocationName(BSTR *LocationName)
02586 {
02587     return E_NOTIMPL;
02588 }
02589 
02590 HRESULT STDMETHODCALLTYPE CShellBrowser::get_LocationURL(BSTR *LocationURL)
02591 {
02592     return E_NOTIMPL;
02593 }
02594 
02595 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Busy(VARIANT_BOOL *pBool)
02596 {
02597     return E_NOTIMPL;
02598 }
02599 
02600 HRESULT STDMETHODCALLTYPE CShellBrowser::Quit()
02601 {
02602     return E_NOTIMPL;
02603 }
02604 
02605 HRESULT STDMETHODCALLTYPE CShellBrowser::ClientToWindow(int *pcx, int *pcy)
02606 {
02607     return E_NOTIMPL;
02608 }
02609 
02610 HRESULT STDMETHODCALLTYPE CShellBrowser::PutProperty(BSTR Property, VARIANT vtValue)
02611 {
02612     return E_NOTIMPL;
02613 }
02614 
02615 HRESULT STDMETHODCALLTYPE CShellBrowser::GetProperty(BSTR Property, VARIANT *pvtValue)
02616 {
02617     return E_NOTIMPL;
02618 }
02619 
02620 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Name(BSTR *Name)
02621 {
02622     return E_NOTIMPL;
02623 }
02624 
02625 HRESULT STDMETHODCALLTYPE CShellBrowser::get_HWND(SHANDLE_PTR *pHWND)
02626 {
02627     return E_NOTIMPL;
02628 }
02629 
02630 HRESULT STDMETHODCALLTYPE CShellBrowser::get_FullName(BSTR *FullName)
02631 {
02632     return E_NOTIMPL;
02633 }
02634 
02635 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Path(BSTR *Path)
02636 {
02637     return E_NOTIMPL;
02638 }
02639 
02640 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Visible(VARIANT_BOOL *pBool)
02641 {
02642     return E_NOTIMPL;
02643 }
02644 
02645 HRESULT STDMETHODCALLTYPE CShellBrowser::put_Visible(VARIANT_BOOL Value)
02646 {
02647     return E_NOTIMPL;
02648 }
02649 
02650 HRESULT STDMETHODCALLTYPE CShellBrowser::get_StatusBar(VARIANT_BOOL *pBool)
02651 {
02652     return E_NOTIMPL;
02653 }
02654 
02655 HRESULT STDMETHODCALLTYPE CShellBrowser::put_StatusBar(VARIANT_BOOL Value)
02656 {
02657     return E_NOTIMPL;
02658 }
02659 
02660 HRESULT STDMETHODCALLTYPE CShellBrowser::get_StatusText(BSTR *StatusText)
02661 {
02662     return E_NOTIMPL;
02663 }
02664 
02665 HRESULT STDMETHODCALLTYPE CShellBrowser::put_StatusText(BSTR StatusText)
02666 {
02667     return E_NOTIMPL;
02668 }
02669 
02670 HRESULT STDMETHODCALLTYPE CShellBrowser::get_ToolBar(int *Value)
02671 {
02672     return E_NOTIMPL;
02673 }
02674 
02675 HRESULT STDMETHODCALLTYPE CShellBrowser::put_ToolBar(int Value)
02676 {
02677     return E_NOTIMPL;
02678 }
02679 
02680 HRESULT STDMETHODCALLTYPE CShellBrowser::get_MenuBar(VARIANT_BOOL *Value)
02681 {
02682     return E_NOTIMPL;
02683 }
02684 
02685 HRESULT STDMETHODCALLTYPE CShellBrowser::put_MenuBar(VARIANT_BOOL Value)
02686 {
02687     return E_NOTIMPL;
02688 }
02689 
02690 HRESULT STDMETHODCALLTYPE CShellBrowser::get_FullScreen(VARIANT_BOOL *pbFullScreen)
02691 {
02692     return E_NOTIMPL;
02693 }
02694 
02695 HRESULT STDMETHODCALLTYPE CShellBrowser::put_FullScreen(VARIANT_BOOL bFullScreen)
02696 {
02697     return E_NOTIMPL;
02698 }
02699 
02700 HRESULT STDMETHODCALLTYPE CShellBrowser::Navigate2(VARIANT *URL, VARIANT *Flags, VARIANT *TargetFrameName, VARIANT *PostData, VARIANT *Headers)
02701 {
02702     LPITEMIDLIST                            pidl;
02703     HRESULT                                 hResult;
02704 
02705     // called from drive combo box to navigate to a directory
02706     if (V_VT(URL) != (VT_ARRAY | VT_UI1))
02707         return E_INVALIDARG;
02708     if (V_ARRAY(URL)->cDims != 1 || V_ARRAY(URL)->cbElements != 1)
02709         return E_INVALIDARG;
02710     pidl = (LPITEMIDLIST)V_ARRAY(URL)->pvData;
02711     hResult = BrowseToPIDL((LPITEMIDLIST)pidl, BTP_UPDATE_CUR_HISTORY | BTP_UPDATE_NEXT_HISTORY);
02712     if (FAILED (hResult))
02713         return hResult;
02714     return S_OK;
02715 }
02716 
02717 HRESULT STDMETHODCALLTYPE CShellBrowser::QueryStatusWB(OLECMDID cmdID, OLECMDF *pcmdf)
02718 {
02719     return E_NOTIMPL;
02720 }
02721 
02722 HRESULT STDMETHODCALLTYPE CShellBrowser::ExecWB(OLECMDID cmdID, OLECMDEXECOPT cmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
02723 {
02724     return E_NOTIMPL;
02725 }
02726 
02727 HRESULT STDMETHODCALLTYPE CShellBrowser::ShowBrowserBar(VARIANT *pvaClsid, VARIANT *pvarShow, VARIANT *pvarSize)
02728 {
02729     CLSID                                   classID;
02730     bool                                    vertical;
02731 
02732     // called to show search bar
02733     if (V_VT(pvaClsid) != VT_BSTR)
02734         return E_INVALIDARG;
02735     CLSIDFromString(V_BSTR(pvaClsid), &classID);
02736     // TODO: properly compute the value of vertical
02737     vertical = true;
02738     return ShowBand(classID, vertical);
02739 }
02740 
02741 HRESULT STDMETHODCALLTYPE CShellBrowser::get_ReadyState(READYSTATE *plReadyState)
02742 {
02743     return E_NOTIMPL;
02744 }
02745 
02746 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Offline(VARIANT_BOOL *pbOffline)
02747 {
02748     return E_NOTIMPL;
02749 }
02750 
02751 HRESULT STDMETHODCALLTYPE CShellBrowser::put_Offline(VARIANT_BOOL bOffline)
02752 {
02753     return E_NOTIMPL;
02754 }
02755 
02756 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Silent(VARIANT_BOOL *pbSilent)
02757 {
02758     return E_NOTIMPL;
02759 }
02760 
02761 HRESULT STDMETHODCALLTYPE CShellBrowser::put_Silent(VARIANT_BOOL bSilent)
02762 {
02763     return E_NOTIMPL;
02764 }
02765 
02766 HRESULT STDMETHODCALLTYPE CShellBrowser::get_RegisterAsBrowser(VARIANT_BOOL *pbRegister)
02767 {
02768     return E_NOTIMPL;
02769 }
02770 
02771 HRESULT STDMETHODCALLTYPE CShellBrowser::put_RegisterAsBrowser(VARIANT_BOOL bRegister)
02772 {
02773     return E_NOTIMPL;
02774 }
02775 
02776 HRESULT STDMETHODCALLTYPE CShellBrowser::get_RegisterAsDropTarget(VARIANT_BOOL *pbRegister)
02777 {
02778     return E_NOTIMPL;
02779 }
02780 
02781 HRESULT STDMETHODCALLTYPE CShellBrowser::put_RegisterAsDropTarget(VARIANT_BOOL bRegister)
02782 {
02783     return E_NOTIMPL;
02784 }
02785 
02786 HRESULT STDMETHODCALLTYPE CShellBrowser::get_TheaterMode(VARIANT_BOOL *pbRegister)
02787 {
02788     return E_NOTIMPL;
02789 }
02790 
02791 HRESULT STDMETHODCALLTYPE CShellBrowser::put_TheaterMode(VARIANT_BOOL bRegister)
02792 {
02793     return E_NOTIMPL;
02794 }
02795 
02796 HRESULT STDMETHODCALLTYPE CShellBrowser::get_AddressBar(VARIANT_BOOL *Value)
02797 {
02798     return E_NOTIMPL;
02799 }
02800 
02801 HRESULT STDMETHODCALLTYPE CShellBrowser::put_AddressBar(VARIANT_BOOL Value)
02802 {
02803     return E_NOTIMPL;
02804 }
02805 
02806 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Resizable(VARIANT_BOOL *Value)
02807 {
02808     return E_NOTIMPL;
02809 }
02810 
02811 HRESULT STDMETHODCALLTYPE CShellBrowser::put_Resizable(VARIANT_BOOL Value)
02812 {
02813     return E_NOTIMPL;
02814 }
02815 
02816 HRESULT STDMETHODCALLTYPE CShellBrowser::FindWindowByIndex(DWORD dwID, IUnknown **ppunk)
02817 {
02818     return E_NOTIMPL;
02819 }
02820 
02821 HRESULT STDMETHODCALLTYPE CShellBrowser::GetWindowData(LPWINDOWDATA pWinData)
02822 {
02823     if (pWinData == NULL)
02824         return E_POINTER;
02825     
02826     pWinData->dwWindowID = -1;
02827     pWinData->uiCP = 0;
02828     pWinData->pidl = ILClone(fCurrentDirectoryPIDL);
02829     pWinData->lpszUrl = NULL;
02830     pWinData->lpszUrlLocation = NULL;
02831     pWinData->lpszTitle = NULL;
02832     return S_OK;
02833 }
02834 
02835 HRESULT STDMETHODCALLTYPE CShellBrowser::LoadHistoryPosition(LPWSTR pszUrlLocation, DWORD dwPosition)
02836 {
02837     return E_NOTIMPL;
02838 }
02839 
02840 HRESULT STDMETHODCALLTYPE CShellBrowser::GetClassID(CLSID *pClassID)
02841 {
02842     return E_NOTIMPL;
02843 }
02844 
02845 HRESULT STDMETHODCALLTYPE CShellBrowser::LoadHistory(IStream *pStream, IBindCtx *pbc)
02846 {
02847     CComPtr<IPersistHistory>                viewPersistHistory;
02848     CComPtr<IOleObject>                     viewHistoryObject;
02849     persistState                            oldState;
02850     ULONG                                   numRead;
02851     LPITEMIDLIST                            pidl;
02852     HRESULT                                 hResult;
02853 
02854     hResult = pStream->Read(&oldState, sizeof(oldState), &numRead);
02855     if (FAILED(hResult))
02856         return hResult;
02857     if (numRead != sizeof(oldState) || oldState.dwSize != sizeof(oldState))
02858         return E_FAIL;
02859     if (oldState.browseType != 2)
02860         return E_FAIL;
02861     pidl = (LPITEMIDLIST)SHAlloc(oldState.pidlSize);
02862     if (pidl == NULL)
02863         return E_OUTOFMEMORY;
02864     hResult = pStream->Read(pidl, oldState.pidlSize, &numRead);
02865     if (FAILED(hResult))
02866     {
02867         ILFree(pidl);
02868         return hResult;
02869     }
02870     if (numRead != oldState.pidlSize)
02871     {
02872         ILFree(pidl);
02873         return E_FAIL;
02874     }
02875     hResult = CoCreateInstance(oldState.persistClass, NULL, CLSCTX_LOCAL_SERVER | CLSCTX_INPROC_SERVER, IID_IOleObject, (void **)&viewHistoryObject);
02876     fHistoryObject = viewHistoryObject;
02877     fHistoryStream = pStream;
02878     fHistoryBindContext = pbc;
02879     hResult = BrowseToPIDL(pidl, BTP_UPDATE_CUR_HISTORY);
02880     fHistoryObject = NULL;
02881     fHistoryStream = NULL;
02882     fHistoryBindContext = NULL;
02883     ILFree(pidl);
02884     if (FAILED(hResult))
02885         return hResult;
02886     return S_OK;
02887 }
02888 
02889 HRESULT STDMETHODCALLTYPE CShellBrowser::SaveHistory(IStream *pStream)
02890 {
02891     CComPtr<IPersistHistory>                viewPersistHistory;
02892     persistState                            newState;
02893     HRESULT                                 hResult;
02894 
02895     hResult = fCurrentShellView->GetItemObject(SVGIO_BACKGROUND, IID_IPersistHistory, (void **)&viewPersistHistory);
02896     memset(&newState, 0, sizeof(newState));
02897     newState.dwSize = sizeof(newState);
02898     newState.browseType = 2;
02899     newState.browserIndex = GetBrowserIndex();
02900     if (viewPersistHistory.p != NULL)
02901     {
02902         hResult = viewPersistHistory->GetClassID(&newState.persistClass);
02903         if (FAILED(hResult))
02904             return hResult;
02905     }
02906     newState.pidlSize = ILGetSize(fCurrentDirectoryPIDL);
02907     hResult = pStream->Write(&newState, sizeof(newState), NULL);
02908     if (FAILED(hResult))
02909         return hResult;
02910     hResult = pStream->Write(fCurrentDirectoryPIDL, newState.pidlSize, NULL);
02911     if (FAILED(hResult))
02912         return hResult;
02913     if (viewPersistHistory.p != NULL)
02914     {
02915         hResult = viewPersistHistory->SaveHistory(pStream);
02916         if (FAILED(hResult))
02917             return hResult;
02918     }
02919     return S_OK;
02920 }
02921 
02922 HRESULT STDMETHODCALLTYPE CShellBrowser::SetPositionCookie(DWORD dwPositioncookie)
02923 {
02924     return E_NOTIMPL;
02925 }
02926 
02927 HRESULT STDMETHODCALLTYPE CShellBrowser::GetPositionCookie(DWORD *pdwPositioncookie)
02928 {
02929     return E_NOTIMPL;
02930 }
02931 
02932 LRESULT CShellBrowser::OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
02933 {
02934     // TODO: rip down everything
02935     PostQuitMessage(0);
02936     return 0;
02937 }
02938 
02939 LRESULT CShellBrowser::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
02940 {
02941     CComPtr<IDockingWindow>                 dockingWindow;
02942     RECT                                    availableBounds;
02943     static const INT                        excludeItems[] = {1, 1, 1, 0xa001, 0, 0};
02944     int                                     x;
02945     HRESULT                                 hResult;
02946 
02947     if (wParam != SIZE_MINIMIZED)
02948     {
02949         GetEffectiveClientRect(m_hWnd, &availableBounds, (INT *)&excludeItems);
02950         for (x = 0; x < 3; x++)
02951         {
02952             if (fClientBars[x].clientBar != NULL)
02953             {
02954                 hResult = fClientBars[x].clientBar->QueryInterface(IID_IDockingWindow, (void **)&dockingWindow);
02955                 if (SUCCEEDED(hResult) && dockingWindow != NULL)
02956                 {
02957                     hResult = dockingWindow->ResizeBorderDW(&availableBounds, (IDropTarget *)this, TRUE);
02958                     break;
02959                 }
02960             }
02961         }
02962         RepositionBars();
02963     }
02964     return 1;
02965 }
02966 
02967 LRESULT CShellBrowser::OnInitMenuPopup(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
02968 {
02969     HMENU                                   theMenu;
02970 
02971     theMenu = (HMENU)wParam;
02972     if (theMenu == SHGetMenuFromID(fCurrentMenuBar, FCIDM_MENU_VIEW))
02973         UpdateViewMenu(theMenu);
02974     return RelayMsgToShellView(uMsg, wParam, lParam, bHandled);
02975 }
02976 
02977 LRESULT CShellBrowser::RelayMsgToShellView(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
02978 {
02979     if (fCurrentShellViewWindow != NULL)
02980         return SendMessage(fCurrentShellViewWindow, uMsg, wParam, lParam);
02981     return 0;
02982 }
02983 
02984 LRESULT CShellBrowser::OnClose(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
02985 {
02986     return 0;
02987 }
02988 
02989 LRESULT CShellBrowser::OnFolderOptions(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
02990 {
02991     HRESULT                 hResult;
02992 
02993     hResult = DoFolderOptions();
02994     return 0;
02995 }
02996 
02997 LRESULT CShellBrowser::OnMapNetworkDrive(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
02998 {
02999 #ifndef ROS_Headers
03000     WNetConnectionDialog(m_hWnd, RESOURCETYPE_DISK);
03001 #endif
03002     return 0;
03003 }
03004 
03005 LRESULT CShellBrowser::OnDisconnectNetworkDrive(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
03006 {
03007 #ifndef ROS_Headers
03008     WNetDisconnectDialog(m_hWnd, RESOURCETYPE_DISK);
03009 #endif
03010     return 0;
03011 }
03012 
03013 LRESULT CShellBrowser::OnAboutReactOS(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
03014 {
03015     ShellAbout(m_hWnd, _T("ReactOS"), _T(""), NULL);
03016     return 0;
03017 }
03018 
03019 LRESULT CShellBrowser::OnGoBack(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
03020 {
03021     HRESULT                                 hResult;
03022 
03023     hResult = GoBack();
03024     return 0;
03025 }
03026 
03027 LRESULT CShellBrowser::OnGoForward(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
03028 {
03029     HRESULT                                 hResult;
03030 
03031     hResult = GoForward();
03032     return 0;
03033 }
03034 
03035 LRESULT CShellBrowser::OnGoUpLevel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
03036 {
03037     HRESULT                                 hResult;
03038 
03039     hResult = NavigateToParent();
03040     return 0;
03041 }
03042 
03043 LRESULT CShellBrowser::OnGoHome(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
03044 {
03045     HRESULT                                 hResult;
03046 
03047     hResult = GoHome();
03048     return 0;
03049 }
03050 
03051 LRESULT CShellBrowser::OnIsThisLegal(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
03052 {
03053     HRESULT                                 hResult;
03054 
03055     typedef HRESULT (WINAPI *PSHOpenNewFrame)(LPITEMIDLIST pidl, IUnknown *b, long c, long d);
03056     PSHOpenNewFrame Func;
03057     HMODULE hShlwapi;
03058 
03059     hShlwapi = LoadLibrary(TEXT("browseui.dll"));
03060     if (hShlwapi != NULL)
03061         Func = (PSHOpenNewFrame)GetProcAddress(hShlwapi, (LPCSTR)103);
03062     else
03063         Func = NULL;
03064     if (Func != NULL)
03065     {
03066         LPITEMIDLIST                        desktopPIDL;
03067 
03068         hResult = SHGetFolderLocation(NULL, CSIDL_DESKTOP, NULL, 0, &desktopPIDL);
03069         if (SUCCEEDED(hResult))
03070         {
03071             hResult = Func(desktopPIDL, NULL, -1, 1);
03072         }
03073     }
03074     return 0;
03075 }
03076 
03077 LRESULT CShellBrowser::OnToggleStatusBarVisible(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
03078 {
03079     fStatusBarVisible = !fStatusBarVisible;
03080     // TODO: trigger a relayout of contained items
03081     return 0;
03082 }
03083 
03084 LRESULT CShellBrowser::OnToggleToolbarLock(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
03085 {
03086     CComPtr<IOleCommandTarget>              commandTarget;
03087     HRESULT                                 hResult;
03088 
03089     hResult = fClientBars[BIInternetToolbar].clientBar->QueryInterface(IID_IOleCommandTarget, (void **)&commandTarget);
03090     if (FAILED(hResult))
03091         return 0;
03092     hResult = commandTarget->Exec(&CGID_PrivCITCommands, ITID_TOOLBARLOCKED, 0, NULL, NULL);
03093     return 0;
03094 }
03095 
03096 LRESULT CShellBrowser::OnToggleToolbarBandVisible(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
03097 {
03098     CComPtr<IOleCommandTarget>              commandTarget;
03099     HRESULT                                 hResult;
03100 
03101     hResult = fClientBars[BIInternetToolbar].clientBar->QueryInterface(IID_IOleCommandTarget, (void **)&commandTarget);
03102     if (FAILED(hResult))
03103         return 0;
03104     hResult = commandTarget->Exec(&CGID_PrivCITCommands, ITID_TOOLBARBANDSHOWN, 0, NULL, NULL);
03105     return 0;
03106 }
03107 
03108 LRESULT CShellBrowser::OnToggleAddressBandVisible(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
03109 {
03110     CComPtr<IOleCommandTarget>              commandTarget;
03111     HRESULT                                 hResult;
03112 
03113     hResult = fClientBars[BIInternetToolbar].clientBar->QueryInterface(IID_IOleCommandTarget, (void **)&commandTarget);
03114     if (FAILED(hResult))
03115         return 0;
03116     hResult = commandTarget->Exec(&CGID_PrivCITCommands, ITID_ADDRESSBANDSHOWN, 0, NULL, NULL);
03117     return 0;
03118 }
03119 
03120 LRESULT CShellBrowser::OnToggleLinksBandVisible(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
03121 {
03122     CComPtr<IOleCommandTarget>              commandTarget;
03123     HRESULT                                 hResult;
03124 
03125     hResult = fClientBars[BIInternetToolbar].clientBar->QueryInterface(IID_IOleCommandTarget, (void **)&commandTarget);
03126     if (FAILED(hResult))
03127         return 0;
03128     hResult = commandTarget->Exec(&CGID_PrivCITCommands, ITID_LINKSBANDSHOWN, 0, NULL, NULL);
03129     return 0;
03130 }
03131 
03132 LRESULT CShellBrowser::OnToggleTextLabels(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
03133 {
03134     CComPtr<IOleCommandTarget>              commandTarget;
03135     HRESULT                                 hResult;
03136 
03137     hResult = fClientBars[BIInternetToolbar].clientBar->QueryInterface(IID_IOleCommandTarget, (void **)&commandTarget);
03138     if (FAILED(hResult))
03139         return 0;
03140     hResult = commandTarget->Exec(&CGID_PrivCITCommands, ITID_TEXTLABELS, 0, NULL, NULL);
03141     return 0;
03142 }
03143 
03144 LRESULT CShellBrowser::OnToolbarCustomize(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
03145 {
03146     CComPtr<IOleCommandTarget>              commandTarget;
03147     HRESULT                                 hResult;
03148 
03149     hResult = fClientBars[BIInternetToolbar].clientBar->QueryInterface(IID_IOleCommandTarget, (void **)&commandTarget);
03150     if (FAILED(hResult))
03151         return 0;
03152     hResult = commandTarget->Exec(&CGID_PrivCITCommands, ITID_CUSTOMIZEENABLED, 0, NULL, NULL);
03153     return 0;
03154 }
03155 
03156 LRESULT CShellBrowser::OnGoTravel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
03157 {
03158     return 0;
03159 }
03160 
03161 LRESULT CShellBrowser::RelayCommands(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
03162 {
03163     if (HIWORD(wParam) == 0 && LOWORD(wParam) < FCIDM_SHVIEWLAST && fCurrentShellViewWindow != NULL)
03164         return SendMessage(fCurrentShellViewWindow, uMsg, wParam, lParam);
03165     return 0;
03166 }
03167 
03168 //static LRESULT CALLBACK ExplorerWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
03169 //{
03170 //  return DefWindowProc(hwnd, uMsg, wParam, lParam);
03171 //}
03172 
03173 static void ExplorerMessageLoop()
03174 {
03175     MSG Msg;
03176     BOOL Ret;
03177 
03178     while (1)
03179     {
03180         Ret = (GetMessage(&Msg, NULL, 0, 0) != 0);
03181 
03182         if (Ret != -1)
03183         {
03184             if (!Ret)
03185                 break;
03186 
03187             TranslateMessage(&Msg);
03188             DispatchMessage(&Msg);
03189         }
03190     }
03191 }
03192 
03193 DWORD WINAPI BrowserThreadProc(LPVOID lpThreadParameter)
03194 {
03195     CComPtr<IShellBrowser>                  shellBrowser;
03196     CComObject<CShellBrowser>               *theCabinet;
03197     IEThreadParamBlock                      *parameters;
03198     HRESULT                                 hResult;
03199 
03200     parameters = (IEThreadParamBlock *)lpThreadParameter;
03201     OleInitialize(NULL);
03202     ATLTRY (theCabinet = new CComObject<CShellBrowser>);
03203     if (theCabinet == NULL)
03204         return E_OUTOFMEMORY;
03205     hResult = theCabinet->QueryInterface(IID_IShellBrowser, (void **)&shellBrowser);
03206     if (FAILED (hResult))
03207     {
03208         delete theCabinet;
03209         return hResult;
03210     }
03211     hResult = theCabinet->Initialize(parameters->directoryPIDL, 0, 0, 0);
03212     if (FAILED (hResult))
03213         return hResult;
03214     ExplorerMessageLoop();
03215     OleUninitialize();
03216     return 0;
03217 }

Generated on Sun May 27 2012 04:18:35 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.