Tomas Jelinek has uploaded a new change for review.

Change subject: webadmin: VM dialog generalization
......................................................................

webadmin: VM dialog generalization

Change-Id: Idccaea42a21ad5da7620cc0fcac1aebb59114df5
Signed-off-by: Tomas Jelinek <[email protected]>
---
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/popup/AbstractVmPopupWidget.ui.xml
A 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/vm/VmPopupWidgetConfig.java
A 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/vm/VmPopupWidgetConfigMap.java
4 files changed, 256 insertions(+), 24 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/34/12434/1

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 6c89a0f..14d03cd 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
@@ -2,6 +2,7 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Set;
 import java.util.Map.Entry;
 
 import org.ovirt.engine.core.common.businessentities.Disk;
@@ -38,6 +39,9 @@
 import org.ovirt.engine.ui.common.widget.renderer.MemorySizeRenderer;
 import org.ovirt.engine.ui.common.widget.renderer.NullSafeRenderer;
 import org.ovirt.engine.ui.common.widget.table.column.TextColumnWithTooltip;
+import org.ovirt.engine.ui.common.widget.uicommon.popup.vm.VmPopup;
+import org.ovirt.engine.ui.common.widget.uicommon.popup.vm.VmPopupWidgetConfig;
+import 
org.ovirt.engine.ui.common.widget.uicommon.popup.vm.VmPopupWidgetConfigMap;
 import org.ovirt.engine.ui.common.widget.uicommon.storage.DisksAllocationView;
 import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider;
 import org.ovirt.engine.ui.uicommonweb.models.EntityModel;
@@ -70,8 +74,9 @@
 import com.google.gwt.user.client.ui.Panel;
 import com.google.gwt.user.client.ui.RadioButton;
 import com.google.gwt.user.client.ui.ValueLabel;
+import com.google.gwt.user.client.ui.Widget;
 
-public abstract class AbstractVmPopupWidget extends 
AbstractModelBoundPopupWidget<UnitVmModel> {
+public abstract class AbstractVmPopupWidget extends 
AbstractModelBoundPopupWidget<UnitVmModel> implements VmPopup {
 
     interface Driver extends SimpleBeanEditorDriver<UnitVmModel, 
AbstractVmPopupWidget> {
         Driver driver = GWT.create(Driver.class);
@@ -93,6 +98,8 @@
         String assignedVmsLabel();
 
         String labelDisabled();
+
+        String speciaField();
     }
 
     @UiField
@@ -454,13 +461,17 @@
 
     @UiField
     @Ignore
-    AdvancedParametersExpander generalAdvancedParameterExpander;
+    protected AdvancedParametersExpander generalAdvancedParameterExpander;
 
     @UiField
     @Ignore
     Panel generalAdvancedParameterExpanderContent;
 
+    private VmPopupWidgetConfigMap widgetConfiguration;
+
     private final CommonApplicationTemplates applicationTemplates;
+
+    private UnitVmModel model;
 
     @SuppressWarnings({ "unchecked", "rawtypes" })
     public AbstractVmPopupWidget(CommonApplicationConstants constants,
@@ -508,6 +519,8 @@
 
         localize(constants);
 
+        widgetConfiguration = createWidgetConfiguration();
+
         generateIds();
 
         hidePoolSpecificFields();
@@ -520,6 +533,38 @@
         }, ""); //$NON-NLS-1$
 
         Driver.driver.initialize(this);
+    }
+
+    protected VmPopupWidgetConfigMap createWidgetConfiguration() {
+        // TODO make it abstract
+        return new VmPopupWidgetConfigMap();
+    }
+
+    private void hideAlwaysHiddenFields() {
+        for (Widget hiddenWidget : 
widgetConfiguration.getAlwaysHidden().keySet()) {
+            hiddenWidget.setVisible(false);
+        }
+    }
+
+    private void markSpecialFields() {
+        for (Widget hiddenWidget : 
widgetConfiguration.getMarkedAsSpecial().keySet()) {
+            hiddenWidget.addStyleName(style.speciaField());
+        }
+    }
+
+    @Override
+    public void switchMode(boolean advanced) {
+        Set<Widget> advancedWidgets = 
widgetConfiguration.getVisibleOnlyInAdvanceMode().keySet();
+        for (Widget advanvedWidget : advancedWidgets) {
+            advanvedWidget.setVisible(advanced);
+        }
+
+        DialogTab activeTab = ((DialogTabPanel) getWidget()).getActiveTab();
+
+        // select the first tab if the selected tab has been hidden
+        if (!advanced && advancedWidgets.contains(activeTab)) {
+            ((DialogTabPanel) getWidget()).switchTab(generalTab);
+        }
     }
 
     protected void initPoolSpecificWidgets(CommonApplicationResources 
resources,
@@ -763,14 +808,17 @@
     }
 
     @Override
