Lior Vernia has uploaded a new change for review.

Change subject: webadmin: Added infrastructure for linking to System Tree items
......................................................................

webadmin: Added infrastructure for linking to System Tree items

This will facilitate adding links to tabs and subtabs, which when
pressed will select the corresponding item in the System Tree.

* LinkColumnWithTooltip is used to display text in a CellTable column
  as a link, such that upon clicking a supplied FieldUpdater is
  triggered.

* SystemTreeModel is modified to enable easy entity lookup by ID. To
  enable access to a SystemTreeItemModel, for example to be accessed
  by a link, one should add it to the member map treeItemById.

* SystemTree is modified so that items may be displayed as selected when
  it is set as selected in SystemTreeModel, with a little workaround to
  bypass a GWT bug. A convenience method is added to expand the whole
  path from the root of the tree to a target node, rather than expanding
  the whole tree up to a certain level.

Change-Id: I799aa4dfcd8ad7264057810e408cd1c64ea711e8
Signed-off-by: Lior Vernia <lver...@redhat.com>
---
A 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/table/column/LinkCellWithTooltip.java
A 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/table/column/LinkColumnWithTooltip.java
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/table/column/TextCellWithTooltip.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/SystemTreeModel.java
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/tree/SystemTree.java
5 files changed, 149 insertions(+), 4 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/22/15522/1

diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/table/column/LinkCellWithTooltip.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/table/column/LinkCellWithTooltip.java
new file mode 100644
index 0000000..d566644
--- /dev/null
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/table/column/LinkCellWithTooltip.java
@@ -0,0 +1,48 @@
+package org.ovirt.engine.ui.common.widget.table.column;
+
+import org.ovirt.engine.core.compat.StringHelper;
+
+import com.google.gwt.cell.client.ValueUpdater;
+import com.google.gwt.dom.client.Element;
+import com.google.gwt.dom.client.NativeEvent;
+import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
+
+/**
+ * This class may be used to display links in cell widgets. It allows the full 
functionality of a TextCellWithTooltip,
+ * and wraps the HTML result of its rendering within link tags. Click events 
are caught and passed to a ValueUpdater.
+ */
+@SuppressWarnings("deprecation")
+public class LinkCellWithTooltip extends TextCellWithTooltip {
+
+    public LinkCellWithTooltip(int maxTextLength) {
+        super(maxTextLength, "mouseover", "click"); //$NON-NLS-1$ $NON-NLS-2$
+    }
+
+    @Override
+    public void render(Context context, String value, SafeHtmlBuilder sb) {
+        if (value != null) {
+            sb.appendHtmlConstant("<a href='javascript:;' style='display: 
inline-block'>"); //$NON-NLS-1$
+            super.render(context, value, sb);
+            sb.appendHtmlConstant("</a>"); //$NON-NLS-1$
+        }
+    }
+
+    @Override
+    public void onBrowserEvent(Context context,
+            Element parent,
+            String value,
+            NativeEvent event,
+            ValueUpdater<String> valueUpdater) {
+
+        super.onBrowserEvent(context, parent, value, event, valueUpdater);
+        if (!"click".equals(event.getType())) { //$NON-NLS-1$
+            return;
+        }
+        if (valueUpdater != null && !StringHelper.isNullOrEmpty(value)) {
+            if 
(parent.getFirstChild().isOrHasChild(Element.as(event.getEventTarget()))) {
+                valueUpdater.update(value);
+            }
+        }
+    }
+
+}
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/table/column/LinkColumnWithTooltip.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/table/column/LinkColumnWithTooltip.java
new file mode 100644
index 0000000..b8e4ae3
--- /dev/null
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/table/column/LinkColumnWithTooltip.java
@@ -0,0 +1,38 @@
+package org.ovirt.engine.ui.common.widget.table.column;
+
+import com.google.gwt.cell.client.FieldUpdater;
+import com.google.gwt.user.cellview.client.Column;
+
+/**
+ * Column for displaying links using {@link LinkCellWithTooltip}.
+ *
+ * @param <T>
+ *            the row type.
+ */
+public abstract class LinkColumnWithTooltip<T> extends Column<T, String> 
implements ColumnWithElementId {
+
+    public LinkColumnWithTooltip() {
+        this(null);
+    }
+
+    public LinkColumnWithTooltip(FieldUpdater<T, String> fieldUpdater) {
+        this(TextCellWithTooltip.UNLIMITED_LENGTH, fieldUpdater);
+    }
+
+    public LinkColumnWithTooltip(int maxTextLength, FieldUpdater<T, String> 
fieldUpdater) {
+        super(new LinkCellWithTooltip(maxTextLength));
+        setFieldUpdater(fieldUpdater);
+    }
+
+    @Override
+    public void configureElementId(String elementIdPrefix, String columnId) {
+        getCell().setElementIdPrefix(elementIdPrefix);
+        getCell().setColumnId(columnId);
+    }
+
+    @Override
+    public LinkCellWithTooltip getCell() {
+        return (LinkCellWithTooltip) super.getCell();
+    }
+
+}
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/table/column/TextCellWithTooltip.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/table/column/TextCellWithTooltip.java
index ba74330..bfb599f 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/table/column/TextCellWithTooltip.java
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/table/column/TextCellWithTooltip.java
@@ -37,7 +37,11 @@
     private static CellTemplate template;
 
     public TextCellWithTooltip(int maxTextLength) {
-        super("mouseover"); //$NON-NLS-1$
+        this(maxTextLength, "mouseover"); //$NON-NLS-1$
+    }
+
+    public TextCellWithTooltip(int maxTextLength, String... consumedEvents) {
+        super(consumedEvents);
         this.maxTextLength = maxTextLength;
 
         // Delay cell template creation until the first time it's needed
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/SystemTreeModel.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/SystemTreeModel.java
index 4cee42d..9cec552 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/SystemTreeModel.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/SystemTreeModel.java
@@ -171,6 +171,12 @@
         privateVolumeMap = value;
     }
 
+    private Map<Guid, SystemTreeItemModel> treeItemById;
+
+    public void setSelectedItem(Guid id) {
+        setSelectedItem(treeItemById.get(id));
+    }
+
     static
     {
         ResetRequestedEventDefinition = new EventDefinition("ResetRequested", 
SystemTreeModel.class); //$NON-NLS-1$
@@ -403,6 +409,7 @@
     {
         ArrayList<StorageDomain> storages = null;
         int count = -1;
+        treeItemById = new HashMap<Guid, SystemTreeItemModel>();
 
         // Build tree items.
         SystemTreeItemModel systemItem = new SystemTreeItemModel();
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/tree/SystemTree.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/tree/SystemTree.java
index e8bed23..c60ee4e 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/tree/SystemTree.java
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/tree/SystemTree.java
@@ -1,5 +1,9 @@
 package org.ovirt.engine.ui.webadmin.widget.tree;
 
+import java.util.ArrayList;
+import java.util.List;
+import java.util.ListIterator;
+
 import org.ovirt.engine.ui.common.idhandler.ElementIdHandler;
 import org.ovirt.engine.ui.common.widget.action.AbstractActionStackPanelItem;
 import org.ovirt.engine.ui.common.widget.action.SimpleActionPanel;
@@ -24,6 +28,7 @@
 import 
com.google.gwt.user.cellview.client.HasKeyboardSelectionPolicy.KeyboardSelectionPolicy;
 import com.google.gwt.user.cellview.client.TreeNode;
 import com.google.gwt.user.client.ui.Widget;
+import com.google.gwt.view.client.SingleSelectionModel;
 
 public class SystemTree extends 
AbstractActionStackPanelItem<SystemTreeModelProvider, SystemTreeModel, 
CellTree> {
 
@@ -89,13 +94,27 @@
     }
 
     private void addModelListeners(final SystemTreeModelProvider 
modelProvider) {
-        modelProvider.getModel().getItemsChangedEvent().addListener(new 
IEventListener() {
+        final SystemTreeModel treeModel = modelProvider.getModel();
+        final SingleSelectionModel<SystemTreeItemModel> selectionModel = 
modelProvider.getSelectionModel();
+        treeModel.getItemsChangedEvent().addListener(new IEventListener() {
             @Override
             public void eventRaised(Event ev, Object sender, EventArgs args) {
                 // Reset selection in the model
-                SystemTreeItemModel lastSelectedItem = 
modelProvider.getSelectionModel().getSelectedObject();
-                
modelProvider.getSelectionModel().setSelected(lastSelectedItem, false);
+                SystemTreeItemModel lastSelectedItem = 
selectionModel.getSelectedObject();
+                selectionModel.setSelected(lastSelectedItem, false);
                 expandTree(getDataDisplayWidget().getRootTreeNode(), 
ITEM_LEVEL);
+            }
+        });
+        treeModel.getSelectedItemChangedEvent().addListener(new 
IEventListener() {
+            @Override
+            public void eventRaised(Event ev, Object sender, EventArgs args) {
+                CellTree display = getDataDisplayWidget();
+                
display.setKeyboardSelectionPolicy(KeyboardSelectionPolicy.ENABLED); // open 
GWT TreeCell bug workaround
+                SystemTreeItemModel selectedItem = (SystemTreeItemModel) 
treeModel.getSelectedItem();
+                selectionModel.setSelected(selectedItem, true);
+                selectionModel.getSelectedObject(); // make sure that the 
setSelected() operation isn't deferred
+                expandPath(selectedItem);
+                
display.setKeyboardSelectionPolicy(KeyboardSelectionPolicy.BOUND_TO_SELECTION); 
// close GWT TreeCell bug workaround
             }
         });
     }
@@ -113,6 +132,35 @@
         return display;
     }
 
+    private void expandPath(SystemTreeItemModel targetNodeModel) {
+        if (targetNodeModel == null) {
+            return;
+        }
+
+        // first construct a list of all ancestors of the target node
+        List<SystemTreeItemModel> modelPath = new 
ArrayList<SystemTreeItemModel>();
+        SystemTreeItemModel model = targetNodeModel.getParent();
+        while (model != null) {
+            modelPath.add(model);
+            model = model.getParent();
+        }
+
+        // then iterate over it in reverse to expand the ancestors in the 
widget
+        TreeNode node = getDataDisplayWidget().getRootTreeNode();
+        ListIterator<SystemTreeItemModel> i = 
modelPath.listIterator(modelPath.size());
+        while (i.hasPrevious()) {
+            model = i.previous();
+
+            // look for the child that fits the current node in the ancestry 
path of the target node
+            for (int j=0; j < node.getChildCount(); ++j) {
+                if (node.getChildValue(j).equals(model)) {
+                    node = node.setChildOpen(j, true);
+                    break;
+                }
+            }
+        }
+    }
+
     private void expandTree(TreeNode node) {
         expandTree(node, ALL_LEVELS);
     }


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I799aa4dfcd8ad7264057810e408cd1c64ea711e8
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Lior Vernia <lver...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to