package com.google.gwt.sample.showcase.client.content.cell;
import java.util.Arrays;
import com.google.gwt.cell.client.AbstractCell;
import com.google.gwt.cell.client.Cell;
import com.google.gwt.cell.client.CompositeCell;
import com.google.gwt.cell.client.FieldUpdater;
import com.google.gwt.cell.client.HasCell;
import com.google.gwt.cell.client.ImageResourceCell;
import com.google.gwt.cell.client.SafeHtmlCell;
import com.google.gwt.cell.client.TextCell;
import com.google.gwt.cell.client.ValueUpdater;
import com.google.gwt.dom.client.BrowserEvents;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.EventTarget;
import com.google.gwt.dom.client.NativeEvent;
import com.google.gwt.resources.client.ImageResource;
import com.google.gwt.safehtml.shared.SafeHtml;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.sample.showcase.client.content.cell.ContactDatabase.ContactInfo;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.ImageResourceRenderer;
class CompositeContactCell extends CompositeCell<ContactInfo> {
public CompositeContactCell(CwCellList.Images images) {
super(Arrays.asList(
createContactIcon(images),
createNameAndAddress(),
createMailTo(),
createStar(images)));
}
private static HasCell<ContactInfo, ImageResource> createContactIcon(
final CwCellList.Images images) {
return HasCells.forCellWithConstantValue(
new ImageResourceCell(), images.contact());
}
private static HasCell<ContactInfo, SafeHtml> createNameAndAddress() {
return HasCells.forAdaptedCell(
new SafeHtmlCell(),
new Function<ContactInfo, SafeHtml>() {
public SafeHtml apply(ContactInfo contact) {
return new SafeHtmlBuilder()
.appendEscaped(contact.getFullName())
.appendHtmlConstant("<br>")
.appendEscaped(contact.getAddress())
.toSafeHtml();
}
});
}
private static HasCell<ContactInfo, Boolean> createStar(
final CwCellList.Images images) {
return new HasCell<ContactInfo, Boolean>() {
@Override
public Cell<Boolean> getCell() {
return new AbstractCell<Boolean>(BrowserEvents.CLICK) {
private ImageResourceRenderer renderer = new ImageResourceRenderer();
@Override
public void render(Cell.Context context, Boolean value,
SafeHtmlBuilder sb) {
if (value != null) {
sb.append(renderer.render(
value ? images.star() : images.starOutline()));
}
}
@Override
public void onBrowserEvent(Cell.Context context,
Element parent, Boolean value, NativeEvent event,
ValueUpdater<Boolean> valueUpdater) {
// Let AbstractCell handle the keydown event.
super.onBrowserEvent(context, parent, value, event, valueUpdater);
// Handle the click event.
if (BrowserEvents.CLICK.equals(event.getType())) {
// Ignore clicks that occur outside of the outermost element.
EventTarget eventTarget = event.getEventTarget();
if (parent.getFirstChildElement().isOrHasChild(Element.as(eventTarget))) {
boolean newValue = !value;
valueUpdater.update(newValue);
SafeHtmlBuilder sb = new SafeHtmlBuilder();
render(context, newValue, sb);
parent.setInnerSafeHtml(sb.toSafeHtml());
}
}
}
};
}
@Override
public FieldUpdater<ContactInfo, Boolean> getFieldUpdater() {
return new FieldUpdater<ContactInfo, Boolean>() {
@Override
public void update(int index, ContactInfo contact, Boolean value) {
contact.setStarred(value);
}
};
}
@Override
public Boolean getValue(ContactInfo contact) {
return contact.isStarred();
}
};
}
private static HasCell<ContactInfo, ContactInfo> createMailTo() {
Cell<ContactInfo> mailToIcon = Cells.adaptWithConstantValue(new TextCell(), "@");
return
HasCells.forCell(
Cells.makeClickable(
mailToIcon,
new Receiver<ContactInfo>() {
public void accept(ContactInfo contact) {
Window.open(
"https://mail.google.com/mail/u/0/"
+ "?view=cm&fs=1&tf=1&source=mailto&to="
+ contact.getFirstName() + "." + contact.getLastName()
+ "@gmail.com",
"_blank",
null);
}
}));
}
}