summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZolnai Tamás <tamas.zolnai@collabora.com>2014-01-29 21:07:42 +0100
committerJan Holesovsky <kendy@collabora.com>2014-01-31 12:06:46 +0000
commit5b1e68bd852cac4534c5ce2e548187dce1d4561a (patch)
tree2f03db39ff8ed9807d27d8330708ff3271e0d1aa
parent82300f367dda20e3e83477dae9dd37124ac9831b (diff)
fdo#71763: F6 key moves focus on this trip: Menu -> Sidebar -> Thumbnail view
Sidebar and thumbnail View are actually not separate windows but F6 key traversal should simulate it as they would be. Define a new getfocus flag called GETFOCUS_F6 which means focus were grabed as a result of pressing F6 key. Use this and other two (GETFOCUS_FORWARD, GETFOCUS_BACKWARD) flags to indicate the focus were grabbed along subwindow relation (define a new ImplGrabFocusToDocument method with a flag parameter on the analogy of GrabFocus() <-> ImplGrabFocus()). Handle F6, Shift+F6 inside BackingWindow as it would have two subwindow (sidebar and thumbnail view). Plus Ctrl+F6 -> grab focus to the thumbnail view. Change-Id: Ie43d761e7cb0269afb79481a81947a4b96e1dde0 Reviewed-on: https://gerrit.libreoffice.org/7486 Reviewed-by: Jan Holesovsky <kendy@collabora.com> Tested-by: Jan Holesovsky <kendy@collabora.com>
-rw-r--r--include/vcl/window.hxx3
-rw-r--r--sfx2/source/control/thumbnailview.cxx1
-rw-r--r--sfx2/source/dialog/backingwindow.cxx55
-rw-r--r--sfx2/source/dialog/backingwindow.hxx2
-rw-r--r--vcl/source/window/taskpanelist.cxx12
-rw-r--r--vcl/source/window/window.cxx25
6 files changed, 80 insertions, 18 deletions
diff --git a/include/vcl/window.hxx b/include/vcl/window.hxx
index 32dccde009cc..0a3cf4588493 100644
--- a/include/vcl/window.hxx
+++ b/include/vcl/window.hxx
@@ -253,6 +253,7 @@ typedef sal_uInt16 StateChangedType;
#define GETFOCUS_TAB ((sal_uInt16)0x0001)
#define GETFOCUS_CURSOR ((sal_uInt16)0x0002)
#define GETFOCUS_MNEMONIC ((sal_uInt16)0x0004)
+#define GETFOCUS_F6 ((sal_uInt16)0x0008)
#define GETFOCUS_FORWARD ((sal_uInt16)0x0010)
#define GETFOCUS_BACKWARD ((sal_uInt16)0x0020)
#define GETFOCUS_AROUND ((sal_uInt16)0x0040)
@@ -260,6 +261,7 @@ typedef sal_uInt16 StateChangedType;
#define GETFOCUS_INIT ((sal_uInt16)0x0200)
#define GETFOCUS_FLOATWIN_POPUPMODEEND_CANCEL ((sal_uInt16)0x0400)
+
// Draw-Flags fuer Draw()
#define WINDOW_DRAW_MONO ((sal_uLong)0x00000001)
#define WINDOW_DRAW_NOBORDER ((sal_uLong)0x00000002)
@@ -481,6 +483,7 @@ public:
SAL_DLLPRIVATE void ImplCallMouseMove( sal_uInt16 nMouseCode, sal_Bool bModChanged = sal_False );
SAL_DLLPRIVATE void ImplGenerateMouseMove();
SAL_DLLPRIVATE void ImplGrabFocus( sal_uInt16 nFlags );
+ SAL_DLLPRIVATE void ImplGrabFocusToDocument( sal_uInt16 nFlags );
SAL_DLLPRIVATE void ImplInvertFocus( const Rectangle& rRect );
SAL_DLLPRIVATE void ImplControlFocus( sal_uInt16 nFlags = 0 );
SAL_DLLPRIVATE Window* ImplGetDlgWindow( sal_uInt16 n, sal_uInt16 nType, sal_uInt16 nStart = 0, sal_uInt16 nEnd = 0xFFFF, sal_uInt16* pIndex = NULL );
diff --git a/sfx2/source/control/thumbnailview.cxx b/sfx2/source/control/thumbnailview.cxx
index eda19f04710b..d55e4a153651 100644
--- a/sfx2/source/control/thumbnailview.cxx
+++ b/sfx2/source/control/thumbnailview.cxx
@@ -891,7 +891,6 @@ void ThumbnailView::Paint( const Rectangle &aRect)
void ThumbnailView::GetFocus()
{
- if(GETFOCUS_TAB & GetGetFocusFlags())
{
// Select the first item if nothing selected
int nSelected = -1;
diff --git a/sfx2/source/dialog/backingwindow.cxx b/sfx2/source/dialog/backingwindow.cxx
index daa3d10964fa..70605d8db738 100644
--- a/sfx2/source/dialog/backingwindow.cxx
+++ b/sfx2/source/dialog/backingwindow.cxx
@@ -308,6 +308,41 @@ void BackingWindow::Paint( const Rectangle& )
aDev );
}
+bool BackingWindow::PreNotify( NotifyEvent& rNEvt )
+{
+ if( rNEvt.GetType() == EVENT_KEYINPUT )
+ {
+ const KeyEvent* pEvt = rNEvt.GetKeyEvent();
+ const KeyCode& rKeyCode(pEvt->GetKeyCode());
+ // Subwindows of BackingWindow: Sidebar and Thumbnail view
+ if( rKeyCode.GetCode() == KEY_F6 )
+ {
+ if( rKeyCode.IsShift() ) // Shift + F6
+ {
+ if( mpAllRecentThumbnails->HasFocus() )
+ {
+ mpOpenButton->GrabFocus();
+ return true;
+ }
+ }
+ else if ( rKeyCode.IsMod1() ) // Ctrl + F6
+ {
+ mpAllRecentThumbnails->GrabFocus();
+ return true;
+ }
+ else // F6
+ {
+ if( mpAllButtonsBox->HasChildPathFocus() )
+ {
+ mpAllRecentThumbnails->GrabFocus();
+ return true;
+ }
+ }
+ }
+ }
+ return Window::PreNotify( rNEvt );
+}
+
bool BackingWindow::Notify( NotifyEvent& rNEvt )
{
if( rNEvt.GetType() == EVENT_KEYINPUT )
@@ -318,7 +353,6 @@ bool BackingWindow::Notify( NotifyEvent& rNEvt )
mpAccExec = svt::AcceleratorExecute::createAcceleratorHelper();
mpAccExec->init( comphelper::getProcessComponentContext(), mxFrame);
}
-
const KeyEvent* pEvt = rNEvt.GetKeyEvent();
const KeyCode& rKeyCode(pEvt->GetKeyCode());
if( pEvt && mpAccExec->execute(rKeyCode) )
@@ -328,6 +362,25 @@ bool BackingWindow::Notify( NotifyEvent& rNEvt )
return Window::Notify( rNEvt );
}
+void BackingWindow::GetFocus()
+{
+ sal_uInt16 nFlags = GetParent()->GetGetFocusFlags();
+ if( nFlags & GETFOCUS_F6 )
+ {
+ if( nFlags & GETFOCUS_FORWARD ) // F6
+ {
+ mpOpenButton->GrabFocus();
+ return;
+ }
+ else // Shift + F6 or Ctrl + F6
+ {
+ mpAllRecentThumbnails->GrabFocus();
+ return;
+ }
+ }
+ Window::GetFocus();
+}
+
void BackingWindow::setOwningFrame( const com::sun::star::uno::Reference< com::sun::star::frame::XFrame >& xFrame )
{
mxFrame = xFrame;
diff --git a/sfx2/source/dialog/backingwindow.hxx b/sfx2/source/dialog/backingwindow.hxx
index 526a91b5e644..dfa67b0b7016 100644
--- a/sfx2/source/dialog/backingwindow.hxx
+++ b/sfx2/source/dialog/backingwindow.hxx
@@ -107,7 +107,9 @@ public:
virtual void Paint( const Rectangle& rRect );
virtual void Resize();
+ virtual bool PreNotify( NotifyEvent& rNEvt );
virtual bool Notify( NotifyEvent& rNEvt );
+ virtual void GetFocus();
virtual Size GetOptimalSize() const;
diff --git a/vcl/source/window/taskpanelist.cxx b/vcl/source/window/taskpanelist.cxx
index 5a5eb0efb4ff..459f557272d0 100644
--- a/vcl/source/window/taskpanelist.cxx
+++ b/vcl/source/window/taskpanelist.cxx
@@ -77,13 +77,13 @@ struct LTRSortBackward : public ::std::binary_function< const Window*, const Win
// --------------------------------------------------
-static void ImplTaskPaneListGrabFocus( Window *pWindow )
+static void ImplTaskPaneListGrabFocus( Window *pWindow, bool bForward )
{
// put focus in child of floating windows which is typically a toolbar
// that can deal with the focus
if( pWindow->ImplIsFloatingWindow() && pWindow->GetWindow( WINDOW_FIRSTCHILD ) )
pWindow = pWindow->GetWindow( WINDOW_FIRSTCHILD );
- pWindow->GrabFocus();
+ pWindow->ImplGrabFocus( GETFOCUS_F6 | (bForward ? GETFOCUS_FORWARD : GETFOCUS_BACKWARD));
}
// --------------------------------------------------
@@ -195,7 +195,7 @@ sal_Bool TaskPaneList::HandleKeyEvent( KeyEvent aKeyEvent )
// Ctrl-F6 goes directly to the document
if( !pWin->IsDialog() && aKeyCode.IsMod1() && !aKeyCode.IsShift() )
{
- pWin->GrabFocusToDocument();
+ pWin->ImplGrabFocusToDocument( GETFOCUS_F6 );
return sal_True;
}
@@ -210,7 +210,7 @@ sal_Bool TaskPaneList::HandleKeyEvent( KeyEvent aKeyEvent )
if( pNextWin != pWin )
{
ImplGetSVData()->maWinData.mbNoSaveFocus = sal_True;
- ImplTaskPaneListGrabFocus( pNextWin );
+ ImplTaskPaneListGrabFocus( pNextWin, bForward );
ImplGetSVData()->maWinData.mbNoSaveFocus = sal_False;
}
else
@@ -221,7 +221,7 @@ sal_Bool TaskPaneList::HandleKeyEvent( KeyEvent aKeyEvent )
// we did not find another taskpane, so
// put focus back into document
- pWin->GrabFocusToDocument();
+ pWin->ImplGrabFocusToDocument( GETFOCUS_F6 | (bForward ? GETFOCUS_FORWARD : GETFOCUS_BACKWARD));
}
return sal_True;
@@ -240,7 +240,7 @@ sal_Bool TaskPaneList::HandleKeyEvent( KeyEvent aKeyEvent )
pWin = FindNextFloat( NULL, bForward );
if( pWin )
{
- ImplTaskPaneListGrabFocus( pWin );
+ ImplTaskPaneListGrabFocus( pWin, bForward );
return sal_True;
}
}
diff --git a/vcl/source/window/window.cxx b/vcl/source/window/window.cxx
index 64e535ad6ff9..a79fecf9911e 100644
--- a/vcl/source/window/window.cxx
+++ b/vcl/source/window/window.cxx
@@ -4167,6 +4167,20 @@ void Window::ImplGrabFocus( sal_uInt16 nFlags )
}
}
+void Window::ImplGrabFocusToDocument( sal_uInt16 nFlags )
+{
+ Window *pWin = this;
+ while( pWin )
+ {
+ if( !pWin->GetParent() )
+ {
+ pWin->ImplGetFrameWindow()->GetWindow( WINDOW_CLIENT )->ImplGrabFocus(nFlags);
+ return;
+ }
+ pWin = pWin->GetParent();
+ }
+}
+
// -----------------------------------------------------------------------
void Window::ImplNewInputContext()
@@ -7506,16 +7520,7 @@ sal_Bool Window::HasFocus() const
void Window::GrabFocusToDocument()
{
- Window *pWin = this;
- while( pWin )
- {
- if( !pWin->GetParent() )
- {
- pWin->ImplGetFrameWindow()->GetWindow( WINDOW_CLIENT )->GrabFocus();
- return;
- }
- pWin = pWin->GetParent();
- }
+ ImplGrabFocusToDocument(0);
}
void Window::SetFakeFocus( bool bFocus )