]> git.saurik.com Git - wxWidgets.git/commitdiff
added wxWindow::NavigateIn(); provide wxGTK implementation of DoNavigateIn() working...
authorVadim Zeitlin <vadim@wxwidgets.org>
Mon, 26 Mar 2007 22:10:04 +0000 (22:10 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Mon, 26 Mar 2007 22:10:04 +0000 (22:10 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@45084 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/changes.txt
docs/latex/wx/tsamples.tex
docs/latex/wx/window.tex
include/wx/gtk/window.h
include/wx/window.h
src/common/wincmn.cpp
src/gtk/window.cpp

index 39627c09e589044c6fda35731760c7b9e74b8fdc..e3f0d309f9fcd8c9540e4474add85fadb0f08def 100644 (file)
@@ -15,6 +15,10 @@ Changes in behaviour not resulting in compilation errors, please read this!
   necessarily the window itself) is disabled, new function IsThisEnabled()
   with the same behaviour as old IsEnabled() was added.
 
   necessarily the window itself) is disabled, new function IsThisEnabled()
   with the same behaviour as old IsEnabled() was added.
 
+- Generating wxNavigationKeyEvent events doesn't work any more under wxGTK (and
+  other platforms in the future), use wxWindow::Navigate() or NavigateIn()
+  instead.
+
 Changes in behaviour which may result in compilation errors
 -----------------------------------------------------------
 
 Changes in behaviour which may result in compilation errors
 -----------------------------------------------------------
 
@@ -85,11 +89,13 @@ All (GUI):
 - Added wxJoystick::GetButtonState/Position() (Frank C Szczerba)
 - Added wxGridUpdateLocker helper class (Evgeniy Tarassov)
 - Support wxGRID_AUTOSIZE in wxGrid::SetRow/ColLabelSize() (Evgeniy Tarassov)
 - Added wxJoystick::GetButtonState/Position() (Frank C Szczerba)
 - Added wxGridUpdateLocker helper class (Evgeniy Tarassov)
 - Support wxGRID_AUTOSIZE in wxGrid::SetRow/ColLabelSize() (Evgeniy Tarassov)
+- Added wxWindow::NavigateIn() in addition to existing Navigate()
 - Add support for <data> tags to wxrc
 
 wxGTK:
 
 - Native implementation for wxHyperlinkCtrl (Francesco Montorsi)
 - Add support for <data> tags to wxrc
 
 wxGTK:
 
 - Native implementation for wxHyperlinkCtrl (Francesco Montorsi)
+- Native keyboard navigation implementation
 - Implemented support for underlined fonts in wxStaticText.
 - wxTopLevelWindow::SetSizeHints size increments now work.
 - wxTopLevelWindow::GetSize() returns the size including the WM decorations.
 - Implemented support for underlined fonts in wxStaticText.
 - wxTopLevelWindow::SetSizeHints size increments now work.
 - wxTopLevelWindow::GetSize() returns the size including the WM decorations.
index a1977b55cf7ac354bbe7c1efc583140e248d9d45..d85d0c16fd3691f6a5b06deb8773f1983efbfd96 100644 (file)
@@ -488,8 +488,10 @@ This sample allows to test keyboard navigation (mostly done using the
 \texttt{\textsc{TAB}} key, hence the sample name) between different controls.
 It shows the use of 
 \helpref{wxWindow::MoveBeforeInTabOrder()}{wxwindowmovebeforeintaborder} and 
 \texttt{\textsc{TAB}} key, hence the sample name) between different controls.
 It shows the use of 
 \helpref{wxWindow::MoveBeforeInTabOrder()}{wxwindowmovebeforeintaborder} and 
-\helpref{MoveAfterInTabOrder()}{wxwindowmoveafterintaborder} methods and of the
-wxNavigationKeyEvent.
+\helpref{MoveAfterInTabOrder()}{wxwindowmoveafterintaborder} methods to change
+the default order of the windows in the navigation chain and of 
+\helpref{wxWindow::Navigate()}{wxwindownavigate} for moving focus along this
+chain.
 
 
 \subsection{Text sample}\label{sampletext}
 
 
 \subsection{Text sample}\label{sampletext}
