Vojtech Szocs has uploaded a new change for review.

Change subject: webadmin: User Event Notification dialog element IDs
......................................................................

webadmin: User Event Notification dialog element IDs

1. UI infrastructure changes

   - created ElementIdCellTree that supports assigning DOM
     element IDs to tree nodes through HasElementId interface

   - EntityModelCellTree derives from ElementIdCellTree,
     so all model-bound trees now support node element IDs

   - ModelListTreeViewModel does the actual element ID
     assignment for the CheckboxCell

   - example tree node ID, e.g. 2nd child of 3rd root node:
     <prefix>_root2_node1

2. WebAdmin dialog changes

   - User Event Notification dialog (ManageEventsPopupView)
     now supports element IDs for Tree and Expand/Collapse
     buttons

Change-Id: Icf18b0080fffe6ba3886736a605f53570889bf3a
Bug-Url: https://bugzilla.redhat.com/870993
Signed-off-by: Vojtech Szocs <[email protected]>
---
R 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/uicommon/model/TreeNodeModel.java
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/utils/ElementIdUtils.java
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/table/column/ColumnWithElementId.java
A 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/tree/ElementIdCellTree.java
A 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/tree/TreeModelWithElementId.java
M frontend/webadmin/modules/pom.xml
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/AssignTagsPopupView.java
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/configure/RolePopupView.java
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/user/ManageEventsPopupView.java
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/uicommon/model/ModelListTreeViewModel.java
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/uicommon/model/SimpleSelectionTreeNodeModel.java
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/editor/EntityModelCellTree.java
12 files changed, 221 insertions(+), 89 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/48/14048/1

diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/uicommon/model/TreeNodeModel.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/uicommon/model/TreeNodeModel.java
similarity index 70%
rename from 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/uicommon/model/TreeNodeModel.java
rename to 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/uicommon/model/TreeNodeModel.java
index 5d2e732..d91166a 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/uicommon/model/TreeNodeModel.java
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/uicommon/model/TreeNodeModel.java
@@ -1,4 +1,4 @@
-package org.ovirt.engine.ui.webadmin.uicommon.model;
+package org.ovirt.engine.ui.common.uicommon.model;
 
 import java.util.List;
 
@@ -16,33 +16,36 @@
 
     /**
      * Get the Node direct children
-     *
      */
     List<M> getChildren();
 
     /**
+     * Returns the parent node, or {@code null} in case of root node.
+     */
+    M getParent();
+
+    /**
+     * Returns the index of this node relative to the parent node, or 0 in 
case of root node.
+     */
+    int getIndex();
+
+    /**
      * The Node name
-     *
      */
     String getName();
 
     /**
      * Get the Node selection state
-     *
      */
     boolean getSelected();
 
     /**
      * Is the Node editable
-     *
      */
     boolean isEditable();
 
     /**
      * Set the Node Selection state
-     *
-     * @return
-     *
      */
     void setSelected(boolean value);
 
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/utils/ElementIdUtils.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/utils/ElementIdUtils.java
index dbc3320..6c2e3bc 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/utils/ElementIdUtils.java
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/utils/ElementIdUtils.java
@@ -1,6 +1,10 @@
 package org.ovirt.engine.ui.common.utils;
 
-import com.google.gwt.cell.client.Cell;
+import java.util.List;
+
+import org.ovirt.engine.ui.common.uicommon.model.TreeNodeModel;
+
+import com.google.gwt.cell.client.Cell.Context;
 
 public class ElementIdUtils {
 
@@ -18,7 +22,7 @@
     }
 
     /**
-     * Returns DOM element ID for a table cell, using cell context object.
+     * Returns DOM element ID for a table cell element.
      *
      * @param prefix
      *            Element ID prefix that meets ID constraints (unique, 
deterministic).
@@ -28,7 +32,7 @@
      * @param context
      *            Table cell context object.
      */
