/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
 *
 * The contents of this file are subject to the Netscape Public License
 * Version 1.0 (the "NPL"); you may not use this file except in
 * compliance with the NPL.  You may obtain a copy of the NPL at
 * http://www.mozilla.org/NPL/
 *
 * Software distributed under the NPL is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
 * for the specific language governing rights and limitations under the
 * NPL.
 *
 * The Initial Developer of this code under the NPL is Netscape
 * Communications Corporation.  Portions created by Netscape are
 * Copyright (C) 1998 Netscape Communications Corporation.  All Rights
 * Reserved.
 */

// edcombtb.h : header file
//
//  Custom Toolbar class to facilitate using ComboBoxes in CToolBar type of toolbar
//  
//  Features:
//    - Manages placement of CComboBox (or derived class) withing toolbar;
//        (Owner creates the ComboBox(es) and manages messages)
//    - Accessor functions are command ID - driven, rather than index into controll array
//    - Easy to use Enable, SetCheck functions that redraw only when state changes
//    - Allows user configuring: hiding controls with space compaction
//      (relative position is cannot be changed, it just turn each on/off)
//
//  Owner must fill comboboxes and manage command messages
//
//  Created: 8/38/95 by Charles Manske
//
#ifdef EDITOR
#ifndef _EDCOMBTB_H
#define _EDCOMBTB_H

#include    "edres2.h"  // For IDD_CONFIG_COMBOBAR

#include "toolbar2.h"

#define     SEPARATOR_WIDTH     8   // 6-pixel gap + 2 for overlap

// Use this ID to place-hold for ComboBox in ID Array
#define     ID_COMBOBOX         (UINT)-1

typedef struct _TB_CONTROLINFO {
    UINT        nID;                // Button or combobox Command ID, or ID_SEPARATOR
    BOOL        bIsButton;          // Test this for Check/Uncheck functions
    BOOL        bDoOnButtonDown;    // Trigger action on button down (normal is button up)
    int         nImageIndex;        // Relative to images in Bitmap (ignored for sep.,Combo)
    int         nWidth;             // Width of separator or ComboBox
    BOOL        bShow;              // If FALSE, control doesn't appear on toolbar
    BOOL        bComboBox;          // TRUE if combobox
    CComboBox * pComboBox;          // Must be supplied by owner of ComboBox
} TB_CONTROLINFO, *LPTB_CONTROLINFO;

class CConfigComboBar;

/////////////////////////////////////////////////////////////////////////////
// CComboToolBar window

class CComboToolBar : public CToolBar
{
// Construction
public:
    DECLARE_DYNAMIC(CComboToolBar)
	CComboToolBar();

// Attributes
public:

    // Should be same as public CToolTar::m_nCount (includes separators)
    // int               m_nItemCount;      
    int               m_nButtonCount;
    int               m_nComboBoxCount;
    int               m_nControlCount;   // Count of buttons + comboboxes
    CSize             m_sizeButton;

    LPTB_CONTROLINFO  m_pInfo;
    SIZE              m_sizeImage;  // Size of 1 button image
    UINT              m_nIDBitmap;

private:
    UINT              m_nComboTop;
    BOOL *            m_pEnableConfig;
	CNSToolbar2*	  m_pToolbar;
    CView *           m_pCommandView; //view to send button commands to.
#ifdef XP_WIN16
	CNSToolTip      * m_pToolTip;
#endif

// Operations
public:

    // Combination of CToolBar::Create(), LoadBitmap(), and SetButtons() 
    //  Assumes docking at all sides if no comboxes, or just Top or Bottom if combobox(es) used.
    //  If no nBitmapID, then only ComboBoxes in toolbar
    //
    //  lpIDArray is same as for CToolBar, and MUST be supplied,
    //   But use ID_COMBOBOX to place-hold where comboboxes are desired
    //
    //  nIDCount must be >=1
    //  All size values will assume Windows small-button guidelines defaults if 0
    //
    BOOL Create( BOOL bIsPageComposer, CWnd* pParent, UINT nIDBar, UINT nIDCaption,
                 UINT * pIDArray, int nIDCount,      // Command ID array and count
                 UINT nIDBitmap, SIZE sizeButton, SIZE sizeImage );

