X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f25881804583790351480098b50f4ce1b924e697..07aaf32633ecf18ec3edfbb41793a112914792d0:/src/xrc/xh_menu.cpp diff --git a/src/xrc/xh_menu.cpp b/src/xrc/xh_menu.cpp index a7935f8018..275c78aa62 100644 --- a/src/xrc/xh_menu.cpp +++ b/src/xrc/xh_menu.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: xh_menu.cpp +// Name: src/xrc/xh_menu.cpp // Purpose: XRC resource for menus and menubars // Author: Vaclav Slavik // Created: 2000/03/05 @@ -7,10 +7,6 @@ // Copyright: (c) 2000 Vaclav Slavik // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// - -#ifdef __GNUG__ -#pragma implementation "xh_menu.h" -#endif // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -19,40 +15,53 @@ #pragma hdrstop #endif +#if wxUSE_XRC && wxUSE_MENUS + #include "wx/xrc/xh_menu.h" -#include "wx/menu.h" -#include "wx/frame.h" +#ifndef WX_PRECOMP + #include "wx/frame.h" + #include "wx/log.h" + #include "wx/menu.h" +#endif -wxMenuXmlHandler::wxMenuXmlHandler() : - wxXmlResourceHandler(), m_insideMenu(FALSE) +IMPLEMENT_DYNAMIC_CLASS(wxMenuXmlHandler, wxXmlResourceHandler) + +wxMenuXmlHandler::wxMenuXmlHandler() : + wxXmlResourceHandler(), m_insideMenu(false) { - ADD_STYLE(wxMENU_TEAROFF); + XRC_ADD_STYLE(wxMENU_TEAROFF); } - - wxObject *wxMenuXmlHandler::DoCreateResource() { if (m_class == wxT("wxMenu")) { - wxMenu *menu = new wxMenu(GetStyle()); + wxMenu *menu = m_instance ? wxStaticCast(m_instance, wxMenu) + : new wxMenu(GetStyle()); + wxString title = GetText(wxT("label")); wxString help = GetText(wxT("help")); - + bool oldins = m_insideMenu; - m_insideMenu = TRUE; - CreateChildren(menu, TRUE/*only this handler*/); + m_insideMenu = true; + CreateChildren(menu, true/*only this handler*/); m_insideMenu = oldins; wxMenuBar *p_bar = wxDynamicCast(m_parent, wxMenuBar); if (p_bar) + { p_bar->Append(menu, title); + } else { wxMenu *p_menu = wxDynamicCast(m_parent, wxMenu); if (p_menu) + { p_menu->Append(GetID(), title, menu, help); + if (HasParam(wxT("enabled"))) + p_menu->Enable(GetID(), GetBool(wxT("enabled"))); + } } return menu; @@ -61,7 +70,7 @@ wxObject *wxMenuXmlHandler::DoCreateResource() else { wxMenu *p_menu = wxDynamicCast(m_parent, wxMenu); - + if (m_class == wxT("separator")) p_menu->AppendSeparator(); else if (m_class == wxT("break")) @@ -69,23 +78,50 @@ wxObject *wxMenuXmlHandler::DoCreateResource() else /*wxMenuItem*/ { int id = GetID(); - bool checkable = GetBool(wxT("checkable")); wxString label = GetText(wxT("label")); - wxString accel = GetText(wxT("accel")); + wxString accel = GetText(wxT("accel"), false); wxString fullLabel = label; - if (!accel.IsEmpty()) + if (!accel.empty()) fullLabel << wxT("\t") << accel; + wxItemKind kind = wxITEM_NORMAL; + if (GetBool(wxT("radio"))) + kind = wxITEM_RADIO; + if (GetBool(wxT("checkable"))) + { + if ( kind != wxITEM_NORMAL ) + { + ReportParamError + ( + "checkable", + "menu item can't have both and properties" + ); + } + + kind = wxITEM_CHECK; + } + wxMenuItem *mitem = new wxMenuItem(p_menu, id, fullLabel, - GetText(wxT("help")), checkable); - -#if wxCHECK_VERSION(2,3,0) || defined(__WXMSW__) - if (HasParam(wxT("bitmap"))) - mitem->SetBitmap(GetBitmap(wxT("bitmap"))); + GetText(wxT("help")), kind); + +#if (!defined(__WXMSW__) && !defined(__WXPM__)) || wxUSE_OWNER_DRAWN + if (HasParam(wxT("bitmap"))) + { + // currently only wxMSW has support for using different checked + // and unchecked bitmaps for menu items +#ifdef __WXMSW__ + if (HasParam(wxT("bitmap2"))) + mitem->SetBitmaps(GetBitmap(wxT("bitmap2"), wxART_MENU), + GetBitmap(wxT("bitmap"), wxART_MENU)); + else +#endif // __WXMSW__ + mitem->SetBitmap(GetBitmap(wxT("bitmap"), wxART_MENU)); + } #endif p_menu->Append(mitem); - mitem->Enable(GetBool(wxT("enabled"), TRUE)); - if (checkable) mitem->Check(GetBool(wxT("checked"))); + mitem->Enable(GetBool(wxT("enabled"), true)); + if (kind == wxITEM_CHECK) + mitem->Check(GetBool(wxT("checked"))); } return NULL; } @@ -96,26 +132,33 @@ wxObject *wxMenuXmlHandler::DoCreateResource() bool wxMenuXmlHandler::CanHandle(wxXmlNode *node) { return IsOfClass(node, wxT("wxMenu")) || - (m_insideMenu && + (m_insideMenu && (IsOfClass(node, wxT("wxMenuItem")) || IsOfClass(node, wxT("break")) || IsOfClass(node, wxT("separator"))) ); } - - +IMPLEMENT_DYNAMIC_CLASS(wxMenuBarXmlHandler, wxXmlResourceHandler) wxMenuBarXmlHandler::wxMenuBarXmlHandler() : wxXmlResourceHandler() { - ADD_STYLE(wxMB_DOCKABLE); + XRC_ADD_STYLE(wxMB_DOCKABLE); } - - wxObject *wxMenuBarXmlHandler::DoCreateResource() { - wxMenuBar *menubar = new wxMenuBar(GetStyle()); + wxMenuBar *menubar = NULL; + + const int style = GetStyle(); + wxASSERT_MSG(!style || !m_instance, + "cannot use