X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/78d14f80e9a72041ede52c30d912ec5cef21b1b3..07aaf32633ecf18ec3edfbb41793a112914792d0:/src/xrc/xh_toolb.cpp diff --git a/src/xrc/xh_toolb.cpp b/src/xrc/xh_toolb.cpp index e8c125341f..0c10153648 100644 --- a/src/xrc/xh_toolb.cpp +++ b/src/xrc/xh_toolb.cpp @@ -1,16 +1,12 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: xh_toolb.cpp -// Purpose: XML 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" @@ -19,63 +15,192 @@ #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 + +#include "wx/xml/xml.h" -#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 XML 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 ) + { + ReportError("tool only allowed inside a wxToolBar"); + return NULL; + } + + wxItemKind kind = wxITEM_NORMAL; + if (GetBool(wxT("radio"))) + kind = wxITEM_RADIO; + + if (GetBool(wxT("toggle"))) + { + if ( kind != wxITEM_NORMAL ) + { + ReportParamError + ( + "toggle", + "tool can't have both and properties" + ); + } + + 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"); + if ( nodeDropdown ) + { + if ( kind != wxITEM_NORMAL ) + { + ReportParamError + ( + "dropdown", + "drop-down tool can't have neither nor 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" + ); + } + } + } +#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(wxS("checked")) ) + { + if ( kind == wxITEM_NORMAL ) + { + ReportParamError + ( + "checked", + "only nor tools can be checked" + ); + } + else + { + m_toolbar->ToggleTool(GetID(), true); + } + } + +#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 XML 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 } - + else /**/ { 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()); - - wxSize bmpsize = GetSize(wxT("bitmapsize")); - if (!(bmpsize == wxDefaultSize)) - toolbar->SetToolBitmapSize(bmpsize); + + XRC_MAKE_INSTANCE(toolbar, wxToolBar) + + toolbar->Create(m_parentAsWindow, + GetID(), + GetPosition(), + GetSize(), + style, + GetName()); + SetupWindow(toolbar); + + 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); @@ -87,43 +212,54 @@ 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); - if (IsOfClass(n, wxT("tool")) && - IsOfClass(n, wxT("separator")) && + if (!IsOfClass(n, wxT("tool")) && + !IsOfClass(n, wxT("separator")) && + !IsOfClass(n, wxT("space")) && control != NULL) toolbar->AddControl(control); } n = n->GetNext(); } - m_isInside = FALSE; + m_isInside = false; m_toolbar = NULL; + if (m_parentAsWindow && !GetBool(wxT("dontattachtoframe"))) + { + wxFrame *parentFrame = wxDynamicCast(m_parent, wxFrame); + if (parentFrame) + parentFrame->SetToolBar(toolbar); + } + toolbar->Realize(); + 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("space"))) || (m_isInside && IsOfClass(node, wxT("separator")))); } -#endif +#endif // wxUSE_XRC && wxUSE_TOOLBAR