#ifndef _SHBROWS2_H
#define _SHBROWS2_H

#include "iface.h"
#include "commonsb.h"
#include "browmenu.h"
#include "bsmenu.h"
#include "fldset.h"
#include <iethread.h>

#define MAX_SB_TEXT_LEN 256

class CIEFrameAuto;


// Define structure to be used at head of state stream that is
// not dependent on 16 or 32 bits...
typedef struct _CABSHOLD       // Cabinet Stream header
{
    DWORD   dwSize;       // Offset to where the View streamed additional info

    // First stuff from the window placement
    DWORD  flags;
    DWORD  showCmd;
    POINTL ptMinPosition;
    POINTL ptMaxPosition;
    RECTL  rcNormalPosition;

    // Stuff from Folder Settings;
    DWORD   ViewMode;       // View mode (FOLDERVIEWMODE values)
    DWORD   fFlags;         // View options (FOLDERFLAGS bits)
    DWORD   TreeSplit;      // Position of split in pixels 

    // Hot Key
    DWORD   dwHotkey;        // Hotkey

    WINVIEW wv;
} CABSHOLD;

typedef struct _CABSH       // Cabinet Stream header
{
    DWORD   dwSize;       // Offset to where the View streamed additional info

    // First stuff from the window placement
    DWORD  flags;
    DWORD  showCmd;
    POINTL ptMinPosition;
    POINTL ptMaxPosition;
    RECTL  rcNormalPosition;

    // Stuff from Folder Settings;
    DWORD   ViewMode;       // View mode (FOLDERVIEWMODE values)
    DWORD   fFlags;         // View options (FOLDERFLAGS bits)
    DWORD   TreeSplit;      // Position of split in pixels 

    // Hot Key
    DWORD   dwHotkey;        // Hotkey

    WINVIEW wv;

    DWORD   fMask;          // Flags specifying which fields are valid
    SHELLVIEWID vid;        // extended view id
    DWORD   dwVersionId;    // CABSH_VER below
    DWORD   dwRevCount;     // rev count of default settings when the folder was saved to the stream
} CABSH;

#define CABSHM_VIEWID  0x00000001
#define CABSHM_VERSION 0x00000002
#define CABSHM_REVCOUNT 0x00000004

#define CABSH_VER 1 // change this version whenever we want to change defaults
#define CABSH_WIN95_VER 0 // this was the pre-ie4 version number

class CTheater;

#define CSBSUPERCLASS CCommonBrowser

