blob: 7b25622071c418eb89f04868e120a030f74ef0e7 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011, 2015 Tasktop Technologies.
* 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 org.eclipse.mylyn.internal.context.tasks.ui;
import java.lang.reflect.InvocationTargetException;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.mylyn.commons.core.CoreUtil;
import org.eclipse.mylyn.commons.core.StatusHandler;
import org.eclipse.mylyn.commons.workbench.WorkbenchUtil;
import org.eclipse.mylyn.context.core.AbstractContextListener;
import org.eclipse.mylyn.context.core.ContextChangeEvent;
import org.eclipse.mylyn.context.core.ContextCore;
import org.eclipse.mylyn.context.core.IInteractionContext;
import org.eclipse.mylyn.context.ui.IContextUiStartup;
import org.eclipse.mylyn.internal.context.ui.ContextPopulationStrategy;
import org.eclipse.mylyn.internal.context.ui.ContextUiPlugin;
import org.eclipse.mylyn.internal.context.ui.IContextUiConstants;
import org.eclipse.mylyn.internal.context.ui.IContextUiPreferenceContstants;
import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
import org.eclipse.mylyn.internal.tasks.core.externalization.ExternalizationManager;
import org.eclipse.mylyn.internal.tasks.ui.ITasksUiPreferenceConstants;
import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
import org.eclipse.mylyn.internal.tasks.ui.context.RetrieveLatestContextDialog;
import org.eclipse.mylyn.internal.tasks.ui.editors.TaskMigrator;
import org.eclipse.mylyn.tasks.core.ITask;
import org.eclipse.mylyn.tasks.core.ITaskActivationListener;
import org.eclipse.mylyn.tasks.core.TaskActivationAdapter;
import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
import org.eclipse.mylyn.tasks.core.data.TaskData;
import org.eclipse.mylyn.tasks.ui.TasksUi;
import org.eclipse.ui.PlatformUI;
/**
* @author Steffen Pingel
*/
public class ContextTasksStartupHandler implements IContextUiStartup {
/**
* Adapts a {@link TaskData} or {@link ITask} to a String based on their content.
*/
final class TaskContentAdapter implements IAdaptable {
private final TaskData taskData;
private final ITask task;
TaskContentAdapter(TaskData taskData, ITask task) {
this.taskData = taskData;
this.task = task;
}
public Object getAdapter(@SuppressWarnings("rawtypes") Class adapter) {
if (adapter == ITask.class) {
return task;
} else if (adapter == TaskData.class) {
return taskData;
} else if (adapter == String.class) {
if (taskData != null) {
TaskAttribute attribute = taskData.getRoot().getMappedAttribute(TaskAttribute.DESCRIPTION);
if (attribute != null) {
String description = attribute.getValue();
if (description != null && description.length() > 0) {
return description;
}
}
attribute = taskData.getRoot().getMappedAttribute(TaskAttribute.COMMENT_NEW);
if (attribute != null) {
String description = attribute.getValue();
if (description != null && description.length() > 0) {
return description;
}
}
}
if (task instanceof AbstractTask) {
String description = ((AbstractTask) task).getNotes();
if (description != null && description.length() > 0) {
return description;
}
}
}
return null;
}
}
private class ContextActivationListener extends AbstractContextListener {
@Override
public void contextChanged(ContextChangeEvent event) {
switch (event.getEventKind()) {
case PRE_ACTIVATED:
ContextTasksStartupHandler.this.contextActivated(event);
break;
case ACTIVATED:
getStateHandler().activated(event.getContext());
PlatformUI.getWorkbench()
.getActiveWorkbenchWindow()
.getActivePage()
.showActionSet(IContextUiConstants.ID_CONTEXT_UI_ACTION_SET);
break;
case DEACTIVATED:
getStateHandler().deactivated(event.getContext());
PlatformUI.getWorkbench()
.getActiveWorkbenchWindow()
.getActivePage()
.hideActionSet(IContextUiConstants.ID_CONTEXT_UI_ACTION_SET);
break;
case CLEARED:
getStateHandler().clear(event.getContextHandle(), event.isActiveContext());
break;
}
}
private ContextStatePersistenceHandler getStateHandler() {
return ((TaskContextStore) TasksUiPlugin.getContextStore()).getStateHandler();
}
}
private static final ITaskActivationListener TASK_ACTIVATION_LISTENER = new TaskActivationAdapter() {
@Override
public void preTaskDeactivated(ITask task) {
ContextUiPlugin.getEditorStateParticipant().setEnabled(!TaskMigrator.isActive());
}
@Override
public void preTaskActivated(ITask task) {
ContextUiPlugin.getEditorStateParticipant().setEnabled(!TaskMigrator.isActive());
}
@SuppressWarnings("restriction")
@Override
public void taskActivated(ITask task) {
if (CoreUtil.TEST_MODE) {
// avoid blocking the test suite
return;
}
boolean hasLocalContext = ContextCore.getContextManager().hasContext(task.getHandleIdentifier());
if (!hasLocalContext) {
if (org.eclipse.mylyn.internal.tasks.ui.util.AttachmentUtil.hasContextAttachment(task)) {
RetrieveLatestContextDialog.openQuestion(WorkbenchUtil.getShell(), task);
}
}
}
};
private final ContextPopulationStrategy contextPopulationStrategy = new ContextPopulationStrategy();
private final ContextActivationListener contextActivationListener = new ContextActivationListener();
public ContextTasksStartupHandler() {
// ignore
}
public void lazyStartup() {
ExternalizationManager externalizationManager = TasksUiPlugin.getExternalizationManager();
ActiveContextExternalizationParticipant activeContextExternalizationParticipant = new ActiveContextExternalizationParticipant(
externalizationManager);
externalizationManager.addParticipant(activeContextExternalizationParticipant);
activeContextExternalizationParticipant.registerListeners();
try {
PlatformUI.getWorkbench().getProgressService().busyCursorWhile(new IRunnableWithProgress() {
public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
try {
SubMonitor progress = SubMonitor.convert(monitor);
ContextMementoMigrator migrator = new ContextMementoMigrator(ContextUiPlugin.getDefault()
.getStateManager());
migrator.setDeleteOldDataEnabled(true);
IStatus status = migrator.migrateContextMementos(progress);
if (!status.isOK()) {
StatusHandler.log(status);
}
} finally {
monitor.done();
}
}
});
} catch (InvocationTargetException e) {
StatusHandler.log(new Status(IStatus.ERROR, ContextUiPlugin.ID_PLUGIN,
"Unexpected error migrating context state", e)); //$NON-NLS-1$
} catch (InterruptedException e) {
// ignore
}
TasksUi.getTaskActivityManager().addActivationListener(TASK_ACTIVATION_LISTENER);
ContextUiPlugin.getDefault().getPreferenceStore().addPropertyChangeListener(new IPropertyChangeListener() {
public void propertyChange(PropertyChangeEvent event) {
if (IContextUiPreferenceContstants.AUTO_MANAGE_EXPANSION.equals(event.getProperty())) {
updateAutoManageExpansionPreference();
}
}
});
updateAutoManageExpansionPreference();
ContextCore.getContextManager().addListener(contextActivationListener);
}
private void updateAutoManageExpansionPreference() {
boolean value = ContextUiPlugin.getDefault()
.getPreferenceStore()
.getBoolean(IContextUiPreferenceContstants.AUTO_MANAGE_EXPANSION);
TasksUiPlugin.getDefault()
.getPreferenceStore()
.setValue(ITasksUiPreferenceConstants.AUTO_EXPAND_TASK_LIST, value);
}
void contextActivated(ContextChangeEvent event) {
if (contextPopulationStrategy.isDisabled()) {
return;
}
// detect empty context
if (event.getContext().getAllElements().isEmpty()) {
// get corresponding task
final ITask task = TasksUi.getRepositoryModel().getTask(event.getContextHandle());
if (task != null) {
try {
final TaskData taskData;
if (TasksUiPlugin.getTaskDataManager().hasTaskData(task)) {
taskData = TasksUiPlugin.getTaskDataManager().getWorkingCopy(task, false).getLocalData();
} else {
taskData = null;
}
IInteractionContext context = event.getContext();
IAdaptable input = new TaskContentAdapter(taskData, task);
contextPopulationStrategy.populateContext(context, input);
} catch (CoreException e) {
ContextUiPlugin.getDefault().getLog().log(e.getStatus());
}
}
}
}
}