[Libreoffice-commits] core.git: Branch 'distro/cib/libreoffice-6-4' - 31 commits - bin/distro-install-file-lists comphelper/source configure.ac cui/source cui/uiconfig dbaccess/source desktop/source external/breakpad external/liblangtag .gitreview icon-themes/colibre icon-themes/colibre_svg icon-themes/elementary icon-themes/elementary_svg icon-themes/karasa_jaga icon-themes/karasa_jaga_svg icon-themes/sifr icon-themes/sifr_dark icon-themes/sifr_dark_svg icon-themes/sifr_svg instsetoo_native/CustomTarget_install.mk instsetoo_native/CustomTarget_setup.mk officecfg/Configuration_officecfg.mk officecfg/registry postprocess/CustomTarget_registry.mk Repository.mk RepositoryModule_host.mk scp2/AutoInstall.mk scp2/InstallModule_python.mk sc/source setup_native/source sfx2/source solenv/bin sw/inc sw/sdi sw/source vcl/source vcl/win xmlsecurity/qa

Stephan Bergmann (via logerrit) logerrit at kemper.freedesktop.org
Sat Dec 5 16:30:45 UTC 2020


 .gitreview                                                                          |    2 
 Repository.mk                                                                       |    4 
 RepositoryModule_host.mk                                                            |    1 
 bin/distro-install-file-lists                                                       |    3 
 comphelper/source/misc/docpasswordhelper.cxx                                        |    4 
 configure.ac                                                                        |   19 -
 cui/source/dialogs/about.cxx                                                        |    3 
 cui/source/options/optgdlg.cxx                                                      |   11 
 cui/source/options/optgdlg.hxx                                                      |    1 
 cui/uiconfig/ui/optgeneralpage.ui                                                   |   68 ----
 dbaccess/source/core/dataaccess/ModelImpl.cxx                                       |   14 
 desktop/source/app/app.cxx                                                          |    3 
 desktop/source/app/crashreport.cxx                                                  |   22 +
 external/breakpad/0001-Handle-race-between-ExceptionHandler-SignalHandler-a.patch.1 |    2 
 external/liblangtag/UnpackedTarball_liblangtag.mk                                   |    3 
 external/liblangtag/Wformat-overflow.patch                                          |   17 +
 icon-themes/colibre/cmd/32/protectbookmarks.png                                     |binary
 icon-themes/colibre/cmd/32/protectfields.png                                        |binary
 icon-themes/colibre/cmd/lc_protectbookmarks.png                                     |binary
 icon-themes/colibre/cmd/lc_protectfields.png                                        |binary
 icon-themes/colibre/cmd/sc_protectbookmarks.png                                     |binary
 icon-themes/colibre/cmd/sc_protectfields.png                                        |binary
 icon-themes/colibre_svg/cmd/32/protectbookmarks.svg                                 |   13 
 icon-themes/colibre_svg/cmd/32/protectfields.svg                                    |   14 
 icon-themes/colibre_svg/cmd/lc_protectbookmarks.svg                                 |   17 +
 icon-themes/colibre_svg/cmd/lc_protectfields.svg                                    |   14 
 icon-themes/colibre_svg/cmd/sc_protectbookmarks.svg                                 |   14 
 icon-themes/colibre_svg/cmd/sc_protectfields.svg                                    |   10 
 icon-themes/elementary/cmd/32/protectbookmarks.png                                  |binary
 icon-themes/elementary/cmd/32/protectfields.png                                     |binary
 icon-themes/elementary/cmd/lc_protectbookmarks.png                                  |binary
 icon-themes/elementary/cmd/lc_protectfields.png                                     |binary
 icon-themes/elementary/cmd/sc_protectbookmarks.png                                  |binary
 icon-themes/elementary/cmd/sc_protectfields.png                                     |binary
 icon-themes/elementary_svg/cmd/32/protectbookmarks.svg                              |    1 
 icon-themes/elementary_svg/cmd/32/protectfields.svg                                 |    1 
 icon-themes/elementary_svg/cmd/lc_protectbookmarks.svg                              |    1 
 icon-themes/elementary_svg/cmd/lc_protectfields.svg                                 |    1 
 icon-themes/elementary_svg/cmd/sc_protectbookmarks.svg                              |    1 
 icon-themes/elementary_svg/cmd/sc_protectfields.svg                                 |    1 
 icon-themes/karasa_jaga/cmd/32/protectbookmarks.png                                 |binary
 icon-themes/karasa_jaga/cmd/32/protectfields.png                                    |binary
 icon-themes/karasa_jaga/cmd/lc_protectbookmarks.png                                 |binary
 icon-themes/karasa_jaga/cmd/lc_protectfields.png                                    |binary
 icon-themes/karasa_jaga/cmd/sc_protectbookmarks.png                                 |binary
 icon-themes/karasa_jaga/cmd/sc_protectfields.png                                    |binary
 icon-themes/karasa_jaga_svg/cmd/32/protectbookmarks.svg                             |    1 
 icon-themes/karasa_jaga_svg/cmd/32/protectfields.svg                                |    1 
 icon-themes/karasa_jaga_svg/cmd/lc_protectbookmarks.svg                             |    1 
 icon-themes/karasa_jaga_svg/cmd/lc_protectfields.svg                                |    1 
 icon-themes/karasa_jaga_svg/cmd/sc_protectbookmarks.svg                             |    1 
 icon-themes/karasa_jaga_svg/cmd/sc_protectfields.svg                                |    1 
 icon-themes/sifr/cmd/32/protectbookmarks.png                                        |binary
 icon-themes/sifr/cmd/32/protectfields.png                                           |binary
 icon-themes/sifr/cmd/lc_protectbookmarks.png                                        |binary
 icon-themes/sifr/cmd/lc_protectfields.png                                           |binary
 icon-themes/sifr/cmd/sc_protectbookmarks.png                                        |binary
 icon-themes/sifr/cmd/sc_protectfields.png                                           |binary
 icon-themes/sifr_dark/cmd/32/protectbookmarks.png                                   |binary
 icon-themes/sifr_dark/cmd/32/protectfields.png                                      |binary
 icon-themes/sifr_dark/cmd/lc_protectbookmarks.png                                   |binary
 icon-themes/sifr_dark/cmd/lc_protectfields.png                                      |binary
 icon-themes/sifr_dark/cmd/sc_protectbookmarks.png                                   |binary
 icon-themes/sifr_dark/cmd/sc_protectfields.png                                      |binary
 icon-themes/sifr_dark_svg/cmd/32/protectbookmarks.svg                               |    1 
 icon-themes/sifr_dark_svg/cmd/32/protectfields.svg                                  |    1 
 icon-themes/sifr_dark_svg/cmd/lc_protectbookmarks.svg                               |    1 
 icon-themes/sifr_dark_svg/cmd/lc_protectfields.svg                                  |    1 
 icon-themes/sifr_dark_svg/cmd/sc_protectbookmarks.svg                               |    1 
 icon-themes/sifr_dark_svg/cmd/sc_protectfields.svg                                  |    1 
 icon-themes/sifr_svg/cmd/32/protectbookmarks.svg                                    |    1 
 icon-themes/sifr_svg/cmd/32/protectfields.svg                                       |    1 
 icon-themes/sifr_svg/cmd/lc_protectbookmarks.svg                                    |    1 
 icon-themes/sifr_svg/cmd/lc_protectfields.svg                                       |    1 
 icon-themes/sifr_svg/cmd/sc_protectbookmarks.svg                                    |    1 
 icon-themes/sifr_svg/cmd/sc_protectfields.svg                                       |    1 
 instsetoo_native/CustomTarget_install.mk                                            |    2 
 instsetoo_native/CustomTarget_setup.mk                                              |    2 
 officecfg/Configuration_officecfg.mk                                                |    3 
 officecfg/registry/data/org/openoffice/Office/Common.xcu                            |    4 
 officecfg/registry/data/org/openoffice/Office/UI/WriterWindowState.xcu              |   14 
 postprocess/CustomTarget_registry.mk                                                |    6 
 sc/source/ui/docshell/impex.cxx                                                     |    4 
 scp2/AutoInstall.mk                                                                 |    1 
 scp2/InstallModule_python.mk                                                        |    6 
 setup_native/source/packinfo/packinfo_office.txt                                    |   17 -
 sfx2/source/appl/appserv.cxx                                                        |    8 
 sfx2/source/doc/objmisc.cxx                                                         |    3 
 solenv/bin/modules/installer/download.pm                                            |    2 
 solenv/bin/modules/installer/setupscript.pm                                         |    2 
 sw/inc/IDocumentMarkAccess.hxx                                                      |    3 
 sw/inc/IDocumentSettingAccess.hxx                                                   |    2 
 sw/inc/cmdid.h                                                                      |    3 
 sw/sdi/_textsh.sdi                                                                  |   13 
 sw/sdi/swriter.sdi                                                                  |   36 ++
 sw/source/core/crsr/pam.cxx                                                         |   43 ++
 sw/source/core/doc/DocumentSettingManager.cxx                                       |   11 
 sw/source/core/doc/docbm.cxx                                                        |  149 ++++++----
 sw/source/core/inc/DocumentSettingManager.hxx                                       |    2 
 sw/source/core/inc/MarkManager.hxx                                                  |    1 
 sw/source/ui/misc/bookmark.cxx                                                      |   19 -
 sw/source/uibase/docvw/edtwin.cxx                                                   |    4 
 sw/source/uibase/inc/bookmark.hxx                                                   |    1 
 sw/source/uibase/shells/textsh1.cxx                                                 |   27 +
 sw/source/uibase/uno/SwXDocumentSettings.cxx                                        |   37 ++
 sw/source/uibase/utlui/content.cxx                                                  |   26 +
 sw/source/uibase/wrtsh/delete.cxx                                                   |   12 
 vcl/source/app/svapp.cxx                                                            |   11 
 vcl/source/window/menu.cxx                                                          |    7 
 vcl/win/app/salinfo.cxx                                                             |   10 
 xmlsecurity/qa/unit/signing/signing.cxx                                             |   30 --
 111 files changed, 527 insertions(+), 277 deletions(-)

