include/sfx2/sfxsids.hrc                         |    3 ++-
 include/sfx2/viewsh.hxx                          |    1 +
 offapi/com/sun/star/document/MediaDescriptor.idl |    6 ++++++
 offapi/com/sun/star/frame/XModel2.idl            |    2 +-
 sfx2/source/appl/appuno.cxx                      |   18 ++++++++++++++++++
 sfx2/source/doc/sfxbasemodel.cxx                 |    5 +++++
 sfx2/source/view/viewfrm.cxx                     |   22 +++++++++++++++++-----
 sfx2/source/view/viewsh.cxx                      |    9 +++++++++
 sw/qa/python/check_xmodel.py                     |    4 +++-
 9 files changed, 62 insertions(+), 8 deletions(-)

New commits:
commit a474e2267cdcb1707333acdea1353d883d58c801
Author:     Serge Krot <serge.k...@cib.de>
AuthorDate: Tue Nov 12 21:52:05 2019 +0100
Commit:     Samuel Mehrbrodt <samuel.mehrbr...@cib.de>
CommitDate: Wed Nov 13 12:45:39 2019 +0100

    Add document level option to lock down edit doc command
    
    Change-Id: I431fa4cd0daa52c885030dbadcc4052b5a890d34
    Reviewed-on: https://gerrit.libreoffice.org/82553
    Reviewed-by: Serge Krot (CIB) <serge.k...@cib.de>
    Tested-by: Serge Krot (CIB) <serge.k...@cib.de>
    Reviewed-on: https://gerrit.libreoffice.org/82576
    Tested-by: Jenkins
    Reviewed-by: Samuel Mehrbrodt <samuel.mehrbr...@cib.de>

diff --git a/include/sfx2/sfxsids.hrc b/include/sfx2/sfxsids.hrc
index 2e1dbf6ff748..9fa90a5f6226 100644
--- a/include/sfx2/sfxsids.hrc
+++ b/include/sfx2/sfxsids.hrc
@@ -268,8 +268,9 @@ class SvxSearchItem;
 #define SID_DIALOG_PARENT                   (SID_SFX_START + 1735)
 #define SID_LOCK_PRINT                      (SID_SFX_START + 1736)
 #define SID_LOCK_SAVE                       (SID_SFX_START + 1737)
+#define SID_LOCK_EDITDOC                    (SID_SFX_START + 1738)
 
-//      SID_SFX_free_START                  (SID_SFX_START + 1738)
+//      SID_SFX_free_START                  (SID_SFX_START + 1739)
 //      SID_SFX_free_END                    (SID_SFX_START + 3999)
 
 #define SID_OPEN_NEW_VIEW                   (SID_SFX_START + 520)
diff --git a/include/sfx2/viewsh.hxx b/include/sfx2/viewsh.hxx
index a1a225aa1b28..d65fae656b16 100644
--- a/include/sfx2/viewsh.hxx
+++ b/include/sfx2/viewsh.hxx
@@ -292,6 +292,7 @@ public:
     bool isExportLocked();
     bool isPrintLocked();
     bool isSaveLocked();
+    bool isEditDocLocked();
 
     SAL_DLLPRIVATE SfxInPlaceClient* GetUIActiveIPClient_Impl() const;
     SAL_DLLPRIVATE void AddContextMenuInterceptor_Impl( const 
css::uno::Reference < css::ui::XContextMenuInterceptor >& xInterceptor );
diff --git a/offapi/com/sun/star/document/MediaDescriptor.idl 
b/offapi/com/sun/star/document/MediaDescriptor.idl
index 72ee23fcd2ee..728ef4ab4a29 100644
--- a/offapi/com/sun/star/document/MediaDescriptor.idl
+++ b/offapi/com/sun/star/document/MediaDescriptor.idl
@@ -590,6 +590,12 @@ service MediaDescriptor
         @since LibreOffice 6.4
      */
     [optional,property] boolean LockSave;
+
+    /** Setting this option will disable switching to edit mode from read-only 
mode.
+     *
+        @since LibreOffice 6.4
+     */
+    [optional,property] boolean LockEditDoc;
 };
 
 
diff --git a/offapi/com/sun/star/frame/XModel2.idl 
b/offapi/com/sun/star/frame/XModel2.idl
index 128d5ced20d6..4221a527c380 100644
--- a/offapi/com/sun/star/frame/XModel2.idl
+++ b/offapi/com/sun/star/frame/XModel2.idl
@@ -146,7 +146,7 @@ interface XModel2 : com::sun::star::frame::XModel
                 <li>com::sun::star::document::MediaDescriptor::LockExport</li>
                 <li>com::sun::star::document::MediaDescriptor::LockPrint</li>
                 <li>com::sun::star::document::MediaDescriptor::LockSave</li>
