]> git.saurik.com Git - wxWidgets.git/commitdiff
tabbing in controls sample works again.
authorRobert Roebling <robert@roebling.de>
Sun, 23 Jan 2000 15:51:36 +0000 (15:51 +0000)
committerRobert Roebling <robert@roebling.de>
Sun, 23 Jan 2000 15:51:36 +0000 (15:51 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@5609 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/gtk/notebook.h
include/wx/gtk1/notebook.h
samples/controls/controls.cpp
src/generic/listctrl.cpp
src/generic/panelg.cpp
src/gtk/notebook.cpp
src/gtk/window.cpp
src/gtk1/notebook.cpp
src/gtk1/window.cpp

index 6e8a0a1f406469f917771bacefdc3f314a9f0397..45039a0bd775da6bbed4f00c5aeb8cc0f0ece7d1 100644 (file)
@@ -38,26 +38,24 @@ class wxNotebookPage;
 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
   // ---------
@@ -128,10 +126,9 @@ public:
     // 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
     // --------------
index 6e8a0a1f406469f917771bacefdc3f314a9f0397..45039a0bd775da6bbed4f00c5aeb8cc0f0ece7d1 100644 (file)
@@ -38,26 +38,24 @@ class wxNotebookPage;
 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
   // ---------
@@ -128,10 +126,9 @@ public:
     // 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
     // --------------
index b40bf86a55e25b5a47090b6ce2db487d84c4512b..d542ea70edc0bed1f9866f50968bbbf63a6a4f19 100644 (file)
@@ -384,7 +384,7 @@ MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h )
     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) );
index 77f0ebe6d79a7ba3abc63278d3b89a3801a9b461..098346f76a634e31470b43a81172eb153d78190d 100644 (file)
@@ -1622,8 +1622,9 @@ void wxListMainWindow::OnChar( wxKeyEvent &event )
     {
         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 */
index e586d96323877082490a3317f2da152e6c190e2d..24fcb03ba4660191b2a81bde650d535c959bbaef 100644 (file)
@@ -227,14 +227,9 @@ void wxPanel::OnNavigationKey( wxNavigationKeyEvent& event )
                     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;
                 }
@@ -318,10 +313,7 @@ void wxPanel::SetFocus()
     //     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() )
     {
@@ -331,7 +323,7 @@ void wxPanel::SetFocus()
 
 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
index 08f824bb720a02ba77945046532bc77f6f8564d0..b9b68d5f5938de1b719137fec57603720c52e97d 100644 (file)
@@ -153,6 +153,44 @@ 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 )
+{
+    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
 //-----------------------------------------------------------------------------
@@ -237,6 +275,9 @@ bool wxNotebook::Create(wxWindow *parent, wxWindowID id,
        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() );
@@ -249,19 +290,6 @@ bool wxNotebook::Create(wxWindow *parent, wxWindowID id,
     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") );
index 1a751d4a6c02982e90cc953e64dc1f8b625693f3..c12549013e45d8471db958267e60df16d0aa8cb3 100644 (file)
@@ -778,13 +778,13 @@ static gint gtk_window_key_press_callback( GtkWidget *widget, GdkEventKey *gdk_e
          (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) */
index 08f824bb720a02ba77945046532bc77f6f8564d0..b9b68d5f5938de1b719137fec57603720c52e97d 100644 (file)
@@ -153,6 +153,44 @@ 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 )
+{
+    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
 //-----------------------------------------------------------------------------
@@ -237,6 +275,9 @@ bool wxNotebook::Create(wxWindow *parent, wxWindowID id,
        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() );
@@ -249,19 +290,6 @@ bool wxNotebook::Create(wxWindow *parent, wxWindowID id,
     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") );
index 1a751d4a6c02982e90cc953e64dc1f8b625693f3..c12549013e45d8471db958267e60df16d0aa8cb3 100644 (file)
@@ -778,13 +778,13 @@ static gint gtk_window_key_press_callback( GtkWidget *widget, GdkEventKey *gdk_e
          (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) */