sc/source/ui/docshell/dbdocfun.cxx |   18 +++++-----
 sc/source/ui/docshell/docfunc.cxx  |   50 ++++++++++++++---------------
 sc/source/ui/docshell/editable.cxx |   62 +++++++++++++++++--------------------
 sc/source/ui/docshell/impex.cxx    |    2 -
 sc/source/ui/inc/editable.hxx      |   44 +++++++++++++-------------
 sc/source/ui/view/cellsh1.cxx      |    4 +-
 sc/source/ui/view/cellsh3.cxx      |    2 -
 sc/source/ui/view/dbfunc.cxx       |    4 +-
 sc/source/ui/view/dbfunc3.cxx      |    2 -
 sc/source/ui/view/gridwin.cxx      |    2 -
 sc/source/ui/view/spelldialog.cxx  |    2 -
 sc/source/ui/view/viewfun2.cxx     |   12 +++----
 sc/source/ui/view/viewfun3.cxx     |    4 +-
 sc/source/ui/view/viewfun4.cxx     |    9 ++---
 sc/source/ui/view/viewfunc.cxx     |    8 ++--
 15 files changed, 112 insertions(+), 113 deletions(-)

New commits:
commit da42d0ef32fc9c970511c9f10995a854a421568b
Author:     Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk>
AuthorDate: Thu Aug 21 00:22:46 2025 +0200
Commit:     Miklos Vajna <vmik...@collabora.com>
CommitDate: Thu Sep 18 10:37:27 2025 +0200

    sc: change constructors for static methods in ScEditableTester
    
    All the different constructors make ScEditableTester hard to use
    as it is hard to determine what each constructor will trigger, so
    instead use properly named static methods to create the object, to
    make it easier to understand what was used.
    
    Change-Id: Ieaa20c4f0fd134bd65ffb4a4353c60ea9e0fc874
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/190202
    Tested-by: Jenkins
    Reviewed-by: Tomaž Vajngerl <qui...@gmail.com>
    (cherry picked from commit 24da8ee8221553b0aa3c91ce00663bf1a9ebba30)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/191087
    Reviewed-by: Miklos Vajna <vmik...@collabora.com>
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com>

diff --git a/sc/source/ui/docshell/dbdocfun.cxx 
b/sc/source/ui/docshell/dbdocfun.cxx
index bf6dd852614d..046abcaecaaf 100644
--- a/sc/source/ui/docshell/dbdocfun.cxx
+++ b/sc/source/ui/docshell/dbdocfun.cxx
@@ -513,8 +513,9 @@ bool ScDBDocFunc::Sort( SCTAB nTab, const ScSortParam& 
rSortParam,
         else
             nStartingColToEdit++;
     }
