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)