From 2b1c162e227574deaa255bd66f6c14d10be870f2 Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Wed, 13 Jan 1999 18:19:09 +0000 Subject: [PATCH] Better disabling of toolbars and menubars git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1397 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/gtk/menu.h | 5 +++-- include/wx/gtk1/menu.h | 5 +++-- samples/minifram/test.cpp | 2 ++ src/common/image.cpp | 10 ++++----- src/gtk/menu.cpp | 43 +++++++++++++++++++++++++++++++-------- src/gtk/tbargtk.cpp | 15 +++++++++----- src/gtk1/menu.cpp | 43 +++++++++++++++++++++++++++++++-------- src/gtk1/tbargtk.cpp | 15 +++++++++----- 8 files changed, 101 insertions(+), 37 deletions(-) diff --git a/include/wx/gtk/menu.h b/include/wx/gtk/menu.h index 78445e7432..860e0b8d14 100644 --- a/include/wx/gtk/menu.h +++ b/include/wx/gtk/menu.h @@ -56,8 +56,8 @@ public: bool Checked( int id ) const; void Enable( int id, bool enable ); bool Enabled( int id ) const; - inline bool IsEnabled(int Id) const { return Enabled(Id); }; - inline bool IsChecked(int Id) const { return Checked(Id); }; + inline bool IsEnabled(int Id) const { return Enabled(Id); } + inline bool IsChecked(int Id) const { return Checked(Id); } wxString GetLabel( int id ) const; void SetLabel( int id, const wxString &label ); @@ -140,6 +140,7 @@ public: void *m_clientData; GtkWidget *m_menu; // GtkMenu + GtkWidget *m_owner; }; #endif // __GTKMENUH__ diff --git a/include/wx/gtk1/menu.h b/include/wx/gtk1/menu.h index 78445e7432..860e0b8d14 100644 --- a/include/wx/gtk1/menu.h +++ b/include/wx/gtk1/menu.h @@ -56,8 +56,8 @@ public: bool Checked( int id ) const; void Enable( int id, bool enable ); bool Enabled( int id ) const; - inline bool IsEnabled(int Id) const { return Enabled(Id); }; - inline bool IsChecked(int Id) const { return Checked(Id); }; + inline bool IsEnabled(int Id) const { return Enabled(Id); } + inline bool IsChecked(int Id) const { return Checked(Id); } wxString GetLabel( int id ) const; void SetLabel( int id, const wxString &label ); @@ -140,6 +140,7 @@ public: void *m_clientData; GtkWidget *m_menu; // GtkMenu + GtkWidget *m_owner; }; #endif // __GTKMENUH__ diff --git a/samples/minifram/test.cpp b/samples/minifram/test.cpp index 0343dea714..5fe386612a 100644 --- a/samples/minifram/test.cpp +++ b/samples/minifram/test.cpp @@ -119,6 +119,8 @@ bool MyApp::InitToolbar(wxToolBar* toolBar) toolBar->AddTool(wxID_HELP, *(toolBarBitmaps[7]), wxNullBitmap, FALSE, currentX, -1, (wxObject *) NULL, "Help"); toolBar->Realize(); + + toolBar->EnableTool( wxID_HELP, FALSE ); // Can delete the bitmaps since they're reference counted int i; diff --git a/src/common/image.cpp b/src/common/image.cpp index 7b0dc57f73..cfceb4dc1c 100644 --- a/src/common/image.cpp +++ b/src/common/image.cpp @@ -491,12 +491,12 @@ bool wxPNGHandler::LoadFile( wxImage *image, wxInputStream& stream ) { // VZ: as this function uses setjmp() the only fool proof error handling // method is to use goto (setjmp is not really C++ dtors friendly...) + + unsigned char **lines = (unsigned char **) NULL; + png_infop info_ptr = (png_infop) NULL; + image->Destroy(); - unsigned int i; - unsigned char **lines = NULL; - png_infop info_ptr = NULL; - png_structp png_ptr = png_create_read_struct( PNG_LIBPNG_VER_STRING, (voidp) NULL, (png_error_ptr) NULL, @@ -540,7 +540,7 @@ bool wxPNGHandler::LoadFile( wxImage *image, wxInputStream& stream ) if (lines == NULL) goto error; - for (i = 0; i < height; i++) + for (unsigned int i = 0; i < height; i++) { if ((lines[i] = (unsigned char *)malloc(width * (sizeof(unsigned char) * 4))) == NULL) { diff --git a/src/gtk/menu.cpp b/src/gtk/menu.cpp index 4696faeb11..424da9aa7e 100644 --- a/src/gtk/menu.cpp +++ b/src/gtk/menu.cpp @@ -55,12 +55,11 @@ void wxMenuBar::Append( wxMenu *menu, const wxString &title ) if (pos != -1) menu->m_title.Remove( pos, 1 ); } while (pos != -1); - GtkWidget *root_menu; - root_menu = gtk_menu_item_new_with_label( WXSTRINGCAST(menu->m_title) ); - gtk_widget_show( root_menu ); - gtk_menu_item_set_submenu( GTK_MENU_ITEM(root_menu), menu->m_menu ); + menu->m_owner = gtk_menu_item_new_with_label( WXSTRINGCAST(menu->m_title) ); + gtk_widget_show( menu->m_owner ); + gtk_menu_item_set_submenu( GTK_MENU_ITEM(menu->m_owner), menu->m_menu ); - gtk_menu_bar_append( GTK_MENU_BAR(m_menubar), root_menu ); + gtk_menu_bar_append( GTK_MENU_BAR(m_menubar), menu->m_owner ); } static int FindMenuItemRecursive( const wxMenu *menu, const wxString &menuString, const wxString &itemString ) @@ -77,6 +76,7 @@ static int FindMenuItemRecursive( const wxMenu *menu, const wxString &menuString wxMenuItem *item = (wxMenuItem*)node->Data(); if (item->IsSubMenu()) return FindMenuItemRecursive(item->GetSubMenu(), menuString, itemString); + node = node->Next(); } @@ -158,27 +158,50 @@ bool wxMenuBar::Enabled( int id ) const wxString wxMenuBar::GetLabel( int id ) const { wxMenuItem* item = FindMenuItemById( id ); + if (item) return item->GetText(); + return ""; } void wxMenuBar::SetLabel( int id, const wxString &label ) { wxMenuItem* item = FindMenuItemById( id ); + if (item) return item->SetText( label ); } -void wxMenuBar::EnableTop( int WXUNUSED(pos), bool WXUNUSED(flag) ) +void wxMenuBar::EnableTop( int pos, bool flag ) { + wxNode *node = m_menus.Nth( pos ); + + wxCHECK_RET( node, "menu not found" ); + + wxMenu* menu = (wxMenu*)node->Data(); + + if (menu->m_owner) gtk_widget_set_sensitive( menu->m_owner, flag ); } -wxString wxMenuBar::GetLabelTop( int WXUNUSED(pos) ) const +wxString wxMenuBar::GetLabelTop( int pos ) const { - return "menu"; + wxNode *node = m_menus.Nth( pos ); + + wxCHECK_MSG( node, "invalid", "menu not found" ); + + wxMenu* menu = (wxMenu*)node->Data(); + + return menu->GetTitle(); } -void wxMenuBar::SetLabelTop( int WXUNUSED(pos), const wxString& WXUNUSED(label) ) +void wxMenuBar::SetLabelTop( int pos, const wxString& label ) { + wxNode *node = m_menus.Nth( pos ); + + wxCHECK_RET( node, "menu not found" ); + + wxMenu* menu = (wxMenu*)node->Data(); + + menu->SetTitle( label ); } //----------------------------------------------------------------------------- @@ -345,6 +368,8 @@ wxMenu::wxMenu( const wxString& title, const wxFunction func ) Append(-2, m_title); AppendSeparator(); } + + m_owner = (GtkWidget*) NULL; } void wxMenu::SetTitle( const wxString& title ) diff --git a/src/gtk/tbargtk.cpp b/src/gtk/tbargtk.cpp index 0c7e7f1320..df1b967d1d 100644 --- a/src/gtk/tbargtk.cpp +++ b/src/gtk/tbargtk.cpp @@ -196,10 +196,6 @@ wxToolBarTool *wxToolBar::AddTool( int toolIndex, const wxBitmap& bitmap, wxCHECK_MSG( bitmap.Ok(), (wxToolBarTool *)NULL, "invalid bitmap for wxToolBar icon" ); - wxToolBarTool *tool = new wxToolBarTool( this, toolIndex, bitmap, pushedBitmap, - toggle, clientData, - helpString1, helpString2 ); - wxCHECK_MSG( bitmap.GetBitmap() == NULL, (wxToolBarTool *)NULL, "wxToolBar doesn't support GdkBitmap" ); @@ -218,6 +214,11 @@ wxToolBarTool *wxToolBar::AddTool( int toolIndex, const wxBitmap& bitmap, gtk_misc_set_alignment( GTK_MISC(tool_pixmap), 0.5, 0.5 ); + wxToolBarTool *tool = new wxToolBarTool( this, toolIndex, bitmap, pushedBitmap, + toggle, clientData, + helpString1, helpString2, + tool_pixmap ); + GtkToolbarChildType ctype = toggle ? GTK_TOOLBAR_CHILD_TOGGLEBUTTON : GTK_TOOLBAR_CHILD_BUTTON; @@ -288,8 +289,12 @@ void wxToolBar::EnableTool(int toolIndex, bool enable) { wxToolBarTool *tool = (wxToolBarTool*)node->Data(); if (tool->m_index == toolIndex) - { + { tool->m_enabled = enable; + + if (tool->m_item) + gtk_widget_set_sensitive( tool->m_item, enable ); + return; } node = node->Next(); diff --git a/src/gtk1/menu.cpp b/src/gtk1/menu.cpp index 4696faeb11..424da9aa7e 100644 --- a/src/gtk1/menu.cpp +++ b/src/gtk1/menu.cpp @@ -55,12 +55,11 @@ void wxMenuBar::Append( wxMenu *menu, const wxString &title ) if (pos != -1) menu->m_title.Remove( pos, 1 ); } while (pos != -1); - GtkWidget *root_menu; - root_menu = gtk_menu_item_new_with_label( WXSTRINGCAST(menu->m_title) ); - gtk_widget_show( root_menu ); - gtk_menu_item_set_submenu( GTK_MENU_ITEM(root_menu), menu->m_menu ); + menu->m_owner = gtk_menu_item_new_with_label( WXSTRINGCAST(menu->m_title) ); + gtk_widget_show( menu->m_owner ); + gtk_menu_item_set_submenu( GTK_MENU_ITEM(menu->m_owner), menu->m_menu ); - gtk_menu_bar_append( GTK_MENU_BAR(m_menubar), root_menu ); + gtk_menu_bar_append( GTK_MENU_BAR(m_menubar), menu->m_owner ); } static int FindMenuItemRecursive( const wxMenu *menu, const wxString &menuString, const wxString &itemString ) @@ -77,6 +76,7 @@ static int FindMenuItemRecursive( const wxMenu *menu, const wxString &menuString wxMenuItem *item = (wxMenuItem*)node->Data(); if (item->IsSubMenu()) return FindMenuItemRecursive(item->GetSubMenu(), menuString, itemString); + node = node->Next(); } @@ -158,27 +158,50 @@ bool wxMenuBar::Enabled( int id ) const wxString wxMenuBar::GetLabel( int id ) const { wxMenuItem* item = FindMenuItemById( id ); + if (item) return item->GetText(); + return ""; } void wxMenuBar::SetLabel( int id, const wxString &label ) { wxMenuItem* item = FindMenuItemById( id ); + if (item) return item->SetText( label ); } -void wxMenuBar::EnableTop( int WXUNUSED(pos), bool WXUNUSED(flag) ) +void wxMenuBar::EnableTop( int pos, bool flag ) { + wxNode *node = m_menus.Nth( pos ); + + wxCHECK_RET( node, "menu not found" ); + + wxMenu* menu = (wxMenu*)node->Data(); + + if (menu->m_owner) gtk_widget_set_sensitive( menu->m_owner, flag ); } -wxString wxMenuBar::GetLabelTop( int WXUNUSED(pos) ) const +wxString wxMenuBar::GetLabelTop( int pos ) const { - return "menu"; + wxNode *node = m_menus.Nth( pos ); + + wxCHECK_MSG( node, "invalid", "menu not found" ); + + wxMenu* menu = (wxMenu*)node->Data(); + + return menu->GetTitle(); } -void wxMenuBar::SetLabelTop( int WXUNUSED(pos), const wxString& WXUNUSED(label) ) +void wxMenuBar::SetLabelTop( int pos, const wxString& label ) { + wxNode *node = m_menus.Nth( pos ); + + wxCHECK_RET( node, "menu not found" ); + + wxMenu* menu = (wxMenu*)node->Data(); + + menu->SetTitle( label ); } //----------------------------------------------------------------------------- @@ -345,6 +368,8 @@ wxMenu::wxMenu( const wxString& title, const wxFunction func ) Append(-2, m_title); AppendSeparator(); } + + m_owner = (GtkWidget*) NULL; } void wxMenu::SetTitle( const wxString& title ) diff --git a/src/gtk1/tbargtk.cpp b/src/gtk1/tbargtk.cpp index 0c7e7f1320..df1b967d1d 100644 --- a/src/gtk1/tbargtk.cpp +++ b/src/gtk1/tbargtk.cpp @@ -196,10 +196,6 @@ wxToolBarTool *wxToolBar::AddTool( int toolIndex, const wxBitmap& bitmap, wxCHECK_MSG( bitmap.Ok(), (wxToolBarTool *)NULL, "invalid bitmap for wxToolBar icon" ); - wxToolBarTool *tool = new wxToolBarTool( this, toolIndex, bitmap, pushedBitmap, - toggle, clientData, - helpString1, helpString2 ); - wxCHECK_MSG( bitmap.GetBitmap() == NULL, (wxToolBarTool *)NULL, "wxToolBar doesn't support GdkBitmap" ); @@ -218,6 +214,11 @@ wxToolBarTool *wxToolBar::AddTool( int toolIndex, const wxBitmap& bitmap, gtk_misc_set_alignment( GTK_MISC(tool_pixmap), 0.5, 0.5 ); + wxToolBarTool *tool = new wxToolBarTool( this, toolIndex, bitmap, pushedBitmap, + toggle, clientData, + helpString1, helpString2, + tool_pixmap ); + GtkToolbarChildType ctype = toggle ? GTK_TOOLBAR_CHILD_TOGGLEBUTTON : GTK_TOOLBAR_CHILD_BUTTON; @@ -288,8 +289,12 @@ void wxToolBar::EnableTool(int toolIndex, bool enable) { wxToolBarTool *tool = (wxToolBarTool*)node->Data(); if (tool->m_index == toolIndex) - { + { tool->m_enabled = enable; + + if (tool->m_item) + gtk_widget_set_sensitive( tool->m_item, enable ); + return; } node = node->Next();