]> git.saurik.com Git - wxWidgets.git/blobdiff - src/xrc/xh_toolb.cpp
fixing osx_carbon
[wxWidgets.git] / src / xrc / xh_toolb.cpp
index 62dd7707167d33def5047c7b418204d45c3809fd..041c8d8b66cebbf54f2ea9740b1380f04fd78e03 100644 (file)
@@ -1,6 +1,6 @@
 /////////////////////////////////////////////////////////////////////////////
-// Name:        xh_toolb.cpp
-// Purpose:     XRC resource for wxBoxSizer
+// Name:        src/xrc/xh_toolb.cpp
+// Purpose:     XRC resource for wxToolBar
 // Author:      Vaclav Slavik
 // Created:     2000/08/11
 // RCS-ID:      $Id$
 #if wxUSE_XRC && wxUSE_TOOLBAR
 
 #include "wx/xrc/xh_toolb.h"
-#include "wx/toolbar.h"
-#include "wx/frame.h"
+
+#ifndef WX_PRECOMP
+    #include "wx/frame.h"
+    #include "wx/log.h"
+    #include "wx/menu.h"
+    #include "wx/toolbar.h"
+#endif
 
 IMPLEMENT_DYNAMIC_CLASS(wxToolBarXmlHandler, wxXmlResourceHandler)
 
@@ -37,6 +42,12 @@ wxToolBarXmlHandler::wxToolBarXmlHandler()
     XRC_ADD_STYLE(wxTB_NOALIGN);
     XRC_ADD_STYLE(wxTB_HORZ_LAYOUT);
     XRC_ADD_STYLE(wxTB_HORZ_TEXT);
+
+    XRC_ADD_STYLE(wxTB_TOP);
+    XRC_ADD_STYLE(wxTB_LEFT);
+    XRC_ADD_STYLE(wxTB_RIGHT);
+    XRC_ADD_STYLE(wxTB_BOTTOM);
+
     AddWindowStyles();
 }
 