-    public void edit(UnitVmModel object) {
+    public void edit(UnitVmModel model) {
+        this.model = model;
         priorityEditor.setRowData(new ArrayList<EntityModel>());
-        priorityEditor.edit(object.getPriority());
-        Driver.driver.edit(object);
-        initTabAvailabilityListeners(object);
-        initListeners(object);
-        initCustomPropertySheet(object);
+        priorityEditor.edit(model.getPriority());
+        Driver.driver.edit(model);
+        initTabAvailabilityListeners(model);
+        initListeners(model);
+        initCustomPropertySheet(model);
 
+        hideAlwaysHiddenFields();
+        markSpecialFields();
         // numOfVmsLabel.setVisible(false);
     }
 
@@ -785,7 +833,7 @@
     }
 
     protected void setupHostTabAvailability(UnitVmModel model) {
-        hostTab.setVisible(model.getIsHostAvailable());
+        changeApplicationLevelVisibility(hostTab, model.getIsHostAvailable());
     }
 
     protected void setupCustomPropertiesAvailability(UnitVmModel model) {
@@ -841,12 +889,12 @@
                 provisioningCloneEditor.setEnabled(isProvisioningChangable);
 
                 boolean isProvisioningAvailable = 
object.getProvisioning().getIsAvailable();
-                provisionSelectionPanel.setVisible(isProvisioningAvailable);
+                changeApplicationLevelVisibility(provisionSelectionPanel, 
isProvisioningAvailable);
 
                 boolean isDisksAvailable = object.getIsDisksAvailable();
-                disksAllocationPanel.setVisible(isDisksAvailable);
+                changeApplicationLevelVisibility(disksAllocationPanel, 
isDisksAvailable);
 
-                storageAllocationPanel.setVisible(isProvisioningAvailable || 
isDisksAvailable);
+                changeApplicationLevelVisibility(storageAllocationPanel, 
isProvisioningAvailable || isDisksAvailable);
             }
         });
 