New commits:
commit 4c3f554b44d417bf5ba48d40a8925ef46cc6eaf1
Author:     Stephan Bergmann <sbergman at redhat.com>
AuthorDate: Wed Nov 27 10:28:52 2019 +0100
Commit:     Vasily Melenchuk <vasily.melenchuk at cib.de>
CommitDate: Sat Dec 5 19:28:45 2020 +0300

    external/liblangtag: Avoid null pointer deref in lt_warning call
    
    Recent GCC 10 trunk warns (when LO is configured with --enable-optimized):
    
    > In file included from lt-script-db.c:24:
    > lt-script-db.c: In function ‘lt_script_db_parse.constprop’:
    > lt-messages.h:105:2: error: ‘%s’ directive argument is null [-Werror=format-overflow=]
    >   105 |  lt_message_printf(LT_MSG_WARNING, \
    >       |  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    >   106 |      LT_MSG_FLAG_NONE, \
    >       |      ~~~~~~~~~~~~~~~~~~~
    >   107 |      0,   \
    >       |      ~~~~~~
    >   108 |      __VA_ARGS__)
    >       |      ~~~~~~~~~~~~
    > lt-script-db.c:137:4: note: in expansion of macro ‘lt_warning’
    >   137 |    lt_warning("No subtag node: description = '%s'",
    >       |    ^~~~~~~~~~
    > lt-script-db.c:137:47: note: format string is defined here
    >   137 |    lt_warning("No subtag node: description = '%s'",
    >       |                                               ^~
    
    Change-Id: I2924f7aab84f4f2640f277ee5c2689753627ae78
    Reviewed-on: https://gerrit.libreoffice.org/83869
    Tested-by: Jenkins
    Reviewed-by: Stephan Bergmann <sbergman at redhat.com>
    (cherry picked from commit 047e8ae5d189f030d565b13f97a4d6a45b00e6be)

diff --git a/external/liblangtag/UnpackedTarball_liblangtag.mk b/external/liblangtag/UnpackedTarball_liblangtag.mk
index cd52b169fa57..66b8051782d0 100644
--- a/external/liblangtag/UnpackedTarball_liblangtag.mk
+++ b/external/liblangtag/UnpackedTarball_liblangtag.mk
@@ -17,6 +17,8 @@ $(eval $(call gb_UnpackedTarball_set_pre_action,liblangtag,\
 
 $(eval $(call gb_UnpackedTarball_update_autoconf_configs,liblangtag))
 
+$(eval $(call gb_UnpackedTarball_set_patchlevel,liblangtag,0))
+
 ifneq ($(OS),MACOSX)
 ifneq ($(OS),WNT)
 $(eval $(call gb_UnpackedTarball_add_patches,liblangtag,\
@@ -29,6 +31,7 @@ $(eval $(call gb_UnpackedTarball_add_patches,liblangtag, \
 	$(if $(SYSTEM_LIBXML),,external/liblangtag/langtag-libtool-rpath.patch.0) \
     external/liblangtag/clang-cl.patch.0 \
     external/liblangtag/langtag-valencia.patch.0 \
+    external/liblangtag/Wformat-overflow.patch \
 ))
 
 # vim: set noet sw=4 ts=4:
diff --git a/external/liblangtag/Wformat-overflow.patch b/external/liblangtag/Wformat-overflow.patch
new file mode 100644
index 000000000000..f2d017e4b395
--- /dev/null
+++ b/external/liblangtag/Wformat-overflow.patch
@@ -0,0 +1,17 @@
+--- liblangtag/lt-script-db.c
++++ liblangtag/lt-script-db.c
+@@ -134,8 +134,12 @@
+ 			cnode = cnode->next;
+ 		}
+ 		if (!subtag) {
+-			lt_warning("No subtag node: description = '%s'",
+-				   desc);
++			if (!desc) {
++				lt_warning("No subtag nor description node");
++			} else {
++				lt_warning("No subtag node: description = '%s'",
++					   desc);
++			}
+ 			goto bail1;
+ 		}
+ 		if (!desc) {
commit 38718128bdedeea4343d0af7d9609ddd69bf5a61
Author:     Thorsten Behrens <Thorsten.Behrens at CIB.de>
AuthorDate: Wed Apr 22 01:10:13 2020 +0200
Commit:     Vasily Melenchuk <vasily.melenchuk at cib.de>
CommitDate: Sat Dec 5 19:26:58 2020 +0300

    Get local, no-upload crash dumps working again
    
    With this, CrashDumpEnable=true and CrashDumpUrl missing will
    create local dmp files, but never upload/present GUI for it.
    
    Change-Id: I0bae48a0accace01dc8507cccb2a7b02a4de61a0

diff --git a/desktop/source/app/crashreport.cxx b/desktop/source/app/crashreport.cxx
index 2d14c32ae6b3..c2236631b5af 100644
--- a/desktop/source/app/crashreport.cxx
+++ b/desktop/source/app/crashreport.cxx
@@ -119,7 +119,10 @@ void CrashReporter::writeCommonInfo()
     rtl::Bootstrap::get("CrashDumpUrl", url);
     if (url.isEmpty())
     {
-        // no url in config, bail out
+        // no url in config, bail out, but still set proper crash
+        // directory for local dump generation (incase CrashDumpEnable
+        // is on
+        updateMinidumpLocation();
         mbInit = false;
         return;
     }
commit f67e4da406f8753fb041705cf197690e7fd9a0aa
Author:     Thorsten Behrens <Thorsten.Behrens at CIB.de>
AuthorDate: Tue Apr 21 19:06:44 2020 +0200
Commit:     Vasily Melenchuk <vasily.melenchuk at cib.de>
CommitDate: Sat Dec 5 19:25:48 2020 +0300

    Some optimisations around crashreporter status queries
    
    * make dump enable status query static
    * only offer crash UI if dump is enabled
    
    Change-Id: I71aff4c6ca5a73e4d1db6163cdf8dec75b9e7538

diff --git a/desktop/source/app/app.cxx b/desktop/source/app/app.cxx
index e5d0939b2e93..60bee01beadf 100644
--- a/desktop/source/app/app.cxx
+++ b/desktop/source/app/app.cxx
@@ -2007,7 +2007,8 @@ void Desktop::OpenClients()
 #endif
 
 #if HAVE_FEATURE_BREAKPAD
-    if (officecfg::Office::Common::Misc::CrashReport::get() && CrashReporter::crashReportInfoExists())
+    if (CrashReporter::IsDumpEnable() &&
+        officecfg::Office::Common::Misc::CrashReport::get() && CrashReporter::crashReportInfoExists())
         handleCrashReport();
 #endif
 
diff --git a/desktop/source/app/crashreport.cxx b/desktop/source/app/crashreport.cxx
index 5d48593c42cb..2d14c32ae6b3 100644
--- a/desktop/source/app/crashreport.cxx
+++ b/desktop/source/app/crashreport.cxx
@@ -231,15 +231,21 @@ void CrashReporter::removeExceptionHandler()
 
 bool CrashReporter::IsDumpEnable()
 {
+    static bool bConfigRead = false;
+    static bool bEnable = true; // default, always on
+
+    if (bConfigRead)
+        return bEnable;
+
     OUString sToken;
     OString  sEnvVar(std::getenv("CRASH_DUMP_ENABLE"));
-    bool     bEnable = true;   // default, always on
     // read configuration item 'CrashDumpEnable' -> bool on/off
     if (rtl::Bootstrap::get("CrashDumpEnable", sToken) && sEnvVar.isEmpty())
     {
         bEnable = sToken.toBoolean();
     }
 
+    bConfigRead = true;
     return bEnable;
 }
 
commit 308cccb962ad5e3367f7e87fb9fe8b9c3230ded7
Author:     Thorsten Behrens <Thorsten.Behrens at CIB.de>
AuthorDate: Tue Apr 21 17:19:29 2020 +0200
Commit:     Vasily Melenchuk <vasily.melenchuk at cib.de>
CommitDate: Sat Dec 5 19:21:22 2020 +0300

    Remove collect usage info from GUI
    
    Change-Id: I1a7420c557187097b424d298c020bcb837a8261c

diff --git a/cui/source/options/optgdlg.cxx b/cui/source/options/optgdlg.cxx
index 809e8f8ba68a..64da15adad57 100644
--- a/cui/source/options/optgdlg.cxx
+++ b/cui/source/options/optgdlg.cxx
@@ -240,7 +240,6 @@ OfaMiscTabPage::OfaMiscTabPage(weld::Container* pPage, weld::DialogController* p
     , m_xYearFrame(m_xBuilder->weld_widget("yearframe"))
     , m_xYearValueField(m_xBuilder->weld_spin_button("year"))
     , m_xToYearFT(m_xBuilder->weld_label("toyear"))
-    , m_xCollectUsageInfo(m_xBuilder->weld_check_button("collectusageinfo"))
     , m_xCrashReport(m_xBuilder->weld_check_button("crashreport"))
     , m_xQuickStarterFrame(m_xBuilder->weld_widget("quickstarter"))
 #if defined(UNX)
@@ -335,12 +334,6 @@ bool OfaMiscTabPage::FillItemSet( SfxItemSet* rSet )
         rSet->Put( SfxUInt16Item( SID_ATTR_YEAR2000, nNum ) );
     }
 
-    if (m_xCollectUsageInfo->get_state_changed_from_saved())
-    {
-        officecfg::Office::Common::Misc::CollectUsageInformation::set(m_xCollectUsageInfo->get_active(), batch);
-        bModified = true;
-    }
-
 #if HAVE_FEATURE_BREAKPAD
     if (m_xCrashReport->get_state_changed_from_saved())
     {
@@ -388,10 +381,6 @@ void OfaMiscTabPage::Reset( const SfxItemSet* rSet )
     else
         m_xYearFrame->set_sensitive(false);
 
-    m_xCollectUsageInfo->set_active(officecfg::Office::Common::Misc::CollectUsageInformation::get());
-    m_xCollectUsageInfo->set_sensitive(!officecfg::Office::Common::Misc::CollectUsageInformation::isReadOnly());
-    m_xCollectUsageInfo->save_state();
-
 #if HAVE_FEATURE_BREAKPAD
     m_xCrashReport->set_active(officecfg::Office::Common::Misc::CrashReport::get() && CrashReporter::IsDumpEnable());
     m_xCrashReport->set_sensitive(!officecfg::Office::Common::Misc::CrashReport::isReadOnly() && CrashReporter::IsDumpEnable());
diff --git a/cui/source/options/optgdlg.hxx b/cui/source/options/optgdlg.hxx
index 5c591e7c876f..0da61dd53f1e 100644
--- a/cui/source/options/optgdlg.hxx
+++ b/cui/source/options/optgdlg.hxx
@@ -50,7 +50,6 @@ private:
     std::unique_ptr<weld::Widget> m_xYearFrame;
     std::unique_ptr<weld::SpinButton> m_xYearValueField;
     std::unique_ptr<weld::Label> m_xToYearFT;
-    std::unique_ptr<weld::CheckButton> m_xCollectUsageInfo;
     std::unique_ptr<weld::CheckButton> m_xCrashReport;
     std::unique_ptr<weld::Widget> m_xQuickStarterFrame;
     std::unique_ptr<weld::CheckButton> m_xQuickLaunchCB;
diff --git a/cui/uiconfig/ui/optgeneralpage.ui b/cui/uiconfig/ui/optgeneralpage.ui
index dc1fa2231ecf..8177315cbe67 100644
--- a/cui/uiconfig/ui/optgeneralpage.ui
+++ b/cui/uiconfig/ui/optgeneralpage.ui
@@ -315,74 +315,6 @@
         <property name="top_attach">4</property>
       </packing>
     </child>
-    <child>
-      <object class="GtkFrame" id="privacyframe">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="label_xalign">0</property>
-        <property name="shadow_type">none</property>
-        <child>
-          <object class="GtkAlignment" id="alignment6">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <property name="top_padding">6</property>
-            <property name="left_padding">12</property>
-            <child>
-              <object class="GtkGrid">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <child>
-                  <object class="GtkCheckButton" id="collectusageinfo">
-                    <property name="label" translatable="yes" context="optgeneralpage|collectusageinfo">Collect usage data and send it to The Document Foundation</property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">False</property>
-                    <property name="margin_top">1</property>
-                    <property name="use_underline">True</property>
-                    <property name="xalign">0</property>
-                    <property name="draw_indicator">True</property>
-                  </object>
-                  <packing>
-                    <property name="left_attach">0</property>
-                    <property name="top_attach">0</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkCheckButton" id="crashreport">
-                    <property name="label" translatable="yes" context="optgeneralpage|crashreport">Sen_d crash reports to The Document Foundation</property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">False</property>
-                    <property name="halign">start</property>
-                    <property name="use_underline">True</property>
-                    <property name="active">True</property>
-                    <property name="draw_indicator">True</property>
-                  </object>
-                  <packing>
-                    <property name="left_attach">0</property>
-                    <property name="top_attach">1</property>
-                  </packing>
-                </child>
-              </object>
-            </child>
-          </object>
-        </child>
-        <child type="label">
-          <object class="GtkLabel" id="label7">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <property name="label" translatable="yes" context="optgeneralpage|label7">Help Improve %PRODUCTNAME</property>
-            <attributes>
-              <attribute name="weight" value="bold"/>
-            </attributes>
-          </object>
-        </child>
-      </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">5</property>
-      </packing>
-    </child>
     <child>
       <object class="GtkFrame" id="quickstarter">
         <property name="visible">True</property>
commit 8961f4aaf38db139eb8f154d1c8bb788c992a4e7
Author:     Thorsten Behrens <Thorsten.Behrens at CIB.de>
AuthorDate: Tue Apr 21 01:13:46 2020 +0200
Commit:     Vasily Melenchuk <vasily.melenchuk at cib.de>
CommitDate: Sat Dec 5 19:21:22 2020 +0300

    related tdf#127711: read crashdump URL from ini file
    
    Change-Id: I68f06aaf5b8c053d1deef2021876b1399e422dd7

diff --git a/desktop/source/app/crashreport.cxx b/desktop/source/app/crashreport.cxx
index 743ae43e7c9b..5d48593c42cb 100644
--- a/desktop/source/app/crashreport.cxx
+++ b/desktop/source/app/crashreport.cxx
@@ -112,9 +112,18 @@ void CrashReporter::writeCommonInfo()
     ucbhelper::InternetProxyDecider proxy_decider(::comphelper::getProcessComponentContext());
 
     const OUString protocol = "https";
-    const OUString url = "crashreport.libreoffice.org";
     const sal_Int32 port = 443;
 
+    // read configuration item 'CrashDumpUrl'
+    OUString url;
+    rtl::Bootstrap::get("CrashDumpUrl", url);
+    if (url.isEmpty())
+    {
+        // no url in config, bail out
+        mbInit = false;
+        return;
+    }
+
     const ucbhelper::InternetProxyServer proxy_server = proxy_decider.getProxy(protocol, url, port);
 
     // save the new Keys
commit 2fd254b76c0463e24f0928b170cdd7a93f8d3b79
Author:     Samuel Mehrbrodt <Samuel.Mehrbrodt at cib.de>
AuthorDate: Thu Feb 13 09:37:20 2020 +0100
Commit:     Vasily Melenchuk <vasily.melenchuk at cib.de>
CommitDate: Sat Dec 5 19:21:22 2020 +0300

    Add uno cmd to protect bookmarks in a document
    
    Change-Id: I7cc0dfa2b129d69d49b555495d77c2c710689e94
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/88586
    Tested-by: Jenkins
    Reviewed-by: Samuel Mehrbrodt <Samuel.Mehrbrodt at cib.de>
    (cherry picked from commit 4a5c627e61dc1bd67106a18319eabecb50b79658)
    
    Without the WriterCommands/UI changes.
    
    Change-Id: Ib1d28f96bd1c4a87ef644a376cefa2cf5c7e6728
    
    Conflicts:
            officecfg/registry/data/org/openoffice/Office/UI/WriterCommands.xcu
            sw/sdi/_textsh.sdi
            sw/sdi/swriter.sdi

diff --git a/sw/inc/cmdid.h b/sw/inc/cmdid.h
index 2e669c681547..34fc28b713a8 100644
--- a/sw/inc/cmdid.h
+++ b/sw/inc/cmdid.h
@@ -282,6 +282,7 @@
 #define FN_INSERT_DATE_FORMFIELD        (FN_INSERT2 + 25)
 
 #define FN_PROTECT_FIELDS               (FN_INSERT2 + 26)
+#define FN_PROTECT_BOOKMARKS            (FN_INSERT2 + 27)
 
 // clipboard table content
 #define FN_PASTE_NESTED_TABLE       (FN_INSERT2 + 30)  /* instead of the cell-by-cell copy between source and target tables */
diff --git a/sw/sdi/_textsh.sdi b/sw/sdi/_textsh.sdi
index 3296b4142908..a2bfa8e5bdf6 100644
--- a/sw/sdi/_textsh.sdi
+++ b/sw/sdi/_textsh.sdi
@@ -1746,5 +1746,10 @@ interface BaseText
         StateMethod = GetState ;
     ]
 
-}  // end of interface text
+    FN_PROTECT_BOOKMARKS
+    [
+        ExecMethod = Execute ;
+        StateMethod = GetState ;
+    ]
 
+}  // end of interface text
diff --git a/sw/sdi/swriter.sdi b/sw/sdi/swriter.sdi
index 1d4594c632ce..5f8b5358309a 100644
--- a/sw/sdi/swriter.sdi
+++ b/sw/sdi/swriter.sdi
@@ -7952,3 +7952,21 @@ SfxUInt32Item TableColumWidth SID_ATTR_TABLE_COLUMN_WIDTH
     ToolBoxConfig = FALSE,
     GroupId = SfxGroupId::Table;
 ]
+
+SfxBoolItem ProtectBookmarks FN_PROTECT_BOOKMARKS
+
+[
+    AutoUpdate = TRUE,
+    FastCall = FALSE,
+    ReadOnlyDoc = FALSE,
+    Toggle = TRUE,
+    Container = FALSE,
+    RecordAbsolute = FALSE,
+    RecordPerSet;
+
+
+    AccelConfig = FALSE,
+    MenuConfig = FALSE,
+    ToolBoxConfig = FALSE,
+    GroupId = SfxGroupId::Controls;
+]
diff --git a/sw/source/uibase/shells/textsh1.cxx b/sw/source/uibase/shells/textsh1.cxx
index 07fef43cd8ec..54d5ab88a088 100644
--- a/sw/source/uibase/shells/textsh1.cxx
+++ b/sw/source/uibase/shells/textsh1.cxx
@@ -1435,9 +1435,13 @@ void SwTextShell::Execute(SfxRequest &rReq)
     }
     break;
     case FN_PROTECT_FIELDS:
+    case FN_PROTECT_BOOKMARKS:
     {
         IDocumentSettingAccess& rIDSA = rWrtSh.getIDocumentSettingAccess();
-        rIDSA.set(DocumentSettingId::PROTECT_FIELDS, !rIDSA.get(DocumentSettingId::PROTECT_FIELDS));
+        DocumentSettingId aSettingId = nSlot == FN_PROTECT_FIELDS
+                                           ? DocumentSettingId::PROTECT_FIELDS
+                                           : DocumentSettingId::PROTECT_BOOKMARKS;
+        rIDSA.set(aSettingId, !rIDSA.get(aSettingId));
         // Invalidate so that toggle state gets updated
         SfxViewFrame* pViewFrame = GetView().GetViewFrame();
         pViewFrame->GetBindings().Invalidate(nSlot);
@@ -2035,9 +2039,12 @@ void SwTextShell::GetState( SfxItemSet &rSet )
             }
             break;
             case FN_PROTECT_FIELDS:
+            case FN_PROTECT_BOOKMARKS:
             {
-                bool bProtected
-                    = rSh.getIDocumentSettingAccess().get(DocumentSettingId::PROTECT_FIELDS);
+                DocumentSettingId aSettingId = nWhich == FN_PROTECT_FIELDS
+                                                   ? DocumentSettingId::PROTECT_FIELDS
+                                                   : DocumentSettingId::PROTECT_BOOKMARKS;
+                bool bProtected = rSh.getIDocumentSettingAccess().get(aSettingId);
                 rSet.Put(SfxBoolItem(nWhich, bProtected));
             }
             break;
commit 35be7761f8f67f9bbc7aaf0ec119a3fc7b08190a
Author:     Samuel Mehrbrodt <Samuel.Mehrbrodt at cib.de>
AuthorDate: Thu Feb 13 09:21:41 2020 +0100
Commit:     Vasily Melenchuk <vasily.melenchuk at cib.de>
CommitDate: Sat Dec 5 19:21:22 2020 +0300

    Add uno cmd to protect fields in a document
    
    Change-Id: Ifb9f757111a6fcbb283d2350ed2ccd42de19d5df
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/88585
    Tested-by: Jenkins
    Reviewed-by: Samuel Mehrbrodt <Samuel.Mehrbrodt at cib.de>
    (cherry picked from commit 087d9191ab642e4b00afb71571d83ffe04589769)
    
    Without the WriterCommands string/UI changes.
    
    Change-Id: I8f8a88bf7624438923b5f611549c703e304763b5
    
    Conflicts:
            officecfg/registry/data/org/openoffice/Office/UI/WriterCommands.xcu
            sw/inc/cmdid.h
            sw/sdi/_textsh.sdi
            sw/sdi/swriter.sdi
            sw/source/uibase/shells/textsh1.cxx

diff --git a/sw/inc/cmdid.h b/sw/inc/cmdid.h
index f382e820cf0b..2e669c681547 100644
--- a/sw/inc/cmdid.h
+++ b/sw/inc/cmdid.h
@@ -281,6 +281,8 @@
 // MSO content controls
 #define FN_INSERT_DATE_FORMFIELD        (FN_INSERT2 + 25)
 
+#define FN_PROTECT_FIELDS               (FN_INSERT2 + 26)
+
 // clipboard table content
 #define FN_PASTE_NESTED_TABLE       (FN_INSERT2 + 30)  /* instead of the cell-by-cell copy between source and target tables */
 #define FN_TABLE_PASTE_ROW_BEFORE   (FN_INSERT2 + 31)  /* paste table as new table rows */
diff --git a/sw/sdi/_textsh.sdi b/sw/sdi/_textsh.sdi
index bfd47719ca35..3296b4142908 100644
--- a/sw/sdi/_textsh.sdi
+++ b/sw/sdi/_textsh.sdi
@@ -1740,5 +1740,11 @@ interface BaseText
         StateMethod = GetState ;
     ]
 
+    FN_PROTECT_FIELDS
+    [
+        ExecMethod = Execute ;
+        StateMethod = GetState ;
+    ]
+
 }  // end of interface text
 
