X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2ded391d8f1a0724ee0e516eb520ae58d0a6a151..dc8005e2062bdc3cae2554a8519e264c6d8ce9c7:/src/gtk/notebook.cpp diff --git a/src/gtk/notebook.cpp b/src/gtk/notebook.cpp index 8b23e3256e..c3dd7241a1 100644 --- a/src/gtk/notebook.cpp +++ b/src/gtk/notebook.cpp @@ -24,12 +24,15 @@ #include "wx/intl.h" #include "wx/log.h" #include "wx/bitmap.h" +#include "wx/fontutil.h" #include "wx/gtk/private.h" #include "wx/gtk/win_gtk.h" #include +#include "wx/msgdlg.h" + // ---------------------------------------------------------------------------- // events // ---------------------------------------------------------------------------- @@ -64,23 +67,25 @@ extern bool g_blockEventsOnDrag; class wxGtkNotebookPage: public wxObject { public: - wxGtkNotebookPage() - { - m_image = -1; - m_page = (GtkNotebookPage *) NULL; - m_box = (GtkWidget *) NULL; - } - - wxString m_text; - int m_image; - GtkNotebookPage *m_page; - GtkLabel *m_label; - GtkWidget *m_box; // in which the label and image are packed + wxGtkNotebookPage() + { + m_image = -1; + m_page = (GtkNotebookPage *) NULL; + m_box = (GtkWidget *) NULL; + } + + wxString m_text; + int m_image; + GtkNotebookPage *m_page; + GtkLabel *m_label; + GtkWidget *m_box; // in which the label and image are packed }; + #include "wx/listimpl.cpp" WX_DEFINE_LIST(wxGtkNotebookPagesList); + //----------------------------------------------------------------------------- // "switch_page" //----------------------------------------------------------------------------- @@ -224,12 +229,19 @@ static gint gtk_notebook_key_press_callback( GtkWidget *widget, GdkEventKey *gdk static void wxInsertChildInNotebook( wxNotebook* parent, wxWindow* child ) { - // Hack alert! We manually set the child window - // parent field so that GTK can query the - // notebook's style and font. Without that, GetBestSize could return - // incorrect size, see bug #901694 for details + // Hack Alert! (Part I): This sets the notebook as the parent of the child + // widget, and takes care of some details such as updating the state and + // style of the child to reflect its new location. We do this early + // because without it GetBestSize (which is used to set the initial size + // of controls if an explicit size is not given) will often report + // incorrect sizes since the widget's style context is not fully known. + // See bug #901694 for details // (http://sourceforge.net/tracker/?func=detail&aid=901694&group_id=9863&atid=109863) - child->m_widget->parent = parent->m_widget; + gtk_widget_set_parent(child->m_widget, parent->m_widget); + + // NOTE: This should be considered a temporary workaround until we can + // work out the details and implement delaying the setting of the initial + // size of widgets until the size is really needed. } //----------------------------------------------------------------------------- @@ -305,15 +317,11 @@ bool wxNotebook::Create(wxWindow *parent, wxWindowID id, gtk_signal_connect( GTK_OBJECT(m_widget), "key_press_event", GTK_SIGNAL_FUNC(gtk_notebook_key_press_callback), (gpointer)this ); - PostCreation(); - - SetFont( parent->GetFont() ); + PostCreation(size); gtk_signal_connect( GTK_OBJECT(m_widget), "realize", GTK_SIGNAL_FUNC(gtk_notebook_realized_callback), (gpointer) this ); - Show( TRUE ); - return TRUE; } @@ -537,23 +545,18 @@ bool wxNotebook::DeleteAllPages() wxASSERT_MSG( GetPageCount() == 0, _T("all pages must have been deleted") ); + InvalidateBestSize(); return wxNotebookBase::DeleteAllPages(); } -bool wxNotebook::DeletePage( size_t page ) +wxNotebookPage *wxNotebook::DoRemovePage( size_t page ) { - if ( m_selection == (int)m_pagesData.GetCount() - 1 ) + if ( m_selection != -1 && (size_t)m_selection >= page ) { // the index will become invalid after the page is deleted m_selection = -1; } - // it will call our DoRemovePage() to do the real work - return wxNotebookBase::DeletePage(page); -} - -wxNotebookPage *wxNotebook::DoRemovePage( size_t page ) -{ wxNotebookPage *client = wxNotebookBase::DoRemovePage(page); if ( !client ) return NULL; @@ -594,8 +597,11 @@ bool wxNotebook::InsertPage( size_t position, wxCHECK_MSG( position <= GetPageCount(), FALSE, _T("invalid page index in wxNotebookPage::InsertPage()") ); - // Hack alert part II! See above in InsertChildInNotebook - // callback why this has to be done. + // Hack Alert! (Part II): See above in wxInsertChildInNotebook callback + // why this has to be done. NOTE: using gtk_widget_unparent here does not + // work as it seems to undo too much and will cause errors in the + // gtk_notebook_insert_page below, so instead just clear the parent by + // hand here. win->m_widget->parent = NULL; // don't receive switch page during addition @@ -655,12 +661,21 @@ bool wxNotebook::InsertPage( size_t position, } /* set the label text */ + nb_page->m_text = text; if (nb_page->m_text.IsEmpty()) nb_page->m_text = wxT(""); nb_page->m_label = GTK_LABEL( gtk_label_new(wxGTK_CONV(nb_page->m_text)) ); gtk_box_pack_end( GTK_BOX(nb_page->m_box), GTK_WIDGET(nb_page->m_label), FALSE, FALSE, m_padding ); + /* apply current style */ + GtkRcStyle *style = CreateWidgetStyle(); + if ( style ) + { + gtk_widget_modify_style(GTK_WIDGET(nb_page->m_label), style); + gtk_rc_style_unref(style); + } + /* show the label */ gtk_widget_show( GTK_WIDGET(nb_page->m_label) ); if (select && (m_pagesData.GetCount() > 1)) @@ -677,6 +692,7 @@ bool wxNotebook::InsertPage( size_t position, gtk_signal_connect( GTK_OBJECT(m_widget), "switch_page", GTK_SIGNAL_FUNC(gtk_notebook_page_change_callback), (gpointer)this ); + InvalidateBestSize(); return TRUE; } @@ -779,12 +795,12 @@ bool wxNotebook::DoPhase( int WXUNUSED(nPhase) ) #endif -void wxNotebook::ApplyWidgetStyle() +void wxNotebook::DoApplyWidgetStyle(GtkRcStyle *style) { - // TODO, font for labels etc - - SetWidgetStyle(); - gtk_widget_set_style( m_widget, m_widgetStyle ); + gtk_widget_modify_style(m_widget, style); + size_t cnt = m_pagesData.GetCount(); + for (size_t i = 0; i < cnt; i++) + gtk_widget_modify_style(GTK_WIDGET(GetNotebookPage(i)->m_label), style); } bool wxNotebook::IsOwnGtkWindow( GdkWindow *window ) @@ -793,6 +809,13 @@ bool wxNotebook::IsOwnGtkWindow( GdkWindow *window ) (NOTEBOOK_PANEL(m_widget) == window)); } +// static +wxVisualAttributes +wxNotebook::GetClassDefaultAttributes(wxWindowVariant WXUNUSED(variant)) +{ + return GetDefaultAttributesFromGTKWidget(gtk_notebook_new); +} + //----------------------------------------------------------------------------- // wxNotebookEvent //-----------------------------------------------------------------------------