]> git.saurik.com Git - wxWidgets.git/blobdiff - src/motif/menu.cpp
Thread fixes (but they still don't work at all...)
[wxWidgets.git] / src / motif / menu.cpp
index d10b977174dc59f6f997fb37ad207438bfe93f7f..f42b5d07d4f063ac5c90a91977a4bed761b7e2a1 100644 (file)
@@ -28,6 +28,7 @@
 #include "wx/utils.h"
 #include "wx/app.h"
 #include "wx/frame.h"
+#include "wx/settings.h"
 
 #include <Xm/Label.h>
 #include <Xm/LabelG.h>
@@ -81,6 +82,9 @@ wxMenu::wxMenu(const wxString& title, const wxFunction func)
         Append(ID_SEPARATOR, m_title) ;
         AppendSeparator() ;
     }
+    m_backgroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_MENU);
+    m_foregroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_MENUTEXT);
+    m_font = wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT);
 
     Callback(func);
 }
@@ -455,6 +459,10 @@ wxMenuBar::wxMenuBar()
     m_menus = NULL;
     m_titles = NULL;
     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);
 }
 
 wxMenuBar::wxMenuBar(int n, wxMenu *menus[], const wxString titles[])
@@ -467,6 +475,9 @@ wxMenuBar::wxMenuBar(int n, wxMenu *menus[], const wxString titles[])
     for ( i = 0; i < n; i++ )
        m_titles[i] = titles[i];
     m_menuBarFrame = NULL;
+    m_backgroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_MENU);
+    m_foregroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_MENUTEXT);
+    m_font = wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT);
 }
 
 wxMenuBar::~wxMenuBar()
@@ -747,6 +758,78 @@ wxString wxMenuBar::GetHelpString (int id) const
     return wxString("");
 }
 
+// Create menubar
+bool wxMenuBar::CreateMenuBar(wxFrame* parent)
+{
+  if (m_mainWidget)
+  {
+    XtVaSetValues((Widget) parent->GetMainWindowWidget(), XmNmenuBar, (Widget) m_mainWidget, NULL);
+    /*
+    if (!XtIsManaged((Widget) m_mainWidget))
+      XtManageChild((Widget) m_mainWidget);
+      */
+    XtMapWidget((Widget) m_mainWidget);
+    return TRUE;
+  }
+
+  Widget menuBarW = XmCreateMenuBar ((Widget) parent->GetMainWindowWidget(), "MenuBar", NULL, 0);
+  m_mainWidget = (WXWidget) menuBarW;
+
+  int i;
+  for (i = 0; i < GetMenuCount(); i++)
+    {
+      wxMenu *menu = GetMenu(i);
+      wxString title(m_titles[i]);
+      menu->SetButtonWidget(menu->CreateMenu (this, menuBarW, menu, title, TRUE));
+
+      /*
+       * COMMENT THIS OUT IF YOU DON'T LIKE A RIGHT-JUSTIFIED HELP MENU
+       */
+      wxStripMenuCodes ((char*) (const char*) title, wxBuffer);
+
+      if (strcmp (wxBuffer, "Help") == 0)
+        XtVaSetValues ((Widget) menuBarW, XmNmenuHelpWidget, (Widget) menu->GetButtonWidget(), NULL);
+    }
+
+  SetBackgroundColour(m_backgroundColour);
+  SetForegroundColour(m_foregroundColour);
+  SetFont(m_font);
+
+  XtVaSetValues((Widget) parent->GetMainWindowWidget(), XmNmenuBar, (Widget) m_mainWidget, NULL);
+  XtRealizeWidget ((Widget) menuBarW);
+  XtManageChild ((Widget) menuBarW);
+  SetMenuBarFrame(parent);
+
+  return TRUE;
+}
+
+// Destroy menubar, but keep data structures intact so we can recreate it.
+bool wxMenuBar::DestroyMenuBar()
+{
+  if (!m_mainWidget)
+  {
+      SetMenuBarFrame((wxFrame*) NULL);
+      return FALSE;
+  }
+
+  XtUnmanageChild ((Widget) m_mainWidget);
+  XtUnrealizeWidget ((Widget) m_mainWidget);
+
+  int i;
+  for (i = 0; i < GetMenuCount(); i++)
+    {
+      wxMenu *menu = GetMenu(i);
+      menu->DestroyMenu(TRUE);
+
+    }
+  XtDestroyWidget((Widget) m_mainWidget);
+  m_mainWidget = (WXWidget) 0;
+
+  SetMenuBarFrame((wxFrame*) NULL);
+
+  return TRUE;
+}
+
 //// Motif-specific
 
 extern wxApp *wxTheApp;
@@ -763,8 +846,11 @@ int PostDeletionOfMenu( XtPointer* clientData )
   wxMenu *menu = (wxMenu *)clientData;
 
   if (menu->GetMainWidget()) {
-    wxList& list = menu->GetParent()->GetItems();
-    list.DeleteObject(menu);
+    if (menu->GetParent())
+    {
+      wxList& list = menu->GetParent()->GetItems();
+      list.DeleteObject(menu);
+    }
     menu->DestroyMenu(TRUE);
   }
   /* Mark as no longer popped up */
