1*5900e8ecSAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*5900e8ecSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*5900e8ecSAndrew Rist * or more contributor license agreements. See the NOTICE file 5*5900e8ecSAndrew Rist * distributed with this work for additional information 6*5900e8ecSAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*5900e8ecSAndrew Rist * to you under the Apache License, Version 2.0 (the 8*5900e8ecSAndrew Rist * "License"); you may not use this file except in compliance 9*5900e8ecSAndrew Rist * with the License. You may obtain a copy of the License at 10*5900e8ecSAndrew Rist * 11*5900e8ecSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12*5900e8ecSAndrew Rist * 13*5900e8ecSAndrew Rist * Unless required by applicable law or agreed to in writing, 14*5900e8ecSAndrew Rist * software distributed under the License is distributed on an 15*5900e8ecSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*5900e8ecSAndrew Rist * KIND, either express or implied. See the License for the 17*5900e8ecSAndrew Rist * specific language governing permissions and limitations 18*5900e8ecSAndrew Rist * under the License. 19*5900e8ecSAndrew Rist * 20*5900e8ecSAndrew Rist *************************************************************/ 21*5900e8ecSAndrew Rist 22*5900e8ecSAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_svtools.hxx" 26cdf0e10cSrcweir 27cdf0e10cSrcweir #include "svtools/table/defaultinputhandler.hxx" 28cdf0e10cSrcweir #include "svtools/table/tablecontrolinterface.hxx" 29cdf0e10cSrcweir 30cdf0e10cSrcweir #include "tabledatawindow.hxx" 31cdf0e10cSrcweir #include "mousefunction.hxx" 32cdf0e10cSrcweir 33cdf0e10cSrcweir #include <tools/debug.hxx> 34cdf0e10cSrcweir #include <vcl/event.hxx> 35cdf0e10cSrcweir #include <vcl/cursor.hxx> 36cdf0e10cSrcweir 37cdf0e10cSrcweir //...................................................................................................................... 38cdf0e10cSrcweir namespace svt { namespace table 39cdf0e10cSrcweir { 40cdf0e10cSrcweir //...................................................................................................................... 41cdf0e10cSrcweir 42cdf0e10cSrcweir typedef ::rtl::Reference< IMouseFunction > PMouseFunction; 43cdf0e10cSrcweir typedef ::std::vector< PMouseFunction > MouseFunctions; 44cdf0e10cSrcweir struct DefaultInputHandler_Impl 45cdf0e10cSrcweir { 46cdf0e10cSrcweir PMouseFunction pActiveFunction; 47cdf0e10cSrcweir MouseFunctions aMouseFunctions; 48cdf0e10cSrcweir }; 49cdf0e10cSrcweir 50cdf0e10cSrcweir //================================================================================================================== 51cdf0e10cSrcweir //= DefaultInputHandler 52cdf0e10cSrcweir //================================================================================================================== 53cdf0e10cSrcweir //------------------------------------------------------------------------------------------------------------------ DefaultInputHandler()54cdf0e10cSrcweir DefaultInputHandler::DefaultInputHandler() 55cdf0e10cSrcweir :m_pImpl( new DefaultInputHandler_Impl ) 56cdf0e10cSrcweir { 57cdf0e10cSrcweir m_pImpl->aMouseFunctions.push_back( new ColumnResize ); 58cdf0e10cSrcweir m_pImpl->aMouseFunctions.push_back( new RowSelection ); 59cdf0e10cSrcweir m_pImpl->aMouseFunctions.push_back( new ColumnSortHandler ); 60cdf0e10cSrcweir } 61cdf0e10cSrcweir 62cdf0e10cSrcweir //------------------------------------------------------------------------------------------------------------------ ~DefaultInputHandler()63cdf0e10cSrcweir DefaultInputHandler::~DefaultInputHandler() 64cdf0e10cSrcweir { 65cdf0e10cSrcweir } 66cdf0e10cSrcweir 67cdf0e10cSrcweir //------------------------------------------------------------------------------------------------------------------ 68cdf0e10cSrcweir namespace 69cdf0e10cSrcweir { lcl_delegateMouseEvent(DefaultInputHandler_Impl & i_impl,ITableControl & i_control,const MouseEvent & i_event,FunctionResult (IMouseFunction::* i_handlerMethod)(ITableControl &,const MouseEvent &))70cdf0e10cSrcweir bool lcl_delegateMouseEvent( DefaultInputHandler_Impl& i_impl, ITableControl& i_control, const MouseEvent& i_event, 71cdf0e10cSrcweir FunctionResult ( IMouseFunction::*i_handlerMethod )( ITableControl&, const MouseEvent& ) ) 72cdf0e10cSrcweir { 73cdf0e10cSrcweir if ( i_impl.pActiveFunction.is() ) 74cdf0e10cSrcweir { 75cdf0e10cSrcweir bool furtherHandler = false; 76cdf0e10cSrcweir switch ( (i_impl.pActiveFunction.get()->*i_handlerMethod)( i_control, i_event ) ) 77cdf0e10cSrcweir { 78cdf0e10cSrcweir case ActivateFunction: 79cdf0e10cSrcweir OSL_ENSURE( false, "lcl_delegateMouseEvent: unexpected - function already *is* active!" ); 80cdf0e10cSrcweir break; 81cdf0e10cSrcweir case ContinueFunction: 82cdf0e10cSrcweir break; 83cdf0e10cSrcweir case DeactivateFunction: 84cdf0e10cSrcweir i_impl.pActiveFunction.clear(); 85cdf0e10cSrcweir break; 86cdf0e10cSrcweir case SkipFunction: 87cdf0e10cSrcweir furtherHandler = true; 88cdf0e10cSrcweir break; 89cdf0e10cSrcweir } 90cdf0e10cSrcweir if ( !furtherHandler ) 91cdf0e10cSrcweir // handled the event 92cdf0e10cSrcweir return true; 93cdf0e10cSrcweir } 94cdf0e10cSrcweir 95cdf0e10cSrcweir // ask all other handlers 96cdf0e10cSrcweir bool handled = false; 97cdf0e10cSrcweir for ( MouseFunctions::iterator handler = i_impl.aMouseFunctions.begin(); 98cdf0e10cSrcweir ( handler != i_impl.aMouseFunctions.end() ) && !handled; 99cdf0e10cSrcweir ++handler 100cdf0e10cSrcweir ) 101cdf0e10cSrcweir { 102cdf0e10cSrcweir if ( *handler == i_impl.pActiveFunction ) 103cdf0e10cSrcweir // we already invoked this function 104cdf0e10cSrcweir continue; 105cdf0e10cSrcweir 106cdf0e10cSrcweir switch ( (handler->get()->*i_handlerMethod)( i_control, i_event ) ) 107cdf0e10cSrcweir { 108cdf0e10cSrcweir case ActivateFunction: 109cdf0e10cSrcweir i_impl.pActiveFunction = *handler; 110cdf0e10cSrcweir handled = true; 111cdf0e10cSrcweir break; 112cdf0e10cSrcweir case ContinueFunction: 113cdf0e10cSrcweir case DeactivateFunction: 114cdf0e10cSrcweir OSL_ENSURE( false, "lcl_delegateMouseEvent: unexpected: inactivate handler cannot be continued or deactivated!" ); 115cdf0e10cSrcweir break; 116cdf0e10cSrcweir case SkipFunction: 117cdf0e10cSrcweir handled = false; 118cdf0e10cSrcweir break; 119cdf0e10cSrcweir } 120cdf0e10cSrcweir } 121cdf0e10cSrcweir return handled; 122cdf0e10cSrcweir } 123cdf0e10cSrcweir } 124cdf0e10cSrcweir 125cdf0e10cSrcweir //------------------------------------------------------------------------------------------------------------------ MouseMove(ITableControl & i_tableControl,const MouseEvent & i_event)126cdf0e10cSrcweir bool DefaultInputHandler::MouseMove( ITableControl& i_tableControl, const MouseEvent& i_event ) 127cdf0e10cSrcweir { 128cdf0e10cSrcweir return lcl_delegateMouseEvent( *m_pImpl, i_tableControl, i_event, &IMouseFunction::handleMouseMove ); 129cdf0e10cSrcweir } 130cdf0e10cSrcweir 131cdf0e10cSrcweir //------------------------------------------------------------------------------------------------------------------ MouseButtonDown(ITableControl & i_tableControl,const MouseEvent & i_event)132cdf0e10cSrcweir bool DefaultInputHandler::MouseButtonDown( ITableControl& i_tableControl, const MouseEvent& i_event ) 133cdf0e10cSrcweir { 134cdf0e10cSrcweir return lcl_delegateMouseEvent( *m_pImpl, i_tableControl, i_event, &IMouseFunction::handleMouseDown ); 135cdf0e10cSrcweir } 136cdf0e10cSrcweir 137cdf0e10cSrcweir //------------------------------------------------------------------------------------------------------------------ MouseButtonUp(ITableControl & i_tableControl,const MouseEvent & i_event)138cdf0e10cSrcweir bool DefaultInputHandler::MouseButtonUp( ITableControl& i_tableControl, const MouseEvent& i_event ) 139cdf0e10cSrcweir { 140cdf0e10cSrcweir return lcl_delegateMouseEvent( *m_pImpl, i_tableControl, i_event, &IMouseFunction::handleMouseUp ); 141cdf0e10cSrcweir } 142cdf0e10cSrcweir 143cdf0e10cSrcweir //------------------------------------------------------------------------------------------------------------------ KeyInput(ITableControl & _rControl,const KeyEvent & rKEvt)144cdf0e10cSrcweir bool DefaultInputHandler::KeyInput( ITableControl& _rControl, const KeyEvent& rKEvt ) 145cdf0e10cSrcweir { 146cdf0e10cSrcweir bool bHandled = false; 147cdf0e10cSrcweir 148cdf0e10cSrcweir const KeyCode& rKeyCode = rKEvt.GetKeyCode(); 149cdf0e10cSrcweir sal_uInt16 nKeyCode = rKeyCode.GetCode(); 150cdf0e10cSrcweir 151cdf0e10cSrcweir struct _ActionMapEntry 152cdf0e10cSrcweir { 153cdf0e10cSrcweir sal_uInt16 nKeyCode; 154cdf0e10cSrcweir sal_uInt16 nKeyModifier; 155cdf0e10cSrcweir TableControlAction eAction; 156cdf0e10cSrcweir } 157cdf0e10cSrcweir static aKnownActions[] = { 158cdf0e10cSrcweir { KEY_DOWN, 0, cursorDown }, 159cdf0e10cSrcweir { KEY_UP, 0, cursorUp }, 160cdf0e10cSrcweir { KEY_LEFT, 0, cursorLeft }, 161cdf0e10cSrcweir { KEY_RIGHT, 0, cursorRight }, 162cdf0e10cSrcweir { KEY_HOME, 0, cursorToLineStart }, 163cdf0e10cSrcweir { KEY_END, 0, cursorToLineEnd }, 164cdf0e10cSrcweir { KEY_PAGEUP, 0, cursorPageUp }, 165cdf0e10cSrcweir { KEY_PAGEDOWN, 0, cursorPageDown }, 166cdf0e10cSrcweir { KEY_PAGEUP, KEY_MOD1, cursorToFirstLine }, 167cdf0e10cSrcweir { KEY_PAGEDOWN, KEY_MOD1, cursorToLastLine }, 168cdf0e10cSrcweir { KEY_HOME, KEY_MOD1, cursorTopLeft }, 169cdf0e10cSrcweir { KEY_END, KEY_MOD1, cursorBottomRight }, 170cdf0e10cSrcweir { KEY_SPACE, KEY_MOD1, cursorSelectRow }, 171cdf0e10cSrcweir { KEY_UP, KEY_SHIFT, cursorSelectRowUp }, 172cdf0e10cSrcweir { KEY_DOWN, KEY_SHIFT, cursorSelectRowDown }, 173cdf0e10cSrcweir { KEY_END, KEY_SHIFT, cursorSelectRowAreaBottom }, 174cdf0e10cSrcweir { KEY_HOME, KEY_SHIFT, cursorSelectRowAreaTop }, 175cdf0e10cSrcweir 176cdf0e10cSrcweir { 0, 0, invalidTableControlAction } 177cdf0e10cSrcweir }; 178cdf0e10cSrcweir 179cdf0e10cSrcweir const _ActionMapEntry* pActions = aKnownActions; 180cdf0e10cSrcweir for ( ; pActions->eAction != invalidTableControlAction; ++pActions ) 181cdf0e10cSrcweir { 182cdf0e10cSrcweir if ( ( pActions->nKeyCode == nKeyCode ) && ( pActions->nKeyModifier == rKeyCode.GetAllModifier() ) ) 183cdf0e10cSrcweir { 184cdf0e10cSrcweir bHandled = _rControl.dispatchAction( pActions->eAction ); 185cdf0e10cSrcweir break; 186cdf0e10cSrcweir } 187cdf0e10cSrcweir } 188cdf0e10cSrcweir 189cdf0e10cSrcweir return bHandled; 190cdf0e10cSrcweir } 191cdf0e10cSrcweir 192cdf0e10cSrcweir //------------------------------------------------------------------------------------------------------------------ GetFocus(ITableControl & _rControl)193cdf0e10cSrcweir bool DefaultInputHandler::GetFocus( ITableControl& _rControl ) 194cdf0e10cSrcweir { 195cdf0e10cSrcweir _rControl.showCursor(); 196cdf0e10cSrcweir return false; // continue processing 197cdf0e10cSrcweir } 198cdf0e10cSrcweir 199cdf0e10cSrcweir //------------------------------------------------------------------------------------------------------------------ LoseFocus(ITableControl & _rControl)200cdf0e10cSrcweir bool DefaultInputHandler::LoseFocus( ITableControl& _rControl ) 201cdf0e10cSrcweir { 202cdf0e10cSrcweir _rControl.hideCursor(); 203cdf0e10cSrcweir return false; // continue processing 204cdf0e10cSrcweir } 205cdf0e10cSrcweir 206cdf0e10cSrcweir //------------------------------------------------------------------------------------------------------------------ RequestHelp(ITableControl & _rControl,const HelpEvent & _rHEvt)207cdf0e10cSrcweir bool DefaultInputHandler::RequestHelp( ITableControl& _rControl, const HelpEvent& _rHEvt ) 208cdf0e10cSrcweir { 209cdf0e10cSrcweir (void)_rControl; 210cdf0e10cSrcweir (void)_rHEvt; 211cdf0e10cSrcweir // TODO 212cdf0e10cSrcweir return false; 213cdf0e10cSrcweir } 214cdf0e10cSrcweir 215cdf0e10cSrcweir //------------------------------------------------------------------------------------------------------------------ Command(ITableControl & _rControl,const CommandEvent & _rCEvt)216cdf0e10cSrcweir bool DefaultInputHandler::Command( ITableControl& _rControl, const CommandEvent& _rCEvt ) 217cdf0e10cSrcweir { 218cdf0e10cSrcweir (void)_rControl; 219cdf0e10cSrcweir (void)_rCEvt; 220cdf0e10cSrcweir // TODO 221cdf0e10cSrcweir return false; 222cdf0e10cSrcweir } 223cdf0e10cSrcweir 224cdf0e10cSrcweir //------------------------------------------------------------------------------------------------------------------ PreNotify(ITableControl & _rControl,NotifyEvent & _rNEvt)225cdf0e10cSrcweir bool DefaultInputHandler::PreNotify( ITableControl& _rControl, NotifyEvent& _rNEvt ) 226cdf0e10cSrcweir { 227cdf0e10cSrcweir (void)_rControl; 228cdf0e10cSrcweir (void)_rNEvt; 229cdf0e10cSrcweir // TODO 230cdf0e10cSrcweir return false; 231cdf0e10cSrcweir } 232cdf0e10cSrcweir 233cdf0e10cSrcweir //------------------------------------------------------------------------------------------------------------------ Notify(ITableControl & _rControl,NotifyEvent & _rNEvt)234cdf0e10cSrcweir bool DefaultInputHandler::Notify( ITableControl& _rControl, NotifyEvent& _rNEvt ) 235cdf0e10cSrcweir { 236cdf0e10cSrcweir (void)_rControl; 237cdf0e10cSrcweir (void)_rNEvt; 238cdf0e10cSrcweir // TODO 239cdf0e10cSrcweir return false; 240cdf0e10cSrcweir } 241cdf0e10cSrcweir //...................................................................................................................... 242cdf0e10cSrcweir } } // namespace svt::table 243cdf0e10cSrcweir //...................................................................................................................... 244