/////////////////////////////////////////////////////////////////////////////
// Copyright (C) 1993-1996  Microsoft Corporation.  All Rights Reserved.
//
//  MODULE:     itbar.h
//
//  PURPOSE:    Defines the CCoolbar class.
//

#ifndef __BANDS_H__
#define __BANDS_H__

#include "tbinfo.h"
#include "conman.h"

interface INotify;

#define BROWSERMENUBANDID        100
#define BROWSERTOOLBANDID        101
#define BROWSERBRANDBANDID       102
#define BROWSERRULESBANDID       103

#define NOTEMENUBANDID              100
#define NOTETOOLBANDID              101
#define NOTEBRANDBANDID             102


#define MAX_BROWSER_BANDS           4
#define MAX_NOTE_BANDS              3
#define MAX_PARENT_TYPES            2
#define MAX_BANDS                   5

#define BROWSER_BAND_VERSION        17
#define NOTE_BAND_VERSION           15

#define CIMLIST                     2

#define CBTYPE_NONE              0
#define CBTYPE_BASE              100
#define CBTYPE_BRAND             102
#define CBTYPE_TOOLS             101
#define CBTYPE_MENUBAND          100
#define CBTYPE_RULESTOOLBAR      103

#define TBSTATE_FULLTEXT         0x00000001
#define TBSTATE_NOTEXT           0x00000002
#define TBSTATE_PARTIALTEXT      0x00000004
#define TBSTATE_NOBACKGROUND     0x00000008
#define TBSTATE_ANIMATING        0x00000010
#define TBSTATE_INMENULOOP       0X00000020
#define TBSTATE_FIRSTFRAME       0x00000040
#define TEXTSTATE_MASK           0x11111118

#define LARGE_ICONS              0x00000001
#define SMALL_ICONS              0x00000002

//Parent Types
#define PARENT_TYPE_BROWSER         0
#define PARENT_TYPE_NOTE            1

#define idDownloadBegin         100
#define idDownloadEnd           101
#define idStateChange           102
#define idUpdateFolderList      103
#define idUpdateCurrentFolder   104
#define idSendToolMessage       105
#define idBitmapChange          106
#define idToggleButton          107
#define idCustomize             108
#define idNotifyFilterChange    109
#define idIsFilterBarVisible    110

// Dimensions of Coolbar Glyphs ..
#define TB_BMP_CX_W2K           22
#define TB_BMP_CX               24
#define TB_BMP_CY               24
#define TB_SMBMP_CX             16
#define TB_SMBMP_CY             16

// Max length of Button titles
#define MAX_TB_TEXT_LENGTH      256

#define MAX_TB_COMPRESSED_WIDTH 42
#define MAX_TB_TEXT_ROWS_VERT   2
#define MAX_TB_TEXT_ROWS_HORZ   1

#define ANIMATION_TIMER         123

// Child window id's
#define idcCoolbarBase          2000
#define idcSizer                (idcCoolbarBase - 2)
#define idcCoolbar              (idcCoolbarBase - 1)
#define idcToolbar              (idcCoolbarBase + CBTYPE_TOOLS)
#define idcBrand                (idcCoolbarBase + CBTYPE_BRAND)

// Number of Sites on the quick link bar and max number of toolbar buttons
#define MAX_TB_BUTTONS          10

// Indices for Toolbar imagelists
enum {
    IMLIST_DEFAULT = 0,
    IMLIST_HOT,
    CIMLISTS
};

// BANDSAVE &  - These structures are used to persist the state of the coolbar
// COOLBARSAVE   including the band order, visiblity, size, side, etc.
typedef struct tagBANDSAVE {
    DWORD           wID;
    DWORD           dwStyle;
    DWORD           cx;
} BANDSAVE, *PBANDSAVE;

typedef struct tagCOOLBARSTATECHANGE {
    UINT id;
    BOOL fEnable;
} COOLBARSTATECHANGE, *LPCOOLBARSTATECHANGE;

typedef struct tagCOOLBARBITMAPCHANGE {
    UINT id;
    UINT index;
} COOLBARBITMAPCHANGE;

typedef struct tagTOOLMESSAGE
{
    UINT uMsg;
    WPARAM wParam;
    LPARAM lParam;
    LRESULT lResult;
} TOOLMESSAGE;

typedef struct InitBandInfo_t
{
    DWORD       dwVersion;
    DWORD       cBands;
    BANDSAVE    BandData[MAX_BANDS];
}INITBANDINFO;

typedef struct ImageListTypes_t
{
    int         Small;
    int         High;
    int         Low;
}ImageListTypes;

//small is 16 x 16 16 colors
//hi    is 20x 20 256 colors
//lo    is 20 x 20 16 colors
#define MAX_IMAGELIST_TYPES     3
#define IMAGELIST_TYPE_SMALL    0
#define IMAGELIST_TYPE_HI       1
#define IMAGELIST_TYPE_LO       2

