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
