From d03badcfdb160d36162989dfd8985f2ff34cabe1 Mon Sep 17 00:00:00 2001 From: Piotr Gawron <piotr.gawron@uni.lu> Date: Mon, 20 Nov 2017 11:41:40 +0100 Subject: [PATCH] onResize listener for plugins added --- frontend-js/src/main/js/minerva.js | 6 ++--- .../src/main/js/plugin/MinervaPluginProxy.js | 27 +++++++++++++------ frontend-js/src/main/js/plugin/Plugin.js | 2 ++ .../src/main/js/plugin/PluginManager.js | 27 ++++++++++++++++--- .../src/test/js/plugin/PluginManager-test.js | 17 ++++++++++++ .../src/test/js/plugin/ProxyAccessPlugin.js | 6 ++++- frontend-js/testFiles/plugin/min-width.js | 6 +++++ 7 files changed, 75 insertions(+), 16 deletions(-) diff --git a/frontend-js/src/main/js/minerva.js b/frontend-js/src/main/js/minerva.js index c7b0a272bf..71b007ad67 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 59e9adb587..7c3c39890d 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 7e96c9dcf0..140fe5a076 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 5aa89ddada..354e94906b 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 1153973304..f37e2cfeee 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 1dfe2df922..696549ef59 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 51a691c1cf..6752a72ac1 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"); -- GitLab