]> git.saurik.com Git - wxWidgets.git/blobdiff - src/xrc/xh_toolb.cpp
Ensure there is valid context for DrawRectangle
[wxWidgets.git] / src / xrc / xh_toolb.cpp
index fe7a6aa01a84d919f51e5c0a908805a7740924c5..0c1015364810c8b0d0cfdfb43b3b0c43fa980703 100644 (file)
 
 #ifndef WX_PRECOMP
     #include "wx/frame.h"
 
 #ifndef WX_PRECOMP
     #include "wx/frame.h"
+    #include "wx/log.h"
+    #include "wx/menu.h"
     #include "wx/toolbar.h"
 #endif
 
     #include "wx/toolbar.h"
 #endif
 
+#include "wx/xml/xml.h"
+
 IMPLEMENT_DYNAMIC_CLASS(wxToolBarXmlHandler, wxXmlResourceHandler)
 
 wxToolBarXmlHandler::wxToolBarXmlHandler()
 IMPLEMENT_DYNAMIC_CLASS(wxToolBarXmlHandler, wxXmlResourceHandler)
 
 wxToolBarXmlHandler::wxToolBarXmlHandler()
@@ -55,8 +59,7 @@ wxObject *wxToolBarXmlHandler::DoCreateResource()
     {
         if ( !m_toolbar )
         {
     {
         if ( !m_toolbar )
         {
-            wxLogError(_("XRC syntax error: \"tool\" only allowed inside a "
-                         "toolbar"));
+            ReportError("tool only allowed inside a wxToolBar");
             return NULL;
         }
 
             return NULL;
         }
 
@@ -68,14 +71,17 @@ wxObject *wxToolBarXmlHandler::DoCreateResource()
         {
             if ( kind != wxITEM_NORMAL )
             {
         {
             if ( kind != wxITEM_NORMAL )
             {
-                wxLogWarning(_("XRC syntax error: tool can't have both "
-                               "\"radio\" and \"toggle\" properties, "
-                               "ignoring the former."));
+                ReportParamError
+                (
+                    "toggle",
+                    "tool can't have both <radio> and <toggle> properties"
+                );
             }
 
             kind = wxITEM_CHECK;
         }
 
             }
 
             kind = wxITEM_CHECK;
         }
 
+#if wxUSE_MENUS
         // check whether we have dropdown tag inside
         wxMenu *menu = NULL; // menu for drop down items
         wxXmlNode * const nodeDropdown = GetParamNode("dropdown");
         // check whether we have dropdown tag inside
         wxMenu *menu = NULL; // menu for drop down items
         wxXmlNode * const nodeDropdown = GetParamNode("dropdown");
@@ -83,9 +89,11 @@ wxObject *wxToolBarXmlHandler::DoCreateResource()
         {
             if ( kind != wxITEM_NORMAL )
             {
         {
             if ( kind != wxITEM_NORMAL )
             {
-                wxLogWarning(_("XRC syntax error: drop-down tool can't have "
-                               "neither \"radio\" nor \"toggle\" properties, "
-                               "ignoring them."));
+                ReportParamError
+                (
+                    "dropdown",
+                    "drop-down tool can't have neither <radio> nor <toggle> properties"
+                );
             }
 
             kind = wxITEM_DROPDOWN;
             }
 
             kind = wxITEM_DROPDOWN;
@@ -100,48 +108,76 @@ wxObject *wxToolBarXmlHandler::DoCreateResource()
                 menu = wxDynamicCast(res, wxMenu);
                 if ( !menu )
                 {
                 menu = wxDynamicCast(res, wxMenu);
                 if ( !menu )
                 {
-                    wxLogError(_("XRC syntax error: invalid drop-down tool "
-                                 "contents (expected a menu)."));
+                    ReportError
+                    (
+                        nodeMenu,
+                        "drop-down tool contents can only be a wxMenu"
+                    );
                 }
 
                 if ( nodeMenu->GetNext() )
                 {
                 }
 
                 if ( nodeMenu->GetNext() )
                 {
-                    wxLogWarning(_("XRC syntax error: unexpected extra "
-                                   "contents under drop-down tool."));
+                    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"))
-                             );
+#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 ( GetBool(wxT("disabled")) )
             m_toolbar->EnableTool(GetID(), false);
 
+        if ( GetBool(wxS("checked")) )
+        {
+            if ( kind == wxITEM_NORMAL )
+            {
+                ReportParamError
+                (
+                    "checked",
+                    "only <radio> nor <toggle> tools can be checked"
+                );
+            }
+            else
+            {
+                m_toolbar->ToggleTool(GetID(), true);
+            }
+        }
+
+#if wxUSE_MENUS
         if ( menu )
             tool->SetDropdownMenu(menu);
         if ( menu )
             tool->SetDropdownMenu(menu);
+#endif
 
         return m_toolbar; // must return non-NULL
     }
 
 
         return m_toolbar; // must return non-NULL
     }
 
-    else if (m_class == wxT("separator"))
+    else if (m_class == wxT("separator") || m_class == wxT("space"))
     {
         if ( !m_toolbar )
         {
     {
         if ( !m_toolbar )
         {
-            wxLogError(_("XRC syntax error: \"separator\" only allowed inside a "
-                         "toolbar"));
+            ReportError("separators only allowed inside wxToolBar");
             return NULL;
         }
             return NULL;
         }
-        m_toolbar->AddSeparator();
+
+        if ( m_class == wxT("separator") )
+            m_toolbar->AddSeparator();
+        else
+            m_toolbar->AddStretchableSpace();
+
         return m_toolbar; // must return non-NULL
     }
 
         return m_toolbar; // must return non-NULL
     }
 
@@ -162,9 +198,9 @@ wxObject *wxToolBarXmlHandler::DoCreateResource()
                          GetName());
         SetupWindow(toolbar);
 
                          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);
         wxSize margins = GetSize(wxT("margins"));
         if (!(margins == wxDefaultSize))
             toolbar->SetMargins(margins.x, margins.y);
@@ -195,6 +231,7 @@ wxObject *wxToolBarXmlHandler::DoCreateResource()
                 wxControl *control = wxDynamicCast(created, wxControl);
                 if (!IsOfClass(n, wxT("tool")) &&
                     !IsOfClass(n, wxT("separator")) &&
                 wxControl *control = wxDynamicCast(created, wxControl);
                 if (!IsOfClass(n, wxT("tool")) &&
                     !IsOfClass(n, wxT("separator")) &&
+                    !IsOfClass(n, wxT("space")) &&
                     control != NULL)
                     toolbar->AddControl(control);
             }
                     control != NULL)
                     toolbar->AddControl(control);
             }