typedef struct ImageListStruct_t
{
    DWORD               cLists;
    int                 ImageListTable[MAX_IMAGELIST_TYPES];
}ImageListStruct;

enum 
{
    BRAND_SIZE_LARGE,
    BRAND_SIZE_SMALL,
    BRAND_SIZE_MINISCULE
};

class CBands : public IDockingWindow,
               public IObjectWithSite,
               public IConnectionNotify
    {
public:
    /////////////////////////////////////////////////////////////////////////
    // Construction and initialization
    CBands();
    HRESULT HrInit(DWORD idBackground, HMENU    hmenu, DWORD    dwParentType);
    HRESULT ResetMenu(HMENU hmenu);

protected:
    virtual ~CBands();

public:
    virtual STDMETHODIMP QueryInterface(REFIID riid, LPVOID* ppvObj);
    virtual STDMETHODIMP_(ULONG) AddRef(void);
    virtual STDMETHODIMP_(ULONG) Release(void);

    /////////////////////////////////////////////////////////////////////////
    // IDockingWindow methods
    virtual STDMETHODIMP GetWindow(HWND * lphwnd);
    virtual STDMETHODIMP ContextSensitiveHelp(BOOL fEnterMode);
    
    virtual STDMETHODIMP ShowDW(BOOL fShow);
    virtual STDMETHODIMP CloseDW(DWORD dwReserved);
    virtual STDMETHODIMP ResizeBorderDW(LPCRECT prcBorder,
                                        IUnknown* punkToolbarSite,
                                        BOOL fReserved);

    /////////////////////////////////////////////////////////////////////////
    // IObjectWithSite methods
    virtual STDMETHODIMP SetSite(IUnknown* punkSite);
    virtual STDMETHODIMP GetSite(REFIID riid, LPVOID * ppvSite);

    /////////////////////////////////////////////////////////////////////////
    // IConnectionNotify
    virtual STDMETHODIMP OnConnectionNotify(CONNNOTIFY nCode, LPVOID pvData, CConnectionManager *pConMan);

    /////////////////////////////////////////////////////////////////////////
    // This allows the view to send commands etc. to the toolbar
    virtual STDMETHODIMP Invoke(DWORD id, LPVOID pv);
    HRESULT SetFolderType(FOLDERTYPE ftType);

    virtual STDMETHODIMP OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify);

    HRESULT Update();
    HRESULT UpdateViewState();
    HRESULT TranslateMenuMessage(MSG *lpmsg, LRESULT   *lpresult);
    HRESULT IsMenuMessage(MSG *lpmsg);
    void    SetNotRealSite();
    BOOL    CheckForwardWinEvent(HWND hwnd,  UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT* plres);
    HWND    GetToolbarWnd();
    HWND    GetRebarWnd();
    void    HideToolbar(BOOL    fVisible, DWORD    dwBandID = CBTYPE_TOOLS);
    void    SendSaveRestoreMessage(HWND hwnd, BOOL fSave);
    void    ChangeImages();
    void    TrackSliding(int x, int y);
    BOOL    IsToolbarVisible();
    BOOL    IsBandVisible(DWORD  dwBandId);
    void    CleanupImages(HWND  hwnd);
    void    CleanupImages();
    void    SetIconSize(DWORD  dw);
    void    UpdateTextSettings(DWORD  dwTextState);

