From 299239648262b0167beb514e8c23d32628c6c4bb Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Thu, 10 Mar 2022 19:21:29 +0300 Subject: [PATCH] [DE] Edit ole objects --- .../main/lib/controller/ExternalOleEditor.js | 260 ++++++++++++++++++ .../common/main/lib/view/ExternalOleEditor.js | 164 +++++++++++ apps/documenteditor/main/app.js | 2 + .../main/app/controller/DocumentHolder.js | 21 ++ .../main/app/controller/Main.js | 1 + .../main/app/view/DocumentHolder.js | 12 + apps/documenteditor/main/app_dev.js | 2 + .../main/app/controller/Main.js | 20 ++ 8 files changed, 482 insertions(+) create mode 100644 apps/common/main/lib/controller/ExternalOleEditor.js create mode 100644 apps/common/main/lib/view/ExternalOleEditor.js diff --git a/apps/common/main/lib/controller/ExternalOleEditor.js b/apps/common/main/lib/controller/ExternalOleEditor.js new file mode 100644 index 000000000..91393ea99 --- /dev/null +++ b/apps/common/main/lib/controller/ExternalOleEditor.js @@ -0,0 +1,260 @@ +/* + * + * (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 + * +*/ +/** + * ExternalOleEditor.js + * + * Created by Julia Radzhabova on 3/10/22 + * Copyright (c) 2022 Ascensio System SIA. All rights reserved. + * + */ + +if (Common === undefined) + var Common = {}; + +Common.Controllers = Common.Controllers || {}; + +define([ + 'core', + 'common/main/lib/view/ExternalOleEditor' +], function () { 'use strict'; + Common.Controllers.ExternalOleEditor = Backbone.Controller.extend(_.extend((function() { + var appLang = '{{DEFAULT_LANG}}', + customization = undefined, + targetApp = '', + externalEditor = null, + isAppFirstOpened = true; + + + var createExternalEditor = function() { + !!customization && (customization.uiTheme = Common.localStorage.getItem("ui-theme-id", "theme-light")); + externalEditor = new DocsAPI.DocEditor('id-ole-editor-placeholder', { + width : '100%', + height : '100%', + documentType: 'cell', + document : { + url : '_chart_', + permissions : { + edit : true, + download: false + } + }, + editorConfig: { + // mode : 'editole', + mode : 'editdiagram', + targetApp : targetApp, + lang : appLang, + canCoAuthoring : false, + canBackToFolder : false, + canCreateNew : false, + customization : customization, + user : {id: ('uid-'+Date.now())} + }, + events: { + 'onAppReady' : function() {}, + 'onDocumentStateChange' : function() {}, + 'onError' : function() {}, + 'onInternalMessage' : _.bind(this.onInternalMessage, this) + } + }); + Common.Gateway.on('processmouse', _.bind(this.onProcessMouse, this)); + }; + + return { + views: ['Common.Views.ExternalOleEditor'], + + initialize: function() { + this.addListeners({ + 'Common.Views.ExternalOleEditor': { + 'setoledata': _.bind(this.setOleData, this), + 'drag': _.bind(function(o, state){ + externalEditor && externalEditor.serviceCommand('window:drag', state == 'start'); + },this), + 'show': _.bind(function(cmp){ + var h = this.oleEditorView.getHeight(), + innerHeight = Common.Utils.innerHeight() - Common.Utils.InternalSettings.get('window-inactive-area-top'); + if (innerHeight>h && h<700 || innerHeight', + '
', + '', + '
', + '' + ].join(''); + + _options.tpl = _.template(this.template)(_options); + + this.handler = _options.handler; + this._oleData = null; + this._isNewOle = true; + Common.UI.Window.prototype.initialize.call(this, _options); + }, + + render: function() { + Common.UI.Window.prototype.render.call(this); + + this.btnSave = new Common.UI.Button({ + el: $('#id-btn-ole-editor-apply'), + disabled: true + }); + this.btnCancel = new Common.UI.Button({ + el: $('#id-btn-ole-editor-cancel') + }); + + this.$window.find('.dlg-btn').on('click', _.bind(this.onDlgBtnClick, this)); + }, + + show: function() { + this.setPlaceholder(); + Common.UI.Window.prototype.show.apply(this, arguments); + }, + + setOleData: function(data) { + this._oleData = data; + if (this._isExternalDocReady) + this.fireEvent('setoledata', this); + }, + + setEditMode: function(mode) { + this._isNewOle = !mode; + }, + + isEditMode: function() { + return !this._isNewOle; + }, + + setControlsDisabled: function(disable) { + this.btnSave.setDisabled(disable); + this.btnCancel.setDisabled(disable); + (disable) ? this.$window.find('.tool.close').addClass('disabled') : this.$window.find('.tool.close').removeClass('disabled'); + }, + + onDlgBtnClick: function(event) { + if ( this.handler ) { + this.handler.call(this, event.currentTarget.attributes['result'].value); + return; + } + this.hide(); + }, + + onToolClose: function() { + if ( this.handler ) { + this.handler.call(this, 'cancel'); + return; + } + this.hide(); + }, + + setHeight: function(height) { + if (height >= 0) { + var min = parseInt(this.$window.css('min-height')); + height < min && (height = min); + this.$window.height(height); + + var header_height = (this.initConfig.header) ? parseInt(this.$window.find('> .header').css('height')) : 0; + + this.$window.find('> .body').css('height', height-header_height); + this.$window.find('> .body > .box').css('height', height-85); + + var top = (Common.Utils.innerHeight() - Common.Utils.InternalSettings.get('window-inactive-area-top') - parseInt(height)) / 2; + var left = (Common.Utils.innerWidth() - parseInt(this.initConfig.width)) / 2; + + this.$window.css('left',left); + this.$window.css('top', Common.Utils.InternalSettings.get('window-inactive-area-top') + top); + } + }, + + setPlaceholder: function(placeholder) { + this._placeholder = placeholder; + }, + + getPlaceholder: function() { + return this._placeholder; + }, + + textSave: 'Save & Exit', + textClose: 'Close', + textTitle: 'Spreadsheet Editor' + }, Common.Views.ExternalOleEditor || {})); +}); diff --git a/apps/documenteditor/main/app.js b/apps/documenteditor/main/app.js index 3e2a27386..c8fffa7c4 100644 --- a/apps/documenteditor/main/app.js +++ b/apps/documenteditor/main/app.js @@ -167,6 +167,7 @@ require([ ,'Common.Controllers.Plugins' ,'Common.Controllers.ExternalDiagramEditor' ,'Common.Controllers.ExternalMergeEditor' + ,'Common.Controllers.ExternalOleEditor' ,'Common.Controllers.ReviewChanges' ,'Common.Controllers.Protection' ] @@ -207,6 +208,7 @@ require([ ,'documenteditor/main/app/view/ChartSettings' ,'common/main/lib/controller/ExternalDiagramEditor' ,'common/main/lib/controller/ExternalMergeEditor' + ,'common/main/lib/controller/ExternalOleEditor' ,'common/main/lib/controller/ReviewChanges' ,'common/main/lib/controller/Protection' ,'common/main/lib/controller/Themes' diff --git a/apps/documenteditor/main/app/controller/DocumentHolder.js b/apps/documenteditor/main/app/controller/DocumentHolder.js index 55f341fba..012df13e6 100644 --- a/apps/documenteditor/main/app/controller/DocumentHolder.js +++ b/apps/documenteditor/main/app/controller/DocumentHolder.js @@ -163,6 +163,27 @@ define([ }, 10); }, this)); } + + var oleEditor = this.getApplication().getController('Common.Controllers.ExternalOleEditor').getView('Common.Views.ExternalOleEditor'); + if (oleEditor) { + diagramEditor.on('internalmessage', _.bind(function(cmp, message) { + var command = message.data.command; + var data = message.data.data; + if (this.api) { + if (oleEditor.isEditMode()) + this.api.asc_editTableOleObject(data); + } + }, this)); + diagramEditor.on('hide', _.bind(function(cmp, message) { + if (this.api) { + this.api.asc_enableKeyEvents(true); + } + var me = this; + setTimeout(function(){ + me.documentHolder.fireEvent('editcomplete', me.documentHolder); + }, 10); + }, this)); + } }, getView: function (name) { diff --git a/apps/documenteditor/main/app/controller/Main.js b/apps/documenteditor/main/app/controller/Main.js index 93d5356e0..cdbbbdbb6 100644 --- a/apps/documenteditor/main/app/controller/Main.js +++ b/apps/documenteditor/main/app/controller/Main.js @@ -1234,6 +1234,7 @@ define([ chatController.setApi(this.api).setMode(this.appOptions); application.getController('Common.Controllers.ExternalDiagramEditor').setApi(this.api).loadConfig({config:this.editorConfig, customization: this.editorConfig.customization}); application.getController('Common.Controllers.ExternalMergeEditor').setApi(this.api).loadConfig({config:this.editorConfig, customization: this.editorConfig.customization}); + application.getController('Common.Controllers.ExternalOleEditor').setApi(this.api).loadConfig({config:this.editorConfig, customization: this.editorConfig.customization}); pluginsController.setApi(me.api); diff --git a/apps/documenteditor/main/app/view/DocumentHolder.js b/apps/documenteditor/main/app/view/DocumentHolder.js index a654d9f8d..9092fe7fc 100644 --- a/apps/documenteditor/main/app/view/DocumentHolder.js +++ b/apps/documenteditor/main/app/view/DocumentHolder.js @@ -802,6 +802,17 @@ define([ } } }; + + var onDoubleClickOnTableOleObject = function(chart) { + if (me.mode.isEdit && !me._isDisabled) { + var oleEditor = DE.getController('Common.Controllers.ExternalOleEditor').getView('Common.Views.ExternalOleEditor'); + if (oleEditor && chart) { + oleEditor.setEditMode(true); + oleEditor.show(); + oleEditor.setOleData(Asc.asc_putBinaryDataToFrameFromTableOleObject(chart)); + } + } + }; var onCoAuthoringDisconnect= function() { me.mode.isEdit = false; @@ -1596,6 +1607,7 @@ define([ this.api.asc_registerCallback('asc_onImgWrapStyleChanged', _.bind(this.onImgWrapStyleChanged, this)); this.api.asc_registerCallback('asc_onDialogAddHyperlink', onDialogAddHyperlink); this.api.asc_registerCallback('asc_doubleClickOnChart', onDoubleClickOnChart); + this.api.asc_registerCallback('asc_doubleClickOnTableOleObject', onDoubleClickOnTableOleObject); this.api.asc_registerCallback('asc_onSpellCheckVariantsFound', _.bind(onSpellCheckVariantsFound, this)); this.api.asc_registerCallback('asc_onRulerDblClick', _.bind(this.onRulerDblClick, this)); this.api.asc_registerCallback('asc_ChangeCropState', _.bind(this.onChangeCropState, this)); diff --git a/apps/documenteditor/main/app_dev.js b/apps/documenteditor/main/app_dev.js index cb8cdd5a4..a43f32677 100644 --- a/apps/documenteditor/main/app_dev.js +++ b/apps/documenteditor/main/app_dev.js @@ -157,6 +157,7 @@ require([ ,'Common.Controllers.Plugins' ,'Common.Controllers.ExternalDiagramEditor' ,'Common.Controllers.ExternalMergeEditor' + ,'Common.Controllers.ExternalOleEditor' ,'Common.Controllers.ReviewChanges' ,'Common.Controllers.Protection' ] @@ -197,6 +198,7 @@ require([ ,'documenteditor/main/app/view/ChartSettings' ,'common/main/lib/controller/ExternalDiagramEditor' ,'common/main/lib/controller/ExternalMergeEditor' + ,'common/main/lib/controller/ExternalOleEditor' ,'common/main/lib/controller/ReviewChanges' ,'common/main/lib/controller/Protection' ,'common/main/lib/controller/Themes' diff --git a/apps/spreadsheeteditor/main/app/controller/Main.js b/apps/spreadsheeteditor/main/app/controller/Main.js index 6a093031b..a9f113ee4 100644 --- a/apps/spreadsheeteditor/main/app/controller/Main.js +++ b/apps/spreadsheeteditor/main/app/controller/Main.js @@ -2491,6 +2491,8 @@ define([ case 'clearChartData': this.clearChartData(); break; case 'setMergeData': this.setMergeData(data.data); break; case 'getMergeData': this.getMergeData(); break; + case 'setOleData': this.setOleData(data.data); break; + case 'getOleData': this.getOleData(); break; case 'setAppDisabled': if (this.isAppDisabled===undefined && !data.data) { // first editor opening Common.NotificationCenter.trigger('layout:changed', 'main'); @@ -2545,6 +2547,24 @@ define([ this.api && this.api.asc_closeCellEditor(); }, + setOleData: function(obj) { + if (typeof obj === 'object' && this.api) { + this.api.asc_addTableOleObject(obj); + this.isFrameClosed = false; + } + }, + + getOleData: function() { + if (this.api) { + var oleData = this.api.asc_getBinaryInfoOleObject(); + if (typeof oleData === 'object') { + Common.Gateway.internalMessage('oleData', { + data: oleData + }); + } + } + }, + setMergeData: function(merge) { if (typeof merge === 'object' && this.api) { this.api.asc_setData(merge);