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 24da8ee8221553b0aa3c91ce00663bf1a9ebba30
Author:     Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk>
AuthorDate: Thu Aug 21 00:22:46 2025 +0200
Commit:     Tomaž Vajngerl <qui...@gmail.com>
CommitDate: Sat Sep 13 17:11:00 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>

diff --git a/sc/source/ui/docshell/dbdocfun.cxx 
b/sc/source/ui/docshell/dbdocfun.cxx
index e7a57cfaba67..77206be9ff1e 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 756d36beb7bf..36dd3d1b5a09 100644
--- a/sc/source/ui/docshell/docfunc.cxx
+++ b/sc/source/ui/docshell/docfunc.cxx
@@ -596,7 +596,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)
@@ -699,7 +699,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());
@@ -767,7 +767,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)
@@ -821,7 +821,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)
@@ -1339,7 +1339,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)
@@ -1364,7 +1364,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();
@@ -1902,23 +1902,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);
     }
 
@@ -2404,15 +2404,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);
     }
 
@@ -4118,7 +4118,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)
@@ -4162,7 +4162,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)
@@ -4251,7 +4251,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() );
@@ -4373,7 +4373,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() );
@@ -4460,7 +4460,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() );
@@ -4604,7 +4604,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() );
@@ -4717,7 +4717,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() );
@@ -4889,7 +4889,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)
@@ -4987,7 +4987,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)
@@ -5424,7 +5424,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;
@@ -5738,7 +5738,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 97a25e0d91ae..81b21d95abb2 100644
--- a/sc/source/ui/docshell/impex.cxx
+++ b/sc/source/ui/docshell/impex.cxx
@@ -229,7 +229,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 6c922d7753e1..1f78629562db 100644
--- a/sc/source/ui/view/cellsh1.cxx
+++ b/sc/source/ui/view/cellsh1.cxx
@@ -485,7 +485,7 @@ void ScCellShell::ExecuteEdit( SfxRequest& rReq )
                 }
                 else
                 {
-                    ScEditableTester aTester( pTabViewShell );
+                    ScEditableTester aTester = 
ScEditableTester::CreateAndTestView(pTabViewShell);
                     if (aTester.IsEditable())
                     {
                         ScAbstractDialogFactory* pFact = 
ScAbstractDialogFactory::Create();
@@ -1563,7 +1563,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 e9ba63b4dec8..03334920544f 100644
--- a/sc/source/ui/view/cellsh3.cxx
+++ b/sc/source/ui/view/cellsh3.cxx
@@ -1023,7 +1023,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 25320045dbf1..bf317492b961 100644
--- a/sc/source/ui/view/dbfunc.cxx
+++ b/sc/source/ui/view/dbfunc.cxx
@@ -485,8 +485,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 ad93c4789481..f7d0b4ae2968 100644
--- a/sc/source/ui/view/dbfunc3.cxx
+++ b/sc/source/ui/view/dbfunc3.cxx
@@ -446,7 +446,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 b99dfbbe1cad..0f1b7a36ed33 100644
--- a/sc/source/ui/view/gridwin.cxx
+++ b/sc/source/ui/view/gridwin.cxx
@@ -4398,7 +4398,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 15c106893992..b03e45d26d5d 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 584dd4df5be8..d2930d6c5090 100644
--- a/sc/source/ui/view/viewfun2.cxx
+++ b/sc/source/ui/view/viewfun2.cxx
@@ -1181,7 +1181,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());
@@ -1362,7 +1362,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());
@@ -1696,7 +1696,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());
@@ -2278,7 +2278,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());
@@ -2376,7 +2376,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());
@@ -3309,7 +3309,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 654ce1fcff53..89cbdd18ddc0 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() );
@@ -1210,7 +1210,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 4605b32f9fdd..02a32b4dc1a9 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());
@@ -468,7 +469,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 b6c6458e61a5..11049b7433d4 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>(GetViewData().GetDocShell());
 
-    ScEditableTester aTester( rDoc, nCol,nRow, nCol,nRow, aMark );
+    ScEditableTester aTester = 
ScEditableTester::CreateAndTestSelectedBlock(rDoc, nCol, nRow, nCol, nRow, 
aMark);
     if (!aTester.IsEditable())
     {
         ErrorMessage(aTester.GetMessageId());
@@ -857,7 +857,7 @@ void ScViewFunc::EnterValue( SCCOL nCol, SCROW nRow, SCTAB 
nTab, const double& r
     bool bUndo(rDoc.IsUndoEnabled());
     ScDocShellModificator aModificator( rDocSh );
 
-    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 );
@@ -892,7 +892,7 @@ void ScViewFunc::EnterData( SCCOL nCol, SCROW nRow, SCTAB 
nTab,
 
     ScDocShellModificator aModificator( rDocSh );
 
-    ScEditableTester aTester( rDoc, nTab, nCol,nRow, nCol,nRow );
+    ScEditableTester aTester = ScEditableTester::CreateAndTestBlock(rDoc, 
nTab, nCol, nRow, nCol, nRow);
     if (aTester.IsEditable())
     {
 
@@ -2125,7 +2125,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