X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a2d93e735a9f126b855a9353ca8ddeacaaf52817..ff8b6290e9b7d0c604c35ca938d87cbd1fd157ed:/src/gtk1/notebook.cpp?ds=inline diff --git a/src/gtk1/notebook.cpp b/src/gtk1/notebook.cpp index a05a2f1b00..f47bb99b30 100644 --- a/src/gtk1/notebook.cpp +++ b/src/gtk1/notebook.cpp @@ -26,6 +26,13 @@ #include "wx/gtk/win_gtk.h" #include +// ---------------------------------------------------------------------------- +// events +// ---------------------------------------------------------------------------- + +DEFINE_EVENT_TYPE(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING) + //----------------------------------------------------------------------------- // idle system //----------------------------------------------------------------------------- @@ -82,27 +89,44 @@ static void gtk_notebook_page_change_callback(GtkNotebook *WXUNUSED(widget), gint page, wxNotebook *notebook ) { + static bool s_inPageChange = FALSE; + + // are you trying to call SetSelection() from a notebook event handler? + // you shouldn't! + wxCHECK_RET( !s_inPageChange, + _T("gtk_notebook_page_change_callback reentered") ); + + s_inPageChange = TRUE; if (g_isIdle) wxapp_install_idle_handler(); int old = notebook->GetSelection(); - wxNotebookEvent event1( wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING, - notebook->GetId(), page, old ); - event1.SetEventObject( notebook ); + wxNotebookEvent eventChanging( wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING, + notebook->GetId(), page, old ); + eventChanging.SetEventObject( notebook ); - if ((notebook->GetEventHandler()->ProcessEvent( event1 )) && - !event1.IsAllowed() ) + if ( (notebook->GetEventHandler()->ProcessEvent(eventChanging)) && + !eventChanging.IsAllowed() ) { /* program doesn't allow the page change */ - gtk_signal_emit_stop_by_name( GTK_OBJECT(notebook->m_widget), "switch_page" ); - return; + gtk_signal_emit_stop_by_name( GTK_OBJECT(notebook->m_widget), + "switch_page" ); + } + else // change allowed + { + // make wxNotebook::GetSelection() return the correct (i.e. consistent + // with wxNotebookEvent::GetSelection()) value even though the page is + // not really changed in GTK+ + notebook->m_selection = page; + + wxNotebookEvent eventChanged( wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED, + notebook->GetId(), page, old ); + eventChanged.SetEventObject( notebook ); + notebook->GetEventHandler()->ProcessEvent( eventChanged ); } - wxNotebookEvent event2( wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED, - notebook->GetId(), page, old ); - event2.SetEventObject( notebook ); - notebook->GetEventHandler()->ProcessEvent( event2 ); + s_inPageChange = FALSE; } //----------------------------------------------------------------------------- @@ -214,8 +238,9 @@ END_EVENT_TABLE() void wxNotebook::Init() { m_imageList = (wxImageList *) NULL; + m_ownsImageList = FALSE; m_pages.DeleteContents( TRUE ); - m_lastSelection = -1; + m_selection = -1; m_themeEnabled = TRUE; } @@ -239,6 +264,7 @@ wxNotebook::~wxNotebook() GTK_SIGNAL_FUNC(gtk_notebook_page_change_callback), (gpointer) this ); DeleteAllPages(); + if (m_ownsImageList) delete m_imageList; } bool wxNotebook::Create(wxWindow *parent, wxWindowID id, @@ -296,25 +322,24 @@ int wxNotebook::GetSelection() const { wxCHECK_MSG( m_widget != NULL, -1, wxT("invalid notebook") ); - GList *pages = GTK_NOTEBOOK(m_widget)->children; - - if (g_list_length(pages) == 0) return -1; - - GtkNotebook *notebook = GTK_NOTEBOOK(m_widget); - - if (notebook->cur_page == NULL) return m_lastSelection; + if ( m_selection == -1 ) + { + GList *pages = GTK_NOTEBOOK(m_widget)->children; - return g_list_index( pages, (gpointer)(notebook->cur_page) ); -} + if (g_list_length(pages) != 0) + { + GtkNotebook *notebook = GTK_NOTEBOOK(m_widget); -int wxNotebook::GetPageCount() const -{ - return (int) g_list_length( GTK_NOTEBOOK(m_widget)->children ); -} + gpointer cur = notebook->cur_page; + if ( cur != NULL ) + { + wxConstCast(this, wxNotebook)->m_selection = + g_list_index( pages, cur ); + } + } + } -int wxNotebook::GetRowCount() const -{ - return 1; + return m_selection; } wxString wxNotebook::GetPageText( int page ) const @@ -358,6 +383,8 @@ int wxNotebook::SetSelection( int page ) int selOld = GetSelection(); + // cache the selection + m_selection = page; gtk_notebook_set_page( GTK_NOTEBOOK(m_widget), page ); wxGtkNotebookPage* g_page = GetNotebookPage( page ); @@ -367,28 +394,17 @@ int wxNotebook::SetSelection( int page ) return selOld; } -void wxNotebook::AdvanceSelection( bool forward ) +void wxNotebook::SetImageList( wxImageList* imageList ) { - wxCHECK_RET( m_widget != NULL, wxT("invalid notebook") ); - - int max = GetPageCount(); - if ( !max ) - { - // nothing to do with empty notebook - return; - } - - int sel = GetSelection(); - - if (forward) - SetSelection( sel == max - 1 ? 0 : sel + 1 ); - else - SetSelection( sel == 0 ? max - 1 : sel - 1 ); + if (m_ownsImageList) delete m_imageList; + m_imageList = imageList; + m_ownsImageList = FALSE; } -void wxNotebook::SetImageList( wxImageList* imageList ) +void wxNotebook::AssignImageList( wxImageList* imageList ) { - m_imageList = imageList; + SetImageList(imageList); + m_ownsImageList = TRUE; } bool wxNotebook::SetPageText( int page, const wxString &text ) @@ -519,25 +535,31 @@ bool wxNotebook::DeleteAllPages() bool wxNotebook::DeletePage( int page ) { wxGtkNotebookPage* nb_page = GetNotebookPage(page); - if (!nb_page) return FALSE; + wxCHECK_MSG( nb_page, FALSE, _T("invalid page in wxNotebook::DeletePage") ); - /* GTK sets GtkNotebook.cur_page to NULL before sending - the switch page event */ - m_lastSelection = GetSelection(); + // GTK sets GtkNotebook.cur_page to NULL before sending the switch page + // event so we have to store the selection internally + if ( m_selection == -1 ) + { + m_selection = GetSelection(); + if ( m_selection == (int)m_pages.GetCount() - 1 ) + { + // the index will become invalid after the page is deleted + m_selection = -1; + } + } nb_page->m_client->Destroy(); m_pages.DeleteObject( nb_page ); - m_lastSelection = -1; - return TRUE; } -bool wxNotebook::RemovePage( int page ) +wxNotebookPage *wxNotebook::DoRemovePage( int page ) { wxGtkNotebookPage* nb_page = GetNotebookPage(page); - wxCHECK_MSG( nb_page, FALSE, _T("wxNotebook::RemovePage: invalid page") ); + wxCHECK_MSG( nb_page, NULL, _T("wxNotebook::RemovePage: invalid page") ); gtk_widget_ref( nb_page->m_client->m_widget ); gtk_widget_unrealize( nb_page->m_client->m_widget ); @@ -545,9 +567,10 @@ bool wxNotebook::RemovePage( int page ) gtk_notebook_remove_page( GTK_NOTEBOOK(m_widget), page ); + wxNotebookPage *pageRemoved = (wxNotebookPage *)m_pages[page]; m_pages.DeleteObject( nb_page ); - return TRUE; + return pageRemoved; } bool wxNotebook::InsertPage( int position, wxNotebookPage* win, const wxString& text, @@ -649,17 +672,6 @@ void wxNotebook::OnNavigationKey(wxNavigationKeyEvent& event) event.Skip(); } -wxNotebookPage *wxNotebook::GetPage( int page ) const -{ - wxCHECK_MSG( m_widget != NULL, (wxWindow*) NULL, wxT("invalid notebook") ); - - wxGtkNotebookPage* nb_page = GetNotebookPage(page); - if (!nb_page) - return (wxNotebookPage *) NULL; - else - return nb_page->m_client; -} - #if wxUSE_CONSTRAINTS // override these 2 functions to do nothing: everything is done in OnSize