diff options
author | Eike Rathke <erack@redhat.com> | 2016-07-29 13:30:07 +0200 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2016-07-30 20:33:22 +0000 |
commit | d460db76504378ed7e0ec10cf3cdd9b5f2b354df (patch) | |
tree | 28adfb7e06574551d5b3bd0d698367b67505ee64 | |
parent | 1144523f1404dc6532ced2c9c7ba9fffd37b3704 (diff) |
Resolves: tdf#60056 disallow Fill and Random when entire sheet is selected
This is a combination of 3 commits.
move range detection to ScViewData::SelectionFillDOOM()
(cherry picked from commit 4b90c9dc83d96908d3732d95e75c2f71d0f5d988)
Resolves: tdf#60056 disallow Fill when entire sheet is selected
(cherry picked from commit c729ee7622b1d54b2dc82b1807c68899efeab6d7)
disallow Random Number when entire sheet is selected, tdf#60056 related
(cherry picked from commit 77327759c9053da493430ee01b4d7fe98c174574)
866f84d72c27be962dbad8f8e4dcb345aa336bff
e9e229c3d3e5a5a7e3f3e90ebd181471927bd452
Change-Id: Ic5205428136fc323affed8d956d6ee0434d43988
Reviewed-on: https://gerrit.libreoffice.org/27690
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
-rw-r--r-- | sc/source/ui/docshell/docfunc.cxx | 5 | ||||
-rw-r--r-- | sc/source/ui/inc/viewdata.hxx | 2 | ||||
-rw-r--r-- | sc/source/ui/view/cellsh.cxx | 13 | ||||
-rw-r--r-- | sc/source/ui/view/cellsh1.cxx | 6 | ||||
-rw-r--r-- | sc/source/ui/view/viewdata.cxx | 15 |
5 files changed, 36 insertions, 5 deletions
diff --git a/sc/source/ui/docshell/docfunc.cxx b/sc/source/ui/docshell/docfunc.cxx index 6f923ba54515..4c4ede28575f 100644 --- a/sc/source/ui/docshell/docfunc.cxx +++ b/sc/source/ui/docshell/docfunc.cxx @@ -4604,6 +4604,11 @@ bool ScDocFunc::FillAuto( ScRange& rRange, const ScMarkData* pTabMark, FillDir e return false; } + // FID_FILL_... slots should already had been disabled, check here for API + // calls, no message. + if (ScViewData::SelectionFillDOOM( aDestArea)) + return false; + WaitObject aWait( ScDocShell::GetActiveDialogParent() ); ScDocument* pUndoDoc = nullptr; diff --git a/sc/source/ui/inc/viewdata.hxx b/sc/source/ui/inc/viewdata.hxx index c314a9d09731..75bcb41cece9 100644 --- a/sc/source/ui/inc/viewdata.hxx +++ b/sc/source/ui/inc/viewdata.hxx @@ -345,6 +345,8 @@ public: /// Disallow paste on Ctrl+A all selected. We'd go DOOM. bool SelectionForbidsPaste(); + /// Determine DOOM condition, i.e. from selected range. + static bool SelectionFillDOOM( const ScRange& rRange ); void SetFillMode( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow ); void SetDragMode( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow, diff --git a/sc/source/ui/view/cellsh.cxx b/sc/source/ui/view/cellsh.cxx index 6a11bfc22a3d..f8bcb6f6e4ce 100644 --- a/sc/source/ui/view/cellsh.cxx +++ b/sc/source/ui/view/cellsh.cxx @@ -129,6 +129,8 @@ void ScCellShell::GetBlockState( SfxItemSet& rSet ) case FID_FILL_TO_BOTTOM: // fill to top / bottom { bDisable = !bSimpleArea || (nRow1 == 0 && nRow2 == 0); + if (!bDisable && GetViewData()->SelectionForbidsPaste()) + bDisable = true; if ( !bDisable && bEditable ) { // do not damage matrix bDisable = pDoc->HasSelectedBlockMatrixFragment( @@ -139,6 +141,8 @@ void ScCellShell::GetBlockState( SfxItemSet& rSet ) case FID_FILL_TO_TOP: { bDisable = (!bSimpleArea) || (nRow1 == MAXROW && nRow2 == MAXROW); + if (!bDisable && GetViewData()->SelectionForbidsPaste()) + bDisable = true; if ( !bDisable && bEditable ) { // do not damage matrix bDisable = pDoc->HasSelectedBlockMatrixFragment( @@ -149,6 +153,8 @@ void ScCellShell::GetBlockState( SfxItemSet& rSet ) case FID_FILL_TO_RIGHT: // fill to left / right { bDisable = !bSimpleArea || (nCol1 == 0 && nCol2 == 0); + if (!bDisable && GetViewData()->SelectionForbidsPaste()) + bDisable = true; if ( !bDisable && bEditable ) { // do not damage matrix bDisable = pDoc->HasSelectedBlockMatrixFragment( @@ -159,6 +165,8 @@ void ScCellShell::GetBlockState( SfxItemSet& rSet ) case FID_FILL_TO_LEFT: { bDisable = (!bSimpleArea) || (nCol1 == MAXCOL && nCol2 == MAXCOL); + if (!bDisable && GetViewData()->SelectionForbidsPaste()) + bDisable = true; if ( !bDisable && bEditable ) { // do not damage matrix bDisable = pDoc->HasSelectedBlockMatrixFragment( @@ -168,6 +176,8 @@ void ScCellShell::GetBlockState( SfxItemSet& rSet ) break; case SID_RANDOM_NUMBER_GENERATOR_DIALOG: + bDisable = !bSimpleArea || GetViewData()->SelectionForbidsPaste(); + break; case SID_SAMPLING_DIALOG: case SID_DESCRIPTIVE_STATISTICS_DIALOG: case SID_ANALYSIS_OF_VARIANCE_DIALOG: @@ -185,6 +195,9 @@ void ScCellShell::GetBlockState( SfxItemSet& rSet ) else bDisable = (!bSimpleArea) || (nCol1 == nCol2 && nRow1 == nRow2); + if (!bDisable && GetViewData()->SelectionForbidsPaste()) + bDisable = true; + if ( !bDisable && bEditable && nWhich == FID_FILL_SERIES ) { // do not damage matrix bDisable = pDoc->HasSelectedBlockMatrixFragment( diff --git a/sc/source/ui/view/cellsh1.cxx b/sc/source/ui/view/cellsh1.cxx index 797bf8667caf..10a34303cabb 100644 --- a/sc/source/ui/view/cellsh1.cxx +++ b/sc/source/ui/view/cellsh1.cxx @@ -527,6 +527,12 @@ void ScCellShell::ExecuteEdit( SfxRequest& rReq ) case FID_FILL_SERIES: { + if (GetViewData()->SelectionForbidsPaste()) + // Slot should be already disabled, but in case it wasn't + // don't even attempt to do the evaluation and popup a + // dialog. + break; + SCCOL nStartCol; SCROW nStartRow; SCTAB nStartTab; diff --git a/sc/source/ui/view/viewdata.cxx b/sc/source/ui/view/viewdata.cxx index f8283f3486cb..236439303e99 100644 --- a/sc/source/ui/view/viewdata.cxx +++ b/sc/source/ui/view/viewdata.cxx @@ -851,14 +851,19 @@ bool ScViewData::IsMultiMarked() bool ScViewData::SelectionForbidsPaste() { - SCCOL nCol1, nCol2; - SCROW nRow1, nRow2; - SCTAB nTab1, nTab2; - ScMarkType eMarkType = GetSimpleArea( nCol1, nRow1, nTab1, nCol2, nRow2, nTab2); + ScRange aSelRange( ScAddress::UNINITIALIZED ); + ScMarkType eMarkType = GetSimpleArea( aSelRange); + return eMarkType != SC_MARK_MULTI && SelectionFillDOOM( aSelRange); +} + +// static +bool ScViewData::SelectionFillDOOM( const ScRange& rRange ) +{ /* TODO: it is still possible to select one row less than the entire sheet * and fool around. We could narrow this down to some "sane" value, just * what would be sane? At least this helps against the Ctrl+A cases. */ - return eMarkType != SC_MARK_MULTI && nCol1 == 0 && nCol2 == MAXCOL && nRow1 == 0 && nRow2 == MAXROW; + return rRange.aStart.Col() == 0 && rRange.aEnd.Col() == MAXCOL && + rRange.aStart.Row() == 0 && rRange.aEnd.Row() == MAXROW; } void ScViewData::SetFillMode( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow ) |