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