/* -*- 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. */ // Defines a toolbar button // Created August 19, 1996 by Scott Putterman #ifndef _TLBUTTON_H #define _TLBUTTON_H #include "winproto.h" /* Needed for IconType enum */ #include "rdfacc.h" #include "tooltip.h" #define SHOW_ALL_CHARACTERS -1 #define TB_DYNAMIC_TOOLTIP 0x1 //Client fills in tooltip #define TB_HAS_TIMED_MENU 0x2 //Popup menu shows up on left mouse down after a small period of time #define TB_HAS_IMMEDIATE_MENU 0x4 //Popup menu shows up on left mouse down immediately #define TB_HAS_DRAGABLE_MENU 0x8 //Popup menu uses a CDropMenu instead of an HMENU. In order for this //feature to work, must call SetDropTarget before dragging occurs. And //the drop target must be derived from CToolbarButtonDropTarget #define TB_DYNAMIC_STATUS 0x10 //Client fills in status message #define TB_HAS_DROPDOWN_TOOLBAR 0x20 // A CDropDownToolbar shows up on left mouse down (used for Composer only) #define NSBUTTONMENUOPEN (WM_USER + 1) // Sent when a button menu is opened and needs to be filled in #define NSBUTTONDRAGGING (WM_USER + 2) // Sent when a button is being dragged #define NSDRAGMENUOPEN (WM_USER + 3) // Sent when a CDrop menu is being opened and needs to be filled in #define NSDRAGGINGONBUTTON (WM_USER + 4) // Sent when something is being dragged ontop of a button #define TB_FILLINTOOLTIP (WM_USER + 8) // Sent when a string for a tooltip needs to be filled in #define TB_FILLINSTATUS (WM_USER + 9) // Sent when a string for the status bar needs to be filled in #define TB_SIZECHANGED (WM_USER + 30) // Sent when the button changes size typedef struct { HWND button; } BUTTONITEM; typedef BUTTONITEM * LPBUTTONITEM; #define NETSCAPE_BOOKMARK_BUTTON_FORMAT "Netscape Bookmark Button Format" typedef struct { BOOKMARKITEM bookmark; BUTTONITEM buttonInfo; } BOOKMARKBUTTONITEM; typedef BOOKMARKBUTTONITEM * LPBOOKMARKBUTTONITEM; #define NETSCAPE_COMMAND_BUTTON_FORMAT "Netscape Command Button Format" typedef struct { UINT nCommand; BUTTONITEM buttonInfo; } COMMANDBUTTONITEM; typedef COMMANDBUTTONITEM * LPCOMMANDBUTTONITEM; class CToolbarButton; class CButtonEditWnd : public CEdit { protected: CToolbarButton *m_pOwner; public: CButtonEditWnd() { m_pOwner = NULL; } ~CButtonEditWnd(); void SetToolbarButtonOwner(CToolbarButton *pOwner); virtual BOOL PreTranslateMessage ( MSG * msg ); protected: // Generated message map functions //{{AFX_MSG(CButtonEditWnd) afx_msg void OnDestroy(); afx_msg void OnKillFocus( CWnd* pNewWnd ); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; class CToolbarButtonCmdUI : public CCmdUI { public: // re-implementations only virtual void Enable(BOOL bOn); virtual void SetCheck( int nCheck = 1 ); }; class CDropMenu; class CToolbarButton; #define CToolbarButtonDropTargetBase COleDropTarget class CToolbarButtonDropTarget : public CToolbarButtonDropTargetBase { protected: CToolbarButton *m_pButton; public: CToolbarButtonDropTarget(){m_pButton = NULL;} void SetButton(CToolbarButton *pButton) { m_pButton = pButton;} protected: virtual DROPEFFECT OnDragEnter(CWnd * pWnd, COleDataObject * pDataObject, DWORD dwKeyState, CPoint point); virtual DROPEFFECT OnDragOver(CWnd * pWnd, COleDataObject * pDataObject, DWORD dwKeyState, CPoint point ); virtual BOOL OnDrop(CWnd * pWnd, COleDataObject * pDataObject, DROPEFFECT dropEffect, CPoint point); virtual DROPEFFECT ProcessDragEnter(CWnd *pWnd, COleDataObject *pDataObject, DWORD dwKeyState, CPoint point) = 0; virtual DROPEFFECT ProcessDragOver(CWnd *pWnd, COleDataObject *pDataObject, DWORD dwKeyState, CPoint point) = 0; virtual BOOL ProcessDrop(CWnd *pWnd, COleDataObject *pDataObject, DROPEFFECT dropEffect, CPoint point) = 0; private: }; class CToolbarButton: public CWnd { public: // States for button effects enum BTN_STATE {eNORMAL, eDISABLED, eBUTTON_UP, eBUTTON_DOWN, eBUTTON_CHECKED}; protected: BOOL m_bIsResourceID; // does this use a resource or a file UINT m_nBitmapID; // the resource of the bitmap UINT m_nBitmapIndex; // the index of the bitmap we wish to show LPTSTR m_pBitmapFile; // the file in which the bitmap is stored LPTSTR m_pButtonText; // the text displayed in Novice mode LPTSTR m_pToolTipText; // the text displayed in the tooltip LPTSTR m_pStatusText; // the text displayed in the status bar int m_nToolbarStyle; // whether or not we are in Novice mode CSize m_noviceButtonSize; // the size of the button in Novice mode CSize m_advancedButtonSize; // the size of the button in Advanced mode CSize m_bitmapSize; // The size of each bitmap in the resource int m_nMaxTextChars; // The maximum number of characters of the text shown on button int m_nMinTextChars; // The minimum number of characters shown on button DWORD m_dwButtonStyle; // the style of the button BTN_STATE m_eState; // Current button state BOOL m_bEnabled; // Is the button enabled BOOL m_bNeedsUpdate; // Does the button need to be disabled/enabled CToolbarButtonCmdUI m_state; CMenu m_menu; // The menu if the button has one CDropMenu* m_pDropMenu; // The drop menu if TB_HAS_DRAGABLE_MENU is set UINT m_nCommand; // command associated with this button UINT m_hMenuTimer; // The timer we use for starting menu if the button has one BOOL m_bMenuShowing; // The menu is showing; BOOL m_bButtonDown; // for every button up there must be a button down if an action // is to be taken UINT m_hFocusTimer; // Timer to see if the button still has focus BOOL m_bHaveFocus; // Do we have focus HBITMAP m_hBmpImg; // The loaded bitmap BOOL m_bBitmapFromParent;// Does the parent own the bitmap or do we have to free it. IconType m_nIconType; // The icon type (BITMAP, LOCAL_FILE, ARBITRARY URL) int m_nChecked; // Is this button checked CNSToolTip2 m_ToolTip; BOOL m_bEraseBackground; CToolbarButtonDropTarget *m_pDropTarget; //if we are a drop target BOOL m_bDraggingOnButton; BOOL m_bPicturesOnly; // This button only shows pictures BOOL m_bDoOnButtonDown; // Command is executed on button down instead of usual button up CButtonEditWnd* m_pTextEdit; // If the text can be edited in place we will need this edit window BOOL atMinimalSize; // TRUE if the button is at its minimal size BOOL atMaximalSize; // TRUE if the button is at its maximal size BOOL m_bDepressed; // Is the button depressed and locked. BOOL hasCustomTextColor; // TRUE if the button has a special text color. BOOL hasCustomBGColor; // TRUE if the button has a special background color. COLORREF customTextColor; // Custom Text Color COLORREF customBGColor; // Custom BG Color public: CToolbarButton(); ~CToolbarButton(); int Create(CWnd *pParent, int nToolbarStyle, CSize noviceButtonSize, CSize advancedButtonSize, LPCTSTR pButtonText, LPCTSTR pToolTipText, LPCTSTR pStatusText, UINT nBitmapID, UINT nBitmapIndex, CSize m_bitmapSize, BOOL bNeedsUpdate, UINT nCommand, int nMaxTextChars, int nMinTextChars = 0, DWORD dwButtonStyle = 0); int Create(CWnd *pParent, int nToolbarStyle, CSize noviceButtonSize, CSize advancedButtonSize, LPCTSTR pButtonText, LPCTSTR pToolTipText, LPCTSTR pStatusText, LPCTSTR pBitmapFile, CSize m_bitmapSize, BOOL bNeedsUpdate, UINT nCommand, int nMaxTextChars, int nMinTextChars = 0, DWORD dwButtonStyle = 0); void SetStyle(DWORD dwButtonStyle); void SetText(LPCTSTR pButtonText); const char *GetToolTipText(void) { return m_pToolTipText; } void SetToolTipText(LPCSTR pToolTipText); void SetStatusText(LPCSTR pStatusText); void SetBitmap(HBITMAP hBmpImg, BOOL bParentOwns); void ReplaceBitmap(UINT nBitmapID, UINT nBitmapIndex); void ReplaceBitmap(LPCTSTR pBitmapFile); void ReplaceBitmap(HBITMAP hBmpImg, UINT nBitmapIndex, BOOL bParentOwns); void ReplaceBitmapIndex(UINT nBitmapIndex); virtual void DrawCustomIcon(HDC hDC, int x, int y) {}; virtual void DrawLocalIcon(HDC hDC, int x, int y) {}; virtual CSize GetButtonSize(void); virtual CSize GetRequiredButtonSize(void); virtual CSize GetButtonSizeFromChars(CString s, int c); virtual CSize GetMaximalButtonSize(void); virtual CSize GetMinimalButtonSize(void); BOOL AtMinimalSize(void); BOOL AtMaximalSize(void); virtual void CheckForMinimalSize(void); virtual void CheckForMaximalSize(void); BOOL IsResourceID(void) { return m_bIsResourceID; } UINT GetBitmapID(void) { return m_nBitmapID; } UINT GetBitmapIndex(void) { return m_nBitmapIndex; } LPCTSTR GetBitmapFile(void) { return m_pBitmapFile; } CSize GetBitmapSize(void) { return m_bitmapSize; } int GetMaxTextCharacters(void) { return m_nMaxTextChars; } int GetMinTextCharacters(void) { return m_nMinTextChars; } BOOL NeedsUpdate(void) { return m_bNeedsUpdate; } void Enable(BOOL bEnabled) { m_bEnabled = bEnabled; } BOOL IsEnabled(void) { return m_bEnabled; } void SetCheck(int nCheck); int GetCheck(void); void SetPicturesOnly(int bPicturesOnly); void SetButtonMode(int nToolbarStyle); void SetState(BTN_STATE eState) { m_eState = eState; } void SetMenuShowing(BOOL bMenuShowing) {m_bMenuShowing = bMenuShowing; } void SetBitmapSize(CSize sizeImage); void SetButtonSize(CSize buttonSize); void SetDropTarget(CToolbarButtonDropTarget *pDropTarget); CMenu & GetButtonMenu(void) { return m_menu; } UINT GetButtonCommand(void) { return m_nCommand; } void SetButtonCommand(UINT nCommand); virtual void OnAction(void) { } virtual void FillInOleDataSource(COleDataSource *pDataSource) {} void FillInButtonData(LPBUTTONITEM button); BOOL OnCommand(UINT wParam,LONG lParam); virtual BOOL OnNotify( WPARAM wParam, LPARAM lParam, LRESULT* pResult ); virtual void OnUpdateCmdUI(CFrameWnd* pTarget, BOOL bDisableIfNoHndler); //called when a button is being dragged void ButtonDragged(void); void SetDoOnButtonDown(BOOL bDoOnButtonDown) {m_bDoOnButtonDown = bDoOnButtonDown;} BOOL IsDoOnButtonDown() {return m_bDoOnButtonDown;} void AddTextEdit(void); void RemoveTextEdit(void); void SetTextEditText(char *pText); char *GetTextEditText(void); virtual void EditTextChanged(char *pText); void SetCustomColors(COLORREF textColor, COLORREF bgColor) { hasCustomBGColor = hasCustomTextColor = TRUE; customTextColor = textColor; customBGColor = bgColor; } virtual void UpdateIconInfo() {} protected: virtual void DrawPicturesAndTextMode(HDC hDC, CRect rect); virtual void DrawPicturesMode(HDC hDC, CRect rect); virtual void DrawTextMode(HDC hDC, CRect rect); virtual void DrawBitmapOnTop(HDC hDC, CRect rect); virtual void DrawBitmapOnSide(HDC hDC, CRect rect); virtual void DrawTextOnly(HDC hDC, CRect rect); virtual void DrawButtonBitmap(HDC hDC, CRect rcImg); virtual void DrawButtonText(HDC hDC, CRect rcTxt, CSize sizeTxt, CString strTxt); virtual CSize GetBitmapOnTopSize(CString s, int c); virtual CSize GetBitmapOnSideSize(CString s, int c); virtual CSize GetBitmapOnlySize(void); virtual CSize GetTextOnlySize(CString s, int c); virtual void DrawUpButton(HDC hDC, CRect & rect); virtual void DrawDownButton(HDC hDC, CRect & rect); virtual void DrawCheckedButton(HDC hDC, CRect & rect); virtual void RemoveButtonFocus(void); virtual BOOL CreateRightMouseMenu(void); virtual void DisplayAndTrackMenu(void); virtual CWnd* GetMenuParent(void); virtual void GetTextRect(CRect &rect); virtual void GetPicturesAndTextModeTextRect(CRect &rect); virtual void GetPicturesModeTextRect(CRect &rect); virtual void GetTextModeTextRect(CRect &rect); virtual void GetBitmapOnTopTextRect(CRect &rect); virtual void GetTextOnlyTextRect(CRect &rect); virtual void GetBitmapOnSideTextRect(CRect &rect); virtual CPoint RequestMenuPlacement() { CPoint point(0, GetRequiredButtonSize().cy); ClientToScreen(&point); return point; } // Generated message map functions //{{AFX_MSG(CToolbarButton) afx_msg void OnPaint(); virtual afx_msg void OnLButtonDown(UINT nFlags, CPoint point); virtual afx_msg void OnLButtonUp(UINT nFlags, CPoint point); afx_msg void OnRButtonDown(UINT nFlags, CPoint point); virtual afx_msg void OnMouseMove(UINT nFlags, CPoint point); afx_msg UINT OnGetDlgCode( ); afx_msg void OnKeyDown( UINT nChar, UINT nRepCnt, UINT nFlags ); afx_msg void OnShowWindow( BOOL bShow, UINT nStatus ); afx_msg BOOL OnEraseBkgnd( CDC* pDC ); afx_msg void OnCaptureChanged( CWnd* pWnd ); afx_msg LRESULT OnToolTipNeedText(WPARAM, LPARAM); virtual afx_msg void OnTimer( UINT nIDEvent ); afx_msg LRESULT OnDragMenuOpen(WPARAM, LPARAM); afx_msg LRESULT OnDraggingOnButton(WPARAM, LPARAM); afx_msg void OnPaletteChanged( CWnd* pFocusWnd ); afx_msg void OnSysColorChange(); afx_msg HBRUSH OnCtlColor( CDC* pDC, CWnd* pWnd, UINT nCtlColor ); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; // This class represents a toolbar button that can be dragged via drag and drop class CDragableToolbarButton: public CToolbarButton { private: BOOL m_bDragging; //Are we being dragged CPoint m_draggingPoint; //The original point when we started dragging public: CDragableToolbarButton(); virtual void FillInOleDataSource(COleDataSource *pDataSource) = 0; protected: // Generated message map functions //{{AFX_MSG(CDragableToolbarButton) virtual afx_msg void OnLButtonDown(UINT nFlags, CPoint point); virtual afx_msg void OnLButtonUp(UINT nFlags, CPoint point); virtual afx_msg void OnMouseMove(UINT nFlags, CPoint point); virtual afx_msg void OnTimer( UINT nIDEvent ); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; // This class represents a toolbar button that cannot be dragged via drag and drop class CStationaryToolbarButton: public CToolbarButton { public: CStationaryToolbarButton() {} int Create(CWnd *pParent, int nToolbarStyle, CSize noviceButtonSize, CSize advancedButtonSize, LPCTSTR pButtonText, LPCTSTR pToolTipText, LPCTSTR pStatusText, UINT nBitmapID, UINT nBitmapIndex, CSize m_bitmapSize, BOOL bNeedsUpdate, UINT nCommand, int nMaxTextChars, DWORD dwButtonStyle = 0, int nMinTextChars = 0); int Create(CWnd *pParent, int nToolbarStyle, CSize noviceButtonSize, CSize advancedButtonSize, LPCTSTR pButtonText, LPCTSTR pToolTipText, LPCTSTR pStatusText, LPCTSTR pBitmapFile, CSize m_bitmapSize, BOOL bNeedsUpdate, UINT nCommand, int nMaxTextChars, DWORD dwButtonStyle = 0, int nMinTextChars = 0); protected: // Generated message map functions //{{AFX_MSG(CStationaryToolbarButton) virtual afx_msg void OnLButtonDown(UINT nFlags, CPoint point); virtual afx_msg void OnLButtonUp(UINT nFlags, CPoint point); virtual afx_msg void OnMouseMove(UINT nFlags, CPoint point); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; class CCommandToolbarButton: public CStationaryToolbarButton { private: CWnd *m_pActionOwner; public: CCommandToolbarButton(); int Create(CWnd *pParent, int nToolbarStyle, CSize noviceButtonSize, CSize advancedButtonSize, LPCTSTR pButtonText, LPCTSTR pToolTipText, LPCTSTR pStatusText, UINT nBitmapID, UINT nBitmapIndex, CSize m_bitmapSize, UINT nCommand, int nMaxTextChars, DWORD dwButtonStyle = 0, int nMinTextChars = 0); int Create(CWnd *pParent, int nToolbarStyle, CSize noviceButtonSize, CSize advancedButtonSize, LPCTSTR pButtonText, LPCTSTR pToolTipText, LPCTSTR pStatusText, LPCTSTR pBitmapFile, CSize m_bitmapSize, UINT nCommand, int nMaxTextChars, DWORD dwButtonStyle = 0, int nMinTextChars = 0); virtual void OnAction(void); virtual void FillInOleDataSource(COleDataSource *pDataSource); //Actions will be sent to this owner. If this function is not used then the //message will go to the owner frame. virtual void SetActionMessageOwner(CWnd *pActionOwner); }; void WFE_ParseButtonString(UINT nID, CString &statusStr, CString &toolTipStr, CString &textStr); #endif