- 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 )
+ {
+ 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 <radio> and <toggle> properties"
+ );
+ }
+
+ 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 )
+ {
+ ReportParamError
+ (
+ "dropdown",
+ "drop-down tool can't have neither <radio> nor <toggle> 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"
+ );
+ }
+ }
+ }
+
+ 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 ( menu )
+ tool->SetDropdownMenu(menu);
+