1 ///////////////////////////////////////////////////////////////////////////////
2 // Name: src/ribbon/gallery.cpp
3 // Purpose: Ribbon control which displays a gallery of items to choose from
4 // Author: Peter Cawley
8 // Copyright: (C) Peter Cawley
9 // Licence: wxWindows licence
10 ///////////////////////////////////////////////////////////////////////////////
12 #include "wx/wxprec.h"
18 #include "wx/ribbon/gallery.h"
22 #include "wx/ribbon/art.h"
23 #include "wx/ribbon/bar.h"
24 #include "wx/dcbuffer.h"
25 #include "wx/clntdata.h"
31 #include "wx/msw/private.h"
34 wxDEFINE_EVENT(wxEVT_COMMAND_RIBBONGALLERY_HOVER_CHANGED
, wxRibbonGalleryEvent
);
35 wxDEFINE_EVENT(wxEVT_COMMAND_RIBBONGALLERY_SELECTED
, wxRibbonGalleryEvent
);
37 IMPLEMENT_DYNAMIC_CLASS(wxRibbonGalleryEvent
, wxCommandEvent
)
38 IMPLEMENT_CLASS(wxRibbonGallery
, wxRibbonControl
)
40 class wxRibbonGalleryItem
49 void SetId(int id
) {m_id
= id
;}
50 void SetBitmap(const wxBitmap
& bitmap
) {m_bitmap
= bitmap
;}
51 const wxBitmap
& GetBitmap() const {return m_bitmap
;}
52 void SetIsVisible(bool visible
) {m_is_visible
= visible
;}
53 void SetPosition(int x
, int y
, const wxSize
& size
)
55 m_position
= wxRect(wxPoint(x
, y
), size
);
57 bool IsVisible() const {return m_is_visible
;}
58 const wxRect
& GetPosition() const {return m_position
;}
60 void SetClientObject(wxClientData
*data
) {m_client_data
.SetClientObject(data
);}
61 wxClientData
*GetClientObject() const {return m_client_data
.GetClientObject();}
62 void SetClientData(void *data
) {m_client_data
.SetClientData(data
);}
63 void *GetClientData() const {return m_client_data
.GetClientData();}
67 wxClientDataContainer m_client_data
;
73 BEGIN_EVENT_TABLE(wxRibbonGallery
, wxRibbonControl
)
74 EVT_ENTER_WINDOW(wxRibbonGallery::OnMouseEnter
)
75 EVT_ERASE_BACKGROUND(wxRibbonGallery::OnEraseBackground
)
76 EVT_LEAVE_WINDOW(wxRibbonGallery::OnMouseLeave
)
77 EVT_LEFT_DOWN(wxRibbonGallery::OnMouseDown
)
78 EVT_LEFT_UP(wxRibbonGallery::OnMouseUp
)
79 EVT_MOTION(wxRibbonGallery::OnMouseMove
)
80 EVT_PAINT(wxRibbonGallery::OnPaint
)
81 EVT_SIZE(wxRibbonGallery::OnSize
)
84 wxRibbonGallery::wxRibbonGallery()
88 wxRibbonGallery::wxRibbonGallery(wxWindow
* parent
,
93 : wxRibbonControl(parent
, id
, pos
, size
, wxBORDER_NONE
)
98 wxRibbonGallery::~wxRibbonGallery()
103 bool wxRibbonGallery::Create(wxWindow
* parent
,
109 if(!wxRibbonControl::Create(parent
, id
, pos
, size
, wxBORDER_NONE
))
118 void wxRibbonGallery::CommonInit(long WXUNUSED(style
))
120 m_selected_item
= NULL
;
121 m_hovered_item
= NULL
;
122 m_active_item
= NULL
;
123 m_scroll_up_button_rect
= wxRect(0, 0, 0, 0);
124 m_scroll_down_button_rect
= wxRect(0, 0, 0, 0);
125 m_extension_button_rect
= wxRect(0, 0, 0, 0);
126 m_mouse_active_rect
= NULL
;
127 m_bitmap_size
= wxSize(64, 32);
128 m_bitmap_padded_size
= m_bitmap_size
;
129 m_item_separation_x
= 0;
130 m_item_separation_y
= 0;
133 m_up_button_state
= wxRIBBON_GALLERY_BUTTON_DISABLED
;
134 m_down_button_state
= wxRIBBON_GALLERY_BUTTON_NORMAL
;
135 m_extension_button_state
= wxRIBBON_GALLERY_BUTTON_NORMAL
;
138 SetBackgroundStyle(wxBG_STYLE_CUSTOM
);
141 void wxRibbonGallery::OnMouseEnter(wxMouseEvent
& evt
)
144 if(m_mouse_active_rect
!= NULL
&& !evt
.LeftIsDown())
146 m_mouse_active_rect
= NULL
;
147 m_active_item
= NULL
;
152 void wxRibbonGallery::OnMouseMove(wxMouseEvent
& evt
)
154 bool refresh
= false;
155 wxPoint pos
= evt
.GetPosition();
157 if(TestButtonHover(m_scroll_up_button_rect
, pos
, &m_up_button_state
))
159 if(TestButtonHover(m_scroll_down_button_rect
, pos
, &m_down_button_state
))
161 if(TestButtonHover(m_extension_button_rect
, pos
, &m_extension_button_state
))
164 wxRibbonGalleryItem
*hovered_item
= NULL
;
165 wxRibbonGalleryItem
*active_item
= NULL
;
166 if(m_client_rect
.Contains(pos
))
168 if(m_art
&& m_art
->GetFlags() & wxRIBBON_BAR_FLOW_VERTICAL
)
169 pos
.x
+= m_scroll_amount
;
171 pos
.y
+= m_scroll_amount
;
173 size_t item_count
= m_items
.Count();
175 for(item_i
= 0; item_i
< item_count
; ++item_i
)
177 wxRibbonGalleryItem
*item
= m_items
.Item(item_i
);
178 if(!item
->IsVisible())
181 if(item
->GetPosition().Contains(pos
))
183 if(m_mouse_active_rect
== &item
->GetPosition())
190 if(active_item
!= m_active_item
)
192 m_active_item
= active_item
;
195 if(hovered_item
!= m_hovered_item
)
197 m_hovered_item
= hovered_item
;
198 wxRibbonGalleryEvent
notification(
199 wxEVT_COMMAND_RIBBONGALLERY_HOVER_CHANGED
, GetId());
200 notification
.SetEventObject(this);
201 notification
.SetGallery(this);
202 notification
.SetGalleryItem(hovered_item
);
203 ProcessWindowEvent(notification
);
211 bool wxRibbonGallery::TestButtonHover(const wxRect
& rect
, wxPoint pos
,
212 wxRibbonGalleryButtonState
* state
)
214 if(*state
== wxRIBBON_GALLERY_BUTTON_DISABLED
)
217 wxRibbonGalleryButtonState new_state
;
218 if(rect
.Contains(pos
))
220 if(m_mouse_active_rect
== &rect
)
221 new_state
= wxRIBBON_GALLERY_BUTTON_ACTIVE
;
223 new_state
= wxRIBBON_GALLERY_BUTTON_HOVERED
;
226 new_state
= wxRIBBON_GALLERY_BUTTON_NORMAL
;
228 if(new_state
!= *state
)
239 void wxRibbonGallery::OnMouseLeave(wxMouseEvent
& WXUNUSED(evt
))
242 m_active_item
= NULL
;
243 if(m_up_button_state
!= wxRIBBON_GALLERY_BUTTON_DISABLED
)
244 m_up_button_state
= wxRIBBON_GALLERY_BUTTON_NORMAL
;
245 if(m_down_button_state
!= wxRIBBON_GALLERY_BUTTON_DISABLED
)
246 m_down_button_state
= wxRIBBON_GALLERY_BUTTON_NORMAL
;
247 if(m_extension_button_state
!= wxRIBBON_GALLERY_BUTTON_DISABLED
)
248 m_extension_button_state
= wxRIBBON_GALLERY_BUTTON_NORMAL
;
249 if(m_hovered_item
!= NULL
)
251 m_hovered_item
= NULL
;
252 wxRibbonGalleryEvent
notification(
253 wxEVT_COMMAND_RIBBONGALLERY_HOVER_CHANGED
, GetId());
254 notification
.SetEventObject(this);
255 notification
.SetGallery(this);
256 ProcessWindowEvent(notification
);
261 void wxRibbonGallery::OnMouseDown(wxMouseEvent
& evt
)
263 wxPoint pos
= evt
.GetPosition();
264 m_mouse_active_rect
= NULL
;
265 if(m_client_rect
.Contains(pos
))
267 if(m_art
&& m_art
->GetFlags() & wxRIBBON_BAR_FLOW_VERTICAL
)
268 pos
.x
+= m_scroll_amount
;
270 pos
.y
+= m_scroll_amount
;
271 size_t item_count
= m_items
.Count();
273 for(item_i
= 0; item_i
< item_count
; ++item_i
)
275 wxRibbonGalleryItem
*item
= m_items
.Item(item_i
);
276 if(!item
->IsVisible())
279 const wxRect
& rect
= item
->GetPosition();
280 if(rect
.Contains(pos
))
282 m_active_item
= item
;
283 m_mouse_active_rect
= &rect
;
288 else if(m_scroll_up_button_rect
.Contains(pos
))
290 if(m_up_button_state
!= wxRIBBON_GALLERY_BUTTON_DISABLED
)
292 m_mouse_active_rect
= &m_scroll_up_button_rect
;
293 m_up_button_state
= wxRIBBON_GALLERY_BUTTON_ACTIVE
;
296 else if(m_scroll_down_button_rect
.Contains(pos
))
298 if(m_down_button_state
!= wxRIBBON_GALLERY_BUTTON_DISABLED
)
300 m_mouse_active_rect
= &m_scroll_down_button_rect
;
301 m_down_button_state
= wxRIBBON_GALLERY_BUTTON_ACTIVE
;
304 else if(m_extension_button_rect
.Contains(pos
))
306 if(m_extension_button_state
!= wxRIBBON_GALLERY_BUTTON_DISABLED
)
308 m_mouse_active_rect
= &m_extension_button_rect
;
309 m_extension_button_state
= wxRIBBON_GALLERY_BUTTON_ACTIVE
;
312 if(m_mouse_active_rect
!= NULL
)
316 void wxRibbonGallery::OnMouseUp(wxMouseEvent
& evt
)
318 if(m_mouse_active_rect
!= NULL
)
320 wxPoint pos
= evt
.GetPosition();
323 if(m_art
&& m_art
->GetFlags() & wxRIBBON_BAR_FLOW_VERTICAL
)
324 pos
.x
+= m_scroll_amount
;
326 pos
.y
+= m_scroll_amount
;
328 if(m_mouse_active_rect
->Contains(pos
))
330 if(m_mouse_active_rect
== &m_scroll_up_button_rect
)
332 m_up_button_state
= wxRIBBON_GALLERY_BUTTON_HOVERED
;
335 else if(m_mouse_active_rect
== &m_scroll_down_button_rect
)
337 m_down_button_state
= wxRIBBON_GALLERY_BUTTON_HOVERED
;
340 else if(m_mouse_active_rect
== &m_extension_button_rect
)
342 m_extension_button_state
= wxRIBBON_GALLERY_BUTTON_HOVERED
;
343 wxCommandEvent
notification(wxEVT_COMMAND_BUTTON_CLICKED
,
345 notification
.SetEventObject(this);
346 ProcessWindowEvent(notification
);
348 else if(m_active_item
!= NULL
)
350 if(m_selected_item
!= m_active_item
)
352 m_selected_item
= m_active_item
;
353 wxRibbonGalleryEvent
notification(
354 wxEVT_COMMAND_RIBBONGALLERY_SELECTED
, GetId());
355 notification
.SetEventObject(this);
356 notification
.SetGallery(this);
357 notification
.SetGalleryItem(m_selected_item
);
358 ProcessWindowEvent(notification
);
362 m_mouse_active_rect
= NULL
;
363 m_active_item
= NULL
;
368 void wxRibbonGallery::SetItemClientObject(wxRibbonGalleryItem
* itm
,
371 itm
->SetClientObject(data
);
374 wxClientData
* wxRibbonGallery::GetItemClientObject(const wxRibbonGalleryItem
* itm
) const
376 return itm
->GetClientObject();
379 void wxRibbonGallery::SetItemClientData(wxRibbonGalleryItem
* itm
, void* data
)
381 itm
->SetClientData(data
);
384 void* wxRibbonGallery::GetItemClientData(const wxRibbonGalleryItem
* itm
) const
386 return itm
->GetClientData();
389 bool wxRibbonGallery::ScrollLines(int lines
)
391 if(m_scroll_limit
== 0 || m_art
== NULL
)
394 int line_size
= m_bitmap_padded_size
.GetHeight();
395 if(m_art
->GetFlags() & wxRIBBON_BAR_FLOW_VERTICAL
)
396 line_size
= m_bitmap_padded_size
.GetWidth();
399 if(m_scroll_amount
> 0)
401 m_scroll_amount
+= lines
* line_size
;
402 if(m_scroll_amount
<= 0)
405 m_up_button_state
= wxRIBBON_GALLERY_BUTTON_DISABLED
;
407 else if(m_up_button_state
== wxRIBBON_GALLERY_BUTTON_DISABLED
)
408 m_up_button_state
= wxRIBBON_GALLERY_BUTTON_NORMAL
;
409 if(m_down_button_state
== wxRIBBON_GALLERY_BUTTON_DISABLED
)
410 m_down_button_state
= wxRIBBON_GALLERY_BUTTON_NORMAL
;
416 if(m_scroll_amount
< m_scroll_limit
)
418 m_scroll_amount
+= lines
* line_size
;
419 if(m_scroll_amount
>= m_scroll_limit
)
421 m_scroll_amount
= m_scroll_limit
;
422 m_down_button_state
= wxRIBBON_GALLERY_BUTTON_DISABLED
;
424 else if(m_down_button_state
== wxRIBBON_GALLERY_BUTTON_DISABLED
)
425 m_down_button_state
= wxRIBBON_GALLERY_BUTTON_NORMAL
;
426 if(m_up_button_state
== wxRIBBON_GALLERY_BUTTON_DISABLED
)
427 m_up_button_state
= wxRIBBON_GALLERY_BUTTON_NORMAL
;
434 void wxRibbonGallery::EnsureVisible(const wxRibbonGalleryItem
* item
)
436 if(item
== NULL
|| !item
->IsVisible() || IsEmpty())
439 int y
= item
->GetPosition().GetTop();
440 int base_y
= m_items
.Item(0)->GetPosition().GetTop();
441 int delta
= y
- base_y
- m_scroll_amount
;
442 ScrollLines(delta
/ m_bitmap_padded_size
.GetHeight());
445 bool wxRibbonGallery::IsHovered() const
450 void wxRibbonGallery::OnEraseBackground(wxEraseEvent
& WXUNUSED(evt
))
452 // All painting done in main paint handler to minimise flicker
455 void wxRibbonGallery::OnPaint(wxPaintEvent
& WXUNUSED(evt
))
457 wxAutoBufferedPaintDC
dc(this);
461 m_art
->DrawGalleryBackground(dc
, this, GetSize());
463 int padding_top
= m_art
->GetMetric(wxRIBBON_ART_GALLERY_BITMAP_PADDING_TOP_SIZE
);
464 int padding_left
= m_art
->GetMetric(wxRIBBON_ART_GALLERY_BITMAP_PADDING_LEFT_SIZE
);
466 dc
.SetClippingRegion(m_client_rect
);
468 bool offset_vertical
= true;
469 if(m_art
->GetFlags() & wxRIBBON_BAR_FLOW_VERTICAL
)
470 offset_vertical
= false;
471 size_t item_count
= m_items
.Count();
473 for(item_i
= 0; item_i
< item_count
; ++item_i
)
475 wxRibbonGalleryItem
*item
= m_items
.Item(item_i
);
476 if(!item
->IsVisible())
479 const wxRect
& pos
= item
->GetPosition();
480 wxRect
offset_pos(pos
);
482 offset_pos
.SetTop(offset_pos
.GetTop() - m_scroll_amount
);
484 offset_pos
.SetLeft(offset_pos
.GetLeft() - m_scroll_amount
);
485 m_art
->DrawGalleryItemBackground(dc
, this, offset_pos
, item
);
486 dc
.DrawBitmap(item
->GetBitmap(), offset_pos
.GetLeft() + padding_left
,
487 offset_pos
.GetTop() + padding_top
);
491 void wxRibbonGallery::OnSize(wxSizeEvent
& WXUNUSED(evt
))
496 wxRibbonGalleryItem
* wxRibbonGallery::Append(const wxBitmap
& bitmap
, int id
)
498 wxASSERT(bitmap
.IsOk());
499 if(m_items
.IsEmpty())
501 m_bitmap_size
= bitmap
.GetSize();
506 wxASSERT(bitmap
.GetSize() == m_bitmap_size
);
509 wxRibbonGalleryItem
*item
= new wxRibbonGalleryItem
;
511 item
->SetBitmap(bitmap
);
516 wxRibbonGalleryItem
* wxRibbonGallery::Append(const wxBitmap
& bitmap
, int id
,
519 wxRibbonGalleryItem
*item
= Append(bitmap
, id
);
520 item
->SetClientData(clientData
);
524 wxRibbonGalleryItem
* wxRibbonGallery::Append(const wxBitmap
& bitmap
, int id
,
525 wxClientData
* clientData
)
527 wxRibbonGalleryItem
*item
= Append(bitmap
, id
);
528 item
->SetClientObject(clientData
);
532 void wxRibbonGallery::Clear()
534 size_t item_count
= m_items
.Count();
536 for(item_i
= 0; item_i
< item_count
; ++item_i
)
538 wxRibbonGalleryItem
*item
= m_items
.Item(item_i
);
544 bool wxRibbonGallery::IsSizingContinuous() const
549 void wxRibbonGallery::CalculateMinSize()
551 if(m_art
== NULL
|| !m_bitmap_size
.IsFullySpecified())
553 SetMinSize(wxSize(20, 20));
557 m_bitmap_padded_size
= m_bitmap_size
;
558 m_bitmap_padded_size
.IncBy(
559 m_art
->GetMetric(wxRIBBON_ART_GALLERY_BITMAP_PADDING_LEFT_SIZE
) +
560 m_art
->GetMetric(wxRIBBON_ART_GALLERY_BITMAP_PADDING_RIGHT_SIZE
),
561 m_art
->GetMetric(wxRIBBON_ART_GALLERY_BITMAP_PADDING_TOP_SIZE
) +
562 m_art
->GetMetric(wxRIBBON_ART_GALLERY_BITMAP_PADDING_BOTTOM_SIZE
));
565 SetMinSize(m_art
->GetGallerySize(dc
, this, m_bitmap_padded_size
));
567 // The best size is displaying several items
568 m_best_size
= m_bitmap_padded_size
;
570 m_best_size
= m_art
->GetGallerySize(dc
, this, m_best_size
);
574 bool wxRibbonGallery::Realize()
580 bool wxRibbonGallery::Layout()
587 wxSize client_size
= m_art
->GetGalleryClientSize(dc
, this, GetSize(),
588 &origin
, &m_scroll_up_button_rect
, &m_scroll_down_button_rect
,
589 &m_extension_button_rect
);
590 m_client_rect
= wxRect(origin
, client_size
);
595 size_t item_count
= m_items
.Count();
597 long art_flags
= m_art
->GetFlags();
598 for(item_i
= 0; item_i
< item_count
; ++item_i
)
600 wxRibbonGalleryItem
*item
= m_items
.Item(item_i
);
601 item
->SetIsVisible(true);
602 if(art_flags
& wxRIBBON_BAR_FLOW_VERTICAL
)
604 if(y_cursor
+ m_bitmap_padded_size
.y
> client_size
.GetHeight())
609 x_cursor
+= m_bitmap_padded_size
.x
;
611 item
->SetPosition(origin
.x
+ x_cursor
, origin
.y
+ y_cursor
,
612 m_bitmap_padded_size
);
613 y_cursor
+= m_bitmap_padded_size
.y
;
617 if(x_cursor
+ m_bitmap_padded_size
.x
> client_size
.GetWidth())
622 y_cursor
+= m_bitmap_padded_size
.y
;
624 item
->SetPosition(origin
.x
+ x_cursor
, origin
.y
+ y_cursor
,
625 m_bitmap_padded_size
);
626 x_cursor
+= m_bitmap_padded_size
.x
;
629 for(; item_i
< item_count
; ++item_i
)
631 wxRibbonGalleryItem
*item
= m_items
.Item(item_i
);
632 item
->SetIsVisible(false);
634 if(art_flags
& wxRIBBON_BAR_FLOW_VERTICAL
)
635 m_scroll_limit
= x_cursor
;
637 m_scroll_limit
= y_cursor
;
638 if(m_scroll_amount
>= m_scroll_limit
)
640 m_scroll_amount
= m_scroll_limit
;
641 m_down_button_state
= wxRIBBON_GALLERY_BUTTON_DISABLED
;
643 else if(m_down_button_state
== wxRIBBON_GALLERY_BUTTON_DISABLED
)
644 m_down_button_state
= wxRIBBON_GALLERY_BUTTON_NORMAL
;
646 if(m_scroll_amount
<= 0)
649 m_up_button_state
= wxRIBBON_GALLERY_BUTTON_DISABLED
;
651 else if(m_up_button_state
== wxRIBBON_GALLERY_BUTTON_DISABLED
)
652 m_up_button_state
= wxRIBBON_GALLERY_BUTTON_NORMAL
;
657 wxSize
wxRibbonGallery::DoGetBestSize() const
662 wxSize
wxRibbonGallery::DoGetNextSmallerSize(wxOrientation direction
,
663 wxSize relative_to
) const
670 wxSize client
= m_art
->GetGalleryClientSize(dc
, this, relative_to
, NULL
,
684 if(client
.GetWidth() < 0 || client
.GetHeight() < 0)
687 client
.x
= (client
.x
/ m_bitmap_padded_size
.x
) * m_bitmap_padded_size
.x
;
688 client
.y
= (client
.y
/ m_bitmap_padded_size
.y
) * m_bitmap_padded_size
.y
;
690 wxSize size
= m_art
->GetGallerySize(dc
, this, client
);
691 wxSize minimum
= GetMinSize();
693 if(size
.GetWidth() < minimum
.GetWidth() ||
694 size
.GetHeight() < minimum
.GetHeight())
702 size
.SetHeight(relative_to
.GetHeight());
705 size
.SetWidth(relative_to
.GetWidth());
714 wxSize
wxRibbonGallery::DoGetNextLargerSize(wxOrientation direction
,
715 wxSize relative_to
) const
722 wxSize client
= m_art
->GetGalleryClientSize(dc
, this, relative_to
, NULL
,
725 // No need to grow if the given size can already display every item
726 int nitems
= (client
.GetWidth() / m_bitmap_padded_size
.x
) *
727 (client
.GetHeight() / m_bitmap_padded_size
.y
);
728 if(nitems
>= (int)m_items
.GetCount())
734 client
.IncBy(m_bitmap_padded_size
.x
, 0);
737 client
.IncBy(0, m_bitmap_padded_size
.y
);
740 client
.IncBy(m_bitmap_padded_size
);
744 client
.x
= (client
.x
/ m_bitmap_padded_size
.x
) * m_bitmap_padded_size
.x
;
745 client
.y
= (client
.y
/ m_bitmap_padded_size
.y
) * m_bitmap_padded_size
.y
;
747 wxSize size
= m_art
->GetGallerySize(dc
, this, client
);
748 wxSize minimum
= GetMinSize();
750 if(size
.GetWidth() < minimum
.GetWidth() ||
751 size
.GetHeight() < minimum
.GetHeight())
759 size
.SetHeight(relative_to
.GetHeight());
762 size
.SetWidth(relative_to
.GetWidth());
771 bool wxRibbonGallery::IsEmpty() const
773 return m_items
.IsEmpty();
776 unsigned int wxRibbonGallery::GetCount() const
778 return (unsigned int)m_items
.GetCount();
781 wxRibbonGalleryItem
* wxRibbonGallery::GetItem(unsigned int n
)
785 return m_items
.Item(n
);
788 void wxRibbonGallery::SetSelection(wxRibbonGalleryItem
* item
)
790 if(item
!= m_selected_item
)
792 m_selected_item
= item
;
797 wxRibbonGalleryItem
* wxRibbonGallery::GetSelection() const
799 return m_selected_item
;
802 wxRibbonGalleryItem
* wxRibbonGallery::GetHoveredItem() const
804 return m_hovered_item
;
807 wxRibbonGalleryItem
* wxRibbonGallery::GetActiveItem() const
809 return m_active_item
;
812 wxRibbonGalleryButtonState
wxRibbonGallery::GetUpButtonState() const
814 return m_up_button_state
;
817 wxRibbonGalleryButtonState
wxRibbonGallery::GetDownButtonState() const
819 return m_down_button_state
;
822 wxRibbonGalleryButtonState
wxRibbonGallery::GetExtensionButtonState() const
824 return m_extension_button_state
;
827 #endif // wxUSE_RIBBON