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