blob: 26e3095c85d01a807368a980be04a3845283d9ff [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2012 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.editors;
import java.util.Date;
import org.eclipse.core.runtime.ISafeRunnable;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.SafeRunner;
import org.eclipse.core.runtime.Status;
import org.eclipse.mylyn.commons.core.StatusHandler;
import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
import org.eclipse.mylyn.internal.tasks.core.DateRange;
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.TaskMigrationEvent;
import org.eclipse.mylyn.tasks.ui.TasksUi;
import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
import org.eclipse.mylyn.tasks.ui.editors.TaskEditor;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
/**
* @author Steffen Pingel
*/
public class TaskMigrator {
private static boolean active;
private final ITask oldTask;
private boolean delete;
private boolean openEditors;
private TaskEditor editor;
private boolean migrateDueDate = true;
public TaskMigrator(ITask oldTask) {
this.oldTask = oldTask;
this.openEditors = true;
}
public void setMigrateDueDate(boolean migrateDueDate) {
this.migrateDueDate = migrateDueDate;
}
public boolean openEditors() {
return openEditors;
}
public void setOpenEditors(boolean openEditors) {
this.openEditors = openEditors;
}
public boolean delete() {
return delete;
}
public void setDelete(boolean delete) {
this.delete = delete;
}
/**
* Migrates local properties of <code>oldTask</code> to <code>newTask</code>:
* <ul>
* <li>Copy properties
* <li>Delete old task
* <li>Reactivate new task
* <li>Open new task
* </ul>
*
* @param newTask
* the task to migrate properties to
*/
public void execute(ITask newTask) {
copyProperties(newTask);
// invoke participants
final AbstractRepositoryConnector connector = TasksUi.getRepositoryConnector(newTask.getConnectorKind());
if (connector != null) {
final TaskMigrationEvent event = new TaskMigrationEvent(oldTask, newTask);
SafeRunner.run(new ISafeRunnable() {
public void handleException(Throwable e) {
StatusHandler.log(
new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Unexpected error in task migrator: " //$NON-NLS-1$
+ connector.getClass(), e));
}
public void run() throws Exception {
connector.migrateTask(event);
}
});
}
try {
// temporarily disable auto editor management
active = true;
boolean reactivate = oldTask.isActive();
if (reactivate) {
TasksUi.getTaskActivityManager().deactivateTask(oldTask);
}
boolean editorIsActive = closeEditor();
deleteOldTask();
if (reactivate) {
TasksUi.getTaskActivityManager().activateTask(newTask);
}
if (openEditors()) {
if (editorIsActive) {
TasksUiUtil.openTask(newTask);
} else {
TasksUiInternal.openTaskInBackground(newTask, false);
}
}
} finally {
active = false;
}
}
public void setEditor(TaskEditor editor) {
this.editor = editor;
}
public TaskEditor getEditor() {
return editor;
}
private boolean closeEditor() {
boolean editorIsActive = false;
if (editor != null) {
IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
if (window != null) {
IWorkbenchPage activePage = window.getActivePage();
if (activePage != null) {
if (activePage.getActiveEditor() == editor) {
editorIsActive = true;
}
}
}
editor.close(false);
}
return editorIsActive;
}
private void deleteOldTask() {
// delete old task details
if (delete()) {
TasksUiInternal.deleteTask(oldTask);
}
}
private void copyProperties(ITask newTask) {
// migrate task details
if (oldTask instanceof AbstractTask && newTask instanceof AbstractTask) {
((AbstractTask) newTask).setNotes(((AbstractTask) oldTask).getNotes());
DateRange scheduledDate = ((AbstractTask) oldTask).getScheduledForDate();
TasksUiPlugin.getTaskActivityManager().setScheduledFor((AbstractTask) newTask, scheduledDate);
Date dueDate = ((AbstractTask) oldTask).getDueDate();
if (migrateDueDate) {
TasksUiPlugin.getTaskActivityManager().setDueDate(newTask, dueDate);
}
((AbstractTask) newTask).setEstimatedTimeHours(((AbstractTask) oldTask).getEstimatedTimeHours());
}
// migrate context
TasksUiPlugin.getContextStore().moveContext(oldTask, newTask);
}
public static boolean isActive() {
return active;
}
}