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