Jakub Niedermertl has uploaded a new change for review. Change subject: webadmin: CPU Type and CPU Architecture fields in Cluster dialog fix ......................................................................
webadmin: CPU Type and CPU Architecture fields in Cluster dialog fix * CPU Architecture listbox is placed right above the CPU Type because they are related. (ClusterPopupView.ui.xml) * CPU Architecture field doesn't disappear when CPU Type is selected. (Bug fix). (ClusterPopupView.java) * CPU Architecture filters content of CPU type listbox. (ClusterModel.java, FilteredListModel.java) Bug-Url: https://bugzilla.redhat.com/1159777 Change-Id: I4c0452426f58f09703382495a9527fdbe859d80e Signed-off-by: Jakub Niedermertl <[email protected]> --- A frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/FilteredListModel.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/clusters/ClusterModel.java M frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/cluster/ClusterPopupView.java M frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/cluster/ClusterPopupView.ui.xml 4 files changed, 131 insertions(+), 17 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/16/34816/1 diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/FilteredListModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/FilteredListModel.java new file mode 100644 index 0000000..575bf47 --- /dev/null +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/FilteredListModel.java @@ -0,0 +1,71 @@ +package org.ovirt.engine.ui.uicommonweb.models; + + +import org.ovirt.engine.core.common.utils.ObjectUtils; + +import java.util.ArrayList; +import java.util.Collection; + +/** + * A {@link ListModel} that allows temporarily hide some of its items. + * @param <T> type of items + */ +public class FilteredListModel<T> extends ListModel<T> { + + /** + * Collection if all unfiltered items. + */ + private Collection<T> allItems; + + @Override + public void setItems(Collection<T> value, T selectedItem) { + super.setItems(value, selectedItem); + if (allItems != value) { + this.allItems = value; + } + } + + /** + * It filters items in this list model. Items are shown iff + * {@link org.ovirt.engine.ui.uicommonweb.models.FilteredListModel.Filter#filter(Object)} returns true. + * Input collection for filtering is the last collection passed to {@link #setItems(java.util.Collection, Object)} + * @param filter filter; {@code null} means 'show all' + */ + public void filterItems(Filter<T> filter) { + if (filter == null) { + if (ObjectUtils.objectsEqual(this.allItems, getItems())) { + return; + } else { + setItemsSelectionAware(this.allItems); + } + } + final Collection<T> itemsToShow = new ArrayList<T>(); + for (T item : this.allItems) { + if (filter.filter(item)) { + itemsToShow.add(item); + } + } + setItemsSelectionAware(itemsToShow); + } + + private void setItemsSelectionAware(Collection<T> items) { + final boolean preserveSelection = items.contains(getSelectedItem()); + final T selectedItem = preserveSelection ? getSelectedItem() : null; + super.setItems(items, selectedItem); + } + + /** + * To be replaced by Objects#equals(Object, Object) after upgrade to Java 7 + */ + private static boolean equals(Object a, Object b) { + return (a == b) || (a != null && a.equals(b)); + } + + public static interface Filter<T> { + + /** + * @return {@code true} to show item, {@code false} to hide item + */ + public boolean filter(T item); + } +} diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/clusters/ClusterModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/clusters/ClusterModel.java index e902652..662470ba 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/clusters/ClusterModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/clusters/ClusterModel.java @@ -37,6 +37,7 @@ import org.ovirt.engine.ui.uicommonweb.models.EntityModel; import org.ovirt.engine.ui.uicommonweb.models.HasValidatedTabs; import org.ovirt.engine.ui.uicommonweb.models.ListModel; +import org.ovirt.engine.ui.uicommonweb.models.FilteredListModel; import org.ovirt.engine.ui.uicommonweb.models.TabName; import org.ovirt.engine.ui.uicommonweb.models.ValidationCompleteEvent; import org.ovirt.engine.ui.uicommonweb.models.vms.SerialNumberPolicyModel; @@ -209,14 +210,14 @@ privateDataCenter = value; } - private ListModel<ServerCpu> privateCPU; + private FilteredListModel<ServerCpu> privateCPU; - public ListModel<ServerCpu> getCPU() + public FilteredListModel<ServerCpu> getCPU() { return privateCPU; } - public void setCPU(ListModel<ServerCpu> value) + public void setCPU(FilteredListModel<ServerCpu> value) { privateCPU = value; } @@ -474,6 +475,11 @@ privateVersionSupportsCpuThreads = value; } + /** + * Mutually exclusive Resilience policy radio button + * @see #privateMigrateOnErrorOption_YES + * @see #privateMigrateOnErrorOption_HA_ONLY + */ private EntityModel<Boolean> privateMigrateOnErrorOption_NO; public EntityModel<Boolean> getMigrateOnErrorOption_NO() @@ -486,6 +492,11 @@ privateMigrateOnErrorOption_NO = value; } + /** + * Mutually exclusive Resilience policy radio button + * @see #privateMigrateOnErrorOption_NO + * @see #privateMigrateOnErrorOption_HA_ONLY + */ private EntityModel<Boolean> privateMigrateOnErrorOption_YES; public EntityModel<Boolean> getMigrateOnErrorOption_YES() @@ -498,6 +509,11 @@ privateMigrateOnErrorOption_YES = value; } + /** + * Mutually exclusive Resilience policy radio button + * @see #privateMigrateOnErrorOption_YES + * @see #privateMigrateOnErrorOption_NO + */ private EntityModel<Boolean> privateMigrateOnErrorOption_HA_ONLY; public EntityModel<Boolean> getMigrateOnErrorOption_HA_ONLY() @@ -1106,18 +1122,19 @@ getDataCenter().getSelectedItemChangedEvent().addListener(this); getDataCenter().setIsAvailable(ApplicationModeHelper.getUiMode() != ApplicationMode.GlusterOnly); - setCPU(new ListModel<ServerCpu>()); + setArchitecture(new ListModel<ArchitectureType>()); + getArchitecture().setIsAvailable(ApplicationModeHelper.isModeSupported(ApplicationMode.VirtOnly)); + + setCPU(new FilteredListModel<ServerCpu>()); getCPU().setIsAvailable(ApplicationModeHelper.getUiMode() != ApplicationMode.GlusterOnly); getCPU().getSelectedItemChangedEvent().addListener(this); + setVersion(new ListModel<Version>()); getVersion().getSelectedItemChangedEvent().addListener(this); setMigrateOnErrorOption(MigrateOnErrorOptions.YES); getRngRandomSourceRequired().setEntity(false); getRngHwrngSourceRequired().setEntity(false); - - setArchitecture(new ListModel<ArchitectureType>()); - getArchitecture().setIsAvailable(ApplicationModeHelper.isModeSupported(ApplicationMode.VirtOnly)); setValidTab(TabName.GENERAL_TAB, true); setIsResiliencePolicyTabAvailable(true); @@ -1299,7 +1316,6 @@ } }; AsyncDataProvider.getInstance().getDataCenterList(_asyncQuery); - } @Override @@ -1322,6 +1338,9 @@ } else if (sender == getCPU()) { CPU_SelectedItemChanged(args); + } + else if (sender == getArchitecture()) { + architectureSelectedItemChanged(args); } } else if (ev.matchesDefinition(EntityModel.entityChangedEventDefinition)) @@ -1380,6 +1399,27 @@ } } } + } + + private void architectureSelectedItemChanged(EventArgs args) { + filterCpuTypeByArchitecture(); + } + + private void filterCpuTypeByArchitecture() { + final ArchitectureType selectedArchitecture = getArchitecture().getSelectedItem(); + final FilteredListModel.Filter<ServerCpu> filter = selectedArchitecture == null + || selectedArchitecture.equals(ArchitectureType.undefined) + ? null + : new FilteredListModel.Filter<ServerCpu>() { + + @Override + public boolean filter(ServerCpu cpu) { + final ArchitectureType cpuArchitecture = cpu.getArchitecture(); + final boolean showCpu = selectedArchitecture.equals(cpuArchitecture); + return showCpu; + } + }; + getCPU().filterItems(filter); } private void CPU_SelectedItemChanged(EventArgs args) { @@ -1544,6 +1584,9 @@ private void populateCPUList(ClusterModel clusterModel, List<ServerCpu> cpus, boolean canChangeArchitecture) { + // disable CPU Architecture-Type filtering + getArchitecture().getSelectedItemChangedEvent().removeListener(this); + ServerCpu oldSelectedCpu = clusterModel.getCPU().getSelectedItem(); clusterModel.getCPU().setItems(cpus); @@ -1574,6 +1617,14 @@ } else { getArchitecture().setSelectedItem(ArchitectureType.undefined); } + + // enable CPU Architecture-Type filtering + initCpuArchTypeFiltering(); + } + + private void initCpuArchTypeFiltering() { + filterCpuTypeByArchitecture(); + getArchitecture().getSelectedItemChangedEvent().addListener(this); } private void initSupportedArchitectures(ClusterModel clusterModel) { diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/cluster/ClusterPopupView.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/cluster/ClusterPopupView.java index cdeb91a..929df12 100644 --- a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/cluster/ClusterPopupView.java +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/cluster/ClusterPopupView.java @@ -701,14 +701,6 @@ importGlusterExplanationLabel.setVisible(object.getEnableGlusterService().getEntity() && object.getIsNew()); - object.getCPU().getSelectedItemChangedEvent().addListener(new IEventListener<EventArgs>() { - @Override - public void eventRaised(Event<? extends EventArgs> ev, Object sender, EventArgs args) { - boolean isCpuNameBlank = object.getCPU().getSelectedItem() == null; - architectureEditor.setVisible(isCpuNameBlank && ApplicationModeHelper.isModeSupported(ApplicationMode.VirtOnly)); - } - }); - object.getVersionSupportsCpuThreads().getEntityChangedEvent().addListener(new IEventListener<EventArgs>() { @Override public void eventRaised(Event<? extends EventArgs> ev, Object sender, EventArgs args) { diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/cluster/ClusterPopupView.ui.xml b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/cluster/ClusterPopupView.ui.xml index ec82c49..23ce195 100644 --- a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/cluster/ClusterPopupView.ui.xml +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/cluster/ClusterPopupView.ui.xml @@ -167,9 +167,9 @@ <ge:StringEntityModelTextBoxEditor ui:field="nameEditor" /> <ge:StringEntityModelTextBoxEditor ui:field="descriptionEditor" /> <ge:StringEntityModelTextBoxEditor ui:field="commentEditor" /> + <e:ListModelListBoxEditor ui:field="architectureEditor" /> <e:ListModelListBoxEditor ui:field="cpuEditor" /> <e:ListModelListBoxEditor ui:field="versionEditor" /> - <e:ListModelListBoxEditor ui:field="architectureEditor" /> <g:VerticalPanel ui:field="servicesCheckboxPanel"> <ge:EntityModelCheckBoxEditor ui:field="enableOvirtServiceEditor" addStyleNames="cpv_enableOvirtService_pfly_fix"/> <ge:EntityModelCheckBoxEditor ui:field="enableGlusterServiceEditor" addStyleNames="cpv_enableGlusterService_pfly_fix" /> -- To view, visit http://gerrit.ovirt.org/34816 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I4c0452426f58f09703382495a9527fdbe859d80e Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Jakub Niedermertl <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