diff --git a/sw/sdi/swriter.sdi b/sw/sdi/swriter.sdi
index d063a0dd5441..1d4594c632ce 100644
--- a/sw/sdi/swriter.sdi
+++ b/sw/sdi/swriter.sdi
@@ -7899,6 +7899,24 @@ SfxVoidItem DatePickerFormField FN_INSERT_DATE_FORMFIELD
     GroupId = SfxGroupId::Controls;
 ]
 
+SfxBoolItem ProtectFields FN_PROTECT_FIELDS
+
+[
+    AutoUpdate = TRUE,
+    FastCall = FALSE,
+    ReadOnlyDoc = FALSE,
+    Toggle = TRUE,
+    Container = FALSE,
+    RecordAbsolute = FALSE,
+    RecordPerSet;
+
+
+    AccelConfig = TRUE,
+    MenuConfig = TRUE,
+    ToolBoxConfig = TRUE,
+    GroupId = SfxGroupId::Controls;
+]
+
 SfxUInt32Item TableRowHeight SID_ATTR_TABLE_ROW_HEIGHT
 
 [
diff --git a/sw/source/uibase/shells/textsh1.cxx b/sw/source/uibase/shells/textsh1.cxx
index 1f5c0d246eb4..07fef43cd8ec 100644
--- a/sw/source/uibase/shells/textsh1.cxx
+++ b/sw/source/uibase/shells/textsh1.cxx
@@ -1434,6 +1434,16 @@ void SwTextShell::Execute(SfxRequest &rReq)
         }
     }
     break;
+    case FN_PROTECT_FIELDS:
+    {
+        IDocumentSettingAccess& rIDSA = rWrtSh.getIDocumentSettingAccess();
+        rIDSA.set(DocumentSettingId::PROTECT_FIELDS, !rIDSA.get(DocumentSettingId::PROTECT_FIELDS));
+        // Invalidate so that toggle state gets updated
+        SfxViewFrame* pViewFrame = GetView().GetViewFrame();
+        pViewFrame->GetBindings().Invalidate(nSlot);
+        pViewFrame->GetBindings().Update(nSlot);
+    }
+    break;
     default:
         OSL_ENSURE(false, "wrong dispatcher");
         return;
@@ -2023,6 +2033,14 @@ void SwTextShell::GetState( SfxItemSet &rSet )
                     rSet.DisableItem(nWhich);
                 break;
             }
+            break;
+            case FN_PROTECT_FIELDS:
+            {
+                bool bProtected
+                    = rSh.getIDocumentSettingAccess().get(DocumentSettingId::PROTECT_FIELDS);
+                rSet.Put(SfxBoolItem(nWhich, bProtected));
+            }
+            break;
         }
         nWhich = aIter.NextWhich();
     }
commit d715d066444fa6d5c332623bb4013ca34ccdf5c3
Author:     Michael Stahl <Michael.Stahl at cib.de>
AuthorDate: Thu Mar 26 15:53:52 2020 +0100
Commit:     Vasily Melenchuk <vasily.melenchuk at cib.de>
CommitDate: Sat Dec 5 19:21:21 2020 +0300

    sw: SwEditWin: for CUT of a read-only selection, pop up info dialog
    
    ... as is already done for PASTE, so the user doesn't wonder why it
    doesn't work.
    
    Change-Id: I4c967fdf46bc76f0930d665cf84ca27ef92c00d6
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/91142
    Tested-by: Jenkins
    Reviewed-by: Michael Stahl <michael.stahl at cib.de>
    (cherry picked from commit b6fb2719170d1d96fc60305d73663ddd81d887e5)

diff --git a/sw/source/uibase/docvw/edtwin.cxx b/sw/source/uibase/docvw/edtwin.cxx
index 6a5c786ddd88..20f5761f1361 100644
--- a/sw/source/uibase/docvw/edtwin.cxx
+++ b/sw/source/uibase/docvw/edtwin.cxx
@@ -2265,7 +2265,9 @@ KEYINPUT_CHECKTABLE_INSDEL:
                 if( !m_aInBuffer.isEmpty() && ( !bNormalChar || bIsDocReadOnly ))
                     FlushInBuffer();
 
-                if (rSh.HasReadonlySel() && rKeyCode.GetFunction() == KeyFuncType::PASTE)
+                if (rSh.HasReadonlySel()
+                    && (   rKeyCode.GetFunction() == KeyFuncType::PASTE
+                        || rKeyCode.GetFunction() == KeyFuncType::CUT))
                 {
                     auto xInfo(std::make_shared<weld::GenericDialogController>(GetFrameWeld(), "modules/swriter/ui/inforeadonlydialog.ui", "InfoReadonlyDialog"));
                     weld::DialogController::runAsync(xInfo, [](int) {});
commit e1cdbad827079844cd61f72ad5a99936fe9a6a7f
Author:     Michael Stahl <Michael.Stahl at cib.de>
AuthorDate: Thu Mar 26 15:24:37 2020 +0100
Commit:     Vasily Melenchuk <vasily.melenchuk at cib.de>
CommitDate: Sat Dec 5 19:21:21 2020 +0300

    sw: PROTECT_FIELDS should not protect placeholder fields
    
    The text placeholder field becomes totally nonfunctional, the other
    placeholder fields allow inserting but are then not deleted; just ignore
    protection for placeholder fields.
    
    Change-Id: Ic478a32d616464bfe7f24fc851c1998b5e01a23b
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/91140
    Tested-by: Jenkins
    Reviewed-by: Michael Stahl <michael.stahl at cib.de>
    (cherry picked from commit 3fc68fdc6f4ef04091db2fd46499a10396c3a4f2)

diff --git a/sw/source/core/crsr/pam.cxx b/sw/source/core/crsr/pam.cxx
index a50dff28e6b7..b47b35b4bc30 100644
--- a/sw/source/core/crsr/pam.cxx
+++ b/sw/source/core/crsr/pam.cxx
@@ -775,7 +775,9 @@ bool SwPaM::HasReadonlySel( bool bFormView ) const
                         {
                             break; // after selection
                         }
-                        if (pHint->Which() == RES_TXTATR_FIELD)
+                        if (pHint->Which() == RES_TXTATR_FIELD
+                            // placeholders don't work if you can't delete them
+                            && pHint->GetFormatField().GetField()->GetTyp()->Which() != SwFieldIds::JumpEdit)
                         {
                             return true;
                         }
commit 10522c514a26e5667e5655fd38ac4f298cf72512
Author:     Katarina Behrens <Katarina.Behrens at cib.de>
AuthorDate: Fri Jan 24 18:40:24 2020 +0100
Commit:     Vasily Melenchuk <vasily.melenchuk at cib.de>
CommitDate: Sat Dec 5 19:21:21 2020 +0300

    sw: Optionally disable bookmark manipulation GUIs
    
    If the ProtectBookmarks bit is set, don't allow bookmark
    changes, neither via the bookmark dialog nor the navigator.
    
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/87361
    Tested-by: Jenkins
    Reviewed-by: Michael Stahl <michael.stahl at cib.de>
    (cherry picked from commit cb5d18871b46ef4f7bc47eb4d71df5374d712575)
    
    Omit new strings for backport to 6.1 branch, was only shown as
    disabled context menu item anyway.
    
    Change-Id: I035faaf3871c7107dd1aac38c4e6867291827346

diff --git a/sw/source/ui/misc/bookmark.cxx b/sw/source/ui/misc/bookmark.cxx
index 7267f5a059f4..7f5e82fbbe4e 100644
--- a/sw/source/ui/misc/bookmark.cxx
+++ b/sw/source/ui/misc/bookmark.cxx
@@ -36,6 +36,7 @@
 #include <ndtxt.hxx>
 #include <strings.hrc>
 #include <svtools/miscopt.hxx>
+#include <IDocumentSettingAccess.hxx>
 
 using namespace ::com::sun::star;
 
@@ -82,12 +83,13 @@ IMPL_LINK_NOARG(SwInsertBookmarkDlg, ModifyHdl, weld::Entry&, void)
     }
 
     // allow to add new bookmark only if one name provided and it's not taken
-    m_xInsertBtn->set_sensitive(nEntries == 1 && nSelectedEntries == 0 && !bHasForbiddenChars);
+    m_xInsertBtn->set_sensitive(nEntries == 1 && nSelectedEntries == 0 && !bHasForbiddenChars
+                                && !m_bAreProtected);
 
     // allow to delete only if all bookmarks are recognized
-    m_xDeleteBtn->set_sensitive(nEntries > 0 && nSelectedEntries == nEntries);
+    m_xDeleteBtn->set_sensitive(nEntries > 0 && nSelectedEntries == nEntries && !m_bAreProtected);
     m_xGotoBtn->set_sensitive(nEntries == 1 && nSelectedEntries == 1);
-    m_xRenameBtn->set_sensitive(nEntries == 1 && nSelectedEntries == 1);
+    m_xRenameBtn->set_sensitive(nEntries == 1 && nSelectedEntries == 1 && !m_bAreProtected);
 }
 
 // callback to delete a text mark
