/* * Copyright 2009 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.appengine.demos.taskengine.client; import com.google.appengine.demos.taskengine.client.ControlBar.Controls; import com.google.appengine.demos.taskengine.client.Tasks.Controller; import com.google.appengine.demos.taskengine.shared.Task; import com.google.gwt.dom.client.ButtonElement; import com.google.gwt.dom.client.DivElement; import com.google.gwt.dom.client.Document; import com.google.gwt.dom.client.Element; import com.google.gwt.dom.client.InputElement; import com.google.gwt.dom.client.TextAreaElement; import com.google.gwt.resources.client.CssResource; import com.google.gwt.resources.client.ImageResource; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.EventListener; /** * This is UI for viewing the details of a task or adding a new task. */ public class TaskDetails extends Page { /** * Styles for TaskDetails. */ public interface Css extends CssResource { String back(); String field(); String fieldGroup(); String label(); String taskDetails(); } /** * Resources for TaskDetails. */ public interface Resources extends ControlBar.Resources, LabelMatrix.Resources { @Source("resources/back.png") ImageResource back(); @Source("resources/TaskDetails.css") TaskDetails.Css taskDetailsCss(); } /** * Creates the controls to be added to a TaskDetails. */ public static Controls createControls(final Controller controller, TaskDetails.Resources resources) { TaskDetails.Css css = resources.taskDetailsCss(); // Setup the controls that will be added to the top bar of the TaskDetails // page. Controls controls = new Controls(resources); controls.addControl(css.back(), new EventListener() { public void onBrowserEvent(Event event) { controller.goToTaskList(); } }); return controls; } private final ButtonElement cancelButton; private final Controller controller; private Task currentTask; private final TextAreaElement detailsField; private final LabelMatrix labelMatrix; private final TaskDetails.Resources resources; private final ButtonElement saveButton; private final InputElement titleField; protected TaskDetails(PageTransitionPanel parent, Controls controls, Controller controller, TaskDetails.Resources resources) { super(parent, controls, resources); this.resources = resources; this.controller = controller; Element contentElem = getContentContainer(); contentElem.setClassName(resources.taskDetailsCss().taskDetails()); // We build up our Task Form titleField = Document.get().createElement("input").cast(); contentElem.appendChild(createLabelledFieldGroup("*Title:", titleField)); labelMatrix = new LabelMatrix(getContentContainer(), resources); contentElem.appendChild(createLabelledFieldGroup("*Label:", labelMatrix.getElement())); detailsField = Document.get().createTextAreaElement(); contentElem.appendChild(createLabelledFieldGroup("Details:", detailsField)); saveButton = Document.get().createPushButtonElement(); saveButton.getStyle().setPropertyPx("marginLeft", 15); cancelButton = Document.get().createPushButtonElement(); cancelButton.getStyle().setPropertyPx("marginLeft", 75); cancelButton.setInnerText("Cancel"); contentElem.appendChild(cancelButton); contentElem.appendChild(saveButton); // create and attach event listeners hookEventListeners(); } /** * Brings focus to the titleField. */ public void setFocus() { titleField.focus(); } /** * Displays the details of a Task. If no task is specified then we assume we * are creating a new Task. * * @param task the {@link Task} we are viewing the details of. If this is * null then we assume we are creating a new Task. */ public void view(Task task) { currentTask = task; // Set the text correctly on the buttons if (task != null) { saveButton.setInnerText("Save Task"); populateFields(); } else { saveButton.setInnerText("Add Task"); resetFields(); } } private DivElement createLabelledFieldGroup(String labelText, Element field) { DivElement fieldGroup = Document.get().createDivElement(); fieldGroup.setClassName(resources.taskDetailsCss().fieldGroup()); DivElement label = Document.get().createDivElement(); label.setInnerText(labelText); label.setClassName(resources.taskDetailsCss().label()); field.setClassName(resources.taskDetailsCss().field()); fieldGroup.appendChild(label); fieldGroup.appendChild(field); return fieldGroup; } private void hookEventListeners() { DomUtils.addEventListener("click", cancelButton, new EventListener() { public void onBrowserEvent(Event event) { controller.goToTaskList(); } }); DomUtils.addEventListener("click", saveButton, new EventListener() { public void onBrowserEvent(Event event) { if (currentTask == null) { // We have a new Task currentTask = new Task("", titleField.getValue(), detailsField.getValue(), labelMatrix.getCurrentLabelPriority(), false); if (validateFields(currentTask)) { controller.addNewTask(currentTask); } else { currentTask = null; } } else { // We are editing a task int oldPriority = currentTask.getLabelPriority(); currentTask.setTitle(titleField.getValue()); currentTask.setDetails(detailsField.getValue()); currentTask.setLabelPriority(labelMatrix.getCurrentLabelPriority()); if (validateFields(currentTask)) { controller.updateTask(currentTask, oldPriority); } } } }); } private void populateFields() { titleField.setValue(currentTask.getTitle()); detailsField.setValue(currentTask.getDetails()); labelMatrix.setLabelPriority(currentTask.getLabelPriority()); } private void resetFields() { titleField.setValue(""); detailsField.setValue(""); labelMatrix.setLabelPriority(-1); labelMatrix.showColorChooser(); } private boolean validateFields(Task potentialTask) { // Title and Label must be set. if (potentialTask.getTitle().equals("") || potentialTask.getLabelPriority() < 0) { DomUtils.getWindow().alert("Title and Label must be filled in."); return false; } else { return true; } } }