X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/db927071d5316194fc60a29d6007963c1945c908..247afab527ec1355b9caaa0eea76b981db92a782:/src/motif/menu.cpp diff --git a/src/motif/menu.cpp b/src/motif/menu.cpp index abbe28a365..65fcead053 100644 --- a/src/motif/menu.cpp +++ b/src/motif/menu.cpp @@ -33,8 +33,6 @@ #ifdef __VMS__ #pragma message disable nosimpint -#define XtDisplay XTDISPLAY -#define XtWindow XTWINDOW #endif #include #include @@ -74,7 +72,7 @@ void wxMenu::Init() m_popupShell = (WXWidget) NULL; m_buttonWidget = (WXWidget) NULL; m_menuId = 0; - m_topLevelMenu = (wxMenu*) NULL; + m_topLevelMenu = NULL; m_ownedByMenuBar = false; if ( !m_title.empty() ) @@ -82,10 +80,6 @@ void wxMenu::Init() Append(-3, m_title) ; AppendSeparator() ; } - - m_backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_MENU); - m_foregroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_MENUTEXT); - m_font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT); } // The wxWindow destructor will take care of deleting the submenus. @@ -166,17 +160,14 @@ void wxMenu::SetTitle(const wxString& label) bool wxMenu::ProcessCommand(wxCommandEvent & event) { - bool processed = false; + // Try the menu's event handler first + wxEvtHandler * const handler = GetEventHandler(); + bool processed = handler ? handler->SafelyProcessEvent(event) : false; - // Try the menu's event handler - if ( !processed && GetEventHandler()) - { - processed = GetEventHandler()->ProcessEvent(event); - } // Try the window the menu was popped up from (and up // through the hierarchy) if ( !processed && GetInvokingWindow()) - processed = GetInvokingWindow()->ProcessEvent(event); + processed = GetInvokingWindow()->HandleWindowEvent(event); return processed; } @@ -190,9 +181,6 @@ void wxMenuBar::Init() m_eventHandler = this; m_menuBarFrame = NULL; m_mainWidget = (WXWidget) NULL; - m_backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_MENU); - m_foregroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_MENUTEXT); - m_font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT); } wxMenuBar::wxMenuBar(size_t n, wxMenu *menus[], const wxArrayString& titles, long WXUNUSED(style)) @@ -228,7 +216,7 @@ void wxMenuBar::EnableTop(size_t WXUNUSED(pos), bool WXUNUSED(flag)) // wxLogWarning("wxMenuBar::EnableTop not yet implemented."); } -void wxMenuBar::SetLabelTop(size_t pos, const wxString& label) +void wxMenuBar::SetMenuLabel(size_t pos, const wxString& label) { wxMenu *menu = GetMenu(pos); if ( !menu ) @@ -243,26 +231,14 @@ void wxMenuBar::SetLabelTop(size_t pos, const wxString& label) XmNlabelString, label_str(), NULL); } + m_titles[pos] = label; } -wxString wxMenuBar::GetLabelTop(size_t pos) const +wxString wxMenuBar::GetMenuLabel(size_t pos) const { - wxMenu *menu = GetMenu(pos); - if ( menu ) - { - Widget w = (Widget)menu->GetButtonWidget(); - if (w) - { - XmString text; - XtVaGetValues(w, - XmNlabelString, &text, - NULL); - - return wxXmStringToString( text ); - } - } - - return wxEmptyString; + wxCHECK_MSG( pos < GetMenuCount(), wxEmptyString, + wxT("invalid menu index in wxMenuBar::GetMenuLabel") ); + return m_titles[pos]; } bool wxMenuBar::Append(wxMenu * menu, const wxString& title) @@ -349,6 +325,10 @@ wxMenuItem *wxMenuBar::FindItem(int id, wxMenu ** itemMenu) const // Create menubar bool wxMenuBar::CreateMenuBar(wxFrame* parent) { + m_parent = parent; // bleach... override it! + PreCreation(); + m_parent = NULL; + if (m_mainWidget) { XtVaSetValues((Widget) parent->GetMainWidget(), XmNmenuBar, (Widget) m_mainWidget, NULL); @@ -384,13 +364,11 @@ bool wxMenuBar::CreateMenuBar(wxFrame* parent) Widget tearOff = XmGetTearOffControl(GetWidget(menu)); wxDoChangeForegroundColour((Widget) tearOff, m_foregroundColour); wxDoChangeBackgroundColour((Widget) tearOff, m_backgroundColour, true); -#endif } +#endif } - SetBackgroundColour(m_backgroundColour); - SetForegroundColour(m_foregroundColour); - SetFont(m_font); + PostCreation(); XtVaSetValues((Widget) parent->GetMainWidget(), XmNmenuBar, (Widget) m_mainWidget, NULL); XtRealizeWidget ((Widget) menuBarW); @@ -405,7 +383,7 @@ bool wxMenuBar::DestroyMenuBar() { if (!m_mainWidget) { - SetMenuBarFrame((wxFrame*) NULL); + SetMenuBarFrame(NULL); return false; } @@ -422,7 +400,7 @@ bool wxMenuBar::DestroyMenuBar() XtDestroyWidget((Widget) m_mainWidget); m_mainWidget = (WXWidget) 0; - SetMenuBarFrame((wxFrame*) NULL); + SetMenuBarFrame(NULL); return true; } @@ -474,13 +452,24 @@ WXWidget wxMenu::CreateMenu (wxMenuBar * menuBar, { Widget menu = (Widget) 0; Widget buttonWidget = (Widget) 0; + Display* dpy = XtDisplay((Widget)parent); Arg args[5]; XtSetArg (args[0], XmNnumColumns, m_numColumns); XtSetArg (args[1], XmNpacking, (m_numColumns > 1) ? XmPACK_COLUMN : XmPACK_TIGHT); + if ( !m_font.Ok() ) + { + if ( menuBar ) + m_font = menuBar->GetFont(); + else if ( GetInvokingWindow() ) + m_font = GetInvokingWindow()->GetFont(); + } + + XtSetArg (args[2], (String)wxFont::GetFontTag(), m_font.GetFontTypeC(dpy) ); + if (!pullDown) { - menu = XmCreatePopupMenu ((Widget) parent, wxMOTIF_STR("popup"), args, 2); + menu = XmCreatePopupMenu ((Widget) parent, wxMOTIF_STR("popup"), args, 3); #if 0 XtAddCallback(menu, XmNunmapCallback, @@ -491,7 +480,7 @@ WXWidget wxMenu::CreateMenu (wxMenuBar * menuBar, else { char mnem = wxFindMnemonic (title); - menu = XmCreatePulldownMenu ((Widget) parent, wxMOTIF_STR("pulldown"), args, 2); + menu = XmCreatePulldownMenu ((Widget) parent, wxMOTIF_STR("pulldown"), args, 3); wxString title2(wxStripMenuCodes(title)); wxXmString label_str(title2); @@ -503,6 +492,8 @@ WXWidget wxMenu::CreateMenu (wxMenuBar * menuBar, #endif XmNlabelString, label_str(), XmNsubMenuId, menu, + (String)wxFont::GetFontTag(), m_font.GetFontTypeC(dpy), + XmNpositionIndex, index, NULL); if (mnem != 0) @@ -523,9 +514,7 @@ WXWidget wxMenu::CreateMenu (wxMenuBar * menuBar, item->CreateItem(menu, menuBar, topMenu, i); } - SetBackgroundColour(m_backgroundColour); - SetForegroundColour(m_foregroundColour); - SetFont(m_font); + ChangeFont(); return buttonWidget; } @@ -540,7 +529,7 @@ void wxMenu::DestroyMenu (bool full) node = node->GetNext() ) { wxMenuItem *item = node->GetData(); - item->SetMenuBar((wxMenuBar*) NULL); + item->SetMenuBar(NULL); item->DestroyItem(full); } @@ -566,7 +555,7 @@ WXWidget wxMenu::FindMenuItem (int id, wxMenuItem ** it) const if (id == m_menuId) { if (it) - *it = (wxMenuItem*) NULL; + *it = NULL; return m_buttonWidget; } @@ -593,13 +582,15 @@ WXWidget wxMenu::FindMenuItem (int id, wxMenuItem ** it) const } if (it) - *it = (wxMenuItem*) NULL; + *it = NULL; return (WXWidget) NULL; } void wxMenu::SetBackgroundColour(const wxColour& col) { m_backgroundColour = col; + if (!col.Ok()) + return; if (m_menuWidget) wxDoChangeBackgroundColour(m_menuWidget, (wxColour&) col); if (m_buttonWidget) @@ -623,6 +614,8 @@ void wxMenu::SetBackgroundColour(const wxColour& col) void wxMenu::SetForegroundColour(const wxColour& col) { m_foregroundColour = col; + if (!col.Ok()) + return; if (m_menuWidget) wxDoChangeForegroundColour(m_menuWidget, (wxColour&) col); if (m_buttonWidget) @@ -689,7 +682,10 @@ void wxMenu::SetFont(const wxFont& font) bool wxMenuBar::SetBackgroundColour(const wxColour& col) { - m_backgroundColour = col; + if (!wxWindowBase::SetBackgroundColour(col)) + return false; + if (!col.Ok()) + return false; if (m_mainWidget) wxDoChangeBackgroundColour(m_mainWidget, (wxColour&) col); @@ -702,7 +698,10 @@ bool wxMenuBar::SetBackgroundColour(const wxColour& col) bool wxMenuBar::SetForegroundColour(const wxColour& col) { - m_foregroundColour = col; + if (!wxWindowBase::SetForegroundColour(col)) + return false; + if (!col.Ok()) + return false; if (m_mainWidget) wxDoChangeForegroundColour(m_mainWidget, (wxColour&) col);