@@ -871,7 +919,7 @@
      */
     protected void updateUsbNativeMessageVisibility(final UnitVmModel object) {
         VDSGroup vdsGroup = (VDSGroup) object.getCluster().getSelectedItem();
-        
nativeUsbWarningMessage.setVisible(object.getUsbPolicy().getSelectedItem() == 
UsbPolicy.ENABLED_NATIVE
+        changeApplicationLevelVisibility(nativeUsbWarningMessage, 
object.getUsbPolicy().getSelectedItem() == UsbPolicy.ENABLED_NATIVE
                 && vdsGroup != null
                 && vdsGroup.getcompatibility_version() != null
                 && !(Boolean) 
AsyncDataProvider.GetConfigValuePreConverted(ConfigurationValues.MigrationSupportForNativeUsb,
@@ -913,7 +961,7 @@
                         resourceAllocationTab.markAsInvalid(null);
                     }
                 } else if ("IsHighlyAvailable".equals(propName)) { 
//$NON-NLS-1$
-                    highAvailabilityTab.setVisible((Boolean) 
vm.getIsHighlyAvailable().getEntity());
+                    changeApplicationLevelVisibility(highAvailabilityTab, 
(Boolean) vm.getIsHighlyAvailable().getEntity());
                 } else if ("IsBootSequenceTabValid".equals(propName)) { 
//$NON-NLS-1$
                     if ((Boolean) vm.getIsHighlyAvailable().getEntity()) {
                         bootOptionsTab.markAsValid();
@@ -929,10 +977,10 @@
                 }
                 else if ("IsDisksAvailable".equals(propName)) { //$NON-NLS-1$
                     boolean isDisksAvailable = vm.getIsDisksAvailable();
-                    disksAllocationPanel.setVisible(isDisksAvailable);
+                    changeApplicationLevelVisibility(disksAllocationPanel, 
isDisksAvailable);
 
                     boolean isProvisioningAvailable = 
vm.getProvisioning().getIsAvailable();
-                    storageAllocationPanel.setVisible(isProvisioningAvailable 
|| isDisksAvailable);
+                    changeApplicationLevelVisibility(storageAllocationPanel, 
isProvisioningAvailable || isDisksAvailable);
 
                     if (isDisksAvailable) {
                         // Update warning message by disks status
@@ -948,7 +996,7 @@
         });
 
         // High Availability only avail in server mode
-        highAvailabilityTab.setVisible(vm.getVmType().equals(VmType.Server));
+        changeApplicationLevelVisibility(highAvailabilityTab, 
vm.getVmType().equals(VmType.Server));
 
         // TODO: Move to a more appropriate method
         vm.getPropertyChangedEvent().addListener(new IEventListener() {
@@ -956,14 +1004,14 @@
             public void eventRaised(Event ev, Object sender, EventArgs args) {
                 String propName = ((PropertyChangedEventArgs) 
args).PropertyName;
                 if ("IsLinux_Unassign_UnknownOS".equals(propName)) { 
//$NON-NLS-1$
-                    
linuxBootOptionsPanel.setVisible(vm.getIsLinux_Unassign_UnknownOS());
+                    changeApplicationLevelVisibility(linuxBootOptionsPanel, 
vm.getIsLinux_Unassign_UnknownOS());
                 }
             }
         });
 
         // only avail for desktop mode
-        isStatelessEditor.setVisible(vm.getVmType().equals(VmType.Desktop));
-        numOfMonitorsEditor.setVisible(vm.getVmType().equals(VmType.Desktop));
+        changeApplicationLevelVisibility(isStatelessEditor, 
vm.getVmType().equals(VmType.Desktop));
+        changeApplicationLevelVisibility(numOfMonitorsEditor, 
vm.getVmType().equals(VmType.Desktop));
 
         defaultHostEditor.setEnabled(false);
         specificHost.addValueChangeHandler(new ValueChangeHandler<Boolean>() {
@@ -991,12 +1039,12 @@
             }
         });
 
-        cpuPinningLabel.setVisible(vm.getCpuPinning().getIsAvailable());
+        changeApplicationLevelVisibility(cpuPinningLabel, 
vm.getCpuPinning().getIsAvailable());
         vm.getCpuPinning().getPropertyChangedEvent().addListener(new 
IEventListener() {
 
             @Override
             public void eventRaised(Event ev, Object sender, EventArgs args) {
-                
cpuPinningLabel.setVisible(vm.getCpuPinning().getIsAvailable());
+                changeApplicationLevelVisibility(cpuPinningLabel, 
vm.getCpuPinning().getIsAvailable());
             }
         });
 
@@ -1132,8 +1180,27 @@
 
         // ==Custom Properties Tab==
         nextTabIndex = customPropertiesTab.setTabIndexes(nextTabIndex);
-//        customPropertiesSheetEditor.setTabIndex(nextTabIndex++);
+        // customPropertiesSheetEditor.setTabIndex(nextTabIndex++);
 
         return nextTabIndex;
     }
+
+    private void changeApplicationLevelVisibility(Widget widget, boolean 
visible) {
+
+        // it is not configured explicitly - change to the desired visibility 
and terminate
+        if (!widgetConfiguration.containsKey(widget)) {
+            widget.setVisible(false);
+            return;
+        }
+
+        // it is always hidden, ignore any app change
+        VmPopupWidgetConfig vmPopupWidgetConfig = 
widgetConfiguration.get(widget);
+        if (vmPopupWidgetConfig.isAlwaysHidden()) {
+            return;
+        }
+
+        vmPopupWidgetConfig.setApplicationLevelVisible(visible);
+        boolean advancedMode = (Boolean) model.getAdvancedMode().getEntity();
+        
widget.setVisible(vmPopupWidgetConfig.isCurrentlyVisible(advancedMode));
+    }
 }
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/AbstractVmPopupWidget.ui.xml
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/AbstractVmPopupWidget.ui.xml
index 6aef823..6050b08 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/AbstractVmPopupWidget.ui.xml
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/AbstractVmPopupWidget.ui.xml
@@ -200,6 +200,10 @@
                float: left;
         }
         
