Change in core[master]: fdo#56098 paste special shift options incorrect/incomplete
Winfried Donkers (via Code Review)
gerrit at gerrit.libreoffice.org
Mon Jan 28 09:43:50 PST 2013
Hi,
I have submitted a patch for review:
https://gerrit.libreoffice.org/1903
To pull it, you can do:
git pull ssh://gerrit.libreoffice.org:29418/core refs/changes/03/1903/1
fdo#56098 paste special shift options incorrect/incomplete
Change-Id: Ic84ec07f4e0963ad1759036f1d7cbfa295289375
---
M sc/source/ui/view/cellsh1.cxx
1 file changed, 62 insertions(+), 20 deletions(-)
diff --git a/sc/source/ui/view/cellsh1.cxx b/sc/source/ui/view/cellsh1.cxx
index c22d91d..1d92f46 100644
--- a/sc/source/ui/view/cellsh1.cxx
+++ b/sc/source/ui/view/cellsh1.cxx
@@ -1259,29 +1259,71 @@
pDlg->SetOtherDoc( bOtherDoc );
// if ChangeTrack MoveMode disable
pDlg->SetChangeTrack( pDoc->GetChangeTrack() != NULL );
- // cut/move references may disable shift
- // directions if source and destination ranges intersect
- if ( !bOtherDoc )
+ // fdo#56098 disable shift if source and destination ranges intersect
+ if ( !bOtherDoc && pOwnClip )
{
- if ( pOwnClip && pOwnClip->GetDocument()->IsCutMode() )
+ ScViewData* pData = GetViewData();
+ if ( pData->GetMarkData().GetTableSelect( pData->GetTabNo() ) )
{
- ScViewData* pData = GetViewData();
- if ( pData->GetMarkData().GetTableSelect(
- pData->GetTabNo() ) )
+ SCCOL nStartX, nEndX, nClipStartX, nClipSizeX, nRangeSizeX;
+ SCROW nStartY, nEndY, nClipStartY, nClipSizeY, nRangeSizeY;
+ SCTAB nStartTab, nEndTab;
+ pOwnClip->GetDocument()->GetClipStart( nClipStartX, nClipStartY );
+ pOwnClip->GetDocument()->GetClipArea( nClipSizeX, nClipSizeY, sal_True );
+
+ if ( !( pData->GetSimpleArea( nStartX, nStartY, nStartTab, nEndX, nEndY, nEndTab ) == SC_MARK_SIMPLE && nStartTab == nEndTab ) )
{
- SCCOL nPosX = pData->GetCurX();
- SCROW nPosY = pData->GetCurY();
- SCCOL nClipSizeX;
- SCROW nClipSizeY;
- // for CutMode, filtered rows can always be included
- pOwnClip->GetDocument()->GetClipArea( nClipSizeX, nClipSizeY, sal_True );
- int nDisableShift = 0;
- if ( nPosX + 2 * nClipSizeX + 1 > MAXCOL ) // fdo#56098
- nDisableShift |= SC_CELL_SHIFT_DISABLE_RIGHT;
- if ( nPosY + 2 * nClipSizeY + 1 > MAXROW ) // fdo#56098
- nDisableShift |= SC_CELL_SHIFT_DISABLE_DOWN;
- if ( nDisableShift )
- pDlg->SetCellShiftDisabled( nDisableShift );
+ // the destination is not a simple range, so assume the destination as the current cell
+ nStartX = nEndX = pData->GetCurX();
+ nStartY = nEndY = pData->GetCurY();
+ }
+ // we now have clip- and range dimensions
+ // the size of the destination area is the larger of the two
+ nRangeSizeX = nClipSizeX >= nEndX - nStartX ? nClipSizeX : nEndX - nStartX;
+ nRangeSizeY = nClipSizeY >= nEndY - nStartY ? nClipSizeY : nEndY - nStartY;
+ if ( nStartX + nRangeSizeX >= nClipStartX &&
+ nStartX <= nClipStartX + nRangeSizeX &&
+ nStartY + nRangeSizeY >= nClipStartY &&
+ nStartY <= nClipStartY + nRangeSizeY )
+ pDlg->SetCellShiftDisabled( SC_CELL_SHIFT_DISABLE_DOWN | SC_CELL_SHIFT_DISABLE_RIGHT );
+ else
+ {
+ //no conflict with intersecting ranges,
+ //check if paste plus shift will fit on sheet
+ //and disable shift-option if so
+ int nDisableShiftX = 0;
+ int nDisableShiftY = 0;
+ //check if horizontal shift will fit
+ for ( SCROW nRow = nStartY;
+ !nDisableShiftX && nRow <= nStartY + nRangeSizeY;
+ nRow++ )
+ {
+ for ( SCCOL nCol = MAXCOL;
+ !nDisableShiftX && nCol >= MAXCOL - nRangeSizeX;
+ nCol-- )
+ {
+ ScAddress aAddress( nCol, nRow, nStartTab );
+ if ( pData->GetDocument()->GetCellType ( aAddress ) != CELLTYPE_NONE )
+ nDisableShiftX = SC_CELL_SHIFT_DISABLE_RIGHT;
+ }
+ }
+
+ //check if vertical shift will fit
+ for ( SCCOL nCol = nStartX;
+ !nDisableShiftY && nCol <= nStartX + nRangeSizeX;
+ nCol++ )
+ {
+ for ( SCROW nRow = MAXROW;
+ !nDisableShiftY && nRow >= MAXROW - nRangeSizeY;
+ nRow-- )
+ {
+ ScAddress aAddress( nCol, nRow, nStartTab );
+ if ( pData->GetDocument()->GetCellType ( aAddress ) != CELLTYPE_NONE )
+ nDisableShiftY = SC_CELL_SHIFT_DISABLE_DOWN;
+ }
+ }
+ if ( nDisableShiftX || nDisableShiftY )
+ pDlg->SetCellShiftDisabled( nDisableShiftX | nDisableShiftY );
}
}
}
--
To view, visit https://gerrit.libreoffice.org/1903
To unsubscribe, visit https://gerrit.libreoffice.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ic84ec07f4e0963ad1759036f1d7cbfa295289375
Gerrit-PatchSet: 1
Gerrit-Project: core
Gerrit-Branch: master
Gerrit-Owner: Winfried Donkers <osc at dci-electronics.nl>
More information about the LibreOffice
mailing list