Tomas Jelinek has uploaded a new change for review.

Change subject: userportal,webadmin: show advanced options on validation error
......................................................................

userportal,webadmin: show advanced options on validation error

When there was a validation error in the new/edit VM dialog while only the
basic mode was visible, it was not obvious what the problem is.

The new behavior is this:
- if there is a validation error and the invalid widget is visible in the
  current screen, do not show the advanced options
- if there is a validation error and the invalid widget is not visible, turn on
  the advanced options so the widget will be visible

To support this, the following changes had to be made:
- added the method isValid to HasValidation
- implemented this method in the needed widgets
- added the support of HasValidation also to the EntityModelWidgetWithInfo and
  DetachableWidget
- added a method getInvalidWidgets to DialogTab to find all the invalid widgets

Beside this also some small fixes has been done, namely:
- added the proper validation of the initial run tab
- fixed the validation of the system tab
- extracted and cleaned up the resetting of the tab validity

Change-Id: I1b419b560fe1e0bc0c8114d2a34f0bc930756aa0
Bug-Url: https://bugzilla.redhat.com/1085380
Signed-off-by: Tomas Jelinek <[email protected]>
---
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/view/popup/AbstractVmPopupView.java
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/AbstractValidatedWidget.java
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/EntityModelWidgetWithInfo.java
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/HasValidation.java
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/dialog/tab/DialogTab.java
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/EnumRadioEditor.java
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/WidgetWithLabelEditor.java
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/BaseEntityModelDetachableWidget.java
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/EntityModelDetachableWidget.java
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/EntityModelDetachableWidgetWithLabel.java
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/popup/AbstractVmBasedPopupPresenterWidget.java
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/AbstractVmPopupWidget.java
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/storage/AbstractSanStorageView.java
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/storage/ImportFcpStorageView.java
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/storage/ImportIscsiStorageView.java
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/storage/IscsiStorageView.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/UnitVmModel.java
17 files changed, 253 insertions(+), 35 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/66/30666/1

diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/view/popup/AbstractVmPopupView.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/view/popup/AbstractVmPopupView.java
index 144c77f..d124362 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/view/popup/AbstractVmPopupView.java
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/view/popup/AbstractVmPopupView.java
@@ -2,6 +2,7 @@
 
 import org.ovirt.engine.ui.common.CommonApplicationResources;
 import org.ovirt.engine.ui.common.widget.AbstractUiCommandButton;
+import org.ovirt.engine.ui.common.widget.HasValidation;
 import org.ovirt.engine.ui.common.widget.LeftAlignedUiCommandButton;
 import 
org.ovirt.engine.ui.common.widget.popup.AbstractVmBasedPopupPresenterWidget;
 import org.ovirt.engine.ui.common.widget.uicommon.popup.AbstractVmPopupWidget;
@@ -10,6 +11,9 @@
 
 import com.google.gwt.event.shared.EventBus;
 import com.google.inject.Inject;
+
+import java.util.Collections;
+import java.util.List;
 
 public abstract class AbstractVmPopupView extends 
AbstractModelBoundWidgetPopupView<UnitVmModel> implements 
AbstractVmBasedPopupPresenterWidget.ViewDef {
 
@@ -61,4 +65,13 @@
 
         return super.createCommandButton(label, uniqueId);
     }
+
+    @Override
+    public List<HasValidation> getInvalidWidgets() {
+        if (getContentWidget() instanceof AbstractVmPopupWidget) {
+            return ((AbstractVmPopupWidget) 
getContentWidget()).getInvalidWidgets();
+        }
+
+        return Collections.EMPTY_LIST;
+    }
 }
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/AbstractValidatedWidget.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/AbstractValidatedWidget.java
index ac97944..83e62e7 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/AbstractValidatedWidget.java
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/AbstractValidatedWidget.java
@@ -13,6 +13,8 @@
  */
 public abstract class AbstractValidatedWidget extends Composite implements 
