]> git.saurik.com Git - wxWidgets.git/commitdiff
Added wxMenu::Delete() and fixed some menu deleted memory
authorRobert Roebling <robert@roebling.de>
Mon, 11 Oct 1999 19:32:58 +0000 (19:32 +0000)
committerRobert Roebling <robert@roebling.de>
Mon, 11 Oct 1999 19:32:58 +0000 (19:32 +0000)
    leaks. Some.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@3930 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/gtk/menu.h
include/wx/gtk/menuitem.h
include/wx/gtk1/menu.h
include/wx/gtk1/menuitem.h
samples/dnd/dnd.cpp
src/gtk/menu.cpp
src/gtk1/menu.cpp

index 8d6f68db7ec288ce0113cc4b6718766c65cc0e24..dfa05697189c8f6a64cc5370ed4319e2d9f23dc4 100644 (file)
@@ -128,11 +128,11 @@ public:
 
     ~wxMenu();
 
-    // operations
-        // title
+    // title
     void SetTitle(const wxString& label);
     const wxString GetTitle() const;
-        // menu creation
+    
+    // menu creation
     void AppendSeparator();
     void Append(int id, const wxString &item,
                 const wxString &helpStr = "", bool checkable = FALSE);
@@ -141,6 +141,9 @@ public:
     void Append(wxMenuItem *pItem);
     void Break() { }
 
+    // delete item. don't delete the wxMenu if it's a submenu
+    void Delete( int id );
+
     // find item by name/id
     int FindItem( const wxString itemString ) const;
     wxMenuItem *FindItem( int id ) const;
index 0575a81dab9f52b65c7860f6aae69841cbfaac9d..500e235d6814fdde5730c337a51152ac4e2435e6 100644 (file)
@@ -40,6 +40,7 @@ DECLARE_DYNAMIC_CLASS(wxMenuItem)
 
 public:
     wxMenuItem();
+    ~wxMenuItem();
 
     // accessors
         // id
index 8d6f68db7ec288ce0113cc4b6718766c65cc0e24..dfa05697189c8f6a64cc5370ed4319e2d9f23dc4 100644 (file)
@@ -128,11 +128,11 @@ public:
 
     ~wxMenu();
 
-    // operations
-        // title
+    // title
     void SetTitle(const wxString& label);
     const wxString GetTitle() const;
-        // menu creation
+    
+    // menu creation
     void AppendSeparator();
     void Append(int id, const wxString &item,
                 const wxString &helpStr = "", bool checkable = FALSE);
@@ -141,6 +141,9 @@ public:
     void Append(wxMenuItem *pItem);
     void Break() { }
 
+    // delete item. don't delete the wxMenu if it's a submenu
+    void Delete( int id );
+
     // find item by name/id
     int FindItem( const wxString itemString ) const;
     wxMenuItem *FindItem( int id ) const;
index 0575a81dab9f52b65c7860f6aae69841cbfaac9d..500e235d6814fdde5730c337a51152ac4e2435e6 100644 (file)
@@ -40,6 +40,7 @@ DECLARE_DYNAMIC_CLASS(wxMenuItem)
 
 public:
     wxMenuItem();
+    ~wxMenuItem();
 
     // accessors
         // id
index c5159b990520ddd09493926286ebf319a93fb894..e78b54aa2b7d52e47ad80fa826426c2d5425880c 100644 (file)
@@ -133,7 +133,9 @@ enum
     Menu_CopyBitmap,
     Menu_PasteBitmap,
     Menu_HasText,
-    Menu_HasBitmap
+    Menu_HasBitmap,
+    Menu_ToBeGreyed,   /* for testing */
+    Menu_ToBeDeleted   /* for testing */
 };
 
 BEGIN_EVENT_TABLE(DnDFrame, wxFrame)
@@ -184,11 +186,19 @@ DnDFrame::DnDFrame(wxFrame *frame, char *title, int x, int y, int w, int h)
 
     CreateStatusBar();
 
+    // construct sub menu for testing
+    wxMenu *sub_menu = new wxMenu;
+    sub_menu->Append(Menu_Quit, "E&xit");
+    sub_menu->Append(Menu_Quit, "E&xit");
+    sub_menu->Append(Menu_Quit, "E&xit");
+
     // construct menu
     wxMenu *file_menu = new wxMenu;
     file_menu->Append(Menu_Drag, "&Test drag...");
     file_menu->AppendSeparator();
     file_menu->Append(Menu_Quit, "E&xit");
+    file_menu->AppendSeparator();
+    file_menu->Append( 0, "More exit menus", sub_menu);
 
     wxMenu *log_menu = new wxMenu;
     log_menu->Append(Menu_Clear, "Clear");
@@ -417,6 +427,11 @@ void DnDFrame::OnRightDown(wxMouseEvent &event )
     menu->Append(Menu_Drag, "&Test drag...");
     menu->Append(Menu_About, "&About");
     menu->Append(Menu_Quit, "E&xit");
