X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b5d6954b87d910969226ffade9714db7429211f3..2296fe5018d42d4e0bf9df07c37d31f60d972b32:/src/xrc/xh_toolb.cpp diff --git a/src/xrc/xh_toolb.cpp b/src/xrc/xh_toolb.cpp index 3cddf6f6b2..53c5088d4f 100644 --- a/src/xrc/xh_toolb.cpp +++ b/src/xrc/xh_toolb.cpp @@ -7,8 +7,8 @@ // Copyright: (c) 2000 Vaclav Slavik // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// - -#ifdef __GNUG__ + +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "xh_toolb.h" #endif @@ -19,59 +19,93 @@ #pragma hdrstop #endif +#if wxUSE_XRC && wxUSE_TOOLBAR + #include "wx/xrc/xh_toolb.h" #include "wx/toolbar.h" +#include "wx/frame.h" +IMPLEMENT_DYNAMIC_CLASS(wxToolBarXmlHandler, wxXmlResourceHandler) -#if wxUSE_TOOLBAR - -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); + 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 (GetPosition() != wxDefaultPosition) + { + 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"))); + } + else + { + 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 toggleable and radion button at once") ); + 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"))); + } 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!")); m_toolbar->AddSeparator(); 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()); + + XRC_MAKE_INSTANCE(toolbar, wxToolBar) + + toolbar->Create(m_parentAsWindow, + GetID(), + GetPosition(), + GetSize(), + style, + GetName()); wxSize bmpsize = GetSize(wxT("bitmapsize")); if (!(bmpsize == wxDefaultSize)) @@ -87,17 +121,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 +146,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