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