com.tasktop.c2c.server.tasks.client.widgets.StatusEditorView.java Source code

Java tutorial

Introduction

Here is the source code for com.tasktop.c2c.server.tasks.client.widgets.StatusEditorView.java

Source

/*******************************************************************************
 * Copyright (c) 2010, 2012 Tasktop Technologies
 * Copyright (c) 2010, 2011 SpringSource, a division of VMware
 * 
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     Tasktop Technologies - initial API and implementation
 ******************************************************************************/
package com.tasktop.c2c.server.tasks.client.widgets;

import com.google.gwt.core.client.GWT;
import com.google.gwt.editor.client.EditorDelegate;
import com.google.gwt.editor.client.ValueAwareEditor;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.TakesValue;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.SuggestBox;
import com.google.gwt.user.client.ui.ValueListBox;
import com.google.gwt.user.client.ui.Widget;
import com.tasktop.c2c.server.common.web.client.widgets.chooser.AbstractValueChooser;
import com.tasktop.c2c.server.tasks.client.widgets.chooser.task.DuplicateTaskSuggestOracle;
import com.tasktop.c2c.server.tasks.domain.RepositoryConfiguration;
import com.tasktop.c2c.server.tasks.domain.Task;
import com.tasktop.c2c.server.tasks.domain.TaskResolution;
import com.tasktop.c2c.server.tasks.domain.TaskStatus;

public class StatusEditorView extends Composite implements ValueAwareEditor<Task>, TakesValue<Task> {
    interface Binder extends UiBinder<Widget, StatusEditorView> {
    }

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

    @UiField(provided = true)
    public ValueListBox<TaskStatus> status = new ValueListBox<TaskStatus>(ReferenceValueRenderer.getInstance());
    @UiField(provided = true)
    public ValueListBox<TaskResolution> resolution = new ValueListBox<TaskResolution>(
            ReferenceValueRenderer.getInstance());
    @UiField(provided = true)
    @Ignore
    public SuggestBox duplicateOf;

    private RepositoryConfiguration repositoryConfiguration;;
    private DuplicateTaskSuggestOracle taskSuggestOracle = new DuplicateTaskSuggestOracle();
    private boolean isNewTask = false;

    public StatusEditorView() {
        duplicateOf = AbstractValueChooser.createSuggestBox(taskSuggestOracle);
        duplicateOf.setLimit(10);
        initWidget(uiBinder.createAndBindUi(this));
        status.addValueChangeHandler(new ValueChangeHandler<TaskStatus>() {

            @Override
            public void onValueChange(ValueChangeEvent<TaskStatus> event) {
                onStatusChange(event.getValue());

            }
        });
        resolution.addValueChangeHandler(new ValueChangeHandler<TaskResolution>() {

            @Override
            public void onValueChange(ValueChangeEvent<TaskResolution> event) {
                onResolutionChanged(event.getValue());
            }
        });
    }

    public void setStylesForInline() {
        duplicateOf.setStyleName("mleft40");
        status.setStyleName("left");
        resolution.setStyleName("mleft40");
    }

    public void setProjectIdentifier(String projectIdentifier) {
        taskSuggestOracle.setProjectIdentifier(projectIdentifier);
    }

    private void setTask(Task task) {
        status.setValue(task.getStatus());
        resolution.setValue(task.getResolution());

        if (isNewTask) {
            status.setAcceptableValues(repositoryConfiguration.computeValidStatuses(null));
        } else {
            status.setAcceptableValues(repositoryConfiguration.computeValidStatuses(task.getStatus()));
        }
        resolution.setAcceptableValues(repositoryConfiguration.computeValidResolutions(task.getStatus()));

        if (task.getDuplicateOf() != null) {
            duplicateOf.setValue(task.getDuplicateOf().getId().toString());
        } else {
            duplicateOf.setValue("");
        }
        updateStatusEditorViewVisibility();
    }

    public RepositoryConfiguration getRepositoryConfiguration() {
        return repositoryConfiguration;
    }

    public void setRepositoryConfiguration(RepositoryConfiguration repositoryConfiguration) {
        this.repositoryConfiguration = repositoryConfiguration;
    }

    private void updateStatusEditorViewVisibility() {
        String statusString = getSelectedStatus().getValue();
        if (statusString.equalsIgnoreCase("RESOLVED")) {
            resolution.setVisible(true);
            if (resolution.getValue() != null && resolution.getValue().isDuplicate()) {
                duplicateOf.setVisible(true);
            } else {
                duplicateOf.setVisible(false);
            }
        } else {
            resolution.setVisible(false);
            duplicateOf.setVisible(false);
        }

    }

    private void onStatusChange(TaskStatus selectedStatus) {
        updateStatusEditorViewVisibility();

        if (selectedStatus != null && selectedStatus.getValue().equalsIgnoreCase("RESOLVED")) {
            TaskResolution selectedResolution = getSelectedResolution();
            if (selectedResolution == null || isEmpty(selectedResolution.getValue())) {
                resolution.setValue(repositoryConfiguration.getDefaultResolution());
            }
        }

        resolution.setAcceptableValues(repositoryConfiguration.computeValidResolutions(selectedStatus));

        resolution.getElement().focus();
    }

    private void onResolutionChanged(TaskResolution value) {
        updateStatusEditorViewVisibility();
        if (duplicateOf.isVisible()) {
            duplicateOf.setFocus(true);
        }
    }

    private boolean isEmpty(String value) {
        return value == null || value.length() == 0;
    }

    // FIXME This has been duplicated for View Task in TaskPresenter.saveStatus()
    private void updateTask(Task task) {
        if (task.getStatus().isOpen()) {
            task.setResolution(null);
            task.setDuplicateOf(null);
        } else {
            if (task.getResolution() != null && task.getResolution().isDuplicate()) {
                try {
                    task.setDuplicateOf(new Task());
                    task.getDuplicateOf().setId(Integer.parseInt(duplicateOf.getText()));
                } catch (NumberFormatException e) {
                    task.setDuplicateOf(null);
                }
            } else {
                task.setDuplicateOf(null);
            }
        }
    }

    public TaskStatus getSelectedStatus() {
        return status.getValue();
    }

    public TaskResolution getSelectedResolution() {
        return resolution.getValue();
    }

    public Integer getDuplicateId() {
        if (duplicateOf.getText() == null || duplicateOf.getText().isEmpty()) {
            return null;
        }
        return Integer.parseInt(duplicateOf.getText());
    }

    private Task task;

    @Override
    public void setValue(Task value) {
        this.task = value;
        setTask(task);
    }

    @Override
    public void setDelegate(EditorDelegate<Task> delegate) {
    }

    @Override
    public void flush() {
        updateTask(task);
    }

    @Override
    public void onPropertyChange(String... paths) {

    }

    /**
     * @return the isNewTask
     */
    public boolean isNewTask() {
        return isNewTask;
    }

    /**
     * @param isNewTask
     *            the isNewTask to set
     */
    public void setNewTask(boolean isNewTask) {
        this.isNewTask = isNewTask;
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.google.gwt.user.client.TakesValue#getValue()
     */
    @Override
    public Task getValue() {
        flush();
        return task;
    }

}