index 874de4a13a6eca671da115ed6783b597884e1747..63f676e5944f71599ad7be1ab75299480b70df72 100644 (file)
@@ -1771,13 +1771,19 @@ it.
 
 \func{bool}{Navigate}{\param{int}{ flags = wxNavigationKeyEvent::IsForward}}
 
 
 \func{bool}{Navigate}{\param{int}{ flags = wxNavigationKeyEvent::IsForward}}
 
-Does keyboard navigation from this window to another, by sending
-a wxNavigationKeyEvent.
+Performs a keyboard navigation action starting from this window. This method is
+equivalent to calling \helpref{NavigateIn()}{wxwindownavigatein} method on the
+parent window.
 
 \wxheading{Parameters}
 
 \docparam{flags}{A combination of wxNavigationKeyEvent::IsForward and wxNavigationKeyEvent::WinChange.}
 
 
 \wxheading{Parameters}
 
 \docparam{flags}{A combination of wxNavigationKeyEvent::IsForward and wxNavigationKeyEvent::WinChange.}
 
+\wxheading{Return value}
+
+Returns \true if the focus was moved to another window or \false if nothing
+changed.
+
 \wxheading{Remarks}
 
 You may wish to call this from a text control custom keypress handler to do the default
 \wxheading{Remarks}
 
 You may wish to call this from a text control custom keypress handler to do the default
@@ -1786,6 +1792,15 @@ a multiline text control with the wxTE\_PROCESS\_TAB style is to insert a tab
 and not navigate to the next control.
 
 
 and not navigate to the next control.
 
 
+\membersection{wxWindow::NavigateIn}\label{wxwindownavigatein}
+
+\func{bool}{NavigateIn}{\param{int}{ flags = wxNavigationKeyEvent::IsForward}}
+
+Performs a keyboard navigation action inside this window.
+
+See \helpref{Navigate}{wxwindownavigate} for more information.
+
+
 \membersection{wxWindow::NextControlId}\label{wxwindownextcontrolid}
 
 \func{static int}{NextControlId}{\param{int }{winid}}
 \membersection{wxWindow::NextControlId}\label{wxwindownextcontrolid}
 
 \func{static int}{NextControlId}{\param{int }{winid}}
index e8d0e60fe3cae7a0edf52bf6b7f7be0336baa747..82b9f99d8cc8f1b6728c8cb89a46a5eb5b4552cf 100644 (file)
@@ -344,6 +344,8 @@ protected:
     void Init();
 
     virtual void DoMoveInTabOrder(wxWindow *win, MoveKind move);
     void Init();
 
     virtual void DoMoveInTabOrder(wxWindow *win, MoveKind move);
+    virtual bool DoNavigateIn(int flags);
+
 
     // Copies m_children tab order to GTK focus chain:
     void RealizeTabOrder();
 
     // Copies m_children tab order to GTK focus chain:
     void RealizeTabOrder();
index c48e7b8579aef478255188f8be49c97d7488985f..0a704011a7d4ec119c9df70b26e8dbda52b115a4 100644 (file)
     #define wxHAS_NATIVE_ENABLED_MANAGEMENT
 #endif
 
     #define wxHAS_NATIVE_ENABLED_MANAGEMENT
 #endif
 
+// This is defined when the underlying toolkit handles tab traversal natively
+// (currently this only works under GTK+ 2)
+#ifdef __WXGTK20__
+    #define wxHAS_NATIVE_TAB_TRAVERSAL
+#endif
+
 // ----------------------------------------------------------------------------
 // forward declarations
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
 // forward declarations
 // ----------------------------------------------------------------------------
@@ -592,8 +598,14 @@ public:
     bool CanAcceptFocusFromKeyboard() const
         { return AcceptsFocusFromKeyboard() && CanAcceptFocus(); }
 
     bool CanAcceptFocusFromKeyboard() const
         { return AcceptsFocusFromKeyboard() && CanAcceptFocus(); }
 
