// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-#pragma implementation "notebook.h"
-#endif
-
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#include "wx/bitmap.h"
#include "wx/fontutil.h"
-#include "wx/gtk/private.h"
-#include "wx/gtk/win_gtk.h"
+#include "wx/gtk1/private.h"
+#include "wx/gtk1/win_gtk.h"
#include <gdk/gdkkeysyms.h>
m_page = (GtkNotebookPage *) NULL;
m_box = (GtkWidget *) NULL;
}
-
+
wxString m_text;
int m_image;
GtkNotebookPage *m_page;
#include "wx/listimpl.cpp"
-WX_DEFINE_LIST(wxGtkNotebookPagesList);
+WX_DEFINE_LIST(wxGtkNotebookPagesList)
//-----------------------------------------------------------------------------
// "switch_page"
//-----------------------------------------------------------------------------
+extern "C" {
static void gtk_notebook_page_change_callback(GtkNotebook *WXUNUSED(widget),
GtkNotebookPage *WXUNUSED(page),
gint page,
notebook->m_inSwitchPage = FALSE;
}
+}
//-----------------------------------------------------------------------------
// "size_allocate"
//-----------------------------------------------------------------------------
+extern "C" {
static void gtk_page_size_callback( GtkWidget *WXUNUSED(widget), GtkAllocation* alloc, wxWindow *win )
{
if (g_isIdle)
gtk_widget_size_allocate( win->m_wxwindow, alloc );
}
}
+}
//-----------------------------------------------------------------------------
// "realize" from m_widget
//-----------------------------------------------------------------------------
+extern "C" {
static gint
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 )
+extern "C" {
+static gint gtk_notebook_key_press_callback( GtkWidget *widget, GdkEventKey *gdk_event, wxNotebook *notebook )
{
if (g_isIdle)
wxapp_install_idle_handler();
- if (!win->m_hasVMT) return FALSE;
+ if (!notebook->m_hasVMT) return FALSE;
if (g_blockEventsOnDrag) return FALSE;
+ /* win is a control: tab can be propagated up */
+ if ((gdk_event->keyval == GDK_Left) || (gdk_event->keyval == GDK_Right))
+ {
+ int page;
+ int nMax = notebook->GetPageCount();
+ if ( nMax-- ) // decrement it to get the last valid index
+ {
+ int nSel = notebook->GetSelection();
+
+ // change selection wrapping if it becomes invalid
+ page = (gdk_event->keyval != GDK_Left) ? nSel == nMax ? 0
+ : nSel + 1
+ : nSel == 0 ? nMax
+ : nSel - 1;
+ }
+ else // notebook is empty, no next page
+ {
+ return FALSE;
+ }
+
+ // m_selection = page;
+ gtk_notebook_set_page( GTK_NOTEBOOK(widget), page );
+
+ gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "key_press_event" );
+ return TRUE;
+ }
+
/* win is a control: tab can be propagated up */
if ((gdk_event->keyval == GDK_Tab) || (gdk_event->keyval == GDK_ISO_Left_Tab))
{
- int sel = win->GetSelection();
+ int sel = notebook->GetSelection();
if (sel == -1)
return TRUE;
- wxGtkNotebookPage *nb_page = win->GetNotebookPage(sel);
+ wxGtkNotebookPage *nb_page = notebook->GetNotebookPage(sel);
wxCHECK_MSG( nb_page, FALSE, _T("invalid selection in wxNotebook") );
wxNavigationKeyEvent event;
- event.SetEventObject( win );
+ event.SetEventObject( notebook );
/* 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 );
+ event.SetWindowChange( (gdk_event->state & GDK_CONTROL_MASK) ||
+ (gdk_event->keyval == GDK_Left) || (gdk_event->keyval == GDK_Right) );
+ event.SetCurrentFocus( notebook );
- wxNotebookPage *client = win->GetPage(sel);
+ wxNotebookPage *client = notebook->GetPage(sel);
if ( !client->GetEventHandler()->ProcessEvent( event ) )
{
client->SetFocus();
return FALSE;
}
+}
//-----------------------------------------------------------------------------
// InsertChild callback for wxNotebook
m_parent->DoAddChild( this );
- if (m_windowStyle & wxNB_RIGHT)
+ if (m_windowStyle & wxBK_RIGHT)
gtk_notebook_set_tab_pos( GTK_NOTEBOOK(m_widget), GTK_POS_RIGHT );
- if (m_windowStyle & wxNB_LEFT)
+ if (m_windowStyle & wxBK_LEFT)
gtk_notebook_set_tab_pos( GTK_NOTEBOOK(m_widget), GTK_POS_LEFT );
- if (m_windowStyle & wxNB_BOTTOM)
+ if (m_windowStyle & wxBK_BOTTOM)
gtk_notebook_set_tab_pos( GTK_NOTEBOOK(m_widget), GTK_POS_BOTTOM );
gtk_signal_connect( GTK_OBJECT(m_widget), "key_press_event",
wxASSERT( m_imageList != NULL ); /* Just in case */
/* Construct the new pixmap */
- const wxBitmap *bmp = m_imageList->GetBitmap(image);
+ const wxBitmap *bmp = m_imageList->GetBitmapPtr(image);
GdkPixmap *pixmap = bmp->GetPixmap();
GdkBitmap *mask = (GdkBitmap*) NULL;
if ( bmp->GetMask() )
if ( position == GetPageCount() )
m_pagesData.Append( nb_page );
else
- m_pagesData.Insert( m_pagesData.Item( position ), nb_page );
+ m_pagesData.Insert( position, nb_page );
m_pages.Insert(win, position);
gtk_signal_connect( GTK_OBJECT(win->m_widget), "size_allocate",
GTK_SIGNAL_FUNC(gtk_page_size_callback), (gpointer)win );
-#ifndef __VMS
- // On VMS position is unsigned and thus always positive
- if (position < 0)
- gtk_notebook_append_page( notebook, win->m_widget, nb_page->m_box );
- else
-#endif
- gtk_notebook_insert_page( notebook, win->m_widget, nb_page->m_box, position );
+ gtk_notebook_insert_page( notebook, win->m_widget, nb_page->m_box, position );
nb_page->m_page = (GtkNotebookPage*) g_list_last(notebook->children)->data;
{
wxASSERT( m_imageList != NULL );
- const wxBitmap *bmp = m_imageList->GetBitmap(imageId);
+ const wxBitmap *bmp = m_imageList->GetBitmapPtr(imageId);
GdkPixmap *pixmap = bmp->GetPixmap();
GdkBitmap *mask = (GdkBitmap*) NULL;
if ( bmp->GetMask() )
{
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))
{
-#ifndef __VMS
- // On VMS position is unsigned and thus always positive
- if (position < 0)
- SetSelection( GetPageCount()-1 );
- else
-#endif
- SetSelection( position );
+ SetSelection( position );
}
gtk_signal_connect( GTK_OBJECT(m_widget), "switch_page",
const gint y = m_widget->allocation.y;
const size_t count = GetPageCount();
- for ( size_t i = 0; i < count; i++ )
+ size_t i = 0;
+
+ // MR: Code to fix HitTest index return when tabs are scrolled.
+ // No idea if it would work for GTK1
+#if 0
+ GtkNotebook * notebook = GTK_NOTEBOOK(m_widget);
+ if (gtk_notebook_get_scrollable(notebook));
+ i = g_list_position( notebook->children, notebook->first_tab );
+#endif
+
+ for ( ; i < count; i++ )
{
wxGtkNotebookPage* nb_page = GetNotebookPage(i);
GtkWidget *box = nb_page->m_box;
// VZ: don't know how to find the border width in GTK+ 1.2
-#ifdef __WXGTK20__
- const gint border = gtk_container_get_border_width(GTK_CONTAINER(box));
-#else // !GTK+ 2.x
const gint border = 0;
-#endif
if ( IsPointInsideWidget(pt, box, x, y, border) )
{
// ok, we're inside this tab -- now find out where, if needed