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 #include <config_feature_desktop.h>
23 
24 #include <tools/time.hxx>
25 
26 #include <LibreOfficeKit/LibreOfficeKitEnums.h>
27 
28 #include <vcl/ITiledRenderable.hxx>
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 
43 #include <dndlistenercontainer.hxx>
44 #include <dndeventdispatcher.hxx>
45 
46 #include <com/sun/star/datatransfer/dnd/XDragSource.hpp>
47 #include <com/sun/star/datatransfer/dnd/XDropTarget.hpp>
48 #include <com/sun/star/uno/XComponentContext.hpp>
49 
51 
52 using namespace ::com::sun::star::uno;
53 
54 namespace vcl {
55 
57 {
58  Point aFramePos( rFramePos );
59  if( ImplIsAntiparallel() )
60  {
61  const OutputDevice *pOutDev = GetOutDev();
62  pOutDev->ReMirror( aFramePos );
63  }
65  if ( !aRect.IsInside( aFramePos ) )
66  return WindowHitTest::NONE;
67  if ( mpWindowImpl->mbWinRegion )
68  {
69  Point aTempPos = aFramePos;
70  aTempPos.AdjustX( -mnOutOffX );
71  aTempPos.AdjustY( -mnOutOffY );
72  if ( !mpWindowImpl->maWinRegion.IsInside( aTempPos ) )
73  return WindowHitTest::NONE;
74  }
75 
77  if ( mpWindowImpl->mbMouseTransparent )
78  nHitTest |= WindowHitTest::Transparent;
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.IsInside( 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 
135 void Window::ImplCallMouseMove( sal_uInt16 nMouseCode, bool bModChanged )
136 {
137  if ( mpWindowImpl->mpFrameData->mbMouseIn && mpWindowImpl->mpFrameWindow->mpWindowImpl->mbReallyVisible )
138  {
139  sal_uInt64 nTime = tools::Time::GetSystemTicks();
140  long nX = mpWindowImpl->mpFrameData->mnLastMouseX;
141  long nY = mpWindowImpl->mpFrameData->mnLastMouseY;
142  sal_uInt16 nCode = nMouseCode;
143  MouseEventModifiers nMode = mpWindowImpl->mpFrameData->mnMouseMode;
144  bool bLeave;
145  // check for MouseLeave
146  bLeave = ((nX < 0) || (nY < 0) ||
147  (nX >= mpWindowImpl->mpFrameWindow->mnOutWidth) ||
148  (nY >= mpWindowImpl->mpFrameWindow->mnOutHeight)) &&
151  if ( bModChanged )
153  ImplHandleMouseEvent( mpWindowImpl->mpFrameWindow, MouseNotifyEvent::MOUSEMOVE, bLeave, nX, nY, nTime, nCode, nMode );
154  }
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 
164 IMPL_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 
181 static 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->maWinData.mpFirstFrame;
255  while( pFrame )
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  pParent = pParent->mpWindowImpl->mpParent;
279  }
280 
281  if ( !(( pSVData->maWinData.mpFocusWin.get() != this &&
282  !mpWindowImpl->mbInDispose ) ||
283  ( bAsyncFocusWaiting && !bHasFocus && !bMustNotGrabFocus )) )
284  return;
285 
286  // EndExtTextInput if it is not the same window
287  if ( pSVData->maWinData.mpExtTextInputWin &&
288  (pSVData->maWinData.mpExtTextInputWin.get() != this) )
290 
291  // mark this windows as the last FocusWindow
292  vcl::Window* pOverlapWindow = ImplGetFirstOverlapWindow();
293  pOverlapWindow->mpWindowImpl->mpLastFocusWindow = this;
294  mpWindowImpl->mpFrameData->mpFocusWin = this;
295 
296  if( !bHasFocus )
297  {
298  // menu windows never get the system focus
299  // the application will keep the focus
300  if( bMustNotGrabFocus )
301  return;
302  else
303  {
304  // here we already switch focus as ToTop()
305  // should not give focus to another window
307  return;
308  }
309  }
310 
311  VclPtr<vcl::Window> pOldFocusWindow = pSVData->maWinData.mpFocusWin;
312 
313  pSVData->maWinData.mpFocusWin = this;
314 
315  if ( pOldFocusWindow )
316  {
317  // Cursor hidden
318  if ( pOldFocusWindow->mpWindowImpl->mpCursor )
319  pOldFocusWindow->mpWindowImpl->mpCursor->ImplHide();
320  }
321 
322  // !!!!! due to old SV-Office Activate/Deactivate handling
323  // !!!!! first as before
324  if ( pOldFocusWindow )
325  {
326  // remember Focus
327  vcl::Window* pOldOverlapWindow = pOldFocusWindow->ImplGetFirstOverlapWindow();
328  vcl::Window* pNewOverlapWindow = ImplGetFirstOverlapWindow();
329  if ( pOldOverlapWindow != pNewOverlapWindow )
330  ImplCallFocusChangeActivate( pNewOverlapWindow, pOldOverlapWindow );
331  }
332  else
333  {
334  vcl::Window* pNewOverlapWindow = ImplGetFirstOverlapWindow();
335  vcl::Window* pNewRealWindow = pNewOverlapWindow->ImplGetWindow();
336  pNewOverlapWindow->mpWindowImpl->mbActive = true;
337  pNewOverlapWindow->Activate();
338  if ( pNewRealWindow != pNewOverlapWindow )
339  {
340  pNewRealWindow->mpWindowImpl->mbActive = true;
341  pNewRealWindow->Activate();
342  }
343  }
344 
345  // call Get- and LoseFocus
346  if ( pOldFocusWindow && ! pOldFocusWindow->IsDisposed() )
347  {
348  NotifyEvent aNEvt( MouseNotifyEvent::LOSEFOCUS, pOldFocusWindow );
349  if ( !ImplCallPreNotify( aNEvt ) )
350  pOldFocusWindow->CompatLoseFocus();
351  pOldFocusWindow->ImplCallDeactivateListeners( this );
352  }
353 
354  if ( pSVData->maWinData.mpFocusWin.get() == this )
355  {
356  if ( mpWindowImpl->mpSysObj )
357  {
358  mpWindowImpl->mpFrameData->mpFocusWin = this;
359  if ( !mpWindowImpl->mpFrameData->mbInSysObjFocusHdl )
360  mpWindowImpl->mpSysObj->GrabFocus();
361  }
362 
363  if ( pSVData->maWinData.mpFocusWin.get() == this )
364  {
365  if ( mpWindowImpl->mpCursor )
366  mpWindowImpl->mpCursor->ImplShow();
367  mpWindowImpl->mbInFocusHdl = true;
368  mpWindowImpl->mnGetFocusFlags = nFlags;
369  // if we're changing focus due to closing a popup floating window
370  // notify the new focus window so it can restore the inner focus
371  // eg, toolboxes can select their recent active item
372  if( pOldFocusWindow &&
373  ! pOldFocusWindow->IsDisposed() &&
377  if ( !ImplCallPreNotify( aNEvt ) && !xWindow->IsDisposed() )
378  CompatGetFocus();
379  if( !xWindow->IsDisposed() )
380  ImplCallActivateListeners( (pOldFocusWindow && ! pOldFocusWindow->IsDisposed()) ? pOldFocusWindow : nullptr );
381  if( !xWindow->IsDisposed() )
382  {
383  mpWindowImpl->mnGetFocusFlags = GetFocusFlags::NONE;
384  mpWindowImpl->mbInFocusHdl = false;
385  }
386  }
387  }
388 
390 
391 }
392 
394 {
395  vcl::Window *pWin = this;
396  while( pWin )
397  {
398  if( !pWin->GetParent() )
399  {
401  return;
402  }
403  pWin = pWin->GetParent();
404  }
405 }
406 
407 void Window::MouseMove( const MouseEvent& rMEvt )
408 {
409  NotifyEvent aNEvt( MouseNotifyEvent::MOUSEMOVE, this, &rMEvt );
410  EventNotify(aNEvt);
411 }
412 
414 {
415  NotifyEvent aNEvt( MouseNotifyEvent::MOUSEBUTTONDOWN, this, &rMEvt );
416  if (!EventNotify(aNEvt))
417  mpWindowImpl->mbMouseButtonDown = true;
418 }
419 
420 void Window::MouseButtonUp( const MouseEvent& rMEvt )
421 {
422  NotifyEvent aNEvt( MouseNotifyEvent::MOUSEBUTTONUP, this, &rMEvt );
423  if (!EventNotify(aNEvt))
424  mpWindowImpl->mbMouseButtonUp = true;
425 }
426 
427 void Window::SetMouseTransparent( bool bTransparent )
428 {
429 
430  if ( mpWindowImpl->mpBorderWindow )
431  mpWindowImpl->mpBorderWindow->SetMouseTransparent( bTransparent );
432 
433  if( mpWindowImpl->mpSysObj )
434  mpWindowImpl->mpSysObj->SetMouseTransparent( bTransparent );
435 
436  mpWindowImpl->mbMouseTransparent = bTransparent;
437 }
438 
440 {
441 
442  ImplSVData* pSVData = ImplGetSVData();
443 
444  // possibly stop tracking
445  if ( pSVData->maWinData.mpTrackWin.get() != this )
446  {
447  if ( pSVData->maWinData.mpTrackWin )
449  }
450 
451  if ( pSVData->maWinData.mpCaptureWin.get() != this )
452  {
453  pSVData->maWinData.mpCaptureWin = this;
454  mpWindowImpl->mpFrame->CaptureMouse( true );
455  }
456 }
457 
459 {
460  if (IsMouseCaptured())
461  {
462  ImplSVData* pSVData = ImplGetSVData();
463  pSVData->maWinData.mpCaptureWin = nullptr;
464  mpWindowImpl->mpFrame->CaptureMouse( false );
466  }
467 }
468 
470 {
471  return (this == ImplGetSVData()->maWinData.mpCaptureWin);
472 }
473 
475 {
476  if ( mpWindowImpl->maPointer == nPointer )
477  return;
478 
479  mpWindowImpl->maPointer = nPointer;
480 
481  // possibly immediately move pointer
482  if ( !mpWindowImpl->mpFrameData->mbInMouseMove && ImplTestMousePointerSet() )
483  mpWindowImpl->mpFrame->SetPointer( ImplGetMousePointer() );
484 
486  {
487  PointerStyle aPointer = GetPointer();
488  // We don't map all possible pointers hence we need a default
489  OString aPointerString = "default";
490  auto aIt = vcl::gaLOKPointerMap.find(aPointer);
491  if (aIt != vcl::gaLOKPointerMap.end())
492  {
493  aPointerString = aIt->second;
494  }
495 
496  // issue mouse pointer events only for document windows
497  // Doc windows' immediate parent SfxFrameViewWindow_Impl is the one with
498  // parent notifier set during initialization
499  if (GetParent()->ImplGetWindowImpl()->mbLOKParentNotifier &&
500  GetParent()->ImplGetWindowImpl()->mnLOKWindowId == 0)
501  {
502  pWin->GetLOKNotifier()->libreOfficeKitViewCallback(LOK_CALLBACK_MOUSE_POINTER, aPointerString.getStr());
503  }
504  }
505 }
506 
507 void Window::EnableChildPointerOverwrite( bool bOverwrite )
508 {
509 
510  if ( mpWindowImpl->mbChildPtrOverwrite == bOverwrite )
511  return;
512 
513  mpWindowImpl->mbChildPtrOverwrite = bOverwrite;
514 
515  // possibly immediately move pointer
516  if ( !mpWindowImpl->mpFrameData->mbInMouseMove && ImplTestMousePointerSet() )
517  mpWindowImpl->mpFrame->SetPointer( ImplGetMousePointer() );
518 }
519 
521 {
522  Point aPos = ImplOutputToFrame( rPos );
523  const OutputDevice *pOutDev = GetOutDev();
524  if( pOutDev->HasMirroredGraphics() )
525  {
526  if( !IsRTLEnabled() )
527  {
528  pOutDev->ReMirror( aPos );
529  }
530  // mirroring is required here, SetPointerPos bypasses SalGraphics
531  aPos.setX( mpGraphics->mirror2( aPos.X(), this ) );
532  }
533  else if( ImplIsAntiparallel() )
534  {
535  pOutDev->ReMirror( aPos );
536  }
537  mpWindowImpl->mpFrame->SetPointerPos( aPos.X(), aPos.Y() );
538 }
539 
541 {
542  // Do this conversion, so when GetPointerPosPixel() calls
543  // ImplFrameToOutput(), we get back the original position.
544  Point aPos = ImplOutputToFrame(rPos);
545  mpWindowImpl->mpFrameData->mnLastMouseX = aPos.X();
546  mpWindowImpl->mpFrameData->mnLastMouseY = aPos.Y();
547 }
548 
550 {
551 
552  Point aPos( mpWindowImpl->mpFrameData->mnLastMouseX, mpWindowImpl->mpFrameData->mnLastMouseY );
553  if( ImplIsAntiparallel() )
554  {
555  const OutputDevice *pOutDev = GetOutDev();
556  pOutDev->ReMirror( aPos );
557  }
558  return ImplFrameToOutput( aPos );
559 }
560 
562 {
563 
564  Point aPos( mpWindowImpl->mpFrameData->mnBeforeLastMouseX, mpWindowImpl->mpFrameData->mnBeforeLastMouseY );
565  if( ImplIsAntiparallel() )
566  {
567  const OutputDevice *pOutDev = GetOutDev();
568  pOutDev->ReMirror( aPos );
569  }
570  return ImplFrameToOutput( aPos );
571 }
572 
573 void Window::ShowPointer( bool bVisible )
574 {
575 
576  if ( mpWindowImpl->mbNoPtrVisible != !bVisible )
577  {
578  mpWindowImpl->mbNoPtrVisible = !bVisible;
579 
580  // possibly immediately move pointer
581  if ( !mpWindowImpl->mpFrameData->mbInMouseMove && ImplTestMousePointerSet() )
582  mpWindowImpl->mpFrame->SetPointer( ImplGetMousePointer() );
583  }
584 }
585 
587 {
588  PointerState aState;
589  aState.mnState = 0;
590 
591  if (mpWindowImpl->mpFrame)
592  {
593  SalFrame::SalPointerState aSalPointerState = mpWindowImpl->mpFrame->GetPointerState();
594  if( ImplIsAntiparallel() )
595  {
596  const OutputDevice *pOutDev = GetOutDev();
597  pOutDev->ReMirror( aSalPointerState.maPos );
598  }
599  aState.maPos = ImplFrameToOutput( aSalPointerState.maPos );
600  aState.mnState = aSalPointerState.mnState;
601  }
602  return aState;
603 }
604 
606 {
607  return ImplGetWinData()->mbMouseOver;
608 }
609 
611 {
612 
613  mpWindowImpl->mnWaitCount++;
614 
615  if ( mpWindowImpl->mnWaitCount == 1 )
616  {
617  // possibly immediately move pointer
618  if ( !mpWindowImpl->mpFrameData->mbInMouseMove && ImplTestMousePointerSet() )
619  mpWindowImpl->mpFrame->SetPointer( ImplGetMousePointer() );
620  }
621 }
622 
624 {
625 
626  if ( mpWindowImpl->mnWaitCount )
627  {
628  mpWindowImpl->mnWaitCount--;
629 
630  if ( !mpWindowImpl->mnWaitCount )
631  {
632  // possibly immediately move pointer
633  if ( !mpWindowImpl->mpFrameData->mbInMouseMove && ImplTestMousePointerSet() )
634  mpWindowImpl->mpFrame->SetPointer( ImplGetMousePointer() );
635  }
636  }
637 }
638 
640 {
641  bool bRet = false;
642  if( mpWindowImpl->mpFrameData && mpWindowImpl->mpFrameData->mxDropTargetListener.is() )
643  {
644  bRet = true;
645  mpWindowImpl->mpFrameData->mxDropTarget.clear();
646  mpWindowImpl->mpFrameData->mxDragSource.clear();
647  mpWindowImpl->mpFrameData->mxDropTargetListener.clear();
648  }
649 
650  return bRet;
651 }
652 
654 {
655  GetDropTarget();
656 }
657 
658 Reference< css::datatransfer::dnd::XDropTarget > Window::GetDropTarget()
659 {
660  if( !mpWindowImpl )
661  return Reference< css::datatransfer::dnd::XDropTarget >();
662 
663  if( ! mpWindowImpl->mxDNDListenerContainer.is() )
664  {
665  sal_Int8 nDefaultActions = 0;
666 
667  if( mpWindowImpl->mpFrameData )
668  {
669  if( ! mpWindowImpl->mpFrameData->mxDropTarget.is() )
670  {
671  // initialization is done in GetDragSource
672  GetDragSource();
673  }
674 
675  if( mpWindowImpl->mpFrameData->mxDropTarget.is() )
676  {
677  nDefaultActions = mpWindowImpl->mpFrameData->mxDropTarget->getDefaultActions();
678 
679  if( ! mpWindowImpl->mpFrameData->mxDropTargetListener.is() )
680  {
681  mpWindowImpl->mpFrameData->mxDropTargetListener = new DNDEventDispatcher( mpWindowImpl->mpFrameWindow );
682 
683  try
684  {
685  mpWindowImpl->mpFrameData->mxDropTarget->addDropTargetListener( mpWindowImpl->mpFrameData->mxDropTargetListener );
686 
687  // register also as drag gesture listener if directly supported by drag source
688  Reference< css::datatransfer::dnd::XDragGestureRecognizer > xDragGestureRecognizer(
689  mpWindowImpl->mpFrameData->mxDragSource, UNO_QUERY);
690 
691  if( xDragGestureRecognizer.is() )
692  {
693  xDragGestureRecognizer->addDragGestureListener(
694  Reference< css::datatransfer::dnd::XDragGestureListener > (mpWindowImpl->mpFrameData->mxDropTargetListener, UNO_QUERY));
695  }
696  else
697  mpWindowImpl->mpFrameData->mbInternalDragGestureRecognizer = true;
698 
699  }
700  catch (const RuntimeException&)
701  {
702  // release all instances
703  mpWindowImpl->mpFrameData->mxDropTarget.clear();
704  mpWindowImpl->mpFrameData->mxDragSource.clear();
705  }
706  }
707  }
708 
709  }
710 
711  mpWindowImpl->mxDNDListenerContainer = static_cast < css::datatransfer::dnd::XDropTarget * > ( new DNDListenerContainer( nDefaultActions ) );
712  }
713 
714  // this object is located in the same process, so there will be no runtime exception
715  return Reference< css::datatransfer::dnd::XDropTarget > ( mpWindowImpl->mxDNDListenerContainer, UNO_QUERY );
716 }
717 
718 Reference< css::datatransfer::dnd::XDragSource > Window::GetDragSource()
719 {
720 
721 #if HAVE_FEATURE_DESKTOP
722 
723  if( mpWindowImpl->mpFrameData )
724  {
725  if( ! mpWindowImpl->mpFrameData->mxDragSource.is() )
726  {
727  try
728  {
730  const SystemEnvData * pEnvData = GetSystemData();
731 
732  if( pEnvData )
733  {
734  Sequence< Any > aDragSourceAL( 2 ), aDropTargetAL( 2 );
735  OUString aDragSourceSN, aDropTargetSN;
736 #if defined(_WIN32)
737  aDragSourceSN = "com.sun.star.datatransfer.dnd.OleDragSource";
738  aDropTargetSN = "com.sun.star.datatransfer.dnd.OleDropTarget";
739  aDragSourceAL[ 1 ] <<= static_cast<sal_uInt64>( reinterpret_cast<sal_IntPtr>(pEnvData->hWnd) );
740  aDropTargetAL[ 0 ] <<= static_cast<sal_uInt64>( reinterpret_cast<sal_IntPtr>(pEnvData->hWnd) );
741 #elif defined MACOSX
742  /* FIXME: macOS specific dnd interface does not exist! *
743  * Using Windows based dnd as a temporary solution */
744  aDragSourceSN = "com.sun.star.datatransfer.dnd.OleDragSource";
745  aDropTargetSN = "com.sun.star.datatransfer.dnd.OleDropTarget";
746  aDragSourceAL[ 1 ] <<= static_cast<sal_uInt64>( reinterpret_cast<sal_IntPtr>(pEnvData->mpNSView) );
747  aDropTargetAL[ 0 ] <<= static_cast<sal_uInt64>( reinterpret_cast<sal_IntPtr>(pEnvData->mpNSView) );
748 #elif HAVE_FEATURE_X11
749  aDragSourceSN = "com.sun.star.datatransfer.dnd.X11DragSource";
750  aDropTargetSN = "com.sun.star.datatransfer.dnd.X11DropTarget";
751 
752  aDragSourceAL[ 0 ] <<= Application::GetDisplayConnection();
753  aDragSourceAL[ 1 ] <<= pEnvData->aShellWindow;
754  aDropTargetAL[ 0 ] <<= Application::GetDisplayConnection();
755  aDropTargetAL[ 1 ] <<= pEnvData->aShellWindow;
756 #endif
757  if( !aDragSourceSN.isEmpty() )
758  mpWindowImpl->mpFrameData->mxDragSource.set(
759  xContext->getServiceManager()->createInstanceWithArgumentsAndContext( aDragSourceSN, aDragSourceAL, xContext ),
760  UNO_QUERY );
761 
762  if( !aDropTargetSN.isEmpty() )
763  mpWindowImpl->mpFrameData->mxDropTarget.set(
764  xContext->getServiceManager()->createInstanceWithArgumentsAndContext( aDropTargetSN, aDropTargetAL, xContext ),
765  UNO_QUERY );
766  }
767  }
768 
769  // createInstance can throw any exception
770  catch (const Exception&)
771  {
772  // release all instances
773  mpWindowImpl->mpFrameData->mxDropTarget.clear();
774  mpWindowImpl->mpFrameData->mxDragSource.clear();
775  }
776  }
777 
778  return mpWindowImpl->mpFrameData->mxDragSource;
779  }
780 #endif
781  return Reference< css::datatransfer::dnd::XDragSource > ();
782 }
783 
784 Reference< css::datatransfer::dnd::XDragGestureRecognizer > Window::GetDragGestureRecognizer()
785 {
786  return Reference< css::datatransfer::dnd::XDragGestureRecognizer > ( GetDropTarget(), UNO_QUERY );
787 }
788 
789 } /* namespace vcl */
790 
791 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
void EndExtTextInput()
Definition: window.cxx:2070
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:1116
vcl::Window * ImplGetWindow() const
if this is a proxy return the client, otherwise itself
Definition: window2.cxx:835
css::uno::Reference< css::datatransfer::dnd::XDragSource > GetDragSource()
Definition: mouse.cxx:718
void CaptureMouse()
Definition: mouse.cxx:439
Point GetPointerPosPixel()
Definition: mouse.cxx:549
void EnableChildPointerOverwrite(bool bOverwrite)
Definition: mouse.cxx:507
VclPtr< vcl::Window > mpFocusWin
Definition: svdata.hxx:200
WindowHitTest
Definition: window.hxx:434
bool ImplCallPreNotify(NotifyEvent &rEvt)
Definition: winproc.cxx:58
long AdjustX(long nHorzMove)
virtual void MouseButtonDown(const MouseEvent &rMEvt)
Definition: mouse.cxx:413
void CompatLoseFocus()
Definition: window.cxx:3848
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:56
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:135
SAL_DLLPRIVATE Point ImplOutputToFrame(const Point &rPos)
Definition: window2.cxx:926
void EnterWait()
Definition: mouse.cxx:610
SAL_DLLPRIVATE void ImplGrabFocus(GetFocusFlags nFlags)
Definition: mouse.cxx:195
SAL_DLLPRIVATE vcl::Window * ImplGetFrameWindow() const
Definition: window2.cxx:890
SAL_DLLPRIVATE WindowImpl * ImplGetWindowImpl() const
Definition: window.hxx:554
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:996
bool mbHasFocus
Definition: window.h:157
virtual void MouseButtonUp(const MouseEvent &rMEvt)
Definition: mouse.cxx:420
MouseEventModifiers
Definition: event.hxx:75
static css::uno::Reference< css::awt::XDisplayConnection > GetDisplayConnection()
Definition: svapp.cxx:1466
DialogControlFlags GetDialogControlFlags() const
Definition: window2.cxx:1046
SAL_DLLPRIVATE bool ImplIsOverlapWindow() const
Definition: window2.cxx:915
SAL_DLLPRIVATE ImplWinData * ImplGetWinData() const
Definition: window.cxx:1207
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:3252
void setX(long nX)
SAL_DLLPRIVATE void ImplStartDnd()
Definition: mouse.cxx:653
void CompatGetFocus()
Definition: window.cxx:3843
void EndTracking(TrackingEventFlags nFlags=TrackingEventFlags::NONE)
Definition: window2.cxx:272
SAL_DLLPRIVATE void ImplGrabFocusToDocument(GetFocusFlags nFlags)
Definition: mouse.cxx:393
void ShowPointer(bool bVisible)
Definition: mouse.cxx:573
WinBits const WB_SYSTEMFLOATWIN
css::uno::Reference< css::datatransfer::dnd::XDragGestureRecognizer > GetDragGestureRecognizer()
Definition: mouse.cxx:784
static bool IsWindowFocused(const WindowImpl &rWinImpl)
Definition: mouse.cxx:181
void SetPointerPosPixel(const Point &rPos)
Definition: mouse.cxx:520
SAL_DLLPRIVATE PointerStyle ImplGetMousePointer() const
Definition: mouse.cxx:93
GetFocusFlags
Definition: window.hxx:333
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:1236
ImplSVData * ImplGetSVData()
Definition: svdata.cxx:67
void SetLastMousePos(const Point &rPos)
Similar to SetPointerPosPixel(), but sets the frame data's last mouse position instead.
Definition: mouse.cxx:540
VclPtr< vcl::Window > mpCaptureWin
Definition: svdata.hxx:202
bool IsRTLEnabled() const
Definition: outdev.hxx:1354
virtual bool EventNotify(NotifyEvent &rNEvt)
Definition: event.cxx:103
long AdjustY(long nVertMove)
SAL_DLLPRIVATE bool ImplIsAntiparallel() const
Definition: outdev.cxx:604
css::uno::Reference< css::datatransfer::dnd::XDropTarget > GetDropTarget()
Definition: mouse.cxx:658
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:157
std::unique_ptr< WindowImpl > mpWindowImpl
Definition: window.hxx:511
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:3591
SAL_DLLPRIVATE vcl::Window * ImplGetParent() const
Definition: window2.cxx:859
SAL_DLLPRIVATE bool ImplTestMousePointerSet()
Definition: mouse.cxx:82
bool IsInside(const Point &rPOINT) const
SalObject * mpSysObj
Definition: window.h:226
bool IsMouseCaptured() const
Definition: mouse.cxx:469
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:582
vcl::Window * GetParent() const
Definition: window2.cxx:1086
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:3389
vcl::Window * GetWindow(GetWindowType nType) const
Definition: stacking.cxx:1035
virtual const SystemEnvData * GetSystemData() const
Definition: window.cxx:3809
void ReleaseMouse()
Definition: mouse.cxx:458
ImplSVWinData maWinData
Definition: svdata.hxx:349
SAL_DLLPRIVATE vcl::Window * ImplGetFirstOverlapWindow()
Definition: window2.cxx:874
void SetPointer(PointerStyle)
Definition: mouse.cxx:474
VclPtr< vcl::Window > mpExtTextInputWin
Definition: svdata.hxx:206
bool IsMouseOver() const
Definition: mouse.cxx:605
void SetMouseTransparent(bool bTransparent)
Definition: mouse.cxx:427
SAL_DLLPRIVATE bool ImplStopDnd()
Definition: mouse.cxx:639
::OutputDevice const * GetOutDev() const
Definition: window.cxx:572
SAL_DLLPRIVATE Point ImplFrameToOutput(const Point &rPos)
Definition: window2.cxx:931
Reference< XComponentContext > getProcessComponentContext()
static sal_uInt64 GetSystemTicks()
PointerStyle
Definition: ptrstyle.hxx:25
virtual void Activate()
Definition: window.cxx:1801
bool IsDisposed() const
Definition: window.cxx:137
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:176
sal_IntPtr aShellWindow
Definition: sysdata.hxx:75
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:1111
virtual void MouseMove(const MouseEvent &rMEvt)
Definition: mouse.cxx:407
WinBits GetStyle() const
Definition: window2.cxx:942
Point GetLastPointerPosPixel()
Definition: mouse.cxx:561
WinBits const WB_MOVEABLE
void LeaveWait()
Definition: mouse.cxx:623
SAL_DLLPRIVATE void ImplCallActivateListeners(vcl::Window *)
Definition: window.cxx:3406
long mnOutHeight
Definition: outdev.hxx:346
IMPL_LINK_NOARG(QuickSelectionEngine_Data, SearchStringTimeout, Timer *, void)
PointerState GetPointerState()
Definition: mouse.cxx:586
ImplFrameData * mpFrameData
Definition: window.h:224
static SAL_DLLPRIVATE void ImplNewInputContext()
Definition: window.cxx:1707
long Y() const
bool mbFakeFocusSet
Definition: window.h:316