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
