WIP: Fix recomputeEnabled() for EllipsisMenu

Change-Id: I5ea6b49e8e98e93b1eff5e4921db1153681c1537
diff --git a/org.eclipse.scout.rt.ui.html.test/src/test/js/scout/form/FormSpec.js b/org.eclipse.scout.rt.ui.html.test/src/test/js/scout/form/FormSpec.js
index 82ed7dd..c42a2d2 100644
--- a/org.eclipse.scout.rt.ui.html.test/src/test/js/scout/form/FormSpec.js
+++ b/org.eclipse.scout.rt.ui.html.test/src/test/js/scout/form/FormSpec.js
@@ -524,4 +524,70 @@
     });
   });
 
+  describe('disabled form', function() {
+    it('can be closed although it is disabled', function(done) {
+      var form = scout.create('Form', {
+        parent: session.desktop,
+        rootGroupBox: {
+          id: 'mainbox',
+          objectType: 'GroupBox',
+          gridDataHints: {
+            widthInPixel: 1000
+          },
+          menus: [{
+            id: 'okmenu',
+            objectType: 'OkMenu'
+          }, {
+            id: 'cancelmenu',
+            objectType: 'CancelMenu'
+          }, {
+            id: 'closemenu',
+            objectType: 'CloseMenu'
+          }, {
+            id: 'resetmenu',
+            objectType: 'ResetMenu'
+          }, {
+            id: 'savemenu',
+            objectType: 'SaveMenu'
+          }],
+          fields: [{
+            id: 'stringfield1',
+            objectType: 'StringField'
+          }, {
+            id: 'stringfield2',
+            objectType: 'StringField',
+            inheritAccessibility: false
+          }]
+        }
+      });
+      form.setEnabled(false);
+      form.open()
+        .then(function() {
+          // enabled
+          expect(form.enabled).toBe(false);
+          expect(form.widget('mainbox').enabled).toBe(true);
+          expect(form.widget('stringfield1').enabled).toBe(true);
+          expect(form.widget('stringfield2').enabled).toBe(true);
+          expect(form.widget('okmenu').enabled).toBe(true);
+          expect(form.widget('cancelmenu').enabled).toBe(true);
+          expect(form.widget('closemenu').enabled).toBe(true);
+          expect(form.widget('resetmenu').enabled).toBe(true);
+          expect(form.widget('savemenu').enabled).toBe(true);
+          // enabledComputed
+          expect(form.enabledComputed).toBe(false);
+          expect(form.widget('mainbox').enabledComputed).toBe(false);
+          expect(form.widget('stringfield1').enabledComputed).toBe(false);
+          expect(form.widget('stringfield2').enabledComputed).toBe(true);
+          expect(form.widget('okmenu').enabledComputed).toBe(false);
+          expect(form.widget('cancelmenu').enabledComputed).toBe(true);
+          expect(form.widget('closemenu').enabledComputed).toBe(true);
+          expect(form.widget('resetmenu').enabledComputed).toBe(false);
+          expect(form.widget('savemenu').enabledComputed).toBe(false);
+          form.close();
+        })
+        .catch(fail)
+        .always(done);
+    });
+  });
+
 });
diff --git a/org.eclipse.scout.rt.ui.html/src/main/js/scout/menu/ButtonAdapterMenu.js b/org.eclipse.scout.rt.ui.html/src/main/js/scout/menu/ButtonAdapterMenu.js
index 7da716b..476a1b1 100644
--- a/org.eclipse.scout.rt.ui.html/src/main/js/scout/menu/ButtonAdapterMenu.js
+++ b/org.eclipse.scout.rt.ui.html/src/main/js/scout/menu/ButtonAdapterMenu.js
@@ -74,7 +74,12 @@
  * @override Widget.js
  */
 scout.ButtonAdapterMenu.prototype._computeEnabled = function(inheritAccessibility, parentEnabled) {
-  return this.button._computeEnabled(inheritAccessibility, parentEnabled);
+  // Use buttons "parentEnabled" value (because the adapter menu might be in an enabled popup, while the button's real parent is disabled)
+  var buttonParentEnabled = true;
+  if (this.button.parent && this.button.parent.initialized && this.button.parent.enabledComputed !== undefined) {
+    buttonParentEnabled = this.button.parent.enabledComputed;
+  }
+  return this.button._computeEnabled(inheritAccessibility, buttonParentEnabled);
 };
 
 /**
diff --git a/org.eclipse.scout.rt.ui.html/src/main/js/scout/menu/EllipsisMenu.js b/org.eclipse.scout.rt.ui.html/src/main/js/scout/menu/EllipsisMenu.js
index ecdb035..7c115cd 100644
--- a/org.eclipse.scout.rt.ui.html/src/main/js/scout/menu/EllipsisMenu.js
+++ b/org.eclipse.scout.rt.ui.html/src/main/js/scout/menu/EllipsisMenu.js
@@ -54,3 +54,9 @@
 scout.EllipsisMenu.prototype.isTabTarget = function() {
   return scout.Menu.prototype.isTabTarget.call(this) && !this.hidden;
 };
+
+scout.EllipsisMenu.prototype._computeEnabledForChildren = function(enabledComputed, parentEnabled) {
+  // Ellipsis menu should always pass the "parentEnabled" value to its children
+  // (because it should be enabled even when everything else is disabled).
+  return parentEnabled;
+};
diff --git a/org.eclipse.scout.rt.ui.html/src/main/js/scout/widget/Widget.js b/org.eclipse.scout.rt.ui.html/src/main/js/scout/widget/Widget.js
index 418ba09..ba67f44 100644
--- a/org.eclipse.scout.rt.ui.html/src/main/js/scout/widget/Widget.js
+++ b/org.eclipse.scout.rt.ui.html/src/main/js/scout/widget/Widget.js
@@ -525,7 +525,7 @@
   this.parent = parent;
   this.parent._addChild(this);
   if (this.initialized) {
-    this.recomputeEnabled(this.parent.enabledComputed);
+    this.parent.recomputeEnabled();
   }
   this.parent.one('destroy', this._parentDestroyHandler);
 };
@@ -653,15 +653,23 @@
     this._renderEnabled(); // refresh
   }
 
-  this.children.forEach(function(child) {
-    child.recomputeEnabled(enabledComputed);
-  });
+  // Propagate to children
+  if (this.children.length) {
+    var enabledComputedForChildren = this._computeEnabledForChildren(enabledComputed, parentEnabled);
+    this.children.forEach(function(child) {
+      child.recomputeEnabled(enabledComputedForChildren);
+    });
+  }
 };
 
 scout.Widget.prototype._computeEnabled = function(inheritAccessibility, parentEnabled) {
   return this.enabled && (inheritAccessibility ? parentEnabled : true);
 };
 
+scout.Widget.prototype._computeEnabledForChildren = function(enabledComputed, parentEnabled) {
+  return enabledComputed;
+};
+
 scout.Widget.prototype._renderEnabled = function() {
   if (!this.$container) {
     return;