HasValidation {
 
+    private boolean valid = true;
+
     @Override
     protected void initWidget(Widget widget) {
         super.initWidget(widget);
@@ -22,6 +24,7 @@
 
     @Override
     public void markAsValid() {
+        valid = true;
         applyCommonValidationStyles();
         getValidatedWidgetStyle().setBorderColor("gray"); //$NON-NLS-1$
         getValidatedWidget().setTitle(null);
@@ -29,6 +32,7 @@
 
     @Override
     public void markAsInvalid(List<String> validationHints) {
+        valid = false;
         applyCommonValidationStyles();
         getValidatedWidgetStyle().setBorderColor("red"); //$NON-NLS-1$
         getValidatedWidget().setTitle(getValidationTitle(validationHints));
@@ -49,4 +53,8 @@
 
     protected abstract Widget getValidatedWidget();
 
+    @Override
+    public boolean isValid() {
+        return valid;
+    }
 }
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/EntityModelWidgetWithInfo.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/EntityModelWidgetWithInfo.java
index cca2744..78350d4 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/EntityModelWidgetWithInfo.java
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/EntityModelWidgetWithInfo.java
@@ -13,7 +13,9 @@
 import com.google.gwt.user.client.ui.Widget;
 import com.google.inject.Inject;
 
-public class EntityModelWidgetWithInfo<T> extends Composite {
+import java.util.List;
+
+public class EntityModelWidgetWithInfo<T> extends Composite implements 
HasValidation {
 
     interface WidgetUiBinder extends UiBinder<Widget, 
EntityModelWidgetWithInfo> {
         WidgetUiBinder uiBinder = GWT.create(WidgetUiBinder.class);
@@ -43,4 +45,26 @@
         infoIcon.setText(text);
     }
 
+    @Override
+    public void markAsValid() {
+        if (contentWidget instanceof HasValidation) {
+            ((HasValidation) contentWidget).markAsValid();
+        }
+    }
+
+    @Override
+    public void markAsInvalid(List<String> validationHints) {
+        if (contentWidget instanceof HasValidation) {
+            ((HasValidation) contentWidget).markAsInvalid(validationHints);
+        }
+    }
+
+    @Override
+    public boolean isValid() {
+        if (contentWidget instanceof HasValidation) {
+            return ((HasValidation) contentWidget).isValid();
+        }
+
+        return true;
+    }
 }
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/HasValidation.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/HasValidation.java
index 25c72ad..2b5624a 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/HasValidation.java
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/HasValidation.java
@@ -20,4 +20,8 @@
      */
     void markAsInvalid(List<String> validationHints);
 
+    /**
+     * Returns true/false according to the markAsValid/markAsInvalid
+     */
+    boolean isValid();
 }
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/dialog/tab/DialogTab.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/dialog/tab/DialogTab.java
index d3e0106..b1e472a 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/dialog/tab/DialogTab.java
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/dialog/tab/DialogTab.java
@@ -21,6 +21,10 @@
 import com.google.gwt.user.client.ui.IndexedPanel;
 import com.google.gwt.user.client.ui.InlineLabel;
 import com.google.gwt.user.client.ui.Widget;
+import org.ovirt.engine.ui.common.widget.HasValidation;
+
+import java.util.ArrayList;
+import java.util.List;
 
 public class DialogTab extends AbstractValidatedWidget implements 
HasClickHandlers, HasLabel, HasElementId, HasKeyUpHandlers, 
FocusableComponentsContainer {
 
@@ -131,6 +135,23 @@
         }
     }
 
+    public List<HasValidation> getInvalidWidgets() {
+        return getInvalidWidgets(getContent());
+    }
+
+    private List<HasValidation> getInvalidWidgets(Widget content) {
+        List<HasValidation> hasValidations = new ArrayList<HasValidation>();
+        if (content instanceof IndexedPanel) {
+            for (int i = 0; i < ((IndexedPanel) content).getWidgetCount(); 
i++) {
+                hasValidations.addAll(getInvalidWidgets(((IndexedPanel) 
content).getWidget(i)));
+            }
+        } else if (content instanceof HasValidation && !((HasValidation) 
content).isValid()) {
+            hasValidations.add((HasValidation) content);
+        }
+
+        return hasValidations;
+    }
+
     @Override
     public int setTabIndexes(int nextTabIndex) {
         tabContainer.setTabIndex(nextTabIndex++);
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/EnumRadioEditor.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/EnumRadioEditor.java
index fa368fe..3938b30 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/EnumRadioEditor.java
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/EnumRadioEditor.java
@@ -352,4 +352,9 @@
     public void markAsInvalid(List<String> validationHints) {
         // not implemented
     }
+
+    @Override
+    public boolean isValid() {
+        return true;
+    }
 }
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/WidgetWithLabelEditor.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/WidgetWithLabelEditor.java
index fcc7756..acb64f5 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/WidgetWithLabelEditor.java
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/WidgetWithLabelEditor.java
@@ -65,6 +65,11 @@
     }
 
     @Override
+    public boolean isValid() {
+        return widgetWithLabel.isValid();
+    }
+
+    @Override
     public void setEnabled(boolean enabled) {
         widgetWithLabel.setEnabled(enabled);
     }
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/BaseEntityModelDetachableWidget.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/BaseEntityModelDetachableWidget.java
index 1e7acd3..50f074a 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/BaseEntityModelDetachableWidget.java
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/BaseEntityModelDetachableWidget.java
@@ -66,6 +66,4 @@
         attachedSeparatedImage.setResource(attached ? resource.joinedIcon() : 
resource.separatedIcon());
         attachedSeparatedImage.setTitle(attached ? 
constants.attachedToInstanceType() : constants.detachedFromInstanceType());
     }