@@ -44,49 +55,109 @@ wxObject *wxToolBarXmlHandler::DoCreateResource()
 {
     if (m_class == wxT("tool"))
     {
-        wxCHECK_MSG(m_toolbar, NULL, wxT("Incorrect syntax of XRC resource: tool not within a toolbar!"));
+        if ( !m_toolbar )
+        {
+            ReportError("tool only allowed inside a wxToolBar");
+            return NULL;
+        }
 
-        if (GetPosition() != wxDefaultPosition)
+        wxItemKind kind = wxITEM_NORMAL;
+        if (GetBool(wxT("radio")))
+            kind = wxITEM_RADIO;
+
+        if (GetBool(wxT("toggle")))
         {
-            m_toolbar->AddTool(GetID(),
-                               GetBitmap(wxT("bitmap"), wxART_TOOLBAR),
-                               GetBitmap(wxT("bitmap2"), wxART_TOOLBAR),
-                               GetBool(wxT("toggle")),
-                               GetPosition().x,
-                               GetPosition().y,
-                               NULL,
-                               GetText(wxT("tooltip")),
-                               GetText(wxT("longhelp")));
+            if ( kind != wxITEM_NORMAL )
+            {
+                ReportParamError
+                (
+                    "toggle",
+                    "tool can't have both <radio> and <toggle> properties"
+                );
+            }
+
+            kind = wxITEM_CHECK;
         }
-        else
+#if wxUSE_MENUS
+        // check whether we have dropdown tag inside
+        wxMenu *menu = NULL; // menu for drop down items
+        wxXmlNode * const nodeDropdown = GetParamNode("dropdown");
+        if ( nodeDropdown )
         {
-            wxItemKind kind = wxITEM_NORMAL;
-            if (GetBool(wxT("radio")))
-                kind = wxITEM_RADIO;
-            if (GetBool(wxT("toggle")))
+            if ( kind != wxITEM_NORMAL )
             {
-                wxASSERT_MSG( kind == wxITEM_NORMAL,
-                              _T("can't have both toggleable and radion button at once") );
-                kind = wxITEM_CHECK;
+                ReportParamError
+                (
+                    "dropdown",
+                    "drop-down tool can't have neither <radio> nor <toggle> properties"
+                );
+            }
+
+            kind = wxITEM_DROPDOWN;
+
+            // also check for the menu specified inside dropdown (it is
+            // optional and may be absent for e.g. dynamically-created
+            // menus)
+            wxXmlNode * const nodeMenu = nodeDropdown->GetChildren();
+            if ( nodeMenu )
+            {
+                wxObject *res = CreateResFromNode(nodeMenu, NULL);
+                menu = wxDynamicCast(res, wxMenu);
+                if ( !menu )
+                {
+                    ReportError
+                    (
+                        nodeMenu,
+                        "drop-down tool contents can only be a wxMenu"
+                    );
+                }
+
+                if ( nodeMenu->GetNext() )
+                {
+                    ReportError
+                    (
+                        nodeMenu->GetNext(),
+                        "unexpected extra contents under drop-down tool"
+                    );
+                }
             }
-            m_toolbar->AddTool(GetID(),
-                               GetText(wxT("label")),
-                               GetBitmap(wxT("bitmap"), wxART_TOOLBAR),
-                               GetBitmap(wxT("bitmap2"), wxART_TOOLBAR),
-                               kind,
-                               GetText(wxT("tooltip")),
-                               GetText(wxT("longhelp")));
-
-            if ( GetBool(wxT("disabled")) )
-                m_toolbar->EnableTool(GetID(), false);
         }
+#endif
+        wxToolBarToolBase * const tool =
+            m_toolbar->AddTool
+                       (
+                          GetID(),
+                          GetText(wxT("label")),
+                          GetBitmap(wxT("bitmap"), wxART_TOOLBAR, m_toolSize),
+                          GetBitmap(wxT("bitmap2"), wxART_TOOLBAR, m_toolSize),
+                          kind,
+                          GetText(wxT("tooltip")),
+                          GetText(wxT("longhelp"))
+                       );
+
+        if ( GetBool(wxT("disabled")) )
+            m_toolbar->EnableTool(GetID(), false);
+#if wxUSE_MENUS
+        if ( menu )
+            tool->SetDropdownMenu(menu);
+#endif
+
         return m_toolbar; // must return non-NULL
     }
 
-    else if (m_class == wxT("separator"))
+    else if (m_class == wxT("separator") || m_class == wxT("space"))
     {
-        wxCHECK_MSG(m_toolbar, NULL, wxT("Incorrect syntax of XRC resource: separator not within a toolbar!"));
-        m_toolbar->AddSeparator();
+        if ( !m_toolbar )
+        {
+            ReportError("separators only allowed inside wxToolBar");
+            return NULL;
+        }
+
+        if ( m_class == wxT("separator") )
+            m_toolbar->AddSeparator();
+        else
+            m_toolbar->AddStretchableSpace();
+
         return m_toolbar; // must return non-NULL
     }
 
@@ -105,10 +176,11 @@ wxObject *wxToolBarXmlHandler::DoCreateResource()
                          GetSize(),
                          style,
                          GetName());
+        SetupWindow(toolbar);
 
-        wxSize bmpsize = GetSize(wxT("bitmapsize"));
-        if (!(bmpsize == wxDefaultSize))
-            toolbar->SetToolBitmapSize(bmpsize);
+        m_toolSize = GetSize(wxT("bitmapsize"));
+        if (!(m_toolSize == wxDefaultSize))
+            toolbar->SetToolBitmapSize(m_toolSize);
         wxSize margins = GetSize(wxT("margins"));
         if (!(margins == wxDefaultSize))
             toolbar->SetMargins(margins.x, margins.y);
@@ -118,8 +190,6 @@ wxObject *wxToolBarXmlHandler::DoCreateResource()
         long separation = GetLong(wxT("separation"), -1);
         if (separation != -1)
             toolbar->SetToolSeparation(separation);
-        if (HasParam(wxT("bg")))
-            toolbar->SetBackgroundColour(GetColour(wxT("bg")));
 
         wxXmlNode *children_node = GetParamNode(wxT("object"));
         if (!children_node)
@@ -141,6 +211,7 @@ wxObject *wxToolBarXmlHandler::DoCreateResource()
                 wxControl *control = wxDynamicCast(created, wxControl);
                 if (!IsOfClass(n, wxT("tool")) &&
                     !IsOfClass(n, wxT("separator")) &&
+                    !IsOfClass(n, wxT("space")) &&
                     control != NULL)
                     toolbar->AddControl(control);
             }
@@ -167,6 +238,7 @@ bool wxToolBarXmlHandler::CanHandle(wxXmlNode *node)
 {
     return ((!m_isInside && IsOfClass(node, wxT("wxToolBar"))) ||
             (m_isInside && IsOfClass(node, wxT("tool"))) ||
+            (m_isInside && IsOfClass(node, wxT("space"))) ||
             (m_isInside && IsOfClass(node, wxT("separator"))));
 }