/*
* Copyright 2008 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.gen2.table.client;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.ui.ListBox;
import java.util.ArrayList;
import java.util.List;
/**
* An {@link InlineCellEditor} that allows the user to select a {@link String}
* from a drop down {@link ListBox}.
*
* @param <ColType> the data type of the column
*/
public class ListCellEditor<ColType> extends InlineCellEditor<ColType> {
/**
* The list box of options.
*/
private ListBox listBox;
/**
* A list of item values that cooresponds to the indexes in the
* {@link ListBox}.
*/
private List<ColType> itemValues = new ArrayList<ColType>();
/**
* Construct a new {@link ListCellEditor}.
*/
public ListCellEditor() {
this(new ListBox(),
GWT.<InlineCellEditorImages> create(InlineCellEditorImages.class));
}
/**
* Construct a new {@link ListCellEditor} using the specified images.
*
* @param images the images to use for the accept/cancel buttons
*/
public ListCellEditor(InlineCellEditorImages images) {
this(new ListBox(), images);
}
/**
* Construct a new {@link ListCellEditor} using the specified {@link ListBox}
* and images.
*
* @param listBox the {@link ListBox} to use
* @param images the images to use for the accept/cancel buttons
*/
protected ListCellEditor(ListBox listBox, InlineCellEditorImages images) {
super(listBox, images);
this.listBox = listBox;
}
/**
* Adds an item to the {@link ListBox} in the editor.
*
* @param item the text of the item to be added
* @param value the value associated with the item
*/
public void addItem(String item, ColType value) {
listBox.addItem(item);
itemValues.add(value);
}
@Override
public void editCell(CellEditInfo cellEditInfo, ColType cellValue,
Callback<ColType> callback) {
super.editCell(cellEditInfo, cellValue, callback);
listBox.setFocus(true);
}
/**
* Inserts an item into the {@link ListBox} in the editor.
*
* @param item the text of the item to be inserted
* @param index the index at which to insert it
* @param value the value associated with the item
* @throws IndexOutOfBoundsException if the index is out of range
*/
public void insertItem(String item, int index, ColType value)
throws IndexOutOfBoundsException {
if (index < 0 || index >= listBox.getItemCount()) {
throw new IndexOutOfBoundsException();
}
listBox.insertItem(item, index);
itemValues.add(index, value);
}
/**
* Removes the item at the specified index.
*
* @param index the index of the item to be removed
* @throws IndexOutOfBoundsException if the index is out of range
*/
public void removeItem(int index) throws IndexOutOfBoundsException {
listBox.removeItem(index);
itemValues.remove(index);
}
@Override
protected ColType getValue() {
int index = listBox.getSelectedIndex();
if (index < 0) {
return null;
} else {
return itemValues.get(index);
}
}
@Override
protected void setValue(ColType cellValue) {
listBox.setSelectedIndex(Math.max(0, itemValues.indexOf(cellValue)));
}
}