+    menu->Append(Menu_ToBeDeleted, "To be deleted");
+    menu->Append(Menu_ToBeGreyed, "To be greyed");
+    
+    menu->Delete( Menu_ToBeDeleted );
+    menu->Enable( Menu_ToBeGreyed, FALSE );
 
     PopupMenu( menu, event.GetX(), event.GetY() );
 }
index c56045a78ddb1f5738d18fb489a246aefc9e93bc..8827eb6e8b3d757c51323689806ca12bcdfca7c7 100644 (file)
@@ -104,7 +104,7 @@ wxMenuBar::wxMenuBar()
 
 wxMenuBar::~wxMenuBar()
 {
-   // how to destroy a GtkItemFactory ?
+//    gtk_object_unref( GTK_OBJECT(m_factory) );  why not ?
 }
 
 static void wxMenubarUnsetInvokingWindow( wxMenu *menu, wxWindow *win )
@@ -584,6 +584,11 @@ wxMenuItem::wxMenuItem()
     m_menuItem = (GtkWidget *) NULL;
 }
 
+wxMenuItem::~wxMenuItem()
+{
+   // don't delete menu items, the menus take care of that
+}
+
 // it's valid for this function to be called even if m_menuItem == NULL
 void wxMenuItem::SetName( const wxString& str )
 {
@@ -717,9 +722,19 @@ wxMenu::Init( const wxString& title,
 
 wxMenu::~wxMenu()
 {
-   /* how do we delete an item-factory ? */
-   gtk_widget_destroy( m_menu );
+    wxNode *node = m_items.First();
+    while (node)
+    {
+        wxMenuItem *item = (wxMenuItem*)node->Data();
+       wxMenu *submenu = item->GetSubMenu();
+       if (submenu)
+          delete submenu;
+        node = node->Next();
+    }
 
+   gtk_widget_destroy( m_menu );
+   
+   gtk_object_unref( GTK_OBJECT(m_factory) );
 }
 
 void wxMenu::SetTitle( const wxString& title )
@@ -964,6 +979,22 @@ void wxMenu::Append( wxMenuItem *item )
     item->SetMenuItem(menuItem);
 }
 
+void wxMenu::Delete( int id )
+{
+    wxNode *node = m_items.First();
+    while (node)
+    {
+        wxMenuItem *item = (wxMenuItem*)node->Data();
+        if (item->GetId() == id)
+        {
+           gtk_widget_destroy( item->GetMenuItem() );
+           m_items.DeleteNode( node );
+            return;
+        }
+        node = node->Next();
+    }
+}
+
 int wxMenu::FindItem( const wxString itemString ) const
 {
     wxString s = wxT("");
index c56045a78ddb1f5738d18fb489a246aefc9e93bc..8827eb6e8b3d757c51323689806ca12bcdfca7c7 100644 (file)
@@ -104,7 +104,7 @@ wxMenuBar::wxMenuBar()
 
 wxMenuBar::~wxMenuBar()
 {
-   // how to destroy a GtkItemFactory ?
+//    gtk_object_unref( GTK_OBJECT(m_factory) );  why not ?
 }
 
 static void wxMenubarUnsetInvokingWindow( wxMenu *menu, wxWindow *win )
@@ -584,6 +584,11 @@ wxMenuItem::wxMenuItem()
     m_menuItem = (GtkWidget *) NULL;
 }
 
+wxMenuItem::~wxMenuItem()
+{
+   // don't delete menu items, the menus take care of that
+}
+
 // it's valid for this function to be called even if m_menuItem == NULL
 void wxMenuItem::SetName( const wxString& str )
 {
@@ -717,9 +722,19 @@ wxMenu::Init( const wxString& title,
 
 wxMenu::~wxMenu()
 {
-   /* how do we delete an item-factory ? */
-   gtk_widget_destroy( m_menu );
+    wxNode *node = m_items.First();
+    while (node)
+    {
+        wxMenuItem *item = (wxMenuItem*)node->Data();
+       wxMenu *submenu = item->GetSubMenu();
+       if (submenu)
+          delete submenu;
+        node = node->Next();
+    }
 
+   gtk_widget_destroy( m_menu );
+   
+   gtk_object_unref( GTK_OBJECT(m_factory) );
 }
 
 void wxMenu::SetTitle( const wxString& title )
@@ -964,6 +979,22 @@ void wxMenu::Append( wxMenuItem *item )
     item->SetMenuItem(menuItem);
 }
 
+void wxMenu::Delete( int id )
+{
+    wxNode *node = m_items.First();
+    while (node)
+    {
+        wxMenuItem *item = (wxMenuItem*)node->Data();
+        if (item->GetId() == id)
+        {
+           gtk_widget_destroy( item->GetMenuItem() );
+           m_items.DeleteNode( node );
+            return;
+        }
+        node = node->Next();
+    }
+}
+
 int wxMenu::FindItem( const wxString itemString ) const
 {
     wxString s = wxT("");