/** * 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.forms; import java.util.Date; import java.util.List; import com.google.gwt.cell.client.AbstractCell; import com.google.gwt.core.client.EntryPoint; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.event.logical.shared.BeforeSelectionEvent; import com.google.gwt.event.logical.shared.BeforeSelectionHandler; 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.user.client.Window; import com.google.gwt.user.client.ui.IsWidget; import com.google.gwt.user.client.ui.RootPanel; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; import com.google.web.bindery.autobean.shared.AutoBean; import com.google.web.bindery.autobean.shared.AutoBean.PropertyName; import com.google.web.bindery.autobean.shared.AutoBeanFactory; import com.sencha.gxt.cell.core.client.form.ComboBoxCell; import com.sencha.gxt.core.client.IdentityValueProvider; import com.sencha.gxt.core.client.XTemplates; import com.sencha.gxt.data.client.loader.JsoReader; import com.sencha.gxt.data.client.loader.ScriptTagProxy; import com.sencha.gxt.data.client.writer.UrlEncodingWriter; import com.sencha.gxt.data.shared.LabelProvider; import com.sencha.gxt.data.shared.ListStore; import com.sencha.gxt.data.shared.ModelKeyProvider; import com.sencha.gxt.data.shared.PropertyAccess; import com.sencha.gxt.data.shared.loader.BeforeLoadEvent; import com.sencha.gxt.data.shared.loader.BeforeLoadEvent.BeforeLoadHandler; import com.sencha.gxt.data.shared.loader.LoadResultListStoreBinding; import com.sencha.gxt.data.shared.loader.PagingLoadConfig; import com.sencha.gxt.data.shared.loader.PagingLoadResult; import com.sencha.gxt.data.shared.loader.PagingLoader; import com.sencha.gxt.explorer.client.model.Example.Detail; import com.sencha.gxt.widget.core.client.ContentPanel; import com.sencha.gxt.widget.core.client.ListView; import com.sencha.gxt.widget.core.client.form.ComboBox; @Detail(name = "Advanced ComboBox", icon = "advancedcombobox", category = "Combos") public class AdvancedComboBoxExample implements IsWidget, EntryPoint { interface Bundle extends ClientBundle { @Source("AdvancedComboBox.css") ExampleStyle css(); } interface ExampleStyle extends CssResource { String searchItem(); } interface ExampleTemplate extends XTemplates { @XTemplate("<div class='{style.searchItem}'><h3><span>{post.date:date(\"M/d/yyyy\")}<br />by {post.author}</span>{post.title}</h3>{post.excerpt}</div>") SafeHtml render(Forum post, ExampleStyle style); } interface TestAutoBeanFactory extends AutoBeanFactory { static TestAutoBeanFactory instance = GWT.create(TestAutoBeanFactory.class); AutoBean<ForumCollection> dataCollection(); AutoBean<ForumListLoadResult> dataLoadResult(); AutoBean<ForumLoadConfig> loadConfig(); } public interface Forum { @PropertyName("topic_title") public String getTitle(); @PropertyName("topic_id") public String getTopicId(); public String getAuthor(); @PropertyName("forumid") public String getForumId(); @PropertyName("post_text") public String getExcerpt(); @PropertyName("post_id") public String getPostId(); @PropertyName("post_time") public Date getDate(); } interface ForumCollection { String getTotalCount(); List<Forum> getTopics(); } interface ForumLoadConfig extends PagingLoadConfig { String getQuery(); void setQuery(String query); @Override @PropertyName("start") public int getOffset(); @Override @PropertyName("start") public void setOffset(int offset); } interface ForumListLoadResult extends PagingLoadResult<Forum> { void setData(List<Forum> data); @Override @PropertyName("start") public int getOffset(); @Override @PropertyName("start") public void setOffset(int offset); } interface ForumProperties extends PropertyAccess<Forum> { ModelKeyProvider<Forum> topicId(); LabelProvider<Forum> title(); } private ComboBox<Forum> combo; private VerticalPanel vp; public Widget asWidget() { if (vp == null) { vp = new VerticalPanel(); vp.setSpacing(10); String url = "http://www.sencha.com/forum/topics-remote.php"; ScriptTagProxy<ForumLoadConfig> proxy = new ScriptTagProxy<ForumLoadConfig>(url); proxy.setWriter(new UrlEncodingWriter<ForumLoadConfig>(TestAutoBeanFactory.instance, ForumLoadConfig.class)); JsoReader<ForumListLoadResult, ForumCollection> reader = new JsoReader<ForumListLoadResult, ForumCollection>( TestAutoBeanFactory.instance, ForumCollection.class) { @Override protected ForumListLoadResult createReturnData(Object loadConfig, ForumCollection records) { PagingLoadConfig cfg = (PagingLoadConfig) loadConfig; ForumListLoadResult res = TestAutoBeanFactory.instance.dataLoadResult().as(); res.setData(records.getTopics()); res.setOffset(cfg.getOffset()); res.setTotalLength(Integer.parseInt(records.getTotalCount())); return res; } }; PagingLoader<ForumLoadConfig, ForumListLoadResult> loader = new PagingLoader<ForumLoadConfig, ForumListLoadResult>( proxy, reader); loader.useLoadConfig(TestAutoBeanFactory.instance.loadConfig().as()); loader.addBeforeLoadHandler(new BeforeLoadHandler<ForumLoadConfig>() { @Override public void onBeforeLoad(BeforeLoadEvent<ForumLoadConfig> event) { String query = combo.getText(); if (query != null && !query.equals("")) { event.getLoadConfig().setQuery(query); } } }); ForumProperties props = GWT.create(ForumProperties.class); ListStore<Forum> store = new ListStore<Forum>(props.topicId()); loader.addLoadHandler(new LoadResultListStoreBinding<ForumLoadConfig, Forum, ForumListLoadResult>(store)); final Bundle b = GWT.create(Bundle.class); b.css().ensureInjected(); final ExampleTemplate template = GWT.create(ExampleTemplate.class); ListView<Forum, Forum> view = new ListView<Forum, Forum>(store, new IdentityValueProvider<Forum>()); view.setCell(new AbstractCell<Forum>() { @Override public void render(com.google.gwt.cell.client.Cell.Context context, Forum value, SafeHtmlBuilder sb) { sb.append(template.render(value, b.css())); } }); ComboBoxCell<Forum> cell = new ComboBoxCell<Forum>(store, props.title(), view); combo = new ComboBox<Forum>(cell); combo.setLoader(loader); combo.setWidth(580); combo.setHideTrigger(true); combo.setPageSize(10); combo.addBeforeSelectionHandler(new BeforeSelectionHandler<Forum>() { @Override public void onBeforeSelection(BeforeSelectionEvent<Forum> event) { event.cancel(); Forum f = combo.getListView().getSelectionModel().getSelectedItem(); Window.open("http://sencha.com/forum/showthread.php?t=" + f.getTopicId() + "&p=" + f.getPostId(), null, null); } }); combo.getElement().getStyle().setMargin(10, Unit.PX); ContentPanel cp = new ContentPanel(); cp.setWidth(600); cp.setHeadingText("Search the Sencha Forums"); cp.add(combo); cp.setResize(false); vp.add(cp); } return vp; } public void onModuleLoad() { RootPanel.get().add(asWidget()); } }