-        // navigates in the specified direction by sending a wxNavigationKeyEvent
-    virtual bool Navigate(int flags = wxNavigationKeyEvent::IsForward);
+        // navigates inside this window
+    bool NavigateIn(int flags = wxNavigationKeyEvent::IsForward)
+        { return DoNavigateIn(flags); }
+
+        // navigates in the specified direction from this window, this is
+        // equivalent to GetParent()->NavigateIn()
+    bool Navigate(int flags = wxNavigationKeyEvent::IsForward)
+        { return m_parent && ((wxWindowBase *)m_parent)->DoNavigateIn(flags); }
 
         // move this window just before/after the specified one in tab order
         // (the other window must be our sibling!)
 
         // move this window just before/after the specified one in tab order
         // (the other window must be our sibling!)
@@ -1200,6 +1212,10 @@ protected:
     };
     virtual void DoMoveInTabOrder(wxWindow *win, MoveKind move);
 
     };
     virtual void DoMoveInTabOrder(wxWindow *win, MoveKind move);
 
+    // implementation of Navigate() and NavigateIn()
+    virtual bool DoNavigateIn(int flags);
+
+
 #if wxUSE_CONSTRAINTS
     // satisfy the constraints for the windows but don't set the window sizes
     void SatisfyConstraints();
 #if wxUSE_CONSTRAINTS
     // satisfy the constraints for the windows but don't set the window sizes
     void SatisfyConstraints();
index 51b6e771c3bd7365d7edf36c8e0d721c01a7d10e..49417dbaf7eb3fc0224210ac25118cda887181c9 100644 (file)
@@ -2651,17 +2651,18 @@ bool wxWindowBase::TryParent(wxEvent& event)
 // keyboard navigation
 // ----------------------------------------------------------------------------
 
 // keyboard navigation
 // ----------------------------------------------------------------------------
 
-// Navigates in the specified direction.
-bool wxWindowBase::Navigate(int flags)
+// Navigates in the specified direction inside this window
+bool wxWindowBase::DoNavigateIn(int flags)
 {
 {
+#ifdef wxHAS_NATIVE_TAB_TRAVERSAL
+    // native code doesn't process our wxNavigationKeyEvents anyhow
+    return false;
+#else // !wxHAS_NATIVE_TAB_TRAVERSAL
     wxNavigationKeyEvent eventNav;
     eventNav.SetFlags(flags);
     wxNavigationKeyEvent eventNav;
     eventNav.SetFlags(flags);
-    eventNav.SetEventObject(this);
-    if ( GetParent()->GetEventHandler()->ProcessEvent(eventNav) )
-    {
-        return true;
-    }
-    return false;
+    eventNav.SetEventObject(FindFocus());
+    return GetEventHandler()->ProcessEvent(eventNav);
+#endif // wxHAS_NATIVE_TAB_TRAVERSAL/!wxHAS_NATIVE_TAB_TRAVERSAL
 }
 
 void wxWindowBase::DoMoveInTabOrder(wxWindow *win, MoveKind move)
 }
 
 void wxWindowBase::DoMoveInTabOrder(wxWindow *win, MoveKind move)
index 291b13c614a85d31b66bbcae887501068072b80d..7a5501119cf4a5c55b13b46f9485fc3ea39b4c58 100644 (file)
@@ -3358,6 +3358,30 @@ void wxWindowGTK::DoMoveInTabOrder(wxWindow *win, MoveKind move)
         wxapp_install_idle_handler();
 }
 
         wxapp_install_idle_handler();
 }
 
+bool wxWindowGTK::DoNavigateIn(int flags)
+{
+    if ( flags & wxNavigationKeyEvent::WinChange )
+    {
+        wxFAIL_MSG( _T("not implemented") );
+
+        return false;
+    }
+    else // navigate inside the container
+    {
+        wxWindow *parent = wxGetTopLevelParent(this);
+        wxCHECK_MSG( parent, false, _T("every window must have a TLW parent") );
+
+        GtkDirectionType dir;
+        dir = flags & wxNavigationKeyEvent::IsForward ? GTK_DIR_TAB_FORWARD
+                                                      : GTK_DIR_TAB_BACKWARD;
+
+        gboolean rc;
+        g_signal_emit_by_name(parent->m_widget, "focus", dir, &rc);
+
+        return rc == TRUE;
+    }
+}
+
 bool wxWindowGTK::GTKWidgetNeedsMnemonic() const
 {
     // none needed by default
 bool wxWindowGTK::GTKWidgetNeedsMnemonic() const
 {
     // none needed by default