[Libreoffice-commits] core.git: Branch 'libreoffice-5-1' - sc/source
Caolán McNamara
caolanm at redhat.com
Wed Jun 29 10:12:04 UTC 2016
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 <caolanm at 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 <kyoshida at 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.mohrhard at 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 <ci at libreoffice.org>
Reviewed-by: Markus Mohrhard <markus.mohrhard at googlemail.com>
(cherry picked from commit f9b46bbd2446a6c9a0aaab31016536bda4a77294)
Reviewed-on: https://gerrit.libreoffice.org/26538
Reviewed-by: Eike Rathke <erack at redhat.com>
Tested-by: Eike Rathke <erack at 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 );
More information about the Libreoffice-commits
mailing list