| /* |
| * 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); |
| } |
| } |
| } |