Lior Vernia has uploaded a new change for review.

Change subject: webadmin: Added ListBox column to be used with CellTable
......................................................................

webadmin: Added ListBox column to be used with CellTable

ListModelListBoxColumn (which uses ListModelListBoxCell to render its
elements) represents a CellTable column that presents the items of a
ListModel as a ListBox and allows the user to select an item among
them.

Change-Id: If9c04c5c32e9a36fa959af55399a44ff33d175d8
Signed-off-by: Lior Vernia <[email protected]>
---
A 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/table/column/ListModelListBoxCell.java
A 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/table/column/ListModelListBoxColumn.java
2 files changed, 131 insertions(+), 0 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/98/16198/1

diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/table/column/ListModelListBoxCell.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/table/column/ListModelListBoxCell.java
new file mode 100644
index 0000000..d07e545
--- /dev/null
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/table/column/ListModelListBoxCell.java
@@ -0,0 +1,104 @@
+package org.ovirt.engine.ui.common.widget.table.column;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.ovirt.engine.ui.uicommonweb.models.ListModel;
+import org.ovirt.engine.ui.uicompat.Event;
+import org.ovirt.engine.ui.uicompat.EventArgs;
+import org.ovirt.engine.ui.uicompat.IEventListener;
+
+import com.google.gwt.cell.client.AbstractInputCell;
+import com.google.gwt.cell.client.SelectionCell;
+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;
+import com.google.gwt.text.shared.Renderer;
+
+/**
+ * This class may be used to display a ListBox, backed by a ListModel, in cell 
widgets. It mimics the behaviour of a
+ * SelectionCell by passing on rendering requests and browser events to a 
member delegate. The SelectionCell options are
+ * set by rendering the items of a ListModel using the renderer passed to the 
constructor. Additional functionality
+ * includes enabling/disabling the ListBox according to the IsChangeable state 
of the ListModel.
+ *
+ * @param <T>
+ *            the ListModel item type.
+ */
+public class ListModelListBoxCell<T> extends AbstractInputCell<ListModel, 
String> {
+
+    private static final String PATTERN_SELECT = "<select"; //$NON-NLS-1$
+    private static final String REPLACEMENT_SELECT = "<select disabled"; 
//$NON-NLS-1$
+
+    private ListModel model;
+    private SelectionCell delegate;
+    private Map<String, T> entityByName;
+    private final Renderer<T> renderer;
+    private final IEventListener itemsChangedListener;
+
+    public ListModelListBoxCell(final Renderer<T> renderer) {
+        super("change"); //$NON-NLS-1$
+        this.renderer = renderer;
+        itemsChangedListener = new IEventListener() {
+
+            @SuppressWarnings("unchecked")
+            @Override
+            public void eventRaised(Event ev, Object sender, EventArgs args) {
+                entityByName = new HashMap<String, T>();
+                List<String> options = new ArrayList<String>();
+                for (T entity : (Iterable<T>) model.getItems()) {
+                    String entityName = renderer.render(entity);
+                    entityByName.put(entityName, entity);
+                    options.add(entityName);
+                }
+                delegate = new SelectionCell(options);
+            }
+        };
+    }
+
+    public void edit(final ListModel model) {
+        if (this.model != null) {
+            
this.model.getItemsChangedEvent().removeListener(itemsChangedListener);
+        }
+        this.model = model;
+        model.getItemsChangedEvent().addListener(itemsChangedListener);
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public void render(Context context, ListModel value, SafeHtmlBuilder sb) {
+        SafeHtmlBuilder sbDelegate = new SafeHtmlBuilder();
+        delegate.render(context, renderer.render((T) value.getSelectedItem()), 
sbDelegate);
+        if (value.getIsChangable()) {
+            sb.append(sbDelegate.toSafeHtml());
+        } else {
+            
sb.appendHtmlConstant(sbDelegate.toSafeHtml().asString().replaceFirst(PATTERN_SELECT,
 REPLACEMENT_SELECT));
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public void onBrowserEvent(Context context,
+            Element parent,
+            final ListModel model,
+            NativeEvent event,
+            ValueUpdater<ListModel> valueUpdater) {
+
+        delegate.onBrowserEvent(context,
+                parent,
+                renderer.render((T) model.getSelectedItem()),
+                event,
+                new ValueUpdater<String>() {
+
+                    @Override
+                    public void update(String value) {
+                        if (value != null) {
+                            model.setSelectedItem(entityByName.get(value));
+                        }
+                    }
+                });
+    }
+
+}
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/table/column/ListModelListBoxColumn.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/table/column/ListModelListBoxColumn.java
new file mode 100644
index 0000000..498d211
--- /dev/null
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/table/column/ListModelListBoxColumn.java
@@ -0,0 +1,27 @@
+package org.ovirt.engine.ui.common.widget.table.column;
+
+import org.ovirt.engine.ui.uicommonweb.models.ListModel;
+
+import com.google.gwt.text.shared.Renderer;
+import com.google.gwt.user.cellview.client.Column;
+
+/**
+ * Column for displaying a ListBox backed by ListModel using {@link 
ListModelListBoxCell}.
+ *
+ * @param <T>
+ *            the row type.
+ * @param <S>
+ *            the ListModel item type.
+ */
+public abstract class ListModelListBoxColumn<T, S> extends Column<T, 
ListModel> {
+
+    public ListModelListBoxColumn(Renderer<S> renderer) {
+        super(new ListModelListBoxCell<S>(renderer));
+    }
+
+    @SuppressWarnings("unchecked")
+    public void edit(ListModel model) {
+        ((ListModelListBoxCell<S>) getCell()).edit(model);
+    }
+
+}


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

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

Reply via email to