1 ///////////////////////////////////////////////////////////////////////////////
2 // Name:        wx/ribbon/buttonbar.h
3 // Purpose:     Ribbon control similar to a tool bar
4 // Author:      Peter Cawley
5 // Modified by:
6 // Created:     2009-07-01
7 // Copyright:   (C) Peter Cawley
8 // Licence:     wxWindows licence
9 ///////////////////////////////////////////////////////////////////////////////
10 #ifndef _WX_RIBBON_BUTTON_BAR_H_
11 #define _WX_RIBBON_BUTTON_BAR_H_
12 
13 #include "wx/defs.h"
14 
15 #if wxUSE_RIBBON
16 
17 #include "wx/ribbon/art.h"
18 #include "wx/ribbon/control.h"
19 #include "wx/dynarray.h"
20 
21 class wxRibbonButtonBarButtonBase;
22 class wxRibbonButtonBarLayout;
23 class wxRibbonButtonBarButtonInstance;
24 
25 WX_DEFINE_USER_EXPORTED_ARRAY_PTR(wxRibbonButtonBarLayout*, wxArrayRibbonButtonBarLayout, class WXDLLIMPEXP_RIBBON);
26 WX_DEFINE_USER_EXPORTED_ARRAY_PTR(wxRibbonButtonBarButtonBase*, wxArrayRibbonButtonBarButtonBase, class WXDLLIMPEXP_RIBBON);
27 
28 class WXDLLIMPEXP_RIBBON wxRibbonButtonBar : public wxRibbonControl
29 {
30 public:
31     wxRibbonButtonBar();
32 
33     wxRibbonButtonBar(wxWindow* parent,
34                   wxWindowID id = wxID_ANY,
35                   const wxPoint& pos = wxDefaultPosition,
36                   const wxSize& size = wxDefaultSize,
37                   long style = 0);
38 
39     virtual ~wxRibbonButtonBar();
40 
41     bool Create(wxWindow* parent,
42                 wxWindowID id = wxID_ANY,
43                 const wxPoint& pos = wxDefaultPosition,
44                 const wxSize& size = wxDefaultSize,
45                 long style = 0);
46 
47     virtual wxRibbonButtonBarButtonBase* AddButton(
48                 int button_id,
49                 const wxString& label,
50                 const wxBitmap& bitmap,
51                 const wxString& help_string,
52                 wxRibbonButtonKind kind = wxRIBBON_BUTTON_NORMAL);
53     // NB: help_string cannot be optional as that would cause the signature
54     // to be identical to the full version of AddButton when 3 arguments are
55     // given.
56 
57     virtual wxRibbonButtonBarButtonBase* AddDropdownButton(
58                 int button_id,
59                 const wxString& label,
60                 const wxBitmap& bitmap,
61                 const wxString& help_string = wxEmptyString);
62 
63     virtual wxRibbonButtonBarButtonBase* AddHybridButton(
64                 int button_id,
65                 const wxString& label,
66                 const wxBitmap& bitmap,
67                 const wxString& help_string = wxEmptyString);
68 
69     virtual wxRibbonButtonBarButtonBase* AddToggleButton(
70                 int button_id,
71                 const wxString& label,
72                 const wxBitmap& bitmap,
73                 const wxString& help_string = wxEmptyString);
74 
75     virtual wxRibbonButtonBarButtonBase* AddButton(
76                 int button_id,
77                 const wxString& label,
78                 const wxBitmap& bitmap,
79                 const wxBitmap& bitmap_small = wxNullBitmap,
80                 const wxBitmap& bitmap_disabled = wxNullBitmap,
81                 const wxBitmap& bitmap_small_disabled = wxNullBitmap,
82                 wxRibbonButtonKind kind = wxRIBBON_BUTTON_NORMAL,
83                 const wxString& help_string = wxEmptyString);
84 
85     virtual wxRibbonButtonBarButtonBase* InsertButton(
86                 size_t pos,
87                 int button_id,
88                 const wxString& label,
89                 const wxBitmap& bitmap,
90                 const wxString& help_string,
91                 wxRibbonButtonKind kind = wxRIBBON_BUTTON_NORMAL);
92 
93     virtual wxRibbonButtonBarButtonBase* InsertDropdownButton(
94                 size_t pos,
95                 int button_id,
96                 const wxString& label,
97                 const wxBitmap& bitmap,
98                 const wxString& help_string = wxEmptyString);
99 
100     virtual wxRibbonButtonBarButtonBase* InsertHybridButton(
101                 size_t pos,
102                 int button_id,
103                 const wxString& label,
104                 const wxBitmap& bitmap,
105                 const wxString& help_string = wxEmptyString);
106 
107     virtual wxRibbonButtonBarButtonBase* InsertToggleButton(
108                 size_t pos,
109                 int button_id,
110                 const wxString& label,
111                 const wxBitmap& bitmap,
112                 const wxString& help_string = wxEmptyString);
113 
114     virtual wxRibbonButtonBarButtonBase* InsertButton(
115                 size_t pos,
116                 int button_id,
117                 const wxString& label,
118                 const wxBitmap& bitmap,
119                 const wxBitmap& bitmap_small = wxNullBitmap,
120                 const wxBitmap& bitmap_disabled = wxNullBitmap,
121                 const wxBitmap& bitmap_small_disabled = wxNullBitmap,
122                 wxRibbonButtonKind kind = wxRIBBON_BUTTON_NORMAL,
123                 const wxString& help_string = wxEmptyString);
124 
125     void SetItemClientObject(wxRibbonButtonBarButtonBase* item, wxClientData* data);
126     wxClientData* GetItemClientObject(const wxRibbonButtonBarButtonBase* item) const;
127     void SetItemClientData(wxRibbonButtonBarButtonBase* item, void* data);
128     void* GetItemClientData(const wxRibbonButtonBarButtonBase* item) const;
129 
130     virtual size_t GetButtonCount() const;
131     virtual wxRibbonButtonBarButtonBase *GetItem(size_t n) const;
132     virtual wxRibbonButtonBarButtonBase *GetItemById(int id) const;
133     virtual int GetItemId(wxRibbonButtonBarButtonBase *button) const;
134 
135 
136     virtual bool Realize();
137     virtual void ClearButtons();
138     virtual bool DeleteButton(int button_id);
139     virtual void EnableButton(int button_id, bool enable = true);
140     virtual void ToggleButton(int button_id, bool checked);
141 
142     virtual wxRibbonButtonBarButtonBase *GetActiveItem() const;
143     virtual wxRibbonButtonBarButtonBase *GetHoveredItem() const;
144 
145     virtual void SetArtProvider(wxRibbonArtProvider* art);
146     virtual bool IsSizingContinuous() const;
147 
148     virtual wxSize GetMinSize() const;
149 
150     void SetShowToolTipsForDisabled(bool show);
151     bool GetShowToolTipsForDisabled() const;
152 
153 protected:
154     friend class wxRibbonButtonBarEvent;
155     virtual wxSize DoGetBestSize() const;
GetDefaultBorder()156     wxBorder GetDefaultBorder() const { return wxBORDER_NONE; }
157 
158     void OnEraseBackground(wxEraseEvent& evt);
159     void OnPaint(wxPaintEvent& evt);
160     void OnSize(wxSizeEvent& evt);
161     void OnMouseMove(wxMouseEvent& evt);
162     void OnMouseEnter(wxMouseEvent& evt);
163     void OnMouseLeave(wxMouseEvent& evt);
164     void OnMouseDown(wxMouseEvent& evt);
165     void OnMouseUp(wxMouseEvent& evt);
166 
167     virtual wxSize DoGetNextSmallerSize(wxOrientation direction,
168                                       wxSize relative_to) const;
169     virtual wxSize DoGetNextLargerSize(wxOrientation direction,
170                                      wxSize relative_to) const;
171 
172     void CommonInit(long style);
173     void MakeLayouts();
174     bool TryCollapseLayout(wxRibbonButtonBarLayout* original, size_t first_btn, size_t* last_button);
175     static wxBitmap MakeResizedBitmap(const wxBitmap& original, wxSize size);
176     static wxBitmap MakeDisabledBitmap(const wxBitmap& original);
177     void FetchButtonSizeInfo(wxRibbonButtonBarButtonBase* button,
178         wxRibbonButtonBarButtonState size, wxDC& dc);
179     virtual void UpdateWindowUI(long flags);
180 
181     wxArrayRibbonButtonBarLayout m_layouts;
182     wxArrayRibbonButtonBarButtonBase m_buttons;
183     wxRibbonButtonBarButtonInstance* m_hovered_button;
184     wxRibbonButtonBarButtonInstance* m_active_button;
185 
186     wxPoint m_layout_offset;
187     wxSize m_bitmap_size_large;
188     wxSize m_bitmap_size_small;
189     int m_current_layout;
190     bool m_layouts_valid;
191     bool m_lock_active_state;
192     bool m_show_tooltips_for_disabled;
193 
194 #ifndef SWIG
195     DECLARE_CLASS(wxRibbonButtonBar)
196     DECLARE_EVENT_TABLE()
197 #endif
198 };
199 
200 class WXDLLIMPEXP_RIBBON wxRibbonButtonBarEvent : public wxCommandEvent
201 {
202 public:
203     wxRibbonButtonBarEvent(wxEventType command_type = wxEVT_NULL,
204                        int win_id = 0,
205                        wxRibbonButtonBar* bar = NULL,
206                        wxRibbonButtonBarButtonBase* button = NULL)
wxCommandEvent(command_type,win_id)207         : wxCommandEvent(command_type, win_id)
208         , m_bar(bar), m_button(button)
209     {
210     }
211 #ifndef SWIG
wxRibbonButtonBarEvent(const wxRibbonButtonBarEvent & e)212     wxRibbonButtonBarEvent(const wxRibbonButtonBarEvent& e) : wxCommandEvent(e)
213     {
214         m_bar = e.m_bar;
215         m_button = e.m_button;
216     }
217 #endif
Clone()218     wxEvent *Clone() const { return new wxRibbonButtonBarEvent(*this); }
219 
GetBar()220     wxRibbonButtonBar* GetBar() {return m_bar;}
GetButton()221     wxRibbonButtonBarButtonBase *GetButton() { return m_button; }
SetBar(wxRibbonButtonBar * bar)222     void SetBar(wxRibbonButtonBar* bar) {m_bar = bar;}
SetButton(wxRibbonButtonBarButtonBase * button)223     void SetButton(wxRibbonButtonBarButtonBase* button) { m_button = button; }
224     bool PopupMenu(wxMenu* menu);
225 
226 protected:
227     wxRibbonButtonBar* m_bar;
228     wxRibbonButtonBarButtonBase *m_button;
229 
230 #ifndef SWIG
231 private:
232     DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxRibbonButtonBarEvent)
233 #endif
234 };
235 
236 #ifndef SWIG
237 
238 wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_RIBBON, wxEVT_RIBBONBUTTONBAR_CLICKED, wxRibbonButtonBarEvent);
239 wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_RIBBON, wxEVT_RIBBONBUTTONBAR_DROPDOWN_CLICKED, wxRibbonButtonBarEvent);
240 
241 typedef void (wxEvtHandler::*wxRibbonButtonBarEventFunction)(wxRibbonButtonBarEvent&);
242 
243 #define wxRibbonButtonBarEventHandler(func) \
244     wxEVENT_HANDLER_CAST(wxRibbonButtonBarEventFunction, func)
245 
246 #define EVT_RIBBONBUTTONBAR_CLICKED(winid, fn) \
247     wx__DECLARE_EVT1(wxEVT_RIBBONBUTTONBAR_CLICKED, winid, wxRibbonButtonBarEventHandler(fn))
248 #define EVT_RIBBONBUTTONBAR_DROPDOWN_CLICKED(winid, fn) \
249     wx__DECLARE_EVT1(wxEVT_RIBBONBUTTONBAR_DROPDOWN_CLICKED, winid, wxRibbonButtonBarEventHandler(fn))
250 #else
251 
252 // wxpython/swig event work
253 %constant wxEventType wxEVT_RIBBONBUTTONBAR_CLICKED;
254 %constant wxEventType wxEVT_RIBBONBUTTONBAR_DROPDOWN_CLICKED;
255 
256 %pythoncode {
257     EVT_RIBBONBUTTONBAR_CLICKED = wx.PyEventBinder( wxEVT_RIBBONBUTTONBAR_CLICKED, 1 )
258     EVT_RIBBONBUTTONBAR_DROPDOWN_CLICKED = wx.PyEventBinder( wxEVT_RIBBONBUTTONBAR_DROPDOWN_CLICKED, 1 )
259 }
260 #endif
261 
262 // old wxEVT_COMMAND_* constants
263 #define wxEVT_COMMAND_RIBBONBUTTON_CLICKED            wxEVT_RIBBONBUTTONBAR_CLICKED
264 #define wxEVT_COMMAND_RIBBONBUTTON_DROPDOWN_CLICKED   wxEVT_RIBBONBUTTONBAR_DROPDOWN_CLICKED
265 
266 #endif // wxUSE_RIBBON
267 
268 #endif // _WX_RIBBON_BUTTON_BAR_H_
269