X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/76b49cf49ba9ee9f3eeec9730cb4bc4569ab17f1..15cac64f7564d48c274c6490774a77bd8c09f808:/src/xrc/xh_toolb.cpp diff --git a/src/xrc/xh_toolb.cpp b/src/xrc/xh_toolb.cpp index 7c1f0fa055..b6f518d4af 100644 --- a/src/xrc/xh_toolb.cpp +++ b/src/xrc/xh_toolb.cpp @@ -1,6 +1,6 @@ ///////////////////////////////////////////////////////////////////////////// // Name: src/xrc/xh_toolb.cpp -// Purpose: XRC resource for wxBoxSizer +// Purpose: XRC resource for wxToolBar // Author: Vaclav Slavik // Created: 2000/08/11 // RCS-ID: $Id$ @@ -21,10 +21,11 @@ #ifndef WX_PRECOMP #include "wx/frame.h" + #include "wx/log.h" + #include "wx/menu.h" + #include "wx/toolbar.h" #endif -#include "wx/toolbar.h" - IMPLEMENT_DYNAMIC_CLASS(wxToolBarXmlHandler, wxXmlResourceHandler) wxToolBarXmlHandler::wxToolBarXmlHandler() @@ -41,6 +42,12 @@ wxToolBarXmlHandler::wxToolBarXmlHandler() 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(); } @@ -48,48 +55,94 @@ 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 ) + { + wxLogError(_("XRC syntax error: \"tool\" only allowed inside a " + "toolbar")); + return NULL; + } - if (GetPosition() != wxDefaultPosition) + wxItemKind kind = wxITEM_NORMAL; + if (GetBool(wxT("radio"))) + kind = wxITEM_RADIO; + + if (GetBool(wxT("toggle"))) { - 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"))); + if ( kind != wxITEM_NORMAL ) + { + wxLogWarning(_("XRC syntax error: tool can't have both " + "\"radio\" and \"toggle\" properties, " + "ignoring the former.")); + } + + kind = wxITEM_CHECK; } - else + + // check whether we have dropdown tag inside + wxMenu *menu = NULL; // menu for drop down items + wxXmlNode * const nodeDropdown = GetParamNode("dropdown"); + if ( nodeDropdown ) { - wxItemKind kind = wxITEM_NORMAL; - if (GetBool(wxT("radio"))) - kind = wxITEM_RADIO; - if (GetBool(wxT("toggle"))) + if ( kind != wxITEM_NORMAL ) { - wxASSERT_MSG( kind == wxITEM_NORMAL, - _T("can't have both toggleable and radion button at once") ); - kind = wxITEM_CHECK; + 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.")); + } } - 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); } + + 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 } @@ -109,6 +162,7 @@ wxObject *wxToolBarXmlHandler::DoCreateResource() GetSize(), style, GetName()); + SetupWindow(toolbar); wxSize bmpsize = GetSize(wxT("bitmapsize")); if (!(bmpsize == wxDefaultSize)) @@ -122,8 +176,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)