accelerator.client.view.desktop.DesktopTaskListView.java Source code

Java tutorial

Introduction

Here is the source code for accelerator.client.view.desktop.DesktopTaskListView.java

Source

/**
 * Task Accelerator - Full ajax task management application run on Google App Engine -
 * Copyright (C) 2011 tnakamura
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation;
 * either version 3 of the License, or (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty
 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */
package accelerator.client.view.desktop;

import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;

import accelerator.client.presenter.InboxPresenter;
import accelerator.client.presenter.ProjectPresenter;
import accelerator.client.ui.TaskDialogBox;
import accelerator.client.ui.cell.IconButtonCell;
import accelerator.client.ui.cell.StyleCompositeCell;
import accelerator.client.ui.widget.IconButton;
import accelerator.client.ui.widget.JQueryUI;
import accelerator.client.view.TaskListView;
import accelerator.shared.model.Project;
import accelerator.shared.model.Tag;
import accelerator.shared.model.Task;
import accelerator.shared.util.CollectionUtil;

import com.google.appengine.api.datastore.Key;
import com.google.gwt.cell.client.Cell;
import com.google.gwt.cell.client.CheckboxCell;
import com.google.gwt.cell.client.FieldUpdater;
import com.google.gwt.cell.client.HasCell;
import com.google.gwt.cell.client.SafeHtmlCell;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.safehtml.shared.SafeHtml;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
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.user.cellview.client.CellList;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.view.client.MultiSelectionModel;
import com.google.gwt.view.client.SelectionChangeEvent;

/**
 * ?
 */
public class DesktopTaskListView extends Composite implements TaskListView {

    private static TaskListViewUiBinder uiBinder = GWT.create(TaskListViewUiBinder.class);

    interface TaskListViewUiBinder extends UiBinder<Widget, DesktopTaskListView> {
    }