+        .speciaField {
+               background-color: red;
+        }
+        
        </ui:style>
 
        <t:DialogTabPanel width="100%" height="100%">
@@ -251,7 +255,7 @@
                                                                        
<g:Label text="{constants.vms}" addStyleNames="{style.increaseVmsInPoolVms}" />
                                                                </g:FlowPanel>
                             </g:FlowPanel>
-                            <e:ListModelListBoxEditor 
ui:field="templateEditor"/>
+                            <e:ListModelListBoxEditor 
ui:field="templateEditor" />
                         </g:FlowPanel>
                         <g:FlowPanel addStyleNames="{style.sectionPanel}">
                             <e:EntityModelTextBoxEditor 
ui:field="memSizeEditor"/>
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/vm/VmPopupWidgetConfig.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/vm/VmPopupWidgetConfig.java
new file mode 100644
index 0000000..a914fcf
--- /dev/null
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/vm/VmPopupWidgetConfig.java
@@ -0,0 +1,90 @@
+package org.ovirt.engine.ui.common.widget.uicommon.popup.vm;
+
+public final class VmPopupWidgetConfig {
+
+    private final boolean visibleOnlyInAdvanced;
+
+    private final boolean alwaysHidden;
+
+    private final boolean markedAsSpecial;
+
+    private final boolean adminOnly;
+
+    /**
+     * The only mutable part - the field can be visible/hidden according to 
some changing condition in the app
+     */
+    private boolean applicationLevelVisible = true;
+
+    private VmPopupWidgetConfig(boolean visibleOnlyInAdvanced,
+            boolean alwaysHidden,
+            boolean markedAsSpecial,
+            boolean adminOnly) {
+        super();
+        this.visibleOnlyInAdvanced = visibleOnlyInAdvanced;
+        this.alwaysHidden = alwaysHidden;
+        this.markedAsSpecial = markedAsSpecial;
+        this.adminOnly = adminOnly;
+    }
+
+    public static VmPopupWidgetConfig simpleField() {
+        return new VmPopupWidgetConfig(false, false, false, false);
+    }
+
+    public static VmPopupWidgetConfig hiddenField() {
+        return new VmPopupWidgetConfig(false, true, false, false);
+    }
+
+    public VmPopupWidgetConfig withSpecialMark() {
+        return new VmPopupWidgetConfig(visibleOnlyInAdvanced, alwaysHidden, 
true, adminOnly);
+    }
+
+    public VmPopupWidgetConfig visibleInAdvancedModeOnly() {
+        return new VmPopupWidgetConfig(true, alwaysHidden, markedAsSpecial, 
adminOnly);
+    }
+
+    public VmPopupWidgetConfig visibleForAdminOnly() {
+        return new VmPopupWidgetConfig(visibleOnlyInAdvanced, alwaysHidden, 
markedAsSpecial, true);
+    }
+
+    public boolean isVisibleOnlyInAdvanced() {
+        return visibleOnlyInAdvanced;
+    }
+
+    public boolean isAlwaysHidden() {
+        return alwaysHidden;
+    }
+
+    public boolean isMarkedAsSpecial() {
+        return markedAsSpecial;
+    }
+
+    public boolean isAdminOnly() {
+        return adminOnly;
+    }
+
+    public boolean isApplicationLevelVisible() {
+        return applicationLevelVisible;
+    }
+
+    public void setApplicationLevelVisible(boolean applicationLevelVisible) {
+        this.applicationLevelVisible = applicationLevelVisible;
+    }
+
+    public boolean isCurrentlyVisible(boolean advancedMode) {
+        if (isAlwaysHidden()) {
+            return false;
+        }
+
+        if (!isApplicationLevelVisible()) {
+            return false;
+        }
+
+        if (!advancedMode && isVisibleOnlyInAdvanced()) {
+            return false;
+        }
+
+        // I'm in advanced mode, so I can see everything (ignoring the 
adminOnly flag for now)
+        return true;
+    }
+
+}
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/vm/VmPopupWidgetConfigMap.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/vm/VmPopupWidgetConfigMap.java
new file mode 100644
index 0000000..2b3e087
--- /dev/null
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/vm/VmPopupWidgetConfigMap.java
@@ -0,0 +1,71 @@
+package org.ovirt.engine.ui.common.widget.uicommon.popup.vm;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import com.google.gwt.user.client.ui.Widget;
+
+public class VmPopupWidgetConfigMap extends HashMap<Widget, 
VmPopupWidgetConfig> {
+
+    private static final long serialVersionUID = 7118052938701174692L;
+
+    public VmPopupWidgetConfigMap getVisibleForAdminOnly() {
+        return filter(new Predicate() {
+            @Override
+            public boolean apply(VmPopupWidgetConfig config) {
+                return config.isAdminOnly();
+            }
+        });
+    }
+
+    public VmPopupWidgetConfigMap getVisibleOnlyInAdvanceMode() {
+        return filter(new Predicate() {
+            @Override
+            public boolean apply(VmPopupWidgetConfig config) {
+                return config.isVisibleOnlyInAdvanced() && 
config.isApplicationLevelVisible();
+            }
+        });
+    }
+
+    public VmPopupWidgetConfigMap getAlwaysHidden() {
+        return filter(new Predicate() {
+            @Override
+            public boolean apply(VmPopupWidgetConfig config) {
+                return config.isAlwaysHidden();
+            }
+        });
+    }
+
+    public VmPopupWidgetConfigMap getMarkedAsSpecial() {
+        return filter(new Predicate() {
+            @Override
+            public boolean apply(VmPopupWidgetConfig config) {
+                return config.isMarkedAsSpecial();
+            }
+        });
+    }
+
+    public VmPopupWidgetConfigMap getVisibleInBasic() {
+        return filter(new Predicate() {
+            @Override
+            public boolean apply(VmPopupWidgetConfig config) {
+                return !config.isVisibleOnlyInAdvanced() && 
config.isApplicationLevelVisible();
+            }
+        });
+    }
+
+    private VmPopupWidgetConfigMap filter(Predicate predicate) {
+        VmPopupWidgetConfigMap res = new VmPopupWidgetConfigMap();
+
+        for (Map.Entry<Widget, VmPopupWidgetConfig> entry : this.entrySet()) {
+            if (predicate.apply(entry.getValue())) {
+                res.put(entry.getKey(), entry.getValue());
+            }
+        }
+        return res;
+    }
+
+    private interface Predicate {
+        boolean apply(VmPopupWidgetConfig config);
+    }
+}


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

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

Reply via email to