-
-
 }
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/EntityModelDetachableWidget.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/EntityModelDetachableWidget.java
index 89c3d4d..6d0b988 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/EntityModelDetachableWidget.java
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/EntityModelDetachableWidget.java
@@ -12,12 +12,16 @@
 import com.google.gwt.user.client.ui.Widget;
 import org.ovirt.engine.ui.common.widget.AbstractValidatedWidgetWithLabel;
 import org.ovirt.engine.ui.common.widget.Align;
+import org.ovirt.engine.ui.common.widget.HasValidation;
+
+import java.util.List;
+
 import static com.google.gwt.dom.client.Style.Unit;
 
 /**
  * Takes a AbstractValidatedWidgetWithLabel, decorates it with the detachable 
icon but does not render it's label
  */
-public class EntityModelDetachableWidget extends 
BaseEntityModelDetachableWidget implements HasEnabled {
+public class EntityModelDetachableWidget extends 
BaseEntityModelDetachableWidget implements HasEnabled, HasValidation {
 
     interface WidgetUiBinder extends UiBinder<Widget, 
EntityModelDetachableWidget> {
         WidgetUiBinder uiBinder = GWT.create(WidgetUiBinder.class);
@@ -77,4 +81,19 @@
     public void addContentWrapperStypeName(String styleName) {
         contentWrapper.addStyleName(styleName);
     }
+
+    @Override
+    public void markAsValid() {
+        decorated.markAsValid();
+    }
+
+    @Override
+    public void markAsInvalid(List<String> validationHints) {
+        decorated.markAsInvalid(validationHints);
+    }
+
+    @Override
+    public boolean isValid() {
+        return decorated.isValid();
+    }
 }
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/EntityModelDetachableWidgetWithLabel.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/EntityModelDetachableWidgetWithLabel.java
index f9cc0d4..e2cc2d1 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/EntityModelDetachableWidgetWithLabel.java
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/generic/EntityModelDetachableWidgetWithLabel.java
@@ -11,11 +11,14 @@
 import com.google.gwt.user.client.ui.Widget;
 import org.ovirt.engine.ui.common.widget.AbstractValidatedWidgetWithLabel;
 import org.ovirt.engine.ui.common.widget.HasLabel;
+import org.ovirt.engine.ui.common.widget.HasValidation;
+
+import java.util.List;
 
 /**
  * Takes an AbstractValidatedWidgetWithLabel and decorates it with a 
detachable icon
  */
-public class EntityModelDetachableWidgetWithLabel extends 
BaseEntityModelDetachableWidget implements HasLabel, HasEnabled {
+public class EntityModelDetachableWidgetWithLabel extends 
BaseEntityModelDetachableWidget implements HasLabel, HasEnabled, HasValidation {
 
     interface WidgetUiBinder extends UiBinder<Widget, 
EntityModelDetachableWidgetWithLabel> {
         WidgetUiBinder uiBinder = GWT.create(WidgetUiBinder.class);
@@ -83,4 +86,19 @@
     public void addContentWrapperStypeName(String styleName) {
         contentWrapper.addStyleName(styleName);
     }
+
+    @Override
+    public void markAsValid() {
+        decorated.markAsValid();
+    }
+
+    @Override
+    public void markAsInvalid(List<String> validationHints) {
+        decorated.markAsInvalid(validationHints);
+    }
+
+    @Override
+    public boolean isValid() {
+        return decorated.isValid();
+    }
 }
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/popup/AbstractVmBasedPopupPresenterWidget.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/popup/AbstractVmBasedPopupPresenterWidget.java
index 5dd2b9e..a1627fd 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/popup/AbstractVmBasedPopupPresenterWidget.java
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/popup/AbstractVmBasedPopupPresenterWidget.java
@@ -1,13 +1,18 @@
 package org.ovirt.engine.ui.common.widget.popup;
 
+import com.google.gwt.event.logical.shared.HasAttachHandlers;
 import com.google.gwt.event.shared.EventBus;
+import com.google.gwt.user.client.ui.HasVisibility;
 import com.google.inject.Inject;
 import 
org.ovirt.engine.ui.common.presenter.AbstractModelBoundPopupPresenterWidget;
 import org.ovirt.engine.ui.common.system.ClientStorage;
+import org.ovirt.engine.ui.common.widget.HasValidation;
 import org.ovirt.engine.ui.uicommonweb.models.vms.UnitVmModel;
 import org.ovirt.engine.ui.uicompat.Event;
 import org.ovirt.engine.ui.uicompat.EventArgs;
 import org.ovirt.engine.ui.uicompat.IEventListener;
+
+import java.util.List;
 
 public class AbstractVmBasedPopupPresenterWidget<V extends 
AbstractVmBasedPopupPresenterWidget.ViewDef> extends 
AbstractModelBoundPopupPresenterWidget<UnitVmModel, V>  {
 
@@ -19,6 +24,8 @@
         void setSpiceProxyOverrideExplanation(String explanation);
 
         void switchAttachToInstanceType(boolean isAttached);
+
+        List<HasValidation> getInvalidWidgets();
     }
 
     private ClientStorage clientStorage;
@@ -67,6 +74,35 @@
                 swithAttachToInstanceType(model);
             }
         });
+
+        model.getValid().getPropertyChangedEvent().addListener(new 
IEventListener() {
+            @Override
+            public void eventRaised(Event ev, Object sender, EventArgs args) {
+                switchToAdvancedIfNeeded(model);
+            }
+
+        });
+    }
+
+    private void switchToAdvancedIfNeeded(final UnitVmModel model) {
+        if (model.getAdvancedMode().getEntity() || 
model.getValid().getEntity()) {
+            return;
+        }
+
+        List<HasValidation> invalidWidgets = getView().getInvalidWidgets();
+
+        if (invalidWidgets.size() == 0) {
+            return;
+        }
+
+        for (HasValidation invalidWidget : invalidWidgets) {
+            boolean isVisible = invalidWidget instanceof HasVisibility && 
((HasVisibility) invalidWidget).isVisible();
+            boolean isAttached = invalidWidget instanceof HasAttachHandlers && 
((HasAttachHandlers) invalidWidget).isAttached();
+            if (!isVisible || !isAttached) {
+                model.getAdvancedMode().setEntity(true);
+                break;
+            }
+        }
     }
 
     private void swithAttachToInstanceType(final UnitVmModel model) {
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/AbstractVmPopupWidget.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/AbstractVmPopupWidget.java
index 9704a00..2eb8efe 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/AbstractVmPopupWidget.java
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/AbstractVmPopupWidget.java
@@ -37,6 +37,7 @@
 import org.ovirt.engine.ui.common.widget.EntityModelDetachableWidgetWithInfo;
 import org.ovirt.engine.ui.common.widget.EntityModelWidgetWithInfo;
 import org.ovirt.engine.ui.common.widget.HasDetachable;
+import org.ovirt.engine.ui.common.widget.HasValidation;
 import org.ovirt.engine.ui.common.widget.dialog.AdvancedParametersExpander;
 import org.ovirt.engine.ui.common.widget.dialog.InfoIcon;
 import org.ovirt.engine.ui.common.widget.dialog.tab.DialogTab;
@@ -1584,6 +1585,12 @@
                     } else {
                         systemTab.markAsInvalid(null);
                     }
