/**
* Sencha GXT 3.0.0b - Sencha for GWT
* Copyright(c) 2007-2012, Sencha, Inc.
* licensing@sencha.com
*
* http://www.sencha.com/products/gxt/license/
*/
package com.sencha.gxt.explorer.client.view;
import java.util.List;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.resources.client.ClientBundle;
import com.google.gwt.resources.client.CssResource;
import com.google.gwt.safehtml.shared.SafeHtml;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.text.shared.AbstractSafeHtmlRenderer;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.IsWidget;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.Widget;
import com.sencha.gxt.cell.core.client.SimpleSafeHtmlCell;
import com.sencha.gxt.core.client.IdentityValueProvider;
import com.sencha.gxt.core.client.XTemplates;
import com.sencha.gxt.core.client.XTemplates.Formatter;
import com.sencha.gxt.core.client.XTemplates.FormatterFactories;
import com.sencha.gxt.core.client.XTemplates.FormatterFactory;
import com.sencha.gxt.core.client.resources.CommonStyles;
import com.sencha.gxt.core.client.util.Format;
import com.sencha.gxt.data.client.loader.RpcProxy;
import com.sencha.gxt.data.shared.ListStore;
import com.sencha.gxt.data.shared.ModelKeyProvider;
import com.sencha.gxt.data.shared.loader.ListStoreBinding;
import com.sencha.gxt.data.shared.loader.Loader;
import com.sencha.gxt.examples.resources.client.ExampleService;
import com.sencha.gxt.examples.resources.client.ExampleServiceAsync;
import com.sencha.gxt.examples.resources.client.model.Photo;
import com.sencha.gxt.explorer.client.model.Example.Detail;
import com.sencha.gxt.widget.core.client.FramedPanel;
import com.sencha.gxt.widget.core.client.ListView;
import com.sencha.gxt.widget.core.client.ListViewCustomAppearance;
import com.sencha.gxt.widget.core.client.selection.SelectionChangedEvent;
import com.sencha.gxt.widget.core.client.selection.SelectionChangedEvent.SelectionChangedHandler;
@Detail(name = "ListView", icon = "listview", category = "Templates & Lists", files = {
"ListViewExample.html", "ListViewExample.css"})
public class ListViewExample implements IsWidget, EntryPoint {
@FormatterFactories(@FormatterFactory(factory = ShortenFactory.class, name = "shorten"))
interface Renderer extends XTemplates {
@XTemplate(source = "ListViewExample.html")
public SafeHtml renderItem(Photo photo, Style style);
}
interface Resources extends ClientBundle {
@Source("ListViewExample.css")
Style css();
}
static class Shorten implements Formatter<String> {
private int length;
public Shorten(int length) {
this.length = length;
}
@Override
public String format(String data) {
return Format.ellipse(data, length);
}
}
static class ShortenFactory {
public static Shorten getFormat(int length) {
return new Shorten(length);
}
}
interface Style extends CssResource {
String over();
String select();
String thumb();
String thumbWrap();
}
public Widget asWidget() {
final ExampleServiceAsync service = GWT.create(ExampleService.class);
RpcProxy<Object, List<Photo>> proxy = new RpcProxy<Object, List<Photo>>() {
@Override
public void load(Object loadConfig, AsyncCallback<List<Photo>> callback) {
service.getPhotos(callback);
}
};
Loader<Object, List<Photo>> loader = new Loader<Object, List<Photo>>(proxy);
ModelKeyProvider<Photo> kp = new ModelKeyProvider<Photo>() {
@Override
public String getKey(Photo item) {
return item.getName();
}
};
ListStore<Photo> store = new ListStore<Photo>(kp);
loader.addLoadHandler(new ListStoreBinding<Object, Photo, List<Photo>>(store));
loader.load();
final FramedPanel panel = new FramedPanel();
panel.setCollapsible(true);
panel.setAnimCollapse(false);
panel.setId("images-view2");
panel.setHeadingText("Simple ListView (0 items selected)");
panel.setWidth(535);
panel.setBodyBorder(false);
final Resources resources = GWT.create(Resources.class);
resources.css().ensureInjected();
final Style style = resources.css();
final Renderer r = GWT.create(Renderer.class);
ListViewCustomAppearance<Photo> appearance = new ListViewCustomAppearance<Photo>("." + style.thumbWrap(),
style.over(), style.select()) {
@Override
public void renderEnd(SafeHtmlBuilder builder) {
String markup = new StringBuilder("<div class=\"").append(CommonStyles.get().clear()).append("\"></div>").toString();
builder.appendHtmlConstant(markup);
}
@Override
public void renderItem(SafeHtmlBuilder builder, SafeHtml content) {
builder.appendHtmlConstant("<div class='" + style.thumbWrap() + "' style='border: 1px solid white'>");
builder.append(content);
builder.appendHtmlConstant("</div>");
}
};
ListView<Photo, Photo> view = new ListView<Photo, Photo>(store, new IdentityValueProvider<Photo>() {
@Override
public void setValue(Photo object, Photo value) {
}
}, appearance);
view.setCell(new SimpleSafeHtmlCell<Photo>(new AbstractSafeHtmlRenderer<Photo>() {
@Override
public SafeHtml render(Photo object) {
return r.renderItem(object, style);
}
}));
view.getSelectionModel().addSelectionChangedHandler(new SelectionChangedHandler<Photo>() {
@Override
public void onSelectionChanged(SelectionChangedEvent<Photo> event) {
panel.setHeadingText("Simple ListView (" + event.getSelection().size() + " items selected)");
}
});
panel.add(view);
panel.addStyleName("margin-10");
return panel;
}
public void onModuleLoad() {
RootPanel.get().add(asWidget());
}
}