protected:
    void StartDownload();
    void StopDownload();

    /////////////////////////////////////////////////////////////////////////
    // Window procedure and message handlers
    static LRESULT CALLBACK SizableWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, 
                                           LPARAM lParam);
    virtual LRESULT OnNotify(HWND hwnd, LPARAM lparam);
    virtual void OnContextMenu(HWND hwndFrom, int xPos, int yPos);
    virtual LRESULT OnDropDown(HWND hwnd, LPNMHDR lpnmh);

    LRESULT OnGetButtonInfo(TBNOTIFY* ptbn);
    LRESULT OnGetInfoTip(LPNMTBGETINFOTIP   lpnmtb);

    /////////////////////////////////////////////////////////////////////////
    // Used for animating the logo to show progress
    HRESULT ShowBrand(void);
    HRESULT HandleStaticLogos(BOOL fSmallBrand);
    HRESULT LoadBrandingBitmap(void);    
    void    DrawBranding(LPDRAWITEMSTRUCT lpdis);

    /////////////////////////////////////////////////////////////////////////
    // For sizing etc.
    BOOL SetMinDimensions(void);    
    BOOL CompressBands(DWORD dwText);

    /////////////////////////////////////////////////////////////////////////
    // Initialization and persistance
    HRESULT CreateRebar(BOOL);
    void    SaveSettings(void);
    void    LoadBackgroundImage();
    HRESULT ValidateRetrievedData(INITBANDINFO *pSavedBandData);
    
    /////////////////////////////////////////////////////////////////////////
    // Toolbar Stuff
    HRESULT     AddTools(PBANDSAVE pbs);
    void        UpdateToolbarColors(void);

    HRESULT     CreateMenuBand(PBANDSAVE pbs);
    HRESULT     AddMenuBand(PBANDSAVE pbs);

    HMENU        LoadDefaultContextMenu(BOOL *fVisible);

    BOOL        _InitToolbar(HWND hwndToolbar);
    void        _LoadStrings(HWND hwndToolbar, TOOLBAR_INFO *pti);
    BOOL        _SetImages(HWND hwndToolbar, const int* imagelist);
    BOOL        _LoadDefaultButtons(HWND hwndToolbar, TOOLBAR_INFO *pti);
    BOOL        _ButtonInfoFromID(DWORD id, TBBUTTON *pButton, TOOLBAR_INFO *pti);
    HRESULT     Update(HWND     hwnd);

    //Rules/filters stuff
    HRESULT     AddRulesToolbar(PBANDSAVE pbs);
    HRESULT     AddComboBox();
    void        UpdateFilters(RULEID    rid);
    LRESULT     HandleComboBoxNotifications(WPARAM  wParam, LPARAM  lParam);
    void        FixComboBox(LPTSTR  szMaxName);
    void        InitRulesToolbar();
    void        CleanupRulesToolbar();
    void        FilterBoxFontChange();

    //Customize toolbar Stuff
    void    _OnBeginCustomize(LPNMTBCUSTOMIZEDLG pnm);
    static  INT_PTR CALLBACK _BtnAttrDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
    void    _PopulateComboBox(HWND hwnd, const int iResource[], UINT cResources);
    void    _SetComboSelection(HWND hwnd, int iCurOption);
    void    _SetDialogSelections(HWND hDlg);
    void    _PopulateDialog(HWND hDlg);
    void    _UpdateTextSettings(int ids);
    inline  DWORD   _GetTextState();
    inline  DWORD   _GetIconSize();
    void    SetTextState(DWORD    dw);
    inline  void    _ChangeSendReceiveText(int ids);
    void    RecalcButtonWidths();
    void    CalcIdealSize();

    /////////////////////////////////////////////////////////////////////////
    // Misc. stuff
    UINT                m_cRef;              // Ref count
    IDockingWindowSite  *m_ptbSite;
    IOleCommandTarget   *m_ptbSiteCT;
    LONG                m_cxMaxButtonWidth;    
    FOLDERTYPE          m_ftType;
    const TOOLBAR_INFO  *m_pTBInfo;
    
    /////////////////////////////////////////////////////////////////////////
    // Handy window handles to have around
    HWND            m_hwndParent;
    HWND            m_hwndTools;
    HWND            m_hwndBrand;
    HWND            m_hwndSizer;
    HWND            m_hwndRebar;

    /////////////////////////////////////////////////////////////////////////
    // State variables
    INITBANDINFO    *m_pSavedBandInfo;
    DWORD           m_cSavedBandInfo;
    DWORD           m_dwState;

    /////////////////////////////////////////////////////////////////////////
    // GDI Resources
    UINT            m_idbBack;              // Id of the background bitmap.  Set by the subclasses.
    HBITMAP         m_hbmBack;              // Background bitmap
    HBITMAP         m_hbmBrand;
    HIMAGELIST      m_rghimlTools[CIMLISTS];  // These are for the default toolbar

    /////////////////////////////////////////////////////////////////////////
    // Used for animating the logo etc
    HPALETTE        m_hpal;
    HDC             m_hdc;
    int             m_xOrg;
    int             m_yOrg;
    int             m_cxBmp;
    int             m_cyBmp;
    int             m_cxBrand;
    int             m_cyBrand;
    int             m_cxBrandExtent;
    int             m_cyBrandExtent;
    int             m_cyBrandLeadIn;
    COLORREF        m_rgbUpperLeft;  

    /////////////////////////////////////////////////////////////////////////
    // Used in resizing etc
    int             m_xCapture;
    int             m_yCapture;

    //Used by Menubands
    IShellMenu      *m_pShellMenu;
    IDeskBand       *m_pDeskBand;
    IMenuBand       *m_pMenuBand;
    HMENU           m_hMenu;
    IWinEventHandler *m_pWinEvent;
    HWND            m_hwndMenuBand;

    //Used in new Bands
    DWORD           m_dwParentType;

    BOOL            m_fBrandLoaded;
    DWORD           m_dwBrandSize;

    //rules stuff
    HWND            m_hwndRulesToolbar;
    HWND            m_hwndFilterCombo;
    RULEID          m_DefaultFilterId;
    HFONT           m_hComboBoxFont;

    //Customize
    DWORD           m_dwToolbarTextState;
    DWORD           m_dwIconSize;
    BOOL            m_fDirty;
    DWORD           m_dwPrevTextStyle;
    INotify         *m_pTextStyleNotify;
    };


#endif //__BANDS_H__