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