]> git.saurik.com Git - wxWidgets.git/blobdiff - src/aui/auibar.cpp
Fix VC++ compile error
[wxWidgets.git] / src / aui / auibar.cpp
index 9713a69eff6eaedba8568086243474d846e6ac60..e33ce817a091db98f4ed597a8fd7d3e8771135be 100644 (file)
@@ -5,7 +5,7 @@
 // Author:      Benjamin I. Williams
 // Modified by:
 // Created:     2005-05-17
-// RCS-ID:      $Id: dockart.cpp 48848 2007-09-21 10:19:53Z SC $
+// RCS-ID:      $Id$
 // Copyright:   (C) Copyright 2005-2006, Kirix Corporation, All Rights Reserved
 // Licence:     wxWindows Library Licence, Version 3.1
 ///////////////////////////////////////////////////////////////////////////////
 WX_DEFINE_OBJARRAY(wxAuiToolBarItemArray)
 
 
-DEFINE_EVENT_TYPE(wxEVT_COMMAND_AUITOOLBAR_TOOL_DROPDOWN)
-DEFINE_EVENT_TYPE(wxEVT_COMMAND_AUITOOLBAR_OVERFLOW_CLICK)
-DEFINE_EVENT_TYPE(wxEVT_COMMAND_AUITOOLBAR_RIGHT_CLICK)
-DEFINE_EVENT_TYPE(wxEVT_COMMAND_AUITOOLBAR_MIDDLE_CLICK)
-DEFINE_EVENT_TYPE(wxEVT_COMMAND_AUITOOLBAR_BEGIN_DRAG)
+wxDEFINE_EVENT( wxEVT_COMMAND_AUITOOLBAR_TOOL_DROPDOWN, wxAuiToolBarEvent );
+wxDEFINE_EVENT( wxEVT_COMMAND_AUITOOLBAR_OVERFLOW_CLICK, wxAuiToolBarEvent );
+wxDEFINE_EVENT( wxEVT_COMMAND_AUITOOLBAR_RIGHT_CLICK, wxAuiToolBarEvent );
+wxDEFINE_EVENT( wxEVT_COMMAND_AUITOOLBAR_MIDDLE_CLICK, wxAuiToolBarEvent );
+wxDEFINE_EVENT( wxEVT_COMMAND_AUITOOLBAR_BEGIN_DRAG, wxAuiToolBarEvent );
 
 
 IMPLEMENT_CLASS(wxAuiToolBar, wxControl)
@@ -185,8 +185,8 @@ wxAuiDefaultToolBarArt::wxAuiDefaultToolBarArt()
     m_gripper_pen2 = wxPen(darker3_colour);
     m_gripper_pen3 = *wxWHITE_PEN;
 
-    static unsigned char button_dropdown_bits[] = { 0xe0, 0xf1, 0xfb };
-    static unsigned char overflow_bits[] = { 0x80, 0xff, 0x80, 0xc1, 0xe3, 0xf7 };
+    static const unsigned char button_dropdown_bits[] = { 0xe0, 0xf1, 0xfb };
+    static const unsigned char overflow_bits[] = { 0x80, 0xff, 0x80, 0xc1, 0xe3, 0xf7 };
 
     m_button_dropdown_bmp = wxAuiBitmapFromBits(button_dropdown_bits, 5, 3,
                                                 *wxBLACK);
@@ -225,6 +225,21 @@ void wxAuiDefaultToolBarArt::SetTextOrientation(int orientation)
     m_text_orientation = orientation;
 }
 