+                } else if ("IsFirstRunTabValid".equals(propName)) { 
//$NON-NLS-1$
+                    if (vm.getIsFirstRunTabValid()) {
+                        initialRunTab.markAsValid();
+                    } else {
+                        initialRunTab.markAsInvalid(null);
+                    }
                 } else if ("IsDisplayTabValid".equals(propName)) { 
//$NON-NLS-1$
                     if (vm.getIsDisplayTabValid()) {
                         consoleTab.markAsValid();
@@ -2008,17 +2015,10 @@
     }
 
     protected void disableAllTabs() {
-        generalTab.disableContent();
-        poolTab.disableContent();
-        initialRunTab.disableContent();
-        consoleTab.disableContent();
-        hostTab.disableContent();
-        highAvailabilityTab.disableContent();
-        resourceAllocationTab.disableContent();
-        bootOptionsTab.disableContent();
-        customPropertiesTab.disableContent();
-        systemTab.disableContent();
-        rngDeviceTab.disableContent();
+        for (DialogTab dialogTab : allDialogTabs()) {
+            dialogTab.disableContent();
+        }
+
         oSTypeEditor.setEnabled(false);
         quotaEditor.setEnabled(false);
         dataCenterWithClusterEditor.setEnabled(false);
@@ -2026,6 +2026,22 @@
         baseTemplateEditor.setEnabled(false);
         vmTypeEditor.setEnabled(false);
         instanceTypesEditor.setEnabled(false);
+    }
+
+    private List<DialogTab> allDialogTabs() {
+        return Arrays.asList(
+            generalTab,
+            poolTab,
+            initialRunTab,
+            consoleTab,
+            hostTab,
+            highAvailabilityTab,
+            resourceAllocationTab,
+            bootOptionsTab,
+            customPropertiesTab,
+            systemTab,
+            rngDeviceTab
+        );
     }
 
     protected void updateOrAddToWidgetConfiguration(PopupWidgetConfigMap 
configuration, List<Widget> widgets, WidgetConfigurationUpdater updater) {
@@ -2084,4 +2100,13 @@
             adminOnlyField.setVisible(false);
         }
     }
