]> git.saurik.com Git - wxWidgets.git/blobdiff - src/ribbon/buttonbar.cpp
Merge in from trunk r64802 - r68625
[wxWidgets.git] / src / ribbon / buttonbar.cpp
index 3de8011a5c4c20a4b1f6ce155a31caa3641835f3..a1404abbb8d2450e98966d27ca66be7b46ebaa49 100644 (file)
     #pragma hdrstop
 #endif
 
-#include "wx/ribbon/buttonbar.h"
-
 #if wxUSE_RIBBON
 
+#include "wx/ribbon/buttonbar.h"
 #include "wx/ribbon/art.h"
 #include "wx/dcbuffer.h"
 
@@ -125,7 +124,7 @@ public:
 
 WX_DECLARE_OBJARRAY(wxRibbonButtonBarButtonInstance, wxArrayRibbonButtonBarButtonInstance);
 #include "wx/arrimpl.cpp"
-WX_DEFINE_OBJARRAY(wxArrayRibbonButtonBarButtonInstance);
+WX_DEFINE_OBJARRAY(wxArrayRibbonButtonBarButtonInstance)
 
 class wxRibbonButtonBarLayout
 {
@@ -179,6 +178,7 @@ public:
 wxRibbonButtonBar::wxRibbonButtonBar()
 {
     m_layouts_valid = false;
+    CommonInit (0);
 }
 
 wxRibbonButtonBar::wxRibbonButtonBar(wxWindow* parent,
@@ -249,6 +249,16 @@ wxRibbonButtonBarButtonBase* wxRibbonButtonBar::AddDropdownButton(
         wxRIBBON_BUTTON_DROPDOWN);
 }
 
+wxRibbonButtonBarButtonBase* wxRibbonButtonBar::AddToggleButton(
+                int button_id,
+                const wxString& label,
+                const wxBitmap& bitmap,
+                const wxString& help_string)
+{
+    return AddButton(button_id, label, bitmap, help_string,
+        wxRIBBON_BUTTON_TOGGLE);
+}
+
 wxRibbonButtonBarButtonBase* wxRibbonButtonBar::AddHybridButton(
                 int button_id,
                 const wxString& label,
@@ -258,7 +268,7 @@ wxRibbonButtonBarButtonBase* wxRibbonButtonBar::AddHybridButton(
     return AddButton(button_id, label, bitmap, help_string,
         wxRIBBON_BUTTON_HYBRID);
 }
-    
+
 wxRibbonButtonBarButtonBase* wxRibbonButtonBar::AddButton(
                 int button_id,
                 const wxString& label,
@@ -445,6 +455,36 @@ void wxRibbonButtonBar::EnableButton(int button_id, bool enable)
     }
 }
 
+void wxRibbonButtonBar::ToggleButton(int button_id, bool checked)
+{
+    size_t count = m_buttons.GetCount();
+    size_t i;
+    for(i = 0; i < count; ++i)
+    {
+        wxRibbonButtonBarButtonBase* button = m_buttons.Item(i);
+        if(button->id == button_id)
+        {
+            if(checked)
+            {
+                if((button->state & wxRIBBON_BUTTONBAR_BUTTON_TOGGLED) == 0)
+                {
+                    button->state |= wxRIBBON_BUTTONBAR_BUTTON_TOGGLED;
+                    Refresh();
+                }
+            }
+            else
+            {
+                if(button->state & wxRIBBON_BUTTONBAR_BUTTON_TOGGLED)
+                {
+                    button->state &= ~wxRIBBON_BUTTONBAR_BUTTON_TOGGLED;
+                    Refresh();
+                }
+            }
+            return;
+        }
+    }
+}
+
 void wxRibbonButtonBar::SetArtProvider(wxRibbonArtProvider* art)
 {
     if(art == m_art)
@@ -585,7 +625,7 @@ void wxRibbonButtonBar::OnPaint(wxPaintEvent& WXUNUSED(evt))
             bitmap_small = &base->bitmap_small_disabled;
         }
         wxRect rect(button.position + m_layout_offset, base->sizes[button.size].size);
-        
+
         m_art->DrawButtonBarButton(dc, this, rect, base->kind,
             base->state | button.size, base->label, *bitmap, *bitmap_small);
     }
@@ -627,7 +667,7 @@ void wxRibbonButtonBar::CommonInit(long WXUNUSED(style))
     m_lock_active_state = false;
 
     SetBackgroundStyle(wxBG_STYLE_CUSTOM);
-};
+}
 
 wxSize wxRibbonButtonBar::GetMinSize() const
 {
@@ -787,7 +827,7 @@ bool wxRibbonButtonBar::TryCollapseLayout(wxRibbonButtonBarLayout* original,
         layout->overall_size.GetHeight() > original->overall_size.GetHeight())
     {
         delete layout;
-        wxASSERT_MSG(false, wxT("Layout collapse resulted in increased size"));
+        wxFAIL_MSG("Layout collapse resulted in increased size");
         return false;
     }
 
@@ -936,6 +976,13 @@ void wxRibbonButtonBar::OnMouseUp(wxMouseEvent& evt)
                 else
                     break;
                 wxRibbonButtonBarEvent notification(event_type, id);
+                if(m_active_button->base->kind == wxRIBBON_BUTTON_TOGGLE)
+                {
+                    m_active_button->base->state ^=
+                        wxRIBBON_BUTTONBAR_BUTTON_TOGGLED;
+                    notification.SetInt(m_active_button->base->state &
+                        wxRIBBON_BUTTONBAR_BUTTON_TOGGLED);
+                }
                 notification.SetEventObject(this);
                 notification.SetBar(this);
                 m_lock_active_state = true;