diff options
author | Christian Lippka <cl@openoffice.org> | 2010-03-05 10:49:41 +0100 |
---|---|---|
committer | Christian Lippka <cl@openoffice.org> | 2010-03-05 10:49:41 +0100 |
commit | 20966eeae767a734d1f1002163f27ebc090a8f51 (patch) | |
tree | 4705c3c9823d22f768c477b9a2b3a081655d16b0 /svx/source/tbxctrls | |
parent | 3138e431cb23a6ba95d16713ce30a54451566665 (diff) |
enable toolbar menu cursor traveling without focus
Diffstat (limited to 'svx/source/tbxctrls')
-rw-r--r-- | svx/source/tbxctrls/toolbarmenu.cxx | 164 |
1 files changed, 112 insertions, 52 deletions
diff --git a/svx/source/tbxctrls/toolbarmenu.cxx b/svx/source/tbxctrls/toolbarmenu.cxx index f99fdd0c8a37..6d44b9677d5d 100644 --- a/svx/source/tbxctrls/toolbarmenu.cxx +++ b/svx/source/tbxctrls/toolbarmenu.cxx @@ -38,6 +38,9 @@ #include <vcl/menu.hxx> #include <vcl/decoview.hxx> #include <vcl/image.hxx> +#include <vcl/taskpanelist.hxx> + +#include <svtools/valueset.hxx> #include "svx/toolbarmenu.hxx" @@ -47,6 +50,29 @@ const int TITLE_ID = -1; const int BORDER_X = 0; const int BORDER_Y = 0; +static Window* GetTopMostParentSystemWindow( Window* pWindow ) +{ + OSL_ASSERT( pWindow ); + if ( pWindow ) + { + // ->manually search topmost system window + // required because their might be another system window between this and the top window + pWindow = pWindow->GetParent(); + SystemWindow* pTopMostSysWin = NULL; + while ( pWindow ) + { + if ( pWindow->IsSystemWindow() ) + pTopMostSysWin = (SystemWindow*)pWindow; + pWindow = pWindow->GetParent(); + } + pWindow = pTopMostSysWin; + OSL_ASSERT( pWindow ); + return pWindow; + } + + return NULL; +} + class ToolbarMenuEntry { public: @@ -170,6 +196,10 @@ void ToolbarMenu::implInit() // EnableChildTransparentMode(); + Window* pWindow = GetTopMostParentSystemWindow( this ); + if ( pWindow ) + ((SystemWindow *)pWindow)->GetTaskPaneList()->AddWindow( this ); + mxServiceManager = ::comphelper::getProcessServiceFactory(); mnCheckPos = 0; @@ -183,6 +213,10 @@ void ToolbarMenu::implInit() ToolbarMenu::~ToolbarMenu() { + Window* pWindow = GetTopMostParentSystemWindow( this ); + if ( pWindow ) + ((SystemWindow *)pWindow)->GetTaskPaneList()->RemoveWindow( this ); + if ( mxStatusListener.is() ) { mxStatusListener->dispose(); @@ -448,17 +482,18 @@ Size ToolbarMenu::implCalcSize() void ToolbarMenu::GetFocus() { -/* + OSL_TRACE("ToolbarMenu::GetFocus()"); + if( mnHighlightedEntry == -1 ) { implChangeHighlightEntry( 0 ); } -*/ DockingWindow::GetFocus(); } void ToolbarMenu::LoseFocus() { + OSL_TRACE("ToolbarMenu::LoseFocus()"); if( mnHighlightedEntry != -1 ) { implChangeHighlightEntry( -1 ); @@ -533,6 +568,16 @@ ToolbarMenuEntry* ToolbarMenu::implSearchEntry( int nEntryId ) const return NULL; } +static void implDeselectControl( Control* pControl ) +{ + ValueSet* pValueSet = dynamic_cast< ValueSet* >( pControl ); + if( pValueSet ) + { + pValueSet->SetNoSelection(); + pValueSet->Invalidate(); + } +} + void ToolbarMenu::implHighlightEntry( int nHighlightEntry, bool bHighlight ) { Size aSz = GetOutputSizePixel(); @@ -564,6 +609,10 @@ void ToolbarMenu::implHighlightEntry( int nHighlightEntry, bool bHighlight ) DrawSelectionBackground( aRect, true, false, TRUE, TRUE ); } } + else if( p->mpControl != NULL ) + { + implDeselectControl( p->mpControl ); + } implPaint( p, bHighlight ); @@ -682,6 +731,32 @@ void ToolbarMenu::implChangeHighlightEntry( int nEntry ) } } +static bool implCheckSubControlCursorMove( Control* pControl, bool bUp ) +{ + ValueSet* pValueSet = dynamic_cast< ValueSet* >( pControl ); + if( pValueSet ) + { + USHORT nItemPos = pValueSet->GetItemPos( pValueSet->GetSelectItemId() ); + if( nItemPos != VALUESET_ITEM_NOTFOUND ) + { + const USHORT nColCount = pValueSet->GetColCount(); + const USHORT nLine = nItemPos / nColCount; + + if( bUp ) + { + return nLine > 0; + } + else + { + const USHORT nLineCount = (pValueSet->GetItemCount() + nColCount - 1) / nColCount; + return (nLine+1) < nLineCount; + } + } + } + + return false; +} + ToolbarMenuEntry* ToolbarMenu::implCursorUpDown( bool bUp, bool bHomeEnd ) { int n = mnHighlightedEntry; @@ -692,6 +767,18 @@ ToolbarMenuEntry* ToolbarMenu::implCursorUpDown( bool bUp, bool bHomeEnd ) else n = maEntryVector.size()-1; } + else if( !bHomeEnd ) + { + // if we have a currently selected entry and + // cursor keys are used than check if this entry + // has a control that can use those cursor keys + ToolbarMenuEntry* pData = maEntryVector[n]; + if( pData && pData->mpControl && !pData->mbHasText ) + { + if( implCheckSubControlCursorMove( pData->mpControl, bUp ) ) + return pData; + } + } int nLoop = n; @@ -746,6 +833,8 @@ ToolbarMenuEntry* ToolbarMenu::implCursorUpDown( bool bUp, bool bHomeEnd ) void ToolbarMenu::KeyInput( const KeyEvent& rKEvent ) { + OSL_TRACE("ToolbarMenu::KeyInput()"); + Control* pForwardControl = 0; USHORT nCode = rKEvent.GetKeyCode().GetCode(); switch ( nCode ) { @@ -756,12 +845,19 @@ void ToolbarMenu::KeyInput( const KeyEvent& rKEvent ) ToolbarMenuEntry*p = implCursorUpDown( nCode == KEY_UP, false ); if( p && p->mpControl && !p->mbHasText ) { - p->mpControl->GrabFocus(); + OSL_TRACE("ToolbarMenu::KeyInput() - grab focus to control"); +// p->mpControl->GrabFocus(); if( nOldEntry != mnHighlightedEntry ) { KeyCode aKeyCode( (nCode == KEY_UP) ? KEY_END : KEY_HOME ); KeyEvent aKeyEvent( 0, aKeyCode ); p->mpControl->KeyInput( aKeyEvent ); + p->mpControl->Invalidate(); + } + else if( !p->mpControl->HasFocus() ) + { + // in case we are in a system floating window, GrabFocus does not work :-/ + pForwardControl = p->mpControl; } } } @@ -772,10 +868,11 @@ void ToolbarMenu::KeyInput( const KeyEvent& rKEvent ) ToolbarMenuEntry* p = implCursorUpDown( nCode == KEY_END, true ); if( p && p->mpControl && !p->mbHasText ) { - p->mpControl->GrabFocus(); +// p->mpControl->GrabFocus(); KeyCode aKeyCode( KEY_HOME ); KeyEvent aKeyEvent( 0, aKeyCode ); p->mpControl->KeyInput( aKeyEvent ); + p->mpControl->Invalidate(); } } break; @@ -783,29 +880,10 @@ void ToolbarMenu::KeyInput( const KeyEvent& rKEvent ) case KEY_ESCAPE: { // Ctrl-F6 acts like ESC here, the menu bar however will then put the focus in the document - if( nCode == KEY_F6 && !rKEvent.GetKeyCode().IsMod1() ) - break; +// if( nCode == KEY_F6 && !rKEvent.GetKeyCode().IsMod1() ) +// break; implSelectEntry( -1 ); -/* - if ( !pMenu->pStartedFrom ) - { - StopExecute(); - KillActivePopup(); - } - else if ( pMenu->pStartedFrom->bIsMenuBar ) - { - // Forward... - ((MenuBarWindow*)((MenuBar*)pMenu->pStartedFrom)->ImplGetWindow())->KeyInput( rKEvent ); - } - else - { - StopExecute(); - ToolbarMenu* pFloat = ((PopupMenu*)pMenu->pStartedFrom)->ImplGetFloatingWindow(); - pFloat->GrabFocus(); - pFloat->KillActivePopup(); - } -*/ } break; @@ -816,47 +894,29 @@ void ToolbarMenu::KeyInput( const KeyEvent& rKEvent ) { if( pEntry->mpControl ) { - pEntry->mpControl->GrabFocus(); + pForwardControl = pEntry->mpControl; } else { implSelectEntry( mnHighlightedEntry ); } } - // else - // StopExecute(); } break; default: { -/* - xub_Unicode nCharCode = rKEvent.GetCharCode(); - USHORT nPos; - USHORT nDuplicates = 0; - MenuItemData* pData = nCharCode ? pMenu->GetItemList()->SearchItem( nCharCode, nPos, nDuplicates, nHighlightedItem ) : NULL; - if ( pData ) - { - if ( pData->pSubMenu || nDuplicates > 1 ) - { - implChangeHighlightEntry( nPos ); - HighlightChanged( 0 ); - } - else - { - nHighlightedItem = nPos; - EndExecute(); - } - } - else + ToolbarMenuEntry* pEntry = implGetEntry( mnHighlightedEntry ); + if ( pEntry && pEntry->mbEnabled && pEntry->mpControl && !pEntry->mbHasText ) { - // Bei ungueltigen Tasten Beepen, aber nicht bei HELP und F-Tasten - if ( !rKEvent.GetKeyCode().IsControlMod() && ( nCode != KEY_HELP ) && ( rKEvent.GetKeyCode().GetGroup() != KEYGROUP_FKEYS ) ) - Sound::Beep(); - FloatingWindow::KeyInput( rKEvent ); +// pEntry->mpControl->GrabFocus(); + pForwardControl = pEntry->mpControl; } - */ } + } + if( pForwardControl ) + pForwardControl->KeyInput( rKEvent ); + } void ToolbarMenu::implPaint( ToolbarMenuEntry* pThisOnly, bool bHighlighted ) |