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 
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 #include <salinst.hxx>
43 
44 #include <dndlistenercontainer.hxx>
45 #include <dndeventdispatcher.hxx>
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 
53 using namespace ::com::sun::star::uno;
54 
55 namespace vcl {
56 
57 WindowHitTest 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 ) )
66  return WindowHitTest::NONE;
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 ) )
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.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 
135 void 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, MouseNotifyEvent::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 
164 IMPL_LINK_NOARG(Window, ImplGenerateMouseMoveHdl, void*, void)
165 {
166  mpWindowImpl->mpFrameData->mnMouseMoveId = nullptr;
167  vcl::Window* pCaptureWin = ImplGetSVData()->mpWinData->mpCaptureWin;
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->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( MouseNotifyEvent::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() )
384  CompatGetFocus();
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 
414 void Window::MouseMove( const MouseEvent& rMEvt )
415 {
416  NotifyEvent aNEvt( MouseNotifyEvent::MOUSEMOVE, this, &rMEvt );
417  EventNotify(aNEvt);
418 }
419 
421 {
422  NotifyEvent aNEvt( MouseNotifyEvent::MOUSEBUTTONDOWN, this, &rMEvt );
423  if (!EventNotify(aNEvt))
424  mpWindowImpl->mbMouseButtonDown = true;
425 }
426 
427 void Window::MouseButtonUp( const MouseEvent& rMEvt )
428 {
429  NotifyEvent aNEvt( MouseNotifyEvent::MOUSEBUTTONUP, this, &rMEvt );
430  if (!EventNotify(aNEvt))
431  mpWindowImpl->mbMouseButtonUp = true;
432 }
433 
434 void 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 {
448  ImplGetFrameData()->mbDragging = true;
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 
522 void Window::EnableChildPointerOverwrite( bool bOverwrite )
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 
535 void 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 
555 void 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 
588 void 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 {
670  GetDropTarget();
671 }
672 
673 Reference< 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
687  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 
733 Reference< 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  {
744  SalInstance* pInst = ImplGetSVData()->mpDefInst;
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 
759 Reference< 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: */
void EndExtTextInput()
Definition: window.cxx:2108
bool IsInputEnabled() const
Definition: window2.cxx:1150
vcl::Window * ImplGetWindow() const
if this is a proxy return the client, otherwise itself
Definition: window2.cxx:853
css::uno::Reference< css::datatransfer::dnd::XDragSource > GetDragSource()
Definition: mouse.cxx:733
void CaptureMouse()
Definition: mouse.cxx:451
Point GetPointerPosPixel()
Definition: mouse.cxx:564
void EnableChildPointerOverwrite(bool bOverwrite)
Definition: mouse.cxx:522
VclPtr< vcl::Window > mpFocusWin
Definition: svdata.hxx:255
WindowHitTest
Definition: window.hxx:402
bool ImplCallPreNotify(NotifyEvent &rEvt)
Definition: winproc.cxx:65
virtual void MouseButtonDown(const MouseEvent &rMEvt)
Definition: mouse.cxx:420
SAL_DLLPRIVATE void CompatLoseFocus()
Definition: window.cxx:3889
bool mbDragging
Definition: window.h:179
signed char sal_Int8
bool Contains(const Point &rPOINT) const
virtual WindowHitTest ImplHitTest(const Point &rFramePos)
Definition: mouse.cxx:57
void InvertTracking(const tools::Rectangle &rRect, ShowTrackFlags nFlags)
Definition: window2.cxx:161
SAL_DLLPRIVATE void ImplCallMouseMove(sal_uInt16 nMouseCode, bool bModChanged=false)
Definition: mouse.cxx:135
SAL_DLLPRIVATE Point ImplOutputToFrame(const Point &rPos)
Definition: window2.cxx:960
long Long
void EnterWait()
Definition: mouse.cxx:625
SAL_DLLPRIVATE void ImplGrabFocus(GetFocusFlags nFlags)
Definition: mouse.cxx:195
SAL_DLLPRIVATE vcl::Window * ImplGetFrameWindow() const
Definition: window2.cxx:924
SAL_DLLPRIVATE WindowImpl * ImplGetWindowImpl() const
Definition: window.hxx:527
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:1120
bool mbHasFocus
Definition: window.h:161
virtual void MouseButtonUp(const MouseEvent &rMEvt)
Definition: mouse.cxx:427
bool IsRTLEnabled() const
Definition: window3.cxx:127
MouseEventModifiers
Definition: event.hxx:79
DialogControlFlags GetDialogControlFlags() const
Definition: window2.cxx:1080
SAL_DLLPRIVATE bool ImplIsOverlapWindow() const
Definition: window2.cxx:949
SAL_DLLPRIVATE ImplWinData * ImplGetWinData() const
Definition: window.cxx:1225
const std::map< PointerStyle, OString > gaLOKPointerMap
SAL_DLLPRIVATE void ReMirror(Point &rPoint) const
Definition: outdev.cxx:687
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 ImplStartDnd()
Definition: mouse.cxx:668
SAL_DLLPRIVATE void CompatGetFocus()
Definition: window.cxx:3881
void EndTracking(TrackingEventFlags nFlags=TrackingEventFlags::NONE)
Definition: window2.cxx:292
SAL_DLLPRIVATE void ImplGrabFocusToDocument(GetFocusFlags nFlags)
Definition: mouse.cxx:399
void ShowPointer(bool bVisible)
Definition: mouse.cxx:588
WinBits const WB_SYSTEMFLOATWIN
static bool IsWindowFocused(const WindowImpl &rWinImpl)
Definition: mouse.cxx:181
sal_uInt16 nCode
void SetPointerPosPixel(const Point &rPos)
Definition: mouse.cxx:535
SAL_DLLPRIVATE PointerStyle ImplGetMousePointer() const
Definition: mouse.cxx:93
GetFocusFlags
Definition: window.hxx:311
PointerStyle GetPointer() const
Definition: window2.cxx:1270
ImplSVData * ImplGetSVData()
Definition: svdata.cxx:76
GraphicsSharedPtr mpGraphics
void SetLastMousePos(const Point &rPos)
Similar to SetPointerPosPixel(), but sets the frame data's last mouse position instead.
Definition: mouse.cxx:555
VclPtr< vcl::Window > mpCaptureWin
Definition: svdata.hxx:256
virtual bool EventNotify(NotifyEvent &rNEvt)
Definition: event.cxx:104
SAL_DLLPRIVATE bool ImplIsAntiparallel() const
Definition: outdev.cxx:671
css::uno::Reference< css::datatransfer::dnd::XDropTarget > GetDropTarget()
Definition: mouse.cxx:673
virtual bool HasMirroredGraphics() const
Definition: outdev.cxx:719
Some things multiple-inherit from VclAbstractDialog and OutputDevice, so we need to use virtual inher...
Definition: outdev.hxx:175
SAL_DLLPRIVATE void ImplGenerateMouseMove()
Definition: mouse.cxx:157
std::unique_ptr< WindowImpl > mpWindowImpl
Definition: window.hxx:483
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
SAL_DLLPRIVATE vcl::Window * ImplGetParent() const
Definition: window2.cxx:883
SAL_DLLPRIVATE bool ImplTestMousePointerSet()
Definition: mouse.cxx:82
SalObject * mpSysObj
Definition: window.h:230
bool IsMouseCaptured() const
Definition: mouse.cxx:481
bool mbMouseOver
Definition: window.h:120
static SAL_DLLPRIVATE void ImplCallFocusChangeActivate(vcl::Window *pNewOverlapWindow, vcl::Window *pOldOverlapWindow)
Definition: event.cxx:571
tools::Rectangle GetOutputRectPixel() const
Definition: window3.cxx:91
vcl::Window * GetParent() const
Definition: window2.cxx:1120
VclPtr< vcl::Window > mpTrackWin
Definition: svdata.hxx:261
enumrange< T >::Iterator end(enumrange< T >)
SAL_DLLPRIVATE void ImplCallDeactivateListeners(vcl::Window *)
Definition: window.cxx:3402
vcl::Window * GetWindow(GetWindowType nType) const
Definition: stacking.cxx:1035
virtual const SystemEnvData * GetSystemData() const
Definition: window.cxx:3853
void LocalStartDrag()
Definition: mouse.cxx:446
bool ImplHandleMouseEvent(const VclPtr< vcl::Window > &xWindow, MouseNotifyEvent nSVEvent, bool bMouseLeave, tools::Long nX, tools::Long nY, sal_uInt64 nMsgTime, sal_uInt16 nCode, MouseEventModifiers nMode)
Definition: winproc.cxx:266
void ReleaseMouse()
Definition: mouse.cxx:469
SAL_DLLPRIVATE vcl::Window * ImplGetFirstOverlapWindow()
Definition: window2.cxx:898
void SetPointer(PointerStyle)
Definition: mouse.cxx:486
VclPtr< vcl::Window > mpExtTextInputWin
Definition: svdata.hxx:260
bool IsMouseOver() const
Definition: mouse.cxx:620
void SetMouseTransparent(bool bTransparent)
Definition: mouse.cxx:434
SAL_DLLPRIVATE bool ImplStopDnd()
Definition: mouse.cxx:654
ImplSVFrameData maFrameData
Definition: svdata.hxx:400
::OutputDevice const * GetOutDev() const
Definition: window.cxx:567
SAL_DLLPRIVATE Point ImplFrameToOutput(const Point &rPos)
Definition: window2.cxx:965
static sal_uInt64 GetSystemTicks()
PointerStyle
Definition: ptrstyle.hxx:25
virtual void Activate()
Definition: window.cxx:1839
Size GetOutputSizePixel() const
Definition: window3.cxx:89
SAL_DLLPRIVATE void ImplInvertFocus(const tools::Rectangle &rRect)
Definition: mouse.cxx:176
reference_type * get() const
Get the body.
Definition: vclptr.hxx:143
bool IsEnabled() const
Definition: window2.cxx:1145
virtual void MouseMove(const MouseEvent &rMEvt)
Definition: mouse.cxx:414
const vcl::ILibreOfficeKitNotifier * GetLOKNotifier() const
Definition: window.cxx:3253
VclPtr< vcl::Window > mpFirstFrame
Definition: svdata.hxx:245
WinBits GetStyle() const
Definition: window2.cxx:976
Point GetLastPointerPosPixel()
Definition: mouse.cxx:576
WinBits const WB_MOVEABLE
void LeaveWait()
Definition: mouse.cxx:638
SAL_DLLPRIVATE void ImplCallActivateListeners(vcl::Window *)
Definition: window.cxx:3420
SAL_DLLPRIVATE ImplFrameData * ImplGetFrameData()
Definition: window2.cxx:861
IMPL_LINK_NOARG(QuickSelectionEngine_Data, SearchStringTimeout, Timer *, void)
PointerState GetPointerState()
Definition: mouse.cxx:601
ImplFrameData * mpFrameData
Definition: window.h:228
bool isDisposed() const
SalInstance * mpDefInst
Definition: svdata.hxx:390
static SAL_DLLPRIVATE void ImplNewInputContext()
Definition: window.cxx:1742
ImplSVWinData * mpWinData
Definition: svdata.hxx:401
bool mbFakeFocusSet
Definition: window.h:317