sc/source/ui/app/transobj.cxx |   15 +++++++++++++++
 sc/source/ui/inc/transobj.hxx |    8 +++++++-
 sc/source/ui/view/gridwin.cxx |   14 ++++++++++++--
 sc/source/ui/view/select.cxx  |    1 +
 sc/source/ui/view/tabcont.cxx |    2 ++
 5 files changed, 37 insertions(+), 3 deletions(-)

New commits:
commit 172d13121ff2afa1a2d2697570394560ae9a6ffa
Author: Caolán McNamara <caol...@redhat.com>
Date:   Mon Jun 20 12:13:02 2016 +0100

    tdf#96540 dragging between sheets can change the current cursor position
    
    so the at position at time of drop may not be that at the start of
    the drag.
    
    So set the current cursor position to ScTransferObj when the drag starts
    and retrieve it later
    
    Related to:
    
    commit ac3b66057ba677903b6de354317417b267be0fa0
    Author: Kohei Yoshida <kyosh...@novell.com>
    Date:   Thu Sep 16 11:09:29 2010 +0200
    
        calc-selection-fixed-cursor.diff: Migrated
    
        n#502717, i#21869, i#97093, when making selection, don't move the 
cursor position
    
    and
    
    commit c433fa0639ccf5caeb0c128c8a3794322e2a1c81
    Author: Markus Mohrhard <markus.mohrh...@googlemail.com>
    Date:   Fri Jul 6 02:04:44 2012 +0200
    
        adjust the calculation of the cursor pos if ALT is used, fdo#48869
    
        Change-Id: I6316717c860d999270aa7f0fb50af5f6dfc7efd7
    
    I haven't used SetSourceCursorPos everywhere a ScTransferObj is created, 
just
    where its created through a drag event
    
    Change-Id: I50c36b4a2ba45426edebc1f1dfa5e262db3c5d03
    Reviewed-on: https://gerrit.libreoffice.org/26512
    Tested-by: Jenkins <c...@libreoffice.org>
    Reviewed-by: Markus Mohrhard <markus.mohrh...@googlemail.com>
    (cherry picked from commit f9b46bbd2446a6c9a0aaab31016536bda4a77294)
    Reviewed-on: https://gerrit.libreoffice.org/26538
    Reviewed-by: Eike Rathke <er...@redhat.com>
    Tested-by: Eike Rathke <er...@redhat.com>

diff --git a/sc/source/ui/app/transobj.cxx b/sc/source/ui/app/transobj.cxx
index 85f65e2..d1ac04e 100644
--- a/sc/source/ui/app/transobj.cxx
+++ b/sc/source/ui/app/transobj.cxx
@@ -116,6 +116,8 @@ ScTransferObj::ScTransferObj( ScDocument* pClipDoc, const 
TransferableObjectDesc
     aObjDesc( rDesc ),
     nDragHandleX( 0 ),
     nDragHandleY( 0 ),
+    nSourceCursorX( MAXCOL + 1 ),
+    nSourceCursorY( MAXROW + 1 ),
     nDragSourceFlags( 0 ),
     bDragWasInternal( false ),
     bUsedForLink( false ),
@@ -517,6 +519,19 @@ void ScTransferObj::SetDragHandlePos( SCCOL nX, SCROW nY )
     nDragHandleY = nY;
 }
 
