+ // We cannot remove the page yet, as GTK sends the "switch_page"
+ // signal before it has removed the notebook-page from its
+ // corresponding list. Thus, if we were to remove the page from
+ // m_pages at this point, the two lists of pages would be out
+ // of sync during the PAGE_CHANGING/PAGE_CHANGED events.
+ wxNotebookPage *client = GetPage(page);
+ if ( !client )
+ return NULL;
+
+ // we don't need to unparent the client->m_widget; GTK+ will do
+ // that for us (and will throw a warning if we do it!)
+ gtk_notebook_remove_page( GTK_NOTEBOOK(m_widget), page );
+
+ // It's safe to remove the page now.
+ wxASSERT_MSG(GetPage(page) == client, wxT("pages changed during delete"));
+ wxNotebookBase::DoRemovePage(page);
+
+ wxGtkNotebookPage* p = GetNotebookPage(page);
+ m_pagesData.DeleteObject(p);
+ delete p;
+
+ return client;
+}
+
+bool wxNotebook::InsertPage( size_t position,
+ wxNotebookPage* win,
+ const wxString& text,
+ bool select,
+ int imageId )
+{
+ wxCHECK_MSG( m_widget != NULL, false, wxT("invalid notebook") );
+
+ wxCHECK_MSG( win->GetParent() == this, false,
+ wxT("Can't add a page whose parent is not the notebook!") );
+
+ wxCHECK_MSG( position <= GetPageCount(), false,
+ wxT("invalid page index in wxNotebookPage::InsertPage()") );
+
+ // Hack Alert! (Part II): See above in wxNotebook::AddChildGTK
+ // why this has to be done.
+ gtk_widget_unparent(win->m_widget);
+
+ if (m_themeEnabled)
+ win->SetThemeEnabled(true);
+
+ GtkNotebook *notebook = GTK_NOTEBOOK(m_widget);
+
+ wxGtkNotebookPage* pageData = new wxGtkNotebookPage;
+
+ m_pages.Insert(win, position);
+ m_pagesData.Insert(position, pageData);
+
+ // set the label image and text
+ // this must be done before adding the page, as GetPageText
+ // and GetPageImage will otherwise return wrong values in
+ // the page-changed event that results from inserting the
+ // first page.
+ pageData->m_imageIndex = imageId;
+
+ pageData->m_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 1);
+ gtk_container_set_border_width(GTK_CONTAINER(pageData->m_box), 2);
+
+ pageData->m_image = NULL;
+ if (imageId != -1)
+ {
+ if (HasImageList())
+ {
+ const wxBitmap* bitmap = GetImageList()->GetBitmapPtr(imageId);
+ pageData->m_image = gtk_image_new_from_pixbuf(bitmap->GetPixbuf());
+ gtk_box_pack_start(GTK_BOX(pageData->m_box),
+ pageData->m_image, false, false, m_padding);
+ }
+ else
+ {
+ wxFAIL_MSG("invalid notebook imagelist");
+ }
+ }
+
+ /* set the label text */
+ pageData->m_label = gtk_label_new(wxGTK_CONV(wxStripMenuCodes(text)));
+ gtk_box_pack_end(GTK_BOX(pageData->m_box),
+ pageData->m_label, false, false, m_padding);
+
+ gtk_widget_show_all(pageData->m_box);
+ gtk_notebook_insert_page(notebook, win->m_widget, pageData->m_box, position);
+
+ /* apply current style */
+#ifdef __WXGTK3__
+ GTKApplyStyle(pageData->m_label, NULL);
+#else
+ GtkRcStyle *style = GTKCreateWidgetStyle();
+ if ( style )
+ {
+ gtk_widget_modify_style(pageData->m_label, style);
+ g_object_unref(style);
+ }
+#endif