/*
* 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.RadioButton;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
/**
* An {@link InlineCellEditor} that allows the user to select a {@link String}
* from a list of {@link RadioButton RadioButtons}.
*
* @param <ColType> the data type of the column
*/
public class RadioCellEditor<ColType> extends InlineCellEditor<ColType> {
/**
* A mapping of {@link RadioButton RadioButtons} to the value for the buttons.
*/
private Map<RadioButton, ColType> radioMap = new HashMap<RadioButton, ColType>();
/**
* The vertical panel used to layout the contents.
*/
private VerticalPanel vpanel = new VerticalPanel();
/**
* Construct a new {@link RadioCellEditor}.
*/
public RadioCellEditor() {
this(GWT.<InlineCellEditorImages> create(InlineCellEditorImages.class));
}
/**
* Construct a new {@link RadioCellEditor} with the specified images.
*
* @param images the images to use for the accept/cancel buttons
*/
public RadioCellEditor(InlineCellEditorImages images) {
this(new VerticalPanel(), images);
}
/**
* Constructor.
*
* @param images the images to use for the accept/cancel buttons
*/
private RadioCellEditor(VerticalPanel vPanel, InlineCellEditorImages images) {
super(vPanel, images);
this.vpanel = vPanel;
}
/**
* Add a {@link RadioButton} to the editor.
*
* @param radio the radio button to add
* @param value the value associated with the {@link RadioButton}
*/
public void addRadioButton(RadioButton radio, ColType value) {
vpanel.add(radio);
radioMap.put(radio, value);
}
@Override
public void editCell(CellEditInfo cellEditInfo, ColType cellValue,
Callback<ColType> callback) {
super.editCell(cellEditInfo, cellValue, callback);
Iterator<Widget> it = vpanel.iterator();
while (it.hasNext()) {
RadioButton radio = (RadioButton) it.next();
if (radio.getValue()) {
radio.setFocus(true);
return;
}
}
}
/**
* Insert a {@link RadioButton} at the specified index.
*
* @param radio the radio button to add
* @param value the value associated with the {@link RadioButton}
* @param beforeIndex the index before which it will be inserted
* @throws IndexOutOfBoundsException if <code>beforeIndex</code> is out of
* range
*/
public void insertRadioButton(RadioButton radio, ColType value,
int beforeIndex) throws IndexOutOfBoundsException {
vpanel.insert(radio, beforeIndex);
radioMap.put(radio, value);
}
/**
* Remove a {@link RadioButton} from the editor.
*
* @param radio the radio button to remove
*/
public void removeRadioButton(RadioButton radio) {
vpanel.remove(radio);
radioMap.remove(radio);
}
@Override
protected ColType getValue() {
Iterator<Widget> it = vpanel.iterator();
while (it.hasNext()) {
RadioButton radio = (RadioButton) it.next();
if (radio.getValue()) {
return radioMap.get(radio);
}
}
return null;
}
@Override
protected void setValue(ColType cellValue) {
for (Map.Entry<RadioButton, ColType> entry : radioMap.entrySet()) {
if (entry.getValue().equals(cellValue)) {
entry.getKey().setValue(true);
} else {
entry.getKey().setValue(false);
}
}
}
}