blob: 45ced2157c1b8c24b1c1baf6f9e0b24d8953b078 [file] [log] [blame]
/*
* Copyright 2010 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.gwt.user.client.ui;
import com.google.gwt.cell.client.AbstractCell;
import com.google.gwt.editor.client.IsEditor;
import com.google.gwt.editor.client.LeafValueEditor;
import com.google.gwt.editor.client.adapters.TakesValueEditor;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.text.shared.Renderer;
import com.google.gwt.user.cellview.client.CellList;
import com.google.gwt.view.client.SelectionChangeEvent;
import com.google.gwt.view.client.SingleSelectionModel;
import java.util.ArrayList;
import java.util.Collection;
/**
* Allows the user to pick a single value from a list.
*
* @param <T> the type of value
*/
public class ValuePicker<T> extends Composite
implements HasConstrainedValue<T>, IsEditor<LeafValueEditor<T>> {
private static class DefaultCell<T> extends AbstractCell<T> {
private final Renderer<T> renderer;
DefaultCell(Renderer<T> renderer) {
this.renderer = renderer;
}
@Override
public void render(Context context, T value, SafeHtmlBuilder sb) {
sb.appendEscaped(renderer.render(value));
}
}
private T value;
private final CellList<T> cellList;
private SingleSelectionModel<T> smodel = new SingleSelectionModel<T>();
private LeafValueEditor<T> editor;
public ValuePicker(CellList<T> cellList) {
this.cellList = cellList;
initWidget(cellList);
cellList.setSelectionModel(smodel);
smodel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
public void onSelectionChange(SelectionChangeEvent event) {
setValue(smodel.getSelectedObject());
}
});
}
public ValuePicker(Renderer<T> renderer) {
this(new CellList<T>(new DefaultCell<T>(renderer)));
}
public HandlerRegistration addValueChangeHandler(ValueChangeHandler<T> handler) {
return addHandler(handler, ValueChangeEvent.getType());
}
/**
* Returns a {@link TakesValueEditor} backed by the ValuePicker.
*/
public LeafValueEditor<T> asEditor() {
if (editor == null) {
editor = TakesValueEditor.of(this);
}
return editor;
}
/**
* Returns this view.
*/
@Override
public ValuePicker<T> asWidget() {
return this;
}
public int getPageSize() {
return cellList.getPageSize();
}
public T getValue() {
return value;
}
public void setAcceptableValues(Collection<T> places) {
cellList.setRowData(0, new ArrayList<T>(places));
}
public void setPageSize(int size) {
cellList.setPageSize(size);
}
public void setValue(T value) {
setValue(value, true);
}
public void setValue(T value, boolean fireEvents) {
T current = getValue();
if ((current == value) || (current != null && current.equals(value))) {
return;
}
this.value = value;
smodel.setSelected(value, true);
if (fireEvents) {
ValueChangeEvent.fire(this, value);
}
}
}