1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_vcl.hxx" 30*cdf0e10cSrcweir 31*cdf0e10cSrcweir #include <tools/debug.hxx> 32*cdf0e10cSrcweir 33*cdf0e10cSrcweir #include <unotools/localedatawrapper.hxx> 34*cdf0e10cSrcweir 35*cdf0e10cSrcweir #include <vcl/i18nhelp.hxx> 36*cdf0e10cSrcweir #include <vcl/unohelp.hxx> 37*cdf0e10cSrcweir #include <vcl/timer.hxx> 38*cdf0e10cSrcweir #include <vcl/event.hxx> 39*cdf0e10cSrcweir #include <vcl/sound.hxx> 40*cdf0e10cSrcweir #include <vcl/settings.hxx> 41*cdf0e10cSrcweir #include <vcl/svapp.hxx> 42*cdf0e10cSrcweir #include <vcl/cursor.hxx> 43*cdf0e10cSrcweir #include <vcl/wrkwin.hxx> 44*cdf0e10cSrcweir #include <vcl/floatwin.hxx> 45*cdf0e10cSrcweir #include <vcl/dialog.hxx> 46*cdf0e10cSrcweir #include <vcl/help.hxx> 47*cdf0e10cSrcweir #include <vcl/dockwin.hxx> 48*cdf0e10cSrcweir #include <vcl/menu.hxx> 49*cdf0e10cSrcweir 50*cdf0e10cSrcweir #include <svdata.hxx> 51*cdf0e10cSrcweir #include <dbggui.hxx> 52*cdf0e10cSrcweir #include <salwtype.hxx> 53*cdf0e10cSrcweir #include <salframe.hxx> 54*cdf0e10cSrcweir #include <accmgr.hxx> 55*cdf0e10cSrcweir #include <print.h> 56*cdf0e10cSrcweir #include <window.h> 57*cdf0e10cSrcweir #include <helpwin.hxx> 58*cdf0e10cSrcweir #include <brdwin.hxx> 59*cdf0e10cSrcweir #include <salgdi.hxx> 60*cdf0e10cSrcweir #include <dndlcon.hxx> 61*cdf0e10cSrcweir 62*cdf0e10cSrcweir #include <com/sun/star/datatransfer/dnd/XDragSource.hpp> 63*cdf0e10cSrcweir #include <com/sun/star/awt/MouseEvent.hpp> 64*cdf0e10cSrcweir 65*cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1 66*cdf0e10cSrcweir char dbgbuffer[1024]; 67*cdf0e10cSrcweir #ifndef WNT 68*cdf0e10cSrcweir #include <stdio.h> 69*cdf0e10cSrcweir #define MyOutputDebugString(s) (fprintf(stderr, s )) 70*cdf0e10cSrcweir #else 71*cdf0e10cSrcweir extern void MyOutputDebugString( char *s); 72*cdf0e10cSrcweir #endif 73*cdf0e10cSrcweir #endif 74*cdf0e10cSrcweir 75*cdf0e10cSrcweir 76*cdf0e10cSrcweir // ======================================================================= 77*cdf0e10cSrcweir 78*cdf0e10cSrcweir #define IMPL_MIN_NEEDSYSWIN 49 79*cdf0e10cSrcweir 80*cdf0e10cSrcweir // ======================================================================= 81*cdf0e10cSrcweir 82*cdf0e10cSrcweir long ImplCallPreNotify( NotifyEvent& rEvt ) 83*cdf0e10cSrcweir { 84*cdf0e10cSrcweir long nRet = Application::CallEventHooks( rEvt ); 85*cdf0e10cSrcweir if ( !nRet ) 86*cdf0e10cSrcweir nRet = rEvt.GetWindow()->PreNotify( rEvt ); 87*cdf0e10cSrcweir return nRet; 88*cdf0e10cSrcweir } 89*cdf0e10cSrcweir 90*cdf0e10cSrcweir // ======================================================================= 91*cdf0e10cSrcweir 92*cdf0e10cSrcweir long ImplCallEvent( NotifyEvent& rEvt ) 93*cdf0e10cSrcweir { 94*cdf0e10cSrcweir long nRet = ImplCallPreNotify( rEvt ); 95*cdf0e10cSrcweir if ( !nRet ) 96*cdf0e10cSrcweir { 97*cdf0e10cSrcweir Window* pWindow = rEvt.GetWindow(); 98*cdf0e10cSrcweir switch ( rEvt.GetType() ) 99*cdf0e10cSrcweir { 100*cdf0e10cSrcweir case EVENT_MOUSEBUTTONDOWN: 101*cdf0e10cSrcweir pWindow->MouseButtonDown( *rEvt.GetMouseEvent() ); 102*cdf0e10cSrcweir break; 103*cdf0e10cSrcweir case EVENT_MOUSEBUTTONUP: 104*cdf0e10cSrcweir pWindow->MouseButtonUp( *rEvt.GetMouseEvent() ); 105*cdf0e10cSrcweir break; 106*cdf0e10cSrcweir case EVENT_MOUSEMOVE: 107*cdf0e10cSrcweir pWindow->MouseMove( *rEvt.GetMouseEvent() ); 108*cdf0e10cSrcweir break; 109*cdf0e10cSrcweir case EVENT_KEYINPUT: 110*cdf0e10cSrcweir pWindow->KeyInput( *rEvt.GetKeyEvent() ); 111*cdf0e10cSrcweir break; 112*cdf0e10cSrcweir case EVENT_KEYUP: 113*cdf0e10cSrcweir pWindow->KeyUp( *rEvt.GetKeyEvent() ); 114*cdf0e10cSrcweir break; 115*cdf0e10cSrcweir case EVENT_GETFOCUS: 116*cdf0e10cSrcweir pWindow->GetFocus(); 117*cdf0e10cSrcweir break; 118*cdf0e10cSrcweir case EVENT_LOSEFOCUS: 119*cdf0e10cSrcweir pWindow->LoseFocus(); 120*cdf0e10cSrcweir break; 121*cdf0e10cSrcweir case EVENT_COMMAND: 122*cdf0e10cSrcweir pWindow->Command( *rEvt.GetCommandEvent() ); 123*cdf0e10cSrcweir break; 124*cdf0e10cSrcweir } 125*cdf0e10cSrcweir } 126*cdf0e10cSrcweir 127*cdf0e10cSrcweir return nRet; 128*cdf0e10cSrcweir } 129*cdf0e10cSrcweir 130*cdf0e10cSrcweir // ======================================================================= 131*cdf0e10cSrcweir 132*cdf0e10cSrcweir static sal_Bool ImplHandleMouseFloatMode( Window* pChild, const Point& rMousePos, 133*cdf0e10cSrcweir sal_uInt16 nCode, sal_uInt16 nSVEvent, 134*cdf0e10cSrcweir sal_Bool bMouseLeave ) 135*cdf0e10cSrcweir { 136*cdf0e10cSrcweir ImplSVData* pSVData = ImplGetSVData(); 137*cdf0e10cSrcweir 138*cdf0e10cSrcweir if ( pSVData->maWinData.mpFirstFloat && !pSVData->maWinData.mpCaptureWin && 139*cdf0e10cSrcweir !pSVData->maWinData.mpFirstFloat->ImplIsFloatPopupModeWindow( pChild ) ) 140*cdf0e10cSrcweir { 141*cdf0e10cSrcweir /* 142*cdf0e10cSrcweir * #93895# since floats are system windows, coordinates have 143*cdf0e10cSrcweir * to be converted to float relative for the hittest 144*cdf0e10cSrcweir */ 145*cdf0e10cSrcweir sal_uInt16 nHitTest = IMPL_FLOATWIN_HITTEST_OUTSIDE; 146*cdf0e10cSrcweir FloatingWindow* pFloat = pSVData->maWinData.mpFirstFloat->ImplFloatHitTest( pChild, rMousePos, nHitTest ); 147*cdf0e10cSrcweir FloatingWindow* pLastLevelFloat; 148*cdf0e10cSrcweir sal_uLong nPopupFlags; 149*cdf0e10cSrcweir if ( nSVEvent == EVENT_MOUSEMOVE ) 150*cdf0e10cSrcweir { 151*cdf0e10cSrcweir if ( bMouseLeave ) 152*cdf0e10cSrcweir return sal_True; 153*cdf0e10cSrcweir 154*cdf0e10cSrcweir if ( !pFloat || (nHitTest & IMPL_FLOATWIN_HITTEST_RECT) ) 155*cdf0e10cSrcweir { 156*cdf0e10cSrcweir if ( pSVData->maHelpData.mpHelpWin && !pSVData->maHelpData.mbKeyboardHelp ) 157*cdf0e10cSrcweir ImplDestroyHelpWindow( true ); 158*cdf0e10cSrcweir pChild->ImplGetFrame()->SetPointer( POINTER_ARROW ); 159*cdf0e10cSrcweir return sal_True; 160*cdf0e10cSrcweir } 161*cdf0e10cSrcweir } 162*cdf0e10cSrcweir else 163*cdf0e10cSrcweir { 164*cdf0e10cSrcweir if ( nCode & MOUSE_LEFT ) 165*cdf0e10cSrcweir { 166*cdf0e10cSrcweir if ( nSVEvent == EVENT_MOUSEBUTTONDOWN ) 167*cdf0e10cSrcweir { 168*cdf0e10cSrcweir if ( !pFloat ) 169*cdf0e10cSrcweir { 170*cdf0e10cSrcweir pLastLevelFloat = pSVData->maWinData.mpFirstFloat->ImplFindLastLevelFloat(); 171*cdf0e10cSrcweir nPopupFlags = pLastLevelFloat->GetPopupModeFlags(); 172*cdf0e10cSrcweir pLastLevelFloat->EndPopupMode( FLOATWIN_POPUPMODEEND_CANCEL | FLOATWIN_POPUPMODEEND_CLOSEALL ); 173*cdf0e10cSrcweir // Erstmal ausgebaut als Hack fuer Bug 53378 174*cdf0e10cSrcweir // if ( nPopupFlags & FLOATWIN_POPUPMODE_PATHMOUSECANCELCLICK ) 175*cdf0e10cSrcweir // return sal_False; 176*cdf0e10cSrcweir // else 177*cdf0e10cSrcweir return sal_True; 178*cdf0e10cSrcweir } 179*cdf0e10cSrcweir else if ( nHitTest & IMPL_FLOATWIN_HITTEST_RECT ) 180*cdf0e10cSrcweir { 181*cdf0e10cSrcweir if ( !(pFloat->GetPopupModeFlags() & FLOATWIN_POPUPMODE_NOMOUSERECTCLOSE) ) 182*cdf0e10cSrcweir pFloat->ImplSetMouseDown(); 183*cdf0e10cSrcweir return sal_True; 184*cdf0e10cSrcweir } 185*cdf0e10cSrcweir } 186*cdf0e10cSrcweir else 187*cdf0e10cSrcweir { 188*cdf0e10cSrcweir if ( pFloat ) 189*cdf0e10cSrcweir { 190*cdf0e10cSrcweir if ( nHitTest & IMPL_FLOATWIN_HITTEST_RECT ) 191*cdf0e10cSrcweir { 192*cdf0e10cSrcweir if ( pFloat->ImplIsMouseDown() ) 193*cdf0e10cSrcweir pFloat->EndPopupMode( FLOATWIN_POPUPMODEEND_CANCEL ); 194*cdf0e10cSrcweir return sal_True; 195*cdf0e10cSrcweir } 196*cdf0e10cSrcweir } 197*cdf0e10cSrcweir else 198*cdf0e10cSrcweir { 199*cdf0e10cSrcweir pLastLevelFloat = pSVData->maWinData.mpFirstFloat->ImplFindLastLevelFloat(); 200*cdf0e10cSrcweir nPopupFlags = pLastLevelFloat->GetPopupModeFlags(); 201*cdf0e10cSrcweir if ( !(nPopupFlags & FLOATWIN_POPUPMODE_NOMOUSEUPCLOSE) ) 202*cdf0e10cSrcweir { 203*cdf0e10cSrcweir pLastLevelFloat->EndPopupMode( FLOATWIN_POPUPMODEEND_CANCEL | FLOATWIN_POPUPMODEEND_CLOSEALL ); 204*cdf0e10cSrcweir return sal_True; 205*cdf0e10cSrcweir } 206*cdf0e10cSrcweir } 207*cdf0e10cSrcweir } 208*cdf0e10cSrcweir } 209*cdf0e10cSrcweir else 210*cdf0e10cSrcweir { 211*cdf0e10cSrcweir if ( !pFloat ) 212*cdf0e10cSrcweir { 213*cdf0e10cSrcweir pLastLevelFloat = pSVData->maWinData.mpFirstFloat->ImplFindLastLevelFloat(); 214*cdf0e10cSrcweir nPopupFlags = pLastLevelFloat->GetPopupModeFlags(); 215*cdf0e10cSrcweir if ( nPopupFlags & FLOATWIN_POPUPMODE_ALLMOUSEBUTTONCLOSE ) 216*cdf0e10cSrcweir { 217*cdf0e10cSrcweir if ( (nPopupFlags & FLOATWIN_POPUPMODE_NOMOUSEUPCLOSE) && 218*cdf0e10cSrcweir (nSVEvent == EVENT_MOUSEBUTTONUP) ) 219*cdf0e10cSrcweir return sal_True; 220*cdf0e10cSrcweir pLastLevelFloat->EndPopupMode( FLOATWIN_POPUPMODEEND_CANCEL | FLOATWIN_POPUPMODEEND_CLOSEALL ); 221*cdf0e10cSrcweir if ( nPopupFlags & FLOATWIN_POPUPMODE_PATHMOUSECANCELCLICK ) 222*cdf0e10cSrcweir return sal_False; 223*cdf0e10cSrcweir else 224*cdf0e10cSrcweir return sal_True; 225*cdf0e10cSrcweir } 226*cdf0e10cSrcweir else 227*cdf0e10cSrcweir return sal_True; 228*cdf0e10cSrcweir } 229*cdf0e10cSrcweir } 230*cdf0e10cSrcweir } 231*cdf0e10cSrcweir } 232*cdf0e10cSrcweir 233*cdf0e10cSrcweir return sal_False; 234*cdf0e10cSrcweir } 235*cdf0e10cSrcweir 236*cdf0e10cSrcweir // ----------------------------------------------------------------------- 237*cdf0e10cSrcweir 238*cdf0e10cSrcweir static void ImplHandleMouseHelpRequest( Window* pChild, const Point& rMousePos ) 239*cdf0e10cSrcweir { 240*cdf0e10cSrcweir ImplSVData* pSVData = ImplGetSVData(); 241*cdf0e10cSrcweir if ( !pSVData->maHelpData.mpHelpWin || 242*cdf0e10cSrcweir !( pSVData->maHelpData.mpHelpWin->IsWindowOrChild( pChild ) || 243*cdf0e10cSrcweir pChild->IsWindowOrChild( pSVData->maHelpData.mpHelpWin ) ) ) 244*cdf0e10cSrcweir { 245*cdf0e10cSrcweir sal_uInt16 nHelpMode = 0; 246*cdf0e10cSrcweir if ( pSVData->maHelpData.mbQuickHelp ) 247*cdf0e10cSrcweir nHelpMode = HELPMODE_QUICK; 248*cdf0e10cSrcweir if ( pSVData->maHelpData.mbBalloonHelp ) 249*cdf0e10cSrcweir nHelpMode |= HELPMODE_BALLOON; 250*cdf0e10cSrcweir if ( nHelpMode ) 251*cdf0e10cSrcweir { 252*cdf0e10cSrcweir if ( pChild->IsInputEnabled() && ! pChild->IsInModalMode() ) 253*cdf0e10cSrcweir { 254*cdf0e10cSrcweir HelpEvent aHelpEvent( rMousePos, nHelpMode ); 255*cdf0e10cSrcweir pSVData->maHelpData.mbRequestingHelp = sal_True; 256*cdf0e10cSrcweir pChild->RequestHelp( aHelpEvent ); 257*cdf0e10cSrcweir pSVData->maHelpData.mbRequestingHelp = sal_False; 258*cdf0e10cSrcweir } 259*cdf0e10cSrcweir // #104172# do not kill keyboard activated tooltips 260*cdf0e10cSrcweir else if ( pSVData->maHelpData.mpHelpWin && !pSVData->maHelpData.mbKeyboardHelp) 261*cdf0e10cSrcweir { 262*cdf0e10cSrcweir ImplDestroyHelpWindow( true ); 263*cdf0e10cSrcweir } 264*cdf0e10cSrcweir } 265*cdf0e10cSrcweir } 266*cdf0e10cSrcweir } 267*cdf0e10cSrcweir 268*cdf0e10cSrcweir // ----------------------------------------------------------------------- 269*cdf0e10cSrcweir 270*cdf0e10cSrcweir static void ImplSetMousePointer( Window* pChild ) 271*cdf0e10cSrcweir { 272*cdf0e10cSrcweir ImplSVData* pSVData = ImplGetSVData(); 273*cdf0e10cSrcweir if ( pSVData->maHelpData.mbExtHelpMode ) 274*cdf0e10cSrcweir pChild->ImplGetFrame()->SetPointer( POINTER_HELP ); 275*cdf0e10cSrcweir else 276*cdf0e10cSrcweir pChild->ImplGetFrame()->SetPointer( pChild->ImplGetMousePointer() ); 277*cdf0e10cSrcweir } 278*cdf0e10cSrcweir 279*cdf0e10cSrcweir // ----------------------------------------------------------------------- 280*cdf0e10cSrcweir 281*cdf0e10cSrcweir static sal_Bool ImplCallCommand( Window* pChild, sal_uInt16 nEvt, void* pData = NULL, 282*cdf0e10cSrcweir sal_Bool bMouse = sal_False, Point* pPos = NULL ) 283*cdf0e10cSrcweir { 284*cdf0e10cSrcweir Point aPos; 285*cdf0e10cSrcweir if ( pPos ) 286*cdf0e10cSrcweir aPos = *pPos; 287*cdf0e10cSrcweir else 288*cdf0e10cSrcweir { 289*cdf0e10cSrcweir if( bMouse ) 290*cdf0e10cSrcweir aPos = pChild->GetPointerPosPixel(); 291*cdf0e10cSrcweir else 292*cdf0e10cSrcweir { 293*cdf0e10cSrcweir // simulate mouseposition at center of window 294*cdf0e10cSrcweir Size aSize( pChild->GetOutputSizePixel() ); 295*cdf0e10cSrcweir aPos = Point( aSize.getWidth()/2, aSize.getHeight()/2 ); 296*cdf0e10cSrcweir } 297*cdf0e10cSrcweir } 298*cdf0e10cSrcweir 299*cdf0e10cSrcweir CommandEvent aCEvt( aPos, nEvt, bMouse, pData ); 300*cdf0e10cSrcweir NotifyEvent aNCmdEvt( EVENT_COMMAND, pChild, &aCEvt ); 301*cdf0e10cSrcweir ImplDelData aDelData( pChild ); 302*cdf0e10cSrcweir sal_Bool bPreNotify = (ImplCallPreNotify( aNCmdEvt ) != 0); 303*cdf0e10cSrcweir if ( aDelData.IsDelete() ) 304*cdf0e10cSrcweir return sal_False; 305*cdf0e10cSrcweir if ( !bPreNotify ) 306*cdf0e10cSrcweir { 307*cdf0e10cSrcweir pChild->ImplGetWindowImpl()->mbCommand = sal_False; 308*cdf0e10cSrcweir pChild->Command( aCEvt ); 309*cdf0e10cSrcweir 310*cdf0e10cSrcweir if( aDelData.IsDelete() ) 311*cdf0e10cSrcweir return sal_False; 312*cdf0e10cSrcweir pChild->ImplNotifyKeyMouseCommandEventListeners( aNCmdEvt ); 313*cdf0e10cSrcweir if ( aDelData.IsDelete() ) 314*cdf0e10cSrcweir return sal_False; 315*cdf0e10cSrcweir if ( pChild->ImplGetWindowImpl()->mbCommand ) 316*cdf0e10cSrcweir return sal_True; 317*cdf0e10cSrcweir } 318*cdf0e10cSrcweir 319*cdf0e10cSrcweir return sal_False; 320*cdf0e10cSrcweir } 321*cdf0e10cSrcweir 322*cdf0e10cSrcweir // ----------------------------------------------------------------------- 323*cdf0e10cSrcweir 324*cdf0e10cSrcweir /* #i34277# delayed context menu activation; 325*cdf0e10cSrcweir * necessary if there already was a popup menu running. 326*cdf0e10cSrcweir */ 327*cdf0e10cSrcweir 328*cdf0e10cSrcweir struct ContextMenuEvent 329*cdf0e10cSrcweir { 330*cdf0e10cSrcweir Window* pWindow; 331*cdf0e10cSrcweir ImplDelData aDelData; 332*cdf0e10cSrcweir Point aChildPos; 333*cdf0e10cSrcweir }; 334*cdf0e10cSrcweir 335*cdf0e10cSrcweir static long ContextMenuEventLink( void* pCEvent, void* ) 336*cdf0e10cSrcweir { 337*cdf0e10cSrcweir ContextMenuEvent* pEv = (ContextMenuEvent*)pCEvent; 338*cdf0e10cSrcweir 339*cdf0e10cSrcweir if( ! pEv->aDelData.IsDelete() ) 340*cdf0e10cSrcweir { 341*cdf0e10cSrcweir pEv->pWindow->ImplRemoveDel( &pEv->aDelData ); 342*cdf0e10cSrcweir ImplCallCommand( pEv->pWindow, COMMAND_CONTEXTMENU, NULL, sal_True, &pEv->aChildPos ); 343*cdf0e10cSrcweir } 344*cdf0e10cSrcweir delete pEv; 345*cdf0e10cSrcweir 346*cdf0e10cSrcweir return 0; 347*cdf0e10cSrcweir } 348*cdf0e10cSrcweir 349*cdf0e10cSrcweir long ImplHandleMouseEvent( Window* pWindow, sal_uInt16 nSVEvent, sal_Bool bMouseLeave, 350*cdf0e10cSrcweir long nX, long nY, sal_uLong nMsgTime, 351*cdf0e10cSrcweir sal_uInt16 nCode, sal_uInt16 nMode ) 352*cdf0e10cSrcweir { 353*cdf0e10cSrcweir ImplSVData* pSVData = ImplGetSVData(); 354*cdf0e10cSrcweir Point aMousePos( nX, nY ); 355*cdf0e10cSrcweir Window* pChild; 356*cdf0e10cSrcweir long nRet; 357*cdf0e10cSrcweir sal_uInt16 nClicks; 358*cdf0e10cSrcweir ImplFrameData* pWinFrameData = pWindow->ImplGetFrameData(); 359*cdf0e10cSrcweir sal_uInt16 nOldCode = pWinFrameData->mnMouseCode; 360*cdf0e10cSrcweir 361*cdf0e10cSrcweir // we need a mousemove event, befor we get a mousebuttondown or a 362*cdf0e10cSrcweir // mousebuttonup event 363*cdf0e10cSrcweir if ( (nSVEvent == EVENT_MOUSEBUTTONDOWN) || 364*cdf0e10cSrcweir (nSVEvent == EVENT_MOUSEBUTTONUP) ) 365*cdf0e10cSrcweir { 366*cdf0e10cSrcweir if ( (nSVEvent == EVENT_MOUSEBUTTONUP) && pSVData->maHelpData.mbExtHelpMode ) 367*cdf0e10cSrcweir Help::EndExtHelp(); 368*cdf0e10cSrcweir if ( pSVData->maHelpData.mpHelpWin ) 369*cdf0e10cSrcweir { 370*cdf0e10cSrcweir if( pWindow->ImplGetWindow() == pSVData->maHelpData.mpHelpWin ) 371*cdf0e10cSrcweir { 372*cdf0e10cSrcweir ImplDestroyHelpWindow( false ); 373*cdf0e10cSrcweir return 1; // pWindow is dead now - avoid crash! 374*cdf0e10cSrcweir } 375*cdf0e10cSrcweir else 376*cdf0e10cSrcweir ImplDestroyHelpWindow( true ); 377*cdf0e10cSrcweir } 378*cdf0e10cSrcweir 379*cdf0e10cSrcweir if ( (pWinFrameData->mnLastMouseX != nX) || 380*cdf0e10cSrcweir (pWinFrameData->mnLastMouseY != nY) ) 381*cdf0e10cSrcweir { 382*cdf0e10cSrcweir ImplHandleMouseEvent( pWindow, EVENT_MOUSEMOVE, sal_False, nX, nY, nMsgTime, nCode, nMode ); 383*cdf0e10cSrcweir } 384*cdf0e10cSrcweir } 385*cdf0e10cSrcweir 386*cdf0e10cSrcweir // update frame data 387*cdf0e10cSrcweir pWinFrameData->mnBeforeLastMouseX = pWinFrameData->mnLastMouseX; 388*cdf0e10cSrcweir pWinFrameData->mnBeforeLastMouseY = pWinFrameData->mnLastMouseY; 389*cdf0e10cSrcweir pWinFrameData->mnLastMouseX = nX; 390*cdf0e10cSrcweir pWinFrameData->mnLastMouseY = nY; 391*cdf0e10cSrcweir pWinFrameData->mnMouseCode = nCode; 392*cdf0e10cSrcweir pWinFrameData->mnMouseMode = nMode & ~(MOUSE_SYNTHETIC | MOUSE_MODIFIERCHANGED); 393*cdf0e10cSrcweir if ( bMouseLeave ) 394*cdf0e10cSrcweir { 395*cdf0e10cSrcweir pWinFrameData->mbMouseIn = sal_False; 396*cdf0e10cSrcweir if ( pSVData->maHelpData.mpHelpWin && !pSVData->maHelpData.mbKeyboardHelp ) 397*cdf0e10cSrcweir { 398*cdf0e10cSrcweir ImplDelData aDelData( pWindow ); 399*cdf0e10cSrcweir 400*cdf0e10cSrcweir ImplDestroyHelpWindow( true ); 401*cdf0e10cSrcweir 402*cdf0e10cSrcweir if ( aDelData.IsDelete() ) 403*cdf0e10cSrcweir return 1; // pWindow is dead now - avoid crash! (#122045#) 404*cdf0e10cSrcweir } 405*cdf0e10cSrcweir } 406*cdf0e10cSrcweir else 407*cdf0e10cSrcweir pWinFrameData->mbMouseIn = sal_True; 408*cdf0e10cSrcweir 409*cdf0e10cSrcweir DBG_ASSERT( !pSVData->maWinData.mpTrackWin || 410*cdf0e10cSrcweir (pSVData->maWinData.mpTrackWin == pSVData->maWinData.mpCaptureWin), 411*cdf0e10cSrcweir "ImplHandleMouseEvent: TrackWin != CaptureWin" ); 412*cdf0e10cSrcweir 413*cdf0e10cSrcweir // AutoScrollMode 414*cdf0e10cSrcweir if ( pSVData->maWinData.mpAutoScrollWin && (nSVEvent == EVENT_MOUSEBUTTONDOWN) ) 415*cdf0e10cSrcweir { 416*cdf0e10cSrcweir pSVData->maWinData.mpAutoScrollWin->EndAutoScroll(); 417*cdf0e10cSrcweir return 1; 418*cdf0e10cSrcweir } 419*cdf0e10cSrcweir 420*cdf0e10cSrcweir // find mouse window 421*cdf0e10cSrcweir if ( pSVData->maWinData.mpCaptureWin ) 422*cdf0e10cSrcweir { 423*cdf0e10cSrcweir pChild = pSVData->maWinData.mpCaptureWin; 424*cdf0e10cSrcweir 425*cdf0e10cSrcweir DBG_ASSERT( pWindow == pChild->ImplGetFrameWindow(), 426*cdf0e10cSrcweir "ImplHandleMouseEvent: mouse event is not sent to capture window" ); 427*cdf0e10cSrcweir 428*cdf0e10cSrcweir // java client cannot capture mouse correctly 429*cdf0e10cSrcweir if ( pWindow != pChild->ImplGetFrameWindow() ) 430*cdf0e10cSrcweir return 0; 431*cdf0e10cSrcweir 432*cdf0e10cSrcweir if ( bMouseLeave ) 433*cdf0e10cSrcweir return 0; 434*cdf0e10cSrcweir } 435*cdf0e10cSrcweir else 436*cdf0e10cSrcweir { 437*cdf0e10cSrcweir if ( bMouseLeave ) 438*cdf0e10cSrcweir pChild = NULL; 439*cdf0e10cSrcweir else 440*cdf0e10cSrcweir pChild = pWindow->ImplFindWindow( aMousePos ); 441*cdf0e10cSrcweir } 442*cdf0e10cSrcweir 443*cdf0e10cSrcweir // test this because mouse events are buffered in the remote version 444*cdf0e10cSrcweir // and size may not be in sync 445*cdf0e10cSrcweir if ( !pChild && !bMouseLeave ) 446*cdf0e10cSrcweir return 0; 447*cdf0e10cSrcweir 448*cdf0e10cSrcweir // Ein paar Test ausfuehren und Message abfangen oder Status umsetzen 449*cdf0e10cSrcweir if ( pChild ) 450*cdf0e10cSrcweir { 451*cdf0e10cSrcweir if( pChild->ImplIsAntiparallel() ) 452*cdf0e10cSrcweir { 453*cdf0e10cSrcweir // - RTL - re-mirror frame pos at pChild 454*cdf0e10cSrcweir pChild->ImplReMirror( aMousePos ); 455*cdf0e10cSrcweir } 456*cdf0e10cSrcweir // no mouse messages to system object windows ? 457*cdf0e10cSrcweir // !!!KA: Is it OK to comment this out? !!! 458*cdf0e10cSrcweir // if ( pChild->ImplGetWindowImpl()->mpSysObj ) 459*cdf0e10cSrcweir // return 0; 460*cdf0e10cSrcweir 461*cdf0e10cSrcweir // no mouse messages to disabled windows 462*cdf0e10cSrcweir // #106845# if the window was disabed during capturing we have to pass the mouse events to release capturing 463*cdf0e10cSrcweir if ( pSVData->maWinData.mpCaptureWin != pChild && (!pChild->IsEnabled() || !pChild->IsInputEnabled() || pChild->IsInModalMode() ) ) 464*cdf0e10cSrcweir { 465*cdf0e10cSrcweir ImplHandleMouseFloatMode( pChild, aMousePos, nCode, nSVEvent, bMouseLeave ); 466*cdf0e10cSrcweir if ( nSVEvent == EVENT_MOUSEMOVE ) 467*cdf0e10cSrcweir { 468*cdf0e10cSrcweir ImplHandleMouseHelpRequest( pChild, aMousePos ); 469*cdf0e10cSrcweir if( pWinFrameData->mpMouseMoveWin != pChild ) 470*cdf0e10cSrcweir nMode |= MOUSE_ENTERWINDOW; 471*cdf0e10cSrcweir } 472*cdf0e10cSrcweir 473*cdf0e10cSrcweir // Call the hook also, if Window is disabled 474*cdf0e10cSrcweir Point aChildPos = pChild->ImplFrameToOutput( aMousePos ); 475*cdf0e10cSrcweir MouseEvent aMEvt( aChildPos, pWinFrameData->mnClickCount, nMode, nCode, nCode ); 476*cdf0e10cSrcweir NotifyEvent aNEvt( nSVEvent, pChild, &aMEvt ); 477*cdf0e10cSrcweir Application::CallEventHooks( aNEvt ); 478*cdf0e10cSrcweir 479*cdf0e10cSrcweir if( pChild->IsCallHandlersOnInputDisabled() ) 480*cdf0e10cSrcweir { 481*cdf0e10cSrcweir pWinFrameData->mpMouseMoveWin = pChild; 482*cdf0e10cSrcweir pChild->ImplNotifyKeyMouseCommandEventListeners( aNEvt ); 483*cdf0e10cSrcweir } 484*cdf0e10cSrcweir 485*cdf0e10cSrcweir if ( nSVEvent == EVENT_MOUSEBUTTONDOWN ) 486*cdf0e10cSrcweir { 487*cdf0e10cSrcweir Sound::Beep( SOUND_DISABLE, pChild ); 488*cdf0e10cSrcweir return 1; 489*cdf0e10cSrcweir } 490*cdf0e10cSrcweir else 491*cdf0e10cSrcweir { 492*cdf0e10cSrcweir // Set normal MousePointer for disabled windows 493*cdf0e10cSrcweir if ( nSVEvent == EVENT_MOUSEMOVE ) 494*cdf0e10cSrcweir ImplSetMousePointer( pChild ); 495*cdf0e10cSrcweir 496*cdf0e10cSrcweir return 0; 497*cdf0e10cSrcweir } 498*cdf0e10cSrcweir } 499*cdf0e10cSrcweir 500*cdf0e10cSrcweir // End ExtTextInput-Mode, if the user click in the same TopLevel Window 501*cdf0e10cSrcweir if ( pSVData->maWinData.mpExtTextInputWin && 502*cdf0e10cSrcweir ((nSVEvent == EVENT_MOUSEBUTTONDOWN) || 503*cdf0e10cSrcweir (nSVEvent == EVENT_MOUSEBUTTONUP)) ) 504*cdf0e10cSrcweir pSVData->maWinData.mpExtTextInputWin->EndExtTextInput( EXTTEXTINPUT_END_COMPLETE ); 505*cdf0e10cSrcweir } 506*cdf0e10cSrcweir 507*cdf0e10cSrcweir // determine mouse event data 508*cdf0e10cSrcweir if ( nSVEvent == EVENT_MOUSEMOVE ) 509*cdf0e10cSrcweir { 510*cdf0e10cSrcweir // Testen, ob MouseMove an das gleiche Fenster geht und sich der 511*cdf0e10cSrcweir // Status nicht geaendert hat 512*cdf0e10cSrcweir if ( pChild ) 513*cdf0e10cSrcweir { 514*cdf0e10cSrcweir Point aChildMousePos = pChild->ImplFrameToOutput( aMousePos ); 515*cdf0e10cSrcweir if ( !bMouseLeave && 516*cdf0e10cSrcweir (pChild == pWinFrameData->mpMouseMoveWin) && 517*cdf0e10cSrcweir (aChildMousePos.X() == pWinFrameData->mnLastMouseWinX) && 518*cdf0e10cSrcweir (aChildMousePos.Y() == pWinFrameData->mnLastMouseWinY) && 519*cdf0e10cSrcweir (nOldCode == pWinFrameData->mnMouseCode) ) 520*cdf0e10cSrcweir { 521*cdf0e10cSrcweir // Mouse-Pointer neu setzen, da er sich geaendet haben 522*cdf0e10cSrcweir // koennte, da ein Modus umgesetzt wurde 523*cdf0e10cSrcweir ImplSetMousePointer( pChild ); 524*cdf0e10cSrcweir return 0; 525*cdf0e10cSrcweir } 526*cdf0e10cSrcweir 527*cdf0e10cSrcweir pWinFrameData->mnLastMouseWinX = aChildMousePos.X(); 528*cdf0e10cSrcweir pWinFrameData->mnLastMouseWinY = aChildMousePos.Y(); 529*cdf0e10cSrcweir } 530*cdf0e10cSrcweir 531*cdf0e10cSrcweir // mouse click 532*cdf0e10cSrcweir nClicks = pWinFrameData->mnClickCount; 533*cdf0e10cSrcweir 534*cdf0e10cSrcweir // Gegebenenfalls den Start-Drag-Handler rufen. 535*cdf0e10cSrcweir // Achtung: Muss vor Move gerufen werden, da sonst bei schnellen 536*cdf0e10cSrcweir // Mausbewegungen die Applikationen in den Selektionszustand gehen. 537*cdf0e10cSrcweir Window* pMouseDownWin = pWinFrameData->mpMouseDownWin; 538*cdf0e10cSrcweir if ( pMouseDownWin ) 539*cdf0e10cSrcweir { 540*cdf0e10cSrcweir // Testen, ob StartDrag-Modus uebereinstimmt. Wir vergleichen nur 541*cdf0e10cSrcweir // den Status der Maustasten, damit man mit Mod1 z.B. sofort 542*cdf0e10cSrcweir // in den Kopiermodus gehen kann. 543*cdf0e10cSrcweir const MouseSettings& rMSettings = pMouseDownWin->GetSettings().GetMouseSettings(); 544*cdf0e10cSrcweir if ( (nCode & (MOUSE_LEFT | MOUSE_RIGHT | MOUSE_MIDDLE)) == 545*cdf0e10cSrcweir (rMSettings.GetStartDragCode() & (MOUSE_LEFT | MOUSE_RIGHT | MOUSE_MIDDLE)) ) 546*cdf0e10cSrcweir { 547*cdf0e10cSrcweir if ( !pMouseDownWin->ImplGetFrameData()->mbStartDragCalled ) 548*cdf0e10cSrcweir { 549*cdf0e10cSrcweir long nDragW = rMSettings.GetStartDragWidth(); 550*cdf0e10cSrcweir long nDragH = rMSettings.GetStartDragWidth(); 551*cdf0e10cSrcweir //long nMouseX = nX; 552*cdf0e10cSrcweir //long nMouseY = nY; 553*cdf0e10cSrcweir long nMouseX = aMousePos.X(); // #106074# use the possibly re-mirrored coordinates (RTL) ! nX,nY are unmodified ! 554*cdf0e10cSrcweir long nMouseY = aMousePos.Y(); 555*cdf0e10cSrcweir if ( !(((nMouseX-nDragW) <= pMouseDownWin->ImplGetFrameData()->mnFirstMouseX) && 556*cdf0e10cSrcweir ((nMouseX+nDragW) >= pMouseDownWin->ImplGetFrameData()->mnFirstMouseX)) || 557*cdf0e10cSrcweir !(((nMouseY-nDragH) <= pMouseDownWin->ImplGetFrameData()->mnFirstMouseY) && 558*cdf0e10cSrcweir ((nMouseY+nDragH) >= pMouseDownWin->ImplGetFrameData()->mnFirstMouseY)) ) 559*cdf0e10cSrcweir { 560*cdf0e10cSrcweir pMouseDownWin->ImplGetFrameData()->mbStartDragCalled = sal_True; 561*cdf0e10cSrcweir 562*cdf0e10cSrcweir // Check if drag source provides it's own recognizer 563*cdf0e10cSrcweir if( pMouseDownWin->ImplGetFrameData()->mbInternalDragGestureRecognizer ) 564*cdf0e10cSrcweir { 565*cdf0e10cSrcweir // query DropTarget from child window 566*cdf0e10cSrcweir ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::dnd::XDragGestureRecognizer > xDragGestureRecognizer = 567*cdf0e10cSrcweir ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::dnd::XDragGestureRecognizer > ( pMouseDownWin->ImplGetWindowImpl()->mxDNDListenerContainer, 568*cdf0e10cSrcweir ::com::sun::star::uno::UNO_QUERY ); 569*cdf0e10cSrcweir 570*cdf0e10cSrcweir if( xDragGestureRecognizer.is() ) 571*cdf0e10cSrcweir { 572*cdf0e10cSrcweir // retrieve mouse position relative to mouse down window 573*cdf0e10cSrcweir Point relLoc = pMouseDownWin->ImplFrameToOutput( Point( 574*cdf0e10cSrcweir pMouseDownWin->ImplGetFrameData()->mnFirstMouseX, 575*cdf0e10cSrcweir pMouseDownWin->ImplGetFrameData()->mnFirstMouseY ) ); 576*cdf0e10cSrcweir 577*cdf0e10cSrcweir // create a uno mouse event out of the available data 578*cdf0e10cSrcweir ::com::sun::star::awt::MouseEvent aMouseEvent( 579*cdf0e10cSrcweir static_cast < ::com::sun::star::uno::XInterface * > ( 0 ), 580*cdf0e10cSrcweir #ifdef MACOSX 581*cdf0e10cSrcweir nCode & (KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_MOD3), 582*cdf0e10cSrcweir #else 583*cdf0e10cSrcweir nCode & (KEY_SHIFT | KEY_MOD1 | KEY_MOD2), 584*cdf0e10cSrcweir #endif 585*cdf0e10cSrcweir nCode & (MOUSE_LEFT | MOUSE_RIGHT | MOUSE_MIDDLE), 586*cdf0e10cSrcweir nMouseX, 587*cdf0e10cSrcweir nMouseY, 588*cdf0e10cSrcweir nClicks, 589*cdf0e10cSrcweir sal_False ); 590*cdf0e10cSrcweir 591*cdf0e10cSrcweir sal_uLong nCount = Application::ReleaseSolarMutex(); 592*cdf0e10cSrcweir 593*cdf0e10cSrcweir // FIXME: where do I get Action from ? 594*cdf0e10cSrcweir ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::dnd::XDragSource > xDragSource = pMouseDownWin->GetDragSource(); 595*cdf0e10cSrcweir 596*cdf0e10cSrcweir if( xDragSource.is() ) 597*cdf0e10cSrcweir { 598*cdf0e10cSrcweir static_cast < DNDListenerContainer * > ( xDragGestureRecognizer.get() )->fireDragGestureEvent( 0, 599*cdf0e10cSrcweir relLoc.X(), relLoc.Y(), xDragSource, ::com::sun::star::uno::makeAny( aMouseEvent ) ); 600*cdf0e10cSrcweir } 601*cdf0e10cSrcweir 602*cdf0e10cSrcweir Application::AcquireSolarMutex( nCount ); 603*cdf0e10cSrcweir } 604*cdf0e10cSrcweir } 605*cdf0e10cSrcweir } 606*cdf0e10cSrcweir } 607*cdf0e10cSrcweir } 608*cdf0e10cSrcweir else 609*cdf0e10cSrcweir pMouseDownWin->ImplGetFrameData()->mbStartDragCalled = sal_True; 610*cdf0e10cSrcweir } 611*cdf0e10cSrcweir 612*cdf0e10cSrcweir // test for mouseleave and mouseenter 613*cdf0e10cSrcweir Window* pMouseMoveWin = pWinFrameData->mpMouseMoveWin; 614*cdf0e10cSrcweir if ( pChild != pMouseMoveWin ) 615*cdf0e10cSrcweir { 616*cdf0e10cSrcweir if ( pMouseMoveWin ) 617*cdf0e10cSrcweir { 618*cdf0e10cSrcweir Point aLeaveMousePos = pMouseMoveWin->ImplFrameToOutput( aMousePos ); 619*cdf0e10cSrcweir MouseEvent aMLeaveEvt( aLeaveMousePos, nClicks, nMode | MOUSE_LEAVEWINDOW, nCode, nCode ); 620*cdf0e10cSrcweir NotifyEvent aNLeaveEvt( EVENT_MOUSEMOVE, pMouseMoveWin, &aMLeaveEvt ); 621*cdf0e10cSrcweir ImplDelData aDelData; 622*cdf0e10cSrcweir ImplDelData aDelData2; 623*cdf0e10cSrcweir pWinFrameData->mbInMouseMove = sal_True; 624*cdf0e10cSrcweir pMouseMoveWin->ImplGetWinData()->mbMouseOver = sal_False; 625*cdf0e10cSrcweir pMouseMoveWin->ImplAddDel( &aDelData ); 626*cdf0e10cSrcweir // Durch MouseLeave kann auch dieses Fenster zerstoert 627*cdf0e10cSrcweir // werden 628*cdf0e10cSrcweir if ( pChild ) 629*cdf0e10cSrcweir pChild->ImplAddDel( &aDelData2 ); 630*cdf0e10cSrcweir if ( !ImplCallPreNotify( aNLeaveEvt ) ) 631*cdf0e10cSrcweir { 632*cdf0e10cSrcweir pMouseMoveWin->MouseMove( aMLeaveEvt ); 633*cdf0e10cSrcweir // #82968# 634*cdf0e10cSrcweir if( !aDelData.IsDelete() ) 635*cdf0e10cSrcweir aNLeaveEvt.GetWindow()->ImplNotifyKeyMouseCommandEventListeners( aNLeaveEvt ); 636*cdf0e10cSrcweir } 637*cdf0e10cSrcweir 638*cdf0e10cSrcweir pWinFrameData->mpMouseMoveWin = NULL; 639*cdf0e10cSrcweir pWinFrameData->mbInMouseMove = sal_False; 640*cdf0e10cSrcweir 641*cdf0e10cSrcweir if ( pChild ) 642*cdf0e10cSrcweir { 643*cdf0e10cSrcweir if ( aDelData2.IsDelete() ) 644*cdf0e10cSrcweir pChild = NULL; 645*cdf0e10cSrcweir else 646*cdf0e10cSrcweir pChild->ImplRemoveDel( &aDelData2 ); 647*cdf0e10cSrcweir } 648*cdf0e10cSrcweir if ( aDelData.IsDelete() ) 649*cdf0e10cSrcweir return 1; 650*cdf0e10cSrcweir pMouseMoveWin->ImplRemoveDel( &aDelData ); 651*cdf0e10cSrcweir } 652*cdf0e10cSrcweir 653*cdf0e10cSrcweir nMode |= MOUSE_ENTERWINDOW; 654*cdf0e10cSrcweir } 655*cdf0e10cSrcweir pWinFrameData->mpMouseMoveWin = pChild; 656*cdf0e10cSrcweir if( pChild ) 657*cdf0e10cSrcweir pChild->ImplGetWinData()->mbMouseOver = sal_True; 658*cdf0e10cSrcweir 659*cdf0e10cSrcweir // MouseLeave 660*cdf0e10cSrcweir if ( !pChild ) 661*cdf0e10cSrcweir return 0; 662*cdf0e10cSrcweir } 663*cdf0e10cSrcweir else 664*cdf0e10cSrcweir { 665*cdf0e10cSrcweir // mouse click 666*cdf0e10cSrcweir if ( nSVEvent == EVENT_MOUSEBUTTONDOWN ) 667*cdf0e10cSrcweir { 668*cdf0e10cSrcweir const MouseSettings& rMSettings = pChild->GetSettings().GetMouseSettings(); 669*cdf0e10cSrcweir sal_uLong nDblClkTime = rMSettings.GetDoubleClickTime(); 670*cdf0e10cSrcweir long nDblClkW = rMSettings.GetDoubleClickWidth(); 671*cdf0e10cSrcweir long nDblClkH = rMSettings.GetDoubleClickHeight(); 672*cdf0e10cSrcweir //long nMouseX = nX; 673*cdf0e10cSrcweir //long nMouseY = nY; 674*cdf0e10cSrcweir long nMouseX = aMousePos.X(); // #106074# use the possibly re-mirrored coordinates (RTL) ! nX,nY are unmodified ! 675*cdf0e10cSrcweir long nMouseY = aMousePos.Y(); 676*cdf0e10cSrcweir 677*cdf0e10cSrcweir if ( (pChild == pChild->ImplGetFrameData()->mpMouseDownWin) && 678*cdf0e10cSrcweir (nCode == pChild->ImplGetFrameData()->mnFirstMouseCode) && 679*cdf0e10cSrcweir ((nMsgTime-pChild->ImplGetFrameData()->mnMouseDownTime) < nDblClkTime) && 680*cdf0e10cSrcweir ((nMouseX-nDblClkW) <= pChild->ImplGetFrameData()->mnFirstMouseX) && 681*cdf0e10cSrcweir ((nMouseX+nDblClkW) >= pChild->ImplGetFrameData()->mnFirstMouseX) && 682*cdf0e10cSrcweir ((nMouseY-nDblClkH) <= pChild->ImplGetFrameData()->mnFirstMouseY) && 683*cdf0e10cSrcweir ((nMouseY+nDblClkH) >= pChild->ImplGetFrameData()->mnFirstMouseY) ) 684*cdf0e10cSrcweir { 685*cdf0e10cSrcweir pChild->ImplGetFrameData()->mnClickCount++; 686*cdf0e10cSrcweir pChild->ImplGetFrameData()->mbStartDragCalled = sal_True; 687*cdf0e10cSrcweir } 688*cdf0e10cSrcweir else 689*cdf0e10cSrcweir { 690*cdf0e10cSrcweir pChild->ImplGetFrameData()->mpMouseDownWin = pChild; 691*cdf0e10cSrcweir pChild->ImplGetFrameData()->mnClickCount = 1; 692*cdf0e10cSrcweir pChild->ImplGetFrameData()->mnFirstMouseX = nMouseX; 693*cdf0e10cSrcweir pChild->ImplGetFrameData()->mnFirstMouseY = nMouseY; 694*cdf0e10cSrcweir pChild->ImplGetFrameData()->mnFirstMouseCode = nCode; 695*cdf0e10cSrcweir pChild->ImplGetFrameData()->mbStartDragCalled = !((nCode & (MOUSE_LEFT | MOUSE_RIGHT | MOUSE_MIDDLE)) == 696*cdf0e10cSrcweir (rMSettings.GetStartDragCode() & (MOUSE_LEFT | MOUSE_RIGHT | MOUSE_MIDDLE))); 697*cdf0e10cSrcweir } 698*cdf0e10cSrcweir pChild->ImplGetFrameData()->mnMouseDownTime = nMsgTime; 699*cdf0e10cSrcweir } 700*cdf0e10cSrcweir nClicks = pChild->ImplGetFrameData()->mnClickCount; 701*cdf0e10cSrcweir 702*cdf0e10cSrcweir pSVData->maAppData.mnLastInputTime = Time::GetSystemTicks(); 703*cdf0e10cSrcweir } 704*cdf0e10cSrcweir 705*cdf0e10cSrcweir DBG_ASSERT( pChild, "ImplHandleMouseEvent: pChild == NULL" ); 706*cdf0e10cSrcweir 707*cdf0e10cSrcweir // create mouse event 708*cdf0e10cSrcweir Point aChildPos = pChild->ImplFrameToOutput( aMousePos ); 709*cdf0e10cSrcweir MouseEvent aMEvt( aChildPos, nClicks, nMode, nCode, nCode ); 710*cdf0e10cSrcweir 711*cdf0e10cSrcweir // tracking window gets the mouse events 712*cdf0e10cSrcweir if ( pSVData->maWinData.mpTrackWin ) 713*cdf0e10cSrcweir pChild = pSVData->maWinData.mpTrackWin; 714*cdf0e10cSrcweir 715*cdf0e10cSrcweir // handle FloatingMode 716*cdf0e10cSrcweir if ( !pSVData->maWinData.mpTrackWin && pSVData->maWinData.mpFirstFloat ) 717*cdf0e10cSrcweir { 718*cdf0e10cSrcweir ImplDelData aDelData; 719*cdf0e10cSrcweir pChild->ImplAddDel( &aDelData ); 720*cdf0e10cSrcweir if ( ImplHandleMouseFloatMode( pChild, aMousePos, nCode, nSVEvent, bMouseLeave ) ) 721*cdf0e10cSrcweir { 722*cdf0e10cSrcweir if ( !aDelData.IsDelete() ) 723*cdf0e10cSrcweir { 724*cdf0e10cSrcweir pChild->ImplRemoveDel( &aDelData ); 725*cdf0e10cSrcweir pChild->ImplGetFrameData()->mbStartDragCalled = sal_True; 726*cdf0e10cSrcweir } 727*cdf0e10cSrcweir return 1; 728*cdf0e10cSrcweir } 729*cdf0e10cSrcweir else 730*cdf0e10cSrcweir pChild->ImplRemoveDel( &aDelData ); 731*cdf0e10cSrcweir } 732*cdf0e10cSrcweir 733*cdf0e10cSrcweir // call handler 734*cdf0e10cSrcweir sal_Bool bDrag = sal_False; 735*cdf0e10cSrcweir sal_Bool bCallHelpRequest = sal_True; 736*cdf0e10cSrcweir DBG_ASSERT( pChild, "ImplHandleMouseEvent: pChild is NULL" ); 737*cdf0e10cSrcweir 738*cdf0e10cSrcweir ImplDelData aDelData; 739*cdf0e10cSrcweir NotifyEvent aNEvt( nSVEvent, pChild, &aMEvt ); 740*cdf0e10cSrcweir pChild->ImplAddDel( &aDelData ); 741*cdf0e10cSrcweir if ( nSVEvent == EVENT_MOUSEMOVE ) 742*cdf0e10cSrcweir pChild->ImplGetFrameData()->mbInMouseMove = sal_True; 743*cdf0e10cSrcweir 744*cdf0e10cSrcweir // bring window into foreground on mouseclick 745*cdf0e10cSrcweir if ( nSVEvent == EVENT_MOUSEBUTTONDOWN ) 746*cdf0e10cSrcweir { 747*cdf0e10cSrcweir if( !pSVData->maWinData.mpFirstFloat && // totop for floating windows in popup would change the focus and would close them immediately 748*cdf0e10cSrcweir !(pChild->ImplGetFrameWindow()->GetStyle() & WB_OWNERDRAWDECORATION) ) // ownerdrawdecorated windows must never grab focus 749*cdf0e10cSrcweir pChild->ToTop(); 750*cdf0e10cSrcweir if ( aDelData.IsDelete() ) 751*cdf0e10cSrcweir return 1; 752*cdf0e10cSrcweir } 753*cdf0e10cSrcweir 754*cdf0e10cSrcweir if ( ImplCallPreNotify( aNEvt ) || aDelData.IsDelete() ) 755*cdf0e10cSrcweir nRet = 1; 756*cdf0e10cSrcweir else 757*cdf0e10cSrcweir { 758*cdf0e10cSrcweir nRet = 0; 759*cdf0e10cSrcweir if ( nSVEvent == EVENT_MOUSEMOVE ) 760*cdf0e10cSrcweir { 761*cdf0e10cSrcweir if ( pSVData->maWinData.mpTrackWin ) 762*cdf0e10cSrcweir { 763*cdf0e10cSrcweir TrackingEvent aTEvt( aMEvt ); 764*cdf0e10cSrcweir pChild->Tracking( aTEvt ); 765*cdf0e10cSrcweir if ( !aDelData.IsDelete() ) 766*cdf0e10cSrcweir { 767*cdf0e10cSrcweir // When ScrollRepeat, we restart the timer 768*cdf0e10cSrcweir if ( pSVData->maWinData.mpTrackTimer && 769*cdf0e10cSrcweir (pSVData->maWinData.mnTrackFlags & STARTTRACK_SCROLLREPEAT) ) 770*cdf0e10cSrcweir pSVData->maWinData.mpTrackTimer->Start(); 771*cdf0e10cSrcweir } 772*cdf0e10cSrcweir bCallHelpRequest = sal_False; 773*cdf0e10cSrcweir nRet = 1; 774*cdf0e10cSrcweir } 775*cdf0e10cSrcweir else 776*cdf0e10cSrcweir { 777*cdf0e10cSrcweir // Auto-ToTop 778*cdf0e10cSrcweir if ( !pSVData->maWinData.mpCaptureWin && 779*cdf0e10cSrcweir (pChild->GetSettings().GetMouseSettings().GetOptions() & MOUSE_OPTION_AUTOFOCUS) ) 780*cdf0e10cSrcweir pChild->ToTop( TOTOP_NOGRABFOCUS ); 781*cdf0e10cSrcweir 782*cdf0e10cSrcweir if( aDelData.IsDelete() ) 783*cdf0e10cSrcweir bCallHelpRequest = sal_False; 784*cdf0e10cSrcweir else 785*cdf0e10cSrcweir { 786*cdf0e10cSrcweir // if the MouseMove handler changes the help window's visibility 787*cdf0e10cSrcweir // the HelpRequest handler should not be called anymore 788*cdf0e10cSrcweir Window* pOldHelpTextWin = pSVData->maHelpData.mpHelpWin; 789*cdf0e10cSrcweir pChild->ImplGetWindowImpl()->mbMouseMove = sal_False; 790*cdf0e10cSrcweir pChild->MouseMove( aMEvt ); 791*cdf0e10cSrcweir if ( pOldHelpTextWin != pSVData->maHelpData.mpHelpWin ) 792*cdf0e10cSrcweir bCallHelpRequest = sal_False; 793*cdf0e10cSrcweir } 794*cdf0e10cSrcweir } 795*cdf0e10cSrcweir } 796*cdf0e10cSrcweir else if ( nSVEvent == EVENT_MOUSEBUTTONDOWN ) 797*cdf0e10cSrcweir { 798*cdf0e10cSrcweir if ( pSVData->maWinData.mpTrackWin && 799*cdf0e10cSrcweir !(pSVData->maWinData.mnTrackFlags & STARTTRACK_MOUSEBUTTONDOWN) ) 800*cdf0e10cSrcweir nRet = 1; 801*cdf0e10cSrcweir else 802*cdf0e10cSrcweir { 803*cdf0e10cSrcweir pChild->ImplGetWindowImpl()->mbMouseButtonDown = sal_False; 804*cdf0e10cSrcweir pChild->MouseButtonDown( aMEvt ); 805*cdf0e10cSrcweir } 806*cdf0e10cSrcweir } 807*cdf0e10cSrcweir else 808*cdf0e10cSrcweir { 809*cdf0e10cSrcweir if ( pSVData->maWinData.mpTrackWin ) 810*cdf0e10cSrcweir { 811*cdf0e10cSrcweir pChild->EndTracking(); 812*cdf0e10cSrcweir nRet = 1; 813*cdf0e10cSrcweir } 814*cdf0e10cSrcweir else 815*cdf0e10cSrcweir { 816*cdf0e10cSrcweir pChild->ImplGetWindowImpl()->mbMouseButtonUp = sal_False; 817*cdf0e10cSrcweir pChild->MouseButtonUp( aMEvt ); 818*cdf0e10cSrcweir } 819*cdf0e10cSrcweir } 820*cdf0e10cSrcweir 821*cdf0e10cSrcweir // #82968# 822*cdf0e10cSrcweir if ( !aDelData.IsDelete() ) 823*cdf0e10cSrcweir aNEvt.GetWindow()->ImplNotifyKeyMouseCommandEventListeners( aNEvt ); 824*cdf0e10cSrcweir } 825*cdf0e10cSrcweir 826*cdf0e10cSrcweir if ( aDelData.IsDelete() ) 827*cdf0e10cSrcweir return 1; 828*cdf0e10cSrcweir 829*cdf0e10cSrcweir 830*cdf0e10cSrcweir if ( nSVEvent == EVENT_MOUSEMOVE ) 831*cdf0e10cSrcweir pChild->ImplGetWindowImpl()->mpFrameData->mbInMouseMove = sal_False; 832*cdf0e10cSrcweir 833*cdf0e10cSrcweir if ( nSVEvent == EVENT_MOUSEMOVE ) 834*cdf0e10cSrcweir { 835*cdf0e10cSrcweir if ( bCallHelpRequest && !pSVData->maHelpData.mbKeyboardHelp ) 836*cdf0e10cSrcweir ImplHandleMouseHelpRequest( pChild, pChild->OutputToScreenPixel( aMEvt.GetPosPixel() ) ); 837*cdf0e10cSrcweir nRet = 1; 838*cdf0e10cSrcweir } 839*cdf0e10cSrcweir else if ( !nRet ) 840*cdf0e10cSrcweir { 841*cdf0e10cSrcweir if ( nSVEvent == EVENT_MOUSEBUTTONDOWN ) 842*cdf0e10cSrcweir { 843*cdf0e10cSrcweir if ( !pChild->ImplGetWindowImpl()->mbMouseButtonDown ) 844*cdf0e10cSrcweir nRet = 1; 845*cdf0e10cSrcweir } 846*cdf0e10cSrcweir else 847*cdf0e10cSrcweir { 848*cdf0e10cSrcweir if ( !pChild->ImplGetWindowImpl()->mbMouseButtonUp ) 849*cdf0e10cSrcweir nRet = 1; 850*cdf0e10cSrcweir } 851*cdf0e10cSrcweir } 852*cdf0e10cSrcweir 853*cdf0e10cSrcweir pChild->ImplRemoveDel( &aDelData ); 854*cdf0e10cSrcweir 855*cdf0e10cSrcweir if ( nSVEvent == EVENT_MOUSEMOVE ) 856*cdf0e10cSrcweir { 857*cdf0e10cSrcweir // set new mouse pointer 858*cdf0e10cSrcweir if ( !bMouseLeave ) 859*cdf0e10cSrcweir ImplSetMousePointer( pChild ); 860*cdf0e10cSrcweir } 861*cdf0e10cSrcweir else if ( (nSVEvent == EVENT_MOUSEBUTTONDOWN) || (nSVEvent == EVENT_MOUSEBUTTONUP) ) 862*cdf0e10cSrcweir { 863*cdf0e10cSrcweir if ( !bDrag ) 864*cdf0e10cSrcweir { 865*cdf0e10cSrcweir // Command-Events 866*cdf0e10cSrcweir if ( /*(nRet == 0) &&*/ (nClicks == 1) && (nSVEvent == EVENT_MOUSEBUTTONDOWN) && 867*cdf0e10cSrcweir (nCode == MOUSE_MIDDLE) ) 868*cdf0e10cSrcweir { 869*cdf0e10cSrcweir sal_uInt16 nMiddleAction = pChild->GetSettings().GetMouseSettings().GetMiddleButtonAction(); 870*cdf0e10cSrcweir if ( nMiddleAction == MOUSE_MIDDLE_AUTOSCROLL ) 871*cdf0e10cSrcweir nRet = !ImplCallCommand( pChild, COMMAND_STARTAUTOSCROLL, NULL, sal_True, &aChildPos ); 872*cdf0e10cSrcweir else if ( nMiddleAction == MOUSE_MIDDLE_PASTESELECTION ) 873*cdf0e10cSrcweir nRet = !ImplCallCommand( pChild, COMMAND_PASTESELECTION, NULL, sal_True, &aChildPos ); 874*cdf0e10cSrcweir } 875*cdf0e10cSrcweir else 876*cdf0e10cSrcweir { 877*cdf0e10cSrcweir // ContextMenu 878*cdf0e10cSrcweir const MouseSettings& rMSettings = pChild->GetSettings().GetMouseSettings(); 879*cdf0e10cSrcweir if ( (nCode == rMSettings.GetContextMenuCode()) && 880*cdf0e10cSrcweir (nClicks == rMSettings.GetContextMenuClicks()) ) 881*cdf0e10cSrcweir { 882*cdf0e10cSrcweir sal_Bool bContextMenu; 883*cdf0e10cSrcweir if ( rMSettings.GetContextMenuDown() ) 884*cdf0e10cSrcweir bContextMenu = (nSVEvent == EVENT_MOUSEBUTTONDOWN); 885*cdf0e10cSrcweir else 886*cdf0e10cSrcweir bContextMenu = (nSVEvent == EVENT_MOUSEBUTTONUP); 887*cdf0e10cSrcweir if ( bContextMenu ) 888*cdf0e10cSrcweir { 889*cdf0e10cSrcweir if( pSVData->maAppData.mpActivePopupMenu ) 890*cdf0e10cSrcweir { 891*cdf0e10cSrcweir /* #i34277# there already is a context menu open 892*cdf0e10cSrcweir * that was probably just closed with EndPopupMode. 893*cdf0e10cSrcweir * We need to give the eventual corresponding 894*cdf0e10cSrcweir * PopupMenu::Execute a chance to end properly. 895*cdf0e10cSrcweir * Therefore delay context menu command and 896*cdf0e10cSrcweir * issue only after popping one frame of the 897*cdf0e10cSrcweir * Yield stack. 898*cdf0e10cSrcweir */ 899*cdf0e10cSrcweir ContextMenuEvent* pEv = new ContextMenuEvent; 900*cdf0e10cSrcweir pEv->pWindow = pChild; 901*cdf0e10cSrcweir pEv->aChildPos = aChildPos; 902*cdf0e10cSrcweir pChild->ImplAddDel( &pEv->aDelData ); 903*cdf0e10cSrcweir Application::PostUserEvent( Link( pEv, ContextMenuEventLink ) ); 904*cdf0e10cSrcweir } 905*cdf0e10cSrcweir else 906*cdf0e10cSrcweir nRet = ! ImplCallCommand( pChild, COMMAND_CONTEXTMENU, NULL, sal_True, &aChildPos ); 907*cdf0e10cSrcweir } 908*cdf0e10cSrcweir } 909*cdf0e10cSrcweir } 910*cdf0e10cSrcweir } 911*cdf0e10cSrcweir } 912*cdf0e10cSrcweir 913*cdf0e10cSrcweir return nRet; 914*cdf0e10cSrcweir } 915*cdf0e10cSrcweir 916*cdf0e10cSrcweir // ----------------------------------------------------------------------- 917*cdf0e10cSrcweir 918*cdf0e10cSrcweir static Window* ImplGetKeyInputWindow( Window* pWindow ) 919*cdf0e10cSrcweir { 920*cdf0e10cSrcweir ImplSVData* pSVData = ImplGetSVData(); 921*cdf0e10cSrcweir 922*cdf0e10cSrcweir // determine last input time 923*cdf0e10cSrcweir pSVData->maAppData.mnLastInputTime = Time::GetSystemTicks(); 924*cdf0e10cSrcweir 925*cdf0e10cSrcweir // #127104# workaround for destroyed windows 926*cdf0e10cSrcweir if( pWindow->ImplGetWindowImpl() == NULL ) 927*cdf0e10cSrcweir return 0; 928*cdf0e10cSrcweir 929*cdf0e10cSrcweir // find window - is every time the window which has currently the 930*cdf0e10cSrcweir // focus or the last time the focus. 931*cdf0e10cSrcweir // the first floating window always has the focus 932*cdf0e10cSrcweir Window* pChild = pSVData->maWinData.mpFirstFloat; 933*cdf0e10cSrcweir if( !pChild || ( pChild->ImplGetWindowImpl()->mbFloatWin && !((FloatingWindow *)pChild)->GrabsFocus() ) ) 934*cdf0e10cSrcweir pChild = pWindow->ImplGetWindowImpl()->mpFrameData->mpFocusWin; 935*cdf0e10cSrcweir else 936*cdf0e10cSrcweir { 937*cdf0e10cSrcweir // allow floaters to forward keyinput to some member 938*cdf0e10cSrcweir pChild = pChild->GetPreferredKeyInputWindow(); 939*cdf0e10cSrcweir } 940*cdf0e10cSrcweir 941*cdf0e10cSrcweir // no child - than no input 942*cdf0e10cSrcweir if ( !pChild ) 943*cdf0e10cSrcweir return 0; 944*cdf0e10cSrcweir 945*cdf0e10cSrcweir // We call also KeyInput if we haven't the focus, because on Unix 946*cdf0e10cSrcweir // system this is often the case when a Lookup Choise Window has 947*cdf0e10cSrcweir // the focus - because this windows send the KeyInput directly to 948*cdf0e10cSrcweir // the window without resetting the focus 949*cdf0e10cSrcweir DBG_ASSERTWARNING( pChild == pSVData->maWinData.mpFocusWin, 950*cdf0e10cSrcweir "ImplHandleKey: Keyboard-Input is sent to a frame without focus" ); 951*cdf0e10cSrcweir 952*cdf0e10cSrcweir // no keyinput to disabled windows 953*cdf0e10cSrcweir if ( !pChild->IsEnabled() || !pChild->IsInputEnabled() || pChild->IsInModalMode() ) 954*cdf0e10cSrcweir return 0; 955*cdf0e10cSrcweir 956*cdf0e10cSrcweir return pChild; 957*cdf0e10cSrcweir } 958*cdf0e10cSrcweir 959*cdf0e10cSrcweir // ----------------------------------------------------------------------- 960*cdf0e10cSrcweir 961*cdf0e10cSrcweir static long ImplHandleKey( Window* pWindow, sal_uInt16 nSVEvent, 962*cdf0e10cSrcweir sal_uInt16 nKeyCode, sal_uInt16 nCharCode, sal_uInt16 nRepeat, sal_Bool bForward ) 963*cdf0e10cSrcweir { 964*cdf0e10cSrcweir ImplSVData* pSVData = ImplGetSVData(); 965*cdf0e10cSrcweir KeyCode aKeyCode( nKeyCode, nKeyCode ); 966*cdf0e10cSrcweir sal_uInt16 nEvCode = aKeyCode.GetCode(); 967*cdf0e10cSrcweir 968*cdf0e10cSrcweir // allow application key listeners to remove the key event 969*cdf0e10cSrcweir // but make sure we're not forwarding external KeyEvents, (ie where bForward is sal_False) 970*cdf0e10cSrcweir // becasue those are coming back from the listener itself and MUST be processed 971*cdf0e10cSrcweir KeyEvent aKeyEvent( (xub_Unicode)nCharCode, aKeyCode, nRepeat ); 972*cdf0e10cSrcweir if( bForward ) 973*cdf0e10cSrcweir { 974*cdf0e10cSrcweir sal_uInt16 nVCLEvent; 975*cdf0e10cSrcweir switch( nSVEvent ) 976*cdf0e10cSrcweir { 977*cdf0e10cSrcweir case EVENT_KEYINPUT: 978*cdf0e10cSrcweir nVCLEvent = VCLEVENT_WINDOW_KEYINPUT; 979*cdf0e10cSrcweir break; 980*cdf0e10cSrcweir case EVENT_KEYUP: 981*cdf0e10cSrcweir nVCLEvent = VCLEVENT_WINDOW_KEYUP; 982*cdf0e10cSrcweir break; 983*cdf0e10cSrcweir default: 984*cdf0e10cSrcweir nVCLEvent = 0; 985*cdf0e10cSrcweir break; 986*cdf0e10cSrcweir } 987*cdf0e10cSrcweir if( nVCLEvent && pSVData->mpApp->HandleKey( nVCLEvent, pWindow, &aKeyEvent ) ) 988*cdf0e10cSrcweir return 1; 989*cdf0e10cSrcweir } 990*cdf0e10cSrcweir 991*cdf0e10cSrcweir // #i1820# use locale specific decimal separator 992*cdf0e10cSrcweir if( nEvCode == KEY_DECIMAL ) 993*cdf0e10cSrcweir { 994*cdf0e10cSrcweir if( Application::GetSettings().GetMiscSettings().GetEnableLocalizedDecimalSep() ) 995*cdf0e10cSrcweir { 996*cdf0e10cSrcweir String aSep( pWindow->GetSettings().GetLocaleDataWrapper().getNumDecimalSep() ); 997*cdf0e10cSrcweir nCharCode = (sal_uInt16) aSep.GetChar(0); 998*cdf0e10cSrcweir } 999*cdf0e10cSrcweir } 1000*cdf0e10cSrcweir 1001*cdf0e10cSrcweir sal_Bool bCtrlF6 = (aKeyCode.GetCode() == KEY_F6) && aKeyCode.IsMod1(); 1002*cdf0e10cSrcweir 1003*cdf0e10cSrcweir // determine last input time 1004*cdf0e10cSrcweir pSVData->maAppData.mnLastInputTime = Time::GetSystemTicks(); 1005*cdf0e10cSrcweir 1006*cdf0e10cSrcweir // handle tracking window 1007*cdf0e10cSrcweir if ( nSVEvent == EVENT_KEYINPUT ) 1008*cdf0e10cSrcweir { 1009*cdf0e10cSrcweir #ifdef DBG_UTIL 1010*cdf0e10cSrcweir // #105224# use Ctrl-Alt-Shift-D, Ctrl-Shift-D must be useable by app 1011*cdf0e10cSrcweir if ( aKeyCode.IsShift() && aKeyCode.IsMod1() && (aKeyCode.IsMod2() || aKeyCode.IsMod3()) && (aKeyCode.GetCode() == KEY_D) ) 1012*cdf0e10cSrcweir { 1013*cdf0e10cSrcweir DBGGUI_START(); 1014*cdf0e10cSrcweir return 1; 1015*cdf0e10cSrcweir } 1016*cdf0e10cSrcweir #endif 1017*cdf0e10cSrcweir 1018*cdf0e10cSrcweir if ( pSVData->maHelpData.mbExtHelpMode ) 1019*cdf0e10cSrcweir { 1020*cdf0e10cSrcweir Help::EndExtHelp(); 1021*cdf0e10cSrcweir if ( nEvCode == KEY_ESCAPE ) 1022*cdf0e10cSrcweir return 1; 1023*cdf0e10cSrcweir } 1024*cdf0e10cSrcweir if ( pSVData->maHelpData.mpHelpWin ) 1025*cdf0e10cSrcweir ImplDestroyHelpWindow( false ); 1026*cdf0e10cSrcweir 1027*cdf0e10cSrcweir // AutoScrollMode 1028*cdf0e10cSrcweir if ( pSVData->maWinData.mpAutoScrollWin ) 1029*cdf0e10cSrcweir { 1030*cdf0e10cSrcweir pSVData->maWinData.mpAutoScrollWin->EndAutoScroll(); 1031*cdf0e10cSrcweir if ( nEvCode == KEY_ESCAPE ) 1032*cdf0e10cSrcweir return 1; 1033*cdf0e10cSrcweir } 1034*cdf0e10cSrcweir 1035*cdf0e10cSrcweir if ( pSVData->maWinData.mpTrackWin ) 1036*cdf0e10cSrcweir { 1037*cdf0e10cSrcweir sal_uInt16 nOrigCode = aKeyCode.GetCode(); 1038*cdf0e10cSrcweir 1039*cdf0e10cSrcweir if ( (nOrigCode == KEY_ESCAPE) && !(pSVData->maWinData.mnTrackFlags & STARTTRACK_NOKEYCANCEL) ) 1040*cdf0e10cSrcweir { 1041*cdf0e10cSrcweir pSVData->maWinData.mpTrackWin->EndTracking( ENDTRACK_CANCEL | ENDTRACK_KEY ); 1042*cdf0e10cSrcweir if ( pSVData->maWinData.mpFirstFloat ) 1043*cdf0e10cSrcweir { 1044*cdf0e10cSrcweir FloatingWindow* pLastLevelFloat = pSVData->maWinData.mpFirstFloat->ImplFindLastLevelFloat(); 1045*cdf0e10cSrcweir if ( !(pLastLevelFloat->GetPopupModeFlags() & FLOATWIN_POPUPMODE_NOKEYCLOSE) ) 1046*cdf0e10cSrcweir { 1047*cdf0e10cSrcweir sal_uInt16 nEscCode = aKeyCode.GetCode(); 1048*cdf0e10cSrcweir 1049*cdf0e10cSrcweir if ( nEscCode == KEY_ESCAPE ) 1050*cdf0e10cSrcweir pLastLevelFloat->EndPopupMode( FLOATWIN_POPUPMODEEND_CANCEL | FLOATWIN_POPUPMODEEND_CLOSEALL ); 1051*cdf0e10cSrcweir } 1052*cdf0e10cSrcweir } 1053*cdf0e10cSrcweir return 1; 1054*cdf0e10cSrcweir } 1055*cdf0e10cSrcweir else if ( nOrigCode == KEY_RETURN ) 1056*cdf0e10cSrcweir { 1057*cdf0e10cSrcweir pSVData->maWinData.mpTrackWin->EndTracking( ENDTRACK_KEY ); 1058*cdf0e10cSrcweir return 1; 1059*cdf0e10cSrcweir } 1060*cdf0e10cSrcweir else if ( !(pSVData->maWinData.mnTrackFlags & STARTTRACK_KEYINPUT) ) 1061*cdf0e10cSrcweir return 1; 1062*cdf0e10cSrcweir } 1063*cdf0e10cSrcweir 1064*cdf0e10cSrcweir // handle FloatingMode 1065*cdf0e10cSrcweir if ( pSVData->maWinData.mpFirstFloat ) 1066*cdf0e10cSrcweir { 1067*cdf0e10cSrcweir FloatingWindow* pLastLevelFloat = pSVData->maWinData.mpFirstFloat->ImplFindLastLevelFloat(); 1068*cdf0e10cSrcweir if ( !(pLastLevelFloat->GetPopupModeFlags() & FLOATWIN_POPUPMODE_NOKEYCLOSE) ) 1069*cdf0e10cSrcweir { 1070*cdf0e10cSrcweir sal_uInt16 nCode = aKeyCode.GetCode(); 1071*cdf0e10cSrcweir 1072*cdf0e10cSrcweir if ( (nCode == KEY_ESCAPE) || bCtrlF6) 1073*cdf0e10cSrcweir { 1074*cdf0e10cSrcweir pLastLevelFloat->EndPopupMode( FLOATWIN_POPUPMODEEND_CANCEL | FLOATWIN_POPUPMODEEND_CLOSEALL ); 1075*cdf0e10cSrcweir if( !bCtrlF6 ) 1076*cdf0e10cSrcweir return 1; 1077*cdf0e10cSrcweir } 1078*cdf0e10cSrcweir } 1079*cdf0e10cSrcweir } 1080*cdf0e10cSrcweir 1081*cdf0e10cSrcweir // test for accel 1082*cdf0e10cSrcweir if ( pSVData->maAppData.mpAccelMgr ) 1083*cdf0e10cSrcweir { 1084*cdf0e10cSrcweir if ( pSVData->maAppData.mpAccelMgr->IsAccelKey( aKeyCode, nRepeat ) ) 1085*cdf0e10cSrcweir return 1; 1086*cdf0e10cSrcweir } 1087*cdf0e10cSrcweir } 1088*cdf0e10cSrcweir 1089*cdf0e10cSrcweir // find window 1090*cdf0e10cSrcweir Window* pChild = ImplGetKeyInputWindow( pWindow ); 1091*cdf0e10cSrcweir if ( !pChild ) 1092*cdf0e10cSrcweir return 0; 1093*cdf0e10cSrcweir 1094*cdf0e10cSrcweir // --- RTL --- mirror cursor keys 1095*cdf0e10cSrcweir if( (aKeyCode.GetCode() == KEY_LEFT || aKeyCode.GetCode() == KEY_RIGHT) && 1096*cdf0e10cSrcweir pChild->ImplHasMirroredGraphics() && pChild->IsRTLEnabled() ) 1097*cdf0e10cSrcweir aKeyCode = KeyCode( aKeyCode.GetCode() == KEY_LEFT ? KEY_RIGHT : KEY_LEFT, aKeyCode.GetModifier() ); 1098*cdf0e10cSrcweir 1099*cdf0e10cSrcweir // call handler 1100*cdf0e10cSrcweir ImplDelData aDelData; 1101*cdf0e10cSrcweir pChild->ImplAddDel( &aDelData ); 1102*cdf0e10cSrcweir 1103*cdf0e10cSrcweir KeyEvent aKeyEvt( (xub_Unicode)nCharCode, aKeyCode, nRepeat ); 1104*cdf0e10cSrcweir NotifyEvent aNotifyEvt( nSVEvent, pChild, &aKeyEvt ); 1105*cdf0e10cSrcweir sal_Bool bKeyPreNotify = (ImplCallPreNotify( aNotifyEvt ) != 0); 1106*cdf0e10cSrcweir long nRet = 1; 1107*cdf0e10cSrcweir 1108*cdf0e10cSrcweir if ( !bKeyPreNotify && !aDelData.IsDelete() ) 1109*cdf0e10cSrcweir { 1110*cdf0e10cSrcweir if ( nSVEvent == EVENT_KEYINPUT ) 1111*cdf0e10cSrcweir { 1112*cdf0e10cSrcweir pChild->ImplGetWindowImpl()->mbKeyInput = sal_False; 1113*cdf0e10cSrcweir pChild->KeyInput( aKeyEvt ); 1114*cdf0e10cSrcweir } 1115*cdf0e10cSrcweir else 1116*cdf0e10cSrcweir { 1117*cdf0e10cSrcweir pChild->ImplGetWindowImpl()->mbKeyUp = sal_False; 1118*cdf0e10cSrcweir pChild->KeyUp( aKeyEvt ); 1119*cdf0e10cSrcweir } 1120*cdf0e10cSrcweir // #82968# 1121*cdf0e10cSrcweir if( !aDelData.IsDelete() ) 1122*cdf0e10cSrcweir aNotifyEvt.GetWindow()->ImplNotifyKeyMouseCommandEventListeners( aNotifyEvt ); 1123*cdf0e10cSrcweir } 1124*cdf0e10cSrcweir 1125*cdf0e10cSrcweir if ( aDelData.IsDelete() ) 1126*cdf0e10cSrcweir return 1; 1127*cdf0e10cSrcweir 1128*cdf0e10cSrcweir pChild->ImplRemoveDel( &aDelData ); 1129*cdf0e10cSrcweir 1130*cdf0e10cSrcweir if ( nSVEvent == EVENT_KEYINPUT ) 1131*cdf0e10cSrcweir { 1132*cdf0e10cSrcweir if ( !bKeyPreNotify && pChild->ImplGetWindowImpl()->mbKeyInput ) 1133*cdf0e10cSrcweir { 1134*cdf0e10cSrcweir sal_uInt16 nCode = aKeyCode.GetCode(); 1135*cdf0e10cSrcweir 1136*cdf0e10cSrcweir // #101999# is focus in or below toolbox 1137*cdf0e10cSrcweir sal_Bool bToolboxFocus=sal_False; 1138*cdf0e10cSrcweir if( (nCode == KEY_F1) && aKeyCode.IsShift() ) 1139*cdf0e10cSrcweir { 1140*cdf0e10cSrcweir Window *pWin = pWindow->ImplGetWindowImpl()->mpFrameData->mpFocusWin; 1141*cdf0e10cSrcweir while( pWin ) 1142*cdf0e10cSrcweir { 1143*cdf0e10cSrcweir if( pWin->ImplGetWindowImpl()->mbToolBox ) 1144*cdf0e10cSrcweir { 1145*cdf0e10cSrcweir bToolboxFocus = sal_True; 1146*cdf0e10cSrcweir break; 1147*cdf0e10cSrcweir } 1148*cdf0e10cSrcweir else 1149*cdf0e10cSrcweir pWin = pWin->GetParent(); 1150*cdf0e10cSrcweir } 1151*cdf0e10cSrcweir } 1152*cdf0e10cSrcweir 1153*cdf0e10cSrcweir // ContextMenu 1154*cdf0e10cSrcweir if ( (nCode == KEY_CONTEXTMENU) || ((nCode == KEY_F10) && aKeyCode.IsShift() && !aKeyCode.IsMod1() && !aKeyCode.IsMod2() ) ) 1155*cdf0e10cSrcweir nRet = !ImplCallCommand( pChild, COMMAND_CONTEXTMENU, NULL, sal_False ); 1156*cdf0e10cSrcweir else if ( ( (nCode == KEY_F2) && aKeyCode.IsShift() ) || ( (nCode == KEY_F1) && aKeyCode.IsMod1() ) || 1157*cdf0e10cSrcweir // #101999# no active help when focus in toolbox, simulate BallonHelp instead 1158*cdf0e10cSrcweir ( (nCode == KEY_F1) && aKeyCode.IsShift() && bToolboxFocus ) ) 1159*cdf0e10cSrcweir { 1160*cdf0e10cSrcweir // TipHelp via Keyboard (Shift-F2 or Ctrl-F1) 1161*cdf0e10cSrcweir // simulate mouseposition at center of window 1162*cdf0e10cSrcweir 1163*cdf0e10cSrcweir Size aSize = pChild->GetOutputSize(); 1164*cdf0e10cSrcweir Point aPos = Point( aSize.getWidth()/2, aSize.getHeight()/2 ); 1165*cdf0e10cSrcweir aPos = pChild->OutputToScreenPixel( aPos ); 1166*cdf0e10cSrcweir 1167*cdf0e10cSrcweir HelpEvent aHelpEvent( aPos, HELPMODE_BALLOON ); 1168*cdf0e10cSrcweir aHelpEvent.SetKeyboardActivated( sal_True ); 1169*cdf0e10cSrcweir pSVData->maHelpData.mbSetKeyboardHelp = sal_True; 1170*cdf0e10cSrcweir pChild->RequestHelp( aHelpEvent ); 1171*cdf0e10cSrcweir pSVData->maHelpData.mbSetKeyboardHelp = sal_False; 1172*cdf0e10cSrcweir } 1173*cdf0e10cSrcweir else if ( (nCode == KEY_F1) || (nCode == KEY_HELP) ) 1174*cdf0e10cSrcweir { 1175*cdf0e10cSrcweir if ( !aKeyCode.GetModifier() ) 1176*cdf0e10cSrcweir { 1177*cdf0e10cSrcweir if ( pSVData->maHelpData.mbContextHelp ) 1178*cdf0e10cSrcweir { 1179*cdf0e10cSrcweir Point aMousePos = pChild->OutputToScreenPixel( pChild->GetPointerPosPixel() ); 1180*cdf0e10cSrcweir HelpEvent aHelpEvent( aMousePos, HELPMODE_CONTEXT ); 1181*cdf0e10cSrcweir pChild->RequestHelp( aHelpEvent ); 1182*cdf0e10cSrcweir } 1183*cdf0e10cSrcweir else 1184*cdf0e10cSrcweir nRet = 0; 1185*cdf0e10cSrcweir } 1186*cdf0e10cSrcweir else if ( aKeyCode.IsShift() ) 1187*cdf0e10cSrcweir { 1188*cdf0e10cSrcweir if ( pSVData->maHelpData.mbExtHelp ) 1189*cdf0e10cSrcweir Help::StartExtHelp(); 1190*cdf0e10cSrcweir else 1191*cdf0e10cSrcweir nRet = 0; 1192*cdf0e10cSrcweir } 1193*cdf0e10cSrcweir } 1194*cdf0e10cSrcweir else 1195*cdf0e10cSrcweir { 1196*cdf0e10cSrcweir if ( ImplCallHotKey( aKeyCode ) ) 1197*cdf0e10cSrcweir nRet = 1; 1198*cdf0e10cSrcweir else 1199*cdf0e10cSrcweir nRet = 0; 1200*cdf0e10cSrcweir } 1201*cdf0e10cSrcweir } 1202*cdf0e10cSrcweir } 1203*cdf0e10cSrcweir else 1204*cdf0e10cSrcweir { 1205*cdf0e10cSrcweir if ( !bKeyPreNotify && pChild->ImplGetWindowImpl()->mbKeyUp ) 1206*cdf0e10cSrcweir nRet = 0; 1207*cdf0e10cSrcweir } 1208*cdf0e10cSrcweir 1209*cdf0e10cSrcweir // #105591# send keyinput to parent if we are a floating window and the key was not pocessed yet 1210*cdf0e10cSrcweir if( !nRet && pWindow->ImplGetWindowImpl()->mbFloatWin && pWindow->GetParent() && (pWindow->ImplGetWindowImpl()->mpFrame != pWindow->GetParent()->ImplGetWindowImpl()->mpFrame) ) 1211*cdf0e10cSrcweir { 1212*cdf0e10cSrcweir pChild = pWindow->GetParent(); 1213*cdf0e10cSrcweir 1214*cdf0e10cSrcweir // call handler 1215*cdf0e10cSrcweir ImplDelData aChildDelData( pChild ); 1216*cdf0e10cSrcweir KeyEvent aKEvt( (xub_Unicode)nCharCode, aKeyCode, nRepeat ); 1217*cdf0e10cSrcweir NotifyEvent aNEvt( nSVEvent, pChild, &aKEvt ); 1218*cdf0e10cSrcweir sal_Bool bPreNotify = (ImplCallPreNotify( aNEvt ) != 0); 1219*cdf0e10cSrcweir if ( aChildDelData.IsDelete() ) 1220*cdf0e10cSrcweir return 1; 1221*cdf0e10cSrcweir 1222*cdf0e10cSrcweir if ( !bPreNotify ) 1223*cdf0e10cSrcweir { 1224*cdf0e10cSrcweir if ( nSVEvent == EVENT_KEYINPUT ) 1225*cdf0e10cSrcweir { 1226*cdf0e10cSrcweir pChild->ImplGetWindowImpl()->mbKeyInput = sal_False; 1227*cdf0e10cSrcweir pChild->KeyInput( aKEvt ); 1228*cdf0e10cSrcweir } 1229*cdf0e10cSrcweir else 1230*cdf0e10cSrcweir { 1231*cdf0e10cSrcweir pChild->ImplGetWindowImpl()->mbKeyUp = sal_False; 1232*cdf0e10cSrcweir pChild->KeyUp( aKEvt ); 1233*cdf0e10cSrcweir } 1234*cdf0e10cSrcweir // #82968# 1235*cdf0e10cSrcweir if( !aChildDelData.IsDelete() ) 1236*cdf0e10cSrcweir aNEvt.GetWindow()->ImplNotifyKeyMouseCommandEventListeners( aNEvt ); 1237*cdf0e10cSrcweir if ( aChildDelData.IsDelete() ) 1238*cdf0e10cSrcweir return 1; 1239*cdf0e10cSrcweir } 1240*cdf0e10cSrcweir 1241*cdf0e10cSrcweir if( bPreNotify || !pChild->ImplGetWindowImpl()->mbKeyInput ) 1242*cdf0e10cSrcweir nRet = 1; 1243*cdf0e10cSrcweir } 1244*cdf0e10cSrcweir 1245*cdf0e10cSrcweir return nRet; 1246*cdf0e10cSrcweir } 1247*cdf0e10cSrcweir 1248*cdf0e10cSrcweir // ----------------------------------------------------------------------- 1249*cdf0e10cSrcweir 1250*cdf0e10cSrcweir static long ImplHandleExtTextInput( Window* pWindow, 1251*cdf0e10cSrcweir const XubString& rText, 1252*cdf0e10cSrcweir const sal_uInt16* pTextAttr, 1253*cdf0e10cSrcweir sal_uLong nCursorPos, sal_uInt16 nCursorFlags ) 1254*cdf0e10cSrcweir { 1255*cdf0e10cSrcweir ImplSVData* pSVData = ImplGetSVData(); 1256*cdf0e10cSrcweir Window* pChild = NULL; 1257*cdf0e10cSrcweir 1258*cdf0e10cSrcweir int nTries = 200; 1259*cdf0e10cSrcweir while( nTries-- ) 1260*cdf0e10cSrcweir { 1261*cdf0e10cSrcweir pChild = pSVData->maWinData.mpExtTextInputWin; 1262*cdf0e10cSrcweir if ( !pChild ) 1263*cdf0e10cSrcweir { 1264*cdf0e10cSrcweir pChild = ImplGetKeyInputWindow( pWindow ); 1265*cdf0e10cSrcweir if ( !pChild ) 1266*cdf0e10cSrcweir return 0; 1267*cdf0e10cSrcweir } 1268*cdf0e10cSrcweir if( !pChild->ImplGetWindowImpl()->mpFrameData->mnFocusId ) 1269*cdf0e10cSrcweir break; 1270*cdf0e10cSrcweir Application::Yield(); 1271*cdf0e10cSrcweir } 1272*cdf0e10cSrcweir 1273*cdf0e10cSrcweir // If it is the first ExtTextInput call, we inform the information 1274*cdf0e10cSrcweir // and allocate the data, which we must store in this mode 1275*cdf0e10cSrcweir ImplWinData* pWinData = pChild->ImplGetWinData(); 1276*cdf0e10cSrcweir if ( !pChild->ImplGetWindowImpl()->mbExtTextInput ) 1277*cdf0e10cSrcweir { 1278*cdf0e10cSrcweir pChild->ImplGetWindowImpl()->mbExtTextInput = sal_True; 1279*cdf0e10cSrcweir if ( !pWinData->mpExtOldText ) 1280*cdf0e10cSrcweir pWinData->mpExtOldText = new UniString; 1281*cdf0e10cSrcweir else 1282*cdf0e10cSrcweir pWinData->mpExtOldText->Erase(); 1283*cdf0e10cSrcweir if ( pWinData->mpExtOldAttrAry ) 1284*cdf0e10cSrcweir { 1285*cdf0e10cSrcweir delete [] pWinData->mpExtOldAttrAry; 1286*cdf0e10cSrcweir pWinData->mpExtOldAttrAry = NULL; 1287*cdf0e10cSrcweir } 1288*cdf0e10cSrcweir pSVData->maWinData.mpExtTextInputWin = pChild; 1289*cdf0e10cSrcweir ImplCallCommand( pChild, COMMAND_STARTEXTTEXTINPUT ); 1290*cdf0e10cSrcweir } 1291*cdf0e10cSrcweir 1292*cdf0e10cSrcweir // be aware of being recursively called in StartExtTextInput 1293*cdf0e10cSrcweir if ( !pChild->ImplGetWindowImpl()->mbExtTextInput ) 1294*cdf0e10cSrcweir return 0; 1295*cdf0e10cSrcweir 1296*cdf0e10cSrcweir // Test for changes 1297*cdf0e10cSrcweir sal_Bool bOnlyCursor = sal_False; 1298*cdf0e10cSrcweir xub_StrLen nMinLen = Min( pWinData->mpExtOldText->Len(), rText.Len() ); 1299*cdf0e10cSrcweir xub_StrLen nDeltaStart = 0; 1300*cdf0e10cSrcweir while ( nDeltaStart < nMinLen ) 1301*cdf0e10cSrcweir { 1302*cdf0e10cSrcweir if ( pWinData->mpExtOldText->GetChar( nDeltaStart ) != rText.GetChar( nDeltaStart ) ) 1303*cdf0e10cSrcweir break; 1304*cdf0e10cSrcweir nDeltaStart++; 1305*cdf0e10cSrcweir } 1306*cdf0e10cSrcweir if ( pWinData->mpExtOldAttrAry || pTextAttr ) 1307*cdf0e10cSrcweir { 1308*cdf0e10cSrcweir if ( !pWinData->mpExtOldAttrAry || !pTextAttr ) 1309*cdf0e10cSrcweir nDeltaStart = 0; 1310*cdf0e10cSrcweir else 1311*cdf0e10cSrcweir { 1312*cdf0e10cSrcweir xub_StrLen i = 0; 1313*cdf0e10cSrcweir while ( i < nDeltaStart ) 1314*cdf0e10cSrcweir { 1315*cdf0e10cSrcweir if ( pWinData->mpExtOldAttrAry[i] != pTextAttr[i] ) 1316*cdf0e10cSrcweir { 1317*cdf0e10cSrcweir nDeltaStart = i; 1318*cdf0e10cSrcweir break; 1319*cdf0e10cSrcweir } 1320*cdf0e10cSrcweir i++; 1321*cdf0e10cSrcweir } 1322*cdf0e10cSrcweir } 1323*cdf0e10cSrcweir } 1324*cdf0e10cSrcweir if ( (nDeltaStart >= nMinLen) && 1325*cdf0e10cSrcweir (pWinData->mpExtOldText->Len() == rText.Len()) ) 1326*cdf0e10cSrcweir bOnlyCursor = sal_True; 1327*cdf0e10cSrcweir 1328*cdf0e10cSrcweir // Call Event and store the information 1329*cdf0e10cSrcweir CommandExtTextInputData aData( rText, pTextAttr, 1330*cdf0e10cSrcweir (xub_StrLen)nCursorPos, nCursorFlags, 1331*cdf0e10cSrcweir nDeltaStart, pWinData->mpExtOldText->Len(), 1332*cdf0e10cSrcweir bOnlyCursor ); 1333*cdf0e10cSrcweir *pWinData->mpExtOldText = rText; 1334*cdf0e10cSrcweir if ( pWinData->mpExtOldAttrAry ) 1335*cdf0e10cSrcweir { 1336*cdf0e10cSrcweir delete [] pWinData->mpExtOldAttrAry; 1337*cdf0e10cSrcweir pWinData->mpExtOldAttrAry = NULL; 1338*cdf0e10cSrcweir } 1339*cdf0e10cSrcweir if ( pTextAttr ) 1340*cdf0e10cSrcweir { 1341*cdf0e10cSrcweir pWinData->mpExtOldAttrAry = new sal_uInt16[rText.Len()]; 1342*cdf0e10cSrcweir memcpy( pWinData->mpExtOldAttrAry, pTextAttr, rText.Len()*sizeof( sal_uInt16 ) ); 1343*cdf0e10cSrcweir } 1344*cdf0e10cSrcweir return !ImplCallCommand( pChild, COMMAND_EXTTEXTINPUT, &aData ); 1345*cdf0e10cSrcweir } 1346*cdf0e10cSrcweir 1347*cdf0e10cSrcweir // ----------------------------------------------------------------------- 1348*cdf0e10cSrcweir 1349*cdf0e10cSrcweir static long ImplHandleEndExtTextInput( Window* /* pWindow */ ) 1350*cdf0e10cSrcweir { 1351*cdf0e10cSrcweir ImplSVData* pSVData = ImplGetSVData(); 1352*cdf0e10cSrcweir Window* pChild = pSVData->maWinData.mpExtTextInputWin; 1353*cdf0e10cSrcweir long nRet = 0; 1354*cdf0e10cSrcweir 1355*cdf0e10cSrcweir if ( pChild ) 1356*cdf0e10cSrcweir { 1357*cdf0e10cSrcweir pChild->ImplGetWindowImpl()->mbExtTextInput = sal_False; 1358*cdf0e10cSrcweir pSVData->maWinData.mpExtTextInputWin = NULL; 1359*cdf0e10cSrcweir ImplWinData* pWinData = pChild->ImplGetWinData(); 1360*cdf0e10cSrcweir if ( pWinData->mpExtOldText ) 1361*cdf0e10cSrcweir { 1362*cdf0e10cSrcweir delete pWinData->mpExtOldText; 1363*cdf0e10cSrcweir pWinData->mpExtOldText = NULL; 1364*cdf0e10cSrcweir } 1365*cdf0e10cSrcweir if ( pWinData->mpExtOldAttrAry ) 1366*cdf0e10cSrcweir { 1367*cdf0e10cSrcweir delete [] pWinData->mpExtOldAttrAry; 1368*cdf0e10cSrcweir pWinData->mpExtOldAttrAry = NULL; 1369*cdf0e10cSrcweir } 1370*cdf0e10cSrcweir nRet = !ImplCallCommand( pChild, COMMAND_ENDEXTTEXTINPUT ); 1371*cdf0e10cSrcweir } 1372*cdf0e10cSrcweir 1373*cdf0e10cSrcweir return nRet; 1374*cdf0e10cSrcweir } 1375*cdf0e10cSrcweir 1376*cdf0e10cSrcweir // ----------------------------------------------------------------------- 1377*cdf0e10cSrcweir 1378*cdf0e10cSrcweir static void ImplHandleExtTextInputPos( Window* pWindow, 1379*cdf0e10cSrcweir Rectangle& rRect, long& rInputWidth, 1380*cdf0e10cSrcweir bool * pVertical ) 1381*cdf0e10cSrcweir { 1382*cdf0e10cSrcweir ImplSVData* pSVData = ImplGetSVData(); 1383*cdf0e10cSrcweir Window* pChild = pSVData->maWinData.mpExtTextInputWin; 1384*cdf0e10cSrcweir 1385*cdf0e10cSrcweir if ( !pChild ) 1386*cdf0e10cSrcweir pChild = ImplGetKeyInputWindow( pWindow ); 1387*cdf0e10cSrcweir else 1388*cdf0e10cSrcweir { 1389*cdf0e10cSrcweir // Test, if the Window is related to the frame 1390*cdf0e10cSrcweir if ( !pWindow->ImplIsWindowOrChild( pChild ) ) 1391*cdf0e10cSrcweir pChild = ImplGetKeyInputWindow( pWindow ); 1392*cdf0e10cSrcweir } 1393*cdf0e10cSrcweir 1394*cdf0e10cSrcweir if ( pChild ) 1395*cdf0e10cSrcweir { 1396*cdf0e10cSrcweir ImplCallCommand( pChild, COMMAND_CURSORPOS ); 1397*cdf0e10cSrcweir const Rectangle* pRect = pChild->GetCursorRect(); 1398*cdf0e10cSrcweir if ( pRect ) 1399*cdf0e10cSrcweir rRect = pChild->ImplLogicToDevicePixel( *pRect ); 1400*cdf0e10cSrcweir else 1401*cdf0e10cSrcweir { 1402*cdf0e10cSrcweir Cursor* pCursor = pChild->GetCursor(); 1403*cdf0e10cSrcweir if ( pCursor ) 1404*cdf0e10cSrcweir { 1405*cdf0e10cSrcweir Point aPos = pChild->ImplLogicToDevicePixel( pCursor->GetPos() ); 1406*cdf0e10cSrcweir Size aSize = pChild->LogicToPixel( pCursor->GetSize() ); 1407*cdf0e10cSrcweir if ( !aSize.Width() ) 1408*cdf0e10cSrcweir aSize.Width() = pChild->GetSettings().GetStyleSettings().GetCursorSize(); 1409*cdf0e10cSrcweir rRect = Rectangle( aPos, aSize ); 1410*cdf0e10cSrcweir } 1411*cdf0e10cSrcweir else 1412*cdf0e10cSrcweir rRect = Rectangle( Point( pChild->GetOutOffXPixel(), pChild->GetOutOffYPixel() ), Size() ); 1413*cdf0e10cSrcweir } 1414*cdf0e10cSrcweir rInputWidth = pChild->ImplLogicWidthToDevicePixel( pChild->GetCursorExtTextInputWidth() ); 1415*cdf0e10cSrcweir if ( !rInputWidth ) 1416*cdf0e10cSrcweir rInputWidth = rRect.GetWidth(); 1417*cdf0e10cSrcweir } 1418*cdf0e10cSrcweir if (pVertical != 0) 1419*cdf0e10cSrcweir *pVertical 1420*cdf0e10cSrcweir = pChild != 0 && pChild->GetInputContext().GetFont().IsVertical(); 1421*cdf0e10cSrcweir } 1422*cdf0e10cSrcweir 1423*cdf0e10cSrcweir // ----------------------------------------------------------------------- 1424*cdf0e10cSrcweir 1425*cdf0e10cSrcweir static long ImplHandleInputContextChange( Window* pWindow, LanguageType eNewLang ) 1426*cdf0e10cSrcweir { 1427*cdf0e10cSrcweir Window* pChild = ImplGetKeyInputWindow( pWindow ); 1428*cdf0e10cSrcweir CommandInputContextData aData( eNewLang ); 1429*cdf0e10cSrcweir return !ImplCallCommand( pChild, COMMAND_INPUTCONTEXTCHANGE, &aData ); 1430*cdf0e10cSrcweir } 1431*cdf0e10cSrcweir 1432*cdf0e10cSrcweir // ----------------------------------------------------------------------- 1433*cdf0e10cSrcweir 1434*cdf0e10cSrcweir static sal_Bool ImplCallWheelCommand( Window* pWindow, const Point& rPos, 1435*cdf0e10cSrcweir const CommandWheelData* pWheelData ) 1436*cdf0e10cSrcweir { 1437*cdf0e10cSrcweir Point aCmdMousePos = pWindow->ImplFrameToOutput( rPos ); 1438*cdf0e10cSrcweir CommandEvent aCEvt( aCmdMousePos, COMMAND_WHEEL, sal_True, pWheelData ); 1439*cdf0e10cSrcweir NotifyEvent aNCmdEvt( EVENT_COMMAND, pWindow, &aCEvt ); 1440*cdf0e10cSrcweir ImplDelData aDelData( pWindow ); 1441*cdf0e10cSrcweir sal_Bool bPreNotify = (ImplCallPreNotify( aNCmdEvt ) != 0); 1442*cdf0e10cSrcweir if ( aDelData.IsDelete() ) 1443*cdf0e10cSrcweir return sal_False; 1444*cdf0e10cSrcweir if ( !bPreNotify ) 1445*cdf0e10cSrcweir { 1446*cdf0e10cSrcweir pWindow->ImplGetWindowImpl()->mbCommand = sal_False; 1447*cdf0e10cSrcweir pWindow->Command( aCEvt ); 1448*cdf0e10cSrcweir if ( aDelData.IsDelete() ) 1449*cdf0e10cSrcweir return sal_False; 1450*cdf0e10cSrcweir if ( pWindow->ImplGetWindowImpl()->mbCommand ) 1451*cdf0e10cSrcweir return sal_True; 1452*cdf0e10cSrcweir } 1453*cdf0e10cSrcweir return sal_False; 1454*cdf0e10cSrcweir } 1455*cdf0e10cSrcweir 1456*cdf0e10cSrcweir // ----------------------------------------------------------------------- 1457*cdf0e10cSrcweir 1458*cdf0e10cSrcweir static long ImplHandleWheelEvent( Window* pWindow, const SalWheelMouseEvent& rEvt ) 1459*cdf0e10cSrcweir { 1460*cdf0e10cSrcweir ImplDelData aDogTag( pWindow ); 1461*cdf0e10cSrcweir 1462*cdf0e10cSrcweir ImplSVData* pSVData = ImplGetSVData(); 1463*cdf0e10cSrcweir if ( pSVData->maWinData.mpAutoScrollWin ) 1464*cdf0e10cSrcweir pSVData->maWinData.mpAutoScrollWin->EndAutoScroll(); 1465*cdf0e10cSrcweir if ( pSVData->maHelpData.mpHelpWin ) 1466*cdf0e10cSrcweir ImplDestroyHelpWindow( true ); 1467*cdf0e10cSrcweir if( aDogTag.IsDelete() ) 1468*cdf0e10cSrcweir return 0; 1469*cdf0e10cSrcweir 1470*cdf0e10cSrcweir sal_uInt16 nMode; 1471*cdf0e10cSrcweir sal_uInt16 nCode = rEvt.mnCode; 1472*cdf0e10cSrcweir bool bHorz = rEvt.mbHorz; 1473*cdf0e10cSrcweir bool bPixel = rEvt.mbDeltaIsPixel; 1474*cdf0e10cSrcweir if ( nCode & KEY_MOD1 ) 1475*cdf0e10cSrcweir nMode = COMMAND_WHEEL_ZOOM; 1476*cdf0e10cSrcweir else if ( nCode & KEY_MOD2 ) 1477*cdf0e10cSrcweir nMode = COMMAND_WHEEL_DATAZOOM; 1478*cdf0e10cSrcweir else 1479*cdf0e10cSrcweir { 1480*cdf0e10cSrcweir nMode = COMMAND_WHEEL_SCROLL; 1481*cdf0e10cSrcweir // #i85450# interpret shift-wheel as horizontal wheel action 1482*cdf0e10cSrcweir if( (nCode & (KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_MOD3)) == KEY_SHIFT ) 1483*cdf0e10cSrcweir bHorz = true; 1484*cdf0e10cSrcweir } 1485*cdf0e10cSrcweir 1486*cdf0e10cSrcweir CommandWheelData aWheelData( rEvt.mnDelta, rEvt.mnNotchDelta, rEvt.mnScrollLines, nMode, nCode, bHorz, bPixel ); 1487*cdf0e10cSrcweir Point aMousePos( rEvt.mnX, rEvt.mnY ); 1488*cdf0e10cSrcweir sal_Bool bRet = sal_True; 1489*cdf0e10cSrcweir 1490*cdf0e10cSrcweir // first check any floating window ( eg. drop down listboxes) 1491*cdf0e10cSrcweir bool bIsFloat = false; 1492*cdf0e10cSrcweir Window *pMouseWindow = NULL; 1493*cdf0e10cSrcweir if ( pSVData->maWinData.mpFirstFloat && !pSVData->maWinData.mpCaptureWin && 1494*cdf0e10cSrcweir !pSVData->maWinData.mpFirstFloat->ImplIsFloatPopupModeWindow( pWindow ) ) 1495*cdf0e10cSrcweir { 1496*cdf0e10cSrcweir sal_uInt16 nHitTest = IMPL_FLOATWIN_HITTEST_OUTSIDE; 1497*cdf0e10cSrcweir pMouseWindow = pSVData->maWinData.mpFirstFloat->ImplFloatHitTest( pWindow, aMousePos, nHitTest ); 1498*cdf0e10cSrcweir } 1499*cdf0e10cSrcweir // then try the window directly beneath the mouse 1500*cdf0e10cSrcweir if( !pMouseWindow ) 1501*cdf0e10cSrcweir pMouseWindow = pWindow->ImplFindWindow( aMousePos ); 1502*cdf0e10cSrcweir else 1503*cdf0e10cSrcweir { 1504*cdf0e10cSrcweir // transform coordinates to float window frame coordinates 1505*cdf0e10cSrcweir pMouseWindow = pMouseWindow->ImplFindWindow( 1506*cdf0e10cSrcweir pMouseWindow->OutputToScreenPixel( 1507*cdf0e10cSrcweir pMouseWindow->AbsoluteScreenToOutputPixel( 1508*cdf0e10cSrcweir pWindow->OutputToAbsoluteScreenPixel( 1509*cdf0e10cSrcweir pWindow->ScreenToOutputPixel( aMousePos ) ) ) ) ); 1510*cdf0e10cSrcweir bIsFloat = true; 1511*cdf0e10cSrcweir } 1512*cdf0e10cSrcweir 1513*cdf0e10cSrcweir if ( pMouseWindow && 1514*cdf0e10cSrcweir pMouseWindow->IsEnabled() && pMouseWindow->IsInputEnabled() && ! pMouseWindow->IsInModalMode() ) 1515*cdf0e10cSrcweir { 1516*cdf0e10cSrcweir // transform coordinates to float window frame coordinates 1517*cdf0e10cSrcweir Point aRelMousePos( pMouseWindow->OutputToScreenPixel( 1518*cdf0e10cSrcweir pMouseWindow->AbsoluteScreenToOutputPixel( 1519*cdf0e10cSrcweir pWindow->OutputToAbsoluteScreenPixel( 1520*cdf0e10cSrcweir pWindow->ScreenToOutputPixel( aMousePos ) ) ) ) ); 1521*cdf0e10cSrcweir bRet = ImplCallWheelCommand( pMouseWindow, aRelMousePos, &aWheelData ); 1522*cdf0e10cSrcweir } 1523*cdf0e10cSrcweir 1524*cdf0e10cSrcweir // if the commad was not handled try the focus window 1525*cdf0e10cSrcweir if ( bRet ) 1526*cdf0e10cSrcweir { 1527*cdf0e10cSrcweir Window* pFocusWindow = pWindow->ImplGetWindowImpl()->mpFrameData->mpFocusWin; 1528*cdf0e10cSrcweir if ( pFocusWindow && (pFocusWindow != pMouseWindow) && 1529*cdf0e10cSrcweir (pFocusWindow == pSVData->maWinData.mpFocusWin) ) 1530*cdf0e10cSrcweir { 1531*cdf0e10cSrcweir // no wheel-messages to disabled windows 1532*cdf0e10cSrcweir if ( pFocusWindow->IsEnabled() && pFocusWindow->IsInputEnabled() && ! pFocusWindow->IsInModalMode() ) 1533*cdf0e10cSrcweir { 1534*cdf0e10cSrcweir // transform coordinates to focus window frame coordinates 1535*cdf0e10cSrcweir Point aRelMousePos( pFocusWindow->OutputToScreenPixel( 1536*cdf0e10cSrcweir pFocusWindow->AbsoluteScreenToOutputPixel( 1537*cdf0e10cSrcweir pWindow->OutputToAbsoluteScreenPixel( 1538*cdf0e10cSrcweir pWindow->ScreenToOutputPixel( aMousePos ) ) ) ) ); 1539*cdf0e10cSrcweir bRet = ImplCallWheelCommand( pFocusWindow, aRelMousePos, &aWheelData ); 1540*cdf0e10cSrcweir } 1541*cdf0e10cSrcweir } 1542*cdf0e10cSrcweir } 1543*cdf0e10cSrcweir 1544*cdf0e10cSrcweir // close floaters 1545*cdf0e10cSrcweir if( ! bIsFloat && pSVData->maWinData.mpFirstFloat ) 1546*cdf0e10cSrcweir { 1547*cdf0e10cSrcweir FloatingWindow* pLastLevelFloat = pSVData->maWinData.mpFirstFloat->ImplFindLastLevelFloat(); 1548*cdf0e10cSrcweir if( pLastLevelFloat ) 1549*cdf0e10cSrcweir { 1550*cdf0e10cSrcweir sal_uLong nPopupFlags = pLastLevelFloat->GetPopupModeFlags(); 1551*cdf0e10cSrcweir if ( nPopupFlags & FLOATWIN_POPUPMODE_ALLMOUSEBUTTONCLOSE ) 1552*cdf0e10cSrcweir { 1553*cdf0e10cSrcweir pLastLevelFloat->EndPopupMode( FLOATWIN_POPUPMODEEND_CANCEL | FLOATWIN_POPUPMODEEND_CLOSEALL ); 1554*cdf0e10cSrcweir } 1555*cdf0e10cSrcweir } 1556*cdf0e10cSrcweir } 1557*cdf0e10cSrcweir 1558*cdf0e10cSrcweir return !bRet; 1559*cdf0e10cSrcweir } 1560*cdf0e10cSrcweir 1561*cdf0e10cSrcweir // ----------------------------------------------------------------------- 1562*cdf0e10cSrcweir #define IMPL_PAINT_CHECKRTL ((sal_uInt16)0x0020) 1563*cdf0e10cSrcweir 1564*cdf0e10cSrcweir static void ImplHandlePaint( Window* pWindow, const Rectangle& rBoundRect, bool bImmediateUpdate ) 1565*cdf0e10cSrcweir { 1566*cdf0e10cSrcweir // give up background save when sytem paints arrive 1567*cdf0e10cSrcweir Window* pSaveBackWin = pWindow->ImplGetWindowImpl()->mpFrameData->mpFirstBackWin; 1568*cdf0e10cSrcweir while ( pSaveBackWin ) 1569*cdf0e10cSrcweir { 1570*cdf0e10cSrcweir Window* pNext = pSaveBackWin->ImplGetWindowImpl()->mpOverlapData->mpNextBackWin; 1571*cdf0e10cSrcweir Rectangle aRect( Point( pSaveBackWin->GetOutOffXPixel(), pSaveBackWin->GetOutOffYPixel() ), 1572*cdf0e10cSrcweir Size( pSaveBackWin->GetOutputWidthPixel(), pSaveBackWin->GetOutputHeightPixel() ) ); 1573*cdf0e10cSrcweir if ( aRect.IsOver( rBoundRect ) ) 1574*cdf0e10cSrcweir pSaveBackWin->ImplDeleteOverlapBackground(); 1575*cdf0e10cSrcweir pSaveBackWin = pNext; 1576*cdf0e10cSrcweir } 1577*cdf0e10cSrcweir 1578*cdf0e10cSrcweir // system paint events must be checked for re-mirroring 1579*cdf0e10cSrcweir pWindow->ImplGetWindowImpl()->mnPaintFlags |= IMPL_PAINT_CHECKRTL; 1580*cdf0e10cSrcweir 1581*cdf0e10cSrcweir // trigger paint for all windows that live in the new paint region 1582*cdf0e10cSrcweir Region aRegion( rBoundRect ); 1583*cdf0e10cSrcweir pWindow->ImplInvalidateOverlapFrameRegion( aRegion ); 1584*cdf0e10cSrcweir if( bImmediateUpdate ) 1585*cdf0e10cSrcweir { 1586*cdf0e10cSrcweir // #i87663# trigger possible pending resize notifications 1587*cdf0e10cSrcweir // (GetSizePixel does that for us) 1588*cdf0e10cSrcweir pWindow->GetSizePixel(); 1589*cdf0e10cSrcweir // force drawing inmmediately 1590*cdf0e10cSrcweir pWindow->Update(); 1591*cdf0e10cSrcweir } 1592*cdf0e10cSrcweir } 1593*cdf0e10cSrcweir 1594*cdf0e10cSrcweir // ----------------------------------------------------------------------- 1595*cdf0e10cSrcweir 1596*cdf0e10cSrcweir static void KillOwnPopups( Window* pWindow ) 1597*cdf0e10cSrcweir { 1598*cdf0e10cSrcweir ImplSVData* pSVData = ImplGetSVData(); 1599*cdf0e10cSrcweir Window *pParent = pWindow->ImplGetWindowImpl()->mpFrameWindow; 1600*cdf0e10cSrcweir Window *pChild = pSVData->maWinData.mpFirstFloat; 1601*cdf0e10cSrcweir if ( pChild && pParent->ImplIsWindowOrChild( pChild, sal_True ) ) 1602*cdf0e10cSrcweir { 1603*cdf0e10cSrcweir if ( !(pSVData->maWinData.mpFirstFloat->GetPopupModeFlags() & FLOATWIN_POPUPMODE_NOAPPFOCUSCLOSE) ) 1604*cdf0e10cSrcweir pSVData->maWinData.mpFirstFloat->EndPopupMode( FLOATWIN_POPUPMODEEND_CANCEL | FLOATWIN_POPUPMODEEND_CLOSEALL ); 1605*cdf0e10cSrcweir } 1606*cdf0e10cSrcweir } 1607*cdf0e10cSrcweir 1608*cdf0e10cSrcweir // ----------------------------------------------------------------------- 1609*cdf0e10cSrcweir 1610*cdf0e10cSrcweir void ImplHandleResize( Window* pWindow, long nNewWidth, long nNewHeight ) 1611*cdf0e10cSrcweir { 1612*cdf0e10cSrcweir if( pWindow->GetStyle() & (WB_MOVEABLE|WB_SIZEABLE) ) 1613*cdf0e10cSrcweir { 1614*cdf0e10cSrcweir KillOwnPopups( pWindow ); 1615*cdf0e10cSrcweir if( pWindow->ImplGetWindow() != ImplGetSVData()->maHelpData.mpHelpWin ) 1616*cdf0e10cSrcweir ImplDestroyHelpWindow( true ); 1617*cdf0e10cSrcweir } 1618*cdf0e10cSrcweir 1619*cdf0e10cSrcweir if ( 1620*cdf0e10cSrcweir (nNewWidth > 0 && nNewHeight > 0) || 1621*cdf0e10cSrcweir pWindow->ImplGetWindow()->ImplGetWindowImpl()->mbAllResize 1622*cdf0e10cSrcweir ) 1623*cdf0e10cSrcweir { 1624*cdf0e10cSrcweir if ( (nNewWidth != pWindow->GetOutputWidthPixel()) || (nNewHeight != pWindow->GetOutputHeightPixel()) ) 1625*cdf0e10cSrcweir { 1626*cdf0e10cSrcweir pWindow->mnOutWidth = nNewWidth; 1627*cdf0e10cSrcweir pWindow->mnOutHeight = nNewHeight; 1628*cdf0e10cSrcweir pWindow->ImplGetWindowImpl()->mbWaitSystemResize = sal_False; 1629*cdf0e10cSrcweir if ( pWindow->IsReallyVisible() ) 1630*cdf0e10cSrcweir pWindow->ImplSetClipFlag(); 1631*cdf0e10cSrcweir if ( pWindow->IsVisible() || pWindow->ImplGetWindow()->ImplGetWindowImpl()->mbAllResize || 1632*cdf0e10cSrcweir ( pWindow->ImplGetWindowImpl()->mbFrame && pWindow->ImplGetWindowImpl()->mpClientWindow ) ) // propagate resize for system border windows 1633*cdf0e10cSrcweir { 1634*cdf0e10cSrcweir bool bStartTimer = true; 1635*cdf0e10cSrcweir // use resize buffering for user resizes 1636*cdf0e10cSrcweir // ownerdraw decorated windows and floating windows can be resized immediately (i.e. synchronously) 1637*cdf0e10cSrcweir if( pWindow->ImplGetWindowImpl()->mbFrame && (pWindow->GetStyle() & WB_SIZEABLE) 1638*cdf0e10cSrcweir && !(pWindow->GetStyle() & WB_OWNERDRAWDECORATION) // synchronous resize for ownerdraw decorated windows (toolbars) 1639*cdf0e10cSrcweir && !pWindow->ImplGetWindowImpl()->mbFloatWin ) // synchronous resize for floating windows, #i43799# 1640*cdf0e10cSrcweir { 1641*cdf0e10cSrcweir if( pWindow->ImplGetWindowImpl()->mpClientWindow ) 1642*cdf0e10cSrcweir { 1643*cdf0e10cSrcweir // #i42750# presentation wants to be informed about resize 1644*cdf0e10cSrcweir // as early as possible 1645*cdf0e10cSrcweir WorkWindow* pWorkWindow = dynamic_cast<WorkWindow*>(pWindow->ImplGetWindowImpl()->mpClientWindow); 1646*cdf0e10cSrcweir if( ! pWorkWindow || pWorkWindow->IsPresentationMode() ) 1647*cdf0e10cSrcweir bStartTimer = false; 1648*cdf0e10cSrcweir } 1649*cdf0e10cSrcweir else 1650*cdf0e10cSrcweir { 1651*cdf0e10cSrcweir WorkWindow* pWorkWindow = dynamic_cast<WorkWindow*>(pWindow); 1652*cdf0e10cSrcweir if( ! pWorkWindow || pWorkWindow->IsPresentationMode() ) 1653*cdf0e10cSrcweir bStartTimer = false; 1654*cdf0e10cSrcweir } 1655*cdf0e10cSrcweir } 1656*cdf0e10cSrcweir else 1657*cdf0e10cSrcweir bStartTimer = false; 1658*cdf0e10cSrcweir 1659*cdf0e10cSrcweir if( bStartTimer ) 1660*cdf0e10cSrcweir pWindow->ImplGetWindowImpl()->mpFrameData->maResizeTimer.Start(); 1661*cdf0e10cSrcweir else 1662*cdf0e10cSrcweir pWindow->ImplCallResize(); // otherwise menues cannot be positioned 1663*cdf0e10cSrcweir } 1664*cdf0e10cSrcweir else 1665*cdf0e10cSrcweir pWindow->ImplGetWindowImpl()->mbCallResize = sal_True; 1666*cdf0e10cSrcweir } 1667*cdf0e10cSrcweir } 1668*cdf0e10cSrcweir 1669*cdf0e10cSrcweir pWindow->ImplGetWindowImpl()->mpFrameData->mbNeedSysWindow = (nNewWidth < IMPL_MIN_NEEDSYSWIN) || 1670*cdf0e10cSrcweir (nNewHeight < IMPL_MIN_NEEDSYSWIN); 1671*cdf0e10cSrcweir sal_Bool bMinimized = (nNewWidth <= 0) || (nNewHeight <= 0); 1672*cdf0e10cSrcweir if( bMinimized != pWindow->ImplGetWindowImpl()->mpFrameData->mbMinimized ) 1673*cdf0e10cSrcweir pWindow->ImplGetWindowImpl()->mpFrameWindow->ImplNotifyIconifiedState( bMinimized ); 1674*cdf0e10cSrcweir pWindow->ImplGetWindowImpl()->mpFrameData->mbMinimized = bMinimized; 1675*cdf0e10cSrcweir } 1676*cdf0e10cSrcweir 1677*cdf0e10cSrcweir // ----------------------------------------------------------------------- 1678*cdf0e10cSrcweir 1679*cdf0e10cSrcweir static void ImplHandleMove( Window* pWindow ) 1680*cdf0e10cSrcweir { 1681*cdf0e10cSrcweir if( pWindow->ImplGetWindowImpl()->mbFrame && pWindow->ImplIsFloatingWindow() && pWindow->IsReallyVisible() ) 1682*cdf0e10cSrcweir { 1683*cdf0e10cSrcweir static_cast<FloatingWindow*>(pWindow)->EndPopupMode( FLOATWIN_POPUPMODEEND_TEAROFF ); 1684*cdf0e10cSrcweir pWindow->ImplCallMove(); 1685*cdf0e10cSrcweir } 1686*cdf0e10cSrcweir 1687*cdf0e10cSrcweir if( pWindow->GetStyle() & (WB_MOVEABLE|WB_SIZEABLE) ) 1688*cdf0e10cSrcweir { 1689*cdf0e10cSrcweir KillOwnPopups( pWindow ); 1690*cdf0e10cSrcweir if( pWindow->ImplGetWindow() != ImplGetSVData()->maHelpData.mpHelpWin ) 1691*cdf0e10cSrcweir ImplDestroyHelpWindow( true ); 1692*cdf0e10cSrcweir } 1693*cdf0e10cSrcweir 1694*cdf0e10cSrcweir if ( pWindow->IsVisible() ) 1695*cdf0e10cSrcweir pWindow->ImplCallMove(); 1696*cdf0e10cSrcweir else 1697*cdf0e10cSrcweir pWindow->ImplGetWindowImpl()->mbCallMove = sal_True; // make sure the framepos will be updated on the next Show() 1698*cdf0e10cSrcweir 1699*cdf0e10cSrcweir if ( pWindow->ImplGetWindowImpl()->mbFrame && pWindow->ImplGetWindowImpl()->mpClientWindow ) 1700*cdf0e10cSrcweir pWindow->ImplGetWindowImpl()->mpClientWindow->ImplCallMove(); // notify client to update geometry 1701*cdf0e10cSrcweir 1702*cdf0e10cSrcweir } 1703*cdf0e10cSrcweir 1704*cdf0e10cSrcweir // ----------------------------------------------------------------------- 1705*cdf0e10cSrcweir 1706*cdf0e10cSrcweir static void ImplHandleMoveResize( Window* pWindow, long nNewWidth, long nNewHeight ) 1707*cdf0e10cSrcweir { 1708*cdf0e10cSrcweir ImplHandleMove( pWindow ); 1709*cdf0e10cSrcweir ImplHandleResize( pWindow, nNewWidth, nNewHeight ); 1710*cdf0e10cSrcweir } 1711*cdf0e10cSrcweir 1712*cdf0e10cSrcweir // ----------------------------------------------------------------------- 1713*cdf0e10cSrcweir 1714*cdf0e10cSrcweir static void ImplActivateFloatingWindows( Window* pWindow, sal_Bool bActive ) 1715*cdf0e10cSrcweir { 1716*cdf0e10cSrcweir // Zuerst alle ueberlappenden Fenster ueberpruefen 1717*cdf0e10cSrcweir Window* pTempWindow = pWindow->ImplGetWindowImpl()->mpFirstOverlap; 1718*cdf0e10cSrcweir while ( pTempWindow ) 1719*cdf0e10cSrcweir { 1720*cdf0e10cSrcweir if ( !pTempWindow->GetActivateMode() ) 1721*cdf0e10cSrcweir { 1722*cdf0e10cSrcweir if ( (pTempWindow->GetType() == WINDOW_BORDERWINDOW) && 1723*cdf0e10cSrcweir (pTempWindow->ImplGetWindow()->GetType() == WINDOW_FLOATINGWINDOW) ) 1724*cdf0e10cSrcweir ((ImplBorderWindow*)pTempWindow)->SetDisplayActive( bActive ); 1725*cdf0e10cSrcweir } 1726*cdf0e10cSrcweir 1727*cdf0e10cSrcweir ImplActivateFloatingWindows( pTempWindow, bActive ); 1728*cdf0e10cSrcweir pTempWindow = pTempWindow->ImplGetWindowImpl()->mpNext; 1729*cdf0e10cSrcweir } 1730*cdf0e10cSrcweir } 1731*cdf0e10cSrcweir 1732*cdf0e10cSrcweir 1733*cdf0e10cSrcweir // ----------------------------------------------------------------------- 1734*cdf0e10cSrcweir 1735*cdf0e10cSrcweir IMPL_LINK( Window, ImplAsyncFocusHdl, void*, EMPTYARG ) 1736*cdf0e10cSrcweir { 1737*cdf0e10cSrcweir ImplGetWindowImpl()->mpFrameData->mnFocusId = 0; 1738*cdf0e10cSrcweir 1739*cdf0e10cSrcweir // Wenn Status erhalten geblieben ist, weil wir den Focus in der 1740*cdf0e10cSrcweir // zwischenzeit schon wiederbekommen haben, brauchen wir auch 1741*cdf0e10cSrcweir // nichts machen 1742*cdf0e10cSrcweir sal_Bool bHasFocus = ImplGetWindowImpl()->mpFrameData->mbHasFocus || ImplGetWindowImpl()->mpFrameData->mbSysObjFocus; 1743*cdf0e10cSrcweir 1744*cdf0e10cSrcweir // Dann die zeitverzoegerten Funktionen ausfuehren 1745*cdf0e10cSrcweir if ( bHasFocus ) 1746*cdf0e10cSrcweir { 1747*cdf0e10cSrcweir // Alle FloatingFenster deaktiv zeichnen 1748*cdf0e10cSrcweir if ( ImplGetWindowImpl()->mpFrameData->mbStartFocusState != bHasFocus ) 1749*cdf0e10cSrcweir ImplActivateFloatingWindows( this, bHasFocus ); 1750*cdf0e10cSrcweir 1751*cdf0e10cSrcweir if ( ImplGetWindowImpl()->mpFrameData->mpFocusWin ) 1752*cdf0e10cSrcweir { 1753*cdf0e10cSrcweir sal_Bool bHandled = sal_False; 1754*cdf0e10cSrcweir if ( ImplGetWindowImpl()->mpFrameData->mpFocusWin->IsInputEnabled() && 1755*cdf0e10cSrcweir ! ImplGetWindowImpl()->mpFrameData->mpFocusWin->IsInModalMode() ) 1756*cdf0e10cSrcweir { 1757*cdf0e10cSrcweir if ( ImplGetWindowImpl()->mpFrameData->mpFocusWin->IsEnabled() ) 1758*cdf0e10cSrcweir { 1759*cdf0e10cSrcweir ImplGetWindowImpl()->mpFrameData->mpFocusWin->GrabFocus(); 1760*cdf0e10cSrcweir bHandled = sal_True; 1761*cdf0e10cSrcweir } 1762*cdf0e10cSrcweir else if( ImplGetWindowImpl()->mpFrameData->mpFocusWin->ImplHasDlgCtrl() ) 1763*cdf0e10cSrcweir { 1764*cdf0e10cSrcweir // #109094# if the focus is restored to a disabled dialog control (was disabled meanwhile) 1765*cdf0e10cSrcweir // try to move it to the next control 1766*cdf0e10cSrcweir ImplGetWindowImpl()->mpFrameData->mpFocusWin->ImplDlgCtrlNextWindow(); 1767*cdf0e10cSrcweir bHandled = sal_True; 1768*cdf0e10cSrcweir } 1769*cdf0e10cSrcweir } 1770*cdf0e10cSrcweir if ( !bHandled ) 1771*cdf0e10cSrcweir { 1772*cdf0e10cSrcweir ImplSVData* pSVData = ImplGetSVData(); 1773*cdf0e10cSrcweir Window* pTopLevelWindow = ImplGetWindowImpl()->mpFrameData->mpFocusWin->ImplGetFirstOverlapWindow(); 1774*cdf0e10cSrcweir if ( ( ! pTopLevelWindow->IsInputEnabled() || pTopLevelWindow->IsInModalMode() ) 1775*cdf0e10cSrcweir && pSVData->maWinData.mpLastExecuteDlg ) 1776*cdf0e10cSrcweir pSVData->maWinData.mpLastExecuteDlg->ToTop( TOTOP_RESTOREWHENMIN | TOTOP_GRABFOCUSONLY); 1777*cdf0e10cSrcweir else 1778*cdf0e10cSrcweir pTopLevelWindow->GrabFocus(); 1779*cdf0e10cSrcweir } 1780*cdf0e10cSrcweir } 1781*cdf0e10cSrcweir else 1782*cdf0e10cSrcweir GrabFocus(); 1783*cdf0e10cSrcweir } 1784*cdf0e10cSrcweir else 1785*cdf0e10cSrcweir { 1786*cdf0e10cSrcweir Window* pFocusWin = ImplGetWindowImpl()->mpFrameData->mpFocusWin; 1787*cdf0e10cSrcweir if ( pFocusWin ) 1788*cdf0e10cSrcweir { 1789*cdf0e10cSrcweir ImplSVData* pSVData = ImplGetSVData(); 1790*cdf0e10cSrcweir 1791*cdf0e10cSrcweir if ( pSVData->maWinData.mpFocusWin == pFocusWin ) 1792*cdf0e10cSrcweir { 1793*cdf0e10cSrcweir // FocusWindow umsetzen 1794*cdf0e10cSrcweir Window* pOverlapWindow = pFocusWin->ImplGetFirstOverlapWindow(); 1795*cdf0e10cSrcweir pOverlapWindow->ImplGetWindowImpl()->mpLastFocusWindow = pFocusWin; 1796*cdf0e10cSrcweir pSVData->maWinData.mpFocusWin = NULL; 1797*cdf0e10cSrcweir 1798*cdf0e10cSrcweir if ( pFocusWin->ImplGetWindowImpl()->mpCursor ) 1799*cdf0e10cSrcweir pFocusWin->ImplGetWindowImpl()->mpCursor->ImplHide( true ); 1800*cdf0e10cSrcweir 1801*cdf0e10cSrcweir // Deaktivate rufen 1802*cdf0e10cSrcweir Window* pOldFocusWindow = pFocusWin; 1803*cdf0e10cSrcweir if ( pOldFocusWindow ) 1804*cdf0e10cSrcweir { 1805*cdf0e10cSrcweir Window* pOldOverlapWindow = pOldFocusWindow->ImplGetFirstOverlapWindow(); 1806*cdf0e10cSrcweir Window* pOldRealWindow = pOldOverlapWindow->ImplGetWindow(); 1807*cdf0e10cSrcweir 1808*cdf0e10cSrcweir pOldOverlapWindow->ImplGetWindowImpl()->mbActive = sal_False; 1809*cdf0e10cSrcweir pOldOverlapWindow->Deactivate(); 1810*cdf0e10cSrcweir if ( pOldRealWindow != pOldOverlapWindow ) 1811*cdf0e10cSrcweir { 1812*cdf0e10cSrcweir pOldRealWindow->ImplGetWindowImpl()->mbActive = sal_False; 1813*cdf0e10cSrcweir pOldRealWindow->Deactivate(); 1814*cdf0e10cSrcweir } 1815*cdf0e10cSrcweir } 1816*cdf0e10cSrcweir 1817*cdf0e10cSrcweir // TrackingMode is ended in ImplHandleLoseFocus 1818*cdf0e10cSrcweir // To avoid problems with the Unix IME 1819*cdf0e10cSrcweir // pFocusWin->EndExtTextInput( EXTTEXTINPUT_END_COMPLETE ); 1820*cdf0e10cSrcweir 1821*cdf0e10cSrcweir // XXX #102010# hack for accessibility: do not close the menu, 1822*cdf0e10cSrcweir // even after focus lost 1823*cdf0e10cSrcweir static const char* pEnv = getenv("SAL_FLOATWIN_NOAPPFOCUSCLOSE"); 1824*cdf0e10cSrcweir if( !(pEnv && *pEnv) ) 1825*cdf0e10cSrcweir { 1826*cdf0e10cSrcweir NotifyEvent aNEvt( EVENT_LOSEFOCUS, pFocusWin ); 1827*cdf0e10cSrcweir if ( !ImplCallPreNotify( aNEvt ) ) 1828*cdf0e10cSrcweir pFocusWin->LoseFocus(); 1829*cdf0e10cSrcweir pFocusWin->ImplCallDeactivateListeners( NULL ); 1830*cdf0e10cSrcweir GetpApp()->FocusChanged(); 1831*cdf0e10cSrcweir } 1832*cdf0e10cSrcweir // XXX 1833*cdf0e10cSrcweir } 1834*cdf0e10cSrcweir } 1835*cdf0e10cSrcweir 1836*cdf0e10cSrcweir // Alle FloatingFenster deaktiv zeichnen 1837*cdf0e10cSrcweir if ( ImplGetWindowImpl()->mpFrameData->mbStartFocusState != bHasFocus ) 1838*cdf0e10cSrcweir ImplActivateFloatingWindows( this, bHasFocus ); 1839*cdf0e10cSrcweir } 1840*cdf0e10cSrcweir 1841*cdf0e10cSrcweir return 0; 1842*cdf0e10cSrcweir } 1843*cdf0e10cSrcweir 1844*cdf0e10cSrcweir // ----------------------------------------------------------------------- 1845*cdf0e10cSrcweir 1846*cdf0e10cSrcweir static void ImplHandleGetFocus( Window* pWindow ) 1847*cdf0e10cSrcweir { 1848*cdf0e10cSrcweir pWindow->ImplGetWindowImpl()->mpFrameData->mbHasFocus = sal_True; 1849*cdf0e10cSrcweir 1850*cdf0e10cSrcweir // Focus-Events zeitverzoegert ausfuehren, damit bei SystemChildFenstern 1851*cdf0e10cSrcweir // nicht alles flackert, wenn diese den Focus bekommen 1852*cdf0e10cSrcweir if ( !pWindow->ImplGetWindowImpl()->mpFrameData->mnFocusId ) 1853*cdf0e10cSrcweir { 1854*cdf0e10cSrcweir bool bCallDirect = ImplGetSVData()->mbIsTestTool; 1855*cdf0e10cSrcweir pWindow->ImplGetWindowImpl()->mpFrameData->mbStartFocusState = !pWindow->ImplGetWindowImpl()->mpFrameData->mbHasFocus; 1856*cdf0e10cSrcweir if( ! bCallDirect ) 1857*cdf0e10cSrcweir Application::PostUserEvent( pWindow->ImplGetWindowImpl()->mpFrameData->mnFocusId, LINK( pWindow, Window, ImplAsyncFocusHdl ) ); 1858*cdf0e10cSrcweir Window* pFocusWin = pWindow->ImplGetWindowImpl()->mpFrameData->mpFocusWin; 1859*cdf0e10cSrcweir if ( pFocusWin && pFocusWin->ImplGetWindowImpl()->mpCursor ) 1860*cdf0e10cSrcweir pFocusWin->ImplGetWindowImpl()->mpCursor->ImplShow(); 1861*cdf0e10cSrcweir if( bCallDirect ) 1862*cdf0e10cSrcweir pWindow->ImplAsyncFocusHdl( NULL ); 1863*cdf0e10cSrcweir } 1864*cdf0e10cSrcweir } 1865*cdf0e10cSrcweir 1866*cdf0e10cSrcweir // ----------------------------------------------------------------------- 1867*cdf0e10cSrcweir 1868*cdf0e10cSrcweir static void ImplHandleLoseFocus( Window* pWindow ) 1869*cdf0e10cSrcweir { 1870*cdf0e10cSrcweir ImplSVData* pSVData = ImplGetSVData(); 1871*cdf0e10cSrcweir 1872*cdf0e10cSrcweir // Wenn Frame den Focus verliert, brechen wir auch ein AutoScroll ab 1873*cdf0e10cSrcweir if ( pSVData->maWinData.mpAutoScrollWin ) 1874*cdf0e10cSrcweir pSVData->maWinData.mpAutoScrollWin->EndAutoScroll(); 1875*cdf0e10cSrcweir 1876*cdf0e10cSrcweir // Wenn Frame den Focus verliert, brechen wir auch ein Tracking ab 1877*cdf0e10cSrcweir if ( pSVData->maWinData.mpTrackWin ) 1878*cdf0e10cSrcweir { 1879*cdf0e10cSrcweir if ( pSVData->maWinData.mpTrackWin->ImplGetWindowImpl()->mpFrameWindow == pWindow ) 1880*cdf0e10cSrcweir pSVData->maWinData.mpTrackWin->EndTracking( ENDTRACK_CANCEL ); 1881*cdf0e10cSrcweir } 1882*cdf0e10cSrcweir 1883*cdf0e10cSrcweir // handle FloatingMode 1884*cdf0e10cSrcweir // hier beenden wir immer den PopupModus, auch dann, wenn NOFOCUSCLOSE 1885*cdf0e10cSrcweir // gesetzt ist, damit wir nicht beim Wechsel noch Fenster stehen lassen 1886*cdf0e10cSrcweir if ( pSVData->maWinData.mpFirstFloat ) 1887*cdf0e10cSrcweir { 1888*cdf0e10cSrcweir if ( !(pSVData->maWinData.mpFirstFloat->GetPopupModeFlags() & FLOATWIN_POPUPMODE_NOAPPFOCUSCLOSE) ) 1889*cdf0e10cSrcweir pSVData->maWinData.mpFirstFloat->EndPopupMode( FLOATWIN_POPUPMODEEND_CANCEL | FLOATWIN_POPUPMODEEND_CLOSEALL ); 1890*cdf0e10cSrcweir } 1891*cdf0e10cSrcweir 1892*cdf0e10cSrcweir pWindow->ImplGetWindowImpl()->mpFrameData->mbHasFocus = sal_False; 1893*cdf0e10cSrcweir 1894*cdf0e10cSrcweir // Focus-Events zeitverzoegert ausfuehren, damit bei SystemChildFenstern 1895*cdf0e10cSrcweir // nicht alles flackert, wenn diese den Focus bekommen 1896*cdf0e10cSrcweir bool bCallDirect = ImplGetSVData()->mbIsTestTool; 1897*cdf0e10cSrcweir if ( !pWindow->ImplGetWindowImpl()->mpFrameData->mnFocusId ) 1898*cdf0e10cSrcweir { 1899*cdf0e10cSrcweir pWindow->ImplGetWindowImpl()->mpFrameData->mbStartFocusState = !pWindow->ImplGetWindowImpl()->mpFrameData->mbHasFocus; 1900*cdf0e10cSrcweir if( ! bCallDirect ) 1901*cdf0e10cSrcweir Application::PostUserEvent( pWindow->ImplGetWindowImpl()->mpFrameData->mnFocusId, LINK( pWindow, Window, ImplAsyncFocusHdl ) ); 1902*cdf0e10cSrcweir } 1903*cdf0e10cSrcweir 1904*cdf0e10cSrcweir Window* pFocusWin = pWindow->ImplGetWindowImpl()->mpFrameData->mpFocusWin; 1905*cdf0e10cSrcweir if ( pFocusWin && pFocusWin->ImplGetWindowImpl()->mpCursor ) 1906*cdf0e10cSrcweir pFocusWin->ImplGetWindowImpl()->mpCursor->ImplHide( true ); 1907*cdf0e10cSrcweir if( bCallDirect ) 1908*cdf0e10cSrcweir pWindow->ImplAsyncFocusHdl( NULL ); 1909*cdf0e10cSrcweir } 1910*cdf0e10cSrcweir 1911*cdf0e10cSrcweir // ----------------------------------------------------------------------- 1912*cdf0e10cSrcweir struct DelayedCloseEvent 1913*cdf0e10cSrcweir { 1914*cdf0e10cSrcweir Window* pWindow; 1915*cdf0e10cSrcweir ImplDelData aDelData; 1916*cdf0e10cSrcweir }; 1917*cdf0e10cSrcweir 1918*cdf0e10cSrcweir static long DelayedCloseEventLink( void* pCEvent, void* ) 1919*cdf0e10cSrcweir { 1920*cdf0e10cSrcweir DelayedCloseEvent* pEv = (DelayedCloseEvent*)pCEvent; 1921*cdf0e10cSrcweir 1922*cdf0e10cSrcweir if( ! pEv->aDelData.IsDelete() ) 1923*cdf0e10cSrcweir { 1924*cdf0e10cSrcweir pEv->pWindow->ImplRemoveDel( &pEv->aDelData ); 1925*cdf0e10cSrcweir // dispatch to correct window type 1926*cdf0e10cSrcweir if( pEv->pWindow->IsSystemWindow() ) 1927*cdf0e10cSrcweir ((SystemWindow*)pEv->pWindow)->Close(); 1928*cdf0e10cSrcweir else if( pEv->pWindow->ImplIsDockingWindow() ) 1929*cdf0e10cSrcweir ((DockingWindow*)pEv->pWindow)->Close(); 1930*cdf0e10cSrcweir } 1931*cdf0e10cSrcweir delete pEv; 1932*cdf0e10cSrcweir 1933*cdf0e10cSrcweir return 0; 1934*cdf0e10cSrcweir } 1935*cdf0e10cSrcweir 1936*cdf0e10cSrcweir void ImplHandleClose( Window* pWindow ) 1937*cdf0e10cSrcweir { 1938*cdf0e10cSrcweir ImplSVData* pSVData = ImplGetSVData(); 1939*cdf0e10cSrcweir 1940*cdf0e10cSrcweir bool bWasPopup = false; 1941*cdf0e10cSrcweir if( pWindow->ImplIsFloatingWindow() && 1942*cdf0e10cSrcweir static_cast<FloatingWindow*>(pWindow)->ImplIsInPrivatePopupMode() ) 1943*cdf0e10cSrcweir { 1944*cdf0e10cSrcweir bWasPopup = true; 1945*cdf0e10cSrcweir } 1946*cdf0e10cSrcweir 1947*cdf0e10cSrcweir // on Close stop all floating modes and end popups 1948*cdf0e10cSrcweir if ( pSVData->maWinData.mpFirstFloat ) 1949*cdf0e10cSrcweir { 1950*cdf0e10cSrcweir FloatingWindow* pLastLevelFloat; 1951*cdf0e10cSrcweir pLastLevelFloat = pSVData->maWinData.mpFirstFloat->ImplFindLastLevelFloat(); 1952*cdf0e10cSrcweir pLastLevelFloat->EndPopupMode( FLOATWIN_POPUPMODEEND_CANCEL | FLOATWIN_POPUPMODEEND_CLOSEALL ); 1953*cdf0e10cSrcweir } 1954*cdf0e10cSrcweir if ( pSVData->maHelpData.mbExtHelpMode ) 1955*cdf0e10cSrcweir Help::EndExtHelp(); 1956*cdf0e10cSrcweir if ( pSVData->maHelpData.mpHelpWin ) 1957*cdf0e10cSrcweir ImplDestroyHelpWindow( false ); 1958*cdf0e10cSrcweir // AutoScrollMode 1959*cdf0e10cSrcweir if ( pSVData->maWinData.mpAutoScrollWin ) 1960*cdf0e10cSrcweir pSVData->maWinData.mpAutoScrollWin->EndAutoScroll(); 1961*cdf0e10cSrcweir 1962*cdf0e10cSrcweir if ( pSVData->maWinData.mpTrackWin ) 1963*cdf0e10cSrcweir pSVData->maWinData.mpTrackWin->EndTracking( ENDTRACK_CANCEL | ENDTRACK_KEY ); 1964*cdf0e10cSrcweir 1965*cdf0e10cSrcweir if( ! bWasPopup ) 1966*cdf0e10cSrcweir { 1967*cdf0e10cSrcweir Window *pWin = pWindow->ImplGetWindow(); 1968*cdf0e10cSrcweir // check whether close is allowed 1969*cdf0e10cSrcweir if ( !pWin->IsEnabled() || !pWin->IsInputEnabled() || pWin->IsInModalMode() ) 1970*cdf0e10cSrcweir Sound::Beep( SOUND_DISABLE, pWin ); 1971*cdf0e10cSrcweir else 1972*cdf0e10cSrcweir { 1973*cdf0e10cSrcweir DelayedCloseEvent* pEv = new DelayedCloseEvent; 1974*cdf0e10cSrcweir pEv->pWindow = pWin; 1975*cdf0e10cSrcweir pWin->ImplAddDel( &pEv->aDelData ); 1976*cdf0e10cSrcweir Application::PostUserEvent( Link( pEv, DelayedCloseEventLink ) ); 1977*cdf0e10cSrcweir } 1978*cdf0e10cSrcweir } 1979*cdf0e10cSrcweir } 1980*cdf0e10cSrcweir 1981*cdf0e10cSrcweir // ----------------------------------------------------------------------- 1982*cdf0e10cSrcweir 1983*cdf0e10cSrcweir static void ImplHandleUserEvent( ImplSVEvent* pSVEvent ) 1984*cdf0e10cSrcweir { 1985*cdf0e10cSrcweir if ( pSVEvent ) 1986*cdf0e10cSrcweir { 1987*cdf0e10cSrcweir if ( pSVEvent->mbCall && !pSVEvent->maDelData.IsDelete() ) 1988*cdf0e10cSrcweir { 1989*cdf0e10cSrcweir if ( pSVEvent->mpWindow ) 1990*cdf0e10cSrcweir { 1991*cdf0e10cSrcweir pSVEvent->mpWindow->ImplRemoveDel( &(pSVEvent->maDelData) ); 1992*cdf0e10cSrcweir if ( pSVEvent->mpLink ) 1993*cdf0e10cSrcweir pSVEvent->mpLink->Call( pSVEvent->mpData ); 1994*cdf0e10cSrcweir else 1995*cdf0e10cSrcweir pSVEvent->mpWindow->UserEvent( pSVEvent->mnEvent, pSVEvent->mpData ); 1996*cdf0e10cSrcweir } 1997*cdf0e10cSrcweir else 1998*cdf0e10cSrcweir { 1999*cdf0e10cSrcweir if ( pSVEvent->mpLink ) 2000*cdf0e10cSrcweir pSVEvent->mpLink->Call( pSVEvent->mpData ); 2001*cdf0e10cSrcweir else 2002*cdf0e10cSrcweir GetpApp()->UserEvent( pSVEvent->mnEvent, pSVEvent->mpData ); 2003*cdf0e10cSrcweir } 2004*cdf0e10cSrcweir } 2005*cdf0e10cSrcweir 2006*cdf0e10cSrcweir delete pSVEvent->mpLink; 2007*cdf0e10cSrcweir delete pSVEvent; 2008*cdf0e10cSrcweir } 2009*cdf0e10cSrcweir } 2010*cdf0e10cSrcweir 2011*cdf0e10cSrcweir // ======================================================================= 2012*cdf0e10cSrcweir 2013*cdf0e10cSrcweir static sal_uInt16 ImplGetMouseMoveMode( SalMouseEvent* pEvent ) 2014*cdf0e10cSrcweir { 2015*cdf0e10cSrcweir sal_uInt16 nMode = 0; 2016*cdf0e10cSrcweir if ( !pEvent->mnCode ) 2017*cdf0e10cSrcweir nMode |= MOUSE_SIMPLEMOVE; 2018*cdf0e10cSrcweir if ( (pEvent->mnCode & MOUSE_LEFT) && !(pEvent->mnCode & KEY_MOD1) ) 2019*cdf0e10cSrcweir nMode |= MOUSE_DRAGMOVE; 2020*cdf0e10cSrcweir if ( (pEvent->mnCode & MOUSE_LEFT) && (pEvent->mnCode & KEY_MOD1) ) 2021*cdf0e10cSrcweir nMode |= MOUSE_DRAGCOPY; 2022*cdf0e10cSrcweir return nMode; 2023*cdf0e10cSrcweir } 2024*cdf0e10cSrcweir 2025*cdf0e10cSrcweir // ----------------------------------------------------------------------- 2026*cdf0e10cSrcweir 2027*cdf0e10cSrcweir static sal_uInt16 ImplGetMouseButtonMode( SalMouseEvent* pEvent ) 2028*cdf0e10cSrcweir { 2029*cdf0e10cSrcweir sal_uInt16 nMode = 0; 2030*cdf0e10cSrcweir if ( pEvent->mnButton == MOUSE_LEFT ) 2031*cdf0e10cSrcweir nMode |= MOUSE_SIMPLECLICK; 2032*cdf0e10cSrcweir if ( (pEvent->mnButton == MOUSE_LEFT) && !(pEvent->mnCode & (MOUSE_MIDDLE | MOUSE_RIGHT)) ) 2033*cdf0e10cSrcweir nMode |= MOUSE_SELECT; 2034*cdf0e10cSrcweir if ( (pEvent->mnButton == MOUSE_LEFT) && (pEvent->mnCode & KEY_MOD1) && 2035*cdf0e10cSrcweir !(pEvent->mnCode & (MOUSE_MIDDLE | MOUSE_RIGHT | KEY_SHIFT)) ) 2036*cdf0e10cSrcweir nMode |= MOUSE_MULTISELECT; 2037*cdf0e10cSrcweir if ( (pEvent->mnButton == MOUSE_LEFT) && (pEvent->mnCode & KEY_SHIFT) && 2038*cdf0e10cSrcweir !(pEvent->mnCode & (MOUSE_MIDDLE | MOUSE_RIGHT | KEY_MOD1)) ) 2039*cdf0e10cSrcweir nMode |= MOUSE_RANGESELECT; 2040*cdf0e10cSrcweir return nMode; 2041*cdf0e10cSrcweir } 2042*cdf0e10cSrcweir 2043*cdf0e10cSrcweir // ----------------------------------------------------------------------- 2044*cdf0e10cSrcweir 2045*cdf0e10cSrcweir inline long ImplHandleSalMouseLeave( Window* pWindow, SalMouseEvent* pEvent ) 2046*cdf0e10cSrcweir { 2047*cdf0e10cSrcweir return ImplHandleMouseEvent( pWindow, EVENT_MOUSEMOVE, sal_True, 2048*cdf0e10cSrcweir pEvent->mnX, pEvent->mnY, 2049*cdf0e10cSrcweir pEvent->mnTime, pEvent->mnCode, 2050*cdf0e10cSrcweir ImplGetMouseMoveMode( pEvent ) ); 2051*cdf0e10cSrcweir } 2052*cdf0e10cSrcweir 2053*cdf0e10cSrcweir // ----------------------------------------------------------------------- 2054*cdf0e10cSrcweir 2055*cdf0e10cSrcweir inline long ImplHandleSalMouseMove( Window* pWindow, SalMouseEvent* pEvent ) 2056*cdf0e10cSrcweir { 2057*cdf0e10cSrcweir return ImplHandleMouseEvent( pWindow, EVENT_MOUSEMOVE, sal_False, 2058*cdf0e10cSrcweir pEvent->mnX, pEvent->mnY, 2059*cdf0e10cSrcweir pEvent->mnTime, pEvent->mnCode, 2060*cdf0e10cSrcweir ImplGetMouseMoveMode( pEvent ) ); 2061*cdf0e10cSrcweir } 2062*cdf0e10cSrcweir 2063*cdf0e10cSrcweir // ----------------------------------------------------------------------- 2064*cdf0e10cSrcweir 2065*cdf0e10cSrcweir inline long ImplHandleSalMouseButtonDown( Window* pWindow, SalMouseEvent* pEvent ) 2066*cdf0e10cSrcweir { 2067*cdf0e10cSrcweir return ImplHandleMouseEvent( pWindow, EVENT_MOUSEBUTTONDOWN, sal_False, 2068*cdf0e10cSrcweir pEvent->mnX, pEvent->mnY, 2069*cdf0e10cSrcweir pEvent->mnTime, 2070*cdf0e10cSrcweir #ifdef MACOSX 2071*cdf0e10cSrcweir pEvent->mnButton | (pEvent->mnCode & (KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_MOD3)), 2072*cdf0e10cSrcweir #else 2073*cdf0e10cSrcweir pEvent->mnButton | (pEvent->mnCode & (KEY_SHIFT | KEY_MOD1 | KEY_MOD2)), 2074*cdf0e10cSrcweir #endif 2075*cdf0e10cSrcweir ImplGetMouseButtonMode( pEvent ) ); 2076*cdf0e10cSrcweir } 2077*cdf0e10cSrcweir 2078*cdf0e10cSrcweir // ----------------------------------------------------------------------- 2079*cdf0e10cSrcweir 2080*cdf0e10cSrcweir inline long ImplHandleSalMouseButtonUp( Window* pWindow, SalMouseEvent* pEvent ) 2081*cdf0e10cSrcweir { 2082*cdf0e10cSrcweir return ImplHandleMouseEvent( pWindow, EVENT_MOUSEBUTTONUP, sal_False, 2083*cdf0e10cSrcweir pEvent->mnX, pEvent->mnY, 2084*cdf0e10cSrcweir pEvent->mnTime, 2085*cdf0e10cSrcweir #ifdef MACOSX 2086*cdf0e10cSrcweir pEvent->mnButton | (pEvent->mnCode & (KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_MOD3)), 2087*cdf0e10cSrcweir #else 2088*cdf0e10cSrcweir pEvent->mnButton | (pEvent->mnCode & (KEY_SHIFT | KEY_MOD1 | KEY_MOD2)), 2089*cdf0e10cSrcweir #endif 2090*cdf0e10cSrcweir ImplGetMouseButtonMode( pEvent ) ); 2091*cdf0e10cSrcweir } 2092*cdf0e10cSrcweir 2093*cdf0e10cSrcweir // ----------------------------------------------------------------------- 2094*cdf0e10cSrcweir 2095*cdf0e10cSrcweir static long ImplHandleSalMouseActivate( Window* /*pWindow*/, SalMouseActivateEvent* /*pEvent*/ ) 2096*cdf0e10cSrcweir { 2097*cdf0e10cSrcweir return sal_False; 2098*cdf0e10cSrcweir } 2099*cdf0e10cSrcweir 2100*cdf0e10cSrcweir // ----------------------------------------------------------------------- 2101*cdf0e10cSrcweir 2102*cdf0e10cSrcweir static long ImplHandleMenuEvent( Window* pWindow, SalMenuEvent* pEvent, sal_uInt16 nEvent ) 2103*cdf0e10cSrcweir { 2104*cdf0e10cSrcweir // Find SystemWindow and its Menubar and let it dispatch the command 2105*cdf0e10cSrcweir long nRet = 0; 2106*cdf0e10cSrcweir Window *pWin = pWindow->ImplGetWindowImpl()->mpFirstChild; 2107*cdf0e10cSrcweir while ( pWin ) 2108*cdf0e10cSrcweir { 2109*cdf0e10cSrcweir if ( pWin->ImplGetWindowImpl()->mbSysWin ) 2110*cdf0e10cSrcweir break; 2111*cdf0e10cSrcweir pWin = pWin->ImplGetWindowImpl()->mpNext; 2112*cdf0e10cSrcweir } 2113*cdf0e10cSrcweir if( pWin ) 2114*cdf0e10cSrcweir { 2115*cdf0e10cSrcweir MenuBar *pMenuBar = ((SystemWindow*) pWin)->GetMenuBar(); 2116*cdf0e10cSrcweir if( pMenuBar ) 2117*cdf0e10cSrcweir { 2118*cdf0e10cSrcweir switch( nEvent ) 2119*cdf0e10cSrcweir { 2120*cdf0e10cSrcweir case SALEVENT_MENUACTIVATE: 2121*cdf0e10cSrcweir nRet = pMenuBar->HandleMenuActivateEvent( (Menu*) pEvent->mpMenu ) ? 1 : 0; 2122*cdf0e10cSrcweir break; 2123*cdf0e10cSrcweir case SALEVENT_MENUDEACTIVATE: 2124*cdf0e10cSrcweir nRet = pMenuBar->HandleMenuDeActivateEvent( (Menu*) pEvent->mpMenu ) ? 1 : 0; 2125*cdf0e10cSrcweir break; 2126*cdf0e10cSrcweir case SALEVENT_MENUHIGHLIGHT: 2127*cdf0e10cSrcweir nRet = pMenuBar->HandleMenuHighlightEvent( (Menu*) pEvent->mpMenu, pEvent->mnId ) ? 1 : 0; 2128*cdf0e10cSrcweir break; 2129*cdf0e10cSrcweir case SALEVENT_MENUBUTTONCOMMAND: 2130*cdf0e10cSrcweir nRet = pMenuBar->HandleMenuButtonEvent( (Menu*) pEvent->mpMenu, pEvent->mnId ) ? 1 : 0; 2131*cdf0e10cSrcweir break; 2132*cdf0e10cSrcweir case SALEVENT_MENUCOMMAND: 2133*cdf0e10cSrcweir nRet = pMenuBar->HandleMenuCommandEvent( (Menu*) pEvent->mpMenu, pEvent->mnId ) ? 1 : 0; 2134*cdf0e10cSrcweir break; 2135*cdf0e10cSrcweir default: 2136*cdf0e10cSrcweir break; 2137*cdf0e10cSrcweir } 2138*cdf0e10cSrcweir } 2139*cdf0e10cSrcweir } 2140*cdf0e10cSrcweir return nRet; 2141*cdf0e10cSrcweir } 2142*cdf0e10cSrcweir 2143*cdf0e10cSrcweir // ----------------------------------------------------------------------- 2144*cdf0e10cSrcweir 2145*cdf0e10cSrcweir static void ImplHandleSalKeyMod( Window* pWindow, SalKeyModEvent* pEvent ) 2146*cdf0e10cSrcweir { 2147*cdf0e10cSrcweir ImplSVData* pSVData = ImplGetSVData(); 2148*cdf0e10cSrcweir Window* pTrackWin = pSVData->maWinData.mpTrackWin; 2149*cdf0e10cSrcweir if ( pTrackWin ) 2150*cdf0e10cSrcweir pWindow = pTrackWin; 2151*cdf0e10cSrcweir #ifdef MACOSX 2152*cdf0e10cSrcweir sal_uInt16 nOldCode = pWindow->ImplGetWindowImpl()->mpFrameData->mnMouseCode & (KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_MOD3); 2153*cdf0e10cSrcweir #else 2154*cdf0e10cSrcweir sal_uInt16 nOldCode = pWindow->ImplGetWindowImpl()->mpFrameData->mnMouseCode & (KEY_SHIFT | KEY_MOD1 | KEY_MOD2); 2155*cdf0e10cSrcweir #endif 2156*cdf0e10cSrcweir sal_uInt16 nNewCode = pEvent->mnCode; 2157*cdf0e10cSrcweir if ( nOldCode != nNewCode ) 2158*cdf0e10cSrcweir { 2159*cdf0e10cSrcweir #ifdef MACOSX 2160*cdf0e10cSrcweir nNewCode |= pWindow->ImplGetWindowImpl()->mpFrameData->mnMouseCode & ~(KEY_SHIFT | KEY_MOD1 | KEY_MOD2 | KEY_MOD3); 2161*cdf0e10cSrcweir #else 2162*cdf0e10cSrcweir nNewCode |= pWindow->ImplGetWindowImpl()->mpFrameData->mnMouseCode & ~(KEY_SHIFT | KEY_MOD1 | KEY_MOD2); 2163*cdf0e10cSrcweir #endif 2164*cdf0e10cSrcweir pWindow->ImplGetWindowImpl()->mpFrameWindow->ImplCallMouseMove( nNewCode, sal_True ); 2165*cdf0e10cSrcweir } 2166*cdf0e10cSrcweir 2167*cdf0e10cSrcweir // #105224# send commandevent to allow special treatment of Ctrl-LeftShift/Ctrl-RightShift etc. 2168*cdf0e10cSrcweir 2169*cdf0e10cSrcweir // find window 2170*cdf0e10cSrcweir Window* pChild = ImplGetKeyInputWindow( pWindow ); 2171*cdf0e10cSrcweir if ( !pChild ) 2172*cdf0e10cSrcweir return; 2173*cdf0e10cSrcweir 2174*cdf0e10cSrcweir // send modkey events only if useful data is available 2175*cdf0e10cSrcweir if( pEvent->mnModKeyCode != 0 ) 2176*cdf0e10cSrcweir { 2177*cdf0e10cSrcweir CommandModKeyData data( pEvent->mnModKeyCode ); 2178*cdf0e10cSrcweir ImplCallCommand( pChild, COMMAND_MODKEYCHANGE, &data ); 2179*cdf0e10cSrcweir } 2180*cdf0e10cSrcweir } 2181*cdf0e10cSrcweir 2182*cdf0e10cSrcweir // ----------------------------------------------------------------------- 2183*cdf0e10cSrcweir 2184*cdf0e10cSrcweir static void ImplHandleInputLanguageChange( Window* pWindow ) 2185*cdf0e10cSrcweir { 2186*cdf0e10cSrcweir // find window 2187*cdf0e10cSrcweir Window* pChild = ImplGetKeyInputWindow( pWindow ); 2188*cdf0e10cSrcweir if ( !pChild ) 2189*cdf0e10cSrcweir return; 2190*cdf0e10cSrcweir 2191*cdf0e10cSrcweir ImplCallCommand( pChild, COMMAND_INPUTLANGUAGECHANGE ); 2192*cdf0e10cSrcweir } 2193*cdf0e10cSrcweir 2194*cdf0e10cSrcweir // ----------------------------------------------------------------------- 2195*cdf0e10cSrcweir 2196*cdf0e10cSrcweir static void ImplHandleSalSettings( Window* pWindow, sal_uInt16 nEvent ) 2197*cdf0e10cSrcweir { 2198*cdf0e10cSrcweir // Application Notification werden nur fuer das erste Window ausgeloest 2199*cdf0e10cSrcweir ImplSVData* pSVData = ImplGetSVData(); 2200*cdf0e10cSrcweir if ( pWindow != pSVData->maWinData.mpFirstFrame ) 2201*cdf0e10cSrcweir return; 2202*cdf0e10cSrcweir 2203*cdf0e10cSrcweir Application* pApp = GetpApp(); 2204*cdf0e10cSrcweir if ( !pApp ) 2205*cdf0e10cSrcweir return; 2206*cdf0e10cSrcweir 2207*cdf0e10cSrcweir if ( nEvent == SALEVENT_SETTINGSCHANGED ) 2208*cdf0e10cSrcweir { 2209*cdf0e10cSrcweir AllSettings aSettings = pApp->GetSettings(); 2210*cdf0e10cSrcweir pApp->MergeSystemSettings( aSettings ); 2211*cdf0e10cSrcweir pApp->SystemSettingsChanging( aSettings, pWindow ); 2212*cdf0e10cSrcweir pApp->SetSettings( aSettings ); 2213*cdf0e10cSrcweir } 2214*cdf0e10cSrcweir else 2215*cdf0e10cSrcweir { 2216*cdf0e10cSrcweir sal_uInt16 nType; 2217*cdf0e10cSrcweir switch ( nEvent ) 2218*cdf0e10cSrcweir { 2219*cdf0e10cSrcweir case SALEVENT_VOLUMECHANGED: 2220*cdf0e10cSrcweir nType = 0; 2221*cdf0e10cSrcweir break; 2222*cdf0e10cSrcweir case SALEVENT_PRINTERCHANGED: 2223*cdf0e10cSrcweir ImplDeletePrnQueueList(); 2224*cdf0e10cSrcweir nType = DATACHANGED_PRINTER; 2225*cdf0e10cSrcweir break; 2226*cdf0e10cSrcweir case SALEVENT_DISPLAYCHANGED: 2227*cdf0e10cSrcweir nType = DATACHANGED_DISPLAY; 2228*cdf0e10cSrcweir break; 2229*cdf0e10cSrcweir case SALEVENT_FONTCHANGED: 2230*cdf0e10cSrcweir OutputDevice::ImplUpdateAllFontData( sal_True ); 2231*cdf0e10cSrcweir nType = DATACHANGED_FONTS; 2232*cdf0e10cSrcweir break; 2233*cdf0e10cSrcweir case SALEVENT_DATETIMECHANGED: 2234*cdf0e10cSrcweir nType = DATACHANGED_DATETIME; 2235*cdf0e10cSrcweir break; 2236*cdf0e10cSrcweir case SALEVENT_KEYBOARDCHANGED: 2237*cdf0e10cSrcweir nType = 0; 2238*cdf0e10cSrcweir break; 2239*cdf0e10cSrcweir default: 2240*cdf0e10cSrcweir nType = 0; 2241*cdf0e10cSrcweir break; 2242*cdf0e10cSrcweir } 2243*cdf0e10cSrcweir 2244*cdf0e10cSrcweir if ( nType ) 2245*cdf0e10cSrcweir { 2246*cdf0e10cSrcweir DataChangedEvent aDCEvt( nType ); 2247*cdf0e10cSrcweir pApp->DataChanged( aDCEvt ); 2248*cdf0e10cSrcweir pApp->NotifyAllWindows( aDCEvt ); 2249*cdf0e10cSrcweir } 2250*cdf0e10cSrcweir } 2251*cdf0e10cSrcweir } 2252*cdf0e10cSrcweir 2253*cdf0e10cSrcweir // ----------------------------------------------------------------------- 2254*cdf0e10cSrcweir 2255*cdf0e10cSrcweir static void ImplHandleSalExtTextInputPos( Window* pWindow, SalExtTextInputPosEvent* pEvt ) 2256*cdf0e10cSrcweir { 2257*cdf0e10cSrcweir Rectangle aCursorRect; 2258*cdf0e10cSrcweir ImplHandleExtTextInputPos( pWindow, aCursorRect, pEvt->mnExtWidth, &pEvt->mbVertical ); 2259*cdf0e10cSrcweir if ( aCursorRect.IsEmpty() ) 2260*cdf0e10cSrcweir { 2261*cdf0e10cSrcweir pEvt->mnX = -1; 2262*cdf0e10cSrcweir pEvt->mnY = -1; 2263*cdf0e10cSrcweir pEvt->mnWidth = -1; 2264*cdf0e10cSrcweir pEvt->mnHeight = -1; 2265*cdf0e10cSrcweir } 2266*cdf0e10cSrcweir else 2267*cdf0e10cSrcweir { 2268*cdf0e10cSrcweir pEvt->mnX = aCursorRect.Left(); 2269*cdf0e10cSrcweir pEvt->mnY = aCursorRect.Top(); 2270*cdf0e10cSrcweir pEvt->mnWidth = aCursorRect.GetWidth(); 2271*cdf0e10cSrcweir pEvt->mnHeight = aCursorRect.GetHeight(); 2272*cdf0e10cSrcweir } 2273*cdf0e10cSrcweir } 2274*cdf0e10cSrcweir 2275*cdf0e10cSrcweir // ----------------------------------------------------------------------- 2276*cdf0e10cSrcweir 2277*cdf0e10cSrcweir static long ImplHandleShowDialog( Window* pWindow, int nDialogId ) 2278*cdf0e10cSrcweir { 2279*cdf0e10cSrcweir if( ! pWindow ) 2280*cdf0e10cSrcweir return sal_False; 2281*cdf0e10cSrcweir 2282*cdf0e10cSrcweir if( pWindow->GetType() == WINDOW_BORDERWINDOW ) 2283*cdf0e10cSrcweir { 2284*cdf0e10cSrcweir Window* pWrkWin = pWindow->GetWindow( WINDOW_CLIENT ); 2285*cdf0e10cSrcweir if( pWrkWin ) 2286*cdf0e10cSrcweir pWindow = pWrkWin; 2287*cdf0e10cSrcweir } 2288*cdf0e10cSrcweir CommandDialogData aCmdData( nDialogId ); 2289*cdf0e10cSrcweir return ImplCallCommand( pWindow, COMMAND_SHOWDIALOG, &aCmdData ); 2290*cdf0e10cSrcweir } 2291*cdf0e10cSrcweir 2292*cdf0e10cSrcweir // ----------------------------------------------------------------------- 2293*cdf0e10cSrcweir 2294*cdf0e10cSrcweir static void ImplHandleSurroundingTextRequest( Window *pWindow, 2295*cdf0e10cSrcweir XubString& rText, 2296*cdf0e10cSrcweir Selection &rSelRange ) 2297*cdf0e10cSrcweir { 2298*cdf0e10cSrcweir Window* pChild = ImplGetKeyInputWindow( pWindow ); 2299*cdf0e10cSrcweir 2300*cdf0e10cSrcweir if ( !pChild ) 2301*cdf0e10cSrcweir { 2302*cdf0e10cSrcweir rText = XubString::EmptyString(); 2303*cdf0e10cSrcweir rSelRange.setMin( 0 ); 2304*cdf0e10cSrcweir rSelRange.setMax( 0 ); 2305*cdf0e10cSrcweir } 2306*cdf0e10cSrcweir else 2307*cdf0e10cSrcweir { 2308*cdf0e10cSrcweir 2309*cdf0e10cSrcweir rText = pChild->GetSurroundingText(); 2310*cdf0e10cSrcweir Selection aSel = pChild->GetSurroundingTextSelection(); 2311*cdf0e10cSrcweir rSelRange.setMin( aSel.Min() ); 2312*cdf0e10cSrcweir rSelRange.setMax( aSel.Max() ); 2313*cdf0e10cSrcweir } 2314*cdf0e10cSrcweir } 2315*cdf0e10cSrcweir 2316*cdf0e10cSrcweir // ----------------------------------------------------------------------- 2317*cdf0e10cSrcweir 2318*cdf0e10cSrcweir static void ImplHandleSalSurroundingTextRequest( Window *pWindow, 2319*cdf0e10cSrcweir SalSurroundingTextRequestEvent *pEvt ) 2320*cdf0e10cSrcweir { 2321*cdf0e10cSrcweir Selection aSelRange; 2322*cdf0e10cSrcweir ImplHandleSurroundingTextRequest( pWindow, pEvt->maText, aSelRange ); 2323*cdf0e10cSrcweir 2324*cdf0e10cSrcweir aSelRange.Justify(); 2325*cdf0e10cSrcweir 2326*cdf0e10cSrcweir if( aSelRange.Min() < 0 ) 2327*cdf0e10cSrcweir pEvt->mnStart = 0; 2328*cdf0e10cSrcweir else if( aSelRange.Min() > pEvt->maText.Len() ) 2329*cdf0e10cSrcweir pEvt->mnStart = pEvt->maText.Len(); 2330*cdf0e10cSrcweir else 2331*cdf0e10cSrcweir pEvt->mnStart = aSelRange.Min(); 2332*cdf0e10cSrcweir 2333*cdf0e10cSrcweir if( aSelRange.Max() < 0 ) 2334*cdf0e10cSrcweir pEvt->mnStart = 0; 2335*cdf0e10cSrcweir else if( aSelRange.Max() > pEvt->maText.Len() ) 2336*cdf0e10cSrcweir pEvt->mnEnd = pEvt->maText.Len(); 2337*cdf0e10cSrcweir else 2338*cdf0e10cSrcweir pEvt->mnEnd = aSelRange.Max(); 2339*cdf0e10cSrcweir } 2340*cdf0e10cSrcweir 2341*cdf0e10cSrcweir // ----------------------------------------------------------------------- 2342*cdf0e10cSrcweir 2343*cdf0e10cSrcweir static void ImplHandleSurroundingTextSelectionChange( Window *pWindow, 2344*cdf0e10cSrcweir sal_uLong nStart, 2345*cdf0e10cSrcweir sal_uLong nEnd ) 2346*cdf0e10cSrcweir { 2347*cdf0e10cSrcweir Window* pChild = ImplGetKeyInputWindow( pWindow ); 2348*cdf0e10cSrcweir if( pChild ) 2349*cdf0e10cSrcweir { 2350*cdf0e10cSrcweir CommandSelectionChangeData data( nStart, nEnd ); 2351*cdf0e10cSrcweir ImplCallCommand( pChild, COMMAND_SELECTIONCHANGE, &data ); 2352*cdf0e10cSrcweir } 2353*cdf0e10cSrcweir } 2354*cdf0e10cSrcweir 2355*cdf0e10cSrcweir // ----------------------------------------------------------------------- 2356*cdf0e10cSrcweir 2357*cdf0e10cSrcweir static void ImplHandleStartReconversion( Window *pWindow ) 2358*cdf0e10cSrcweir { 2359*cdf0e10cSrcweir Window* pChild = ImplGetKeyInputWindow( pWindow ); 2360*cdf0e10cSrcweir if( pChild ) 2361*cdf0e10cSrcweir ImplCallCommand( pChild, COMMAND_PREPARERECONVERSION ); 2362*cdf0e10cSrcweir } 2363*cdf0e10cSrcweir 2364*cdf0e10cSrcweir // ----------------------------------------------------------------------- 2365*cdf0e10cSrcweir 2366*cdf0e10cSrcweir long ImplWindowFrameProc( Window* pWindow, SalFrame* /*pFrame*/, 2367*cdf0e10cSrcweir sal_uInt16 nEvent, const void* pEvent ) 2368*cdf0e10cSrcweir { 2369*cdf0e10cSrcweir DBG_TESTSOLARMUTEX(); 2370*cdf0e10cSrcweir 2371*cdf0e10cSrcweir long nRet = 0; 2372*cdf0e10cSrcweir 2373*cdf0e10cSrcweir // #119709# for some unknown reason it is possible to receive events (in this case key events) 2374*cdf0e10cSrcweir // although the corresponding VCL window must have been destroyed already 2375*cdf0e10cSrcweir // at least ImplGetWindowImpl() was NULL in these cases, so check this here 2376*cdf0e10cSrcweir if( pWindow->ImplGetWindowImpl() == NULL ) 2377*cdf0e10cSrcweir return 0; 2378*cdf0e10cSrcweir 2379*cdf0e10cSrcweir switch ( nEvent ) 2380*cdf0e10cSrcweir { 2381*cdf0e10cSrcweir case SALEVENT_MOUSEMOVE: 2382*cdf0e10cSrcweir nRet = ImplHandleSalMouseMove( pWindow, (SalMouseEvent*)pEvent ); 2383*cdf0e10cSrcweir break; 2384*cdf0e10cSrcweir case SALEVENT_EXTERNALMOUSEMOVE: 2385*cdf0e10cSrcweir { 2386*cdf0e10cSrcweir MouseEvent* pMouseEvt = (MouseEvent*) pEvent; 2387*cdf0e10cSrcweir SalMouseEvent aSalMouseEvent; 2388*cdf0e10cSrcweir 2389*cdf0e10cSrcweir aSalMouseEvent.mnTime = Time::GetSystemTicks(); 2390*cdf0e10cSrcweir aSalMouseEvent.mnX = pMouseEvt->GetPosPixel().X(); 2391*cdf0e10cSrcweir aSalMouseEvent.mnY = pMouseEvt->GetPosPixel().Y(); 2392*cdf0e10cSrcweir aSalMouseEvent.mnButton = 0; 2393*cdf0e10cSrcweir aSalMouseEvent.mnCode = pMouseEvt->GetButtons() | pMouseEvt->GetModifier(); 2394*cdf0e10cSrcweir 2395*cdf0e10cSrcweir nRet = ImplHandleSalMouseMove( pWindow, &aSalMouseEvent ); 2396*cdf0e10cSrcweir } 2397*cdf0e10cSrcweir break; 2398*cdf0e10cSrcweir case SALEVENT_MOUSELEAVE: 2399*cdf0e10cSrcweir nRet = ImplHandleSalMouseLeave( pWindow, (SalMouseEvent*)pEvent ); 2400*cdf0e10cSrcweir break; 2401*cdf0e10cSrcweir case SALEVENT_MOUSEBUTTONDOWN: 2402*cdf0e10cSrcweir nRet = ImplHandleSalMouseButtonDown( pWindow, (SalMouseEvent*)pEvent ); 2403*cdf0e10cSrcweir break; 2404*cdf0e10cSrcweir case SALEVENT_EXTERNALMOUSEBUTTONDOWN: 2405*cdf0e10cSrcweir { 2406*cdf0e10cSrcweir MouseEvent* pMouseEvt = (MouseEvent*) pEvent; 2407*cdf0e10cSrcweir SalMouseEvent aSalMouseEvent; 2408*cdf0e10cSrcweir 2409*cdf0e10cSrcweir aSalMouseEvent.mnTime = Time::GetSystemTicks(); 2410*cdf0e10cSrcweir aSalMouseEvent.mnX = pMouseEvt->GetPosPixel().X(); 2411*cdf0e10cSrcweir aSalMouseEvent.mnY = pMouseEvt->GetPosPixel().Y(); 2412*cdf0e10cSrcweir aSalMouseEvent.mnButton = pMouseEvt->GetButtons(); 2413*cdf0e10cSrcweir aSalMouseEvent.mnCode = pMouseEvt->GetButtons() | pMouseEvt->GetModifier(); 2414*cdf0e10cSrcweir 2415*cdf0e10cSrcweir nRet = ImplHandleSalMouseButtonDown( pWindow, &aSalMouseEvent ); 2416*cdf0e10cSrcweir } 2417*cdf0e10cSrcweir break; 2418*cdf0e10cSrcweir case SALEVENT_MOUSEBUTTONUP: 2419*cdf0e10cSrcweir nRet = ImplHandleSalMouseButtonUp( pWindow, (SalMouseEvent*)pEvent ); 2420*cdf0e10cSrcweir break; 2421*cdf0e10cSrcweir case SALEVENT_EXTERNALMOUSEBUTTONUP: 2422*cdf0e10cSrcweir { 2423*cdf0e10cSrcweir MouseEvent* pMouseEvt = (MouseEvent*) pEvent; 2424*cdf0e10cSrcweir SalMouseEvent aSalMouseEvent; 2425*cdf0e10cSrcweir 2426*cdf0e10cSrcweir aSalMouseEvent.mnTime = Time::GetSystemTicks(); 2427*cdf0e10cSrcweir aSalMouseEvent.mnX = pMouseEvt->GetPosPixel().X(); 2428*cdf0e10cSrcweir aSalMouseEvent.mnY = pMouseEvt->GetPosPixel().Y(); 2429*cdf0e10cSrcweir aSalMouseEvent.mnButton = pMouseEvt->GetButtons(); 2430*cdf0e10cSrcweir aSalMouseEvent.mnCode = pMouseEvt->GetButtons() | pMouseEvt->GetModifier(); 2431*cdf0e10cSrcweir 2432*cdf0e10cSrcweir nRet = ImplHandleSalMouseButtonUp( pWindow, &aSalMouseEvent ); 2433*cdf0e10cSrcweir } 2434*cdf0e10cSrcweir break; 2435*cdf0e10cSrcweir case SALEVENT_MOUSEACTIVATE: 2436*cdf0e10cSrcweir nRet = ImplHandleSalMouseActivate( pWindow, (SalMouseActivateEvent*)pEvent ); 2437*cdf0e10cSrcweir break; 2438*cdf0e10cSrcweir case SALEVENT_KEYINPUT: 2439*cdf0e10cSrcweir { 2440*cdf0e10cSrcweir SalKeyEvent* pKeyEvt = (SalKeyEvent*)pEvent; 2441*cdf0e10cSrcweir nRet = ImplHandleKey( pWindow, EVENT_KEYINPUT, 2442*cdf0e10cSrcweir pKeyEvt->mnCode, pKeyEvt->mnCharCode, pKeyEvt->mnRepeat, sal_True ); 2443*cdf0e10cSrcweir } 2444*cdf0e10cSrcweir break; 2445*cdf0e10cSrcweir case SALEVENT_EXTERNALKEYINPUT: 2446*cdf0e10cSrcweir { 2447*cdf0e10cSrcweir KeyEvent* pKeyEvt = (KeyEvent*) pEvent; 2448*cdf0e10cSrcweir nRet = ImplHandleKey( pWindow, EVENT_KEYINPUT, 2449*cdf0e10cSrcweir pKeyEvt->GetKeyCode().GetFullCode(), pKeyEvt->GetCharCode(), pKeyEvt->GetRepeat(), sal_False ); 2450*cdf0e10cSrcweir } 2451*cdf0e10cSrcweir break; 2452*cdf0e10cSrcweir case SALEVENT_KEYUP: 2453*cdf0e10cSrcweir { 2454*cdf0e10cSrcweir SalKeyEvent* pKeyEvt = (SalKeyEvent*)pEvent; 2455*cdf0e10cSrcweir nRet = ImplHandleKey( pWindow, EVENT_KEYUP, 2456*cdf0e10cSrcweir pKeyEvt->mnCode, pKeyEvt->mnCharCode, pKeyEvt->mnRepeat, sal_True ); 2457*cdf0e10cSrcweir } 2458*cdf0e10cSrcweir break; 2459*cdf0e10cSrcweir case SALEVENT_EXTERNALKEYUP: 2460*cdf0e10cSrcweir { 2461*cdf0e10cSrcweir KeyEvent* pKeyEvt = (KeyEvent*) pEvent; 2462*cdf0e10cSrcweir nRet = ImplHandleKey( pWindow, EVENT_KEYUP, 2463*cdf0e10cSrcweir pKeyEvt->GetKeyCode().GetFullCode(), pKeyEvt->GetCharCode(), pKeyEvt->GetRepeat(), sal_False ); 2464*cdf0e10cSrcweir } 2465*cdf0e10cSrcweir break; 2466*cdf0e10cSrcweir case SALEVENT_KEYMODCHANGE: 2467*cdf0e10cSrcweir ImplHandleSalKeyMod( pWindow, (SalKeyModEvent*)pEvent ); 2468*cdf0e10cSrcweir break; 2469*cdf0e10cSrcweir 2470*cdf0e10cSrcweir case SALEVENT_INPUTLANGUAGECHANGE: 2471*cdf0e10cSrcweir ImplHandleInputLanguageChange( pWindow ); 2472*cdf0e10cSrcweir break; 2473*cdf0e10cSrcweir 2474*cdf0e10cSrcweir case SALEVENT_MENUACTIVATE: 2475*cdf0e10cSrcweir case SALEVENT_MENUDEACTIVATE: 2476*cdf0e10cSrcweir case SALEVENT_MENUHIGHLIGHT: 2477*cdf0e10cSrcweir case SALEVENT_MENUCOMMAND: 2478*cdf0e10cSrcweir case SALEVENT_MENUBUTTONCOMMAND: 2479*cdf0e10cSrcweir nRet = ImplHandleMenuEvent( pWindow, (SalMenuEvent*)pEvent, nEvent ); 2480*cdf0e10cSrcweir break; 2481*cdf0e10cSrcweir 2482*cdf0e10cSrcweir case SALEVENT_WHEELMOUSE: 2483*cdf0e10cSrcweir nRet = ImplHandleWheelEvent( pWindow, *(const SalWheelMouseEvent*)pEvent); 2484*cdf0e10cSrcweir break; 2485*cdf0e10cSrcweir 2486*cdf0e10cSrcweir case SALEVENT_PAINT: 2487*cdf0e10cSrcweir { 2488*cdf0e10cSrcweir SalPaintEvent* pPaintEvt = (SalPaintEvent*)pEvent; 2489*cdf0e10cSrcweir 2490*cdf0e10cSrcweir if( Application::GetSettings().GetLayoutRTL() ) 2491*cdf0e10cSrcweir { 2492*cdf0e10cSrcweir // --- RTL --- (mirror paint rect) 2493*cdf0e10cSrcweir SalFrame* pSalFrame = pWindow->ImplGetWindowImpl()->mpFrame; 2494*cdf0e10cSrcweir pPaintEvt->mnBoundX = pSalFrame->maGeometry.nWidth-pPaintEvt->mnBoundWidth-pPaintEvt->mnBoundX; 2495*cdf0e10cSrcweir } 2496*cdf0e10cSrcweir 2497*cdf0e10cSrcweir Rectangle aBoundRect( Point( pPaintEvt->mnBoundX, pPaintEvt->mnBoundY ), 2498*cdf0e10cSrcweir Size( pPaintEvt->mnBoundWidth, pPaintEvt->mnBoundHeight ) ); 2499*cdf0e10cSrcweir ImplHandlePaint( pWindow, aBoundRect, pPaintEvt->mbImmediateUpdate ); 2500*cdf0e10cSrcweir } 2501*cdf0e10cSrcweir break; 2502*cdf0e10cSrcweir 2503*cdf0e10cSrcweir case SALEVENT_MOVE: 2504*cdf0e10cSrcweir ImplHandleMove( pWindow ); 2505*cdf0e10cSrcweir break; 2506*cdf0e10cSrcweir 2507*cdf0e10cSrcweir case SALEVENT_RESIZE: 2508*cdf0e10cSrcweir { 2509*cdf0e10cSrcweir long nNewWidth; 2510*cdf0e10cSrcweir long nNewHeight; 2511*cdf0e10cSrcweir pWindow->ImplGetWindowImpl()->mpFrame->GetClientSize( nNewWidth, nNewHeight ); 2512*cdf0e10cSrcweir ImplHandleResize( pWindow, nNewWidth, nNewHeight ); 2513*cdf0e10cSrcweir } 2514*cdf0e10cSrcweir break; 2515*cdf0e10cSrcweir 2516*cdf0e10cSrcweir case SALEVENT_MOVERESIZE: 2517*cdf0e10cSrcweir { 2518*cdf0e10cSrcweir SalFrameGeometry g = pWindow->ImplGetWindowImpl()->mpFrame->GetGeometry(); 2519*cdf0e10cSrcweir ImplHandleMoveResize( pWindow, g.nWidth, g.nHeight ); 2520*cdf0e10cSrcweir } 2521*cdf0e10cSrcweir break; 2522*cdf0e10cSrcweir 2523*cdf0e10cSrcweir case SALEVENT_CLOSEPOPUPS: 2524*cdf0e10cSrcweir { 2525*cdf0e10cSrcweir KillOwnPopups( pWindow ); 2526*cdf0e10cSrcweir } 2527*cdf0e10cSrcweir break; 2528*cdf0e10cSrcweir 2529*cdf0e10cSrcweir case SALEVENT_GETFOCUS: 2530*cdf0e10cSrcweir ImplHandleGetFocus( pWindow ); 2531*cdf0e10cSrcweir break; 2532*cdf0e10cSrcweir case SALEVENT_LOSEFOCUS: 2533*cdf0e10cSrcweir ImplHandleLoseFocus( pWindow ); 2534*cdf0e10cSrcweir break; 2535*cdf0e10cSrcweir 2536*cdf0e10cSrcweir case SALEVENT_CLOSE: 2537*cdf0e10cSrcweir ImplHandleClose( pWindow ); 2538*cdf0e10cSrcweir break; 2539*cdf0e10cSrcweir 2540*cdf0e10cSrcweir case SALEVENT_SHUTDOWN: 2541*cdf0e10cSrcweir { 2542*cdf0e10cSrcweir static bool bInQueryExit = false; 2543*cdf0e10cSrcweir if( !bInQueryExit ) 2544*cdf0e10cSrcweir { 2545*cdf0e10cSrcweir bInQueryExit = true; 2546*cdf0e10cSrcweir if ( GetpApp()->QueryExit() ) 2547*cdf0e10cSrcweir { 2548*cdf0e10cSrcweir // Message-Schleife beenden 2549*cdf0e10cSrcweir Application::Quit(); 2550*cdf0e10cSrcweir return sal_False; 2551*cdf0e10cSrcweir } 2552*cdf0e10cSrcweir else 2553*cdf0e10cSrcweir { 2554*cdf0e10cSrcweir bInQueryExit = false; 2555*cdf0e10cSrcweir return sal_True; 2556*cdf0e10cSrcweir } 2557*cdf0e10cSrcweir } 2558*cdf0e10cSrcweir return sal_False; 2559*cdf0e10cSrcweir } 2560*cdf0e10cSrcweir 2561*cdf0e10cSrcweir case SALEVENT_SETTINGSCHANGED: 2562*cdf0e10cSrcweir case SALEVENT_VOLUMECHANGED: 2563*cdf0e10cSrcweir case SALEVENT_PRINTERCHANGED: 2564*cdf0e10cSrcweir case SALEVENT_DISPLAYCHANGED: 2565*cdf0e10cSrcweir case SALEVENT_FONTCHANGED: 2566*cdf0e10cSrcweir case SALEVENT_DATETIMECHANGED: 2567*cdf0e10cSrcweir case SALEVENT_KEYBOARDCHANGED: 2568*cdf0e10cSrcweir ImplHandleSalSettings( pWindow, nEvent ); 2569*cdf0e10cSrcweir break; 2570*cdf0e10cSrcweir 2571*cdf0e10cSrcweir case SALEVENT_USEREVENT: 2572*cdf0e10cSrcweir ImplHandleUserEvent( (ImplSVEvent*)pEvent ); 2573*cdf0e10cSrcweir break; 2574*cdf0e10cSrcweir 2575*cdf0e10cSrcweir case SALEVENT_EXTTEXTINPUT: 2576*cdf0e10cSrcweir { 2577*cdf0e10cSrcweir SalExtTextInputEvent* pEvt = (SalExtTextInputEvent*)pEvent; 2578*cdf0e10cSrcweir nRet = ImplHandleExtTextInput( pWindow, 2579*cdf0e10cSrcweir pEvt->maText, pEvt->mpTextAttr, 2580*cdf0e10cSrcweir pEvt->mnCursorPos, pEvt->mnCursorFlags ); 2581*cdf0e10cSrcweir } 2582*cdf0e10cSrcweir break; 2583*cdf0e10cSrcweir case SALEVENT_ENDEXTTEXTINPUT: 2584*cdf0e10cSrcweir nRet = ImplHandleEndExtTextInput( pWindow ); 2585*cdf0e10cSrcweir break; 2586*cdf0e10cSrcweir case SALEVENT_EXTTEXTINPUTPOS: 2587*cdf0e10cSrcweir ImplHandleSalExtTextInputPos( pWindow, (SalExtTextInputPosEvent*)pEvent ); 2588*cdf0e10cSrcweir break; 2589*cdf0e10cSrcweir case SALEVENT_INPUTCONTEXTCHANGE: 2590*cdf0e10cSrcweir nRet = ImplHandleInputContextChange( pWindow, ((SalInputContextChangeEvent*)pEvent)->meLanguage ); 2591*cdf0e10cSrcweir break; 2592*cdf0e10cSrcweir case SALEVENT_SHOWDIALOG: 2593*cdf0e10cSrcweir { 2594*cdf0e10cSrcweir int nDialogID = static_cast<int>(reinterpret_cast<sal_IntPtr>(pEvent)); 2595*cdf0e10cSrcweir nRet = ImplHandleShowDialog( pWindow, nDialogID ); 2596*cdf0e10cSrcweir } 2597*cdf0e10cSrcweir break; 2598*cdf0e10cSrcweir case SALEVENT_SURROUNDINGTEXTREQUEST: 2599*cdf0e10cSrcweir ImplHandleSalSurroundingTextRequest( pWindow, (SalSurroundingTextRequestEvent*)pEvent ); 2600*cdf0e10cSrcweir break; 2601*cdf0e10cSrcweir case SALEVENT_SURROUNDINGTEXTSELECTIONCHANGE: 2602*cdf0e10cSrcweir { 2603*cdf0e10cSrcweir SalSurroundingTextSelectionChangeEvent* pEvt 2604*cdf0e10cSrcweir = (SalSurroundingTextSelectionChangeEvent*)pEvent; 2605*cdf0e10cSrcweir ImplHandleSurroundingTextSelectionChange( pWindow, 2606*cdf0e10cSrcweir pEvt->mnStart, 2607*cdf0e10cSrcweir pEvt->mnEnd ); 2608*cdf0e10cSrcweir } 2609*cdf0e10cSrcweir case SALEVENT_STARTRECONVERSION: 2610*cdf0e10cSrcweir ImplHandleStartReconversion( pWindow ); 2611*cdf0e10cSrcweir break; 2612*cdf0e10cSrcweir #ifdef DBG_UTIL 2613*cdf0e10cSrcweir default: 2614*cdf0e10cSrcweir DBG_ERROR1( "ImplWindowFrameProc(): unknown event (%lu)", (sal_uLong)nEvent ); 2615*cdf0e10cSrcweir break; 2616*cdf0e10cSrcweir #endif 2617*cdf0e10cSrcweir } 2618*cdf0e10cSrcweir 2619*cdf0e10cSrcweir return nRet; 2620*cdf0e10cSrcweir } 2621