@@ -164,13 +166,13 @@ IMPL_LINK_NOARG(SwInsertBookmarkDlg, SelectionChangedHdl, weld::TreeView&, void)
     {
         m_xInsertBtn->set_sensitive(false);
         m_xGotoBtn->set_sensitive(nSelectedRows == 1);
-        m_xRenameBtn->set_sensitive(nSelectedRows == 1);
-        m_xDeleteBtn->set_sensitive(true);
+        m_xRenameBtn->set_sensitive(nSelectedRows == 1 && !m_bAreProtected);
+        m_xDeleteBtn->set_sensitive(!m_bAreProtected);
         m_xEditBox->set_text(sEditBoxText.makeStringAndClear());
     }
     else
     {
-        m_xInsertBtn->set_sensitive(true);
+        m_xInsertBtn->set_sensitive(!m_bAreProtected);
         m_xGotoBtn->set_sensitive(false);
         m_xRenameBtn->set_sensitive(false);
         m_xDeleteBtn->set_sensitive(false);
@@ -333,7 +335,8 @@ SwInsertBookmarkDlg::SwInsertBookmarkDlg(weld::Window* pParent, SwWrtShell& rS,
     m_xEditBox->set_text(m_xBookmarksBox->GetNameProposal());
     m_xEditBox->set_position(-1);
 
-    m_xForbiddenChars->set_label(SwResId(STR_BOOKMARK_FORBIDDENCHARS) + " " + BookmarkTable::aForbiddenChars);
+    m_xForbiddenChars->set_label(SwResId(STR_BOOKMARK_FORBIDDENCHARS) + " "
+                                 + BookmarkTable::aForbiddenChars);
     m_xForbiddenChars->set_visible(false);
 
     SvtMiscOptions aMiscOpt;
@@ -344,6 +347,8 @@ SwInsertBookmarkDlg::SwInsertBookmarkDlg(weld::Window* pParent, SwWrtShell& rS,
         m_xConditionED->set_visible( false );
     }
 
+    m_bAreProtected = rSh.getIDocumentSettingAccess().get(DocumentSettingId::PROTECT_BOOKMARKS);
+
     // disabled until "Hide" flag is not checked
     m_xConditionED->set_sensitive(false);
     m_xConditionFT->set_sensitive(false);
diff --git a/sw/source/uibase/inc/bookmark.hxx b/sw/source/uibase/inc/bookmark.hxx
index 7522dbe9bc12..3a8ee1506d58 100644
--- a/sw/source/uibase/inc/bookmark.hxx
+++ b/sw/source/uibase/inc/bookmark.hxx
@@ -69,6 +69,7 @@ class SwInsertBookmarkDlg : public SfxDialogController
     std::vector<std::pair<sw::mark::IMark*, OUString>> aTableBookmarks;
     sal_Int32                           m_nLastBookmarksCount;
     bool                                m_bSorted;
+    bool m_bAreProtected;
 
     std::unique_ptr<weld::Entry> m_xEditBox;
     std::unique_ptr<weld::Button> m_xInsertBtn;
diff --git a/sw/source/uibase/shells/textsh1.cxx b/sw/source/uibase/shells/textsh1.cxx
index 3907f2611fac..1f5c0d246eb4 100644
--- a/sw/source/uibase/shells/textsh1.cxx
+++ b/sw/source/uibase/shells/textsh1.cxx
@@ -705,7 +705,7 @@ void SwTextShell::Execute(SfxRequest &rReq)
         }
         case FN_DELETE_BOOKMARK:
         {
-            if ( pItem )
+            if (pItem && !rWrtSh.getIDocumentSettingAccess().get(DocumentSettingId::PROTECT_BOOKMARKS))
             {
                 IDocumentMarkAccess* const pMarkAccess = rWrtSh.getIDocumentMarkAccess();
                 pMarkAccess->deleteMark( pMarkAccess->findMark(static_cast<const SfxStringItem*>(pItem)->GetValue()) );
diff --git a/sw/source/uibase/utlui/content.cxx b/sw/source/uibase/utlui/content.cxx
index 85e6d4559608..483a605e869a 100644
--- a/sw/source/uibase/utlui/content.cxx
+++ b/sw/source/uibase/utlui/content.cxx
@@ -52,6 +52,7 @@
 #include <navicfg.hxx>
 #include <edtwin.hxx>
 #include <doc.hxx>
+#include <IDocumentSettingAccess.hxx>
 #include <IDocumentDrawModelAccess.hxx>
 #include <IDocumentOutlineNodes.hxx>
 #include <unotools.hxx>
@@ -346,7 +347,9 @@ void SwContentType::Init(bool* pbInvalidateWindow)
                 pMarkAccess->getBookmarksEnd(),
                 &lcl_IsUiVisibleBookmark);
             m_sTypeToken.clear();
-            m_bEdit = true;
+            const bool bProtectedBM = m_pWrtShell->getIDocumentSettingAccess().get(DocumentSettingId::PROTECT_BOOKMARKS);
+            m_bEdit = !bProtectedBM;
+            m_bDelete = !bProtectedBM;
         }
         break;
         case ContentTypeId::REGION :
@@ -1287,19 +1290,21 @@ VclPtr<PopupMenu> SwContentTree::CreateContextMenu()
         assert(dynamic_cast<SwContent*>(static_cast<SwTypeNumber*>(pEntry->GetUserData())));
         const SwContentType* pContType = static_cast<SwContent*>(pEntry->GetUserData())->GetParent();
         const ContentTypeId nContentType = pContType->GetType();
-        bool bReadonly = m_pActiveShell->GetView().GetDocShell()->IsReadOnly();
-        bool bVisible = !static_cast<SwContent*>(pEntry->GetUserData())->IsInvisible();
-        bool bProtected = static_cast<SwContent*>(pEntry->GetUserData())->IsProtect();
-        bool bEditable = pContType->IsEditable() &&
-            ((bVisible && !bProtected) ||ContentTypeId::REGION == nContentType);
-        bool bDeletable = pContType->IsDeletable() &&
-            ((bVisible && !bProtected) ||ContentTypeId::REGION == nContentType);
-        bool bRenamable = bEditable && !bReadonly &&
+        const bool bReadonly = m_pActiveShell->GetView().GetDocShell()->IsReadOnly();
+        const bool bVisible = !static_cast<SwContent*>(pEntry->GetUserData())->IsInvisible();
+        const bool bProtected = static_cast<SwContent*>(pEntry->GetUserData())->IsProtect();
+        const bool bProtectBM = (ContentTypeId::BOOKMARK == nContentType)
+            && m_pActiveShell->getIDocumentSettingAccess().get(DocumentSettingId::PROTECT_BOOKMARKS);
+        const bool bEditable = pContType->IsEditable() &&
+            ((bVisible && !bProtected && !bProtectBM) || ContentTypeId::REGION == nContentType);
+        const bool bDeletable = pContType->IsDeletable() &&
+            ((bVisible && !bProtected && !bProtectBM) || ContentTypeId::REGION == nContentType);
+        const bool bRenamable = bEditable && !bReadonly &&
             (ContentTypeId::TABLE == nContentType ||
                 ContentTypeId::FRAME == nContentType ||
                 ContentTypeId::GRAPHIC == nContentType ||
                 ContentTypeId::OLE == nContentType ||
-                ContentTypeId::BOOKMARK == nContentType ||
+                (ContentTypeId::BOOKMARK == nContentType && !bProtectBM) ||
                 ContentTypeId::REGION == nContentType||
                 ContentTypeId::INDEX == nContentType);
 
@@ -3529,6 +3534,7 @@ void SwContentTree::EditEntry(SvTreeListEntry const * pEntry, EditEntryMode nMod
                 nSlot = FN_FORMAT_FRAME_DLG;
         break;
         case ContentTypeId::BOOKMARK  :
+            assert(!m_pActiveShell->getIDocumentSettingAccess().get(DocumentSettingId::PROTECT_BOOKMARKS));
             if(nMode == EditEntryMode::DELETE)
             {
                 IDocumentMarkAccess* const pMarkAccess = m_pActiveShell->getIDocumentMarkAccess();
commit 00b26503c917dec96d6eb3981bcf17fdcb0e7f4f
Author:     Michael Stahl <Michael.Stahl at cib.de>
AuthorDate: Wed Feb 5 18:31:29 2020 +0100
Commit:     Vasily Melenchuk <vasily.melenchuk at cib.de>
CommitDate: Sat Dec 5 19:21:20 2020 +0300

    sw: read-only/protected content dialog was missing on Delete/Backspace
    
    If SwWrtShell::DelRight()/DelLeft() are called without an active
    selection, they select 1 character to the right/left, but then they
    don't check if the selection is read-only, so then SwEditShell::Delete()
    calls HasReadonlySel() and silently returns.
    
    Pop up the dialog in this case too, for consistency.
    
    Change-Id: I3d72f136f4d132de3f8a6f3cc2aab493ced95a28
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/88055
    Tested-by: Jenkins
    Reviewed-by: Michael Stahl <michael.stahl at cib.de>
    (cherry picked from commit 0788ab19869aa2ae5f7fbef9e3c13ceb641f80ee)

diff --git a/sw/source/uibase/wrtsh/delete.cxx b/sw/source/uibase/wrtsh/delete.cxx
index 4a2420ad7b84..5f6ed36c25e2 100644
--- a/sw/source/uibase/wrtsh/delete.cxx
+++ b/sw/source/uibase/wrtsh/delete.cxx
@@ -279,6 +279,12 @@ bool SwWrtShell::DelLeft()
     if( !bRet && bSwap )
         SwCursorShell::SwapPam();
     CloseMark( bRet );
+    if (!bRet)
+    {   // false indicates HasReadonlySel failed
+        std::unique_ptr<weld::Builder> xBuilder(Application::CreateBuilder(GetView().GetFrameWeld(), "modules/swriter/ui/inforeadonlydialog.ui"));
+        std::unique_ptr<weld::MessageDialog> xInfo(xBuilder->weld_message_dialog("InfoReadonlyDialog"));
+        xInfo->run();
+    }
     return bRet;
 }
 
@@ -394,6 +400,12 @@ bool SwWrtShell::DelRight()
         SwCursorShell::Right(1, CRSR_SKIP_CELLS);
         bRet = Delete();
         CloseMark( bRet );
+        if (!bRet)
+        {   // false indicates HasReadonlySel failed
+            std::unique_ptr<weld::Builder> xBuilder(Application::CreateBuilder(GetView().GetFrameWeld(), "modules/swriter/ui/inforeadonlydialog.ui"));
+            std::unique_ptr<weld::MessageDialog> xInfo(xBuilder->weld_message_dialog("InfoReadonlyDialog"));
+            xInfo->run();
+        }
         break;
 
     case SelectionType::Frame:
commit db0625dde18b8d6af4eca107838272c8243d5d7c
Author:     Michael Stahl <Michael.Stahl at cib.de>
AuthorDate: Fri Jan 31 12:05:43 2020 +0100
Commit:     Vasily Melenchuk <vasily.melenchuk at cib.de>
CommitDate: Sat Dec 5 19:21:19 2020 +0300

    sw: implement protection of bookmarks and fields
    
    SwPaM::HasReadonlySel() checks PROTECT_BOOKMARKS / PROTECT_FIELDS
    setting and checks if bookmarks or fields are selected for deletion.
    
    This should already be called by the UI code in all the right places,
    for the other content protection features, and cause a dialog to pop
    up.
    
    What's not ideal about this is that it's impossible to delete a
    character immediately before or after a point bookmark because that
    would delete the point bookmark too.
    
    The bookmark check is done by extracting a function out of
    MarkManager::deleteMarks() so both will use the same logic.
    
    The problem of DelContentIndex() duplicating that logic remains...
    
    Apparently the status bar at the bottom already displays "read-only"
    for such a selection.
    
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/87778
    Tested-by: Jenkins
    Reviewed-by: Michael Stahl <michael.stahl at cib.de>
    (cherry picked from commit 9e7b5c74b484fcfd3317db56745b26b10897047d)
    
    Change-Id: Id87999198a03ba847ef0eff5651fef3bd2517fae

diff --git a/sw/inc/IDocumentMarkAccess.hxx b/sw/inc/IDocumentMarkAccess.hxx
index a076a6dada66..736f12e98c8f 100644
--- a/sw/inc/IDocumentMarkAccess.hxx
+++ b/sw/inc/IDocumentMarkAccess.hxx
@@ -278,6 +278,9 @@ class IDocumentMarkAccess
 
         // interface IBookmarks (BOOKMARK, CROSSREF_NUMITEM_BOOKMARK, CROSSREF_HEADING_BOOKMARK )
 
+        /** check if the selection would delete a BOOKMARK */
+        virtual bool isBookmarkDeleted(SwPaM const& rPaM) const =0;
+
         /** returns a STL-like random access iterator to the begin of the sequence the IBookmarks.
         */
         virtual const_iterator_t getBookmarksBegin() const =0;
diff --git a/sw/source/core/crsr/pam.cxx b/sw/source/core/crsr/pam.cxx
index 437864f6df56..a50dff28e6b7 100644
--- a/sw/source/core/crsr/pam.cxx
+++ b/sw/source/core/crsr/pam.cxx
@@ -43,6 +43,7 @@
 #include <IMark.hxx>
 #include <DocumentSettingManager.hxx>
 #include <hints.hxx>
+#include <txatbase.hxx>
 #include <xmloff/odffields.hxx>
 
 #include <editsh.hxx>
@@ -744,6 +745,46 @@ bool SwPaM::HasReadonlySel( bool bFormView ) const
             bRet = pDoc->GetEditShell()->IsCursorInParagraphMetadataField();
     }
 
+    if (!bRet &&
+        pDoc->getIDocumentSettingAccess().get(DocumentSettingId::PROTECT_BOOKMARKS))
+    {
+        if (pDoc->getIDocumentMarkAccess()->isBookmarkDeleted(*this))
+        {
+            return true;
+        }
+    }
+    if (!bRet &&
+        pDoc->getIDocumentSettingAccess().get(DocumentSettingId::PROTECT_FIELDS))
+    {
+        SwPosition const& rStart(*Start());
+        SwPosition const& rEnd(*End());
+        for (SwNodeIndex n = rStart.nNode; n <= rEnd.nNode; ++n)
+        {
+            if (SwTextNode const*const pNode = n.GetNode().GetTextNode())
+            {
+                if (SwpHints const*const pHints = pNode->GetpSwpHints())
+                {
+                    for (size_t i = 0; i < pHints->Count(); ++i)
+                    {
+                        SwTextAttr const*const pHint(pHints->Get(i));
+                        if (n == rStart.nNode && pHint->GetStart() < rStart.nContent.GetIndex())
+                        {
+                            continue; // before selection
+                        }
+                        if (n == rEnd.nNode && rEnd.nContent.GetIndex() <= pHint->GetStart())
+                        {
+                            break; // after selection
+                        }
+                        if (pHint->Which() == RES_TXTATR_FIELD)
+                        {
+                            return true;
+                        }
+                    }
+                }
+            }
+        }
+    }
+
     return bRet;
 }
 
diff --git a/sw/source/core/doc/docbm.cxx b/sw/source/core/doc/docbm.cxx
index a9eed445a21c..6e15efc78b24 100644
--- a/sw/source/core/doc/docbm.cxx
+++ b/sw/source/core/doc/docbm.cxx
@@ -945,6 +945,103 @@ namespace sw { namespace mark
         lcl_DebugMarks(m_vAllMarks);
     }
 