+
+    public List<HasValidation> getInvalidWidgets() {
+        List<HasValidation> hasValidations = new ArrayList<HasValidation>();
+        for (DialogTab dialogTab : allDialogTabs()) {
+            hasValidations.addAll(dialogTab.getInvalidWidgets());
+        }
+
+        return hasValidations;
+    }
 }
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/storage/AbstractSanStorageView.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/storage/AbstractSanStorageView.java
index 03a2ff2..f3b774f 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/storage/AbstractSanStorageView.java
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/storage/AbstractSanStorageView.java
@@ -93,6 +93,11 @@
     }
 
     @Override
+    public boolean isValid() {
+        return contentPanel.isValid();
+    }
+
+    @Override
     public SanStorageModelBase flush() {
         return driver.flush();
     }
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/storage/ImportFcpStorageView.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/storage/ImportFcpStorageView.java
index efd19fd..5ca203c 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/storage/ImportFcpStorageView.java
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/storage/ImportFcpStorageView.java
@@ -115,6 +115,11 @@
     }
 
     @Override
+    public boolean isValid() {
+        return storageDomainsPanel.isValid();
+    }
+
+    @Override
     public ImportFcpStorageModel flush() {
         return driver.flush();
     }
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/storage/ImportIscsiStorageView.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/storage/ImportIscsiStorageView.java
index b765006..e8037a2 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/storage/ImportIscsiStorageView.java
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/storage/ImportIscsiStorageView.java
@@ -239,6 +239,11 @@
     }
 
     @Override
