| 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 | |
| 130 | virtual bool Realize(); |
| 131 | virtual void ClearButtons(); |
| 132 | virtual bool DeleteButton(int button_id); |
| 133 | virtual void EnableButton(int button_id, bool enable = true); |
| 134 | virtual void ToggleButton(int button_id, bool checked); |
| 135 | |
| 136 | virtual void SetArtProvider(wxRibbonArtProvider* art); |
| 137 | virtual bool IsSizingContinuous() const; |
| 138 | |
| 139 | virtual wxSize GetMinSize() const; |
| 140 | protected: |
| 141 | friend class wxRibbonButtonBarEvent; |
| 142 | virtual wxSize DoGetBestSize() const; |
| 143 | wxBorder GetDefaultBorder() const { return wxBORDER_NONE; } |
| 144 | |
| 145 | void OnEraseBackground(wxEraseEvent& evt); |
| 146 | void OnPaint(wxPaintEvent& evt); |
| 147 | void OnSize(wxSizeEvent& evt); |
| 148 | void OnMouseMove(wxMouseEvent& evt); |
| 149 | void OnMouseEnter(wxMouseEvent& evt); |
| 150 | void OnMouseLeave(wxMouseEvent& evt); |
| 151 | void OnMouseDown(wxMouseEvent& evt); |
| 152 | void OnMouseUp(wxMouseEvent& evt); |
| 153 | |
| 154 | virtual wxSize DoGetNextSmallerSize(wxOrientation direction, |
| 155 | wxSize relative_to) const; |
| 156 | virtual wxSize DoGetNextLargerSize(wxOrientation direction, |
| 157 | wxSize relative_to) const; |
| 158 | |
| 159 | void CommonInit(long style); |
| 160 | void MakeLayouts(); |
| 161 | bool TryCollapseLayout(wxRibbonButtonBarLayout* original, size_t first_btn, size_t* last_button); |
| 162 | static wxBitmap MakeResizedBitmap(const wxBitmap& original, wxSize size); |
| 163 | static wxBitmap MakeDisabledBitmap(const wxBitmap& original); |
| 164 | void FetchButtonSizeInfo(wxRibbonButtonBarButtonBase* button, |
| 165 | wxRibbonButtonBarButtonState size, wxDC& dc); |
| 166 | virtual void UpdateWindowUI(long flags); |
| 167 | |
| 168 | wxArrayRibbonButtonBarLayout m_layouts; |
| 169 | wxArrayRibbonButtonBarButtonBase m_buttons; |
| 170 | wxRibbonButtonBarButtonInstance* m_hovered_button; |
| 171 | wxRibbonButtonBarButtonInstance* m_active_button; |
| 172 | |
| 173 | wxPoint m_layout_offset; |
| 174 | wxSize m_bitmap_size_large; |
| 175 | wxSize m_bitmap_size_small; |
| 176 | int m_current_layout; |
| 177 | bool m_layouts_valid; |
| 178 | bool m_lock_active_state; |
| 179 | |
| 180 | #ifndef SWIG |
| 181 | DECLARE_CLASS(wxRibbonButtonBar) |
| 182 | DECLARE_EVENT_TABLE() |
| 183 | #endif |
| 184 | }; |
| 185 | |
| 186 | class WXDLLIMPEXP_RIBBON wxRibbonButtonBarEvent : public wxCommandEvent |
| 187 | { |
| 188 | public: |
| 189 | wxRibbonButtonBarEvent(wxEventType command_type = wxEVT_NULL, |
| 190 | int win_id = 0, |
| 191 | wxRibbonButtonBar* bar = NULL) |
| 192 | : wxCommandEvent(command_type, win_id) |
| 193 | , m_bar(bar) |
| 194 | { |
| 195 | } |
| 196 | #ifndef SWIG |
| 197 | wxRibbonButtonBarEvent(const wxRibbonButtonBarEvent& e) : wxCommandEvent(e) |
| 198 | { |
| 199 | m_bar = e.m_bar; |
| 200 | } |
| 201 | #endif |
| 202 | wxEvent *Clone() const { return new wxRibbonButtonBarEvent(*this); } |
| 203 | |
| 204 | wxRibbonButtonBar* GetBar() {return m_bar;} |
| 205 | void SetBar(wxRibbonButtonBar* bar) {m_bar = bar;} |
| 206 | bool PopupMenu(wxMenu* menu); |
| 207 | |
| 208 | protected: |
| 209 | wxRibbonButtonBar* m_bar; |
| 210 | |
| 211 | #ifndef SWIG |
| 212 | private: |
| 213 | DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxRibbonButtonBarEvent) |
| 214 | #endif |
| 215 | }; |
| 216 | |
| 217 | #ifndef SWIG |
| 218 | |
| 219 | wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_RIBBON, wxEVT_COMMAND_RIBBONBUTTON_CLICKED, wxRibbonButtonBarEvent); |
| 220 | wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_RIBBON, wxEVT_COMMAND_RIBBONBUTTON_DROPDOWN_CLICKED, wxRibbonButtonBarEvent); |
| 221 | |
| 222 | typedef void (wxEvtHandler::*wxRibbonButtonBarEventFunction)(wxRibbonButtonBarEvent&); |
| 223 | |
| 224 | #define wxRibbonButtonBarEventHandler(func) \ |
| 225 | wxEVENT_HANDLER_CAST(wxRibbonButtonBarEventFunction, func) |
| 226 | |
| 227 | #define EVT_RIBBONBUTTONBAR_CLICKED(winid, fn) \ |
| 228 | wx__DECLARE_EVT1(wxEVT_COMMAND_RIBBONBUTTON_CLICKED, winid, wxRibbonButtonBarEventHandler(fn)) |
| 229 | #define EVT_RIBBONBUTTONBAR_DROPDOWN_CLICKED(winid, fn) \ |
| 230 | wx__DECLARE_EVT1(wxEVT_COMMAND_RIBBONBUTTON_DROPDOWN_CLICKED, winid, wxRibbonButtonBarEventHandler(fn)) |
| 231 | #else |
| 232 | |
| 233 | // wxpython/swig event work |
| 234 | %constant wxEventType wxEVT_COMMAND_RIBBONBUTTON_CLICKED; |
| 235 | %constant wxEventType wxEVT_COMMAND_RIBBONBUTTON_DROPDOWN_CLICKED; |
| 236 | |
| 237 | %pythoncode { |
| 238 | EVT_RIBBONBUTTONBAR_CLICKED = wx.PyEventBinder( wxEVT_COMMAND_RIBBONBUTTON_CLICKED, 1 ) |
| 239 | EVT_RIBBONBUTTONBAR_DROPDOWN_CLICKED = wx.PyEventBinder( wxEVT_COMMAND_RIBBONBUTTON_DROPDOWN_CLICKED, 1 ) |
| 240 | } |
| 241 | #endif |
| 242 | |
| 243 | #endif // wxUSE_RIBBON |
| 244 | |
| 245 | #endif // _WX_RIBBON_BUTTON_BAR_H_ |