]> git.saurik.com Git - wxWidgets.git/blobdiff - src/motif/menu.cpp
more informative error messages
[wxWidgets.git] / src / motif / menu.cpp
index 949c95064f32f8a1f160fb9932929d0134a0ab54..6ed70d67d90c5f8960ee4c5045c0650562785bb2 100644 (file)
@@ -22,6 +22,8 @@
 // headers
 // ----------------------------------------------------------------------------
 
+#include "wx/defs.h"
+
 #include "wx/menu.h"
 #include "wx/menuitem.h"
 #include "wx/log.h"
@@ -32,6 +34,8 @@
 
 #ifdef __VMS__
 #pragma message disable nosimpint
+#define XtDisplay XTDISPLAY
+#define XtWindow XTWINDOW
 #endif
 #include <Xm/Label.h>
 #include <Xm/LabelG.h>
@@ -80,9 +84,9 @@ void wxMenu::Init()
         AppendSeparator() ;
     }
 
-    m_backgroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_MENU);
-    m_foregroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_MENUTEXT);
-    m_font = wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT);
+    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.
@@ -135,10 +139,10 @@ wxMenuItem *wxMenu::DoRemove(wxMenuItem *item)
 
 bool wxMenu::DoInsert(size_t pos, wxMenuItem *item)
 {
-    if ( !wxMenuBase::DoInsert(pos, item) )
-        return FALSE;
+    if ( wxMenuBase::DoInsert(pos, item) )
+        return TRUE;
 
-    wxFAIL_MSG(wxT("not implemented"));
+    wxFAIL_MSG(wxT("DoInsert not implemented; or error in wxMenuBase::DoInsert"));
 
     return FALSE;
 }
@@ -197,9 +201,9 @@ void wxMenuBar::Init()
     m_eventHandler = this;
     m_menuBarFrame = NULL;
     m_mainWidget = (WXWidget) NULL;
-    m_backgroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_MENU);
-    m_foregroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_MENUTEXT);
-    m_font = wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT);
+    m_backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_MENU);
+    m_foregroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_MENUTEXT);
+    m_font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
 }
 
 wxMenuBar::wxMenuBar(int n, wxMenu *menus[], const wxString titles[])
@@ -243,8 +247,6 @@ void wxMenuBar::SetLabelTop(size_t pos, const wxString& label)
 
 wxString wxMenuBar::GetLabelTop(size_t pos) const
 {
-    wxString str;
-
     wxMenu *menu = GetMenu(pos);
     if ( menu )
     {
@@ -256,17 +258,11 @@ wxString wxMenuBar::GetLabelTop(size_t pos) const
                           XmNlabelString, &text,
                           NULL);
 
-            char *s;
-            if ( XmStringGetLtoR(text, XmSTRING_DEFAULT_CHARSET, &s) )
-            {
-                str = s;
-
-                XtFree(s);
-            }
+            return wxXmStringToString( text );
         }
     }
 
-    return str;
+    return wxEmptyString;
 }
 
 bool wxMenuBar::Append(wxMenu * menu, const wxString& title)
@@ -282,7 +278,7 @@ bool wxMenuBar::Append(wxMenu * menu, const wxString& title)
         menu->SetButtonWidget(w);
     }
 
-    menu->SetMenuBar(this);
+    //menu->SetMenuBar(this);
 
     m_titles.Add(title);
 
@@ -302,7 +298,7 @@ bool wxMenuBar::Insert(size_t pos, wxMenu *menu, const wxString& title)
 wxMenu *wxMenuBar::Replace(size_t pos, wxMenu *menu, const wxString& title)
 {
     if ( !wxMenuBarBase::Replace(pos, menu, title) )
-        return FALSE;
+        return NULL;
 
     wxFAIL_MSG(wxT("TODO"));
 
@@ -436,28 +432,20 @@ bool wxMenuBar::DestroyMenuBar()
     return TRUE;
 }
 
