X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/338dd992160bf20205743c092b353d96ef7604fb..d77836e48cf1a0f7575cd1ce66f59f5bc07e5b56:/src/motif/menuitem.cpp diff --git a/src/motif/menuitem.cpp b/src/motif/menuitem.cpp index d582065f47..c680eaeaad 100644 --- a/src/motif/menuitem.cpp +++ b/src/motif/menuitem.cpp @@ -13,14 +13,15 @@ // declarations // ============================================================================ -#ifdef __GNUG__ - #pragma implementation "menuitem.h" -#endif - // ---------------------------------------------------------------------------- // headers // ---------------------------------------------------------------------------- +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#include "wx/defs.h" + #include "wx/menu.h" #include "wx/menuitem.h" #include "wx/utils.h" @@ -60,9 +61,7 @@ static void wxMenuItemDisarmCallback(Widget w, XtPointer clientData, XtPointer p // dynamic classes implementation // ---------------------------------------------------------------------------- -#if !USE_SHARED_LIBRARY - IMPLEMENT_DYNAMIC_CLASS(wxMenuItem, wxObject) -#endif //USE_SHARED_LIBRARY +IMPLEMENT_DYNAMIC_CLASS(wxMenuItem, wxObject) // ---------------------------------------------------------------------------- // wxMenuItem @@ -71,23 +70,14 @@ static void wxMenuItemDisarmCallback(Widget w, XtPointer clientData, XtPointer p // ctor & dtor // ----------- -wxMenuItem::wxMenuItem(wxMenu *pParentMenu, int id, - const wxString& strName, const wxString& strHelp, - bool bCheckable, +wxMenuItem::wxMenuItem(wxMenu *pParentMenu, + int id, + const wxString& strName, + const wxString& strHelp, + wxItemKind kind, wxMenu *pSubMenu) + : wxMenuItemBase(pParentMenu, id, strName, strHelp, kind, pSubMenu) { - 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; @@ -98,24 +88,12 @@ wxMenuItem::~wxMenuItem() { } -// misc -// ---- - -// delete the sub menu -void wxMenuItem::DeleteSubMenu() -{ - wxASSERT( m_subMenu != NULL ); - - delete m_subMenu; - m_subMenu = NULL; -} - // change item state // ----------------- void wxMenuItem::Enable(bool bDoEnable) { - if ( m_isChecked != bDoEnable ) + if ( m_isEnabled != bDoEnable ) { if ( !IsSubMenu() ) { @@ -156,12 +134,12 @@ void wxMenuItem::Check(bool bDoCheck) } } -wxString wxMenuItem::GetLabel() const +/* static */ +wxString wxMenuItemBase::GetLabelFromText(const wxString& text) { - return wxStripMenuCodes(m_text); + return wxStripMenuCodes(text); } - // ---------------------------------------------------------------------------- // wxMenuItemBase // ---------------------------------------------------------------------------- @@ -170,24 +148,25 @@ wxMenuItem *wxMenuItemBase::New(wxMenu *parentMenu, int id, const wxString& name, const wxString& help, - bool isCheckable, + wxItemKind kind, wxMenu *subMenu) { - return new wxMenuItem(parentMenu, id, name, help, isCheckable, subMenu); + return new wxMenuItem(parentMenu, id, name, help, kind, subMenu); } // ---------------------------------------------------------------------------- // Motif-specific // ---------------------------------------------------------------------------- -void wxMenuItem::CreateItem (WXWidget menu, wxMenuBar * menuBar, wxMenu * topMenu) +void wxMenuItem::CreateItem (WXWidget menu, wxMenuBar * menuBar, + wxMenu * topMenu, size_t index) { m_menuBar = menuBar; m_topMenu = topMenu; - if (GetId() == -2) + if (GetId() == -3) { - // Id=-2 identifies a Title item. + // Id=-3 identifies a Title item. m_buttonWidget = (WXWidget) XtVaCreateManagedWidget (wxStripMenuCodes(m_text), xmLabelGadgetClass, (Widget) menu, NULL); @@ -199,12 +178,18 @@ void wxMenuItem::CreateItem (WXWidget menu, wxMenuBar * menuBar, wxMenu * topMen { m_buttonWidget = (WXWidget) XtVaCreateManagedWidget (strName, xmToggleButtonGadgetClass, (Widget) menu, +#ifdef XmNpositionIndex + XmNpositionIndex, index, +#endif NULL); XtVaSetValues ((Widget) m_buttonWidget, XmNset, (Boolean) IsChecked(), NULL); } else m_buttonWidget = (WXWidget) XtVaCreateManagedWidget (strName, xmPushButtonGadgetClass, (Widget) menu, +#ifdef XmNpositionIndex + XmNpositionIndex, index, +#endif NULL); char mnem = wxFindMnemonic (m_text); if (mnem != 0) @@ -244,14 +229,18 @@ void wxMenuItem::CreateItem (WXWidget menu, wxMenuBar * menuBar, wxMenu * topMen (XtCallbackProc) wxMenuItemDisarmCallback, (XtPointer) this); } - else if (GetId() == -1) + else if (GetId() == wxID_SEPARATOR) { m_buttonWidget = (WXWidget) XtVaCreateManagedWidget ("separator", - xmSeparatorGadgetClass, (Widget) menu, NULL); + xmSeparatorGadgetClass, (Widget) menu, +#ifndef XmNpositionIndex + XmNpositionIndex, index, +#endif + NULL); } else if (m_subMenu) { - m_buttonWidget = m_subMenu->CreateMenu (menuBar, menu, topMenu, m_text, TRUE); + m_buttonWidget = m_subMenu->CreateMenu (menuBar, menu, topMenu, index, m_text, true); m_subMenu->SetButtonWidget(m_buttonWidget); XtAddCallback ((Widget) m_buttonWidget, XmNcascadingCallback, @@ -264,7 +253,7 @@ void wxMenuItem::CreateItem (WXWidget menu, wxMenuBar * menuBar, wxMenu * topMen void wxMenuItem::DestroyItem(bool full) { - if (GetId() == -2) + if (GetId() == -3) { ; // Nothing @@ -285,7 +274,7 @@ void wxMenuItem::DestroyItem(bool full) wxMenuItemDisarmCallback, (XtPointer) this); } } - else if (GetId() == -1) + else if (GetId() == wxID_SEPARATOR) { ; // Nothing @@ -347,29 +336,42 @@ void wxMenuItemCallback (Widget WXUNUSED(w), XtPointer clientData, wxMenuItem *item = (wxMenuItem *) clientData; if (item) { + wxCommandEvent event(wxEVT_COMMAND_MENU_SELECTED, item->GetId()); + event.SetInt( item->GetId() ); + if (item->IsCheckable()) { - Boolean isChecked = FALSE; - XtVaGetValues ((Widget) item->GetButtonWidget(), XmNset, & isChecked, NULL); + Boolean isChecked = false; + XtVaGetValues ((Widget) item->GetButtonWidget(), + XmNset, & isChecked, + NULL); // only set the flag, don't actually check anything item->wxMenuItemBase::Check(isChecked); + event.SetInt(isChecked); } + if (item->GetMenuBar() && item->GetMenuBar()->GetMenuBarFrame()) { - wxCommandEvent commandEvent(wxEVT_COMMAND_MENU_SELECTED, item->GetId()); - commandEvent.SetEventObject(item->GetMenuBar()->GetMenuBarFrame()); - commandEvent.SetInt( item->GetId() ); + event.SetEventObject(item->GetMenuBar()->GetMenuBarFrame()); - item->GetMenuBar()->GetMenuBarFrame()->GetEventHandler()->ProcessEvent(commandEvent); + item->GetMenuBar()->GetMenuBarFrame() + ->GetEventHandler()->ProcessEvent(event); } + // this is the child of a popup menu else if (item->GetTopMenu()) { - wxCommandEvent event (wxEVT_COMMAND_MENU_SELECTED, item->GetId()); event.SetEventObject(item->GetTopMenu()); - event.SetInt( item->GetId() ); item->GetTopMenu()->ProcessCommand (event); + + // Since PopupMenu under Motif still grab right mouse + // button events after it was closed, we need to delete + // the associated widgets to allow next PopUpMenu to + // appear; this needs to be done there because doing it in + // a WorkProc as before may cause crashes if a menu item causes + // the parent window of the menu to be destroyed + item->GetTopMenu()->DestroyWidgetAndDetach(); } } } @@ -385,7 +387,8 @@ void wxMenuItemArmCallback (Widget WXUNUSED(w), XtPointer clientData, wxMenuEvent menuEvent(wxEVT_MENU_HIGHLIGHT, item->GetId()); menuEvent.SetEventObject(item->GetMenuBar()->GetMenuBarFrame()); - item->GetMenuBar()->GetMenuBarFrame()->GetEventHandler()->ProcessEvent(menuEvent); + item->GetMenuBar()->GetMenuBarFrame() + ->GetEventHandler()->ProcessEvent(menuEvent); } } } @@ -404,7 +407,8 @@ wxMenuItemDisarmCallback (Widget WXUNUSED(w), XtPointer clientData, wxMenuEvent menuEvent(wxEVT_MENU_HIGHLIGHT, -1); menuEvent.SetEventObject(item->GetMenuBar()->GetMenuBarFrame()); - item->GetMenuBar()->GetMenuBarFrame()->GetEventHandler()->ProcessEvent(menuEvent); + item->GetMenuBar()->GetMenuBarFrame() + ->GetEventHandler()->ProcessEvent(menuEvent); } } }