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

Reply via email to