tdf#133257 : Protection icon in front of sheet name
Change-Id: Ifdbe0fad1f8a1d7dd6ac1dfd35c529f9e0c9fd80
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/107041
Tested-by: Jenkins
Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
diff --git a/sc/source/ui/docshell/docfunc.cxx b/sc/source/ui/docshell/docfunc.cxx
index e055130..18171bd 100644
--- a/sc/source/ui/docshell/docfunc.cxx
+++ b/sc/source/ui/docshell/docfunc.cxx
@@ -99,6 +99,7 @@
#include <basic/basmgr.hxx>
#include <set>
#include <vector>
#include <sfx2/viewfrm.hxx>
using namespace com::sun::star;
using ::std::vector;
@@ -3935,22 +3936,29 @@ void ScDocFunc::ProtectSheet( SCTAB nTab, const ScTableProtection& rProtect )
{
ScDocument& rDoc = rDocShell.GetDocument();
std::unique_ptr<ScTableProtection> p;
if (!rProtect.isProtected() && rDoc.IsUndoEnabled())
{
// In case of unprotecting, use a copy of passed ScTableProtection object for undo
p = std::make_unique<ScTableProtection>(rProtect);
}
rDoc.SetTabProtection(nTab, &rProtect);
if (rDoc.IsUndoEnabled())
{
ScTableProtection* pProtect = rDoc.GetTabProtection(nTab);
OSL_ENSURE(pProtect, "ScDocFunc::Unprotect: ScTableProtection pointer is NULL!");
if (pProtect)
if (!p)
{
::std::unique_ptr<ScTableProtection> p(new ScTableProtection(*pProtect));
p->setProtected(true); // just in case ...
rDocShell.GetUndoManager()->AddUndoAction(
std::make_unique<ScUndoTabProtect>(&rDocShell, nTab, std::move(p)) );
// ownership of unique_ptr now transferred to ScUndoTabProtect.
// For protection case, use a copy of resulting ScTableProtection for undo
ScTableProtection* pProtect = rDoc.GetTabProtection(nTab);
p = std::make_unique<ScTableProtection>(*pProtect);
}
rDocShell.GetUndoManager()->AddUndoAction(
std::make_unique<ScUndoTabProtect>(&rDocShell, nTab, std::move(p)));
// ownership of unique_ptr now transferred to ScUndoTabProtect.
}
for (SfxViewFrame* fr = SfxViewFrame::GetFirst(&rDocShell); fr;
fr = SfxViewFrame::GetNext(*fr, &rDocShell))
if (ScTabViewShell* pTabViewShell = dynamic_cast<ScTabViewShell*>(fr->GetViewShell()))
pTabViewShell->SetTabProtectionSymbol(nTab, rProtect.isProtected());
rDocShell.PostPaintGridAll();
ScDocShellModificator aModificator(rDocShell);
aModificator.SetDocumentModified();
@@ -3979,6 +3987,9 @@ bool ScDocFunc::Protect( SCTAB nTab, const OUString& rPassword )
// ownership of unique_ptr is transferred to ScUndoDocProtect.
}
}
rDocShell.PostPaintGridAll();
ScDocShellModificator aModificator(rDocShell);
aModificator.SetDocumentModified();
}
else
{
@@ -3988,26 +3999,8 @@ bool ScDocFunc::Protect( SCTAB nTab, const OUString& rPassword )
::std::unique_ptr<ScTableProtection> pNewProtection(pOldProtection ? new ScTableProtection(*pOldProtection) : new ScTableProtection());
pNewProtection->setProtected(true);
pNewProtection->setPassword(rPassword);
rDoc.SetTabProtection(nTab, pNewProtection.get());
if (rDoc.IsUndoEnabled())
{
ScTableProtection* pProtect = rDoc.GetTabProtection(nTab);
OSL_ENSURE(pProtect, "ScDocFunc::Unprotect: ScTableProtection pointer is NULL!");
if (pProtect)
{
::std::unique_ptr<ScTableProtection> p(new ScTableProtection(*pProtect));
p->setProtected(true); // just in case ...
rDocShell.GetUndoManager()->AddUndoAction(
std::make_unique<ScUndoTabProtect>(&rDocShell, nTab, std::move(p)) );
// ownership of unique_ptr now transferred to ScUndoTabProtect.
}
}
ProtectSheet(nTab, *pNewProtection);
}
rDocShell.PostPaintGridAll();
ScDocShellModificator aModificator( rDocShell );
aModificator.SetDocumentModified();
return true;
}
@@ -4056,9 +4049,6 @@ bool ScDocFunc::Unprotect( SCTAB nTab, const OUString& rPassword, bool bApi )
if (!pTabProtect || !pTabProtect->isProtected())
// already unprotected (should not happen)!
return true;
// save the protection state before unprotect (for undo).
::std::unique_ptr<ScTableProtection> pProtectCopy(new ScTableProtection(*pTabProtect));
if (!pTabProtect->verifyPassword(rPassword))
{
if (!bApi)
@@ -4071,22 +4061,11 @@ bool ScDocFunc::Unprotect( SCTAB nTab, const OUString& rPassword, bool bApi )
return false;
}
::std::unique_ptr<ScTableProtection> pNewProtection(new ScTableProtection(*pTabProtect));
pNewProtection->setProtected(false);
rDoc.SetTabProtection(nTab, pNewProtection.get());
if (rDoc.IsUndoEnabled())
{
pProtectCopy->setProtected(false);
rDocShell.GetUndoManager()->AddUndoAction(
std::make_unique<ScUndoTabProtect>(&rDocShell, nTab, std::move(pProtectCopy)) );
// ownership of unique_ptr now transferred to ScUndoTabProtect.
}
ScTableProtection aNewProtection(*pTabProtect);
aNewProtection.setProtected(false);
ProtectSheet(nTab, aNewProtection);
}
rDocShell.PostPaintGridAll();
ScDocShellModificator aModificator( rDocShell );
aModificator.SetDocumentModified();
return true;
}
diff --git a/sc/source/ui/view/viewfunc.cxx b/sc/source/ui/view/viewfunc.cxx
index 1c8d699..1643276 100644
--- a/sc/source/ui/view/viewfunc.cxx
+++ b/sc/source/ui/view/viewfunc.cxx
@@ -2511,7 +2511,6 @@ void ScViewFunc::ProtectSheet( SCTAB nTab, const ScTableProtection& rProtect )
for (const auto& rTab : rMark)
{
rFunc.ProtectSheet(rTab, rProtect);
SetTabProtectionSymbol(rTab, true);
}
if (bUndo)