]> 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.
 
+- 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
 -----------------------------------------------------------
 
@@ -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 wxWindow::NavigateIn() in addition to existing Navigate()
 - 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.
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 
-\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}
index 874de4a13a6eca671da115ed6783b597884e1747..63f676e5944f71599ad7be1ab75299480b70df72 100644 (file)
@@ -1771,13 +1771,19 @@ it.
 
 \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{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
@@ -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.
 
 
+\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}}
index e8d0e60fe3cae7a0edf52bf6b7f7be0336baa747..82b9f99d8cc8f1b6728c8cb89a46a5eb5b4552cf 100644 (file)
@@ -344,6 +344,8 @@ protected:
     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();
index c48e7b8579aef478255188f8be49c97d7488985f..0a704011a7d4ec119c9df70b26e8dbda52b115a4 100644 (file)
     #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
 // ----------------------------------------------------------------------------
@@ -592,8 +598,14 @@ public:
     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!)
@@ -1200,6 +1212,10 @@ protected:
     };
     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();
index 51b6e771c3bd7365d7edf36c8e0d721c01a7d10e..49417dbaf7eb3fc0224210ac25118cda887181c9 100644 (file)
@@ -2651,17 +2651,18 @@ bool wxWindowBase::TryParent(wxEvent& event)
 // 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);
-    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)
index 291b13c614a85d31b66bbcae887501068072b80d..7a5501119cf4a5c55b13b46f9485fc3ea39b4c58 100644 (file)
@@ -3358,6 +3358,30 @@ void wxWindowGTK::DoMoveInTabOrder(wxWindow *win, MoveKind move)
         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