summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sc/source/ui/docshell/docfunc.cxx66
-rw-r--r--sc/source/ui/inc/docfunc.hxx4
2 files changed, 40 insertions, 30 deletions
diff --git a/sc/source/ui/docshell/docfunc.cxx b/sc/source/ui/docshell/docfunc.cxx
index 18171bd5c44b..e3f914620b35 100644
--- a/sc/source/ui/docshell/docfunc.cxx
+++ b/sc/source/ui/docshell/docfunc.cxx
@@ -3964,38 +3964,51 @@ void ScDocFunc::ProtectSheet( SCTAB nTab, const ScTableProtection& rProtect )
aModificator.SetDocumentModified();
}
-bool ScDocFunc::Protect( SCTAB nTab, const OUString& rPassword )
+void ScDocFunc::ProtectDocument(const ScDocProtection& rProtect)
{
ScDocument& rDoc = rDocShell.GetDocument();
+
+ std::unique_ptr<ScDocProtection> p;
+ if (!rProtect.isProtected() && rDoc.IsUndoEnabled())
+ {
+ // In case of unprotecting, use a copy of passed ScTableProtection object for undo
+ p = std::make_unique<ScDocProtection>(rProtect);
+ }
+ rDoc.SetDocProtection(&rProtect);
+ if (rDoc.IsUndoEnabled())
+ {
+ if (!p)
+ {
+ // For protection case, use a copy of resulting ScTableProtection for undo
+ ScDocProtection* pProtect = rDoc.GetDocProtection();
+ p = std::make_unique<ScDocProtection>(*pProtect);
+ }
+ rDocShell.GetUndoManager()->AddUndoAction(
+ std::make_unique<ScUndoDocProtect>(&rDocShell, std::move(p)));
+ // ownership of unique_ptr now transferred to ScUndoTabProtect.
+ }
+
+ rDocShell.PostPaintGridAll();
+ ScDocShellModificator aModificator(rDocShell);
+ aModificator.SetDocumentModified();
+}
+
+bool ScDocFunc::Protect( SCTAB nTab, const OUString& rPassword )
+{
if (nTab == TABLEID_DOC)
{
// document protection
ScDocProtection aProtection;
aProtection.setProtected(true);
aProtection.setPassword(rPassword);
- rDoc.SetDocProtection(&aProtection);
- if (rDoc.IsUndoEnabled())
- {
- ScDocProtection* pProtect = rDoc.GetDocProtection();
- OSL_ENSURE(pProtect, "ScDocFunc::Unprotect: ScDocProtection pointer is NULL!");
- if (pProtect)
- {
- ::std::unique_ptr<ScDocProtection> p(new ScDocProtection(*pProtect));
- p->setProtected(true); // just in case ...
- rDocShell.GetUndoManager()->AddUndoAction(
- std::make_unique<ScUndoDocProtect>(&rDocShell, std::move(p)) );
- // ownership of unique_ptr is transferred to ScUndoDocProtect.
- }
- }
- rDocShell.PostPaintGridAll();
- ScDocShellModificator aModificator(rDocShell);
- aModificator.SetDocumentModified();
+ ProtectDocument(aProtection);
+
}
else
{
// sheet protection
- const ScTableProtection* pOldProtection = rDoc.GetTabProtection(nTab);
+ const ScTableProtection* pOldProtection = rDocShell.GetDocument().GetTabProtection(nTab);
::std::unique_ptr<ScTableProtection> pNewProtection(pOldProtection ? new ScTableProtection(*pOldProtection) : new ScTableProtection());
pNewProtection->setProtected(true);
pNewProtection->setPassword(rPassword);
@@ -4017,9 +4030,6 @@ bool ScDocFunc::Unprotect( SCTAB nTab, const OUString& rPassword, bool bApi )
// already unprotected (should not happen)!
return true;
- // save the protection state before unprotect (for undo).
- ::std::unique_ptr<ScDocProtection> pProtectCopy(new ScDocProtection(*pDocProtect));
-
if (!pDocProtect->verifyPassword(rPassword))
{
if (!bApi)
@@ -4032,14 +4042,10 @@ bool ScDocFunc::Unprotect( SCTAB nTab, const OUString& rPassword, bool bApi )
return false;
}
- rDoc.SetDocProtection(nullptr);
- if (rDoc.IsUndoEnabled())
- {
- pProtectCopy->setProtected(false);
- rDocShell.GetUndoManager()->AddUndoAction(
- std::make_unique<ScUndoDocProtect>(&rDocShell, std::move(pProtectCopy)) );
- // ownership of unique_ptr now transferred to ScUndoDocProtect.
- }
+ ScDocProtection aNewProtection(*pDocProtect);
+ aNewProtection.setProtected(false);
+ ProtectDocument(aNewProtection);
+
}
else
{
diff --git a/sc/source/ui/inc/docfunc.hxx b/sc/source/ui/inc/docfunc.hxx
index f7b518ef7f35..411abc10496e 100644
--- a/sc/source/ui/inc/docfunc.hxx
+++ b/sc/source/ui/inc/docfunc.hxx
@@ -41,6 +41,7 @@ class ScFormulaCell;
class ScTokenArray;
struct ScTabOpParam;
class ScTableProtection;
+class ScDocProtection;
struct ScCellMergeOption;
class ScConditionalFormat;
class ScConditionalFormatList;
@@ -232,6 +233,9 @@ public:
void SetConditionalFormatList( ScConditionalFormatList* pList, SCTAB nTab );
void ConvertFormulaToValue( const ScRange& rRange, bool bInteraction );
+
+private:
+ void ProtectDocument(const ScDocProtection& rProtect);
};
class ScDocFuncDirect : public ScDocFunc