[Libreoffice-commits] core.git: vcl/Library_vcl.mk vcl/source
Chris Sherlock
chris.sherlock79 at gmail.com
Fri May 23 03:41:13 PDT 2014
vcl/Library_vcl.mk | 1
vcl/source/window/mouse.cxx | 776 +++++++++++++++++++++++++++++++++++++++++++
vcl/source/window/window.cxx | 727 ----------------------------------------
3 files changed, 777 insertions(+), 727 deletions(-)
New commits:
commit 1cda4728bf668351f25595570592fe112e763cff
Author: Chris Sherlock <chris.sherlock79 at gmail.com>
Date: Fri May 23 20:39:23 2014 +1000
vcl: move mouse functions from window.cxx to mouse.cxx
Change-Id: I4cd0769cd20869e9316c35ff20e4fa477b5aab16
diff --git a/vcl/Library_vcl.mk b/vcl/Library_vcl.mk
index 7ea6981..3bf8648 100644
--- a/vcl/Library_vcl.mk
+++ b/vcl/Library_vcl.mk
@@ -134,6 +134,7 @@ $(eval $(call gb_Library_add_exception_objects,vcl,\
vcl/source/window/menu \
vcl/source/window/mnemonic \
vcl/source/window/mnemonicengine \
+ vcl/source/window/mouse \
vcl/source/window/mouseevent \
vcl/source/window/event \
vcl/source/window/msgbox \
diff --git a/vcl/source/window/mouse.cxx b/vcl/source/window/mouse.cxx
new file mode 100644
index 0000000..e4503bb
--- /dev/null
+++ b/vcl/source/window/mouse.cxx
@@ -0,0 +1,776 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+
+#include <config_features.h>
+
+#include <tools/time.hxx>
+
+#include <vcl/svapp.hxx>
+#include <vcl/salgtype.hxx>
+#include <vcl/window.hxx>
+#include <vcl/floatwin.hxx>
+#include <vcl/cursor.hxx>
+#include <vcl/sysdata.hxx>
+
+#include <sal/types.h>
+
+#include <window.h>
+#include <outdev.h>
+#include <svdata.hxx>
+#include <salobj.hxx>
+#include <salgdi.hxx>
+#include <salframe.hxx>
+#include <dndlcon.hxx>
+#include <dndevdis.hxx>
+
+#include <com/sun/star/datatransfer/dnd/XDragSource.hpp>
+#include <com/sun/star/datatransfer/dnd/XDropTarget.hpp>
+
+#include <comphelper/processfactory.hxx>
+
+using namespace ::com::sun::star::uno;
+
+sal_uInt16 Window::ImplHitTest( const Point& rFramePos )
+{
+ Point aFramePos( rFramePos );
+ if( ImplIsAntiparallel() )
+ {
+ // - RTL - re-mirror frame pos at this window
+ const OutputDevice *pOutDev = GetOutDev();
+ pOutDev->ReMirror( aFramePos );
+ }
+ Rectangle aRect( Point( mnOutOffX, mnOutOffY ), Size( mnOutWidth, mnOutHeight ) );
+ if ( !aRect.IsInside( aFramePos ) )
+ return 0;
+ if ( mpWindowImpl->mbWinRegion )
+ {
+ Point aTempPos = aFramePos;
+ aTempPos.X() -= mnOutOffX;
+ aTempPos.Y() -= mnOutOffY;
+ if ( !mpWindowImpl->maWinRegion.IsInside( aTempPos ) )
+ return 0;
+ }
+
+ sal_uInt16 nHitTest = WINDOW_HITTEST_INSIDE;
+ if ( mpWindowImpl->mbMouseTransparent )
+ nHitTest |= WINDOW_HITTEST_TRANSPARENT;
+ return nHitTest;
+}
+
+int Window::ImplTestMousePointerSet()
+{
+ // as soon as mouse is captured, switch mouse-pointer
+ if ( IsMouseCaptured() )
+ return sal_True;
+
+ // if the mouse is over the window, switch it
+ Rectangle aClientRect( Point( 0, 0 ), GetOutputSizePixel() );
+ if ( aClientRect.IsInside( GetPointerPosPixel() ) )
+ return sal_True;
+
+ return sal_False;
+}
+
+PointerStyle Window::ImplGetMousePointer() const
+{
+ PointerStyle ePointerStyle;
+ bool bWait = false;
+
+ if ( IsEnabled() && IsInputEnabled() && ! IsInModalMode() )
+ ePointerStyle = GetPointer().GetStyle();
+ else
+ ePointerStyle = POINTER_ARROW;
+
+ const Window* pWindow = this;
+ do
+ {
+ // when the pointer is not visible stop the search, as
+ // this status should not be overwritten
+ if ( pWindow->mpWindowImpl->mbNoPtrVisible )
+ return POINTER_NULL;
+
+ if ( !bWait )
+ {
+ if ( pWindow->mpWindowImpl->mnWaitCount )
+ {
+ ePointerStyle = POINTER_WAIT;
+ bWait = true;
+ }
+ else
+ {
+ if ( pWindow->mpWindowImpl->mbChildPtrOverwrite )
+ ePointerStyle = pWindow->GetPointer().GetStyle();
+ }
+ }
+
+ if ( pWindow->ImplIsOverlapWindow() )
+ break;
+
+ pWindow = pWindow->ImplGetParent();
+ }
+ while ( pWindow );
+
+ return ePointerStyle;
+}
+
+void Window::ImplCallMouseMove( sal_uInt16 nMouseCode, bool bModChanged )
+{
+ if ( mpWindowImpl->mpFrameData->mbMouseIn && mpWindowImpl->mpFrameWindow->mpWindowImpl->mbReallyVisible )
+ {
+ sal_uLong nTime = Time::GetSystemTicks();
+ long nX = mpWindowImpl->mpFrameData->mnLastMouseX;
+ long nY = mpWindowImpl->mpFrameData->mnLastMouseY;
+ sal_uInt16 nCode = nMouseCode;
+ sal_uInt16 nMode = mpWindowImpl->mpFrameData->mnMouseMode;
+ bool bLeave;
+ // check for MouseLeave
+ if ( ((nX < 0) || (nY < 0) ||
+ (nX >= mpWindowImpl->mpFrameWindow->mnOutWidth) ||
+ (nY >= mpWindowImpl->mpFrameWindow->mnOutHeight)) &&
+ !ImplGetSVData()->maWinData.mpCaptureWin )
+ bLeave = true;
+ else
+ bLeave = false;
+ nMode |= MOUSE_SYNTHETIC;
+ if ( bModChanged )
+ nMode |= MOUSE_MODIFIERCHANGED;
+ ImplHandleMouseEvent( mpWindowImpl->mpFrameWindow, EVENT_MOUSEMOVE, bLeave, nX, nY, nTime, nCode, nMode );
+ }
+}
+
+void Window::ImplGenerateMouseMove()
+{
+ if ( !mpWindowImpl->mpFrameData->mnMouseMoveId )
+ mpWindowImpl->mpFrameData->mnMouseMoveId = Application::PostUserEvent( LINK( mpWindowImpl->mpFrameWindow, Window, ImplGenerateMouseMoveHdl ) );
+}
+
+IMPL_LINK_NOARG(Window, ImplGenerateMouseMoveHdl)
+{
+ mpWindowImpl->mpFrameData->mnMouseMoveId = 0;
+ Window* pCaptureWin = ImplGetSVData()->maWinData.mpCaptureWin;
+ if( ! pCaptureWin ||
+ (pCaptureWin->mpWindowImpl && pCaptureWin->mpWindowImpl->mpFrame == mpWindowImpl->mpFrame)
+ )
+ {
+ ImplCallMouseMove( mpWindowImpl->mpFrameData->mnMouseCode );
+ }
+ return 0;
+}
+
+void Window::ImplInvertFocus( const Rectangle& rRect )
+{
+ InvertTracking( rRect, SHOWTRACK_SMALL | SHOWTRACK_WINDOW );
+}
+
+static bool IsWindowFocused(const WindowImpl& rWinImpl)
+{
+ if (rWinImpl.mpSysObj)
+ return true;
+
+ if (rWinImpl.mpFrameData->mbHasFocus)
+ return true;
+
+ if (rWinImpl.mbFakeFocusSet)
+ return true;
+
+ return false;
+}
+
+void Window::ImplGrabFocus( sal_uInt16 nFlags )
+{
+ // #143570# no focus for destructing windows
+ if( mpWindowImpl->mbInDtor )
+ return;
+
+ // some event listeners do really bad stuff
+ // => prepare for the worst
+ ImplDelData aDogTag( this );
+
+ // Currently the client window should always get the focus
+ // Should the border window at some point be focusable
+ // we need to change all GrabFocus() instances in VCL,
+ // e.g. in ToTop()
+
+ if ( mpWindowImpl->mpClientWindow )
+ {
+ // For a lack of design we need a little hack here to
+ // ensure that dialogs on close pass the focus back to
+ // the correct window
+ if ( mpWindowImpl->mpLastFocusWindow && (mpWindowImpl->mpLastFocusWindow != this) &&
+ !(mpWindowImpl->mnDlgCtrlFlags & WINDOW_DLGCTRL_WANTFOCUS) &&
+ mpWindowImpl->mpLastFocusWindow->IsEnabled() &&
+ mpWindowImpl->mpLastFocusWindow->IsInputEnabled() &&
+ ! mpWindowImpl->mpLastFocusWindow->IsInModalMode()
+ )
+ mpWindowImpl->mpLastFocusWindow->GrabFocus();
+ else
+ mpWindowImpl->mpClientWindow->GrabFocus();
+ return;
+ }
+ else if ( mpWindowImpl->mbFrame )
+ {
+ // For a lack of design we need a little hack here to
+ // ensure that dialogs on close pass the focus back to
+ // the correct window
+ if ( mpWindowImpl->mpLastFocusWindow && (mpWindowImpl->mpLastFocusWindow != this) &&
+ !(mpWindowImpl->mnDlgCtrlFlags & WINDOW_DLGCTRL_WANTFOCUS) &&
+ mpWindowImpl->mpLastFocusWindow->IsEnabled() &&
+ mpWindowImpl->mpLastFocusWindow->IsInputEnabled() &&
+ ! mpWindowImpl->mpLastFocusWindow->IsInModalMode()
+ )
+ {
+ mpWindowImpl->mpLastFocusWindow->GrabFocus();
+ return;
+ }
+ }
+
+ // If the Window is disabled, then we don't change the focus
+ if ( !IsEnabled() || !IsInputEnabled() || IsInModalNonRefMode() )
+ return;
+
+ // we only need to set the focus if it is not already set
+ // note: if some other frame is waiting for an asynchrounous focus event
+ // we also have to post an asynchronous focus event for this frame
+ // which is done using ToTop
+ ImplSVData* pSVData = ImplGetSVData();
+
+ bool bAsyncFocusWaiting = false;
+ Window *pFrame = pSVData->maWinData.mpFirstFrame;
+ while( pFrame )
+ {
+ if( pFrame != mpWindowImpl->mpFrameWindow && pFrame->mpWindowImpl->mpFrameData->mnFocusId )
+ {
+ bAsyncFocusWaiting = true;
+ break;
+ }
+ pFrame = pFrame->mpWindowImpl->mpFrameData->mpNextFrame;
+ }
+
+ bool bHasFocus = IsWindowFocused(*mpWindowImpl);
+
+ bool bMustNotGrabFocus = false;
+ // #100242#, check parent hierarchy if some floater prohibits grab focus
+
+ Window *pParent = this;
+ while( pParent )
+ {
+ // #102158#, ignore grabfocus only if the floating parent grabs keyboard focus by itself (GrabsFocus())
+ // otherwise we cannot set the focus in a floating toolbox
+ if( ( (pParent->mpWindowImpl->mbFloatWin && ((FloatingWindow*)pParent)->GrabsFocus()) || ( pParent->GetStyle() & WB_SYSTEMFLOATWIN ) ) && !( pParent->GetStyle() & WB_MOVEABLE ) )
+ {
+ bMustNotGrabFocus = true;
+ break;
+ }
+ pParent = pParent->mpWindowImpl->mpParent;
+ }
+
+ if ( ( pSVData->maWinData.mpFocusWin != this && ! mpWindowImpl->mbInDtor ) || ( bAsyncFocusWaiting && !bHasFocus && !bMustNotGrabFocus ) )
+ {
+ // EndExtTextInput if it is not the same window
+ if ( pSVData->maWinData.mpExtTextInputWin &&
+ (pSVData->maWinData.mpExtTextInputWin != this) )
+ pSVData->maWinData.mpExtTextInputWin->EndExtTextInput( EXTTEXTINPUT_END_COMPLETE );
+
+ // mark this windows as the last FocusWindow
+ Window* pOverlapWindow = ImplGetFirstOverlapWindow();
+ pOverlapWindow->mpWindowImpl->mpLastFocusWindow = this;
+ mpWindowImpl->mpFrameData->mpFocusWin = this;
+
+ if( !bHasFocus )
+ {
+ // menu windows never get the system focus
+ // the application will keep the focus
+ if( bMustNotGrabFocus )
+ return;
+ else
+ {
+ // here we already switch focus as ToTop()
+ // should not give focus to another window
+ //DBG_WARNING( "Window::GrabFocus() - Frame doesn't have the focus" );
+ mpWindowImpl->mpFrame->ToTop( SAL_FRAME_TOTOP_GRABFOCUS | SAL_FRAME_TOTOP_GRABFOCUS_ONLY );
+ return;
+ }
+ }
+
+ Window* pOldFocusWindow = pSVData->maWinData.mpFocusWin;
+ ImplDelData aOldFocusDel( pOldFocusWindow );
+
+ pSVData->maWinData.mpFocusWin = this;
+
+ if ( pOldFocusWindow )
+ {
+ // Cursor hidden
+ if ( pOldFocusWindow->mpWindowImpl->mpCursor )
+ pOldFocusWindow->mpWindowImpl->mpCursor->ImplHide( true );
+ }
+
+ // !!!!! due to old SV-Office Activate/Deactivate handling
+ // !!!!! first as before
+ if ( pOldFocusWindow )
+ {
+ // remember Focus
+ Window* pOldOverlapWindow = pOldFocusWindow->ImplGetFirstOverlapWindow();
+ Window* pNewOverlapWindow = ImplGetFirstOverlapWindow();
+ if ( pOldOverlapWindow != pNewOverlapWindow )
+ ImplCallFocusChangeActivate( pNewOverlapWindow, pOldOverlapWindow );
+ }
+ else
+ {
+ Window* pNewOverlapWindow = ImplGetFirstOverlapWindow();
+ Window* pNewRealWindow = pNewOverlapWindow->ImplGetWindow();
+ pNewOverlapWindow->mpWindowImpl->mbActive = true;
+ pNewOverlapWindow->Activate();
+ if ( pNewRealWindow != pNewOverlapWindow )
+ {
+ pNewRealWindow->mpWindowImpl->mbActive = true;
+ pNewRealWindow->Activate();
+ }
+ }
+
+ // call Get- and LoseFocus
+ if ( pOldFocusWindow && ! aOldFocusDel.IsDead() )
+ {
+ if ( pOldFocusWindow->IsTracking() &&
+ (pSVData->maWinData.mnTrackFlags & STARTTRACK_FOCUSCANCEL) )
+ pOldFocusWindow->EndTracking( ENDTRACK_CANCEL | ENDTRACK_FOCUS );
+ NotifyEvent aNEvt( EVENT_LOSEFOCUS, pOldFocusWindow );
+ if ( !ImplCallPreNotify( aNEvt ) )
+ pOldFocusWindow->LoseFocus();
+ pOldFocusWindow->ImplCallDeactivateListeners( this );
+ }
+
+ if ( pSVData->maWinData.mpFocusWin == this )
+ {
+ if ( mpWindowImpl->mpSysObj )
+ {
+ mpWindowImpl->mpFrameData->mpFocusWin = this;
+ if ( !mpWindowImpl->mpFrameData->mbInSysObjFocusHdl )
+ mpWindowImpl->mpSysObj->GrabFocus();
+ }
+
+ if ( pSVData->maWinData.mpFocusWin == this )
+ {
+ if ( mpWindowImpl->mpCursor )
+ mpWindowImpl->mpCursor->ImplShow();
+ mpWindowImpl->mbInFocusHdl = true;
+ mpWindowImpl->mnGetFocusFlags = nFlags;
+ // if we're changing focus due to closing a popup floating window
+ // notify the new focus window so it can restore the inner focus
+ // eg, toolboxes can select their recent active item
+ if( pOldFocusWindow &&
+ ! aOldFocusDel.IsDead() &&
+ ( pOldFocusWindow->GetDialogControlFlags() & WINDOW_DLGCTRL_FLOATWIN_POPUPMODEEND_CANCEL ) )
+ mpWindowImpl->mnGetFocusFlags |= GETFOCUS_FLOATWIN_POPUPMODEEND_CANCEL;
+ NotifyEvent aNEvt( EVENT_GETFOCUS, this );
+ if ( !ImplCallPreNotify( aNEvt ) && !aDogTag.IsDead() )
+ GetFocus();
+ if( !aDogTag.IsDead() )
+ ImplCallActivateListeners( (pOldFocusWindow && ! aOldFocusDel.IsDead()) ? pOldFocusWindow : NULL );
+ if( !aDogTag.IsDead() )
+ {
+ mpWindowImpl->mnGetFocusFlags = 0;
+ mpWindowImpl->mbInFocusHdl = false;
+ }
+ }
+ }
+
+ GetpApp()->FocusChanged();
+ ImplNewInputContext();
+ }
+}
+
+void Window::ImplGrabFocusToDocument( sal_uInt16 nFlags )
+{
+ Window *pWin = this;
+ while( pWin )
+ {
+ if( !pWin->GetParent() )
+ {
+ pWin->ImplGetFrameWindow()->GetWindow( WINDOW_CLIENT )->ImplGrabFocus(nFlags);
+ return;
+ }
+ pWin = pWin->GetParent();
+ }
+}
+
+void Window::MouseMove( const MouseEvent& rMEvt )
+{
+ NotifyEvent aNEvt( EVENT_MOUSEMOVE, this, &rMEvt );
+ if ( !Notify( aNEvt ) )
+ mpWindowImpl->mbMouseMove = true;
+}
+
+void Window::MouseButtonDown( const MouseEvent& rMEvt )
+{
+ NotifyEvent aNEvt( EVENT_MOUSEBUTTONDOWN, this, &rMEvt );
+ if ( !Notify( aNEvt ) )
+ mpWindowImpl->mbMouseButtonDown = true;
+}
+
+void Window::MouseButtonUp( const MouseEvent& rMEvt )
+{
+ NotifyEvent aNEvt( EVENT_MOUSEBUTTONUP, this, &rMEvt );
+ if ( !Notify( aNEvt ) )
+ mpWindowImpl->mbMouseButtonUp = true;
+}
+
+void Window::SetMouseTransparent( bool bTransparent )
+{
+
+ if ( mpWindowImpl->mpBorderWindow )
+ mpWindowImpl->mpBorderWindow->SetMouseTransparent( bTransparent );
+
+ if( mpWindowImpl->mpSysObj )
+ mpWindowImpl->mpSysObj->SetMouseTransparent( bTransparent );
+
+ mpWindowImpl->mbMouseTransparent = bTransparent;
+}
+
+void Window::CaptureMouse()
+{
+
+ ImplSVData* pSVData = ImplGetSVData();
+
+ // possibly stop tracking
+ if ( pSVData->maWinData.mpTrackWin != this )
+ {
+ if ( pSVData->maWinData.mpTrackWin )
+ pSVData->maWinData.mpTrackWin->EndTracking( ENDTRACK_CANCEL );
+ }
+
+ if ( pSVData->maWinData.mpCaptureWin != this )
+ {
+ pSVData->maWinData.mpCaptureWin = this;
+ mpWindowImpl->mpFrame->CaptureMouse( true );
+ }
+}
+
+void Window::ReleaseMouse()
+{
+
+ ImplSVData* pSVData = ImplGetSVData();
+
+ DBG_ASSERTWARNING( pSVData->maWinData.mpCaptureWin == this,
+ "Window::ReleaseMouse(): window doesn't have the mouse capture" );
+
+ if ( pSVData->maWinData.mpCaptureWin == this )
+ {
+ pSVData->maWinData.mpCaptureWin = NULL;
+ mpWindowImpl->mpFrame->CaptureMouse( false );
+ ImplGenerateMouseMove();
+ }
+}
+
+bool Window::IsMouseCaptured() const
+{
+
+ return (this == ImplGetSVData()->maWinData.mpCaptureWin);
+}
+
+void Window::SetPointer( const Pointer& rPointer )
+{
+
+ if ( mpWindowImpl->maPointer == rPointer )
+ return;
+
+ mpWindowImpl->maPointer = rPointer;
+
+ // possibly immediately move pointer
+ if ( !mpWindowImpl->mpFrameData->mbInMouseMove && ImplTestMousePointerSet() )
+ mpWindowImpl->mpFrame->SetPointer( ImplGetMousePointer() );
+}
+
+void Window::EnableChildPointerOverwrite( bool bOverwrite )
+{
+
+ if ( mpWindowImpl->mbChildPtrOverwrite == bOverwrite )
+ return;
+
+ mpWindowImpl->mbChildPtrOverwrite = bOverwrite;
+
+ // possibly immediately move pointer
+ if ( !mpWindowImpl->mpFrameData->mbInMouseMove && ImplTestMousePointerSet() )
+ mpWindowImpl->mpFrame->SetPointer( ImplGetMousePointer() );
+}
+
+void Window::SetPointerPosPixel( const Point& rPos )
+{
+ Point aPos = ImplOutputToFrame( rPos );
+ const OutputDevice *pOutDev = GetOutDev();
+ if( pOutDev->HasMirroredGraphics() )
+ {
+ if( !IsRTLEnabled() )
+ {
+ // --- RTL --- (re-mirror mouse pos at this window)
+ pOutDev->ReMirror( aPos );
+ }
+ // mirroring is required here, SetPointerPos bypasses SalGraphics
+ mpGraphics->mirror( aPos.X(), this );
+ }
+ else if( ImplIsAntiparallel() )
+ {
+ pOutDev->ReMirror( aPos );
+ }
+ mpWindowImpl->mpFrame->SetPointerPos( aPos.X(), aPos.Y() );
+}
+
+Point Window::GetPointerPosPixel()
+{
+
+ Point aPos( mpWindowImpl->mpFrameData->mnLastMouseX, mpWindowImpl->mpFrameData->mnLastMouseY );
+ if( ImplIsAntiparallel() )
+ {
+ // --- RTL --- (re-mirror mouse pos at this window)
+ const OutputDevice *pOutDev = GetOutDev();
+ pOutDev->ReMirror( aPos );
+ }
+ return ImplFrameToOutput( aPos );
+}
+
+Point Window::GetLastPointerPosPixel()
+{
+
+ Point aPos( mpWindowImpl->mpFrameData->mnBeforeLastMouseX, mpWindowImpl->mpFrameData->mnBeforeLastMouseY );
+ if( ImplIsAntiparallel() )
+ {
+ // --- RTL --- (re-mirror mouse pos at this window)
+ const OutputDevice *pOutDev = GetOutDev();
+ pOutDev->ReMirror( aPos );
+ }
+ return ImplFrameToOutput( aPos );
+}
+
+void Window::ShowPointer( bool bVisible )
+{
+
+ if ( mpWindowImpl->mbNoPtrVisible != !bVisible )
+ {
+ mpWindowImpl->mbNoPtrVisible = !bVisible;
+
+ // possibly immediately move pointer
+ if ( !mpWindowImpl->mpFrameData->mbInMouseMove && ImplTestMousePointerSet() )
+ mpWindowImpl->mpFrame->SetPointer( ImplGetMousePointer() );
+ }
+}
+
+Window::PointerState Window::GetPointerState()
+{
+ PointerState aState;
+ aState.mnState = 0;
+
+ if (mpWindowImpl->mpFrame)
+ {
+ SalFrame::SalPointerState aSalPointerState;
+
+ aSalPointerState = mpWindowImpl->mpFrame->GetPointerState();
+ if( ImplIsAntiparallel() )
+ {
+ // --- RTL --- (re-mirror mouse pos at this window)
+ const OutputDevice *pOutDev = GetOutDev();
+ pOutDev->ReMirror( aSalPointerState.maPos );
+ }
+ aState.maPos = ImplFrameToOutput( aSalPointerState.maPos );
+ aState.mnState = aSalPointerState.mnState;
+ }
+ return aState;
+}
+
+bool Window::IsMouseOver()
+{
+ return ImplGetWinData()->mbMouseOver;
+}
+
+void Window::EnterWait()
+{
+
+ mpWindowImpl->mnWaitCount++;
+
+ if ( mpWindowImpl->mnWaitCount == 1 )
+ {
+ // possibly immediately move pointer
+ if ( !mpWindowImpl->mpFrameData->mbInMouseMove && ImplTestMousePointerSet() )
+ mpWindowImpl->mpFrame->SetPointer( ImplGetMousePointer() );
+ }
+}
+
+void Window::LeaveWait()
+{
+
+ if ( mpWindowImpl->mnWaitCount )
+ {
+ mpWindowImpl->mnWaitCount--;
+
+ if ( !mpWindowImpl->mnWaitCount )
+ {
+ // possibly immediately move pointer
+ if ( !mpWindowImpl->mpFrameData->mbInMouseMove && ImplTestMousePointerSet() )
+ mpWindowImpl->mpFrame->SetPointer( ImplGetMousePointer() );
+ }
+ }
+}
+
+bool Window::ImplStopDnd()
+{
+ bool bRet = false;
+ if( mpWindowImpl->mpFrameData && mpWindowImpl->mpFrameData->mxDropTargetListener.is() )
+ {
+ bRet = true;
+ mpWindowImpl->mpFrameData->mxDropTarget.clear();
+ mpWindowImpl->mpFrameData->mxDragSource.clear();
+ mpWindowImpl->mpFrameData->mxDropTargetListener.clear();
+ }
+
+ return bRet;
+}
+
+void Window::ImplStartDnd()
+{
+ GetDropTarget();
+}
+
+Reference< css::datatransfer::dnd::XDropTarget > Window::GetDropTarget()
+{
+
+ if( ! mpWindowImpl->mxDNDListenerContainer.is() )
+ {
+ sal_Int8 nDefaultActions = 0;
+
+ if( mpWindowImpl->mpFrameData )
+ {
+ if( ! mpWindowImpl->mpFrameData->mxDropTarget.is() )
+ {
+ // initialization is done in GetDragSource
+ Reference< css::datatransfer::dnd::XDragSource > xDragSource = GetDragSource();
+ }
+
+ if( mpWindowImpl->mpFrameData->mxDropTarget.is() )
+ {
+ nDefaultActions = mpWindowImpl->mpFrameData->mxDropTarget->getDefaultActions();
+
+ if( ! mpWindowImpl->mpFrameData->mxDropTargetListener.is() )
+ {
+ mpWindowImpl->mpFrameData->mxDropTargetListener = new DNDEventDispatcher( mpWindowImpl->mpFrameWindow );
+
+ try
+ {
+ mpWindowImpl->mpFrameData->mxDropTarget->addDropTargetListener( mpWindowImpl->mpFrameData->mxDropTargetListener );
+
+ // register also as drag gesture listener if directly supported by drag source
+ Reference< css::datatransfer::dnd::XDragGestureRecognizer > xDragGestureRecognizer =
+ Reference< css::datatransfer::dnd::XDragGestureRecognizer > (mpWindowImpl->mpFrameData->mxDragSource, UNO_QUERY);
+
+ if( xDragGestureRecognizer.is() )
+ {
+ xDragGestureRecognizer->addDragGestureListener(
+ Reference< css::datatransfer::dnd::XDragGestureListener > (mpWindowImpl->mpFrameData->mxDropTargetListener, UNO_QUERY));
+ }
+ else
+ mpWindowImpl->mpFrameData->mbInternalDragGestureRecognizer = true;
+
+ }
+ catch (const RuntimeException&)
+ {
+ // release all instances
+ mpWindowImpl->mpFrameData->mxDropTarget.clear();
+ mpWindowImpl->mpFrameData->mxDragSource.clear();
+ }
+ }
+ }
+
+ }
+
+ mpWindowImpl->mxDNDListenerContainer = static_cast < css::datatransfer::dnd::XDropTarget * > ( new DNDListenerContainer( nDefaultActions ) );
+ }
+
+ // this object is located in the same process, so there will be no runtime exception
+ return Reference< css::datatransfer::dnd::XDropTarget > ( mpWindowImpl->mxDNDListenerContainer, UNO_QUERY );
+}
+
+Reference< css::datatransfer::dnd::XDragSource > Window::GetDragSource()
+{
+
+#if HAVE_FEATURE_DESKTOP
+
+ if( mpWindowImpl->mpFrameData )
+ {
+ if( ! mpWindowImpl->mpFrameData->mxDragSource.is() )
+ {
+ try
+ {
+ Reference< XComponentContext > xContext( comphelper::getProcessComponentContext() );
+ const SystemEnvData * pEnvData = GetSystemData();
+
+ if( pEnvData )
+ {
+ Sequence< Any > aDragSourceAL( 2 ), aDropTargetAL( 2 );
+ OUString aDragSourceSN, aDropTargetSN;
+#if defined WNT
+ aDragSourceSN = "com.sun.star.datatransfer.dnd.OleDragSource";
+ aDropTargetSN = "com.sun.star.datatransfer.dnd.OleDropTarget";
+ aDragSourceAL[ 1 ] = makeAny( static_cast<sal_uInt64>( reinterpret_cast<sal_IntPtr>(pEnvData->hWnd) ) );
+ aDropTargetAL[ 0 ] = makeAny( static_cast<sal_uInt64>( reinterpret_cast<sal_IntPtr>(pEnvData->hWnd) ) );
+#elif defined MACOSX
+ /* FIXME: Mac OS X specific dnd interface does not exist! *
+ * Using Windows based dnd as a temporary solution */
+ aDragSourceSN = "com.sun.star.datatransfer.dnd.OleDragSource";
+ aDropTargetSN = "com.sun.star.datatransfer.dnd.OleDropTarget";
+ aDragSourceAL[ 1 ] = makeAny( static_cast<sal_uInt64>( reinterpret_cast<sal_IntPtr>(pEnvData->mpNSView) ) );
+ aDropTargetAL[ 0 ] = makeAny( static_cast<sal_uInt64>( reinterpret_cast<sal_IntPtr>(pEnvData->mpNSView) ) );
+#elif HAVE_FEATURE_X11
+ aDragSourceSN = "com.sun.star.datatransfer.dnd.X11DragSource";
+ aDropTargetSN = "com.sun.star.datatransfer.dnd.X11DropTarget";
+
+ aDragSourceAL[ 0 ] = makeAny( Application::GetDisplayConnection() );
+ aDropTargetAL[ 0 ] = makeAny( Application::GetDisplayConnection() );
+ aDropTargetAL[ 1 ] = makeAny( (sal_Size)(pEnvData->aShellWindow) );
+#endif
+ if( !aDragSourceSN.isEmpty() )
+ mpWindowImpl->mpFrameData->mxDragSource.set(
+ xContext->getServiceManager()->createInstanceWithArgumentsAndContext( aDragSourceSN, aDragSourceAL, xContext ),
+ UNO_QUERY );
+
+ if( !aDropTargetSN.isEmpty() )
+ mpWindowImpl->mpFrameData->mxDropTarget.set(
+ xContext->getServiceManager()->createInstanceWithArgumentsAndContext( aDropTargetSN, aDropTargetAL, xContext ),
+ UNO_QUERY );
+ }
+ }
+
+ // createInstance can throw any exception
+ catch (const Exception&)
+ {
+ // release all instances
+ mpWindowImpl->mpFrameData->mxDropTarget.clear();
+ mpWindowImpl->mpFrameData->mxDragSource.clear();
+ }
+ }
+
+ return mpWindowImpl->mpFrameData->mxDragSource;
+ }
+#endif
+ return Reference< css::datatransfer::dnd::XDragSource > ();
+}
+
+Reference< css::datatransfer::dnd::XDragGestureRecognizer > Window::GetDragGestureRecognizer()
+{
+ return Reference< css::datatransfer::dnd::XDragGestureRecognizer > ( GetDropTarget(), UNO_QUERY );
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/source/window/window.cxx b/vcl/source/window/window.cxx
index 244a48d..01b4ee8 100644
--- a/vcl/source/window/window.cxx
+++ b/vcl/source/window/window.cxx
@@ -1397,89 +1397,6 @@ Window* Window::ImplFindWindow( const Point& rFramePos )
return NULL;
}
-sal_uInt16 Window::ImplHitTest( const Point& rFramePos )
-{
- Point aFramePos( rFramePos );
- if( ImplIsAntiparallel() )
- {
- // - RTL - re-mirror frame pos at this window
- const OutputDevice *pOutDev = GetOutDev();
- pOutDev->ReMirror( aFramePos );
- }
- Rectangle aRect( Point( mnOutOffX, mnOutOffY ), Size( mnOutWidth, mnOutHeight ) );
- if ( !aRect.IsInside( aFramePos ) )
- return 0;
- if ( mpWindowImpl->mbWinRegion )
- {
- Point aTempPos = aFramePos;
- aTempPos.X() -= mnOutOffX;
- aTempPos.Y() -= mnOutOffY;
- if ( !mpWindowImpl->maWinRegion.IsInside( aTempPos ) )
- return 0;
- }
-
- sal_uInt16 nHitTest = WINDOW_HITTEST_INSIDE;
- if ( mpWindowImpl->mbMouseTransparent )
- nHitTest |= WINDOW_HITTEST_TRANSPARENT;
- return nHitTest;
-}
-
-int Window::ImplTestMousePointerSet()
-{
- // as soon as mouse is captured, switch mouse-pointer
- if ( IsMouseCaptured() )
- return sal_True;
-
- // if the mouse is over the window, switch it
- Rectangle aClientRect( Point( 0, 0 ), GetOutputSizePixel() );
- if ( aClientRect.IsInside( GetPointerPosPixel() ) )
- return sal_True;
-
- return sal_False;
-}
-
-PointerStyle Window::ImplGetMousePointer() const
-{
- PointerStyle ePointerStyle;
- bool bWait = false;
-
- if ( IsEnabled() && IsInputEnabled() && ! IsInModalMode() )
- ePointerStyle = GetPointer().GetStyle();
- else
- ePointerStyle = POINTER_ARROW;
-
- const Window* pWindow = this;
- do
- {
- // when the pointer is not visible stop the search, as
- // this status should not be overwritten
- if ( pWindow->mpWindowImpl->mbNoPtrVisible )
- return POINTER_NULL;
-
- if ( !bWait )
- {
- if ( pWindow->mpWindowImpl->mnWaitCount )
- {
- ePointerStyle = POINTER_WAIT;
- bWait = true;
- }
- else
- {
- if ( pWindow->mpWindowImpl->mbChildPtrOverwrite )
- ePointerStyle = pWindow->GetPointer().GetStyle();
- }
- }
-
- if ( pWindow->ImplIsOverlapWindow() )
- break;
-
- pWindow = pWindow->ImplGetParent();
- }
- while ( pWindow );
-
- return ePointerStyle;
-}
-
bool Window::ImplIsRealParentPath( const Window* pWindow ) const
{
pWindow = pWindow->GetParent();
@@ -3081,286 +2998,6 @@ void Window::ImplPosSizeWindow( long nX, long nY,
delete pOldRegion;
}
-void Window::ImplCallMouseMove( sal_uInt16 nMouseCode, bool bModChanged )
-{
- if ( mpWindowImpl->mpFrameData->mbMouseIn && mpWindowImpl->mpFrameWindow->mpWindowImpl->mbReallyVisible )
- {
- sal_uLong nTime = Time::GetSystemTicks();
- long nX = mpWindowImpl->mpFrameData->mnLastMouseX;
- long nY = mpWindowImpl->mpFrameData->mnLastMouseY;
- sal_uInt16 nCode = nMouseCode;
- sal_uInt16 nMode = mpWindowImpl->mpFrameData->mnMouseMode;
- bool bLeave;
- // check for MouseLeave
- if ( ((nX < 0) || (nY < 0) ||
- (nX >= mpWindowImpl->mpFrameWindow->mnOutWidth) ||
- (nY >= mpWindowImpl->mpFrameWindow->mnOutHeight)) &&
- !ImplGetSVData()->maWinData.mpCaptureWin )
- bLeave = true;
- else
- bLeave = false;
- nMode |= MOUSE_SYNTHETIC;
- if ( bModChanged )
- nMode |= MOUSE_MODIFIERCHANGED;
- ImplHandleMouseEvent( mpWindowImpl->mpFrameWindow, EVENT_MOUSEMOVE, bLeave, nX, nY, nTime, nCode, nMode );
- }
-}
-
-void Window::ImplGenerateMouseMove()
-{
- if ( !mpWindowImpl->mpFrameData->mnMouseMoveId )
- mpWindowImpl->mpFrameData->mnMouseMoveId = Application::PostUserEvent( LINK( mpWindowImpl->mpFrameWindow, Window, ImplGenerateMouseMoveHdl ) );
-}
-
-IMPL_LINK_NOARG(Window, ImplGenerateMouseMoveHdl)
-{
- mpWindowImpl->mpFrameData->mnMouseMoveId = 0;
- Window* pCaptureWin = ImplGetSVData()->maWinData.mpCaptureWin;
- if( ! pCaptureWin ||
- (pCaptureWin->mpWindowImpl && pCaptureWin->mpWindowImpl->mpFrame == mpWindowImpl->mpFrame)
- )
- {
- ImplCallMouseMove( mpWindowImpl->mpFrameData->mnMouseCode );
- }
- return 0;
-}
-
-void Window::ImplInvertFocus( const Rectangle& rRect )
-{
- InvertTracking( rRect, SHOWTRACK_SMALL | SHOWTRACK_WINDOW );
-}
-
-static bool IsWindowFocused(const WindowImpl& rWinImpl)
-{
- if (rWinImpl.mpSysObj)
- return true;
-
- if (rWinImpl.mpFrameData->mbHasFocus)
- return true;
-
- if (rWinImpl.mbFakeFocusSet)
- return true;
-
- return false;
-}
-
-void Window::ImplGrabFocus( sal_uInt16 nFlags )
-{
- // #143570# no focus for destructing windows
- if( mpWindowImpl->mbInDtor )
- return;
-
- // some event listeners do really bad stuff
- // => prepare for the worst
- ImplDelData aDogTag( this );
-
- // Currently the client window should always get the focus
- // Should the border window at some point be focusable
- // we need to change all GrabFocus() instances in VCL,
- // e.g. in ToTop()
-
- if ( mpWindowImpl->mpClientWindow )
- {
- // For a lack of design we need a little hack here to
- // ensure that dialogs on close pass the focus back to
- // the correct window
- if ( mpWindowImpl->mpLastFocusWindow && (mpWindowImpl->mpLastFocusWindow != this) &&
- !(mpWindowImpl->mnDlgCtrlFlags & WINDOW_DLGCTRL_WANTFOCUS) &&
- mpWindowImpl->mpLastFocusWindow->IsEnabled() &&
- mpWindowImpl->mpLastFocusWindow->IsInputEnabled() &&
- ! mpWindowImpl->mpLastFocusWindow->IsInModalMode()
- )
- mpWindowImpl->mpLastFocusWindow->GrabFocus();
- else
- mpWindowImpl->mpClientWindow->GrabFocus();
- return;
- }
- else if ( mpWindowImpl->mbFrame )
- {
- // For a lack of design we need a little hack here to
- // ensure that dialogs on close pass the focus back to
- // the correct window
- if ( mpWindowImpl->mpLastFocusWindow && (mpWindowImpl->mpLastFocusWindow != this) &&
- !(mpWindowImpl->mnDlgCtrlFlags & WINDOW_DLGCTRL_WANTFOCUS) &&
- mpWindowImpl->mpLastFocusWindow->IsEnabled() &&
- mpWindowImpl->mpLastFocusWindow->IsInputEnabled() &&
- ! mpWindowImpl->mpLastFocusWindow->IsInModalMode()
- )
- {
- mpWindowImpl->mpLastFocusWindow->GrabFocus();
- return;
- }
- }
-
- // If the Window is disabled, then we don't change the focus
- if ( !IsEnabled() || !IsInputEnabled() || IsInModalNonRefMode() )
- return;
-
- // we only need to set the focus if it is not already set
- // note: if some other frame is waiting for an asynchrounous focus event
- // we also have to post an asynchronous focus event for this frame
- // which is done using ToTop
- ImplSVData* pSVData = ImplGetSVData();
-
- bool bAsyncFocusWaiting = false;
- Window *pFrame = pSVData->maWinData.mpFirstFrame;
- while( pFrame )
- {
- if( pFrame != mpWindowImpl->mpFrameWindow && pFrame->mpWindowImpl->mpFrameData->mnFocusId )
- {
- bAsyncFocusWaiting = true;
- break;
- }
- pFrame = pFrame->mpWindowImpl->mpFrameData->mpNextFrame;
- }
-
- bool bHasFocus = IsWindowFocused(*mpWindowImpl);
-
- bool bMustNotGrabFocus = false;
- // #100242#, check parent hierarchy if some floater prohibits grab focus
-
- Window *pParent = this;
- while( pParent )
- {
- // #102158#, ignore grabfocus only if the floating parent grabs keyboard focus by itself (GrabsFocus())
- // otherwise we cannot set the focus in a floating toolbox
- if( ( (pParent->mpWindowImpl->mbFloatWin && ((FloatingWindow*)pParent)->GrabsFocus()) || ( pParent->GetStyle() & WB_SYSTEMFLOATWIN ) ) && !( pParent->GetStyle() & WB_MOVEABLE ) )
- {
- bMustNotGrabFocus = true;
- break;
- }
- pParent = pParent->mpWindowImpl->mpParent;
- }
-
- if ( ( pSVData->maWinData.mpFocusWin != this && ! mpWindowImpl->mbInDtor ) || ( bAsyncFocusWaiting && !bHasFocus && !bMustNotGrabFocus ) )
- {
- // EndExtTextInput if it is not the same window
- if ( pSVData->maWinData.mpExtTextInputWin &&
- (pSVData->maWinData.mpExtTextInputWin != this) )
- pSVData->maWinData.mpExtTextInputWin->EndExtTextInput( EXTTEXTINPUT_END_COMPLETE );
-
- // mark this windows as the last FocusWindow
- Window* pOverlapWindow = ImplGetFirstOverlapWindow();
- pOverlapWindow->mpWindowImpl->mpLastFocusWindow = this;
- mpWindowImpl->mpFrameData->mpFocusWin = this;
-
- if( !bHasFocus )
- {
- // menu windows never get the system focus
- // the application will keep the focus
- if( bMustNotGrabFocus )
- return;
- else
- {
- // here we already switch focus as ToTop()
- // should not give focus to another window
- //DBG_WARNING( "Window::GrabFocus() - Frame doesn't have the focus" );
- mpWindowImpl->mpFrame->ToTop( SAL_FRAME_TOTOP_GRABFOCUS | SAL_FRAME_TOTOP_GRABFOCUS_ONLY );
- return;
- }
- }
-
- Window* pOldFocusWindow = pSVData->maWinData.mpFocusWin;
- ImplDelData aOldFocusDel( pOldFocusWindow );
-
- pSVData->maWinData.mpFocusWin = this;
-
- if ( pOldFocusWindow )
- {
- // Cursor hidden
- if ( pOldFocusWindow->mpWindowImpl->mpCursor )
- pOldFocusWindow->mpWindowImpl->mpCursor->ImplHide( true );
- }
-
- // !!!!! due to old SV-Office Activate/Deactivate handling
- // !!!!! first as before
- if ( pOldFocusWindow )
- {
- // remember Focus
- Window* pOldOverlapWindow = pOldFocusWindow->ImplGetFirstOverlapWindow();
- Window* pNewOverlapWindow = ImplGetFirstOverlapWindow();
- if ( pOldOverlapWindow != pNewOverlapWindow )
- ImplCallFocusChangeActivate( pNewOverlapWindow, pOldOverlapWindow );
- }
- else
- {
- Window* pNewOverlapWindow = ImplGetFirstOverlapWindow();
- Window* pNewRealWindow = pNewOverlapWindow->ImplGetWindow();
- pNewOverlapWindow->mpWindowImpl->mbActive = true;
- pNewOverlapWindow->Activate();
- if ( pNewRealWindow != pNewOverlapWindow )
- {
- pNewRealWindow->mpWindowImpl->mbActive = true;
- pNewRealWindow->Activate();
- }
- }
-
- // call Get- and LoseFocus
- if ( pOldFocusWindow && ! aOldFocusDel.IsDead() )
- {
- if ( pOldFocusWindow->IsTracking() &&
- (pSVData->maWinData.mnTrackFlags & STARTTRACK_FOCUSCANCEL) )
- pOldFocusWindow->EndTracking( ENDTRACK_CANCEL | ENDTRACK_FOCUS );
- NotifyEvent aNEvt( EVENT_LOSEFOCUS, pOldFocusWindow );
- if ( !ImplCallPreNotify( aNEvt ) )
- pOldFocusWindow->LoseFocus();
- pOldFocusWindow->ImplCallDeactivateListeners( this );
- }
-
- if ( pSVData->maWinData.mpFocusWin == this )
- {
- if ( mpWindowImpl->mpSysObj )
- {
- mpWindowImpl->mpFrameData->mpFocusWin = this;
- if ( !mpWindowImpl->mpFrameData->mbInSysObjFocusHdl )
- mpWindowImpl->mpSysObj->GrabFocus();
- }
-
- if ( pSVData->maWinData.mpFocusWin == this )
- {
- if ( mpWindowImpl->mpCursor )
- mpWindowImpl->mpCursor->ImplShow();
- mpWindowImpl->mbInFocusHdl = true;
- mpWindowImpl->mnGetFocusFlags = nFlags;
- // if we're changing focus due to closing a popup floating window
- // notify the new focus window so it can restore the inner focus
- // eg, toolboxes can select their recent active item
- if( pOldFocusWindow &&
- ! aOldFocusDel.IsDead() &&
- ( pOldFocusWindow->GetDialogControlFlags() & WINDOW_DLGCTRL_FLOATWIN_POPUPMODEEND_CANCEL ) )
- mpWindowImpl->mnGetFocusFlags |= GETFOCUS_FLOATWIN_POPUPMODEEND_CANCEL;
- NotifyEvent aNEvt( EVENT_GETFOCUS, this );
- if ( !ImplCallPreNotify( aNEvt ) && !aDogTag.IsDead() )
- GetFocus();
- if( !aDogTag.IsDead() )
- ImplCallActivateListeners( (pOldFocusWindow && ! aOldFocusDel.IsDead()) ? pOldFocusWindow : NULL );
- if( !aDogTag.IsDead() )
- {
- mpWindowImpl->mnGetFocusFlags = 0;
- mpWindowImpl->mbInFocusHdl = false;
- }
- }
- }
-
- GetpApp()->FocusChanged();
- ImplNewInputContext();
- }
-}
-
-void Window::ImplGrabFocusToDocument( sal_uInt16 nFlags )
-{
- Window *pWin = this;
- while( pWin )
- {
- if( !pWin->GetParent() )
- {
- pWin->ImplGetFrameWindow()->GetWindow( WINDOW_CLIENT )->ImplGrabFocus(nFlags);
- return;
- }
- pWin = pWin->GetParent();
- }
-}
-
void Window::ImplNewInputContext()
{
ImplSVData* pSVData = ImplGetSVData();
@@ -3428,27 +3065,6 @@ void Window::SimulateKeyPress( sal_uInt16 nKeyCode ) const
mpWindowImpl->mpFrame->SimulateKeyPress(nKeyCode);
}
-void Window::MouseMove( const MouseEvent& rMEvt )
-{
- NotifyEvent aNEvt( EVENT_MOUSEMOVE, this, &rMEvt );
- if ( !Notify( aNEvt ) )
- mpWindowImpl->mbMouseMove = true;
-}
-
-void Window::MouseButtonDown( const MouseEvent& rMEvt )
-{
- NotifyEvent aNEvt( EVENT_MOUSEBUTTONDOWN, this, &rMEvt );
- if ( !Notify( aNEvt ) )
- mpWindowImpl->mbMouseButtonDown = true;
-}
-
-void Window::MouseButtonUp( const MouseEvent& rMEvt )
-{
- NotifyEvent aNEvt( EVENT_MOUSEBUTTONUP, this, &rMEvt );
- if ( !Notify( aNEvt ) )
- mpWindowImpl->mbMouseButtonUp = true;
-}
-
void Window::KeyInput( const KeyEvent& rKEvt )
{
NotifyEvent aNEvt( EVENT_KEYINPUT, this, &rKEvt );
@@ -3743,18 +3359,6 @@ long Window::CalcTitleWidth() const
return 0;
}
-void Window::SetMouseTransparent( bool bTransparent )
-{
-
- if ( mpWindowImpl->mpBorderWindow )
- mpWindowImpl->mpBorderWindow->SetMouseTransparent( bTransparent );
-
- if( mpWindowImpl->mpSysObj )
- mpWindowImpl->mpSysObj->SetMouseTransparent( bTransparent );
-
- mpWindowImpl->mbMouseTransparent = bTransparent;
-}
-
void Window::SetPaintTransparent( bool bTransparent )
{
@@ -5278,190 +4882,6 @@ bool Window::HasChildPathFocus( bool bSystemWindow ) const
return ImplIsWindowOrChild( pFocusWin, bSystemWindow );
return false;
}
-
-void Window::CaptureMouse()
-{
-
- ImplSVData* pSVData = ImplGetSVData();
-
- // possibly stop tracking
- if ( pSVData->maWinData.mpTrackWin != this )
- {
- if ( pSVData->maWinData.mpTrackWin )
- pSVData->maWinData.mpTrackWin->EndTracking( ENDTRACK_CANCEL );
- }
-
- if ( pSVData->maWinData.mpCaptureWin != this )
- {
- pSVData->maWinData.mpCaptureWin = this;
- mpWindowImpl->mpFrame->CaptureMouse( true );
- }
-}
-
-void Window::ReleaseMouse()
-{
-
- ImplSVData* pSVData = ImplGetSVData();
-
- DBG_ASSERTWARNING( pSVData->maWinData.mpCaptureWin == this,
- "Window::ReleaseMouse(): window doesn't have the mouse capture" );
-
- if ( pSVData->maWinData.mpCaptureWin == this )
- {
- pSVData->maWinData.mpCaptureWin = NULL;
- mpWindowImpl->mpFrame->CaptureMouse( false );
- ImplGenerateMouseMove();
- }
-}
-
-bool Window::IsMouseCaptured() const
-{
-
- return (this == ImplGetSVData()->maWinData.mpCaptureWin);
-}
-
-void Window::SetPointer( const Pointer& rPointer )
-{
-
- if ( mpWindowImpl->maPointer == rPointer )
- return;
-
- mpWindowImpl->maPointer = rPointer;
-
- // possibly immediately move pointer
- if ( !mpWindowImpl->mpFrameData->mbInMouseMove && ImplTestMousePointerSet() )
- mpWindowImpl->mpFrame->SetPointer( ImplGetMousePointer() );
-}
-
-void Window::EnableChildPointerOverwrite( bool bOverwrite )
-{
-
- if ( mpWindowImpl->mbChildPtrOverwrite == bOverwrite )
- return;
-
- mpWindowImpl->mbChildPtrOverwrite = bOverwrite;
-
- // possibly immediately move pointer
- if ( !mpWindowImpl->mpFrameData->mbInMouseMove && ImplTestMousePointerSet() )
- mpWindowImpl->mpFrame->SetPointer( ImplGetMousePointer() );
-}
-
-void Window::SetPointerPosPixel( const Point& rPos )
-{
- Point aPos = ImplOutputToFrame( rPos );
- const OutputDevice *pOutDev = GetOutDev();
- if( pOutDev->HasMirroredGraphics() )
- {
- if( !IsRTLEnabled() )
- {
- // --- RTL --- (re-mirror mouse pos at this window)
- pOutDev->ReMirror( aPos );
- }
- // mirroring is required here, SetPointerPos bypasses SalGraphics
- mpGraphics->mirror( aPos.X(), this );
- }
- else if( ImplIsAntiparallel() )
- {
- pOutDev->ReMirror( aPos );
- }
- mpWindowImpl->mpFrame->SetPointerPos( aPos.X(), aPos.Y() );
-}
-
-Point Window::GetPointerPosPixel()
-{
-
- Point aPos( mpWindowImpl->mpFrameData->mnLastMouseX, mpWindowImpl->mpFrameData->mnLastMouseY );
- if( ImplIsAntiparallel() )
- {
- // --- RTL --- (re-mirror mouse pos at this window)
- const OutputDevice *pOutDev = GetOutDev();
- pOutDev->ReMirror( aPos );
- }
- return ImplFrameToOutput( aPos );
-}
-
-Point Window::GetLastPointerPosPixel()
-{
-
- Point aPos( mpWindowImpl->mpFrameData->mnBeforeLastMouseX, mpWindowImpl->mpFrameData->mnBeforeLastMouseY );
- if( ImplIsAntiparallel() )
- {
- // --- RTL --- (re-mirror mouse pos at this window)
- const OutputDevice *pOutDev = GetOutDev();
- pOutDev->ReMirror( aPos );
- }
- return ImplFrameToOutput( aPos );
-}
-
-void Window::ShowPointer( bool bVisible )
-{
-
- if ( mpWindowImpl->mbNoPtrVisible != !bVisible )
- {
- mpWindowImpl->mbNoPtrVisible = !bVisible;
-
- // possibly immediately move pointer
- if ( !mpWindowImpl->mpFrameData->mbInMouseMove && ImplTestMousePointerSet() )
- mpWindowImpl->mpFrame->SetPointer( ImplGetMousePointer() );
- }
-}
-
-Window::PointerState Window::GetPointerState()
-{
- PointerState aState;
- aState.mnState = 0;
-
- if (mpWindowImpl->mpFrame)
- {
- SalFrame::SalPointerState aSalPointerState;
-
- aSalPointerState = mpWindowImpl->mpFrame->GetPointerState();
- if( ImplIsAntiparallel() )
- {
- // --- RTL --- (re-mirror mouse pos at this window)
- const OutputDevice *pOutDev = GetOutDev();
- pOutDev->ReMirror( aSalPointerState.maPos );
- }
- aState.maPos = ImplFrameToOutput( aSalPointerState.maPos );
- aState.mnState = aSalPointerState.mnState;
- }
- return aState;
-}
-
-bool Window::IsMouseOver()
-{
- return ImplGetWinData()->mbMouseOver;
-}
-
-void Window::EnterWait()
-{
-
- mpWindowImpl->mnWaitCount++;
-
- if ( mpWindowImpl->mnWaitCount == 1 )
- {
- // possibly immediately move pointer
- if ( !mpWindowImpl->mpFrameData->mbInMouseMove && ImplTestMousePointerSet() )
- mpWindowImpl->mpFrame->SetPointer( ImplGetMousePointer() );
- }
-}
-
-void Window::LeaveWait()
-{
-
- if ( mpWindowImpl->mnWaitCount )
- {
- mpWindowImpl->mnWaitCount--;
-
- if ( !mpWindowImpl->mnWaitCount )
- {
- // possibly immediately move pointer
- if ( !mpWindowImpl->mpFrameData->mbInMouseMove && ImplTestMousePointerSet() )
- mpWindowImpl->mpFrame->SetPointer( ImplGetMousePointer() );
- }
- }
-}
-
void Window::SetCursor( Cursor* pCursor )
{
@@ -5823,153 +5243,6 @@ void Window::ImplCallActivateListeners( Window *pOld )
}
}
-bool Window::ImplStopDnd()
-{
- bool bRet = false;
- if( mpWindowImpl->mpFrameData && mpWindowImpl->mpFrameData->mxDropTargetListener.is() )
- {
- bRet = true;
- mpWindowImpl->mpFrameData->mxDropTarget.clear();
- mpWindowImpl->mpFrameData->mxDragSource.clear();
- mpWindowImpl->mpFrameData->mxDropTargetListener.clear();
- }
-
- return bRet;
-}
-
-void Window::ImplStartDnd()
-{
- GetDropTarget();
-}
-
-uno::Reference< XDropTarget > Window::GetDropTarget()
-{
-
- if( ! mpWindowImpl->mxDNDListenerContainer.is() )
- {
- sal_Int8 nDefaultActions = 0;
-
- if( mpWindowImpl->mpFrameData )
- {
- if( ! mpWindowImpl->mpFrameData->mxDropTarget.is() )
- {
- // initialization is done in GetDragSource
- uno::Reference< XDragSource > xDragSource = GetDragSource();
- }
-
- if( mpWindowImpl->mpFrameData->mxDropTarget.is() )
- {
- nDefaultActions = mpWindowImpl->mpFrameData->mxDropTarget->getDefaultActions();
-
- if( ! mpWindowImpl->mpFrameData->mxDropTargetListener.is() )
- {
- mpWindowImpl->mpFrameData->mxDropTargetListener = new DNDEventDispatcher( mpWindowImpl->mpFrameWindow );
-
- try
- {
- mpWindowImpl->mpFrameData->mxDropTarget->addDropTargetListener( mpWindowImpl->mpFrameData->mxDropTargetListener );
-
- // register also as drag gesture listener if directly supported by drag source
- uno::Reference< XDragGestureRecognizer > xDragGestureRecognizer =
- uno::Reference< XDragGestureRecognizer > (mpWindowImpl->mpFrameData->mxDragSource, UNO_QUERY);
-
- if( xDragGestureRecognizer.is() )
- {
- xDragGestureRecognizer->addDragGestureListener(
- uno::Reference< XDragGestureListener > (mpWindowImpl->mpFrameData->mxDropTargetListener, UNO_QUERY));
- }
- else
- mpWindowImpl->mpFrameData->mbInternalDragGestureRecognizer = true;
-
- }
- catch (const RuntimeException&)
- {
- // release all instances
- mpWindowImpl->mpFrameData->mxDropTarget.clear();
- mpWindowImpl->mpFrameData->mxDragSource.clear();
- }
- }
- }
-
- }
-
- mpWindowImpl->mxDNDListenerContainer = static_cast < XDropTarget * > ( new DNDListenerContainer( nDefaultActions ) );
- }
-
- // this object is located in the same process, so there will be no runtime exception
- return uno::Reference< XDropTarget > ( mpWindowImpl->mxDNDListenerContainer, UNO_QUERY );
-}
-
-uno::Reference< XDragSource > Window::GetDragSource()
-{
-
-#if HAVE_FEATURE_DESKTOP
-
- if( mpWindowImpl->mpFrameData )
- {
- if( ! mpWindowImpl->mpFrameData->mxDragSource.is() )
- {
- try
- {
- uno::Reference< XComponentContext > xContext( comphelper::getProcessComponentContext() );
- const SystemEnvData * pEnvData = GetSystemData();
-
- if( pEnvData )
- {
- Sequence< Any > aDragSourceAL( 2 ), aDropTargetAL( 2 );
- OUString aDragSourceSN, aDropTargetSN;
-#if defined WNT
- aDragSourceSN = "com.sun.star.datatransfer.dnd.OleDragSource";
- aDropTargetSN = "com.sun.star.datatransfer.dnd.OleDropTarget";
- aDragSourceAL[ 1 ] = makeAny( static_cast<sal_uInt64>( reinterpret_cast<sal_IntPtr>(pEnvData->hWnd) ) );
- aDropTargetAL[ 0 ] = makeAny( static_cast<sal_uInt64>( reinterpret_cast<sal_IntPtr>(pEnvData->hWnd) ) );
-#elif defined MACOSX
- /* FIXME: Mac OS X specific dnd interface does not exist! *
- * Using Windows based dnd as a temporary solution */
- aDragSourceSN = "com.sun.star.datatransfer.dnd.OleDragSource";
- aDropTargetSN = "com.sun.star.datatransfer.dnd.OleDropTarget";
- aDragSourceAL[ 1 ] = makeAny( static_cast<sal_uInt64>( reinterpret_cast<sal_IntPtr>(pEnvData->mpNSView) ) );
- aDropTargetAL[ 0 ] = makeAny( static_cast<sal_uInt64>( reinterpret_cast<sal_IntPtr>(pEnvData->mpNSView) ) );
-#elif HAVE_FEATURE_X11
- aDragSourceSN = "com.sun.star.datatransfer.dnd.X11DragSource";
- aDropTargetSN = "com.sun.star.datatransfer.dnd.X11DropTarget";
-
- aDragSourceAL[ 0 ] = makeAny( Application::GetDisplayConnection() );
- aDropTargetAL[ 0 ] = makeAny( Application::GetDisplayConnection() );
- aDropTargetAL[ 1 ] = makeAny( (sal_Size)(pEnvData->aShellWindow) );
-#endif
- if( !aDragSourceSN.isEmpty() )
- mpWindowImpl->mpFrameData->mxDragSource.set(
- xContext->getServiceManager()->createInstanceWithArgumentsAndContext( aDragSourceSN, aDragSourceAL, xContext ),
- UNO_QUERY );
-
- if( !aDropTargetSN.isEmpty() )
- mpWindowImpl->mpFrameData->mxDropTarget.set(
- xContext->getServiceManager()->createInstanceWithArgumentsAndContext( aDropTargetSN, aDropTargetAL, xContext ),
- UNO_QUERY );
- }
- }
-
- // createInstance can throw any exception
- catch (const Exception&)
- {
- // release all instances
- mpWindowImpl->mpFrameData->mxDropTarget.clear();
- mpWindowImpl->mpFrameData->mxDragSource.clear();
- }
- }
-
- return mpWindowImpl->mpFrameData->mxDragSource;
- }
-#endif
- return uno::Reference< XDragSource > ();
-}
-
-uno::Reference< XDragGestureRecognizer > Window::GetDragGestureRecognizer()
-{
- return uno::Reference< XDragGestureRecognizer > ( GetDropTarget(), UNO_QUERY );
-}
-
uno::Reference< XClipboard > Window::GetClipboard()
{
More information about the Libreoffice-commits
mailing list