LibreOffice Module vcl (master) 1
mouse.cxx
Go to the documentation of this file.
1/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2/*
3 * This file is part of the LibreOffice project.
4 *
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 *
9 * This file incorporates work covered by the following license notice:
10 *
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 */
19
20
21#include <config_feature_desktop.h>
22#include <config_vclplug.h>
23
24#include <tools/time.hxx>
25
26#include <LibreOfficeKit/LibreOfficeKitEnums.h>
27
29#include <vcl/svapp.hxx>
30#include <vcl/window.hxx>
31#include <vcl/cursor.hxx>
32#include <vcl/sysdata.hxx>
33#include <vcl/event.hxx>
34
35#include <sal/types.h>
36
37#include <window.h>
38#include <svdata.hxx>
39#include <salobj.hxx>
40#include <salgdi.hxx>
41#include <salframe.hxx>
42#include <salinst.hxx>
43
46
47#include <com/sun/star/datatransfer/dnd/XDragSource.hpp>
48#include <com/sun/star/datatransfer/dnd/XDropTarget.hpp>
49#include <com/sun/star/uno/XComponentContext.hpp>
50
52
53using namespace ::com::sun::star::uno;
54
55namespace vcl {
56
57WindowHitTest Window::ImplHitTest( const Point& rFramePos )
58{
59 Point aFramePos( rFramePos );
60 if( GetOutDev()->ImplIsAntiparallel() )
61 {
62 const OutputDevice *pOutDev = GetOutDev();
63 pOutDev->ReMirror( aFramePos );
64 }
65 if ( !GetOutputRectPixel().Contains( aFramePos ) )
67 if ( mpWindowImpl->mbWinRegion )
68 {
69 Point aTempPos = aFramePos;
70 aTempPos.AdjustX( -GetOutDev()->mnOutOffX );
71 aTempPos.AdjustY( -GetOutDev()->mnOutOffY );
72 if ( !mpWindowImpl->maWinRegion.Contains( aTempPos ) )
74 }
75
77 if ( mpWindowImpl->mbMouseTransparent )
79 return nHitTest;
80}
81
83{
84 // as soon as mouse is captured, switch mouse-pointer
85 if ( IsMouseCaptured() )
86 return true;
87
88 // if the mouse is over the window, switch it
89 tools::Rectangle aClientRect( Point( 0, 0 ), GetOutputSizePixel() );
90 return aClientRect.Contains( GetPointerPosPixel() );
91}
92
94{
95 PointerStyle ePointerStyle;
96 bool bWait = false;
97
98 if ( IsEnabled() && IsInputEnabled() && ! IsInModalMode() )
99 ePointerStyle = GetPointer();
100 else
101 ePointerStyle = PointerStyle::Arrow;
102
103 const vcl::Window* pWindow = this;
104 do
105 {
106 // when the pointer is not visible stop the search, as
107 // this status should not be overwritten
108 if ( pWindow->mpWindowImpl->mbNoPtrVisible )
109 return PointerStyle::Null;
110
111 if ( !bWait )
112 {
113 if ( pWindow->mpWindowImpl->mnWaitCount )
114 {
115 ePointerStyle = PointerStyle::Wait;
116 bWait = true;
117 }
118 else
119 {
120 if ( pWindow->mpWindowImpl->mbChildPtrOverwrite )
121 ePointerStyle = pWindow->GetPointer();
122 }
123 }
124
125 if ( pWindow->ImplIsOverlapWindow() )
126 break;
127
128 pWindow = pWindow->ImplGetParent();
129 }
130 while ( pWindow );
131
132 return ePointerStyle;
133}
134
135void Window::ImplCallMouseMove( sal_uInt16 nMouseCode, bool bModChanged )
136{
137 if ( !(mpWindowImpl->mpFrameData->mbMouseIn && mpWindowImpl->mpFrameWindow->mpWindowImpl->mbReallyVisible) )
138 return;
139
140 sal_uInt64 nTime = tools::Time::GetSystemTicks();
141 tools::Long nX = mpWindowImpl->mpFrameData->mnLastMouseX;
142 tools::Long nY = mpWindowImpl->mpFrameData->mnLastMouseY;
143 sal_uInt16 nCode = nMouseCode;
144 MouseEventModifiers nMode = mpWindowImpl->mpFrameData->mnMouseMode;
145 bool bLeave;
146 // check for MouseLeave
147 bLeave = ((nX < 0) || (nY < 0) ||
148 (nX >= mpWindowImpl->mpFrameWindow->GetOutDev()->mnOutWidth) ||
149 (nY >= mpWindowImpl->mpFrameWindow->GetOutDev()->mnOutHeight)) &&
152 if ( bModChanged )
154 ImplHandleMouseEvent( mpWindowImpl->mpFrameWindow, NotifyEventType::MOUSEMOVE, bLeave, nX, nY, nTime, nCode, nMode );
155}
156
158{
159 if ( mpWindowImpl && mpWindowImpl->mpFrameData &&
160 !mpWindowImpl->mpFrameData->mnMouseMoveId )
161 mpWindowImpl->mpFrameData->mnMouseMoveId = Application::PostUserEvent( LINK( mpWindowImpl->mpFrameWindow, Window, ImplGenerateMouseMoveHdl ), nullptr, true );
162}
163
164IMPL_LINK_NOARG(Window, ImplGenerateMouseMoveHdl, void*, void)
165{
166 mpWindowImpl->mpFrameData->mnMouseMoveId = nullptr;
168 if( ! pCaptureWin ||
169 (pCaptureWin->mpWindowImpl && pCaptureWin->mpWindowImpl->mpFrame == mpWindowImpl->mpFrame)
170 )
171 {
172 ImplCallMouseMove( mpWindowImpl->mpFrameData->mnMouseCode );
173 }
174}
175
177{
179}
180
181static bool IsWindowFocused(const WindowImpl& rWinImpl)
182{
183 if (rWinImpl.mpSysObj)
184 return true;
185
186 if (rWinImpl.mpFrameData->mbHasFocus)
187 return true;
188
189 if (rWinImpl.mbFakeFocusSet)
190 return true;
191
192 return false;
193}
194
196{
197 // #143570# no focus for destructing windows
198 if( !mpWindowImpl || mpWindowImpl->mbInDispose )
199 return;
200
201 // some event listeners do really bad stuff
202 // => prepare for the worst
203 VclPtr<vcl::Window> xWindow( this );
204
205 // Currently the client window should always get the focus
206 // Should the border window at some point be focusable
207 // we need to change all GrabFocus() instances in VCL,
208 // e.g. in ToTop()
209
210 if ( mpWindowImpl->mpClientWindow )
211 {
212 // For a lack of design we need a little hack here to
213 // ensure that dialogs on close pass the focus back to
214 // the correct window
215 if ( mpWindowImpl->mpLastFocusWindow && (mpWindowImpl->mpLastFocusWindow.get() != this) &&
216 !(mpWindowImpl->mnDlgCtrlFlags & DialogControlFlags::WantFocus) &&
217 mpWindowImpl->mpLastFocusWindow->IsEnabled() &&
218 mpWindowImpl->mpLastFocusWindow->IsInputEnabled() &&
219 ! mpWindowImpl->mpLastFocusWindow->IsInModalMode()
220 )
221 mpWindowImpl->mpLastFocusWindow->GrabFocus();
222 else
223 mpWindowImpl->mpClientWindow->GrabFocus();
224 return;
225 }
226 else if ( mpWindowImpl->mbFrame )
227 {
228 // For a lack of design we need a little hack here to
229 // ensure that dialogs on close pass the focus back to
230 // the correct window
231 if ( mpWindowImpl->mpLastFocusWindow && (mpWindowImpl->mpLastFocusWindow.get() != this) &&
232 !(mpWindowImpl->mnDlgCtrlFlags & DialogControlFlags::WantFocus) &&
233 mpWindowImpl->mpLastFocusWindow->IsEnabled() &&
234 mpWindowImpl->mpLastFocusWindow->IsInputEnabled() &&
235 ! mpWindowImpl->mpLastFocusWindow->IsInModalMode()
236 )
237 {
238 mpWindowImpl->mpLastFocusWindow->GrabFocus();
239 return;
240 }
241 }
242
243 // If the Window is disabled, then we don't change the focus
244 if ( !IsEnabled() || !IsInputEnabled() || IsInModalMode() )
245 return;
246
247 // we only need to set the focus if it is not already set
248 // note: if some other frame is waiting for an asynchronous focus event
249 // we also have to post an asynchronous focus event for this frame
250 // which is done using ToTop
251 ImplSVData* pSVData = ImplGetSVData();
252
253 bool bAsyncFocusWaiting = false;
254 vcl::Window *pFrame = pSVData->maFrameData.mpFirstFrame;
255 while( pFrame && pFrame->mpWindowImpl && pFrame->mpWindowImpl->mpFrameData )
256 {
257 if( pFrame != mpWindowImpl->mpFrameWindow.get() && pFrame->mpWindowImpl->mpFrameData->mnFocusId )
258 {
259 bAsyncFocusWaiting = true;
260 break;
261 }
262 pFrame = pFrame->mpWindowImpl->mpFrameData->mpNextFrame;
263 }
264
265 bool bHasFocus = IsWindowFocused(*mpWindowImpl);
266
267 bool bMustNotGrabFocus = false;
268 // #100242#, check parent hierarchy if some floater prohibits grab focus
269
270 vcl::Window *pParent = this;
271 while( pParent )
272 {
273 if ((pParent->GetStyle() & WB_SYSTEMFLOATWIN) && !(pParent->GetStyle() & WB_MOVEABLE))
274 {
275 bMustNotGrabFocus = true;
276 break;
277 }
278 if (!pParent->mpWindowImpl)
279 break;
280 pParent = pParent->mpWindowImpl->mpParent;
281 }
282
283 if ( !(( pSVData->mpWinData->mpFocusWin.get() != this &&
284 !mpWindowImpl->mbInDispose ) ||
285 ( bAsyncFocusWaiting && !bHasFocus && !bMustNotGrabFocus )) )
286 return;
287
288 // EndExtTextInput if it is not the same window
289 if (pSVData->mpWinData->mpExtTextInputWin
290 && (pSVData->mpWinData->mpExtTextInputWin.get() != this))
292
293 // mark this windows as the last FocusWindow
294 vcl::Window* pOverlapWindow = ImplGetFirstOverlapWindow();
295 if (pOverlapWindow->mpWindowImpl)
296 pOverlapWindow->mpWindowImpl->mpLastFocusWindow = this;
297 mpWindowImpl->mpFrameData->mpFocusWin = this;
298
299 if( !bHasFocus )
300 {
301 // menu windows never get the system focus
302 // the application will keep the focus
303 if( bMustNotGrabFocus )
304 return;
305 else
306 {
307 // here we already switch focus as ToTop()
308 // should not give focus to another window
310 return;
311 }
312 }
313
314 VclPtr<vcl::Window> pOldFocusWindow = pSVData->mpWinData->mpFocusWin;
315
316 pSVData->mpWinData->mpFocusWin = this;
317
318 if ( pOldFocusWindow && pOldFocusWindow->mpWindowImpl )
319 {
320 // Cursor hidden
321 if ( pOldFocusWindow->mpWindowImpl->mpCursor )
322 pOldFocusWindow->mpWindowImpl->mpCursor->ImplHide();
323 }
324
325 // !!!!! due to old SV-Office Activate/Deactivate handling
326 // !!!!! first as before
327 if ( pOldFocusWindow )
328 {
329 // remember Focus
330 vcl::Window* pOldOverlapWindow = pOldFocusWindow->ImplGetFirstOverlapWindow();
331 vcl::Window* pNewOverlapWindow = ImplGetFirstOverlapWindow();
332 if ( pOldOverlapWindow != pNewOverlapWindow )
333 ImplCallFocusChangeActivate( pNewOverlapWindow, pOldOverlapWindow );
334 }
335 else
336 {
337 vcl::Window* pNewOverlapWindow = ImplGetFirstOverlapWindow();
338 if ( pNewOverlapWindow && pNewOverlapWindow->mpWindowImpl )
339 {
340 vcl::Window* pNewRealWindow = pNewOverlapWindow->ImplGetWindow();
341 pNewOverlapWindow->mpWindowImpl->mbActive = true;
342 pNewOverlapWindow->Activate();
343 if ( pNewRealWindow != pNewOverlapWindow && pNewRealWindow && pNewRealWindow->mpWindowImpl )
344 {
345 pNewRealWindow->mpWindowImpl->mbActive = true;
346 pNewRealWindow->Activate();
347 }
348 }
349 }
350
351 // call Get- and LoseFocus
352 if ( pOldFocusWindow && ! pOldFocusWindow->isDisposed() )
353 {
354 NotifyEvent aNEvt( NotifyEventType::LOSEFOCUS, pOldFocusWindow );
355 if ( !ImplCallPreNotify( aNEvt ) )
356 pOldFocusWindow->CompatLoseFocus();
357 pOldFocusWindow->ImplCallDeactivateListeners( this );
358 }
359
360 if (pSVData->mpWinData->mpFocusWin.get() == this)
361 {
362 if ( mpWindowImpl->mpSysObj )
363 {
364 mpWindowImpl->mpFrameData->mpFocusWin = this;
365 if ( !mpWindowImpl->mpFrameData->mbInSysObjFocusHdl )
366 mpWindowImpl->mpSysObj->GrabFocus();
367 }
368
369 if (pSVData->mpWinData->mpFocusWin.get() == this)
370 {
371 if ( mpWindowImpl->mpCursor )
372 mpWindowImpl->mpCursor->ImplShow();
373 mpWindowImpl->mbInFocusHdl = true;
374 mpWindowImpl->mnGetFocusFlags = nFlags;
375 // if we're changing focus due to closing a popup floating window
376 // notify the new focus window so it can restore the inner focus
377 // eg, toolboxes can select their recent active item
378 if( pOldFocusWindow &&
379 ! pOldFocusWindow->isDisposed() &&
383 if ( !ImplCallPreNotify( aNEvt ) && !xWindow->isDisposed() )
385 if( !xWindow->isDisposed() )
386 ImplCallActivateListeners( (pOldFocusWindow && ! pOldFocusWindow->isDisposed()) ? pOldFocusWindow : nullptr );
387 if( !xWindow->isDisposed() )
388 {
389 mpWindowImpl->mnGetFocusFlags = GetFocusFlags::NONE;
390 mpWindowImpl->mbInFocusHdl = false;
391 }
392 }
393 }
394
396
397}
398
400{
401 vcl::Window *pWin = this;
402 while( pWin )
403 {
404 if( !pWin->GetParent() )
405 {
406 pWin->mpWindowImpl->mpFrame->GrabFocus();
408 return;
409 }
410 pWin = pWin->GetParent();
411 }
412}
413
414void Window::MouseMove( const MouseEvent& rMEvt )
415{
416 NotifyEvent aNEvt( NotifyEventType::MOUSEMOVE, this, &rMEvt );
417 EventNotify(aNEvt);
418}
419
421{
422 NotifyEvent aNEvt( NotifyEventType::MOUSEBUTTONDOWN, this, &rMEvt );
423 if (!EventNotify(aNEvt))
424 mpWindowImpl->mbMouseButtonDown = true;
425}
426
428{
429 NotifyEvent aNEvt( NotifyEventType::MOUSEBUTTONUP, this, &rMEvt );
430 if (!EventNotify(aNEvt))
431 mpWindowImpl->mbMouseButtonUp = true;
432}
433
434void Window::SetMouseTransparent( bool bTransparent )
435{
436
437 if ( mpWindowImpl->mpBorderWindow )
438 mpWindowImpl->mpBorderWindow->SetMouseTransparent( bTransparent );
439
440 if( mpWindowImpl->mpSysObj )
441 mpWindowImpl->mpSysObj->SetMouseTransparent( bTransparent );
442
443 mpWindowImpl->mbMouseTransparent = bTransparent;
444}
445
447{
449}
450
452{
453 ImplSVData* pSVData = ImplGetSVData();
454
455 // possibly stop tracking
456 if (pSVData->mpWinData->mpTrackWin.get() != this)
457 {
458 if (pSVData->mpWinData->mpTrackWin)
460 }
461
462 if (pSVData->mpWinData->mpCaptureWin.get() != this)
463 {
464 pSVData->mpWinData->mpCaptureWin = this;
465 mpWindowImpl->mpFrame->CaptureMouse( true );
466 }
467}
468
470{
471 if (IsMouseCaptured())
472 {
473 ImplSVData* pSVData = ImplGetSVData();
474 pSVData->mpWinData->mpCaptureWin = nullptr;
475 if (mpWindowImpl && mpWindowImpl->mpFrame)
476 mpWindowImpl->mpFrame->CaptureMouse( false );
478 }
479}
480
482{
483 return (this == ImplGetSVData()->mpWinData->mpCaptureWin);
484}
485
487{
488 if ( mpWindowImpl->maPointer == nPointer )
489 return;
490
491 mpWindowImpl->maPointer = nPointer;
492
493 // possibly immediately move pointer
494 if ( !mpWindowImpl->mpFrameData->mbInMouseMove && ImplTestMousePointerSet() )
495 mpWindowImpl->mpFrame->SetPointer( ImplGetMousePointer() );
496
498 if (!pWin)
499 return;
500
501 PointerStyle aPointer = GetPointer();
502 // We don't map all possible pointers hence we need a default
503 OString aPointerString = "default";
504 auto aIt = vcl::gaLOKPointerMap.find(aPointer);
505 if (aIt != vcl::gaLOKPointerMap.end())
506 {
507 aPointerString = aIt->second;
508 }
509
510 // issue mouse pointer events only for document windows
511 // Doc windows' immediate parent SfxFrameViewWindow_Impl is the one with
512 // parent notifier set during initialization
513 if ((ImplGetFrameData()->mbDragging &&
514 ImplGetFrameData()->mpMouseDownWin == this) ||
515 (GetParent()->ImplGetWindowImpl()->mbLOKParentNotifier &&
516 GetParent()->ImplGetWindowImpl()->mnLOKWindowId == 0))
517 {
518 pWin->GetLOKNotifier()->libreOfficeKitViewCallback(LOK_CALLBACK_MOUSE_POINTER, aPointerString.getStr());
519 }
520}
521
523{
524
525 if ( mpWindowImpl->mbChildPtrOverwrite == bOverwrite )
526 return;
527
528 mpWindowImpl->mbChildPtrOverwrite = bOverwrite;
529
530 // possibly immediately move pointer
531 if ( !mpWindowImpl->mpFrameData->mbInMouseMove && ImplTestMousePointerSet() )
532 mpWindowImpl->mpFrame->SetPointer( ImplGetMousePointer() );
533}
534
535void Window::SetPointerPosPixel( const Point& rPos )
536{
537 Point aPos = ImplOutputToFrame( rPos );
538 const OutputDevice *pOutDev = GetOutDev();
539 if( pOutDev->HasMirroredGraphics() )
540 {
541 if( !IsRTLEnabled() )
542 {
543 pOutDev->ReMirror( aPos );
544 }
545 // mirroring is required here, SetPointerPos bypasses SalGraphics
546 aPos.setX( GetOutDev()->mpGraphics->mirror2( aPos.X(), *GetOutDev() ) );
547 }
548 else if( GetOutDev()->ImplIsAntiparallel() )
549 {
550 pOutDev->ReMirror( aPos );
551 }
552 mpWindowImpl->mpFrame->SetPointerPos( aPos.X(), aPos.Y() );
553}
554
555void Window::SetLastMousePos(const Point& rPos)
556{
557 // Do this conversion, so when GetPointerPosPixel() calls
558 // ImplFrameToOutput(), we get back the original position.
559 Point aPos = ImplOutputToFrame(rPos);
560 mpWindowImpl->mpFrameData->mnLastMouseX = aPos.X();
561 mpWindowImpl->mpFrameData->mnLastMouseY = aPos.Y();
562}
563
565{
566
567 Point aPos( mpWindowImpl->mpFrameData->mnLastMouseX, mpWindowImpl->mpFrameData->mnLastMouseY );
568 if( GetOutDev()->ImplIsAntiparallel() )
569 {
570 const OutputDevice *pOutDev = GetOutDev();
571 pOutDev->ReMirror( aPos );
572 }
573 return ImplFrameToOutput( aPos );
574}
575
577{
578
579 Point aPos( mpWindowImpl->mpFrameData->mnBeforeLastMouseX, mpWindowImpl->mpFrameData->mnBeforeLastMouseY );
580 if( GetOutDev()->ImplIsAntiparallel() )
581 {
582 const OutputDevice *pOutDev = GetOutDev();
583 pOutDev->ReMirror( aPos );
584 }
585 return ImplFrameToOutput( aPos );
586}
587
588void Window::ShowPointer( bool bVisible )
589{
590
591 if ( mpWindowImpl->mbNoPtrVisible != !bVisible )
592 {
593 mpWindowImpl->mbNoPtrVisible = !bVisible;
594
595 // possibly immediately move pointer
596 if ( !mpWindowImpl->mpFrameData->mbInMouseMove && ImplTestMousePointerSet() )
597 mpWindowImpl->mpFrame->SetPointer( ImplGetMousePointer() );
598 }
599}
600
602{
603 PointerState aState;
604 aState.mnState = 0;
605
606 if (mpWindowImpl->mpFrame)
607 {
608 SalFrame::SalPointerState aSalPointerState = mpWindowImpl->mpFrame->GetPointerState();
609 if( GetOutDev()->ImplIsAntiparallel() )
610 {
611 const OutputDevice *pOutDev = GetOutDev();
612 pOutDev->ReMirror( aSalPointerState.maPos );
613 }
614 aState.maPos = ImplFrameToOutput( aSalPointerState.maPos );
615 aState.mnState = aSalPointerState.mnState;
616 }
617 return aState;
618}
619
621{
622 return ImplGetWinData()->mbMouseOver;
623}
624
626{
627
628 mpWindowImpl->mnWaitCount++;
629
630 if ( mpWindowImpl->mnWaitCount == 1 )
631 {
632 // possibly immediately move pointer
633 if ( !mpWindowImpl->mpFrameData->mbInMouseMove && ImplTestMousePointerSet() )
634 mpWindowImpl->mpFrame->SetPointer( ImplGetMousePointer() );
635 }
636}
637
639{
640
641 if ( mpWindowImpl->mnWaitCount )
642 {
643 mpWindowImpl->mnWaitCount--;
644
645 if ( !mpWindowImpl->mnWaitCount )
646 {
647 // possibly immediately move pointer
648 if ( !mpWindowImpl->mpFrameData->mbInMouseMove && ImplTestMousePointerSet() )
649 mpWindowImpl->mpFrame->SetPointer( ImplGetMousePointer() );
650 }
651 }
652}
653
655{
656 bool bRet = false;
657 if( mpWindowImpl->mpFrameData && mpWindowImpl->mpFrameData->mxDropTargetListener.is() )
658 {
659 bRet = true;
660 mpWindowImpl->mpFrameData->mxDropTarget.clear();
661 mpWindowImpl->mpFrameData->mxDragSource.clear();
662 mpWindowImpl->mpFrameData->mxDropTargetListener.clear();
663 }
664
665 return bRet;
666}
667
669{
671}
672
673Reference< css::datatransfer::dnd::XDropTarget > Window::GetDropTarget()
674{
675 if( !mpWindowImpl )
676 return Reference< css::datatransfer::dnd::XDropTarget >();
677
678 if( ! mpWindowImpl->mxDNDListenerContainer.is() )
679 {
680 sal_Int8 nDefaultActions = 0;
681
682 if( mpWindowImpl->mpFrameData )
683 {
684 if( ! mpWindowImpl->mpFrameData->mxDropTarget.is() )
685 {
686 // initialization is done in GetDragSource
688 }
689
690 if( mpWindowImpl->mpFrameData->mxDropTarget.is() )
691 {
692 nDefaultActions = mpWindowImpl->mpFrameData->mxDropTarget->getDefaultActions();
693
694 if( ! mpWindowImpl->mpFrameData->mxDropTargetListener.is() )
695 {
696 mpWindowImpl->mpFrameData->mxDropTargetListener = new DNDEventDispatcher( mpWindowImpl->mpFrameWindow );
697
698 try
699 {
700 mpWindowImpl->mpFrameData->mxDropTarget->addDropTargetListener( mpWindowImpl->mpFrameData->mxDropTargetListener );
701
702 // register also as drag gesture listener if directly supported by drag source
703 Reference< css::datatransfer::dnd::XDragGestureRecognizer > xDragGestureRecognizer(
704 mpWindowImpl->mpFrameData->mxDragSource, UNO_QUERY);
705
706 if( xDragGestureRecognizer.is() )
707 {
708 xDragGestureRecognizer->addDragGestureListener(
709 Reference< css::datatransfer::dnd::XDragGestureListener > (mpWindowImpl->mpFrameData->mxDropTargetListener, UNO_QUERY));
710 }
711 else
712 mpWindowImpl->mpFrameData->mbInternalDragGestureRecognizer = true;
713
714 }
715 catch (const RuntimeException&)
716 {
717 // release all instances
718 mpWindowImpl->mpFrameData->mxDropTarget.clear();
719 mpWindowImpl->mpFrameData->mxDragSource.clear();
720 }
721 }
722 }
723
724 }
725
726 mpWindowImpl->mxDNDListenerContainer = static_cast < css::datatransfer::dnd::XDropTarget * > ( new DNDListenerContainer( nDefaultActions ) );
727 }
728
729 // this object is located in the same process, so there will be no runtime exception
730 return Reference< css::datatransfer::dnd::XDropTarget > ( mpWindowImpl->mxDNDListenerContainer, UNO_QUERY );
731}
732
733Reference< css::datatransfer::dnd::XDragSource > Window::GetDragSource()
734{
735#if HAVE_FEATURE_DESKTOP
736 const SystemEnvData* pEnvData = GetSystemData();
737 if (!mpWindowImpl->mpFrameData || !pEnvData)
738 return Reference<css::datatransfer::dnd::XDragSource>();
739 if (mpWindowImpl->mpFrameData->mxDragSource.is())
740 return mpWindowImpl->mpFrameData->mxDragSource;
741
742 try
743 {
745 mpWindowImpl->mpFrameData->mxDragSource.set(pInst->CreateDragSource(pEnvData), UNO_QUERY);
746 mpWindowImpl->mpFrameData->mxDropTarget.set(pInst->CreateDropTarget(pEnvData), UNO_QUERY);
747 }
748 catch (const Exception&)
749 {
750 mpWindowImpl->mpFrameData->mxDropTarget.clear();
751 mpWindowImpl->mpFrameData->mxDragSource.clear();
752 }
753 return mpWindowImpl->mpFrameData->mxDragSource;
754#else
755 return Reference< css::datatransfer::dnd::XDragSource > ();
756#endif
757}
758
759Reference< css::datatransfer::dnd::XDragGestureRecognizer > Window::GetDragGestureRecognizer()
760{
761 return Reference< css::datatransfer::dnd::XDragGestureRecognizer > ( GetDropTarget(), UNO_QUERY );
762}
763
764} /* namespace vcl */
765
766/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
static ImplSVEvent * PostUserEvent(const Link< void *, void > &rLink, void *pCaller=nullptr, bool bReferenceLink=false)
Post a user event to the default window.
Definition: svapp.cxx:1122
Some things multiple-inherit from VclAbstractDialog and OutputDevice, so we need to use virtual inher...
Definition: outdev.hxx:171
SAL_DLLPRIVATE void ReMirror(Point &rPoint) const
Definition: outdev.cxx:672
virtual bool HasMirroredGraphics() const
Definition: outdev.cxx:704
css::uno::Reference< css::uno::XInterface > CreateDropTarget(const SystemEnvData *=nullptr)
Definition: dtranscomp.cxx:455
css::uno::Reference< css::uno::XInterface > CreateDragSource(const SystemEnvData *=nullptr)
Definition: dtranscomp.cxx:441
reference_type * get() const
Get the body.
Definition: vclptr.hxx:143
bool isDisposed() const
SalObject * mpSysObj
Definition: window.h:230
bool mbFakeFocusSet
Definition: window.h:383
ImplFrameData * mpFrameData
Definition: window.h:228
bool Contains(const Point &rPOINT) const
static sal_uInt64 GetSystemTicks()
void EnableChildPointerOverwrite(bool bOverwrite)
Definition: mouse.cxx:522
SAL_DLLPRIVATE void ImplInvertFocus(const tools::Rectangle &rRect)
Definition: mouse.cxx:176
void SetLastMousePos(const Point &rPos)
Similar to SetPointerPosPixel(), but sets the frame data's last mouse position instead.
Definition: mouse.cxx:555
SAL_DLLPRIVATE Point ImplOutputToFrame(const Point &rPos)
Definition: window2.cxx:961
SAL_DLLPRIVATE Point ImplFrameToOutput(const Point &rPos)
Definition: window2.cxx:966
static SAL_DLLPRIVATE void ImplNewInputContext()
Definition: window.cxx:1742
SAL_DLLPRIVATE void ImplGrabFocus(GetFocusFlags nFlags)
Definition: mouse.cxx:195
vcl::Window * GetParent() const
Definition: window2.cxx:1121
bool IsInputEnabled() const
Definition: window2.cxx:1151
bool IsMouseCaptured() const
Definition: mouse.cxx:481
void ShowPointer(bool bVisible)
Definition: mouse.cxx:588
SAL_DLLPRIVATE void ImplCallDeactivateListeners(vcl::Window *)
Definition: window.cxx:3402
void EndTracking(TrackingEventFlags nFlags=TrackingEventFlags::NONE)
Definition: window2.cxx:293
bool IsMouseOver() const
Definition: mouse.cxx:620
SAL_DLLPRIVATE void ImplGenerateMouseMove()
Definition: mouse.cxx:157
SAL_DLLPRIVATE bool ImplIsOverlapWindow() const
Definition: window2.cxx:950
vcl::Window * GetWindow(GetWindowType nType) const
Definition: stacking.cxx:1035
PointerState GetPointerState()
Definition: mouse.cxx:601
virtual void MouseButtonDown(const MouseEvent &rMEvt)
Definition: mouse.cxx:420
Point GetLastPointerPosPixel()
Definition: mouse.cxx:576
static SAL_DLLPRIVATE void ImplCallFocusChangeActivate(vcl::Window *pNewOverlapWindow, vcl::Window *pOldOverlapWindow)
Definition: event.cxx:571
void LeaveWait()
Definition: mouse.cxx:638
void LocalStartDrag()
Definition: mouse.cxx:446
WinBits GetStyle() const
Definition: window2.cxx:977
SAL_DLLPRIVATE bool ImplTestMousePointerSet()
Definition: mouse.cxx:82
virtual void MouseButtonUp(const MouseEvent &rMEvt)
Definition: mouse.cxx:427
SAL_DLLPRIVATE bool ImplStopDnd()
Definition: mouse.cxx:654
SAL_DLLPRIVATE vcl::Window * ImplGetParent() const
Definition: window2.cxx:884
SAL_DLLPRIVATE void ImplCallMouseMove(sal_uInt16 nMouseCode, bool bModChanged=false)
Definition: mouse.cxx:135
void SetMouseTransparent(bool bTransparent)
Definition: mouse.cxx:434
SAL_DLLPRIVATE vcl::Window * ImplGetFirstOverlapWindow()
Definition: window2.cxx:899
VclPtr< vcl::Window > GetParentWithLOKNotifier()
Find the nearest parent with LOK Notifier; can be itself if this Window has LOK notifier set.
Definition: window.cxx:3263
SAL_DLLPRIVATE void ImplCallActivateListeners(vcl::Window *)
Definition: window.cxx:3420
::OutputDevice const * GetOutDev() const
Definition: window.cxx:567
SAL_DLLPRIVATE void ImplStartDnd()
Definition: mouse.cxx:668
const vcl::ILibreOfficeKitNotifier * GetLOKNotifier() const
Definition: window.cxx:3253
bool IsInModalMode() const
A window is in modal mode if one of its children or subchildren is a running modal window (a modal di...
Definition: window.cxx:3596
void SetPointerPosPixel(const Point &rPos)
Definition: mouse.cxx:535
SAL_DLLPRIVATE ImplWinData * ImplGetWinData() const
Definition: window.cxx:1225
SAL_DLLPRIVATE WindowImpl * ImplGetWindowImpl() const
Definition: window.hxx:528
virtual void MouseMove(const MouseEvent &rMEvt)
Definition: mouse.cxx:414
SAL_DLLPRIVATE void CompatLoseFocus()
Definition: window.cxx:3889
std::unique_ptr< WindowImpl > mpWindowImpl
Definition: window.hxx:484
void ReleaseMouse()
Definition: mouse.cxx:469
bool IsRTLEnabled() const
Definition: window3.cxx:127
Size GetOutputSizePixel() const
Definition: window3.cxx:89
Point GetPointerPosPixel()
Definition: mouse.cxx:564
DialogControlFlags GetDialogControlFlags() const
Definition: window2.cxx:1081
void SetPointer(PointerStyle)
Definition: mouse.cxx:486
SAL_DLLPRIVATE ImplFrameData * ImplGetFrameData()
Definition: window2.cxx:862
virtual WindowHitTest ImplHitTest(const Point &rFramePos)
Definition: mouse.cxx:57
void EnterWait()
Definition: mouse.cxx:625
virtual void Activate()
Definition: window.cxx:1839
css::uno::Reference< css::datatransfer::dnd::XDragSource > GetDragSource()
Definition: mouse.cxx:733
void CaptureMouse()
Definition: mouse.cxx:451
tools::Rectangle GetOutputRectPixel() const
Definition: window3.cxx:91
css::uno::Reference< css::datatransfer::dnd::XDropTarget > GetDropTarget()
Definition: mouse.cxx:673
void InvertTracking(const tools::Rectangle &rRect, ShowTrackFlags nFlags)
Definition: window2.cxx:162
vcl::Window * ImplGetWindow() const
if this is a proxy return the client, otherwise itself
Definition: window2.cxx:854
virtual bool EventNotify(NotifyEvent &rNEvt)
Definition: event.cxx:104
SAL_DLLPRIVATE PointerStyle ImplGetMousePointer() const
Definition: mouse.cxx:93
css::uno::Reference< css::datatransfer::dnd::XDragGestureRecognizer > GetDragGestureRecognizer()
Definition: mouse.cxx:759
void EndExtTextInput()
Definition: window.cxx:2108
SAL_DLLPRIVATE vcl::Window * ImplGetFrameWindow() const
Definition: window2.cxx:925
PointerStyle GetPointer() const
Definition: window2.cxx:1271
bool IsEnabled() const
Definition: window2.cxx:1146
SAL_DLLPRIVATE void ImplGrabFocusToDocument(GetFocusFlags nFlags)
Definition: mouse.cxx:399
virtual const SystemEnvData * GetSystemData() const
Definition: window.cxx:3853
SAL_DLLPRIVATE void CompatGetFocus()
Definition: window.cxx:3881
GraphicsSharedPtr mpGraphics
MouseEventModifiers
Definition: event.hxx:80
sal_uInt16 nCode
@ Exception
end
long Long
static bool IsWindowFocused(const WindowImpl &rWinImpl)
Definition: mouse.cxx:181
IMPL_LINK_NOARG(QuickSelectionEngine_Data, SearchStringTimeout, Timer *, void)
const std::map< PointerStyle, OString > gaLOKPointerMap
PointerStyle
Definition: ptrstyle.hxx:26
bool mbDragging
Definition: window.h:179
bool mbHasFocus
Definition: window.h:161
ImplSVFrameData maFrameData
Definition: svdata.hxx:402
SalInstance * mpDefInst
Definition: svdata.hxx:392
ImplSVWinData * mpWinData
Definition: svdata.hxx:403
VclPtr< vcl::Window > mpFirstFrame
Definition: svdata.hxx:245
VclPtr< vcl::Window > mpFocusWin
Definition: svdata.hxx:255
VclPtr< vcl::Window > mpCaptureWin
Definition: svdata.hxx:256
VclPtr< vcl::Window > mpTrackWin
Definition: svdata.hxx:261
VclPtr< vcl::Window > mpExtTextInputWin
Definition: svdata.hxx:260
bool mbMouseOver
Definition: window.h:120
ImplSVData * ImplGetSVData()
Definition: svdata.cxx:76
bool bVisible
signed char sal_Int8
GetFocusFlags
Definition: window.hxx:313
@ FloatWinPopupModeEndCancel
WindowHitTest
Definition: window.hxx:403
bool ImplHandleMouseEvent(const VclPtr< vcl::Window > &xWindow, NotifyEventType nSVEvent, bool bMouseLeave, tools::Long nX, tools::Long nY, sal_uInt64 nMsgTime, sal_uInt16 nCode, MouseEventModifiers nMode)
Definition: winproc.cxx:268
bool ImplCallPreNotify(NotifyEvent &rEvt)
Definition: winproc.cxx:67
WinBits const WB_MOVEABLE
Definition: wintypes.hxx:122
WinBits const WB_SYSTEMFLOATWIN
Definition: wintypes.hxx:169