    BOOL CreateFloater(CWnd* pParent, UINT nIDBar, UINT nIDCaption,
                            UINT * pIDArray, int nIDCount,      // Command ID array and count
                            UINT * pIDArray2,int nIDCount2,
                            UINT nIDBitmap, SIZE sizeButton, SIZE sizeImage, CView *pCommandView = NULL);
    // After creating toobar, call this to enable/disable action on button down
    // Used primarily when action is creation of a CDropdownToolbar
    void SetDoOnButtonDown( UINT nID, BOOL bSet );

    //need place to send commands in case this toolbar not in proper chain of messages.
    void SetCommandView(CView *pView){ m_pCommandView = pView;}

    // After creating toobar, call this to set combobox command ID and its full size
    //   (including dropdown height) of each combobox used
    // If nHeight = 0, Height is calculated from number of items.
    // Call in the same order as appearance in toolbar
    void SetComboBox( UINT nID, CComboBox * pComboBox, UINT nWidth, UINT nListWidth, UINT nListHeight );
    
    // Get the rect of a button in screen coordinates
    // Used primarily with CDropdownToolbar
    BOOL GetButtonRect( UINT nID, RECT * pRect );
    
    // CToolBar has public GetCount() to return m_nCount
    // inline UINT GetCount() { return m_nItemCount; }
    inline UINT GetButtonCount() { return m_nButtonCount; }
    inline UINT GetComboBoxCount() { return m_nComboBoxCount; }

    // These are better than CCmdUI versions because they
    //   change state only if current state is different

    void EnableAll( BOOL bEnable );           // Enable/Disable all controls
    void Enable( UINT nID, BOOL bEnable );    // or just one
    void _Enable( int iIndex, BOOL bEnable ); // Index into array of all controls
    
    // Removes/Restores item from configure dialog
    void EnableConfigure( UINT nID, BOOL bEnable );

    // iCheck: 0 = no, 1 = checked, 2 = indeterminate 
    void SetCheck( UINT nID, int iCheck );  

    // Set all states with array of new values
    void SetCheckAll( int *  pCheckArray );
    
    // SetCheck for just one item
    void _SetCheck( int iIndex, int iCheck );

    // Supply an array of new Show states for ALL items
    // must point to array of length m_nCount;
    void ShowAll( BOOL * pShowArray );
    void Show( UINT nID, BOOL bShow );              // or change just one control
    void ShowByIndex( int iIndex, BOOL bShow );     // or one control using index
    
    // Allow user to select which controls to show/hide on the toolbar!
//   void ConfigureToolBar(CWnd *pParent = NULL);

    // Get pointer to toolbar item info
    inline LPTB_CONTROLINFO GetInfoPtr() { return m_pInfo; }

    // Use with GetWindowRect when real window
    //  size is needed for docked toolbars
    //  (GetWindowRect reports full client width if docked top/bottom,
    //   or client height if docked on side).  If bCNSToolbar is true then include
	// the CNSToolbar in the width.
    int GetToolbarWidth(BOOL bCNSToolbar = TRUE);
    //void GetToolbarWindowRect(RECT * pRect);

   // Used after changing Show state of 1 or more items 
    //  to move comboboxes and adjust spacing
    // Use nStart to recalc starting at the control just changed
    // Win16: This MUST be called at least once after all comboboxes
    //   are set and layout is final -- to assign Win16 tooltips
    void RecalcLayout( int nStart = 0);

	// Set a child toolbar to appear on the right side of this toolbar
	void SetCNSToolbar(CNSToolbar2 *pToolbar);

	// so we can pass this event on to the buttons
	virtual void OnUpdateCmdUI( CFrameWnd* pTarget, BOOL bDisableIfNoHndler );

	// How big do we need to be
	CSize CalcDynamicLayout(int nLength, DWORD dwMode );

// Implementation
public:
	virtual ~CComboToolBar();
    virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam );
	// Generated message map functions
protected:
#ifdef XP_WIN16
    BOOL PreTranslateMessage(MSG* pMsg);    // For tooltip message routing
#endif
	//{{AFX_MSG(CComboToolBar)
	afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
	afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
	afx_msg void OnMouseMove(UINT nFlags, CPoint point);
	afx_msg void OnSize( UINT nType, int cx, int cy );
	//}}AFX_MSG

	DECLARE_MESSAGE_MAP()
};

#endif // _EDCOMBTB_H
#endif // EDITOR
