diff --git a/apps/common/main/lib/controller/Plugins.js b/apps/common/main/lib/controller/Plugins.js index f8e5309e61..49fe5d5746 100644 --- a/apps/common/main/lib/controller/Plugins.js +++ b/apps/common/main/lib/controller/Plugins.js @@ -99,6 +99,7 @@ define([ this._moveOffset = {x:0, y:0}; this.autostart = []; + this.customPluginsDlg = []; Common.Gateway.on('init', this.loadConfig.bind(this)); Common.NotificationCenter.on('app:face', this.onAppShowed.bind(this)); @@ -174,6 +175,12 @@ define([ this.api.asc_registerCallback('asc_onPluginShowButton', _.bind(this.onPluginShowButton, this)); this.api.asc_registerCallback('asc_onPluginHideButton', _.bind(this.onPluginHideButton, this)); + this.api.asc_registerCallback("asc_onPluginWindowShow", _.bind(this.onPluginWindowShow, this)); + this.api.asc_registerCallback("asc_onPluginWindowClose", _.bind(this.onPluginWindowClose, this)); + this.api.asc_registerCallback("asc_onPluginWindowResize", _.bind(this.onPluginWindowResize, this)); + this.api.asc_registerCallback("asc_onPluginWindowMouseUp", _.bind(this.onPluginWindowMouseUp, this)); + this.api.asc_registerCallback("asc_onPluginWindowMouseMove", _.bind(this.onPluginWindowMouseMove, this)); + this.loadPlugins(); } return this; @@ -373,8 +380,8 @@ define([ if (urlAddition) url += urlAddition; if (variation.get_InsideMode()) { - if (!this.panelPlugins.openInsideMode(plugin.get_Name(lang), url, frameId)) - this.api.asc_pluginButtonClick(-1); + if (!this.panelPlugins.openInsideMode(plugin.get_Name(lang), url, frameId, plugin.get_Guid())) + this.api.asc_pluginButtonClick(-1, plugin.get_Guid()); } else { var me = this, isCustomWindow = variation.get_CustomWindow(), @@ -401,14 +408,18 @@ define([ url: url, frameId : frameId, buttons: isCustomWindow ? undefined : newBtns, - toolcallback: _.bind(this.onToolClose, this), + toolcallback: function(event) { + me.api.asc_pluginButtonClick(-1, plugin.get_Guid()); + }, help: !!help, loader: plugin.get_Loader(), modal: isModal!==undefined ? isModal : true }); me.pluginDlg.on({ 'render:after': function(obj){ - obj.getChild('.footer .dlg-btn').on('click', _.bind(me.onDlgBtnClick, me)); + obj.getChild('.footer .dlg-btn').on('click', function(event) { + me.api.asc_pluginButtonClick(parseInt(event.currentTarget.attributes['result'].value), plugin.get_Guid()); + }); me.pluginContainer = me.pluginDlg.$window.find('#id-plugin-container'); }, 'close': function(obj){ @@ -424,7 +435,7 @@ define([ help && window.open(help, '_blank'); }, 'header:click': function(type){ - me.api.asc_pluginButtonClick(type); + me.api.asc_pluginButtonClick(type, plugin.get_Guid()); } }); @@ -452,14 +463,9 @@ define([ callback.call(); } }, - - onDlgBtnClick: function(event) { - var state = event.currentTarget.attributes['result'].value; - this.api.asc_pluginButtonClick(parseInt(state)); - }, onToolClose: function() { - this.api.asc_pluginButtonClick(-1); + this.api.asc_pluginButtonClick(-1, this.panelPlugins ? this.panelPlugins._state.insidePlugin : undefined); }, onPluginMouseUp: function(x, y) { @@ -757,6 +763,112 @@ define([ Common.Utils.lockControls(Common.enumLock.docLockForms, props.isFormsOnly, {array: this.panelPlugins.lockedControls}); Common.Utils.lockControls(Common.enumLock.docLockComments, props.isCommentsOnly, {array: this.panelPlugins.lockedControls}); } + }, + + // Plugin can create windows + onPluginWindowShow: function(frameId, variation) { + if (variation.isVisual) { + if (this.customPluginsDlg[frameId]) return; + + var lang = this.appOptions && this.appOptions.lang ? this.appOptions.lang.split(/[\-_]/)[0] : 'en'; + var url = variation.url; // full url + var visible = (this.appOptions.isEdit || variation.isViewer && (variation.isDisplayedInViewer!==false)) && _.contains(variation.EditorsSupport, this.editor) && !variation.isSystem; + if (visible && !variation.isInsideMode) { + var me = this, + isCustomWindow = variation.isCustomWindow, + arrBtns = variation.buttons, + newBtns = [], + size = variation.size, + isModal = variation.isModal; + if (!size || size.length<2) size = [800, 600]; + + var description = variation.description; + if (typeof variation.descriptionLocale == 'object') + description = variation.descriptionLocale[lang] || variation.descriptionLocale['en'] || description || ''; + + _.isArray(arrBtns) && _.each(arrBtns, function(b, index){ + if (typeof b.textLocale == 'object') + b.text = b.textLocale[lang] || b.textLocale['en'] || b.text || ''; + if (me.appOptions.isEdit || b.isViewer !== false) + newBtns[index] = {caption: b.text, value: index, primary: b.primary, frameId: frameId}; + }); + + var help = variation.help; + me.customPluginsDlg[frameId] = new Common.Views.PluginDlg({ + cls: isCustomWindow ? 'plain' : '', + header: !isCustomWindow, + title: description, + width: size[0], // inner width + height: size[1], // inner height + url: url, + frameId : frameId, + buttons: isCustomWindow ? undefined : newBtns, + toolcallback: function(event) { + me.api.asc_pluginButtonClick(-1, variation.guid, frameId); + }, + help: !!help, + modal: isModal!==undefined ? isModal : true + }); + me.customPluginsDlg[frameId].on({ + 'render:after': function(obj){ + obj.getChild('.footer .dlg-btn').on('click', function(event) { + me.api.asc_pluginButtonClick(parseInt(event.currentTarget.attributes['result'].value), variation.guid, frameId); + }); + me.customPluginsDlg[frameId].options.pluginContainer = me.customPluginsDlg[frameId].$window.find('#id-plugin-container'); + }, + 'close': function(obj){ + me.customPluginsDlg[frameId] = undefined; + }, + 'drag': function(args){ + me.api.asc_pluginEnableMouseEvents(args[1]=='start', frameId); + }, + 'resize': function(args){ + me.api.asc_pluginEnableMouseEvents(args[1]=='start', frameId); + }, + 'help': function(){ + help && window.open(help, '_blank'); + }, + 'header:click': function(type){ + me.api.asc_pluginButtonClick(type, variation.guid, frameId); + } + }); + + me.customPluginsDlg[frameId].show(); + } + } + }, + + onPluginWindowClose: function(frameId) { + if (this.customPluginsDlg[frameId]) + this.customPluginsDlg[frameId].close(); + }, + + onPluginWindowResize: function(frameId, size, minSize, maxSize, callback ) { + if (this.customPluginsDlg[frameId]) { + var resizable = (minSize && minSize.length>1 && maxSize && maxSize.length>1 && (maxSize[0] > minSize[0] || maxSize[1] > minSize[1] || maxSize[0]==0 || maxSize[1] == 0)); + this.customPluginsDlg[frameId].setResizable(resizable, minSize, maxSize); + this.customPluginsDlg[frameId].setInnerSize(size[0], size[1]); + if (callback) + callback.call(); + } + }, + + onPluginWindowMouseUp: function(frameId, x, y) { + if (this.customPluginsDlg[frameId]) { + if (this.customPluginsDlg[frameId].binding.dragStop) this.customPluginsDlg[frameId].binding.dragStop(); + if (this.customPluginsDlg[frameId].binding.resizeStop) this.customPluginsDlg[frameId].binding.resizeStop(); + } else + Common.NotificationCenter.trigger('frame:mouseup', { pageX: x*Common.Utils.zoom()+this._moveOffset.x, pageY: y*Common.Utils.zoom()+this._moveOffset.y }); + }, + + onPluginWindowMouseMove: function(frameId, x, y) { + if (this.customPluginsDlg[frameId]) { + var offset = this.customPluginsDlg[frameId].options.pluginContainer.offset(); + if (this.customPluginsDlg[frameId].binding.drag) this.customPluginsDlg[frameId].binding.drag({ pageX: x*Common.Utils.zoom()+offset.left, pageY: y*Common.Utils.zoom()+offset.top }); + if (this.customPluginsDlg[frameId].binding.resize) this.customPluginsDlg[frameId].binding.resize({ pageX: x*Common.Utils.zoom()+offset.left, pageY: y*Common.Utils.zoom()+offset.top }); + } else + Common.NotificationCenter.trigger('frame:mousemove', { pageX: x*Common.Utils.zoom()+this._moveOffset.x, pageY: y*Common.Utils.zoom()+this._moveOffset.y }); } + }, Common.Controllers.Plugins || {})); }); diff --git a/apps/common/main/lib/view/Plugins.js b/apps/common/main/lib/view/Plugins.js index b7d15b69b5..dc4f904d61 100644 --- a/apps/common/main/lib/view/Plugins.js +++ b/apps/common/main/lib/view/Plugins.js @@ -221,7 +221,7 @@ define([ } }, - openInsideMode: function(name, url, frameId) { + openInsideMode: function(name, url, frameId, guid) { if (!this.pluginsPanel) return false; this.pluginsPanel.toggleClass('hidden', true); @@ -248,7 +248,7 @@ define([ this.iframePlugin.src = url; } - + this._state.insidePlugin = guid; this.fireEvent('plugin:open', [this, 'onboard', 'open']); return true; }, @@ -262,7 +262,7 @@ define([ } this.currentPluginPanel.toggleClass('hidden', true); // this.pluginsPanel.toggleClass('hidden', false); - + this._state.insidePlugin = undefined; this.fireEvent('plugin:open', [this, 'onboard', 'close']); }, diff --git a/apps/documenteditor/forms/app/controller/Plugins.js b/apps/documenteditor/forms/app/controller/Plugins.js index 4d82989f4b..00a79e547f 100644 --- a/apps/documenteditor/forms/app/controller/Plugins.js +++ b/apps/documenteditor/forms/app/controller/Plugins.js @@ -173,14 +173,18 @@ define([ url: url, frameId : frameId, buttons: isCustomWindow ? undefined : newBtns, - toolcallback: _.bind(this.onToolClose, this), + toolcallback: function(event) { + me.api.asc_pluginButtonClick(-1, plugin.get_Guid()); + }, help: !!help, loader: plugin.get_Loader(), modal: isModal!==undefined ? isModal : true }); me.pluginDlg.on({ 'render:after': function(obj){ - obj.getChild('.footer .dlg-btn').on('click', _.bind(me.onDlgBtnClick, me)); + obj.getChild('.footer .dlg-btn').on('click', function(event) { + me.api.asc_pluginButtonClick(parseInt(event.currentTarget.attributes['result'].value), plugin.get_Guid()); + }); me.pluginContainer = me.pluginDlg.$window.find('#id-plugin-container'); }, 'close': function(obj){ @@ -217,15 +221,6 @@ define([ } }, - onDlgBtnClick: function(event) { - var state = event.currentTarget.attributes['result'].value; - this.api.asc_pluginButtonClick(parseInt(state)); - }, - - onToolClose: function() { - this.api.asc_pluginButtonClick(-1); - }, - onPluginMouseUp: function(x, y) { if (this.pluginDlg) { if (this.pluginDlg.binding.dragStop) this.pluginDlg.binding.dragStop();