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

Generated by: LCOV version 1.10