-    public static String createTableCellElementId(String prefix, String 
columnId, Cell.Context context) {
+    public static String createTableCellElementId(String prefix, String 
columnId, Context context) {
         StringBuilder sb = new StringBuilder(prefix);
         sb.append("_"); //$NON-NLS-1$
         sb.append(columnId != null ? columnId : "col" + 
String.valueOf(context.getColumn())); //$NON-NLS-1$
@@ -37,4 +41,42 @@
         return sb.toString();
     }
 
+    /**
+     * Returns DOM element ID for a tree cell element.
+     *
+     * @param prefix
+     *            Element ID prefix that meets ID constraints (unique, 
deterministic).
+     * @param node
+     *            Tree node model object.
+     * @param rootNodes
+     *            Root node(s) for the given tree.
+     */
+    public static <M extends TreeNodeModel<?, M>> String 
createTreeCellElementId(String prefix,
+            M node, List<M> rootNodes) {
+        String treeNodeId = getTreeNodeId(node, true);
+        String treeNodeIdPrefix = prefix + "_root" + getRootNodeIndex(node, 
rootNodes); //$NON-NLS-1$
+        return treeNodeId.isEmpty() ? treeNodeIdPrefix : treeNodeIdPrefix + 
"_" + treeNodeId; //$NON-NLS-1$
+    }
+
+    private static <M extends TreeNodeModel<?, M>> String getTreeNodeId(M 
node, boolean skipRootNode) {
+        boolean isRootNode = node.getParent() == null;
+        String id = (skipRootNode && isRootNode) ? "" : "node" + 
node.getIndex(); //$NON-NLS-1$ //$NON-NLS-2$
+        if (!isRootNode) {
+            id = getTreeNodeId(node.getParent(), skipRootNode) + "_" + id; 
//$NON-NLS-1$
+        }
+        return id.startsWith("_") ? id.substring(1) : id; //$NON-NLS-1$
+    }
+
+    private static <M extends TreeNodeModel<?, M>> int getRootNodeIndex(M 
node, List<M> rootNodes) {
+        for (M root : rootNodes) {
+            if (node == root) {
+                return rootNodes.indexOf(root);
+            }
+        }
+        if (node.getParent() != null) {
+            return getRootNodeIndex(node.getParent(), rootNodes);
+        }
+        return -1;
+    }
+
 }
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/table/column/ColumnWithElementId.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/table/column/ColumnWithElementId.java
index dec1780..9906e9c 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/table/column/ColumnWithElementId.java
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/table/column/ColumnWithElementId.java
@@ -15,6 +15,6 @@
      *            Column ID that will be part of the resulting DOM element ID, 
or {@code null} to use column index
      *            value.
      */
-    public void configureElementId(String elementIdPrefix, String columnId);
+    void configureElementId(String elementIdPrefix, String columnId);
 
 }
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/tree/ElementIdCellTree.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/tree/ElementIdCellTree.java
new file mode 100644
index 0000000..a6ca5ea
--- /dev/null
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/tree/ElementIdCellTree.java
@@ -0,0 +1,27 @@
+package org.ovirt.engine.ui.common.widget.tree;
+
+import org.ovirt.engine.ui.common.idhandler.HasElementId;
+
+import com.google.gwt.user.cellview.client.CellTree;
+
+/**
+ * A {@link CellTree} that supports assigning DOM element IDs to tree nodes 
through {@link HasElementId} interface.
+ */
+public abstract class ElementIdCellTree<M extends TreeModelWithElementId> 
extends CellTree implements HasElementId {
+
+    public <T> ElementIdCellTree(M viewModel, T rootValue, Resources 
resources) {
+        super(viewModel, rootValue, resources);
+    }
+
+    @Override
+    public void setElementId(String elementId) {
+        getTreeViewModel().setElementIdPrefix(elementId);
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public M getTreeViewModel() {
+        return (M) super.getTreeViewModel();
+    }
+
+}
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/tree/TreeModelWithElementId.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/tree/TreeModelWithElementId.java
new file mode 100644
index 0000000..b0154e2
--- /dev/null
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/tree/TreeModelWithElementId.java
@@ -0,0 +1,15 @@
+package org.ovirt.engine.ui.common.widget.tree;
+
+import com.google.gwt.view.client.TreeViewModel;
+
+/**
+ * A {@link TreeViewModel} that supports assigning DOM element IDs to tree 
nodes for better accessibility.
+ */
+public interface TreeModelWithElementId extends TreeViewModel {
+
+    /**
+     * Sets the element ID prefix to use for tree node elements.
+     */
+    void setElementIdPrefix(String elementIdPrefix);
+
+}
diff --git a/frontend/webadmin/modules/pom.xml 
b/frontend/webadmin/modules/pom.xml
index cb90db2..0b66003 100644
--- a/frontend/webadmin/modules/pom.xml
+++ b/frontend/webadmin/modules/pom.xml
@@ -44,7 +44,7 @@
     <!-- Regular expression that matches types that GWT compiler shouldn't 
prune (avoid dead code optimization) -->
     
<gwt.dontPrune>-Dgwt.dontPrune=org\.ovirt\.engine\.core\.(common|compat)\..*</gwt.dontPrune>
     <!-- This can be overridden by setting this property in your personal 
settings.xml -->
-    <gwt-plugin.extraJvmArgs>-Xms1024M -Xmx2048M -XX:PermSize=256M 
-XX:MaxPermSize=512M</gwt-plugin.extraJvmArgs>
+    <gwt-plugin.extraJvmArgs>-Xss32M -Xms1024M -Xmx2048M -XX:PermSize=256M 
-XX:MaxPermSize=512M</gwt-plugin.extraJvmArgs>
     <!-- Control target browsers for GWT compilation, maps to 'user.agent' 
deferred binding property in *.gwt.xml -->
     <!-- By default, all modern browsers are supported, see 
[gwt-user.jar:com/google/gwt/user/UserAgent.gwt.xml] for a complete list -->
     <gwt.userAgent>ie8,ie9,gecko1_8,safari,opera</gwt.userAgent>
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/AssignTagsPopupView.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/AssignTagsPopupView.java
index 9ad4768..683cd54 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/AssignTagsPopupView.java
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/AssignTagsPopupView.java
@@ -85,18 +85,17 @@
         });
     }
 
