Download
Getting Started
Members
Projects
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
More
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
Toggle navigation
Bugzilla – Attachment 222661 Details for
Bug 334937
[api] support cancelling the entire task switch when user cancels dirty editor save
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
Log In
[x]
|
Terms of Use
|
Copyright Agent
[patch]
proof of concept
clipboard.txt (text/plain), 5.27 KB, created by
Sam Davis
on 2012-10-22 19:34:51 EDT
(
hide
)
Description:
proof of concept
Filename:
MIME Type:
Creator:
Sam Davis
Created:
2012-10-22 19:34:51 EDT
Size:
5.27 KB
patch
obsolete
>### Eclipse Workspace Patch 1.0 >#P org.eclipse.mylyn.context.tasks.ui >diff --git src/org/eclipse/mylyn/internal/context/tasks/ui/TaskActivityMonitor.java src/org/eclipse/mylyn/internal/context/tasks/ui/TaskActivityMonitor.java >index 2ce6aba..242c36b 100644 >--- src/org/eclipse/mylyn/internal/context/tasks/ui/TaskActivityMonitor.java >+++ src/org/eclipse/mylyn/internal/context/tasks/ui/TaskActivityMonitor.java >@@ -16,7 +16,10 @@ > > import org.eclipse.core.runtime.IStatus; > import org.eclipse.core.runtime.Status; >+import org.eclipse.jface.dialogs.IDialogConstants; >+import org.eclipse.jface.dialogs.MessageDialog; > 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; >@@ -35,6 +38,9 @@ > import org.eclipse.mylyn.tasks.core.ITaskActivityManager; > import org.eclipse.mylyn.tasks.core.TaskActivationAdapter; > import org.eclipse.mylyn.tasks.core.activity.AbstractTaskActivityMonitor; >+import org.eclipse.ui.IEditorReference; >+import org.eclipse.ui.IWorkbenchWindow; >+import org.eclipse.ui.PlatformUI; > > /** > * Monitors task activity and maintains task activation history >@@ -65,6 +71,37 @@ > private static ITaskActivationListener CONTEXT_TASK_ACTIVATION_LISTENER = new TaskActivationAdapter() { > > @Override >+ public boolean shouldDeactivateTask(ITask task) { >+ List<IEditorReference> dirtyRefs = new ArrayList<IEditorReference>(); >+ for (IWorkbenchWindow window : PlatformUI.getWorkbench().getWorkbenchWindows()) { >+ for (IEditorReference ref : window.getActivePage().getEditorReferences()) { >+ if (ref.isDirty()) { >+ dirtyRefs.add(ref); >+ } >+ } >+ } >+ if (!dirtyRefs.isEmpty()) { >+ StringBuilder editorsString = new StringBuilder(); >+ for (IEditorReference ref : dirtyRefs) { >+ editorsString.append(ref.getTitle()); >+ editorsString.append('\n'); >+ } >+ int returnCode = new MessageDialog(WorkbenchUtil.getShell(), "Task Deactivation", null, >+ "The following editors have unsaved changes. Do you want still want to deactivate the task?\n\n" >+ + editorsString, MessageDialog.QUESTION, new String[] { "Deactivate Task", >+ IDialogConstants.CANCEL_LABEL }, 1).open(); >+ if (returnCode != 0) { >+ // activate dirty editors >+ for (IEditorReference ref : dirtyRefs) { >+ ref.getPage().activate(ref.getPart(true)); >+ } >+ return false; >+ } >+ } >+ return true; >+ }; >+ >+ @Override > public void preTaskActivated(ITask task) { > // make sure that org.eclipse.mylyn.context.ui is active prior to the first task activation > ContextUiPlugin.getDefault(); >### Eclipse Workspace Patch 1.0 >#P org.eclipse.mylyn.tasks.core >diff --git src/org/eclipse/mylyn/internal/tasks/core/TaskActivityManager.java src/org/eclipse/mylyn/internal/tasks/core/TaskActivityManager.java >index 5e7573f..33a13a9 100644 >--- src/org/eclipse/mylyn/internal/tasks/core/TaskActivityManager.java >+++ src/org/eclipse/mylyn/internal/tasks/core/TaskActivityManager.java >@@ -40,6 +40,7 @@ > import org.eclipse.mylyn.tasks.core.ITaskActivationListener; > import org.eclipse.mylyn.tasks.core.ITaskActivityListener; > import org.eclipse.mylyn.tasks.core.ITaskActivityManager; >+import org.eclipse.mylyn.tasks.core.TaskActivationAdapter; > import org.eclipse.osgi.util.NLS; > > /** >@@ -455,7 +456,12 @@ > } > > public void activateTask(ITask task) { >- deactivateActiveTask(); >+ if (activeTask != null) { >+ if (!shouldDeactivateTask(activeTask)) { >+ return; >+ } >+ deactivateTaskInternal(activeTask); >+ } > > taskList.addTaskIfAbsent(task); > >@@ -491,6 +497,13 @@ > } > > public void deactivateTask(ITask task) { >+ if (task.isActive() && !shouldDeactivateTask(task)) { >+ return; >+ } >+ deactivateTaskInternal(task); >+ } >+ >+ protected void deactivateTaskInternal(ITask task) { > if (task == null) { > return; > } >@@ -524,6 +537,22 @@ > } > } > >+ protected boolean shouldDeactivateTask(ITask task) { >+ for (ITaskActivationListener listener : new ArrayList<ITaskActivationListener>(activationListeners)) { >+ try { >+ if (listener instanceof TaskActivationAdapter) { >+ if (!((TaskActivationAdapter) listener).shouldDeactivateTask(task)) { >+ return false; >+ } >+ } >+ } catch (Throwable t) { >+ StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN, >+ "Task activity listener failed: " + listener, t)); //$NON-NLS-1$ >+ } >+ } >+ return true; >+ } >+ > /** > * returns active tasks from start to end (exclusive) where both are snapped to the beginning of the hour > */ >diff --git src/org/eclipse/mylyn/tasks/core/TaskActivationAdapter.java src/org/eclipse/mylyn/tasks/core/TaskActivationAdapter.java >index 127a667..933b40c 100644 >--- src/org/eclipse/mylyn/tasks/core/TaskActivationAdapter.java >+++ src/org/eclipse/mylyn/tasks/core/TaskActivationAdapter.java >@@ -17,6 +17,13 @@ > */ > public class TaskActivationAdapter implements ITaskActivationListener { > >+ /** >+ * @since 3.9 >+ */ >+ public boolean shouldDeactivateTask(ITask task) { >+ return true; >+ } >+ > public void preTaskActivated(ITask task) { > } >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 334937
:
218837
|
218838
|
218961
|
222661