+    public boolean isValid() {
+        return storageDomainsPanel.isValid();
+    }
+
+    @Override
     public boolean isSubViewFocused() {
         return iscsiDiscoverTargetsView.isDiscoverPanelFocused();
     }
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/storage/IscsiStorageView.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/storage/IscsiStorageView.java
index ac027e9..fbebc17 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/storage/IscsiStorageView.java
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/storage/IscsiStorageView.java
@@ -213,6 +213,11 @@
     }
 
     @Override
+    public boolean isValid() {
+        return lunsListPanel.isValid() && targetsToLunsPanel.isValid();
+    }
+
+    @Override
     public boolean isSubViewFocused() {
         return iscsiTargetToLunView.isDiscoverPanelFocused();
     }
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/UnitVmModel.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/UnitVmModel.java
index b352c30..2a1ac3f 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/UnitVmModel.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/UnitVmModel.java
@@ -76,6 +76,16 @@
 
     private boolean privateIsNew;
 
+    private EntityModel<Boolean> valid;
+
+    public EntityModel<Boolean> getValid() {
+        return valid;
+    }
+
+    public void setValid(EntityModel<Boolean> valid) {
+        this.valid = valid;
+    }
+
     /**
      * All dialogs which want to have the previous advanced/basic mode 
remembered in local storage need to have
      * a key to local storage set.
@@ -1425,6 +1435,7 @@
 
         setNicsWithLogicalNetworks(new VnicInstancesModel());
         setAdvancedMode(new EntityModel<Boolean>(false));
+        setValid(new EntityModel<Boolean>(true));
         setAttachedToInstanceType(new EntityModel<Boolean>(true));
         setStorageDomain(new 
NotChangableForVmInPoolListModel<StorageDomain>());
         setName(new NotChangableForVmInPoolEntityModel<String>());
@@ -1590,16 +1601,9 @@
 
         setIsTemplatePublic(new NotChangableForVmInPoolEntityModel<Boolean>());
         getIsTemplatePublic().getEntityChangedEvent().addListener(this);
-
-        setIsHostTabValid(true);
         setIsCustomPropertiesTabAvailable(true);
-        setRngTabValid(true);
-        setIsCustomPropertiesTabValid(getIsHostTabValid());
-        setIsBootSequenceTabValid(getIsCustomPropertiesTabValid());
-        setIsAllocationTabValid(getIsBootSequenceTabValid());
-        setIsDisplayTabValid(getIsAllocationTabValid());
-        setIsFirstRunTabValid(getIsDisplayTabValid());
-        setIsGeneralTabValid(getIsFirstRunTabValid());
+
+        resetTabsValidity();
 
         // NOTE: This is because currently the auto generated view code tries 
to register events of
         // pooltype for
@@ -2594,7 +2598,6 @@
         getInstanceTypes().validateSelectedItem(new IValidation[] { new 
NotEmptyValidation() });
 
         getDataCenterWithClustersList().validateSelectedItem(new IValidation[] 
{ new NotEmptyValidation() });
-        setIsSystemTabValid(true);
 
         getOSType().validateSelectedItem(new NotEmptyValidation[] { new 
NotEmptyValidation() });
 
@@ -2675,8 +2678,9 @@
         setIsAllocationTabValid(getIsAllocationTabValid() && 
getCpuSharesAmount().getIsValid());
         setIsBootSequenceTabValid(getCdImage().getIsValid() && 
getKernel_path().getIsValid());
         boolean vmInitIsValid = getVmInitModel().validate();
+        setIsFirstRunTabValid(vmInitIsValid);
 
-        return hwPartValid && vmInitIsValid && 
getDataCenterWithClustersList().getIsValid()
+        boolean isValid = hwPartValid && vmInitIsValid && 
getDataCenterWithClustersList().getIsValid()
                 && getDisksAllocationModel().getIsValid() && 
getTemplate().getIsValid() && getComment().getIsValid()
                 && getDefaultHost().getIsValid()
                 && getTimeZone().getIsValid() && getOSType().getIsValid() && 
getCdImage().getIsValid()
@@ -2685,9 +2689,14 @@
                 && getKernel_parameters().getIsValid()
                 && getCpuSharesAmount().getIsValid()
                 && getQuota().getIsValid();
+
+        getValid().setEntity(isValid);
+        return isValid;
     }
 
     public boolean validateHwPart() {
+        resetTabsValidity();
+
         getName().validateEntity(new IValidation[] {new NotEmptyValidation()});
         getMigrationDowntime().validateEntity(new IValidation[] { new 
NotNullIntegerValidation(0, Integer.MAX_VALUE) });
 
@@ -2716,12 +2725,6 @@
             getSerialNumberPolicy().getCustomSerialNumber().setIsValid(true);
         }
 
-        setIsBootSequenceTabValid(true);
-        setIsAllocationTabValid(getIsBootSequenceTabValid());
-        setIsDisplayTabValid(getIsAllocationTabValid());
-        setIsFirstRunTabValid(getIsDisplayTabValid());
-        setIsGeneralTabValid(getIsFirstRunTabValid());
-
         boolean behaviorValid = behavior.validate();
         setIsGeneralTabValid(getName().getIsValid() && 
getDescription().getIsValid() && getComment().getIsValid()
         && getMinAllocatedMemory().getIsValid());
@@ -2746,12 +2749,31 @@
             validateMemorySize(getMinAllocatedMemory(), 
getMemSize().getEntity(), 1);
         }
 
-        return behaviorValid && customPropertySheetValid && 
getName().getIsValid() && getDescription().getIsValid()
+
+
+        boolean isValid = behaviorValid && customPropertySheetValid && 
getName().getIsValid() && getDescription().getIsValid()
                 && getMinAllocatedMemory().getIsValid()
                 && getNumOfMonitors().getIsValid() && 
getUsbPolicy().getIsValid()
                 && getMigrationDowntime().getIsValid()
                 && getRngBytes().getIsValid()
-                && getRngPeriod().getIsValid();
+                && getRngPeriod().getIsValid()
+                && getTotalCPUCores().getIsValid();
+
+        getValid().setEntity(isValid);
+        return isValid;
+    }
+
+    private void resetTabsValidity() {
+        setIsGeneralTabValid(true);
+        setIsSystemTabValid(true);
+        setIsFirstRunTabValid(true);
+        setIsDisplayTabValid(true);
+        setIsHostTabValid(true);
+        setIsAllocationTabValid(true);
+        setIsBootSequenceTabValid(true);
+        setRngTabValid(true);
+        setIsCustomPropertiesTabValid(true);
+        getValid().setEntity(true);
     }
 
     private class RngDevValidation implements IValidation {


-- 
To view, visit http://gerrit.ovirt.org/30666
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I1b419b560fe1e0bc0c8114d2a34f0bc930756aa0
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: ovirt-engine-3.5
Gerrit-Owner: Tomas Jelinek <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to