    /**
     * CompositCell ? HasCell ?????
     * 
     * @param handler
     *            ????????
     * @return HasCell ?
     */
    private List<HasCell<Task, ?>> createHasCellList() {
        List<HasCell<Task, ?>> hasCellList = CollectionUtil.createArrayList();
        // ??
        hasCellList.add(new HasCell<Task, Boolean>() {
            private final CheckboxCell cell = new CheckboxCell();

            public Cell<Boolean> getCell() {
                return cell;
            }

            public FieldUpdater<Task, Boolean> getFieldUpdater() {
                return new FieldUpdater<Task, Boolean>() {
                    public void update(int index, Task object, Boolean value) {
                        object.setCompleted(value);
                        DesktopTaskListView.this.presenter.updateTask(object);
                    }
                };
            }

            public Boolean getValue(Task object) {
                return object.getCompleted();
            }

        });
        // ?
        hasCellList.add(new HasCell<Task, SafeHtml>() {
            private final SafeHtmlCell cell = new SafeHtmlCell();

            public Cell<SafeHtml> getCell() {
                return cell;
            }

            public FieldUpdater<Task, SafeHtml> getFieldUpdater() {
                return null;
            }

            public SafeHtml getValue(Task object) {
                SafeHtmlBuilder sb = new SafeHtmlBuilder();

                // ????????????
                if (presenter instanceof InboxPresenter) {
                    return sb.toSafeHtml();
                } else if (presenter instanceof ProjectPresenter) {
                    return sb.toSafeHtml();
                }

                Key projectKey = object.getProject();
                if ((projectKey != null) && projectList.containsKey(projectKey)) {
                    Project p = projectList.get(projectKey);
                    sb.appendHtmlConstant("<span class=\"project\">");
                    sb.appendEscaped(p.getName());
                    sb.appendEscaped(":");
                    sb.appendHtmlConstant("</span>");
                }
                return sb.toSafeHtml();
            }
        });
        // ???
        hasCellList.add(new HasCell<Task, SafeHtml>() {
            private final SafeHtmlCell cell = new SafeHtmlCell();

            public Cell<SafeHtml> getCell() {
                return cell;
            }

            public FieldUpdater<Task, SafeHtml> getFieldUpdater() {
                return null;
            }

            public SafeHtml getValue(Task object) {
                SafeHtmlBuilder sb = new SafeHtmlBuilder();
                if (object.getCompleted()) {
                    sb.appendHtmlConstant("<s>");
                    sb.appendEscaped(object.getName());
                    sb.appendHtmlConstant("</s>");
                } else {
                    sb.appendEscaped(object.getName());
                }
                return sb.toSafeHtml();
            }

        });
        // ?
        hasCellList.add(new HasCell<Task, String>() {
            private final IconButtonCell cell = new IconButtonCell();

            public Cell<String> getCell() {
                cell.setIcon(JQueryUI.UI_ICON_CLOSE);
                return cell;
            }

            public FieldUpdater<Task, String> getFieldUpdater() {
                return new FieldUpdater<Task, String>() {
                    public void update(int index, Task object, String value) {
                        List<Task> tasks = CollectionUtil.createArrayList();
                        tasks.add(object);
                        DesktopTaskListView.this.presenter.deleteTask(tasks);
                    }
                };
            }

            public String getValue(Task object) {
                return "?";
            }
        });
        // ?
        hasCellList.add(new HasCell<Task, String>() {
            private final IconButtonCell cell = new IconButtonCell();

            public Cell<String> getCell() {
                cell.setIcon(JQueryUI.UI_ICON_PENCIL);
                return cell;
            }

            public FieldUpdater<Task, String> getFieldUpdater() {
                return new FieldUpdater<Task, String>() {
                    public void update(int index, Task object, String value) {
                        DesktopTaskListView.this.editTask(object);
                    }
                };
            }

            public String getValue(Task object) {
                return "?";
            }
        });
        // ??
        hasCellList.add(new HasCell<Task, SafeHtml>() {
            private final SafeHtmlCell cell = new SafeHtmlCell();
            private final DateTimeFormat format = DateTimeFormat.getFormat("yyyyMMdd");

            public Cell<SafeHtml> getCell() {
                return cell;
            }

            public FieldUpdater<Task, SafeHtml> getFieldUpdater() {
                return null;
            }

            public SafeHtml getValue(Task object) {
                SafeHtmlBuilder sb = new SafeHtmlBuilder();
                Date d = object.getDueDate();
                if (d != null) {
                    sb.appendHtmlConstant("<span class=\"duedate\">");
                    sb.appendEscaped(format.format(d));
                    sb.appendHtmlConstant("</span>");
                }
                return sb.toSafeHtml();
            }
        });
        // ??
        hasCellList.add(new HasCell<Task, SafeHtml>() {
            private final SafeHtmlCell cell = new SafeHtmlCell();

            public Cell<SafeHtml> getCell() {
                return cell;
            }

            public FieldUpdater<Task, SafeHtml> getFieldUpdater() {
                return null;
            }

            public SafeHtml getValue(Task object) {
                SafeHtmlBuilder sb = new SafeHtmlBuilder();
                if (DesktopTaskListView.this.tagMap != null) {
                    List<Key> tagKeys = object.getTags();
                    for (Key tagKey : tagKeys) {
                        if (DesktopTaskListView.this.tagMap.containsKey(tagKey)) {
                            Tag tag = DesktopTaskListView.this.tagMap.get(tagKey);
                            sb.appendHtmlConstant("<span class=\"tag\">");
                            sb.appendEscaped(tag.getName());
                            sb.appendHtmlConstant("</span>");
                        }
                    }
                }
                return sb.toSafeHtml();
            }
        });
        return hasCellList;
    }

    /**
     * ????
     */
    private class TaskCell extends StyleCompositeCell<Task> {
        public TaskCell() {
            super(createHasCellList());
            setStyleName("taskcell");
        }
    }

    /**
     * ??
     */
    private Presenter presenter;

    @UiField
    ScrollPanel scrollPanel;

    /**
     * ?
     */
    @UiField
    IconButton createTaskButton;

    /**
     * 
     */
    @UiField
    IconButton editTaskButton;