@@ -204,8 +241,6 @@ wxObject *wxToolBarXmlHandler::DoCreateResource()
         m_isInside = false;
         m_toolbar = NULL;
 
         m_isInside = false;
         m_toolbar = NULL;
 
-        toolbar->Realize();
-
         if (m_parentAsWindow && !GetBool(wxT("dontattachtoframe")))
         {
             wxFrame *parentFrame = wxDynamicCast(m_parent, wxFrame);
         if (m_parentAsWindow && !GetBool(wxT("dontattachtoframe")))
         {
             wxFrame *parentFrame = wxDynamicCast(m_parent, wxFrame);
@@ -213,6 +248,8 @@ wxObject *wxToolBarXmlHandler::DoCreateResource()
                 parentFrame->SetToolBar(toolbar);
         }
 
                 parentFrame->SetToolBar(toolbar);
         }
 
+        toolbar->Realize();
+
         return toolbar;
     }
 }
         return toolbar;
     }
 }
@@ -221,6 +258,7 @@ bool wxToolBarXmlHandler::CanHandle(wxXmlNode *node)
 {
     return ((!m_isInside && IsOfClass(node, wxT("wxToolBar"))) ||
             (m_isInside && IsOfClass(node, wxT("tool"))) ||
 {
     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"))));
 }
 
             (m_isInside && IsOfClass(node, wxT("separator"))));
 }