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