#include "wx/intl.h"
#include "wx/log.h"
-#include "gdk/gdk.h"
-#include "gtk/gtk.h"
+#include <gdk/gdk.h>
+#include <gtk/gtk.h>
#include "wx/gtk/win_gtk.h"
-#include "gdk/gdkkeysyms.h"
+#include <gdk/gdkkeysyms.h>
//-----------------------------------------------------------------------------
// idle system
win->SetSize( alloc->x, alloc->y, alloc->width, alloc->height );
+ /* GTK 1.2 up to version 1.2.5 is broken so that we have to call allocate
+ 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_widget_size_allocate( win->m_wxwindow, alloc );
+ }
}
//-----------------------------------------------------------------------------
// "realize" from m_widget
//-----------------------------------------------------------------------------
-/* GTK 1.2 up to version 1.2.5 is broken so that we have to call a queue_resize
- here in order to take repositioning before showing to take effect. */
-
static gint
gtk_notebook_realized_callback( GtkWidget * WXUNUSED(widget), wxWindow *win )
{
if (g_isIdle)
wxapp_install_idle_handler();
+ /* GTK 1.2 up to version 1.2.5 is broken so that we have to call a queue_resize
+ here in order to make repositioning before showing to take effect. */
gtk_widget_queue_resize( win->m_widget );
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;
+
+ wxNotebookPage *page = (wxNotebookPage*) 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.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
//-----------------------------------------------------------------------------
!CreateBase( parent, id, pos, size, style, wxDefaultValidator, name ))
{
wxFAIL_MSG( wxT("wxNoteBook creation failed") );
- return FALSE;
+ return FALSE;
}
m_parent->DoAddChild( this );
- if(m_windowStyle & wxNB_RIGHT)
+ if (m_windowStyle & wxNB_RIGHT)
gtk_notebook_set_tab_pos( GTK_NOTEBOOK(m_widget), GTK_POS_RIGHT );
- if(m_windowStyle & wxNB_LEFT)
+ if (m_windowStyle & wxNB_LEFT)
gtk_notebook_set_tab_pos( GTK_NOTEBOOK(m_widget), GTK_POS_LEFT );
- if(m_windowStyle & wxNB_BOTTOM)
+ 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 );
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") );
void wxNotebook::ApplyWidgetStyle()
{
+ // TODO, font for labels etc
+
SetWidgetStyle();
gtk_widget_set_style( m_widget, m_widgetStyle );
}