-    ScEditableTester aTester( rDoc, nTab, nStartingColToEdit, 
nStartingRowToEdit,
-            aLocalParam.nCol2, aLocalParam.nRow2, true /*bNoMatrixAtAll*/ );
+    ScEditableTester aTester = ScEditableTester::CreateAndTestBlock(
+            rDoc, nTab, nStartingColToEdit, nStartingRowToEdit,
+            aLocalParam.nCol2, aLocalParam.nRow2, true /*bNoMatrixAtAll*/);
     if (!aTester.IsEditable())
     {
         if (!bApi)
@@ -740,8 +741,9 @@ bool ScDBDocFunc::Query( SCTAB nTab, const ScQueryParam& 
rQueryParam,
             return false;
         }
 
-        ScEditableTester aTester( rDoc, nDestTab, 
aLocalParam.nCol1,aLocalParam.nRow1,
-                                                
aLocalParam.nCol2,aLocalParam.nRow2);
+        ScEditableTester aTester = ScEditableTester::CreateAndTestBlock(rDoc, 
nDestTab,
+                                    aLocalParam.nCol1, aLocalParam.nRow1,
+                                    aLocalParam.nCol2,aLocalParam.nRow2);
         if (!aTester.IsEditable())
         {
             if (!bApi)
@@ -1056,7 +1058,7 @@ void ScDBDocFunc::DoSubTotals( SCTAB nTab, const 
ScSubTotalParam& rParam,
         return;
     }
 
-    ScEditableTester aTester( rDoc, nTab, 0,rParam.nRow1+1, 
rDoc.MaxCol(),rDoc.MaxRow() );
+    ScEditableTester aTester = ScEditableTester::CreateAndTestBlock(rDoc, 
nTab, 0, rParam.nRow1 + 1, rDoc.MaxCol(), rDoc.MaxRow());
     if (!aTester.IsEditable())
     {
         if (!bApi)
@@ -1229,7 +1231,7 @@ bool isEditable(ScDocShell& rDocShell, const ScRangeList& 
rRanges, bool bApi,
     for (size_t i = 0, n = rRanges.size(); i < n; ++i)
     {
         const ScRange & r = rRanges[i];
-        ScEditableTester aTester(rDoc, r, eAction);
+        ScEditableTester aTester = ScEditableTester::CreateAndTestRange(rDoc, 
r, eAction);
         if (!aTester.IsEditable())
         {
             if (!bApi)
@@ -1283,7 +1285,7 @@ bool checkNewOutputRange(ScDPObject& rDPObj, ScDocShell& 
rDocShell, ScRange& rNe
 
     if (!rDoc.IsImportingXML())
     {
-        ScEditableTester aTester(rDoc, rNewOut, eAction);
+        ScEditableTester aTester = ScEditableTester::CreateAndTestRange(rDoc, 
rNewOut, eAction);
         if (!aTester.IsEditable())
         {
             //  destination area isn't editable
@@ -1544,7 +1546,7 @@ bool ScDBDocFunc::CreatePivotTable(const ScDPObject& 
rDPObj, bool bRecord, bool
 
     if (!rDoc.IsImportingXML())
     {
-        ScEditableTester aTester(rDoc, aNewOut, sc::EditAction::Unknown);
+        ScEditableTester aTester = ScEditableTester::CreateAndTestRange(rDoc, 
aNewOut, sc::EditAction::Unknown);
         if (!aTester.IsEditable())
         {
             //  destination area isn't editable
diff --git a/sc/source/ui/docshell/docfunc.cxx 
b/sc/source/ui/docshell/docfunc.cxx
index 0ec3c510f631..a8eb36617a0d 100644
--- a/sc/source/ui/docshell/docfunc.cxx
+++ b/sc/source/ui/docshell/docfunc.cxx
@@ -598,7 +598,7 @@ bool ScDocFunc::DeleteContents(
     if (bRecord && !rDoc.IsUndoEnabled())
         bRecord = false;
 
-    ScEditableTester aTester( rDoc, rMark );
+    ScEditableTester aTester = ScEditableTester::CreateAndTestSelection(rDoc, 
rMark);
     if (!aTester.IsEditable())
     {
         if (!bApi)
@@ -701,7 +701,7 @@ bool ScDocFunc::DeleteCell(
     if (bRecord && !rDoc.IsUndoEnabled())
         bRecord = false;
 
-    ScEditableTester aTester(rDoc, rPos.Col(), rPos.Row(), rPos.Col(), 
rPos.Row(), rMark);
+    ScEditableTester aTester = 
ScEditableTester::CreateAndTestSelectedBlock(rDoc, rPos.Col(), rPos.Row(), 
rPos.Col(), rPos.Row(), rMark);
     if (!aTester.IsEditable())
     {
         rDocShell.ErrorMessage(aTester.GetMessageId());
@@ -769,7 +769,7 @@ bool ScDocFunc::TransliterateText( const ScMarkData& rMark, 
TransliterationFlags
     if (!rDoc.IsUndoEnabled())
         bRecord = false;
 
-    ScEditableTester aTester( rDoc, rMark );
+    ScEditableTester aTester = ScEditableTester::CreateAndTestSelection(rDoc, 
rMark);
     if (!aTester.IsEditable())
     {
         if (!bApi)
@@ -823,7 +823,7 @@ bool ScDocFunc::SetNormalString( bool& o_rbNumFmtSet, const 
ScAddress& rPos, con
     ScDocument& rDoc = rDocShell.GetDocument();
 
     bool bUndo(rDoc.IsUndoEnabled());
-    ScEditableTester aTester( rDoc, rPos.Tab(), rPos.Col(),rPos.Row(), 
rPos.Col(),rPos.Row() );
+    ScEditableTester aTester = ScEditableTester::CreateAndTestBlock(rDoc, 
rPos.Tab(), rPos.Col(), rPos.Row(), rPos.Col(), rPos.Row());
     if (!aTester.IsEditable())
     {
         if (!bApi)
@@ -1341,7 +1341,7 @@ void ScDocFunc::SetNoteText( const ScAddress& rPos, const 
OUString& rText, bool
     ScDocShellModificator aModificator( rDocShell );
 
     ScDocument& rDoc = rDocShell.GetDocument();
-    ScEditableTester aTester( rDoc, rPos.Tab(), rPos.Col(),rPos.Row(), 
rPos.Col(),rPos.Row() );
+    ScEditableTester aTester = ScEditableTester::CreateAndTestBlock(rDoc, 
rPos.Tab(), rPos.Col(), rPos.Row(), rPos.Col(), rPos.Row());
     if (!aTester.IsEditable())
     {
         if (!bApi)
@@ -1366,7 +1366,7 @@ void ScDocFunc::ReplaceNote( const ScAddress& rPos, const 
OUString& rNoteText, c
 {
     ScDocShellModificator aModificator( rDocShell );
     ScDocument& rDoc = rDocShell.GetDocument();
-    ScEditableTester aTester( rDoc, rPos.Tab(), rPos.Col(),rPos.Row(), 
rPos.Col(),rPos.Row() );
+    ScEditableTester aTester = ScEditableTester::CreateAndTestBlock(rDoc, 
rPos.Tab(), rPos.Col(), rPos.Row(), rPos.Col(), rPos.Row());
     if (aTester.IsEditable())
     {
         ScDrawLayer* pDrawLayer = rDoc.GetDrawLayer();
@@ -1904,23 +1904,23 @@ bool ScDocFunc::InsertCells( const ScRange& rRange, 
const ScMarkData* pTabMark,
     switch (eCmd)
     {
         case INS_INSCOLS_BEFORE:
-            aTester = ScEditableTester(
+            aTester = ScEditableTester::CreateAndTestBlockForAction(
                 rDoc, sc::EditAction::InsertColumnsBefore, nMergeTestStartCol, 
0, nMergeTestEndCol, rDoc.MaxRow(), aMark);
             break;
         case INS_INSCOLS_AFTER:
-            aTester = ScEditableTester(
+            aTester = ScEditableTester::CreateAndTestBlockForAction(
                 rDoc, sc::EditAction::InsertColumnsAfter, nMergeTestStartCol, 
0, nMergeTestEndCol, rDoc.MaxRow(), aMark);
             break;
         case INS_INSROWS_BEFORE:
-            aTester = ScEditableTester(
+            aTester = ScEditableTester::CreateAndTestBlockForAction(
                 rDoc, sc::EditAction::InsertRowsBefore, 0, nMergeTestStartRow, 
rDoc.MaxCol(), nMergeTestEndRow, aMark);
             break;
         case INS_INSROWS_AFTER:
-            aTester = ScEditableTester(
+            aTester = ScEditableTester::CreateAndTestBlockForAction(
                 rDoc, sc::EditAction::InsertRowsAfter, 0, nMergeTestStartRow, 
rDoc.MaxCol(), nMergeTestEndRow, aMark);
             break;
         default:
-            aTester = ScEditableTester(
+            aTester = ScEditableTester::CreateAndTestSelectedBlock(
                 rDoc, nMergeTestStartCol, nMergeTestStartRow, nEditTestEndCol, 
nEditTestEndRow, aMark);
     }
 
@@ -2406,15 +2406,15 @@ bool ScDocFunc::DeleteCells( const ScRange& rRange, 
const ScMarkData* pTabMark,
     switch (eCmd)
     {
         case DelCellCmd::Cols:
-            aTester = ScEditableTester(
+            aTester = ScEditableTester::CreateAndTestBlockForAction(
                 rDoc, sc::EditAction::DeleteColumns, nUndoStartCol, 0, 
nUndoEndCol, rDoc.MaxRow(), aMark);
             break;
         case DelCellCmd::Rows:
-            aTester = ScEditableTester(
+            aTester = ScEditableTester::CreateAndTestBlockForAction(
                 rDoc, sc::EditAction::DeleteRows, 0, nUndoStartRow, 
rDoc.MaxCol(), nUndoEndRow, aMark);
             break;
         default:
-            aTester = ScEditableTester(
+            aTester = ScEditableTester::CreateAndTestSelectedBlock(
                 rDoc, nUndoStartCol, nUndoStartRow, nEditTestEndX, 
nEditTestEndY, aMark);
     }
 
@@ -4120,7 +4120,7 @@ void ScDocFunc::ClearItems( const ScMarkData& rMark, 
const sal_uInt16* pWhich, b
 
     ScDocument& rDoc = rDocShell.GetDocument();
     bool bUndo (rDoc.IsUndoEnabled());
-    ScEditableTester aTester( rDoc, rMark );
+    ScEditableTester aTester = ScEditableTester::CreateAndTestSelection(rDoc, 
rMark);
     if (!aTester.IsEditable())
     {
         if (!bApi)
@@ -4164,7 +4164,7 @@ bool ScDocFunc::ChangeIndent( const ScMarkData& rMark, 
bool bIncrement, bool bAp
 
     ScDocument& rDoc = rDocShell.GetDocument();
     bool bUndo(rDoc.IsUndoEnabled());
-    ScEditableTester aTester( rDoc, rMark );
+    ScEditableTester aTester = ScEditableTester::CreateAndTestSelection(rDoc, 
rMark);
     if (!aTester.IsEditable())
     {
         if (!bApi)
@@ -4253,7 +4253,7 @@ bool ScDocFunc::AutoFormat( const ScRange& rRange, const 
ScMarkData* pTabMark,
     }
 
     ScAutoFormat* pAutoFormat = ScGlobal::GetOrCreateAutoFormat();
-    ScEditableTester aTester( rDoc, nStartCol,nStartRow, nEndCol,nEndRow, 
aMark );
+    ScEditableTester aTester = 
ScEditableTester::CreateAndTestSelectedBlock(rDoc, nStartCol, nStartRow, 
nEndCol, nEndRow, aMark);
     if ( nFormatNo < pAutoFormat->size() && aTester.IsEditable() )
     {
         weld::WaitObject aWait( ScDocShell::GetActiveDialogParent() );
@@ -4375,7 +4375,7 @@ bool ScDocFunc::EnterMatrix( const ScRange& rRange, const 
ScMarkData* pTabMark,
             aMark.SelectTable( nTab, true );
     }
 
-    ScEditableTester aTester( rDoc, nStartCol,nStartRow, nEndCol,nEndRow, 
aMark );
+    ScEditableTester aTester = 
ScEditableTester::CreateAndTestSelectedBlock(rDoc, nStartCol, nStartRow, 
nEndCol, nEndRow, aMark);
     if ( aTester.IsEditable() )
     {
         weld::WaitObject aWait( ScDocShell::GetActiveDialogParent() );
@@ -4462,7 +4462,7 @@ bool ScDocFunc::TabOp( const ScRange& rRange, const 
ScMarkData* pTabMark,
             aMark.SelectTable( nTab, true );
     }
 
-    ScEditableTester aTester( rDoc, nStartCol,nStartRow, nEndCol,nEndRow, 
aMark );
+    ScEditableTester aTester = 
ScEditableTester::CreateAndTestSelectedBlock(rDoc, nStartCol, nStartRow, 
nEndCol, nEndRow, aMark);
     if ( aTester.IsEditable() )
     {
         weld::WaitObject aWait( ScDocShell::GetActiveDialogParent() );
@@ -4606,7 +4606,7 @@ bool ScDocFunc::FillSimple( const ScRange& rRange, const 
ScMarkData* pTabMark,
             aMark.SelectTable( nTab, true );
     }
 
-    ScEditableTester aTester( rDoc, nStartCol,nStartRow, nEndCol,nEndRow, 
aMark );
+    ScEditableTester aTester = 
ScEditableTester::CreateAndTestSelectedBlock(rDoc, nStartCol, nStartRow, 
nEndCol, nEndRow, aMark);
     if ( aTester.IsEditable() )
     {
         weld::WaitObject aWait( ScDocShell::GetActiveDialogParent() );
@@ -4719,7 +4719,7 @@ bool ScDocFunc::FillSeries( const ScRange& rRange, const 
ScMarkData* pTabMark,
             aMark.SelectTable( nTab, true );
     }
 
-    ScEditableTester aTester( rDoc, nStartCol,nStartRow, nEndCol,nEndRow, 
aMark );
+    ScEditableTester aTester = 
ScEditableTester::CreateAndTestSelectedBlock(rDoc, nStartCol, nStartRow, 
nEndCol, nEndRow, aMark);
     if ( aTester.IsEditable() )
     {
         weld::WaitObject aWait( ScDocShell::GetActiveDialogParent() );
@@ -4891,7 +4891,7 @@ bool ScDocFunc::FillAuto( ScRange& rRange, const 
ScMarkData* pTabMark, FillDir e
     //!     Source range can be protected !!!
     //!     but can't contain matrix fragments !!!
 
-    ScEditableTester aTester( rDoc, aDestArea, sc::EditAction::Unknown );
+    ScEditableTester aTester = ScEditableTester::CreateAndTestRange(rDoc, 
aDestArea, sc::EditAction::Unknown);
     if ( !aTester.IsEditable() )
     {
         if (!bApi)
@@ -4991,7 +4991,7 @@ bool ScDocFunc::MergeCells( const ScCellMergeOption& 
rOption, bool bContents, bo
 
     for (const auto& rTab : rOption.maTabs)
     {
-        ScEditableTester aTester( rDoc, rTab, nStartCol, nStartRow, nEndCol, 
nEndRow );
+        ScEditableTester aTester = ScEditableTester::CreateAndTestBlock(rDoc, 
rTab, nStartCol, nStartRow, nEndCol, nEndRow);
         if (!aTester.IsEditable())
         {
             if (!bApi)
@@ -5430,7 +5430,7 @@ bool ScDocFunc::InsertNameList( const ScAddress& 
rStartPos, bool bApi )
         SCCOL nEndCol = nStartCol + 1;
         SCROW nEndRow = nStartRow + static_cast<SCROW>(nValidCount) - 1;
 
-        ScEditableTester aTester( rDoc, nTab, nStartCol,nStartRow, 
nEndCol,nEndRow );
+        ScEditableTester aTester = ScEditableTester::CreateAndTestBlock(rDoc, 
nTab, nStartCol, nStartRow, nEndCol, nEndRow);
         if (aTester.IsEditable())
         {
             ScDocumentUniquePtr pUndoDoc;
@@ -5744,7 +5744,7 @@ void ScDocFunc::ConvertFormulaToValue( const ScRange& 
rRange, bool bInteraction
     if (!rDoc.IsUndoEnabled())
         bRecord = false;
 
-    ScEditableTester aTester(rDoc, rRange, sc::EditAction::Unknown);
+    ScEditableTester aTester = ScEditableTester::CreateAndTestRange(rDoc, 
rRange, sc::EditAction::Unknown);
     if (!aTester.IsEditable())
     {
         if (bInteraction)
diff --git a/sc/source/ui/docshell/editable.cxx 
b/sc/source/ui/docshell/editable.cxx
index 357897470aa1..c10d0e0d4e21 100644
--- a/sc/source/ui/docshell/editable.cxx
+++ b/sc/source/ui/docshell/editable.cxx
@@ -22,65 +22,61 @@
 #include <viewfunc.hxx>
 #include <globstr.hrc>
 
-ScEditableTester::ScEditableTester() :
-    mbIsEditable(true),
-    mbOnlyMatrix(true)
-{
-}
+ScEditableTester::ScEditableTester() = default;
 
-ScEditableTester::ScEditableTester( const ScDocument& rDoc, SCTAB nTab,
-        SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow, bool 
bNoMatrixAtAll ) :
-    mbIsEditable(true),
-    mbOnlyMatrix(true)
+ScEditableTester ScEditableTester::CreateAndTestBlock(const ScDocument& rDoc, 
SCTAB nTab, SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow, 
bool bNoMatrixAtAll)
 {
-    TestBlock( rDoc, nTab, nStartCol, nStartRow, nEndCol, nEndRow, 
bNoMatrixAtAll );
+    ScEditableTester aTester;
+    aTester.TestBlock(rDoc, nTab, nStartCol, nStartRow, nEndCol, nEndRow, 
bNoMatrixAtAll);
+    return aTester;
 }
 
-ScEditableTester::ScEditableTester( const ScDocument& rDoc,
+ScEditableTester ScEditableTester::CreateAndTestSelectedBlock(const 
ScDocument& rDoc,
                         SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW 
nEndRow,
-                        const ScMarkData& rMark ) :
-    mbIsEditable(true),
-    mbOnlyMatrix(true)
+                        const ScMarkData& rMark)
 {
-    TestSelectedBlock( rDoc, nStartCol, nStartRow, nEndCol, nEndRow, rMark );
+    ScEditableTester aTester;
+    aTester.TestSelectedBlock(rDoc, nStartCol, nStartRow, nEndCol, nEndRow, 
rMark);
+    return aTester;
 }
 
-ScEditableTester::ScEditableTester( const ScDocument& rDoc, const ScRange& 
rRange, sc::EditAction eAction ) :
-    mbIsEditable(true),
-    mbOnlyMatrix(true)
+ScEditableTester ScEditableTester::CreateAndTestRange(const ScDocument& rDoc, 
const ScRange& rRange, sc::EditAction eAction)
 {
+    ScEditableTester aTester;
     if (eAction == sc::EditAction::Unknown)
-        TestRange(rDoc, rRange);
+        aTester.TestRange(rDoc, rRange);
     else
-        TestRangeForAction( rDoc, rRange, eAction );
+        aTester.TestRangeForAction( rDoc, rRange, eAction );
+    return aTester;
 }
 
-ScEditableTester::ScEditableTester( const ScDocument& rDoc, const ScMarkData& 
rMark ) :
-    mbIsEditable(true),
-    mbOnlyMatrix(true)
+ScEditableTester ScEditableTester::CreateAndTestSelection(const ScDocument& 
rDoc, const ScMarkData& rMark)
 {
-    TestSelection( rDoc, rMark );
+    ScEditableTester aTester;
+    aTester.TestSelection(rDoc, rMark);
+    return aTester;
 }
 
-ScEditableTester::ScEditableTester( ScViewFunc* pView ) :
-    mbIsEditable(true),
-    mbOnlyMatrix(true)
+ScEditableTester ScEditableTester::CreateAndTestView(ScViewFunc* pView)
 {
+    ScEditableTester aTester;
     bool bThisMatrix;
     if ( !pView->SelectionEditable( &bThisMatrix ) )
     {
-        mbIsEditable = false;
+        aTester.mbIsEditable = false;
         if ( !bThisMatrix )
-            mbOnlyMatrix = false;
+            aTester.mbOnlyMatrix = false;
     }
+    return aTester;
 }
 
-ScEditableTester::ScEditableTester(
+ScEditableTester ScEditableTester::CreateAndTestBlockForAction(
     const ScDocument& rDoc, sc::EditAction eAction, SCCOL nStartCol, SCROW 
nStartRow,
-    SCCOL nEndCol, SCROW nEndRow, const ScMarkData& rMark ) :
-    ScEditableTester()
+    SCCOL nEndCol, SCROW nEndRow, const ScMarkData& rMark )
 {
-    TestBlockForAction(rDoc, eAction, nStartCol, nStartRow, nEndCol, nEndRow, 
rMark);
+    ScEditableTester aTester;
+    aTester.TestBlockForAction(rDoc, eAction, nStartCol, nStartRow, nEndCol, 
nEndRow, rMark);
+    return aTester;
 }
 
 void ScEditableTester::TestBlock( const ScDocument& rDoc, SCTAB nTab,
diff --git a/sc/source/ui/docshell/impex.cxx b/sc/source/ui/docshell/impex.cxx
index 98e05311c356..b9d453fc56e2 100644
--- a/sc/source/ui/docshell/impex.cxx
+++ b/sc/source/ui/docshell/impex.cxx
@@ -230,7 +230,7 @@ bool ScImportExport::StartPaste()
 {
     if ( !bAll )
     {
-        ScEditableTester aTester( rDoc, aRange, sc::EditAction::Unknown );
+        ScEditableTester aTester = ScEditableTester::CreateAndTestRange(rDoc, 
aRange, sc::EditAction::Unknown);
         if ( !aTester.IsEditable() )
         {
             std::unique_ptr<weld::MessageDialog> 
xInfoBox(Application::CreateMessageDialog(ScDocShell::GetActiveDialogParent(),
diff --git a/sc/source/ui/inc/editable.hxx b/sc/source/ui/inc/editable.hxx
index c5deab9ae699..5128fb47301d 100644
--- a/sc/source/ui/inc/editable.hxx
+++ b/sc/source/ui/inc/editable.hxx
@@ -27,44 +27,44 @@ class ScViewFunc;
 class ScMarkData;
 
 namespace sc {
-
 enum class EditAction;
-
 }
 
 class ScEditableTester
 {
-    bool mbIsEditable;
-    bool mbOnlyMatrix;
+private:
+    bool mbIsEditable = true;
+    bool mbOnlyMatrix = true;
 
 public:
-            ScEditableTester();
+    ScEditableTester();
+
+    // Enable move constructor
+    ScEditableTester(ScEditableTester&& rOther) noexcept = default;
 
-            // calls TestBlock
-            /** @param  bNoMatrixAtAll
-                        TRUE if there must not be any matrix, not even entirely
-                        contained; for example in sorting. */
-            ScEditableTester( const ScDocument& rDoc, SCTAB nTab,
+    // Allow copy assignment
+    ScEditableTester& operator=(const ScEditableTester& rOther) = default;
+
+    /** @param  bNoMatrixAtAll
+                TRUE if there must not be any matrix, not even entirely
+                contained; for example in sorting. */
+    static ScEditableTester CreateAndTestBlock(const ScDocument& rDoc, SCTAB 
nTab,
                         SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW 
nEndRow,
-                        bool bNoMatrixAtAll = false );
+                        bool bNoMatrixAtAll = false);
 
-            // calls TestSelectedBlock
-            ScEditableTester( const ScDocument& rDoc,
+    static ScEditableTester CreateAndTestSelectedBlock(const ScDocument& rDoc,
                         SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW 
nEndRow,
-                        const ScMarkData& rMark );
+                        const ScMarkData& rMark);
 
-            // calls TestRange
-            ScEditableTester( const ScDocument& rDoc, const ScRange& rRange, 
sc::EditAction eAction );
+    static ScEditableTester CreateAndTestRange(const ScDocument& rDoc, const 
ScRange& rRange, sc::EditAction eAction);
 
-            // calls TestSelection
-            ScEditableTester( const ScDocument& rDoc, const ScMarkData& rMark 
);
+    static ScEditableTester CreateAndTestSelection(const ScDocument& rDoc, 
const ScMarkData& rMark);
 
-            // calls TestView
-            ScEditableTester( ScViewFunc* pView );
+    static ScEditableTester CreateAndTestView(ScViewFunc* pView);
 
-            ScEditableTester(
+    static ScEditableTester CreateAndTestBlockForAction(
                 const ScDocument& rDoc, sc::EditAction eAction, SCCOL 
nStartCol,
-                SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow, const 
ScMarkData& rMark );
+                SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow, const 
ScMarkData& rMark);
 
             // Several calls to the Test... methods check if *all* of the 
ranges
             // are editable. For several independent checks, Reset() has to be 
used.
diff --git a/sc/source/ui/view/cellsh1.cxx b/sc/source/ui/view/cellsh1.cxx
index 65b75608468c..9d53ed8739ef 100644
--- a/sc/source/ui/view/cellsh1.cxx
+++ b/sc/source/ui/view/cellsh1.cxx
@@ -484,7 +484,7 @@ void ScCellShell::ExecuteEdit( SfxRequest& rReq )
                 }
                 else
                 {
-                    ScEditableTester aTester( pTabViewShell );
+                    ScEditableTester aTester = 
ScEditableTester::CreateAndTestView(pTabViewShell);
                     if (aTester.IsEditable())
                     {
                         ScAbstractDialogFactory* pFact = 
ScAbstractDialogFactory::Create();
@@ -1562,7 +1562,7 @@ void ScCellShell::ExecuteEdit( SfxRequest& rReq )
                     }
                     else
                     {
-                        ScEditableTester aTester( pTabViewShell );
+                        ScEditableTester aTester = 
ScEditableTester::CreateAndTestView(pTabViewShell);
                         if (aTester.IsEditable())
                         {
                             ScAbstractDialogFactory* pFact = 
ScAbstractDialogFactory::Create();
diff --git a/sc/source/ui/view/cellsh3.cxx b/sc/source/ui/view/cellsh3.cxx
index ccd9cfa7557f..879ede8c1e44 100644
--- a/sc/source/ui/view/cellsh3.cxx
+++ b/sc/source/ui/view/cellsh3.cxx
@@ -1024,7 +1024,7 @@ void ScCellShell::Execute( SfxRequest& rReq )
 
                         if ( pDlg->Execute() == RET_OK )
                         {
-                            ScEditableTester aTester( pTabViewShell );
+                            ScEditableTester aTester = 
ScEditableTester::CreateAndTestView(pTabViewShell);
                             if ( !aTester.IsEditable() )
                             {
                                 
pTabViewShell->ErrorMessage(aTester.GetMessageId());
diff --git a/sc/source/ui/view/dbfunc.cxx b/sc/source/ui/view/dbfunc.cxx
index 8071b19313e6..ba1908d43f17 100644
--- a/sc/source/ui/view/dbfunc.cxx
+++ b/sc/source/ui/view/dbfunc.cxx
@@ -452,8 +452,8 @@ bool ScDBFunc::ImportData( const ScImportParam& rParam )
 {
     ScDocument& rDoc = GetViewData().GetDocument();
 
-    ScEditableTester aTester( rDoc, GetViewData().CurrentTabForData(), 
rParam.nCol1,rParam.nRow1,
-                                                            
rParam.nCol2,rParam.nRow2 );
+    ScEditableTester aTester = ScEditableTester::CreateAndTestBlock(rDoc, 
GetViewData().CurrentTabForData(), 
+                                    rParam.nCol1, rParam.nRow1, rParam.nCol2, 
rParam.nRow2);
     if ( !aTester.IsEditable() )
     {
         ErrorMessage(aTester.GetMessageId());
diff --git a/sc/source/ui/view/dbfunc3.cxx b/sc/source/ui/view/dbfunc3.cxx
index 5788c4a39be9..55fa29a66cf0 100644
--- a/sc/source/ui/view/dbfunc3.cxx
+++ b/sc/source/ui/view/dbfunc3.cxx
@@ -447,7 +447,7 @@ void ScDBFunc::DoSubTotals( const ScSubTotalParam& rParam, 
bool bRecord,
         return;
     }
 
-    ScEditableTester aTester( rDoc, nTab, 0,rParam.nRow1+1, 
rDoc.MaxCol(),rDoc.MaxRow() );
+    ScEditableTester aTester = ScEditableTester::CreateAndTestBlock(rDoc, 
nTab, 0, rParam.nRow1 + 1, rDoc.MaxCol(), rDoc.MaxRow());
     if (!aTester.IsEditable())
     {
         ErrorMessage(aTester.GetMessageId());
diff --git a/sc/source/ui/view/gridwin.cxx b/sc/source/ui/view/gridwin.cxx
index cf786ea0529b..e9f835751bb9 100644
--- a/sc/source/ui/view/gridwin.cxx
+++ b/sc/source/ui/view/gridwin.cxx
@@ -4396,7 +4396,7 @@ sal_Int8 ScGridWindow::AcceptDrop( const AcceptDropEvent& 
rEvt )
                     SCTAB nTab = mrViewData.CurrentTabForData();
                     ScDocument& rDoc = mrViewData.GetDocument();
 
-                    ScEditableTester aTester( rDoc, nTab, nPosX,nPosY, 
nPosX,nPosY );
+                    ScEditableTester aTester = 
ScEditableTester::CreateAndTestBlock(rDoc, nTab, nPosX, nPosY, nPosX, nPosY);
                     if ( !aTester.IsFormatEditable() )
                         nRet = DND_ACTION_NONE;             // forbidden
                 }
diff --git a/sc/source/ui/view/spelldialog.cxx 
b/sc/source/ui/view/spelldialog.cxx
index b8dfaa9e8553..40fffa485495 100644
--- a/sc/source/ui/view/spelldialog.cxx
+++ b/sc/source/ui/view/spelldialog.cxx
@@ -198,7 +198,7 @@ void ScSpellDialogChildWindow::Init()
         case SC_SELECTTYPE_SHEET:
         {
             // test if there is something editable
-            ScEditableTester aTester( *mpDoc, rMarkData );
+            ScEditableTester aTester = 
ScEditableTester::CreateAndTestSelection(*mpDoc, rMarkData);
             if( !aTester.IsEditable() )
             {
                 // #i85751# Don't show an ErrorMessage here, because the vcl
diff --git a/sc/source/ui/view/viewfun2.cxx b/sc/source/ui/view/viewfun2.cxx
index 73098abe894a..5f8ef60bfe90 100644
--- a/sc/source/ui/view/viewfun2.cxx
+++ b/sc/source/ui/view/viewfun2.cxx
@@ -1184,7 +1184,7 @@ void ScViewFunc::MergeCells( bool bApi, bool bDoContents, 
bool bCenter,
 {
     //  Editable- and Being-Nested- test must be at the beginning (in DocFunc 
too),
     //  so that the Contents-QueryBox won't appear
-    ScEditableTester aTester( this );
+    ScEditableTester aTester = ScEditableTester::CreateAndTestView(this);
     if (!aTester.IsEditable())
     {
         ErrorMessage(aTester.GetMessageId());
@@ -1365,7 +1365,7 @@ static bool lcl_extendMergeRange(ScCellMergeOption& 
rOption, const ScRange& rRan
 bool ScViewFunc::RemoveMerge()
 {
     ScRange aRange;
-    ScEditableTester aTester( this );
+    ScEditableTester aTester = ScEditableTester::CreateAndTestView(this);
     if (!aTester.IsEditable())
     {
         ErrorMessage(aTester.GetMessageId());
@@ -1699,7 +1699,7 @@ void ScViewFunc::CopyAutoSpellData( FillDir eDir, SCCOL 
nStartCol, SCROW nStartR
 void ScViewFunc::FillTab( InsertDeleteFlags nFlags, ScPasteFunc nFunction, 
bool bSkipEmpty, bool bAsLink )
 {
     //! allow source sheet to be protected
-    ScEditableTester aTester( this );
+    ScEditableTester aTester = ScEditableTester::CreateAndTestView(this);
     if (!aTester.IsEditable())
     {
         ErrorMessage(aTester.GetMessageId());
@@ -2281,7 +2281,7 @@ void ScViewFunc::Solve( const ScSolveParam& rParam )
     SCROW nDestRow = rParam.aRefVariableCell.Row();
     SCTAB nDestTab = rParam.aRefVariableCell.Tab();
 
-    ScEditableTester aTester( rDoc, nDestTab, nDestCol,nDestRow, 
nDestCol,nDestRow );
+    ScEditableTester aTester = ScEditableTester::CreateAndTestBlock(rDoc, 
nDestTab, nDestCol, nDestRow, nDestCol, nDestRow);
     if (!aTester.IsEditable())
     {
         ErrorMessage(aTester.GetMessageId());
@@ -2379,7 +2379,7 @@ void ScViewFunc::MakeScenario( const OUString& rName, 
const OUString& rComment,
 
 void ScViewFunc::ExtendScenario()
 {
-    ScEditableTester aTester( this );
+    ScEditableTester aTester = ScEditableTester::CreateAndTestView(this);
     if (!aTester.IsEditable())
     {
         ErrorMessage(aTester.GetMessageId());
@@ -3312,7 +3312,7 @@ void ScViewFunc::HideTable( const ScMarkData& rMark, 
SCTAB nTabToSelect )
 
 void ScViewFunc::InsertSpecialChar( const OUString& rStr, const vcl::Font& 
rFont )
 {
-    ScEditableTester aTester( this );
+    ScEditableTester aTester = ScEditableTester::CreateAndTestView(this);
     if (!aTester.IsEditable())
     {
         ErrorMessage(aTester.GetMessageId());
diff --git a/sc/source/ui/view/viewfun3.cxx b/sc/source/ui/view/viewfun3.cxx
index 3f5d0125953a..f5fe10d47d51 100644
--- a/sc/source/ui/view/viewfun3.cxx
+++ b/sc/source/ui/view/viewfun3.cxx
@@ -93,7 +93,7 @@ void ScViewFunc::CutToClip()
 {
     UpdateInputLine();
 
-    ScEditableTester aTester( this );
+    ScEditableTester aTester = ScEditableTester::CreateAndTestView(this);
     if (!aTester.IsEditable())                  // selection editable?
     {
         ErrorMessage( aTester.GetMessageId() );
@@ -1211,7 +1211,7 @@ bool ScViewFunc::PasteFromClip( InsertDeleteFlags nFlags, 
ScDocument* pClipDoc,
 
         //  check cell-protection
 
-    ScEditableTester aTester( rDoc, nStartTab, nStartCol,nStartRow, 
nUndoEndCol,nUndoEndRow );
+    ScEditableTester aTester = ScEditableTester::CreateAndTestBlock(rDoc, 
nStartTab, nStartCol, nStartRow, nUndoEndCol, nUndoEndRow);
     if (!aTester.IsEditable())
     {
         ErrorMessage(aTester.GetMessageId());
diff --git a/sc/source/ui/view/viewfun4.cxx b/sc/source/ui/view/viewfun4.cxx
index fbba8b46c2e0..2a6b3c6020bd 100644
--- a/sc/source/ui/view/viewfun4.cxx
+++ b/sc/source/ui/view/viewfun4.cxx
@@ -198,8 +198,9 @@ void ScViewFunc::DoRefConversion()
         aMarkRange = ScRange( GetViewData().GetCurX(),
             GetViewData().GetCurY(), GetViewData().CurrentTabForData() );
     }
-    ScEditableTester aTester( rDoc, aMarkRange.aStart.Col(), 
aMarkRange.aStart.Row(),
-                            aMarkRange.aEnd.Col(), aMarkRange.aEnd.Row(),rMark 
);
+    ScEditableTester aTester = ScEditableTester::CreateAndTestSelectedBlock(
+                                rDoc, aMarkRange.aStart.Col(), 
aMarkRange.aStart.Row(),
+                                aMarkRange.aEnd.Col(), aMarkRange.aEnd.Row(), 
rMark);
     if (!aTester.IsEditable())
     {
         ErrorMessage(aTester.GetMessageId());
@@ -340,7 +341,7 @@ void ScViewFunc::DoThesaurus()
     nTab = GetViewData().CurrentTabForData();
 
     ScAddress aPos(nCol, nRow, nTab);
-    ScEditableTester aTester( rDoc, nCol, nRow, nCol, nRow, rMark );
+    ScEditableTester aTester = 
ScEditableTester::CreateAndTestSelectedBlock(rDoc, nCol, nRow, nCol, nRow, 
rMark);
     if (!aTester.IsEditable())
     {
         ErrorMessage(aTester.GetMessageId());
@@ -469,7 +470,7 @@ void ScViewFunc::DoSheetConversion( const 
ScConversionParam& rConvParam )
     bool bMarked = rMark.IsMultiMarked();
     if (bMarked)
     {
-        ScEditableTester aTester( rDoc, rMark );
+        ScEditableTester aTester = 
ScEditableTester::CreateAndTestSelection(rDoc, rMark);
         if (!aTester.IsEditable())
         {
             ErrorMessage(aTester.GetMessageId());
diff --git a/sc/source/ui/view/viewfunc.cxx b/sc/source/ui/view/viewfunc.cxx
index 8fbdd4535ae5..b957271c0e61 100644
--- a/sc/source/ui/view/viewfunc.cxx
+++ b/sc/source/ui/view/viewfunc.cxx
@@ -783,7 +783,7 @@ void ScViewFunc::EnterData( SCCOL nCol, SCROW nRow, SCTAB 
nTab,
     ScDocFunc &rFunc = GetViewData().GetDocFunc();
     std::shared_ptr<ScDocShellModificator> xModificator = 
std::make_shared<ScDocShellModificator>(*pDocSh);
 
-    ScEditableTester aTester( rDoc, nCol,nRow, nCol,nRow, aMark );
+    ScEditableTester aTester = 
ScEditableTester::CreateAndTestSelectedBlock(rDoc, nCol, nRow, nCol, nRow, 
aMark);
     if (!aTester.IsEditable())
     {
         ErrorMessage(aTester.GetMessageId());
@@ -858,7 +858,7 @@ void ScViewFunc::EnterValue( SCCOL nCol, SCROW nRow, SCTAB 
nTab, const double& r
     bool bUndo(rDoc.IsUndoEnabled());
     ScDocShellModificator aModificator( *pDocSh );
 
-    ScEditableTester aTester( rDoc, nTab, nCol,nRow, nCol,nRow );
+    ScEditableTester aTester = ScEditableTester::CreateAndTestBlock(rDoc, 
nTab, nCol, nRow, nCol, nRow);
     if (aTester.IsEditable())
     {
         ScAddress aPos( nCol, nRow, nTab );
@@ -893,7 +893,7 @@ void ScViewFunc::EnterData( SCCOL nCol, SCROW nRow, SCTAB 
nTab,
 
     ScDocShellModificator aModificator( *pDocSh );
 
-    ScEditableTester aTester( rDoc, nTab, nCol,nRow, nCol,nRow );
+    ScEditableTester aTester = ScEditableTester::CreateAndTestBlock(rDoc, 
nTab, nCol, nRow, nCol, nRow);
     if (aTester.IsEditable())
     {
 
@@ -2126,7 +2126,7 @@ void ScViewFunc::DeleteMulti( bool bRows )
         if (i == 0)
         {
             // test to the end of the sheet
-            ScEditableTester aTester( rDoc, nTab, nStartCol, nStartRow, 
rDoc.MaxCol(), rDoc.MaxRow() );
+            ScEditableTester aTester = 
ScEditableTester::CreateAndTestBlock(rDoc, nTab, nStartCol, nStartRow, 
rDoc.MaxCol(), rDoc.MaxRow());
             if (!aTester.IsEditable())
                 pErrorId = aTester.GetMessageId();
         }

Reply via email to