]> git.saurik.com Git - wxWidgets.git/blobdiff - src/xrc/xh_toolb.cpp
typo fix
[wxWidgets.git] / src / xrc / xh_toolb.cpp
index 02f7f8893a56ae1bd8a3453993e6bc2f55098538..2d19946e33629aff22f7e99cfe29d7da3cab7045 100644 (file)
@@ -21,6 +21,8 @@
 
 #ifndef WX_PRECOMP
     #include "wx/frame.h"
+    #include "wx/log.h"
+    #include "wx/menu.h"
     #include "wx/toolbar.h"
 #endif
 
@@ -53,34 +55,102 @@ 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;
+        }
 
         wxItemKind kind = wxITEM_NORMAL;
         if (GetBool(wxT("radio")))
             kind = wxITEM_RADIO;
+
         if (GetBool(wxT("toggle")))
         {
-            wxASSERT_MSG( kind == wxITEM_NORMAL,
-                          _T("can't have both toggle and radio button at once") );
+            if ( kind != wxITEM_NORMAL )
+            {
+                ReportParamError
+                (
+                    "toggle",
+                    "tool can't have both <radio> and <toggle> properties"
+                );
+            }
+
             kind = wxITEM_CHECK;
         }
-        m_toolbar->AddTool(GetID(),
-                           GetText(wxT("label")),
-                           GetBitmap(wxT("bitmap"), wxART_TOOLBAR),
-                           GetBitmap(wxT("bitmap2"), wxART_TOOLBAR),
-                           kind,
-                           GetText(wxT("tooltip")),
-                           GetText(wxT("longhelp")));
+
+        // check whether we have dropdown tag inside
+        wxMenu *menu = NULL; // menu for drop down items
+        wxXmlNode * const nodeDropdown = GetParamNode("dropdown");
+        if ( nodeDropdown )
+        {
+            if ( kind != wxITEM_NORMAL )
+            {
+                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"
+                    );
+                }
+            }
+        }
+
+        wxToolBarToolBase * const
+            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);
 
+        if ( menu )
+            tool->SetDropdownMenu(menu);
+
         return m_toolbar; // must return non-NULL
     }
 
     else if (m_class == wxT("separator"))
     {
-        wxCHECK_MSG(m_toolbar, NULL, wxT("Incorrect syntax of XRC resource: separator not within a toolbar!"));
+        if ( !m_toolbar )
+        {
+            ReportError("separator only allowed inside wxToolBar");
+            return NULL;
+        }
         m_toolbar->AddSeparator();
         return m_toolbar; // must return non-NULL
     }
@@ -100,6 +170,7 @@ wxObject *wxToolBarXmlHandler::DoCreateResource()
                          GetSize(),
                          style,
                          GetName());
+        SetupWindow(toolbar);
 
         wxSize bmpsize = GetSize(wxT("bitmapsize"));
         if (!(bmpsize == wxDefaultSize))
@@ -113,8 +184,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)