From a6ee6bc4af26f16e343646c2dd7671bcb4d1286d Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Mon, 20 Nov 2017 10:48:53 +0100
Subject: [PATCH] plugin can define min width required

---
 frontend-js/src/main/js/plugin/Plugin.js      | 16 +++++++++++++++-
 .../src/main/js/plugin/PluginManager.js       | 19 +++++++++++++++++--
 .../src/test/js/plugin/PluginManager-test.js  |  6 ++++++
 frontend-js/testFiles/plugin/min-width.js     | 19 +++++++++++++++++++
 4 files changed, 57 insertions(+), 3 deletions(-)
 create mode 100644 frontend-js/testFiles/plugin/min-width.js

diff --git a/frontend-js/src/main/js/plugin/Plugin.js b/frontend-js/src/main/js/plugin/Plugin.js
index b42b1fc16b..7e96c9dcf0 100644
--- a/frontend-js/src/main/js/plugin/Plugin.js
+++ b/frontend-js/src/main/js/plugin/Plugin.js
@@ -91,6 +91,20 @@ Plugin.prototype.load = function () {
 
 };
 
+Plugin.prototype.getMinWidth = function () {
+  var result = 0;
+  var data = this.getLoadedPluginData();
+  if (data.minWidth !== undefined) {
+    var value = 0;
+    if (typeof data.minWidth === "function") {
+      value = parseInt(data.minWidth());
+    } else {
+      value = parseInt(data.minWidth);
+    }
+  }
+  return value;
+};
+
 Plugin.prototype.unload = function () {
   var self = this;
   return Promise.resolve().then(function () {
@@ -98,7 +112,7 @@ Plugin.prototype.unload = function () {
   }).then(function () {
     var removedListeners = self.getMinervaPluginProxy().project.map.removeAllListeners();
     if (removedListeners.length > 0) {
-      logger.warn("'"+self.getLoadedPluginData().getName() + "' plugin didn't remove all registered listeners");
+      logger.warn("'" + self.getLoadedPluginData().getName() + "' plugin didn't remove all registered listeners");
     }
     return self.callListeners("onUnload");
   }).then(function () {
diff --git a/frontend-js/src/main/js/plugin/PluginManager.js b/frontend-js/src/main/js/plugin/PluginManager.js
index 7b677b3b3a..5aa89ddada 100644
--- a/frontend-js/src/main/js/plugin/PluginManager.js
+++ b/frontend-js/src/main/js/plugin/PluginManager.js
@@ -88,6 +88,7 @@ PluginManager.prototype.addPlugin = function (options) {
     self._pluginOnResizeHandlers[plugin.getPluginId()] = adjustHeight;
     GuiConnector.addWindowResizeEvent(adjustHeight);
     adjustHeight();
+    self.adjustMinWidth();
     return plugin;
   });
 };
@@ -98,7 +99,6 @@ PluginManager.prototype.createTabForPlugin = function () {
   var guiUtils = new GuiUtils(self.getConfiguration());
   if (tabData === undefined) {
     self.getElement().style.width = "300px";
-    self.getElement().style.minWidth = "150px";
     self.getElement().style.maxWidth = "600px";
     self.getElement().style.height = "100%";
     self._tabData = guiUtils.createTabDiv({element: self.getElement(), id: "plugin_tab"});
@@ -111,6 +111,19 @@ PluginManager.prototype.createTabForPlugin = function () {
     tabData: tabData
   });
 };
+PluginManager.prototype.adjustMinWidth = function () {
+  var self = this;
+  var minWidth = 150;
+  for (var 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";
+};
+
 PluginManager.prototype.removePlugin = function (plugin) {
   var self = this;
   var found = false;
@@ -124,7 +137,9 @@ PluginManager.prototype.removePlugin = function (plugin) {
     return Promise.reject(new Error("Plugin not registered"));
   }
   GuiConnector.removeWindowResizeEvent(self._pluginOnResizeHandlers[plugin.getPluginId()]);
-  return plugin.unload();
+  return plugin.unload().then(function () {
+    self.adjustMinWidth();
+  });
 };
 
 PluginManager.prototype.destroy = function () {
diff --git a/frontend-js/src/test/js/plugin/PluginManager-test.js b/frontend-js/src/test/js/plugin/PluginManager-test.js
index 61d8ac2df9..1153973304 100644
--- a/frontend-js/src/test/js/plugin/PluginManager-test.js
+++ b/frontend-js/src/test/js/plugin/PluginManager-test.js
@@ -38,6 +38,12 @@ describe('PluginManager', function () {
         assert.equal(1, manager.getPlugins().length);
       });
     });
+    it('with min width', function () {
+      var manager = new PluginManager(createParams());
+      return manager.addPlugin({url: "./testFiles/plugin/min-width.js"}).then(function () {
+        assert.equal("200px", $(manager.getElement()).css("min-width"));
+      });
+    });
     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/testFiles/plugin/min-width.js b/frontend-js/testFiles/plugin/min-width.js
new file mode 100644
index 0000000000..51a691c1cf
--- /dev/null
+++ b/frontend-js/testFiles/plugin/min-width.js
@@ -0,0 +1,19 @@
+minervaDefine(function () {
+  return {
+    register: function (object) {
+      console.log("registering test plugin with min width");
+    },
+    unregister: function () {
+      console.log("unregistering test plugin");
+    },
+    getName: function () {
+      return "test plugin";
+    },
+    minWidth: function () {
+      return 200;
+    },
+    getVersion: function () {
+      return "0.0.1";
+    }
+  };
+});
\ No newline at end of file
-- 
GitLab