X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/31528cd3cac75558beef4bce0ba21fd182a808ab..84c5b38d579e140df28cfbb649587e8862148c89:/src/motif/menuitem.cpp diff --git a/src/motif/menuitem.cpp b/src/motif/menuitem.cpp index f44459aaae..bb464edeae 100644 --- a/src/motif/menuitem.cpp +++ b/src/motif/menuitem.cpp @@ -10,14 +10,27 @@ /////////////////////////////////////////////////////////////////////////////// // ============================================================================ -// headers & declarations +// declarations // ============================================================================ +#ifdef __GNUG__ + #pragma implementation "menuitem.h" +#endif + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/defs.h" + #include "wx/menu.h" #include "wx/menuitem.h" #include "wx/utils.h" #include "wx/frame.h" +#ifdef __VMS__ +#pragma message disable nosimpint +#endif #include #include #include @@ -27,15 +40,19 @@ #include #include #include +#ifdef __VMS__ +#pragma message enable nosimpint +#endif #include "wx/motif/private.h" -void wxMenuItemCallback (Widget w, XtPointer clientData, - XtPointer ptr); -void wxMenuItemArmCallback (Widget w, XtPointer clientData, - XtPointer ptr); -void wxMenuItemDisarmCallback (Widget w, XtPointer clientData, - XtPointer ptr); +// ---------------------------------------------------------------------------- +// functions prototypes +// ---------------------------------------------------------------------------- + +static void wxMenuItemCallback(Widget w, XtPointer clientData, XtPointer ptr); +static void wxMenuItemArmCallback(Widget w, XtPointer clientData, XtPointer ptr); +static void wxMenuItemDisarmCallback(Widget w, XtPointer clientData, XtPointer ptr); // ============================================================================ // implementation @@ -45,9 +62,7 @@ void wxMenuItemDisarmCallback (Widget w, XtPointer clientData, // dynamic classes implementation // ---------------------------------------------------------------------------- -#if !USE_SHARED_LIBRARY -IMPLEMENT_DYNAMIC_CLASS(wxMenuItem, wxObject) -#endif //USE_SHARED_LIBRARY + IMPLEMENT_DYNAMIC_CLASS(wxMenuItem, wxObject) // ---------------------------------------------------------------------------- // wxMenuItem @@ -59,23 +74,24 @@ IMPLEMENT_DYNAMIC_CLASS(wxMenuItem, wxObject) wxMenuItem::wxMenuItem(wxMenu *pParentMenu, int id, const wxString& strName, const wxString& strHelp, bool bCheckable, - wxMenu *pSubMenu) : -m_strHelp(strHelp), -m_bCheckable(bCheckable), -m_strName(strName) + wxMenu *pSubMenu) { - wxASSERT( pParentMenu != NULL ); - - m_pParentMenu = pParentMenu; - m_pSubMenu = pSubMenu; - m_idItem = id; - m_bEnabled = TRUE; - m_bChecked = FALSE; - - //// Motif-specific - m_menuBar = NULL; + wxASSERT_MSG( pParentMenu != NULL, wxT("menuitem should have a menu") ); + + // common init + m_parentMenu = pParentMenu; + m_subMenu = pSubMenu; + m_id = id; + m_isEnabled = TRUE; + m_isChecked = FALSE; + m_help = strHelp; + m_isCheckable = bCheckable; + m_text = strName; + + // Motif-specific + m_menuBar = NULL; m_buttonWidget = (WXWidget) NULL; - m_topMenu = NULL; + m_topMenu = NULL; } wxMenuItem::~wxMenuItem() @@ -88,10 +104,10 @@ wxMenuItem::~wxMenuItem() // delete the sub menu void wxMenuItem::DeleteSubMenu() { - wxASSERT( m_pSubMenu != NULL ); + wxASSERT( m_subMenu != NULL ); - delete m_pSubMenu; - m_pSubMenu = NULL; + delete m_subMenu; + m_subMenu = NULL; } // change item state @@ -99,10 +115,11 @@ void wxMenuItem::DeleteSubMenu() void wxMenuItem::Enable(bool bDoEnable) { - if ( m_bEnabled != bDoEnable ) + if ( m_isEnabled != bDoEnable ) { - if ( m_pSubMenu == NULL ) - { // normal menu item + if ( !IsSubMenu() ) + { + // normal menu item if (m_buttonWidget) XtSetSensitive( (Widget) m_buttonWidget, (Boolean) bDoEnable); } @@ -114,7 +131,7 @@ void wxMenuItem::Enable(bool bDoEnable) XtSetSensitive( (Widget) m_buttonWidget, (Boolean) bDoEnable); } - m_bEnabled = bDoEnable; + wxMenuItemBase::Enable(bDoEnable); } } @@ -122,17 +139,46 @@ void wxMenuItem::Check(bool bDoCheck) { wxCHECK_RET( IsCheckable(), "only checkable items may be checked" ); - if ( m_bChecked != bDoCheck ) + if ( m_isChecked != bDoCheck ) { - if (m_buttonWidget && XtIsSubclass ((Widget) m_buttonWidget, xmToggleButtonGadgetClass)) + if ( m_buttonWidget ) { - XtVaSetValues ( (Widget) m_buttonWidget, XmNset, (Boolean) bDoCheck, NULL); + wxASSERT_MSG( XtIsSubclass((Widget)m_buttonWidget, + xmToggleButtonGadgetClass), + wxT("checkable menu item must be a toggle button") ); + + XtVaSetValues((Widget)m_buttonWidget, + XmNset, (Boolean)bDoCheck, + NULL); } - m_bChecked = bDoCheck; + + wxMenuItemBase::Check(bDoCheck); } } -//// Motif-specific +/* static */ +wxString wxMenuItemBase::GetLabelFromText(const wxString& text) +{ + return wxStripMenuCodes(text); +} + +// ---------------------------------------------------------------------------- +// wxMenuItemBase +// ---------------------------------------------------------------------------- + +wxMenuItem *wxMenuItemBase::New(wxMenu *parentMenu, + int id, + const wxString& name, + const wxString& help, + bool isCheckable, + wxMenu *subMenu) +{ + return new wxMenuItem(parentMenu, id, name, help, isCheckable, subMenu); +} + +// ---------------------------------------------------------------------------- +// Motif-specific +// ---------------------------------------------------------------------------- void wxMenuItem::CreateItem (WXWidget menu, wxMenuBar * menuBar, wxMenu * topMenu) { @@ -143,12 +189,12 @@ void wxMenuItem::CreateItem (WXWidget menu, wxMenuBar * menuBar, wxMenu * topMen { // Id=-2 identifies a Title item. m_buttonWidget = (WXWidget) XtVaCreateManagedWidget - (wxStripMenuCodes(m_strName), + (wxStripMenuCodes(m_text), xmLabelGadgetClass, (Widget) menu, NULL); } - else if ((!m_strName.IsNull() && m_strName != "") && (!m_pSubMenu)) + else if ((!m_text.IsNull() && m_text != "") && (!m_subMenu)) { - wxString strName = wxStripMenuCodes(m_strName); + wxString strName = wxStripMenuCodes(m_text); if (IsCheckable()) { m_buttonWidget = (WXWidget) XtVaCreateManagedWidget (strName, @@ -160,13 +206,13 @@ void wxMenuItem::CreateItem (WXWidget menu, wxMenuBar * menuBar, wxMenu * topMen m_buttonWidget = (WXWidget) XtVaCreateManagedWidget (strName, xmPushButtonGadgetClass, (Widget) menu, NULL); - char mnem = wxFindMnemonic (m_strName); + char mnem = wxFindMnemonic (m_text); if (mnem != 0) XtVaSetValues ((Widget) m_buttonWidget, XmNmnemonic, mnem, NULL); //// TODO: proper accelerator treatment. What does wxFindAccelerator //// look for? - strName = m_strName; + strName = m_text; char *accel = wxFindAccelerator (strName); if (accel) XtVaSetValues ((Widget) m_buttonWidget, XmNaccelerator, accel, NULL); @@ -203,10 +249,10 @@ void wxMenuItem::CreateItem (WXWidget menu, wxMenuBar * menuBar, wxMenu * topMen m_buttonWidget = (WXWidget) XtVaCreateManagedWidget ("separator", xmSeparatorGadgetClass, (Widget) menu, NULL); } - else if (m_pSubMenu) + else if (m_subMenu) { - m_buttonWidget = m_pSubMenu->CreateMenu (menuBar, menu, topMenu, m_strName, TRUE); - m_pSubMenu->SetButtonWidget(m_buttonWidget); + m_buttonWidget = m_subMenu->CreateMenu (menuBar, menu, topMenu, m_text, TRUE); + m_subMenu->SetButtonWidget(m_buttonWidget); XtAddCallback ((Widget) m_buttonWidget, XmNcascadingCallback, (XtCallbackProc) wxMenuItemArmCallback, @@ -220,10 +266,10 @@ void wxMenuItem::DestroyItem(bool full) { if (GetId() == -2) { - ; // Nothing + ; // Nothing } - else if ((!m_strName.IsNull() && (m_strName != "")) && !m_pSubMenu) + else if ((!m_text.IsNull() && (m_text != "")) && !m_subMenu) { if (m_buttonWidget) { @@ -241,7 +287,7 @@ void wxMenuItem::DestroyItem(bool full) } else if (GetId() == -1) { - ; // Nothing + ; // Nothing } else if (GetSubMenu()) @@ -251,7 +297,7 @@ void wxMenuItem::DestroyItem(bool full) XtRemoveCallback ((Widget) m_buttonWidget, XmNcascadingCallback, wxMenuItemArmCallback, (XtPointer) this); } - m_pSubMenu->DestroyMenu(full); + m_subMenu->DestroyMenu(full); if (full) m_buttonWidget = NULL; } @@ -263,18 +309,18 @@ void wxMenuItem::DestroyItem(bool full) } } -void wxMenuItem::SetLabel(const wxString& label) +void wxMenuItem::SetText(const wxString& label) { char mnem = wxFindMnemonic (label); wxString label2 = wxStripMenuCodes(label); - m_strName = label; + m_text = label; if (m_buttonWidget) { wxXmString label_str(label2); XtVaSetValues ((Widget) m_buttonWidget, - XmNlabelString, label_str, + XmNlabelString, label_str(), NULL); if (mnem != 0) XtVaSetValues ((Widget) m_buttonWidget, XmNmnemonic, mnem, NULL); @@ -291,8 +337,12 @@ void wxMenuItem::SetLabel(const wxString& label) } } -void wxMenuItemCallback (Widget w, XtPointer clientData, - XtPointer ptr) +// ---------------------------------------------------------------------------- +// Motif callbacks +// ---------------------------------------------------------------------------- + +void wxMenuItemCallback (Widget WXUNUSED(w), XtPointer clientData, + XtPointer WXUNUSED(ptr)) { wxMenuItem *item = (wxMenuItem *) clientData; if (item) @@ -301,7 +351,9 @@ void wxMenuItemCallback (Widget w, XtPointer clientData, { Boolean isChecked = FALSE; XtVaGetValues ((Widget) item->GetButtonWidget(), XmNset, & isChecked, NULL); - item->SetChecked(isChecked); + + // only set the flag, don't actually check anything + item->wxMenuItemBase::Check(isChecked); } if (item->GetMenuBar() && item->GetMenuBar()->GetMenuBarFrame()) { @@ -322,8 +374,8 @@ void wxMenuItemCallback (Widget w, XtPointer clientData, } } -void wxMenuItemArmCallback (Widget w, XtPointer clientData, - XtPointer ptr) +void wxMenuItemArmCallback (Widget WXUNUSED(w), XtPointer clientData, + XtPointer WXUNUSED(ptr)) { wxMenuItem *item = (wxMenuItem *) clientData; if (item) @@ -339,8 +391,8 @@ void wxMenuItemArmCallback (Widget w, XtPointer clientData, } void -wxMenuItemDisarmCallback (Widget w, XtPointer clientData, - XtPointer ptr) +wxMenuItemDisarmCallback (Widget WXUNUSED(w), XtPointer clientData, + XtPointer WXUNUSED(ptr)) { wxMenuItem *item = (wxMenuItem *) clientData; if (item)