Use UiRenderer (Uibinder for cells) in MobileWebApp sample. Review at http://gwt-code-reviews.appspot.com/1733805 Review by: rdayal@google.com git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@11035 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/samples/mobilewebapp/src/main/java/com/google/gwt/sample/mobilewebapp/client/desktop/DesktopTaskEditView.css b/samples/mobilewebapp/src/main/java/com/google/gwt/sample/mobilewebapp/client/desktop/DesktopTaskEditView.css deleted file mode 100644 index a449793..0000000 --- a/samples/mobilewebapp/src/main/java/com/google/gwt/sample/mobilewebapp/client/desktop/DesktopTaskEditView.css +++ /dev/null
@@ -1,10 +0,0 @@ -.taskTemplateCell { - margin: 8px; - border: 1px solid #666; - -moz-border-radius: 8px; - border-radius: 8px; - padding: 18px 10px; - font-size: 12pt; - background-color: #eee; - -webkit-user-drag: element; -}
diff --git a/samples/mobilewebapp/src/main/java/com/google/gwt/sample/mobilewebapp/client/desktop/DesktopTaskEditView.java b/samples/mobilewebapp/src/main/java/com/google/gwt/sample/mobilewebapp/client/desktop/DesktopTaskEditView.java index 81d6677..aec30cd 100644 --- a/samples/mobilewebapp/src/main/java/com/google/gwt/sample/mobilewebapp/client/desktop/DesktopTaskEditView.java +++ b/samples/mobilewebapp/src/main/java/com/google/gwt/sample/mobilewebapp/client/desktop/DesktopTaskEditView.java
@@ -29,12 +29,9 @@ import com.google.gwt.event.dom.client.DragLeaveHandler; import com.google.gwt.event.dom.client.DragOverEvent; import com.google.gwt.event.dom.client.DragOverHandler; +import com.google.gwt.event.dom.client.DragStartEvent; import com.google.gwt.event.dom.client.DropEvent; import com.google.gwt.event.dom.client.DropHandler; -import com.google.gwt.resources.client.ClientBundle; -import com.google.gwt.resources.client.CssResource; -import com.google.gwt.safehtml.client.SafeHtmlTemplates; -import com.google.gwt.safehtml.shared.SafeHtml; import com.google.gwt.safehtml.shared.SafeHtmlBuilder; import com.google.gwt.sample.mobilewebapp.client.ui.DateButton; import com.google.gwt.sample.mobilewebapp.client.ui.EditorDecorator; @@ -43,6 +40,9 @@ import com.google.gwt.sample.mobilewebapp.shared.TaskProxyImpl; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.uibinder.client.UiHandler; +import com.google.gwt.uibinder.client.UiRenderer; +import com.google.gwt.uibinder.client.UiTemplate; import com.google.gwt.user.cellview.client.CellList; import com.google.gwt.user.cellview.client.HasKeyboardSelectionPolicy.KeyboardSelectionPolicy; import com.google.gwt.user.client.ui.Button; @@ -71,55 +71,39 @@ } /** - * A ClientBundle that provides images for this widget. - */ - interface Resources extends ClientBundle { - @Source("DesktopTaskEditView.css") - Style style(); - } - - /** - * The styles used in this widget. - */ - interface Style extends CssResource { - /** - * Applies to the cells in the task template list. - */ - String taskTemplateCell(); - } - - /** * The cell used to render task templates. */ static class TaskTemplateCell extends AbstractCell<TaskProxy> { - interface Template extends SafeHtmlTemplates { - @SafeHtmlTemplates.Template("<div class=\"{0}\" draggable=\"true\">" - + "{1}<div style=\"font-size:80%;\">{2}</div></div>") - SafeHtml task(String className, String name, String notes); + /** + * Use a UiBinder template to generate the {@code Cell} contents and process + * events. + */ + @UiTemplate("TaskTemplateCell.ui.xml") + interface Renderer extends UiRenderer { + void render(SafeHtmlBuilder sb, String name, String notes); + void onBrowserEvent(TaskTemplateCell o, NativeEvent n, Element e, Context context); } - private Template template = GWT.create(Template.class); - private final String className; + private Renderer renderer = GWT.create(Renderer.class); - public TaskTemplateCell(String className) { + public TaskTemplateCell() { + // Register the kinds of event this cell will manage. super("dragstart"); - this.className = className; } + /** + * Delegates event handling to the generated {@link UiRenderer}. + */ @Override public void onBrowserEvent(Context context, Element parent, TaskProxy value, NativeEvent event, ValueUpdater<TaskProxy> valueUpdater) { - if ("dragstart".equals(event.getType())) { - // Save the ID of the TaskProxy. - DataTransfer dataTransfer = event.getDataTransfer(); - dataTransfer.setData("text", String.valueOf(context.getIndex())); - - // Set the image. - dataTransfer.setDragImage(parent, 25, 15); - } + renderer.onBrowserEvent(this, event, parent, context); } + /** + * Delegates the cell rendering to the generated {@link UiRenderer}. + */ @Override public void render(Context context, TaskProxy value, SafeHtmlBuilder sb) { if (value == null) { @@ -127,7 +111,20 @@ } String notes = value.getNotes(); - sb.append(template.task(className, value.getName(), (notes == null) ? "" : notes)); + renderer.render(sb, value.getName(), (notes == null) ? "" : notes); + } + + /** + * Handles "drag-start" events inside the element named "root". + */ + @UiHandler({"root"}) + void onDragStart(DragStartEvent event, Element parent, Context context) { + // Save the ID of the TaskProxy. + DataTransfer dataTransfer = event.getDataTransfer(); + dataTransfer.setData("text", String.valueOf(context.getIndex())); + + // Set the image. + dataTransfer.setDragImage(parent, 25, 15); } } @@ -203,16 +200,10 @@ */ private Presenter presenter; - private final Resources resources; - /** * Construct a new {@link DesktopTaskEditView}. */ public DesktopTaskEditView() { - // Initialize the styles. - resources = GWT.create(Resources.class); - resources.style().ensureInjected(); - // Create the template list. templateList = createTaskTemplateList(); @@ -316,7 +307,7 @@ private CellList<TaskProxy> createTaskTemplateList() { CellList<TaskProxy> list = - new CellList<TaskProxy>(new TaskTemplateCell(resources.style().taskTemplateCell())); + new CellList<TaskProxy>(new TaskTemplateCell()); list.setKeyboardSelectionPolicy(KeyboardSelectionPolicy.DISABLED); // Create the templates.
diff --git a/samples/mobilewebapp/src/main/java/com/google/gwt/sample/mobilewebapp/client/desktop/TaskTemplateCell.ui.xml b/samples/mobilewebapp/src/main/java/com/google/gwt/sample/mobilewebapp/client/desktop/TaskTemplateCell.ui.xml new file mode 100644 index 0000000..4a421a7 --- /dev/null +++ b/samples/mobilewebapp/src/main/java/com/google/gwt/sample/mobilewebapp/client/desktop/TaskTemplateCell.ui.xml
@@ -0,0 +1,23 @@ +<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent"> +<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"> + <ui:style> + .taskTemplateCell { + margin: 8px; + border: 1px solid #666; + -moz-border-radius: 8px; + border-radius: 8px; + padding: 18px 10px; + font-size: 12pt; + background-color: #eee; + -webkit-user-drag: element; + } + </ui:style> + + <ui:with field="name" type="java.lang.String"/> + <ui:with field="notes" type="java.lang.String"/> + + <div ui:field="root" class="{style.taskTemplateCell}" draggable="true"> + <ui:text from="{name}"/> + <div style="font-size:80%;"><ui:text from="{notes}"/></div> + </div> +</ui:UiBinder>
diff --git a/samples/mobilewebapp/src/main/java/com/google/gwt/sample/mobilewebapp/client/mobile/TaskProxyCell.java b/samples/mobilewebapp/src/main/java/com/google/gwt/sample/mobilewebapp/client/mobile/TaskProxyCell.java index d46aad5..d3e524f 100644 --- a/samples/mobilewebapp/src/main/java/com/google/gwt/sample/mobilewebapp/client/mobile/TaskProxyCell.java +++ b/samples/mobilewebapp/src/main/java/com/google/gwt/sample/mobilewebapp/client/mobile/TaskProxyCell.java
@@ -19,43 +19,55 @@ import com.google.gwt.core.client.GWT; import com.google.gwt.i18n.client.DateTimeFormat; import com.google.gwt.i18n.client.DateTimeFormat.PredefinedFormat; -import com.google.gwt.safehtml.client.SafeHtmlTemplates; +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.safehtml.shared.SafeHtmlUtils; import com.google.gwt.sample.mobilewebapp.shared.TaskProxy; +import com.google.gwt.uibinder.client.UiRenderer; import java.util.Date; /** * A {@link com.google.gwt.cell.client.Cell} used to render a {@link TaskProxy}. + * Uses a UiRenderer to generate the cell contents. */ class TaskProxyCell extends AbstractCell<TaskProxy> { /** - * The template used by this cell. - * + * Use a UiBinder template to render this cell. */ - interface Template extends SafeHtmlTemplates { - @SafeHtmlTemplates.Template("{0}<div style=\"font-size:80%;\"> </div>") - SafeHtml noDate(SafeHtml name); + interface Renderer extends UiRenderer { + /** + * Retrieves the CSS resource defined in the template. + */ + CellStyle getCellStyle(); - @SafeHtmlTemplates.Template("{0}<div style=\"font-size:80%;color:#999;\">Due: {1}</div>") - SafeHtml onTime(SafeHtml name, String date); - - @SafeHtmlTemplates.Template("{0}<div style=\"font-size:80%;color:red;\">Due: {1}</div>") - SafeHtml pastDue(SafeHtml name, String date); + /** + * Renders the cell contents into {@code sb}, filling in {@name}, + * {@code date}, and the CSS {@code dateStyle}. + */ + void render(SafeHtmlBuilder sb, SafeHtml name, String date, String dateStyle); } - private static Template template; + interface CellStyle extends CssResource { + String noDate(); + String onTime(); + String pastDue(); + } + private final DateTimeFormat dateFormat = DateTimeFormat.getFormat(PredefinedFormat.DATE_LONG); + private final Renderer renderer; + public TaskProxyCell() { - if (template == null) { - template = GWT.create(Template.class); - } + renderer = GWT.<Renderer>create(Renderer.class); } + /** + * Renders the cell contents. Delegates the actual rendering to the + * UiRenderer decined in the template. + */ @Override @SuppressWarnings("deprecation") public void render(com.google.gwt.cell.client.Cell.Context context, TaskProxy value, @@ -77,11 +89,11 @@ today.setMinutes(0); today.setSeconds(0); if (date == null) { - sb.append(template.noDate(name)); + renderer.render(sb, name, " ", renderer.getCellStyle().noDate()); } else if (date.before(today)) { - sb.append(template.pastDue(name, dateFormat.format(date))); + renderer.render(sb, name, dateFormat.format(date), renderer.getCellStyle().pastDue()); } else { - sb.append(template.onTime(name, dateFormat.format(date))); + renderer.render(sb, name, dateFormat.format(date), renderer.getCellStyle().onTime()); } } }
diff --git a/samples/mobilewebapp/src/main/java/com/google/gwt/sample/mobilewebapp/client/mobile/TaskProxyCell.ui.xml b/samples/mobilewebapp/src/main/java/com/google/gwt/sample/mobilewebapp/client/mobile/TaskProxyCell.ui.xml new file mode 100644 index 0000000..8e4dd52 --- /dev/null +++ b/samples/mobilewebapp/src/main/java/com/google/gwt/sample/mobilewebapp/client/mobile/TaskProxyCell.ui.xml
@@ -0,0 +1,23 @@ +<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent"> +<ui:UiBinder + xmlns:ui="urn:ui:com.google.gwt.uibinder"> + + <ui:style field="cellStyle" + type="com.google.gwt.sample.mobilewebapp.client.mobile.TaskProxyCell.CellStyle"> + .noDate {font-size:80%;} + .onTime {font-size:80%;color:#999;} + .pastDue {font-size:80%;color:red;} + </ui:style> + + <ui:with field="date" type="java.lang.String"/> + <ui:with field="name" type="com.google.gwt.safehtml.shared.SafeHtml"/> + <ui:with field="dateStyle" type="java.lang.String"/> + + <div> + <ui:text from="{name.asString}"/> + <div class="{dateStyle}"> + <ui:text from="{date}"/> + </div> + </div> + +</ui:UiBinder>