-
+                <li>com::sun::star::document::MediaDescriptor::LockEditDoc</li>
             </ul>
 
         @throws com::sun::star::lang::IllegalArgumentException When trying to 
set an unsupported property
diff --git a/sfx2/source/appl/appuno.cxx b/sfx2/source/appl/appuno.cxx
index c633978076d9..bfbe90dc896b 100644
--- a/sfx2/source/appl/appuno.cxx
+++ b/sfx2/source/appl/appuno.cxx
@@ -173,6 +173,7 @@ static char const sLockContentExtraction[] = 
"LockContentExtraction";
 static char const sLockExport[] = "LockExport";
 static char const sLockPrint[] = "LockPrint";
 static char const sLockSave[] = "LockSave";
+static char const sLockEditDoc[] = "LockEditDoc";
 
 static bool isMediaDescriptor( sal_uInt16 nSlotId )
 {
@@ -879,6 +880,14 @@ void TransformParameters( sal_uInt16 nSlotId, const 
uno::Sequence<beans::Propert
                 if (bOK)
                     rSet.Put( SfxBoolItem( SID_LOCK_SAVE, bVal ) );
             }
+            else if (aName == sLockEditDoc)
+            {
+                bool bVal = false;
+                bool bOK = (rProp.Value >>= bVal);
+                DBG_ASSERT( bOK, "invalid type for LockEditDoc" );
+                if (bOK)
+                    rSet.Put( SfxBoolItem( SID_LOCK_EDITDOC, bVal ) );
+            }
 #ifdef DBG_UTIL
             else
                 --nFoundArgs;
@@ -1104,6 +1113,8 @@ void TransformItems( sal_uInt16 nSlotId, const 
SfxItemSet& rSet, uno::Sequence<b
                 nAdditional++;
             if ( rSet.GetItemState( SID_LOCK_SAVE ) == SfxItemState::SET )
                 nAdditional++;
+            if ( rSet.GetItemState( SID_LOCK_EDITDOC ) == SfxItemState::SET )
+                nAdditional++;
 
             // consider additional arguments
             nProps += nAdditional;
@@ -1269,6 +1280,8 @@ void TransformItems( sal_uInt16 nSlotId, const 
SfxItemSet& rSet, uno::Sequence<b
                         continue;
                     if ( nId == SID_LOCK_SAVE )
                         continue;
+                    if ( nId == SID_LOCK_EDITDOC )
+                        continue;
                }
 
                 OString aDbg = "Unknown item detected: " + 
OString::number(static_cast<sal_Int32>(nId));
@@ -1681,6 +1694,11 @@ void TransformItems( sal_uInt16 nSlotId, const 
SfxItemSet& rSet, uno::Sequence<b
             pValue[nActProp].Name = sLockSave;
             pValue[nActProp++].Value <<= static_cast<const 
SfxBoolItem*>(pItem)->GetValue() ;
         }
+        if ( rSet.GetItemState( SID_LOCK_EDITDOC, false, &pItem ) == 
SfxItemState::SET )
+        {
+            pValue[nActProp].Name = sLockEditDoc;
+            pValue[nActProp++].Value <<= static_cast<const 
SfxBoolItem*>(pItem)->GetValue();
+        }
     }
 
     rArgs = aSequ;
diff --git a/sfx2/source/doc/sfxbasemodel.cxx b/sfx2/source/doc/sfxbasemodel.cxx
index b2bf405836d8..74b1497829bc 100644
--- a/sfx2/source/doc/sfxbasemodel.cxx
+++ b/sfx2/source/doc/sfxbasemodel.cxx
@@ -1094,6 +1094,11 @@ void SAL_CALL SfxBaseModel::setArgs(const 
Sequence<beans::PropertyValue>& aArgs)
             rArg.Value >>= bValue;
             pMedium->GetItemSet()->Put(SfxBoolItem(SID_LOCK_SAVE, bValue));
         }
