]> git.saurik.com Git - wxWidgets.git/blobdiff - src/xrc/xh_toolb.cpp
really fix the length of the string returned by wxConvertStringToOle() (#10056)
[wxWidgets.git] / src / xrc / xh_toolb.cpp
index 3cddf6f6b271a348eb825728a3da50122982fc65..b6f518d4af4b320c08b0082b0c00543d83cea9c7 100644 (file)
@@ -1,16 +1,12 @@
 /////////////////////////////////////////////////////////////////////////////
-// 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$
 // Copyright:   (c) 2000 Vaclav Slavik
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
-#ifdef __GNUG__
-#pragma implementation "xh_toolb.h"
-#endif
 
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
     #pragma hdrstop
 #endif
 
+#if wxUSE_XRC && wxUSE_TOOLBAR
+
 #include "wx/xrc/xh_toolb.h"
-#include "wx/toolbar.h"
 
+#ifndef WX_PRECOMP
+    #include "wx/frame.h"
+    #include "wx/log.h"
+    #include "wx/menu.h"
+    #include "wx/toolbar.h"
+#endif
 
-#if wxUSE_TOOLBAR
+IMPLEMENT_DYNAMIC_CLASS(wxToolBarXmlHandler, wxXmlResourceHandler)
 
-wxToolBarXmlHandler::wxToolBarXmlHandler() 
-: wxXmlResourceHandler(), m_isInside(FALSE), m_toolbar(NULL)
+wxToolBarXmlHandler::wxToolBarXmlHandler()
+: wxXmlResourceHandler(), m_isInside(false), m_toolbar(NULL)
 {
-    ADD_STYLE(wxTB_FLAT);
-    ADD_STYLE(wxTB_DOCKABLE);
-    ADD_STYLE(wxTB_VERTICAL);
-    ADD_STYLE(wxTB_HORIZONTAL);
+    XRC_ADD_STYLE(wxTB_FLAT);
+    XRC_ADD_STYLE(wxTB_DOCKABLE);
+    XRC_ADD_STYLE(wxTB_VERTICAL);
+    XRC_ADD_STYLE(wxTB_HORIZONTAL);
+    XRC_ADD_STYLE(wxTB_3DBUTTONS);
+    XRC_ADD_STYLE(wxTB_TEXT);
+    XRC_ADD_STYLE(wxTB_NOICONS);
+    XRC_ADD_STYLE(wxTB_NODIVIDER);
+    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();
 }
 
-
-
 wxObject *wxToolBarXmlHandler::DoCreateResource()
-{ 
+{
     if (m_class == wxT("tool"))
     {
-        wxCHECK_MSG(m_toolbar, NULL, wxT("Incorrect syntax of XRC resource: tool not within a toolbar!"));
-        m_toolbar->AddTool(GetID(),
-                           GetBitmap(wxT("bitmap")),
-                           GetBitmap(wxT("bitmap2")),
-                           GetBool(wxT("toggle")),
-                           GetPosition().x,
-                           GetPosition().y,
-                           NULL,
-                           GetText(wxT("tooltip")),
-                           GetText(wxT("longhelp")));
+        if ( !m_toolbar )
+        {
+            wxLogError(_("XRC syntax error: \"tool\" only allowed inside a "
+                         "toolbar"));
+            return NULL;
+        }
+
+        wxItemKind kind = wxITEM_NORMAL;
+        if (GetBool(wxT("radio")))
+            kind = wxITEM_RADIO;
+
+        if (GetBool(wxT("toggle")))
+        {
+            if ( kind != wxITEM_NORMAL )
+            {
+                wxLogWarning(_("XRC syntax error: tool can't have both "
+                               "\"radio\" and \"toggle\" properties, "
+                               "ignoring the former."));
+            }
+
+            kind = wxITEM_CHECK;
+        }
+
+        // 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 )
+            {
+                wxLogWarning(_("XRC syntax error: drop-down tool can't have "
+                               "neither \"radio\" nor \"toggle\" properties, "
+                               "ignoring them."));
+            }
+
+            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 )
+                {
+                    wxLogError(_("XRC syntax error: invalid drop-down tool "
+                                 "contents (expected a menu)."));
+                }
+
+                if ( nodeMenu->GetNext() )
+                {
+                    wxLogWarning(_("XRC syntax error: 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 )
+        {
+            wxLogError(_("XRC syntax error: \"separator\" only allowed inside a "
+                         "toolbar"));
+            return NULL;
+        }
         m_toolbar->AddSeparator();
         return m_toolbar; // must return non-NULL
     }
-    
+
     else /*<object class="wxToolBar">*/
     {
         int style = GetStyle(wxT("style"), wxNO_BORDER | wxTB_HORIZONTAL);
 #ifdef __WXMSW__
         if (!(style & wxNO_BORDER)) style |= wxNO_BORDER;
 #endif
-        wxToolBar *toolbar = new wxToolBar(m_parentAsWindow,
-                                    GetID(),
-                                    GetPosition(),
-                                    GetSize(),
-                                    style,
-                                    GetName());
+
+        XRC_MAKE_INSTANCE(toolbar, wxToolBar)
+
+        toolbar->Create(m_parentAsWindow,
+                         GetID(),
+                         GetPosition(),
+                         GetSize(),
+                         style,
+                         GetName());
+        SetupWindow(toolbar);
 
         wxSize bmpsize = GetSize(wxT("bitmapsize"));
         if (!(bmpsize == wxDefaultSize))
@@ -87,17 +178,20 @@ wxObject *wxToolBarXmlHandler::DoCreateResource()
             toolbar->SetToolSeparation(separation);
 
         wxXmlNode *children_node = GetParamNode(wxT("object"));
+        if (!children_node)
+           children_node = GetParamNode(wxT("object_ref"));
+
         if (children_node == NULL) return toolbar;
 
-        m_isInside = TRUE;
+        m_isInside = true;
         m_toolbar = toolbar;
 
         wxXmlNode *n = children_node;
 
         while (n)
         {
-            if (n->GetType() == wxXML_ELEMENT_NODE && 
-                n->GetName() == wxT("object"))
+            if ((n->GetType() == wxXML_ELEMENT_NODE) &&
+                (n->GetName() == wxT("object") || n->GetName() == wxT("object_ref")))
             {
                 wxObject *created = CreateResFromNode(n, toolbar, NULL);
                 wxControl *control = wxDynamicCast(created, wxControl);
@@ -109,21 +203,27 @@ wxObject *wxToolBarXmlHandler::DoCreateResource()
             n = n->GetNext();
         }
 
-        m_isInside = FALSE;
+        m_isInside = false;
         m_toolbar = NULL;
 
         toolbar->Realize();
+
+        if (m_parentAsWindow && !GetBool(wxT("dontattachtoframe")))
+        {
+            wxFrame *parentFrame = wxDynamicCast(m_parent, wxFrame);
+            if (parentFrame)
+                parentFrame->SetToolBar(toolbar);
+        }
+
         return toolbar;
     }
 }
 
-
-
 bool wxToolBarXmlHandler::CanHandle(wxXmlNode *node)
 {
     return ((!m_isInside && IsOfClass(node, wxT("wxToolBar"))) ||
-            (m_isInside && IsOfClass(node, wxT("tool"))) || 
+            (m_isInside && IsOfClass(node, wxT("tool"))) ||
             (m_isInside && IsOfClass(node, wxT("separator"))));
 }
 
-#endif
+#endif // wxUSE_XRC && wxUSE_TOOLBAR