+void ScTransferObj::SetSourceCursorPos( SCCOL nX, SCROW nY )
+{
+    nSourceCursorX = nX;
+    nSourceCursorY = nY;
+}
+
+bool ScTransferObj::WasSourceCursorInSelection() const
+{
+    return
+        nSourceCursorX >= aBlock.aStart.Col() && nSourceCursorX <= 
aBlock.aEnd.Col() &&
+        nSourceCursorY >= aBlock.aStart.Row() && nSourceCursorY <= 
aBlock.aEnd.Row();
+}
+
 void ScTransferObj::SetVisibleTab( SCTAB nNew )
 {
     nVisibleTab = nNew;
diff --git a/sc/source/ui/inc/transobj.hxx b/sc/source/ui/inc/transobj.hxx
index a29fd4c..abce989 100644
--- a/sc/source/ui/inc/transobj.hxx
+++ b/sc/source/ui/inc/transobj.hxx
@@ -49,6 +49,8 @@ private:
     css::uno::Reference<css::sheet::XSheetCellRanges> xDragSourceRanges;
     SCCOL                           nDragHandleX;
     SCROW                           nDragHandleY;
+    SCCOL                           nSourceCursorX;
+    SCROW                           nSourceCursorY;
     SCTAB                           nVisibleTab;
     sal_uInt16                      nDragSourceFlags;
     bool                            bDragWasInternal;
@@ -83,8 +85,11 @@ public:
     SCROW               GetNonFilteredRows() const { return nNonFiltered; }
     SCCOL               GetDragHandleX() const  { return nDragHandleX; }
     SCROW               GetDragHandleY() const  { return nDragHandleY; }
+    bool                WasSourceCursorInSelection() const;
+    SCCOL               GetSourceCursorX() const  { return nSourceCursorX; }
+    SCROW               GetSourceCursorY() const  { return nSourceCursorY; }
     SCTAB               GetVisibleTab() const   { return nVisibleTab; }
-    sal_uInt16              GetDragSourceFlags() const  { return 
nDragSourceFlags; }
+    sal_uInt16          GetDragSourceFlags() const  { return nDragSourceFlags; 
}
     bool                HasFilteredRows() const { return bHasFiltered; }
     bool                GetUseInApi() const     { return bUseInApi; }
     ScDocShell*         GetSourceDocShell();
@@ -93,6 +98,7 @@ public:
 
     void                SetDrawPersist( const SfxObjectShellRef& rRef );
     void                SetDragHandlePos( SCCOL nX, SCROW nY );
+    void                SetSourceCursorPos( SCCOL nX, SCROW nY );
     void                SetVisibleTab( SCTAB nNew );
     void                SetDragSource( ScDocShell* pSourceShell, const 
ScMarkData& rMark );
     void                SetDragSourceFlags( sal_uInt16 nFlags );
diff --git a/sc/source/ui/view/gridwin.cxx b/sc/source/ui/view/gridwin.cxx
index dd0d6d1..5c185bb 100644
--- a/sc/source/ui/view/gridwin.cxx
+++ b/sc/source/ui/view/gridwin.cxx
@@ -4325,8 +4325,18 @@ sal_Int8 ScGridWindow::DropTransferObj( ScTransferObj* 
pTransObj, SCCOL nDestPos
                 {
                     pView->MarkRange( aDest, false );
 
-                    SCCOL nDCol = pViewData->GetCurX() - aSource.aStart.Col() 
+ nCorrectCursorPosCol;
-                    SCROW nDRow = pViewData->GetCurY() - aSource.aStart.Row() 
+ nCorrectCursorPosRow;
+                    SCCOL nDCol;
+                    SCROW nDRow;
+                    if (pTransObj->WasSourceCursorInSelection())
+                    {
+                        nDCol = pTransObj->GetSourceCursorX() - 
aSource.aStart.Col() + nCorrectCursorPosCol;
+                        nDRow = pTransObj->GetSourceCursorY() - 
aSource.aStart.Row() + nCorrectCursorPosRow;
+                    }
+                    else
+                    {
+                        nDCol = 0;
+                        nDRow = 0;
+                    }
                     pView->SetCursor( aDest.aStart.Col() + nDCol, 
aDest.aStart.Row() + nDRow );
                 }
 
diff --git a/sc/source/ui/view/select.cxx b/sc/source/ui/view/select.cxx
index a9b4a20..b7a629a 100644
--- a/sc/source/ui/view/select.cxx
+++ b/sc/source/ui/view/select.cxx
@@ -198,6 +198,7 @@ void ScViewFunctionSet::BeginDrag()
                 SCCOL nHandleX = (nPosX >= (SCsCOL) nStartX) ? nPosX - nStartX 
: 0;
                 SCROW nHandleY = (nPosY >= (SCsROW) nStartY) ? nPosY - nStartY 
: 0;
                 pTransferObj->SetDragHandlePos( nHandleX, nHandleY );
+                pTransferObj->SetSourceCursorPos( pViewData->GetCurX(), 
pViewData->GetCurY() );
                 pTransferObj->SetVisibleTab( nTab );
 
                 pTransferObj->SetDragSource( pDocSh, rMark );
diff --git a/sc/source/ui/view/tabcont.cxx b/sc/source/ui/view/tabcont.cxx
index a2f5d10..7b55ed7 100644
--- a/sc/source/ui/view/tabcont.cxx
+++ b/sc/source/ui/view/tabcont.cxx
@@ -477,6 +477,8 @@ void ScTabControl::DoDrag( const vcl::Region& /* rRegion */ 
)
 
     pTransferObj->SetDragSource( pDocSh, aTabMark );
 
+    pTransferObj->SetSourceCursorPos( pViewData->GetCurX(), 
pViewData->GetCurY() );
+
     vcl::Window* pWindow = pViewData->GetActiveWin();
     SC_MOD()->SetDragObject( pTransferObj, nullptr );      // for internal D&D
     pTransferObj->StartDrag( pWindow, DND_ACTION_COPYMOVE | DND_ACTION_LINK );
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to