-    @SuppressWarnings("unchecked")
     private void updateTree(TagListModel model) {
         // Get tag node list
         ArrayList<SelectionTreeNodeModel> tagTreeNodes = 
model.getSelectionNodeList();
 
         // Get tree view model
         ModelListTreeViewModel<SelectionTreeNodeModel, 
SimpleSelectionTreeNodeModel> modelListTreeViewModel =
-                (ModelListTreeViewModel<SelectionTreeNodeModel, 
SimpleSelectionTreeNodeModel>) tree.getTreeViewModel();
+                tree.getTreeViewModel();
 
         // Set root nodes
         List<SimpleSelectionTreeNodeModel> rootNodes = 
SimpleSelectionTreeNodeModel.fromList(tagTreeNodes);
-        modelListTreeViewModel.setRoot(rootNodes);
+        modelListTreeViewModel.setRoots(rootNodes);
 
         // Update tree data
         AsyncDataProvider<SimpleSelectionTreeNodeModel> asyncTreeDataProvider =
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/configure/RolePopupView.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/configure/RolePopupView.java
index 21a5795..b7f5c02 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/configure/RolePopupView.java
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/configure/RolePopupView.java
@@ -197,18 +197,17 @@
 
     }
 
-    @SuppressWarnings("unchecked")
     private void updateTree(RoleModel model) {
         // Get tag node list
         ArrayList<SelectionTreeNodeModel> tagTreeNodes = 
model.getPermissionGroupModels();
 
         // Get tree view model
         ModelListTreeViewModel<SelectionTreeNodeModel, 
SimpleSelectionTreeNodeModel> modelListTreeViewModel =
-                (ModelListTreeViewModel<SelectionTreeNodeModel, 
SimpleSelectionTreeNodeModel>) tree.getTreeViewModel();
+                tree.getTreeViewModel();
 
         // Set root nodes
         List<SimpleSelectionTreeNodeModel> rootNodes = 
SimpleSelectionTreeNodeModel.fromList(tagTreeNodes);
-        modelListTreeViewModel.setRoot(rootNodes);
+        modelListTreeViewModel.setRoots(rootNodes);
 
         // Update tree data
         AsyncDataProvider<SimpleSelectionTreeNodeModel> asyncTreeDataProvider =
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/user/ManageEventsPopupView.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/user/ManageEventsPopupView.java
index a909f52..b277866 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/user/ManageEventsPopupView.java
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/user/ManageEventsPopupView.java
@@ -51,11 +51,12 @@
 
     @UiField(provided = true)
     @Ignore
+    @WithElementId
     EntityModelCellTree<SelectionTreeNodeModel, SimpleSelectionTreeNodeModel> 
tree;
 
     @UiField
     @Path(value = "email.entity")
-    @WithElementId
+    @WithElementId("email")
     EntityModelTextBoxEditor emailEditor;
 
     @UiField
@@ -64,10 +65,12 @@
 
     @UiField
     @Ignore
+    @WithElementId
     Button expandAllButton;
 
     @UiField
     @Ignore
+    @WithElementId
     Button collapseAllButton;
 
     private final Driver driver = GWT.create(Driver.class);
@@ -97,7 +100,6 @@
 
     private void initExpandButtons() {
         expandAllButton.addClickHandler(new ClickHandler() {
-
             @Override
             public void onClick(ClickEvent event) {
                 expandTree();
@@ -105,7 +107,6 @@
         });
 
         collapseAllButton.addClickHandler(new ClickHandler() {
-
             @Override
             public void onClick(ClickEvent event) {
                 collapseTree();
@@ -119,7 +120,6 @@
 
         // Listen to Properties
         object.getPropertyChangedEvent().addListener(new IEventListener() {
-
             @Override
             public void eventRaised(Event ev, Object sender, EventArgs args) {
                 EventNotificationModel model = (EventNotificationModel) sender;
@@ -131,18 +131,17 @@
         });
     }
 
-    @SuppressWarnings("unchecked")
     private void updateTree(EventNotificationModel model) {
         // Get tag node list
         ArrayList<SelectionTreeNodeModel> tagTreeNodes = 
model.getEventGroupModels();
 
         // Get tree view model
         ModelListTreeViewModel<SelectionTreeNodeModel, 
SimpleSelectionTreeNodeModel> modelListTreeViewModel =
-                (ModelListTreeViewModel<SelectionTreeNodeModel, 
SimpleSelectionTreeNodeModel>) tree.getTreeViewModel();
+                tree.getTreeViewModel();
 
         // Set root nodes
         List<SimpleSelectionTreeNodeModel> rootNodes = 
SimpleSelectionTreeNodeModel.fromList(tagTreeNodes);
-        modelListTreeViewModel.setRoot(rootNodes);
+        modelListTreeViewModel.setRoots(rootNodes);
 
         // Update tree data
         AsyncDataProvider<SimpleSelectionTreeNodeModel> asyncTreeDataProvider =
@@ -181,12 +180,14 @@
     }
 
     interface AssignTagTreeResources extends CellTree.Resources {
+
         interface TableStyle extends CellTree.Style {
         }
 
         @Override
         @Source({ "org/ovirt/engine/ui/webadmin/css/AssignTagTree.css" })
         TableStyle cellTreeStyle();
+
     }
 
 }
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/uicommon/model/ModelListTreeViewModel.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/uicommon/model/ModelListTreeViewModel.java
index 05e251c..e101f30 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/uicommon/model/ModelListTreeViewModel.java
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/uicommon/model/ModelListTreeViewModel.java
@@ -5,17 +5,23 @@
 import java.util.List;
 import java.util.Set;
 
+import org.ovirt.engine.ui.common.uicommon.model.TreeNodeModel;
+import org.ovirt.engine.ui.common.utils.ElementIdUtils;
+import org.ovirt.engine.ui.common.widget.tree.TreeModelWithElementId;
+
 import com.google.gwt.cell.client.Cell;
 import com.google.gwt.cell.client.CheckboxCell;
 import com.google.gwt.cell.client.CompositeCell;
 import com.google.gwt.cell.client.FieldUpdater;
 import com.google.gwt.cell.client.HasCell;
+import com.google.gwt.core.client.GWT;
 import com.google.gwt.event.logical.shared.SelectionEvent;
 import com.google.gwt.event.logical.shared.SelectionHandler;
+import com.google.gwt.safehtml.client.SafeHtmlTemplates;
 import com.google.gwt.safehtml.shared.SafeHtml;
 import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
-import com.google.gwt.safehtml.shared.SafeHtmlUtils;
 import com.google.gwt.user.cellview.client.TextColumn;
+import com.google.gwt.user.client.DOM;
 import com.google.gwt.view.client.AsyncDataProvider;
 import com.google.gwt.view.client.DefaultSelectionEventManager;
 import com.google.gwt.view.client.HasData;
@@ -23,14 +29,14 @@
 import com.google.gwt.view.client.MultiSelectionModel;
 import com.google.gwt.view.client.SelectionChangeEvent;
 import com.google.gwt.view.client.SelectionChangeEvent.Handler;
-import com.google.gwt.view.client.TreeViewModel;
 
 /**
  * A TreeView Model for {@link TreeNodeModel<T>} Nodes
  */
-public class ModelListTreeViewModel<T, M extends TreeNodeModel<T, M>> 
implements TreeViewModel {
+public class ModelListTreeViewModel<T, M extends TreeNodeModel<T, M>> 
implements TreeModelWithElementId {
 
     private final class NodeSelectionHandler implements SelectionHandler<M> {
+
         private final HasData<M> display;
 
         private NodeSelectionHandler(HasData<M> display) {
@@ -43,6 +49,7 @@
             display.getSelectionModel().setSelected(selectedItem,
                     selectedItem.getSelected());
         }
+
     }
 
     private final class CellLabel extends TextColumn<M> {
@@ -70,86 +77,95 @@
         public Boolean getValue(M object) {
             return selectionModel.isSelected(object);
         }
+
+    }
+
+    interface ExCheckboxCellTemplate extends SafeHtmlTemplates {
+
+        /**
+         * An html string representation of a checked input box.
+         */
+        @Template("<input type=\"checkbox\" id=\"{0}\" tabindex=\"-1\" 
checked/>")
+        SafeHtml inputChecked(String elementId);
+
+        /**
+         * An html string representation of an unchecked input box.
+         */
+        @Template("<input type=\"checkbox\" id=\"{0}\" tabindex=\"-1\"/>")
+        SafeHtml inputUnchecked(String elementId);
+
+        /**
+         * An html string representation of a disabled checked input box.
+         */
+        @Template("<input type=\"checkbox\" id=\"{0}\" tabindex=\"-1\" checked 
disabled/>")
+        SafeHtml inputCheckedDisabled(String elementId);
+
+        /**
+         * An html string representation of a disabled unchecked input box.
+         */
+        @Template("<input type=\"checkbox\" id=\"{0}\" tabindex=\"-1\" 
disabled/>")
+        SafeHtml inputUncheckedDisabled(String elementId);
+
     }
 
     /**
      * A {@link CheckboxCell} that can be disabled
      */
     private final class ExCheckboxCell extends CheckboxCell {
-        /**
-         * An html string representation of a disabled checked input box.
-         */
-        private final SafeHtml INPUT_CHECKED_DISABLED =
-                SafeHtmlUtils.fromSafeConstant("<input type=\"checkbox\" 
tabindex=\"-1\" checked disabled/>"); //$NON-NLS-1$
-        /**
-         * An html string representation of a disabled unchecked input box.
-         */
-        private final SafeHtml INPUT_UNCHECKED_DISABLED =
-                SafeHtmlUtils.fromSafeConstant("<input type=\"checkbox\" 
tabindex=\"-1\" disabled/>"); //$NON-NLS-1$
 
-        private final SafeHtml INPUT_CHECKED_NULL_DISABLED =
-                SafeHtmlUtils.fromSafeConstant("<input type=\"checkbox\" 
tabindex=\"-1\" checked style=\"-moz-Field ! important; background-color: 
yellow;\" disabled/>"); //$NON-NLS-1$
-
-        private final SafeHtml INPUT_CHECKED_NULL =
-                SafeHtmlUtils.fromSafeConstant("<input type=\"checkbox\" 
tabindex=\"-1\" checked style=\"-moz-Field ! important; background-color: 
yellow;\"/>"); //$NON-NLS-1$
+        private final ExCheckboxCellTemplate template = 
GWT.create(ExCheckboxCellTemplate.class);
 
         private ExCheckboxCell(boolean dependsOnSelection, boolean 
handlesSelection) {
             super(dependsOnSelection, handlesSelection);
         }
 
+        @SuppressWarnings("unchecked")
         @Override
         public void render(Context context, Boolean value, SafeHtmlBuilder sb) 
{
-            Object key = context.getKey();
             // TODO semi-checked checkbox (null value)
             // value = ((SimpleSelectionTreeNodeModel) 
context.getKey()).getIsSelectedNullable();
-            @SuppressWarnings("unchecked")
-            M model = (M) key;
-            if (!model.isEditable()) {
-                // disabled
-                Boolean viewData = getViewData(key);
-                if (viewData != null && viewData.equals(value)) {
-                    clearViewData(key);
-                    viewData = null;
-                }
-                // if (value == null) {
-                // sb.append(INPUT_CHECKED_NULL_DISABLED);
-                // } else
-                if (value != null && ((viewData != null) ? viewData : value)) {
-                    sb.append(INPUT_CHECKED_DISABLED);
-                } else {
-                    sb.append(INPUT_UNCHECKED_DISABLED);
-                }
+            Object key = context.getKey();
+            Boolean viewData = getViewData(key);
+
+            M nodeModel = (M) key;
+            String elementId = ElementIdUtils.createTreeCellElementId(
+                    elementIdPrefix, nodeModel, roots);
+
+            if (viewData != null && viewData.equals(value)) {
+                clearViewData(key);
+                viewData = null;
+            }
+
+            if (value != null && ((viewData != null) ? viewData : value)) {
+                // Checked state
+                sb.append(nodeModel.isEditable() ? 
template.inputChecked(elementId)
+                        : template.inputCheckedDisabled(elementId));
             } else {
-                // if (value == null) {
-                // Boolean viewData = getViewData(key);
-                // if (viewData != null && viewData.equals(value)) {
-                // clearViewData(key);
-                // viewData = null;
-                // }
-                // sb.append(INPUT_CHECKED_NULL);
-                // } else
-                // enabled
-                super.render(context, value, sb);
+                // Unchecked state
+                sb.append(nodeModel.isEditable() ? 
template.inputUnchecked(elementId)
+                        : template.inputUncheckedDisabled(elementId));
             }
         }
+
     }
 
     private final AsyncDataProvider<M> asyncTreeDataProvider;
 
     private final List<HasCell<M, ?>> cells = new ArrayList<HasCell<M, ?>>();
 
-    private List<M> root;
+    private List<M> roots;
 
     private final MultiSelectionModel<M> selectionModel = new 
MultiSelectionModel<M>();
 
     private NodeSelectionHandler nodeSelectionHandler;
+
+    private String elementIdPrefix = DOM.createUniqueId();
 
     public ModelListTreeViewModel() {
         cells.add(new CheckboxColumn());
         cells.add(new CellLabel());
 
         asyncTreeDataProvider = new AsyncDataProvider<M>() {
-
             @Override
             protected void onRangeChanged(HasData<M> display) {
                 // no-op
@@ -170,8 +186,8 @@
             @Override
             public void onSelectionChange(SelectionChangeEvent event) {
                 Set<M> selectedSet = selectionModel.getSelectedSet();
-                HashSet<TreeNodeModel> removedSet = new 
HashSet<TreeNodeModel>();
-                for (TreeNodeModel<T, M> child : root) {
+                HashSet<TreeNodeModel<?, ?>> removedSet = new 
HashSet<TreeNodeModel<?, ?>>();
+                for (TreeNodeModel<T, M> child : roots) {
                     if (!selectedSet.contains(child) && child.getSelected()) {
                         selectedSet.remove(child);
                         removedSet.add(child);
@@ -192,7 +208,7 @@
                 for (M m : selectedSet) {
                     m.setSelected(true);
                 }
-                for (TreeNodeModel treeNodeModel : removedSet) {
+                for (TreeNodeModel<?, ?> treeNodeModel : removedSet) {
                     treeNodeModel.setSelected(false);
                 }
             }
@@ -218,9 +234,9 @@
         return asyncTreeDataProvider;
     }
 
+    @SuppressWarnings("unchecked")
     @Override
     public <N> NodeInfo<?> getNodeInfo(N value) {
-        @SuppressWarnings("unchecked")
         M model = (M) value;
         CompositeCell<M> composite = new CompositeCell<M>(cells);
         if (value == null) {
@@ -240,9 +256,9 @@
         }
     }
 
+    @SuppressWarnings("unchecked")
     @Override
     public boolean isLeaf(Object value) {
-        @SuppressWarnings("unchecked")
         M model = (M) value;
         return model != null && model.getChildren() != null && 
model.getChildren().size() == 0;
     }
@@ -252,7 +268,13 @@
      *
      * @param arrayList
      */
-    public void setRoot(List<M> arrayList) {
-        this.root = arrayList;
+    public void setRoots(List<M> arrayList) {
+        this.roots = arrayList;
     }
+
+    @Override
+    public void setElementIdPrefix(String elementIdPrefix) {
+        this.elementIdPrefix = elementIdPrefix;
+    }
+
 }
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/uicommon/model/SimpleSelectionTreeNodeModel.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/uicommon/model/SimpleSelectionTreeNodeModel.java
index 071618d..6b6cd97 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/uicommon/model/SimpleSelectionTreeNodeModel.java
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/uicommon/model/SimpleSelectionTreeNodeModel.java
@@ -3,6 +3,7 @@
 import java.util.ArrayList;
 import java.util.List;
 
+import org.ovirt.engine.ui.common.uicommon.model.TreeNodeModel;
 import org.ovirt.engine.ui.uicommonweb.models.common.SelectionTreeNodeModel;
 import org.ovirt.engine.ui.uicompat.Event;
 import org.ovirt.engine.ui.uicompat.EventArgs;
@@ -40,24 +41,25 @@
     }
 
     private final ArrayList<SimpleSelectionTreeNodeModel> children;
+    private SimpleSelectionTreeNodeModel parent;
 
     private final EventBus eventBus;
-
     private final SelectionTreeNodeModel model;
 
-    protected SimpleSelectionTreeNodeModel(final SelectionTreeNodeModel model) 
{
+    protected SimpleSelectionTreeNodeModel(SelectionTreeNodeModel model) {
         this.eventBus = ClientGinjectorProvider.instance().getEventBus();
         this.model = model;
 
-        // Build children List
+        // Build children list using depth-first recursion
         this.children = new ArrayList<SimpleSelectionTreeNodeModel>();
         for (SelectionTreeNodeModel childModel : model.getChildren()) {
-            children.add(new SimpleSelectionTreeNodeModel(childModel));
+            SimpleSelectionTreeNodeModel child = new 
SimpleSelectionTreeNodeModel(childModel);
+            child.parent = this;
+            children.add(child);
         }
 
         // Add selection listener
         model.getPropertyChangedEvent().addListener(new IEventListener() {
-
             @Override
             public void eventRaised(Event ev, Object sender, EventArgs args) {
                 if ("IsSelectedNullable".equals(((PropertyChangedEventArgs) 
args).PropertyName)) { //$NON-NLS-1$
@@ -65,7 +67,6 @@
                 }
             }
         });
-
     }
 
     @Override
@@ -84,6 +85,27 @@
     }
 
     @Override
+    public SimpleSelectionTreeNodeModel getParent() {
+        return parent;
+    }
+
+    @Override
+    public int getIndex() {
+        if (parent == null) {
+            return 0;
+        }
+
+        ArrayList<SimpleSelectionTreeNodeModel> siblings = 
parent.getChildren();
+        for (int i = 0; i < siblings.size(); i++) {
+            if (model == siblings.get(i).model) {
+                return i;
+            }
+        }
+
+        return -1;
+    }
+
+    @Override
     public String getName() {
         return model.getDescription();
     }
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/editor/EntityModelCellTree.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/editor/EntityModelCellTree.java
index 71094ba..df7e1cd 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/editor/EntityModelCellTree.java
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/editor/EntityModelCellTree.java
@@ -1,7 +1,8 @@
 package org.ovirt.engine.ui.webadmin.widget.editor;
 
+import org.ovirt.engine.ui.common.uicommon.model.TreeNodeModel;
+import org.ovirt.engine.ui.common.widget.tree.ElementIdCellTree;
 import org.ovirt.engine.ui.webadmin.uicommon.model.ModelListTreeViewModel;
-import org.ovirt.engine.ui.webadmin.uicommon.model.TreeNodeModel;
 
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.user.cellview.client.CellTree;
@@ -9,7 +10,8 @@
 /**
  * A tree for {@link 
org.ovirt.engine.ui.uicommonweb.models.common.SelectionTreeNodeModel} Nodes
  */
-public class EntityModelCellTree<T, M extends TreeNodeModel<T, M>> extends 
CellTree {
+public class EntityModelCellTree<T, M extends TreeNodeModel<T, M>> extends 
ElementIdCellTree<ModelListTreeViewModel<T, M>> {
+
     interface Resources {
         CellTree.Resources res = GWT.create(CellTree.BasicResources.class);
     }


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

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

Reply via email to