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