LCOV - code coverage report
Current view: top level - libreoffice/vcl/source/window - winproc.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 145 1227 11.8 %
Date: 2012-12-27 Functions: 11 51 21.6 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.10