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