blob: 73aacf228c5068847f4f27cf30cec245a216363a [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.examples.cell;
import com.google.gwt.cell.client.AbstractCell;
import com.google.gwt.cell.client.Cell;
import com.google.gwt.cell.client.ValueUpdater;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.InputElement;
import com.google.gwt.dom.client.NativeEvent;
import com.google.gwt.dom.client.TableCellElement;
import com.google.gwt.dom.client.TableElement;
import com.google.gwt.dom.client.TableRowElement;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.user.cellview.client.CellList;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.RootPanel;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* Example of creating an editable {@link Cell}. This example creates a cell
* that displays a Contact with a checkbox that indicates whether the contact is
* a favorite or not.
*/
public class EditableCellExample implements EntryPoint {
/**
* A simple data type that represents a contact.
*/
private static class Contact {
private final String address;
private final String name;
public Contact(String name, String address) {
this.name = name;
this.address = address;
}
}
/**
* A custom {@link Cell} used to render a {@link Contact}. We extend
* {@link AbstractCell} because it provides reasonable implementations of
* methods that work for most use cases.
*/
private class ContactCell extends AbstractCell<Contact> {
public ContactCell() {
// Our cell responds to change events and keydown events.
super("change", "keydown");
}
@Override
public void onBrowserEvent(Context context, Element parent, Contact value,
NativeEvent event, ValueUpdater<Contact> valueUpdater) {
// Check that the value is not null.
if (value == null) {
return;
}
// Call the super handler, which handlers the enter key.
super.onBrowserEvent(context, parent, value, event, valueUpdater);
// Handle click events.
if ("change".equals(event.getType())) {
updateFavorites(parent, value);
showCurrentFavorites();
}
}
@Override
public void render(Context context, Contact value, SafeHtmlBuilder sb) {
/*
* Always do a null check on the value. Cell widgets can pass null to
* cells if the underlying data contains a null, or if the data arrives
* out of order.
*/
if (value == null) {
return;
}
// Add a checkbox. If the contact is a favorite, the box will be checked.
sb.appendHtmlConstant("<table><tr><td valign=\"top\">");
if (favorites.contains(value)) {
sb.appendHtmlConstant("<input type=\"checkbox\" checked=checked/>");
} else {
sb.appendHtmlConstant("<input type=\"checkbox\" />");
}
sb.appendHtmlConstant("</td><td>");
// Display the name in big letters.
sb.appendHtmlConstant("<div style=\"size:200%;font-weight:bold;\">");
sb.appendEscaped(value.name);
sb.appendHtmlConstant("</div>");
// Display the address in normal text.
sb.appendHtmlConstant("<div style=\"padding-left:10px;\">");
sb.appendEscaped(value.address);
sb.appendHtmlConstant("</div>");
sb.appendHtmlConstant("</td></tr></table>");
}
/**
* By convention, cells that respond to user events should handle the enter
* key. This provides a consistent user experience when users use keyboard
* navigation in the widget. Our cell will toggle the checkbox on Enter.
*/
@Override
protected void onEnterKeyDown(Context context, Element parent,
Contact value, NativeEvent event, ValueUpdater<Contact> valueUpdater) {
// Toggle the checkbox.
InputElement input = getInputElement(parent);
input.setChecked(!input.isChecked());
// Update the favorites based on the new state.
updateFavorites(parent, value);
// Show the new list of favorites.
showCurrentFavorites();
}
/**
* Get the checkbox input element from the parent element that wraps our
* cell.
*
* @param parent the parent element
* @return the checkbox
*/
private InputElement getInputElement(Element parent) {
// We need to navigate down to our input element.
TableElement table = parent.getFirstChildElement().cast();
TableRowElement tr = table.getRows().getItem(0);
TableCellElement td = tr.getCells().getItem(0);
InputElement input = td.getFirstChildElement().cast();
return input;
}
/**
* Update the favorites list based on the state of the input element.
*/
private void updateFavorites(Element parent, Contact value) {
// Get the input element.
InputElement input = getInputElement(parent);
// Update the favorites based on the checked state.
if (input.isChecked()) {
favorites.add(value);
} else {
favorites.remove(value);
}
}
}
/**
* The list of data to display.
*/
private static final List<Contact> CONTACTS = Arrays.asList(new Contact(
"John", "123 Fourth Avenue"), new Contact("Joe", "22 Lance Ln"),
new Contact("Michael", "1283 Berry Blvd"), new Contact("Sarah",
"100 Hundred St."), new Contact("George", "1600 Pennsylvania Avenue"));
/**
* Our list of favorite contacts.
*/
private final List<Contact> favorites = new ArrayList<EditableCellExample.Contact>();
public void onModuleLoad() {
// Create a cell to render each value.
ContactCell contactCell = new ContactCell();
// Use the cell in a CellList.
CellList<Contact> cellList = new CellList<Contact>(contactCell);
// Push the data into the widget.
cellList.setRowData(0, CONTACTS);
// Add it to the root panel.
RootPanel.get().add(cellList);
}
/**
* Show the list of favorites.
*/
private void showCurrentFavorites() {
if (favorites.size() > 0) {
String text = "You favorite contacts are ";
boolean first = true;
for (Contact contact : favorites) {
if (!first) {
text += ", ";
} else {
first = false;
}
text += contact.name;
}
Window.alert(text);
} else {
Window.alert("You have not selected any favorites.");
}
}
}