+    static bool isDeleteMark(
+            ::sw::mark::MarkBase const*const pMark,
+            SwNodeIndex const& rStt,
+            SwNodeIndex const& rEnd,
+            SwIndex const*const pSttIdx,
+            SwIndex const*const pEndIdx,
+            bool & rbIsPosInRange,
+            bool & rbIsOtherPosInRange)
+    {
+        assert(pMark);
+        // navigator marks should not be moved
+        // TODO: Check if this might make them invalid
+        if (IDocumentMarkAccess::GetType(*pMark) == IDocumentMarkAccess::MarkType::NAVIGATOR_REMINDER)
+        {
+            return false;
+        }
+
+        // on position ??
+        rbIsPosInRange = lcl_GreaterThan(pMark->GetMarkPos(), rStt, pSttIdx)
+                            && lcl_Lower(pMark->GetMarkPos(), rEnd, pEndIdx);
+        rbIsOtherPosInRange = pMark->IsExpanded()
+                            && lcl_GreaterThan(pMark->GetOtherMarkPos(), rStt, pSttIdx)
+                            && lcl_Lower(pMark->GetOtherMarkPos(), rEnd, pEndIdx);
+        // special case: completely in range, touching the end?
+        if ( pEndIdx != nullptr
+             && ( ( rbIsOtherPosInRange
+                    && pMark->GetMarkPos().nNode == rEnd
+                    && pMark->GetMarkPos().nContent == *pEndIdx )
+                  || ( rbIsPosInRange
+                       && pMark->IsExpanded()
+                       && pMark->GetOtherMarkPos().nNode == rEnd
+                       && pMark->GetOtherMarkPos().nContent == *pEndIdx ) ) )
+        {
+            rbIsPosInRange = true;
+            rbIsOtherPosInRange = true;
+        }
+
+        if (rbIsPosInRange
+             && (rbIsOtherPosInRange
+                  || !pMark->IsExpanded()))
+        {
+            // completely in range
+
+            bool bDeleteMark = true;
+            {
+                switch ( IDocumentMarkAccess::GetType( *pMark ) )
+                {
+                case IDocumentMarkAccess::MarkType::CROSSREF_HEADING_BOOKMARK:
+                case IDocumentMarkAccess::MarkType::CROSSREF_NUMITEM_BOOKMARK:
+                    // no delete of cross-reference bookmarks, if range is inside one paragraph
+                    bDeleteMark = rStt != rEnd;
+                    break;
+                case IDocumentMarkAccess::MarkType::UNO_BOOKMARK:
+                    // no delete of UNO mark, if it is not expanded and only touches the start of the range
+                    bDeleteMark = rbIsOtherPosInRange
+                                  || pMark->IsExpanded()
+                                  || pSttIdx == nullptr
+                                  || !( pMark->GetMarkPos().nNode == rStt
+                                        && pMark->GetMarkPos().nContent == *pSttIdx );
+                    break;
+                default:
+                    bDeleteMark = true;
+                    break;
+                }
+            }
+            return bDeleteMark;
+        }
+        return false;
+    }
+
+    bool MarkManager::isBookmarkDeleted(SwPaM const& rPaM) const
+    {
+        SwPosition const& rStart(*rPaM.Start());
+        SwPosition const& rEnd(*rPaM.End());
+        for (auto ppMark = m_vBookmarks.begin();
+            ppMark != m_vBookmarks.end();
+            ++ppMark)
+        {
+            ::sw::mark::MarkBase *const pMark = *ppMark;
+
+            if (!pMark)
+                continue;
+
+            bool bIsPosInRange(false);
+            bool bIsOtherPosInRange(false);
+            bool const bDeleteMark = isDeleteMark(pMark,
+                rStart.nNode, rEnd.nNode, &rStart.nContent, &rEnd.nContent,
+                bIsPosInRange, bIsOtherPosInRange);
+            if (bDeleteMark
+                && IDocumentMarkAccess::GetType(*pMark) == MarkType::BOOKMARK)
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+
     void MarkManager::deleteMarks(
             const SwNodeIndex& rStt,
             const SwNodeIndex& rEnd,
@@ -966,65 +1063,19 @@ namespace sw { namespace mark
             ppMark != m_vAllMarks.end();
             ++ppMark)
         {
-            // navigator marks should not be moved
-            // TODO: Check if this might make them invalid
-            if(IDocumentMarkAccess::GetType(**ppMark) == MarkType::NAVIGATOR_REMINDER)
-                continue;
-
             ::sw::mark::MarkBase *const pMark = *ppMark;
 
             if (!pMark)
                 continue;
 
-            // on position ??
-            bool bIsPosInRange = lcl_GreaterThan(pMark->GetMarkPos(), rStt, pSttIdx)
-                                 && lcl_Lower(pMark->GetMarkPos(), rEnd, pEndIdx);
-            bool bIsOtherPosInRange = pMark->IsExpanded()
-                                      && lcl_GreaterThan(pMark->GetOtherMarkPos(), rStt, pSttIdx)
-                                      && lcl_Lower(pMark->GetOtherMarkPos(), rEnd, pEndIdx);
-            // special case: completely in range, touching the end?
-            if ( pEndIdx != nullptr
-                 && ( ( bIsOtherPosInRange
-                        && pMark->GetMarkPos().nNode == rEnd
-                        && pMark->GetMarkPos().nContent == *pEndIdx )
-                      || ( bIsPosInRange
-                           && pMark->IsExpanded()
-                           && pMark->GetOtherMarkPos().nNode == rEnd
-                           && pMark->GetOtherMarkPos().nContent == *pEndIdx ) ) )
-            {
-                bIsPosInRange = true;
-                bIsOtherPosInRange = true;
-            }
+            bool bIsPosInRange(false);
+            bool bIsOtherPosInRange(false);
+            bool const bDeleteMark = isDeleteMark(pMark, rStt, rEnd, pSttIdx, pEndIdx, bIsPosInRange, bIsOtherPosInRange);
 
             if ( bIsPosInRange
                  && ( bIsOtherPosInRange
                       || !pMark->IsExpanded() ) )
             {
-                // completely in range
-
-                bool bDeleteMark = true;
-                {
-                    switch ( IDocumentMarkAccess::GetType( *pMark ) )
-                    {
-                    case IDocumentMarkAccess::MarkType::CROSSREF_HEADING_BOOKMARK:
-                    case IDocumentMarkAccess::MarkType::CROSSREF_NUMITEM_BOOKMARK:
-                        // no delete of cross-reference bookmarks, if range is inside one paragraph
-                        bDeleteMark = rStt != rEnd;
-                        break;
-                    case IDocumentMarkAccess::MarkType::UNO_BOOKMARK:
-                        // no delete of UNO mark, if it is not expanded and only touches the start of the range
-                        bDeleteMark = bIsOtherPosInRange
-                                      || pMark->IsExpanded()
-                                      || pSttIdx == nullptr
-                                      || !( pMark->GetMarkPos().nNode == rStt
-                                            && pMark->GetMarkPos().nContent == *pSttIdx );
-                        break;
-                    default:
-                        bDeleteMark = true;
-                        break;
-                    }
-                }
-
                 if ( bDeleteMark )
                 {
                     if ( pSaveBkmk )
diff --git a/sw/source/core/inc/MarkManager.hxx b/sw/source/core/inc/MarkManager.hxx
index edf8121836b6..a9457f916763 100644
--- a/sw/source/core/inc/MarkManager.hxx
+++ b/sw/source/core/inc/MarkManager.hxx
@@ -78,6 +78,7 @@ namespace sw {
             virtual const_iterator_t findMark(const OUString& rName) const override;
 
             // bookmarks
+            virtual bool isBookmarkDeleted(SwPaM const& rPaM) const override;
             virtual const_iterator_t getBookmarksBegin() const override;
             virtual const_iterator_t getBookmarksEnd() const override;
             virtual sal_Int32 getBookmarksCount() const override;
commit b2ea94054d418600b06b8461c93f8cb9e835fe2a
Author:     Michael Stahl <Michael.Stahl at cib.de>
AuthorDate: Fri Jan 31 17:11:09 2020 +0100
Commit:     Vasily Melenchuk <vasily.melenchuk at cib.de>
CommitDate: Sat Dec 5 19:21:19 2020 +0300

    sw: split into 2 settings ProtectBookmarks and ProtectFields
    
    On second thought, let's have 2 settings because there might be some
    use-case for protecting one but not the other.
    
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/87777
    Tested-by: Jenkins
    Reviewed-by: Michael Stahl <michael.stahl at cib.de>
    (cherry picked from commit 249b10c22f4a35672a7388d34b2ded1b76054dac)
    
    Change-Id: If8442b64adeeed80b25c8b69f607f2d4993786e4

diff --git a/sw/inc/IDocumentSettingAccess.hxx b/sw/inc/IDocumentSettingAccess.hxx
index 4728f2cb09a0..621a24237b44 100644
--- a/sw/inc/IDocumentSettingAccess.hxx
+++ b/sw/inc/IDocumentSettingAccess.hxx
@@ -106,7 +106,8 @@ enum class DocumentSettingId
     APPLY_PARAGRAPH_MARK_FORMAT_TO_NUMBERING,
     CONTINUOUS_ENDNOTES,
     HEADER_SPACING_BELOW_LAST_PARA,
-    PROTECT_BOOKMARKS_AND_FIELDS,
+    PROTECT_BOOKMARKS,
+    PROTECT_FIELDS,
 };
 
  /** Provides access to settings of a document
diff --git a/sw/source/core/doc/DocumentSettingManager.cxx b/sw/source/core/doc/DocumentSettingManager.cxx
index bf77758254f5..33887d039501 100644
--- a/sw/source/core/doc/DocumentSettingManager.cxx
+++ b/sw/source/core/doc/DocumentSettingManager.cxx
@@ -94,7 +94,8 @@ sw::DocumentSettingManager::DocumentSettingManager(SwDoc &rDoc)
     mbLastBrowseMode( false ),
     mbDisableOffPagePositioning ( false ),
     mbHeaderSpacingBelowLastPara(false),
-    mbProtectBookmarksAndFields( false )
+    mbProtectBookmarks(false),
+    mbProtectFields(false)
 
     // COMPATIBILITY FLAGS END
 {
@@ -226,7 +227,8 @@ bool sw::DocumentSettingManager::get(/*[in]*/ DocumentSettingId id) const
             return mbContinuousEndnotes;
         case DocumentSettingId::HEADER_SPACING_BELOW_LAST_PARA:
             return mbHeaderSpacingBelowLastPara;
-        case DocumentSettingId::PROTECT_BOOKMARKS_AND_FIELDS: return mbProtectBookmarksAndFields;
+        case DocumentSettingId::PROTECT_BOOKMARKS: return mbProtectBookmarks;
+        case DocumentSettingId::PROTECT_FIELDS: return mbProtectFields;
         default:
             OSL_FAIL("Invalid setting id");
     }
@@ -471,8 +473,11 @@ void sw::DocumentSettingManager::set(/*[in]*/ DocumentSettingId id, /*[in]*/ boo
             break;
         case DocumentSettingId::HEADER_SPACING_BELOW_LAST_PARA:
             mbHeaderSpacingBelowLastPara = value;
-        case DocumentSettingId::PROTECT_BOOKMARKS_AND_FIELDS:
-            mbProtectBookmarksAndFields = value;
+        case DocumentSettingId::PROTECT_BOOKMARKS:
+            mbProtectBookmarks = value;
+            break;
+        case DocumentSettingId::PROTECT_FIELDS:
+            mbProtectFields = value;
             break;
         default:
             OSL_FAIL("Invalid setting id");
diff --git a/sw/source/core/inc/DocumentSettingManager.hxx b/sw/source/core/inc/DocumentSettingManager.hxx
index 86129ea8e73d..bd1a699d7bc2 100644
--- a/sw/source/core/inc/DocumentSettingManager.hxx
+++ b/sw/source/core/inc/DocumentSettingManager.hxx
@@ -164,7 +164,8 @@ class DocumentSettingManager :
     bool mbEmptyDbFieldHidesPara;
     bool mbContinuousEndnotes = false;
     bool mbHeaderSpacingBelowLastPara;
-    bool mbProtectBookmarksAndFields;
+    bool mbProtectBookmarks;
+    bool mbProtectFields;
 
 public:
 
diff --git a/sw/source/uibase/uno/SwXDocumentSettings.cxx b/sw/source/uibase/uno/SwXDocumentSettings.cxx
index 15f0319d5003..b532d275d094 100644
--- a/sw/source/uibase/uno/SwXDocumentSettings.cxx
+++ b/sw/source/uibase/uno/SwXDocumentSettings.cxx
@@ -147,7 +147,8 @@ enum SwDocumentSettingsPropertyHandles
     HANDLE_EMPTY_DB_FIELD_HIDES_PARA,
     HANDLE_CONTINUOUS_ENDNOTES,
     HANDLE_HEADER_SPACING_BELOW_LAST_PARA,
-    HANDLE_PROTECT_BOOKMARKS_AND_FIELDS,
+    HANDLE_PROTECT_BOOKMARKS,
+    HANDLE_PROTECT_FIELDS,
 };
 
 static MasterPropertySetInfo * lcl_createSettingsInfo()
@@ -236,7 +237,8 @@ static MasterPropertySetInfo * lcl_createSettingsInfo()
         { OUString("EmptyDbFieldHidesPara"), HANDLE_EMPTY_DB_FIELD_HIDES_PARA, cppu::UnoType<bool>::get(), 0 },
         { OUString("ContinuousEndnotes"), HANDLE_CONTINUOUS_ENDNOTES, cppu::UnoType<bool>::get(), 0 },
         { OUString("HeaderSpacingBelowLastPara"), HANDLE_HEADER_SPACING_BELOW_LAST_PARA, cppu::UnoType<bool>::get(), 0 },
-        { OUString("ProtectBookmarksAndFields"), HANDLE_PROTECT_BOOKMARKS_AND_FIELDS, cppu::UnoType<bool>::get(), 0 },
+        { OUString("ProtectBookmarks"), HANDLE_PROTECT_BOOKMARKS, cppu::UnoType<bool>::get(), 0 },
+        { OUString("ProtectFields"), HANDLE_PROTECT_FIELDS, cppu::UnoType<bool>::get(), 0 },
 /*
  * As OS said, we don't have a view when we need to set this, so I have to
  * find another solution before adding them to this property set - MTG
@@ -957,12 +959,22 @@ void SwXDocumentSettings::_setSingleValue( const comphelper::PropertyInfo & rInf
             }
         }
         break;
-        case HANDLE_PROTECT_BOOKMARKS_AND_FIELDS:
+        case HANDLE_PROTECT_BOOKMARKS:
         {
             bool bTmp;
             if (rValue >>= bTmp)
             {
-                mpDoc->getIDocumentSettingAccess().set(DocumentSettingId::PROTECT_BOOKMARKS_AND_FIELDS,
+                mpDoc->getIDocumentSettingAccess().set(DocumentSettingId::PROTECT_BOOKMARKS,
+                                                       bTmp);
+            }
+        }
+        break;
+        case HANDLE_PROTECT_FIELDS:
+        {
+            bool bTmp;
+            if (rValue >>= bTmp)
+            {
+                mpDoc->getIDocumentSettingAccess().set(DocumentSettingId::PROTECT_FIELDS,
                                                        bTmp);
             }
         }
@@ -1455,10 +1467,16 @@ void SwXDocumentSettings::_getSingleValue( const comphelper::PropertyInfo & rInf
                 DocumentSettingId::HEADER_SPACING_BELOW_LAST_PARA);
         }
         break;
-        case HANDLE_PROTECT_BOOKMARKS_AND_FIELDS:
+        case HANDLE_PROTECT_BOOKMARKS:
+        {
+            rValue <<= mpDoc->getIDocumentSettingAccess().get(
+                DocumentSettingId::PROTECT_BOOKMARKS);
+        }
+        break;
+        case HANDLE_PROTECT_FIELDS:
         {
             rValue <<= mpDoc->getIDocumentSettingAccess().get(
-                DocumentSettingId::PROTECT_BOOKMARKS_AND_FIELDS);
+                DocumentSettingId::PROTECT_FIELDS);
         }
         break;
         default:
commit 19ef5a93dca235a7c7a8761d7daa79418798cdd3
Author:     Katarina Behrens <Katarina.Behrens at cib.de>
AuthorDate: Fri Jan 24 17:05:53 2020 +0100
Commit:     Vasily Melenchuk <vasily.melenchuk at cib.de>
CommitDate: Sat Dec 5 19:21:19 2020 +0300

    Add ProtectBookmarksAndFields per-document option
    
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/87360
    Tested-by: Jenkins
    Reviewed-by: Michael Stahl <michael.stahl at cib.de>
    (cherry picked from commit a5cd4d39f09c3658c2b7cfff4ab6a74449d4f0c0)
    
    Change-Id: I8dac403ddea59026b5f52c132c8accc1bd0ada92

diff --git a/sw/inc/IDocumentSettingAccess.hxx b/sw/inc/IDocumentSettingAccess.hxx
index 5b093bc0d08a..4728f2cb09a0 100644
--- a/sw/inc/IDocumentSettingAccess.hxx
+++ b/sw/inc/IDocumentSettingAccess.hxx
@@ -106,6 +106,7 @@ enum class DocumentSettingId
     APPLY_PARAGRAPH_MARK_FORMAT_TO_NUMBERING,
     CONTINUOUS_ENDNOTES,
     HEADER_SPACING_BELOW_LAST_PARA,
+    PROTECT_BOOKMARKS_AND_FIELDS,
 };
 
  /** Provides access to settings of a document
diff --git a/sw/source/core/doc/DocumentSettingManager.cxx b/sw/source/core/doc/DocumentSettingManager.cxx
index 726db3242647..bf77758254f5 100644
--- a/sw/source/core/doc/DocumentSettingManager.cxx
+++ b/sw/source/core/doc/DocumentSettingManager.cxx
@@ -93,7 +93,8 @@ sw::DocumentSettingManager::DocumentSettingManager(SwDoc &rDoc)
     mApplyParagraphMarkFormatToNumbering(false),
     mbLastBrowseMode( false ),
     mbDisableOffPagePositioning ( false ),
-    mbHeaderSpacingBelowLastPara(false)
+    mbHeaderSpacingBelowLastPara(false),
+    mbProtectBookmarksAndFields( false )
 
     // COMPATIBILITY FLAGS END
 {
@@ -225,6 +226,7 @@ bool sw::DocumentSettingManager::get(/*[in]*/ DocumentSettingId id) const
             return mbContinuousEndnotes;
         case DocumentSettingId::HEADER_SPACING_BELOW_LAST_PARA:
             return mbHeaderSpacingBelowLastPara;
+        case DocumentSettingId::PROTECT_BOOKMARKS_AND_FIELDS: return mbProtectBookmarksAndFields;
         default:
             OSL_FAIL("Invalid setting id");
     }
@@ -469,6 +471,8 @@ void sw::DocumentSettingManager::set(/*[in]*/ DocumentSettingId id, /*[in]*/ boo
             break;
         case DocumentSettingId::HEADER_SPACING_BELOW_LAST_PARA:
             mbHeaderSpacingBelowLastPara = value;
+        case DocumentSettingId::PROTECT_BOOKMARKS_AND_FIELDS:
+            mbProtectBookmarksAndFields = value;
             break;
         default:
             OSL_FAIL("Invalid setting id");
diff --git a/sw/source/core/inc/DocumentSettingManager.hxx b/sw/source/core/inc/DocumentSettingManager.hxx
index 5a19e930f664..86129ea8e73d 100644
--- a/sw/source/core/inc/DocumentSettingManager.hxx
+++ b/sw/source/core/inc/DocumentSettingManager.hxx
@@ -164,6 +164,7 @@ class DocumentSettingManager :
     bool mbEmptyDbFieldHidesPara;
     bool mbContinuousEndnotes = false;
     bool mbHeaderSpacingBelowLastPara;
+    bool mbProtectBookmarksAndFields;
 
 public:
 
diff --git a/sw/source/uibase/uno/SwXDocumentSettings.cxx b/sw/source/uibase/uno/SwXDocumentSettings.cxx
index 1c437e021f93..15f0319d5003 100644
--- a/sw/source/uibase/uno/SwXDocumentSettings.cxx
+++ b/sw/source/uibase/uno/SwXDocumentSettings.cxx
@@ -147,6 +147,7 @@ enum SwDocumentSettingsPropertyHandles
     HANDLE_EMPTY_DB_FIELD_HIDES_PARA,
     HANDLE_CONTINUOUS_ENDNOTES,
     HANDLE_HEADER_SPACING_BELOW_LAST_PARA,
+    HANDLE_PROTECT_BOOKMARKS_AND_FIELDS,
 };
 
 static MasterPropertySetInfo * lcl_createSettingsInfo()
@@ -235,7 +236,7 @@ static MasterPropertySetInfo * lcl_createSettingsInfo()
         { OUString("EmptyDbFieldHidesPara"), HANDLE_EMPTY_DB_FIELD_HIDES_PARA, cppu::UnoType<bool>::get(), 0 },
         { OUString("ContinuousEndnotes"), HANDLE_CONTINUOUS_ENDNOTES, cppu::UnoType<bool>::get(), 0 },
         { OUString("HeaderSpacingBelowLastPara"), HANDLE_HEADER_SPACING_BELOW_LAST_PARA, cppu::UnoType<bool>::get(), 0 },
-
+        { OUString("ProtectBookmarksAndFields"), HANDLE_PROTECT_BOOKMARKS_AND_FIELDS, cppu::UnoType<bool>::get(), 0 },
 /*
  * As OS said, we don't have a view when we need to set this, so I have to
  * find another solution before adding them to this property set - MTG
@@ -956,6 +957,16 @@ void SwXDocumentSettings::_setSingleValue( const comphelper::PropertyInfo & rInf
             }
         }
         break;
+        case HANDLE_PROTECT_BOOKMARKS_AND_FIELDS:
+        {
+            bool bTmp;
+            if (rValue >>= bTmp)
+            {
+                mpDoc->getIDocumentSettingAccess().set(DocumentSettingId::PROTECT_BOOKMARKS_AND_FIELDS,
+                                                       bTmp);
+            }
+        }
+        break;
         case HANDLE_HEADER_SPACING_BELOW_LAST_PARA:
         {
             bool bTmp;
@@ -1444,6 +1455,12 @@ void SwXDocumentSettings::_getSingleValue( const comphelper::PropertyInfo & rInf
                 DocumentSettingId::HEADER_SPACING_BELOW_LAST_PARA);
         }
         break;
+        case HANDLE_PROTECT_BOOKMARKS_AND_FIELDS:
+        {
+            rValue <<= mpDoc->getIDocumentSettingAccess().get(
+                DocumentSettingId::PROTECT_BOOKMARKS_AND_FIELDS);
+        }
+        break;
         default:
             throw UnknownPropertyException(OUString::number(rInfo.mnHandle));
     }
commit 1bca154ca40fc3f92086fedfaa5cd3a5e53b05be
Author:     rizmut <riz_17_oke at yahoo.co.id>
AuthorDate: Sat Feb 15 20:36:26 2020 +0700
Commit:     Vasily Melenchuk <vasily.melenchuk at cib.de>
CommitDate: Sat Dec 5 19:21:19 2020 +0300

    tdf#130648:+ icons for new .uno:ProtectBookmarks & .uno:ProtectFields
    
    Change-Id: Ie9bee00bec79f2bc1d85e5e17556676e71842ef7
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/88757
    Tested-by: Jenkins
    Reviewed-by: Rizal Muttaqin <riz_17_oke at yahoo.co.id>
    (cherry picked from commit 7415a70e3387b36c6e67cab21b4310d4e5f56e1b)
    
    Only adding _new_ protect icons here.
    
    Change-Id: I7c4020e9e59d3bcb1280681e18d4d8b1e8253180
    
    Conflicts:
            icon-themes/breeze/cmd/32/safemode.png
            icon-themes/breeze/cmd/32/sourcecharstyle.png
            icon-themes/breeze_svg/cmd/32/safemode.svg
            icon-themes/breeze_svg/cmd/32/sourcecharstyle.svg
            icon-themes/elementary_svg/cmd/lc_insertfield.svg
            icon-themes/elementary_svg/cmd/sc_toolprotectiondocument.svg
            icon-themes/karasa_jaga_svg/cmd/32/subscript.svg
            icon-themes/karasa_jaga_svg/cmd/32/superscript.svg
            icon-themes/karasa_jaga_svg/cmd/lc_subscript.svg
            icon-themes/karasa_jaga_svg/cmd/lc_superscript.svg
            icon-themes/karasa_jaga_svg/cmd/sc_subscript.svg
            icon-themes/karasa_jaga_svg/cmd/sc_superscript.svg

diff --git a/icon-themes/elementary/cmd/32/protectbookmarks.png b/icon-themes/elementary/cmd/32/protectbookmarks.png
new file mode 100644
index 000000000000..1012554d5237
Binary files /dev/null and b/icon-themes/elementary/cmd/32/protectbookmarks.png differ
diff --git a/icon-themes/elementary/cmd/32/protectfields.png b/icon-themes/elementary/cmd/32/protectfields.png
new file mode 100644
index 000000000000..c97c6e3ca979
Binary files /dev/null and b/icon-themes/elementary/cmd/32/protectfields.png differ
diff --git a/icon-themes/elementary/cmd/lc_protectbookmarks.png b/icon-themes/elementary/cmd/lc_protectbookmarks.png
new file mode 100644
index 000000000000..8fbdd0e80583
Binary files /dev/null and b/icon-themes/elementary/cmd/lc_protectbookmarks.png differ
diff --git a/icon-themes/elementary/cmd/lc_protectfields.png b/icon-themes/elementary/cmd/lc_protectfields.png
new file mode 100644
index 000000000000..5e5aa1cc6698
Binary files /dev/null and b/icon-themes/elementary/cmd/lc_protectfields.png differ
diff --git a/icon-themes/elementary/cmd/sc_protectbookmarks.png b/icon-themes/elementary/cmd/sc_protectbookmarks.png
new file mode 100644
index 000000000000..c4baf4356be2
Binary files /dev/null and b/icon-themes/elementary/cmd/sc_protectbookmarks.png differ
diff --git a/icon-themes/elementary/cmd/sc_protectfields.png b/icon-themes/elementary/cmd/sc_protectfields.png
new file mode 100644
index 000000000000..e244c8dcf167
Binary files /dev/null and b/icon-themes/elementary/cmd/sc_protectfields.png differ
diff --git a/icon-themes/elementary_svg/cmd/32/protectbookmarks.svg b/icon-themes/elementary_svg/cmd/32/protectbookmarks.svg
new file mode 100644
index 000000000000..ed3c553a6760
--- /dev/null
+++ b/icon-themes/elementary_svg/cmd/32/protectbookmarks.svg
@@ -0,0 +1 @@
+<svg height="32" width="32" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="a" gradientTransform="matrix(.41893991 0 0 .47066524 11.836614 8.782439)" gradientUnits="userSpaceOnUse" x1="11.276111" x2="31.420702" y1="8.963265" y2="17.461874"><stop offset="0" stop-color="#cad0c6"/><stop offset=".5" stop-color="#eaece9"/><stop offset="1" stop-color="#c5cbc0"/></linearGradient><radialGradient id="b" cx="18.031223" cy="6.2807" gradientTransform="matrix(.46988397 0 0 .47066524 11.450587 8.917973)" gradientUnits="userSpaceOnUse" r="3.181981" xlink:href="#c"/><linearGradient id="c"><stop offset="0" stop-color="#fff"/><stop offset="1" stop-color="#fff" stop-opacity="0"/></linearGradient><radialGradient id="d" cx="4.992979" cy="43.5" gradientTransform="matrix(.9017044 0 0 .45000067 24.244682 10.301129)" gradientUnits="userSpaceOnUse" r="2.5" xlink:href="#e"/><linearGradient id="e"><stop offset="0" stop-color="#181818"/><stop offset="1" stop-col
 or="#181818" stop-opacity="0"/></linearGradient><radialGradient id="f" cx="4.992979" cy="43.5" gradientTransform="matrix(-.9017044 0 0 -.45000067 19.755358 49.451175)" gradientUnits="userSpaceOnUse" r="2.5" xlink:href="#e"/><linearGradient id="g" gradientTransform="matrix(.48214366 0 0 .32142905 10.428572 15.893998)" gradientUnits="userSpaceOnUse" x1="25.058096" x2="25.058096" y1="47.027729" y2="39.999443"><stop offset="0" stop-color="#181818" stop-opacity="0"/><stop offset=".5" stop-color="#181818"/><stop offset="1" stop-color="#181818" stop-opacity="0"/></linearGradient><radialGradient id="h" cx="16.823883" cy="11.368058" fx="16.777113" fy="11.597148" gradientTransform="matrix(0 1.1130951 -1.5532528 0 39.65747 .805822)" gradientUnits="userSpaceOnUse" r="10.5"><stop offset="0" stop-color="#f2e0c4"/><stop offset=".76470584" stop-color="#e5af5b"/><stop offset="1" stop-color="#af6900"/></radialGradient><linearGradient id="i" gradientUnits="userSpaceOnUse" x1="16.83333258" x2="16.83333
 258" xlink:href="#j" y1="29.00116298" y2="19.00116368"/><linearGradient id="j"><stop offset="0" stop-color="#d88f22"/><stop offset="1" stop-color="#d88f22" stop-opacity="0"/></linearGradient><linearGradient id="k" gradientUnits="userSpaceOnUse" x1="27.83333188" x2="27.83333188" xlink:href="#j" y1="29.00116298" y2="19.00116368"/><linearGradient id="l" gradientTransform="matrix(.66666666 0 0 .66666662 9.833333 -38.334489)" gradientUnits="userSpaceOnUse" x1="9" x2="9" xlink:href="#c" y1="29" y2="14"/><linearGradient id="m" gradientTransform="matrix(.66666666 0 0 .66666662 22.833333 -38.334489)" gradientUnits="userSpaceOnUse" x1="9" x2="9" xlink:href="#c" y1="29" y2="14"/><linearGradient id="n" gradientTransform="matrix(.68421053 0 0 .64285716 1.052632 2.178571)" gradientUnits="userSpaceOnUse" x1="21.771429" x2="21.771429" y1="14.871428" y2="27.924538"><stop offset="0" stop-color="#fff"/><stop offset=".03252051" stop-color="#fff" stop-opacity=".235294"/><stop offset=".98558509" stop-col
 or="#fff" stop-opacity=".156863"/><stop offset="1" stop-color="#fff" stop-opacity=".392157"/></linearGradient><linearGradient id="o"><stop offset="0"/><stop offset="1" stop-opacity="0"/></linearGradient><linearGradient id="p" gradientTransform="matrix(-.87866114 0 0 .69999996 25.533474 -5.749999)" gradientUnits="userSpaceOnUse" x1="8.642858" x2="23.299999" xlink:href="#o" y1="27.5" y2="27.5"/><linearGradient id="q" gradientTransform="matrix(-.93357899 0 0 .75000126 25.99446 -9.250054)" gradientUnits="userSpaceOnUse" x1="8.642858" x2="23.299999" xlink:href="#c" y1="27.5" y2="27.5"/><linearGradient id="r" gradientUnits="userSpaceOnUse" x1="9.907559" x2="12.258671" y1="12.887577" y2="20.403847"><stop offset="0" stop-color="#fff" stop-opacity=".27451"/><stop offset="1" stop-color="#fff" stop-opacity="0"/></linearGradient><linearGradient id="s" gradientUnits="userSpaceOnUse" x1="19.638996" x2="19.638996" y1="10.906893" y2="22.971012"><stop offset="0" stop-color="#fff"/><stop offset=".149
 14785" stop-color="#fff" stop-opacity=".235294"/><stop offset=".67927718" stop-color="#fff" stop-opacity=".156863"/><stop offset="1" stop-color="#fff" stop-opacity=".392157"/></linearGradient><radialGradient id="t" cx="13.138569" cy="25.625349" gradientTransform="matrix(0 1.7104018 -2.0382599 0 63.162289 -16.657885)" gradientUnits="userSpaceOnUse" r="13.931416"><stop offset="0" stop-color="#fff3cb"/><stop offset=".26238" stop-color="#fdde76"/><stop offset=".66093999" stop-color="#f9c440"/><stop offset="1" stop-color="#e48b20"/></radialGradient><radialGradient id="u" cx="62.625" cy="4.625" gradientTransform="matrix(1.4117648 0 0 .56470513 -72.411731 23.388235)" gradientUnits="userSpaceOnUse" r="10.625" xlink:href="#o"/><path d="m31.000038 25.999999c0 3.313709-6.715729 6.000001-15 6.000001-8.2842699 0-14.9999997-2.686292-14.9999997-6.000001 0-3.313707 6.7157298-5.999999 14.9999997-5.999999 8.284271 0 15 2.686292 15 5.999999z" fill="url(#u)" fill-rule="evenodd" opacity=".3"/><path d="m
 16.000037 1.4974327c.978784 0 4.13436 7.910881 4.926214 8.488271.791851.5773873 9.263652 1.1447403 9.566113 2.0789733.302461.934234-6.219087 6.39078-6.521548 7.325013-.30246.934233 1.777824 9.195756.985972 9.773145-.791853.577387-7.977967-3.961163-8.956752-3.961163-.978783 0-8.1648972 4.53855-8.9567501 3.961163-.7918519-.577389 1.2884321-8.838913.9859716-9.773145-.3024604-.934233-6.8240081-6.39078-6.5215473-7.325015.3024608-.934231 8.7742608-1.501584 9.5661148-2.0789713.791852-.57739 3.947429-8.488271 4.926212-8.488271z" fill="url(#t)"/><path d="m16.008597 2.928904c-1.412439 2.674148-2.696301 5.432298-4.168399 8.065176-2.9741416.571623-5.9951175 1.01272-8.9878512 1.528574 2.068776 2.127369 4.1154729 4.286762 6.1689248 6.422463-.027883 1.120075-.3297428 2.255067-.4115096 3.383432-.2151051 1.763357-.4094732 3.879237-.6636652 5.637582 2.6703322-1.317263 5.3192342-2.753549 8.0028352-4.033221 2.889137 1.162973 5.624472 2.788167 8.207491 4.091509-.404423-2.843686-.92157-6.105122-1.297355-
 8.947299.677523-.936651 1.653369-1.671505 2.415879-2.553298 1.294961-1.335342 2.582496-2.677954 3.8899-4.001168-2.962436-.696339-6.023281-.941321-8.994049-1.528503-.706796-1.026526-1.163432-2.24275-1.772226-3.340019-.793792-1.576519-1.580425-3.156701-2.389975-4.725228z" fill="none" opacity=".8" stroke="url(#s)" stroke-linejoin="round"/><path d="m16.008597 2.241404c-.254446.374093-2.346828 3.472786-4.375 8.25a.20608164.20608164 0 0 1 -.03125.03125.20608164.20608164 0 0 1 -.09375.0625.20608164.20608164 0 0 1 -.03125.03125c-3.0053008.490049-7.0029861 1.038743-9.3125002 1.6875 1.5783275 2.00052 3.5604578 3.737007 5.34375 5.5625l20.2500002-3.59375c.582787-.584147 1.71282-1.713072 2-2-2.871985-.776885-6.239483-1.134102-9.25-1.625a.20608164.20608164 0 0 1 -.03125-.03125.20608164.20608164 0 0 1 -.09375-.0625.20608164.20608164 0 0 1 -.03125-.03125c-1.525162-3.540869-4.056294-7.800982-4.34375-8.28125z" fill="url(#r)" opacity=".8"/><path d="m16.000037 1.4974327c.978784 0 4.13436 7.910881 4.926
 214 8.488271.791851.5773873 9.263652 1.1447403 9.566113 2.0789733.302461.934234-6.219087 6.39078-6.521548 7.325013-.30246.934233 1.777824 9.195756.985972 9.773145-.791853.577387-7.977967-3.961163-8.956752-3.961163-.978783 0-8.1648972 4.53855-8.9567501 3.961163-.7918519-.577389 1.2884321-8.838913.9859716-9.773145-.3024604-.934233-6.8240081-6.39078-6.5215473-7.325015.3024608-.934231 8.7742608-1.501584 9.5661148-2.0789713.791852-.57739 3.947429-8.488271 4.926212-8.488271z" fill="none" opacity=".5" stroke="#956500" stroke-linejoin="round"/><path d="m22.40625 10.501342c-2.991123 0-4.89511 2.415156-4.90625 5.406274v4.593713l2-.0378v-4.463541c0-1.939011 1.060999-3.499994 3-3.499994 1.939 0 3 1.560794 3 3.499805v4.561776l2-.06161v-4.593747c0-2.991118-1.915129-5.406085-4.90625-5.406085z" fill="url(#a)" fill-rule="evenodd"/><path d="m21.90625 10.177021c-2.991122 0-4.40625 2.415307-4.40625 5.406425v4.593751l2-.03779v-4.463551c0-1.939011.561-3.500183 2.5-3.500183s3.5 1.560983 3.5 3.499994v4.561
 776l2-.06161v-4.593748c0-2.991118-2.415128-5.406236-5.40625-5.406236z" fill="#fff" fill-rule="evenodd" opacity=".3"/><path d="m22.40625 10.501342c-2.991123 0-4.871703 2.415345-4.90625 5.406274v4.593713l2-.0378v-4.463541c0-1.939011 1.060999-3.499994 3-3.499994 1.939 0 3 1.560794 3 3.499805v4.561776l2-.06161v-4.593747c0-2.991118-1.915129-5.406047-4.90625-5.406047z" fill="none" opacity=".35" stroke="#000" stroke-width=".999999"/><path d="m21.418331 11.874067c.000207.8273-.66926 1.498015-1.495162 1.498015-.825901 0-1.495368-.670715-1.495161-1.498015-.000207-.827263.66926-1.498016 1.495161-1.498016.825902 0 1.495369.670753 1.495162 1.498016z" fill="url(#b)" fill-rule="evenodd" opacity=".5"/><path d="m20.572569 11.874067c.00009.359433-.290684.650645-.6494.650645-.358719 0-.64949-.291401-.6494-.650645-.00009-.359433.290684-.650646.6494-.650646.358719 0 .64949.291402.6494.650646z" fill="#fff" fill-rule="evenodd" opacity=".5"/><path d="m28.750032 28.751169h2.250004v2.24999h-2.250004z" fill="
 url(#d)" opacity=".3"/><path d="m15.250009 31.001159h-2.250004v-2.24999h2.250004z" fill="url(#f)" opacity=".3"/><path d="m15.250009 28.751169h13.500024v2.24999h-13.500024z" fill="url(#g)" opacity=".3"/><rect fill="url(#h)" height="10.001281" rx="1" width="14.256939" x="15.243061" y="19.499973"/><rect fill="url(#i)" height="10" opacity=".5" rx="2" ry="1" width="1" x="16" y="19.00112"/><rect fill="url(#k)" height="10" opacity=".5" rx="2" ry="1" width="1" x="27" y="19.00112"/><rect fill="url(#l)" height="9.001158" opacity=".5" rx=".5" ry="1" transform="scale(1 -1)" width="1" x="15" y="-29.001158"/><rect fill="url(#m)" height="9.001158" opacity=".5" rx=".499999" ry="1" transform="scale(1 -1)" width=".999999" x="28.000002" y="-29.001158"/><g fill="none" transform="translate(10 8.001167)"><path d="m6.5 12.497632 12 .0012v8.001184l-12.0000001-.0012z" opacity=".5" stroke="url(#n)" stroke-linejoin="round"/><rect height="10.001184" opacity=".3" rx="1" stroke="#000" width="14" x="5.5" y="11.49
 8816"/><path d="m6.4999999 12.498816 11.0000001.001184m-11.0000001 1.998816 11.0000001.001184m-11.0000001 1.998816 11.0000001.001184m-11.0000001 1.998816 11.0000001.001184m-11.0000001 1.998816 11.0000001.001184" opacity=".05" stroke="url(#p)"/><path d="m6.4999999 11.498816 11.0000001.001184m-11.0000001 1.998816 11.0000001.001184m-11.0000001 1.998816 11.0000001.001184m-11.0000001 1.998816 11.0000001.001184m-11.0000001 1.998816 11.0000001.001184" opacity=".2" stroke="url(#q)"/></g></svg>
\ No newline at end of file
diff --git a/icon-themes/elementary_svg/cmd/32/protectfields.svg b/icon-themes/elementary_svg/cmd/32/protectfields.svg
new file mode 100644
index 000000000000..a369d3b00324
--- /dev/null
+++ b/icon-themes/elementary_svg/cmd/32/protectfields.svg
@@ -0,0 +1 @@
+<svg height="32" viewBox="0 0 8.4666665 8.4666669" width="32" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="a" gradientTransform="matrix(-1 0 0 1 11.90625 0)" gradientUnits="userSpaceOnUse" x1="3.96875" x2="7.9375" xlink:href="#v" y1="290.12082" y2="290.12082"/><linearGradient id="b" gradientUnits="userSpaceOnUse" x1="3.96875" x2="7.9375" xlink:href="#v" y1="290.12082" y2="290.12082"/><linearGradient id="c" gradientTransform="matrix(-1 0 0 1 8.466667 0)" gradientUnits="userSpaceOnUse" x1="3.96875" x2="7.9375" xlink:href="#v" y1="290.12082" y2="290.12082"/><linearGradient id="d" gradientTransform="matrix(.11084452 0 0 .12453018 .485937 290.85701)" gradientUnits="userSpaceOnUse" x1="11.276111" x2="31.420702" y1="8.963265" y2="17.461874"><stop offset="0" stop-color="#cad0c6"/><stop offset=".5" stop-color="#eaece9"/><stop offset="1" stop-color="#c5cbc0"/></linearGradient><radialGradient id="e" cx="18.031223" cy="6.2807" gradientTransfo
 rm="matrix(.12432347 0 0 .12453018 .383801 290.89287)" gradientUnits="userSpaceOnUse" r="3.181981" xlink:href="#f"/><linearGradient id="f"><stop offset="0" stop-color="#fff"/><stop offset="1" stop-color="#fff" stop-opacity="0"/></linearGradient><radialGradient id="g" cx="4.992979" cy="43.5" gradientTransform="matrix(.23857596 0 0 .11906268 3.768905 291.25883)" gradientUnits="userSpaceOnUse" r="2.5" xlink:href="#h"/><linearGradient id="h"><stop offset="0" stop-color="#181818"/><stop offset="1" stop-color="#181818" stop-opacity="0"/></linearGradient><radialGradient id="i" cx="4.992979" cy="43.5" gradientTransform="matrix(-.23857596 0 0 -.11906268 2.581105 301.61728)" gradientUnits="userSpaceOnUse" r="2.5" xlink:href="#h"/><linearGradient id="j" gradientTransform="matrix(.12756718 0 0 .08504477 .113393 292.73861)" gradientUnits="userSpaceOnUse" x1="25.058096" x2="25.058096" y1="47.027729" y2="39.999443"><stop offset="0" stop-color="#181818" stop-opacity="0"/><stop offset=".5" stop-colo
 r="#181818"/><stop offset="1" stop-color="#181818" stop-opacity="0"/></linearGradient><radialGradient id="k" cx="16.823883" cy="11.368058" fx="16.777113" fy="11.597148" gradientTransform="matrix(0 .29450641 -.41096482 0 7.846872 288.74653)" gradientUnits="userSpaceOnUse" r="10.5"><stop offset="0" stop-color="#f2e0c4"/><stop offset=".76470584" stop-color="#e5af5b"/><stop offset="1" stop-color="#af6900"/></radialGradient><linearGradient id="l" gradientUnits="userSpaceOnUse" x1="1.80798592" x2="1.80798592" xlink:href="#m" y1="296.20654752" y2="293.56071432"/><linearGradient id="m"><stop offset="0" stop-color="#d88f22"/><stop offset="1" stop-color="#d88f22" stop-opacity="0"/></linearGradient><linearGradient id="n" gradientUnits="userSpaceOnUse" x1="4.71840212" x2="4.71840212" xlink:href="#m" y1="296.20654752" y2="293.56071432"/><linearGradient id="o" gradientTransform="matrix(.17638889 0 0 .17638888 -.044097 -298.67599)" gradientUnits="userSpaceOnUse" x1="9" x2="9" xlink:href="#f" y1="2
 9" y2="14"/><linearGradient id="p" gradientTransform="matrix(.17638889 0 0 .17638888 3.395486 -298.67599)" gradientUnits="userSpaceOnUse" x1="9" x2="9" xlink:href="#f" y1="29" y2="14"/><linearGradient id="q" gradientTransform="matrix(.68421053 0 0 .64285716 1.052632 2.178571)" gradientUnits="userSpaceOnUse" x1="21.771429" x2="21.771429" y1="14.871428" y2="27.924538"><stop offset="0" stop-color="#fff"/><stop offset=".03252051" stop-color="#fff" stop-opacity=".235294"/><stop offset=".98558509" stop-color="#fff" stop-opacity=".156863"/><stop offset="1" stop-color="#fff" stop-opacity=".392157"/></linearGradient><linearGradient id="r" gradientTransform="matrix(-.87866114 0 0 .69999996 25.533474 -5.749999)" gradientUnits="userSpaceOnUse" x1="8.642858" x2="23.299999" y1="27.5" y2="27.5"><stop offset="0"/><stop offset="1" stop-opacity="0"/></linearGradient><linearGradient id="s" gradientTransform="matrix(-.93357899 0 0 .75000126 25.99446 -9.250054)" gradientUnits="userSpaceOnUse" x1="8.6428
 58" x2="23.299999" xlink:href="#f" y1="27.5" y2="27.5"/><radialGradient id="t" cx="65.325226" cy="48.709068" gradientTransform="matrix(0 .68597915 -.7462606 0 60.288383 -27.737493)" gradientUnits="userSpaceOnUse" r="31.000002"><stop offset="0" stop-color="#cdf87e"/><stop offset=".26238" stop-color="#a2e34f"/><stop offset=".66093999" stop-color="#68b723"/><stop offset="1" stop-color="#1d7e0d"/></radialGradient><linearGradient id="u" gradientTransform="matrix(.34305155 0 0 .5600718 16.40639 10.991623)" gradientUnits="userSpaceOnUse" x1="24.138529" x2="24.138529" y1="20.748587" y2="25.52846"><stop offset="0" stop-color="#fff"/><stop offset=".00000003" stop-color="#fff" stop-opacity=".235294"/><stop offset="1" stop-color="#fff" stop-opacity=".156863"/><stop offset="1" stop-color="#fff" stop-opacity=".392157"/></linearGradient><linearGradient id="v" gradientUnits="userSpaceOnUse" x1="3.96875" x2="7.9375" y1="290.12082" y2="290.12082"><stop offset="0" stop-color="#737373"/><stop offset=".
 26238" stop-color="#636363"/><stop offset=".704952" stop-color="#4b4b4b"/><stop offset="1" stop-color="#3f3f3f"/></linearGradient><g transform="translate(0 -288.53332)"><g transform="matrix(-1.8666667 0 0 1 15.345833 2.116853)"><path d="m7.9375 290.25329c0-.0712-.2070112-.13217-.4487234-.13217h-2.9908599c-.2417118 0-.5291667.061-.5291667.13217v.26434c0 .0712.2874549.13217.5291667.13217.00101.001 2.9908599 0 2.9908599 0 .2417122 0 .4487234-.061.4487234-.13217z" fill="#fff" opacity=".35" stroke-width=".308188"/><path d="m7.9374998 289.85623h-3.96875v.52917h3.96875z" fill="url(#a)"/></g><g transform="matrix(-1.8666667 0 0 1 15.345833 3.175007)"><path d="m7.9375 290.25329c0-.0712-.2070112-.13217-.4487234-.13217h-2.9908599c-.2417118 0-.5291667.061-.5291667.13217v.26434c0 .0712.2874549.13217.5291667.13217.00101.001 2.9908599 0 2.9908599 0 .2417122 0 .4487234-.061.4487234-.13217z" fill="#fff" opacity=".35" stroke-width=".308188"/><path d="m7.9374998 289.85623h-3.96875v.52917h3.96875z" fill
 ="url(#a)"/></g><path d="m.52916647 290.25329c0-.0712.2070112-.13217.4487234-.13217l6.43044323.00001c.2417118 0 .5291667.061.5291667.13217v.26434c0 .0712-.2874549.13217-.5291667.13217-.00101.001-6.43044323-.00001-6.43044323-.00001-.2417122 0-.4487234-.061-.4487234-.13217z" fill="#fff" opacity=".35" stroke-width=".308188"/><path d="m.5291661 289.85624 7.4083333-.00001v.52917l-7.4083333.00001z" fill="url(#b)"/><g transform="matrix(-1 0 0 1 8.466667 1.058337)"><path d="m7.9375 290.25329c0-.0712-.2070112-.13217-.4487234-.13217l-6.4304432.00001c-.24171183 0-.52916673.061-.52916673.13217v.26434c0 .0712.2874549.13217.52916673.13217.00101.001 6.4304432-.00001 6.4304432-.00001.2417122 0 .4487234-.061.4487234-.13217z" fill="#fff" opacity=".35" stroke-width=".308188"/><path d="m7.9375004 289.85624-7.4083333-.00001v.52917l7.4083333.00001z" fill="url(#c)"/></g><g transform="matrix(-1.8666667 0 0 1 15.345833 4.23334)"><path d="m7.9375 290.25329c0-.0712-.2070112-.13217-.4487234-.13217h-2.9908599c-
 .2417118 0-.5291667.061-.5291667.13217v.26434c0 .0712.2874549.13217.5291667.13217.00101.001 2.9908599 0 2.9908599 0 .2417122 0 .4487234-.061.4487234-.13217z" fill="#fff" opacity=".35" stroke-width=".308188"/><path d="m7.9374998 289.85623h-3.96875v.52917h3.96875z" fill="url(#a)"/></g><g transform="matrix(-1.8666667 0 0 1 15.345833 5.291673)"><path d="m7.9375 290.25329c0-.0712-.2070112-.13217-.4487234-.13217h-2.9908599c-.2417118 0-.5291667.061-.5291667.13217v.26434c0 .0712.2874549.13217.5291667.13217.00101.001 2.9908599 0 2.9908599 0 .2417122 0 .4487234-.061.4487234-.13217z" fill="#fff" opacity=".35" stroke-width=".308188"/><path d="m7.9374998 289.85623h-3.96875v.52917h3.96875z" fill="url(#a)"/></g><g transform="matrix(-.18912227 0 0 .18912227 7.976591 289.81652)"><path d="m32.988744 20.55-.0055 6.915167-15.200767-.01485.0055-6.915172z" fill="url(#t)"/><g fill="none"><path d="m33.072422 20.506533-.0055 6.966425-15.359782.01425-.01-6.966425z" opacity=".5" stroke="#0f5a00" stroke-lineca
 p="round" stroke-linejoin="round" stroke-width="1.417073"/><path d="m31.645909 21.245491-.04735 5.451871m-12.468289-.01913.04736-5.451871" opacity=".5" stroke="url(#u)" stroke-width="1.421774"/></g></g><g transform="translate(2.645833)"><path d="m22.5 9c-2.300078-.0000001-4.317303 1.197327-5.472656 3 5.42075.000331 10.919001.001694 10.945312 0-1.155353-1.802673-3.172578-3.0000001-5.472656-3zm-6 4c-.321217.769879-.5 1.613689-.5 2.5.001671.167164.018644.333524.033203.5 2.480771.000208 3.132167-.000158 4.966797 0v-.5a1.5 1.5 0 0 1 1.5-1.5 1.5 1.5 0 0 1 1.5 1.5v.5c.55815-.000078 2.266811.000406 2.267578 0 .952594 0 1.968897-.075034 2.712891-.185547.005778-.104906.018845-.209347.019531-.314453 0-.886311-.178783-1.730121-.5-2.5zm-.5 4v1h-1c-.554 0-1 .445973-1 1v5.496094l3.490234.003906v-.498047c4.26411.000227 8.774373.001625 8.777344 0 1.705305 0 3.732422-.230935 3.732422-.5v-1-1.5h-12.503906l.001953-1c4.259222.000227 8.766562.001588 8.769531 0 1.705258 0 3.732422-.230935 3.732422-.5v-1-.
 501953h-1v-.998047l-5-.001953v1h-3v-1zm-2 8v3c5.970091.000684 12.263426.002197 12.267578 0 1.705305 0 3.732422-.230935 3.732422-.5v-1-1.5z" fill="#fcfcfc" opacity=".9" stroke-width="1.591427" transform="matrix(.26458333 0 0 .26458333 -2.645833 288.53332)"/><g stroke-width=".264583"><path d="m3.2824869 291.3118c-.7914011 0-1.2951645.63901-1.2981119 1.43041v1.21542l.5291666-.01v-1.18098c0-.51303.2807229-.92604.79375-.92604s.7937501.41296.7937501.92599v1.20697l.5291666-.0163v-1.21543c0-.7914-.506711-1.43036-1.298112-1.43036z" fill="url(#d)" fill-rule="evenodd"/><path d="m3.1501953 291.22599c-.7914011 0-1.1658203.63905-1.1658203 1.43045v1.21543l.5291666-.01v-1.18098c0-.51303.1484313-.92609.6614584-.92609s.9260417.41301.9260417.92604v1.20697l.5291666-.0163v-1.21543c0-.7914-.6390026-1.4304-1.4304036-1.4304z" fill="#fff" fill-rule="evenodd" opacity=".3"/><path d="m3.2824869 291.3118c-.7914011 0-1.2889713.63906-1.2981119 1.43041v1.21542l.5291666-.01v-1.18098c0-.51303.2807229-.92604.79375-.9
 2604s.7937501.41296.7937501.92599v1.20697l.5291666-.0163v-1.21543c0-.7914-.506711-1.43035-1.298112-1.43035z" fill="none" opacity=".35" stroke="#000"/><path d="m3.0211 291.675c.0000548.21889-.177075.39635-.3955948.39635-.2185196 0-.3956496-.17746-.3955948-.39635-.0000548-.21888.1770752-.39635.3955948-.39635.2185198 0 .3956496.17747.3955948.39635z" fill="url(#e)" fill-rule="evenodd" opacity=".5"/><path d="m2.7973255 291.675c.0000239.0951-.07691.17215-.1718203.17215-.094911 0-.1718442-.0771-.1718204-.17215-.0000238-.0951.07691-.17215.1718204-.17215.094911 0 .1718442.0771.1718203.17215z" fill="#fff" fill-rule="evenodd" opacity=".5"/><path d="m4.960946 296.1404h.5953135v.59531h-.5953135z" fill="url(#g)" opacity=".3"/><path d="m1.3890649 296.73571h-.59531357v-.59531h.59531357z" fill="url(#i)" opacity=".3"/><path d="m1.3890649 296.1404h3.5718813v.59531h-3.5718813z" fill="url(#j)" opacity=".3"/><rect fill="url(#k)" height="2.646172" rx=".264583" width="3.772149" x="1.387227" y="293.69269"/>
 <rect fill="url(#l)" height="2.645833" opacity=".5" rx=".529167" ry=".264583" width=".264583" x="1.5875" y="293.5607"/><rect fill="url(#n)" height="2.645833" opacity=".5" rx=".529167" ry=".264583" width=".264583" x="4.497917" y="293.5607"/><rect fill="url(#o)" height="2.381556" opacity=".5" rx=".132292" ry=".264583" transform="scale(1 -1)" width=".264583" x="1.322917" y="-296.20654"/><rect fill="url(#p)" height="2.381556" opacity=".5" rx=".132292" ry=".264583" transform="scale(1 -1)" width=".264583" x="4.7625" y="-296.20654"/></g><g fill="none" transform="matrix(.26458333 0 0 .26458333 0 290.6503)"><path d="m6.5 12.497632 12 .0012v8.001184l-12.0000001-.0012z" opacity=".5" stroke="url(#q)" stroke-linejoin="round"/><rect height="10.001184" opacity=".3" rx="1" stroke="#000" width="14" x="5.5" y="11.498816"/><path d="m6.4999999 12.498816 11.0000001.001184m-11.0000001 1.998816 11.0000001.001184m-11.0000001 1.998816 11.0000001.001184m-11.0000001 1.998816 11.0000001.001184m-11.0000001 1.99
 8816 11.0000001.001184" opacity=".05" stroke="url(#r)"/><path d="m6.4999999 11.498816 11.0000001.001184m-11.0000001 1.998816 11.0000001.001184m-11.0000001 1.998816 11.0000001.001184m-11.0000001 1.998816 11.0000001.001184m-11.0000001 1.998816 11.0000001.001184" opacity=".2" stroke="url(#s)"/></g></g></g></svg>
\ No newline at end of file
diff --git a/icon-themes/elementary_svg/cmd/lc_protectbookmarks.svg b/icon-themes/elementary_svg/cmd/lc_protectbookmarks.svg
new file mode 100644
index 000000000000..ffbce15b239c
--- /dev/null
+++ b/icon-themes/elementary_svg/cmd/lc_protectbookmarks.svg
@@ -0,0 +1 @@
+<svg height="24" width="24" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="a" gradientTransform="matrix(.26064 0 0 .3149 1.727 -.048)" gradientUnits="userSpaceOnUse" x1="10.651" x2="27.191999" y1="2.914" y2="17.469999"><stop offset="0" stop-color="#cad0c6"/><stop offset=".5" stop-color="#eaece9"/><stop offset="1" stop-color="#c5cbc0"/></linearGradient><radialGradient id="b" cx="16.823999" cy="11.368" fx="16.777" fy="11.597" gradientTransform="matrix(0 .80952 -1.13905 0 20.95 -6.37)" gradientUnits="userSpaceOnUse" r="10.5"><stop offset="0" stop-color="#f2e0c4"/><stop offset=".765" stop-color="#e5af5b"/><stop offset="1" stop-color="#af6900"/></radialGradient><linearGradient id="c" gradientTransform="matrix(.47368 0 0 .42857 .42 1.286)" gradientUnits="userSpaceOnUse" x1="21.771" x2="21.771" y1="14.871" y2="27.924999"><stop offset="0" stop-color="#fff"/><stop offset=".033" stop-color="#fff" stop-opacity=".235"/><stop offset=".986" stop-
 color="#fff" stop-opacity=".157"/><stop offset="1" stop-color="#fff" stop-opacity=".392"/></linearGradient><linearGradient id="d" gradientUnits="userSpaceOnUse" x1="10.314" x2="10.314" y1="6" y2="15"><stop offset="0" stop-color="#b19c7d"/><stop offset="1" stop-color="#a08358"/></linearGradient><linearGradient id="e" gradientTransform="matrix(-.93358 0 0 1 23.38 -22)" gradientUnits="userSpaceOnUse" x1="8.643" x2="23.299999" xlink:href="#f" y1="27.5" y2="27.5"/><linearGradient id="f"><stop offset="0" stop-color="#fff"/><stop offset="1" stop-color="#fff" stop-opacity="0"/></linearGradient><linearGradient id="g" gradientTransform="matrix(-.93358 0 0 1 23.38 -15)" gradientUnits="userSpaceOnUse" x1="8.643" x2="23.299999" xlink:href="#h" y1="27.5" y2="27.5"/><linearGradient id="h"><stop offset="0"/><stop offset="1" stop-opacity="0"/></linearGradient><linearGradient id="i" gradientTransform="matrix(.66667 0 0 .46668 5.833 -20.534)" gradientUnits="userSpaceOnUse" x1="9" x2="9" xlink:href="#f
 " y1="29" y2="14"/><linearGradient id="j" gradientTransform="matrix(.66667 0 0 .46668 -1.167 -20.534)" gradientUnits="userSpaceOnUse" x1="9" x2="9" xlink:href="#f" y1="29" y2="14"/><linearGradient id="k" gradientTransform="matrix(.66667 0 0 .46667 -12.167 .467)" gradientUnits="userSpaceOnUse" x1="24" x2="24" xlink:href="#l" y1="29" y2="14"/><linearGradient id="l"><stop offset="0" stop-color="#d88f22"/><stop offset="1" stop-color="#d88f22" stop-opacity="0"/></linearGradient><linearGradient id="m" gradientTransform="matrix(.66667 0 0 .46667 -3.167 .467)" gradientUnits="userSpaceOnUse" x1="24" x2="24" xlink:href="#l" y1="29" y2="14"/><linearGradient id="n" gradientTransform="matrix(.77056228 0 0 .77077837 -4.554279 -6.199358)" gradientUnits="userSpaceOnUse" x1="23.470181" x2="23.470181" y1="11.209872" y2="35.051075"><stop offset="0" stop-color="#fff"/><stop offset=".33380178" stop-color="#fff" stop-opacity=".235294"/><stop offset=".67927718" stop-color="#fff" stop-opacity=".156863"/><s
 top offset="1" stop-color="#fff" stop-opacity=".392157"/></linearGradient><linearGradient id="o" gradientUnits="userSpaceOnUse" x1="7.373661" x2="9.158983" y1="9.636601" y2="15.344099"><stop offset="0" stop-color="#fff" stop-opacity=".27451"/><stop offset="1" stop-color="#fff" stop-opacity="0"/></linearGradient><radialGradient id="p" cx="62.625" cy="4.625" gradientTransform="matrix(1.0352941 0 0 .42352883 -52.835297 17.541176)" gradientUnits="userSpaceOnUse" r="10.625" xlink:href="#h"/><linearGradient id="q" gradientUnits="userSpaceOnUse" x1="12.000001" x2="12.000001" y1="1.496136" y2="21.922901"><stop offset="0" stop-color="#ffe16b"/><stop offset="1" stop-color="#f9c440"/></linearGradient><path d="m23 19.499999c0 2.485282-4.924869 4.500001-11 4.500001-6.0751315 0-11.00000001-2.014719-11.00000001-4.500001 0-2.485281 4.92486851-4.499999 11.00000001-4.499999 6.075131 0 11 2.014718 11 4.499999z" fill="url(#p)" fill-rule="evenodd" opacity=".3"/><path d="m12.000001 1.4961357c.708911 0 2.
 994425 5.7107023 3.567948 6.1275073.57352.416804 6.709462.826364 6.928527 1.500768.219066.674404-4.504349 4.613371-4.723415 5.287775-.219065.674404 1.287639 6.638229.714118 7.055033-.573521.416805-5.778267-2.859481-6.487179-2.859481-.708911 0-5.9136574 3.276286-6.4871791 2.859481-.5735211-.416804.9331833-6.38063.7141178-7.055033-.2190657-.674404-4.9424802-4.613372-4.7234145-5.287776.2190656-.674403 6.3550063-1.083963 6.9285281-1.500767.5735207-.416805 2.8590377-6.1275073 3.5679487-6.1275073z" fill="url(#q)" stroke="#ad5f00" stroke-linejoin="round" stroke-opacity=".498039" stroke-width=".992271"/><path d="m11.969145 2.093355c-.45703.693479-1.679762 2.629165-3.0312503 5.8125a.43670935.43670935 0 0 1 -.34375.28125c-2.1354674.348211-4.8091853.716906-6.5625 1.15625 1.1001782 1.3189 2.393494 2.529956 3.625 3.78125l15.1562503-2.71875c.353244-.353813.697176-.697415 1.0625-1.0625-2.051482-.507486-4.36574-.808235-6.5-1.15625a.43670935.43670935 0 0 1 -.34375-.25c-1.039472-2.413271-2.582922-5.0
 37031-3.0625-5.84375z" fill="url(#o)" opacity=".8"/><path d="m12.000395 2.937105c-.289389.492394-.61844 1.165503-.96875 1.875-.361907.732986-.746865 1.511515-1.0625003 2.125-.1578173.306742-.2983144.582546-.4375.8125s-.1632419.388801-.53125.65625c-.3684354.267759-.5505426.251058-.8125.3125-.2619574.06144-.5652425.100734-.90625.15625-.6820149.111033-1.5021108.22551-2.3125.34375-.7742066.112961-1.5055387.221892-2.0625.34375.3780266.425859.9075435.983352 1.46875 1.53125.5845803.570717 1.1708703 1.135202 1.65625 1.625.2426898.244899.4494983.484046.625.6875s.3283605.286554.46875.71875c.1407051.433167.085066.575594.0625.84375s-.072353.564729-.125.90625c-.1052939.683043-.2681064 1.505117-.40625 2.3125-.1323415.773473-.25635 1.525786-.3125 2.09375.525364-.229545 1.203496-.56765 1.90625-.9375.7258699-.382016 1.4761784-.781664 2.0937503-1.09375.308786-.156043.564288-.301637.8125-.40625s.387156-.1875.84375-.1875.595538.08289.84375.1875c.248212.104613.503714.250207.8125.40625.617572.312086 1.36
 788.711734 2.09375 1.09375.702754.36985 1.380886.707955 1.90625.9375-.05615-.567964-.180159-1.320277-.3125-2.09375-.138144-.807383-.300956-1.629457-.40625-2.3125-.05265-.341521-.102434-.638094-.125-.90625-.02257-.268156-.0782-.410584.0625-.84375.14039-.432195.293248-.515296.46875-.71875s.38231-.442601.625-.6875c.48538-.489798 1.07167-1.054283 1.65625-1.625.561206-.547898 1.090723-1.105391 1.46875-1.53125-.556961-.121858-1.288293-.230789-2.0625-.34375-.810389-.11824-1.630485-.232717-2.3125-.34375-.341007-.055516-.644293-.094808-.90625-.15625s-.444064-.04474-.8125-.3125c-.368009-.267449-.392064-.426296-.53125-.65625s-.279683-.505758-.4375-.8125c-.315635-.613485-.700593-1.392014-1.0625-2.125-.350309-.709497-.679362-1.382606-.96875-1.875z" fill="none" opacity=".8" stroke="url(#n)" stroke-linejoin="round" stroke-width=".992271"/><g transform="translate(9 8)"><path d="m4.5 8.5v-3.376c0-2.478 1.37-3.654 3.487-3.624 2.13.03 3.514 1.117 3.514 3.624v3.376h-1.43v-2.746c0-.63.148-2.668-2.068-2.
 668-2.197 0-2.037 2.05-2.028 2.666v2.748z" fill="url(#a)" fill-rule="evenodd" opacity=".4"/><path d="m5.2 6s-.59-3.5 2.8-3.5 2.8 3.5 2.8 3.5" fill="none" opacity=".6" stroke="#fff" stroke-linecap="round"/><path d="m4.5 8.5v-3.376c0-2.478 1.37-3.654 3.487-3.624 2.13.03 3.514 1.117 3.514 3.624v3.376h-2v-2.746c0-.63.15-2.254-1.498-2.254-1.65 0-1.51 1.637-1.502 2.252v2.748z" fill="none" opacity=".4" stroke="#000" stroke-linecap="square"/><rect fill="url(#b)" height="8" rx="1" width="11" x="2.5" y="6.5"/><g fill="none"><path d="m3.5 7.5h9v6h-9z" opacity=".5" stroke="url(#c)" stroke-linejoin="round"/><rect height="8" rx="1" stroke="url(#d)" width="11" x="2.5" y="6.5"/><g stroke-linecap="square"><path d="m3.5 7.5h9m-9 2h9m-9 2h9" opacity=".2" stroke="url(#e)"/><path d="m3.5 12.5h9m-9-6h9m-9 2h9m-9 2h9" opacity=".05" stroke="url(#g)"/></g></g><rect fill="url(#i)" height="7" opacity=".5" rx="2" ry="1" transform="scale(1 -1)" width="1" x="11" y="-14"/><rect fill="url(#j)" height="7" opacity="
 .5" rx="2" ry="1" transform="scale(1 -1)" width="1" x="4" y="-14"/><rect fill="url(#k)" height="7" opacity=".5" rx="1.6" ry=".5" width="1" x="3" y="7"/><rect fill="url(#m)" height="7" opacity=".5" rx="1.6" ry=".5" width="1" x="12" y="7"/></g></svg>
\ No newline at end of file
diff --git a/icon-themes/elementary_svg/cmd/lc_protectfields.svg b/icon-themes/elementary_svg/cmd/lc_protectfields.svg
new file mode 100644
index 000000000000..07412e9a97d4
--- /dev/null
+++ b/icon-themes/elementary_svg/cmd/lc_protectfields.svg
@@ -0,0 +1 @@

... etc. - the rest is truncated


More information about the Libreoffice-commits mailing list