+unsigned int wxAuiDefaultToolBarArt::GetFlags()
+{
+    return m_flags;
+}
+
+wxFont wxAuiDefaultToolBarArt::GetFont()
+{
+    return m_font;
+}
+
+int wxAuiDefaultToolBarArt::GetTextOrientation()
+{
+    return m_text_orientation;
+}
+
 void wxAuiDefaultToolBarArt::DrawBackground(
                                     wxDC& dc,
                                     wxWindow* WXUNUSED(wnd),
@@ -259,7 +274,7 @@ void wxAuiDefaultToolBarArt::DrawLabel(
     int text_x, text_y;
     text_x = rect.x + 1;
     text_y = rect.y + (rect.height-text_height)/2;
-    dc.DrawText(item.label, text_x, text_y);
+    dc.DrawText(item.GetLabel(), text_x, text_y);
     dc.DestroyClippingRegion();
 }
 
@@ -280,7 +295,7 @@ void wxAuiDefaultToolBarArt::DrawButton(
 
         dc.GetTextExtent(wxT("ABCDHgj"), &tx, &text_height);
         text_width = 0;
-        dc.GetTextExtent(item.label, &text_width, &ty);
+        dc.GetTextExtent(item.GetLabel(), &text_width, &ty);
     }
 
     int bmp_x = 0, bmp_y = 0;
@@ -290,11 +305,11 @@ void wxAuiDefaultToolBarArt::DrawButton(
     {
         bmp_x = rect.x +
                 (rect.width/2) -
-                (item.bitmap.GetWidth()/2);
+                (item.GetBitmap().GetWidth()/2);
 
         bmp_y = rect.y +
                 ((rect.height-text_height)/2) -
-                (item.bitmap.GetHeight()/2);
+                (item.GetBitmap().GetHeight()/2);
 
         text_x = rect.x + (rect.width/2) - (text_width/2) + 1;
         text_y = rect.y + rect.height - text_height - 1;
@@ -305,36 +320,36 @@ void wxAuiDefaultToolBarArt::DrawButton(
 
         bmp_y = rect.y +
                 (rect.height/2) -
-                (item.bitmap.GetHeight()/2);
+                (item.GetBitmap().GetHeight()/2);
 
-        text_x = bmp_x + 3 + item.bitmap.GetWidth();
+        text_x = bmp_x + 3 + item.GetBitmap().GetWidth();
         text_y = rect.y +
                  (rect.height/2) -
                  (text_height/2);
     }
 
 
-    if (!(item.state & wxAUI_BUTTON_STATE_DISABLED))
+    if (!(item.GetState() & wxAUI_BUTTON_STATE_DISABLED))
     {
-        if (item.state & wxAUI_BUTTON_STATE_PRESSED)
+        if (item.GetState() & wxAUI_BUTTON_STATE_PRESSED)
         {
             dc.SetPen(wxPen(m_highlight_colour));
             dc.SetBrush(wxBrush(wxAuiStepColour(m_highlight_colour, 150)));
             dc.DrawRectangle(rect);
         }
-        else if ((item.state & wxAUI_BUTTON_STATE_HOVER) || item.sticky == true)
+        else if ((item.GetState() & wxAUI_BUTTON_STATE_HOVER) || item.IsSticky())
         {
             dc.SetPen(wxPen(m_highlight_colour));
             dc.SetBrush(wxBrush(wxAuiStepColour(m_highlight_colour, 170)));
 
             // draw an even lighter background for checked item hovers (since
             // the hover background is the same color as the check background)
-            if (item.state & wxAUI_BUTTON_STATE_CHECKED)
+            if (item.GetState() & wxAUI_BUTTON_STATE_CHECKED)
                 dc.SetBrush(wxBrush(wxAuiStepColour(m_highlight_colour, 180)));
 
             dc.DrawRectangle(rect);
         }
-        else if (item.state & wxAUI_BUTTON_STATE_CHECKED)
+        else if (item.GetState() & wxAUI_BUTTON_STATE_CHECKED)
         {
             // it's important to put this code in an else statment after the
             // hover, otherwise hovers won't draw properly for checked items
@@ -345,10 +360,10 @@ void wxAuiDefaultToolBarArt::DrawButton(
     }
 
     wxBitmap bmp;
-    if (item.state & wxAUI_BUTTON_STATE_DISABLED)
-        bmp = item.disabled_bitmap;
+    if (item.GetState() & wxAUI_BUTTON_STATE_DISABLED)
+        bmp = item.GetDisabledBitmap();
     else
-        bmp = item.bitmap;
+        bmp = item.GetBitmap();
 
     if (!bmp.IsOk())
         return;
@@ -357,12 +372,12 @@ void wxAuiDefaultToolBarArt::DrawButton(
 
     // set the item's text color based on if it is disabled
     dc.SetTextForeground(*wxBLACK);
-    if (item.state & wxAUI_BUTTON_STATE_DISABLED)
+    if (item.GetState() & wxAUI_BUTTON_STATE_DISABLED)
         dc.SetTextForeground(DISABLED_TEXT_COLOR);
 
-    if ( (m_flags & wxAUI_TB_TEXT) && !item.label.empty() )
+    if ( (m_flags & wxAUI_TB_TEXT) && !item.GetLabel().empty() )
     {
-        dc.DrawText(item.label, text_x, text_y);
+        dc.DrawText(item.GetLabel(), text_x, text_y);
     }
 }
 
@@ -396,7 +411,7 @@ void wxAuiDefaultToolBarArt::DrawDropDownButton(
             text_width = 0;
         }
 
-        dc.GetTextExtent(item.label, &text_width, &ty);
+        dc.GetTextExtent(item.GetLabel(), &text_width, &ty);
     }
 
 
@@ -413,10 +428,10 @@ void wxAuiDefaultToolBarArt::DrawDropDownButton(
     {
         bmp_x = button_rect.x +
                 (button_rect.width/2) -
-                (item.bitmap.GetWidth()/2);
+                (item.GetBitmap().GetWidth()/2);
         bmp_y = button_rect.y +
                 ((button_rect.height-text_height)/2) -
-                (item.bitmap.GetHeight()/2);
+                (item.GetBitmap().GetHeight()/2);
 
         text_x = rect.x + (rect.width/2) - (text_width/2) + 1;
         text_y = rect.y + rect.height - text_height - 1;
@@ -427,24 +442,24 @@ void wxAuiDefaultToolBarArt::DrawDropDownButton(
 
         bmp_y = rect.y +
                 (rect.height/2) -
-                (item.bitmap.GetHeight()/2);
+                (item.GetBitmap().GetHeight()/2);
 
-        text_x = bmp_x + 3 + item.bitmap.GetWidth();
+        text_x = bmp_x + 3 + item.GetBitmap().GetWidth();
         text_y = rect.y +
                  (rect.height/2) -
                  (text_height/2);
     }
 
 
-    if (item.state & wxAUI_BUTTON_STATE_PRESSED)
+    if (item.GetState() & wxAUI_BUTTON_STATE_PRESSED)
     {
         dc.SetPen(wxPen(m_highlight_colour));
         dc.SetBrush(wxBrush(wxAuiStepColour(m_highlight_colour, 140)));
         dc.DrawRectangle(button_rect);
         dc.DrawRectangle(dropdown_rect);
     }
-    else if (item.state & wxAUI_BUTTON_STATE_HOVER ||
-              item.sticky == true)
+    else if (item.GetState() & wxAUI_BUTTON_STATE_HOVER ||
+             item.IsSticky())
     {
         dc.SetPen(wxPen(m_highlight_colour));
         dc.SetBrush(wxBrush(wxAuiStepColour(m_highlight_colour, 170)));
@@ -454,14 +469,14 @@ void wxAuiDefaultToolBarArt::DrawDropDownButton(
 
     wxBitmap bmp;
     wxBitmap dropbmp;
-    if (item.state & wxAUI_BUTTON_STATE_DISABLED)
+    if (item.GetState() & wxAUI_BUTTON_STATE_DISABLED)
     {
-        bmp = item.disabled_bitmap;
+        bmp = item.GetDisabledBitmap();
         dropbmp = m_disabled_button_dropdown_bmp;
     }
     else
     {
-        bmp = item.bitmap;
+        bmp = item.GetBitmap();
         dropbmp = m_button_dropdown_bmp;
     }
 
@@ -473,12 +488,12 @@ void wxAuiDefaultToolBarArt::DrawDropDownButton(
 
     // set the item's text color based on if it is disabled
     dc.SetTextForeground(*wxBLACK);
-    if (item.state & wxAUI_BUTTON_STATE_DISABLED)
+    if (item.GetState() & wxAUI_BUTTON_STATE_DISABLED)
         dc.SetTextForeground(DISABLED_TEXT_COLOR);
 
-    if ( (m_flags & wxAUI_TB_TEXT) && !item.label.empty() )
+    if ( (m_flags & wxAUI_TB_TEXT) && !item.GetLabel().empty() )
     {
-        dc.DrawText(item.label, text_x, text_y);
+        dc.DrawText(item.GetLabel(), text_x, text_y);
     }
 }
 
@@ -506,7 +521,7 @@ void wxAuiDefaultToolBarArt::DrawControlLabel(
         text_width = 0;
     }
 
-    dc.GetTextExtent(item.label, &text_width, &ty);
+    dc.GetTextExtent(item.GetLabel(), &text_width, &ty);
 
     // don't draw the label if it is wider than the item width
     if (text_width > rect.width)
@@ -518,9 +533,9 @@ void wxAuiDefaultToolBarArt::DrawControlLabel(
     text_x = rect.x + (rect.width/2) - (text_width/2) + 1;
     text_y = rect.y + rect.height - text_height - 1;
 
-    if ( (m_flags & wxAUI_TB_TEXT) && !item.label.empty() )
+    if ( (m_flags & wxAUI_TB_TEXT) && !item.GetLabel().empty() )
     {
-        dc.DrawText(item.label, text_x, text_y);
+        dc.DrawText(item.GetLabel(), text_x, text_y);
     }
 }
 
@@ -536,7 +551,13 @@ wxSize wxAuiDefaultToolBarArt::GetLabelSize(
     dc.GetTextExtent(wxT("ABCDHgj"), &width, &height);
 
     // get item's width
-    width = item.min_size.GetWidth();
+    width = item.GetMinSize().GetWidth();
+
+    if (width == -1)
+    {
+        // no width specified, measure the text ourselves
+        width = dc.GetTextExtent(item.GetLabel()).GetX();
+    }
 
     return wxSize(width, height);
 }
@@ -546,11 +567,11 @@ wxSize wxAuiDefaultToolBarArt::GetToolSize(
                                         wxWindow* WXUNUSED(wnd),
                                         const wxAuiToolBarItem& item)
 {
-    if (!item.bitmap.IsOk() && !(m_flags & wxAUI_TB_TEXT))
+    if (!item.GetBitmap().IsOk() && !(m_flags & wxAUI_TB_TEXT))
         return wxSize(16,16);
 
-    int width = item.bitmap.GetWidth();
-    int height = item.bitmap.GetHeight();
+    int width = item.GetBitmap().GetWidth();
+    int height = item.GetBitmap().GetHeight();
 
     if (m_flags & wxAUI_TB_TEXT)
     {
@@ -562,21 +583,21 @@ wxSize wxAuiDefaultToolBarArt::GetToolSize(
             dc.GetTextExtent(wxT("ABCDHgj"), &tx, &ty);
             height += ty;
 
-            if ( !item.label.empty() )
+            if ( !item.GetLabel().empty() )
             {
-                dc.GetTextExtent(item.label, &tx, &ty);
+                dc.GetTextExtent(item.GetLabel(), &tx, &ty);
                 width = wxMax(width, tx+6);
             }
         }
         else if ( m_text_orientation == wxAUI_TBTOOL_TEXT_RIGHT &&
-                  !item.label.empty() )
+                  !item.GetLabel().empty() )
         {
             width += 3; // space between left border and bitmap
             width += 3; // space between bitmap and text
 
-            if ( !item.label.empty() )
+            if ( !item.GetLabel().empty() )
             {
-                dc.GetTextExtent(item.label, &tx, &ty);
+                dc.GetTextExtent(item.GetLabel(), &tx, &ty);
                 width += tx;
                 height = wxMax(height, ty);
             }
@@ -584,7 +605,7 @@ wxSize wxAuiDefaultToolBarArt::GetToolSize(
     }
 
     // if the tool has a dropdown button, add it to the width
-    if (item.dropdown == true)
+    if (item.HasDropDown())
         width += (BUTTON_DROPDOWN_WIDTH+4);
 
     return wxSize(width, height);
@@ -711,9 +732,9 @@ void wxAuiDefaultToolBarArt::SetElementSize(int element_id, int size)
 {
     switch (element_id)
     {
-        case wxAUI_TBART_SEPARATOR_SIZE: m_separator_size = size;
-        case wxAUI_TBART_GRIPPER_SIZE:   m_gripper_size = size;
-        case wxAUI_TBART_OVERFLOW_SIZE:  m_overflow_size = size;
+        case wxAUI_TBART_SEPARATOR_SIZE: m_separator_size = size; break;
+        case wxAUI_TBART_GRIPPER_SIZE:   m_gripper_size = size; break;
+        case wxAUI_TBART_OVERFLOW_SIZE:  m_overflow_size = size; break;
     }
 }
 
@@ -729,22 +750,22 @@ int wxAuiDefaultToolBarArt::ShowDropDown(wxWindow* wnd,
     {
         wxAuiToolBarItem& item = items.Item(i);
 
-        if (item.kind == wxITEM_NORMAL)
+        if (item.GetKind() == wxITEM_NORMAL)
         {
-            wxString text = item.short_help;
+            wxString text = item.GetShortHelp();
             if (text.empty())
-                text = item.label;
+                text = item.GetLabel();
 
             if (text.empty())
                 text = wxT(" ");
 
-            wxMenuItem* m =  new wxMenuItem(&menuPopup, item.id, text, item.short_help);
+            wxMenuItem* m =  new wxMenuItem(&menuPopup, item.GetId(), text, item.GetShortHelp());
 
-            m->SetBitmap(item.bitmap);
+            m->SetBitmap(item.GetBitmap());
             menuPopup.Append(m);
             items_added++;
         }
-        else if (item.kind == wxITEM_SEPARATOR)
+        else if (item.GetKind() == wxITEM_SEPARATOR)
         {
             if (items_added > 0)
                 menuPopup.AppendSeparator();
@@ -771,6 +792,22 @@ int wxAuiDefaultToolBarArt::ShowDropDown(wxWindow* wnd,
 
 
 
+static wxOrientation GetOrientation(long& style)
+{
+    switch (style & wxAUI_ORIENTATION_MASK)
+    {
+        case wxAUI_TB_HORIZONTAL:
+            return wxHORIZONTAL;
+        case wxAUI_TB_VERTICAL:
+            return wxVERTICAL;
+        default:
+            wxFAIL_MSG("toolbar cannot be locked in both horizontal and vertical orientations (maybe no lock was intended?)");
+            // fall through
+        case 0:
+            return wxBOTH;
+    }
+}
+
 BEGIN_EVENT_TABLE(wxAuiToolBar, wxControl)
     EVT_SIZE(wxAuiToolBar::OnSize)
     EVT_IDLE(wxAuiToolBar::OnIdle)
@@ -816,16 +853,22 @@ wxAuiToolBar::wxAuiToolBar(wxWindow* parent,
     m_gripper_sizer_item = NULL;
     m_overflow_sizer_item = NULL;
     m_dragging = false;
-    m_style = style;
+    m_orientation = GetOrientation(style);
+    if (m_orientation == wxBOTH)
+    {
+        m_orientation = wxHORIZONTAL;
+    }
+    m_style = style | wxBORDER_NONE;
     m_gripper_visible = (m_style & wxAUI_TB_GRIPPER) ? true : false;
     m_overflow_visible = (m_style & wxAUI_TB_OVERFLOW) ? true : false;
     m_overflow_state = 0;
     SetMargins(5, 5, 2, 2);
     SetFont(*wxNORMAL_FONT);
-    m_art->SetFlags((unsigned int)m_style);
+    SetArtFlags();
     SetExtraStyle(wxWS_EX_PROCESS_IDLE);
-    if (style & wxAUI_TB_HORZ_TEXT)
+    if (style & wxAUI_TB_HORZ_LAYOUT)
         SetToolTextOrientation(wxAUI_TBTOOL_TEXT_RIGHT);
+    SetBackgroundStyle(wxBG_STYLE_CUSTOM);
 }
 
 
@@ -837,13 +880,17 @@ wxAuiToolBar::~wxAuiToolBar()
 
 void wxAuiToolBar::SetWindowStyleFlag(long style)
 {
+    GetOrientation(style);      // assert if style is invalid
+    wxCHECK_RET(IsPaneValid(style),
+                "window settings and pane settings are incompatible");
+
     wxControl::SetWindowStyleFlag(style);
 
     m_style = style;
 
     if (m_art)
     {
-        m_art->SetFlags((unsigned int)m_style);
+        SetArtFlags();
     }
 
     if (m_style & wxAUI_TB_GRIPPER)
@@ -857,12 +904,16 @@ void wxAuiToolBar::SetWindowStyleFlag(long style)
     else
         m_overflow_visible = false;
 
-    if (style & wxAUI_TB_HORZ_TEXT)
+    if (style & wxAUI_TB_HORZ_LAYOUT)
         SetToolTextOrientation(wxAUI_TBTOOL_TEXT_RIGHT);
     else
         SetToolTextOrientation(wxAUI_TBTOOL_TEXT_BOTTOM);
 }
 
+long wxAuiToolBar::GetWindowStyleFlag() const
+{
+    return m_style;
+}
 
 void wxAuiToolBar::SetArtProvider(wxAuiToolBarArt* art)
 {
@@ -872,7 +923,7 @@ void wxAuiToolBar::SetArtProvider(wxAuiToolBarArt* art)
 
     if (m_art)
     {
-        m_art->SetFlags((unsigned int)m_style);
+        SetArtFlags();
         m_art->SetTextOrientation(m_tool_text_orientation);
     }
 }
@@ -885,13 +936,13 @@ wxAuiToolBarArt* wxAuiToolBar::GetArtProvider() const
 
 
 
-void wxAuiToolBar::AddTool(int tool_id,
+wxAuiToolBarItem* wxAuiToolBar::AddTool(int tool_id,
                            const wxString& label,
                            const wxBitmap& bitmap,
                            const wxString& short_help_string,
                            wxItemKind kind)
 {
-    AddTool(tool_id,
+    return AddTool(tool_id,
             label,
             bitmap,
             wxNullBitmap,
@@ -902,13 +953,13 @@ void wxAuiToolBar::AddTool(int tool_id,
 }
 
 
-void wxAuiToolBar::AddTool(int tool_id,
+wxAuiToolBarItem* wxAuiToolBar::AddTool(int tool_id,
                            const wxString& label,
                            const wxBitmap& bitmap,
                            const wxBitmap& disabled_bitmap,
                            wxItemKind kind,
-                           const wxString& WXUNUSED(short_help_string),
-                           const wxString& WXUNUSED(long_help_string),
+                           const wxString& short_help_string,
+                           const wxString& long_help_string,
                            wxObject* WXUNUSED(client_data))
 {
     wxAuiToolBarItem item;
@@ -916,9 +967,11 @@ void wxAuiToolBar::AddTool(int tool_id,
     item.label = label;
     item.bitmap = bitmap;
     item.disabled_bitmap = disabled_bitmap;
+    item.short_help = short_help_string;
+    item.long_help = long_help_string;
     item.active = true;
     item.dropdown = false;
-    item.space_pixels = 0;
+    item.spacer_pixels = 0;
     item.id = tool_id;
     item.state = 0;
     item.proportion = 0;
@@ -928,6 +981,9 @@ void wxAuiToolBar::AddTool(int tool_id,
     item.user_data = 0;
     item.sticky = false;
 
+    if (item.id == wxID_ANY)
+        item.id = wxNewId();
+
     if (!item.disabled_bitmap.IsOk())
     {
         // no disabled bitmap specified, we need to make one
@@ -939,11 +995,11 @@ void wxAuiToolBar::AddTool(int tool_id,
             item.disabled_bitmap = MakeDisabledBitmap(item.bitmap);
         }
     }
-
     m_items.Add(item);
+    return &m_items.Last();
 }
 
-void wxAuiToolBar::AddControl(wxControl* control,
+wxAuiToolBarItem* wxAuiToolBar::AddControl(wxControl* control,
                               const wxString& label)
 {
     wxAuiToolBarItem item;
@@ -953,7 +1009,7 @@ void wxAuiToolBar::AddControl(wxControl* control,
     item.disabled_bitmap = wxNullBitmap;
     item.active = true;
     item.dropdown = false;
-    item.space_pixels = 0;
+    item.spacer_pixels = 0;
     item.id = control->GetId();
     item.state = 0;
     item.proportion = 0;
@@ -964,9 +1020,10 @@ void wxAuiToolBar::AddControl(wxControl* control,
     item.sticky = false;
 
     m_items.Add(item);
+    return &m_items.Last();
 }
 
-void wxAuiToolBar::AddLabel(int tool_id,
+wxAuiToolBarItem* wxAuiToolBar::AddLabel(int tool_id,
                             const wxString& label,
                             const int width)
 {
@@ -981,7 +1038,7 @@ void wxAuiToolBar::AddLabel(int tool_id,
     item.disabled_bitmap = wxNullBitmap;
     item.active = true;
     item.dropdown = false;
-    item.space_pixels = 0;
+    item.spacer_pixels = 0;
     item.id = tool_id;
     item.state = 0;
     item.proportion = 0;
@@ -991,10 +1048,14 @@ void wxAuiToolBar::AddLabel(int tool_id,
     item.user_data = 0;
     item.sticky = false;
 
+    if (item.id == wxID_ANY)
+        item.id = wxNewId();
+
     m_items.Add(item);
+    return &m_items.Last();
 }
 
-void wxAuiToolBar::AddSeparator()
+wxAuiToolBarItem* wxAuiToolBar::AddSeparator()
 {
     wxAuiToolBarItem item;
     item.window = NULL;
@@ -1013,9 +1074,10 @@ void wxAuiToolBar::AddSeparator()
     item.sticky = false;
 
     m_items.Add(item);
+    return &m_items.Last();
 }
 
-void wxAuiToolBar::AddSpacer(int pixels)
+wxAuiToolBarItem* wxAuiToolBar::AddSpacer(int pixels)
 {
     wxAuiToolBarItem item;
     item.window = NULL;
@@ -1024,7 +1086,7 @@ void wxAuiToolBar::AddSpacer(int pixels)
     item.disabled_bitmap = wxNullBitmap;
     item.active = true;
     item.dropdown = false;
-    item.space_pixels = pixels;
+    item.spacer_pixels = pixels;
     item.id = -1;
     item.state = 0;
     item.proportion = 0;
@@ -1035,9 +1097,10 @@ void wxAuiToolBar::AddSpacer(int pixels)
     item.sticky = false;
 
     m_items.Add(item);
+    return &m_items.Last();
 }
 
-void wxAuiToolBar::AddStretchSpacer(int proportion)
+wxAuiToolBarItem* wxAuiToolBar::AddStretchSpacer(int proportion)
 {
     wxAuiToolBarItem item;
     item.window = NULL;
@@ -1046,7 +1109,7 @@ void wxAuiToolBar::AddStretchSpacer(int proportion)
     item.disabled_bitmap = wxNullBitmap;
     item.active = true;
     item.dropdown = false;
-    item.space_pixels = 0;
+    item.spacer_pixels = 0;
     item.id = -1;
     item.state = 0;
     item.proportion = proportion;
@@ -1057,6 +1120,7 @@ void wxAuiToolBar::AddStretchSpacer(int proportion)
     item.sticky = false;
 
     m_items.Add(item);
+    return &m_items.Last();
 }
 
 void wxAuiToolBar::Clear()
@@ -1303,8 +1367,16 @@ int wxAuiToolBar::GetToolPacking() const
 }
 
 
-void wxAuiToolBar::SetOrientation(int WXUNUSED(orientation))
+void wxAuiToolBar::SetOrientation(int orientation)
 {
+    wxCHECK_RET(orientation == wxHORIZONTAL ||
+                orientation == wxVERTICAL,
+                "invalid orientation value");
+    if (orientation != m_orientation)
+    {
+        m_orientation = wxOrientation(orientation);
+        SetArtFlags();
+    }
 }
 
 void wxAuiToolBar::SetMargins(int left, int right, int top, int bottom)
@@ -1329,6 +1401,8 @@ void wxAuiToolBar::SetGripperVisible(bool visible)
     m_gripper_visible = visible;
     if (visible)
         m_style |= wxAUI_TB_GRIPPER;
+    else
+        m_style &= ~wxAUI_TB_GRIPPER;
     Realize();
     Refresh(false);
 }
@@ -1344,6 +1418,8 @@ void wxAuiToolBar::SetOverflowVisible(bool visible)
     m_overflow_visible = visible;
     if (visible)
         m_style |= wxAUI_TB_OVERFLOW;
+    else
+        m_style &= ~wxAUI_TB_OVERFLOW;
     Refresh(false);
 }
 
@@ -1431,7 +1507,7 @@ void wxAuiToolBar::RefreshOverflowState()
     // find out if the mouse cursor is inside the dropdown rectangle
     if (overflow_rect.Contains(pt.x, pt.y))
     {
-        if (::wxGetMouseState().LeftDown())
+        if (::wxGetMouseState().LeftIsDown())
             overflow_state = wxAUI_BUTTON_STATE_PRESSED;
         else
             overflow_state = wxAUI_BUTTON_STATE_HOVER;
@@ -1451,15 +1527,39 @@ void wxAuiToolBar::ToggleTool(int tool_id, bool state)
 {
     wxAuiToolBarItem* tool = FindTool(tool_id);
 
-    if (tool)
+    if (tool && (tool->kind == wxITEM_CHECK || tool->kind == wxITEM_RADIO))
     {
-        if (tool->kind != wxITEM_CHECK)
-            return;
+        if (tool->kind == wxITEM_RADIO)
+        {
+            int i, idx, count;
+            idx = GetToolIndex(tool_id);
+            count = (int)m_items.GetCount();
+
+            if (idx >= 0 && idx < count)
+            {
+                for (i = idx; i < count; ++i)
+                {
+                    if (m_items[i].kind != wxITEM_RADIO)
+                        break;
+                    m_items[i].state &= ~wxAUI_BUTTON_STATE_CHECKED;
+                }
+                for (i = idx; i > 0; i--)
+                {
+                    if (m_items[i].kind != wxITEM_RADIO)
+                        break;
+                    m_items[i].state &= ~wxAUI_BUTTON_STATE_CHECKED;
+                }
+            }
 
-        if (state == true)
             tool->state |= wxAUI_BUTTON_STATE_CHECKED;
-        else
-            tool->state &= ~wxAUI_BUTTON_STATE_CHECKED;
+        }
+         else if (tool->kind == wxITEM_CHECK)
+        {
+            if (state == true)
+                tool->state |= wxAUI_BUTTON_STATE_CHECKED;
+            else
+                tool->state &= ~wxAUI_BUTTON_STATE_CHECKED;
+        }
     }
 }
 
@@ -1469,7 +1569,7 @@ bool wxAuiToolBar::GetToolToggled(int tool_id) const
 
     if (tool)
     {
-        if (tool->kind != wxITEM_CHECK)
+        if ( (tool->kind != wxITEM_CHECK) && (tool->kind != wxITEM_RADIO) )
             return false;
 
         return (tool->state & wxAUI_BUTTON_STATE_CHECKED) ? true : false;
@@ -1584,6 +1684,65 @@ void wxAuiToolBar::SetCustomOverflowItems(const wxAuiToolBarItemArray& prepend,
     m_custom_overflow_append = append;
 }
 
+// get size of hint rectangle for a particular dock location
+wxSize wxAuiToolBar::GetHintSize(int dock_direction) const
+{
+    switch (dock_direction)
+    {
+        case wxAUI_DOCK_TOP:
+        case wxAUI_DOCK_BOTTOM:
+            return m_horzHintSize;
+        case wxAUI_DOCK_RIGHT:
+        case wxAUI_DOCK_LEFT:
+            return m_vertHintSize;
+        default:
+            wxCHECK_MSG(false, wxDefaultSize, "invalid dock location value");
+    }
+}
+
+bool wxAuiToolBar::IsPaneValid(const wxAuiPaneInfo& pane) const
+{
+    return IsPaneValid(m_style, pane);
+}
+
+bool wxAuiToolBar::IsPaneValid(long style, const wxAuiPaneInfo& pane)
+{
+    if (style & wxAUI_TB_HORIZONTAL)
+    {
+        if (pane.IsLeftDockable() || pane.IsRightDockable())
+        {
+            return false;
+        }
+    }
+    else if (style & wxAUI_TB_VERTICAL)
+    {
+        if (pane.IsTopDockable() || pane.IsBottomDockable())
+        {
+            return false;
+        }
+    }
+    return true;
+}
+
+bool wxAuiToolBar::IsPaneValid(long style) const
+{
+    wxAuiManager* manager = wxAuiManager::GetManager(const_cast<wxAuiToolBar*>(this));
+    if (manager)
+    {
+        return IsPaneValid(style, manager->GetPane(const_cast<wxAuiToolBar*>(this)));
+    }
+    return true;
+}
+
+void wxAuiToolBar::SetArtFlags() const
+{
+    unsigned int artflags = m_style & ~wxAUI_ORIENTATION_MASK;
+    if (m_orientation == wxVERTICAL)
+    {
+        artflags |= wxAUI_TB_VERTICAL;
+    }
+    m_art->SetFlags(artflags);
+}
 
 size_t wxAuiToolBar::GetToolCount() const
 {
@@ -1621,7 +1780,7 @@ bool wxAuiToolBar::GetToolFitsByIndex(int tool_idx) const
 
     wxRect rect = m_items[tool_idx].sizer_item->GetRect();
 
-    if (m_style & wxAUI_TB_VERTICAL)
+    if (m_orientation == wxVERTICAL)
     {
         // take the dropdown size into account
         if (m_overflow_visible)
@@ -1678,11 +1837,40 @@ bool wxAuiToolBar::Realize()
     if (!dc.IsOk())
         return false;
 
-    bool horizontal = true;
-    if (m_style & wxAUI_TB_VERTICAL)
-        horizontal = false;
+    // calculate hint sizes for both horizontal and vertical
+    // in the order that leaves toolbar in correct final state
+    bool retval = false;
+    if (m_orientation == wxHORIZONTAL)
+    {
+        if (RealizeHelper(dc, false))
+        {
+            m_vertHintSize = GetSize();
+            if (RealizeHelper(dc, true))
+            {
+                m_horzHintSize = GetSize();
+                retval = true;
+            }
+        }
+    }
+    else
+    {
+        if (RealizeHelper(dc, true))
+        {
+            m_horzHintSize = GetSize();
+            if (RealizeHelper(dc, false))
+            {
+                m_vertHintSize = GetSize();
+                retval = true;
+            }
+        }
+    }
 
+    Refresh(false);
+    return retval;
+}
 
+bool wxAuiToolBar::RealizeHelper(wxClientDC& dc, bool horizontal)
+{
     // create the new sizer to add toolbar elements to
     wxBoxSizer* sizer = new wxBoxSizer(horizontal ? wxHORIZONTAL : wxVERTICAL);
 
@@ -1724,7 +1912,7 @@ bool wxAuiToolBar::Realize()
                 sizer_item = sizer->Add(size.x + (m_tool_border_padding*2),
                                         size.y + (m_tool_border_padding*2),
                                         item.proportion,
-                                        wxALIGN_CENTER);
+                                        item.alignment);
                 if (i+1 < count)
                 {
                     sizer->AddSpacer(m_tool_packing);
@@ -1735,12 +1923,13 @@ bool wxAuiToolBar::Realize()
 
             case wxITEM_CHECK:
             case wxITEM_NORMAL:
+            case wxITEM_RADIO:
             {
                 wxSize size = m_art->GetToolSize(dc, this, item);
                 sizer_item = sizer->Add(size.x + (m_tool_border_padding*2),
                                         size.y + (m_tool_border_padding*2),
                                         0,
-                                        wxALIGN_CENTER);
+                                        item.alignment);
                 // add tool packing
                 if (i+1 < count)
                 {
@@ -1770,7 +1959,7 @@ bool wxAuiToolBar::Realize()
                 if (item.proportion > 0)
                     sizer_item = sizer->AddStretchSpacer(item.proportion);
                 else
-                    sizer_item = sizer->Add(item.space_pixels, 1);
+                    sizer_item = sizer->Add(item.spacer_pixels, 1);
                 break;
 
             case wxITEM_CONTROL:
@@ -1782,9 +1971,11 @@ bool wxAuiToolBar::Realize()
                 vert_sizer->AddStretchSpacer(1);
                 ctrl_sizer_item = vert_sizer->Add(item.window, 0, wxEXPAND);
                 vert_sizer->AddStretchSpacer(1);
-                if ( (m_style & wxAUI_TB_TEXT) && !item.label.empty() )
+                if ( (m_style & wxAUI_TB_TEXT) &&
+                     m_tool_text_orientation == wxAUI_TBTOOL_TEXT_BOTTOM &&
+                     !item.GetLabel().empty() )
                 {
-                    wxSize s = GetLabelSize(item.label);
+                    wxSize s = GetLabelSize(item.GetLabel());
                     vert_sizer->Add(1, s.y);
                 }
 
@@ -1916,7 +2107,6 @@ bool wxAuiToolBar::Realize()
         m_sizer->SetDimension(0, 0, cur_size.x, cur_size.y);
     }
 
-    Refresh(false);
     return true;
 }
 
@@ -1931,7 +2121,7 @@ wxRect wxAuiToolBar::GetOverflowRect() const
     wxRect overflow_rect = m_overflow_sizer_item->GetRect();
     int overflow_size = m_art->GetElementSize(wxAUI_TBART_OVERFLOW_SIZE);
 
-    if (m_style & wxAUI_TB_VERTICAL)
+    if (m_orientation == wxVERTICAL)
     {
         overflow_rect.y = cli_rect.height - overflow_size;
         overflow_rect.x = 0;
@@ -2049,11 +2239,6 @@ void wxAuiToolBar::OnSize(wxSizeEvent& WXUNUSED(evt))
     int x, y;
     GetClientSize(&x, &y);
 
-    if (x > y)
-        SetOrientation(wxHORIZONTAL);
-    else
-        SetOrientation(wxVERTICAL);
-
     if (((x >= y) && m_absolute_min_size.x > x) ||
         ((y > x) && m_absolute_min_size.y > y))
     {
@@ -2088,6 +2273,11 @@ void wxAuiToolBar::OnSize(wxSizeEvent& WXUNUSED(evt))
 
     Refresh(false);
     Update();
+
+    // idle events aren't sent while user is resizing frame (why?),
+    // but resizing toolbar here causes havoc,
+    // so force idle handler to run after size handling complete
+    QueueEvent(new wxIdleEvent);
 }
 
 
@@ -2110,19 +2300,87 @@ void wxAuiToolBar::DoSetSize(int x,
 
 void wxAuiToolBar::OnIdle(wxIdleEvent& evt)
 {
+    // if orientation doesn't match dock, fix it
+    wxAuiManager* manager = wxAuiManager::GetManager(this);
+    if (manager)
+    {
+        wxAuiPaneInfo& pane = manager->GetPane(this);
+        // pane state member is public, so it might have been changed
+        // without going through wxPaneInfo::SetFlag() check
+        bool ok = pane.IsOk();
+        wxCHECK2_MSG(!ok || IsPaneValid(m_style, pane), ok = false,
+                    "window settings and pane settings are incompatible");
+        if (ok)
+        {
+            wxOrientation newOrientation = m_orientation;
+            if (pane.IsDocked())
+            {
+                switch (pane.dock_direction)
+                {
+                    case wxAUI_DOCK_TOP:
+                    case wxAUI_DOCK_BOTTOM:
+                        newOrientation = wxHORIZONTAL;
+                        break;
+                    case wxAUI_DOCK_LEFT:
+                    case wxAUI_DOCK_RIGHT:
+                        newOrientation = wxVERTICAL;
+                        break;
+                    default:
+                        wxFAIL_MSG("invalid dock location value");
+                }
+            }
+            else if (pane.IsResizable() &&
+                    GetOrientation(m_style) == wxBOTH)
+            {
+                // changing orientation in OnSize causes havoc
+                int x, y;
+                GetClientSize(&x, &y);
+
+                if (x > y)
+                {
+                    newOrientation = wxHORIZONTAL;
+                }
+                else
+                {
+                    newOrientation = wxVERTICAL;
+                }
+            }
+            if (newOrientation != m_orientation)
+            {
+                SetOrientation(newOrientation);
+                Realize();
+                if (newOrientation == wxHORIZONTAL)
+                {
+                    pane.best_size = GetHintSize(wxAUI_DOCK_TOP);
+                }
+                else
+                {
+                    pane.best_size = GetHintSize(wxAUI_DOCK_LEFT);
+                }
+                if (pane.IsDocked())
+                {
+                    pane.floating_size = wxDefaultSize;
+                }
+                else
+                {
+                    SetSize(GetParent()->GetClientSize());
+                }
+                manager->Update();
+            }
+        }
+    }
+
     DoIdleUpdate();
     evt.Skip();
 }
 
 void wxAuiToolBar::OnPaint(wxPaintEvent& WXUNUSED(evt))
 {
-    wxBufferedPaintDC dc(this);
+    wxAutoBufferedPaintDC dc(this);
     wxRect cli_rect(wxPoint(0,0), GetClientSize());
 
 
-    bool horizontal = true;
-    if (m_style & wxAUI_TB_VERTICAL)
-        horizontal = false;
+    bool horizontal = m_orientation == wxHORIZONTAL;
 
 
     m_art->DrawBackground(dc, this, cli_rect);
@@ -2191,6 +2449,11 @@ void wxAuiToolBar::OnPaint(wxPaintEvent& WXUNUSED(evt))
             // draw a toggle button
             m_art->DrawButton(dc, this, item, item_rect);
         }
+        else if (item.kind == wxITEM_RADIO)
+        {
+            // draw a toggle button
+            m_art->DrawButton(dc, this, item, item_rect);
+        }
         else if (item.kind == wxITEM_CONTROL)
         {
             // draw the control's label
@@ -2249,7 +2512,7 @@ void wxAuiToolBar::OnLeftDown(wxMouseEvent& evt)
             e.SetEventObject(this);
             e.SetToolId(-1);
             e.SetClickPoint(wxPoint(evt.GetX(), evt.GetY()));
-            bool processed = ProcessEvent(e);
+            bool processed = GetEventHandler()->ProcessEvent(e);
 
             if (processed)
             {
@@ -2286,7 +2549,7 @@ void wxAuiToolBar::OnLeftDown(wxMouseEvent& evt)
                 {
                     wxCommandEvent e(wxEVT_COMMAND_MENU_SELECTED, res);
                     e.SetEventObject(this);
-                    GetParent()->ProcessEvent(e);
+                    GetParent()->GetEventHandler()->ProcessEvent(e);
                 }
             }
 
@@ -2327,7 +2590,7 @@ void wxAuiToolBar::OnLeftDown(wxMouseEvent& evt)
 
         e.SetClickPoint(evt.GetPosition());
         e.SetItemRect(rect);
-        ProcessEvent(e);
+        GetEventHandler()->ProcessEvent(e);
         DoIdleUpdate();
     }
 }
@@ -2360,7 +2623,7 @@ void wxAuiToolBar::OnLeftUp(wxMouseEvent& evt)
         {
             UnsetToolTip();
 
-            if (hit_item->kind == wxITEM_CHECK)
+            if (hit_item->kind == wxITEM_CHECK || hit_item->kind == wxITEM_RADIO)
             {
                 bool toggle = false;
 
@@ -2371,16 +2634,21 @@ void wxAuiToolBar::OnLeftUp(wxMouseEvent& evt)
 
                 ToggleTool(m_action_item->id, toggle);
 
+                // repaint immediately
+                Refresh(false);
+                Update();
+
                 wxCommandEvent e(wxEVT_COMMAND_MENU_SELECTED, m_action_item->id);
                 e.SetEventObject(this);
-                ProcessEvent(e);
+                e.SetInt (toggle);
+                GetEventHandler()->ProcessEvent(e);
                 DoIdleUpdate();
             }
             else
             {
                 wxCommandEvent e(wxEVT_COMMAND_MENU_SELECTED, m_action_item->id);
                 e.SetEventObject(this);
-                ProcessEvent(e);
+                GetEventHandler()->ProcessEvent(e);
                 DoIdleUpdate();
             }
         }
@@ -2443,7 +2711,7 @@ void wxAuiToolBar::OnRightUp(wxMouseEvent& evt)
             e.SetEventObject(this);
             e.SetToolId(m_action_item->id);
             e.SetClickPoint(m_action_pos);
-            ProcessEvent(e);
+            GetEventHandler()->ProcessEvent(e);
             DoIdleUpdate();
         }
     }
@@ -2454,7 +2722,7 @@ void wxAuiToolBar::OnRightUp(wxMouseEvent& evt)
         e.SetEventObject(this);
         e.SetToolId(-1);
         e.SetClickPoint(m_action_pos);
-        ProcessEvent(e);
+        GetEventHandler()->ProcessEvent(e);
         DoIdleUpdate();
     }
 
@@ -2514,7 +2782,7 @@ void wxAuiToolBar::OnMiddleUp(wxMouseEvent& evt)
             e.SetEventObject(this);
             e.SetToolId(m_action_item->id);
             e.SetClickPoint(m_action_pos);
-            ProcessEvent(e);
+            GetEventHandler()->ProcessEvent(e);
             DoIdleUpdate();
         }
     }
@@ -2539,7 +2807,7 @@ void wxAuiToolBar::OnMotion(wxMouseEvent& evt)
         wxAuiToolBarEvent e(wxEVT_COMMAND_AUITOOLBAR_BEGIN_DRAG, GetId());
         e.SetEventObject(this);
         e.SetToolId(m_action_item->id);
-        ProcessEvent(e);
+        GetEventHandler()->ProcessEvent(e);
         DoIdleUpdate();
         return;
     }