1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski 24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove 25*b1cdbd2cSJim Jagielski #include "precompiled_sfx2.hxx" 26*b1cdbd2cSJim Jagielski 27*b1cdbd2cSJim Jagielski #include "sfx2/userinputinterception.hxx" 28*b1cdbd2cSJim Jagielski 29*b1cdbd2cSJim Jagielski /** === begin UNO includes === **/ 30*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/MouseButton.hpp> 31*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/KeyModifier.hpp> 32*b1cdbd2cSJim Jagielski /** === end UNO includes === **/ 33*b1cdbd2cSJim Jagielski 34*b1cdbd2cSJim Jagielski #include <cppuhelper/interfacecontainer.hxx> 35*b1cdbd2cSJim Jagielski #include <cppuhelper/weak.hxx> 36*b1cdbd2cSJim Jagielski #include <vcl/event.hxx> 37*b1cdbd2cSJim Jagielski #include <vcl/window.hxx> 38*b1cdbd2cSJim Jagielski 39*b1cdbd2cSJim Jagielski //........................................................................ 40*b1cdbd2cSJim Jagielski namespace sfx2 41*b1cdbd2cSJim Jagielski { 42*b1cdbd2cSJim Jagielski //........................................................................ 43*b1cdbd2cSJim Jagielski 44*b1cdbd2cSJim Jagielski /** === begin UNO using === **/ 45*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Reference; 46*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::XInterface; 47*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::UNO_QUERY; 48*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::UNO_QUERY_THROW; 49*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::UNO_SET_THROW; 50*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Exception; 51*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::RuntimeException; 52*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Any; 53*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::makeAny; 54*b1cdbd2cSJim Jagielski using ::com::sun::star::awt::MouseEvent; 55*b1cdbd2cSJim Jagielski using ::com::sun::star::awt::KeyEvent; 56*b1cdbd2cSJim Jagielski using ::com::sun::star::awt::InputEvent; 57*b1cdbd2cSJim Jagielski using ::com::sun::star::awt::XKeyHandler; 58*b1cdbd2cSJim Jagielski using ::com::sun::star::awt::XMouseClickHandler; 59*b1cdbd2cSJim Jagielski using ::com::sun::star::lang::DisposedException; 60*b1cdbd2cSJim Jagielski /** === end UNO using === **/ 61*b1cdbd2cSJim Jagielski namespace MouseButton = ::com::sun::star::awt::MouseButton; 62*b1cdbd2cSJim Jagielski namespace KeyModifier = ::com::sun::star::awt::KeyModifier; 63*b1cdbd2cSJim Jagielski 64*b1cdbd2cSJim Jagielski struct UserInputInterception_Data 65*b1cdbd2cSJim Jagielski { 66*b1cdbd2cSJim Jagielski public: 67*b1cdbd2cSJim Jagielski ::cppu::OWeakObject& m_rControllerImpl; 68*b1cdbd2cSJim Jagielski ::cppu::OInterfaceContainerHelper m_aKeyHandlers; 69*b1cdbd2cSJim Jagielski ::cppu::OInterfaceContainerHelper m_aMouseClickHandlers; 70*b1cdbd2cSJim Jagielski 71*b1cdbd2cSJim Jagielski public: UserInputInterception_Datasfx2::UserInputInterception_Data72*b1cdbd2cSJim Jagielski UserInputInterception_Data( ::cppu::OWeakObject& _rControllerImpl, ::osl::Mutex& _rMutex ) 73*b1cdbd2cSJim Jagielski :m_rControllerImpl( _rControllerImpl ) 74*b1cdbd2cSJim Jagielski ,m_aKeyHandlers( _rMutex ) 75*b1cdbd2cSJim Jagielski ,m_aMouseClickHandlers( _rMutex ) 76*b1cdbd2cSJim Jagielski { 77*b1cdbd2cSJim Jagielski } 78*b1cdbd2cSJim Jagielski }; 79*b1cdbd2cSJim Jagielski 80*b1cdbd2cSJim Jagielski namespace 81*b1cdbd2cSJim Jagielski { 82*b1cdbd2cSJim Jagielski template< class VLCEVENT > lcl_initModifiers(InputEvent & _rEvent,const VLCEVENT & _rVclEvent)83*b1cdbd2cSJim Jagielski void lcl_initModifiers( InputEvent& _rEvent, const VLCEVENT& _rVclEvent ) 84*b1cdbd2cSJim Jagielski { 85*b1cdbd2cSJim Jagielski _rEvent.Modifiers = 0; 86*b1cdbd2cSJim Jagielski 87*b1cdbd2cSJim Jagielski if ( _rVclEvent.IsShift() ) 88*b1cdbd2cSJim Jagielski _rEvent.Modifiers |= KeyModifier::SHIFT; 89*b1cdbd2cSJim Jagielski if ( _rVclEvent.IsMod1() ) 90*b1cdbd2cSJim Jagielski _rEvent.Modifiers |= KeyModifier::MOD1; 91*b1cdbd2cSJim Jagielski if ( _rVclEvent.IsMod2() ) 92*b1cdbd2cSJim Jagielski _rEvent.Modifiers |= KeyModifier::MOD2; 93*b1cdbd2cSJim Jagielski if ( _rVclEvent.IsMod3() ) 94*b1cdbd2cSJim Jagielski _rEvent.Modifiers |= KeyModifier::MOD3; 95*b1cdbd2cSJim Jagielski } 96*b1cdbd2cSJim Jagielski lcl_initKeyEvent(KeyEvent & rEvent,const::KeyEvent & rEvt)97*b1cdbd2cSJim Jagielski void lcl_initKeyEvent( KeyEvent& rEvent, const ::KeyEvent& rEvt ) 98*b1cdbd2cSJim Jagielski { 99*b1cdbd2cSJim Jagielski lcl_initModifiers( rEvent, rEvt.GetKeyCode() ); 100*b1cdbd2cSJim Jagielski 101*b1cdbd2cSJim Jagielski rEvent.KeyCode = rEvt.GetKeyCode().GetCode(); 102*b1cdbd2cSJim Jagielski rEvent.KeyChar = rEvt.GetCharCode(); 103*b1cdbd2cSJim Jagielski rEvent.KeyFunc = sal::static_int_cast< sal_Int16 >( rEvt.GetKeyCode().GetFunction()); 104*b1cdbd2cSJim Jagielski } 105*b1cdbd2cSJim Jagielski lcl_initMouseEvent(MouseEvent & rEvent,const::MouseEvent & rEvt)106*b1cdbd2cSJim Jagielski void lcl_initMouseEvent( MouseEvent& rEvent, const ::MouseEvent& rEvt ) 107*b1cdbd2cSJim Jagielski { 108*b1cdbd2cSJim Jagielski lcl_initModifiers( rEvent, rEvt ); 109*b1cdbd2cSJim Jagielski 110*b1cdbd2cSJim Jagielski rEvent.Buttons = 0; 111*b1cdbd2cSJim Jagielski if ( rEvt.IsLeft() ) 112*b1cdbd2cSJim Jagielski rEvent.Buttons |= MouseButton::LEFT; 113*b1cdbd2cSJim Jagielski if ( rEvt.IsRight() ) 114*b1cdbd2cSJim Jagielski rEvent.Buttons |= MouseButton::RIGHT; 115*b1cdbd2cSJim Jagielski if ( rEvt.IsMiddle() ) 116*b1cdbd2cSJim Jagielski rEvent.Buttons |= MouseButton::MIDDLE; 117*b1cdbd2cSJim Jagielski 118*b1cdbd2cSJim Jagielski rEvent.X = rEvt.GetPosPixel().X(); 119*b1cdbd2cSJim Jagielski rEvent.Y = rEvt.GetPosPixel().Y(); 120*b1cdbd2cSJim Jagielski rEvent.ClickCount = rEvt.GetClicks(); 121*b1cdbd2cSJim Jagielski rEvent.PopupTrigger = sal_False; 122*b1cdbd2cSJim Jagielski } 123*b1cdbd2cSJim Jagielski 124*b1cdbd2cSJim Jagielski } 125*b1cdbd2cSJim Jagielski 126*b1cdbd2cSJim Jagielski //==================================================================== 127*b1cdbd2cSJim Jagielski //= UserInputInterception 128*b1cdbd2cSJim Jagielski //==================================================================== 129*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- UserInputInterception(::cppu::OWeakObject & _rControllerImpl,::osl::Mutex & _rMutex)130*b1cdbd2cSJim Jagielski UserInputInterception::UserInputInterception( ::cppu::OWeakObject& _rControllerImpl, ::osl::Mutex& _rMutex ) 131*b1cdbd2cSJim Jagielski :m_pData( new UserInputInterception_Data( _rControllerImpl, _rMutex ) ) 132*b1cdbd2cSJim Jagielski { 133*b1cdbd2cSJim Jagielski } 134*b1cdbd2cSJim Jagielski 135*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- ~UserInputInterception()136*b1cdbd2cSJim Jagielski UserInputInterception::~UserInputInterception() 137*b1cdbd2cSJim Jagielski { 138*b1cdbd2cSJim Jagielski } 139*b1cdbd2cSJim Jagielski 140*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- addKeyHandler(const Reference<XKeyHandler> & _rxHandler)141*b1cdbd2cSJim Jagielski void UserInputInterception::addKeyHandler( const Reference< XKeyHandler >& _rxHandler ) throw (RuntimeException) 142*b1cdbd2cSJim Jagielski { 143*b1cdbd2cSJim Jagielski if ( _rxHandler.is() ) 144*b1cdbd2cSJim Jagielski m_pData->m_aKeyHandlers.addInterface( _rxHandler ); 145*b1cdbd2cSJim Jagielski } 146*b1cdbd2cSJim Jagielski 147*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- removeKeyHandler(const Reference<XKeyHandler> & _rxHandler)148*b1cdbd2cSJim Jagielski void UserInputInterception::removeKeyHandler( const Reference< XKeyHandler >& _rxHandler ) throw (RuntimeException) 149*b1cdbd2cSJim Jagielski { 150*b1cdbd2cSJim Jagielski m_pData->m_aKeyHandlers.removeInterface( _rxHandler ); 151*b1cdbd2cSJim Jagielski } 152*b1cdbd2cSJim Jagielski 153*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- addMouseClickHandler(const Reference<XMouseClickHandler> & _rxHandler)154*b1cdbd2cSJim Jagielski void UserInputInterception::addMouseClickHandler( const Reference< XMouseClickHandler >& _rxHandler ) throw (RuntimeException) 155*b1cdbd2cSJim Jagielski { 156*b1cdbd2cSJim Jagielski if ( _rxHandler.is() ) 157*b1cdbd2cSJim Jagielski m_pData->m_aMouseClickHandlers.addInterface( _rxHandler ); 158*b1cdbd2cSJim Jagielski } 159*b1cdbd2cSJim Jagielski 160*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- removeMouseClickHandler(const Reference<XMouseClickHandler> & _rxHandler)161*b1cdbd2cSJim Jagielski void UserInputInterception::removeMouseClickHandler( const Reference< XMouseClickHandler >& _rxHandler ) throw (RuntimeException) 162*b1cdbd2cSJim Jagielski { 163*b1cdbd2cSJim Jagielski m_pData->m_aMouseClickHandlers.removeInterface( _rxHandler ); 164*b1cdbd2cSJim Jagielski } 165*b1cdbd2cSJim Jagielski 166*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- hasKeyHandlers() const167*b1cdbd2cSJim Jagielski bool UserInputInterception::hasKeyHandlers() const 168*b1cdbd2cSJim Jagielski { 169*b1cdbd2cSJim Jagielski return m_pData->m_aKeyHandlers.getLength() > 0; 170*b1cdbd2cSJim Jagielski } 171*b1cdbd2cSJim Jagielski 172*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- hasMouseClickListeners() const173*b1cdbd2cSJim Jagielski bool UserInputInterception::hasMouseClickListeners() const 174*b1cdbd2cSJim Jagielski { 175*b1cdbd2cSJim Jagielski return m_pData->m_aMouseClickHandlers.getLength() > 0; 176*b1cdbd2cSJim Jagielski } 177*b1cdbd2cSJim Jagielski 178*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- handleNotifyEvent(const NotifyEvent & _rEvent)179*b1cdbd2cSJim Jagielski bool UserInputInterception::handleNotifyEvent( const NotifyEvent& _rEvent ) 180*b1cdbd2cSJim Jagielski { 181*b1cdbd2cSJim Jagielski Reference < XInterface > xHoldAlive( m_pData->m_rControllerImpl ); 182*b1cdbd2cSJim Jagielski 183*b1cdbd2cSJim Jagielski sal_uInt16 nType = _rEvent.GetType(); 184*b1cdbd2cSJim Jagielski bool bHandled = false; 185*b1cdbd2cSJim Jagielski 186*b1cdbd2cSJim Jagielski switch ( nType ) 187*b1cdbd2cSJim Jagielski { 188*b1cdbd2cSJim Jagielski case EVENT_KEYINPUT: 189*b1cdbd2cSJim Jagielski case EVENT_KEYUP: 190*b1cdbd2cSJim Jagielski { 191*b1cdbd2cSJim Jagielski KeyEvent aEvent; 192*b1cdbd2cSJim Jagielski lcl_initKeyEvent( aEvent, *_rEvent.GetKeyEvent() ); 193*b1cdbd2cSJim Jagielski if ( _rEvent.GetWindow() ) 194*b1cdbd2cSJim Jagielski aEvent.Source = _rEvent.GetWindow()->GetComponentInterface(); 195*b1cdbd2cSJim Jagielski 196*b1cdbd2cSJim Jagielski ::cppu::OInterfaceIteratorHelper aIterator( m_pData->m_aKeyHandlers ); 197*b1cdbd2cSJim Jagielski while ( aIterator.hasMoreElements() ) 198*b1cdbd2cSJim Jagielski { 199*b1cdbd2cSJim Jagielski Reference< XKeyHandler > xHandler( static_cast< XKeyHandler* >( aIterator.next() ) ); 200*b1cdbd2cSJim Jagielski if ( !xHandler.is() ) 201*b1cdbd2cSJim Jagielski continue; 202*b1cdbd2cSJim Jagielski 203*b1cdbd2cSJim Jagielski try 204*b1cdbd2cSJim Jagielski { 205*b1cdbd2cSJim Jagielski if ( nType == EVENT_KEYINPUT ) 206*b1cdbd2cSJim Jagielski bHandled = xHandler->keyPressed( aEvent ); 207*b1cdbd2cSJim Jagielski else 208*b1cdbd2cSJim Jagielski bHandled = xHandler->keyReleased( aEvent ); 209*b1cdbd2cSJim Jagielski } 210*b1cdbd2cSJim Jagielski catch( const DisposedException& e ) 211*b1cdbd2cSJim Jagielski { 212*b1cdbd2cSJim Jagielski if ( e.Context == xHandler ) 213*b1cdbd2cSJim Jagielski aIterator.remove(); 214*b1cdbd2cSJim Jagielski } 215*b1cdbd2cSJim Jagielski catch( const RuntimeException& ) 216*b1cdbd2cSJim Jagielski { 217*b1cdbd2cSJim Jagielski throw; 218*b1cdbd2cSJim Jagielski } 219*b1cdbd2cSJim Jagielski catch( const Exception& ) 220*b1cdbd2cSJim Jagielski { 221*b1cdbd2cSJim Jagielski } 222*b1cdbd2cSJim Jagielski } 223*b1cdbd2cSJim Jagielski } 224*b1cdbd2cSJim Jagielski break; 225*b1cdbd2cSJim Jagielski 226*b1cdbd2cSJim Jagielski case EVENT_MOUSEBUTTONDOWN: 227*b1cdbd2cSJim Jagielski case EVENT_MOUSEBUTTONUP: 228*b1cdbd2cSJim Jagielski { 229*b1cdbd2cSJim Jagielski MouseEvent aEvent; 230*b1cdbd2cSJim Jagielski lcl_initMouseEvent( aEvent, *_rEvent.GetMouseEvent() ); 231*b1cdbd2cSJim Jagielski if ( _rEvent.GetWindow() ) 232*b1cdbd2cSJim Jagielski aEvent.Source = _rEvent.GetWindow()->GetComponentInterface(); 233*b1cdbd2cSJim Jagielski 234*b1cdbd2cSJim Jagielski ::cppu::OInterfaceIteratorHelper aIterator( m_pData->m_aMouseClickHandlers ); 235*b1cdbd2cSJim Jagielski while ( aIterator.hasMoreElements() ) 236*b1cdbd2cSJim Jagielski { 237*b1cdbd2cSJim Jagielski Reference< XMouseClickHandler > xHandler( static_cast< XMouseClickHandler* >( aIterator.next() ) ); 238*b1cdbd2cSJim Jagielski if ( !xHandler.is() ) 239*b1cdbd2cSJim Jagielski continue; 240*b1cdbd2cSJim Jagielski 241*b1cdbd2cSJim Jagielski try 242*b1cdbd2cSJim Jagielski { 243*b1cdbd2cSJim Jagielski if ( nType == EVENT_MOUSEBUTTONDOWN ) 244*b1cdbd2cSJim Jagielski bHandled = xHandler->mousePressed( aEvent ); 245*b1cdbd2cSJim Jagielski else 246*b1cdbd2cSJim Jagielski bHandled = xHandler->mouseReleased( aEvent ); 247*b1cdbd2cSJim Jagielski } 248*b1cdbd2cSJim Jagielski catch( const DisposedException& e ) 249*b1cdbd2cSJim Jagielski { 250*b1cdbd2cSJim Jagielski if ( e.Context == xHandler ) 251*b1cdbd2cSJim Jagielski aIterator.remove(); 252*b1cdbd2cSJim Jagielski } 253*b1cdbd2cSJim Jagielski catch( const RuntimeException& ) 254*b1cdbd2cSJim Jagielski { 255*b1cdbd2cSJim Jagielski throw; 256*b1cdbd2cSJim Jagielski } 257*b1cdbd2cSJim Jagielski catch( const Exception& ) 258*b1cdbd2cSJim Jagielski { 259*b1cdbd2cSJim Jagielski } 260*b1cdbd2cSJim Jagielski } 261*b1cdbd2cSJim Jagielski } 262*b1cdbd2cSJim Jagielski break; 263*b1cdbd2cSJim Jagielski 264*b1cdbd2cSJim Jagielski default: 265*b1cdbd2cSJim Jagielski OSL_ENSURE( false, "UserInputInterception::handleNotifyEvent: illegal event type!" ); 266*b1cdbd2cSJim Jagielski break; 267*b1cdbd2cSJim Jagielski } 268*b1cdbd2cSJim Jagielski 269*b1cdbd2cSJim Jagielski return bHandled; 270*b1cdbd2cSJim Jagielski } 271*b1cdbd2cSJim Jagielski 272*b1cdbd2cSJim Jagielski //........................................................................ 273*b1cdbd2cSJim Jagielski } // namespace sfx2 274*b1cdbd2cSJim Jagielski //........................................................................ 275