+        else if (rArg.Name == "LockEditDoc")
+        {
+            rArg.Value >>= bValue;
+            pMedium->GetItemSet()->Put(SfxBoolItem(SID_LOCK_EDITDOC, bValue));
+        }
         else
         {
             throw lang::IllegalArgumentException("Setting property not 
supported: " + rArg.Name,
diff --git a/sfx2/source/view/viewfrm.cxx b/sfx2/source/view/viewfrm.cxx
index e3f39e3aab40..6dccb522c14b 100644
--- a/sfx2/source/view/viewfrm.cxx
+++ b/sfx2/source/view/viewfrm.cxx
@@ -306,6 +306,10 @@ void SfxViewFrame::ExecReload_Impl( SfxRequest& rReq )
             if( !pSh || !pSh->HasName() || !(pSh->Get_Impl()->nLoadedFlags & 
SfxLoadedFlags::MAINDOCUMENT ))
                 break;
 
+            SfxViewShell* pViewSh = GetViewShell();
+            if (pViewSh && pViewSh->isEditDocLocked())
+                break;
+
             // Only change read-only UI and remove info bar when we succeed
             struct ReadOnlyUIGuard
             {
@@ -919,6 +923,7 @@ void SfxViewFrame::StateReload_Impl( SfxItemSet& rSet )
                 const SfxShell *pFSh;
                 if ( !pSh->HasName() ||
                      !( pSh->Get_Impl()->nLoadedFlags &  
SfxLoadedFlags::MAINDOCUMENT ) ||
+                     (GetViewShell() && GetViewShell()->isEditDocLocked()) ||
                      ( pSh->GetCreateMode() == SfxObjectCreateMode::EMBEDDED &&
                        ( !(pVSh = pSh->GetViewShell())  ||
                          !(pFSh = pVSh->GetFormShell()) ||
@@ -1405,11 +1410,18 @@ void SfxViewFrame::Notify( SfxBroadcaster& /*rBC*/, 
const SfxHint& rHint )
                             pInfoBar->addButton(xSignButton);
                         }
 
-                        VclPtrInstance<PushButton> xBtn(&GetWindow());
-                        xBtn->SetText(SfxResId(STR_READONLY_EDIT));
-                        xBtn->SetSizePixel(xBtn->GetOptimalSize());
-                        xBtn->SetClickHdl(LINK(this, SfxViewFrame, 
SwitchReadOnlyHandler));
-                        pInfoBar->addButton(xBtn);
+                        bool showEditDocumentButton = true;
+                        if (m_xObjSh->GetViewShell() && 
m_xObjSh->GetViewShell()->isEditDocLocked())
+                            showEditDocumentButton = false;
+
+                        if (showEditDocumentButton)
+                        {
+                            VclPtrInstance<PushButton> xBtn(&GetWindow());
+                            xBtn->SetText(SfxResId(STR_READONLY_EDIT));
+                            xBtn->SetSizePixel(xBtn->GetOptimalSize());
+                            xBtn->SetClickHdl(LINK(this, SfxViewFrame, 
SwitchReadOnlyHandler));
+                            pInfoBar->addButton(xBtn);
+                        }
                     }
                 }
 
diff --git a/sfx2/source/view/viewsh.cxx b/sfx2/source/view/viewsh.cxx
index 1d75d7d354b5..a0598191f3f7 100644
--- a/sfx2/source/view/viewsh.cxx
+++ b/sfx2/source/view/viewsh.cxx
@@ -1776,6 +1776,15 @@ bool SfxViewShell::isPrintLocked()
     return aArgs.getOrDefault("LockPrint", false);
 }
 
+bool SfxViewShell::isEditDocLocked()
+{
+    Reference<XModel> xModel = GetCurrentDocument();
+    if (!xModel.is())
+        return false;
+    comphelper::NamedValueCollection aArgs(xModel->getArgs());
+    return aArgs.getOrDefault("LockEditDoc", false);
+}
+
 bool SfxViewShell::isSaveLocked()
 {
     Reference<XModel> xModel = GetCurrentDocument();
diff --git a/sw/qa/python/check_xmodel.py b/sw/qa/python/check_xmodel.py
index c257ef33fb79..f6894dd21a3f 100644
--- a/sw/qa/python/check_xmodel.py
+++ b/sw/qa/python/check_xmodel.py
@@ -36,7 +36,8 @@ class TestXModel(unittest.TestCase):
         p4 = PropertyValue(Name="LockExport", Value=True)
         p5 = PropertyValue(Name="LockPrint", Value=True)
         p6 = PropertyValue(Name="LockSave", Value=True)
-        xDoc.setArgs([p1, p2, p3, p4, p5, p6])
+        p7 = PropertyValue(Name="LockEditDoc", Value=True)
+        xDoc.setArgs([p1, p2, p3, p4, p5, p6, p7])
 
         # Make sure that all properties are returned with getArgs()
         args = xDoc.getArgs()
@@ -46,6 +47,7 @@ class TestXModel(unittest.TestCase):
         self.assertTrue(p4 in args)
         self.assertTrue(p5 in args)
         self.assertTrue(p6 in args)
+        self.assertTrue(p7 in args)
 
         xDoc.close(True)
 
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to