blob: 4c72d4b1140aec90c6b9a9c27ad4663f5ebe590f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2015 Tasktop Technologies and others.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* https://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Tasktop Technologies - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.internal.tasks.ui.actions;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExecutableExtension;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.wizard.IWizard;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.mylyn.commons.core.ICoreRunnable;
import org.eclipse.mylyn.commons.core.StatusHandler;
import org.eclipse.mylyn.commons.ui.CommonUiUtil;
import org.eclipse.mylyn.commons.workbench.WorkbenchUtil;
import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
import org.eclipse.mylyn.internal.tasks.core.LocalTask;
import org.eclipse.mylyn.internal.tasks.core.TaskList;
import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
import org.eclipse.mylyn.tasks.core.ITask;
import org.eclipse.mylyn.tasks.core.TaskRepository;
import org.eclipse.mylyn.tasks.core.data.AbstractTaskDataHandler;
import org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper;
import org.eclipse.mylyn.tasks.core.data.TaskData;
import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi;
import org.eclipse.mylyn.tasks.ui.TasksUi;
import org.eclipse.mylyn.tasks.ui.TasksUiImages;
import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
import org.eclipse.ui.IViewActionDelegate;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.BaseSelectionListenerAction;
import org.eclipse.ui.progress.IProgressService;
/**
* @author Steffen Pingel
*/
public class NewSubTaskAction extends BaseSelectionListenerAction implements IViewActionDelegate, IExecutableExtension {
public static final String ID = "org.eclipse.mylyn.tasks.ui.new.subtask"; //$NON-NLS-1$
private AbstractTask selectedTask;
public NewSubTaskAction() {
super(Messages.NewSubTaskAction_Subtask);
setToolTipText(Messages.NewSubTaskAction_Create_a_new_subtask);
setId(ID);
setImageDescriptor(TasksUiImages.TASK_NEW_SUB);
}
@Override
public void run() {
if (selectedTask == null) {
return;
}
if (selectedTask instanceof LocalTask) {
TaskList taskList = TasksUiPlugin.getTaskList();
LocalTask newTask = TasksUiInternal.createNewLocalTask(null);
taskList.addTask(newTask, selectedTask);
TasksUiUtil.openTask(newTask);
return;
}
AbstractRepositoryConnector connector = TasksUi.getRepositoryManager()
.getRepositoryConnector(selectedTask.getConnectorKind());
IWizard wizard = getNewSubTaskWizard();
if (wizard != null) {
WizardDialog dialog = new WizardDialog(WorkbenchUtil.getShell(), wizard);
dialog.setBlockOnOpen(true);
dialog.open();
return;
}
TaskData taskData = createTaskData(connector);
if (taskData != null) {
try {
TasksUiInternal.createAndOpenNewTask(taskData);
} catch (CoreException e) {
StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Failed to open new sub task", e)); //$NON-NLS-1$
TasksUiInternal.displayStatus(Messages.NewSubTaskAction_Unable_to_create_subtask,
new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
Messages.NewSubTaskAction_Failed_to_create_new_sub_task_ + e.getMessage()));
}
}
}
private IWizard getNewSubTaskWizard() {
TaskRepository repository = TasksUi.getRepositoryManager().getRepository(selectedTask.getConnectorKind(),
selectedTask.getRepositoryUrl());
AbstractRepositoryConnectorUi connectorUi = TasksUi.getRepositoryConnectorUi(selectedTask.getConnectorKind());
return connectorUi.getNewSubTaskWizard(repository, selectedTask);
}
private TaskData createTaskData(AbstractRepositoryConnector connector) {
final AbstractTaskDataHandler taskDataHandler = connector.getTaskDataHandler();
if (taskDataHandler == null) {
return null;
}
String repositoryUrl = selectedTask.getRepositoryUrl();
TaskData parentTaskData = null;
try {
parentTaskData = TasksUi.getTaskDataManager().getTaskData(selectedTask);
} catch (CoreException e) {
StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
"Could not retrieve task data for task:" + selectedTask.getUrl(), e)); //$NON-NLS-1$
}
if (parentTaskData == null) {
TasksUiInternal.displayStatus(Messages.NewSubTaskAction_Unable_to_create_subtask,
new Status(IStatus.WARNING, TasksUiPlugin.ID_PLUGIN,
Messages.NewSubTaskAction_Could_not_retrieve_task_data_for_task_ + selectedTask.getUrl()));
return null;
}
final TaskRepository taskRepository = TasksUiPlugin.getRepositoryManager().getRepository(repositoryUrl);
if (!taskDataHandler.canInitializeSubTaskData(taskRepository, selectedTask)) {
return null;
}
final TaskData selectedTaskData = parentTaskData;
final TaskAttributeMapper attributeMapper = taskDataHandler.getAttributeMapper(taskRepository);
final TaskData taskData = new TaskData(attributeMapper, taskRepository.getConnectorKind(),
taskRepository.getRepositoryUrl(), ""); //$NON-NLS-1$
final boolean[] result = new boolean[1];
IProgressService service = PlatformUI.getWorkbench().getProgressService();
try {
CommonUiUtil.run(service, new ICoreRunnable() {
public void run(IProgressMonitor monitor) throws CoreException {
result[0] = taskDataHandler.initializeSubTaskData(taskRepository, taskData, selectedTaskData,
monitor);
}
});
} catch (CoreException e) {
TasksUiInternal.displayStatus(Messages.NewSubTaskAction_Unable_to_create_subtask, e.getStatus());
return null;
} catch (OperationCanceledException e) {
// canceled
return null;
}
if (result[0]) {
// open editor
return taskData;
} else {
TasksUiInternal.displayStatus(Messages.NewSubTaskAction_Unable_to_create_subtask,
new Status(IStatus.INFO, TasksUiPlugin.ID_PLUGIN,
Messages.NewSubTaskAction_The_connector_does_not_support_creating_subtasks_for_this_task));
}
return null;
}
public void run(IAction action) {
run();
}
public void init(IViewPart view) {
}
@Override
protected boolean updateSelection(IStructuredSelection selection) {
selectedTask = null;
if (selection.size() == 1) {
Object selectedObject = selection.getFirstElement();
if (selectedObject instanceof LocalTask) {
selectedTask = (AbstractTask) selectedObject;
} else if (selectedObject instanceof ITask) {
selectedTask = (AbstractTask) selectedObject;
AbstractRepositoryConnector connector = TasksUi.getRepositoryManager()
.getRepositoryConnector(selectedTask.getConnectorKind());
AbstractTaskDataHandler taskDataHandler = connector.getTaskDataHandler();
TaskRepository repository = TasksUiPlugin.getRepositoryManager()
.getRepository(selectedTask.getRepositoryUrl());
if (taskDataHandler == null || !taskDataHandler.canInitializeSubTaskData(repository, selectedTask)) {
selectedTask = null;
}
}
}
return selectedTask != null;
}
public void selectionChanged(IAction action, ISelection selection) {
if (selection instanceof StructuredSelection) {
selectionChanged((IStructuredSelection) selection);
} else {
setEnabled(false);
}
action.setEnabled(isEnabled());
}
public void setInitializationData(IConfigurationElement config, String propertyName, Object data)
throws CoreException {
}
}