]> git.saurik.com Git - wxWidgets.git/commitdiff
Implemented wxMenuBar::Insert and wxMenu::Insert.
authorMattia Barbon <mbarbon@cpan.org>
Fri, 30 Sep 2005 09:15:52 +0000 (09:15 +0000)
committerMattia Barbon <mbarbon@cpan.org>
Fri, 30 Sep 2005 09:15:52 +0000 (09:15 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@35767 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/motif/menu.h
include/wx/motif/menuitem.h
src/motif/menu.cpp
src/motif/menuitem.cpp
src/motif/window.cpp

index 8df08e6b5162633304088e9713a93b0c7f5b7265..16ecaa5557df0e7d732de0e7cf7bf19331b4b327 100644 (file)
@@ -62,7 +62,7 @@ public:
     void HidePopup();
     
     WXWidget CreateMenu(wxMenuBar *menuBar, WXWidget parent, wxMenu *topMenu,
-        const wxString& title = wxEmptyString,
+        size_t index, const wxString& title = wxEmptyString,
         bool isPulldown = false);
     
     // For popups, need to destroy, then recreate menu for a different (or
index 06adf67d558a6b96c6a3379f68e7c8bfd0c2fab3..c4fc2b41b4cacb10edd332dd0754172f95a66cb7 100644 (file)
@@ -44,7 +44,8 @@ public:
     virtual const wxBitmap& GetBitmap() const { return m_bitmap; }
     
     // implementation from now on
-    void CreateItem (WXWidget menu, wxMenuBar * menuBar, wxMenu * topMenu);
+    void CreateItem (WXWidget menu, wxMenuBar * menuBar, wxMenu * topMenu,
+                     size_t index);
     void DestroyItem(bool full);
     
     WXWidget GetButtonWidget() const { return m_buttonWidget; }
index 4e57aa0477592070e03bf1eb8f46d65c72cd1803..a394709cbb4ff0961ec69b8b05141347f7df8bdc 100644 (file)
@@ -114,18 +114,7 @@ void wxMenu::Break()
 // function appends a new item or submenu to the menu
 wxMenuItem* wxMenu::DoAppend(wxMenuItem *pItem)
 {
-    if (m_menuWidget)
-    {
-        // this is a dynamic Append
-        pItem->CreateItem(m_menuWidget, GetMenuBar(), m_topLevelMenu);
-    }
-
-    if ( pItem->IsSubMenu() )
-    {
-        pItem->GetSubMenu()->m_topLevelMenu = m_topLevelMenu;
-    }
-
-    return wxMenuBase::DoAppend(pItem);
+    return DoInsert(GetMenuItemCount(), pItem);
 }
 
 wxMenuItem *wxMenu::DoRemove(wxMenuItem *item)
@@ -137,12 +126,22 @@ wxMenuItem *wxMenu::DoRemove(wxMenuItem *item)
 
 wxMenuItem* wxMenu::DoInsert(size_t pos, wxMenuItem *item)
 {
-    if ( wxMenuBase::DoInsert(pos, item) )
-        return item;
+    if (m_menuWidget)
+    {
+        // this is a dynamic Append
+#ifndef XmNpositionIndex
+    wxCHECK_MSG( pos == GetMenuItemCount(), -1, wxT("insert not implemented"));
+#endif
+        item->CreateItem(m_menuWidget, GetMenuBar(), m_topLevelMenu, pos);
+    }
 
-    wxFAIL_MSG(wxT("DoInsert not implemented; or error in wxMenuBase::DoInsert"));
+    if ( item->IsSubMenu() )
+    {
+        item->GetSubMenu()->m_topLevelMenu = m_topLevelMenu;
+    }
 
-    return NULL;
+    return pos == GetMenuItemCount() ? wxMenuBase::DoAppend(item) : 
+                                       wxMenuBase::DoInsert(pos, item);
 }
 
 void wxMenu::SetTitle(const wxString& label)
@@ -267,30 +266,27 @@ wxString wxMenuBar::GetLabelTop(size_t pos) const
 
 bool wxMenuBar::Append(wxMenu * menu, const wxString& title)
 {
+    return Insert(GetMenuCount(), menu, title);
+}
+
+bool wxMenuBar::Insert(size_t pos, wxMenu *menu, const wxString& title)
+{
+    wxCHECK_MSG( pos <= GetMenuCount(), false, wxT("invalid position") );
     wxCHECK_MSG( menu, false, wxT("invalid menu") );
     wxCHECK_MSG( !menu->GetParent() && !menu->GetButtonWidget(), false,
                  wxT("menu already appended") );
 
     if ( m_menuBarFrame )
     {
-        WXWidget w = menu->CreateMenu(this, GetMainWidget(), menu, title, true);
+        WXWidget w = menu->CreateMenu(this, GetMainWidget(), menu,
+                                      pos, title, true);
         wxCHECK_MSG( w, false, wxT("failed to create menu") );
         menu->SetButtonWidget(w);
     }
 
-    m_titles.Add(title);
-
-    return wxMenuBarBase::Append(menu, title);
-}
-
-bool wxMenuBar::Insert(size_t pos, wxMenu *menu, const wxString& title)
-{
-    if ( !wxMenuBarBase::Insert(pos, menu, title) )
-        return false;
+    m_titles.Insert(title, pos);
 
-    wxFAIL_MSG(wxT("TODO"));
-
-    return false;
+    return wxMenuBarBase::Insert(pos, menu, title);
 }
 
 wxMenu *wxMenuBar::Replace(size_t pos, wxMenu *menu, const wxString& title)
@@ -373,7 +369,7 @@ bool wxMenuBar::CreateMenuBar(wxFrame* parent)
     {
         wxMenu *menu = GetMenu(i);
         wxString title(m_titles[i]);
-        menu->SetButtonWidget(menu->CreateMenu (this, menuBarW, menu, title, true));
+        menu->SetButtonWidget(menu->CreateMenu (this, menuBarW, menu, i, title, true));
 
         if (strcmp (wxStripMenuCodes(title), "Help") == 0)
             XtVaSetValues ((Widget) menuBarW, XmNmenuHelpWidget, (Widget) menu->GetButtonWidget(), NULL);
@@ -469,7 +465,7 @@ void wxMenu::DestroyWidgetAndDetach()
 *
 */
 
-WXWidget wxMenu::CreateMenu (wxMenuBar * menuBar, WXWidget parent, wxMenu * topMenu, const wxString& title, bool pullDown)
+WXWidget wxMenu::CreateMenu (wxMenuBar * menuBar, WXWidget parent, wxMenu * topMenu, size_t index, const wxString& title, bool pullDown)
 {
     Widget menu = (Widget) 0;
     Widget buttonWidget = (Widget) 0;
@@ -512,13 +508,14 @@ WXWidget wxMenu::CreateMenu (wxMenuBar * menuBar, WXWidget parent, wxMenu * topM
 
     m_topLevelMenu = topMenu;
 
+    size_t i = 0;
     for ( wxMenuItemList::compatibility_iterator node = GetMenuItems().GetFirst();
           node;
-          node = node->GetNext() )
+          node = node->GetNext(), ++i )
     {
         wxMenuItem *item = node->GetData();
 
-        item->CreateItem(menu, menuBar, topMenu);
+        item->CreateItem(menu, menuBar, topMenu, i);
     }
 
     SetBackgroundColour(m_backgroundColour);
index ebceca3d9d14d51c9103713b391683e576bf210c..c680eaeaadd7d25aab7401913e603b3e8226681e 100644 (file)
@@ -158,7 +158,8 @@ wxMenuItem *wxMenuItemBase::New(wxMenu *parentMenu,
 // 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;
@@ -177,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)
@@ -225,11 +232,15 @@ void wxMenuItem::CreateItem (WXWidget menu, wxMenuBar * menuBar, wxMenu * topMen
     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,
index 57aa52ecd546d686e22906619d820006578dfb85..2f588ebfeff039ac62a751f6e72adee984d11d66 100644 (file)
@@ -1089,7 +1089,7 @@ bool wxWindow::DoPopupMenu(wxMenu *menu, int x, int y)
     }
 
     menu->SetId(1); /* Mark as popped-up */
-    menu->CreateMenu(NULL, widget, menu);
+    menu->CreateMenu(NULL, widget, menu, 0);
     menu->SetInvokingWindow(this);
 
     menu->UpdateUI();