wxSize size;
};
-wxDEFINE_EVENT(wxEVT_COMMAND_RIBBONTOOL_CLICKED, wxRibbonToolBarEvent);
-wxDEFINE_EVENT(wxEVT_COMMAND_RIBBONTOOL_DROPDOWN_CLICKED, wxRibbonToolBarEvent);
+wxDEFINE_EVENT(wxEVT_RIBBONTOOLBAR_CLICKED, wxRibbonToolBarEvent);
+wxDEFINE_EVENT(wxEVT_RIBBONTOOLBAR_DROPDOWN_CLICKED, wxRibbonToolBarEvent);
IMPLEMENT_DYNAMIC_CLASS(wxRibbonToolBarEvent, wxCommandEvent)
IMPLEMENT_CLASS(wxRibbonToolBar, wxRibbonControl)
wxSize* row_sizes = new wxSize[m_nrows_max];
wxOrientation major_axis = m_art->GetFlags() & wxRIBBON_BAR_FLOW_VERTICAL ?
wxVERTICAL : wxHORIZONTAL;
+
SetMinSize(wxSize(0, 0));
+ wxSize minSize(INT_MAX, INT_MAX);
+
+ // See if we're sizing flexibly (i.e. wrapping), and set min size differently
+ bool sizingFlexibly = false;
+ wxRibbonPanel* panel = wxDynamicCast(GetParent(), wxRibbonPanel);
+ if (panel && (panel->GetFlags() & wxRIBBON_PANEL_FLEXIBLE))
+ sizingFlexibly = true;
+
+ // Without this, there will be redundant horizontal space because SetMinSize will
+ // use the smallest possible height (and therefore largest width).
+ if (sizingFlexibly)
+ major_axis = wxHORIZONTAL;
+
for(nrows = m_nrows_min; nrows <= m_nrows_max; ++nrows)
{
for(r = 0; r < nrows; ++r)
size.IncBy(0, row_sizes[r].y);
}
m_sizes[nrows - m_nrows_min] = size;
+
if(GetSizeInOrientation(size, major_axis) < smallest_area)
{
- SetMinSize(size);
smallest_area = GetSizeInOrientation(size, major_axis);
+ SetMinSize(size);
+ }
+
+ if (sizingFlexibly)
+ {
+ if (size.x < minSize.x)
+ minSize.x = size.x;
+ if (size.y < minSize.y)
+ minSize.y = size.y;
}
}
+
+ if (sizingFlexibly)
+ {
+ // Give it the min size in either direction regardless of row,
+ // so that we're able to vary the size of the panel according to
+ // the space the toolbar takes up.
+ SetMinSize(minSize);
+ }
delete[] row_sizes;
// Position the groups
int row_count = m_nrows_max;
wxOrientation major_axis = m_art->GetFlags() & wxRIBBON_BAR_FLOW_VERTICAL ?
wxVERTICAL : wxHORIZONTAL;
+
+ // See if we're sizing flexibly, and set min size differently
+ bool sizingFlexibly = false;
+ wxRibbonPanel* panel = wxDynamicCast(GetParent(), wxRibbonPanel);
+ if (panel && (panel->GetFlags() & wxRIBBON_PANEL_FLEXIBLE))
+ sizingFlexibly = true;
+
+ // Without this, there will be redundant horizontal space because SetMinSize will
+ // use the smallest possible height (and therefore largest width).
+ if (sizingFlexibly)
+ major_axis = wxHORIZONTAL;
+
+ wxSize bestSize = m_sizes[0];
+
if(m_nrows_max != m_nrows_min)
{
int area = 0;
{
area = GetSizeInOrientation(m_sizes[i], major_axis);
row_count = m_nrows_min + i;
+ bestSize = m_sizes[i];
}
}
}
delete[] row_sizes;
}
+// Finds the best width and height given the parents' width and height
+wxSize wxRibbonToolBar::GetBestSizeForParentSize(const wxSize& parentSize) const
+{
+ if (!m_sizes)
+ return GetMinSize();
+
+ // Choose row count with largest possible area
+ wxSize size = parentSize;
+
+ // A toolbar should maximize its width whether vertical or horizontal, so
+ // force the major axis to be horizontal. Without this, there will be
+ // redundant horizontal space.
+ wxOrientation major_axis = wxHORIZONTAL;
+ wxSize bestSize = m_sizes[0];
+
+ if(m_nrows_max != m_nrows_min)
+ {
+ int area = 0;
+ for(int i = 0; i <= m_nrows_max - m_nrows_min; ++i)
+ {
+ if(m_sizes[i].x <= size.x && m_sizes[i].y <= size.y &&
+ GetSizeInOrientation(m_sizes[i], major_axis) > area)
+ {
+ area = GetSizeInOrientation(m_sizes[i], major_axis);
+ bestSize = m_sizes[i];
+ }
+ }
+ }
+ return bestSize;
+}
+
wxSize wxRibbonToolBar::DoGetBestSize() const
{
return GetMinSize();
{
if(m_active_tool->state & wxRIBBON_TOOLBAR_TOOL_ACTIVE_MASK)
{
- wxEventType evt_type = wxEVT_COMMAND_RIBBONTOOL_CLICKED;
+ wxEventType evt_type = wxEVT_RIBBONTOOLBAR_CLICKED;
if(m_active_tool->state & wxRIBBON_TOOLBAR_TOOL_DROPDOWN_ACTIVE)
- evt_type = wxEVT_COMMAND_RIBBONTOOL_DROPDOWN_CLICKED;
+ evt_type = wxEVT_RIBBONTOOLBAR_DROPDOWN_CLICKED;
wxRibbonToolBarEvent notification(evt_type, m_active_tool->id);
if(m_active_tool->kind == wxRIBBON_BUTTON_TOGGLE)
{
notification.SetEventObject(this);
notification.SetBar(this);
ProcessEvent(notification);
+
+ wxStaticCast(m_parent, wxRibbonPanel)->HideIfExpanded();
}
// Notice that m_active_tool could have been reset by the event handler