X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5e7e9e1b68c236fc0701e8313ff20f9768b667c2..461697c2ae572caeaa26539aa5a504368e8b350e:/src/gtk/notebook.cpp diff --git a/src/gtk/notebook.cpp b/src/gtk/notebook.cpp index ead3936605..78f0ebc9d6 100644 --- a/src/gtk/notebook.cpp +++ b/src/gtk/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 //----------------------------------------------------------------------------- @@ -50,18 +57,18 @@ extern void debug_focus_in( GtkWidget* widget, const wxChar* name, const wxChar #endif //----------------------------------------------------------------------------- -// wxNotebookPage +// wxGtkNotebookPage //----------------------------------------------------------------------------- -class wxNotebookPage: public wxObject +class wxGtkNotebookPage: public wxObject { public: - wxNotebookPage() + wxGtkNotebookPage() { m_text = ""; m_image = -1; m_page = (GtkNotebookPage *) NULL; - m_client = (wxWindow *) NULL; + m_client = (wxNotebookPage *) NULL; m_box = (GtkWidget *) NULL; } @@ -69,7 +76,7 @@ public: int m_image; GtkNotebookPage *m_page; GtkLabel *m_label; - wxWindow *m_client; + wxNotebookPage *m_client; GtkWidget *m_box; // in which the label and image are packed }; @@ -128,9 +135,9 @@ static void gtk_page_size_callback( GtkWidget *WXUNUSED(widget), GtkAllocation* here in order to make repositioning after resizing to take effect. */ if ((gtk_major_version == 1) && (gtk_minor_version == 2) && - (gtk_micro_version < 6) && - (win->m_wxwindow) && - (GTK_WIDGET_REALIZED(win->m_wxwindow))) + (gtk_micro_version < 6) && + (win->m_wxwindow) && + (GTK_WIDGET_REALIZED(win->m_wxwindow))) { gtk_widget_size_allocate( win->m_wxwindow, alloc ); } @@ -153,6 +160,45 @@ gtk_notebook_realized_callback( GtkWidget * WXUNUSED(widget), wxWindow *win ) return FALSE; } +//----------------------------------------------------------------------------- +// "key_press_event" +//----------------------------------------------------------------------------- + +static gint gtk_notebook_key_press_callback( GtkWidget *widget, GdkEventKey *gdk_event, wxNotebook *win ) +{ + if (g_isIdle) + wxapp_install_idle_handler(); + + if (!win->m_hasVMT) return FALSE; + if (g_blockEventsOnDrag) return FALSE; + + /* win is a control: tab can be propagated up */ + if ((gdk_event->keyval == GDK_Tab) || (gdk_event->keyval == GDK_ISO_Left_Tab)) + { + wxNode *node = win->m_pages.Nth( win->GetSelection() ); + if (!node) return FALSE; + + wxGtkNotebookPage *page = (wxGtkNotebookPage*) node->Data(); + + wxNavigationKeyEvent event; + event.SetEventObject( win ); + /* GDK reports GDK_ISO_Left_Tab for SHIFT-TAB */ + event.SetDirection( (gdk_event->keyval == GDK_Tab) ); + /* CTRL-TAB changes the (parent) window, i.e. switch notebook page */ + event.SetWindowChange( (gdk_event->state & GDK_CONTROL_MASK) ); + event.SetCurrentFocus( win ); + if (!page->m_client->GetEventHandler()->ProcessEvent( event )) + { + page->m_client->SetFocus(); + } + + gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "key_press_event" ); + return TRUE; + } + + return FALSE; +} + //----------------------------------------------------------------------------- // InsertChild callback for wxNotebook //----------------------------------------------------------------------------- @@ -175,8 +221,10 @@ END_EVENT_TABLE() void wxNotebook::Init() { m_imageList = (wxImageList *) NULL; + m_ownsImageList = FALSE; m_pages.DeleteContents( TRUE ); m_lastSelection = -1; + m_themeEnabled = TRUE; } wxNotebook::wxNotebook() @@ -199,6 +247,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, @@ -213,7 +262,7 @@ bool wxNotebook::Create(wxWindow *parent, wxWindowID id, !CreateBase( parent, id, pos, size, style, wxDefaultValidator, name )) { wxFAIL_MSG( wxT("wxNoteBook creation failed") ); - return FALSE; + return FALSE; } @@ -230,15 +279,20 @@ bool wxNotebook::Create(wxWindow *parent, wxWindowID id, m_parent->DoAddChild( this ); - if(m_windowStyle & wxNB_RIGHT) - gtk_notebook_set_tab_pos( GTK_NOTEBOOK(m_widget), GTK_POS_RIGHT ); - if(m_windowStyle & wxNB_LEFT) - gtk_notebook_set_tab_pos( GTK_NOTEBOOK(m_widget), GTK_POS_LEFT ); - if(m_windowStyle & wxNB_BOTTOM) - gtk_notebook_set_tab_pos( GTK_NOTEBOOK(m_widget), GTK_POS_BOTTOM ); + if (m_windowStyle & wxNB_RIGHT) + gtk_notebook_set_tab_pos( GTK_NOTEBOOK(m_widget), GTK_POS_RIGHT ); + if (m_windowStyle & wxNB_LEFT) + gtk_notebook_set_tab_pos( GTK_NOTEBOOK(m_widget), GTK_POS_LEFT ); + if (m_windowStyle & wxNB_BOTTOM) + gtk_notebook_set_tab_pos( GTK_NOTEBOOK(m_widget), GTK_POS_BOTTOM ); + + gtk_signal_connect( GTK_OBJECT(m_widget), "key_press_event", + GTK_SIGNAL_FUNC(gtk_notebook_key_press_callback), (gpointer)this ); PostCreation(); + SetFont( parent->GetFont() ); + gtk_signal_connect( GTK_OBJECT(m_widget), "realize", GTK_SIGNAL_FUNC(gtk_notebook_realized_callback), (gpointer) this ); @@ -247,19 +301,6 @@ bool wxNotebook::Create(wxWindow *parent, wxWindowID id, return TRUE; } -void wxNotebook::SetFocus() -{ - if (m_pages.GetCount() == 0) return; - - wxNode *node = m_pages.Nth( GetSelection() ); - - if (!node) return; - - wxNotebookPage *page = (wxNotebookPage*) node->Data(); - - page->m_client->SetFocus(); -} - int wxNotebook::GetSelection() const { wxCHECK_MSG( m_widget != NULL, -1, wxT("invalid notebook") ); @@ -289,7 +330,7 @@ wxString wxNotebook::GetPageText( int page ) const { wxCHECK_MSG( m_widget != NULL, wxT(""), wxT("invalid notebook") ); - wxNotebookPage* nb_page = GetNotebookPage(page); + wxGtkNotebookPage* nb_page = GetNotebookPage(page); if (nb_page) return nb_page->m_text; else @@ -300,22 +341,22 @@ int wxNotebook::GetPageImage( int page ) const { wxCHECK_MSG( m_widget != NULL, -1, wxT("invalid notebook") ); - wxNotebookPage* nb_page = GetNotebookPage(page); + wxGtkNotebookPage* nb_page = GetNotebookPage(page); if (nb_page) return nb_page->m_image; else return -1; } -wxNotebookPage* wxNotebook::GetNotebookPage( int page ) const +wxGtkNotebookPage* wxNotebook::GetNotebookPage( int page ) const { - wxCHECK_MSG( m_widget != NULL, (wxNotebookPage*) NULL, wxT("invalid notebook") ); + wxCHECK_MSG( m_widget != NULL, (wxGtkNotebookPage*) NULL, wxT("invalid notebook") ); - wxCHECK_MSG( page < (int)m_pages.GetCount(), (wxNotebookPage*) NULL, wxT("invalid notebook index") ); + wxCHECK_MSG( page < (int)m_pages.GetCount(), (wxGtkNotebookPage*) NULL, wxT("invalid notebook index") ); wxNode *node = m_pages.Nth( page ); - return (wxNotebookPage *) node->Data(); + return (wxGtkNotebookPage *) node->Data(); } int wxNotebook::SetSelection( int page ) @@ -327,6 +368,10 @@ int wxNotebook::SetSelection( int page ) int selOld = GetSelection(); gtk_notebook_set_page( GTK_NOTEBOOK(m_widget), page ); + + wxGtkNotebookPage* g_page = GetNotebookPage( page ); + if (g_page->m_client) + g_page->m_client->SetFocus(); return selOld; } @@ -335,25 +380,39 @@ void wxNotebook::AdvanceSelection( bool forward ) { wxCHECK_RET( m_widget != NULL, wxT("invalid notebook") ); - int sel = GetSelection(); int max = GetPageCount(); + if ( !max ) + { + // nothing to do with empty notebook + return; + } + + int sel = GetSelection(); if (forward) - SetSelection( sel == max ? 0 : sel + 1 ); + SetSelection( sel == max - 1 ? 0 : sel + 1 ); else - SetSelection( sel == 0 ? max-1 : sel - 1 ); + SetSelection( sel == 0 ? max - 1 : sel - 1 ); } void wxNotebook::SetImageList( wxImageList* imageList ) { + if (m_ownsImageList) delete m_imageList; m_imageList = imageList; + m_ownsImageList = FALSE; +} + +void wxNotebook::AssignImageList( wxImageList* imageList ) +{ + SetImageList(imageList); + m_ownsImageList = TRUE; } bool wxNotebook::SetPageText( int page, const wxString &text ) { wxCHECK_MSG( m_widget != NULL, FALSE, wxT("invalid notebook") ); - wxNotebookPage* nb_page = GetNotebookPage(page); + wxGtkNotebookPage* nb_page = GetNotebookPage(page); wxCHECK_MSG( nb_page, FALSE, wxT("SetPageText: invalid page index") ); @@ -368,7 +427,7 @@ bool wxNotebook::SetPageImage( int page, int image ) { /* HvdH 28-12-98: now it works, but it's a bit of a kludge */ - wxNotebookPage* nb_page = GetNotebookPage(page); + wxGtkNotebookPage* nb_page = GetNotebookPage(page); if (!nb_page) return FALSE; @@ -395,20 +454,20 @@ bool wxNotebook::SetPageImage( int page, int image ) GList *child = gtk_container_children(GTK_CONTAINER(nb_page->m_box)); while (child) - { + { if (GTK_IS_PIXMAP(child->data)) - { - pixmapwid = GTK_WIDGET(child->data); - break; + { + pixmapwid = GTK_WIDGET(child->data); + break; } - child = child->next; - } + child = child->next; + } /* We should have the pixmap widget now */ wxASSERT(pixmapwid != NULL); if (image == -1) - { + { /* If there's no new widget, just remove the old from the box */ gtk_container_remove(GTK_CONTAINER(nb_page->m_box), pixmapwid); nb_page->m_image = -1; @@ -476,11 +535,11 @@ bool wxNotebook::DeleteAllPages() bool wxNotebook::DeletePage( int page ) { - wxNotebookPage* nb_page = GetNotebookPage(page); + wxGtkNotebookPage* nb_page = GetNotebookPage(page); if (!nb_page) return FALSE; /* GTK sets GtkNotebook.cur_page to NULL before sending - the switvh page event */ + the switch page event */ m_lastSelection = GetSelection(); nb_page->m_client->Destroy(); @@ -493,10 +552,14 @@ bool wxNotebook::DeletePage( int page ) bool wxNotebook::RemovePage( int page ) { - wxNotebookPage* nb_page = GetNotebookPage(page); + wxGtkNotebookPage* nb_page = GetNotebookPage(page); - if (!nb_page) return FALSE; + wxCHECK_MSG( nb_page, FALSE, _T("wxNotebook::RemovePage: invalid page") ); + gtk_widget_ref( nb_page->m_client->m_widget ); + gtk_widget_unrealize( nb_page->m_client->m_widget ); + gtk_widget_unparent( nb_page->m_client->m_widget ); + gtk_notebook_remove_page( GTK_NOTEBOOK(m_widget), page ); m_pages.DeleteObject( nb_page ); @@ -504,7 +567,7 @@ bool wxNotebook::RemovePage( int page ) return TRUE; } -bool wxNotebook::InsertPage( int position, wxWindow* win, const wxString& text, +bool wxNotebook::InsertPage( int position, wxNotebookPage* win, const wxString& text, bool select, int imageId ) { wxCHECK_MSG( m_widget != NULL, FALSE, wxT("invalid notebook") ); @@ -516,9 +579,12 @@ bool wxNotebook::InsertPage( int position, wxWindow* win, const wxString& text, gtk_signal_disconnect_by_func( GTK_OBJECT(m_widget), GTK_SIGNAL_FUNC(gtk_notebook_page_change_callback), (gpointer) this ); + if (m_themeEnabled) + win->SetThemeEnabled(TRUE); + GtkNotebook *notebook = GTK_NOTEBOOK(m_widget); - wxNotebookPage *page = new wxNotebookPage(); + wxGtkNotebookPage *page = new wxGtkNotebookPage(); if (position < 0) m_pages.Append( page ); @@ -576,7 +642,7 @@ bool wxNotebook::InsertPage( int position, wxWindow* win, const wxString& text, { if (position < 0) SetSelection( GetPageCount()-1 ); - else + else SetSelection( position ); } @@ -586,7 +652,7 @@ bool wxNotebook::InsertPage( int position, wxWindow* win, const wxString& text, return TRUE; } -bool wxNotebook::AddPage(wxWindow* win, const wxString& text, +bool wxNotebook::AddPage(wxNotebookPage* win, const wxString& text, bool select, int imageId) { return InsertPage( -1, win, text, select, imageId ); @@ -600,17 +666,19 @@ void wxNotebook::OnNavigationKey(wxNavigationKeyEvent& event) event.Skip(); } -wxWindow *wxNotebook::GetPage( int page ) const +wxNotebookPage *wxNotebook::GetPage( int page ) const { wxCHECK_MSG( m_widget != NULL, (wxWindow*) NULL, wxT("invalid notebook") ); - wxNotebookPage* nb_page = GetNotebookPage(page); + wxGtkNotebookPage* nb_page = GetNotebookPage(page); if (!nb_page) - return (wxWindow *) NULL; + return (wxNotebookPage *) NULL; else return nb_page->m_client; } +#if wxUSE_CONSTRAINTS + // override these 2 functions to do nothing: everything is done in OnSize void wxNotebook::SetConstraintSizes( bool WXUNUSED(recurse) ) { @@ -623,8 +691,12 @@ bool wxNotebook::DoPhase( int WXUNUSED(nPhase) ) return TRUE; } +#endif + void wxNotebook::ApplyWidgetStyle() { + // TODO, font for labels etc + SetWidgetStyle(); gtk_widget_set_style( m_widget, m_widgetStyle ); }