Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsminto2009-10-07 22:17:56 +0000
committersminto2009-10-07 22:17:56 +0000
commit66da23ab0f1f7096b607fc0c325523b52bcc2ca1 (patch)
treeecd173c8e8da3af151e5d117d071c0a03a2dec44
parentad79daab2bbb192c940a291a6b41b50fb7e86b97 (diff)
downloadorg.eclipse.mylyn.tasks-66da23ab0f1f7096b607fc0c325523b52bcc2ca1.tar.gz
org.eclipse.mylyn.tasks-66da23ab0f1f7096b607fc0c325523b52bcc2ca1.tar.xz
org.eclipse.mylyn.tasks-66da23ab0f1f7096b607fc0c325523b52bcc2ca1.zip
RESOLVED - bug 219173: [review] [context][externalization] auto save task context
https://bugs.eclipse.org/bugs/show_bug.cgi?id=219173
-rw-r--r--org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/ITasksCoreConstants.java2
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/ActiveContextExternalizationParticipant.java189
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/Messages.java2
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TasksUiPlugin.java6
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/messages.properties1
5 files changed, 200 insertions, 0 deletions
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/ITasksCoreConstants.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/ITasksCoreConstants.java
index d264de62a..7f3894a69 100644
--- a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/ITasksCoreConstants.java
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/ITasksCoreConstants.java
@@ -49,6 +49,8 @@ public interface ITasksCoreConstants {
public static final ISchedulingRule ACTIVITY_SCHEDULING_RULE = new MutexSchedulingRule();
+ public static final ISchedulingRule ACTIVE_CONTEXT_SCHEDULING_RULE = new MutexSchedulingRule();
+
public static final ISchedulingRule TASKLIST_SCHEDULING_RULE = new MutexSchedulingRule();
public static final ISchedulingRule ROOT_SCHEDULING_RULE = new RootSchedulingRule();
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/ActiveContextExternalizationParticipant.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/ActiveContextExternalizationParticipant.java
new file mode 100644
index 000000000..1a2f25c14
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/ActiveContextExternalizationParticipant.java
@@ -0,0 +1,189 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2009 Tasktop Technologies and others.
+ * 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.tasks.ui;
+
+import java.io.File;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.ISchedulingRule;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+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.internal.context.core.ContextCorePlugin;
+import org.eclipse.mylyn.internal.monitor.ui.ActivityContextManager;
+import org.eclipse.mylyn.internal.monitor.ui.MonitorUiPlugin;
+import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants;
+import org.eclipse.mylyn.internal.tasks.core.externalization.AbstractExternalizationParticipant;
+import org.eclipse.mylyn.internal.tasks.core.externalization.ExternalizationManager;
+import org.eclipse.mylyn.internal.tasks.core.externalization.IExternalizationContext;
+import org.eclipse.mylyn.monitor.ui.IUserAttentionListener;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskActivityListener;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+
+/**
+ * This externalization participant only handles saving the active context periodically. No snapshots are taken and task
+ * activation and deactivation control the load and final write of the context in InteractionContextManager.
+ *
+ * @author Shawn Minto
+ */
+@SuppressWarnings("restriction")
+public class ActiveContextExternalizationParticipant extends AbstractExternalizationParticipant implements
+ ITaskActivityListener, IUserAttentionListener {
+ private boolean isDirty = false;
+
+ private final ExternalizationManager manager;
+
+ private long lastUpdate;
+
+ private IInteractionContext currentlyActiveContext;
+
+ private final AbstractContextListener listener = new AbstractContextListener() {
+ @Override
+ public void contextChanged(ContextChangeEvent event) {
+ switch (event.getEventKind()) {
+ case ACTIVATED:
+ currentlyActiveContext = event.getContext();
+ break;
+ case DEACTIVATED:
+ currentlyActiveContext = null;
+ setDirty(false);
+ break;
+ }
+ }
+ };
+
+ public ActiveContextExternalizationParticipant(ExternalizationManager manager) {
+ this.manager = manager;
+ }
+
+ public void registerListeners() {
+ ContextCore.getContextManager().addListener(listener);
+ TasksUi.getTaskActivityManager().addActivityListener(this);
+ if (MonitorUiPlugin.getDefault().getActivityContextManager() != null) {
+ ((ActivityContextManager) MonitorUiPlugin.getDefault().getActivityContextManager()).addListener(this);
+ } else {
+ StatusHandler.log(new Status(IStatus.WARNING, TasksUiPlugin.ID_PLUGIN,
+ "Unable to register user activity listener.", new Exception())); //$NON-NLS-1$
+ }
+ }
+
+ // currently not called since no way to remove a participant
+ public void dispose() {
+ ContextCore.getContextManager().removeListener(listener);
+ TasksUi.getTaskActivityManager().removeActivityListener(this);
+ if (MonitorUiPlugin.getDefault().getActivityContextManager() != null) {
+ ((ActivityContextManager) MonitorUiPlugin.getDefault().getActivityContextManager()).removeListener(this);
+ }
+ }
+
+ @Override
+ public void execute(IExternalizationContext context, IProgressMonitor monitor) throws CoreException {
+ Assert.isNotNull(context);
+ switch (context.getKind()) {
+ case SAVE:
+ if (shouldWriteContext()) {
+ setDirty(false);
+ ContextCorePlugin.getContextManager().saveContext(currentlyActiveContext);
+ }
+ break;
+ case LOAD:
+ // ignore loads since we will do this synchronously with task activation
+ break;
+ case SNAPSHOT:
+ // ignore snapshots
+ break;
+ }
+ }
+
+ @Override
+ public String getDescription() {
+ return Messages.ActiveContextExternalizationParticipant_Active_Task_Context;
+ }
+
+ @Override
+ public ISchedulingRule getSchedulingRule() {
+ return ITasksCoreConstants.ACTIVE_CONTEXT_SCHEDULING_RULE;
+ }
+
+ @Override
+ public boolean isDirty() {
+ synchronized (this) {
+ return isDirty;
+ }
+ }
+
+ public void setDirty(boolean dirty) {
+ synchronized (this) {
+ isDirty = dirty;
+ }
+ }
+
+ @Override
+ public String getFileName() {
+ // ignore
+ return null;
+ }
+
+ @Override
+ public void load(File sourceFile, IProgressMonitor monitor) throws CoreException {
+ // ignore see execute method
+ }
+
+ @Override
+ public void save(File targetFile, IProgressMonitor monitor) throws CoreException {
+ // ignore see execute method
+ }
+
+ public void elapsedTimeUpdated(ITask task, long newElapsedTime) {
+ if (System.currentTimeMillis() - lastUpdate > 1000 * 60 * 3) {
+ // TODO TYR TO CHECK IF IT IS DIRTY AND IT EXISTS
+ setDirty(shouldWriteContext());
+ if (isDirty()) {
+ manager.requestSave();
+ }
+ lastUpdate = System.currentTimeMillis();
+ }
+ }
+
+ private boolean shouldWriteContext() {
+ if (ContextCorePlugin.getContextManager() != null && currentlyActiveContext != null
+ && currentlyActiveContext.getAllElements().size() > 0) {
+ // we could add a check here for whether there were changes to the context
+ return true;
+ }
+ return false;
+ }
+
+ public void activityReset() {
+ // ignore
+ }
+
+ public void userAttentionGained() {
+ // ignore
+ }
+
+ public void userAttentionLost() {
+ setDirty(shouldWriteContext());
+ if (isDirty()) {
+ manager.requestSave();
+ }
+ lastUpdate = System.currentTimeMillis();
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/Messages.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/Messages.java
index a28852c70..3e9e79a85 100644
--- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/Messages.java
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/Messages.java
@@ -25,6 +25,8 @@ public class Messages extends NLS {
NLS.initializeMessages(BUNDLE_NAME, Messages.class);
}
+ public static String ActiveContextExternalizationParticipant_Active_Task_Context;
+
public static String ActivityExternalizationParticipant_Activity_Context;
public static String ChangeActivityHandleOperation_Activity_migration;
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TasksUiPlugin.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TasksUiPlugin.java
index 55cd42ce2..e2d8ca97a 100644
--- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TasksUiPlugin.java
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TasksUiPlugin.java
@@ -350,6 +350,8 @@ public class TasksUiPlugin extends AbstractUIPlugin {
private static TaskListExternalizationParticipant taskListExternalizationParticipant;
+ private ActiveContextExternalizationParticipant activeContextExternalizationParticipant;
+
private final Set<IRepositoryModelListener> listeners = new HashSet<IRepositoryModelListener>();
private static TaskList taskList;
@@ -435,6 +437,10 @@ public class TasksUiPlugin extends AbstractUIPlugin {
} finally {
monitor.done();
}
+ activeContextExternalizationParticipant = new ActiveContextExternalizationParticipant(
+ externalizationManager);
+ externalizationManager.addParticipant(activeContextExternalizationParticipant);
+ activeContextExternalizationParticipant.registerListeners();
return new Status(IStatus.OK, TasksUiPlugin.ID_PLUGIN, IStatus.OK, "", null); //$NON-NLS-1$
}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/messages.properties b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/messages.properties
index e7bda1160..efe6e02ed 100644
--- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/messages.properties
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/messages.properties
@@ -8,6 +8,7 @@
# Contributors:
# Tasktop Technologies - initial API and implementation
###############################################################################
+ActiveContextExternalizationParticipant_Active_Task_Context=Active Task Context
ActivityExternalizationParticipant_Activity_Context=Activity Context
ChangeActivityHandleOperation_Activity_migration=Activity migration

Back to the top