diff --git a/frontend-js/src/main/js/minerva.js b/frontend-js/src/main/js/minerva.js index c7b0a272bf10a691d7428350ab4dbfdc6c09aa62..71b007ad67a6e48c7b97fdd0b4538765c3c4668a 100644 --- a/frontend-js/src/main/js/minerva.js +++ b/frontend-js/src/main/js/minerva.js @@ -206,7 +206,7 @@ function modifyParamsForTouchInterface(params) { return params; } -function assignSplitBarHandler(customMap) { +function assignSplitBarHandler(customMap, pluginManager) { var splitBar = $('[name="minerva-plugin-split-bar"]'); var rightPanelDiv = $('[name="minerva-plugin-div"]'); var mouseDownHandler = function (e) { @@ -215,6 +215,7 @@ function assignSplitBarHandler(customMap) { var x = $("body").width() - e.pageX; $(rightPanelDiv).css("width", x); google.maps.event.trigger(customMap.getGoogleMap(), 'resize'); + return pluginManager.callListeners("onResize"); }; $(splitBar).mousedown(function (e) { e.preventDefault(); @@ -260,8 +261,6 @@ function create(params) { customMap = new CustomMap(params); - assignSplitBarHandler(customMap); - new DbOverlayCollection({ map: customMap @@ -279,6 +278,7 @@ function create(params) { configuration: params.getConfiguration() }); leftPanel.setPluginManager(pluginManager); + assignSplitBarHandler(customMap, pluginManager); topMenu = new TopMenu({ element: functions.getElementByName(element, "menuDiv"), diff --git a/frontend-js/src/main/js/plugin/MinervaPluginProxy.js b/frontend-js/src/main/js/plugin/MinervaPluginProxy.js index 59e9adb5876f52c70a4752bffd28d8c3646d68fc..7c3c39890d4fbc2f794b73206437b8203e94751d 100644 --- a/frontend-js/src/main/js/plugin/MinervaPluginProxy.js +++ b/frontend-js/src/main/js/plugin/MinervaPluginProxy.js @@ -236,15 +236,26 @@ function createProjectMap(options) { return map.getVisibleDataOverlays(); }, addListener: function (param) { - var dbOverlay = getOverlayByName(map, param.dbOverlayName); + var object = null; + var listenerWrapper = null; + if (param.dbOverlayName !== undefined) { + object = getOverlayByName(map, param.dbOverlayName); + listenerWrapper = function (e) { + return getFullElements(map, e.arg.identifiedElements).then(function (result) { + return param.callback(result); + }); + }; + } else if (param.object === "plugin") { + object = options.plugin; + listenerWrapper = function () { + return param.callback(); + }; + } else { + throw new Error("Invalid argument"); + } - var listenerWrapper = function (e) { - return getFullElements(map, e.arg.identifiedElements).then(function (result) { - return param.callback(result); - }); - }; - dbOverlay.addListener(param.type, listenerWrapper); - listenersData.push({listener: param.callback, wrapper: listenerWrapper, object: dbOverlay, type: param.type}); + object.addListener(param.type, listenerWrapper); + listenersData.push({listener: param.callback, wrapper: listenerWrapper, object: object, type: param.type}); }, removeListener: function (param) { var dbOverlay = getOverlayByName(map, param.dbOverlayName); diff --git a/frontend-js/src/main/js/plugin/Plugin.js b/frontend-js/src/main/js/plugin/Plugin.js index 7e96c9dcf0cc065ea30a31e72720799da983d146..140fe5a076380bf785e240961a32638ece1e2658 100644 --- a/frontend-js/src/main/js/plugin/Plugin.js +++ b/frontend-js/src/main/js/plugin/Plugin.js @@ -15,6 +15,7 @@ function Plugin(options) { var self = this; self.setOptions(options); self.registerListenerType("onUnload"); + self.registerListenerType("onResize"); } Plugin.prototype = Object.create(ObjectWithListeners.prototype); @@ -71,6 +72,7 @@ Plugin.prototype.load = function () { map: options.map, configuration: options.configuration, element: options.element, + plugin: self, pluginId: "plugin" + (pluginId++) }); self.setLoadedPluginData(pluginData); diff --git a/frontend-js/src/main/js/plugin/PluginManager.js b/frontend-js/src/main/js/plugin/PluginManager.js index 5aa89ddadaa7bf228984a48f40145712d118d06c..354e94906bb647f77e35306de26f772e63291fea 100644 --- a/frontend-js/src/main/js/plugin/PluginManager.js +++ b/frontend-js/src/main/js/plugin/PluginManager.js @@ -20,6 +20,15 @@ function PluginManager(options) { self.setConfiguration(options.configuration); self._plugins = []; self._pluginOnResizeHandlers = {}; + + self.registerListenerType("onResize"); + self.addListener("onResize", function () { + var promises = []; + for (var i = 0; i < self._plugins.length; i++) { + promises.push(self._plugins[i].callListeners("onResize")); + } + return Promise.resolve(promises); + }); } PluginManager.prototype = Object.create(ObjectWithListeners.prototype); @@ -88,7 +97,8 @@ PluginManager.prototype.addPlugin = function (options) { self._pluginOnResizeHandlers[plugin.getPluginId()] = adjustHeight; GuiConnector.addWindowResizeEvent(adjustHeight); adjustHeight(); - self.adjustMinWidth(); + return self.adjustMinWidth(); + }).then(function () { return plugin; }); }; @@ -100,6 +110,7 @@ PluginManager.prototype.createTabForPlugin = function () { if (tabData === undefined) { self.getElement().style.width = "300px"; self.getElement().style.maxWidth = "600px"; + self.getElement().style.minWidth = "150px"; self.getElement().style.height = "100%"; self._tabData = guiUtils.createTabDiv({element: self.getElement(), id: "plugin_tab"}); tabData = self._tabData; @@ -113,15 +124,23 @@ PluginManager.prototype.createTabForPlugin = function () { }; PluginManager.prototype.adjustMinWidth = function () { var self = this; + var oldVal = self.getElement().style.minWidth; var minWidth = 150; - for (var i = 0; i < self._plugins.length; i++) { + var i; + for (i = 0; i < self._plugins.length; i++) { var plugin = self._plugins[i]; var value = plugin.getMinWidth(); if (value > minWidth) { minWidth = value; } } - self.getElement().style.minWidth = minWidth + "px"; + var newVal = minWidth + "px"; + self.getElement().style.minWidth = newVal; + if (newVal !== oldVal) { + return self.callListeners("onResize"); + } else { + return Promise.resolve(); + } }; PluginManager.prototype.removePlugin = function (plugin) { @@ -138,7 +157,7 @@ PluginManager.prototype.removePlugin = function (plugin) { } GuiConnector.removeWindowResizeEvent(self._pluginOnResizeHandlers[plugin.getPluginId()]); return plugin.unload().then(function () { - self.adjustMinWidth(); + return self.adjustMinWidth(); }); }; diff --git a/frontend-js/src/test/js/plugin/PluginManager-test.js b/frontend-js/src/test/js/plugin/PluginManager-test.js index 1153973304a8846db29bdce0660204a168dea474..f37e2cfeee5c2c6e391f57eb9ca6e1ac156e8d09 100644 --- a/frontend-js/src/test/js/plugin/PluginManager-test.js +++ b/frontend-js/src/test/js/plugin/PluginManager-test.js @@ -7,6 +7,8 @@ require("../mocha-config"); var Plugin = require('../../../main/js/plugin/Plugin'); var PluginManager = require('../../../main/js/plugin/PluginManager'); +var ProxyAccessPlugin = require('./ProxyAccessPlugin'); + var logger = require('../logger'); var assert = require('assert'); @@ -44,6 +46,21 @@ describe('PluginManager', function () { assert.equal("200px", $(manager.getElement()).css("min-width")); }); }); + it('with onResize listener', function () { + var manager = new PluginManager(createParams()); + var plugin = new ProxyAccessPlugin({}); + var listenerCalled = false; + return manager.addPlugin(plugin).then(function () { + plugin.getMinervaPluginProxy().project.map.addListener({ + object: "plugin", type: "onResize", callback: function () { + listenerCalled = true; + } + }); + return manager.addPlugin({url: "./testFiles/plugin/min-width.js"}); + }).then(function () { + assert.ok(listenerCalled); + }); + }); it('after removal', function () { var manager = new PluginManager(createParams()); return manager.addPlugin({url: "./testFiles/plugin/empty.js"}).then(function (plugin) { diff --git a/frontend-js/src/test/js/plugin/ProxyAccessPlugin.js b/frontend-js/src/test/js/plugin/ProxyAccessPlugin.js index 1dfe2df922218b584fda055dd9b971c4c1ef1437..696549ef59ca79472fa1082f85f7ed6735fe1350 100644 --- a/frontend-js/src/test/js/plugin/ProxyAccessPlugin.js +++ b/frontend-js/src/test/js/plugin/ProxyAccessPlugin.js @@ -8,13 +8,17 @@ var Promise = require('bluebird'); var logger = require('../logger'); function ProxyAccessPlugin(options) { + Plugin.call(this); } ProxyAccessPlugin.prototype = Object.create(Plugin.prototype); ProxyAccessPlugin.prototype.constructor = ProxyAccessPlugin; ProxyAccessPlugin.prototype.setOptions = function (options) { - this.setMinervaPluginProxy(new MinervaPluginProxy(options)); + if (options !== undefined) { + options.plugin = this; + this.setMinervaPluginProxy(new MinervaPluginProxy(options)); + } }; ProxyAccessPlugin.prototype.load = function () { diff --git a/frontend-js/testFiles/plugin/min-width.js b/frontend-js/testFiles/plugin/min-width.js index 51a691c1cf91af2ecb5e1e1497e33f3ef033dcac..6752a72ac12e72440fa02ebfc298762965bae2ef 100644 --- a/frontend-js/testFiles/plugin/min-width.js +++ b/frontend-js/testFiles/plugin/min-width.js @@ -2,6 +2,12 @@ minervaDefine(function () { return { register: function (object) { console.log("registering test plugin with min width"); + object.project.map.addListener({ + object: "plugin", type: "onResize", callback: function () { + console.log("Resize of plugin tab called"); + } + }); + }, unregister: function () { console.log("unregistering test plugin");