    /**
     * 
     */
    @UiField
    IconButton deleteTaskButton;

    /**
     * TaskDialogBox ???
     */
    private final Map<Key, Project> projectList = CollectionUtil.createHashMap();

    /**
     * TaskDialogBox ???
     */
    private final Map<Key, Tag> tagMap = CollectionUtil.createHashMap();

    /**
     * Task ? CellList
     */
    private final CellList<Task> taskCellList;

    /**
     * ?
     */
    private final TaskCell taskCell = new TaskCell();

    /**
     * ????? MultiSelectionModel
     */
    private final MultiSelectionModel<Task> selectionModel = new MultiSelectionModel<Task>();;

    /**
     * 
     */
    public DesktopTaskListView() {
        initWidget(uiBinder.createAndBindUi(this));

        taskCellList = new CellList<Task>(taskCell);
        taskCellList.setStyleName("taskcelllist", true);
        taskCellList.setSelectionModel(selectionModel);
        scrollPanel.add(taskCellList);

        selectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
            public void onSelectionChange(SelectionChangeEvent event) {
                updateToolBar();
            }
        });
    }

    /**
     * {@inheritDoc}
     */
    public void setPresenter(Presenter presenter) {
        this.presenter = presenter;
    }

    @UiHandler("createTaskButton")
    void onCreateTaskButtonClick(ClickEvent e) {
        assert projectList != null;
        assert tagMap != null;

        final TaskDialogBox dialog = TaskDialogBox.createDialog(TaskDialogBox.NEW_TASK_TITLE,
                CollectionUtil.createArrayList(projectList.values()),
                CollectionUtil.createArrayList(tagMap.values()), new TaskDialogBox.Handler() {
                    public void onOk(Task input) {
                        presenter.createTask(input);
                    }
                });
        dialog.center();
    }

    /**
     * ???????
     * 
     * @param e
     *            
     */
    @UiHandler("editTaskButton")
    void onEditTaskButtonClick(ClickEvent e) {
        Set<Task> taskSet = selectionModel.getSelectedSet();
        if (taskSet.isEmpty()) {
            return;
        }

        final List<Task> taskArray = CollectionUtil.createArrayList();
        taskArray.addAll(taskSet);
        editTask(taskArray.get(0));
    }

    private void editTask(Task task) {
        TaskDialogBox dialog = TaskDialogBox.createDialog(TaskDialogBox.EDIT_TASK_TITLE,
                CollectionUtil.createArrayList(projectList.values()),
                CollectionUtil.createArrayList(tagMap.values()), new TaskDialogBox.Handler() {
                    public void onOk(Task input) {
                        presenter.updateTask(input);
                    }
                }, task);
        dialog.center();
    }

    /**
     * ???????
     * 
     * @param e
     *            
     */
    @UiHandler("deleteTaskButton")
    void onDeleteTaskButtonClick(ClickEvent e) {
        Set<Task> taskSet = selectionModel.getSelectedSet();
        if (taskSet.isEmpty() == false) {
            this.presenter.deleteTask(taskSet);
        }
    }

    /**
     * ?????
     */
    private void updateToolBar() {
        Set<Task> taskSet = this.selectionModel.getSelectedSet();
        boolean isTaskSelected = !taskSet.isEmpty();

        editTaskButton.setEnabled(isTaskSelected);
        deleteTaskButton.setEnabled(isTaskSelected);
    }

    /**
     * {@inheritDoc}
     */
    public void setTaskList(List<Task> tasks) {
        selectionModel.clear();
        taskCellList.setRowData(tasks);
    }

    /**
     * {@inheritDoc}
     */
    public void setProjectList(List<Project> projects) {
        projectList.clear();
        for (Project p : projects) {
            projectList.put(p.getKey(), p);
        }
    }

    /**
     * {@inheritDoc}
     */
    public void setTagList(List<Tag> tags) {
        tagMap.clear();
        for (Tag t : tags) {
            tagMap.put(t.getKey(), t);
        }
        taskCellList.redraw();
    }
}