com.google.gwt.sample.mobilewebapp.client.desktop.DesktopTaskEditView.java Source code

Java tutorial

Introduction

Here is the source code for com.google.gwt.sample.mobilewebapp.client.desktop.DesktopTaskEditView.java

Source

/*
 * Copyright 2011 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.sample.mobilewebapp.client.desktop;

import com.google.gwt.cell.client.AbstractCell;
import com.google.gwt.cell.client.ValueUpdater;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.DataTransfer;
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.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.DragDropEventBase;
import com.google.gwt.event.dom.client.DragLeaveEvent;
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.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;
import com.google.gwt.sample.mobilewebapp.presenter.task.TaskEditView;
import com.google.gwt.sample.mobilewebapp.shared.TaskProxy;
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.user.cellview.client.CellList;
import com.google.gwt.user.cellview.client.HasKeyboardSelectionPolicy.KeyboardSelectionPolicy;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.DecoratedPopupPanel;
import com.google.gwt.user.client.ui.DockLayoutPanel;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.PopupPanel;
import com.google.gwt.user.client.ui.TextBoxBase;
import com.google.gwt.user.client.ui.Widget;
import com.google.web.bindery.requestfactory.gwt.client.RequestFactoryEditorDriver;

import java.util.ArrayList;
import java.util.List;

/**
 * View used to edit a task.
 */
public class DesktopTaskEditView extends Composite implements TaskEditView {

    /**
     * The UiBinder interface.
     */
    interface DesktopTaskEditViewUiBinder extends UiBinder<Widget, DesktopTaskEditView> {
    }

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

        private Template template = GWT.create(Template.class);
        private final String className;

        public TaskTemplateCell(String className) {
            super("dragstart");
            this.className = className;
        }

        @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);
            }
        }

        @Override
        public void render(Context context, TaskProxy value, SafeHtmlBuilder sb) {
            if (value == null) {
                return;
            }

            String notes = value.getNotes();
            sb.append(template.task(className, value.getName(), (notes == null) ? "" : notes));
        }
    }

    interface Driver extends RequestFactoryEditorDriver<TaskProxy, DesktopTaskEditView> {
    }

    /**
     * The UiBinder used to generate the view.
     */
    private static DesktopTaskEditViewUiBinder uiBinder = GWT.create(DesktopTaskEditViewUiBinder.class);

    /**
     * The glass panel used to lock the UI.
     */
    private static PopupPanel glassPanel;

    /**
     * Show or hide the glass panel used to lock the UI will the task loads.
     * 
     * @param visible true to show, false to hide
     */
    private static void setGlassPanelVisible(boolean visible) {
        // Initialize the panel.
        if (glassPanel == null) {
            glassPanel = new DecoratedPopupPanel(false, true);
            glassPanel.setWidget(new Label("Loading..."));
        }

        if (visible) {
            // Show the loading panel.
            glassPanel.center();
        } else {
            // Hide the loading panel.
            glassPanel.hide();
        }
    }

    @UiField
    DockLayoutPanel dockLayoutPanel;

    /**
     * The panel that contains the edit form.
     */
    @UiField
    HTMLPanel editForm;

    @UiField
    Button deleteButton;
    @UiField
    DateButton dueDateEditor;
    final EditorDecorator<String> nameEditor;
    @UiField
    @Ignore
    TextBoxBase nameField;
    @UiField
    Element nameViolation;
    @UiField
    TextBoxBase notesEditor;
    @UiField
    Button saveButton;

    @UiField(provided = true)
    final CellList<TaskProxy> templateList;

    @UiField
    Widget templateListContainer;

    private final Driver driver = GWT.create(Driver.class);

    /**
     * The {@link TaskEditView.Presenter} for this view.
     */
    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();

        initWidget(uiBinder.createAndBindUi(this));
        nameEditor = EditorDecorator.create(nameField.asEditor(), nameViolation);
        driver.initialize(this);

        // Hide the template list if it isn't supported.
        if (!DragDropEventBase.isSupported()) {
            dockLayoutPanel.setWidgetSize(templateListContainer, 0);
        }

        // Create a new task or modify the current task when done is pressed.
        saveButton.addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent event) {
                if (presenter != null) {
                    presenter.saveTask();
                }
            }
        });

        // Delete the current task or cancel when delete is pressed.
        deleteButton.addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent event) {
                if (presenter != null) {
                    presenter.deleteTask();
                }
            }
        });

        // Add the form as a drop target.
        editForm.addDomHandler(new DragOverHandler() {
            public void onDragOver(DragOverEvent event) {
                // Highlight the name and notes box.
                nameField.getElement().getStyle().setBackgroundColor("#ffa");
                notesEditor.getElement().getStyle().setBackgroundColor("#ffa");
            }
        }, DragOverEvent.getType());
        editForm.addDomHandler(new DragLeaveHandler() {
            public void onDragLeave(DragLeaveEvent event) {
                EventTarget eventTarget = event.getNativeEvent().getEventTarget();
                if (!Element.is(eventTarget)) {
                    return;
                }
                Element target = Element.as(eventTarget);

                if (target == editForm.getElement()) {
                    // Un-highlight the name and notes box.
                    nameField.getElement().getStyle().clearBackgroundColor();
                    notesEditor.getElement().getStyle().clearBackgroundColor();
                }
            }
        }, DragLeaveEvent.getType());
        editForm.addDomHandler(new DropHandler() {
            public void onDrop(DropEvent event) {
                // Prevent the default text drop.
                event.preventDefault();

                // Un-highlight the name and notes box.
                nameField.getElement().getStyle().clearBackgroundColor();
                notesEditor.getElement().getStyle().clearBackgroundColor();

                // Fill in the form.
                try {
                    // Get the template the from the data transfer object.
                    DataTransfer dataTransfer = event.getNativeEvent().getDataTransfer();
                    int templateIndex = Integer.parseInt(dataTransfer.getData("text"));
                    TaskProxy template = templateList.getVisibleItem(templateIndex);
                    nameField.setValue(template.getName());
                    notesEditor.setValue(template.getNotes());
                } catch (NumberFormatException e) {
                    // The user probably dragged something other than a template.
                }
            }
        }, DropEvent.getType());
    }

    public RequestFactoryEditorDriver<TaskProxy, ?> getEditorDriver() {
        return driver;
    }

    public void setEditing(boolean isEditing) {
        if (isEditing) {
            deleteButton.setText("Delete item");
        } else {
            deleteButton.setText("Cancel");
        }
    }

    public void setLocked(boolean locked) {
        setGlassPanelVisible(locked);
    }

    public void setNameViolation(String message) {
        nameViolation.setInnerText(message);
    }

    public void setPresenter(Presenter presenter) {
        this.presenter = presenter;
    }

    private CellList<TaskProxy> createTaskTemplateList() {
        CellList<TaskProxy> list = new CellList<TaskProxy>(
                new TaskTemplateCell(resources.style().taskTemplateCell()));
        list.setKeyboardSelectionPolicy(KeyboardSelectionPolicy.DISABLED);

        // Create the templates.
        List<TaskProxy> templates = new ArrayList<TaskProxy>();
        templates.add(new TaskProxyImpl("Call mom", null));
        templates.add(new TaskProxyImpl("Register to vote", "Where is my polling location again?"));
        templates.add(new TaskProxyImpl("Replace air filter", "Size: 24x13x1"));
        templates.add(new TaskProxyImpl("Take out the trash", null));
        list.setRowData(templates);

        return list;
    }
}