diff options
Diffstat (limited to 'svtools/source/table/defaultinputhandler.cxx')
-rw-r--r-- | svtools/source/table/defaultinputhandler.cxx | 197 |
1 files changed, 104 insertions, 93 deletions
diff --git a/svtools/source/table/defaultinputhandler.cxx b/svtools/source/table/defaultinputhandler.cxx index 133575fdf8cf..733366d16904 100644 --- a/svtools/source/table/defaultinputhandler.cxx +++ b/svtools/source/table/defaultinputhandler.cxx @@ -28,111 +28,123 @@ #include "precompiled_svtools.hxx" #include "svtools/table/defaultinputhandler.hxx" -#include "svtools/table/abstracttablecontrol.hxx" +#include "svtools/table/tablecontrolinterface.hxx" + +#include "tabledatawindow.hxx" +#include "mousefunction.hxx" #include <tools/debug.hxx> #include <vcl/event.hxx> #include <vcl/cursor.hxx> -#include "svtools/table/tabledatawindow.hxx" -//........................................................................ +//...................................................................................................................... namespace svt { namespace table { -//....................................................................... +//...................................................................................................................... + typedef ::rtl::Reference< IMouseFunction > PMouseFunction; + typedef ::std::vector< PMouseFunction > MouseFunctions; struct DefaultInputHandler_Impl { + PMouseFunction pActiveFunction; + MouseFunctions aMouseFunctions; }; - //==================================================================== + //================================================================================================================== //= DefaultInputHandler - //==================================================================== - //-------------------------------------------------------------------- + //================================================================================================================== + //------------------------------------------------------------------------------------------------------------------ DefaultInputHandler::DefaultInputHandler() :m_pImpl( new DefaultInputHandler_Impl ) - ,m_bResize(false) { + m_pImpl->aMouseFunctions.push_back( new ColumnResize ); + m_pImpl->aMouseFunctions.push_back( new RowSelection ); + m_pImpl->aMouseFunctions.push_back( new ColumnSortHandler ); } - //-------------------------------------------------------------------- + //------------------------------------------------------------------------------------------------------------------ DefaultInputHandler::~DefaultInputHandler() { - DELETEZ( m_pImpl ); } - //-------------------------------------------------------------------- - bool DefaultInputHandler::MouseMove( IAbstractTableControl& _rControl, const MouseEvent& _rMEvt ) + //------------------------------------------------------------------------------------------------------------------ + namespace { - Point aPoint = _rMEvt.GetPosPixel(); - if(m_bResize) + bool lcl_delegateMouseEvent( DefaultInputHandler_Impl& i_impl, ITableControl& i_control, const MouseEvent& i_event, + FunctionResult ( IMouseFunction::*i_handlerMethod )( ITableControl&, const MouseEvent& ) ) { - _rControl.resizeColumn(aPoint); - return true; - } - return false; - } - - //-------------------------------------------------------------------- - bool DefaultInputHandler::MouseButtonDown( IAbstractTableControl& _rControl, const MouseEvent& _rMEvt ) - { - bool bHandled = false; - Point aPoint = _rMEvt.GetPosPixel(); - RowPos nRow = _rControl.getCurrentRow(aPoint); - if(nRow == -1) - { - m_bResize = _rControl.startResizeColumn(aPoint); - bHandled = true; - } - else if(nRow >= 0) - { - if(_rControl.getSelEngine()->GetSelectionMode() == NO_SELECTION) + if ( i_impl.pActiveFunction.is() ) { - _rControl.setCursorAtCurrentCell(aPoint); - bHandled = true; + bool furtherHandler = false; + switch ( (i_impl.pActiveFunction.get()->*i_handlerMethod)( i_control, i_event ) ) + { + case ActivateFunction: + OSL_ENSURE( false, "lcl_delegateMouseEvent: unexpected - function already *is* active!" ); + break; + case ContinueFunction: + break; + case DeactivateFunction: + i_impl.pActiveFunction.clear(); + break; + case SkipFunction: + furtherHandler = true; + break; + } + if ( !furtherHandler ) + // handled the event + return true; } - else + + // ask all other handlers + bool handled = false; + for ( MouseFunctions::iterator handler = i_impl.aMouseFunctions.begin(); + ( handler != i_impl.aMouseFunctions.end() ) && !handled; + ++handler + ) { - if(!_rControl.isRowSelected(nRow)) - bHandled = _rControl.getSelEngine()->SelMouseButtonDown(_rMEvt); - else - bHandled = true; + if ( *handler == i_impl.pActiveFunction ) + // we already invoked this function + continue; + + switch ( (handler->get()->*i_handlerMethod)( i_control, i_event ) ) + { + case ActivateFunction: + i_impl.pActiveFunction = *handler; + handled = true; + break; + case ContinueFunction: + case DeactivateFunction: + OSL_ENSURE( false, "lcl_delegateMouseEvent: unexpected: inactivate handler cannot be continued or deactivated!" ); + break; + case SkipFunction: + handled = false; + break; + } } + return handled; } - return bHandled; } - //-------------------------------------------------------------------- - bool DefaultInputHandler::MouseButtonUp( IAbstractTableControl& _rControl, const MouseEvent& _rMEvt ) + + //------------------------------------------------------------------------------------------------------------------ + bool DefaultInputHandler::MouseMove( ITableControl& i_tableControl, const MouseEvent& i_event ) { - bool bHandled = false; - Point aPoint = _rMEvt.GetPosPixel(); - if(_rControl.getCurrentRow(aPoint) >= 0) - { - if(m_bResize) - { - m_bResize = _rControl.endResizeColumn(aPoint); - bHandled = true; - } - else if(_rControl.getSelEngine()->GetSelectionMode() == NO_SELECTION) - { - bHandled = true; - } - else - { - bHandled = _rControl.getSelEngine()->SelMouseButtonUp(_rMEvt); - } - } - else - { - if(m_bResize) - { - m_bResize = _rControl.endResizeColumn(aPoint); - bHandled = true; - } - } - return bHandled; + return lcl_delegateMouseEvent( *m_pImpl, i_tableControl, i_event, &IMouseFunction::handleMouseMove ); + } + + //------------------------------------------------------------------------------------------------------------------ + bool DefaultInputHandler::MouseButtonDown( ITableControl& i_tableControl, const MouseEvent& i_event ) + { + return lcl_delegateMouseEvent( *m_pImpl, i_tableControl, i_event, &IMouseFunction::handleMouseDown ); } - //-------------------------------------------------------------------- - bool DefaultInputHandler::KeyInput( IAbstractTableControl& _rControl, const KeyEvent& rKEvt ) + + //------------------------------------------------------------------------------------------------------------------ + bool DefaultInputHandler::MouseButtonUp( ITableControl& i_tableControl, const MouseEvent& i_event ) + { + return lcl_delegateMouseEvent( *m_pImpl, i_tableControl, i_event, &IMouseFunction::handleMouseUp ); + } + + //------------------------------------------------------------------------------------------------------------------ + bool DefaultInputHandler::KeyInput( ITableControl& _rControl, const KeyEvent& rKEvt ) { bool bHandled = false; @@ -158,11 +170,11 @@ namespace svt { namespace table { KEY_PAGEDOWN, KEY_MOD1, cursorToLastLine }, { KEY_HOME, KEY_MOD1, cursorTopLeft }, { KEY_END, KEY_MOD1, cursorBottomRight }, - { KEY_SPACE, KEY_MOD1, cursorSelectRow }, - { KEY_UP, KEY_SHIFT, cursorSelectRowUp }, - { KEY_DOWN, KEY_SHIFT, cursorSelectRowDown }, - { KEY_END, KEY_SHIFT, cursorSelectRowAreaBottom }, - { KEY_HOME, KEY_SHIFT, cursorSelectRowAreaTop }, + { KEY_SPACE, KEY_MOD1, cursorSelectRow }, + { KEY_UP, KEY_SHIFT, cursorSelectRowUp }, + { KEY_DOWN, KEY_SHIFT, cursorSelectRowDown }, + { KEY_END, KEY_SHIFT, cursorSelectRowAreaBottom }, + { KEY_HOME, KEY_SHIFT, cursorSelectRowAreaTop }, { 0, 0, invalidTableControlAction } }; @@ -173,7 +185,6 @@ namespace svt { namespace table if ( ( pActions->nKeyCode == nKeyCode ) && ( pActions->nKeyModifier == rKeyCode.GetAllModifier() ) ) { bHandled = _rControl.dispatchAction( pActions->eAction ); - bHandled = true; // always handled issue #i114340 break; } } @@ -181,22 +192,22 @@ namespace svt { namespace table return bHandled; } - //-------------------------------------------------------------------- - bool DefaultInputHandler::GetFocus( IAbstractTableControl& _rControl ) + //------------------------------------------------------------------------------------------------------------------ + bool DefaultInputHandler::GetFocus( ITableControl& _rControl ) { _rControl.showCursor(); return false; // continue processing } - //-------------------------------------------------------------------- - bool DefaultInputHandler::LoseFocus( IAbstractTableControl& _rControl ) + //------------------------------------------------------------------------------------------------------------------ + bool DefaultInputHandler::LoseFocus( ITableControl& _rControl ) { _rControl.hideCursor(); return false; // continue processing } - //-------------------------------------------------------------------- - bool DefaultInputHandler::RequestHelp( IAbstractTableControl& _rControl, const HelpEvent& _rHEvt ) + //------------------------------------------------------------------------------------------------------------------ + bool DefaultInputHandler::RequestHelp( ITableControl& _rControl, const HelpEvent& _rHEvt ) { (void)_rControl; (void)_rHEvt; @@ -204,8 +215,8 @@ namespace svt { namespace table return false; } - //-------------------------------------------------------------------- - bool DefaultInputHandler::Command( IAbstractTableControl& _rControl, const CommandEvent& _rCEvt ) + //------------------------------------------------------------------------------------------------------------------ + bool DefaultInputHandler::Command( ITableControl& _rControl, const CommandEvent& _rCEvt ) { (void)_rControl; (void)_rCEvt; @@ -213,8 +224,8 @@ namespace svt { namespace table return false; } - //-------------------------------------------------------------------- - bool DefaultInputHandler::PreNotify( IAbstractTableControl& _rControl, NotifyEvent& _rNEvt ) + //------------------------------------------------------------------------------------------------------------------ + bool DefaultInputHandler::PreNotify( ITableControl& _rControl, NotifyEvent& _rNEvt ) { (void)_rControl; (void)_rNEvt; @@ -222,14 +233,14 @@ namespace svt { namespace table return false; } - //-------------------------------------------------------------------- - bool DefaultInputHandler::Notify( IAbstractTableControl& _rControl, NotifyEvent& _rNEvt ) + //------------------------------------------------------------------------------------------------------------------ + bool DefaultInputHandler::Notify( ITableControl& _rControl, NotifyEvent& _rNEvt ) { (void)_rControl; (void)_rNEvt; // TODO return false; } -//........................................................................ +//...................................................................................................................... } } // namespace svt::table -//........................................................................ +//...................................................................................................................... |