-//// Motif-specific
-static XtWorkProcId WorkProcMenuId;
-
-/* Since PopupMenu under Motif stills grab right mouse button events
-* after it was closed, we need to delete the associated widgets to
-* allow next PopUpMenu to appear...
-*/
-
-int PostDeletionOfMenu( XtPointer* clientData )
+// Since PopupMenu under Motif stills grab right mouse button events
+// after it was closed, we need to delete the associated widgets to
+// allow next PopUpMenu to appear...
+void wxMenu::DestroyWidgetAndDetach()
 {
-    XtRemoveWorkProc(WorkProcMenuId);
-    wxMenu *menu = (wxMenu *)clientData;
-
-    if (menu->GetMainWidget())
+    if (GetMainWidget())
     {
-        wxMenu *menuParent = menu->GetParent();
+        wxMenu *menuParent = GetParent();
         if ( menuParent )
         {
             wxMenuItemList::Node *node = menuParent->GetMenuItems().GetFirst();
             while ( node )
             {
-                if ( node->GetData()->GetSubMenu() == menu )
+                if ( node->GetData()->GetSubMenu() == this )
                 {
                     menuParent->GetMenuItems().DeleteNode(node);
 
@@ -468,33 +456,11 @@ int PostDeletionOfMenu( XtPointer* clientData )
             }
         }
 
-        menu->DestroyMenu(TRUE);
+        DestroyMenu(TRUE);
     }
 
     // Mark as no longer popped up
-    menu->m_menuId = -1;
-
-    return TRUE;
-}
-
-void
-wxMenuPopdownCallback(Widget WXUNUSED(w), XtPointer clientData,
-                      XtPointer WXUNUSED(ptr))
-{
-    wxMenu *menu = (wxMenu *)clientData;
-
-    // Added by JOREL Jean-Charles <jjorel@silr.ireste.fr>
-    /* Since Callbacks of MenuItems are not yet processed, we put a
-    * background job which will be done when system will be idle.
-    * What awful hack!! :(
-    */
-
-    WorkProcMenuId = XtAppAddWorkProc(
-        (XtAppContext) wxTheApp->GetAppContext(),
-        (XtWorkProc) PostDeletionOfMenu,
-        (XtPointer) menu );
-    // Apparently not found in Motif headers
-    //  XtVaSetValues( w, XmNpopupEnabled, XmPOPUP_DISABLED, NULL );
+    m_menuId = -1;
 }
 
 /*
@@ -509,21 +475,21 @@ WXWidget wxMenu::CreateMenu (wxMenuBar * menuBar, WXWidget parent, wxMenu * topM
     Widget buttonWidget = (Widget) 0;
     Arg args[5];
     XtSetArg (args[0], XmNnumColumns, m_numColumns);
-    XtSetArg (args[1], XmNpacking, XmPACK_COLUMN);
+    XtSetArg (args[1], XmNpacking, (m_numColumns > 1) ? XmPACK_COLUMN : XmPACK_TIGHT);
 
     if (!pullDown)
     {
         menu = XmCreatePopupMenu ((Widget) parent, "popup", args, 2);
+#if 0
         XtAddCallback(menu,
             XmNunmapCallback,
             (XtCallbackProc)wxMenuPopdownCallback,
             (XtPointer)this);
+#endif
     }
     else
     {
         char mnem = wxFindMnemonic (title);
-        wxStripMenuCodes ((char*) (const char*) title, wxBuffer);
-
         menu = XmCreatePulldownMenu ((Widget) parent, "pulldown", args, 2);
 
         wxString title2(wxStripMenuCodes(title));
@@ -678,21 +644,21 @@ void wxMenu::SetForegroundColour(const wxColour& col)
 
 void wxMenu::ChangeFont(bool keepOriginalSize)
 {
-    // lesstif 0.87 hangs when setting XmNfontList
-#ifndef LESSTIF_VERSION
+    // Lesstif 0.87 hangs here, but 0.93 does not
+#if !wxCHECK_LESSTIF() || wxCHECK_LESSTIF_VERSION( 0, 93 )
     if (!m_font.Ok() || !m_menuWidget)
         return;
 
-    XmFontList fontList = (XmFontList) m_font.GetFontList(1.0, XtDisplay((Widget) m_menuWidget));
+    WXFontType fontType = m_font.GetFontType(XtDisplay((Widget) m_menuWidget));
 
     XtVaSetValues ((Widget) m_menuWidget,
-        XmNfontList, fontList,
-        NULL);
+                   wxFont::GetFontTag(), fontType,
+                   NULL);
     if (m_buttonWidget)
     {
         XtVaSetValues ((Widget) m_buttonWidget,
-            XmNfontList, fontList,
-            NULL);
+                       wxFont::GetFontTag(), fontType,
+                       NULL);
     }
 
     for ( wxMenuItemList::Node *node = GetMenuItems().GetFirst();
@@ -703,8 +669,8 @@ void wxMenu::ChangeFont(bool keepOriginalSize)
         if (m_menuWidget && item->GetButtonWidget() && m_font.Ok())
         {
             XtVaSetValues ((Widget) item->GetButtonWidget(),
-                XmNfontList, fontList,
-                NULL);
+                           wxFont::GetFontTag(), fontType,
+                           NULL);
         }
         if (item->GetSubMenu())
             item->GetSubMenu()->ChangeFont(keepOriginalSize);