From ca9b1bcf224959b55dbbd92dfed9acbfbb0a6c4a Mon Sep 17 00:00:00 2001
From: Julia Radzhabova <julia.radzhabova@onlyoffice.com>
Date: Wed, 21 Sep 2022 17:15:33 +0300
Subject: [PATCH 01/28] [DE] Add document protection

---
 apps/documenteditor/main/app.js               |   2 +
 .../main/app/controller/DocProtection.js      | 203 +++++++++++++++
 .../main/app/controller/Main.js               |   4 +-
 .../main/app/controller/Toolbar.js            |  23 +-
 .../main/app/view/DocProtection.js            | 130 ++++++++++
 .../main/app/view/ProtectDialog.js            | 237 ++++++++++++++++++
 apps/documenteditor/main/app_dev.js           |   2 +
 7 files changed, 593 insertions(+), 8 deletions(-)
 create mode 100644 apps/documenteditor/main/app/controller/DocProtection.js
 create mode 100644 apps/documenteditor/main/app/view/DocProtection.js
 create mode 100644 apps/documenteditor/main/app/view/ProtectDialog.js

diff --git a/apps/documenteditor/main/app.js b/apps/documenteditor/main/app.js
index 190281919..4d7b05f6d 100644
--- a/apps/documenteditor/main/app.js
+++ b/apps/documenteditor/main/app.js
@@ -157,6 +157,7 @@ require([
             'Main',
             'ViewTab',
             'Search',
+            'DocProtection',
             'Common.Controllers.Fonts',
             'Common.Controllers.History'
             /** coauthoring begin **/
@@ -191,6 +192,7 @@ require([
                 'documenteditor/main/app/controller/Main',
                 'documenteditor/main/app/controller/ViewTab',
                 'documenteditor/main/app/controller/Search',
+                'documenteditor/main/app/controller/DocProtection',
                 'documenteditor/main/app/view/FileMenuPanels',
                 'documenteditor/main/app/view/ParagraphSettings',
                 'documenteditor/main/app/view/HeaderFooterSettings',
diff --git a/apps/documenteditor/main/app/controller/DocProtection.js b/apps/documenteditor/main/app/controller/DocProtection.js
new file mode 100644
index 000000000..c5202176f
--- /dev/null
+++ b/apps/documenteditor/main/app/controller/DocProtection.js
@@ -0,0 +1,203 @@
+/*
+ *
+ * (c) Copyright Ascensio System SIA 2010-2022
+ *
+ * This program is a free software product. You can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License (AGPL)
+ * version 3 as published by the Free Software Foundation. In accordance with
+ * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
+ * that Ascensio System SIA expressly excludes the warranty of non-infringement
+ * of any third-party rights.
+ *
+ * This program is distributed WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR  PURPOSE. For
+ * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
+ *
+ * You can contact Ascensio System SIA at 20A-12 Ernesta Birznieka-Upisha
+ * street, Riga, Latvia, EU, LV-1050.
+ *
+ * The  interactive user interfaces in modified source and object code versions
+ * of the Program must display Appropriate Legal Notices, as required under
+ * Section 5 of the GNU AGPL version 3.
+ *
+ * Pursuant to Section 7(b) of the License you must retain the original Product
+ * logo when distributing the program. Pursuant to Section 7(e) we decline to
+ * grant you any rights under trademark law for use of our trademarks.
+ *
+ * All the Product's GUI elements, including illustrations and icon sets, as
+ * well as technical writing content are licensed under the terms of the
+ * Creative Commons Attribution-ShareAlike 4.0 International. See the License
+ * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
+ *
+ */
+
+/**
+ *  DocProtection.js
+ *
+ *  Created by Julia Radzhabova on 21.09.2022
+ *  Copyright (c) 2022 Ascensio System SIA. All rights reserved.
+ *
+ */
+define([
+    'core',
+    'common/main/lib/view/Protection',
+    'documenteditor/main/app/view/DocProtection',
+    'documenteditor/main/app/view/ProtectDialog'
+], function () {
+    'use strict';
+
+    if (!Common.enumLock)
+        Common.enumLock = {};
+
+    var enumLock = {
+        docLockView: 'lock-mode-view',
+        docLockForms: 'lock-mode-forms',
+        docLockReview: 'lock-mode-review',
+        docLockComments: 'lock-mode-comments'
+    };
+    for (var key in enumLock) {
+        if (enumLock.hasOwnProperty(key)) {
+            Common.enumLock[key] = enumLock[key];
+        }
+    }
+
+    DE.Controllers.DocProtection = Backbone.Controller.extend(_.extend({
+        models : [],
+        collections : [
+        ],
+        views : [
+            'DocProtection'
+        ],
+
+        initialize: function () {
+
+            this.addListeners({
+                'DocProtection': {
+                    'protect:document':      _.bind(this.onProtectDocClick, this)
+                }
+            });
+        },
+        onLaunch: function () {
+            this._state = {};
+            Common.NotificationCenter.on('app:ready', this.onAppReady.bind(this));
+        },
+        setConfig: function (data, api) {
+            this.setApi(api);
+        },
+        setApi: function (api) {
+            if (api) {
+                this.api = api;
+                this.api.asc_registerCallback('asc_onChangeProtectDocument',_.bind(this.onChangeProtectDocument, this));
+            }
+        },
+
+        setMode: function(mode) {
+            this.appConfig = mode;
+
+            this.appConfig.isEdit && (this.view = this.createView('DocProtection', {
+                mode: mode
+            }));
+
+            return this;
+        },
+
+        createToolbarPanel: function() {
+            if (this.view)
+                return this.view.getPanel();
+        },
+
+        getView: function(name) {
+            return !name && this.view ?
+                this.view : Backbone.Controller.prototype.getView.call(this, name);
+        },
+
+        onProtectDocClick: function(state) {
+            this.view.btnProtectDoc.toggle(!state, true);
+            if (state) {
+                var me = this,
+                    btn,
+                    win = new DE.Views.ProtectDialog({
+                        handler: function(result, value, props) {
+                            btn = result;
+                            if (result == 'ok') {
+                                // var props = me.api.asc_getProtectedDocument();
+                                // props.asc_setLockMode(props);
+                                // props.asc_setLockPwd(value);
+                                // me.api.asc_setProtectedDocument(props);
+                            }
+                            Common.NotificationCenter.trigger('edit:complete');
+                        }
+                    }).on('close', function() {
+                        if (btn!=='ok')
+                            me.view.btnProtectDoc.toggle(false, true);
+                    });
+
+                win.show();
+            } else {
+                var me = this,
+                    btn,
+                    props = me.api.asc_getProtectedDocument();
+                if (props.asc_isPassword()) {
+                    var win = new Common.Views.OpenDialog({
+                        title: me.view.txtWBUnlockTitle,
+                        closable: true,
+                        type: Common.Utils.importTextType.DRM,
+                        txtOpenFile: me.view.txtWBUnlockDescription,
+                        validatePwd: false,
+                        handler: function (result, value) {
+                            btn = result;
+                            if (result == 'ok') {
+                                if (me.api) {
+                                    // props.asc_setLockPwd(value && value.drmOptions ? value.drmOptions.asc_getPassword() : undefined);
+                                    // me.api.asc_setProtectedDocument(props);
+                                }
+                                Common.NotificationCenter.trigger('edit:complete');
+                            }
+                        }
+                    }).on('close', function() {
+                        if (btn!=='ok')
+                            me.view.btnProtectDoc.toggle(true, true);
+                    });
+
+                    win.show();
+                } else {
+                    props.asc_setLockPwd();
+                    me.api.asc_setProtectedDocument(props);
+                }
+            }
+        },
+
+        onAppReady: function (config) {
+            if (!this.view) return;
+
+            var me = this;
+            (new Promise(function (resolve) {
+                resolve();
+            })).then(function () {
+                // me.view.btnProtectDoc.toggle(me.api.asc_isProtectedDocument(), true);
+            });
+        },
+
+        onChangeProtectDocument: function() {
+            // this.view && this.view.btnProtectDoc.toggle(this.api.asc_isProtectedDocument(), true);
+        },
+
+        getDocProps: function(update) {
+            if (!this.appConfig || !this.appConfig.isEdit && !this.appConfig.isRestrictedEdit) return;
+
+            if (update || !this._state.protection) {
+                var docProtected = !!this.api.asc_isProtectedDocument(),
+                    type;
+
+                if (docProtected) {
+                    var props = this.api.asc_getProtectedDocument();
+                    type = props.asc_getLockMode();
+                }
+                this._state.protection = {docLock: docProtected, lockMode: type};
+            }
+
+            return this._state.protection;
+        }
+
+    }, DE.Controllers.DocProtection || {}));
+});
\ No newline at end of file
diff --git a/apps/documenteditor/main/app/controller/Main.js b/apps/documenteditor/main/app/controller/Main.js
index 9af86ff56..a0fdd0c70 100644
--- a/apps/documenteditor/main/app/controller/Main.js
+++ b/apps/documenteditor/main/app/controller/Main.js
@@ -1700,8 +1700,8 @@ define([
                     fontsControllers    && fontsControllers.setApi(me.api);
                     rightmenuController && rightmenuController.setApi(me.api);
 
-                    if (this.appOptions.canProtect)
-                        application.getController('Common.Controllers.Protection').setMode(me.appOptions).setConfig({config: me.editorConfig}, me.api);
+                    application.getController('Common.Controllers.Protection').setMode(me.appOptions).setConfig({config: me.editorConfig}, me.api);
+                    application.getController('DocProtection').setMode(me.appOptions).setConfig({config: me.editorConfig}, me.api);
 
                     var viewport = this.getApplication().getController('Viewport').getView('Viewport');
 
diff --git a/apps/documenteditor/main/app/controller/Toolbar.js b/apps/documenteditor/main/app/controller/Toolbar.js
index 6812ef505..94aaaf698 100644
--- a/apps/documenteditor/main/app/controller/Toolbar.js
+++ b/apps/documenteditor/main/app/controller/Toolbar.js
@@ -3203,13 +3203,24 @@ define([
                     me.toolbar.processPanelVisible(null, true, true);
                 }
 
-                if ( config.isDesktopApp ) {
-                    if ( config.canProtect ) {
-                        tab = {action: 'protect', caption: me.toolbar.textTabProtect, dataHintTitle: 'T', layoutname: 'toolbar-protect'};
-                        $panel = me.getApplication().getController('Common.Controllers.Protection').createToolbarPanel();
+                // if ( config.isDesktopApp ) {
+                //     if ( config.canProtect ) {
+                //         tab = {action: 'protect', caption: me.toolbar.textTabProtect, dataHintTitle: 'T', layoutname: 'toolbar-protect'};
+                //         $panel = me.getApplication().getController('Common.Controllers.Protection').createToolbarPanel();
+                //
+                //         if ($panel) me.toolbar.addTab(tab, $panel, 6);
+                //     }
+                // }
 
-                        if ($panel) me.toolbar.addTab(tab, $panel, 6);
-                    }
+                tab = {action: 'protect', caption: me.toolbar.textTabProtect, layoutname: 'toolbar-protect', dataHintTitle: 'T'};
+                $panel = me.getApplication().getController('Common.Controllers.Protection').createToolbarPanel();
+                if ($panel) {
+                    config.canProtect && $panel.append($('<div class="separator long"></div>'));
+                    var doctab = me.getApplication().getController('DocProtection');
+                    $panel.append(doctab.createToolbarPanel());
+                    me.toolbar.addTab(tab, $panel, 6);
+                    me.toolbar.setVisible('protect', Common.UI.LayoutManager.isElementVisible('toolbar-protect'));
+                    Array.prototype.push.apply(me.toolbar.lockControls, doctab.getView('DocProtection').getButtons());
                 }
 
                 var links = me.getApplication().getController('Links');
diff --git a/apps/documenteditor/main/app/view/DocProtection.js b/apps/documenteditor/main/app/view/DocProtection.js
new file mode 100644
index 000000000..3f4916175
--- /dev/null
+++ b/apps/documenteditor/main/app/view/DocProtection.js
@@ -0,0 +1,130 @@
+/*
+ *
+ * (c) Copyright Ascensio System SIA 2010-2022
+ *
+ * This program is a free software product. You can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License (AGPL)
+ * version 3 as published by the Free Software Foundation. In accordance with
+ * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
+ * that Ascensio System SIA expressly excludes the warranty of non-infringement
+ * of any third-party rights.
+ *
+ * This program is distributed WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR  PURPOSE. For
+ * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
+ *
+ * You can contact Ascensio System SIA at 20A-12 Ernesta Birznieka-Upisha
+ * street, Riga, Latvia, EU, LV-1050.
+ *
+ * The  interactive user interfaces in modified source and object code versions
+ * of the Program must display Appropriate Legal Notices, as required under
+ * Section 5 of the GNU AGPL version 3.
+ *
+ * Pursuant to Section 7(b) of the License you must retain the original Product
+ * logo when distributing the program. Pursuant to Section 7(e) we decline to
+ * grant you any rights under trademark law for use of our trademarks.
+ *
+ * All the Product's GUI elements, including illustrations and icon sets, as
+ * well as technical writing content are licensed under the terms of the
+ * Creative Commons Attribution-ShareAlike 4.0 International. See the License
+ * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
+ *
+ */
+
+/**
+ *  DocProtection.js
+ *
+ *  Created by Julia Radzhabova on 21.09.2022
+ *  Copyright (c) 2022 Ascensio System SIA. All rights reserved.
+ *
+ */
+define([
+    'common/main/lib/util/utils',
+    'common/main/lib/component/BaseView',
+    'common/main/lib/component/Layout',
+    'common/main/lib/component/Window'
+], function (template) {
+    'use strict';
+
+    DE.Views.DocProtection = Common.UI.BaseView.extend(_.extend((function(){
+        var template =
+            '<div class="group">' +
+            '<span id="slot-btn-protect-doc" class="btn-slot text x-huge"></span>' +
+            '</div>';
+
+        function setEvents() {
+            var me = this;
+
+            this.btnProtectDoc.on('click', function (btn, e) {
+                me.fireEvent('protect:document', [btn.pressed]);
+            });
+            me._isSetEvents = true;
+        }
+
+        return {
+
+            options: {},
+
+            initialize: function (options) {
+                Common.UI.BaseView.prototype.initialize.call(this, options);
+
+                this.appConfig = options.mode;
+
+                var _set = Common.enumLock;
+                this.lockedControls = [];
+                this._state = {disabled: false};
+
+                this.btnProtectDoc = new Common.UI.Button({
+                    cls: 'btn-toolbar x-huge icon-top',
+                    iconCls: 'toolbar__icon protect-workbook',
+                    enableToggle: true,
+                    caption: this.txtProtectDoc,
+                    lock        : [_set.lostConnect, _set.coAuth],
+                    dataHint    : '1',
+                    dataHintDirection: 'bottom',
+                    dataHintOffset: 'small'
+                });
+                this.lockedControls.push(this.btnProtectDoc);
+
+                Common.NotificationCenter.on('app:ready', this.onAppReady.bind(this));
+            },
+
+            render: function (el) {
+                return this;
+            },
+
+            onAppReady: function (config) {
+                var me = this;
+                (new Promise(function (accept, reject) {
+                    accept();
+                })).then(function(){
+                    me.btnProtectDoc.updateHint(me.hintProtectDoc);
+                    setEvents.call(me);
+                });
+            },
+
+            getPanel: function () {
+                this.$el = $(_.template(template)( {} ));
+
+                this.btnProtectDoc.render(this.$el.find('#slot-btn-protect-doc'));
+                return this.$el;
+            },
+
+            getButtons: function(type) {
+                if (type===undefined)
+                    return this.lockedControls;
+                return [];
+            },
+
+            show: function () {
+                Common.UI.BaseView.prototype.show.call(this);
+                this.fireEvent('show', this);
+            },
+
+            txtProtectDoc: 'Protect Document',
+            txtDocUnlockTitle: 'Unprotect Document',
+            hintProtectDoc: 'Protect document',
+            txtDocUnlockDescription: 'Enter a password to unprotect document'
+        }
+    }()), DE.Views.DocProtection || {}));
+});
\ No newline at end of file
diff --git a/apps/documenteditor/main/app/view/ProtectDialog.js b/apps/documenteditor/main/app/view/ProtectDialog.js
new file mode 100644
index 000000000..bebe37ef4
--- /dev/null
+++ b/apps/documenteditor/main/app/view/ProtectDialog.js
@@ -0,0 +1,237 @@
+/*
+ *
+ * (c) Copyright Ascensio System SIA 2010-2022
+ *
+ * This program is a free software product. You can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License (AGPL)
+ * version 3 as published by the Free Software Foundation. In accordance with
+ * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
+ * that Ascensio System SIA expressly excludes the warranty of non-infringement
+ * of any third-party rights.
+ *
+ * This program is distributed WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR  PURPOSE. For
+ * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
+ *
+ * You can contact Ascensio System SIA at 20A-12 Ernesta Birznieka-Upisha
+ * street, Riga, Latvia, EU, LV-1050.
+ *
+ * The  interactive user interfaces in modified source and object code versions
+ * of the Program must display Appropriate Legal Notices, as required under
+ * Section 5 of the GNU AGPL version 3.
+ *
+ * Pursuant to Section 7(b) of the License you must retain the original Product
+ * logo when distributing the program. Pursuant to Section 7(e) we decline to
+ * grant you any rights under trademark law for use of our trademarks.
+ *
+ * All the Product's GUI elements, including illustrations and icon sets, as
+ * well as technical writing content are licensed under the terms of the
+ * Creative Commons Attribution-ShareAlike 4.0 International. See the License
+ * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
+ *
+ */
+/**
+ *  ProtectDialog.js
+ *
+ *  Created by Julia Radzhabova on 21.09.2022
+ *  Copyright (c) 2022 Ascensio System SIA. All rights reserved.
+ *
+ */
+
+define([
+    'common/main/lib/component/Window'
+], function () {
+    'use strict';
+
+    Asc.c_oAscProtection = {
+        View: 1,
+        Forms: 2,
+        Review: 3,
+        Comments: 4
+    };
+    DE.Views.ProtectDialog = Common.UI.Window.extend(_.extend({
+
+        initialize : function (options) {
+            var t = this,
+                _options = {};
+
+            _.extend(_options,  {
+                title: options.title ? options.title : this.txtTitle,
+                cls: 'modal-dlg',
+                width: 350,
+                height: 'auto',
+                buttons: options.buttons ? options.buttons : [{
+                    value: 'ok',
+                    caption: this.txtProtect
+                }, 'cancel']
+            }, options);
+
+            this.handler        = options.handler;
+            this.txtDescription = options.txtDescription || '';
+            this.props = options.props;
+            this.isEdit = options.isEdit;
+            this.api = options.api;
+
+            this.template = options.template || [
+                '<div class="box">',
+                    '<div class="input-row">',
+                        '<label>' + t.txtPassword + ' (' + t.txtOptional + ')' + '</label>',
+                    '</div>',
+                    '<div id="id-protect-password-txt" class="input-row" style="margin-bottom: 5px;"></div>',
+                    '<div class="input-row">',
+                        '<label>' + t.txtRepeat + '</label>',
+                    '</div>',
+                    '<div id="id-protect-repeat-txt" class="input-row" style="margin-bottom: 10px;"></div>',
+                    '<div class="input-row" style="margin-bottom: 5px;">',
+                        '<label style="font-weight: bold;letter-spacing: 0.01em;margin-bottom: 5px;">' + t.txtAllow + '</label>',
+                    '</div>',
+                    '<div id="id-protect-radio-view" style="margin-bottom: 8px;"></div>',
+                    '<div id="id-protect-radio-forms" style="margin-bottom: 8px;"></div>',
+                    '<div id="id-protect-radio-review" style="margin-bottom: 8px;"></div>',
+                    '<div id="id-protect-radio-comment" style="margin-bottom: 8px;"></div>',
+                    '<label>' + t.txtWarning + '</label>',
+                '</div>'
+            ].join('');
+
+            _options.tpl        =   _.template(this.template)(_options);
+
+            Common.UI.Window.prototype.initialize.call(this, _options);
+        },
+        render: function () {
+            Common.UI.Window.prototype.render.call(this);
+
+            var me = this;
+            this.$window.find('.dlg-btn').on('click', _.bind(this.onBtnClick, this));
+
+            this.repeatPwd = new Common.UI.InputField({
+                el: this.$window.find('#id-protect-repeat-txt'),
+                type: 'password',
+                allowBlank  : true,
+                style       : 'width: 100%;',
+                maxLength: 255,
+                validateOnBlur: false,
+                validation  : function(value) {
+                    return me.txtIncorrectPwd;
+                }
+            });
+
+            this.inputPwd = new Common.UI.InputFieldBtnPassword({
+                el: this.$window.find('#id-protect-password-txt'),
+                type: 'password',
+                allowBlank  : true,
+                style       : 'width: 100%;',
+                maxLength: 255,
+                validateOnBlur: false,
+                repeatInput: this.repeatPwd,
+                showPwdOnClick: true
+            });
+
+            this.rbView = new Common.UI.RadioBox({
+                el: this.$window.find('#id-protect-radio-view'),
+                labelText: this.textView,
+                name: 'asc-radio-protect-mode',
+                value: Asc.c_oAscProtection.View,
+                checked: true
+            });
+
+            this.rbForms = new Common.UI.RadioBox({
+                el: this.$window.find('#id-protect-radio-forms'),
+                labelText: this.textForms,
+                name: 'asc-radio-protect-mode',
+                value: Asc.c_oAscProtection.Forms
+            });
+
+            this.rbReview = new Common.UI.RadioBox({
+                el: this.$window.find('#id-protect-radio-review'),
+                labelText: this.textReview,
+                name: 'asc-radio-protect-mode',
+                value: Asc.c_oAscProtection.Review
+            });
+
+            this.rbComments = new Common.UI.RadioBox({
+                el: this.$window.find('#id-protect-radio-comment'),
+                labelText: this.textComments,
+                name: 'asc-radio-protect-mode',
+                value: Asc.c_oAscProtection.Comments
+            });
+
+            this.afterRender();
+        },
+
+        getFocusedComponents: function() {
+            return [this.inputPwd, this.repeatPwd, this.rbView, this.rbForms, this.rbReview, this.rbComments];
+        },
+
+        getDefaultFocusableComponent: function () {
+            return this.inputPwd;
+        },
+
+        afterRender: function() {
+            this._setDefaults(this.props);
+        },
+
+        onPrimary: function(event) {
+            this._handleInput('ok');
+            return false;
+        },
+
+        onBtnClick: function(event) {
+            this._handleInput(event.currentTarget.attributes['result'].value);
+        },
+
+        _handleInput: function(state) {
+            if (this.handler) {
+                if (state == 'ok') {
+                    if (this.inputPwd.checkValidate() !== true)  {
+                        this.inputPwd.focus();
+                        return;
+                    }
+                    if (this.inputPwd.getValue() !== this.repeatPwd.getValue()) {
+                        this.repeatPwd.checkValidate();
+                        this.repeatPwd.focus();
+                        return;
+                    }
+                }
+                this.handler.call(this, state, this.inputPwd.getValue(), (state == 'ok') ? this.getSettings() : undefined);
+            }
+
+            this.close();
+        },
+
+        _setDefaults: function (props) {
+            if (props) {
+                var type = props.asc_getType();
+                switch (type) {
+                    case Asc.c_oAscProtection.Forms:     this.rbForms.setValue(true, true); break;
+                    case Asc.c_oAscProtection.Review:    this.rbReview.setValue(true, true); break;
+                    case Asc.c_oAscProtection.Comments:  this.rbComments.setValue(true, true); break;
+                }
+            }
+        },
+
+        getSettings: function() {
+            if (this.rbView.getValue())
+                return Asc.c_oAscProtection.View;
+            if (this.rbForms.getValue())
+                return Asc.c_oAscProtection.Forms;
+            if (this.rbReview.getValue())
+                return Asc.c_oAscProtection.Review;
+            if (this.rbComments.getValue())
+                return Asc.c_oAscProtection.Comments;
+        },
+
+        txtPassword : "Password",
+        txtRepeat: 'Repeat password',
+        txtOptional: 'optional',
+        txtIncorrectPwd: 'Confirmation password is not identical',
+        txtWarning: 'Warning: If you lose or forget the password, it cannot be recovered. Please keep it in a safe place.',
+        txtProtect: 'Protect',
+        txtTitle: 'Protect',
+        txtAllow: 'Allow only this type of editing in the document',
+        textView: 'No changes (Read only)',
+        textForms: 'Filling forms',
+        textReview: 'Tracked changes',
+        textComments: 'Comments'
+
+    }, DE.Views.ProtectDialog || {}));
+});
diff --git a/apps/documenteditor/main/app_dev.js b/apps/documenteditor/main/app_dev.js
index 242a4d947..89276f32b 100644
--- a/apps/documenteditor/main/app_dev.js
+++ b/apps/documenteditor/main/app_dev.js
@@ -147,6 +147,7 @@ require([
             'Main',
             'ViewTab',
             'Search',
+            'DocProtection',
             'Common.Controllers.Fonts',
             'Common.Controllers.History'
             /** coauthoring begin **/
@@ -181,6 +182,7 @@ require([
                 'documenteditor/main/app/controller/Main',
                 'documenteditor/main/app/controller/ViewTab',
                 'documenteditor/main/app/controller/Search',
+                'documenteditor/main/app/controller/DocProtection',
                 'documenteditor/main/app/view/FileMenuPanels',
                 'documenteditor/main/app/view/ParagraphSettings',
                 'documenteditor/main/app/view/HeaderFooterSettings',

From b898aee9279dfba5fd1f8786a0186f3aa531b1bf Mon Sep 17 00:00:00 2001
From: Julia Radzhabova <julia.radzhabova@onlyoffice.com>
Date: Fri, 23 Sep 2022 15:13:58 +0300
Subject: [PATCH 02/28] [DE] Lock controls when document is protected (read
 only mode)

---
 .../main/lib/controller/ReviewChanges.js      |  16 +++
 apps/common/main/lib/view/ReviewChanges.js    |  26 ++--
 .../main/app/controller/DocProtection.js      |  51 ++++++--
 .../main/app/controller/DocumentHolder.js     |  29 ++++-
 .../main/app/controller/FormsTab.js           |  16 +++
 .../main/app/controller/Links.js              |  15 +++
 .../main/app/controller/PageLayout.js         |  18 ++-
 .../main/app/controller/RightMenu.js          |  31 ++++-
 .../main/app/controller/Statusbar.js          |  10 +-
 .../main/app/controller/Toolbar.js            |  17 ++-
 .../main/app/view/DocProtection.js            |   2 +-
 .../main/app/view/DocumentHolder.js           |   9 +-
 apps/documenteditor/main/app/view/FormsTab.js |  28 ++--
 apps/documenteditor/main/app/view/Links.js    |  20 +--
 .../main/app/view/ProtectDialog.js            |   6 -
 .../documenteditor/main/app/view/Statusbar.js |  17 ++-
 apps/documenteditor/main/app/view/Toolbar.js  | 122 +++++++++---------
 17 files changed, 292 insertions(+), 141 deletions(-)

diff --git a/apps/common/main/lib/controller/ReviewChanges.js b/apps/common/main/lib/controller/ReviewChanges.js
index 9cd921188..d25d1a9c6 100644
--- a/apps/common/main/lib/controller/ReviewChanges.js
+++ b/apps/common/main/lib/controller/ReviewChanges.js
@@ -111,6 +111,7 @@ define([
             Common.NotificationCenter.on('collaboration:sharing', this.changeAccessRights.bind(this));
             Common.NotificationCenter.on('collaboration:sharingdeny', this.onLostEditRights.bind(this));
             Common.NotificationCenter.on('protect:wslock', _.bind(this.onChangeProtectSheet, this));
+            Common.NotificationCenter.on('protect:doclock', _.bind(this.onChangeProtectDocument, this));
 
             this.userCollection.on('reset', _.bind(this.onUpdateUsers, this));
             this.userCollection.on('add',   _.bind(this.onUpdateUsers, this));
@@ -890,6 +891,7 @@ define([
                 });
             }
             me.onChangeProtectSheet();
+            me.onChangeProtectDocument();
             if (me.view) {
                 me.lockToolbar(Common.enumLock.hideComments, !Common.localStorage.getBool(me.view.appPrefix + "settings-livecomment", true), {array: [me.view.btnCommentRemove, me.view.btnCommentResolve]});
                 me.lockToolbar(Common.enumLock['Objects'], !!this._state.wsProps['Objects'], {array: [me.view.btnCommentRemove, me.view.btnCommentResolve]});
@@ -1011,6 +1013,20 @@ define([
             this.lockToolbar(Common.enumLock['Objects'], !!this._state.wsProps['Objects'], {array: [this.view.btnCommentRemove, this.view.btnCommentResolve]});
         },
 
+        onChangeProtectDocument: function(props) {
+            if (!props) {
+                var docprotect = this.getApplication().getController('DocProtection');
+                props = docprotect ? docprotect.getDocProps() : null;
+            }
+            if (props) {
+                this._state.docProtection = props;
+                this.lockToolbar(Common.enumLock.docLockView, props.docLock && (props.lockMode===Asc.c_oAscProtection.View));
+                this.lockToolbar(Common.enumLock.docLockForms, props.docLock && (props.lockMode===Asc.c_oAscProtection.Forms));
+                this.lockToolbar(Common.enumLock.docLockReview, props.docLock && (props.lockMode===Asc.c_oAscProtection.Review));
+                this.lockToolbar(Common.enumLock.docLockComments, props.docLock && (props.lockMode===Asc.c_oAscProtection.Comments));
+            }
+        },
+
         textInserted: '<b>Inserted:</b>',
         textDeleted: '<b>Deleted:</b>',
         textParaInserted: '<b>Paragraph Inserted</b> ',
diff --git a/apps/common/main/lib/view/ReviewChanges.js b/apps/common/main/lib/view/ReviewChanges.js
index baba01435..12f007dbc 100644
--- a/apps/common/main/lib/view/ReviewChanges.js
+++ b/apps/common/main/lib/view/ReviewChanges.js
@@ -259,7 +259,7 @@ define([
                         caption: this.txtAccept,
                         split: !this.appConfig.canUseReviewPermissions,
                         iconCls: 'toolbar__icon btn-review-save',
-                        lock: [_set.reviewChangelock, _set.isReviewOnly, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect],
+                        lock: [_set.reviewChangelock, _set.isReviewOnly, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.docLockView],
                         dataHint: '1',
                         dataHintDirection: 'bottom',
                         dataHintOffset: 'small'
@@ -271,7 +271,7 @@ define([
                         caption: this.txtReject,
                         split: !this.appConfig.canUseReviewPermissions,
                         iconCls: 'toolbar__icon btn-review-deny',
-                        lock: [_set.reviewChangelock, _set.isReviewOnly, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect],
+                        lock: [_set.reviewChangelock, _set.isReviewOnly, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.docLockView],
                         dataHint: '1',
                         dataHintDirection: 'bottom',
                         dataHintOffset: 'small'
@@ -284,7 +284,7 @@ define([
                             caption: this.txtCompare,
                             split: true,
                             iconCls: 'toolbar__icon btn-compare',
-                            lock: [_set.hasCoeditingUsers, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect],
+                            lock: [_set.hasCoeditingUsers, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.docLockView],
                             dataHint: '1',
                             dataHintDirection: 'bottom',
                             dataHintOffset: 'small'
@@ -294,7 +294,7 @@ define([
                     this.btnTurnOn = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-ic-review',
-                        lock: [_set.previewReviewMode, _set.viewFormMode, _set.lostConnect],
+                        lock: [_set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.docLockView],
                         caption: this.txtTurnon,
                         split: !this.appConfig.isReviewOnly,
                         enableToggle: true,
@@ -309,7 +309,7 @@ define([
                     this.btnPrev = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-review-prev',
-                        lock: [_set.previewReviewMode, _set.viewFormMode, _set.lostConnect],
+                        lock: [_set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.docLockView],
                         caption: this.txtPrev,
                         dataHint: '1',
                         dataHintDirection: 'bottom',
@@ -320,7 +320,7 @@ define([
                     this.btnNext = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-review-next',
-                        lock: [_set.previewReviewMode, _set.viewFormMode, _set.lostConnect],
+                        lock: [_set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.docLockView],
                         caption: this.txtNext,
                         dataHint: '1',
                         dataHintDirection: 'bottom',
@@ -336,7 +336,7 @@ define([
                         this.btnReviewView = new Common.UI.Button({
                             cls: 'btn-toolbar x-huge icon-top',
                             iconCls: 'toolbar__icon btn-ic-reviewview',
-                            lock: [_set.viewFormMode, _set.lostConnect],
+                            lock: [_set.viewFormMode, _set.lostConnect, _set.docLockView],
                             caption: this.txtView,
                             menu: new Common.UI.Menu({
                                 cls: 'ppm-toolbar',
@@ -404,7 +404,7 @@ define([
                     this.btnCoAuthMode = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-ic-coedit',
-                        lock: [_set.viewFormMode, _set.lostConnect],
+                        lock: [_set.viewFormMode, _set.lostConnect, _set.docLockView],
                         caption: this.txtCoAuthMode,
                         menu: true,
                         dataHint: '1',
@@ -450,7 +450,7 @@ define([
                         caption: this.txtCommentRemove,
                         split: true,
                         iconCls: 'toolbar__icon btn-rem-comment',
-                        lock: [_set.previewReviewMode, _set.viewFormMode, _set.hideComments, _set['Objects'], _set.lostConnect],
+                        lock: [_set.previewReviewMode, _set.viewFormMode, _set.hideComments, _set['Objects'], _set.lostConnect, _set.docLockView],
                         dataHint: '1',
                         dataHintDirection: 'bottom',
                         dataHintOffset: 'small'
@@ -461,7 +461,7 @@ define([
                         caption: this.txtCommentResolve,
                         split: true,
                         iconCls: 'toolbar__icon btn-resolve-all',
-                        lock: [_set.previewReviewMode, _set.viewFormMode, _set.hideComments, _set['Objects'], _set.lostConnect],
+                        lock: [_set.previewReviewMode, _set.viewFormMode, _set.hideComments, _set['Objects'], _set.lostConnect, _set.docLockView],
                         dataHint: '1',
                         dataHintDirection: 'bottom',
                         dataHintOffset: 'small'
@@ -731,7 +731,7 @@ define([
                     var button = new Common.UI.Button({
                         cls         : 'btn-toolbar',
                         iconCls     : 'toolbar__icon btn-ic-review',
-                        lock: [Common.enumLock.viewMode, Common.enumLock.previewReviewMode, Common.enumLock.viewFormMode, Common.enumLock.lostConnect],
+                        lock: [Common.enumLock.viewMode, Common.enumLock.previewReviewMode, Common.enumLock.viewFormMode, Common.enumLock.lostConnect, Common.enumLock.docLockView],
                         hintAnchor  : 'top',
                         hint        : this.tipReview,
                         split       : !this.appConfig.isReviewOnly,
@@ -778,7 +778,7 @@ define([
                     button = new Common.UI.Button({
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-ic-docspell',
-                        lock: [Common.enumLock.viewMode,  Common.enumLock.viewFormMode, Common.enumLock.previewReviewMode],
+                        lock: [Common.enumLock.viewMode,  Common.enumLock.viewFormMode, Common.enumLock.previewReviewMode, Common.enumLock.docLockView],
                         hintAnchor  : 'top',
                         hint: this.tipSetSpelling,
                         enableToggle: true,
@@ -794,7 +794,7 @@ define([
                     button = new Common.UI.Button({
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-ic-doclang',
-                        lock: [Common.enumLock.viewMode, Common.enumLock.previewReviewMode, Common.enumLock.viewFormMode, Common.enumLock.noSpellcheckLangs, Common.enumLock.lostConnect],
+                        lock: [Common.enumLock.viewMode, Common.enumLock.previewReviewMode, Common.enumLock.viewFormMode, Common.enumLock.noSpellcheckLangs, Common.enumLock.lostConnect, Common.enumLock.docLockView],
                         hintAnchor  : 'top',
                         hint: this.tipSetDocLang,
                         dataHint: '0',
diff --git a/apps/documenteditor/main/app/controller/DocProtection.js b/apps/documenteditor/main/app/controller/DocProtection.js
index c5202176f..7dd4d9d0f 100644
--- a/apps/documenteditor/main/app/controller/DocProtection.js
+++ b/apps/documenteditor/main/app/controller/DocProtection.js
@@ -46,6 +46,13 @@ define([
 ], function () {
     'use strict';
 
+    Asc.c_oAscProtection = {
+        View: 1,
+        Forms: 2,
+        Review: 3,
+        Comments: 4
+    };
+
     if (!Common.enumLock)
         Common.enumLock = {};
 
@@ -121,9 +128,12 @@ define([
                             btn = result;
                             if (result == 'ok') {
                                 // var props = me.api.asc_getProtectedDocument();
-                                // props.asc_setLockMode(props);
+                                // props.asc_setType(props);
                                 // props.asc_setLockPwd(value);
                                 // me.api.asc_setProtectedDocument(props);
+
+                                me.view.btnProtectDoc.toggle(true, true); // test
+                                me.onChangeProtectDocument(); // test
                             }
                             Common.NotificationCenter.trigger('edit:complete');
                         }
@@ -136,8 +146,10 @@ define([
             } else {
                 var me = this,
                     btn,
-                    props = me.api.asc_getProtectedDocument();
-                if (props.asc_isPassword()) {
+                    // props = me.api.asc_getProtectedDocument();
+                    props = undefined; // test
+                // if (props.asc_isPassword()) {
+                if (props && props.asc_isPassword()) {
                     var win = new Common.Views.OpenDialog({
                         title: me.view.txtWBUnlockTitle,
                         closable: true,
@@ -161,8 +173,10 @@ define([
 
                     win.show();
                 } else {
-                    props.asc_setLockPwd();
-                    me.api.asc_setProtectedDocument(props);
+                    me.view.btnProtectDoc.toggle(false, true); // test
+                    me.onChangeProtectDocument(); // test
+                    // props.asc_setLockPwd();
+                    // me.api.asc_setProtectedDocument(props);
                 }
             }
         },
@@ -179,24 +193,37 @@ define([
         },
 
         onChangeProtectDocument: function() {
-            // this.view && this.view.btnProtectDoc.toggle(this.api.asc_isProtectedDocument(), true);
+            // var isProtected = this.api.asc_isProtectedDocument();
+            var isProtected = this.view.btnProtectDoc.isActive(); // test
+            this.view && this.view.btnProtectDoc.toggle(isProtected, true);
+            var props = this.getDocProps(true);
+            Common.NotificationCenter.trigger('protect:doclock', props);
         },
 
         getDocProps: function(update) {
             if (!this.appConfig || !this.appConfig.isEdit && !this.appConfig.isRestrictedEdit) return;
 
-            if (update || !this._state.protection) {
-                var docProtected = !!this.api.asc_isProtectedDocument(),
+            if (update || !this._state.docProtection) {
+                // var docProtected = !!this.api.asc_isProtectedDocument(),
+                //     type;
+                //
+                // if (docProtected) {
+                //     var props = this.api.asc_getProtectedDocument();
+                //     type = props.asc_getType();
+                // }
+
+                // test //////
+                var docProtected = this.view.btnProtectDoc.isActive(),
                     type;
 
                 if (docProtected) {
-                    var props = this.api.asc_getProtectedDocument();
-                    type = props.asc_getLockMode();
+                    type = Asc.c_oAscProtection.View;
                 }
-                this._state.protection = {docLock: docProtected, lockMode: type};
+                /////////////
+                this._state.docProtection = {docLock: docProtected, lockMode: type};
             }
 
-            return this._state.protection;
+            return this._state.docProtection;
         }
 
     }, DE.Controllers.DocProtection || {}));
diff --git a/apps/documenteditor/main/app/controller/DocumentHolder.js b/apps/documenteditor/main/app/controller/DocumentHolder.js
index c42c99a88..e5c6ab6b3 100644
--- a/apps/documenteditor/main/app/controller/DocumentHolder.js
+++ b/apps/documenteditor/main/app/controller/DocumentHolder.js
@@ -226,7 +226,7 @@ define([
                     this.api.asc_registerCallback('asc_onShowContentControlsActions',_.bind(this.onShowContentControlsActions, this));
                     this.api.asc_registerCallback('asc_onHideContentControlsActions',_.bind(this.onHideContentControlsActions, this));
                 }
-
+                Common.NotificationCenter.on('protect:doclock', _.bind(this.onChangeProtectDocument, this));
                 this.documentHolder.setApi(this.api);
             }
 
@@ -585,7 +585,9 @@ define([
         showObjectMenu: function(event, docElement, eOpts){
             var me = this;
             if (me.api){
-                var obj = (me.mode.isEdit && !me._isDisabled) ? me.fillMenuProps(me.api.getSelectedElements()) : me.fillViewMenuProps(me.api.getSelectedElements());
+                var lockMode = this.documentHolder.docProtection ? this.documentHolder.docProtection.lockMode : undefined;
+                var obj = (me.mode.isEdit && !(me._isDisabled || lockMode===Asc.c_oAscProtection.View || lockMode===Asc.c_oAscProtection.Comments || lockMode===Asc.c_oAscProtection.Forms)) ?
+                            me.fillMenuProps(me.api.getSelectedElements()) : me.fillViewMenuProps(me.api.getSelectedElements());
                 if (obj) me.showPopupMenu(obj.menu_to_show, obj.menu_props, event, docElement, eOpts);
             }
         },
@@ -612,7 +614,9 @@ define([
             var me = this,
                 currentMenu = me.documentHolder.currentMenu;
             if (currentMenu && currentMenu.isVisible() && currentMenu !== me.documentHolder.hdrMenu){
-                var obj = (me.mode.isEdit && !me._isDisabled) ? me.fillMenuProps(selectedElements) : me.fillViewMenuProps(selectedElements);
+                var lockMode = me.documentHolder.docProtection ? me.documentHolder.docProtection.lockMode : undefined;
+                var obj = (me.mode.isEdit && !(me._isDisabled || lockMode===Asc.c_oAscProtection.View || lockMode===Asc.c_oAscProtection.Comments || lockMode===Asc.c_oAscProtection.Forms)) ?
+                            me.fillMenuProps(selectedElements) : me.fillViewMenuProps(selectedElements);
                 if (obj) {
                     if (obj.menu_to_show===currentMenu) {
                         currentMenu.options.initMenu(obj.menu_props);
@@ -1180,7 +1184,8 @@ define([
         },
 
         onDoubleClickOnChart: function(chart) {
-            if (this.mode.isEdit && !this._isDisabled) {
+            var lockMode = this.documentHolder.docProtection ? this.documentHolder.docProtection.lockMode : undefined;
+            if (this.mode.isEdit && !(this._isDisabled || lockMode===Asc.c_oAscProtection.View || lockMode===Asc.c_oAscProtection.Comments || lockMode===Asc.c_oAscProtection.Forms)) {
                 var diagramEditor = this.getApplication().getController('Common.Controllers.ExternalDiagramEditor').getView('Common.Views.ExternalDiagramEditor');
                 if (diagramEditor && chart) {
                     diagramEditor.setEditMode(true);
@@ -1191,7 +1196,8 @@ define([
         },
 
         onDoubleClickOnTableOleObject: function(chart) {
-            if (this.mode.isEdit && !this._isDisabled) {
+            var lockMode = this.documentHolder.docProtection ? this.documentHolder.docProtection.lockMode : undefined;
+            if (this.mode.isEdit && !(this._isDisabled || lockMode===Asc.c_oAscProtection.View || lockMode===Asc.c_oAscProtection.Comments || lockMode===Asc.c_oAscProtection.Forms)) {
                 var oleEditor = this.getApplication().getController('Common.Controllers.ExternalOleEditor').getView('Common.Views.ExternalOleEditor');
                 if (oleEditor && chart) {
                     oleEditor.setEditMode(true);
@@ -1895,7 +1901,8 @@ define([
                     this.api.asc_ViewCertificate(datavalue); //certificate id
                     break;
                 case 2:
-                    Common.NotificationCenter.trigger('protect:signature', 'visible', this._isDisabled, datavalue);//guid, can edit settings for requested signature
+                    var lockMode = this.documentHolder.docProtection ? this.documentHolder.docProtection.lockMode : undefined;
+                    Common.NotificationCenter.trigger('protect:signature', 'visible', this._isDisabled || lockMode===Asc.c_oAscProtection.View || lockMode===Asc.c_oAscProtection.Comments || lockMode===Asc.c_oAscProtection.Forms, datavalue);//guid, can edit settings for requested signature
                     break;
                 case 3:
                     var me = this;
@@ -2310,6 +2317,16 @@ define([
 
         editComplete: function() {
             this.documentHolder && this.documentHolder.fireEvent('editcomplete', this.documentHolder);
+        },
+
+        onChangeProtectDocument: function(props) {
+            if (!props) {
+                var docprotect = this.getApplication().getController('DocProtection');
+                props = docprotect ? docprotect.getDocProps() : null;
+            }
+            if (props) {
+                this.documentHolder && (this.documentHolder.docProtection = props);
+            }
         }
     });
 });
\ No newline at end of file
diff --git a/apps/documenteditor/main/app/controller/FormsTab.js b/apps/documenteditor/main/app/controller/FormsTab.js
index 456c25627..a9ee02625 100644
--- a/apps/documenteditor/main/app/controller/FormsTab.js
+++ b/apps/documenteditor/main/app/controller/FormsTab.js
@@ -76,6 +76,7 @@ define([
                 // this.api.asc_registerCallback('asc_onShowContentControlsActions',_.bind(this.onShowContentControlsActions, this));
                 // this.api.asc_registerCallback('asc_onHideContentControlsActions',_.bind(this.onHideContentControlsActions, this));
             }
+            Common.NotificationCenter.on('protect:doclock', _.bind(this.onChangeProtectDocument, this));
             return this;
         },
 
@@ -430,6 +431,21 @@ define([
             if (tab !== 'forms') {
                 this.tipSaveForm && this.tipSaveForm.close();
             }
+        },
+
+        onChangeProtectDocument: function(props) {
+            if (!props) {
+                var docprotect = this.getApplication().getController('DocProtection');
+                props = docprotect ? docprotect.getDocProps() : null;
+            }
+            if (props) {
+                this._state.docProtection = props;
+                var arr = this.view.getButtons();
+                Common.Utils.lockControls(Common.enumLock.docLockView, props.docLock && (props.lockMode===Asc.c_oAscProtection.View)),   {array: arr};
+                Common.Utils.lockControls(Common.enumLock.docLockForms, props.docLock && (props.lockMode===Asc.c_oAscProtection.Forms),   {array: arr});
+                Common.Utils.lockControls(Common.enumLock.docLockReview, props.docLock && (props.lockMode===Asc.c_oAscProtection.Review),   {array: arr});
+                Common.Utils.lockControls(Common.enumLock.docLockComments, props.docLock && (props.lockMode===Asc.c_oAscProtection.Comments),   {array: arr});
+            }
         }
 
     }, DE.Controllers.FormsTab || {}));
diff --git a/apps/documenteditor/main/app/controller/Links.js b/apps/documenteditor/main/app/controller/Links.js
index cd3577712..c3db0cc6f 100644
--- a/apps/documenteditor/main/app/controller/Links.js
+++ b/apps/documenteditor/main/app/controller/Links.js
@@ -108,6 +108,7 @@ define([
                 this.api.asc_registerCallback('asc_onAscReplaceCurrentTOF',_.bind(this.onAscReplaceCurrentTOF, this));
                 this.api.asc_registerCallback('asc_onAscTOFUpdate',_.bind(this.onAscTOFUpdate, this));
             }
+            Common.NotificationCenter.on('protect:doclock', _.bind(this.onChangeProtectDocument, this));
             return this;
         },
 
@@ -570,6 +571,20 @@ define([
                     Common.NotificationCenter.trigger('edit:complete', me.toolbar);
                 }
             })).show();
+        },
+
+        onChangeProtectDocument: function(props) {
+            if (!props) {
+                var docprotect = this.getApplication().getController('DocProtection');
+                props = docprotect ? docprotect.getDocProps() : null;
+            }
+            if (props) {
+                this._state.docProtection = props;
+                this.lockToolbar(Common.enumLock.docLockView, props.docLock && (props.lockMode===Asc.c_oAscProtection.View));
+                this.lockToolbar(Common.enumLock.docLockForms, props.docLock && (props.lockMode===Asc.c_oAscProtection.Forms));
+                this.lockToolbar(Common.enumLock.docLockReview, props.docLock && (props.lockMode===Asc.c_oAscProtection.Review));
+                this.lockToolbar(Common.enumLock.docLockComments, props.docLock && (props.lockMode===Asc.c_oAscProtection.Comments));
+            }
         }
 
     }, DE.Controllers.Links || {}));
diff --git a/apps/documenteditor/main/app/controller/PageLayout.js b/apps/documenteditor/main/app/controller/PageLayout.js
index efac3b1f7..2703215e2 100644
--- a/apps/documenteditor/main/app/controller/PageLayout.js
+++ b/apps/documenteditor/main/app/controller/PageLayout.js
@@ -57,7 +57,7 @@ define([
             onLaunch: function (view) {
                 this.toolbar = view;
                 this.editMode = true;
-
+                this._state = {};
                 return this;
             },
 
@@ -98,7 +98,7 @@ define([
                 this.api.asc_registerCallback('asc_onImgWrapStyleChanged', this.onApiWrappingStyleChanged.bind(this));
                 this.api.asc_registerCallback('asc_onCoAuthoringDisconnect', this.onApiCoAuthoringDisconnect.bind(this));
                 this.api.asc_registerCallback('asc_onFocusObject', this.onApiFocusObject.bind(this));
-
+                Common.NotificationCenter.on('protect:doclock', _.bind(this.onChangeProtectDocument, this));
                 return this;
             },
 
@@ -255,6 +255,20 @@ define([
 
                 this.api.ImgApply(props);
                 this.toolbar.fireEvent('editcomplete', this.toolbar);
+            },
+
+            onChangeProtectDocument: function(props) {
+                if (!props) {
+                    var docprotect = this.getApplication().getController('DocProtection');
+                    props = docprotect ? docprotect.getDocProps() : null;
+                }
+                if (props) {
+                    this._state.docProtection = props;
+                    this.toolbar.lockToolbar(Common.enumLock.docLockView, props.docLock && (props.lockMode===Asc.c_oAscProtection.View));
+                    this.toolbar.lockToolbar(Common.enumLock.docLockForms, props.docLock && (props.lockMode===Asc.c_oAscProtection.Forms));
+                    this.toolbar.lockToolbar(Common.enumLock.docLockReview, props.docLock && (props.lockMode===Asc.c_oAscProtection.Review));
+                    this.toolbar.lockToolbar(Common.enumLock.docLockComments, props.docLock && (props.lockMode===Asc.c_oAscProtection.Comments));
+                }
             }
         }
     })());
diff --git a/apps/documenteditor/main/app/controller/RightMenu.js b/apps/documenteditor/main/app/controller/RightMenu.js
index c4cea9f25..e05283bc6 100644
--- a/apps/documenteditor/main/app/controller/RightMenu.js
+++ b/apps/documenteditor/main/app/controller/RightMenu.js
@@ -54,7 +54,7 @@ define([
         initialize: function() {
             this.editMode = true;
             this._initSettings = true;
-
+            this._state = {};
             this.addListeners({
                 'RightMenu': {
                     'rightmenuclick': this.onRightMenuClick
@@ -89,6 +89,7 @@ define([
         setApi: function(api) {
             this.api = api;
             this.api.asc_registerCallback('asc_onUpdateSignatures', _.bind(this.onApiUpdateSignatures, this));
+            Common.NotificationCenter.on('protect:doclock', _.bind(this.onChangeProtectDocument, this));
             this.api.asc_registerCallback('asc_onCoAuthoringDisconnect',_.bind(this.onCoAuthoringDisconnect, this));
             Common.NotificationCenter.on('api:disconnect',              _.bind(this.onCoAuthoringDisconnect, this));
         },
@@ -156,7 +157,10 @@ define([
             this._settings[Common.Utils.documentSettingsType.Signature].locked = false;
 
             var isChart = false,
-                isSmartArtInternal = false;
+                isSmartArtInternal = false,
+                lockMode = this._state.docProtection ? this._state.docProtection.lockMode : undefined;
+            lockMode = (lockMode===Asc.c_oAscProtection.View || lockMode===Asc.c_oAscProtection.Forms || lockMode===Asc.c_oAscProtection.Comments);
+
             var control_props = this.api.asc_IsContentControl() ? this.api.asc_GetContentControlProperties() : null,
                 control_lock = false;
             for (i=0; i<SelectedObjects.length; i++)
@@ -185,7 +189,7 @@ define([
                         if (value.get_ShapeProperties().asc_getTextArtProperties()) {
                             this._settings[Common.Utils.documentSettingsType.TextArt].props = value;
                             this._settings[Common.Utils.documentSettingsType.TextArt].hidden = 0;
-                            this._settings[Common.Utils.documentSettingsType.TextArt].locked = value.get_Locked() || content_locked;
+                            this._settings[Common.Utils.documentSettingsType.TextArt].locked = value.get_Locked() || content_locked || lockMode;
                         }
                     }
                     control_lock = control_lock || value.get_Locked();
@@ -197,11 +201,11 @@ define([
                 }
                 this._settings[settingsType].props = value;
                 this._settings[settingsType].hidden = 0;
-                this._settings[settingsType].locked = value.get_Locked() || content_locked;
+                this._settings[settingsType].locked = value.get_Locked() || content_locked || lockMode;
                 if (!this._settings[Common.Utils.documentSettingsType.MailMerge].locked) // lock MailMerge-InsertField, если хотя бы один объект locked
-                    this._settings[Common.Utils.documentSettingsType.MailMerge].locked = value.get_Locked();
+                    this._settings[Common.Utils.documentSettingsType.MailMerge].locked = value.get_Locked() || lockMode;
                 if (!this._settings[Common.Utils.documentSettingsType.Signature].locked) // lock Signature, если хотя бы один объект locked
-                    this._settings[Common.Utils.documentSettingsType.Signature].locked = value.get_Locked();
+                    this._settings[Common.Utils.documentSettingsType.Signature].locked = value.get_Locked() || lockMode;
             }
 
             if (control_props && control_props.get_FormPr() && this.rightmenu.formSettings) {
@@ -210,7 +214,7 @@ define([
                     spectype==Asc.c_oAscContentControlSpecificType.ComboBox || spectype==Asc.c_oAscContentControlSpecificType.DropDownList || spectype==Asc.c_oAscContentControlSpecificType.None) {
                     settingsType = Common.Utils.documentSettingsType.Form;
                     this._settings[settingsType].props = control_props;
-                    this._settings[settingsType].locked = control_lock;
+                    this._settings[settingsType].locked = control_lock || lockMode;
                     this._settings[settingsType].hidden = 0;
                     if (control_props.get_FormPr().get_Fixed())
                         this._settings[Common.Utils.documentSettingsType.TextArt].hidden = 1;
@@ -466,6 +470,19 @@ define([
                 case Asc.c_oAscTypeSelectElement.Header:
                     return Common.Utils.documentSettingsType.Header;
             }
+        },
+
+        onChangeProtectDocument: function(props) {
+            if (!props) {
+                var docprotect = this.getApplication().getController('DocProtection');
+                props = docprotect ? docprotect.getDocProps() : null;
+            }
+            if (props) {
+                this._state.docProtection = props;
+            }
+            var selectedElements = this.api.getSelectedElements();
+            if (selectedElements.length > 0)
+                this.onFocusObject(selectedElements);
         }
     });
 });
\ No newline at end of file
diff --git a/apps/documenteditor/main/app/controller/Statusbar.js b/apps/documenteditor/main/app/controller/Statusbar.js
index d751f39db..b2af4e032 100644
--- a/apps/documenteditor/main/app/controller/Statusbar.js
+++ b/apps/documenteditor/main/app/controller/Statusbar.js
@@ -122,7 +122,7 @@ define([
                     me.statusbar.$el.find('.hide-select-tools').removeClass('hide-select-tools');
                 }
             });
-
+            Common.NotificationCenter.on('protect:doclock', _.bind(this.onChangeProtectDocument, this));
             Common.NotificationCenter.on('app:ready', me.onAppReady.bind(me));
         },
 
@@ -358,6 +358,14 @@ define([
             }
         },
 
+        onChangeProtectDocument: function(props) {
+            if (!props) {
+                var docprotect = this.getApplication().getController('DocProtection');
+                props = docprotect ? docprotect.getDocProps() : null;
+            }
+            props && this.statusbar.onChangeProtectDocument(props);
+        },
+
         zoomText        : 'Zoom {0}%',
         textHasChanges  : 'New changes have been tracked',
         textTrackChanges: 'The document is opened with the Track Changes mode enabled',
diff --git a/apps/documenteditor/main/app/controller/Toolbar.js b/apps/documenteditor/main/app/controller/Toolbar.js
index 94aaaf698..5c413ae5f 100644
--- a/apps/documenteditor/main/app/controller/Toolbar.js
+++ b/apps/documenteditor/main/app/controller/Toolbar.js
@@ -430,6 +430,7 @@ define([
                 this.api.asc_registerCallback('asc_onCoAuthoringDisconnect', _.bind(this.onApiCoAuthoringDisconnect, this));
                 Common.NotificationCenter.on('api:disconnect', _.bind(this.onApiCoAuthoringDisconnect, this));
             }
+            Common.NotificationCenter.on('protect:doclock', _.bind(this.onChangeProtectDocument, this));
         },
 
         onChangeCompactView: function(view, compact) {
@@ -3263,7 +3264,7 @@ define([
                 this.btnsComment = Common.Utils.injectButtons(this.toolbar.$el.find('.slot-comment'), 'tlbtn-addcomment-', 'toolbar__icon btn-menu-comments', this.toolbar.capBtnComment,
                             [  Common.enumLock.paragraphLock, Common.enumLock.headerLock, Common.enumLock.richEditLock, Common.enumLock.plainEditLock, Common.enumLock.richDelLock, Common.enumLock.plainDelLock,
                                     Common.enumLock.cantAddQuotedComment, Common.enumLock.imageLock, Common.enumLock.inSpecificForm, Common.enumLock.inImage, Common.enumLock.lostConnect, Common.enumLock.disableOnStart,
-                                    Common.enumLock.previewReviewMode, Common.enumLock.viewFormMode ],
+                                    Common.enumLock.previewReviewMode, Common.enumLock.viewFormMode, Common.enumLock.docLockView ],
                                  undefined, undefined, undefined, '1', 'bottom');
                 if ( this.btnsComment.length ) {
                     var _comments = DE.getController('Common.Controllers.Comments').getView();
@@ -3331,6 +3332,20 @@ define([
             })).show();
         },
 
+        onChangeProtectDocument: function(props) {
+            if (!props) {
+                var docprotect = this.getApplication().getController('DocProtection');
+                props = docprotect ? docprotect.getDocProps() : null;
+            }
+            if (props) {
+                this._state.docProtection = props;
+                this.toolbar.lockToolbar(Common.enumLock.docLockView, props.docLock && (props.lockMode===Asc.c_oAscProtection.View));
+                this.toolbar.lockToolbar(Common.enumLock.docLockForms, props.docLock && (props.lockMode===Asc.c_oAscProtection.Forms));
+                this.toolbar.lockToolbar(Common.enumLock.docLockReview, props.docLock && (props.lockMode===Asc.c_oAscProtection.Review));
+                this.toolbar.lockToolbar(Common.enumLock.docLockComments, props.docLock && (props.lockMode===Asc.c_oAscProtection.Comments));
+            }
+        },
+
         textEmptyImgUrl                            : 'You need to specify image URL.',
         textWarning                                : 'Warning',
         textFontSizeErr                            : 'The entered value is incorrect.<br>Please enter a numeric value between 1 and 300',
diff --git a/apps/documenteditor/main/app/view/DocProtection.js b/apps/documenteditor/main/app/view/DocProtection.js
index 3f4916175..eb4945b63 100644
--- a/apps/documenteditor/main/app/view/DocProtection.js
+++ b/apps/documenteditor/main/app/view/DocProtection.js
@@ -79,7 +79,7 @@ define([
                     iconCls: 'toolbar__icon protect-workbook',
                     enableToggle: true,
                     caption: this.txtProtectDoc,
-                    lock        : [_set.lostConnect, _set.coAuth],
+                    lock        : [_set.lostConnect, _set.coAuth, _set.previewReviewMode, _set.viewFormMode],
                     dataHint    : '1',
                     dataHintDirection: 'bottom',
                     dataHintOffset: 'small'
diff --git a/apps/documenteditor/main/app/view/DocumentHolder.js b/apps/documenteditor/main/app/view/DocumentHolder.js
index 3b9f238c5..a14786b13 100644
--- a/apps/documenteditor/main/app/view/DocumentHolder.js
+++ b/apps/documenteditor/main/app/view/DocumentHolder.js
@@ -152,6 +152,7 @@ define([
                         signGuid = (value.imgProps && value.imgProps.value && me.mode.isSignatureSupport) ? value.imgProps.value.asc_getSignatureId() : undefined,
                         signProps = (signGuid) ? me.api.asc_getSignatureSetup(signGuid) : null,
                         isInSign = !!signProps && me._canProtect,
+                        lockMode = me.docProtection ? me.docProtection.lockMode : undefined,
                         control_lock = (value.paraProps) ? (!value.paraProps.value.can_DeleteBlockContentControl() || !value.paraProps.value.can_EditBlockContentControl() ||
                                                             !value.paraProps.value.can_DeleteInlineContentControl() || !value.paraProps.value.can_EditInlineContentControl()) : false,
                         canComment = !isInChart && me.api.can_AddQuotedComment() !== false && me.mode.canCoAuthoring && me.mode.canComments && !me._isDisabled && !control_lock,
@@ -169,7 +170,7 @@ define([
                     }
 
                     me.menuViewUndo.setVisible(me.mode.canCoAuthoring && me.mode.canComments && !me._isDisabled);
-                    me.menuViewUndo.setDisabled(!me.api.asc_getCanUndo());
+                    me.menuViewUndo.setDisabled(!me.api.asc_getCanUndo() || lockMode===Asc.c_oAscProtection.View || lockMode===Asc.c_oAscProtection.Forms);
                     me.menuViewCopySeparator.setVisible(isInSign);
 
                     var isRequested = (signProps) ? signProps.asc_getRequested() : false;
@@ -187,15 +188,15 @@ define([
                     }
 
                     me.menuViewAddComment.setVisible(canComment);
-                    me.menuViewAddComment.setDisabled(value.paraProps && value.paraProps.locked === true);
+                    me.menuViewAddComment.setDisabled(value.paraProps && value.paraProps.locked === true || lockMode===Asc.c_oAscProtection.View || lockMode===Asc.c_oAscProtection.Forms);
 
                     var disabled = value.paraProps && value.paraProps.locked === true;
                     var cancopy = me.api && me.api.can_CopyCut();
                     me.menuViewCopy.setDisabled(!cancopy);
                     me.menuViewCut.setVisible(me._fillFormMode && canEditControl);
-                    me.menuViewCut.setDisabled(disabled || !cancopy);
+                    me.menuViewCut.setDisabled(disabled || !cancopy || lockMode===Asc.c_oAscProtection.View || lockMode===Asc.c_oAscProtection.Comments);
                     me.menuViewPaste.setVisible(me._fillFormMode && canEditControl);
-                    me.menuViewPaste.setDisabled(disabled);
+                    me.menuViewPaste.setDisabled(disabled || lockMode===Asc.c_oAscProtection.View || lockMode===Asc.c_oAscProtection.Comments);
                     me.menuViewPrint.setVisible(me.mode.canPrint && !me._fillFormMode);
                     me.menuViewPrint.setDisabled(!cancopy);
 
diff --git a/apps/documenteditor/main/app/view/FormsTab.js b/apps/documenteditor/main/app/view/FormsTab.js
index 10524186c..e1a9a91e4 100644
--- a/apps/documenteditor/main/app/view/FormsTab.js
+++ b/apps/documenteditor/main/app/view/FormsTab.js
@@ -169,7 +169,7 @@ define([
                     this.btnTextField = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-text-field',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.contentLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.contentLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         caption: this.capBtnText,
                         dataHint: '1',
                         dataHintDirection: 'bottom',
@@ -180,7 +180,7 @@ define([
                     this.btnComboBox = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-combo-box',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.contentLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.contentLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         caption: this.capBtnComboBox,
                         dataHint: '1',
                         dataHintDirection: 'bottom',
@@ -191,7 +191,7 @@ define([
                     this.btnDropDown = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-dropdown',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.contentLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.contentLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         caption: this.capBtnDropDown,
                         dataHint: '1',
                         dataHintDirection: 'bottom',
@@ -202,7 +202,7 @@ define([
                     this.btnCheckBox = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-checkbox',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.contentLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.contentLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         caption: this.capBtnCheckBox,
                         dataHint: '1',
                         dataHintDirection: 'bottom',
@@ -213,7 +213,7 @@ define([
                     this.btnRadioBox = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-radio-button',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.contentLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.contentLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         caption: this.capBtnRadioBox,
                         dataHint: '1',
                         dataHintDirection: 'bottom',
@@ -224,7 +224,7 @@ define([
                     this.btnImageField = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-insertimage',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.contentLock, _set.complexForm, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.contentLock, _set.complexForm, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         caption: this.capBtnImage,
                         dataHint: '1',
                         dataHintDirection: 'bottom',
@@ -235,7 +235,7 @@ define([
                     this.btnEmailField = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-email',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.contentLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.contentLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         caption: this.capBtnEmail,
                         dataHint: '1',
                         dataHintDirection: 'bottom',
@@ -246,7 +246,7 @@ define([
                     this.btnPhoneField = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-phone',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.contentLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.contentLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         caption: this.capBtnPhone,
                         dataHint: '1',
                         dataHintDirection: 'bottom',
@@ -257,7 +257,7 @@ define([
                     this.btnComplexField = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon complex-field',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.contentLock, _set.complexForm, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.contentLock, _set.complexForm, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         caption: this.capBtnComplex,
                         dataHint: '1',
                         dataHintDirection: 'bottom',
@@ -268,7 +268,7 @@ define([
                     this.btnViewForm = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-sheet-view',
-                        lock: [ _set.previewReviewMode, _set.lostConnect, _set.disableOnStart],
+                        lock: [ _set.previewReviewMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         caption: this.capBtnView,
                         enableToggle: true,
                         dataHint: '1',
@@ -280,7 +280,7 @@ define([
                     this.btnClearFields = new Common.UI.Button({
                         cls         : 'btn-toolbar',
                         iconCls     : 'toolbar__icon btn-clearstyle',
-                        lock: [ _set.previewReviewMode, _set.lostConnect, _set.disableOnStart],
+                        lock: [ _set.previewReviewMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         caption     : this.textClearFields,
                         dataHint    : '1',
                         dataHintDirection: 'left',
@@ -291,7 +291,7 @@ define([
                     this.btnHighlight = new Common.UI.ButtonColored({
                         cls         : 'btn-toolbar',
                         iconCls     : 'toolbar__icon btn-highlight',
-                        lock: [ _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                        lock: [ _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         caption     : this.textHighlight,
                         menu        : true,
                         additionalItems: [ this.mnuNoFormsColor = new Common.UI.MenuItem({
@@ -316,7 +316,7 @@ define([
                 this.btnPrevForm = new Common.UI.Button({
                     cls: 'btn-toolbar x-huge icon-top',
                     iconCls: 'toolbar__icon previous-field',
-                    lock: [ _set.previewReviewMode, _set.lostConnect, _set.disableOnStart],
+                    lock: [ _set.previewReviewMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                     caption: this.capBtnPrev,
                     // disabled: this.appConfig.isEdit && this.appConfig.canFeatureContentControl && this.appConfig.canFeatureForms, // disable only for edit mode
                     dataHint: '1',
@@ -328,7 +328,7 @@ define([
                 this.btnNextForm = new Common.UI.Button({
                     cls: 'btn-toolbar x-huge icon-top',
                     iconCls: 'toolbar__icon next-field',
-                    lock: [ _set.previewReviewMode, _set.lostConnect, _set.disableOnStart],
+                    lock: [ _set.previewReviewMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                     caption: this.capBtnNext,
                     // disabled: this.appConfig.isEdit && this.appConfig.canFeatureContentControl && this.appConfig.canFeatureForms, // disable only for edit mode,
                     dataHint: '1',
diff --git a/apps/documenteditor/main/app/view/Links.js b/apps/documenteditor/main/app/view/Links.js
index 8ea79d0eb..8fce3db9d 100644
--- a/apps/documenteditor/main/app/view/Links.js
+++ b/apps/documenteditor/main/app/view/Links.js
@@ -169,13 +169,13 @@ define([
                     $host = me.toolbar.$el;
 
                 this.btnsContents = Common.Utils.injectButtons($host.find('.btn-slot.btn-contents'), '', 'toolbar__icon btn-contents', me.capBtnInsContents,
-                    [_set.inHeader, _set.richEditLock, _set.plainEditLock, _set.richDelLock, _set.plainDelLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                    [_set.inHeader, _set.richEditLock, _set.plainEditLock, _set.richDelLock, _set.plainDelLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                     true, true, undefined, '1', 'bottom', 'small');
                 this.btnsNotes = Common.Utils.injectButtons($host.find('.btn-slot.slot-notes'), '', 'toolbar__icon btn-notes', me.capBtnInsFootnote,
-                    [_set.paragraphLock, _set.inEquation, _set.inImage, _set.inHeader, _set.controlPlain, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                    [_set.paragraphLock, _set.inEquation, _set.inImage, _set.inHeader, _set.controlPlain, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                     true, true, undefined, '1', 'bottom', 'small');
                 this.btnsHyperlink = Common.Utils.injectButtons($host.find('.btn-slot.slot-inshyperlink'), '', 'toolbar__icon btn-inserthyperlink', me.capBtnInsLink,
-                    [_set.paragraphLock, _set.headerLock, _set.hyperlinkLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                    [_set.paragraphLock, _set.headerLock, _set.hyperlinkLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                     undefined, undefined, undefined, '1', 'bottom', 'small');
                 Array.prototype.push.apply(this.paragraphControls, this.btnsContents.concat(this.btnsNotes, this.btnsHyperlink));
 
@@ -183,7 +183,7 @@ define([
                     parentEl: $host.find('#slot-btn-contents-update'),
                     cls: 'btn-toolbar',
                     iconCls: 'toolbar__icon btn-update',
-                    lock: [ _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                    lock: [ _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                     caption: this.capBtnContentsUpdate,
                     split: true,
                     menu: true,
@@ -197,7 +197,7 @@ define([
                     parentEl: $host.find('#slot-btn-add-text'),
                     cls: 'btn-toolbar',
                     iconCls: 'toolbar__icon add-text',
-                    lock: [ _set.cantAddTextTOF, _set.inHeader, _set.inFootnote, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                    lock: [ _set.cantAddTextTOF, _set.inHeader, _set.inFootnote, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                     caption: this.capBtnAddText,
                     menu: new Common.UI.Menu({
                         items: []
@@ -212,7 +212,7 @@ define([
                     parentEl: $host.find('#slot-btn-bookmarks'),
                     cls: 'btn-toolbar x-huge icon-top',
                     iconCls: 'toolbar__icon btn-bookmarks',
-                    lock: [_set.paragraphLock, _set.inHeader, _set.headerLock, _set.controlPlain, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                    lock: [_set.paragraphLock, _set.inHeader, _set.headerLock, _set.controlPlain, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                     caption: this.capBtnBookmarks,
                     dataHint: '1',
                     dataHintDirection: 'bottom',
@@ -224,7 +224,7 @@ define([
                     parentEl: $host.find('#slot-btn-caption'),
                     cls: 'btn-toolbar x-huge icon-top',
                     iconCls: 'toolbar__icon btn-caption',
-                    lock: [_set.inHeader, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                    lock: [_set.inHeader, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                     caption: this.capBtnCaption,
                     dataHint: '1',
                     dataHintDirection: 'bottom',
@@ -236,7 +236,7 @@ define([
                     parentEl: $host.find('#slot-btn-crossref'),
                     cls: 'btn-toolbar x-huge icon-top',
                     iconCls: 'toolbar__icon btn-cross-reference',
-                    lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.richEditLock, _set.plainEditLock, _set.contentLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                    lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.richEditLock, _set.plainEditLock, _set.contentLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                     caption: this.capBtnCrossRef,
                     dataHint: '1',
                     dataHintDirection: 'bottom',
@@ -248,7 +248,7 @@ define([
                     parentEl: $host.find('#slot-btn-tof'),
                     cls: 'btn-toolbar',
                     iconCls: 'toolbar__icon btn-contents',
-                    lock: [_set.inHeader, _set.richEditLock, _set.plainEditLock, _set.richDelLock, _set.plainDelLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                    lock: [_set.inHeader, _set.richEditLock, _set.plainEditLock, _set.richDelLock, _set.plainDelLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                     caption: this.capBtnTOF,
                     dataHint: '1',
                     dataHintDirection: 'left',
@@ -260,7 +260,7 @@ define([
                     parentEl: $host.find('#slot-btn-tof-update'),
                     cls: 'btn-toolbar',
                     iconCls: 'toolbar__icon btn-update',
-                    lock: [_set.paragraphLock, _set.inHeader, _set.richEditLock, _set.plainEditLock, _set.richDelLock, _set.plainDelLock, _set.cantUpdateTOF, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                    lock: [_set.paragraphLock, _set.inHeader, _set.richEditLock, _set.plainEditLock, _set.richDelLock, _set.plainDelLock, _set.cantUpdateTOF, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                     caption: this.capBtnContentsUpdate,
                     dataHint: '1',
                     dataHintDirection: 'left',
diff --git a/apps/documenteditor/main/app/view/ProtectDialog.js b/apps/documenteditor/main/app/view/ProtectDialog.js
index bebe37ef4..f5f33a74a 100644
--- a/apps/documenteditor/main/app/view/ProtectDialog.js
+++ b/apps/documenteditor/main/app/view/ProtectDialog.js
@@ -43,12 +43,6 @@ define([
 ], function () {
     'use strict';
 
-    Asc.c_oAscProtection = {
-        View: 1,
-        Forms: 2,
-        Review: 3,
-        Comments: 4
-    };
     DE.Views.ProtectDialog = Common.UI.Window.extend(_.extend({
 
         initialize : function (options) {
diff --git a/apps/documenteditor/main/app/view/Statusbar.js b/apps/documenteditor/main/app/view/Statusbar.js
index 95b0d8d17..1ec4040d0 100644
--- a/apps/documenteditor/main/app/view/Statusbar.js
+++ b/apps/documenteditor/main/app/view/Statusbar.js
@@ -176,7 +176,8 @@ define([
                 _.extend(this, options);
                 this.pages = new DE.Models.Pages({current:1, count:1});
                 this.pages.on('change', _.bind(_updatePagesCaption,this));
-                this.state = {};
+                this._state = {};
+                this._isDisabled = false;
 
                 var me = this;
                 this.$layout = $(this.template({
@@ -399,8 +400,18 @@ define([
             },
 
             SetDisabled: function(disable) {
-                this.btnLanguage.setDisabled(disable || this.langMenu.items.length<1);
-                this.btnTurnReview && this.btnTurnReview.setDisabled(disable);
+                this._isDisabled = disable;
+                var lockMode = this._state.docProtection ? this._state.docProtection.lockMode : undefined;
+                lockMode = (lockMode===Asc.c_oAscProtection.View || lockMode===Asc.c_oAscProtection.Forms || lockMode===Asc.c_oAscProtection.Comments);
+                this.btnLanguage.setDisabled(disable || this.langMenu.items.length<1 || lockMode);
+                this.btnTurnReview && this.btnTurnReview.setDisabled(disable || lockMode);
+            },
+
+            onChangeProtectDocument: function(props) {
+                if (props) {
+                    this._state.docProtection = props;
+                    this.SetDisabled(this._isDisabled);
+                }
             },
 
             onApiCoAuthoringDisconnect: function() {
diff --git a/apps/documenteditor/main/app/view/Toolbar.js b/apps/documenteditor/main/app/view/Toolbar.js
index a0efea64b..d7f0032d5 100644
--- a/apps/documenteditor/main/app/view/Toolbar.js
+++ b/apps/documenteditor/main/app/view/Toolbar.js
@@ -201,7 +201,7 @@ define([
                         id: 'id-toolbar-btn-save',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon no-mask ' + this.btnSaveCls,
-                        lock: [_set.lostConnect, _set.disableOnStart],
+                        lock: [_set.lostConnect, _set.disableOnStart, _set.docLockView],
                         signals: ['disabled'],
                         dataHint: '1',
                         dataHintDirection: 'top',
@@ -214,7 +214,7 @@ define([
                         id: 'id-toolbar-btn-undo',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-undo',
-                        lock: [_set.undoLock, _set.previewReviewMode, _set.lostConnect, _set.disableOnStart],
+                        lock: [_set.undoLock, _set.previewReviewMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         signals: ['disabled'],
                         dataHint: '1',
                         dataHintDirection: 'bottom',
@@ -226,7 +226,7 @@ define([
                         id: 'id-toolbar-btn-redo',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-redo',
-                        lock: [_set.redoLock, _set.previewReviewMode, _set.lostConnect, _set.disableOnStart],
+                        lock: [_set.redoLock, _set.previewReviewMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         signals: ['disabled'],
                         dataHint: '1',
                         dataHintDirection: 'bottom',
@@ -238,7 +238,7 @@ define([
                         id: 'id-toolbar-btn-copy',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-copy',
-                        lock: [_set.copyLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                        lock: [_set.copyLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         dataHint: '1',
                         dataHintDirection: 'top',
                         dataHintTitle: 'C'
@@ -249,7 +249,7 @@ define([
                         id: 'id-toolbar-btn-paste',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-paste',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         dataHint: '1',
                         dataHintDirection: 'top',
                         dataHintTitle: 'V'
@@ -260,7 +260,7 @@ define([
                         id: 'id-toolbar-btn-cut',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-cut',
-                        lock: [_set.copyLock, _set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.imageLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                        lock: [_set.copyLock, _set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.imageLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         dataHint: '1',
                         dataHintDirection: 'top',
                         dataHintTitle: 'X'
@@ -281,7 +281,7 @@ define([
                         id: 'id-toolbar-btn-incfont',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-incfont',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         dataHint: '1',
                         dataHintDirection: 'top'
                     });
@@ -291,7 +291,7 @@ define([
                         id: 'id-toolbar-btn-decfont',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-decfont',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         dataHint: '1',
                         dataHintDirection: 'top'
                     });
@@ -301,7 +301,7 @@ define([
                         id: 'id-toolbar-btn-bold',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-bold',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         enableToggle: true,
                         dataHint: '1',
                         dataHintDirection: 'bottom'
@@ -312,7 +312,7 @@ define([
                         id: 'id-toolbar-btn-italic',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-italic',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         enableToggle: true,
                         dataHint: '1',
                         dataHintDirection: 'bottom'
@@ -323,7 +323,7 @@ define([
                         id: 'id-toolbar-btn-underline',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-underline',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         enableToggle: true,
                         dataHint: '1',
                         dataHintDirection: 'bottom'
@@ -334,7 +334,7 @@ define([
                         id: 'id-toolbar-btn-strikeout',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-strikeout',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         enableToggle: true,
                         dataHint: '1',
                         dataHintDirection: 'bottom'
@@ -345,7 +345,7 @@ define([
                         id: 'id-toolbar-btn-superscript',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-superscript',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inEquation, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inEquation, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         enableToggle: true,
                         toggleGroup: 'superscriptGroup',
                         dataHint: '1',
@@ -357,7 +357,7 @@ define([
                         id: 'id-toolbar-btn-subscript',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-subscript',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inEquation, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inEquation, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         enableToggle: true,
                         toggleGroup: 'superscriptGroup',
                         dataHint: '1',
@@ -370,7 +370,7 @@ define([
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-highlight',
                         lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inChart, _set.inSmartart, _set.inSmartartInternal, _set.previewReviewMode, _set.viewFormMode,
-                                _set.lostConnect, _set.disableOnStart],
+                                _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         enableToggle: true,
                         allowDepress: true,
                         split: true,
@@ -395,7 +395,7 @@ define([
                         id: 'id-toolbar-btn-fontcolor',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-fontcolor',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         split: true,
                         menu: true,
                         auto: true,
@@ -410,7 +410,7 @@ define([
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-paracolor',
                         lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inChart, _set.inSmartart, _set.inSmartartInternal, _set.previewReviewMode, _set.viewFormMode,
-                                _set.lostConnect, _set.disableOnStart],
+                                _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         split: true,
                         transparent: true,
                         menu: true,
@@ -425,7 +425,7 @@ define([
                         id: 'id-toolbar-btn-case',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-change-case',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         menu: new Common.UI.Menu({
                             items: [
                                 {caption: this.mniSentenceCase, value: Asc.c_oAscChangeTextCaseType.SentenceCase},
@@ -444,7 +444,7 @@ define([
                         id: 'id-toolbar-btn-align-left',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-align-left',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         enableToggle: true,
                         toggleGroup: 'alignGroup',
                         dataHint: '1',
@@ -456,7 +456,7 @@ define([
                         id: 'id-toolbar-btn-align-center',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-align-center',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         enableToggle: true,
                         toggleGroup: 'alignGroup',
                         dataHint: '1',
@@ -468,7 +468,7 @@ define([
                         id: 'id-toolbar-btn-align-right',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-align-right',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         enableToggle: true,
                         toggleGroup: 'alignGroup',
                         dataHint: '1',
@@ -480,7 +480,7 @@ define([
                         id: 'id-toolbar-btn-align-just',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-align-just',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         enableToggle: true,
                         toggleGroup: 'alignGroup',
                         dataHint: '1',
@@ -492,7 +492,7 @@ define([
                         id: 'id-toolbar-btn-decoffset',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-decoffset',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inSmartartInternal, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inSmartartInternal, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         dataHint: '1',
                         dataHintDirection: 'top'
                     });
@@ -502,7 +502,7 @@ define([
                         id: 'id-toolbar-btn-incoffset',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-incoffset',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inSmartartInternal, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inSmartartInternal, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         dataHint: '1',
                         dataHintDirection: 'top'
                     });
@@ -512,7 +512,7 @@ define([
                         id: 'id-toolbar-btn-linespace',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-linespace',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         menu: new Common.UI.Menu({
                             style: 'min-width: 60px;',
                             items: [
@@ -534,7 +534,7 @@ define([
                         id: 'id-toolbar-btn-hidenchars',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-paragraph',
-                        lock: [ _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                        lock: [ _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         enableToggle: true,
                         split: true,
                         menu: new Common.UI.Menu({
@@ -555,7 +555,7 @@ define([
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-setmarkers',
                         lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inChart, _set.inSmartart, _set.inSmartartInternal, _set.previewReviewMode, _set.viewFormMode,
-                            _set.lostConnect, _set.disableOnStart],
+                            _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         enableToggle: true,
                         toggleGroup: 'markersGroup',
                         split: true,
@@ -572,7 +572,7 @@ define([
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-numbering',
                         lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inChart, _set.inSmartart, _set.inSmartartInternal,  _set.previewReviewMode, _set.viewFormMode,
-                            _set.lostConnect, _set.disableOnStart],
+                            _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         enableToggle: true,
                         toggleGroup: 'markersGroup',
                         split: true,
@@ -589,7 +589,7 @@ define([
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-multilevels',
                         lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inChart, _set.inSmartart, _set.inSmartartInternal, _set.previewReviewMode, _set.viewFormMode,
-                                _set.lostConnect, _set.disableOnStart],
+                                _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         menu: true,
                         dataHint: '1',
                         dataHintDirection: 'top',
@@ -622,7 +622,7 @@ define([
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-inserttable',
                         lock: [_set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inEquation, _set.controlPlain, _set.richDelLock, _set.plainDelLock, _set.cantAddTable, _set.previewReviewMode,
-                            _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                            _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         caption: me.capBtnInsTable,
                         menu: new Common.UI.Menu({
                             items: [
@@ -645,7 +645,7 @@ define([
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-insertimage',
                         lock: [_set.paragraphLock, _set.headerLock, _set.inEquation, _set.controlPlain, _set.richDelLock, _set.plainDelLock,  _set.contentLock,  _set.cantAddImagePara,
-                                _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                                _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         caption: me.capBtnInsImage,
                         menu: new Common.UI.Menu({
                             items: [
@@ -666,7 +666,7 @@ define([
                         caption: me.capBtnInsChart,
                         iconCls: 'toolbar__icon btn-insertchart',
                         lock: [ _set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.controlPlain, _set.richDelLock, _set.plainDelLock, _set.contentLock,
-                                _set.chartLock, _set.cantAddChart, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                                _set.chartLock, _set.cantAddChart, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         menu: true,
                         dataHint: '1',
                         dataHintDirection: 'bottom',
@@ -679,7 +679,7 @@ define([
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-text',
                         lock: [_set.paragraphLock, _set.headerLock, _set.inEquation, _set.controlPlain, _set.contentLock, _set.inFootnote, _set.previewReviewMode, _set.viewFormMode,
-                            _set.lostConnect, _set.disableOnStart],
+                            _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         caption: me.capBtnInsTextbox,
                         enableToggle: true,
                         dataHint: '1',
@@ -693,7 +693,7 @@ define([
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-textart',
                         lock: [_set.paragraphLock, _set.headerLock, _set.inEquation, _set.controlPlain, _set.richDelLock, _set.plainDelLock, _set.contentLock, _set.inFootnote, _set.cantAddImagePara,
-                            _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                            _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         caption: me.capBtnInsTextart,
                         menu: new Common.UI.Menu({
                             cls: 'menu-shapes',
@@ -711,7 +711,7 @@ define([
                         id: 'id-toolbar-btn-editheader',
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-editheader',
-                        lock: [ _set.previewReviewMode, _set.viewFormMode, _set.inEquation, _set.lostConnect, _set.disableOnStart],
+                        lock: [ _set.previewReviewMode, _set.viewFormMode, _set.inEquation, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         caption: me.capBtnInsHeader,
                         menu: true,
                         dataHint: '1',
@@ -745,7 +745,7 @@ define([
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-datetime',
                         lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.richDelLock, _set.plainDelLock, _set.noParagraphSelected, _set.previewReviewMode,
-                            _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                            _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         caption: me.capBtnDateTime,
                         dataHint: '1',
                         dataHintDirection: 'bottom',
@@ -758,7 +758,7 @@ define([
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-blankpage',
                         lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inEquation, _set.richDelLock, _set.plainDelLock, _set.inHeader,  _set.inFootnote,  _set.inControl,
-                            _set.cantPageBreak, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                            _set.cantPageBreak, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         caption: me.capBtnBlankPage,
                         dataHint: '1',
                         dataHintDirection: 'bottom',
@@ -771,7 +771,7 @@ define([
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-insertshape',
                         lock: [_set.paragraphLock, _set.headerLock, _set.inEquation, _set.controlPlain,  _set.contentLock,  _set.inFootnote, _set.previewReviewMode, _set.viewFormMode,
-                                _set.lostConnect, _set.disableOnStart],
+                                _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         caption: me.capBtnInsShape,
                         enableToggle: true,
                         menu: new Common.UI.Menu({cls: 'menu-shapes menu-insert-shape'}),
@@ -786,7 +786,7 @@ define([
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-insertequation',
                         lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inChart, _set.controlPlain, _set.richDelLock, _set.plainDelLock, _set.cantAddEquation,
-                            _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                            _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         caption: me.capBtnInsEquation,
                         split: true,
                         menu: new Common.UI.Menu({cls: 'menu-shapes'}),
@@ -801,7 +801,7 @@ define([
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-symbol',
                         lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.richDelLock, _set.plainDelLock, _set.noParagraphSelected, _set.previewReviewMode,
-                            _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                            _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         caption: me.capBtnInsSymbol,
                         dataHint: '1',
                         dataHintDirection: 'bottom',
@@ -814,7 +814,7 @@ define([
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-dropcap',
                         lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inEquation, _set.controlPlain, _set.dropcapLock, _set.previewReviewMode, _set.viewFormMode,
-                            _set.lostConnect, _set.disableOnStart],
+                            _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         caption: me.capBtnInsDropcap,
                         menu: new Common.UI.Menu({
                             cls: 'ppm-toolbar shifted-right',
@@ -858,7 +858,7 @@ define([
                         id: 'tlbtn-controls',
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-controls',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         caption: me.capBtnInsControls,
                         menu: new Common.UI.Menu({
                             cls: 'ppm-toolbar shifted-right',
@@ -944,7 +944,7 @@ define([
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-columns',
                         lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.controlPlain, _set.inImage, _set.docPropsLock, _set.previewReviewMode, _set.viewFormMode,
-                            _set.lostConnect, _set.disableOnStart],
+                            _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         caption: me.capBtnColumns,
                         menu: new Common.UI.Menu({
                             cls: 'ppm-toolbar shifted-right',
@@ -1003,7 +1003,7 @@ define([
                         id: 'tlbtn-pageorient',
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-pageorient',
-                        lock: [_set.docPropsLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                        lock: [_set.docPropsLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         caption: me.capBtnPageOrient,
                         menu: new Common.UI.Menu({
                             cls: 'ppm-toolbar',
@@ -1045,7 +1045,7 @@ define([
                         id: 'tlbtn-pagemargins',
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-pagemargins',
-                        lock: [_set.docPropsLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                        lock: [_set.docPropsLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         caption: me.capBtnMargins,
                         menu: new Common.UI.Menu({
                             items: [
@@ -1108,7 +1108,7 @@ define([
                         id: 'tlbtn-pagesize',
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-pagesize',
-                        lock: [_set.docPropsLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                        lock: [_set.docPropsLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         caption: me.capBtnPageSize,
                         menu: new Common.UI.Menu({
                             restoreHeight: true,
@@ -1232,7 +1232,7 @@ define([
                         id: 'tlbtn-line-numbers',
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-line-numbering',
-                        lock: [_set.docPropsLock, _set.inImagePara, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                        lock: [_set.docPropsLock, _set.inImagePara, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         caption: me.capBtnLineNumbers,
                         menu: new Common.UI.Menu({
                             cls: 'ppm-toolbar',
@@ -1285,7 +1285,7 @@ define([
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-clearstyle',
                         lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inChart, _set.inSmartart, _set.inSmartartInternal, _set.previewReviewMode, _set.viewFormMode,
-                            _set.lostConnect, _set.disableOnStart],
+                            _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         dataHint: '1',
                         dataHintDirection: 'top'
                     });
@@ -1295,7 +1295,7 @@ define([
                         id: 'id-toolbar-btn-copystyle',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-copystyle',
-                        lock: [ _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                        lock: [ _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         enableToggle: true,
                         dataHint: '1',
                         dataHintDirection: 'bottom'
@@ -1306,7 +1306,7 @@ define([
                         id: 'id-toolbar-btn-colorschemas',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-colorschemas',
-                        lock: [_set.docSchemaLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                        lock: [_set.docSchemaLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         menu: new Common.UI.Menu({
                             cls: 'shifted-left',
                             items: [],
@@ -1322,7 +1322,7 @@ define([
                         id: 'id-toolbar-btn-mailrecepients',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-mailmerge',
-                        lock: [_set.mmergeLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                        lock: [_set.mmergeLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         dataHint: '1',
                         dataHintDirection: 'bottom',
                         menu: new Common.UI.Menu({
@@ -1338,7 +1338,7 @@ define([
                     me.btnImgAlign = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-img-align',
-                        lock: [_set.imageLock, _set.contentLock, _set.inImageInline, _set.noObjectSelected, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                        lock: [_set.imageLock, _set.contentLock, _set.inImageInline, _set.noObjectSelected, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         caption: me.capImgAlign,
                         menu: true,
                         dataHint: '1',
@@ -1349,7 +1349,7 @@ define([
                     me.btnImgGroup = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-img-group',
-                        lock: [_set.imageLock, _set.contentLock, _set.inImageInline, _set.noObjectSelected, _set.cantGroup, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                        lock: [_set.imageLock, _set.contentLock, _set.inImageInline, _set.noObjectSelected, _set.cantGroup, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         caption: me.capImgGroup,
                         menu: true,
                         dataHint: '1',
@@ -1359,7 +1359,7 @@ define([
                     me.btnImgForward = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-img-frwd',
-                        lock: [_set.cantArrange, _set.lostConnect, _set.contentLock, _set.noObjectSelected, _set.inSmartartInternal, _set.previewReviewMode, _set.viewFormMode, _set.disableOnStart],
+                        lock: [_set.cantArrange, _set.lostConnect, _set.contentLock, _set.noObjectSelected, _set.inSmartartInternal, _set.previewReviewMode, _set.viewFormMode, _set.disableOnStart, _set.docLockView],
                         caption: me.capImgForward,
                         split: true,
                         menu: true,
@@ -1370,7 +1370,7 @@ define([
                     me.btnImgBackward = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-img-bkwd',
-                        lock: [_set.cantArrange, _set.lostConnect, _set.contentLock, _set.noObjectSelected, _set.inSmartartInternal, _set.previewReviewMode, _set.viewFormMode, _set.disableOnStart],
+                        lock: [_set.cantArrange, _set.lostConnect, _set.contentLock, _set.noObjectSelected, _set.inSmartartInternal, _set.previewReviewMode, _set.viewFormMode, _set.disableOnStart, _set.docLockView],
                         caption: me.capImgBackward,
                         split: true,
                         menu: true,
@@ -1381,7 +1381,7 @@ define([
                     me.btnImgWrapping = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-img-wrap',
-                        lock: [_set.cantWrap, _set.imageLock, _set.contentLock, _set.noObjectSelected, _set.lostConnect, _set.previewReviewMode, _set.viewFormMode, _set.disableOnStart],
+                        lock: [_set.cantWrap, _set.imageLock, _set.contentLock, _set.noObjectSelected, _set.lostConnect, _set.previewReviewMode, _set.viewFormMode, _set.disableOnStart, _set.docLockView],
                         caption: me.capImgWrapping,
                         menu: true,
                         dataHint: '1',
@@ -1392,7 +1392,7 @@ define([
                     me.btnWatermark = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-watermark',
-                        lock: [_set.headerLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                        lock: [_set.headerLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         caption: me.capBtnWatermark,
                         menu: new Common.UI.Menu({
                             cls: 'ppm-toolbar',
@@ -1431,7 +1431,7 @@ define([
                     this.cmbFontSize = new Common.UI.ComboBox({
                         cls: 'input-group-nr',
                         menuStyle: 'min-width: 55px;',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         hint: this.tipFontSize,
                         data: [
                             {value: 8, displayValue: "8"},
@@ -1461,7 +1461,7 @@ define([
                         cls: 'input-group-nr',
                         menuCls: 'scrollable-menu',
                         menuStyle: 'min-width: 325px;',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         hint: this.tipFontName,
                         store: new Common.Collections.Fonts(),
                         dataHint: '1',
@@ -1480,7 +1480,7 @@ define([
                     this.listStyles = new Common.UI.ComboDataView({
                         cls: 'combo-styles',
                         lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inChart, _set.inSmartart, _set.inSmartartInternal, _set.previewReviewMode,
-                            _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
+                            _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
                         itemWidth: itemWidth,
                         itemHeight: itemHeight,
                         style: 'min-width:150px;',
@@ -1738,7 +1738,7 @@ define([
                 this.btnsPageBreak = Common.Utils.injectButtons($host.find('.btn-slot.btn-pagebreak'), '', 'toolbar__icon btn-pagebreak', this.capBtnInsPagebreak,
                     [Common.enumLock.paragraphLock, Common.enumLock.headerLock, Common.enumLock.richEditLock, Common.enumLock.plainEditLock, Common.enumLock.inEquation, Common.enumLock.richDelLock,
                         Common.enumLock.plainDelLock, Common.enumLock.inHeader, Common.enumLock.inFootnote, Common.enumLock.inControl, Common.enumLock.cantPageBreak, Common.enumLock.previewReviewMode,
-                        Common.enumLock.viewFormMode, Common.enumLock.lostConnect, Common.enumLock.disableOnStart],
+                        Common.enumLock.viewFormMode, Common.enumLock.lostConnect, Common.enumLock.disableOnStart, Common.enumLock.docLockView],
                         true, true, undefined, '1', 'bottom', 'small');
                 Array.prototype.push.apply(this.paragraphControls, this.btnsPageBreak);
                 Array.prototype.push.apply(this.lockControls, this.btnsPageBreak);

From c6cd767264cf115da607ae10342585aaa11c37a3 Mon Sep 17 00:00:00 2001
From: Julia Radzhabova <julia.radzhabova@onlyoffice.com>
Date: Fri, 23 Sep 2022 21:00:18 +0300
Subject: [PATCH 03/28] [DE] Lock review changes and comments when document is
 protected

---
 apps/common/main/lib/controller/Comments.js   | 33 ++++++++++++++++---
 .../main/lib/controller/ReviewChanges.js      | 20 ++++++++---
 .../main/app/controller/LeftMenu.js           | 26 +++++++++++++--
 3 files changed, 66 insertions(+), 13 deletions(-)

diff --git a/apps/common/main/lib/controller/Comments.js b/apps/common/main/lib/controller/Comments.js
index 65bcb0e22..a8357d176 100644
--- a/apps/common/main/lib/controller/Comments.js
+++ b/apps/common/main/lib/controller/Comments.js
@@ -144,10 +144,12 @@ define([
                     }
                 }, this, area);
             }.bind(this));
+            Common.NotificationCenter.on('protect:doclock', _.bind(this.onChangeProtectDocument, this));
         },
         onLaunch: function () {
             var filter = Common.localStorage.getKeysFilter();
             this.appPrefix = (filter && filter.length) ? filter.split(',')[0] : '';
+            this._state = {viewmode: false};
 
             this.collection                     =   this.getApplication().getCollection('Common.Collections.Comments');
             this.setComparator();
@@ -1645,16 +1647,26 @@ define([
         },
 
         setPreviewMode: function(mode) {
-            if (this.viewmode === mode) return;
-            this.viewmode = mode;
-            if (mode)
+            this._state.viewmode = mode;
+            this.updatePreviewMode();
+        },
+
+        updatePreviewMode: function() {
+            var lockMode = this._state.docProtection ? this._state.docProtection.lockMode : undefined;
+            lockMode = (lockMode===Asc.c_oAscProtection.View || lockMode===Asc.c_oAscProtection.Forms);
+            var viewmode = this._state.viewmode || lockMode;
+
+            if (this.viewmode === viewmode) return;
+            this.viewmode = viewmode;
+
+            if (viewmode)
                 this.prevcanComments = this.mode.canComments;
-            this.mode.canComments = (mode) ? false : this.prevcanComments;
+            this.mode.canComments = (viewmode) ? false : this.prevcanComments;
             this.closeEditing();
             this.setMode(this.mode);
             this.updateComments(true);
             if (this.getPopover())
-                mode ? this.getPopover().hide() : this.getPopover().update(true);
+                viewmode ? this.getPopover().hide() : this.getPopover().update(true);
         },
 
         clearCollections: function() {
@@ -1718,6 +1730,17 @@ define([
                 }
             }
             this.updateComments(true);
+        },
+
+        onChangeProtectDocument: function(props) {
+            if (!props) {
+                var docprotect = this.getApplication().getController('DocProtection');
+                props = docprotect ? docprotect.getDocProps() : null;
+            }
+            if (props) {
+                this._state.docProtection = props;
+                this.updatePreviewMode();
+            }
         }
 
     }, Common.Controllers.Comments || {}));
diff --git a/apps/common/main/lib/controller/ReviewChanges.js b/apps/common/main/lib/controller/ReviewChanges.js
index d25d1a9c6..b395255a8 100644
--- a/apps/common/main/lib/controller/ReviewChanges.js
+++ b/apps/common/main/lib/controller/ReviewChanges.js
@@ -102,7 +102,7 @@ define([
             this.userCollection =   this.getApplication().getCollection('Common.Collections.Users');
             this.viewmode = false;
 
-            this._state = {posx: -1000, posy: -1000, popoverVisible: false, previewMode: false, compareSettings: null, wsLock: false, wsProps: []};
+            this._state = {posx: -1000, posy: -1000, popoverVisible: false, previewMode: false, compareSettings: null, wsLock: false, wsProps: [], viewmode: false};
 
             Common.NotificationCenter.on('reviewchanges:turn', this.onTurnPreview.bind(this));
             Common.NotificationCenter.on('spelling:turn', this.onTurnSpelling.bind(this));
@@ -180,11 +180,20 @@ define([
         },
 
         setPreviewMode: function(mode) { //disable accept/reject in popover
-            if (this.viewmode === mode) return;
-            this.viewmode = mode;
-            if (mode)
+            this._state.viewmode = mode;
+            this.updatePreviewMode();
+        },
+
+        updatePreviewMode: function() {
+            var lockMode = this._state.docProtection ? this._state.docProtection.lockMode : undefined;
+            lockMode = (lockMode===Asc.c_oAscProtection.View || lockMode===Asc.c_oAscProtection.Forms || lockMode===Asc.c_oAscProtection.Comments);
+            var viewmode = this._state.viewmode || lockMode;
+
+            if (this.viewmode === viewmode) return;
+            this.viewmode = viewmode;
+            if (viewmode)
                 this.prevcanReview = this.appConfig.canReview;
-            this.appConfig.canReview = (mode) ? false : this.prevcanReview;
+            this.appConfig.canReview = (viewmode) ? false : this.prevcanReview;
             var me = this;
             this.popoverChanges && this.popoverChanges.each(function (model) {
                 model.set('hint', !me.appConfig.canReview);
@@ -1024,6 +1033,7 @@ define([
                 this.lockToolbar(Common.enumLock.docLockForms, props.docLock && (props.lockMode===Asc.c_oAscProtection.Forms));
                 this.lockToolbar(Common.enumLock.docLockReview, props.docLock && (props.lockMode===Asc.c_oAscProtection.Review));
                 this.lockToolbar(Common.enumLock.docLockComments, props.docLock && (props.lockMode===Asc.c_oAscProtection.Comments));
+                this.updatePreviewMode();
             }
         },
 
diff --git a/apps/documenteditor/main/app/controller/LeftMenu.js b/apps/documenteditor/main/app/controller/LeftMenu.js
index 1a9e70001..1fe6247ad 100644
--- a/apps/documenteditor/main/app/controller/LeftMenu.js
+++ b/apps/documenteditor/main/app/controller/LeftMenu.js
@@ -113,12 +113,13 @@ define([
                 if ( !this.leftMenu.panelHistory.isVisible() )
                     this.clickMenuFileItem(null, 'history');
             }, this));
+            Common.NotificationCenter.on('protect:doclock', _.bind(this.onChangeProtectDocument, this));
         },
 
         onLaunch: function() {
             this.leftMenu = this.createView('LeftMenu').render();
             this.leftMenu.btnSearchBar.on('toggle', _.bind(this.onMenuSearchBar, this));
-
+            this._state = {viewmode: false};
             Common.util.Shortcuts.delegateShortcuts({
                 shortcuts: {
                     'command+shift+s,ctrl+shift+s': _.bind(this.onShortcut, this, 'save'),
@@ -581,8 +582,16 @@ define([
         },
 
         setPreviewMode: function(mode) {
-            if (this.viewmode === mode) return;
-            this.viewmode = mode;
+            this._state.viewmode = mode;
+            this.updatePreviewMode();
+        },
+
+        updatePreviewMode: function() {
+            var lockMode = this._state.docProtection ? this._state.docProtection.lockMode : undefined;
+            lockMode = (lockMode===Asc.c_oAscProtection.View || lockMode===Asc.c_oAscProtection.Forms);
+            var viewmode = this._state.viewmode || lockMode;
+            if (this.viewmode === viewmode) return;
+            this.viewmode = viewmode;
 
             this.leftMenu.panelSearch && this.leftMenu.panelSearch.setSearchMode(this.viewmode ? 'no-replace' : 'search');
         },
@@ -887,6 +896,17 @@ define([
             return this.leftMenu && this.leftMenu.panelComments && this.leftMenu.panelComments.isVisible();
         },
 
+        onChangeProtectDocument: function(props) {
+            if (!props) {
+                var docprotect = this.getApplication().getController('DocProtection');
+                props = docprotect ? docprotect.getDocProps() : null;
+            }
+            if (props) {
+                this._state.docProtection = props;
+                this.updatePreviewMode();
+            }
+        },
+
         textNoTextFound         : 'Text not found',
         newDocumentTitle        : 'Unnamed document',
         requestEditRightsText   : 'Requesting editing rights...',

From 9aeffb19c5effcdf775564b5bfaaf7db90149b67 Mon Sep 17 00:00:00 2001
From: Julia Radzhabova <julia.radzhabova@onlyoffice.com>
Date: Fri, 23 Sep 2022 22:07:05 +0300
Subject: [PATCH 04/28] [DE] Lock controls when document is protected (fill
 forms only)

---
 apps/common/main/lib/view/ReviewChanges.js    |  24 ++--
 .../main/app/controller/DocProtection.js      |   3 +-
 .../main/app/controller/DocumentHolder.js     |   3 +-
 .../main/app/controller/Toolbar.js            |   2 +-
 .../main/app/view/DocumentHolder.js           |   2 +-
 apps/documenteditor/main/app/view/FormsTab.js |  22 ++--
 apps/documenteditor/main/app/view/Links.js    |  20 ++--
 apps/documenteditor/main/app/view/Toolbar.js  | 112 +++++++++---------
 8 files changed, 95 insertions(+), 93 deletions(-)

diff --git a/apps/common/main/lib/view/ReviewChanges.js b/apps/common/main/lib/view/ReviewChanges.js
index 12f007dbc..a9fa6c061 100644
--- a/apps/common/main/lib/view/ReviewChanges.js
+++ b/apps/common/main/lib/view/ReviewChanges.js
@@ -259,7 +259,7 @@ define([
                         caption: this.txtAccept,
                         split: !this.appConfig.canUseReviewPermissions,
                         iconCls: 'toolbar__icon btn-review-save',
-                        lock: [_set.reviewChangelock, _set.isReviewOnly, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.docLockView],
+                        lock: [_set.reviewChangelock, _set.isReviewOnly, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.docLockView, _set.docLockForms],
                         dataHint: '1',
                         dataHintDirection: 'bottom',
                         dataHintOffset: 'small'
@@ -271,7 +271,7 @@ define([
                         caption: this.txtReject,
                         split: !this.appConfig.canUseReviewPermissions,
                         iconCls: 'toolbar__icon btn-review-deny',
-                        lock: [_set.reviewChangelock, _set.isReviewOnly, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.docLockView],
+                        lock: [_set.reviewChangelock, _set.isReviewOnly, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.docLockView, _set.docLockForms],
                         dataHint: '1',
                         dataHintDirection: 'bottom',
                         dataHintOffset: 'small'
@@ -284,7 +284,7 @@ define([
                             caption: this.txtCompare,
                             split: true,
                             iconCls: 'toolbar__icon btn-compare',
-                            lock: [_set.hasCoeditingUsers, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.docLockView],
+                            lock: [_set.hasCoeditingUsers, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.docLockView, _set.docLockForms],
                             dataHint: '1',
                             dataHintDirection: 'bottom',
                             dataHintOffset: 'small'
@@ -294,7 +294,7 @@ define([
                     this.btnTurnOn = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-ic-review',
-                        lock: [_set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.docLockView],
+                        lock: [_set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.docLockView, _set.docLockForms],
                         caption: this.txtTurnon,
                         split: !this.appConfig.isReviewOnly,
                         enableToggle: true,
@@ -309,7 +309,7 @@ define([
                     this.btnPrev = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-review-prev',
-                        lock: [_set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.docLockView],
+                        lock: [_set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.docLockView, _set.docLockForms],
                         caption: this.txtPrev,
                         dataHint: '1',
                         dataHintDirection: 'bottom',
@@ -320,7 +320,7 @@ define([
                     this.btnNext = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-review-next',
-                        lock: [_set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.docLockView],
+                        lock: [_set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.docLockView, _set.docLockForms],
                         caption: this.txtNext,
                         dataHint: '1',
                         dataHintDirection: 'bottom',
@@ -336,7 +336,7 @@ define([
                         this.btnReviewView = new Common.UI.Button({
                             cls: 'btn-toolbar x-huge icon-top',
                             iconCls: 'toolbar__icon btn-ic-reviewview',
-                            lock: [_set.viewFormMode, _set.lostConnect, _set.docLockView],
+                            lock: [_set.viewFormMode, _set.lostConnect, _set.docLockView, _set.docLockForms],
                             caption: this.txtView,
                             menu: new Common.UI.Menu({
                                 cls: 'ppm-toolbar',
@@ -450,7 +450,7 @@ define([
                         caption: this.txtCommentRemove,
                         split: true,
                         iconCls: 'toolbar__icon btn-rem-comment',
-                        lock: [_set.previewReviewMode, _set.viewFormMode, _set.hideComments, _set['Objects'], _set.lostConnect, _set.docLockView],
+                        lock: [_set.previewReviewMode, _set.viewFormMode, _set.hideComments, _set['Objects'], _set.lostConnect, _set.docLockView, _set.docLockForms],
                         dataHint: '1',
                         dataHintDirection: 'bottom',
                         dataHintOffset: 'small'
@@ -461,7 +461,7 @@ define([
                         caption: this.txtCommentResolve,
                         split: true,
                         iconCls: 'toolbar__icon btn-resolve-all',
-                        lock: [_set.previewReviewMode, _set.viewFormMode, _set.hideComments, _set['Objects'], _set.lostConnect, _set.docLockView],
+                        lock: [_set.previewReviewMode, _set.viewFormMode, _set.hideComments, _set['Objects'], _set.lostConnect, _set.docLockView, _set.docLockForms],
                         dataHint: '1',
                         dataHintDirection: 'bottom',
                         dataHintOffset: 'small'
@@ -731,7 +731,7 @@ define([
                     var button = new Common.UI.Button({
                         cls         : 'btn-toolbar',
                         iconCls     : 'toolbar__icon btn-ic-review',
-                        lock: [Common.enumLock.viewMode, Common.enumLock.previewReviewMode, Common.enumLock.viewFormMode, Common.enumLock.lostConnect, Common.enumLock.docLockView],
+                        lock: [Common.enumLock.viewMode, Common.enumLock.previewReviewMode, Common.enumLock.viewFormMode, Common.enumLock.lostConnect, Common.enumLock.docLockView, Common.enumLock.docLockForms],
                         hintAnchor  : 'top',
                         hint        : this.tipReview,
                         split       : !this.appConfig.isReviewOnly,
@@ -778,7 +778,7 @@ define([
                     button = new Common.UI.Button({
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-ic-docspell',
-                        lock: [Common.enumLock.viewMode,  Common.enumLock.viewFormMode, Common.enumLock.previewReviewMode, Common.enumLock.docLockView],
+                        lock: [Common.enumLock.viewMode,  Common.enumLock.viewFormMode, Common.enumLock.previewReviewMode, Common.enumLock.docLockView, Common.enumLock.docLockForms],
                         hintAnchor  : 'top',
                         hint: this.tipSetSpelling,
                         enableToggle: true,
@@ -794,7 +794,7 @@ define([
                     button = new Common.UI.Button({
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-ic-doclang',
-                        lock: [Common.enumLock.viewMode, Common.enumLock.previewReviewMode, Common.enumLock.viewFormMode, Common.enumLock.noSpellcheckLangs, Common.enumLock.lostConnect, Common.enumLock.docLockView],
+                        lock: [Common.enumLock.viewMode, Common.enumLock.previewReviewMode, Common.enumLock.viewFormMode, Common.enumLock.noSpellcheckLangs, Common.enumLock.lostConnect, Common.enumLock.docLockView, Common.enumLock.docLockForms],
                         hintAnchor  : 'top',
                         hint: this.tipSetDocLang,
                         dataHint: '0',
diff --git a/apps/documenteditor/main/app/controller/DocProtection.js b/apps/documenteditor/main/app/controller/DocProtection.js
index 7dd4d9d0f..0be9788b0 100644
--- a/apps/documenteditor/main/app/controller/DocProtection.js
+++ b/apps/documenteditor/main/app/controller/DocProtection.js
@@ -132,6 +132,7 @@ define([
                                 // props.asc_setLockPwd(value);
                                 // me.api.asc_setProtectedDocument(props);
 
+                                Common.Utils.InternalSettings.set('protect-test-type', props);
                                 me.view.btnProtectDoc.toggle(true, true); // test
                                 me.onChangeProtectDocument(); // test
                             }
@@ -217,7 +218,7 @@ define([
                     type;
 
                 if (docProtected) {
-                    type = Asc.c_oAscProtection.View;
+                    type = Common.Utils.InternalSettings.get('protect-test-type');
                 }
                 /////////////
                 this._state.docProtection = {docLock: docProtected, lockMode: type};
diff --git a/apps/documenteditor/main/app/controller/DocumentHolder.js b/apps/documenteditor/main/app/controller/DocumentHolder.js
index e5c6ab6b3..4fdab482b 100644
--- a/apps/documenteditor/main/app/controller/DocumentHolder.js
+++ b/apps/documenteditor/main/app/controller/DocumentHolder.js
@@ -828,7 +828,8 @@ define([
         onDialogAddHyperlink: function() {
             var me = this;
             var win, props, text;
-            if (me.api && me.mode.isEdit && !me._isDisabled && !me.getApplication().getController('LeftMenu').leftMenu.menuFile.isVisible()){
+            var lockMode = me.documentHolder.docProtection ? me.documentHolder.docProtection.lockMode : undefined;
+            if (me.api && me.mode.isEdit && !(me._isDisabled || lockMode===Asc.c_oAscProtection.View || lockMode===Asc.c_oAscProtection.Comments || lockMode===Asc.c_oAscProtection.Forms) && !me.getApplication().getController('LeftMenu').leftMenu.menuFile.isVisible()){
                 var handlerDlg = function(dlg, result) {
                     if (result == 'ok') {
                         props = dlg.getSettings();
diff --git a/apps/documenteditor/main/app/controller/Toolbar.js b/apps/documenteditor/main/app/controller/Toolbar.js
index 5c413ae5f..2ba838dfb 100644
--- a/apps/documenteditor/main/app/controller/Toolbar.js
+++ b/apps/documenteditor/main/app/controller/Toolbar.js
@@ -3264,7 +3264,7 @@ define([
                 this.btnsComment = Common.Utils.injectButtons(this.toolbar.$el.find('.slot-comment'), 'tlbtn-addcomment-', 'toolbar__icon btn-menu-comments', this.toolbar.capBtnComment,
                             [  Common.enumLock.paragraphLock, Common.enumLock.headerLock, Common.enumLock.richEditLock, Common.enumLock.plainEditLock, Common.enumLock.richDelLock, Common.enumLock.plainDelLock,
                                     Common.enumLock.cantAddQuotedComment, Common.enumLock.imageLock, Common.enumLock.inSpecificForm, Common.enumLock.inImage, Common.enumLock.lostConnect, Common.enumLock.disableOnStart,
-                                    Common.enumLock.previewReviewMode, Common.enumLock.viewFormMode, Common.enumLock.docLockView ],
+                                    Common.enumLock.previewReviewMode, Common.enumLock.viewFormMode, Common.enumLock.docLockView, Common.enumLock.docLockForms ],
                                  undefined, undefined, undefined, '1', 'bottom');
                 if ( this.btnsComment.length ) {
                     var _comments = DE.getController('Common.Controllers.Comments').getView();
diff --git a/apps/documenteditor/main/app/view/DocumentHolder.js b/apps/documenteditor/main/app/view/DocumentHolder.js
index a14786b13..779e39235 100644
--- a/apps/documenteditor/main/app/view/DocumentHolder.js
+++ b/apps/documenteditor/main/app/view/DocumentHolder.js
@@ -170,7 +170,7 @@ define([
                     }
 
                     me.menuViewUndo.setVisible(me.mode.canCoAuthoring && me.mode.canComments && !me._isDisabled);
-                    me.menuViewUndo.setDisabled(!me.api.asc_getCanUndo() || lockMode===Asc.c_oAscProtection.View || lockMode===Asc.c_oAscProtection.Forms);
+                    me.menuViewUndo.setDisabled(!me.api.asc_getCanUndo() || lockMode===Asc.c_oAscProtection.View);
                     me.menuViewCopySeparator.setVisible(isInSign);
 
                     var isRequested = (signProps) ? signProps.asc_getRequested() : false;
diff --git a/apps/documenteditor/main/app/view/FormsTab.js b/apps/documenteditor/main/app/view/FormsTab.js
index e1a9a91e4..8300eb357 100644
--- a/apps/documenteditor/main/app/view/FormsTab.js
+++ b/apps/documenteditor/main/app/view/FormsTab.js
@@ -169,7 +169,7 @@ define([
                     this.btnTextField = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-text-field',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.contentLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.contentLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         caption: this.capBtnText,
                         dataHint: '1',
                         dataHintDirection: 'bottom',
@@ -180,7 +180,7 @@ define([
                     this.btnComboBox = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-combo-box',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.contentLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.contentLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         caption: this.capBtnComboBox,
                         dataHint: '1',
                         dataHintDirection: 'bottom',
@@ -191,7 +191,7 @@ define([
                     this.btnDropDown = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-dropdown',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.contentLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.contentLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         caption: this.capBtnDropDown,
                         dataHint: '1',
                         dataHintDirection: 'bottom',
@@ -202,7 +202,7 @@ define([
                     this.btnCheckBox = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-checkbox',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.contentLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.contentLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         caption: this.capBtnCheckBox,
                         dataHint: '1',
                         dataHintDirection: 'bottom',
@@ -213,7 +213,7 @@ define([
                     this.btnRadioBox = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-radio-button',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.contentLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.contentLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         caption: this.capBtnRadioBox,
                         dataHint: '1',
                         dataHintDirection: 'bottom',
@@ -224,7 +224,7 @@ define([
                     this.btnImageField = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-insertimage',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.contentLock, _set.complexForm, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.contentLock, _set.complexForm, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         caption: this.capBtnImage,
                         dataHint: '1',
                         dataHintDirection: 'bottom',
@@ -235,7 +235,7 @@ define([
                     this.btnEmailField = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-email',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.contentLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.contentLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         caption: this.capBtnEmail,
                         dataHint: '1',
                         dataHintDirection: 'bottom',
@@ -246,7 +246,7 @@ define([
                     this.btnPhoneField = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-phone',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.contentLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.contentLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         caption: this.capBtnPhone,
                         dataHint: '1',
                         dataHintDirection: 'bottom',
@@ -257,7 +257,7 @@ define([
                     this.btnComplexField = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon complex-field',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.contentLock, _set.complexForm, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.contentLock, _set.complexForm, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         caption: this.capBtnComplex,
                         dataHint: '1',
                         dataHintDirection: 'bottom',
@@ -268,7 +268,7 @@ define([
                     this.btnViewForm = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-sheet-view',
-                        lock: [ _set.previewReviewMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                        lock: [ _set.previewReviewMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         caption: this.capBtnView,
                         enableToggle: true,
                         dataHint: '1',
@@ -291,7 +291,7 @@ define([
                     this.btnHighlight = new Common.UI.ButtonColored({
                         cls         : 'btn-toolbar',
                         iconCls     : 'toolbar__icon btn-highlight',
-                        lock: [ _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                        lock: [ _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         caption     : this.textHighlight,
                         menu        : true,
                         additionalItems: [ this.mnuNoFormsColor = new Common.UI.MenuItem({
diff --git a/apps/documenteditor/main/app/view/Links.js b/apps/documenteditor/main/app/view/Links.js
index 8fce3db9d..4d9730111 100644
--- a/apps/documenteditor/main/app/view/Links.js
+++ b/apps/documenteditor/main/app/view/Links.js
@@ -169,13 +169,13 @@ define([
                     $host = me.toolbar.$el;
 
                 this.btnsContents = Common.Utils.injectButtons($host.find('.btn-slot.btn-contents'), '', 'toolbar__icon btn-contents', me.capBtnInsContents,
-                    [_set.inHeader, _set.richEditLock, _set.plainEditLock, _set.richDelLock, _set.plainDelLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                    [_set.inHeader, _set.richEditLock, _set.plainEditLock, _set.richDelLock, _set.plainDelLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                     true, true, undefined, '1', 'bottom', 'small');
                 this.btnsNotes = Common.Utils.injectButtons($host.find('.btn-slot.slot-notes'), '', 'toolbar__icon btn-notes', me.capBtnInsFootnote,
-                    [_set.paragraphLock, _set.inEquation, _set.inImage, _set.inHeader, _set.controlPlain, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                    [_set.paragraphLock, _set.inEquation, _set.inImage, _set.inHeader, _set.controlPlain, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                     true, true, undefined, '1', 'bottom', 'small');
                 this.btnsHyperlink = Common.Utils.injectButtons($host.find('.btn-slot.slot-inshyperlink'), '', 'toolbar__icon btn-inserthyperlink', me.capBtnInsLink,
-                    [_set.paragraphLock, _set.headerLock, _set.hyperlinkLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                    [_set.paragraphLock, _set.headerLock, _set.hyperlinkLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                     undefined, undefined, undefined, '1', 'bottom', 'small');
                 Array.prototype.push.apply(this.paragraphControls, this.btnsContents.concat(this.btnsNotes, this.btnsHyperlink));
 
@@ -183,7 +183,7 @@ define([
                     parentEl: $host.find('#slot-btn-contents-update'),
                     cls: 'btn-toolbar',
                     iconCls: 'toolbar__icon btn-update',
-                    lock: [ _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                    lock: [ _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockForms],
                     caption: this.capBtnContentsUpdate,
                     split: true,
                     menu: true,
@@ -197,7 +197,7 @@ define([
                     parentEl: $host.find('#slot-btn-add-text'),
                     cls: 'btn-toolbar',
                     iconCls: 'toolbar__icon add-text',
-                    lock: [ _set.cantAddTextTOF, _set.inHeader, _set.inFootnote, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                    lock: [ _set.cantAddTextTOF, _set.inHeader, _set.inFootnote, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                     caption: this.capBtnAddText,
                     menu: new Common.UI.Menu({
                         items: []
@@ -212,7 +212,7 @@ define([
                     parentEl: $host.find('#slot-btn-bookmarks'),
                     cls: 'btn-toolbar x-huge icon-top',
                     iconCls: 'toolbar__icon btn-bookmarks',
-                    lock: [_set.paragraphLock, _set.inHeader, _set.headerLock, _set.controlPlain, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                    lock: [_set.paragraphLock, _set.inHeader, _set.headerLock, _set.controlPlain, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                     caption: this.capBtnBookmarks,
                     dataHint: '1',
                     dataHintDirection: 'bottom',
@@ -224,7 +224,7 @@ define([
                     parentEl: $host.find('#slot-btn-caption'),
                     cls: 'btn-toolbar x-huge icon-top',
                     iconCls: 'toolbar__icon btn-caption',
-                    lock: [_set.inHeader, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                    lock: [_set.inHeader, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                     caption: this.capBtnCaption,
                     dataHint: '1',
                     dataHintDirection: 'bottom',
@@ -236,7 +236,7 @@ define([
                     parentEl: $host.find('#slot-btn-crossref'),
                     cls: 'btn-toolbar x-huge icon-top',
                     iconCls: 'toolbar__icon btn-cross-reference',
-                    lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.richEditLock, _set.plainEditLock, _set.contentLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                    lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.richEditLock, _set.plainEditLock, _set.contentLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                     caption: this.capBtnCrossRef,
                     dataHint: '1',
                     dataHintDirection: 'bottom',
@@ -248,7 +248,7 @@ define([
                     parentEl: $host.find('#slot-btn-tof'),
                     cls: 'btn-toolbar',
                     iconCls: 'toolbar__icon btn-contents',
-                    lock: [_set.inHeader, _set.richEditLock, _set.plainEditLock, _set.richDelLock, _set.plainDelLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                    lock: [_set.inHeader, _set.richEditLock, _set.plainEditLock, _set.richDelLock, _set.plainDelLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                     caption: this.capBtnTOF,
                     dataHint: '1',
                     dataHintDirection: 'left',
@@ -260,7 +260,7 @@ define([
                     parentEl: $host.find('#slot-btn-tof-update'),
                     cls: 'btn-toolbar',
                     iconCls: 'toolbar__icon btn-update',
-                    lock: [_set.paragraphLock, _set.inHeader, _set.richEditLock, _set.plainEditLock, _set.richDelLock, _set.plainDelLock, _set.cantUpdateTOF, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                    lock: [_set.paragraphLock, _set.inHeader, _set.richEditLock, _set.plainEditLock, _set.richDelLock, _set.plainDelLock, _set.cantUpdateTOF, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                     caption: this.capBtnContentsUpdate,
                     dataHint: '1',
                     dataHintDirection: 'left',
diff --git a/apps/documenteditor/main/app/view/Toolbar.js b/apps/documenteditor/main/app/view/Toolbar.js
index d7f0032d5..eedd0d7e1 100644
--- a/apps/documenteditor/main/app/view/Toolbar.js
+++ b/apps/documenteditor/main/app/view/Toolbar.js
@@ -238,7 +238,7 @@ define([
                         id: 'id-toolbar-btn-copy',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-copy',
-                        lock: [_set.copyLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                        lock: [_set.copyLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart],
                         dataHint: '1',
                         dataHintDirection: 'top',
                         dataHintTitle: 'C'
@@ -281,7 +281,7 @@ define([
                         id: 'id-toolbar-btn-incfont',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-incfont',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         dataHint: '1',
                         dataHintDirection: 'top'
                     });
@@ -291,7 +291,7 @@ define([
                         id: 'id-toolbar-btn-decfont',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-decfont',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         dataHint: '1',
                         dataHintDirection: 'top'
                     });
@@ -301,7 +301,7 @@ define([
                         id: 'id-toolbar-btn-bold',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-bold',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         enableToggle: true,
                         dataHint: '1',
                         dataHintDirection: 'bottom'
@@ -312,7 +312,7 @@ define([
                         id: 'id-toolbar-btn-italic',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-italic',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         enableToggle: true,
                         dataHint: '1',
                         dataHintDirection: 'bottom'
@@ -323,7 +323,7 @@ define([
                         id: 'id-toolbar-btn-underline',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-underline',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         enableToggle: true,
                         dataHint: '1',
                         dataHintDirection: 'bottom'
@@ -334,7 +334,7 @@ define([
                         id: 'id-toolbar-btn-strikeout',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-strikeout',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         enableToggle: true,
                         dataHint: '1',
                         dataHintDirection: 'bottom'
@@ -345,7 +345,7 @@ define([
                         id: 'id-toolbar-btn-superscript',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-superscript',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inEquation, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inEquation, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         enableToggle: true,
                         toggleGroup: 'superscriptGroup',
                         dataHint: '1',
@@ -357,7 +357,7 @@ define([
                         id: 'id-toolbar-btn-subscript',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-subscript',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inEquation, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inEquation, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         enableToggle: true,
                         toggleGroup: 'superscriptGroup',
                         dataHint: '1',
@@ -370,7 +370,7 @@ define([
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-highlight',
                         lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inChart, _set.inSmartart, _set.inSmartartInternal, _set.previewReviewMode, _set.viewFormMode,
-                                _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                                _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         enableToggle: true,
                         allowDepress: true,
                         split: true,
@@ -395,7 +395,7 @@ define([
                         id: 'id-toolbar-btn-fontcolor',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-fontcolor',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         split: true,
                         menu: true,
                         auto: true,
@@ -410,7 +410,7 @@ define([
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-paracolor',
                         lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inChart, _set.inSmartart, _set.inSmartartInternal, _set.previewReviewMode, _set.viewFormMode,
-                                _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                                _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         split: true,
                         transparent: true,
                         menu: true,
@@ -425,7 +425,7 @@ define([
                         id: 'id-toolbar-btn-case',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-change-case',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         menu: new Common.UI.Menu({
                             items: [
                                 {caption: this.mniSentenceCase, value: Asc.c_oAscChangeTextCaseType.SentenceCase},
@@ -444,7 +444,7 @@ define([
                         id: 'id-toolbar-btn-align-left',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-align-left',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         enableToggle: true,
                         toggleGroup: 'alignGroup',
                         dataHint: '1',
@@ -456,7 +456,7 @@ define([
                         id: 'id-toolbar-btn-align-center',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-align-center',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         enableToggle: true,
                         toggleGroup: 'alignGroup',
                         dataHint: '1',
@@ -468,7 +468,7 @@ define([
                         id: 'id-toolbar-btn-align-right',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-align-right',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         enableToggle: true,
                         toggleGroup: 'alignGroup',
                         dataHint: '1',
@@ -480,7 +480,7 @@ define([
                         id: 'id-toolbar-btn-align-just',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-align-just',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         enableToggle: true,
                         toggleGroup: 'alignGroup',
                         dataHint: '1',
@@ -492,7 +492,7 @@ define([
                         id: 'id-toolbar-btn-decoffset',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-decoffset',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inSmartartInternal, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inSmartartInternal, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         dataHint: '1',
                         dataHintDirection: 'top'
                     });
@@ -502,7 +502,7 @@ define([
                         id: 'id-toolbar-btn-incoffset',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-incoffset',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inSmartartInternal, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inSmartartInternal, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         dataHint: '1',
                         dataHintDirection: 'top'
                     });
@@ -512,7 +512,7 @@ define([
                         id: 'id-toolbar-btn-linespace',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-linespace',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         menu: new Common.UI.Menu({
                             style: 'min-width: 60px;',
                             items: [
@@ -534,7 +534,7 @@ define([
                         id: 'id-toolbar-btn-hidenchars',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-paragraph',
-                        lock: [ _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                        lock: [ _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         enableToggle: true,
                         split: true,
                         menu: new Common.UI.Menu({
@@ -555,7 +555,7 @@ define([
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-setmarkers',
                         lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inChart, _set.inSmartart, _set.inSmartartInternal, _set.previewReviewMode, _set.viewFormMode,
-                            _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                            _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         enableToggle: true,
                         toggleGroup: 'markersGroup',
                         split: true,
@@ -572,7 +572,7 @@ define([
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-numbering',
                         lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inChart, _set.inSmartart, _set.inSmartartInternal,  _set.previewReviewMode, _set.viewFormMode,
-                            _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                            _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         enableToggle: true,
                         toggleGroup: 'markersGroup',
                         split: true,
@@ -589,7 +589,7 @@ define([
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-multilevels',
                         lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inChart, _set.inSmartart, _set.inSmartartInternal, _set.previewReviewMode, _set.viewFormMode,
-                                _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                                _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         menu: true,
                         dataHint: '1',
                         dataHintDirection: 'top',
@@ -622,7 +622,7 @@ define([
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-inserttable',
                         lock: [_set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inEquation, _set.controlPlain, _set.richDelLock, _set.plainDelLock, _set.cantAddTable, _set.previewReviewMode,
-                            _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                            _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         caption: me.capBtnInsTable,
                         menu: new Common.UI.Menu({
                             items: [
@@ -645,7 +645,7 @@ define([
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-insertimage',
                         lock: [_set.paragraphLock, _set.headerLock, _set.inEquation, _set.controlPlain, _set.richDelLock, _set.plainDelLock,  _set.contentLock,  _set.cantAddImagePara,
-                                _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                                _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         caption: me.capBtnInsImage,
                         menu: new Common.UI.Menu({
                             items: [
@@ -666,7 +666,7 @@ define([
                         caption: me.capBtnInsChart,
                         iconCls: 'toolbar__icon btn-insertchart',
                         lock: [ _set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.controlPlain, _set.richDelLock, _set.plainDelLock, _set.contentLock,
-                                _set.chartLock, _set.cantAddChart, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                                _set.chartLock, _set.cantAddChart, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         menu: true,
                         dataHint: '1',
                         dataHintDirection: 'bottom',
@@ -679,7 +679,7 @@ define([
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-text',
                         lock: [_set.paragraphLock, _set.headerLock, _set.inEquation, _set.controlPlain, _set.contentLock, _set.inFootnote, _set.previewReviewMode, _set.viewFormMode,
-                            _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                            _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         caption: me.capBtnInsTextbox,
                         enableToggle: true,
                         dataHint: '1',
@@ -693,7 +693,7 @@ define([
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-textart',
                         lock: [_set.paragraphLock, _set.headerLock, _set.inEquation, _set.controlPlain, _set.richDelLock, _set.plainDelLock, _set.contentLock, _set.inFootnote, _set.cantAddImagePara,
-                            _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                            _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         caption: me.capBtnInsTextart,
                         menu: new Common.UI.Menu({
                             cls: 'menu-shapes',
@@ -711,7 +711,7 @@ define([
                         id: 'id-toolbar-btn-editheader',
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-editheader',
-                        lock: [ _set.previewReviewMode, _set.viewFormMode, _set.inEquation, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                        lock: [ _set.previewReviewMode, _set.viewFormMode, _set.inEquation, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         caption: me.capBtnInsHeader,
                         menu: true,
                         dataHint: '1',
@@ -745,7 +745,7 @@ define([
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-datetime',
                         lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.richDelLock, _set.plainDelLock, _set.noParagraphSelected, _set.previewReviewMode,
-                            _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                            _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         caption: me.capBtnDateTime,
                         dataHint: '1',
                         dataHintDirection: 'bottom',
@@ -758,7 +758,7 @@ define([
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-blankpage',
                         lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inEquation, _set.richDelLock, _set.plainDelLock, _set.inHeader,  _set.inFootnote,  _set.inControl,
-                            _set.cantPageBreak, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                            _set.cantPageBreak, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         caption: me.capBtnBlankPage,
                         dataHint: '1',
                         dataHintDirection: 'bottom',
@@ -771,7 +771,7 @@ define([
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-insertshape',
                         lock: [_set.paragraphLock, _set.headerLock, _set.inEquation, _set.controlPlain,  _set.contentLock,  _set.inFootnote, _set.previewReviewMode, _set.viewFormMode,
-                                _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                                _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         caption: me.capBtnInsShape,
                         enableToggle: true,
                         menu: new Common.UI.Menu({cls: 'menu-shapes menu-insert-shape'}),
@@ -786,7 +786,7 @@ define([
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-insertequation',
                         lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inChart, _set.controlPlain, _set.richDelLock, _set.plainDelLock, _set.cantAddEquation,
-                            _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                            _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         caption: me.capBtnInsEquation,
                         split: true,
                         menu: new Common.UI.Menu({cls: 'menu-shapes'}),
@@ -801,7 +801,7 @@ define([
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-symbol',
                         lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.richDelLock, _set.plainDelLock, _set.noParagraphSelected, _set.previewReviewMode,
-                            _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                            _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         caption: me.capBtnInsSymbol,
                         dataHint: '1',
                         dataHintDirection: 'bottom',
@@ -814,7 +814,7 @@ define([
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-dropcap',
                         lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inEquation, _set.controlPlain, _set.dropcapLock, _set.previewReviewMode, _set.viewFormMode,
-                            _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                            _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         caption: me.capBtnInsDropcap,
                         menu: new Common.UI.Menu({
                             cls: 'ppm-toolbar shifted-right',
@@ -858,7 +858,7 @@ define([
                         id: 'tlbtn-controls',
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-controls',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         caption: me.capBtnInsControls,
                         menu: new Common.UI.Menu({
                             cls: 'ppm-toolbar shifted-right',
@@ -944,7 +944,7 @@ define([
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-columns',
                         lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.controlPlain, _set.inImage, _set.docPropsLock, _set.previewReviewMode, _set.viewFormMode,
-                            _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                            _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         caption: me.capBtnColumns,
                         menu: new Common.UI.Menu({
                             cls: 'ppm-toolbar shifted-right',
@@ -1003,7 +1003,7 @@ define([
                         id: 'tlbtn-pageorient',
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-pageorient',
-                        lock: [_set.docPropsLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                        lock: [_set.docPropsLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         caption: me.capBtnPageOrient,
                         menu: new Common.UI.Menu({
                             cls: 'ppm-toolbar',
@@ -1045,7 +1045,7 @@ define([
                         id: 'tlbtn-pagemargins',
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-pagemargins',
-                        lock: [_set.docPropsLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                        lock: [_set.docPropsLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         caption: me.capBtnMargins,
                         menu: new Common.UI.Menu({
                             items: [
@@ -1108,7 +1108,7 @@ define([
                         id: 'tlbtn-pagesize',
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-pagesize',
-                        lock: [_set.docPropsLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                        lock: [_set.docPropsLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         caption: me.capBtnPageSize,
                         menu: new Common.UI.Menu({
                             restoreHeight: true,
@@ -1232,7 +1232,7 @@ define([
                         id: 'tlbtn-line-numbers',
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-line-numbering',
-                        lock: [_set.docPropsLock, _set.inImagePara, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                        lock: [_set.docPropsLock, _set.inImagePara, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         caption: me.capBtnLineNumbers,
                         menu: new Common.UI.Menu({
                             cls: 'ppm-toolbar',
@@ -1285,7 +1285,7 @@ define([
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-clearstyle',
                         lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inChart, _set.inSmartart, _set.inSmartartInternal, _set.previewReviewMode, _set.viewFormMode,
-                            _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                            _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         dataHint: '1',
                         dataHintDirection: 'top'
                     });
@@ -1295,7 +1295,7 @@ define([
                         id: 'id-toolbar-btn-copystyle',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-copystyle',
-                        lock: [ _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                        lock: [ _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         enableToggle: true,
                         dataHint: '1',
                         dataHintDirection: 'bottom'
@@ -1306,7 +1306,7 @@ define([
                         id: 'id-toolbar-btn-colorschemas',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-colorschemas',
-                        lock: [_set.docSchemaLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                        lock: [_set.docSchemaLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         menu: new Common.UI.Menu({
                             cls: 'shifted-left',
                             items: [],
@@ -1322,7 +1322,7 @@ define([
                         id: 'id-toolbar-btn-mailrecepients',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-mailmerge',
-                        lock: [_set.mmergeLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                        lock: [_set.mmergeLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         dataHint: '1',
                         dataHintDirection: 'bottom',
                         menu: new Common.UI.Menu({
@@ -1338,7 +1338,7 @@ define([
                     me.btnImgAlign = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-img-align',
-                        lock: [_set.imageLock, _set.contentLock, _set.inImageInline, _set.noObjectSelected, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                        lock: [_set.imageLock, _set.contentLock, _set.inImageInline, _set.noObjectSelected, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         caption: me.capImgAlign,
                         menu: true,
                         dataHint: '1',
@@ -1349,7 +1349,7 @@ define([
                     me.btnImgGroup = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-img-group',
-                        lock: [_set.imageLock, _set.contentLock, _set.inImageInline, _set.noObjectSelected, _set.cantGroup, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                        lock: [_set.imageLock, _set.contentLock, _set.inImageInline, _set.noObjectSelected, _set.cantGroup, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         caption: me.capImgGroup,
                         menu: true,
                         dataHint: '1',
@@ -1359,7 +1359,7 @@ define([
                     me.btnImgForward = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-img-frwd',
-                        lock: [_set.cantArrange, _set.lostConnect, _set.contentLock, _set.noObjectSelected, _set.inSmartartInternal, _set.previewReviewMode, _set.viewFormMode, _set.disableOnStart, _set.docLockView],
+                        lock: [_set.cantArrange, _set.lostConnect, _set.contentLock, _set.noObjectSelected, _set.inSmartartInternal, _set.previewReviewMode, _set.viewFormMode, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         caption: me.capImgForward,
                         split: true,
                         menu: true,
@@ -1370,7 +1370,7 @@ define([
                     me.btnImgBackward = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-img-bkwd',
-                        lock: [_set.cantArrange, _set.lostConnect, _set.contentLock, _set.noObjectSelected, _set.inSmartartInternal, _set.previewReviewMode, _set.viewFormMode, _set.disableOnStart, _set.docLockView],
+                        lock: [_set.cantArrange, _set.lostConnect, _set.contentLock, _set.noObjectSelected, _set.inSmartartInternal, _set.previewReviewMode, _set.viewFormMode, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         caption: me.capImgBackward,
                         split: true,
                         menu: true,
@@ -1381,7 +1381,7 @@ define([
                     me.btnImgWrapping = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-img-wrap',
-                        lock: [_set.cantWrap, _set.imageLock, _set.contentLock, _set.noObjectSelected, _set.lostConnect, _set.previewReviewMode, _set.viewFormMode, _set.disableOnStart, _set.docLockView],
+                        lock: [_set.cantWrap, _set.imageLock, _set.contentLock, _set.noObjectSelected, _set.lostConnect, _set.previewReviewMode, _set.viewFormMode, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         caption: me.capImgWrapping,
                         menu: true,
                         dataHint: '1',
@@ -1392,7 +1392,7 @@ define([
                     me.btnWatermark = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-watermark',
-                        lock: [_set.headerLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                        lock: [_set.headerLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         caption: me.capBtnWatermark,
                         menu: new Common.UI.Menu({
                             cls: 'ppm-toolbar',
@@ -1431,7 +1431,7 @@ define([
                     this.cmbFontSize = new Common.UI.ComboBox({
                         cls: 'input-group-nr',
                         menuStyle: 'min-width: 55px;',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         hint: this.tipFontSize,
                         data: [
                             {value: 8, displayValue: "8"},
@@ -1461,7 +1461,7 @@ define([
                         cls: 'input-group-nr',
                         menuCls: 'scrollable-menu',
                         menuStyle: 'min-width: 325px;',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         hint: this.tipFontName,
                         store: new Common.Collections.Fonts(),
                         dataHint: '1',
@@ -1480,7 +1480,7 @@ define([
                     this.listStyles = new Common.UI.ComboDataView({
                         cls: 'combo-styles',
                         lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inChart, _set.inSmartart, _set.inSmartartInternal, _set.previewReviewMode,
-                            _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                            _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
                         itemWidth: itemWidth,
                         itemHeight: itemHeight,
                         style: 'min-width:150px;',
@@ -1738,7 +1738,7 @@ define([
                 this.btnsPageBreak = Common.Utils.injectButtons($host.find('.btn-slot.btn-pagebreak'), '', 'toolbar__icon btn-pagebreak', this.capBtnInsPagebreak,
                     [Common.enumLock.paragraphLock, Common.enumLock.headerLock, Common.enumLock.richEditLock, Common.enumLock.plainEditLock, Common.enumLock.inEquation, Common.enumLock.richDelLock,
                         Common.enumLock.plainDelLock, Common.enumLock.inHeader, Common.enumLock.inFootnote, Common.enumLock.inControl, Common.enumLock.cantPageBreak, Common.enumLock.previewReviewMode,
-                        Common.enumLock.viewFormMode, Common.enumLock.lostConnect, Common.enumLock.disableOnStart, Common.enumLock.docLockView],
+                        Common.enumLock.viewFormMode, Common.enumLock.lostConnect, Common.enumLock.disableOnStart, Common.enumLock.docLockView, Common.enumLock.docLockForms],
                         true, true, undefined, '1', 'bottom', 'small');
                 Array.prototype.push.apply(this.paragraphControls, this.btnsPageBreak);
                 Array.prototype.push.apply(this.lockControls, this.btnsPageBreak);

From fba576115ca928843fb29db6caa99d19afa8c508 Mon Sep 17 00:00:00 2001
From: Julia Radzhabova <julia.radzhabova@onlyoffice.com>
Date: Fri, 23 Sep 2022 23:43:09 +0300
Subject: [PATCH 05/28] [DE] Lock controls when document is protected (comments
 only)

---
 apps/common/main/lib/view/ReviewChanges.js    |  20 +--
 apps/documenteditor/main/app/view/FormsTab.js |  28 ++---
 apps/documenteditor/main/app/view/Links.js    |  20 +--
 apps/documenteditor/main/app/view/Toolbar.js  | 114 +++++++++---------
 4 files changed, 91 insertions(+), 91 deletions(-)

diff --git a/apps/common/main/lib/view/ReviewChanges.js b/apps/common/main/lib/view/ReviewChanges.js
index a9fa6c061..e8596856d 100644
--- a/apps/common/main/lib/view/ReviewChanges.js
+++ b/apps/common/main/lib/view/ReviewChanges.js
@@ -259,7 +259,7 @@ define([
                         caption: this.txtAccept,
                         split: !this.appConfig.canUseReviewPermissions,
                         iconCls: 'toolbar__icon btn-review-save',
-                        lock: [_set.reviewChangelock, _set.isReviewOnly, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.docLockView, _set.docLockForms],
+                        lock: [_set.reviewChangelock, _set.isReviewOnly, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         dataHint: '1',
                         dataHintDirection: 'bottom',
                         dataHintOffset: 'small'
@@ -271,7 +271,7 @@ define([
                         caption: this.txtReject,
                         split: !this.appConfig.canUseReviewPermissions,
                         iconCls: 'toolbar__icon btn-review-deny',
-                        lock: [_set.reviewChangelock, _set.isReviewOnly, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.docLockView, _set.docLockForms],
+                        lock: [_set.reviewChangelock, _set.isReviewOnly, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         dataHint: '1',
                         dataHintDirection: 'bottom',
                         dataHintOffset: 'small'
@@ -284,7 +284,7 @@ define([
                             caption: this.txtCompare,
                             split: true,
                             iconCls: 'toolbar__icon btn-compare',
-                            lock: [_set.hasCoeditingUsers, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.docLockView, _set.docLockForms],
+                            lock: [_set.hasCoeditingUsers, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.docLockView, _set.docLockForms, _set.docLockComments],
                             dataHint: '1',
                             dataHintDirection: 'bottom',
                             dataHintOffset: 'small'
@@ -294,7 +294,7 @@ define([
                     this.btnTurnOn = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-ic-review',
-                        lock: [_set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.docLockView, _set.docLockForms],
+                        lock: [_set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         caption: this.txtTurnon,
                         split: !this.appConfig.isReviewOnly,
                         enableToggle: true,
@@ -309,7 +309,7 @@ define([
                     this.btnPrev = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-review-prev',
-                        lock: [_set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.docLockView, _set.docLockForms],
+                        lock: [_set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         caption: this.txtPrev,
                         dataHint: '1',
                         dataHintDirection: 'bottom',
@@ -320,7 +320,7 @@ define([
                     this.btnNext = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-review-next',
-                        lock: [_set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.docLockView, _set.docLockForms],
+                        lock: [_set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         caption: this.txtNext,
                         dataHint: '1',
                         dataHintDirection: 'bottom',
@@ -336,7 +336,7 @@ define([
                         this.btnReviewView = new Common.UI.Button({
                             cls: 'btn-toolbar x-huge icon-top',
                             iconCls: 'toolbar__icon btn-ic-reviewview',
-                            lock: [_set.viewFormMode, _set.lostConnect, _set.docLockView, _set.docLockForms],
+                            lock: [_set.viewFormMode, _set.lostConnect, _set.docLockView, _set.docLockForms, _set.docLockComments],
                             caption: this.txtView,
                             menu: new Common.UI.Menu({
                                 cls: 'ppm-toolbar',
@@ -731,7 +731,7 @@ define([
                     var button = new Common.UI.Button({
                         cls         : 'btn-toolbar',
                         iconCls     : 'toolbar__icon btn-ic-review',
-                        lock: [Common.enumLock.viewMode, Common.enumLock.previewReviewMode, Common.enumLock.viewFormMode, Common.enumLock.lostConnect, Common.enumLock.docLockView, Common.enumLock.docLockForms],
+                        lock: [Common.enumLock.viewMode, Common.enumLock.previewReviewMode, Common.enumLock.viewFormMode, Common.enumLock.lostConnect, Common.enumLock.docLockView, Common.enumLock.docLockForms, Common.enumLock.docLockComments],
                         hintAnchor  : 'top',
                         hint        : this.tipReview,
                         split       : !this.appConfig.isReviewOnly,
@@ -778,7 +778,7 @@ define([
                     button = new Common.UI.Button({
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-ic-docspell',
-                        lock: [Common.enumLock.viewMode,  Common.enumLock.viewFormMode, Common.enumLock.previewReviewMode, Common.enumLock.docLockView, Common.enumLock.docLockForms],
+                        lock: [Common.enumLock.viewMode,  Common.enumLock.viewFormMode, Common.enumLock.previewReviewMode, Common.enumLock.docLockView, Common.enumLock.docLockForms, Common.enumLock.docLockComments],
                         hintAnchor  : 'top',
                         hint: this.tipSetSpelling,
                         enableToggle: true,
@@ -794,7 +794,7 @@ define([
                     button = new Common.UI.Button({
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-ic-doclang',
-                        lock: [Common.enumLock.viewMode, Common.enumLock.previewReviewMode, Common.enumLock.viewFormMode, Common.enumLock.noSpellcheckLangs, Common.enumLock.lostConnect, Common.enumLock.docLockView, Common.enumLock.docLockForms],
+                        lock: [Common.enumLock.viewMode, Common.enumLock.previewReviewMode, Common.enumLock.viewFormMode, Common.enumLock.noSpellcheckLangs, Common.enumLock.lostConnect, Common.enumLock.docLockView, Common.enumLock.docLockForms, Common.enumLock.docLockComments],
                         hintAnchor  : 'top',
                         hint: this.tipSetDocLang,
                         dataHint: '0',
diff --git a/apps/documenteditor/main/app/view/FormsTab.js b/apps/documenteditor/main/app/view/FormsTab.js
index 8300eb357..a95da5b75 100644
--- a/apps/documenteditor/main/app/view/FormsTab.js
+++ b/apps/documenteditor/main/app/view/FormsTab.js
@@ -169,7 +169,7 @@ define([
                     this.btnTextField = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-text-field',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.contentLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.contentLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         caption: this.capBtnText,
                         dataHint: '1',
                         dataHintDirection: 'bottom',
@@ -180,7 +180,7 @@ define([
                     this.btnComboBox = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-combo-box',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.contentLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.contentLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         caption: this.capBtnComboBox,
                         dataHint: '1',
                         dataHintDirection: 'bottom',
@@ -191,7 +191,7 @@ define([
                     this.btnDropDown = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-dropdown',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.contentLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.contentLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         caption: this.capBtnDropDown,
                         dataHint: '1',
                         dataHintDirection: 'bottom',
@@ -202,7 +202,7 @@ define([
                     this.btnCheckBox = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-checkbox',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.contentLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.contentLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         caption: this.capBtnCheckBox,
                         dataHint: '1',
                         dataHintDirection: 'bottom',
@@ -213,7 +213,7 @@ define([
                     this.btnRadioBox = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-radio-button',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.contentLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.contentLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         caption: this.capBtnRadioBox,
                         dataHint: '1',
                         dataHintDirection: 'bottom',
@@ -224,7 +224,7 @@ define([
                     this.btnImageField = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-insertimage',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.contentLock, _set.complexForm, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.contentLock, _set.complexForm, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         caption: this.capBtnImage,
                         dataHint: '1',
                         dataHintDirection: 'bottom',
@@ -235,7 +235,7 @@ define([
                     this.btnEmailField = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-email',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.contentLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.contentLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         caption: this.capBtnEmail,
                         dataHint: '1',
                         dataHintDirection: 'bottom',
@@ -246,7 +246,7 @@ define([
                     this.btnPhoneField = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-phone',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.contentLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.contentLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         caption: this.capBtnPhone,
                         dataHint: '1',
                         dataHintDirection: 'bottom',
@@ -257,7 +257,7 @@ define([
                     this.btnComplexField = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon complex-field',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.contentLock, _set.complexForm, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.contentLock, _set.complexForm, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         caption: this.capBtnComplex,
                         dataHint: '1',
                         dataHintDirection: 'bottom',
@@ -268,7 +268,7 @@ define([
                     this.btnViewForm = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-sheet-view',
-                        lock: [ _set.previewReviewMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                        lock: [ _set.previewReviewMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         caption: this.capBtnView,
                         enableToggle: true,
                         dataHint: '1',
@@ -280,7 +280,7 @@ define([
                     this.btnClearFields = new Common.UI.Button({
                         cls         : 'btn-toolbar',
                         iconCls     : 'toolbar__icon btn-clearstyle',
-                        lock: [ _set.previewReviewMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                        lock: [ _set.previewReviewMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockComments],
                         caption     : this.textClearFields,
                         dataHint    : '1',
                         dataHintDirection: 'left',
@@ -291,7 +291,7 @@ define([
                     this.btnHighlight = new Common.UI.ButtonColored({
                         cls         : 'btn-toolbar',
                         iconCls     : 'toolbar__icon btn-highlight',
-                        lock: [ _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                        lock: [ _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         caption     : this.textHighlight,
                         menu        : true,
                         additionalItems: [ this.mnuNoFormsColor = new Common.UI.MenuItem({
@@ -316,7 +316,7 @@ define([
                 this.btnPrevForm = new Common.UI.Button({
                     cls: 'btn-toolbar x-huge icon-top',
                     iconCls: 'toolbar__icon previous-field',
-                    lock: [ _set.previewReviewMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                    lock: [ _set.previewReviewMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockComments],
                     caption: this.capBtnPrev,
                     // disabled: this.appConfig.isEdit && this.appConfig.canFeatureContentControl && this.appConfig.canFeatureForms, // disable only for edit mode
                     dataHint: '1',
@@ -328,7 +328,7 @@ define([
                 this.btnNextForm = new Common.UI.Button({
                     cls: 'btn-toolbar x-huge icon-top',
                     iconCls: 'toolbar__icon next-field',
-                    lock: [ _set.previewReviewMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                    lock: [ _set.previewReviewMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockComments],
                     caption: this.capBtnNext,
                     // disabled: this.appConfig.isEdit && this.appConfig.canFeatureContentControl && this.appConfig.canFeatureForms, // disable only for edit mode,
                     dataHint: '1',
diff --git a/apps/documenteditor/main/app/view/Links.js b/apps/documenteditor/main/app/view/Links.js
index 4d9730111..92b15a761 100644
--- a/apps/documenteditor/main/app/view/Links.js
+++ b/apps/documenteditor/main/app/view/Links.js
@@ -169,13 +169,13 @@ define([
                     $host = me.toolbar.$el;
 
                 this.btnsContents = Common.Utils.injectButtons($host.find('.btn-slot.btn-contents'), '', 'toolbar__icon btn-contents', me.capBtnInsContents,
-                    [_set.inHeader, _set.richEditLock, _set.plainEditLock, _set.richDelLock, _set.plainDelLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                    [_set.inHeader, _set.richEditLock, _set.plainEditLock, _set.richDelLock, _set.plainDelLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                     true, true, undefined, '1', 'bottom', 'small');
                 this.btnsNotes = Common.Utils.injectButtons($host.find('.btn-slot.slot-notes'), '', 'toolbar__icon btn-notes', me.capBtnInsFootnote,
-                    [_set.paragraphLock, _set.inEquation, _set.inImage, _set.inHeader, _set.controlPlain, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                    [_set.paragraphLock, _set.inEquation, _set.inImage, _set.inHeader, _set.controlPlain, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                     true, true, undefined, '1', 'bottom', 'small');
                 this.btnsHyperlink = Common.Utils.injectButtons($host.find('.btn-slot.slot-inshyperlink'), '', 'toolbar__icon btn-inserthyperlink', me.capBtnInsLink,
-                    [_set.paragraphLock, _set.headerLock, _set.hyperlinkLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                    [_set.paragraphLock, _set.headerLock, _set.hyperlinkLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                     undefined, undefined, undefined, '1', 'bottom', 'small');
                 Array.prototype.push.apply(this.paragraphControls, this.btnsContents.concat(this.btnsNotes, this.btnsHyperlink));
 
@@ -183,7 +183,7 @@ define([
                     parentEl: $host.find('#slot-btn-contents-update'),
                     cls: 'btn-toolbar',
                     iconCls: 'toolbar__icon btn-update',
-                    lock: [ _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockForms],
+                    lock: [ _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockForms, _set.docLockComments],
                     caption: this.capBtnContentsUpdate,
                     split: true,
                     menu: true,
@@ -197,7 +197,7 @@ define([
                     parentEl: $host.find('#slot-btn-add-text'),
                     cls: 'btn-toolbar',
                     iconCls: 'toolbar__icon add-text',
-                    lock: [ _set.cantAddTextTOF, _set.inHeader, _set.inFootnote, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                    lock: [ _set.cantAddTextTOF, _set.inHeader, _set.inFootnote, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                     caption: this.capBtnAddText,
                     menu: new Common.UI.Menu({
                         items: []
@@ -212,7 +212,7 @@ define([
                     parentEl: $host.find('#slot-btn-bookmarks'),
                     cls: 'btn-toolbar x-huge icon-top',
                     iconCls: 'toolbar__icon btn-bookmarks',
-                    lock: [_set.paragraphLock, _set.inHeader, _set.headerLock, _set.controlPlain, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                    lock: [_set.paragraphLock, _set.inHeader, _set.headerLock, _set.controlPlain, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                     caption: this.capBtnBookmarks,
                     dataHint: '1',
                     dataHintDirection: 'bottom',
@@ -224,7 +224,7 @@ define([
                     parentEl: $host.find('#slot-btn-caption'),
                     cls: 'btn-toolbar x-huge icon-top',
                     iconCls: 'toolbar__icon btn-caption',
-                    lock: [_set.inHeader, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                    lock: [_set.inHeader, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                     caption: this.capBtnCaption,
                     dataHint: '1',
                     dataHintDirection: 'bottom',
@@ -236,7 +236,7 @@ define([
                     parentEl: $host.find('#slot-btn-crossref'),
                     cls: 'btn-toolbar x-huge icon-top',
                     iconCls: 'toolbar__icon btn-cross-reference',
-                    lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.richEditLock, _set.plainEditLock, _set.contentLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                    lock: [_set.paragraphLock, _set.headerLock, _set.controlPlain, _set.richEditLock, _set.plainEditLock, _set.contentLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                     caption: this.capBtnCrossRef,
                     dataHint: '1',
                     dataHintDirection: 'bottom',
@@ -248,7 +248,7 @@ define([
                     parentEl: $host.find('#slot-btn-tof'),
                     cls: 'btn-toolbar',
                     iconCls: 'toolbar__icon btn-contents',
-                    lock: [_set.inHeader, _set.richEditLock, _set.plainEditLock, _set.richDelLock, _set.plainDelLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                    lock: [_set.inHeader, _set.richEditLock, _set.plainEditLock, _set.richDelLock, _set.plainDelLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                     caption: this.capBtnTOF,
                     dataHint: '1',
                     dataHintDirection: 'left',
@@ -260,7 +260,7 @@ define([
                     parentEl: $host.find('#slot-btn-tof-update'),
                     cls: 'btn-toolbar',
                     iconCls: 'toolbar__icon btn-update',
-                    lock: [_set.paragraphLock, _set.inHeader, _set.richEditLock, _set.plainEditLock, _set.richDelLock, _set.plainDelLock, _set.cantUpdateTOF, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                    lock: [_set.paragraphLock, _set.inHeader, _set.richEditLock, _set.plainEditLock, _set.richDelLock, _set.plainDelLock, _set.cantUpdateTOF, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                     caption: this.capBtnContentsUpdate,
                     dataHint: '1',
                     dataHintDirection: 'left',
diff --git a/apps/documenteditor/main/app/view/Toolbar.js b/apps/documenteditor/main/app/view/Toolbar.js
index eedd0d7e1..91e638f15 100644
--- a/apps/documenteditor/main/app/view/Toolbar.js
+++ b/apps/documenteditor/main/app/view/Toolbar.js
@@ -249,7 +249,7 @@ define([
                         id: 'id-toolbar-btn-paste',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-paste',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockComments],
                         dataHint: '1',
                         dataHintDirection: 'top',
                         dataHintTitle: 'V'
@@ -260,7 +260,7 @@ define([
                         id: 'id-toolbar-btn-cut',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-cut',
-                        lock: [_set.copyLock, _set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.imageLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView],
+                        lock: [_set.copyLock, _set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.imageLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockComments],
                         dataHint: '1',
                         dataHintDirection: 'top',
                         dataHintTitle: 'X'
@@ -281,7 +281,7 @@ define([
                         id: 'id-toolbar-btn-incfont',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-incfont',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         dataHint: '1',
                         dataHintDirection: 'top'
                     });
@@ -291,7 +291,7 @@ define([
                         id: 'id-toolbar-btn-decfont',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-decfont',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         dataHint: '1',
                         dataHintDirection: 'top'
                     });
@@ -301,7 +301,7 @@ define([
                         id: 'id-toolbar-btn-bold',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-bold',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         enableToggle: true,
                         dataHint: '1',
                         dataHintDirection: 'bottom'
@@ -312,7 +312,7 @@ define([
                         id: 'id-toolbar-btn-italic',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-italic',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         enableToggle: true,
                         dataHint: '1',
                         dataHintDirection: 'bottom'
@@ -323,7 +323,7 @@ define([
                         id: 'id-toolbar-btn-underline',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-underline',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         enableToggle: true,
                         dataHint: '1',
                         dataHintDirection: 'bottom'
@@ -334,7 +334,7 @@ define([
                         id: 'id-toolbar-btn-strikeout',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-strikeout',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         enableToggle: true,
                         dataHint: '1',
                         dataHintDirection: 'bottom'
@@ -345,7 +345,7 @@ define([
                         id: 'id-toolbar-btn-superscript',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-superscript',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inEquation, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inEquation, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         enableToggle: true,
                         toggleGroup: 'superscriptGroup',
                         dataHint: '1',
@@ -357,7 +357,7 @@ define([
                         id: 'id-toolbar-btn-subscript',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-subscript',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inEquation, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inEquation, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         enableToggle: true,
                         toggleGroup: 'superscriptGroup',
                         dataHint: '1',
@@ -370,7 +370,7 @@ define([
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-highlight',
                         lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inChart, _set.inSmartart, _set.inSmartartInternal, _set.previewReviewMode, _set.viewFormMode,
-                                _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                                _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         enableToggle: true,
                         allowDepress: true,
                         split: true,
@@ -395,7 +395,7 @@ define([
                         id: 'id-toolbar-btn-fontcolor',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-fontcolor',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         split: true,
                         menu: true,
                         auto: true,
@@ -410,7 +410,7 @@ define([
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-paracolor',
                         lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inChart, _set.inSmartart, _set.inSmartartInternal, _set.previewReviewMode, _set.viewFormMode,
-                                _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                                _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         split: true,
                         transparent: true,
                         menu: true,
@@ -425,7 +425,7 @@ define([
                         id: 'id-toolbar-btn-case',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-change-case',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         menu: new Common.UI.Menu({
                             items: [
                                 {caption: this.mniSentenceCase, value: Asc.c_oAscChangeTextCaseType.SentenceCase},
@@ -444,7 +444,7 @@ define([
                         id: 'id-toolbar-btn-align-left',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-align-left',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         enableToggle: true,
                         toggleGroup: 'alignGroup',
                         dataHint: '1',
@@ -456,7 +456,7 @@ define([
                         id: 'id-toolbar-btn-align-center',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-align-center',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         enableToggle: true,
                         toggleGroup: 'alignGroup',
                         dataHint: '1',
@@ -468,7 +468,7 @@ define([
                         id: 'id-toolbar-btn-align-right',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-align-right',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         enableToggle: true,
                         toggleGroup: 'alignGroup',
                         dataHint: '1',
@@ -480,7 +480,7 @@ define([
                         id: 'id-toolbar-btn-align-just',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-align-just',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         enableToggle: true,
                         toggleGroup: 'alignGroup',
                         dataHint: '1',
@@ -492,7 +492,7 @@ define([
                         id: 'id-toolbar-btn-decoffset',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-decoffset',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inSmartartInternal, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inSmartartInternal, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         dataHint: '1',
                         dataHintDirection: 'top'
                     });
@@ -502,7 +502,7 @@ define([
                         id: 'id-toolbar-btn-incoffset',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-incoffset',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inSmartartInternal, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inSmartartInternal, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         dataHint: '1',
                         dataHintDirection: 'top'
                     });
@@ -512,7 +512,7 @@ define([
                         id: 'id-toolbar-btn-linespace',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-linespace',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         menu: new Common.UI.Menu({
                             style: 'min-width: 60px;',
                             items: [
@@ -534,7 +534,7 @@ define([
                         id: 'id-toolbar-btn-hidenchars',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-paragraph',
-                        lock: [ _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                        lock: [ _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         enableToggle: true,
                         split: true,
                         menu: new Common.UI.Menu({
@@ -555,7 +555,7 @@ define([
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-setmarkers',
                         lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inChart, _set.inSmartart, _set.inSmartartInternal, _set.previewReviewMode, _set.viewFormMode,
-                            _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                            _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         enableToggle: true,
                         toggleGroup: 'markersGroup',
                         split: true,
@@ -572,7 +572,7 @@ define([
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-numbering',
                         lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inChart, _set.inSmartart, _set.inSmartartInternal,  _set.previewReviewMode, _set.viewFormMode,
-                            _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                            _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         enableToggle: true,
                         toggleGroup: 'markersGroup',
                         split: true,
@@ -589,7 +589,7 @@ define([
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-multilevels',
                         lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inChart, _set.inSmartart, _set.inSmartartInternal, _set.previewReviewMode, _set.viewFormMode,
-                                _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                                _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         menu: true,
                         dataHint: '1',
                         dataHintDirection: 'top',
@@ -622,7 +622,7 @@ define([
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-inserttable',
                         lock: [_set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inEquation, _set.controlPlain, _set.richDelLock, _set.plainDelLock, _set.cantAddTable, _set.previewReviewMode,
-                            _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                            _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         caption: me.capBtnInsTable,
                         menu: new Common.UI.Menu({
                             items: [
@@ -645,7 +645,7 @@ define([
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-insertimage',
                         lock: [_set.paragraphLock, _set.headerLock, _set.inEquation, _set.controlPlain, _set.richDelLock, _set.plainDelLock,  _set.contentLock,  _set.cantAddImagePara,
-                                _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                                _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         caption: me.capBtnInsImage,
                         menu: new Common.UI.Menu({
                             items: [
@@ -666,7 +666,7 @@ define([
                         caption: me.capBtnInsChart,
                         iconCls: 'toolbar__icon btn-insertchart',
                         lock: [ _set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.controlPlain, _set.richDelLock, _set.plainDelLock, _set.contentLock,
-                                _set.chartLock, _set.cantAddChart, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                                _set.chartLock, _set.cantAddChart, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         menu: true,
                         dataHint: '1',
                         dataHintDirection: 'bottom',
@@ -679,7 +679,7 @@ define([
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-text',
                         lock: [_set.paragraphLock, _set.headerLock, _set.inEquation, _set.controlPlain, _set.contentLock, _set.inFootnote, _set.previewReviewMode, _set.viewFormMode,
-                            _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                            _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         caption: me.capBtnInsTextbox,
                         enableToggle: true,
                         dataHint: '1',
@@ -693,7 +693,7 @@ define([
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-textart',
                         lock: [_set.paragraphLock, _set.headerLock, _set.inEquation, _set.controlPlain, _set.richDelLock, _set.plainDelLock, _set.contentLock, _set.inFootnote, _set.cantAddImagePara,
-                            _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                            _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         caption: me.capBtnInsTextart,
                         menu: new Common.UI.Menu({
                             cls: 'menu-shapes',
@@ -711,7 +711,7 @@ define([
                         id: 'id-toolbar-btn-editheader',
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-editheader',
-                        lock: [ _set.previewReviewMode, _set.viewFormMode, _set.inEquation, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                        lock: [ _set.previewReviewMode, _set.viewFormMode, _set.inEquation, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         caption: me.capBtnInsHeader,
                         menu: true,
                         dataHint: '1',
@@ -745,7 +745,7 @@ define([
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-datetime',
                         lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.richDelLock, _set.plainDelLock, _set.noParagraphSelected, _set.previewReviewMode,
-                            _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                            _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         caption: me.capBtnDateTime,
                         dataHint: '1',
                         dataHintDirection: 'bottom',
@@ -758,7 +758,7 @@ define([
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-blankpage',
                         lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inEquation, _set.richDelLock, _set.plainDelLock, _set.inHeader,  _set.inFootnote,  _set.inControl,
-                            _set.cantPageBreak, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                            _set.cantPageBreak, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         caption: me.capBtnBlankPage,
                         dataHint: '1',
                         dataHintDirection: 'bottom',
@@ -771,7 +771,7 @@ define([
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-insertshape',
                         lock: [_set.paragraphLock, _set.headerLock, _set.inEquation, _set.controlPlain,  _set.contentLock,  _set.inFootnote, _set.previewReviewMode, _set.viewFormMode,
-                                _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                                _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         caption: me.capBtnInsShape,
                         enableToggle: true,
                         menu: new Common.UI.Menu({cls: 'menu-shapes menu-insert-shape'}),
@@ -786,7 +786,7 @@ define([
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-insertequation',
                         lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inChart, _set.controlPlain, _set.richDelLock, _set.plainDelLock, _set.cantAddEquation,
-                            _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                            _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         caption: me.capBtnInsEquation,
                         split: true,
                         menu: new Common.UI.Menu({cls: 'menu-shapes'}),
@@ -801,7 +801,7 @@ define([
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-symbol',
                         lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.richDelLock, _set.plainDelLock, _set.noParagraphSelected, _set.previewReviewMode,
-                            _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                            _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         caption: me.capBtnInsSymbol,
                         dataHint: '1',
                         dataHintDirection: 'bottom',
@@ -814,7 +814,7 @@ define([
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-dropcap',
                         lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inEquation, _set.controlPlain, _set.dropcapLock, _set.previewReviewMode, _set.viewFormMode,
-                            _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                            _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         caption: me.capBtnInsDropcap,
                         menu: new Common.UI.Menu({
                             cls: 'ppm-toolbar shifted-right',
@@ -858,7 +858,7 @@ define([
                         id: 'tlbtn-controls',
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-controls',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         caption: me.capBtnInsControls,
                         menu: new Common.UI.Menu({
                             cls: 'ppm-toolbar shifted-right',
@@ -944,7 +944,7 @@ define([
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-columns',
                         lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.controlPlain, _set.inImage, _set.docPropsLock, _set.previewReviewMode, _set.viewFormMode,
-                            _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                            _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         caption: me.capBtnColumns,
                         menu: new Common.UI.Menu({
                             cls: 'ppm-toolbar shifted-right',
@@ -1003,7 +1003,7 @@ define([
                         id: 'tlbtn-pageorient',
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-pageorient',
-                        lock: [_set.docPropsLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                        lock: [_set.docPropsLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         caption: me.capBtnPageOrient,
                         menu: new Common.UI.Menu({
                             cls: 'ppm-toolbar',
@@ -1045,7 +1045,7 @@ define([
                         id: 'tlbtn-pagemargins',
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-pagemargins',
-                        lock: [_set.docPropsLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                        lock: [_set.docPropsLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         caption: me.capBtnMargins,
                         menu: new Common.UI.Menu({
                             items: [
@@ -1108,7 +1108,7 @@ define([
                         id: 'tlbtn-pagesize',
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-pagesize',
-                        lock: [_set.docPropsLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                        lock: [_set.docPropsLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         caption: me.capBtnPageSize,
                         menu: new Common.UI.Menu({
                             restoreHeight: true,
@@ -1232,7 +1232,7 @@ define([
                         id: 'tlbtn-line-numbers',
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-line-numbering',
-                        lock: [_set.docPropsLock, _set.inImagePara, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                        lock: [_set.docPropsLock, _set.inImagePara, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         caption: me.capBtnLineNumbers,
                         menu: new Common.UI.Menu({
                             cls: 'ppm-toolbar',
@@ -1285,7 +1285,7 @@ define([
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-clearstyle',
                         lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inChart, _set.inSmartart, _set.inSmartartInternal, _set.previewReviewMode, _set.viewFormMode,
-                            _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                            _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         dataHint: '1',
                         dataHintDirection: 'top'
                     });
@@ -1295,7 +1295,7 @@ define([
                         id: 'id-toolbar-btn-copystyle',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-copystyle',
-                        lock: [ _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                        lock: [ _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         enableToggle: true,
                         dataHint: '1',
                         dataHintDirection: 'bottom'
@@ -1306,7 +1306,7 @@ define([
                         id: 'id-toolbar-btn-colorschemas',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-colorschemas',
-                        lock: [_set.docSchemaLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                        lock: [_set.docSchemaLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         menu: new Common.UI.Menu({
                             cls: 'shifted-left',
                             items: [],
@@ -1322,7 +1322,7 @@ define([
                         id: 'id-toolbar-btn-mailrecepients',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon btn-mailmerge',
-                        lock: [_set.mmergeLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                        lock: [_set.mmergeLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         dataHint: '1',
                         dataHintDirection: 'bottom',
                         menu: new Common.UI.Menu({
@@ -1338,7 +1338,7 @@ define([
                     me.btnImgAlign = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-img-align',
-                        lock: [_set.imageLock, _set.contentLock, _set.inImageInline, _set.noObjectSelected, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                        lock: [_set.imageLock, _set.contentLock, _set.inImageInline, _set.noObjectSelected, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         caption: me.capImgAlign,
                         menu: true,
                         dataHint: '1',
@@ -1349,7 +1349,7 @@ define([
                     me.btnImgGroup = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-img-group',
-                        lock: [_set.imageLock, _set.contentLock, _set.inImageInline, _set.noObjectSelected, _set.cantGroup, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                        lock: [_set.imageLock, _set.contentLock, _set.inImageInline, _set.noObjectSelected, _set.cantGroup, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         caption: me.capImgGroup,
                         menu: true,
                         dataHint: '1',
@@ -1359,7 +1359,7 @@ define([
                     me.btnImgForward = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-img-frwd',
-                        lock: [_set.cantArrange, _set.lostConnect, _set.contentLock, _set.noObjectSelected, _set.inSmartartInternal, _set.previewReviewMode, _set.viewFormMode, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                        lock: [_set.cantArrange, _set.lostConnect, _set.contentLock, _set.noObjectSelected, _set.inSmartartInternal, _set.previewReviewMode, _set.viewFormMode, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         caption: me.capImgForward,
                         split: true,
                         menu: true,
@@ -1370,7 +1370,7 @@ define([
                     me.btnImgBackward = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-img-bkwd',
-                        lock: [_set.cantArrange, _set.lostConnect, _set.contentLock, _set.noObjectSelected, _set.inSmartartInternal, _set.previewReviewMode, _set.viewFormMode, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                        lock: [_set.cantArrange, _set.lostConnect, _set.contentLock, _set.noObjectSelected, _set.inSmartartInternal, _set.previewReviewMode, _set.viewFormMode, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         caption: me.capImgBackward,
                         split: true,
                         menu: true,
@@ -1381,7 +1381,7 @@ define([
                     me.btnImgWrapping = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-img-wrap',
-                        lock: [_set.cantWrap, _set.imageLock, _set.contentLock, _set.noObjectSelected, _set.lostConnect, _set.previewReviewMode, _set.viewFormMode, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                        lock: [_set.cantWrap, _set.imageLock, _set.contentLock, _set.noObjectSelected, _set.lostConnect, _set.previewReviewMode, _set.viewFormMode, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         caption: me.capImgWrapping,
                         menu: true,
                         dataHint: '1',
@@ -1392,7 +1392,7 @@ define([
                     me.btnWatermark = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-watermark',
-                        lock: [_set.headerLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                        lock: [_set.headerLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         caption: me.capBtnWatermark,
                         menu: new Common.UI.Menu({
                             cls: 'ppm-toolbar',
@@ -1431,7 +1431,7 @@ define([
                     this.cmbFontSize = new Common.UI.ComboBox({
                         cls: 'input-group-nr',
                         menuStyle: 'min-width: 55px;',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         hint: this.tipFontSize,
                         data: [
                             {value: 8, displayValue: "8"},
@@ -1461,7 +1461,7 @@ define([
                         cls: 'input-group-nr',
                         menuCls: 'scrollable-menu',
                         menuStyle: 'min-width: 325px;',
-                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                        lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         hint: this.tipFontName,
                         store: new Common.Collections.Fonts(),
                         dataHint: '1',
@@ -1480,7 +1480,7 @@ define([
                     this.listStyles = new Common.UI.ComboDataView({
                         cls: 'combo-styles',
                         lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inChart, _set.inSmartart, _set.inSmartartInternal, _set.previewReviewMode,
-                            _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms],
+                            _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockView, _set.docLockForms, _set.docLockComments],
                         itemWidth: itemWidth,
                         itemHeight: itemHeight,
                         style: 'min-width:150px;',
@@ -1738,7 +1738,7 @@ define([
                 this.btnsPageBreak = Common.Utils.injectButtons($host.find('.btn-slot.btn-pagebreak'), '', 'toolbar__icon btn-pagebreak', this.capBtnInsPagebreak,
                     [Common.enumLock.paragraphLock, Common.enumLock.headerLock, Common.enumLock.richEditLock, Common.enumLock.plainEditLock, Common.enumLock.inEquation, Common.enumLock.richDelLock,
                         Common.enumLock.plainDelLock, Common.enumLock.inHeader, Common.enumLock.inFootnote, Common.enumLock.inControl, Common.enumLock.cantPageBreak, Common.enumLock.previewReviewMode,
-                        Common.enumLock.viewFormMode, Common.enumLock.lostConnect, Common.enumLock.disableOnStart, Common.enumLock.docLockView, Common.enumLock.docLockForms],
+                        Common.enumLock.viewFormMode, Common.enumLock.lostConnect, Common.enumLock.disableOnStart, Common.enumLock.docLockView, Common.enumLock.docLockForms, Common.enumLock.docLockComments],
                         true, true, undefined, '1', 'bottom', 'small');
                 Array.prototype.push.apply(this.paragraphControls, this.btnsPageBreak);
                 Array.prototype.push.apply(this.lockControls, this.btnsPageBreak);

From f8b95b54ab0bffb4819613acac49c559c6c2794f Mon Sep 17 00:00:00 2001
From: Julia Radzhabova <julia.radzhabova@onlyoffice.com>
Date: Mon, 26 Sep 2022 18:37:20 +0300
Subject: [PATCH 06/28] [DE] Refactoring document protection

---
 apps/common/main/lib/controller/Comments.js   | 34 +++++++++++-------
 .../main/lib/controller/ReviewChanges.js      | 31 ++++++++--------
 apps/common/main/lib/util/utils.js            | 18 +++++++++-
 .../main/app/controller/DocProtection.js      | 17 +++++----
 .../main/app/controller/DocumentHolder.js     | 35 +++++++------------
 .../main/app/controller/FormsTab.js           | 21 +++++------
 .../main/app/controller/LeftMenu.js           | 24 ++++++-------
 .../main/app/controller/Links.js              | 31 ++++++++++------
 .../main/app/controller/PageLayout.js         | 15 --------
 .../main/app/controller/RightMenu.js          | 34 +++++++++---------
 .../main/app/controller/Statusbar.js          |  9 -----
 .../main/app/controller/Toolbar.js            | 21 +++++------
 .../main/app/view/DocumentHolder.js           | 10 +++---
 apps/documenteditor/main/app/view/Links.js    |  1 -
 .../documenteditor/main/app/view/Statusbar.js | 22 +++++++-----
 15 files changed, 168 insertions(+), 155 deletions(-)

diff --git a/apps/common/main/lib/controller/Comments.js b/apps/common/main/lib/controller/Comments.js
index a8357d176..160701fc7 100644
--- a/apps/common/main/lib/controller/Comments.js
+++ b/apps/common/main/lib/controller/Comments.js
@@ -144,12 +144,15 @@ define([
                     }
                 }, this, area);
             }.bind(this));
+            Common.NotificationCenter.on('app:ready', this.onAppReady.bind(this));
             Common.NotificationCenter.on('protect:doclock', _.bind(this.onChangeProtectDocument, this));
         },
         onLaunch: function () {
             var filter = Common.localStorage.getKeysFilter();
             this.appPrefix = (filter && filter.length) ? filter.split(',')[0] : '';
-            this._state = {viewmode: false};
+            this._state = {
+                disableEditing: false // disable editing when disconnect/signed file/mail merge preview/review final or original/forms preview
+            };
 
             this.collection                     =   this.getApplication().getCollection('Common.Collections.Comments');
             this.setComparator();
@@ -1647,14 +1650,13 @@ define([
         },
 
         setPreviewMode: function(mode) {
-            this._state.viewmode = mode;
+            this._state.disableEditing = mode;
             this.updatePreviewMode();
         },
 
         updatePreviewMode: function() {
-            var lockMode = this._state.docProtection ? this._state.docProtection.lockMode : undefined;
-            lockMode = (lockMode===Asc.c_oAscProtection.View || lockMode===Asc.c_oAscProtection.Forms);
-            var viewmode = this._state.viewmode || lockMode;
+            var docProtection = Common.Utils.Store.get('docProtection', {});
+            var viewmode = this._state.disableEditing || !!docProtection.isReadOnly || !!docProtection.isFormsOnly;
 
             if (this.viewmode === viewmode) return;
             this.viewmode = viewmode;
@@ -1732,15 +1734,23 @@ define([
             this.updateComments(true);
         },
 
-        onChangeProtectDocument: function(props) {
-            if (!props) {
-                var docprotect = this.getApplication().getController('DocProtection');
-                props = docprotect ? docprotect.getDocProps() : null;
+        onAppReady: function (config) {
+            var me = this;
+            (new Promise(function (accept, reject) {
+                accept();
+            })).then(function(){
+                me.onChangeProtectDocument();
+            });
+        },
+
+        onChangeProtectDocument: function() {
+            var docProtection = Common.Utils.Store.get('docProtection');
+            if (!docProtection) {
+                var cntrl = this.getApplication().getController('DocProtection');
+                docProtection = cntrl ? cntrl.getDocProps() : null;
             }
-            if (props) {
-                this._state.docProtection = props;
+            if (docProtection)
                 this.updatePreviewMode();
-            }
         }
 
     }, Common.Controllers.Comments || {}));
diff --git a/apps/common/main/lib/controller/ReviewChanges.js b/apps/common/main/lib/controller/ReviewChanges.js
index b395255a8..94c912933 100644
--- a/apps/common/main/lib/controller/ReviewChanges.js
+++ b/apps/common/main/lib/controller/ReviewChanges.js
@@ -102,7 +102,9 @@ define([
             this.userCollection =   this.getApplication().getCollection('Common.Collections.Users');
             this.viewmode = false;
 
-            this._state = {posx: -1000, posy: -1000, popoverVisible: false, previewMode: false, compareSettings: null, wsLock: false, wsProps: [], viewmode: false};
+            this._state = { posx: -1000, posy: -1000, popoverVisible: false, previewMode: false, compareSettings: null, wsLock: false, wsProps: [],
+                            disableEditing: false // disable editing when disconnect/signed file/mail merge preview/review final or original/forms preview
+                          };
 
             Common.NotificationCenter.on('reviewchanges:turn', this.onTurnPreview.bind(this));
             Common.NotificationCenter.on('spelling:turn', this.onTurnSpelling.bind(this));
@@ -180,14 +182,13 @@ define([
         },
 
         setPreviewMode: function(mode) { //disable accept/reject in popover
-            this._state.viewmode = mode;
+            this._state.disableEditing = mode;
             this.updatePreviewMode();
         },
 
         updatePreviewMode: function() {
-            var lockMode = this._state.docProtection ? this._state.docProtection.lockMode : undefined;
-            lockMode = (lockMode===Asc.c_oAscProtection.View || lockMode===Asc.c_oAscProtection.Forms || lockMode===Asc.c_oAscProtection.Comments);
-            var viewmode = this._state.viewmode || lockMode;
+            var docProtection = Common.Utils.Store.get('docProtection', {});
+            var viewmode = this._state.disableEditing || !!docProtection.isReadOnly || !!docProtection.isFormsOnly || !!docProtection.isCommentsOnly;
 
             if (this.viewmode === viewmode) return;
             this.viewmode = viewmode;
@@ -1022,17 +1023,17 @@ define([
             this.lockToolbar(Common.enumLock['Objects'], !!this._state.wsProps['Objects'], {array: [this.view.btnCommentRemove, this.view.btnCommentResolve]});
         },
 
-        onChangeProtectDocument: function(props) {
-            if (!props) {
-                var docprotect = this.getApplication().getController('DocProtection');
-                props = docprotect ? docprotect.getDocProps() : null;
+        onChangeProtectDocument: function() {
+            var docProtection = Common.Utils.Store.get('docProtection');
+            if (!docProtection) {
+                var cntrl = this.getApplication().getController('DocProtection');
+                docProtection = cntrl ? cntrl.getDocProps() : null;
             }
-            if (props) {
-                this._state.docProtection = props;
-                this.lockToolbar(Common.enumLock.docLockView, props.docLock && (props.lockMode===Asc.c_oAscProtection.View));
-                this.lockToolbar(Common.enumLock.docLockForms, props.docLock && (props.lockMode===Asc.c_oAscProtection.Forms));
-                this.lockToolbar(Common.enumLock.docLockReview, props.docLock && (props.lockMode===Asc.c_oAscProtection.Review));
-                this.lockToolbar(Common.enumLock.docLockComments, props.docLock && (props.lockMode===Asc.c_oAscProtection.Comments));
+            if (docProtection) {
+                this.lockToolbar(Common.enumLock.docLockView, docProtection.isReadOnly);
+                this.lockToolbar(Common.enumLock.docLockForms, docProtection.isFormsOnly);
+                this.lockToolbar(Common.enumLock.docLockReview, docProtection.isReviewOnly);
+                this.lockToolbar(Common.enumLock.docLockComments, docProtection.isCommentsOnly);
                 this.updatePreviewMode();
             }
         },
diff --git a/apps/common/main/lib/util/utils.js b/apps/common/main/lib/util/utils.js
index b1d58e132..78d492cc4 100644
--- a/apps/common/main/lib/util/utils.js
+++ b/apps/common/main/lib/util/utils.js
@@ -1095,4 +1095,20 @@ Common.Utils.getKeyByValue = function(obj, value) {
                 return prop;
         }
     }
-};
\ No newline at end of file
+};
+
+Common.Utils.Store = new(function() {
+    var settings = {};
+
+    var _get = function(name, defValue) {
+            return (settings[name]!==undefined) ? settings[name] : defValue;
+        },
+        _set = function(name, value) {
+            settings[name] = value;
+        };
+
+    return {
+        get: _get,
+        set: _set
+    }
+});
\ No newline at end of file
diff --git a/apps/documenteditor/main/app/controller/DocProtection.js b/apps/documenteditor/main/app/controller/DocProtection.js
index 0be9788b0..72acd53df 100644
--- a/apps/documenteditor/main/app/controller/DocProtection.js
+++ b/apps/documenteditor/main/app/controller/DocProtection.js
@@ -190,6 +190,7 @@ define([
                 resolve();
             })).then(function () {
                 // me.view.btnProtectDoc.toggle(me.api.asc_isProtectedDocument(), true);
+                // me.onChangeProtectDocument();
             });
         },
 
@@ -197,14 +198,14 @@ define([
             // var isProtected = this.api.asc_isProtectedDocument();
             var isProtected = this.view.btnProtectDoc.isActive(); // test
             this.view && this.view.btnProtectDoc.toggle(isProtected, true);
-            var props = this.getDocProps(true);
-            Common.NotificationCenter.trigger('protect:doclock', props);
+            this.getDocProps(true);
+            Common.NotificationCenter.trigger('protect:doclock');
         },
 
         getDocProps: function(update) {
             if (!this.appConfig || !this.appConfig.isEdit && !this.appConfig.isRestrictedEdit) return;
 
-            if (update || !this._state.docProtection) {
+            if (update || !Common.Utils.Store.get('docProtection')) {
                 // var docProtected = !!this.api.asc_isProtectedDocument(),
                 //     type;
                 //
@@ -221,10 +222,14 @@ define([
                     type = Common.Utils.InternalSettings.get('protect-test-type');
                 }
                 /////////////
-                this._state.docProtection = {docLock: docProtected, lockMode: type};
+                Common.Utils.Store.set('docProtection', {
+                    isReadOnly: type===Asc.c_oAscProtection.View,
+                    isCommentsOnly: type===Asc.c_oAscProtection.Comments,
+                    isReviewOnly: type===Asc.c_oAscProtection.Review,
+                    isFormsOnly: type===Asc.c_oAscProtection.Forms
+                });
             }
-
-            return this._state.docProtection;
+            return Common.Utils.Store.get('docProtection');
         }
 
     }, DE.Controllers.DocProtection || {}));
diff --git a/apps/documenteditor/main/app/controller/DocumentHolder.js b/apps/documenteditor/main/app/controller/DocumentHolder.js
index 4fdab482b..3fe44e89c 100644
--- a/apps/documenteditor/main/app/controller/DocumentHolder.js
+++ b/apps/documenteditor/main/app/controller/DocumentHolder.js
@@ -226,7 +226,6 @@ define([
                     this.api.asc_registerCallback('asc_onShowContentControlsActions',_.bind(this.onShowContentControlsActions, this));
                     this.api.asc_registerCallback('asc_onHideContentControlsActions',_.bind(this.onHideContentControlsActions, this));
                 }
-                Common.NotificationCenter.on('protect:doclock', _.bind(this.onChangeProtectDocument, this));
                 this.documentHolder.setApi(this.api);
             }
 
@@ -585,8 +584,8 @@ define([
         showObjectMenu: function(event, docElement, eOpts){
             var me = this;
             if (me.api){
-                var lockMode = this.documentHolder.docProtection ? this.documentHolder.docProtection.lockMode : undefined;
-                var obj = (me.mode.isEdit && !(me._isDisabled || lockMode===Asc.c_oAscProtection.View || lockMode===Asc.c_oAscProtection.Comments || lockMode===Asc.c_oAscProtection.Forms)) ?
+                var docProtection = Common.Utils.Store.get('docProtection', {});
+                var obj = (me.mode.isEdit && !(me._isDisabled || docProtection.isReadOnly || docProtection.isFormsOnly || docProtection.isCommentsOnly)) ?
                             me.fillMenuProps(me.api.getSelectedElements()) : me.fillViewMenuProps(me.api.getSelectedElements());
                 if (obj) me.showPopupMenu(obj.menu_to_show, obj.menu_props, event, docElement, eOpts);
             }
@@ -614,8 +613,8 @@ define([
             var me = this,
                 currentMenu = me.documentHolder.currentMenu;
             if (currentMenu && currentMenu.isVisible() && currentMenu !== me.documentHolder.hdrMenu){
-                var lockMode = me.documentHolder.docProtection ? me.documentHolder.docProtection.lockMode : undefined;
-                var obj = (me.mode.isEdit && !(me._isDisabled || lockMode===Asc.c_oAscProtection.View || lockMode===Asc.c_oAscProtection.Comments || lockMode===Asc.c_oAscProtection.Forms)) ?
+                var docProtection = Common.Utils.Store.get('docProtection', {});
+                var obj = (me.mode.isEdit && !(me._isDisabled || docProtection.isReadOnly || docProtection.isFormsOnly || docProtection.isCommentsOnly)) ?
                             me.fillMenuProps(selectedElements) : me.fillViewMenuProps(selectedElements);
                 if (obj) {
                     if (obj.menu_to_show===currentMenu) {
@@ -828,8 +827,8 @@ define([
         onDialogAddHyperlink: function() {
             var me = this;
             var win, props, text;
-            var lockMode = me.documentHolder.docProtection ? me.documentHolder.docProtection.lockMode : undefined;
-            if (me.api && me.mode.isEdit && !(me._isDisabled || lockMode===Asc.c_oAscProtection.View || lockMode===Asc.c_oAscProtection.Comments || lockMode===Asc.c_oAscProtection.Forms) && !me.getApplication().getController('LeftMenu').leftMenu.menuFile.isVisible()){
+            var docProtection = Common.Utils.Store.get('docProtection', {});
+            if (me.api && me.mode.isEdit && !(me._isDisabled || docProtection.isReadOnly || docProtection.isFormsOnly || docProtection.isCommentsOnly) && !me.getApplication().getController('LeftMenu').leftMenu.menuFile.isVisible()){
                 var handlerDlg = function(dlg, result) {
                     if (result == 'ok') {
                         props = dlg.getSettings();
@@ -1185,8 +1184,8 @@ define([
         },
 
         onDoubleClickOnChart: function(chart) {
-            var lockMode = this.documentHolder.docProtection ? this.documentHolder.docProtection.lockMode : undefined;
-            if (this.mode.isEdit && !(this._isDisabled || lockMode===Asc.c_oAscProtection.View || lockMode===Asc.c_oAscProtection.Comments || lockMode===Asc.c_oAscProtection.Forms)) {
+            var docProtection = Common.Utils.Store.get('docProtection', {});
+            if (this.mode.isEdit && !(this._isDisabled || docProtection.isReadOnly || docProtection.isFormsOnly || docProtection.isCommentsOnly)) {
                 var diagramEditor = this.getApplication().getController('Common.Controllers.ExternalDiagramEditor').getView('Common.Views.ExternalDiagramEditor');
                 if (diagramEditor && chart) {
                     diagramEditor.setEditMode(true);
@@ -1197,8 +1196,8 @@ define([
         },
 
         onDoubleClickOnTableOleObject: function(chart) {
-            var lockMode = this.documentHolder.docProtection ? this.documentHolder.docProtection.lockMode : undefined;
-            if (this.mode.isEdit && !(this._isDisabled || lockMode===Asc.c_oAscProtection.View || lockMode===Asc.c_oAscProtection.Comments || lockMode===Asc.c_oAscProtection.Forms)) {
+            var docProtection = Common.Utils.Store.get('docProtection', {});
+            if (this.mode.isEdit && !(this._isDisabled || docProtection.isReadOnly || docProtection.isFormsOnly || docProtection.isCommentsOnly)) {
                 var oleEditor = this.getApplication().getController('Common.Controllers.ExternalOleEditor').getView('Common.Views.ExternalOleEditor');
                 if (oleEditor && chart) {
                     oleEditor.setEditMode(true);
@@ -1902,8 +1901,8 @@ define([
                     this.api.asc_ViewCertificate(datavalue); //certificate id
                     break;
                 case 2:
-                    var lockMode = this.documentHolder.docProtection ? this.documentHolder.docProtection.lockMode : undefined;
-                    Common.NotificationCenter.trigger('protect:signature', 'visible', this._isDisabled || lockMode===Asc.c_oAscProtection.View || lockMode===Asc.c_oAscProtection.Comments || lockMode===Asc.c_oAscProtection.Forms, datavalue);//guid, can edit settings for requested signature
+                    var docProtection = Common.Utils.Store.get('docProtection', {});
+                    Common.NotificationCenter.trigger('protect:signature', 'visible', this._isDisabled || !!docProtection.isReadOnly || !!docProtection.isFormsOnly || !!docProtection.isCommentsOnly, datavalue);//guid, can edit settings for requested signature
                     break;
                 case 3:
                     var me = this;
@@ -2318,16 +2317,6 @@ define([
 
         editComplete: function() {
             this.documentHolder && this.documentHolder.fireEvent('editcomplete', this.documentHolder);
-        },
-
-        onChangeProtectDocument: function(props) {
-            if (!props) {
-                var docprotect = this.getApplication().getController('DocProtection');
-                props = docprotect ? docprotect.getDocProps() : null;
-            }
-            if (props) {
-                this.documentHolder && (this.documentHolder.docProtection = props);
-            }
         }
     });
 });
\ No newline at end of file
diff --git a/apps/documenteditor/main/app/controller/FormsTab.js b/apps/documenteditor/main/app/controller/FormsTab.js
index a9ee02625..b43d56a8c 100644
--- a/apps/documenteditor/main/app/controller/FormsTab.js
+++ b/apps/documenteditor/main/app/controller/FormsTab.js
@@ -378,6 +378,7 @@ define([
                     me.view.btnHighlight.currentColor = clr;
                 }
                 config.isEdit && config.canFeatureContentControl && config.isFormCreator && me.showCreateFormTip(); // show tip only when create form in docxf
+                me.onChangeProtectDocument();
             });
         },
 
@@ -433,18 +434,18 @@ define([
             }
         },
 
-        onChangeProtectDocument: function(props) {
-            if (!props) {
-                var docprotect = this.getApplication().getController('DocProtection');
-                props = docprotect ? docprotect.getDocProps() : null;
+        onChangeProtectDocument: function() {
+            var docProtection = Common.Utils.Store.get('docProtection');
+            if (!docProtection) {
+                var cntrl = this.getApplication().getController('DocProtection');
+                docProtection = cntrl ? cntrl.getDocProps() : null;
             }
-            if (props) {
-                this._state.docProtection = props;
+            if (docProtection) {
                 var arr = this.view.getButtons();
-                Common.Utils.lockControls(Common.enumLock.docLockView, props.docLock && (props.lockMode===Asc.c_oAscProtection.View)),   {array: arr};
-                Common.Utils.lockControls(Common.enumLock.docLockForms, props.docLock && (props.lockMode===Asc.c_oAscProtection.Forms),   {array: arr});
-                Common.Utils.lockControls(Common.enumLock.docLockReview, props.docLock && (props.lockMode===Asc.c_oAscProtection.Review),   {array: arr});
-                Common.Utils.lockControls(Common.enumLock.docLockComments, props.docLock && (props.lockMode===Asc.c_oAscProtection.Comments),   {array: arr});
+                Common.Utils.lockControls(Common.enumLock.docLockView, docProtection.isReadOnly,   {array: arr});
+                Common.Utils.lockControls(Common.enumLock.docLockForms, docProtection.isFormsOnly,   {array: arr});
+                Common.Utils.lockControls(Common.enumLock.docLockReview, docProtection.isReviewOnly,   {array: arr});
+                Common.Utils.lockControls(Common.enumLock.docLockComments, docProtection.isCommentsOnly,   {array: arr});
             }
         }
 
diff --git a/apps/documenteditor/main/app/controller/LeftMenu.js b/apps/documenteditor/main/app/controller/LeftMenu.js
index 1fe6247ad..556862582 100644
--- a/apps/documenteditor/main/app/controller/LeftMenu.js
+++ b/apps/documenteditor/main/app/controller/LeftMenu.js
@@ -119,7 +119,7 @@ define([
         onLaunch: function() {
             this.leftMenu = this.createView('LeftMenu').render();
             this.leftMenu.btnSearchBar.on('toggle', _.bind(this.onMenuSearchBar, this));
-            this._state = {viewmode: false};
+            this._state = {disableEditing: false};
             Common.util.Shortcuts.delegateShortcuts({
                 shortcuts: {
                     'command+shift+s,ctrl+shift+s': _.bind(this.onShortcut, this, 'save'),
@@ -216,7 +216,7 @@ define([
             }
 
             (this.mode.trialMode || this.mode.isBeta) && this.leftMenu.setDeveloperMode(this.mode.trialMode, this.mode.isBeta, this.mode.buildVersion);
-
+            this.onChangeProtectDocument();
             Common.util.Shortcuts.resumeEvents();
             return this;
         },
@@ -582,14 +582,13 @@ define([
         },
 
         setPreviewMode: function(mode) {
-            this._state.viewmode = mode;
+            this._state.disableEditing = mode;
             this.updatePreviewMode();
         },
 
         updatePreviewMode: function() {
-            var lockMode = this._state.docProtection ? this._state.docProtection.lockMode : undefined;
-            lockMode = (lockMode===Asc.c_oAscProtection.View || lockMode===Asc.c_oAscProtection.Forms);
-            var viewmode = this._state.viewmode || lockMode;
+            var docProtection = Common.Utils.Store.get('docProtection', {});
+            var viewmode = this._state.disableEditing || !!docProtection.isReadOnly || !!docProtection.isFormsOnly;
             if (this.viewmode === viewmode) return;
             this.viewmode = viewmode;
 
@@ -896,15 +895,14 @@ define([
             return this.leftMenu && this.leftMenu.panelComments && this.leftMenu.panelComments.isVisible();
         },
 
-        onChangeProtectDocument: function(props) {
-            if (!props) {
-                var docprotect = this.getApplication().getController('DocProtection');
-                props = docprotect ? docprotect.getDocProps() : null;
+        onChangeProtectDocument: function() {
+            var docProtection = Common.Utils.Store.get('docProtection');
+            if (!docProtection) {
+                var cntrl = this.getApplication().getController('DocProtection');
+                docProtection = cntrl ? cntrl.getDocProps() : null;
             }
-            if (props) {
-                this._state.docProtection = props;
+            if (docProtection)
                 this.updatePreviewMode();
-            }
         },
 
         textNoTextFound         : 'Text not found',
diff --git a/apps/documenteditor/main/app/controller/Links.js b/apps/documenteditor/main/app/controller/Links.js
index c3db0cc6f..f6afb11e2 100644
--- a/apps/documenteditor/main/app/controller/Links.js
+++ b/apps/documenteditor/main/app/controller/Links.js
@@ -94,6 +94,7 @@ define([
             Common.Gateway.on('setactionlink', function (url) {
                 console.log('url with actions: ' + url);
             }.bind(this));
+            Common.NotificationCenter.on('app:ready', this.onAppReady.bind(this));
         },
 
         setApi: function (api) {
@@ -573,18 +574,28 @@ define([
             })).show();
         },
 
-        onChangeProtectDocument: function(props) {
-            if (!props) {
-                var docprotect = this.getApplication().getController('DocProtection');
-                props = docprotect ? docprotect.getDocProps() : null;
+        onChangeProtectDocument: function() {
+            var docProtection = Common.Utils.Store.get('docProtection');
+            if (!docProtection) {
+                var cntrl = this.getApplication().getController('DocProtection');
+                docProtection = cntrl ? cntrl.getDocProps() : null;
             }
-            if (props) {
-                this._state.docProtection = props;
-                this.lockToolbar(Common.enumLock.docLockView, props.docLock && (props.lockMode===Asc.c_oAscProtection.View));
-                this.lockToolbar(Common.enumLock.docLockForms, props.docLock && (props.lockMode===Asc.c_oAscProtection.Forms));
-                this.lockToolbar(Common.enumLock.docLockReview, props.docLock && (props.lockMode===Asc.c_oAscProtection.Review));
-                this.lockToolbar(Common.enumLock.docLockComments, props.docLock && (props.lockMode===Asc.c_oAscProtection.Comments));
+            if (docProtection) {
+                this.lockToolbar(Common.enumLock.docLockView, docProtection.isReadOnly);
+                this.lockToolbar(Common.enumLock.docLockForms, docProtection.isFormsOnly);
+                this.lockToolbar(Common.enumLock.docLockReview, docProtection.isReviewOnly);
+                this.lockToolbar(Common.enumLock.docLockComments, docProtection.isCommentsOnly);
             }
+        },
+
+        onAppReady: function (config) {
+            var me = this;
+            (new Promise(function (accept, reject) {
+                accept();
+            })).then(function(){
+                me.view && me.view.onAppReady(config);
+                me.onChangeProtectDocument();
+            });
         }
 
     }, DE.Controllers.Links || {}));
diff --git a/apps/documenteditor/main/app/controller/PageLayout.js b/apps/documenteditor/main/app/controller/PageLayout.js
index 2703215e2..46dd5b769 100644
--- a/apps/documenteditor/main/app/controller/PageLayout.js
+++ b/apps/documenteditor/main/app/controller/PageLayout.js
@@ -98,7 +98,6 @@ define([
                 this.api.asc_registerCallback('asc_onImgWrapStyleChanged', this.onApiWrappingStyleChanged.bind(this));
                 this.api.asc_registerCallback('asc_onCoAuthoringDisconnect', this.onApiCoAuthoringDisconnect.bind(this));
                 this.api.asc_registerCallback('asc_onFocusObject', this.onApiFocusObject.bind(this));
-                Common.NotificationCenter.on('protect:doclock', _.bind(this.onChangeProtectDocument, this));
                 return this;
             },
 
@@ -255,20 +254,6 @@ define([
 
                 this.api.ImgApply(props);
                 this.toolbar.fireEvent('editcomplete', this.toolbar);
-            },
-
-            onChangeProtectDocument: function(props) {
-                if (!props) {
-                    var docprotect = this.getApplication().getController('DocProtection');
-                    props = docprotect ? docprotect.getDocProps() : null;
-                }
-                if (props) {
-                    this._state.docProtection = props;
-                    this.toolbar.lockToolbar(Common.enumLock.docLockView, props.docLock && (props.lockMode===Asc.c_oAscProtection.View));
-                    this.toolbar.lockToolbar(Common.enumLock.docLockForms, props.docLock && (props.lockMode===Asc.c_oAscProtection.Forms));
-                    this.toolbar.lockToolbar(Common.enumLock.docLockReview, props.docLock && (props.lockMode===Asc.c_oAscProtection.Review));
-                    this.toolbar.lockToolbar(Common.enumLock.docLockComments, props.docLock && (props.lockMode===Asc.c_oAscProtection.Comments));
-                }
             }
         }
     })());
diff --git a/apps/documenteditor/main/app/controller/RightMenu.js b/apps/documenteditor/main/app/controller/RightMenu.js
index e05283bc6..101d48ede 100644
--- a/apps/documenteditor/main/app/controller/RightMenu.js
+++ b/apps/documenteditor/main/app/controller/RightMenu.js
@@ -158,8 +158,8 @@ define([
 
             var isChart = false,
                 isSmartArtInternal = false,
-                lockMode = this._state.docProtection ? this._state.docProtection.lockMode : undefined;
-            lockMode = (lockMode===Asc.c_oAscProtection.View || lockMode===Asc.c_oAscProtection.Forms || lockMode===Asc.c_oAscProtection.Comments);
+                docProtection = Common.Utils.Store.get('docProtection', {}),
+                isProtected = !!docProtection.isReadOnly || !!docProtection.isFormsOnly || !!docProtection.isCommentsOnly;
 
             var control_props = this.api.asc_IsContentControl() ? this.api.asc_GetContentControlProperties() : null,
                 control_lock = false;
@@ -189,7 +189,7 @@ define([
                         if (value.get_ShapeProperties().asc_getTextArtProperties()) {
                             this._settings[Common.Utils.documentSettingsType.TextArt].props = value;
                             this._settings[Common.Utils.documentSettingsType.TextArt].hidden = 0;
-                            this._settings[Common.Utils.documentSettingsType.TextArt].locked = value.get_Locked() || content_locked || lockMode;
+                            this._settings[Common.Utils.documentSettingsType.TextArt].locked = value.get_Locked() || content_locked || isProtected;
                         }
                     }
                     control_lock = control_lock || value.get_Locked();
@@ -201,11 +201,11 @@ define([
                 }
                 this._settings[settingsType].props = value;
                 this._settings[settingsType].hidden = 0;
-                this._settings[settingsType].locked = value.get_Locked() || content_locked || lockMode;
+                this._settings[settingsType].locked = value.get_Locked() || content_locked || isProtected;
                 if (!this._settings[Common.Utils.documentSettingsType.MailMerge].locked) // lock MailMerge-InsertField, если хотя бы один объект locked
-                    this._settings[Common.Utils.documentSettingsType.MailMerge].locked = value.get_Locked() || lockMode;
+                    this._settings[Common.Utils.documentSettingsType.MailMerge].locked = value.get_Locked() || isProtected;
                 if (!this._settings[Common.Utils.documentSettingsType.Signature].locked) // lock Signature, если хотя бы один объект locked
-                    this._settings[Common.Utils.documentSettingsType.Signature].locked = value.get_Locked() || lockMode;
+                    this._settings[Common.Utils.documentSettingsType.Signature].locked = value.get_Locked() || isProtected;
             }
 
             if (control_props && control_props.get_FormPr() && this.rightmenu.formSettings) {
@@ -214,7 +214,7 @@ define([
                     spectype==Asc.c_oAscContentControlSpecificType.ComboBox || spectype==Asc.c_oAscContentControlSpecificType.DropDownList || spectype==Asc.c_oAscContentControlSpecificType.None) {
                     settingsType = Common.Utils.documentSettingsType.Form;
                     this._settings[settingsType].props = control_props;
-                    this._settings[settingsType].locked = control_lock || lockMode;
+                    this._settings[settingsType].locked = control_lock || isProtected;
                     this._settings[settingsType].hidden = 0;
                     if (control_props.get_FormPr().get_Fixed())
                         this._settings[Common.Utils.documentSettingsType.TextArt].hidden = 1;
@@ -358,7 +358,6 @@ define([
                 }
                 this.api.asc_registerCallback('asc_onError',             _.bind(this.onError, this));
             }
-
             if (this.editMode && this.api) {
                 // this.rightmenu.shapeSettings.createDelayedElements();
                 var selectedElements = this.api.getSelectedElements();
@@ -366,6 +365,7 @@ define([
                     this.onFocusObject(selectedElements);
                 }
             }
+            this.onChangeProtectDocument();
         },
 
         onDoubleClickOnObject: function(obj) {
@@ -472,17 +472,17 @@ define([
             }
         },
 
-        onChangeProtectDocument: function(props) {
-            if (!props) {
-                var docprotect = this.getApplication().getController('DocProtection');
-                props = docprotect ? docprotect.getDocProps() : null;
+        onChangeProtectDocument: function() {
+            var docProtection = Common.Utils.Store.get('docProtection');
+            if (!docProtection) {
+                var cntrl = this.getApplication().getController('DocProtection');
+                docProtection = cntrl ? cntrl.getDocProps() : null;
             }
-            if (props) {
-                this._state.docProtection = props;
+            if (docProtection && this.api) {
+                var selectedElements = this.api.getSelectedElements();
+                if (selectedElements.length > 0)
+                    this.onFocusObject(selectedElements);
             }
-            var selectedElements = this.api.getSelectedElements();
-            if (selectedElements.length > 0)
-                this.onFocusObject(selectedElements);
         }
     });
 });
\ No newline at end of file
diff --git a/apps/documenteditor/main/app/controller/Statusbar.js b/apps/documenteditor/main/app/controller/Statusbar.js
index b2af4e032..8f6629628 100644
--- a/apps/documenteditor/main/app/controller/Statusbar.js
+++ b/apps/documenteditor/main/app/controller/Statusbar.js
@@ -122,7 +122,6 @@ define([
                     me.statusbar.$el.find('.hide-select-tools').removeClass('hide-select-tools');
                 }
             });
-            Common.NotificationCenter.on('protect:doclock', _.bind(this.onChangeProtectDocument, this));
             Common.NotificationCenter.on('app:ready', me.onAppReady.bind(me));
         },
 
@@ -358,14 +357,6 @@ define([
             }
         },
 
-        onChangeProtectDocument: function(props) {
-            if (!props) {
-                var docprotect = this.getApplication().getController('DocProtection');
-                props = docprotect ? docprotect.getDocProps() : null;
-            }
-            props && this.statusbar.onChangeProtectDocument(props);
-        },
-
         zoomText        : 'Zoom {0}%',
         textHasChanges  : 'New changes have been tracked',
         textTrackChanges: 'The document is opened with the Track Changes mode enabled',
diff --git a/apps/documenteditor/main/app/controller/Toolbar.js b/apps/documenteditor/main/app/controller/Toolbar.js
index 2ba838dfb..763dcfa7c 100644
--- a/apps/documenteditor/main/app/controller/Toolbar.js
+++ b/apps/documenteditor/main/app/controller/Toolbar.js
@@ -3162,6 +3162,7 @@ define([
         createDelayedElements: function() {
             this.toolbar.createDelayedElements();
             this.attachUIEvents(this.toolbar);
+            this.onChangeProtectDocument();
         },
 
         onAppShowed: function (config) {
@@ -3332,17 +3333,17 @@ define([
             })).show();
         },
 
-        onChangeProtectDocument: function(props) {
-            if (!props) {
-                var docprotect = this.getApplication().getController('DocProtection');
-                props = docprotect ? docprotect.getDocProps() : null;
+        onChangeProtectDocument: function() {
+            var docProtection = Common.Utils.Store.get('docProtection');
+            if (!docProtection) {
+                var cntrl = this.getApplication().getController('DocProtection');
+                docProtection = cntrl ? cntrl.getDocProps() : null;
             }
-            if (props) {
-                this._state.docProtection = props;
-                this.toolbar.lockToolbar(Common.enumLock.docLockView, props.docLock && (props.lockMode===Asc.c_oAscProtection.View));
-                this.toolbar.lockToolbar(Common.enumLock.docLockForms, props.docLock && (props.lockMode===Asc.c_oAscProtection.Forms));
-                this.toolbar.lockToolbar(Common.enumLock.docLockReview, props.docLock && (props.lockMode===Asc.c_oAscProtection.Review));
-                this.toolbar.lockToolbar(Common.enumLock.docLockComments, props.docLock && (props.lockMode===Asc.c_oAscProtection.Comments));
+            if (docProtection) {
+                this.toolbar.lockToolbar(Common.enumLock.docLockView, docProtection.isReadOnly);
+                this.toolbar.lockToolbar(Common.enumLock.docLockForms, docProtection.isFormsOnly);
+                this.toolbar.lockToolbar(Common.enumLock.docLockReview, docProtection.isReviewOnly);
+                this.toolbar.lockToolbar(Common.enumLock.docLockComments, docProtection.isCommentsOnly);
             }
         },
 
diff --git a/apps/documenteditor/main/app/view/DocumentHolder.js b/apps/documenteditor/main/app/view/DocumentHolder.js
index 779e39235..49c576700 100644
--- a/apps/documenteditor/main/app/view/DocumentHolder.js
+++ b/apps/documenteditor/main/app/view/DocumentHolder.js
@@ -152,7 +152,7 @@ define([
                         signGuid = (value.imgProps && value.imgProps.value && me.mode.isSignatureSupport) ? value.imgProps.value.asc_getSignatureId() : undefined,
                         signProps = (signGuid) ? me.api.asc_getSignatureSetup(signGuid) : null,
                         isInSign = !!signProps && me._canProtect,
-                        lockMode = me.docProtection ? me.docProtection.lockMode : undefined,
+                        docProtection = Common.Utils.Store.get('docProtection', {}),
                         control_lock = (value.paraProps) ? (!value.paraProps.value.can_DeleteBlockContentControl() || !value.paraProps.value.can_EditBlockContentControl() ||
                                                             !value.paraProps.value.can_DeleteInlineContentControl() || !value.paraProps.value.can_EditInlineContentControl()) : false,
                         canComment = !isInChart && me.api.can_AddQuotedComment() !== false && me.mode.canCoAuthoring && me.mode.canComments && !me._isDisabled && !control_lock,
@@ -170,7 +170,7 @@ define([
                     }
 
                     me.menuViewUndo.setVisible(me.mode.canCoAuthoring && me.mode.canComments && !me._isDisabled);
-                    me.menuViewUndo.setDisabled(!me.api.asc_getCanUndo() || lockMode===Asc.c_oAscProtection.View);
+                    me.menuViewUndo.setDisabled(!me.api.asc_getCanUndo() || !!docProtection.isReadOnly);
                     me.menuViewCopySeparator.setVisible(isInSign);
 
                     var isRequested = (signProps) ? signProps.asc_getRequested() : false;
@@ -188,15 +188,15 @@ define([
                     }
 
                     me.menuViewAddComment.setVisible(canComment);
-                    me.menuViewAddComment.setDisabled(value.paraProps && value.paraProps.locked === true || lockMode===Asc.c_oAscProtection.View || lockMode===Asc.c_oAscProtection.Forms);
+                    me.menuViewAddComment.setDisabled(value.paraProps && value.paraProps.locked === true || !!docProtection.isReadOnly || !!docProtection.isFormsOnly);
 
                     var disabled = value.paraProps && value.paraProps.locked === true;
                     var cancopy = me.api && me.api.can_CopyCut();
                     me.menuViewCopy.setDisabled(!cancopy);
                     me.menuViewCut.setVisible(me._fillFormMode && canEditControl);
-                    me.menuViewCut.setDisabled(disabled || !cancopy || lockMode===Asc.c_oAscProtection.View || lockMode===Asc.c_oAscProtection.Comments);
+                    me.menuViewCut.setDisabled(disabled || !cancopy || !!docProtection.isReadOnly || !!docProtection.isCommentsOnly);
                     me.menuViewPaste.setVisible(me._fillFormMode && canEditControl);
-                    me.menuViewPaste.setDisabled(disabled || lockMode===Asc.c_oAscProtection.View || lockMode===Asc.c_oAscProtection.Comments);
+                    me.menuViewPaste.setDisabled(disabled || !!docProtection.isReadOnly || !!docProtection.isCommentsOnly);
                     me.menuViewPrint.setVisible(me.mode.canPrint && !me._fillFormMode);
                     me.menuViewPrint.setDisabled(!cancopy);
 
diff --git a/apps/documenteditor/main/app/view/Links.js b/apps/documenteditor/main/app/view/Links.js
index 92b15a761..4f5de8e50 100644
--- a/apps/documenteditor/main/app/view/Links.js
+++ b/apps/documenteditor/main/app/view/Links.js
@@ -269,7 +269,6 @@ define([
                 this.paragraphControls.push(this.btnTableFiguresUpdate);
                 Common.Utils.lockControls(Common.enumLock.disableOnStart, true, {array: this.paragraphControls});
                 this._state = {disabled: false};
-                Common.NotificationCenter.on('app:ready', this.onAppReady.bind(this));
             },
 
             render: function (el) {
diff --git a/apps/documenteditor/main/app/view/Statusbar.js b/apps/documenteditor/main/app/view/Statusbar.js
index 1ec4040d0..54db2be0c 100644
--- a/apps/documenteditor/main/app/view/Statusbar.js
+++ b/apps/documenteditor/main/app/view/Statusbar.js
@@ -160,6 +160,8 @@ define([
             me.zoomMenu.on('item:click', function(menu, item) {
                 me.fireEvent('zoom:value', [item.value]);
             });
+
+            me.onChangeProtectDocument();
         }
 
         DE.Views.Statusbar = Backbone.View.extend(_.extend({
@@ -334,6 +336,7 @@ define([
                     this.api.asc_registerCallback('asc_onCurrentPage',  _.bind(_onCurrentPage, this));
                     this.api.asc_registerCallback('asc_onCoAuthoringDisconnect',_.bind(this.onApiCoAuthoringDisconnect, this));
                     Common.NotificationCenter.on('api:disconnect',      _.bind(this.onApiCoAuthoringDisconnect, this));
+                    Common.NotificationCenter.on('protect:doclock', _.bind(this.onChangeProtectDocument, this));
                 }
 
                 return this;
@@ -401,17 +404,20 @@ define([
 
             SetDisabled: function(disable) {
                 this._isDisabled = disable;
-                var lockMode = this._state.docProtection ? this._state.docProtection.lockMode : undefined;
-                lockMode = (lockMode===Asc.c_oAscProtection.View || lockMode===Asc.c_oAscProtection.Forms || lockMode===Asc.c_oAscProtection.Comments);
-                this.btnLanguage.setDisabled(disable || this.langMenu.items.length<1 || lockMode);
-                this.btnTurnReview && this.btnTurnReview.setDisabled(disable || lockMode);
+                var docProtection = Common.Utils.Store.get('docProtection', {}),
+                    isProtected = !!docProtection.isReadOnly || !!docProtection.isFormsOnly || !!docProtection.isCommentsOnly
+                this.btnLanguage.setDisabled(disable || this.langMenu.items.length<1 || isProtected);
+                this.btnTurnReview && this.btnTurnReview.setDisabled(disable || isProtected);
             },
 
-            onChangeProtectDocument: function(props) {
-                if (props) {
-                    this._state.docProtection = props;
-                    this.SetDisabled(this._isDisabled);
+            onChangeProtectDocument: function() {
+                var docProtection = Common.Utils.Store.get('docProtection');
+                if (!docProtection) {
+                    var cntrl = DE.getController('DocProtection');
+                    docProtection = cntrl ? cntrl.getDocProps() : null;
                 }
+                if (docProtection)
+                    this.SetDisabled(this._isDisabled);
             },
 
             onApiCoAuthoringDisconnect: function() {

From 7f703b6294023736ecae4dbbb47c5c2c37183661 Mon Sep 17 00:00:00 2001
From: Julia Radzhabova <julia.radzhabova@onlyoffice.com>
Date: Mon, 26 Sep 2022 18:37:47 +0300
Subject: [PATCH 07/28] Fix disabled styles

---
 apps/common/main/resources/less/combo-dataview.less | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/apps/common/main/resources/less/combo-dataview.less b/apps/common/main/resources/less/combo-dataview.less
index 23cb1a058..71270f7d6 100644
--- a/apps/common/main/resources/less/combo-dataview.less
+++ b/apps/common/main/resources/less/combo-dataview.less
@@ -78,6 +78,12 @@
             }
         }
     }
+
+    .masked & {
+        &.disabled {
+            opacity: 1;
+        }
+    }
 }
 
 

From 8f1f89ee31bfc7268ed59b6fbfff21d12d08b812 Mon Sep 17 00:00:00 2001
From: Julia Radzhabova <julia.radzhabova@onlyoffice.com>
Date: Mon, 26 Sep 2022 23:34:59 +0300
Subject: [PATCH 08/28] [DE] Lock controls when document is protected (review
 only)

---
 .../main/lib/controller/ReviewChanges.js      | 43 +++++++++++++------
 .../template/ReviewChangesPopover.template    |  2 +-
 apps/common/main/lib/view/ReviewChanges.js    | 22 +++++++---
 3 files changed, 47 insertions(+), 20 deletions(-)

diff --git a/apps/common/main/lib/controller/ReviewChanges.js b/apps/common/main/lib/controller/ReviewChanges.js
index 94c912933..341f91cd3 100644
--- a/apps/common/main/lib/controller/ReviewChanges.js
+++ b/apps/common/main/lib/controller/ReviewChanges.js
@@ -167,13 +167,15 @@ define([
         SetDisabled: function(state, reviewMode, fillFormMode) {
             if (this.dlgChanges)
                 this.dlgChanges.close();
-            if (reviewMode)
+            if (reviewMode) {
                 this.lockToolbar(Common.enumLock.previewReviewMode, state);
-            else if (fillFormMode)
+                this.dlgChanges && Common.Utils.lockControls(Common.enumLock.previewReviewMode, state, {array: [this.dlgChanges.btnAccept, this.dlgChanges.btnReject]});
+            } else if (fillFormMode) {
                 this.lockToolbar(Common.enumLock.viewFormMode, state);
-            else
+                this.dlgChanges && Common.Utils.lockControls(Common.enumLock.viewFormMode, state, {array: [this.dlgChanges.btnAccept, this.dlgChanges.btnReject]});
+            } else {
                 this.lockToolbar(Common.enumLock.viewMode, state);
-
+            }
             this.setPreviewMode(state);
         },
 
@@ -218,17 +220,14 @@ define([
         onApiShowChange: function (sdkchange, isShow) {
             var btnlock = true,
                 changes;
-            if (this.appConfig.canReview && !this.appConfig.isReviewOnly) {
+            if (this.appConfig.canReview && !(this.appConfig.isReviewOnly || Common.Utils.Store.get('docProtection', {}).isReviewOnly)) {
                 if (sdkchange && sdkchange.length>0) {
                     changes = this.readSDKChange(sdkchange);
                     btnlock = this.isSelectedChangesLocked(changes, isShow);
                 }
                 if (this._state.lock !== btnlock) {
                     Common.Utils.lockControls(Common.enumLock.reviewChangelock, btnlock, {array: [this.view.btnAccept, this.view.btnReject]});
-                    if (this.dlgChanges) {
-                        this.dlgChanges.btnAccept.setDisabled(btnlock);
-                        this.dlgChanges.btnReject.setDisabled(btnlock);
-                    }
+                    this.dlgChanges && Common.Utils.lockControls(Common.enumLock.reviewChangelock, btnlock, {array: [this.dlgChanges.btnAccept, this.dlgChanges.btnReject]});
                     this._state.lock = btnlock;
                     Common.Utils.InternalSettings.set(this.view.appPrefix + "accept-reject-lock", btnlock);
                 }
@@ -496,6 +495,7 @@ define([
                 }
                 var date = (item.get_DateTime() == '') ? new Date() : new Date(item.get_DateTime()),
                     user = me.userCollection.findOriginalUser(item.get_UserId()),
+                    isProtectedReview = !!Common.Utils.Store.get('docProtection', {}).isReviewOnly,
                     change = new Common.Models.ReviewChange({
                         uid         : Common.UI.getId(),
                         userid      : item.get_UserId(),
@@ -511,7 +511,7 @@ define([
                         scope       : me.view,
                         hint        : !me.appConfig.canReview,
                         goto        : (item.get_MoveType() == Asc.c_oAscRevisionsMove.MoveTo || item.get_MoveType() == Asc.c_oAscRevisionsMove.MoveFrom),
-                        editable    : me.appConfig.isReviewOnly && (item.get_UserId() == me.currentUserId) || !me.appConfig.isReviewOnly && (!me.appConfig.canUseReviewPermissions || AscCommon.UserInfoParser.canEditReview(item.get_UserName()))
+                        editable    : (me.appConfig.isReviewOnly || isProtectedReview) && (item.get_UserId() == me.currentUserId) || !(me.appConfig.isReviewOnly || isProtectedReview) && (!me.appConfig.canUseReviewPermissions || AscCommon.UserInfoParser.canEditReview(item.get_UserName()))
                     });
 
                 arr.push(change);
@@ -600,7 +600,7 @@ define([
         },
 
         onTurnPreview: function(state, global, fromApi) {
-            if ( this.appConfig.isReviewOnly ) {
+            if ( this.appConfig.isReviewOnly) {
                 this.view.turnChanges(true);
             } else
             if ( this.appConfig.canReview ) {
@@ -614,7 +614,7 @@ define([
         },
 
         onApiTrackRevisionsChange: function(localFlag, globalFlag, userId) {
-            if ( this.appConfig.isReviewOnly ) {
+            if ( this.appConfig.isReviewOnly || Common.Utils.Store.get('docProtection', {}).isReviewOnly) {
                 this.view.turnChanges(true);
             } else
             if ( this.appConfig.canReview ) {
@@ -983,7 +983,8 @@ define([
         },
 
         onCoAuthoringDisconnect: function() {
-            this.lockToolbar(Common.enumLock.lostConnect, true)
+            this.lockToolbar(Common.enumLock.lostConnect, true);
+            this.dlgChanges && Common.Utils.lockControls(Common.enumLock.lostConnect, true, {array: [this.dlgChanges.btnAccept, this.dlgChanges.btnReject]});
         },
 
         onUpdateUsers: function() {
@@ -1034,6 +1035,22 @@ define([
                 this.lockToolbar(Common.enumLock.docLockForms, docProtection.isFormsOnly);
                 this.lockToolbar(Common.enumLock.docLockReview, docProtection.isReviewOnly);
                 this.lockToolbar(Common.enumLock.docLockComments, docProtection.isCommentsOnly);
+                if (this.dlgChanges) {
+                    Common.Utils.lockControls(Common.enumLock.docLockView, docProtection.isReadOnly, {array: [this.dlgChanges.btnAccept, this.dlgChanges.btnReject]});
+                    Common.Utils.lockControls(Common.enumLock.docLockForms, docProtection.isFormsOnly, {array: [this.dlgChanges.btnAccept, this.dlgChanges.btnReject]});
+                    Common.Utils.lockControls(Common.enumLock.docLockReview, docProtection.isReviewOnly, {array: [this.dlgChanges.btnAccept, this.dlgChanges.btnReject]});
+                    Common.Utils.lockControls(Common.enumLock.docLockComments, docProtection.isCommentsOnly, {array: [this.dlgChanges.btnAccept, this.dlgChanges.btnReject]});
+                }
+                if (this.appConfig.canReview) {
+                    if (docProtection.isReviewOnly) {
+                        this.onTurnPreview(true);
+                        this.onApiShowChange();
+                    } else if (this._state.prevReviewProtected) {
+                        this.onTurnPreview(false);
+                        this.onApiShowChange();
+                    }
+                    this._state.prevReviewProtected = docProtection.isReviewOnly;
+                }
                 this.updatePreviewMode();
             }
         },
diff --git a/apps/common/main/lib/template/ReviewChangesPopover.template b/apps/common/main/lib/template/ReviewChangesPopover.template
index ddfe2c417..8669c695d 100644
--- a/apps/common/main/lib/template/ReviewChangesPopover.template
+++ b/apps/common/main/lib/template/ReviewChangesPopover.template
@@ -9,7 +9,7 @@
         <div class="btn-goto img-commonctrl"></div>
         <% } %>
         <% if (!hint) { %>
-            <% if (scope.appConfig.isReviewOnly) { %>
+            <% if (scope.appConfig.isReviewOnly || Common.Utils.Store.get("docProtection", {}).isReviewOnly) { %>
                 <% if (editable) { %>
                 <div class="btn-delete img-commonctrl"></div>
                 <% } %>
diff --git a/apps/common/main/lib/view/ReviewChanges.js b/apps/common/main/lib/view/ReviewChanges.js
index e8596856d..861208612 100644
--- a/apps/common/main/lib/view/ReviewChanges.js
+++ b/apps/common/main/lib/view/ReviewChanges.js
@@ -259,7 +259,7 @@ define([
                         caption: this.txtAccept,
                         split: !this.appConfig.canUseReviewPermissions,
                         iconCls: 'toolbar__icon btn-review-save',
-                        lock: [_set.reviewChangelock, _set.isReviewOnly, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.docLockView, _set.docLockForms, _set.docLockComments],
+                        lock: [_set.reviewChangelock, _set.isReviewOnly, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.docLockView, _set.docLockForms, _set.docLockComments, _set.docLockReview],
                         dataHint: '1',
                         dataHintDirection: 'bottom',
                         dataHintOffset: 'small'
@@ -271,7 +271,7 @@ define([
                         caption: this.txtReject,
                         split: !this.appConfig.canUseReviewPermissions,
                         iconCls: 'toolbar__icon btn-review-deny',
-                        lock: [_set.reviewChangelock, _set.isReviewOnly, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.docLockView, _set.docLockForms, _set.docLockComments],
+                        lock: [_set.reviewChangelock, _set.isReviewOnly, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.docLockView, _set.docLockForms, _set.docLockComments, _set.docLockReview],
                         dataHint: '1',
                         dataHintDirection: 'bottom',
                         dataHintOffset: 'small'
@@ -294,7 +294,7 @@ define([
                     this.btnTurnOn = new Common.UI.Button({
                         cls: 'btn-toolbar x-huge icon-top',
                         iconCls: 'toolbar__icon btn-ic-review',
-                        lock: [_set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.docLockView, _set.docLockForms, _set.docLockComments],
+                        lock: [_set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.docLockView, _set.docLockForms, _set.docLockComments, _set.docLockReview],
                         caption: this.txtTurnon,
                         split: !this.appConfig.isReviewOnly,
                         enableToggle: true,
@@ -731,7 +731,7 @@ define([
                     var button = new Common.UI.Button({
                         cls         : 'btn-toolbar',
                         iconCls     : 'toolbar__icon btn-ic-review',
-                        lock: [Common.enumLock.viewMode, Common.enumLock.previewReviewMode, Common.enumLock.viewFormMode, Common.enumLock.lostConnect, Common.enumLock.docLockView, Common.enumLock.docLockForms, Common.enumLock.docLockComments],
+                        lock: [Common.enumLock.viewMode, Common.enumLock.previewReviewMode, Common.enumLock.viewFormMode, Common.enumLock.lostConnect, Common.enumLock.docLockView, Common.enumLock.docLockForms, Common.enumLock.docLockComments, Common.enumLock.docLockReview],
                         hintAnchor  : 'top',
                         hint        : this.tipReview,
                         split       : !this.appConfig.isReviewOnly,
@@ -983,6 +983,7 @@ define([
         render: function() {
             Common.UI.Window.prototype.render.call(this);
 
+            var _set = Common.enumLock;
             this.btnPrev = new Common.UI.Button({
                 cls: 'dlg-btn iconic',
                 iconCls: 'img-commonctrl prev',
@@ -1003,7 +1004,8 @@ define([
                 cls         : 'btn-toolbar',
                 caption     : this.txtAccept,
                 split       : true,
-                disabled    : this.mode.isReviewOnly || !!Common.Utils.InternalSettings.get(this.appPrefix + "accept-reject-lock"),
+                disabled    : this.mode.isReviewOnly || Common.Utils.Store.get('docProtection', {}).isReviewOnly || !!Common.Utils.InternalSettings.get(this.appPrefix + "accept-reject-lock"),
+                lock        : [_set.reviewChangelock, _set.isReviewOnly, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.docLockView, _set.docLockForms, _set.docLockComments, _set.docLockReview],
                 menu        : this.mode.canUseReviewPermissions ? false : new Common.UI.Menu({
                     items: [
                         this.mnuAcceptCurrent = new Common.UI.MenuItem({
@@ -1023,7 +1025,7 @@ define([
                 cls         : 'btn-toolbar',
                 caption     : this.txtReject,
                 split       : true,
-                disabled    : this.mode.isReviewOnly || !!Common.Utils.InternalSettings.get(this.appPrefix + "accept-reject-lock"),
+                lock        : [_set.reviewChangelock, _set.isReviewOnly, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.docLockView, _set.docLockForms, _set.docLockComments, _set.docLockReview],
                 menu        : this.mode.canUseReviewPermissions ? false : new Common.UI.Menu({
                     items: [
                         this.mnuRejectCurrent = new Common.UI.MenuItem({
@@ -1038,6 +1040,14 @@ define([
                 })
             });
             this.btnReject.render(this.$window.find('#id-review-button-reject'));
+            var arr = [this.btnAccept, this.btnReject];
+            Common.Utils.lockControls(Common.enumLock.isReviewOnly, this.mode.isReviewOnly, {array: arr});
+            var docProtection = Common.Utils.Store.get('docProtection', {});
+            Common.Utils.lockControls(Common.enumLock.docLockView, docProtection.isReadOnly, {array: arr});
+            Common.Utils.lockControls(Common.enumLock.docLockForms, docProtection.isFormsOnly, {array: arr});
+            Common.Utils.lockControls(Common.enumLock.docLockReview, docProtection.isReviewOnly, {array: arr});
+            Common.Utils.lockControls(Common.enumLock.docLockComments, docProtection.isCommentsOnly, {array: arr});
+            Common.Utils.lockControls(Common.enumLock.reviewChangelock, !!Common.Utils.InternalSettings.get(this.appPrefix + "accept-reject-lock"), {array: arr});
 
             var me = this;
             this.btnPrev.on('click', function (e) {

From 0d54c6d31e1d4a7fa8469c186c578898a489aff4 Mon Sep 17 00:00:00 2001
From: Julia Radzhabova <julia.radzhabova@onlyoffice.com>
Date: Tue, 27 Sep 2022 11:34:47 +0300
Subject: [PATCH 09/28] [DE] Protect settings depend on permissions

---
 .../main/app/controller/DocProtection.js             |  1 +
 apps/documenteditor/main/app/view/ProtectDialog.js   | 12 +++---------
 2 files changed, 4 insertions(+), 9 deletions(-)

diff --git a/apps/documenteditor/main/app/controller/DocProtection.js b/apps/documenteditor/main/app/controller/DocProtection.js
index 72acd53df..ea7aa1320 100644
--- a/apps/documenteditor/main/app/controller/DocProtection.js
+++ b/apps/documenteditor/main/app/controller/DocProtection.js
@@ -124,6 +124,7 @@ define([
                 var me = this,
                     btn,
                     win = new DE.Views.ProtectDialog({
+                        props: me.appConfig,
                         handler: function(result, value, props) {
                             btn = result;
                             if (result == 'ok') {
diff --git a/apps/documenteditor/main/app/view/ProtectDialog.js b/apps/documenteditor/main/app/view/ProtectDialog.js
index f5f33a74a..2eeb9f018 100644
--- a/apps/documenteditor/main/app/view/ProtectDialog.js
+++ b/apps/documenteditor/main/app/view/ProtectDialog.js
@@ -61,10 +61,7 @@ define([
             }, options);
 
             this.handler        = options.handler;
-            this.txtDescription = options.txtDescription || '';
             this.props = options.props;
-            this.isEdit = options.isEdit;
-            this.api = options.api;
 
             this.template = options.template || [
                 '<div class="box">',
@@ -194,12 +191,9 @@ define([
 
         _setDefaults: function (props) {
             if (props) {
-                var type = props.asc_getType();
-                switch (type) {
-                    case Asc.c_oAscProtection.Forms:     this.rbForms.setValue(true, true); break;
-                    case Asc.c_oAscProtection.Review:    this.rbReview.setValue(true, true); break;
-                    case Asc.c_oAscProtection.Comments:  this.rbComments.setValue(true, true); break;
-                }
+                this.rbReview.setDisabled(!props.canReview);
+                this.rbForms.setDisabled(!props.canFillForms);
+                this.rbComments.setDisabled(!props.canComments);
             }
         },
 

From 00d7a665e60a3ec2eda1b26c752c10df7a75d371 Mon Sep 17 00:00:00 2001
From: Julia Radzhabova <julia.radzhabova@onlyoffice.com>
Date: Tue, 27 Sep 2022 13:23:20 +0300
Subject: [PATCH 10/28] [DE] Refactoring review changes

---
 .../main/lib/controller/ReviewChanges.js      | 72 ++++++++++---------
 apps/common/main/lib/view/ReviewChanges.js    |  2 -
 2 files changed, 37 insertions(+), 37 deletions(-)

diff --git a/apps/common/main/lib/controller/ReviewChanges.js b/apps/common/main/lib/controller/ReviewChanges.js
index 341f91cd3..4ea4bd624 100644
--- a/apps/common/main/lib/controller/ReviewChanges.js
+++ b/apps/common/main/lib/controller/ReviewChanges.js
@@ -840,10 +840,10 @@ define([
 
         onAppReady: function (config) {
             var me = this;
-            if ( config.canReview ) {
-                (new Promise(function (resolve) {
-                    resolve();
-                })).then(function () {
+            (new Promise(function (resolve) {
+                resolve();
+            })).then(function () {
+                if ( config.canReview ) {
                     // function _setReviewStatus(state, global) {
                     //     me.view.turnChanges(state, global);
                     //     !global && me.api.asc_SetLocalTrackRevisions(state);
@@ -879,41 +879,43 @@ define([
                             offset = sdk.offset();
                         me.dlgChanges.show(Math.max(10, offset.left + sdk.width() - 300), Math.max(10, offset.top + sdk.height() - 150));
                     }
-                });
-            } else if (config.canViewReview) {
-                config.canViewReview = (config.isEdit || me.api.asc_HaveRevisionsChanges(true)); // check revisions from all users
-                if (config.canViewReview) {
-                    var val = Common.localStorage.getItem(me.view.appPrefix + (config.isEdit || config.isRestrictedEdit ? "review-mode-editor" : "review-mode"));
-                    if (val===null) {
-                        val = me.appConfig.customization && me.appConfig.customization.review ? me.appConfig.customization.review.reviewDisplay : undefined;
-                        !val && (val = me.appConfig.customization ? me.appConfig.customization.reviewDisplay : undefined);
-                        val = /^(original|final|markup|simple)$/i.test(val) ? val.toLocaleLowerCase() : (config.isEdit || config.isRestrictedEdit ? 'markup' : 'original');
+                } else if (config.canViewReview) {
+                    config.canViewReview = (config.isEdit || me.api.asc_HaveRevisionsChanges(true)); // check revisions from all users
+                    if (config.canViewReview) {
+                        var val = Common.localStorage.getItem(me.view.appPrefix + (config.isEdit || config.isRestrictedEdit ? "review-mode-editor" : "review-mode"));
+                        if (val===null) {
+                            val = me.appConfig.customization && me.appConfig.customization.review ? me.appConfig.customization.review.reviewDisplay : undefined;
+                            !val && (val = me.appConfig.customization ? me.appConfig.customization.reviewDisplay : undefined);
+                            val = /^(original|final|markup|simple)$/i.test(val) ? val.toLocaleLowerCase() : (config.isEdit || config.isRestrictedEdit ? 'markup' : 'original');
+                        }
+                        me.turnDisplayMode(val);
+                        me.view.turnDisplayMode(val);
                     }
-                    me.turnDisplayMode(val);
-                    me.view.turnDisplayMode(val);
                 }
-            }
 
-            if (me.view && me.view.btnChat) {
-                me.getApplication().getController('LeftMenu').leftMenu.btnChat.on('toggle', function(btn, state){
-                    if (state !== me.view.btnChat.pressed)
-                        me.view.turnChat(state);
-                });
-            }
-            me.onChangeProtectSheet();
-            me.onChangeProtectDocument();
-            if (me.view) {
-                me.lockToolbar(Common.enumLock.hideComments, !Common.localStorage.getBool(me.view.appPrefix + "settings-livecomment", true), {array: [me.view.btnCommentRemove, me.view.btnCommentResolve]});
-                me.lockToolbar(Common.enumLock['Objects'], !!this._state.wsProps['Objects'], {array: [me.view.btnCommentRemove, me.view.btnCommentResolve]});
-            }
+                if (me.view && me.view.btnChat) {
+                    me.getApplication().getController('LeftMenu').leftMenu.btnChat.on('toggle', function(btn, state){
+                        if (state !== me.view.btnChat.pressed)
+                            me.view.turnChat(state);
+                    });
+                }
+                me.onChangeProtectSheet();
+                me.onChangeProtectDocument();
+                if (me.view) {
+                    me.lockToolbar(Common.enumLock.hideComments, !Common.localStorage.getBool(me.view.appPrefix + "settings-livecomment", true), {array: [me.view.btnCommentRemove, me.view.btnCommentResolve]});
+                    me.lockToolbar(Common.enumLock['Objects'], !!me._state.wsProps['Objects'], {array: [me.view.btnCommentRemove, me.view.btnCommentResolve]});
+                }
 
-            var val = Common.localStorage.getItem(me.view.appPrefix + "settings-review-hover-mode");
-            if (val === null) {
-                val = me.appConfig.customization && me.appConfig.customization.review ? !!me.appConfig.customization.review.hoverMode : false;
-            } else
-                val = !!parseInt(val);
-            Common.Utils.InternalSettings.set(me.view.appPrefix + "settings-review-hover-mode", val);
-            me.appConfig.reviewHoverMode = val;
+                var val = Common.localStorage.getItem(me.view.appPrefix + "settings-review-hover-mode");
+                if (val === null) {
+                    val = me.appConfig.customization && me.appConfig.customization.review ? !!me.appConfig.customization.review.hoverMode : false;
+                } else
+                    val = !!parseInt(val);
+                Common.Utils.InternalSettings.set(me.view.appPrefix + "settings-review-hover-mode", val);
+                me.appConfig.reviewHoverMode = val;
+
+                me.view && me.view.onAppReady(config);
+            });
         },
 
         applySettings: function(menu) {
diff --git a/apps/common/main/lib/view/ReviewChanges.js b/apps/common/main/lib/view/ReviewChanges.js
index 861208612..dcb4dce78 100644
--- a/apps/common/main/lib/view/ReviewChanges.js
+++ b/apps/common/main/lib/view/ReviewChanges.js
@@ -468,8 +468,6 @@ define([
                     });
                     this.lockedControls.push(this.btnCommentResolve);
                 }
-
-                Common.NotificationCenter.on('app:ready', this.onAppReady.bind(this));
             },
 
             render: function (el) {

From 9adcc64e9b0b7e0ab5e2144b78086eb2aff9db82 Mon Sep 17 00:00:00 2001
From: Julia Radzhabova <julia.radzhabova@onlyoffice.com>
Date: Tue, 27 Sep 2022 14:32:41 +0300
Subject: [PATCH 11/28] [DE] Fix protection for restricted modes

---
 apps/common/main/lib/controller/ReviewChanges.js         | 2 +-
 apps/documenteditor/main/app/controller/DocProtection.js | 9 ++++++---
 apps/documenteditor/main/app/controller/FormsTab.js      | 2 +-
 apps/documenteditor/main/app/controller/Links.js         | 8 +++++---
 apps/documenteditor/main/app/controller/Main.js          | 4 +++-
 5 files changed, 16 insertions(+), 9 deletions(-)

diff --git a/apps/common/main/lib/controller/ReviewChanges.js b/apps/common/main/lib/controller/ReviewChanges.js
index 4ea4bd624..39cbafc03 100644
--- a/apps/common/main/lib/controller/ReviewChanges.js
+++ b/apps/common/main/lib/controller/ReviewChanges.js
@@ -180,7 +180,7 @@ define([
         },
 
         lockToolbar: function (causes, lock, opts) {
-            Common.Utils.lockControls(causes, lock, opts, this.view.getButtons());
+            this.view && Common.Utils.lockControls(causes, lock, opts, this.view.getButtons());
         },
 
         setPreviewMode: function(mode) { //disable accept/reject in popover
diff --git a/apps/documenteditor/main/app/controller/DocProtection.js b/apps/documenteditor/main/app/controller/DocProtection.js
index ea7aa1320..4dcc94bb6 100644
--- a/apps/documenteditor/main/app/controller/DocProtection.js
+++ b/apps/documenteditor/main/app/controller/DocProtection.js
@@ -191,13 +191,12 @@ define([
                 resolve();
             })).then(function () {
                 // me.view.btnProtectDoc.toggle(me.api.asc_isProtectedDocument(), true);
-                // me.onChangeProtectDocument();
             });
         },
 
         onChangeProtectDocument: function() {
             // var isProtected = this.api.asc_isProtectedDocument();
-            var isProtected = this.view.btnProtectDoc.isActive(); // test
+            var isProtected = this.view ? this.view.btnProtectDoc.isActive() : false; // test
             this.view && this.view.btnProtectDoc.toggle(isProtected, true);
             this.getDocProps(true);
             Common.NotificationCenter.trigger('protect:doclock');
@@ -216,7 +215,11 @@ define([
                 // }
 
                 // test //////
-                var docProtected = this.view.btnProtectDoc.isActive(),
+                // if (Common.Utils.InternalSettings.get('protect-test-type')===undefined) {
+                //     this.view && this.view.btnProtectDoc.toggle(true, true);
+                //     Common.Utils.InternalSettings.set('protect-test-type', Asc.c_oAscProtection.Comments);
+                // }
+                var docProtected = this.view ? this.view.btnProtectDoc.isActive() : true,
                     type;
 
                 if (docProtected) {
diff --git a/apps/documenteditor/main/app/controller/FormsTab.js b/apps/documenteditor/main/app/controller/FormsTab.js
index b43d56a8c..728813d3d 100644
--- a/apps/documenteditor/main/app/controller/FormsTab.js
+++ b/apps/documenteditor/main/app/controller/FormsTab.js
@@ -440,7 +440,7 @@ define([
                 var cntrl = this.getApplication().getController('DocProtection');
                 docProtection = cntrl ? cntrl.getDocProps() : null;
             }
-            if (docProtection) {
+            if (docProtection && this.view) {
                 var arr = this.view.getButtons();
                 Common.Utils.lockControls(Common.enumLock.docLockView, docProtection.isReadOnly,   {array: arr});
                 Common.Utils.lockControls(Common.enumLock.docLockForms, docProtection.isFormsOnly,   {array: arr});
diff --git a/apps/documenteditor/main/app/controller/Links.js b/apps/documenteditor/main/app/controller/Links.js
index f6afb11e2..04febdc0f 100644
--- a/apps/documenteditor/main/app/controller/Links.js
+++ b/apps/documenteditor/main/app/controller/Links.js
@@ -205,7 +205,7 @@ define([
         },
 
         lockToolbar: function (causes, lock, opts) {
-            Common.Utils.lockControls(causes, lock, opts, this.view.getButtons());
+            this.view && Common.Utils.lockControls(causes, lock, opts, this.view.getButtons());
         },
 
         onApiCanAddHyperlink: function(value) {
@@ -593,8 +593,10 @@ define([
             (new Promise(function (accept, reject) {
                 accept();
             })).then(function(){
-                me.view && me.view.onAppReady(config);
-                me.onChangeProtectDocument();
+                if (me.view) {
+                    me.view.onAppReady(config);
+                    me.onChangeProtectDocument();
+                }
             });
         }
 
diff --git a/apps/documenteditor/main/app/controller/Main.js b/apps/documenteditor/main/app/controller/Main.js
index a0fdd0c70..75c0570a0 100644
--- a/apps/documenteditor/main/app/controller/Main.js
+++ b/apps/documenteditor/main/app/controller/Main.js
@@ -1694,7 +1694,9 @@ define([
                 var toolbarController   = application.getController('Toolbar');
                 toolbarController   && toolbarController.setApi(me.api);
 
-                if (this.appOptions.isEdit) {
+                if (this.appOptions.isRestrictedEdit)
+                    application.getController('DocProtection').setMode(me.appOptions).setConfig({config: me.editorConfig}, me.api);
+                else if (this.appOptions.isEdit) {
                     var rightmenuController = application.getController('RightMenu'),
                         fontsControllers    = application.getController('Common.Controllers.Fonts');
                     fontsControllers    && fontsControllers.setApi(me.api);

From 6f1ee48c6d209aa5497bb24c5a18b0315c6a16fa Mon Sep 17 00:00:00 2001
From: Julia Radzhabova <julia.radzhabova@onlyoffice.com>
Date: Wed, 28 Sep 2022 01:01:27 +0300
Subject: [PATCH 12/28] [DE] Refactoring document protection

---
 apps/common/main/lib/controller/Comments.js   | 27 +++++----
 .../main/lib/controller/ReviewChanges.js      | 58 ++++++++++---------
 .../template/ReviewChangesPopover.template    |  2 +-
 apps/common/main/lib/util/utils.js            | 16 -----
 apps/common/main/lib/view/ReviewChanges.js    | 17 +++---
 .../main/app/controller/DocProtection.js      | 19 +++---
 .../main/app/controller/DocumentHolder.js     | 27 ++++++---
 .../main/app/controller/FormsTab.js           | 24 ++++----
 .../main/app/controller/LeftMenu.js           | 26 ++++++---
 .../main/app/controller/Links.js              | 20 +++----
 .../main/app/controller/RightMenu.js          | 32 ++++++----
 .../main/app/controller/Toolbar.js            | 20 +++----
 .../main/app/view/DocumentHolder.js           | 15 +++--
 .../documenteditor/main/app/view/Statusbar.js | 28 +++++----
 14 files changed, 187 insertions(+), 144 deletions(-)

diff --git a/apps/common/main/lib/controller/Comments.js b/apps/common/main/lib/controller/Comments.js
index 160701fc7..115657f63 100644
--- a/apps/common/main/lib/controller/Comments.js
+++ b/apps/common/main/lib/controller/Comments.js
@@ -145,13 +145,18 @@ define([
                 }, this, area);
             }.bind(this));
             Common.NotificationCenter.on('app:ready', this.onAppReady.bind(this));
-            Common.NotificationCenter.on('protect:doclock', _.bind(this.onChangeProtectDocument, this));
         },
         onLaunch: function () {
             var filter = Common.localStorage.getKeysFilter();
             this.appPrefix = (filter && filter.length) ? filter.split(',')[0] : '';
             this._state = {
-                disableEditing: false // disable editing when disconnect/signed file/mail merge preview/review final or original/forms preview
+                disableEditing: false, // disable editing when disconnect/signed file/mail merge preview/review final or original/forms preview
+                docProtection: {
+                    isReadOnly: false,
+                    isReviewOnly: false,
+                    isFormsOnly: false,
+                    isCommentsOnly: false
+                }
             };
 
             this.collection                     =   this.getApplication().getCollection('Common.Collections.Comments');
@@ -1655,8 +1660,8 @@ define([
         },
 
         updatePreviewMode: function() {
-            var docProtection = Common.Utils.Store.get('docProtection', {});
-            var viewmode = this._state.disableEditing || !!docProtection.isReadOnly || !!docProtection.isFormsOnly;
+            var docProtection = this._state.docProtection;
+            var viewmode = this._state.disableEditing || docProtection.isReadOnly || docProtection.isFormsOnly;
 
             if (this.viewmode === viewmode) return;
             this.viewmode = viewmode;
@@ -1740,17 +1745,19 @@ define([
                 accept();
             })).then(function(){
                 me.onChangeProtectDocument();
+                Common.NotificationCenter.on('protect:doclock', _.bind(me.onChangeProtectDocument, me));
             });
         },
 
-        onChangeProtectDocument: function() {
-            var docProtection = Common.Utils.Store.get('docProtection');
-            if (!docProtection) {
-                var cntrl = this.getApplication().getController('DocProtection');
-                docProtection = cntrl ? cntrl.getDocProps() : null;
+        onChangeProtectDocument: function(props) {
+            if (!props) {
+                var docprotect = this.getApplication().getController('DocProtection');
+                props = docprotect ? docprotect.getDocProps() : null;
             }
-            if (docProtection)
+            if (props) {
+                this._state.docProtection = props;
                 this.updatePreviewMode();
+            }
         }
 
     }, Common.Controllers.Comments || {}));
diff --git a/apps/common/main/lib/controller/ReviewChanges.js b/apps/common/main/lib/controller/ReviewChanges.js
index 39cbafc03..3691dba1d 100644
--- a/apps/common/main/lib/controller/ReviewChanges.js
+++ b/apps/common/main/lib/controller/ReviewChanges.js
@@ -82,7 +82,8 @@ define([
                     'reviewchange:view':        _.bind(this.onReviewViewClick, this),
                     'reviewchange:compare':     _.bind(this.onCompareClick, this),
                     'lang:document':            _.bind(this.onDocLanguage, this),
-                    'collaboration:coauthmode': _.bind(this.onCoAuthMode, this)
+                    'collaboration:coauthmode': _.bind(this.onCoAuthMode, this),
+                    'protect:update':           _.bind(this.onChangeProtectDocument, this)
                 },
                 'Common.Views.ReviewChangesDialog': {
                     'reviewchange:accept':      _.bind(this.onAcceptClick, this),
@@ -103,7 +104,13 @@ define([
             this.viewmode = false;
 
             this._state = { posx: -1000, posy: -1000, popoverVisible: false, previewMode: false, compareSettings: null, wsLock: false, wsProps: [],
-                            disableEditing: false // disable editing when disconnect/signed file/mail merge preview/review final or original/forms preview
+                            disableEditing: false, // disable editing when disconnect/signed file/mail merge preview/review final or original/forms preview
+                            docProtection: {
+                                isReadOnly: false,
+                                isReviewOnly: false,
+                                isFormsOnly: false,
+                                isCommentsOnly: false
+                            }
                           };
 
             Common.NotificationCenter.on('reviewchanges:turn', this.onTurnPreview.bind(this));
@@ -113,7 +120,6 @@ define([
             Common.NotificationCenter.on('collaboration:sharing', this.changeAccessRights.bind(this));
             Common.NotificationCenter.on('collaboration:sharingdeny', this.onLostEditRights.bind(this));
             Common.NotificationCenter.on('protect:wslock', _.bind(this.onChangeProtectSheet, this));
-            Common.NotificationCenter.on('protect:doclock', _.bind(this.onChangeProtectDocument, this));
 
             this.userCollection.on('reset', _.bind(this.onUpdateUsers, this));
             this.userCollection.on('add',   _.bind(this.onUpdateUsers, this));
@@ -189,8 +195,7 @@ define([
         },
 
         updatePreviewMode: function() {
-            var docProtection = Common.Utils.Store.get('docProtection', {});
-            var viewmode = this._state.disableEditing || !!docProtection.isReadOnly || !!docProtection.isFormsOnly || !!docProtection.isCommentsOnly;
+            var viewmode = this._state.disableEditing || this._state.docProtection.isReadOnly || this._state.docProtection.isFormsOnly || this._state.docProtection.isCommentsOnly;
 
             if (this.viewmode === viewmode) return;
             this.viewmode = viewmode;
@@ -220,7 +225,7 @@ define([
         onApiShowChange: function (sdkchange, isShow) {
             var btnlock = true,
                 changes;
-            if (this.appConfig.canReview && !(this.appConfig.isReviewOnly || Common.Utils.Store.get('docProtection', {}).isReviewOnly)) {
+            if (this.appConfig.canReview && !(this.appConfig.isReviewOnly || this._state.docProtection.isReviewOnly)) {
                 if (sdkchange && sdkchange.length>0) {
                     changes = this.readSDKChange(sdkchange);
                     btnlock = this.isSelectedChangesLocked(changes, isShow);
@@ -495,7 +500,7 @@ define([
                 }
                 var date = (item.get_DateTime() == '') ? new Date() : new Date(item.get_DateTime()),
                     user = me.userCollection.findOriginalUser(item.get_UserId()),
-                    isProtectedReview = !!Common.Utils.Store.get('docProtection', {}).isReviewOnly,
+                    isProtectedReview = me._state.docProtection.isReviewOnly,
                     change = new Common.Models.ReviewChange({
                         uid         : Common.UI.getId(),
                         userid      : item.get_UserId(),
@@ -510,6 +515,7 @@ define([
                         changedata  : item,
                         scope       : me.view,
                         hint        : !me.appConfig.canReview,
+                        docProtection: me._state.docProtection,
                         goto        : (item.get_MoveType() == Asc.c_oAscRevisionsMove.MoveTo || item.get_MoveType() == Asc.c_oAscRevisionsMove.MoveFrom),
                         editable    : (me.appConfig.isReviewOnly || isProtectedReview) && (item.get_UserId() == me.currentUserId) || !(me.appConfig.isReviewOnly || isProtectedReview) && (!me.appConfig.canUseReviewPermissions || AscCommon.UserInfoParser.canEditReview(item.get_UserName()))
                     });
@@ -614,7 +620,7 @@ define([
         },
 
         onApiTrackRevisionsChange: function(localFlag, globalFlag, userId) {
-            if ( this.appConfig.isReviewOnly || Common.Utils.Store.get('docProtection', {}).isReviewOnly) {
+            if ( this.appConfig.isReviewOnly || this._state.docProtection.isReviewOnly) {
                 this.view.turnChanges(true);
             } else
             if ( this.appConfig.canReview ) {
@@ -873,7 +879,8 @@ define([
                         (!me.appConfig.customization.review || me.appConfig.customization.review.showReviewChanges===undefined) && me.appConfig.customization.showReviewChanges==true) ) {
                         me.dlgChanges = (new Common.Views.ReviewChangesDialog({
                             popoverChanges  : me.popoverChanges,
-                            mode            : me.appConfig
+                            mode            : me.appConfig,
+                            docProtection   : me._state.docProtection
                         }));
                         var sdk = $('#editor_sdk'),
                             offset = sdk.offset();
@@ -900,7 +907,6 @@ define([
                     });
                 }
                 me.onChangeProtectSheet();
-                me.onChangeProtectDocument();
                 if (me.view) {
                     me.lockToolbar(Common.enumLock.hideComments, !Common.localStorage.getBool(me.view.appPrefix + "settings-livecomment", true), {array: [me.view.btnCommentRemove, me.view.btnCommentResolve]});
                     me.lockToolbar(Common.enumLock['Objects'], !!me._state.wsProps['Objects'], {array: [me.view.btnCommentRemove, me.view.btnCommentResolve]});
@@ -1026,32 +1032,32 @@ define([
             this.lockToolbar(Common.enumLock['Objects'], !!this._state.wsProps['Objects'], {array: [this.view.btnCommentRemove, this.view.btnCommentResolve]});
         },
 
-        onChangeProtectDocument: function() {
-            var docProtection = Common.Utils.Store.get('docProtection');
-            if (!docProtection) {
-                var cntrl = this.getApplication().getController('DocProtection');
-                docProtection = cntrl ? cntrl.getDocProps() : null;
+        onChangeProtectDocument: function(props) {
+            if (!props) {
+                var docprotect = this.getApplication().getController('DocProtection');
+                props = docprotect ? docprotect.getDocProps() : null;
             }
-            if (docProtection) {
-                this.lockToolbar(Common.enumLock.docLockView, docProtection.isReadOnly);
-                this.lockToolbar(Common.enumLock.docLockForms, docProtection.isFormsOnly);
-                this.lockToolbar(Common.enumLock.docLockReview, docProtection.isReviewOnly);
-                this.lockToolbar(Common.enumLock.docLockComments, docProtection.isCommentsOnly);
+            if (props) {
+                this._state.docProtection = props;
+                this.lockToolbar(Common.enumLock.docLockView, props.isReadOnly);
+                this.lockToolbar(Common.enumLock.docLockForms, props.isFormsOnly);
+                this.lockToolbar(Common.enumLock.docLockReview, props.isReviewOnly);
+                this.lockToolbar(Common.enumLock.docLockComments, props.isCommentsOnly);
                 if (this.dlgChanges) {
-                    Common.Utils.lockControls(Common.enumLock.docLockView, docProtection.isReadOnly, {array: [this.dlgChanges.btnAccept, this.dlgChanges.btnReject]});
-                    Common.Utils.lockControls(Common.enumLock.docLockForms, docProtection.isFormsOnly, {array: [this.dlgChanges.btnAccept, this.dlgChanges.btnReject]});
-                    Common.Utils.lockControls(Common.enumLock.docLockReview, docProtection.isReviewOnly, {array: [this.dlgChanges.btnAccept, this.dlgChanges.btnReject]});
-                    Common.Utils.lockControls(Common.enumLock.docLockComments, docProtection.isCommentsOnly, {array: [this.dlgChanges.btnAccept, this.dlgChanges.btnReject]});
+                    Common.Utils.lockControls(Common.enumLock.docLockView, props.isReadOnly, {array: [this.dlgChanges.btnAccept, this.dlgChanges.btnReject]});
+                    Common.Utils.lockControls(Common.enumLock.docLockForms, props.isFormsOnly, {array: [this.dlgChanges.btnAccept, this.dlgChanges.btnReject]});
+                    Common.Utils.lockControls(Common.enumLock.docLockReview, props.isReviewOnly, {array: [this.dlgChanges.btnAccept, this.dlgChanges.btnReject]});
+                    Common.Utils.lockControls(Common.enumLock.docLockComments, props.isCommentsOnly, {array: [this.dlgChanges.btnAccept, this.dlgChanges.btnReject]});
                 }
                 if (this.appConfig.canReview) {
-                    if (docProtection.isReviewOnly) {
+                    if (props.isReviewOnly) {
                         this.onTurnPreview(true);
                         this.onApiShowChange();
                     } else if (this._state.prevReviewProtected) {
                         this.onTurnPreview(false);
                         this.onApiShowChange();
                     }
-                    this._state.prevReviewProtected = docProtection.isReviewOnly;
+                    this._state.prevReviewProtected = props.isReviewOnly;
                 }
                 this.updatePreviewMode();
             }
diff --git a/apps/common/main/lib/template/ReviewChangesPopover.template b/apps/common/main/lib/template/ReviewChangesPopover.template
index 8669c695d..409e4c0e5 100644
--- a/apps/common/main/lib/template/ReviewChangesPopover.template
+++ b/apps/common/main/lib/template/ReviewChangesPopover.template
@@ -9,7 +9,7 @@
         <div class="btn-goto img-commonctrl"></div>
         <% } %>
         <% if (!hint) { %>
-            <% if (scope.appConfig.isReviewOnly || Common.Utils.Store.get("docProtection", {}).isReviewOnly) { %>
+            <% if (scope.appConfig.isReviewOnly || docProtection.isReviewOnly) { %>
                 <% if (editable) { %>
                 <div class="btn-delete img-commonctrl"></div>
                 <% } %>
diff --git a/apps/common/main/lib/util/utils.js b/apps/common/main/lib/util/utils.js
index 78d492cc4..bab0f3cff 100644
--- a/apps/common/main/lib/util/utils.js
+++ b/apps/common/main/lib/util/utils.js
@@ -1096,19 +1096,3 @@ Common.Utils.getKeyByValue = function(obj, value) {
         }
     }
 };
-
-Common.Utils.Store = new(function() {
-    var settings = {};
-
-    var _get = function(name, defValue) {
-            return (settings[name]!==undefined) ? settings[name] : defValue;
-        },
-        _set = function(name, value) {
-            settings[name] = value;
-        };
-
-    return {
-        get: _get,
-        set: _set
-    }
-});
\ No newline at end of file
diff --git a/apps/common/main/lib/view/ReviewChanges.js b/apps/common/main/lib/view/ReviewChanges.js
index dcb4dce78..fb1336691 100644
--- a/apps/common/main/lib/view/ReviewChanges.js
+++ b/apps/common/main/lib/view/ReviewChanges.js
@@ -238,6 +238,10 @@ define([
                     me.fireEvent('comment:resolveComments', [item.value]);
                 });
             }
+            Common.NotificationCenter.on('protect:doclock', function (e) {
+                me.fireEvent('protect:update');
+            });
+            me.fireEvent('protect:update');
         }
 
         return {
@@ -691,7 +695,6 @@ define([
                         me.$el.find(separator_last).hide();
 
                     Common.NotificationCenter.trigger('tab:visible', 'review', (config.isEdit || config.canViewReview || config.canCoAuthoring && config.canComments) && Common.UI.LayoutManager.isElementVisible('toolbar-collaboration'));
-
                     setEvents.call(me);
                 });
             },
@@ -971,6 +974,7 @@ define([
             this.options.tpl = _.template(this.template)(this.options);
             this.popoverChanges = this.options.popoverChanges;
             this.mode = this.options.mode;
+            this.docProtection = this.options.docProtection;
 
             var filter = Common.localStorage.getKeysFilter();
             this.appPrefix = (filter && filter.length) ? filter.split(',')[0] : '';
@@ -1002,7 +1006,7 @@ define([
                 cls         : 'btn-toolbar',
                 caption     : this.txtAccept,
                 split       : true,
-                disabled    : this.mode.isReviewOnly || Common.Utils.Store.get('docProtection', {}).isReviewOnly || !!Common.Utils.InternalSettings.get(this.appPrefix + "accept-reject-lock"),
+                disabled    : this.mode.isReviewOnly || this.docProtection.isReviewOnly || !!Common.Utils.InternalSettings.get(this.appPrefix + "accept-reject-lock"),
                 lock        : [_set.reviewChangelock, _set.isReviewOnly, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.docLockView, _set.docLockForms, _set.docLockComments, _set.docLockReview],
                 menu        : this.mode.canUseReviewPermissions ? false : new Common.UI.Menu({
                     items: [
@@ -1040,11 +1044,10 @@ define([
             this.btnReject.render(this.$window.find('#id-review-button-reject'));
             var arr = [this.btnAccept, this.btnReject];
             Common.Utils.lockControls(Common.enumLock.isReviewOnly, this.mode.isReviewOnly, {array: arr});
-            var docProtection = Common.Utils.Store.get('docProtection', {});
-            Common.Utils.lockControls(Common.enumLock.docLockView, docProtection.isReadOnly, {array: arr});
-            Common.Utils.lockControls(Common.enumLock.docLockForms, docProtection.isFormsOnly, {array: arr});
-            Common.Utils.lockControls(Common.enumLock.docLockReview, docProtection.isReviewOnly, {array: arr});
-            Common.Utils.lockControls(Common.enumLock.docLockComments, docProtection.isCommentsOnly, {array: arr});
+            Common.Utils.lockControls(Common.enumLock.docLockView, this.docProtection.isReadOnly, {array: arr});
+            Common.Utils.lockControls(Common.enumLock.docLockForms, this.docProtection.isFormsOnly, {array: arr});
+            Common.Utils.lockControls(Common.enumLock.docLockReview, this.docProtection.isReviewOnly, {array: arr});
+            Common.Utils.lockControls(Common.enumLock.docLockComments, this.docProtection.isCommentsOnly, {array: arr});
             Common.Utils.lockControls(Common.enumLock.reviewChangelock, !!Common.Utils.InternalSettings.get(this.appPrefix + "accept-reject-lock"), {array: arr});
 
             var me = this;
diff --git a/apps/documenteditor/main/app/controller/DocProtection.js b/apps/documenteditor/main/app/controller/DocProtection.js
index 4dcc94bb6..557d56b31 100644
--- a/apps/documenteditor/main/app/controller/DocProtection.js
+++ b/apps/documenteditor/main/app/controller/DocProtection.js
@@ -198,14 +198,13 @@ define([
             // var isProtected = this.api.asc_isProtectedDocument();
             var isProtected = this.view ? this.view.btnProtectDoc.isActive() : false; // test
             this.view && this.view.btnProtectDoc.toggle(isProtected, true);
-            this.getDocProps(true);
-            Common.NotificationCenter.trigger('protect:doclock');
+            Common.NotificationCenter.trigger('protect:doclock', this.getDocProps(true));
         },
 
         getDocProps: function(update) {
             if (!this.appConfig || !this.appConfig.isEdit && !this.appConfig.isRestrictedEdit) return;
 
-            if (update || !Common.Utils.Store.get('docProtection')) {
+            if (update || !this._state.docProtection) {
                 // var docProtected = !!this.api.asc_isProtectedDocument(),
                 //     type;
                 //
@@ -215,10 +214,10 @@ define([
                 // }
 
                 // test //////
-                // if (Common.Utils.InternalSettings.get('protect-test-type')===undefined) {
-                //     this.view && this.view.btnProtectDoc.toggle(true, true);
-                //     Common.Utils.InternalSettings.set('protect-test-type', Asc.c_oAscProtection.Comments);
-                // }
+                if (Common.Utils.InternalSettings.get('protect-test-type')===undefined) {
+                    this.view && this.view.btnProtectDoc.toggle(true, true);
+                    Common.Utils.InternalSettings.set('protect-test-type', Asc.c_oAscProtection.Forms);
+                }
                 var docProtected = this.view ? this.view.btnProtectDoc.isActive() : true,
                     type;
 
@@ -226,14 +225,14 @@ define([
                     type = Common.Utils.InternalSettings.get('protect-test-type');
                 }
                 /////////////
-                Common.Utils.Store.set('docProtection', {
+                this._state.docProtection = {
                     isReadOnly: type===Asc.c_oAscProtection.View,
                     isCommentsOnly: type===Asc.c_oAscProtection.Comments,
                     isReviewOnly: type===Asc.c_oAscProtection.Review,
                     isFormsOnly: type===Asc.c_oAscProtection.Forms
-                });
+                };
             }
-            return Common.Utils.Store.get('docProtection');
+            return this._state.docProtection;
         }
 
     }, DE.Controllers.DocProtection || {}));
diff --git a/apps/documenteditor/main/app/controller/DocumentHolder.js b/apps/documenteditor/main/app/controller/DocumentHolder.js
index 3fe44e89c..f2a3cefab 100644
--- a/apps/documenteditor/main/app/controller/DocumentHolder.js
+++ b/apps/documenteditor/main/app/controller/DocumentHolder.js
@@ -187,6 +187,7 @@ define([
                     me.onDocumentHolderResize();
                 }
             });
+            Common.NotificationCenter.on('protect:doclock', _.bind(me.onChangeProtectDocument, me));
         },
 
         setApi: function(o) {
@@ -424,6 +425,8 @@ define([
             view.menuParaTOCSettings.on('click', _.bind(me.onParaTOCSettings, me));
             view.menuTableEquation.menu.on('item:click', _.bind(me.convertEquation, me));
             view.menuParagraphEquation.menu.on('item:click', _.bind(me.convertEquation, me));
+
+            me.onChangeProtectDocument();
         },
 
         getView: function (name) {
@@ -584,7 +587,7 @@ define([
         showObjectMenu: function(event, docElement, eOpts){
             var me = this;
             if (me.api){
-                var docProtection = Common.Utils.Store.get('docProtection', {});
+                var docProtection = me.documentHolder._docProtection;
                 var obj = (me.mode.isEdit && !(me._isDisabled || docProtection.isReadOnly || docProtection.isFormsOnly || docProtection.isCommentsOnly)) ?
                             me.fillMenuProps(me.api.getSelectedElements()) : me.fillViewMenuProps(me.api.getSelectedElements());
                 if (obj) me.showPopupMenu(obj.menu_to_show, obj.menu_props, event, docElement, eOpts);
@@ -613,7 +616,7 @@ define([
             var me = this,
                 currentMenu = me.documentHolder.currentMenu;
             if (currentMenu && currentMenu.isVisible() && currentMenu !== me.documentHolder.hdrMenu){
-                var docProtection = Common.Utils.Store.get('docProtection', {});
+                var docProtection = me.documentHolder._docProtection;
                 var obj = (me.mode.isEdit && !(me._isDisabled || docProtection.isReadOnly || docProtection.isFormsOnly || docProtection.isCommentsOnly)) ?
                             me.fillMenuProps(selectedElements) : me.fillViewMenuProps(selectedElements);
                 if (obj) {
@@ -827,7 +830,7 @@ define([
         onDialogAddHyperlink: function() {
             var me = this;
             var win, props, text;
-            var docProtection = Common.Utils.Store.get('docProtection', {});
+            var docProtection = me.documentHolder._docProtection;
             if (me.api && me.mode.isEdit && !(me._isDisabled || docProtection.isReadOnly || docProtection.isFormsOnly || docProtection.isCommentsOnly) && !me.getApplication().getController('LeftMenu').leftMenu.menuFile.isVisible()){
                 var handlerDlg = function(dlg, result) {
                     if (result == 'ok') {
@@ -1184,7 +1187,7 @@ define([
         },
 
         onDoubleClickOnChart: function(chart) {
-            var docProtection = Common.Utils.Store.get('docProtection', {});
+            var docProtection = this.documentHolder._docProtection;
             if (this.mode.isEdit && !(this._isDisabled || docProtection.isReadOnly || docProtection.isFormsOnly || docProtection.isCommentsOnly)) {
                 var diagramEditor = this.getApplication().getController('Common.Controllers.ExternalDiagramEditor').getView('Common.Views.ExternalDiagramEditor');
                 if (diagramEditor && chart) {
@@ -1196,7 +1199,7 @@ define([
         },
 
         onDoubleClickOnTableOleObject: function(chart) {
-            var docProtection = Common.Utils.Store.get('docProtection', {});
+            var docProtection = this.documentHolder._docProtection;
             if (this.mode.isEdit && !(this._isDisabled || docProtection.isReadOnly || docProtection.isFormsOnly || docProtection.isCommentsOnly)) {
                 var oleEditor = this.getApplication().getController('Common.Controllers.ExternalOleEditor').getView('Common.Views.ExternalOleEditor');
                 if (oleEditor && chart) {
@@ -1901,8 +1904,8 @@ define([
                     this.api.asc_ViewCertificate(datavalue); //certificate id
                     break;
                 case 2:
-                    var docProtection = Common.Utils.Store.get('docProtection', {});
-                    Common.NotificationCenter.trigger('protect:signature', 'visible', this._isDisabled || !!docProtection.isReadOnly || !!docProtection.isFormsOnly || !!docProtection.isCommentsOnly, datavalue);//guid, can edit settings for requested signature
+                    var docProtection = this.documentHolder._docProtection;
+                    Common.NotificationCenter.trigger('protect:signature', 'visible', this._isDisabled || docProtection.isReadOnly || docProtection.isFormsOnly || docProtection.isCommentsOnly, datavalue);//guid, can edit settings for requested signature
                     break;
                 case 3:
                     var me = this;
@@ -2315,6 +2318,16 @@ define([
             }
         },
 
+        onChangeProtectDocument: function(props) {
+            if (!props) {
+                var docprotect = this.getApplication().getController('DocProtection');
+                props = docprotect ? docprotect.getDocProps() : null;
+            }
+            if (props && this.documentHolder) {
+                this.documentHolder._docProtection = props;
+            }
+        },
+
         editComplete: function() {
             this.documentHolder && this.documentHolder.fireEvent('editcomplete', this.documentHolder);
         }
diff --git a/apps/documenteditor/main/app/controller/FormsTab.js b/apps/documenteditor/main/app/controller/FormsTab.js
index 728813d3d..35f52e116 100644
--- a/apps/documenteditor/main/app/controller/FormsTab.js
+++ b/apps/documenteditor/main/app/controller/FormsTab.js
@@ -434,18 +434,20 @@ define([
             }
         },
 
-        onChangeProtectDocument: function() {
-            var docProtection = Common.Utils.Store.get('docProtection');
-            if (!docProtection) {
-                var cntrl = this.getApplication().getController('DocProtection');
-                docProtection = cntrl ? cntrl.getDocProps() : null;
+        onChangeProtectDocument: function(props) {
+            if (!props) {
+                var docprotect = this.getApplication().getController('DocProtection');
+                props = docprotect ? docprotect.getDocProps() : null;
             }
-            if (docProtection && this.view) {
-                var arr = this.view.getButtons();
-                Common.Utils.lockControls(Common.enumLock.docLockView, docProtection.isReadOnly,   {array: arr});
-                Common.Utils.lockControls(Common.enumLock.docLockForms, docProtection.isFormsOnly,   {array: arr});
-                Common.Utils.lockControls(Common.enumLock.docLockReview, docProtection.isReviewOnly,   {array: arr});
-                Common.Utils.lockControls(Common.enumLock.docLockComments, docProtection.isCommentsOnly,   {array: arr});
+            if (props) {
+                this._state.docProtection = props;
+                if (this.view) {
+                    var arr = this.view.getButtons();
+                    Common.Utils.lockControls(Common.enumLock.docLockView, props.isReadOnly,   {array: arr});
+                    Common.Utils.lockControls(Common.enumLock.docLockForms, props.isFormsOnly,   {array: arr});
+                    Common.Utils.lockControls(Common.enumLock.docLockReview, props.isReviewOnly,   {array: arr});
+                    Common.Utils.lockControls(Common.enumLock.docLockComments, props.isCommentsOnly,   {array: arr});
+                }
             }
         }
 
diff --git a/apps/documenteditor/main/app/controller/LeftMenu.js b/apps/documenteditor/main/app/controller/LeftMenu.js
index 556862582..694413232 100644
--- a/apps/documenteditor/main/app/controller/LeftMenu.js
+++ b/apps/documenteditor/main/app/controller/LeftMenu.js
@@ -119,7 +119,15 @@ define([
         onLaunch: function() {
             this.leftMenu = this.createView('LeftMenu').render();
             this.leftMenu.btnSearchBar.on('toggle', _.bind(this.onMenuSearchBar, this));
-            this._state = {disableEditing: false};
+            this._state = {
+                disableEditing: false,
+                docProtection: {
+                    isReadOnly: false,
+                    isReviewOnly: false,
+                    isFormsOnly: false,
+                    isCommentsOnly: false
+                }
+            };
             Common.util.Shortcuts.delegateShortcuts({
                 shortcuts: {
                     'command+shift+s,ctrl+shift+s': _.bind(this.onShortcut, this, 'save'),
@@ -587,8 +595,7 @@ define([
         },
 
         updatePreviewMode: function() {
-            var docProtection = Common.Utils.Store.get('docProtection', {});
-            var viewmode = this._state.disableEditing || !!docProtection.isReadOnly || !!docProtection.isFormsOnly;
+            var viewmode = this._state.disableEditing || this._state.docProtection.isReadOnly || this._state.docProtection.isFormsOnly;
             if (this.viewmode === viewmode) return;
             this.viewmode = viewmode;
 
@@ -895,14 +902,15 @@ define([
             return this.leftMenu && this.leftMenu.panelComments && this.leftMenu.panelComments.isVisible();
         },
 
-        onChangeProtectDocument: function() {
-            var docProtection = Common.Utils.Store.get('docProtection');
-            if (!docProtection) {
-                var cntrl = this.getApplication().getController('DocProtection');
-                docProtection = cntrl ? cntrl.getDocProps() : null;
+        onChangeProtectDocument: function(props) {
+            if (!props) {
+                var docprotect = this.getApplication().getController('DocProtection');
+                props = docprotect ? docprotect.getDocProps() : null;
             }
-            if (docProtection)
+            if (props) {
+                this._state.docProtection = props;
                 this.updatePreviewMode();
+            }
         },
 
         textNoTextFound         : 'Text not found',
diff --git a/apps/documenteditor/main/app/controller/Links.js b/apps/documenteditor/main/app/controller/Links.js
index 04febdc0f..fb16e6a22 100644
--- a/apps/documenteditor/main/app/controller/Links.js
+++ b/apps/documenteditor/main/app/controller/Links.js
@@ -574,17 +574,17 @@ define([
             })).show();
         },
 
-        onChangeProtectDocument: function() {
-            var docProtection = Common.Utils.Store.get('docProtection');
-            if (!docProtection) {
-                var cntrl = this.getApplication().getController('DocProtection');
-                docProtection = cntrl ? cntrl.getDocProps() : null;
+        onChangeProtectDocument: function(props) {
+            if (!props) {
+                var docprotect = this.getApplication().getController('DocProtection');
+                props = docprotect ? docprotect.getDocProps() : null;
             }
-            if (docProtection) {
-                this.lockToolbar(Common.enumLock.docLockView, docProtection.isReadOnly);
-                this.lockToolbar(Common.enumLock.docLockForms, docProtection.isFormsOnly);
-                this.lockToolbar(Common.enumLock.docLockReview, docProtection.isReviewOnly);
-                this.lockToolbar(Common.enumLock.docLockComments, docProtection.isCommentsOnly);
+            if (props) {
+                this._state.docProtection = props;
+                this.lockToolbar(Common.enumLock.docLockView, props.isReadOnly);
+                this.lockToolbar(Common.enumLock.docLockForms, props.isFormsOnly);
+                this.lockToolbar(Common.enumLock.docLockReview, props.isReviewOnly);
+                this.lockToolbar(Common.enumLock.docLockComments, props.isCommentsOnly);
             }
         },
 
diff --git a/apps/documenteditor/main/app/controller/RightMenu.js b/apps/documenteditor/main/app/controller/RightMenu.js
index 101d48ede..23466eb39 100644
--- a/apps/documenteditor/main/app/controller/RightMenu.js
+++ b/apps/documenteditor/main/app/controller/RightMenu.js
@@ -54,7 +54,14 @@ define([
         initialize: function() {
             this.editMode = true;
             this._initSettings = true;
-            this._state = {};
+            this._state = {
+                docProtection: {
+                    isReadOnly: false,
+                    isReviewOnly: false,
+                    isFormsOnly: false,
+                    isCommentsOnly: false
+                }
+            };
             this.addListeners({
                 'RightMenu': {
                     'rightmenuclick': this.onRightMenuClick
@@ -158,8 +165,7 @@ define([
 
             var isChart = false,
                 isSmartArtInternal = false,
-                docProtection = Common.Utils.Store.get('docProtection', {}),
-                isProtected = !!docProtection.isReadOnly || !!docProtection.isFormsOnly || !!docProtection.isCommentsOnly;
+                isProtected = this._state.docProtection.isReadOnly || this._state.docProtection.isFormsOnly || this._state.docProtection.isCommentsOnly;
 
             var control_props = this.api.asc_IsContentControl() ? this.api.asc_GetContentControlProperties() : null,
                 control_lock = false;
@@ -472,16 +478,18 @@ define([
             }
         },
 
-        onChangeProtectDocument: function() {
-            var docProtection = Common.Utils.Store.get('docProtection');
-            if (!docProtection) {
-                var cntrl = this.getApplication().getController('DocProtection');
-                docProtection = cntrl ? cntrl.getDocProps() : null;
+        onChangeProtectDocument: function(props) {
+            if (!props) {
+                var docprotect = this.getApplication().getController('DocProtection');
+                props = docprotect ? docprotect.getDocProps() : null;
             }
-            if (docProtection && this.api) {
-                var selectedElements = this.api.getSelectedElements();
-                if (selectedElements.length > 0)
-                    this.onFocusObject(selectedElements);
+            if (props) {
+                this._state.docProtection = props;
+                if (this.api) {
+                    var selectedElements = this.api.getSelectedElements();
+                    if (selectedElements.length > 0)
+                        this.onFocusObject(selectedElements);
+                }
             }
         }
     });
diff --git a/apps/documenteditor/main/app/controller/Toolbar.js b/apps/documenteditor/main/app/controller/Toolbar.js
index 763dcfa7c..ecdea8744 100644
--- a/apps/documenteditor/main/app/controller/Toolbar.js
+++ b/apps/documenteditor/main/app/controller/Toolbar.js
@@ -3333,17 +3333,17 @@ define([
             })).show();
         },
 
-        onChangeProtectDocument: function() {
-            var docProtection = Common.Utils.Store.get('docProtection');
-            if (!docProtection) {
-                var cntrl = this.getApplication().getController('DocProtection');
-                docProtection = cntrl ? cntrl.getDocProps() : null;
+        onChangeProtectDocument: function(props) {
+            if (!props) {
+                var docprotect = this.getApplication().getController('DocProtection');
+                props = docprotect ? docprotect.getDocProps() : null;
             }
-            if (docProtection) {
-                this.toolbar.lockToolbar(Common.enumLock.docLockView, docProtection.isReadOnly);
-                this.toolbar.lockToolbar(Common.enumLock.docLockForms, docProtection.isFormsOnly);
-                this.toolbar.lockToolbar(Common.enumLock.docLockReview, docProtection.isReviewOnly);
-                this.toolbar.lockToolbar(Common.enumLock.docLockComments, docProtection.isCommentsOnly);
+            if (props) {
+                this._state.docProtection = props;
+                this.toolbar.lockToolbar(Common.enumLock.docLockView, props.isReadOnly);
+                this.toolbar.lockToolbar(Common.enumLock.docLockForms, props.isFormsOnly);
+                this.toolbar.lockToolbar(Common.enumLock.docLockReview, props.isReviewOnly);
+                this.toolbar.lockToolbar(Common.enumLock.docLockComments, props.isCommentsOnly);
             }
         },
 
diff --git a/apps/documenteditor/main/app/view/DocumentHolder.js b/apps/documenteditor/main/app/view/DocumentHolder.js
index 49c576700..3d98b204e 100644
--- a/apps/documenteditor/main/app/view/DocumentHolder.js
+++ b/apps/documenteditor/main/app/view/DocumentHolder.js
@@ -76,6 +76,12 @@ define([
             this._currentParaObjDisabled = false;
             this._currLang        = {};
             this._isDisabled = false;
+            this._docProtection = {
+                isReadOnly: false,
+                isReviewOnly: false,
+                isFormsOnly: false,
+                isCommentsOnly: false
+            };
         },
 
         render: function () {
@@ -152,7 +158,6 @@ define([
                         signGuid = (value.imgProps && value.imgProps.value && me.mode.isSignatureSupport) ? value.imgProps.value.asc_getSignatureId() : undefined,
                         signProps = (signGuid) ? me.api.asc_getSignatureSetup(signGuid) : null,
                         isInSign = !!signProps && me._canProtect,
-                        docProtection = Common.Utils.Store.get('docProtection', {}),
                         control_lock = (value.paraProps) ? (!value.paraProps.value.can_DeleteBlockContentControl() || !value.paraProps.value.can_EditBlockContentControl() ||
                                                             !value.paraProps.value.can_DeleteInlineContentControl() || !value.paraProps.value.can_EditInlineContentControl()) : false,
                         canComment = !isInChart && me.api.can_AddQuotedComment() !== false && me.mode.canCoAuthoring && me.mode.canComments && !me._isDisabled && !control_lock,
@@ -170,7 +175,7 @@ define([
                     }
 
                     me.menuViewUndo.setVisible(me.mode.canCoAuthoring && me.mode.canComments && !me._isDisabled);
-                    me.menuViewUndo.setDisabled(!me.api.asc_getCanUndo() || !!docProtection.isReadOnly);
+                    me.menuViewUndo.setDisabled(!me.api.asc_getCanUndo() || me._docProtection.isReadOnly);
                     me.menuViewCopySeparator.setVisible(isInSign);
 
                     var isRequested = (signProps) ? signProps.asc_getRequested() : false;
@@ -188,15 +193,15 @@ define([
                     }
 
                     me.menuViewAddComment.setVisible(canComment);
-                    me.menuViewAddComment.setDisabled(value.paraProps && value.paraProps.locked === true || !!docProtection.isReadOnly || !!docProtection.isFormsOnly);
+                    me.menuViewAddComment.setDisabled(value.paraProps && value.paraProps.locked === true || me._docProtection.isReadOnly || me._docProtection.isFormsOnly);
 
                     var disabled = value.paraProps && value.paraProps.locked === true;
                     var cancopy = me.api && me.api.can_CopyCut();
                     me.menuViewCopy.setDisabled(!cancopy);
                     me.menuViewCut.setVisible(me._fillFormMode && canEditControl);
-                    me.menuViewCut.setDisabled(disabled || !cancopy || !!docProtection.isReadOnly || !!docProtection.isCommentsOnly);
+                    me.menuViewCut.setDisabled(disabled || !cancopy || me._docProtection.isReadOnly || me._docProtection.isCommentsOnly);
                     me.menuViewPaste.setVisible(me._fillFormMode && canEditControl);
-                    me.menuViewPaste.setDisabled(disabled || !!docProtection.isReadOnly || !!docProtection.isCommentsOnly);
+                    me.menuViewPaste.setDisabled(disabled || me._docProtection.isReadOnly || me._docProtection.isCommentsOnly);
                     me.menuViewPrint.setVisible(me.mode.canPrint && !me._fillFormMode);
                     me.menuViewPrint.setDisabled(!cancopy);
 
diff --git a/apps/documenteditor/main/app/view/Statusbar.js b/apps/documenteditor/main/app/view/Statusbar.js
index 54db2be0c..072bc49c4 100644
--- a/apps/documenteditor/main/app/view/Statusbar.js
+++ b/apps/documenteditor/main/app/view/Statusbar.js
@@ -178,7 +178,14 @@ define([
                 _.extend(this, options);
                 this.pages = new DE.Models.Pages({current:1, count:1});
                 this.pages.on('change', _.bind(_updatePagesCaption,this));
-                this._state = {};
+                this._state = {
+                    docProtection: {
+                        isReadOnly: false,
+                        isReviewOnly: false,
+                        isFormsOnly: false,
+                        isCommentsOnly: false
+                    }
+                };
                 this._isDisabled = false;
 
                 var me = this;
@@ -371,7 +378,8 @@ define([
                 });
                 this.langMenu.resetItems(arr);
                 if (this.langMenu.items.length>0) {
-                    this.btnLanguage.setDisabled(!!this.mode.isDisconnected);
+                    var isProtected = this._state.docProtection.isReadOnly || this._state.docProtection.isFormsOnly || this._state.docProtection.isCommentsOnly;
+                    this.btnLanguage.setDisabled(this._isDisabled || !!this.mode.isDisconnected || isProtected);
                 }
             },
 
@@ -404,20 +412,20 @@ define([
 
             SetDisabled: function(disable) {
                 this._isDisabled = disable;
-                var docProtection = Common.Utils.Store.get('docProtection', {}),
-                    isProtected = !!docProtection.isReadOnly || !!docProtection.isFormsOnly || !!docProtection.isCommentsOnly
+                var isProtected = this._state.docProtection.isReadOnly || this._state.docProtection.isFormsOnly || this._state.docProtection.isCommentsOnly;
                 this.btnLanguage.setDisabled(disable || this.langMenu.items.length<1 || isProtected);
                 this.btnTurnReview && this.btnTurnReview.setDisabled(disable || isProtected);
             },
 
-            onChangeProtectDocument: function() {
-                var docProtection = Common.Utils.Store.get('docProtection');
-                if (!docProtection) {
-                    var cntrl = DE.getController('DocProtection');
-                    docProtection = cntrl ? cntrl.getDocProps() : null;
+            onChangeProtectDocument: function(props) {
+                if (!props) {
+                    var docprotect = DE.getController('DocProtection');
+                    props = docprotect ? docprotect.getDocProps() : null;
                 }
-                if (docProtection)
+                if (props) {
+                    this._state.docProtection = props;
                     this.SetDisabled(this._isDisabled);
+                }
             },
 
             onApiCoAuthoringDisconnect: function() {

From 041557e6a3c2f551e1b38e05008858d3e8d78f69 Mon Sep 17 00:00:00 2001
From: Julia Radzhabova <julia.radzhabova@onlyoffice.com>
Date: Wed, 28 Sep 2022 17:29:24 +0300
Subject: [PATCH 13/28] Lock edit plugins when document is protected

---
 apps/common/main/lib/controller/Plugins.js    | 40 ++++++++++++++++++-
 apps/common/main/lib/view/Plugins.js          | 33 +++++++++++----
 .../main/app/controller/Main.js               |  2 +-
 .../main/app/controller/LeftMenu.js           |  4 +-
 4 files changed, 66 insertions(+), 13 deletions(-)

diff --git a/apps/common/main/lib/controller/Plugins.js b/apps/common/main/lib/controller/Plugins.js
index b17280eab..ddc0c42db 100644
--- a/apps/common/main/lib/controller/Plugins.js
+++ b/apps/common/main/lib/controller/Plugins.js
@@ -105,6 +105,7 @@ define([
             Common.NotificationCenter.on('app:face', this.onAppShowed.bind(this));
             Common.NotificationCenter.on('uitheme:changed', this.updatePluginsButtons.bind(this));
             Common.NotificationCenter.on('window:resize', this.updatePluginsButtons.bind(this));
+            Common.NotificationCenter.on('app:ready', this.onAppReady.bind(this));
         },
 
         loadConfig: function(data) {
@@ -151,6 +152,16 @@ define([
         onAppShowed: function (config) {
         },
 
+        onAppReady: function (config) {
+            var me = this;
+            (new Promise(function (accept, reject) {
+                accept();
+            })).then(function(){
+                me.onChangeProtectDocument();
+                Common.NotificationCenter.on('protect:doclock', _.bind(me.onChangeProtectDocument, me));
+            });
+        },
+
         setApi: function(api) {
             this.api = api;
 
@@ -225,6 +236,10 @@ define([
                 var _group = $('> .group', me.$toolbarPanelPlugins);
                 var $slot = $('<span class="btn-slot text x-huge"></span>').appendTo(_group);
                 btn.render($slot);
+                var docProtection = me.panelPlugins._state.docProtection;
+                Common.Utils.lockControls(Common.enumLock.docLockView, docProtection.isReadOnly, {array: btn});
+                Common.Utils.lockControls(Common.enumLock.docLockForms, docProtection.isFormsOnly, {array: btn});
+                Common.Utils.lockControls(Common.enumLock.docLockComments, docProtection.isCommentsOnly, {array: btn});
             }
         },
 
@@ -259,6 +274,10 @@ define([
                     rank = new_rank;
                 });
                 _group.appendTo(me.$toolbarPanelPlugins);
+                var docProtection = me.panelPlugins._state.docProtection;
+                Common.Utils.lockControls(Common.enumLock.docLockView, docProtection.isReadOnly, {array: me.panelPlugins.lockedControls});
+                Common.Utils.lockControls(Common.enumLock.docLockForms, docProtection.isFormsOnly, {array: me.panelPlugins.lockedControls});
+                Common.Utils.lockControls(Common.enumLock.docLockComments, docProtection.isCommentsOnly, {array: me.panelPlugins.lockedControls});
             } else {
                 console.error('toolbar panel isnot created');
             }
@@ -518,10 +537,13 @@ define([
                     }
 
                     var variationsArr = [],
-                        pluginVisible = false;
+                        pluginVisible = false,
+                        isDisplayedInViewer = false;
                     item.variations.forEach(function(itemVar){
                         var visible = (isEdit || itemVar.isViewer && (itemVar.isDisplayedInViewer!==false)) && _.contains(itemVar.EditorsSupport, editor) && !itemVar.isSystem;
                         if ( visible ) pluginVisible = true;
+                        if (itemVar.isViewer && (itemVar.isDisplayedInViewer!==false))
+                            isDisplayedInViewer = true;
 
                         if (item.isUICustomizer ) {
                             visible && arrUI.push({
@@ -571,7 +593,8 @@ define([
                             groupName: (item.group) ? item.group.name : '',
                             groupRank: (item.group) ? item.group.rank : 0,
                             minVersion: item.minVersion,
-                            original: item
+                            original: item,
+                            isDisplayedInViewer: isDisplayedInViewer
                         }));
                     }
                 });
@@ -720,6 +743,19 @@ define([
                     }, funcComplete);
             } else
                 funcComplete();
+        },
+
+        onChangeProtectDocument: function(props) {
+            if (!props) {
+                var docprotect = this.getApplication().getController('DocProtection');
+                props = docprotect ? docprotect.getDocProps() : null;
+            }
+            if (props && this.panelPlugins) {
+                this.panelPlugins._state.docProtection = props;
+                Common.Utils.lockControls(Common.enumLock.docLockView, props.isReadOnly, {array: this.panelPlugins.lockedControls});
+                Common.Utils.lockControls(Common.enumLock.docLockForms, props.isFormsOnly, {array: this.panelPlugins.lockedControls});
+                Common.Utils.lockControls(Common.enumLock.docLockComments, props.isCommentsOnly, {array: this.panelPlugins.lockedControls});
+            }
         }
     }, Common.Controllers.Plugins || {}));
 });
diff --git a/apps/common/main/lib/view/Plugins.js b/apps/common/main/lib/view/Plugins.js
index 37c97cc1d..fdc530457 100644
--- a/apps/common/main/lib/view/Plugins.js
+++ b/apps/common/main/lib/view/Plugins.js
@@ -74,14 +74,16 @@ define([
             _.extend(this, options);
             this._locked = false;
             this._state = {
-                DisabledControls: false
+                DisabledControls: false,
+                docProtection: {
+                    isReadOnly: false,
+                    isReviewOnly: false,
+                    isFormsOnly: false,
+                    isCommentsOnly: false
+                }
             };
             this.lockedControls = [];
             Common.UI.BaseView.prototype.initialize.call(this, arguments);
-
-            Common.NotificationCenter.on('app:ready', function (mode) {
-                Common.Utils.asyncCall(this._onAppReady, this, mode);
-            }.bind(this));
         },
 
         render: function(el) {
@@ -153,6 +155,7 @@ define([
             if ( !this.storePlugins.isEmpty() ) {
                 var me = this;
                 var _group = $('<div class="group"></div>');
+                var _set = Common.enumLock;
                 this.storePlugins.each(function (model) {
                     if (model.get('visible')) {
                         var modes = model.get('variations'),
@@ -167,6 +170,7 @@ define([
                                 split: modes && modes.length > 1,
                                 value: guid,
                                 hint: model.get('name'),
+                                lock: model.get('isDisplayedInViewer') ? [_set.viewMode, _set.previewReviewMode, _set.viewFormMode, _set.selRangeEdit, _set.editFormula] : [_set.viewMode, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.docLockView, _set.docLockForms, _set.docLockComments, _set.selRangeEdit, _set.editFormula],
                                 dataHint: '1',
                                 dataHintDirection: 'bottom',
                                 dataHintOffset: 'small'
@@ -179,6 +183,10 @@ define([
                         me.lockedControls.push(btn);
                     }
                 });
+                var docProtection = me._state.docProtection
+                Common.Utils.lockControls(Common.enumLock.docLockView, docProtection.isReadOnly, {array: me.lockedControls});
+                Common.Utils.lockControls(Common.enumLock.docLockForms, docProtection.isFormsOnly, {array: me.lockedControls});
+                Common.Utils.lockControls(Common.enumLock.docLockComments, docProtection.isCommentsOnly, {array: me.lockedControls});
 
                 parent.html(_group);
                 $('<div class="separator long"></div>').prependTo(parent);
@@ -204,6 +212,16 @@ define([
             }
         },
 
+        SetDisabled: function(disable, reviewMode, fillFormMode) {
+            if (reviewMode) {
+                Common.Utils.lockControls(Common.enumLock.previewReviewMode, disable, {array: this.lockedControls});
+            } else if (fillFormMode) {
+                Common.Utils.lockControls(Common.enumLock.viewFormMode, disable, {array: this.lockedControls});
+            } else {
+                Common.Utils.lockControls(Common.enumLock.viewMode, disable, {array: this.lockedControls});
+            }
+        },
+
         openInsideMode: function(name, url, frameId) {
             if (!this.pluginsPanel) return false;
 
@@ -289,9 +307,6 @@ define([
                 this.loadMask.hide();
         },
 
-        _onAppReady: function (mode) {
-        },
-
         parseIcons: function(icons) {
             if (icons.length && typeof icons[0] !== 'string') {
                 var theme = Common.UI.Themes.currentThemeId().toLowerCase(),
@@ -389,6 +404,7 @@ define([
                     });
             });
 
+            var _set = Common.enumLock;
             var btn = new Common.UI.Button({
                 cls: 'btn-toolbar x-huge icon-top',
                 iconImg: icon_url,
@@ -397,6 +413,7 @@ define([
                 split: _menu_items.length > 1,
                 value: guid,
                 hint: model.get('name'),
+                lock: model.get('isDisplayedInViewer') ? [_set.viewMode, _set.previewReviewMode, _set.viewFormMode, _set.selRangeEdit, _set.editFormula] : [_set.viewMode, _set.previewReviewMode, _set.viewFormMode, _set.docLockView, _set.docLockForms, _set.docLockComments, _set.selRangeEdit, _set.editFormula ],
                 dataHint: '1',
                 dataHintDirection: 'bottom',
                 dataHintOffset: 'small'
diff --git a/apps/documenteditor/main/app/controller/Main.js b/apps/documenteditor/main/app/controller/Main.js
index 75c0570a0..71feac14f 100644
--- a/apps/documenteditor/main/app/controller/Main.js
+++ b/apps/documenteditor/main/app/controller/Main.js
@@ -842,7 +842,7 @@ define([
                     app.getController('Navigation') && app.getController('Navigation').SetDisabled(disable);
                 }
                 if (options.plugins) {
-                    app.getController('Common.Controllers.Plugins').getView('Common.Views.Plugins').disableControls(disable);
+                    app.getController('Common.Controllers.Plugins').getView('Common.Views.Plugins').SetDisabled(disable, options.reviewMode, options.fillFormMode);
                 }
                 if (options.protect) {
                     app.getController('Common.Controllers.Protection').SetDisabled(disable, false);
diff --git a/apps/spreadsheeteditor/main/app/controller/LeftMenu.js b/apps/spreadsheeteditor/main/app/controller/LeftMenu.js
index edbc33b2a..d1e6f2c58 100644
--- a/apps/spreadsheeteditor/main/app/controller/LeftMenu.js
+++ b/apps/spreadsheeteditor/main/app/controller/LeftMenu.js
@@ -805,8 +805,8 @@ define([
             this.leftMenu.btnSearchBar.setDisabled(isRangeSelection);
             this.leftMenu.btnSpellcheck.setDisabled(isRangeSelection);
             if (this.mode.canPlugins && this.leftMenu.panelPlugins) {
+                Common.Utils.lockControls(Common.enumLock.selRangeEdit, isRangeSelection, {array: this.leftMenu.panelPlugins.lockedControls});
                 this.leftMenu.panelPlugins.setLocked(isRangeSelection);
-                this.leftMenu.panelPlugins.disableControls(isRangeSelection);
             }
         },
 
@@ -817,8 +817,8 @@ define([
             this.leftMenu.btnSearchBar.setDisabled(isEditFormula);
             this.leftMenu.btnSpellcheck.setDisabled(isEditFormula);
             if (this.mode.canPlugins && this.leftMenu.panelPlugins) {
+                Common.Utils.lockControls(Common.enumLock.editFormula, isEditFormula, {array: this.leftMenu.panelPlugins.lockedControls});
                 this.leftMenu.panelPlugins.setLocked(isEditFormula);
-                this.leftMenu.panelPlugins.disableControls(isEditFormula);
             }
         },
 

From 96cc66875e1a8820ba32aee467c3ddac2b54fa52 Mon Sep 17 00:00:00 2001
From: Julia Radzhabova <julia.radzhabova@onlyoffice.com>
Date: Mon, 3 Oct 2022 13:44:27 +0300
Subject: [PATCH 14/28] [DE] Use sdk methods

---
 .../main/app/controller/DocProtection.js      | 75 ++++++-------------
 .../main/app/view/ProtectDialog.js            | 16 ++--
 2 files changed, 29 insertions(+), 62 deletions(-)

diff --git a/apps/documenteditor/main/app/controller/DocProtection.js b/apps/documenteditor/main/app/controller/DocProtection.js
index 557d56b31..069e6a2da 100644
--- a/apps/documenteditor/main/app/controller/DocProtection.js
+++ b/apps/documenteditor/main/app/controller/DocProtection.js
@@ -46,13 +46,6 @@ define([
 ], function () {
     'use strict';
 
-    Asc.c_oAscProtection = {
-        View: 1,
-        Forms: 2,
-        Review: 3,
-        Comments: 4
-    };
-
     if (!Common.enumLock)
         Common.enumLock = {};
 
@@ -94,7 +87,7 @@ define([
         setApi: function (api) {
             if (api) {
                 this.api = api;
-                this.api.asc_registerCallback('asc_onChangeProtectDocument',_.bind(this.onChangeProtectDocument, this));
+                this.api.asc_registerCallback('asc_onChangeDocumentProtection',_.bind(this.onChangeProtectDocument, this));
             }
         },
 
@@ -128,14 +121,7 @@ define([
                         handler: function(result, value, props) {
                             btn = result;
                             if (result == 'ok') {
-                                // var props = me.api.asc_getProtectedDocument();
-                                // props.asc_setType(props);
-                                // props.asc_setLockPwd(value);
-                                // me.api.asc_setProtectedDocument(props);
-
-                                Common.Utils.InternalSettings.set('protect-test-type', props);
-                                me.view.btnProtectDoc.toggle(true, true); // test
-                                me.onChangeProtectDocument(); // test
+                                me.api.asc_setDocumentProtection(props, value);
                             }
                             Common.NotificationCenter.trigger('edit:complete');
                         }
@@ -148,10 +134,8 @@ define([
             } else {
                 var me = this,
                     btn,
-                    // props = me.api.asc_getProtectedDocument();
-                    props = undefined; // test
-                // if (props.asc_isPassword()) {
-                if (props && props.asc_isPassword()) {
+                    props = me.api.asc_getDocumentProtection();
+                if (props && props[1]) {
                     var win = new Common.Views.OpenDialog({
                         title: me.view.txtWBUnlockTitle,
                         closable: true,
@@ -162,8 +146,7 @@ define([
                             btn = result;
                             if (result == 'ok') {
                                 if (me.api) {
-                                    // props.asc_setLockPwd(value && value.drmOptions ? value.drmOptions.asc_getPassword() : undefined);
-                                    // me.api.asc_setProtectedDocument(props);
+                                    me.api.asc_setProtectedDocument(Asc.c_oAscEDocProtect.None, value && value.drmOptions ? value.drmOptions.asc_getPassword() : undefined);
                                 }
                                 Common.NotificationCenter.trigger('edit:complete');
                             }
@@ -175,10 +158,7 @@ define([
 
                     win.show();
                 } else {
-                    me.view.btnProtectDoc.toggle(false, true); // test
-                    me.onChangeProtectDocument(); // test
-                    // props.asc_setLockPwd();
-                    // me.api.asc_setProtectedDocument(props);
+                    me.api.asc_setProtectedDocument(Asc.c_oAscEDocProtect.None);
                 }
             }
         },
@@ -190,46 +170,33 @@ define([
             (new Promise(function (resolve) {
                 resolve();
             })).then(function () {
-                // me.view.btnProtectDoc.toggle(me.api.asc_isProtectedDocument(), true);
+                var props = me.api.asc_getDocumentProtection(),
+                    isProtected = props && (props[0] === Asc.c_oAscEDocProtect.ReadOnly || props[0] === Asc.c_oAscEDocProtect.Comments ||
+                                            props[0] === Asc.c_oAscEDocProtect.TrackedChanges || props[0] === Asc.c_oAscEDocProtect.Forms);
+
+                me.view.btnProtectDoc.toggle(!!isProtected, true);
             });
         },
 
         onChangeProtectDocument: function() {
-            // var isProtected = this.api.asc_isProtectedDocument();
-            var isProtected = this.view ? this.view.btnProtectDoc.isActive() : false; // test
+            var props = this.getDocProps(true),
+                isProtected = props && (props[0] === Asc.c_oAscEDocProtect.ReadOnly || props[0] === Asc.c_oAscEDocProtect.Comments ||
+                                        props[0] === Asc.c_oAscEDocProtect.TrackedChanges || props[0] === Asc.c_oAscEDocProtect.Forms);
             this.view && this.view.btnProtectDoc.toggle(isProtected, true);
-            Common.NotificationCenter.trigger('protect:doclock', this.getDocProps(true));
+            Common.NotificationCenter.trigger('protect:doclock', props);
         },
 
         getDocProps: function(update) {
             if (!this.appConfig || !this.appConfig.isEdit && !this.appConfig.isRestrictedEdit) return;
 
             if (update || !this._state.docProtection) {
-                // var docProtected = !!this.api.asc_isProtectedDocument(),
-                //     type;
-                //
-                // if (docProtected) {
-                //     var props = this.api.asc_getProtectedDocument();
-                //     type = props.asc_getType();
-                // }
-
-                // test //////
-                if (Common.Utils.InternalSettings.get('protect-test-type')===undefined) {
-                    this.view && this.view.btnProtectDoc.toggle(true, true);
-                    Common.Utils.InternalSettings.set('protect-test-type', Asc.c_oAscProtection.Forms);
-                }
-                var docProtected = this.view ? this.view.btnProtectDoc.isActive() : true,
-                    type;
-
-                if (docProtected) {
-                    type = Common.Utils.InternalSettings.get('protect-test-type');
-                }
-                /////////////
+                var props = this.api.asc_getDocumentProtection(),
+                    type = props ? props[0] : Asc.c_oAscEDocProtect.None;
                 this._state.docProtection = {
-                    isReadOnly: type===Asc.c_oAscProtection.View,
-                    isCommentsOnly: type===Asc.c_oAscProtection.Comments,
-                    isReviewOnly: type===Asc.c_oAscProtection.Review,
-                    isFormsOnly: type===Asc.c_oAscProtection.Forms
+                    isReadOnly: type===Asc.c_oAscEDocProtect.ReadOnly,
+                    isCommentsOnly: type===Asc.c_oAscEDocProtect.Comments,
+                    isReviewOnly: type===Asc.c_oAscEDocProtect.TrackedChanges,
+                    isFormsOnly: type===Asc.c_oAscEDocProtect.Forms
                 };
             }
             return this._state.docProtection;
diff --git a/apps/documenteditor/main/app/view/ProtectDialog.js b/apps/documenteditor/main/app/view/ProtectDialog.js
index 2eeb9f018..75376afe0 100644
--- a/apps/documenteditor/main/app/view/ProtectDialog.js
+++ b/apps/documenteditor/main/app/view/ProtectDialog.js
@@ -121,7 +121,7 @@ define([
                 el: this.$window.find('#id-protect-radio-view'),
                 labelText: this.textView,
                 name: 'asc-radio-protect-mode',
-                value: Asc.c_oAscProtection.View,
+                value: Asc.c_oAscEDocProtect.ReadOnly,
                 checked: true
             });
 
@@ -129,21 +129,21 @@ define([
                 el: this.$window.find('#id-protect-radio-forms'),
                 labelText: this.textForms,
                 name: 'asc-radio-protect-mode',
-                value: Asc.c_oAscProtection.Forms
+                value: Asc.c_oAscEDocProtect.Forms
             });
 
             this.rbReview = new Common.UI.RadioBox({
                 el: this.$window.find('#id-protect-radio-review'),
                 labelText: this.textReview,
                 name: 'asc-radio-protect-mode',
-                value: Asc.c_oAscProtection.Review
+                value: Asc.c_oAscEDocProtect.TrackedChanges
             });
 
             this.rbComments = new Common.UI.RadioBox({
                 el: this.$window.find('#id-protect-radio-comment'),
                 labelText: this.textComments,
                 name: 'asc-radio-protect-mode',
-                value: Asc.c_oAscProtection.Comments
+                value: Asc.c_oAscEDocProtect.Comments
             });
 
             this.afterRender();
@@ -199,13 +199,13 @@ define([
 
         getSettings: function() {
             if (this.rbView.getValue())
-                return Asc.c_oAscProtection.View;
+                return Asc.c_oAscEDocProtect.ReadOnly;
             if (this.rbForms.getValue())
-                return Asc.c_oAscProtection.Forms;
+                return Asc.c_oAscEDocProtect.Forms;
             if (this.rbReview.getValue())
-                return Asc.c_oAscProtection.Review;
+                return Asc.c_oAscEDocProtect.TrackedChanges;
             if (this.rbComments.getValue())
-                return Asc.c_oAscProtection.Comments;
+                return Asc.c_oAscEDocProtect.Comments;
         },
 
         txtPassword : "Password",

From 064fc09574476e9e5538bf570dc31e653f85f5b7 Mon Sep 17 00:00:00 2001
From: Julia Radzhabova <julia.radzhabova@onlyoffice.com>
Date: Mon, 3 Oct 2022 23:36:58 +0300
Subject: [PATCH 15/28] [DE] Fix protection

---
 apps/documenteditor/main/app/controller/DocProtection.js | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/apps/documenteditor/main/app/controller/DocProtection.js b/apps/documenteditor/main/app/controller/DocProtection.js
index 069e6a2da..6c8fe6c2b 100644
--- a/apps/documenteditor/main/app/controller/DocProtection.js
+++ b/apps/documenteditor/main/app/controller/DocProtection.js
@@ -146,7 +146,7 @@ define([
                             btn = result;
                             if (result == 'ok') {
                                 if (me.api) {
-                                    me.api.asc_setProtectedDocument(Asc.c_oAscEDocProtect.None, value && value.drmOptions ? value.drmOptions.asc_getPassword() : undefined);
+                                    me.api.asc_setDocumentProtection(Asc.c_oAscEDocProtect.None, value && value.drmOptions ? value.drmOptions.asc_getPassword() : undefined);
                                 }
                                 Common.NotificationCenter.trigger('edit:complete');
                             }
@@ -158,7 +158,7 @@ define([
 
                     win.show();
                 } else {
-                    me.api.asc_setProtectedDocument(Asc.c_oAscEDocProtect.None);
+                    me.api.asc_setDocumentProtection(Asc.c_oAscEDocProtect.None);
                 }
             }
         },

From e07e1305a43c23bd83457fed1f82d0370708b865 Mon Sep 17 00:00:00 2001
From: Julia Radzhabova <julia.radzhabova@onlyoffice.com>
Date: Tue, 4 Oct 2022 14:17:08 +0300
Subject: [PATCH 16/28] [DE] Apply edit restrictions for protected document

---
 .../main/lib/controller/ReviewChanges.js      |  6 ++--
 .../main/app/controller/DocProtection.js      | 35 ++++++++++++++++++-
 .../main/app/controller/FormsTab.js           |  7 ++++
 3 files changed, 45 insertions(+), 3 deletions(-)

diff --git a/apps/common/main/lib/controller/ReviewChanges.js b/apps/common/main/lib/controller/ReviewChanges.js
index 3691dba1d..102289694 100644
--- a/apps/common/main/lib/controller/ReviewChanges.js
+++ b/apps/common/main/lib/controller/ReviewChanges.js
@@ -651,8 +651,10 @@ define([
             this.turnDisplayMode(item.value);
             if (!this.appConfig.isEdit && !this.appConfig.isRestrictedEdit)
                 Common.localStorage.setItem(this.view.appPrefix + "review-mode", item.value); // for viewer
-            else if (item.value=='markup' || item.value=='simple')
+            else if (item.value=='markup' || item.value=='simple') {
                 Common.localStorage.setItem(this.view.appPrefix + "review-mode-editor", item.value); // for editor save only markup modes
+                Common.Utils.InternalSettings.set(this.view.appPrefix + "review-mode-editor", item.value);
+            }
             Common.NotificationCenter.trigger('edit:complete', this.view);
         },
 
@@ -871,7 +873,7 @@ define([
                         !val && (val = me.appConfig.customization ? me.appConfig.customization.reviewDisplay : undefined);
                         val = /^(original|final|markup|simple)$/i.test(val) ? val.toLocaleLowerCase() : 'markup';
                     }
-
+                    Common.Utils.InternalSettings.set(me.view.appPrefix + "review-mode-editor", val);
                     me.turnDisplayMode(val); // load display mode for all modes (viewer or editor)
                     me.view.turnDisplayMode(val);
 
diff --git a/apps/documenteditor/main/app/controller/DocProtection.js b/apps/documenteditor/main/app/controller/DocProtection.js
index 6c8fe6c2b..02860a1ce 100644
--- a/apps/documenteditor/main/app/controller/DocProtection.js
+++ b/apps/documenteditor/main/app/controller/DocProtection.js
@@ -173,8 +173,8 @@ define([
                 var props = me.api.asc_getDocumentProtection(),
                     isProtected = props && (props[0] === Asc.c_oAscEDocProtect.ReadOnly || props[0] === Asc.c_oAscEDocProtect.Comments ||
                                             props[0] === Asc.c_oAscEDocProtect.TrackedChanges || props[0] === Asc.c_oAscEDocProtect.Forms);
-
                 me.view.btnProtectDoc.toggle(!!isProtected, true);
+                props && me.applyRestrictions(props[0]);
             });
         },
 
@@ -183,6 +183,20 @@ define([
                 isProtected = props && (props[0] === Asc.c_oAscEDocProtect.ReadOnly || props[0] === Asc.c_oAscEDocProtect.Comments ||
                                         props[0] === Asc.c_oAscEDocProtect.TrackedChanges || props[0] === Asc.c_oAscEDocProtect.Forms);
             this.view && this.view.btnProtectDoc.toggle(isProtected, true);
+
+            // off preview forms
+            var forms = this.getApplication().getController('FormsTab');
+            forms && forms.changeViewFormMode(false);
+
+            // off preview review changes
+            var review = this.getApplication().getController('Common.Controllers.ReviewChanges');
+            if (review && review.isPreviewChangesMode()) {
+                var value = Common.Utils.InternalSettings.get("de-review-mode-editor") || 'markup';
+                review.turnDisplayMode(value);
+                review.view && review.view.turnDisplayMode(value);
+            }
+
+            this.applyRestrictions(props[0]);
             Common.NotificationCenter.trigger('protect:doclock', props);
         },
 
@@ -200,6 +214,25 @@ define([
                 };
             }
             return this._state.docProtection;
+        },
+
+        applyRestrictions: function(type) {
+            if (type === Asc.c_oAscEDocProtect.ReadOnly) {
+                this.api.asc_setViewMode(true);
+            } else if (type === Asc.c_oAscEDocProtect.Comments) {
+                this.appConfig.canComments && this.api.asc_setRestriction(Asc.c_oAscRestrictionType.OnlyComments);
+                this.api.asc_setViewMode(!this.appConfig.canComments || !this.appConfig.isEdit && !this.appConfig.isRestrictedEdit);
+            } else if (type === Asc.c_oAscEDocProtect.Forms) {
+                this.appConfig.canFillForms && this.api.asc_setRestriction(Asc.c_oAscRestrictionType.OnlyForms);
+                this.api.asc_setViewMode(!this.appConfig.canFillForms || !this.appConfig.isEdit && !this.appConfig.isRestrictedEdit);
+            } else { // none or tracked changes
+                this.api.asc_setViewMode(!this.appConfig.isEdit && !this.appConfig.isRestrictedEdit);
+                if (this.appConfig.isRestrictedEdit) {
+                    this.appConfig.canComments && this.api.asc_setRestriction(Asc.c_oAscRestrictionType.OnlyComments);
+                    this.appConfig.canFillForms && this.api.asc_setRestriction(Asc.c_oAscRestrictionType.OnlyForms);
+                } else
+                    this.api.asc_setRestriction(Asc.c_oAscRestrictionType.None);
+            }
         }
 
     }, DE.Controllers.DocProtection || {}));
diff --git a/apps/documenteditor/main/app/controller/FormsTab.js b/apps/documenteditor/main/app/controller/FormsTab.js
index 35f52e116..0f73609fc 100644
--- a/apps/documenteditor/main/app/controller/FormsTab.js
+++ b/apps/documenteditor/main/app/controller/FormsTab.js
@@ -217,6 +217,13 @@ define([
             Common.NotificationCenter.trigger('edit:complete', this.toolbar);
         },
 
+        changeViewFormMode: function(state) {
+            if (this.view && (state !== this.view.btnViewForm.isActive())) {
+                this.view.btnViewForm.toggle(state, true);
+                this.onModeClick(state);
+            }
+        },
+
         onClearClick: function() {
             if (this.api) {
                 this.api.asc_ClearAllSpecialForms();

From 0f1a07cb94817e3c4aabd537f63f390d97b454f6 Mon Sep 17 00:00:00 2001
From: Julia Radzhabova <julia.radzhabova@onlyoffice.com>
Date: Tue, 4 Oct 2022 14:36:16 +0300
Subject: [PATCH 17/28] [DE] Fix

---
 apps/documenteditor/main/app/controller/DocProtection.js | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/apps/documenteditor/main/app/controller/DocProtection.js b/apps/documenteditor/main/app/controller/DocProtection.js
index 02860a1ce..76662f2ed 100644
--- a/apps/documenteditor/main/app/controller/DocProtection.js
+++ b/apps/documenteditor/main/app/controller/DocProtection.js
@@ -180,8 +180,7 @@ define([
 
         onChangeProtectDocument: function() {
             var props = this.getDocProps(true),
-                isProtected = props && (props[0] === Asc.c_oAscEDocProtect.ReadOnly || props[0] === Asc.c_oAscEDocProtect.Comments ||
-                                        props[0] === Asc.c_oAscEDocProtect.TrackedChanges || props[0] === Asc.c_oAscEDocProtect.Forms);
+                isProtected = props && (props.isReadOnly || props.isCommentsOnly || props.isFormsOnly || props.isReviewOnly);
             this.view && this.view.btnProtectDoc.toggle(isProtected, true);
 
             // off preview forms
@@ -196,7 +195,7 @@ define([
                 review.view && review.view.turnDisplayMode(value);
             }
 
-            this.applyRestrictions(props[0]);
+            props && this.applyRestrictions(props.type);
             Common.NotificationCenter.trigger('protect:doclock', props);
         },
 
@@ -207,6 +206,7 @@ define([
                 var props = this.api.asc_getDocumentProtection(),
                     type = props ? props[0] : Asc.c_oAscEDocProtect.None;
                 this._state.docProtection = {
+                    type: type,
                     isReadOnly: type===Asc.c_oAscEDocProtect.ReadOnly,
                     isCommentsOnly: type===Asc.c_oAscEDocProtect.Comments,
                     isReviewOnly: type===Asc.c_oAscEDocProtect.TrackedChanges,

From 66259ebf5180f80ed93d1313ca84ed7a2b25a24f Mon Sep 17 00:00:00 2001
From: Julia Radzhabova <julia.radzhabova@onlyoffice.com>
Date: Tue, 4 Oct 2022 14:52:47 +0300
Subject: [PATCH 18/28] [DE] Fix restrictions

---
 apps/documenteditor/main/app/controller/DocProtection.js | 9 +++------
 1 file changed, 3 insertions(+), 6 deletions(-)

diff --git a/apps/documenteditor/main/app/controller/DocProtection.js b/apps/documenteditor/main/app/controller/DocProtection.js
index 76662f2ed..959b9985f 100644
--- a/apps/documenteditor/main/app/controller/DocProtection.js
+++ b/apps/documenteditor/main/app/controller/DocProtection.js
@@ -218,15 +218,12 @@ define([
 
         applyRestrictions: function(type) {
             if (type === Asc.c_oAscEDocProtect.ReadOnly) {
-                this.api.asc_setViewMode(true);
+                this.api.asc_setRestriction(Asc.c_oAscRestrictionType.View);
             } else if (type === Asc.c_oAscEDocProtect.Comments) {
-                this.appConfig.canComments && this.api.asc_setRestriction(Asc.c_oAscRestrictionType.OnlyComments);
-                this.api.asc_setViewMode(!this.appConfig.canComments || !this.appConfig.isEdit && !this.appConfig.isRestrictedEdit);
+                this.api.asc_setRestriction(this.appConfig.canComments ? Asc.c_oAscRestrictionType.OnlyComments : Asc.c_oAscRestrictionType.View);
             } else if (type === Asc.c_oAscEDocProtect.Forms) {
-                this.appConfig.canFillForms && this.api.asc_setRestriction(Asc.c_oAscRestrictionType.OnlyForms);
-                this.api.asc_setViewMode(!this.appConfig.canFillForms || !this.appConfig.isEdit && !this.appConfig.isRestrictedEdit);
+                this.api.asc_setRestriction(this.appConfig.canFillForms ? Asc.c_oAscRestrictionType.OnlyForms : Asc.c_oAscRestrictionType.View);
             } else { // none or tracked changes
-                this.api.asc_setViewMode(!this.appConfig.isEdit && !this.appConfig.isRestrictedEdit);
                 if (this.appConfig.isRestrictedEdit) {
                     this.appConfig.canComments && this.api.asc_setRestriction(Asc.c_oAscRestrictionType.OnlyComments);
                     this.appConfig.canFillForms && this.api.asc_setRestriction(Asc.c_oAscRestrictionType.OnlyForms);

From b73380ba279280b25c9c61e8c2d0bc85912171a2 Mon Sep 17 00:00:00 2001
From: Julia Radzhabova <julia.radzhabova@onlyoffice.com>
Date: Thu, 6 Oct 2022 15:03:38 +0300
Subject: [PATCH 19/28] [DE] Handle PasswordIsNotCorrect error

---
 apps/documenteditor/main/app/controller/Main.js | 7 ++++++-
 apps/documenteditor/main/locale/en.json         | 1 +
 2 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/apps/documenteditor/main/app/controller/Main.js b/apps/documenteditor/main/app/controller/Main.js
index 71feac14f..96e029f23 100644
--- a/apps/documenteditor/main/app/controller/Main.js
+++ b/apps/documenteditor/main/app/controller/Main.js
@@ -1977,6 +1977,10 @@ define([
                         config.msg = this.errorTextFormWrongFormat;
                         break;
 
+                    case Asc.c_oAscError.ID.PasswordIsNotCorrect:
+                        config.msg = this.errorPasswordIsNotCorrect;
+                        break;
+
                     default:
                         config.msg = (typeof id == 'string') ? id : this.errorDefaultMessage.replace('%1', id);
                         break;
@@ -3259,7 +3263,8 @@ define([
             errorNoTOC: 'There\'s no table of contents to update. You can insert one from the References tab.',
             textRequestMacros: 'A macro makes a request to URL. Do you want to allow the request to the %1?',
             textRememberMacros: 'Remember my choice for all macros',
-            errorTextFormWrongFormat: 'The value entered does not match the format of the field.'
+            errorTextFormWrongFormat: 'The value entered does not match the format of the field.',
+            errorPasswordIsNotCorrect: 'The password you supplied is not correct.<br>Verify that the CAPS LOCK key is off and be sure to use the correct capitalization.'
         }
     })(), DE.Controllers.Main || {}))
 });
\ No newline at end of file
diff --git a/apps/documenteditor/main/locale/en.json b/apps/documenteditor/main/locale/en.json
index 3ddc137f6..2a9a64c41 100644
--- a/apps/documenteditor/main/locale/en.json
+++ b/apps/documenteditor/main/locale/en.json
@@ -939,6 +939,7 @@
   "DE.Controllers.Main.warnNoLicense": "You've reached the limit for simultaneous connections to %1 editors. This document will be opened for viewing only.<br>Contact %1 sales team for personal upgrade terms.",
   "DE.Controllers.Main.warnNoLicenseUsers": "You've reached the user limit for %1 editors. Contact %1 sales team for personal upgrade terms.",
   "DE.Controllers.Main.warnProcessRightsChange": "You have been denied the right to edit the file.",
+  "DE.Controllers.Main.errorPasswordIsNotCorrect": "The password you supplied is not correct.<br>Verify that the CAPS LOCK key is off and be sure to use the correct capitalization.",
   "DE.Controllers.Navigation.txtBeginning": "Beginning of document",
   "DE.Controllers.Navigation.txtGotoBeginning": "Go to the beginning of the document",
   "DE.Controllers.Search.notcriticalErrorTitle": "Warning",

From 52283a3d2e2e1dec91c739bd5fb65cbe1fc296bc Mon Sep 17 00:00:00 2001
From: Julia Radzhabova <julia.radzhabova@onlyoffice.com>
Date: Thu, 6 Oct 2022 15:55:53 +0300
Subject: [PATCH 20/28] [DE] Fix saving protection to document

---
 apps/documenteditor/main/app/view/Toolbar.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/apps/documenteditor/main/app/view/Toolbar.js b/apps/documenteditor/main/app/view/Toolbar.js
index 91e638f15..1a7dd8584 100644
--- a/apps/documenteditor/main/app/view/Toolbar.js
+++ b/apps/documenteditor/main/app/view/Toolbar.js
@@ -201,7 +201,7 @@ define([
                         id: 'id-toolbar-btn-save',
                         cls: 'btn-toolbar',
                         iconCls: 'toolbar__icon no-mask ' + this.btnSaveCls,
-                        lock: [_set.lostConnect, _set.disableOnStart, _set.docLockView],
+                        lock: [_set.lostConnect, _set.disableOnStart],
                         signals: ['disabled'],
                         dataHint: '1',
                         dataHintDirection: 'top',

From ed621f092127bd7a127940f6bfe918b047947455 Mon Sep 17 00:00:00 2001
From: Julia Radzhabova <julia.radzhabova@onlyoffice.com>
Date: Thu, 6 Oct 2022 20:14:13 +0300
Subject: [PATCH 21/28] [DE] Handle protection lock

---
 apps/documenteditor/main/app/controller/DocProtection.js | 8 +++++++-
 apps/documenteditor/main/app/view/DocProtection.js       | 2 +-
 2 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/apps/documenteditor/main/app/controller/DocProtection.js b/apps/documenteditor/main/app/controller/DocProtection.js
index 959b9985f..d4180af29 100644
--- a/apps/documenteditor/main/app/controller/DocProtection.js
+++ b/apps/documenteditor/main/app/controller/DocProtection.js
@@ -53,7 +53,8 @@ define([
         docLockView: 'lock-mode-view',
         docLockForms: 'lock-mode-forms',
         docLockReview: 'lock-mode-review',
-        docLockComments: 'lock-mode-comments'
+        docLockComments: 'lock-mode-comments',
+        protectLock: 'protect-lock'
     };
     for (var key in enumLock) {
         if (enumLock.hasOwnProperty(key)) {
@@ -88,6 +89,7 @@ define([
             if (api) {
                 this.api = api;
                 this.api.asc_registerCallback('asc_onChangeDocumentProtection',_.bind(this.onChangeProtectDocument, this));
+                this.api.asc_registerCallback('asc_onLockDocumentProtection',_.bind(this.onLockDocumentProtection, this));
             }
         },
 
@@ -230,6 +232,10 @@ define([
                 } else
                     this.api.asc_setRestriction(Asc.c_oAscRestrictionType.None);
             }
+        },
+
+        onLockDocumentProtection: function(state) {
+            this.view && Common.Utils.lockControls(Common.enumLock.protectLock, state, {array: [this.view.btnProtectDoc]});
         }
 
     }, DE.Controllers.DocProtection || {}));
diff --git a/apps/documenteditor/main/app/view/DocProtection.js b/apps/documenteditor/main/app/view/DocProtection.js
index eb4945b63..1963ab351 100644
--- a/apps/documenteditor/main/app/view/DocProtection.js
+++ b/apps/documenteditor/main/app/view/DocProtection.js
@@ -79,7 +79,7 @@ define([
                     iconCls: 'toolbar__icon protect-workbook',
                     enableToggle: true,
                     caption: this.txtProtectDoc,
-                    lock        : [_set.lostConnect, _set.coAuth, _set.previewReviewMode, _set.viewFormMode],
+                    lock        : [_set.lostConnect, _set.coAuth, _set.previewReviewMode, _set.viewFormMode, _set.protectLock],
                     dataHint    : '1',
                     dataHintDirection: 'bottom',
                     dataHintOffset: 'small'

From 528f48d09808c1f3605388ee992b4fd0c487f58d Mon Sep 17 00:00:00 2001
From: Julia Radzhabova <julia.radzhabova@onlyoffice.com>
Date: Fri, 7 Oct 2022 12:08:51 +0300
Subject: [PATCH 22/28] [DE] Change protect methods

---
 .../main/app/controller/DocProtection.js      | 23 +++++++++++++------
 1 file changed, 16 insertions(+), 7 deletions(-)

diff --git a/apps/documenteditor/main/app/controller/DocProtection.js b/apps/documenteditor/main/app/controller/DocProtection.js
index d4180af29..8ed77b293 100644
--- a/apps/documenteditor/main/app/controller/DocProtection.js
+++ b/apps/documenteditor/main/app/controller/DocProtection.js
@@ -123,7 +123,10 @@ define([
                         handler: function(result, value, props) {
                             btn = result;
                             if (result == 'ok') {
-                                me.api.asc_setDocumentProtection(props, value);
+                                var protection = new AscCommonWord.CDocProtect();
+                                protection.asc_setEditType(props);
+                                protection.asc_setPassword(value);
+                                me.api.asc_setDocumentProtection(protection);
                             }
                             Common.NotificationCenter.trigger('edit:complete');
                         }
@@ -137,7 +140,7 @@ define([
                 var me = this,
                     btn,
                     props = me.api.asc_getDocumentProtection();
-                if (props && props[1]) {
+                if (props && props.asc_getIsPassword()) {
                     var win = new Common.Views.OpenDialog({
                         title: me.view.txtWBUnlockTitle,
                         closable: true,
@@ -148,7 +151,10 @@ define([
                             btn = result;
                             if (result == 'ok') {
                                 if (me.api) {
-                                    me.api.asc_setDocumentProtection(Asc.c_oAscEDocProtect.None, value && value.drmOptions ? value.drmOptions.asc_getPassword() : undefined);
+                                    var protection = new AscCommonWord.CDocProtect();
+                                    protection.asc_setEditType(Asc.c_oAscEDocProtect.None);
+                                    value && value.drmOptions && protection.asc_setPassword(value.drmOptions.asc_getPassword());
+                                    me.api.asc_setDocumentProtection(protection);
                                 }
                                 Common.NotificationCenter.trigger('edit:complete');
                             }
@@ -160,7 +166,9 @@ define([
 
                     win.show();
                 } else {
-                    me.api.asc_setDocumentProtection(Asc.c_oAscEDocProtect.None);
+                    var protection = new AscCommonWord.CDocProtect();
+                    protection.asc_setEditType(Asc.c_oAscEDocProtect.None);
+                    me.api.asc_setDocumentProtection(protection);
                 }
             }
         },
@@ -173,8 +181,9 @@ define([
                 resolve();
             })).then(function () {
                 var props = me.api.asc_getDocumentProtection(),
-                    isProtected = props && (props[0] === Asc.c_oAscEDocProtect.ReadOnly || props[0] === Asc.c_oAscEDocProtect.Comments ||
-                                            props[0] === Asc.c_oAscEDocProtect.TrackedChanges || props[0] === Asc.c_oAscEDocProtect.Forms);
+                    type = props ? props.asc_getEditType() : Asc.c_oAscEDocProtect.None,
+                    isProtected = (type === Asc.c_oAscEDocProtect.ReadOnly || type === Asc.c_oAscEDocProtect.Comments ||
+                                   type === Asc.c_oAscEDocProtect.TrackedChanges || type === Asc.c_oAscEDocProtect.Forms);
                 me.view.btnProtectDoc.toggle(!!isProtected, true);
                 props && me.applyRestrictions(props[0]);
             });
@@ -206,7 +215,7 @@ define([
 
             if (update || !this._state.docProtection) {
                 var props = this.api.asc_getDocumentProtection(),
-                    type = props ? props[0] : Asc.c_oAscEDocProtect.None;
+                    type = props ? props.asc_getEditType() : Asc.c_oAscEDocProtect.None;
                 this._state.docProtection = {
                     type: type,
                     isReadOnly: type===Asc.c_oAscEDocProtect.ReadOnly,

From 022c65cf3d3793f9f93d45ebed7fde16b9ee244c Mon Sep 17 00:00:00 2001
From: Julia Radzhabova <julia.radzhabova@onlyoffice.com>
Date: Fri, 7 Oct 2022 16:21:31 +0300
Subject: [PATCH 23/28] [DE] Fix protection

---
 .../main/app/controller/DocProtection.js         | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/apps/documenteditor/main/app/controller/DocProtection.js b/apps/documenteditor/main/app/controller/DocProtection.js
index 8ed77b293..2ebff6d29 100644
--- a/apps/documenteditor/main/app/controller/DocProtection.js
+++ b/apps/documenteditor/main/app/controller/DocProtection.js
@@ -123,7 +123,7 @@ define([
                         handler: function(result, value, props) {
                             btn = result;
                             if (result == 'ok') {
-                                var protection = new AscCommonWord.CDocProtect();
+                                var protection = me.api.asc_getDocumentProtection() || new AscCommonWord.CDocProtect();
                                 protection.asc_setEditType(props);
                                 protection.asc_setPassword(value);
                                 me.api.asc_setDocumentProtection(protection);
@@ -151,10 +151,9 @@ define([
                             btn = result;
                             if (result == 'ok') {
                                 if (me.api) {
-                                    var protection = new AscCommonWord.CDocProtect();
-                                    protection.asc_setEditType(Asc.c_oAscEDocProtect.None);
-                                    value && value.drmOptions && protection.asc_setPassword(value.drmOptions.asc_getPassword());
-                                    me.api.asc_setDocumentProtection(protection);
+                                    props.asc_setEditType(Asc.c_oAscEDocProtect.None);
+                                    value && value.drmOptions && props.asc_setPassword(value.drmOptions.asc_getPassword());
+                                    me.api.asc_setDocumentProtection(props);
                                 }
                                 Common.NotificationCenter.trigger('edit:complete');
                             }
@@ -166,9 +165,10 @@ define([
 
                     win.show();
                 } else {
-                    var protection = new AscCommonWord.CDocProtect();
-                    protection.asc_setEditType(Asc.c_oAscEDocProtect.None);
-                    me.api.asc_setDocumentProtection(protection);
+                    if (!props)
+                        props = new AscCommonWord.CDocProtect();
+                    props.asc_setEditType(Asc.c_oAscEDocProtect.None);
+                    me.api.asc_setDocumentProtection(props);
                 }
             }
         },

From 0f2568e5b1e43bb9021a5299d962d040ae2b55d3 Mon Sep 17 00:00:00 2001
From: Julia Radzhabova <julia.radzhabova@onlyoffice.com>
Date: Mon, 10 Oct 2022 15:09:46 +0300
Subject: [PATCH 24/28] [DE] Update hint in protected document

---
 apps/common/main/lib/component/Button.js      |  4 +++-
 .../main/app/controller/DocProtection.js      |  3 ++-
 .../main/app/view/DocProtection.js            | 23 ++++++++++++++++---
 3 files changed, 25 insertions(+), 5 deletions(-)

diff --git a/apps/common/main/lib/component/Button.js b/apps/common/main/lib/component/Button.js
index ba3621a29..a24c772da 100644
--- a/apps/common/main/lib/component/Button.js
+++ b/apps/common/main/lib/component/Button.js
@@ -754,7 +754,7 @@ define([
             return (this.cmpEl) ? this.cmpEl.is(":visible") : $(this.el).is(":visible");
         },
 
-        updateHint: function(hint) {
+        updateHint: function(hint, isHtml) {
             this.options.hint = hint;
 
             if (!this.rendered) return;
@@ -780,10 +780,12 @@ define([
                 this.btnMenuEl.removeData('bs.tooltip');
 
             this.btnEl.tooltip({
+                html: !!isHtml,
                 title       : (typeof hint == 'string') ? hint : hint[0],
                 placement   : this.options.hintAnchor||'cursor'
             });
             this.btnMenuEl && this.btnMenuEl.tooltip({
+                html: !!isHtml,
                 title       : hint[1],
                 placement   : this.options.hintAnchor||'cursor'
             });
diff --git a/apps/documenteditor/main/app/controller/DocProtection.js b/apps/documenteditor/main/app/controller/DocProtection.js
index 2ebff6d29..1910542ab 100644
--- a/apps/documenteditor/main/app/controller/DocProtection.js
+++ b/apps/documenteditor/main/app/controller/DocProtection.js
@@ -185,7 +185,7 @@ define([
                     isProtected = (type === Asc.c_oAscEDocProtect.ReadOnly || type === Asc.c_oAscEDocProtect.Comments ||
                                    type === Asc.c_oAscEDocProtect.TrackedChanges || type === Asc.c_oAscEDocProtect.Forms);
                 me.view.btnProtectDoc.toggle(!!isProtected, true);
-                props && me.applyRestrictions(props[0]);
+                props && me.applyRestrictions(type);
             });
         },
 
@@ -241,6 +241,7 @@ define([
                 } else
                     this.api.asc_setRestriction(Asc.c_oAscRestrictionType.None);
             }
+            this.view && this.view.updateProtectionTips(type);
         },
 
         onLockDocumentProtection: function(state) {
diff --git a/apps/documenteditor/main/app/view/DocProtection.js b/apps/documenteditor/main/app/view/DocProtection.js
index 1963ab351..275d9c40f 100644
--- a/apps/documenteditor/main/app/view/DocProtection.js
+++ b/apps/documenteditor/main/app/view/DocProtection.js
@@ -72,7 +72,7 @@ define([
 
                 var _set = Common.enumLock;
                 this.lockedControls = [];
-                this._state = {disabled: false};
+                this._state = {disabled: false, currentProtectHint: this.hintProtectDoc };
 
                 this.btnProtectDoc = new Common.UI.Button({
                     cls: 'btn-toolbar x-huge icon-top',
@@ -98,7 +98,7 @@ define([
                 (new Promise(function (accept, reject) {
                     accept();
                 })).then(function(){
-                    me.btnProtectDoc.updateHint(me.hintProtectDoc);
+                    me.btnProtectDoc.updateHint(me._state.currentProtectHint, true);
                     setEvents.call(me);
                 });
             },
@@ -121,8 +121,25 @@ define([
                 this.fireEvent('show', this);
             },
 
+            updateProtectionTips: function(type) {
+                var str = this.txtProtectDoc;
+                if (type === Asc.c_oAscEDocProtect.ReadOnly) {
+                    str = this.txtDocProtectedView;
+                } else if (type === Asc.c_oAscEDocProtect.Comments) {
+                    str = this.txtDocProtectedComment;
+                } else if (type === Asc.c_oAscEDocProtect.Forms) {
+                    str = this.txtDocProtectedForms;
+                } else if (type === Asc.c_oAscEDocProtect.TrackedChanges){ // none or tracked changes
+                    str = this.txtDocProtectedTrack;
+                }
+                this.btnProtectDoc.updateHint(str, true);
+                this._state.currentProtectHint = str;
+            },
             txtProtectDoc: 'Protect Document',
-            txtDocUnlockTitle: 'Unprotect Document',
+            txtDocProtectedView: 'Document is protected.<br>You may only view this document.',
+            txtDocProtectedTrack: 'Document is protected.<br>You may edit this document, but all changes will be tracked.',
+            txtDocProtectedComment: 'Document is protected.<br>You may only insert comments to this document.',
+            txtDocProtectedForms: 'Document is protected.<br>You may only fill in forms in this document.',
             hintProtectDoc: 'Protect document',
             txtDocUnlockDescription: 'Enter a password to unprotect document'
         }

From 412f616526c8d28e6cd30680df842f019f09c656 Mon Sep 17 00:00:00 2001
From: Kirill Volkov <kirill.volkov@onlyoffice.com>
Date: Mon, 10 Oct 2022 16:29:59 +0300
Subject: [PATCH 25/28] Add new icons

Added new icons. Changed btn-text icon.
---
 .../img/toolbar/1.25x/big/btn-text-vertical.png | Bin 0 -> 168 bytes
 .../img/toolbar/1.25x/big/btn-text.png          | Bin 305 -> 169 bytes
 .../img/toolbar/1.25x/btn-text-vertical.png     | Bin 0 -> 166 bytes
 .../resources/img/toolbar/1.25x/btn-text.png    | Bin 0 -> 168 bytes
 .../img/toolbar/1.5x/big/btn-text-vertical.png  | Bin 0 -> 189 bytes
 .../resources/img/toolbar/1.5x/big/btn-text.png | Bin 315 -> 191 bytes
 .../img/toolbar/1.5x/btn-text-vertical.png      | Bin 0 -> 164 bytes
 .../resources/img/toolbar/1.5x/btn-text.png     | Bin 0 -> 163 bytes
 .../img/toolbar/1.75x/big/btn-text-vertical.png | Bin 0 -> 187 bytes
 .../img/toolbar/1.75x/big/btn-text.png          | Bin 339 -> 193 bytes
 .../img/toolbar/1.75x/btn-text-vertical.png     | Bin 0 -> 168 bytes
 .../resources/img/toolbar/1.75x/btn-text.png    | Bin 0 -> 170 bytes
 .../img/toolbar/1x/big/btn-text-vertical.png    | Bin 0 -> 165 bytes
 .../resources/img/toolbar/1x/big/btn-text.png   | Bin 276 -> 168 bytes
 .../img/toolbar/1x/btn-text-vertical.png        | Bin 0 -> 149 bytes
 .../main/resources/img/toolbar/1x/btn-text.png  | Bin 0 -> 147 bytes
 .../img/toolbar/1x/text-box-horizontal.png      | Bin 0 -> 147 bytes
 .../img/toolbar/1x/text-box-vertical.png        | Bin 0 -> 149 bytes
 .../img/toolbar/2x/big/btn-text-vertical.png    | Bin 0 -> 178 bytes
 .../resources/img/toolbar/2x/big/btn-text.png   | Bin 387 -> 178 bytes
 .../img/toolbar/2x/btn-text-vertical.png        | Bin 0 -> 164 bytes
 .../main/resources/img/toolbar/2x/btn-text.png  | Bin 0 -> 164 bytes
 .../resources/img/toolbar/1.25x/big/combine.png | Bin 0 -> 269 bytes
 .../img/toolbar/1.25x/big/restrict-editing.png  | Bin 0 -> 347 bytes
 .../resources/img/toolbar/1.5x/big/combine.png  | Bin 0 -> 289 bytes
 .../img/toolbar/1.5x/big/restrict-editing.png   | Bin 0 -> 381 bytes
 .../resources/img/toolbar/1.75x/big/combine.png | Bin 0 -> 308 bytes
 .../img/toolbar/1.75x/big/restrict-editing.png  | Bin 0 -> 426 bytes
 .../resources/img/toolbar/1x/big/combine.png    | Bin 0 -> 236 bytes
 .../img/toolbar/1x/big/restrict-editing.png     | Bin 0 -> 304 bytes
 .../resources/img/toolbar/2x/big/combine.png    | Bin 0 -> 508 bytes
 .../img/toolbar/2x/big/restrict-editing.png     | Bin 0 -> 571 bytes
 .../img/toolbar/1.25x/big/gridlines.png         | Bin 0 -> 169 bytes
 .../resources/img/toolbar/1.25x/big/guides.png  | Bin 0 -> 192 bytes
 .../img/toolbar/1.25x/horizontal-guide.png      | Bin 0 -> 143 bytes
 .../img/toolbar/1.25x/vertical-guide.png        | Bin 0 -> 142 bytes
 .../img/toolbar/1.5x/big/gridlines.png          | Bin 0 -> 180 bytes
 .../resources/img/toolbar/1.5x/big/guides.png   | Bin 0 -> 201 bytes
 .../img/toolbar/1.5x/horizontal-guide.png       | Bin 0 -> 153 bytes
 .../img/toolbar/1.5x/vertical-guide.png         | Bin 0 -> 152 bytes
 .../img/toolbar/1.75x/big/gridlines.png         | Bin 0 -> 197 bytes
 .../resources/img/toolbar/1.75x/big/guides.png  | Bin 0 -> 221 bytes
 .../img/toolbar/1.75x/horizontal-guide.png      | Bin 0 -> 161 bytes
 .../img/toolbar/1.75x/vertical-guide.png        | Bin 0 -> 162 bytes
 .../resources/img/toolbar/1x/big/gridlines.png  | Bin 0 -> 149 bytes
 .../resources/img/toolbar/1x/big/guides.png     | Bin 0 -> 179 bytes
 .../img/toolbar/1x/horizontal-guide.png         | Bin 0 -> 139 bytes
 .../resources/img/toolbar/1x/vertical-guide.png | Bin 0 -> 138 bytes
 .../resources/img/toolbar/2x/big/gridlines.png  | Bin 0 -> 278 bytes
 .../resources/img/toolbar/2x/big/guides.png     | Bin 0 -> 303 bytes
 .../img/toolbar/2x/horizontal-guide.png         | Bin 0 -> 230 bytes
 .../resources/img/toolbar/2x/vertical-guide.png | Bin 0 -> 232 bytes
 .../img/toolbar/1.25x/big/edit-links.png        | Bin 0 -> 479 bytes
 .../img/toolbar/1.5x/big/edit-links.png         | Bin 0 -> 538 bytes
 .../img/toolbar/1.75x/big/edit-links.png        | Bin 0 -> 641 bytes
 .../resources/img/toolbar/1x/big/edit-links.png | Bin 0 -> 392 bytes
 .../resources/img/toolbar/2x/big/edit-links.png | Bin 0 -> 845 bytes
 57 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 apps/common/main/resources/img/toolbar/1.25x/big/btn-text-vertical.png
 create mode 100644 apps/common/main/resources/img/toolbar/1.25x/btn-text-vertical.png
 create mode 100644 apps/common/main/resources/img/toolbar/1.25x/btn-text.png
 create mode 100644 apps/common/main/resources/img/toolbar/1.5x/big/btn-text-vertical.png
 create mode 100644 apps/common/main/resources/img/toolbar/1.5x/btn-text-vertical.png
 create mode 100644 apps/common/main/resources/img/toolbar/1.5x/btn-text.png
 create mode 100644 apps/common/main/resources/img/toolbar/1.75x/big/btn-text-vertical.png
 create mode 100644 apps/common/main/resources/img/toolbar/1.75x/btn-text-vertical.png
 create mode 100644 apps/common/main/resources/img/toolbar/1.75x/btn-text.png
 create mode 100644 apps/common/main/resources/img/toolbar/1x/big/btn-text-vertical.png
 create mode 100644 apps/common/main/resources/img/toolbar/1x/btn-text-vertical.png
 create mode 100644 apps/common/main/resources/img/toolbar/1x/btn-text.png
 create mode 100644 apps/common/main/resources/img/toolbar/1x/text-box-horizontal.png
 create mode 100644 apps/common/main/resources/img/toolbar/1x/text-box-vertical.png
 create mode 100644 apps/common/main/resources/img/toolbar/2x/big/btn-text-vertical.png
 create mode 100644 apps/common/main/resources/img/toolbar/2x/btn-text-vertical.png
 create mode 100644 apps/common/main/resources/img/toolbar/2x/btn-text.png
 create mode 100644 apps/documenteditor/main/resources/img/toolbar/1.25x/big/combine.png
 create mode 100644 apps/documenteditor/main/resources/img/toolbar/1.25x/big/restrict-editing.png
 create mode 100644 apps/documenteditor/main/resources/img/toolbar/1.5x/big/combine.png
 create mode 100644 apps/documenteditor/main/resources/img/toolbar/1.5x/big/restrict-editing.png
 create mode 100644 apps/documenteditor/main/resources/img/toolbar/1.75x/big/combine.png
 create mode 100644 apps/documenteditor/main/resources/img/toolbar/1.75x/big/restrict-editing.png
 create mode 100644 apps/documenteditor/main/resources/img/toolbar/1x/big/combine.png
 create mode 100644 apps/documenteditor/main/resources/img/toolbar/1x/big/restrict-editing.png
 create mode 100644 apps/documenteditor/main/resources/img/toolbar/2x/big/combine.png
 create mode 100644 apps/documenteditor/main/resources/img/toolbar/2x/big/restrict-editing.png
 create mode 100644 apps/presentationeditor/main/resources/img/toolbar/1.25x/big/gridlines.png
 create mode 100644 apps/presentationeditor/main/resources/img/toolbar/1.25x/big/guides.png
 create mode 100644 apps/presentationeditor/main/resources/img/toolbar/1.25x/horizontal-guide.png
 create mode 100644 apps/presentationeditor/main/resources/img/toolbar/1.25x/vertical-guide.png
 create mode 100644 apps/presentationeditor/main/resources/img/toolbar/1.5x/big/gridlines.png
 create mode 100644 apps/presentationeditor/main/resources/img/toolbar/1.5x/big/guides.png
 create mode 100644 apps/presentationeditor/main/resources/img/toolbar/1.5x/horizontal-guide.png
 create mode 100644 apps/presentationeditor/main/resources/img/toolbar/1.5x/vertical-guide.png
 create mode 100644 apps/presentationeditor/main/resources/img/toolbar/1.75x/big/gridlines.png
 create mode 100644 apps/presentationeditor/main/resources/img/toolbar/1.75x/big/guides.png
 create mode 100644 apps/presentationeditor/main/resources/img/toolbar/1.75x/horizontal-guide.png
 create mode 100644 apps/presentationeditor/main/resources/img/toolbar/1.75x/vertical-guide.png
 create mode 100644 apps/presentationeditor/main/resources/img/toolbar/1x/big/gridlines.png
 create mode 100644 apps/presentationeditor/main/resources/img/toolbar/1x/big/guides.png
 create mode 100644 apps/presentationeditor/main/resources/img/toolbar/1x/horizontal-guide.png
 create mode 100644 apps/presentationeditor/main/resources/img/toolbar/1x/vertical-guide.png
 create mode 100644 apps/presentationeditor/main/resources/img/toolbar/2x/big/gridlines.png
 create mode 100644 apps/presentationeditor/main/resources/img/toolbar/2x/big/guides.png
 create mode 100644 apps/presentationeditor/main/resources/img/toolbar/2x/horizontal-guide.png
 create mode 100644 apps/presentationeditor/main/resources/img/toolbar/2x/vertical-guide.png
 create mode 100644 apps/spreadsheeteditor/main/resources/img/toolbar/1.25x/big/edit-links.png
 create mode 100644 apps/spreadsheeteditor/main/resources/img/toolbar/1.5x/big/edit-links.png
 create mode 100644 apps/spreadsheeteditor/main/resources/img/toolbar/1.75x/big/edit-links.png
 create mode 100644 apps/spreadsheeteditor/main/resources/img/toolbar/1x/big/edit-links.png
 create mode 100644 apps/spreadsheeteditor/main/resources/img/toolbar/2x/big/edit-links.png

diff --git a/apps/common/main/resources/img/toolbar/1.25x/big/btn-text-vertical.png b/apps/common/main/resources/img/toolbar/1.25x/big/btn-text-vertical.png
new file mode 100644
index 0000000000000000000000000000000000000000..1850634ab80f5ea62d42f235bb0df876eb518756
GIT binary patch
literal 168
zcmeAS@N?(olHy`uVBq!ia0vp^Za}Qe#0(@uDyRGdQk(%kA+C%-1_Q(Y|No~fyFC%e
zVk`;r3ubV5b|VeQ@%40Z45_%4oUp(?frmk84Id9r46j3*ScHcO5U^+**~rBq_Aub+
z0|p`XBsGEdW-%uvgN3XroSkiL4lQA84=KBB`)Kmj?B_*CZw7{w3380@9CHmo7J9n+
KxvX<aXaWEtS1^A7

literal 0
HcmV?d00001

diff --git a/apps/common/main/resources/img/toolbar/1.25x/big/btn-text.png b/apps/common/main/resources/img/toolbar/1.25x/big/btn-text.png
index 26147828bd84830f93597c460cefad2ee1663f55..b06d5aa0ee2fc5b52f958c78e9e03d92a95f8ff3 100644
GIT binary patch
delta 153
zcmdnUw32axL_HHT0|P@y<&=LwiZj3`#FY`qU|{(F|NoR_w<iKwj3q&S!3+-1ZlnP@
zex5FlAr-fh6C^|$t}=QUuo)O+G*-m$Iy9+@u&_u-ObKH=*v0l{mBhhYjgMp$W_32Q
zC|<k3&@tiKDz-aLJW2+=+!Ab41uE~USuc3W%TQh{BzIX%YDOo>N>5immvv4FO#pr$
BG5-Jn

delta 290
zcmZ3<xRGgsL_G%^0|SGmcug*l;w<opEM{Qf76xHPhFNnYfP#$0LGDfr>(0r%1aer?
z9eo`c7&i8E|4C#8@{f7CIEGX(zP)jftJ#64<zdLLf9v;5ZIWv`oR_p|`TyM_InpUI
zrIE%A2g>HRCntaUE4}dM<C6bBQd-kC^MBm`%Ax+!=GDxRb8WMImIowTxgLIRvGU59
zzJ@eo{=>>mf*fu?qVBx<d+%r3@95fZDfe<r+)kJrTW){kW7$5=@Mf)Rb|!8L5{(Hg
zAf<4|i8VEQ-)hG#E!y6HjDtm4pyxo^j<xo)+kUSRnN`brd8g#MwAIloKYO*Nm2Z<y
f3s+`5@SD+mznen$kN>NIeq!)+^>bP0l+XkK0hM<W

diff --git a/apps/common/main/resources/img/toolbar/1.25x/btn-text-vertical.png b/apps/common/main/resources/img/toolbar/1.25x/btn-text-vertical.png
new file mode 100644
index 0000000000000000000000000000000000000000..4d5c53bf6488ef5e5c9f103659725355c6aab5dd
GIT binary patch
literal 166
zcmeAS@N?(olHy`uVBq!ia0vp^MnEjd!3HFYLuy@sRIaCsV@SoVx6?ei7!-L}KL7Xs
zC9=28pxrNqZ3~x;*)oHyGYkse<=NiLte@~|&Fp_PB~@}_#GIz{cBM+wrf8&YVx4NN
z-+3e~N>3=7bK-56De2{2E|q115Bn58&F8THtvONq_>Z!Lp8TGV48J8yELpE-)@`-}
PTFl_->gTe~DWM4fX4*NZ

literal 0
HcmV?d00001

diff --git a/apps/common/main/resources/img/toolbar/1.25x/btn-text.png b/apps/common/main/resources/img/toolbar/1.25x/btn-text.png
new file mode 100644
index 0000000000000000000000000000000000000000..0ab41f1ff32359b15210b9b5552420f79045243b
GIT binary patch
literal 168
zcmeAS@N?(olHy`uVBq!ia0vp^MnEjd!3HFYLuy@sRKBN+V@SoVx6>T?4k&Q2{QR$8
z%Vj&wBsX>Cmq$L21XD$r(-=0W%7uBaVSmEh60zUYD{`9PPPL^1-)}r}U8A9RG)zTn
z<G-TI{!hPnss#IW`22H>&OG~%L8(Kb>BOZri@J;sW$l9(PF%QQV#0LbBxCC~*6XJ&
So6iHSX7F_Nb6Mw<&;$UulRiTL

literal 0
HcmV?d00001

diff --git a/apps/common/main/resources/img/toolbar/1.5x/big/btn-text-vertical.png b/apps/common/main/resources/img/toolbar/1.5x/big/btn-text-vertical.png
new file mode 100644
index 0000000000000000000000000000000000000000..ce930c0052c4b1ffba0894e25c8b83ef0f87bc62
GIT binary patch
literal 189
zcmeAS@N?(olHy`uVBq!ia0vp^AwaCf#0(?@bf-K9Qk(%kA+C%-1_Q(Y|No~fyFC%e
zVk`;r3ubV5b|VeQN%C}Y45_%4oFE~hAmU=s#=yCbRbg2eb4LkF_a+8TK30KXMkOgO
zri8$?p$;1sFmC76Nw_TQz%t|fK?8$DiwXjlv4#kzvam6Sh)4)L>9}+%wOQdx;S!BC
hne5e8hx3?Z85v$aGxttQUwH`R3Qt!*mvv4FO#tSCHu(Sm

literal 0
HcmV?d00001

diff --git a/apps/common/main/resources/img/toolbar/1.5x/big/btn-text.png b/apps/common/main/resources/img/toolbar/1.5x/big/btn-text.png
index 54077238a150746234e34e658882ca3f79848edb..3da7ffbc2ba4757f721beb489a09beb838022ea1 100644
GIT binary patch
delta 175
zcmdnZw4ZT;L_HHT0|P^V?v%$siZj3`#FY`qU|{(F|NoR_w<iKwj3q&S!3+-1ZlnP@
zDV{ElAr-fh6C|=4Oc{JStqcs-Fm0X@#=t4YXb{byaf?OpDMM#hTayEWM~SFJ!2^@V
zgN$d=7?b!qe0i62x3#r7xb6&Fo2B4BMUf>>FPvH9uz~PWotnZUHrFhU&66uQ@<)M{
ZVG*bK+h;!?uLD}h;OXk;vd$@?2>|k*JC^_e

delta 300
zcmdnbxSMH$L_G%^0|SGub4>w|;w<opEM{Qf76xHPhFNnYfP#$0LGDfr>(0r%1aer?
z9eo`c7&i8E|4C#8@-KM0IEGX(zP;th*Q_Ao8hESZfAliHSrN@je_mfdXuDX=OenrW
z<6@AC=cJNDuOCFn{&>IUgGA}a@+Q~Dz~n1)@7FK+Ao05UZk$DGN>909){;+>ho+u)
z(9xEh+CN`s;V0WLxwHiv{AZd6uh*8_%Xe0Xd7|khNiO4nh$WxaMqN4gv1IM9b<-KE
z(x39QN@|>ONMr-b&1gKtBa*hjfEgk*ac|9O<!|q8!}m!3Eo=iyJ&QiiS@%NVNjsnU
sE7iMCjbDk#DKGw3uA@6i<)!Donx9b|ldsz)0)5Be>FVdQ&MBb@0KqPJW&i*H

diff --git a/apps/common/main/resources/img/toolbar/1.5x/btn-text-vertical.png b/apps/common/main/resources/img/toolbar/1.5x/btn-text-vertical.png
new file mode 100644
index 0000000000000000000000000000000000000000..e220bbeb976dc5f5d3567e88c988f81743f4dece
GIT binary patch
literal 164
zcmeAS@N?(olHy`uVBq!ia0vp^Hb5-L#0(PoHuVmW;tcQ!ab*ND7#RNl|378f?TJ7Z
zV@Z%-FoVOh8)-m}r>Bc!NX4z>gaslUOopqOnJ+Ub>}Bd;bq0clnzf;;!%7n-rZXnF
zDdaIEv3~loCg2~_q91D(E=>5hD)h$BC9~WY{`Tb6KgGacY^Jnv>0O1XAj>>m{an^L
HB{Ts5!zDH+

literal 0
HcmV?d00001

diff --git a/apps/common/main/resources/img/toolbar/1.5x/btn-text.png b/apps/common/main/resources/img/toolbar/1.5x/btn-text.png
new file mode 100644
index 0000000000000000000000000000000000000000..43cb7a918b903223656127e4b71ddb449964bbf0
GIT binary patch
literal 163
zcmeAS@N?(olHy`uVBq!ia0vp^Hb5-L#0(PoHuVmW;tcQ!ab*ND7#RNl|378f?TJ7Z
zV@Z%-FoVOh8)-m}ho_5UNX4z>gau|Cj7i5B*w(QrtYtm2ZlQz1fdd=4IK&bsiZf&u
zB_uEf%G~(TvrsW%-?de2YiiiSR{Ub+VLp8PeO=Ju=3NX7O7~>5FYw5H2ifK6>gTe~
HDWM4fRbey$

literal 0
HcmV?d00001

diff --git a/apps/common/main/resources/img/toolbar/1.75x/big/btn-text-vertical.png b/apps/common/main/resources/img/toolbar/1.75x/big/btn-text-vertical.png
new file mode 100644
index 0000000000000000000000000000000000000000..b22e55c5754b23b59c9f3b46b254239248d01e39
GIT binary patch
literal 187
zcmeAS@N?(olHy`uVBq!ia0vp^NkDAK#0(^3E>1ZDq&Ne7LR=Yv3<ie(|Nl=}c6%a_
z#aI&L7tG-B>_!@pli=y%7*cU7IYHuz!xcuyLS2T<3#T+NH$4gfF&s1`SQ=8dgf$-E
zVr5!p=(Hx8aWZehq|U^Q6C11)Qf7$pC`kq;s2oVy(J;|r=9z?VF9Uq6D~iO<{b{y7
e|IjS=0uzIfjqQO;$4h^L+~Dcz=d#Wzp$Pys&_9v@

literal 0
HcmV?d00001

diff --git a/apps/common/main/resources/img/toolbar/1.75x/big/btn-text.png b/apps/common/main/resources/img/toolbar/1.75x/big/btn-text.png
index 2ef05951645b7e91b5818cdda7b0710a35742418..244eff7bc0b4e11cfef17afcaaaf1c95cbdd0d38 100644
GIT binary patch
delta 177
zcmcc2bdYg^L_HHT0|P_M#VJRC6lZ`>h$|zI!NBnU|Nkk=ZchZV7)yfuf*Bm1-ADs+
z(mY)pLn>}1CrDT}m@+sSw;321tZm?0$0Vr36d)<KfQLO~8K;i26c?j{<hoFS3oZ9e
z*w{7rU9=r;a+yqI+{vfLTolXfYQ)pS=<#ihL)k&C6+D$jUp&|=E}5RY(rtb8vFG)}
aTnr5NJ)KzA%FD)poZ{)~=d#Wzp$Pzi?l)rq

literal 339
zcmeAS@N?(olHy`uVBq!ia0vp^NkDAK!3HE1_t%62Db50q$YKTtZeb8+WSBKa0w~B>
z9OUlAu<o49OCX0O-O<;Pfnj4m_n$;oApeD@i(^Oy<J()exta|`TrO_;^1t5l>&3V|
z4`*y{-8-+Pi?Q8!o9SB5Nh+S(Ki>GUN8ZL>b5q&;nwXSJY@X}xiubv9tg+oMdEfk5
zmix6jGew!T%e*FLt(vmx=&7tzF&j3_+7{s}z{Z#;Ah5nHZc(}WKf9k3E6V273RnvQ
zg(t39wsqng>+{-M!?Zu&+V$zZpgPkb1qB`ggwjX5B;IebN8%Q5%di5O12q0!t?Y^1
zpY?t21=0U_-~Rj+WqE7jR_)iFA-zDS2c3`>(u)%LB(U)l(9aB>u6{1-oD!M<1R;Ep

diff --git a/apps/common/main/resources/img/toolbar/1.75x/btn-text-vertical.png b/apps/common/main/resources/img/toolbar/1.75x/btn-text-vertical.png
new file mode 100644
index 0000000000000000000000000000000000000000..64e713b3f36f3219f7c7af24229454664f574c12
GIT binary patch
literal 168
zcmeAS@N?(olHy`uVBq!ia0vp^Za}Qe#0(@uDyRGdQk(%kA+C%-1_Q(Y|No~fyFC%e
zVk`;r3ubV5b|VeQ@%40Z45_%4oUp(?frmk84Id9r46j3*ScHcO5U^+**~rBq_Aub+
z0|p`XBsGEd<|IYI85fwmT3wu-6`WRwJrrEDtoI5x=cmQZ(-;^!ljJim*8cwvve47j
K&t;ucLK6T$88RCH

literal 0
HcmV?d00001

diff --git a/apps/common/main/resources/img/toolbar/1.75x/btn-text.png b/apps/common/main/resources/img/toolbar/1.75x/btn-text.png
new file mode 100644
index 0000000000000000000000000000000000000000..05f63a78db0ee25744d43fff4b383172a99048ce
GIT binary patch
literal 170
zcmeAS@N?(olHy`uVBq!ia0vp^Za}Qe#0(@uDyRGdQk(%kA+C%-1_Q(Y|No~fyFC%e
zVk`;r3ubV5b|VeQ@%MCb45_%4oFF06aFx-+fX%=lqp>1}*P%&OgoQ;yVoDg}!7jEp
zt0WHIYJ4Q4FsrkXMe*VVfsPBSLb(gL4Lc5)=p{&mI6bMH{ib1=IRnFzsS4Jr^G;-g
Otn_sCb6Mw<&;$THyEI(@

literal 0
HcmV?d00001

diff --git a/apps/common/main/resources/img/toolbar/1x/big/btn-text-vertical.png b/apps/common/main/resources/img/toolbar/1x/big/btn-text-vertical.png
new file mode 100644
index 0000000000000000000000000000000000000000..267ec2ec38a33638c675ae4534d64e86105ce1ca
GIT binary patch
literal 165
zcmeAS@N?(olHy`uVBq!ia0vp^7C<b+#0(@ouTEJDq&Ne7LR=Yv3<ie(|Nl=}c6%a_
z#aI&L7tG-B>_!@p<K^k%7*cU7IYEK5g<+!x^I<N9rL0HREnK*;k%uRCb=cad7ENu2
zBRV`hTn=5$JnJ}GRy(qUo0za1xf->VNqV}<VvPc0&qik^28Km*B-ktVKHvq}=IQF^
Jvd$@?2>=SdFV+A6

literal 0
HcmV?d00001

diff --git a/apps/common/main/resources/img/toolbar/1x/big/btn-text.png b/apps/common/main/resources/img/toolbar/1x/big/btn-text.png
index 630b2c47c6eb6f01683daef4721c01e7055d1ef5..448117d319da71db052886ad82fae72412fc6626 100644
GIT binary patch
delta 140
zcmV;70CWG80;mCyB!6#7L_t(|+U=J?3cw%?1oQt-r`I5bu52tVnE`LIIvB-70Kk{X
zGLC0u!Cp+v%A3tOBc24;%{kP}u_qW!a&lIO+-}xbLFK-+2`cvuL8C--W1d}B^5cOZ
uf(RmrAcB0=W((5r((wME;RS&AxByMPX|s2p8MOca002ovP6b4+LSTY+(?4qf

delta 248
zcmV<U00;l50h9ueB!3BTNLh0L01FcU01FcV0GgZ_00001b5ch_0Itp)=>Px#1ZP1_
zK>z@;j|==^1poj5sYygZRCodHm*EP4APj^}djD5m{V_z;X*;3WeSe~oo9BjOArSIu
zj^bT9|7KCO<mOp$6D+|RTCuX$YHUi&YE0AWWe|y)L1?gnLvcd{9@an@ZE3`?IolgN
zC)R3ZguI;8vK_sgn8A$v#H8{KN}i#V%{MKDmyCC4&^t8f9rnQn%lcn6m|>)1iF)UE
y1FsZM3#wK!h#YuJt=QQZ0#yr{#Z?tS$U-hsa7GvulXV;b0000<MNUMnLSTaAdSpNV

diff --git a/apps/common/main/resources/img/toolbar/1x/btn-text-vertical.png b/apps/common/main/resources/img/toolbar/1x/btn-text-vertical.png
new file mode 100644
index 0000000000000000000000000000000000000000..0aa4448aa6c187c85802bccb42f510b727d39097
GIT binary patch
literal 149
zcmeAS@N?(olHy`uVBq!ia0vp^8bB<<!3HG%yVdUoQZb$`jv*Dd-cCKp#h}39{QbXu
z?sY*I;cf%j3h6f!XF05%(WCXo_!6hQ#)Xz9CJW{@NB&*W=U_bdbh5MSeZ7dh^+IoQ
z^Q{hCXsQr<8hv2iLFtC``)Asfs`|yg*5=*qxG3k--2AIRdl)=j{an^LB{Ts5^jbGF

literal 0
HcmV?d00001

diff --git a/apps/common/main/resources/img/toolbar/1x/btn-text.png b/apps/common/main/resources/img/toolbar/1x/btn-text.png
new file mode 100644
index 0000000000000000000000000000000000000000..4dbaf0d6e392f80a99ce2a2020004a6923bf01cd
GIT binary patch
literal 147
zcmeAS@N?(olHy`uVBq!ia0vp^8bB<<!3HG%yVdUoQc<2Rjv*Dd-cB{-V^H8={`r4-
zp{k3wu=s_zM`2IjG|d#)`=ManW;qRc<<0vf`}#tgDlL@mN#0J#V=+xX<NnCuip=GE
w9tU+!rSvyNPC4ln&~%q&tLMHODvvb9BzPC)@YLDO0@}jh>FVdQ&MBb@0DUDiqyPW_

literal 0
HcmV?d00001

diff --git a/apps/common/main/resources/img/toolbar/1x/text-box-horizontal.png b/apps/common/main/resources/img/toolbar/1x/text-box-horizontal.png
new file mode 100644
index 0000000000000000000000000000000000000000..4dbaf0d6e392f80a99ce2a2020004a6923bf01cd
GIT binary patch
literal 147
zcmeAS@N?(olHy`uVBq!ia0vp^8bB<<!3HG%yVdUoQc<2Rjv*Dd-cB{-V^H8={`r4-
zp{k3wu=s_zM`2IjG|d#)`=ManW;qRc<<0vf`}#tgDlL@mN#0J#V=+xX<NnCuip=GE
w9tU+!rSvyNPC4ln&~%q&tLMHODvvb9BzPC)@YLDO0@}jh>FVdQ&MBb@0DUDiqyPW_

literal 0
HcmV?d00001

diff --git a/apps/common/main/resources/img/toolbar/1x/text-box-vertical.png b/apps/common/main/resources/img/toolbar/1x/text-box-vertical.png
new file mode 100644
index 0000000000000000000000000000000000000000..0aa4448aa6c187c85802bccb42f510b727d39097
GIT binary patch
literal 149
zcmeAS@N?(olHy`uVBq!ia0vp^8bB<<!3HG%yVdUoQZb$`jv*Dd-cCKp#h}39{QbXu
z?sY*I;cf%j3h6f!XF05%(WCXo_!6hQ#)Xz9CJW{@NB&*W=U_bdbh5MSeZ7dh^+IoQ
z^Q{hCXsQr<8hv2iLFtC``)Asfs`|yg*5=*qxG3k--2AIRdl)=j{an^LB{Ts5^jbGF

literal 0
HcmV?d00001

diff --git a/apps/common/main/resources/img/toolbar/2x/big/btn-text-vertical.png b/apps/common/main/resources/img/toolbar/2x/big/btn-text-vertical.png
new file mode 100644
index 0000000000000000000000000000000000000000..79541939738181decbb0cd52d2cf2bc253e1fb00
GIT binary patch
literal 178
zcmeAS@N?(olHy`uVBq!ia0vp^1wd@U#0(@OTBqCuQk(%kA+C%-1_Q(Y|No~fyFC%e
zVk`;r3ubV5b|VeQ3HNky45_%4oFI{;V8Y<Exvl9$D7S*my3iI?W~YS>qDP`PaB=P6
z@Sc>fu6^caf@_Syy{3nnC#4#6PHs*3;I*k~k(Ay^)~>8s-h68Xq$FRKWlU9b=3roO
XpHkf#&}{1fw1UCY)z4*}Q$iB}o69&{

literal 0
HcmV?d00001

diff --git a/apps/common/main/resources/img/toolbar/2x/big/btn-text.png b/apps/common/main/resources/img/toolbar/2x/big/btn-text.png
index 65e28009cf1f919fe73d7220f0abbfb2ca27fa3a..d625655815f2a9b3eede55dd12ca6a162f51ef62 100644
GIT binary patch
delta 162
zcmZo>-o!XTqMnJFfq@~Sb;?a3#Tnoe;>rkQFfjc8|9{G|+Y^B-#*!evU<QY0H`0Kd
za8DP<kcwN$2@;wOrXt6<coPyHM6o_z8|4r%$y9`k$zf8=>IDgmiJqI@rf@XumUhu;
z__#wNL!0vxhm+6~!CT%&8`u=AJF*!MuXr+H+LGd3(y~dG)h-MS+e52cr*D@`2HEZD
L>gTe~DWM4f&Luab

literal 387
zcmeAS@N?(olHy`uVBq!ia0vp^1wd@U!3HE%U)Oj6Db50q$YKTtF;x&|^bAt@02E{_
z4sv&5Sa(k5C6L3C?&#~tz_78O`%fY(P)@?r#WAFU@$H@4d`$)dt``sf_`g4<mr<U>
zl$C34?zbxAIHQw=5(_j1C#iT|y1PvN{Z!`rJDsQRI(7S5|DK}`)vv2sE<`cSNvgS?
z`!eXdNq0)r>rKoL`_3F#vkQplH2x|{X{&#$S~?|?XWMo@Yk_kN4|yQOJITLuZ6}|u
zxc>b0o0(bfciWXI%waqvsc=Wsctcr_e(!wmwPuH}ZT`4U6h#}t05sOSuCE8Ap8Sem
z9cVr0je`Yqi!qcaf8n&l`Mdwt7<Rpr)33e`yjEIrbM=Ojlxfe8ta-g^BlE*3D}&c-
pUIc|-i@XsvT~@<$l1k=s@g@7c;}+ccT?Gs?22WQ%mvv4FO#r%;pRE7@

diff --git a/apps/common/main/resources/img/toolbar/2x/btn-text-vertical.png b/apps/common/main/resources/img/toolbar/2x/btn-text-vertical.png
new file mode 100644
index 0000000000000000000000000000000000000000..4dd250109d610790cb89ec70fc901681d9d2642c
GIT binary patch
literal 164
zcmeAS@N?(olHy`uVBq!ia0vp^0YI$5#0(@w_@+(*Qk(%kA+C%-1_Q(Y|No~fyFC%e
zVk`;r3ubV5b|VeQ@$__Y45_%4oFEZ#K#EIwN7z9QnWi-h9S(3kDqhRPq<5#uW%fw{
z26eFmoO7DiFd8_nW4$8CvP)Krqr`eDOXfqrB<IYA<YER!hU!(}hFt+O-+(OhboFyt
I=akR{0Jq^Vi2wiq

literal 0
HcmV?d00001

diff --git a/apps/common/main/resources/img/toolbar/2x/btn-text.png b/apps/common/main/resources/img/toolbar/2x/btn-text.png
new file mode 100644
index 0000000000000000000000000000000000000000..a3a4da53ff1b6e98586a6aad3e31855ce0799538
GIT binary patch
literal 164
zcmeAS@N?(olHy`uVBq!ia0vp^0YI$5#0(@w_@+(*Qk(%kA+C%-1_Q(Y|No~fyFC%e
zVk`;r3ubV5b|VeQ@$__Y45_$vb)q2`g8>Kg<{dw*#Q#5kqb<FgTbApQpbOt4r46hf
zXXQ1d<w~v<Q4b56?4mzE|IiKdmAW_hkMeUSu4^%R{q#dWo2AJ4;I$774?O@H%HZkh
K=d#Wzp$PzZc{T9>

literal 0
HcmV?d00001

diff --git a/apps/documenteditor/main/resources/img/toolbar/1.25x/big/combine.png b/apps/documenteditor/main/resources/img/toolbar/1.25x/big/combine.png
new file mode 100644
index 0000000000000000000000000000000000000000..b20ba06bbc1a94a067eeb758f9177d7efac45709
GIT binary patch
literal 269
zcmeAS@N?(olHy`uVBq!ia0vp^Za}Qe!3HEX#cOhb)D=$`$B>F!Z)cw7Z8hLw(L5=8
zkxBJJrkA1PqXSP}^&j~5m}vhL;dDKGY<^0lfYXa=Ez>=MsaM?Y?5&7SRgtLQDaU#2
z{u*Yr7aDhx!<&9S*0{5E^}#Ry0#|SBJW#RRdCjqDj6Jb@#z((bo7Fj5%BC58aMBPm
z@L!;Da7)p}3<LXO!9LF?5=A_rn#&kxv#CYPE6<+FbfD#&m-F*>pUpgdGr^Lbc5UaT
zM{*vYkUV2*TIkYw*7rm29RG6X=ek#RZg(v|*Dy(3TqDAucGX+OiDRx6!z6{*-xh3r
R_z37f22WQ%mvv4FO#sNFZDs%f

literal 0
HcmV?d00001

diff --git a/apps/documenteditor/main/resources/img/toolbar/1.25x/big/restrict-editing.png b/apps/documenteditor/main/resources/img/toolbar/1.25x/big/restrict-editing.png
new file mode 100644
index 0000000000000000000000000000000000000000..a831cdfe637f93a87f8a063f3b87b11ca683ad55
GIT binary patch
literal 347
zcmV-h0i^zkP)<h;3K|Lk000e1NJLTq002e+001Kh1^@s6DHnWg0003ZNkl<Zc-rmQ
z{RzV$5C!mz;0TVG4U&yAf}=P>Mz|`xe;U%(ue%6+4~~M^5Pv<Q&9X2I!!Xk&rjp9q
zG;TyhqSR;8f{}*#Q3EHhvUWZ&w^?Ak22LZ4*TRv;`NMHqVDPDeBOUXH;<UnO;YjEF
zVK_Z78aTBu-*z!;n2)>I6EJGm8MYw85QZ>>`6HNV7PQRrOB3e(P#032`2K-0a~K@z
zLaGx-m?Mup0pkI(r*fzjW8M-5C>dl=<xnfeyfw@Lh--FqktIy-j`e0dLj`LXL6=<P
z&^6Yt9o)@$?ws=p7?lTk@1Mxg5AvD|l)MIw7BGdcL8BFnD0E;ejEwF;!Vrcqgt3Gv
t*=ej`e(p4uFryKp#f?~O*9^lH<plu>b|Kk2-berd002ovPDHLkV1nPyliUCR

literal 0
HcmV?d00001

diff --git a/apps/documenteditor/main/resources/img/toolbar/1.5x/big/combine.png b/apps/documenteditor/main/resources/img/toolbar/1.5x/big/combine.png
new file mode 100644
index 0000000000000000000000000000000000000000..ea709cf6697aed2909a0849e29e268460e272b13
GIT binary patch
literal 289
zcmV++0p9+JP)<h;3K|Lk000e1NJLTq002|~001fo1^@s6Ekk^80002!Nkl<Zc-rln
z(G7(#2ml?4ja<PI+_a-$U*eY^uZFfj&0WHuCVCPmwc7>&007WSsiBQ1(GRJrMcb4N
zLUqtJvxVx2YY>XiHHE&Zd(Sw%g}$tNPtFLT)*Ge9;V9I4pVT<A3za*w#p?rFUhtOr
z%WU!bfR-2Rk?AJ1N2a&XR?W>K^l!~2LqD9M)KI#7{x0vnupc?OtR!^W=Ez{7Q#VIa
z%&e=-)(Ax?LaCv2d3KxFZDLYlmJbukZW9@rJ430Vba~${Z~5!F2dqOae?9kzb*T5$
n#X$#zBJ?vtIeiBJ0N}|5>km7%L-i)g00000NkvXXu0mjf>!g4-

literal 0
HcmV?d00001

diff --git a/apps/documenteditor/main/resources/img/toolbar/1.5x/big/restrict-editing.png b/apps/documenteditor/main/resources/img/toolbar/1.5x/big/restrict-editing.png
new file mode 100644
index 0000000000000000000000000000000000000000..714b66191729e109a657d0f59e459f286bb00533
GIT binary patch
literal 381
zcmV-@0fPRCP)<h;3K|Lk000e1NJLTq002|~001fo1^@s6Ekk^80003*Nkl<Zc-rmS
z;R%B<5CvdI$OswH4Rj+%aFmST2-gH&|A^4q++EJ{9vp?hiGIe`Sf`0$7=~dUlu}DN
zYVp`f5h>D_#S2tAdy5BZ6Y1&230a;1nmtezK(iOBDD;}6_JZQm1yz)KO;I&Ky--E5
z*9=t))B{zNdreR^L9J26pjRDL8`KiD2lShJ*a)B>?_r~Wx@}wgpe?seP=XSapadl-
zK?yoAmY`v05kYl9+j4WSbzqwt#zKK&xw+Rmut?h4STxWK$hB5N%^1s3K!MpH*IEfR
zV=PAk-2iybidh>4w9Ur(V!Q$Gkw68r@|=WO8U?f^U5vMxdPD;?{f^cG_4v`Veth??
zG79wOU(jVFsCZoo77v)st^|S-l%ND9C_xGOr=Y*Q&Nu?}_UnwJK)p^z8MTw%H}(v}
bFwAvco1PSpe|Ie400000NkvXXu0mjfG(({V

literal 0
HcmV?d00001

diff --git a/apps/documenteditor/main/resources/img/toolbar/1.75x/big/combine.png b/apps/documenteditor/main/resources/img/toolbar/1.75x/big/combine.png
new file mode 100644
index 0000000000000000000000000000000000000000..4e1d7a93c63dd2a43909f2d08594236995eb9b3c
GIT binary patch
literal 308
zcmV-40n7f0P)<h;3K|Lk000e1NJLTq003eD001!v1^@s6A-{ZA0002{Nkl<Zc-rlo
z!3~2j3`H}NH(~`wVAG7^rV>Y_rb>dp;XTPWdI(RpV~dso000000FZ~;!aJg>9>CqJ
z_feHa_~hpzMEK0-5P=9ptf=KzaVUuRqn2NBsEF|F8L_G~WD{X6_RJ#M&#lFtS%jUX
z%_1{$<VBnkzNO8gGtvVkgo>CUK|w@MlUEn<v&oYYWCT4TqX=$I%n{5HvnTc{EaKMf
ztMtMuQpD}&Km;NXL63M(kKoqC9Pz$6g2}qDYZ`tLY+rRmuze*X=n;?W5!{-@L@-AP
zeAl#zh#2{<X;TqVvS-Ay10Vtsh<Km~{vQDV00000Fu(^R*^6b)Y0cvR0000<MNUMn
GLSTZToPhQK

literal 0
HcmV?d00001

diff --git a/apps/documenteditor/main/resources/img/toolbar/1.75x/big/restrict-editing.png b/apps/documenteditor/main/resources/img/toolbar/1.75x/big/restrict-editing.png
new file mode 100644
index 0000000000000000000000000000000000000000..e10007382af457c75a5c8ffb18ec53de18bc88ac
GIT binary patch
literal 426
zcmeAS@N?(olHy`uVBq!ia0vp^NkDAK!3HE1_t%6oFfbN+x;TbZ+<JSvcjX}ik+z3@
z69lcC%-1OIXv}-UA^CJhjB-c9#G-$%YVA3kl-0NSYk!GY-YMY3p=dwxR+~nzX%f53
zlCHRG8XSRZf|U(^UA(-?IN<tX=QDy5rv!>c+BB{g9>35cv0hOkDd4!Mv$PVIbI+?C
zi4hJi2_1>D;yl_M`8<Z}lKT=lA9gD8mHHU2QQTv&MPc7w!!tY|ul6REb!^zG!{7Hj
z%7KBAMF5!)6!z~pJa?(X5$7o{FQ(S!GTB+Lf65`SHs)pQwe4yNvbRqOD*S5Sv$b%Z
z+}ii))6CW-uS;o@;Mi_<ZtvH>n`$#3TRrnC>!`aHZ}!akf~KX5{cC;c&$2J3$S&&J
z{6F~F$9ZQ2{%U93obms6qlR^h#rkwc#d)t8KQ0!io;QE(OocK#`{>P%9#5vOU{RbH
zu7u(=#+K``AAd6+y(qBzf9NbuC9chBw;FkL`GBGJU%x!*>w3fHpZd#yalqi|>gTe~
HDWM4fKijD<

literal 0
HcmV?d00001

diff --git a/apps/documenteditor/main/resources/img/toolbar/1x/big/combine.png b/apps/documenteditor/main/resources/img/toolbar/1x/big/combine.png
new file mode 100644
index 0000000000000000000000000000000000000000..b49b49a44e0eac402ecc19071cfe959107002d72
GIT binary patch
literal 236
zcmeAS@N?(olHy`uVBq!ia0vp^7C<b+!3HEvcGuVesm-1)jv*Dd-p;tldq9E1MYgkd
zSCjINm5T#rKZwr_yrA|~@1eKwXO@p9EF8C-cCwf&RqG!+GxPQ-V}{Ct9FYm`$F?!l
zXl<49d=}K1!C0fYb(Ko-N|!B6S>>}+j89C8&9&sbvsE(X<T|kp?B{rHFh6I#q4hYj
zVS8#1&m*2!3TtCS_TGD?_v%rKn|^Bd<e86{!glke2&4=6v4LUQqv{V4f8=azc5Cd@
iDP#TfcfHh?seT(|>Qc-D-`4=0&*16m=d#Wzp$PzQc3e*Y

literal 0
HcmV?d00001

diff --git a/apps/documenteditor/main/resources/img/toolbar/1x/big/restrict-editing.png b/apps/documenteditor/main/resources/img/toolbar/1x/big/restrict-editing.png
new file mode 100644
index 0000000000000000000000000000000000000000..c3e69e64ff56f66fa55a8d8804765c73815722f5
GIT binary patch
literal 304
zcmV-00nh%4P)<h;3K|Lk000e1NJLTq001}u000~a1^@s6G`oC00002@Nkl<Zc-rmQ
z(G7zz3<OX{$Ovo-8?XYKWrU1yjU`v&r(h>%RN7dw3dm7-K%JIp8ZqLrk!!+`3u7_>
z8MathKp1N>11V>2snH9u+zFf+NC$9cA>pX$Mp}XTNkPI{(}nZ^Sx7Y0G$Xx02GRmN
z>$DNTkDWFONE_RFl09Pw@SlOxoxt1f!mk6RRTs@I8YoLc&7!$Q17(7}X417#w$~`2
zfNJhFldgrby+#6y!rqbeSQJq1+I-j-Xo&=(_Yrpj!T1ha2b}$y$!y@o|Hd2v1mh`i
z06}Y112}-+4ZM2k#0H+ebcz5nE<|Qe#_Xaao)9lT`3DcV9Z69D0000<MNUMnLSTZ{
Ckb30+

literal 0
HcmV?d00001

diff --git a/apps/documenteditor/main/resources/img/toolbar/2x/big/combine.png b/apps/documenteditor/main/resources/img/toolbar/2x/big/combine.png
new file mode 100644
index 0000000000000000000000000000000000000000..159293d26e0920087fd989553c9bc9dc1a2d6e3d
GIT binary patch
literal 508
zcmV<Y0R#StP)<h;3K|Lk000e1NJLTq003|R001}$1^@s6CF^`j0005QNkl<Zc-rmT
zTaJSu7=~e&;u5-}vV*!~mcSCIHZ?JfCR5};pzoKENiV>QCt*1J3<DvA5JCtccg}Ne
zX>R$)7QcO6C+GZ}TgtyDE`56dj1_omOC12lT%Xhf;EJKuPaE(Pt$qLk2q1s}o&v00
z74EfAj6KfnWeIp<Rk)W>j6KfnWepew@z${?L%=AAw~jqo0!mCxTfF%FZ8G&r{BJ4n
zmcOIb)GGlff#(KL0?!km6rKw}DLgNLl6dBTl6W2f$BM;JH-H7+zXBkDOrcDnEMji8
zh+!LX5kNNb7Xb8hlqPb@fAyoZE#lPZd#(UCh*OL2c?I0dnVXO33Gm>1XKp@X4}f8)
zy8%hV-y08)fT8jRB$YQFUIA6p(@nSP>JGsB0;<-98cd<;b)njTs&%0Tfa-Oj(%T5@
zni%PAgn3O28+kVJ9Hm|9C`|&-4Ini!9RpGm(=i}5F_csQ2q04^Qz(lVYGT+%u#smY
zzfFs`fy)>Vr$=cm-UcpXJiH#Ig`v$G!6QWLnwXH=yb(M?G_Q%#4o|EB1Q0*~0lX`q
yYF(%Spn6@Xc4}9>Rdt~Tfa-Ojgb+f=mGcIf=f-%o=BmyB0000<MNUMnLSTXir`I|F

literal 0
HcmV?d00001

diff --git a/apps/documenteditor/main/resources/img/toolbar/2x/big/restrict-editing.png b/apps/documenteditor/main/resources/img/toolbar/2x/big/restrict-editing.png
new file mode 100644
index 0000000000000000000000000000000000000000..8164cba4b20ce114b1b0d250c9d686789e9f032a
GIT binary patch
literal 571
zcmeAS@N?(olHy`uVBq!ia0vp^1wd@U!3HE%U)OjsFfcKBx;TbZ+<JSbaqS@m0k#CU
z1Qz#~9CsJ=JYXx`+;>4xqES#lNo~)u5cz_F>woH<lHxu}{gqo57d_QUfW;AnI3o`g
zB>rGiz7}b@*W&$Op|;PtLa*1{VaQe9Q?sUrVQs#A-2Ww+TUH(B`uMkR`>Ml&8%-BH
zZ1G^o*rB+MEo6>BH1o3KYXmeIZYl&Z6ge+pN@?_9J;6CqsK7!=RYBY(>%hW}D-ALN
z)eL;jZx}74Hi|zGI1<;OELhDXC-^>`=}$w&be4!q{-sR}-oIA*2_?its@8^THY{7R
zUW;?W)4J+?6BmEuc3@x<XkcJbU|{5M$dhEP*g2H}BBaw9w%(XOdfWQgy;1p(7@ad^
z&)c+YOqJbYyY1dOhKk_le*<Sf>tNwY&5!@JxbU{G(SoxJmTi$res<VQSL8xkKyXa&
z%lDrXXHVnE*vIga=c6L8f%W_Ef*Q43_6f=hF@6szx0`9a)N;1N0o$qb{Ga(`o>LS2
zFn!moUkY6UAEtZjl=LrtFtOp)sfNA#jxh){)CX1VU+8;2l{cbrf1=HTNEL=_ck*Ab
zfJqgGY1fp0YN#^ktaATVD+2Ql%xC|n--^$C#24{Z+gFIeH}!jq^@5cz=Xo$Z*|JFY
zyLkA{MQd3OToQd7vYdM^+uDrlpPke}@i%drde@XAH&!kFHU*d{7(8A5T-G@yGywqI
Cf#%!*

literal 0
HcmV?d00001

diff --git a/apps/presentationeditor/main/resources/img/toolbar/1.25x/big/gridlines.png b/apps/presentationeditor/main/resources/img/toolbar/1.25x/big/gridlines.png
new file mode 100644
index 0000000000000000000000000000000000000000..ab1ab7427c7598d62795542d6dbfb3fb37ea43d0
GIT binary patch
literal 169
zcmeAS@N?(olHy`uVBq!ia0vp^Za}Qe!3HEX#cOhbRDq|9V@SoVw>J)Q9#9Z)b@bjY
z{Pv5wrb9r$1Ow*ko57ztI5b%q9>m|WwzSCo<~V7~oU37nQZ}rg{VkGX^1*$1x7;NX
zTLhmiGx+*Ir}byts|P=lWK@A7$JRaxE1J?G=q8bv_O<)pgRisyJz!+G^Num*IahTX
SPwHHt-3*?telF{r5}E)C5kiUp

literal 0
HcmV?d00001

diff --git a/apps/presentationeditor/main/resources/img/toolbar/1.25x/big/guides.png b/apps/presentationeditor/main/resources/img/toolbar/1.25x/big/guides.png
new file mode 100644
index 0000000000000000000000000000000000000000..5aacef90b7416c600614e58a3e33ebc5e22d5b11
GIT binary patch
literal 192
zcmeAS@N?(olHy`uVBq!ia0vp^Za}Qe!3HEX#cOhbRJ*5(V@SoVw=*2M4k+-je7;qq
z{jVgOzxAHU1&3Sb8Xh=yOKuV~VFs%FA!gXl<^D#_C1}O86CHsYD^!n6nWy^u@0-Lu
z-7|LH5&X<#=+fEe$P>6ISx)5f_C?{v{%<_HExGq~#hop`e$ns_5dK-$DHN#W)$ucU
mO54}UgVJ;3J^)Q-*j3EnJ>?(&?8WzFL0nH)KbLh*2~7a%u1V?u

literal 0
HcmV?d00001

diff --git a/apps/presentationeditor/main/resources/img/toolbar/1.25x/horizontal-guide.png b/apps/presentationeditor/main/resources/img/toolbar/1.25x/horizontal-guide.png
new file mode 100644
index 0000000000000000000000000000000000000000..97bf7b14c5728e6147d1ef15dad4e9126a1629d0
GIT binary patch
literal 143
zcmeAS@N?(olHy`uVBq!ia0vp^MnEjd!3HFYLuy@sRG6oWV@SoVx6=&y7!){;)ac%S
zrm5b%TV}Fhu2WHWqY(QwCWar4Yc4I=blV{)%gstjO3$I~#ESOce1a|lJNZS_+b8Ny
rRPyV~dzP)(#GzDwKZ=1Ne-k4ouZnE*gS+2>HZXX)`njxgN@xNALW3<M

literal 0
HcmV?d00001

diff --git a/apps/presentationeditor/main/resources/img/toolbar/1.25x/vertical-guide.png b/apps/presentationeditor/main/resources/img/toolbar/1.25x/vertical-guide.png
new file mode 100644
index 0000000000000000000000000000000000000000..1cde0894517dcc5b2ee8978838e7b4d84526b846
GIT binary patch
literal 142
zcmeAS@N?(olHy`uVBq!ia0vp^MnEjd!3HFYLuy@sRH&zmV@SoVx6>TC7!){IYS-TX
zrWyU5FEC8NlzCpt#75f;Hii#Of$p817nvtHSthx;%$=)Vytc#2`uvl9q8l$OSr><N
qX9eoItPr~zC0P0FIupZ=$xKs(6++JL3sVGIz~JfX=d#Wzp$P!(LoEgX

literal 0
HcmV?d00001

diff --git a/apps/presentationeditor/main/resources/img/toolbar/1.5x/big/gridlines.png b/apps/presentationeditor/main/resources/img/toolbar/1.5x/big/gridlines.png
new file mode 100644
index 0000000000000000000000000000000000000000..851d47700ee0420035da3cdd4acffb0589d3f3ac
GIT binary patch
literal 180
zcmeAS@N?(olHy`uVBq!ia0vp^AwaCf!3HFCoofn!RJEszV@SoVw>Ja18WaRv1E;_9
z%UQnumcxaHrc%B$*Z&+*b=+VIRCiDEddkC|Q|@Y#k=Y^5&l0bzzX{@*)gC*4L-&Fv
zF0B;{n(CA?;w_#oC~s(e%wPJ1RWu~PkyZ4{){|RLP80{TLoReJe*4j*{LLp1b_RwI
a_UfniO<|gA)KLO7p25@A&t;ucLK6VTxI`xa

literal 0
HcmV?d00001

diff --git a/apps/presentationeditor/main/resources/img/toolbar/1.5x/big/guides.png b/apps/presentationeditor/main/resources/img/toolbar/1.5x/big/guides.png
new file mode 100644
index 0000000000000000000000000000000000000000..ee13509a5202fd7150b2aa417d4653215f5e0b9a
GIT binary patch
literal 201
zcmeAS@N?(olHy`uVBq!ia0vp^AwaCf!3HFCoofn!)C5l#$B>F!Z*MwsH7E$M2Kc|;
z`ej+LUemU7Ngh@FEoO^qpKV`h3RL*5r`q+Q)J$);BOOu7(itk>zn=PhO<D~^vHV)-
zaGSGnnSQ2IXxsv=d?5KW^j=FC%dL3Ew>IhDmN3UYv;nfzzt0G`4}`*60aL>(!Q@YS
p{}(ywf0oQ%{$~j@1H+H`+;1Y{!u_UBlK@)D;OXk;vd$@?2>?)QPZ0nB

literal 0
HcmV?d00001

diff --git a/apps/presentationeditor/main/resources/img/toolbar/1.5x/horizontal-guide.png b/apps/presentationeditor/main/resources/img/toolbar/1.5x/horizontal-guide.png
new file mode 100644
index 0000000000000000000000000000000000000000..1f65ee5987801de9349b006e7df395c452b48de2
GIT binary patch
literal 153
zcmeAS@N?(olHy`uVBq!ia0vp^Hb5-L!3HD?X4LuvsRU0K$B>F!Z?B)`WKiUBy%>^x
zTl4A41m=qk`>Pcm<V<<J#)O%HVfjZhFNuB`t&>v^FFxqC%YwBz_}tu^?FmhsYCm>8
zFghl7?csxEUnK7bXa6%e$Rh0XA^YI{z0(*NZY*GWE1zu>ddI{RXcvR0tDnm{r-UW|
DQ#m>_

literal 0
HcmV?d00001

diff --git a/apps/presentationeditor/main/resources/img/toolbar/1.5x/vertical-guide.png b/apps/presentationeditor/main/resources/img/toolbar/1.5x/vertical-guide.png
new file mode 100644
index 0000000000000000000000000000000000000000..31ec9a394df4da98ca2b0f85e747a0745efc0f9b
GIT binary patch
literal 152
zcmeAS@N?(olHy`uVBq!ia0vp^Hb5-L!3HD?X4Luvsd!Hp$B>F!Z?9YPH7E$M1o)rc
z`dwr3Qq?10C;y0Zau-wcIlPULAwKxH*Wp!DohOG>UCDaj^G4FQ_*|p$#`KaiJ4-IA
vGv7Bo&dt5%lGa)nx-0Ude7`C~#X-Kq&*C3?$+krStzz(W^>bP0l+XkK@0dAZ

literal 0
HcmV?d00001

diff --git a/apps/presentationeditor/main/resources/img/toolbar/1.75x/big/gridlines.png b/apps/presentationeditor/main/resources/img/toolbar/1.75x/big/gridlines.png
new file mode 100644
index 0000000000000000000000000000000000000000..de422a897954e937854da53af9b963ea333f095d
GIT binary patch
literal 197
zcmeAS@N?(olHy`uVBq!ia0vp^NkDAK!3HE1_t%62sUA-k$B>F!Z*QIEY%maUJve2a
zU()jMTnE<Ajx!s#S83Zya72I%U^sKR@8qG(e0c@W(@|^PJMO%B{h-#W<;2;2eD~Zr
z6k7zGz(mJP#aD-33O%Zc<UTI`Fhd9;3Y0472SXE1xKfV7T<!b+*Ju7dT<;6A;KLEV
XhJM)@uP4sF0pfbP`njxgN@xNA^@BzS

literal 0
HcmV?d00001

diff --git a/apps/presentationeditor/main/resources/img/toolbar/1.75x/big/guides.png b/apps/presentationeditor/main/resources/img/toolbar/1.75x/big/guides.png
new file mode 100644
index 0000000000000000000000000000000000000000..cf1c6f38914786674bde22445f0e392bde41a408
GIT binary patch
literal 221
zcmeAS@N?(olHy`uVBq!ia0vp^NkDAK!3HE1_t%62sU@B+jv*Dd-rjQLYB3OCIk3m<
zewV$hvQotq9|Mh0h1aUPXWV-kqr(bR%5d-UFH!FG(`p+!GB$?I7Ie}1r+lPEVVd3H
zHTTcgdH$^usI3%jQ3#owWhB@X;JfOi%L+Be6>3*gl!BxK^JiNX&5yKK?Z`InKR@yJ
zlPckdJq2zS%04g+0xdvoYEA;HJWc0r`}FtwtZnvtuCsuw^?x(*=lYxj{IfvrW$<+M
Kb6Mw<&;$TrMp2vq

literal 0
HcmV?d00001

diff --git a/apps/presentationeditor/main/resources/img/toolbar/1.75x/horizontal-guide.png b/apps/presentationeditor/main/resources/img/toolbar/1.75x/horizontal-guide.png
new file mode 100644
index 0000000000000000000000000000000000000000..211560a004c4ad2318db411e0b5e8e34e1b870b2
GIT binary patch
literal 161
zcmeAS@N?(olHy`uVBq!ia0vp^Za}Qe!3HEX#cOhbREDREV@SoVw>J)Q9#G(M2wZ;l
zR^Ozmf=0ID4Ym9&b6o7I3V9eB-p|ZVJv=L)f6`3j>N8$5a=7NT8tA64e5c)GaEL=0
zNW=)LeUo8-9yCK0NTr(}3l?&dNNf>wn-Smov6-ErU?IDP)uFl$yF11}I~hD({an^L
HB{Ts5(qJ~D

literal 0
HcmV?d00001

diff --git a/apps/presentationeditor/main/resources/img/toolbar/1.75x/vertical-guide.png b/apps/presentationeditor/main/resources/img/toolbar/1.75x/vertical-guide.png
new file mode 100644
index 0000000000000000000000000000000000000000..268067c2222cb657aa4cac44644df940728faca1
GIT binary patch
literal 162
zcmeAS@N?(olHy`uVBq!ia0vp^Za}Qe!3HEX#cOhbRHmnkV@SoVw>J)QHW&!790-}c
zZT*z1{j4fQi;S3mwmMJ0?SG7c;m3R{e<{DUbsm$v`fqWnahIoGzN0-u=gwT&V%Eza
zne#cGb?!8CGgy_9%(B>P)e;bba*NF+^eY$`<VzUBx^}&(a(K%Qw3NZq)z4*}Q$iB}
DA1OCq

literal 0
HcmV?d00001

diff --git a/apps/presentationeditor/main/resources/img/toolbar/1x/big/gridlines.png b/apps/presentationeditor/main/resources/img/toolbar/1x/big/gridlines.png
new file mode 100644
index 0000000000000000000000000000000000000000..1d8a18a4762c013175782814d95c2cdcaecd3d0e
GIT binary patch
literal 149
zcmeAS@N?(olHy`uVBq!ia0vp^7C<b+!3HEvcGuVesTfZe$B>F!Z>Jk_F(~jb*H+cv
zTJCc9s8ZS`>l2e)`MnQbV_-Po-gjcg9a%Nar>feHy1RC~2;s=Oc+^#$MX<)fphuJS
yxohu3Rza5us)r{fx(NP>{P6R=5Cg-U3ykTKO^<u-8VCdJVeoYIb6Mw<&;$VYaWY8&

literal 0
HcmV?d00001

diff --git a/apps/presentationeditor/main/resources/img/toolbar/1x/big/guides.png b/apps/presentationeditor/main/resources/img/toolbar/1x/big/guides.png
new file mode 100644
index 0000000000000000000000000000000000000000..9235a910b9614d373906a5cc6ede2c6f20ac6df4
GIT binary patch
literal 179
zcmeAS@N?(olHy`uVBq!ia0vp^7C<b+!3HEvcGuVesVYww$B>F!Z>KwQ9Z=w5sa<>j
zT=2GU0UwfPZP8?%$!OS~5VKin8&E^(4GAr|ZCYw4L;5S3L~T0eS(sQdIe&GF+Hvph
ztX~I2*Rw9`66L(JuQ@`b``?X&cAXy{Wz5t5aO;m{b)ix}UlDty+6E1=ql^5n-}$$j
dg@Hkm&wTx!?S)B4Qh}~u@O1TaS?83{1OT(yLXZFe

literal 0
HcmV?d00001

diff --git a/apps/presentationeditor/main/resources/img/toolbar/1x/horizontal-guide.png b/apps/presentationeditor/main/resources/img/toolbar/1x/horizontal-guide.png
new file mode 100644
index 0000000000000000000000000000000000000000..9a88f1b7d337d49576054b11dd87f59a89c58fdc
GIT binary patch
literal 139
zcmeAS@N?(olHy`uVBq!ia0vp^8bB<<!3HG%yVdUoQbC?Bjv*Dd-cEJoVo=~<sa<>j
zo967s=Q;X;TbQ}ol$2#ngq;Fh*j$oKc^n#)tsEzCFBDwz?Clrt58RIHZ@As%QnL$w
npSo6m+5_&U>+wR0e#Q)J_kQG-@TZ&wn$F<q>gTe~DWM4fX>cpW

literal 0
HcmV?d00001

diff --git a/apps/presentationeditor/main/resources/img/toolbar/1x/vertical-guide.png b/apps/presentationeditor/main/resources/img/toolbar/1x/vertical-guide.png
new file mode 100644
index 0000000000000000000000000000000000000000..255ec3f26379c7e45419ad6331eb1c66ad04c71d
GIT binary patch
literal 138
zcmeAS@N?(olHy`uVBq!ia0vp^8bB<<!3HG%yVdUoQh}Z>jv*Dd-cCKp#h}39{5Pup
zwtr--RaCE%(6<BKJhJZ=%oJ!+s%l&@gO^$0LB~`_m0I<$hZQF6Gye6qbvw_z7pLO_
n1htb~W1cqMuNP8`yUeiS@Q2%y>V<oNhBJ7&`njxgN@xNAj8-vQ

literal 0
HcmV?d00001

diff --git a/apps/presentationeditor/main/resources/img/toolbar/2x/big/gridlines.png b/apps/presentationeditor/main/resources/img/toolbar/2x/big/gridlines.png
new file mode 100644
index 0000000000000000000000000000000000000000..fa46a7819b0eaee3a85ed6970c1be5dd2acf3688
GIT binary patch
literal 278
zcmeAS@N?(olHy`uVBq!ia0vp^1wd@U!3HE%U)Oj6sk@#ojv*Dd-rjcPI%FW=aPiI-
zTd%xX%1<~9CyL$aSh~{c(Qkv@I!^PqNO*WnQt<?#FZXq8v*wGHoZ5Cgc<Z%kc3Y3G
z?Xf+_FzrCa?<<@KE<FlQXZYU!W!0Xu%dgAcy>EP=n*G{S!}y5ujCuw}CKe6>1&0O@
z;|JRTnG!w5JMtL^7&$IzUonSCfK~V<{h3%U#C*ZCCtL%f9;z{pU*c!lrN_KWH#dA`
z*V{ft@_^~leG5aj+s<Q+X}%vIWxv4`>`I_RFY)Hoa%xZ5dVU_zqYR#|elF{r5}E*F
C?P$#a

literal 0
HcmV?d00001

diff --git a/apps/presentationeditor/main/resources/img/toolbar/2x/big/guides.png b/apps/presentationeditor/main/resources/img/toolbar/2x/big/guides.png
new file mode 100644
index 0000000000000000000000000000000000000000..3367ca64d8e9ff026a6a2c82393e10fd1024e36f
GIT binary patch
literal 303
zcmeAS@N?(olHy`uVBq!ia0vp^1wd@U!3HE%U)Oj6sc)Vxjv*Dd-rjcPYf<2F2+X%y
zx5v!=0f(%w%FG?ig-Q?qF5!-xa4VlnZ<h{GIS3e-&$s;~_wkcQ`nph;BkBDz@6}~@
zZsYJ_KA}BPnq`?p`yHhXBFn{ZOYY4)wK-&2w2<I!!MpMA+~%<e{Sc2+{IGGl@&pIn
z5N_284osXX7gUewP62ZZ^ct@p%AdX>_Wj=bx<Kai=hwcne^V|fYm8c9Ji%eVV4X6D
zN&t5$n~;Y>Ba6@rp~qrg3&d8nLbyMC<|+HA{q@thDyGJ7a%WN$%evDN!d^emYz=#0
lb)x0c$AxRTA?|1JIU~Lx_CvMHXZe1Rh^MQc%Q~loCICpgZzli%

literal 0
HcmV?d00001

diff --git a/apps/presentationeditor/main/resources/img/toolbar/2x/horizontal-guide.png b/apps/presentationeditor/main/resources/img/toolbar/2x/horizontal-guide.png
new file mode 100644
index 0000000000000000000000000000000000000000..952f04eeb7724f6e2333e927dd4add807503ce6a
GIT binary patch
literal 230
zcmeAS@N?(olHy`uVBq!ia0vp^0YI$5!3HEV6KWZO)LKs$$B>F!Z*MwswHolaUVL|@
z?@rmY393i9#JVi9Y8F-Srz}dSUvKeKmldd*;a*DS<6I|`vNeXPO4H2bthTM6$eD4d
zqSi+6g420p#@}k8LFeCFPx-q;dY-=nlhA|)78M0X&L1BeUT5xl^EH~u?6t+=zgJ3`
z_Gu{0H(=!SfU0@0pGoVy^ReQIH+g?C*T0NbOVGVlENFji25-dC=Ssi1SAi_wv4PR+
W&Hbd5rA)~nr+B*hxvX<aXaWFm7gWOl

literal 0
HcmV?d00001

diff --git a/apps/presentationeditor/main/resources/img/toolbar/2x/vertical-guide.png b/apps/presentationeditor/main/resources/img/toolbar/2x/vertical-guide.png
new file mode 100644
index 0000000000000000000000000000000000000000..631115b05b1a96302230471cfa870456be03784c
GIT binary patch
literal 232
zcmeAS@N?(olHy`uVBq!ia0vp^0YI$5!3HEV6KWZO)Ot@B$B>F!Z)ZAkwHWZYRtN9?
zbj#AIPvG{#rVj4qGxd%3u-B_=)(SB%69KAbU}!MkxTV6oBk6IErczSo#|w#ndwLv%
zPu+gZ*(g?Jqg=56N$fSj(7&4x@W<Qi|F+_l@&{HX`L+MMxs^VgXSsBU!$pB<<{=(I
zAhU*9u)~4H$YsVMpTsDMM#;ugwI>SojkGVw|5%zY*|;_1yOQ0x8KMzKt0(?z$^yBS
bVMhY<hSdk9@;A#Y1#vxH{an^LB{Ts5+3Z!S

literal 0
HcmV?d00001

diff --git a/apps/spreadsheeteditor/main/resources/img/toolbar/1.25x/big/edit-links.png b/apps/spreadsheeteditor/main/resources/img/toolbar/1.25x/big/edit-links.png
new file mode 100644
index 0000000000000000000000000000000000000000..09d385dfe0ad9beeb62370d64d86ea4604769d4d
GIT binary patch
literal 479
zcmV<50U-W~P)<h;3K|Lk000e1NJLTq002e+001Kh1^@s6DHnWg0004|Nkl<Zc-rlm
zjg7+~422mXBd}q!0ojOdkWn%MBe)>>Bo1L0h~2Anev;K6nW%hy4^ZNq$z(E_zD`#z
zn5>}jLjd4{c?B&nu+V>Lz$vqw?MIm5Tfle?IE!Gs793dY7l*R~247X+z>R)UIICc^
z;K0p(F*tX?Xuz2T!|h_921D**e*s4AI${$tFb2lJ7#IU%U<}NE2UAY8XRgE?=py#1
zg25B*nJY23A7bg#2ICRPk!vHymG5`#^IHEjLMcFwTpKZN%e7;lcZv~+IO!1`=qxQT
z#R>c1_yX_L1Otpy+K6rV-VqVI3kDdcv=J-LN!7St5t9Iu2r#{fZOt{7BSwHpJutn9
zAsCQ~SP#sJlOKuLBiB<RVg#7th+`yT`ST;!Qz~NI;=4D_fyOC;aYh|6iN$xXol{2)
zoe?N!)De@~u48krB~{T$=m^j3T5uOk1t-?`T7DviUnO*wXLc=+0^=qk))N&mk%Ji(
zF`~B{F-b5~#9F5Wsl}J+?MAHQl(4$^jy`asBG%Tsh;fr0df-MytRpsJCX>mesTUNG
VH1$_YjhO%d002ovPDHLkV1fyC%kTgI

literal 0
HcmV?d00001

diff --git a/apps/spreadsheeteditor/main/resources/img/toolbar/1.5x/big/edit-links.png b/apps/spreadsheeteditor/main/resources/img/toolbar/1.5x/big/edit-links.png
new file mode 100644
index 0000000000000000000000000000000000000000..def9fc7035dc19b664acd8df7110e6da6d0ee071
GIT binary patch
literal 538
zcmV+#0_FXQP)<h;3K|Lk000e1NJLTq002|~001fo1^@s6Ekk^80005uNkl<Zc-rln
ziH*WA5JgjhJ0K;b!?=Ucf$4}6T*|Dynw3x#pK}1(`I3bM83Pad#SU2(i^XEGSiUGR
zH6XNI<3j>K1X^}2pg^pR8c;J4N-h2%`!@hxHJ~y8UA3SBL#;SeDo}h>feK8uqEI=2
zYC#3YS}~|xKsBHObFBzePN33IL7<i$DmPF`s1%?*YuHZ!+FZka3Q)Daxxchz-v-ox
z8c+jjKn<t?HJ}F6fEv($0My~0ytU2z+q=7W08KBuyeIG2W=1^Dy#r`|(`RaTyx>vG
zmf8c4cbY&E<}<Z>zTna5XG`sY$2)DHdBlam{xW>8IW2L-g~9$Ze6Q`fh$C+#E7oZO
z&C_@r?C<x|oi@-Jzb>c8l3zK24*T`BuI5*X5qcZ+>vl0hul&kALT@8}MVH2wU%7#1
z#~g!x4Hbt@`?Ueor*@3^H9uE!DAlh$XZdj9(z9PzgkKwl(|+wd%ZIZ|&wfRB9<@<O
z^=pqOeWxdV$CL(cpf6B;rzd@DN|XL_nXIe%wYFA`5<qAC+E}YbZJ;&3mJ%c!+Ndk~
zwNewL9NJPr$*))LZ246RXwk0)cOKNU{LJl)HNTej`F^3TLx*o?togOF&-c`IsKsKj
cSS%{}0W&S&K;Q~m&Hw-a07*qoM6N<$f}&dXRR910

literal 0
HcmV?d00001

diff --git a/apps/spreadsheeteditor/main/resources/img/toolbar/1.75x/big/edit-links.png b/apps/spreadsheeteditor/main/resources/img/toolbar/1.75x/big/edit-links.png
new file mode 100644
index 0000000000000000000000000000000000000000..6da669b7b71bf204103ef6e964b3fa2e8445cfcc
GIT binary patch
literal 641
zcmeAS@N?(olHy`uVBq!ia0vp^NkDAK!3HE1_t%6oFfe&|x;TbZ+<H6v;lw5bf!3Et
zrZ~9Y;4D#)%}Af(z-ei;`J5%!N$0Z7cg|KD_t@`QvqS!w@x*MYwnT}x#DA{Ko_2V-
zzyHXV)DwKg`#r0Y*0q^72}|B(UKL#NH=bS4CPAZ_BhFw^(cD)CCXOc-bN6HfEZ5@6
z6#$9_&doB=ai}=Z(N?<Zzy_v3X*ZK~$$W=}Tzn-qI>`o0TvNz8c!8-=kLNrOQ<TI!
z*_PYck!H)EWec)63gAFja{MCtZWo>5-FA3ZS<-u>cOnWY(!aOK7*|C5-s;@DyfB^d
zqGxjZ)ML*M@EWcA%(l_yE|B~Em>7gBxMb$r>06^E<@Y%3`Lp11UF7bm9}fy2iCy<b
z+4Hgc`pW2K(;p`M{c_TvmS0uia^Fjh?<;4?I{LgQ3HcFncAmncb8YK6_f}TxaK=iz
z+`0LIf8qXXjxBkNN~T|#uAJcf`%*IG#Vv)PV10*P--Y(J&0Kexj&N8kQuz|Mt_CD?
zY?88<lYe>M5^Z_WUDvlSn{(l!n!M1ji}}8m3m5xd6R67M+iSM}y9#T-3&($TlRhqU
zV!tMM{kg4YHg9b97KS%ZcWM{#wYT=ITO)t=`Cjj6rFl=e_)k4AEJ^)avA<kX`BCJu
ztqUsUrv0{GaY69>jyL}oIJw(A=42AA(o|g--7Fz0RvWqSI>W-fypI^2N~Mo*vnYMh
zZK!U^V*@H-Q_%Sm)b}S`Q|Zgv$I=U*Z!_G-rS!$8jC(F9A<Phd#;z)TKIMm(xGpeh
OF?hQAxvX<aXaWGcR}azv

literal 0
HcmV?d00001

diff --git a/apps/spreadsheeteditor/main/resources/img/toolbar/1x/big/edit-links.png b/apps/spreadsheeteditor/main/resources/img/toolbar/1x/big/edit-links.png
new file mode 100644
index 0000000000000000000000000000000000000000..627639f5139272c4ecaa4c3e5d4078dd6e0d43a6
GIT binary patch
literal 392
zcmV;30eAk1P)<h;3K|Lk000e1NJLTq001}u000~a1^@s6G`oC00003`Nkl<Zc-rll
ziw%Sz3_u;l5g36{*g!XML`HCw9whamwLpP-pM)lj$ys9G@luJ?G-AYG#vT#`xoJEM
z0CteYrUeMXnq31jb}p&GKVthN;H&{z0XS<xLPbqCq!bXZDv(fF(*;=rs09fPHO-K<
zfEthzz}%#L0x&sgp8`}{+uCH$+5tEK2jK4kE}6;cLpn{s@Y9l+oIa$}1at^z6ZHn~
zuNu1$n@2dCs5f|j)zZu(L@q2sY5>L^GKDoZLTUk~G&pNJk?UF8T0ltDy|pFh(~Gt(
zfSjIGTZ2&5+A@GQJ*l>+sc+Sm0<PGsNoafM=~}d909S0*aM~Vv(jBYOmQ%zb6sKcu
zr=W3)I)vhMOzxC)s!9*rwopU0?LBPULd`|nUO-M;PEV%<c+-~CQ#xo$ADuXDX^P*A
mrH@XWwoG)r7e|cvQoI0)l8}zd95J5&0000<MNUMnLSTXyj-q1#

literal 0
HcmV?d00001

diff --git a/apps/spreadsheeteditor/main/resources/img/toolbar/2x/big/edit-links.png b/apps/spreadsheeteditor/main/resources/img/toolbar/2x/big/edit-links.png
new file mode 100644
index 0000000000000000000000000000000000000000..1f0f17c94ae6193825fb953a7f03077115abd5f1
GIT binary patch
literal 845
zcmV-T1G4;yP)<h;3K|Lk000e1NJLTq003|R001}$1^@s6CF^`j0009NNkl<Zc-rlp
zfsKS95JfG45-i0|)(*}Nv=g@zORxk=umlfsm`pah3^0u2Wqv|(ySkvh1>YgrrqO6L
z8jVJy(P$*+<;v#DPEdS3qokAD_x<I{w$sGdGfD$!iQvI93Ib?%`pEi{hC)@3D2T@u
zr>aLHL~4M&B#0FN_R=6y18gKgqy`xN76q{eKrs+&0F(x?7C;dYYXOu5u_nOVA=U&a
z1!8T0w?eE9Py$2_fVV;90C+b<E`YZ{<N|mnL{5O85QqN+@C4%UB!D^dsoR49=FF#V
zPXg$BR?fWYQvmik^Qun*D6(D73wc+&3Qz$mKn17(6`%rCfC^9nDnJFO02QDD{HFj-
z^Y;`XWy)-IWp<^N4$$pp{8NO)DYMm;*_Bp0z|sZ4{<DKrfCLMGH~92H8o(d0-{MLa
zdLt%&-#7UDOWIK8Hva$+iz}V)jmY}_zHjh(*7L&vY(dYP3fh@KPc%{h`k@c>ys4m_
z3G_rG3E&*I&jf8P1YZPdfOFVoCTMFZ{UX!=xQ6W=L0es@%L)RxhFv;>wz^Q4l>{(H
zHqLDIc>lA$n61_Zm@FG-whG?=TmbylRyhG;$Mq{)y=pIJt1JK$q~+9BuiA^*DhEKD
zFoeczwFAA4#a0mjEp`Zv*(w-9S58}v0h|DkrqEU~LPTn-2!Mw@E|Geowu%v=8nzk(
zXaJb8z*a{9CUzenvsDB@1Hg>Awi@n<2bh-AR#O+`&KJY!nXQ`edTG+uf|A*4#)91W
zY&bo$)d0T(Ku~KzscjW&nFE2G^a&PAGS!wal{OH_Nsl}xLpjx!a-rHF8tWHe=Hs;u
zL!qg7T*UyveeMl<+kR!M;I$3+HB;-jST0netzw7Jl@nm39$Vob{#6n{tgT`~Hho73
z5M`^#y2z&QC;?(^HI@`x<phYbRYW~#Tjd6bwbd*5Ikw7suR+-A7x>AxicRUSG+}Ku
z<-u=Hb#kS@(uB3u#0S4*=XdlPO9=4FR%0dCRx!QCQUScORYbCERin{pG#ZUYqv6Xh
Xze<j7B!z|Z00000NkvXXu0mjf@4j~e

literal 0
HcmV?d00001


From b17377a91662fb0d7322f25363df2b1429559242 Mon Sep 17 00:00:00 2001
From: Julia Radzhabova <julia.radzhabova@onlyoffice.com>
Date: Mon, 10 Oct 2022 22:47:34 +0300
Subject: [PATCH 26/28] [DE] Add icon cls

---
 apps/documenteditor/main/app/view/DocProtection.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/apps/documenteditor/main/app/view/DocProtection.js b/apps/documenteditor/main/app/view/DocProtection.js
index 275d9c40f..757cd7912 100644
--- a/apps/documenteditor/main/app/view/DocProtection.js
+++ b/apps/documenteditor/main/app/view/DocProtection.js
@@ -76,7 +76,7 @@ define([
 
                 this.btnProtectDoc = new Common.UI.Button({
                     cls: 'btn-toolbar x-huge icon-top',
-                    iconCls: 'toolbar__icon protect-workbook',
+                    iconCls: 'toolbar__icon restrict-editing',
                     enableToggle: true,
                     caption: this.txtProtectDoc,
                     lock        : [_set.lostConnect, _set.coAuth, _set.previewReviewMode, _set.viewFormMode, _set.protectLock],

From 5c0b841223dc60fb07baecad5c09a6b4cd08780e Mon Sep 17 00:00:00 2001
From: Julia Radzhabova <julia.radzhabova@onlyoffice.com>
Date: Thu, 13 Oct 2022 18:56:03 +0300
Subject: [PATCH 27/28] [DE] Set max length of password for document protection

---
 apps/common/main/lib/view/OpenDialog.js                  | 1 +
 apps/documenteditor/main/app/controller/DocProtection.js | 1 +
 apps/documenteditor/main/app/view/ProtectDialog.js       | 4 ++--
 3 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/apps/common/main/lib/view/OpenDialog.js b/apps/common/main/lib/view/OpenDialog.js
index ad039555a..1e2f7fa3f 100644
--- a/apps/common/main/lib/view/OpenDialog.js
+++ b/apps/common/main/lib/view/OpenDialog.js
@@ -207,6 +207,7 @@ define([
                         type: 'password',
                         showCls: (this.options.iconType==='svg' ? 'svg-icon' : 'toolbar__icon') + ' btn-sheet-view',
                         hideCls: (this.options.iconType==='svg' ? 'svg-icon' : 'toolbar__icon') + ' hide-password',
+                        maxLength: this.options.maxPasswordLength,
                         validateOnBlur: false,
                         showPwdOnClick: true,
                         validation  : function(value) {
diff --git a/apps/documenteditor/main/app/controller/DocProtection.js b/apps/documenteditor/main/app/controller/DocProtection.js
index 1910542ab..3174987a1 100644
--- a/apps/documenteditor/main/app/controller/DocProtection.js
+++ b/apps/documenteditor/main/app/controller/DocProtection.js
@@ -147,6 +147,7 @@ define([
                         type: Common.Utils.importTextType.DRM,
                         txtOpenFile: me.view.txtWBUnlockDescription,
                         validatePwd: false,
+                        maxPasswordLength: 15,
                         handler: function (result, value) {
                             btn = result;
                             if (result == 'ok') {
diff --git a/apps/documenteditor/main/app/view/ProtectDialog.js b/apps/documenteditor/main/app/view/ProtectDialog.js
index 75376afe0..8c41dccea 100644
--- a/apps/documenteditor/main/app/view/ProtectDialog.js
+++ b/apps/documenteditor/main/app/view/ProtectDialog.js
@@ -99,7 +99,7 @@ define([
                 type: 'password',
                 allowBlank  : true,
                 style       : 'width: 100%;',
-                maxLength: 255,
+                maxLength: 15,
                 validateOnBlur: false,
                 validation  : function(value) {
                     return me.txtIncorrectPwd;
@@ -111,7 +111,7 @@ define([
                 type: 'password',
                 allowBlank  : true,
                 style       : 'width: 100%;',
-                maxLength: 255,
+                maxLength: 15,
                 validateOnBlur: false,
                 repeatInput: this.repeatPwd,
                 showPwdOnClick: true

From ef395c554af3703de76e93244e48cdd7f624e052 Mon Sep 17 00:00:00 2001
From: Julia Radzhabova <julia.radzhabova@onlyoffice.com>
Date: Thu, 13 Oct 2022 19:13:23 +0300
Subject: [PATCH 28/28] Add translation

---
 apps/documenteditor/main/locale/en.json | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

diff --git a/apps/documenteditor/main/locale/en.json b/apps/documenteditor/main/locale/en.json
index 2a9a64c41..478c5571d 100644
--- a/apps/documenteditor/main/locale/en.json
+++ b/apps/documenteditor/main/locale/en.json
@@ -1455,6 +1455,13 @@
   "DE.Views.DateTimeDialog.textLang": "Language",
   "DE.Views.DateTimeDialog.textUpdate": "Update automatically",
   "DE.Views.DateTimeDialog.txtTitle": "Date & Time",
+  "DE.Views.DocProtection.txtProtectDoc": "Protect Document",
+  "DE.Views.DocProtection.txtDocProtectedView": "Document is protected.<br>You may only view this document.",
+  "DE.Views.DocProtection.txtDocProtectedTrack": "Document is protected.<br>You may edit this document, but all changes will be tracked.",
+  "DE.Views.DocProtection.txtDocProtectedComment": "Document is protected.<br>You may only insert comments to this document.",
+  "DE.Views.DocProtection.txtDocProtectedForms": "Document is protected.<br>You may only fill in forms in this document.",
+  "DE.Views.DocProtection.hintProtectDoc": "Protect document",
+  "DE.Views.DocProtection.txtDocUnlockDescription": "Enter a password to unprotect document",
   "DE.Views.DocumentHolder.aboveText": "Above",
   "DE.Views.DocumentHolder.addCommentText": "Add Comment",
   "DE.Views.DocumentHolder.advancedDropCapText": "Drop Cap Settings",
@@ -2408,6 +2415,18 @@
   "DE.Views.ParagraphSettingsAdvanced.tipTop": "Set top border only",
   "DE.Views.ParagraphSettingsAdvanced.txtAutoText": "Auto",
   "DE.Views.ParagraphSettingsAdvanced.txtNoBorders": "No borders",
+  "DE.Views.ProtectDialog.txtPassword": "Password",
+  "DE.Views.ProtectDialog.txtRepeat": "Repeat password",
+  "DE.Views.ProtectDialog.txtOptional": "optional",
+  "DE.Views.ProtectDialog.txtIncorrectPwd": "Confirmation password is not identical",
+  "DE.Views.ProtectDialog.txtWarning": "Warning: If you lose or forget the password, it cannot be recovered. Please keep it in a safe place.",
+  "DE.Views.ProtectDialog.txtProtect": "Protect",
+  "DE.Views.ProtectDialog.txtTitle": "Protect",
+  "DE.Views.ProtectDialog.txtAllow": "Allow only this type of editing in the document",
+  "DE.Views.ProtectDialog.textView": "No changes (Read only)",
+  "DE.Views.ProtectDialog.textForms": "Filling forms",
+  "DE.Views.ProtectDialog.textReview": "Tracked changes",
+  "DE.Views.ProtectDialog.textComments": "Comments",
   "DE.Views.RightMenu.txtChartSettings": "Chart settings",
   "DE.Views.RightMenu.txtFormSettings": "Form Settings",
   "DE.Views.RightMenu.txtHeaderFooterSettings": "Header and footer settings",