Added wxMenu::Delete() and fixed some menu deleted memory

leaks. Some.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@3930 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling
1999-10-11 19:32:58 +00:00
parent 147bc49159
commit d1b15f03b8
7 changed files with 98 additions and 13 deletions

View File

@@ -128,11 +128,11 @@ public:
~wxMenu(); ~wxMenu();
// operations // title
// title
void SetTitle(const wxString& label); void SetTitle(const wxString& label);
const wxString GetTitle() const; const wxString GetTitle() const;
// menu creation
// menu creation
void AppendSeparator(); void AppendSeparator();
void Append(int id, const wxString &item, void Append(int id, const wxString &item,
const wxString &helpStr = "", bool checkable = FALSE); const wxString &helpStr = "", bool checkable = FALSE);
@@ -141,6 +141,9 @@ public:
void Append(wxMenuItem *pItem); void Append(wxMenuItem *pItem);
void Break() { } void Break() { }
// delete item. don't delete the wxMenu if it's a submenu
void Delete( int id );
// find item by name/id // find item by name/id
int FindItem( const wxString itemString ) const; int FindItem( const wxString itemString ) const;
wxMenuItem *FindItem( int id ) const; wxMenuItem *FindItem( int id ) const;

View File

@@ -40,6 +40,7 @@ DECLARE_DYNAMIC_CLASS(wxMenuItem)
public: public:
wxMenuItem(); wxMenuItem();
~wxMenuItem();
// accessors // accessors
// id // id

View File

@@ -128,11 +128,11 @@ public:
~wxMenu(); ~wxMenu();
// operations // title
// title
void SetTitle(const wxString& label); void SetTitle(const wxString& label);
const wxString GetTitle() const; const wxString GetTitle() const;
// menu creation
// menu creation
void AppendSeparator(); void AppendSeparator();
void Append(int id, const wxString &item, void Append(int id, const wxString &item,
const wxString &helpStr = "", bool checkable = FALSE); const wxString &helpStr = "", bool checkable = FALSE);
@@ -141,6 +141,9 @@ public:
void Append(wxMenuItem *pItem); void Append(wxMenuItem *pItem);
void Break() { } void Break() { }
// delete item. don't delete the wxMenu if it's a submenu
void Delete( int id );
// find item by name/id // find item by name/id
int FindItem( const wxString itemString ) const; int FindItem( const wxString itemString ) const;
wxMenuItem *FindItem( int id ) const; wxMenuItem *FindItem( int id ) const;

View File

@@ -40,6 +40,7 @@ DECLARE_DYNAMIC_CLASS(wxMenuItem)
public: public:
wxMenuItem(); wxMenuItem();
~wxMenuItem();
// accessors // accessors
// id // id

View File

@@ -133,7 +133,9 @@ enum
Menu_CopyBitmap, Menu_CopyBitmap,
Menu_PasteBitmap, Menu_PasteBitmap,
Menu_HasText, Menu_HasText,
Menu_HasBitmap Menu_HasBitmap,
Menu_ToBeGreyed, /* for testing */
Menu_ToBeDeleted /* for testing */
}; };
BEGIN_EVENT_TABLE(DnDFrame, wxFrame) BEGIN_EVENT_TABLE(DnDFrame, wxFrame)
@@ -184,11 +186,19 @@ DnDFrame::DnDFrame(wxFrame *frame, char *title, int x, int y, int w, int h)
CreateStatusBar(); 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 // construct menu
wxMenu *file_menu = new wxMenu; wxMenu *file_menu = new wxMenu;
file_menu->Append(Menu_Drag, "&Test drag..."); file_menu->Append(Menu_Drag, "&Test drag...");
file_menu->AppendSeparator(); file_menu->AppendSeparator();
file_menu->Append(Menu_Quit, "E&xit"); file_menu->Append(Menu_Quit, "E&xit");
file_menu->AppendSeparator();
file_menu->Append( 0, "More exit menus", sub_menu);
wxMenu *log_menu = new wxMenu; wxMenu *log_menu = new wxMenu;
log_menu->Append(Menu_Clear, "Clear"); log_menu->Append(Menu_Clear, "Clear");
@@ -417,6 +427,11 @@ void DnDFrame::OnRightDown(wxMouseEvent &event )
menu->Append(Menu_Drag, "&Test drag..."); menu->Append(Menu_Drag, "&Test drag...");
menu->Append(Menu_About, "&About"); menu->Append(Menu_About, "&About");
menu->Append(Menu_Quit, "E&xit"); 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() ); PopupMenu( menu, event.GetX(), event.GetY() );
} }

View File

@@ -104,7 +104,7 @@ wxMenuBar::wxMenuBar()
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 ) static void wxMenubarUnsetInvokingWindow( wxMenu *menu, wxWindow *win )
@@ -584,6 +584,11 @@ wxMenuItem::wxMenuItem()
m_menuItem = (GtkWidget *) NULL; 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 // it's valid for this function to be called even if m_menuItem == NULL
void wxMenuItem::SetName( const wxString& str ) void wxMenuItem::SetName( const wxString& str )
{ {
@@ -717,9 +722,19 @@ wxMenu::Init( const wxString& title,
wxMenu::~wxMenu() wxMenu::~wxMenu()
{ {
/* how do we delete an item-factory ? */ 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_widget_destroy( m_menu );
gtk_object_unref( GTK_OBJECT(m_factory) );
} }
void wxMenu::SetTitle( const wxString& title ) void wxMenu::SetTitle( const wxString& title )
@@ -964,6 +979,22 @@ void wxMenu::Append( wxMenuItem *item )
item->SetMenuItem(menuItem); 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 int wxMenu::FindItem( const wxString itemString ) const
{ {
wxString s = wxT(""); wxString s = wxT("");

View File

@@ -104,7 +104,7 @@ wxMenuBar::wxMenuBar()
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 ) static void wxMenubarUnsetInvokingWindow( wxMenu *menu, wxWindow *win )
@@ -584,6 +584,11 @@ wxMenuItem::wxMenuItem()
m_menuItem = (GtkWidget *) NULL; 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 // it's valid for this function to be called even if m_menuItem == NULL
void wxMenuItem::SetName( const wxString& str ) void wxMenuItem::SetName( const wxString& str )
{ {
@@ -717,9 +722,19 @@ wxMenu::Init( const wxString& title,
wxMenu::~wxMenu() wxMenu::~wxMenu()
{ {
/* how do we delete an item-factory ? */ 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_widget_destroy( m_menu );
gtk_object_unref( GTK_OBJECT(m_factory) );
} }
void wxMenu::SetTitle( const wxString& title ) void wxMenu::SetTitle( const wxString& title )
@@ -964,6 +979,22 @@ void wxMenu::Append( wxMenuItem *item )
item->SetMenuItem(menuItem); 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 int wxMenu::FindItem( const wxString itemString ) const
{ {
wxString s = wxT(""); wxString s = wxT("");