class wxNotebook : public wxControl
{
public:
- // ctors
- // -----
- // default for dynamic class
- wxNotebook();
- // the same arguments as for wxControl (@@@ any special styles?)
- wxNotebook(wxWindow *parent,
+ // default for dynamic class
+ wxNotebook();
+ // the same arguments as for wxControl
+ wxNotebook(wxWindow *parent,
wxWindowID id,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style = 0,
const wxString& name = "notebook");
- // Create() function
- bool Create(wxWindow *parent,
+ // Create() function
+ bool Create(wxWindow *parent,
wxWindowID id,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style = 0,
const wxString& name = "notebook");
- // dtor
- ~wxNotebook();
+ // dtor
+ ~wxNotebook();
// accessors
// ---------
// get the panel which represents the given page
wxWindow *GetPage(int nPage) const;
- void OnNavigationKey(wxNavigationKeyEvent& event);
-
- // overridden from wxWindow to make tabbing work
- void SetFocus();
+ // handler for tab navigation
+ // --------------------------
+ void OnNavigationKey(wxNavigationKeyEvent& event);
// implementation
// --------------
class wxNotebook : public wxControl
{
public:
- // ctors
- // -----
- // default for dynamic class
- wxNotebook();
- // the same arguments as for wxControl (@@@ any special styles?)
- wxNotebook(wxWindow *parent,
+ // default for dynamic class
+ wxNotebook();
+ // the same arguments as for wxControl
+ wxNotebook(wxWindow *parent,
wxWindowID id,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style = 0,
const wxString& name = "notebook");
- // Create() function
- bool Create(wxWindow *parent,
+ // Create() function
+ bool Create(wxWindow *parent,
wxWindowID id,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style = 0,
const wxString& name = "notebook");
- // dtor
- ~wxNotebook();
+ // dtor
+ ~wxNotebook();
// accessors
// ---------
// get the panel which represents the given page
wxWindow *GetPage(int nPage) const;
- void OnNavigationKey(wxNavigationKeyEvent& event);
-
- // overridden from wxWindow to make tabbing work
- void SetFocus();
+ // handler for tab navigation
+ // --------------------------
+ void OnNavigationKey(wxNavigationKeyEvent& event);
// implementation
// --------------
m_text = new wxTextCtrl( this, -1, "This is the log window.\n", wxPoint(0,50), wxSize(100,50), wxTE_MULTILINE );
// m_text->SetBackgroundColour("wheat");
- //wxLog::AddTraceMask(_T("focus"));
+ wxLog::AddTraceMask(_T("focus"));
m_logTargetOld = wxLog::SetActiveTarget(new wxLogTextCtrl(m_text));
m_notebook = new wxNotebook( this, ID_NOTEBOOK, wxPoint(0,0), wxSize(200,150) );
{
wxNavigationKeyEvent nevent;
nevent.SetDirection( !event.ShiftDown() );
+ nevent.SetEventObject( GetParent()->GetParent() );
nevent.SetCurrentFocus( m_parent );
- if (m_parent->GetEventHandler()->ProcessEvent( nevent )) return;
+ if (GetParent()->GetParent()->GetEventHandler()->ProcessEvent( nevent )) return;
}
/* no item -> nothing to do */
if ( focussed_child_of_parent->IsTopLevel() )
break;
- // is the parent a panel?
- wxPanel *panel = wxDynamicCast(parent, wxPanel);
- if (panel)
- {
- event.SetCurrentFocus( focussed_child_of_parent );
- if (parent->GetEventHandler()->ProcessEvent( event ))
- return;
- }
+ event.SetCurrentFocus( focussed_child_of_parent );
+ if (parent->GetEventHandler()->ProcessEvent( event ))
+ return;
focussed_child_of_parent = parent;
}
// think my addition to OnNavigationKey() above takes care of it.
// Keeping #ifdef __WXGTK__ for now, but please try removing it and see
// what happens.
-
-#ifdef __WXGTK__
- m_winLastFocused = (wxWindow *)NULL;
-#endif // 0
+ // RR: Removed for now.
if ( !SetFocusToChild() )
{
void wxPanel::OnFocus(wxFocusEvent& event)
{
- wxLogTrace(_T("focus"), _T("OnFocus on wxPanel 0x%08x."), GetHandle());
+ wxLogTrace(_T("focus"), _T("OnFocus on wxPanel 0x%08x, name: %s"), GetHandle(), GetName().c_str() );
// If the panel gets the focus *by way of getting clicked on*
// we move the focus to either the last window that had the
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
//-----------------------------------------------------------------------------
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() );
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") );
(win->GetParent()->HasFlag( wxTAB_TRAVERSAL)) )
{
wxNavigationKeyEvent new_event;
- new_event.SetEventObject( win );
+ new_event.SetEventObject( win->GetParent() );
/* GDK reports GDK_ISO_Left_Tab for SHIFT-TAB */
new_event.SetDirection( (gdk_event->keyval == GDK_Tab) );
/* CTRL-TAB changes the (parent) window, i.e. switch notebook page */
new_event.SetWindowChange( (gdk_event->state & GDK_CONTROL_MASK) );
new_event.SetCurrentFocus( win );
- ret = win->GetEventHandler()->ProcessEvent( new_event );
+ ret = win->GetParent()->GetEventHandler()->ProcessEvent( new_event );
}
/* generate wxID_CANCEL if <esc> has been pressed (typically in dialogs) */
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
//-----------------------------------------------------------------------------
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() );
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") );
(win->GetParent()->HasFlag( wxTAB_TRAVERSAL)) )
{
wxNavigationKeyEvent new_event;
- new_event.SetEventObject( win );
+ new_event.SetEventObject( win->GetParent() );
/* GDK reports GDK_ISO_Left_Tab for SHIFT-TAB */
new_event.SetDirection( (gdk_event->keyval == GDK_Tab) );
/* CTRL-TAB changes the (parent) window, i.e. switch notebook page */
new_event.SetWindowChange( (gdk_event->state & GDK_CONTROL_MASK) );
new_event.SetCurrentFocus( win );
- ret = win->GetEventHandler()->ProcessEvent( new_event );
+ ret = win->GetParent()->GetEventHandler()->ProcessEvent( new_event );
}
/* generate wxID_CANCEL if <esc> has been pressed (typically in dialogs) */