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