#define CSHELLBROWSER CShellBrowser2
class CShellBrowser2 :
    public CSBSUPERCLASS
{
public:
    // *** IUnknown methods ***
    virtual STDMETHODIMP_(ULONG) AddRef(void) { return CSBSUPERCLASS::AddRef(); };
    virtual STDMETHODIMP_(ULONG) Release(void) { return CSBSUPERCLASS::Release(); };

    // IShellBrowser (same as IOleInPlaceFrame)
    virtual STDMETHODIMP InsertMenusSB(HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths);
    virtual STDMETHODIMP SetMenuSB(HMENU hmenuShared, HOLEMENU holemenuReserved, HWND hwnd);
    virtual STDMETHODIMP RemoveMenusSB(HMENU hmenuShared);
    virtual STDMETHODIMP EnableModelessSB(BOOL fEnable);
    virtual STDMETHODIMP GetViewStateStream(DWORD grfMode, IStream **ppstm);
    virtual STDMETHODIMP GetControlWindow(UINT id, HWND * lphwnd);
    virtual STDMETHODIMP SendControlMsg(UINT id, UINT uMsg, WPARAM wParam,
                                        LPARAM lParam, LRESULT *pret);
    virtual STDMETHODIMP SetToolbarItems(LPTBBUTTON lpButtons, UINT nButtons, UINT uFlags);
    virtual STDMETHODIMP BrowseObject(LPCITEMIDLIST pidl, UINT wFlags);
    virtual STDMETHODIMP OnViewWindowActive(IShellView * psv);

    // IServiceProvider
    virtual STDMETHODIMP QueryService(REFGUID guidService, REFIID riid, void ** ppvObj);

    // IOleCommandTarget
    virtual STDMETHODIMP QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD rgCmds[], OLECMDTEXT *pcmdtext);
    virtual STDMETHODIMP Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANTARG *pvarargIn, VARIANTARG *pvarargOut);

    // IBrowserService
    virtual STDMETHODIMP ShowControlWindow(UINT id, BOOL fShow);
    virtual STDMETHODIMP IsControlWindowShown(UINT id, BOOL *pfShown);
    virtual STDMETHODIMP SetTitle(IShellView* psv, LPCWSTR pszName);
    virtual STDMETHODIMP UpdateWindowList(void);
    virtual STDMETHODIMP SetFlags(DWORD dwFlags, DWORD dwFlagMask);
    virtual STDMETHODIMP GetFlags(DWORD *pdwFlags);
    virtual STDMETHODIMP RegisterWindow(BOOL fUnregister, int swc);
    virtual STDMETHODIMP Offline(int iCmd);
    virtual STDMETHODIMP SetReferrer ( LPITEMIDLIST pidl) ;
    virtual STDMETHODIMP_(LRESULT) WndProcBS(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
    virtual STDMETHODIMP OnCreate(LPCREATESTRUCT pcs);
    virtual STDMETHODIMP_(LRESULT) OnCommand(WPARAM wParam, LPARAM lParam);
    virtual STDMETHODIMP OnDestroy();
    virtual STDMETHODIMP_(LRESULT) OnNotify(NMHDR * pnm);
    virtual STDMETHODIMP OnSetFocus();
    virtual STDMETHODIMP ReleaseShellView();
    virtual STDMETHODIMP ActivatePendingView();
    virtual STDMETHODIMP CreateViewWindow(IShellView* psvNew, IShellView* psvOld, LPRECT prcView, HWND* phwnd);
    virtual STDMETHODIMP UpdateBackForwardState () ;
    virtual STDMETHODIMP CreateBrowserPropSheetExt(REFIID, LPVOID *);
    virtual STDMETHODIMP SetAsDefFolderSettings();

    virtual STDMETHODIMP _TryShell2Rename( IShellView* psv, LPCITEMIDLIST pidlNew);
    virtual STDMETHODIMP _NavigateToPidl( LPCITEMIDLIST pidl, DWORD grfHLNF, DWORD dwFlags);
    virtual STDMETHODIMP v_MayTranslateAccelerator( MSG* pmsg);
    virtual STDMETHODIMP _SwitchActivationNow( );
    virtual STDMETHODIMP _Initialize(HWND hwnd, IUnknown *pauto);
    virtual STDMETHODIMP _GetEffectiveClientArea(LPRECT lprectBorder, HMONITOR hmon);

    virtual STDMETHODIMP_(LPSTREAM) v_GetViewStream(LPCITEMIDLIST pidl, DWORD grfMode, LPCWSTR pwszName); 
    
    // IDockingWindowSite
    virtual STDMETHODIMP SetBorderSpaceDW(IUnknown* punkSrc, LPCBORDERWIDTHS pborderwidths);

    // IInputSite
    virtual STDMETHODIMP OnFocusChangeIS(IUnknown* punkSrc, BOOL fSetFocus);
    virtual STDMETHODIMP ShowToolbar(IUnknown* punkSrc, BOOL fShow);

        //IShellBrowserService
    virtual STDMETHODIMP GetPropertyBag(DWORD dwFlags, REFIID riid, void** ppv);


    BOOL IsCShellBrowser2() { return !_fSubclassed; };

protected:
    CShellBrowser2();
    virtual ~CShellBrowser2();

    friend HRESULT CShellBrowser2_CreateInstance(HWND hwnd, void ** ppsb);

    // topmost CBaseBrowser2 in a frameset (IE3/AOL/CIS/VB)
    virtual STDMETHODIMP v_CheckZoneCrossing(LPCITEMIDLIST pidl){return _CheckZoneCrossing(pidl);};
    virtual HRESULT     _CheckZoneCrossing(LPCITEMIDLIST pidl);

    // CShellBrowser2 virtuals
    virtual LRESULT     v_ForwardMenuMsg(UINT uMsg, WPARAM wParam, LPARAM lParam);
    virtual DWORD       v_ShowControl(UINT iControl, int iCmd);
    virtual STDMETHODIMP        v_ShowHideChildWindows(BOOL fChildOnly = FALSE);
    virtual void        v_InitMembers();
    virtual void        v_SetIcon();
    virtual void        v_GetAppTitleTemplate(LPTSTR pszBuffer, LPTSTR pszTitle);
    virtual LRESULT     v_OnInitMenuPopup(HMENU hmenuPopup, int nIndex, BOOL fSystemMenu);
    virtual void        v_HandleFileSysChange(LONG lEvent, LPITEMIDLIST pidl1, LPITEMIDLIST pidl2);
    virtual DWORD       v_RestartFlags();
    virtual void        v_FillCabStateHeader(CABSH* pcabsh, FOLDERSETTINGS *pfs);
    virtual void        v_ParentFolder();
    virtual BOOL        v_OnContextMenu(WPARAM wParam, LPARAM lParam);
    virtual BOOL        v_IsIEModeBrowser();    
    virtual BOOL        _CreateToolbar();
    virtual STDMETHODIMP _PositionViewWindow(HWND hwnd, LPRECT prc);
    virtual IStream *   _GetITBarStream(BOOL fWebBrowser, DWORD grfMode);

    //ViewStateStream related
    virtual void        v_GetDefaultSettings(IETHREADPARAM *pcv);

    void         _FillIEThreadParam(LPCITEMIDLIST pidl, IETHREADPARAM *piei);
    virtual void _UpdateFolderSettings(LPCITEMIDLIST pidl);

    BOOL        _ShouldAllowNavigateParent();
    BOOL        _ShouldSaveWindowPlacement();
    HRESULT     _GetBSForBar(LPCWSTR pwszItem, IBandSite **ppbs);
    void        _UpdateBackForwardStateNow();
    void        _ExecAllBands(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANTARG *pvarargIn, VARIANTARG *pvarargOut);
    void        _HideToolbar(IUnknown *punk);
    void        _BandClosed(IUnknown *punk, DWORD dwBandID);
    void        _ShowHideProgress();
    void        _CloseAllParents();
    void        _OnConfirmedClose();
    void        _OnClose(BOOL fPushed);
    void        _AfterWindowCreated(IETHREADPARAM *piei);
    BOOL        _ValidTargetPidl(LPCITEMIDLIST pidl, BOOL *pfTranslateRoot);
    LPITEMIDLIST _TranslateRoot(LPCITEMIDLIST pidl);
    BOOL        _GetVID(SHELLVIEWID *pvid);
    void         _UpdateRegFlags();

    void        _SaveState();
    void        _PropertyBagSaveState();
    void        _OldSaveState();
    HRESULT     _FillCabinetStateHeader(IStream *pstm, CABSH *cabsh);
    BOOL        _ReadSettingsFromStream(IStream *pstm, IETHREADPARAM *piei);
    BOOL        _ReadSettingsFromPropertyBag(IPropertyBag* ppb, IETHREADPARAM *piei);
    BOOL        _FillIEThreadParamFromCabsh(CABSH* pcabsh, IETHREADPARAM *piei);
    HRESULT     _CreateFakeNilPidl(LPITEMIDLIST *ppidl);
    BOOL        _IsPageInternet(LPCITEMIDLIST pidl);
    HRESULT     _GetPropertyBag(LPCITEMIDLIST pidl, DWORD dwFlags, REFIID riid, void** ppv);
    LPCITEMIDLIST _GetPidl();
    BOOL        _DoesPidlRoam(LPCITEMIDLIST pidl);
    void        _LoadBrowserWindowSettings(IETHREADPARAM *piei, LPCITEMIDLIST pidl);
    IDockingWindow* _GetITBar() { return _GetToolbarItem(ITB_ITBAR)->ptbar; }
    HMENU       _GetMenuFromID(UINT uID);
    void        _UpdateChildWindowSize(void);
    void        _GetAppTitle(LPTSTR pszBuffer, DWORD dwSize);
    IMenuBand*  _GetMenuBand(BOOL bDestroy);
    BOOL        _TranslateMenuMessage(HWND hwnd, UINT uMsg, WPARAM * pwParam, LPARAM * plParam, LRESULT * plRet);
    void        _ReloadTitle();
    void        _ReloadStatusbarIcon();

    BOOL        _OnTimer(UINT_PTR idTimer);
    LRESULT     _ToolbarOnNotify(LPNMHDR pnm);
    LRESULT     _OnInitMenuPopup(HMENU hmenuPopup, int nIndex, BOOL fSystemMenu);
    BOOL        _OnSysMenuClick(BOOL bLeftButton, WPARAM wParam, LPARAM lParam);
    LRESULT     _OnMenuSelect(WPARAM wParam, LPARAM lParam, UINT uHelpFlags);
    void        _SetMenuHelp(HMENU hmenu, UINT wID, LPCTSTR pszHelp);
    void        _SetBrowserBarMenuHelp(HMENU hmenu, UINT wID);
    void        _SetExternalBandMenuHelp(HMENU hmenu, UINT wID);
    void        _PruneMailNewsItems(HMENU hmenu);
    void        _SetTitle( LPCWSTR pwszName);
    HRESULT     _CreateFrameServices(void);

    void        _FavoriteOnCommand(HMENU hmenu, UINT idCmd);

    void        _CommonHandleFileSysChange(LONG lEvent, LPITEMIDLIST pidl1, LPITEMIDLIST pidl2);
    void        _FSChangeCheckClose(LPCITEMIDLIST pidl, BOOL fDisconnect);
    void        _OnFSNotify(WPARAM, LPARAM);
//    replaced by CBaseBrowser2::NavigateToTLItem()
//    void        _RecentOnCommand(UINT idCmd);
    LRESULT     _FwdTBNotify(LPTBNOTIFY ptbn);
    void        _ToolTipFromCmd(LPTOOLTIPTEXT pnm);
    void        _AddFolderOptionsPage(PROPSHEETHEADER *ppsh);
    void        _AddAdvancedOptionsPage(PROPSHEETHEADER *ppsh);
    
    void        _IncrNetSessionCount();
    void        _DecrNetSessionCount();

    friend LRESULT CALLBACK IEFrameWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
    friend void CALLBACK BrowserThreadProc(IETHREADPARAM* piei);
    
    void        _ExecFileContext(UINT idCmd);
    void        _EnableFileContext(HMENU hmenuPopup);
    LPITEMIDLIST _GetSubscriptionPidl();
    HRESULT     _GetBrowserBar(int idBar, BOOL fShow, IBandSite** ppbs, const CLSID* pclsid);

    BANDCLASSINFO* _BandClassInfoFromCmdID(UINT idCmd);

    void        _AddBrowserBarMenuItems(HMENU hmenu);
    HMENU       _GetBrowserBarMenu();
    int         _IdBarFromCmdID(UINT idCmd);
    int         _eOnOffNotMunge(int eOnOffNot, UINT idCmd, UINT idBar);
    void        _SetBrowserBarState(UINT idCmd, const CLSID *pclsid, int eOnOffNot, LPCITEMIDLIST pidl = NULL);
    const CLSID * _ShowHideBrowserBar(int idBar, const CLSID *pclsid, int eOnOff, LPCITEMIDLIST pidl);
    HRESULT     _GetBandSite(int idBar, IBandSite** ppbsSite, const CLSID *pclsid, int eOnOff);
    HRESULT     _EnsureAndNavigateBand(IBandSite* pbsSite, const CLSID* pclsid, LPCITEMIDLIST pidl = NULL);
    const CLSID * _InfoShowClsid(int idBar, const CLSID *pclsid, int eOnOff, LPCITEMIDLIST pidl = NULL);
    const CLSID * _InfoIdmToCLSID(UINT idCmd);
    const CATID * _InfoIdmToCATID(UINT idCmd);
    UINT        _InfoCLSIDToIdm(const CLSID *pguid);
    BOOL        _IsSameToolbar(LPWSTR wszBarName, IUnknown *punkBar);
    HRESULT     _AddInfoBands(IBandSite *punkBandSite);
    HRESULT     _AddSearchBand(IBandSite *punkBandSite);
    HRESULT     DoCopyData(COPYDATASTRUCT *pCDS);
    HRESULT     DoRemoteNavigate();
    void        _OrganizeFavorites();    
    BOOL        _ShouldForwardMenu(UINT uMsg, WPARAM wParam, LPARAM lParam);
    void        _TheaterMode(BOOL fShow, BOOL fRestorePrevious);
#ifdef DEBUG
    void        _DumpMenus(LPCTSTR pszMsg, BOOL bMsg);
#endif
    BOOL        _LoadBrowserHelperObjects(void);

    void        _CreateBrowserBarClose(HWND hwndParent);
    void        _SetTheaterBrowserBar();
    void        _SetMenu(HMENU hmenu);
    HWND        _GetCaptionWindow();
    LRESULT     _ThunkTTNotify(LPTOOLTIPTEXTA pnmTTTA);
    BOOL        _PrepareInternetToolbar(IETHREADPARAM* piei);
    HRESULT     _SaveITbarLayout(void);
    static LRESULT CALLBACK DummyTBWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
    DWORD       _GetTempZone();
    void        _UpdateZonesPane(VARIANT *pvar);
    void        _DisplayFavoriteStatus(LPCITEMIDLIST pidl);
    void        _SendCurrentPage(DWORD dwSendAs);
    void        _OnActivate(UINT uMsg, WPARAM wParam, LPARAM lParam); 
    HRESULT     _FreshenComponentCategoriesCache( BOOL bForceUpdate ) ;
    void        _QueryHKCRChanged() ;    

    void        _PruneGoSubmenu(HMENU hmenu);
    HMENU       _MenuTemplate(int id, BOOL fShell);

    void        _MungeGoMyComputer(HMENU hmenuPopup);
    void        _OnGoMenuPopup(HMENU hmenuPopup);
    void        _OnViewMenuPopup(HMENU hmenuPopup);
    void        _OnToolsMenuPopup(HMENU hmenuPopup);
    void        _OnFileMenuPopup(HMENU hmenuPopup);
    void        _OnSearchMenuPopup(HMENU hmenuPopup);
    void        _OnHelpMenuPopup(HMENU hmenuPopup);
    void        _OnMailMenuPopup(HMENU hmenuPopup);
    void        _OnEditMenuPopup(HMENU hmenuPopup);
    void        _OnFindMenuPopup(HMENU hmenuPopup);
    void        _OnExplorerBarMenuPopup(HMENU hmenuPopup);
    void        _InsertTravelLogItems(HMENU hmenu, int nPos);

    // methods and members for monitoring the current status bar code page and font
    HRESULT _GetCodePage(UINT * puiCodePage, DWORD dwCharSet);

    int         _GetIconIndex(void);
    HRESULT     _QIExplorerBand(REFIID riid, void ** ppvObj);
    virtual BOOL _CanHandleAcceleratorNow(void) {return _fActivated;}

    bool        _IsExplorerBandVisible (void);

#ifdef UNIX
    BOOL        _HandleActivation( WPARAM wParam );
#endif

    void        _GetDefaultWindowPlacement(HWND hwnd, HMONITOR hmon, WINDOWPLACEMENT* pwp);

    // NT5 specific message handling:
    BOOL        _OnAppCommand(WPARAM wParam, LPARAM lParam);
    LPARAM      _WndProcBSNT5(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
    

    // Menus: see dochost.h for an explanation from the dochost perspective.
    //        REARCHITECT (scotth): difference b/t _hmenuTemplate and _hmenuFull?
    //        

    HMENU       _hmenuTemplate;
    HMENU       _hmenuFull;
    HMENU       _hmenuBrowser;          // Provided from dochost, used for _menulist
    HMENU       _hmenuCur;              // Used to keep track.  Needed when in Kiosk mode...
    HMENU       _hmenuPreMerged;
#ifdef DEBUG    
    HMENU       _hmenuHelp;             // Our help menu
#endif

    HICON       _hZoneIcon;
    HANDLE      _hEventComCat;

    CMenuList   _menulist;              // Menu list for dispatching

    IContextMenu2 *_pcmNsc;             // iff we've popped up File Menu w/ NSC context item
    IOleCommandTarget *_poctNsc;       // iff we have visible name space control band
    int         _idMenuBand;
    HWND        _hwndStatus;
    HWND        _hwndProgress;
    int         _iTBOffset[3];
    
    CBandSiteMenu *_pbsmInfo;
    UINT        _idmInfo;               // selected View.BrowserBar submenu

    IMenuBand* _pmb;                   // Use _GetMenuBand to access this

    LPITEMIDLIST _pidlReferrer;

    WINDOWPLACEMENT _wndpl;             // Used to go into and out of full screen mode.
    CLSID           _clsidThis;         // browser class ID
    
    BITBOOL     _fStatusBar : 1;
    BITBOOL     _fAutomation : 1;       // was it launched from automation?
    BITBOOL     _fShowMenu : 1;         // should we show menus?
    BITBOOL     _fForwardMenu : 1;      // should we be forwarding menu messages?
    BITBOOL     _fNoLocalFileWarning: 1; // Do we directly execute local files without warning?
    BITBOOL     _fDispatchMenuMsgs:1;   // TRUE: forward menu messages as appropriate
    BITBOOL     _fUISetByAutomation: 1; // has ui (things that go in view options) been set by automation?
    BITBOOL     _fDontSaveViewOptions:1;   // Set if we should not save the view options on exit
    BITBOOL     _fSBWSaved :1;          // single browser window saved yet?
    BITBOOL     _fInternetStart :1;     // did we start on a net site?
    BITBOOL     _fWin95ViewState:1;
    BITBOOL     _fSubclassed :1;        // are we subclassed?
    BITBOOL     _fVisitedNet :1;        // did we ever hit the net in this session?
    BITBOOL     _fUnicode :1;           // is our view window unicode?
    BITBOOL     _fKioskMode : 1;        // Are we in full screen kiosk mode?  (not the same as fullscreen/theater mode)
    BITBOOL     _fTitleSet :1;          // has our content changed our title?
    BITBOOL     _fMarshalledDispatch:1; // have we marshalled dispatch?
    BITBOOL     _fMinimized :1;         // Minimized or not. 
    BITBOOL     _fReceivedDestroy: 1;   // Received WM_DESTROY message
    BITBOOL     _fDisallowSizing: 1;
    BITBOOL     _fShowNetworkButtons:1; // Based off the registry, we display the network connect button 
    BITBOOL     _fIgnoreNextMenuDeselect:1; // TRUE: Ignore the next deselection WM_MENUSELECT (hack)
    
    BITBOOL     _fActivated:1; // TRUE: the frame is set active, FALSE: the frame is inactive
    BITBOOL     _fClosingWindow:1; // TRUE: while closing, to avoid double-save and fault

    BITBOOL     _fDidRegisterWindow:1;  // called RegisterWindow() which registers the window with the winlist
#ifdef UNIX
    BITBOOL     _fSetAddressBarFocus:1;   
#endif
#ifdef NO_MARSHALLING
    BITBOOL     _fDelayedClose:1;  // Used to mark windows for delay close.
    BITBOOL     _fOnIEThread:1;    // used to flag if we are not running on the main thread
#endif
    BITBOOL     _fUpdateBackForwardPosted:1; // have we posted to update the back/forward state?
    BITBOOL     _fValidComCatCache ;         // Have we ensured that the component cache is valid

    BITBOOL     _fShowFortezza : 1;          // status of the Fortezza menu
    BITBOOL     _fRunningInIexploreExe:1;    // are we running in iexplore.exe
    BITBOOL     _fShowSynchronize : 1;       // should we show Tools|Synchronize?
    BITBOOL     _fNilViewStream : 1;         // CabView settings were loaded for unknown pidl.

    BITBOOL     _fAppendIEToCaptionBar : 1;  // Does the NSE want Append " - IE" to the captionbar display name?  See IBrowserFrameOptions
    BITBOOL     _fAddDialUpRef : 1;          // Does the NSE want a ref on the modem connection while browsed to this folder?  See IBrowserFrameOptions
    BITBOOL     _fUseIEToolbar : 1;          // Does the NSE want to use the IE style toolbar?  See IBrowserFrameOptions
    BITBOOL     _fEnableOfflineFeature : 1;  // Does the NSE want to enable the IE Offline feature?  See IBrowserFrameOptions
    BITBOOL     _fUseIEPersistence : 1;      // Does the NSE want to use IE type persistence?  Window pos, size, icon layout. See IBrowserFrameOptions
    BITBOOL     _fInRefresh : 1;             // Ignore refresh messages (FCIDM_REFRESH) if we are currently processing a refresh. (Prevents recursion death)

    UINT        _idmComm;               // selected View.BrowserBar submenu
    UINT        _iCommOffset;           // Start position in dynamically loaded comp categories

    ULONG _uFSNotify;

    int     _iSynchronizePos;
    TCHAR   *_pszSynchronizeText;       // What is Tools|Synchronize in your language?

    // Window list related (also _fMarshalledDispatch above)
    IShellWindows*   _psw;
    int         _swcRegistered;         // the SWC_* that this window is in the winlist as
    
    // Item ContextMenu 
    IContextMenu3 * _pcm;
    long  _dwRegisterWinList;  // Have we registered with the windows list

    HWND            _hwndDummyTB;
    IExplorerToolbar* _pxtb;
    int             _nTBTextRows; 

    // For the two members below, see notes above CShellBrowser2::_SwitchActivationNow
    TBBUTTON *  _lpButtons;
    int         _nButtons;

    TBBUTTON *  _lpPendingButtons;
    int         _nButtonsPending;

    IContextMenu3*   _pcmSearch;// new style
    IContextMenu*    _pcmFind;  // old style find context menu
        
    CTheater *_ptheater;

    LPITEMIDLIST    _pidlLastHist;
    LPITEMIDLIST    _pidlMenuSelect;

    UINT            _uiZonePane;
    IInternetSecurityManager * _pism;
    HMENU                      _hfm;

    DWORD       _dwRevCount;     // rev count of the global window settings
    UINT  _nMBIgnoreNextDeselect;
    IUnknown *_punkMsgLoop;

#ifdef NO_MARSHALLING
    BOOL  _fReallyClosed;
#endif

    // _PositionViewWindow
    HWND _hwndDelayedSize;
    RECT _rcDelayedSize;
    BOOL _fHaveDelayedSize;

private:
    HRESULT _SetBrowserFrameOptions(LPCITEMIDLIST pidl);
    HRESULT _ReplaceCmdLine(LPTSTR pszCmdLine, DWORD cchSize);
};

BOOL FindBrowserWindow(void);

//
// Useful functions.
//

STDAPI_(BOOL) AddToRestartList(UINT flags, LPCITEMIDLIST pidl);
STDAPI_(BOOL) OpenFolderWindow(IETHREADPARAM* pieiIn);
HMENU _MenuTemplate(int id, BOOL bNukeTools);

#define INFOBAR_TBNAME  L"BrowserBar"
#ifndef UNIX
#define INFOBAR_WIDTH   204
#else
#define INFOBAR_WIDTH   277
#endif
#define COMMBAR_TBNAME  L"CommBar"
#define COMMBAR_HEIGHT  100

// Constants for different Browser/Info BARs
#define IDBAR_INFO         1
#define IDBAR_COMM         2
#define IDBAR_VERTICAL     IDBAR_INFO
#define IDBAR_HORIZONTAL   IDBAR_COMM
#define IDBAR_INVALID      42

#endif  // _SHBROWS2_H
