package com.project.website.canvas.client.canvastools.tasklist; import java.util.ArrayList; import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.KeyCodes; import com.google.gwt.event.dom.client.KeyPressEvent; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.Focusable; import com.google.gwt.user.client.ui.HTMLPanel; import com.google.gwt.user.client.ui.IsWidget; import com.google.gwt.user.client.ui.Widget; import com.project.shared.client.events.SimpleEvent.Handler; import com.project.shared.client.handlers.RegistrationsManager; import com.project.shared.client.handlers.SpecificKeyPressHandler; import com.project.shared.client.utils.ListUtils; import com.project.website.canvas.client.canvastools.base.CanvasToolCommon; import com.project.website.canvas.client.canvastools.base.CanvasToolEvents; import com.project.website.canvas.client.canvastools.base.ResizeMode; import com.project.website.canvas.client.canvastools.base.interfaces.CanvasTool; import com.project.website.canvas.client.canvastools.base.interfaces.ICanvasToolEvents; import com.project.website.canvas.shared.data.ElementData; import com.project.website.canvas.shared.data.TaskData; import com.project.website.canvas.shared.data.TaskListData; public class TaskListTool extends Composite implements CanvasTool<TaskListData>, Focusable { private static TaskListWidgetUiBinder uiBinder = GWT.create(TaskListWidgetUiBinder.class); interface TaskListWidgetUiBinder extends UiBinder<Widget, TaskListTool> { } @UiField HTMLPanel panelTaskList; @UiField HoverTextBox title; @UiField Button buttonAdd; private CanvasToolEvents _toolEvents = new CanvasToolEvents(this); protected int _tabIndex = 0; protected char _accessKey = 0; private ArrayList<TaskTool> taskWidgets = new ArrayList<TaskTool>(); private TaskListData data = null; public TaskListTool() { initWidget(uiBinder.createAndBindUi(this)); CanvasToolCommon.initCanvasToolWidget(this); this.createNewTaskWidget(); } @Override public ICanvasToolEvents getToolEvents() { return this._toolEvents; } @Override public void bind() { this.registerHandlers(); } private void registerHandlers() { buttonAdd.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { // TODO Auto-generated method stub createNewTaskWidget(); } }); } private void createNewTaskWidget() { TaskTool taskWidget = new TaskTool(); addTaskWidget(taskWidget); taskWidget.setFocus(true); } public void addTaskWidget(final TaskTool taskWidget) { taskWidgets.add(taskWidget); panelTaskList.add(taskWidget); final RegistrationsManager taskRegistrations = new RegistrationsManager(); taskRegistrations.add(taskWidget.addKillRequestEventHandler(new Handler<TaskTool>() { public void onFire(TaskTool arg) { removeTaskWidget(arg); taskRegistrations.clear(); } })); taskRegistrations.add(taskWidget.textTask.addKeyPressHandler( new SpecificKeyPressHandler(KeyCodes.KEY_ENTER) { @Override public void onSpecificKeyPress(KeyPressEvent event) { activateTask(ListUtils.getNext(taskWidgets, taskWidget, true)); } })); taskRegistrations.add(taskWidget.textTask.addKeyPressHandler( new SpecificKeyPressHandler(KeyCodes.KEY_DOWN) { @Override public void onSpecificKeyPress(KeyPressEvent event) { activateTask(ListUtils.getNext(taskWidgets, taskWidget, true)); } })); taskRegistrations.add(taskWidget.textTask.addKeyPressHandler( new SpecificKeyPressHandler(KeyCodes.KEY_UP) { @Override public void onSpecificKeyPress(KeyPressEvent event) { activateTask(ListUtils.getPrevious(taskWidgets, taskWidget, true)); } })); } private void activateTask(TaskTool taskTool) { taskTool.setFocus(true); } private void removeTaskWidget(TaskTool taskWidget) { panelTaskList.remove(taskWidget); taskWidgets.remove(taskWidget); } private TaskTool getFirstTaskWidget() { if (this.taskWidgets.isEmpty()) { return null; } return this.taskWidgets.get(0); } public int getTabIndex() { // TODO Auto-generated method stub return this._tabIndex; } public void setAccessKey(char key) { // TODO Auto-generated method stub this._accessKey = key; } public void setTabIndex(int index) { this._tabIndex = index; } @Override public void setFocus(boolean focused) { TaskTool taskTool = this.getFirstTaskWidget(); if (null == taskTool) { return; } taskTool.setFocus(focused); } @Override public void setActive(boolean isActive) { this.setFocus(isActive); } @Override public TaskListData getValue() { this.data.title = this.title.getText(); this.data.tasks.clear(); for (TaskTool taskWidget : this.taskWidgets) { this.data.tasks.add(taskWidget.getValue()); } return this.data; } @Override public void setValue(TaskListData data) { this.title.setText(data.title); this.data = data; this.taskWidgets.clear(); this.panelTaskList.clear(); for (TaskData task : this.data.tasks) { TaskTool taskWidget = new TaskTool(); taskWidget.setValue(task); this.addTaskWidget(taskWidget); } } @Override public void setElementData(ElementData data) { this.setValue((TaskListData) data); } @Override public ResizeMode getResizeMode() { return ResizeMode.WIDTH_ONLY; } @Override public boolean canRotate() { return true; } @Override public void setViewMode(boolean isViewMode) { // TODO How does a task list behave when in view mode? for now same as edit mode } @Override public void onResize() { // TODO Auto-generated method stub } @Override public IsWidget getToolbar() { // TODO Auto-generated method stub return null; } }