@@ -849,6 +935,10 @@ WXWidget wxMenu::CreateMenu (wxMenuBar * menuBar, WXWidget parent, wxMenu * topM
       item->CreateItem (menu, menuBar, topMenu);
     }
 
+  SetBackgroundColour(m_backgroundColour);
+  SetForegroundColour(m_foregroundColour);
+  SetFont(m_font);
+
   return buttonWidget;
 }
 
@@ -914,3 +1004,128 @@ WXWidget wxMenu::FindMenuItem (int id, wxMenuItem ** it) const
     *it = (wxMenuItem*) NULL;
   return (WXWidget) NULL;
 }
+
+void wxMenu::SetBackgroundColour(const wxColour& col)
+{
+    m_backgroundColour = col;
+    if (m_menuWidget)
+       wxDoChangeBackgroundColour(m_menuWidget, (wxColour&) col);
+    if (m_buttonWidget)
+       wxDoChangeBackgroundColour(m_buttonWidget, (wxColour&) col, TRUE);
+
+    wxNode* node = m_menuItems.First();
+    while (node)
+    {
+        wxMenuItem* item = (wxMenuItem*) node->Data();
+        if (item->GetButtonWidget())
+        {
+          // This crashes because it uses gadgets
+         //            wxDoChangeBackgroundColour(item->GetButtonWidget(), (wxColour&) col, TRUE);
+        }
+        if (item->GetSubMenu())
+          item->GetSubMenu()->SetBackgroundColour((wxColour&) col);
+        node = node->Next();
+    }
+}
+
+void wxMenu::SetForegroundColour(const wxColour& col)
+{
+    m_foregroundColour = col;
+    if (m_menuWidget)
+       wxDoChangeForegroundColour(m_menuWidget, (wxColour&) col);
+    if (m_buttonWidget)
+       wxDoChangeForegroundColour(m_buttonWidget, (wxColour&) col);
+
+    wxNode* node = m_menuItems.First();
+    while (node)
+    {
+        wxMenuItem* item = (wxMenuItem*) node->Data();
+        if (item->GetButtonWidget())
+        {
+          // This crashes because it uses gadgets
+         //            wxDoChangeForegroundColour(item->GetButtonWidget(), (wxColour&) col);
+        }
+        if (item->GetSubMenu())
+          item->GetSubMenu()->SetForegroundColour((wxColour&) col);
+        node = node->Next();
+    }
+}
+
+void wxMenu::ChangeFont(bool keepOriginalSize)
+{
+// lesstif 0.87 hangs when setting XmNfontList
+#ifndef LESSTIF_VERSION        
+    if (!m_font.Ok() || !m_menuWidget)
+        return;
+
+    XmFontList fontList = (XmFontList) m_font.GetFontList(1.0, XtDisplay((Widget) m_menuWidget));
+
+    XtVaSetValues ((Widget) m_menuWidget,
+                  XmNfontList, fontList,
+                  NULL);
+    if (m_buttonWidget)
+    {
+      XtVaSetValues ((Widget) m_buttonWidget,
+                  XmNfontList, fontList,
+                  NULL);
+    }
+    wxNode* node = m_menuItems.First();
+    while (node)
+    {
+        wxMenuItem* item = (wxMenuItem*) node->Data();
+        if (m_menuWidget && item->GetButtonWidget() && m_font.Ok())
+        {
+          XtVaSetValues ((Widget) item->GetButtonWidget(),
+                  XmNfontList, fontList,
+                  NULL);
+        }
+        if (item->GetSubMenu())
+          item->GetSubMenu()->ChangeFont(keepOriginalSize);
+        node = node->Next();
+    }
+#endif
+}
+
+void wxMenu::SetFont(const wxFont& font)
+{
+    m_font = font;
+    ChangeFont();
+}
+
+void wxMenuBar::SetBackgroundColour(const wxColour& col)
+{
+
+    m_backgroundColour = col;
+    if (m_mainWidget)
+       wxDoChangeBackgroundColour(m_mainWidget, (wxColour&) col);
+    int i;
+    for (i = 0; i < m_menuCount; i++)
+      m_menus[i]->SetBackgroundColour((wxColour&) col);
+}
+
+void wxMenuBar::SetForegroundColour(const wxColour& col)
+{
+    m_foregroundColour = col;
+    if (m_mainWidget)
+       wxDoChangeForegroundColour(m_mainWidget, (wxColour&) col);
+
+    int i;
+    for (i = 0; i < m_menuCount; i++)
+      m_menus[i]->SetForegroundColour((wxColour&) col);
+}
+
+void wxMenuBar::ChangeFont(bool keepOriginalSize)
+{
+  // Nothing to do for menubar, fonts are kept in wxMenus
+}
+
+void wxMenuBar::SetFont(const wxFont& font)
+{
+    m_font = font;
+    ChangeFont();
+
+    int i;
+    for (i = 0; i < m_menuCount; i++)
+      m_menus[i]->SetFont(font);
+}
+