#ifndef _THEATER_H
#define _THEATER_H

// Metrics for this view mode
#define THEATER_CYTOOLBAR       26
#define CLOSEMIN_HEIGHT         16
#define CLOSEMIN_YOFFSET        1
#define CLOSEMIN_XOFFSET        1
#define CLOSEMIN_WIDTH          54
#define PROGRESS_WIDTH          (CLOSEMIN_WIDTH + 2)
#define PROGRESS_HEIGHT         6
#define PROGRESS_YPOS           (CLOSEMIN_HEIGHT + (2 * CLOSEMIN_YOFFSET) + 1)
#define BRAND_YOFFSET           0
#define BRAND_WIDTH             34
#define BRAND_HEIGHT            26
#define CX_HIT                  (GetSystemMetrics(SM_CXEDGE) * 3)
#define CX_BROWOVERLAP          (GetSystemMetrics(SM_CXEDGE) / 2)
#define CX_FLOATERSHOWN         (BRAND_WIDTH + CLOSEMIN_WIDTH + (2 * CLOSEMIN_XOFFSET))

#define SHORT_DELAY             90
#define LONG_DELAY              (4 * SHORT_DELAY)

// Theatre mode controls
#define TMC_PROGRESSBAR     1
#define TMC_BRANDBAND       2
#define TMC_STATUSBAR       3

#define TM_STATUS_PANES                2
#define TM_STATUS_PANE_NAVIGATION      0
#define TM_STATUS_PANE_SSL             1

class CShellBrowser2;

class CTheater:
   public IOleWindow, 
   public IOleCommandTarget, 
   public IServiceProvider
{
    
public:
    HWND GetMasterWindow() {return _hwndBrowser;};
    void Begin();
    CTheater(HWND hwnd, HWND hwndToolbar, IUnknown *punkOwner);
    ~CTheater();
    
    
    // *** IUnknown ***
    virtual STDMETHODIMP QueryInterface(REFIID riid, void **ppvObj);
    virtual STDMETHODIMP_(ULONG) AddRef(void);
    virtual STDMETHODIMP_(ULONG) Release(void);

    // *** IOleWindow methods ***
    virtual STDMETHODIMP GetWindow(HWND * lphwnd);
    virtual STDMETHODIMP ContextSensitiveHelp(BOOL fEnterMode) { return E_NOTIMPL; }
    
    // 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);
    
    // *** IServiceProvider methods ***
    virtual STDMETHODIMP QueryService(REFGUID guidService, REFIID riid, void **ppvObj);

    HRESULT SetBrowserBar(IUnknown* punk, int cxHidden, int cxExpanded);
    void GetPreviousWindowPlacement(WINDOWPLACEMENT* pwp, LPRECT prc)  { *pwp = _wp; *prc = _rcOld;};
    void SetAutoHideToolbar(long val) { _fAutoHideToolbar = val; };            
    void RecalcSizing();

protected:
    friend class CShellBrowser2;
    // save data
    // we put the save state data in here so that the browser doesn't have to waste memory with this data when not in theater mode
    // also, because it's transient, don't use bitfields.  save code instead of memory for transient stuff
    
private:
    int _cyLast;
    HWND _hwndToolbar; // this is the toolbar window that we want to make sure the hidden window encompasses
    HWND _hwndBrowser; // this is the hwnd that we slide down
    HWND _hwndTaskbar;
    BOOL _fShown;
    BOOL _fTaskbarShown;
    BOOL _fDelay;
    BOOL _fAutoHideToolbar;
    BOOL _fInitialBrowserBar;
    BOOL _fAutoHideBrowserBar;    

    HHOOK   _hhook;
    IUnknown *_punkOwner;
    IUnknown *_punkBrowBar;
    HWND _hwndBrowBar;
    WINDOWPLACEMENT _wp;
    RECT _rcOld;
    
    UINT _cRef;
    
    IDeskBand* _pdbBrand;
    HWND _hwndClose;
    HWND _hwndFloater;      // the Floating pallete window
    HWND _hwndProgress;     // used in CShellBrowser(2) - maybe move to interface
    int _cActiveRef;        // the ref count for activating the Floatering palette

    static CAssociationList _al; // associate threadid with CTheater objects
    
    void _SwapParents(HWND hwndOld, HWND hwndNew);
    void _Initialize();
    void _SizeBrowser();
    void _SizeFloater();
    void _CreateCloseMinimize();
    void _PositionCloseRestore();
    void _DelayHideFloater();

    void _DelayHideToolbar();
    void _HideToolbar();
    void _ShowToolbar();
    void _ContinueHideToolbar();
    LRESULT _OnMsgHook(int nCode, WPARAM wParam, MOUSEHOOKSTRUCT *pmhs, BOOL fFake);

    BOOL _IsBrowserActive();
    
    void _ShowTaskbar();
    void _HideTaskbar();

    void _Unhide(int iWhich, UINT uDelay);
    int _iUnhidee;

    BOOL _PtNearWindow(POINT pt, HWND hwnd);
    BOOL _PtOnEdge(POINT pt, int iEdge);
    BOOL _GetWindowRectRel(HWND hWnd, LPRECT lpRect);

    BOOL_PTR _HasBegun() { return (BOOL_PTR)_hhook; }
    
    BOOL _fBrowBarShown;
    int _cxBrowBarShown;
    int _cxBrowBarHidden;
    void _ContinueHideBrowBar();
    void _HideBrowBar();
    void _ShowBrowBar();

    BOOL _CanHideWindow(HWND hwnd);

    BOOL _fFloaterShown;
    COLORREF _clrBrandBk;
    void _ContinueHideFloater();
    void _HideFloater();
    void _ShowFloater();

    void _SanityCheckZorder();
    void _OnCommand(UINT idCmd);

    static LRESULT _MsgHook(int nCode, WPARAM wParam, LPARAM lParam);
    static LRESULT _FloaterWndProc(HWND  hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
};

#define THID_ACTIVATE               1
#define THID_DEACTIVATE             2
#define THID_SETBROWSERBARWIDTH     3  // tells the browser bar what it's fixed width should be
#define THID_SETTOOLBARAUTOHIDE     4
#define THID_SETBROWSERBARAUTOHIDE  5
#define THID_TOOLBARACTIVATED       6
#define THID_ONINTERNET             7
#define THID_RECALCSIZING           8

// Explorer bar registry save structure
typedef struct _BROWBARSAVE {
    UINT uiWidthOrHeight;
    BOOL fAutoHide : 1;
} BROWBARSAVE;

#define SZ_REGVALUE_EXPLORERBARA  "ExplorerBar"
#define SZ_REGVALUE_EXPLORERBAR   TEXT(SZ_REGVALUE_EXPLORERBARA)


#endif
