|
Lines 13-36
Link Here
|
| 13 |
import java.io.File; |
13 |
import java.io.File; |
| 14 |
import java.util.ArrayList; |
14 |
import java.util.ArrayList; |
| 15 |
import java.util.Collection; |
15 |
import java.util.Collection; |
|
|
16 |
import java.util.Comparator; |
| 16 |
import java.util.Date; |
17 |
import java.util.Date; |
| 17 |
import java.util.HashMap; |
18 |
import java.util.HashMap; |
| 18 |
import java.util.HashSet; |
19 |
import java.util.HashSet; |
| 19 |
import java.util.List; |
20 |
import java.util.List; |
| 20 |
import java.util.Map; |
21 |
import java.util.Map; |
| 21 |
import java.util.Set; |
22 |
import java.util.Set; |
|
|
23 |
import java.util.TreeSet; |
| 22 |
|
24 |
|
| 23 |
import org.eclipse.core.resources.IProject; |
|
|
| 24 |
import org.eclipse.core.resources.IResource; |
25 |
import org.eclipse.core.resources.IResource; |
| 25 |
import org.eclipse.core.resources.ProjectScope; |
|
|
| 26 |
import org.eclipse.core.resources.ResourcesPlugin; |
26 |
import org.eclipse.core.resources.ResourcesPlugin; |
| 27 |
import org.eclipse.core.runtime.CoreException; |
27 |
import org.eclipse.core.runtime.CoreException; |
| 28 |
import org.eclipse.core.runtime.IPath; |
28 |
import org.eclipse.core.runtime.IPath; |
| 29 |
import org.eclipse.core.runtime.Platform; |
29 |
import org.eclipse.core.runtime.Platform; |
| 30 |
import org.eclipse.core.runtime.Preferences.IPropertyChangeListener; |
30 |
import org.eclipse.core.runtime.Preferences.IPropertyChangeListener; |
| 31 |
import org.eclipse.core.runtime.Preferences.PropertyChangeEvent; |
31 |
import org.eclipse.core.runtime.Preferences.PropertyChangeEvent; |
| 32 |
import org.eclipse.core.runtime.preferences.IEclipsePreferences; |
|
|
| 33 |
import org.eclipse.core.runtime.preferences.IScopeContext; |
| 34 |
import org.eclipse.jface.dialogs.MessageDialog; |
32 |
import org.eclipse.jface.dialogs.MessageDialog; |
| 35 |
import org.eclipse.jface.preference.IPreferenceStore; |
33 |
import org.eclipse.jface.preference.IPreferenceStore; |
| 36 |
import org.eclipse.jface.resource.ImageDescriptor; |
34 |
import org.eclipse.jface.resource.ImageDescriptor; |
|
Lines 84-90
Link Here
|
| 84 |
import org.eclipse.ui.plugin.AbstractUIPlugin; |
82 |
import org.eclipse.ui.plugin.AbstractUIPlugin; |
| 85 |
import org.osgi.framework.Bundle; |
83 |
import org.osgi.framework.Bundle; |
| 86 |
import org.osgi.framework.BundleContext; |
84 |
import org.osgi.framework.BundleContext; |
| 87 |
import org.osgi.service.prefs.BackingStoreException; |
|
|
| 88 |
|
85 |
|
| 89 |
/** |
86 |
/** |
| 90 |
* @author Mik Kersten |
87 |
* @author Mik Kersten |
|
Lines 97-108
Link Here
|
| 97 |
|
94 |
|
| 98 |
public static final String PLUGIN_ID = "org.eclipse.mylar.tasklist"; |
95 |
public static final String PLUGIN_ID = "org.eclipse.mylar.tasklist"; |
| 99 |
|
96 |
|
| 100 |
private static final String PROPERTY_PREFIX = "project.repository"; |
|
|
| 101 |
|
| 102 |
private static final String PROJECT_REPOSITORY_KIND = PROPERTY_PREFIX + ".kind"; |
| 103 |
|
| 104 |
private static final String PROJECT_REPOSITORY_URL = PROPERTY_PREFIX + ".url"; |
| 105 |
|
| 106 |
private static final String NAME_DATA_DIR = ".mylar"; |
97 |
private static final String NAME_DATA_DIR = ".mylar"; |
| 107 |
|
98 |
|
| 108 |
private static final char DEFAULT_PATH_SEPARATOR = '/'; |
99 |
private static final char DEFAULT_PATH_SEPARATOR = '/'; |
|
Lines 133-138
Link Here
|
| 133 |
|
124 |
|
| 134 |
private ArrayList<IHyperlinkDetector> hyperlinkDetectors = new ArrayList<IHyperlinkDetector>(); |
125 |
private ArrayList<IHyperlinkDetector> hyperlinkDetectors = new ArrayList<IHyperlinkDetector>(); |
| 135 |
|
126 |
|
|
|
127 |
private TreeSet<AbstractTaskRepositoryLinkProvider> repositoryLinkProviders = new TreeSet<AbstractTaskRepositoryLinkProvider>(new OrderComparator()); |
| 128 |
|
| 136 |
private TaskListWriter taskListWriter; |
129 |
private TaskListWriter taskListWriter; |
| 137 |
|
130 |
|
| 138 |
private ITaskHighlighter highlighter; |
131 |
private ITaskHighlighter highlighter; |
|
Lines 147-152
Link Here
|
| 147 |
|
140 |
|
| 148 |
private boolean eclipse_3_3_workbench = false; |
141 |
private boolean eclipse_3_3_workbench = false; |
| 149 |
|
142 |
|
|
|
143 |
private static final class OrderComparator implements Comparator<AbstractTaskRepositoryLinkProvider> { |
| 144 |
public int compare(AbstractTaskRepositoryLinkProvider p1, AbstractTaskRepositoryLinkProvider p2) { |
| 145 |
return p1.getOrder()-p2.getOrder(); |
| 146 |
} |
| 147 |
} |
| 148 |
|
| 150 |
public enum TaskListSaveMode { |
149 |
public enum TaskListSaveMode { |
| 151 |
ONE_HOUR, THREE_HOURS, DAY; |
150 |
ONE_HOUR, THREE_HOURS, DAY; |
| 152 |
@Override |
151 |
@Override |
|
Lines 296-302
Link Here
|
| 296 |
if (connector != null) { |
295 |
if (connector != null) { |
| 297 |
ITaskDataHandler offlineHandler = connector.getTaskDataHandler(); |
296 |
ITaskDataHandler offlineHandler = connector.getTaskDataHandler(); |
| 298 |
if (offlineHandler != null && repositoryTask.getTaskData().getLastModified() != null) { |
297 |
if (offlineHandler != null && repositoryTask.getTaskData().getLastModified() != null) { |
| 299 |
Date modified = repositoryTask.getTaskData().getAttributeFactory().getDateForAttributeType( |
298 |
Date modified = offlineHandler.getDateForAttributeType( |
| 300 |
RepositoryTaskAttribute.DATE_MODIFIED, repositoryTask.getTaskData() |
299 |
RepositoryTaskAttribute.DATE_MODIFIED, repositoryTask.getTaskData() |
| 301 |
.getLastModified()); |
300 |
.getLastModified()); |
| 302 |
notification.setDate(modified); |
301 |
notification.setDate(modified); |
|
Lines 382-403
Link Here
|
| 382 |
taskRepositoryManager = new TaskRepositoryManager(taskListManager.getTaskList()); |
381 |
taskRepositoryManager = new TaskRepositoryManager(taskListManager.getTaskList()); |
| 383 |
synchronizationManager = new RepositorySynchronizationManager(); |
382 |
synchronizationManager = new RepositorySynchronizationManager(); |
| 384 |
|
383 |
|
| 385 |
|
|
|
| 386 |
// NOTE: initializing extensions in start(..) has caused race |
384 |
// NOTE: initializing extensions in start(..) has caused race |
| 387 |
// conditions previously |
385 |
// conditions previously |
| 388 |
TasksUiExtensionReader.initStartupExtensions(taskListWriter); |
386 |
TasksUiExtensionReader.initStartupExtensions(taskListWriter); |
| 389 |
|
|
|
| 390 |
// The repositories need to be read before the tasks so that the getAttributeFactory |
| 391 |
// can use the repository to get the information it needs |
| 392 |
taskRepositoryManager.readRepositories(getRepositoriesFilePath()); |
| 393 |
|
| 394 |
readOfflineReports(); |
387 |
readOfflineReports(); |
| 395 |
for (ITaskListExternalizer externalizer : taskListWriter.getExternalizers()) { |
388 |
for (ITaskListExternalizer externalizer : taskListWriter.getExternalizers()) { |
| 396 |
if (externalizer instanceof DelegatingTaskExternalizer) { |
389 |
if (externalizer instanceof DelegatingTaskExternalizer) { |
| 397 |
((DelegatingTaskExternalizer) externalizer).init(offlineTaskManager); |
390 |
((DelegatingTaskExternalizer) externalizer).init(offlineTaskManager); |
| 398 |
} |
391 |
} |
| 399 |
} |
392 |
} |
| 400 |
|
393 |
taskRepositoryManager.readRepositories(getRepositoriesFilePath()); |
| 401 |
taskListWriter.setTaskDataManager(offlineTaskManager); |
394 |
taskListWriter.setTaskDataManager(offlineTaskManager); |
| 402 |
|
395 |
|
| 403 |
// NOTE: task list must be read before Task List view can be initialized |
396 |
// NOTE: task list must be read before Task List view can be initialized |
|
Lines 677-682
Link Here
|
| 677 |
this.hyperlinkDetectors.add(listener); |
670 |
this.hyperlinkDetectors.add(listener); |
| 678 |
} |
671 |
} |
| 679 |
|
672 |
|
|
|
673 |
public void addRepositoryLinkProvider(AbstractTaskRepositoryLinkProvider repositoryLinkProvider) { |
| 674 |
if (repositoryLinkProvider != null) |
| 675 |
this.repositoryLinkProviders.add(repositoryLinkProvider); |
| 676 |
} |
| 677 |
|
| 680 |
public TaskListBackupManager getBackupManager() { |
678 |
public TaskListBackupManager getBackupManager() { |
| 681 |
return taskListBackupManager; |
679 |
return taskListBackupManager; |
| 682 |
} |
680 |
} |
|
Lines 742-747
Link Here
|
| 742 |
return getDataDirectory() + File.separator + TaskRepositoryManager.DEFAULT_REPOSITORIES_FILE; |
740 |
return getDataDirectory() + File.separator + TaskRepositoryManager.DEFAULT_REPOSITORIES_FILE; |
| 743 |
} |
741 |
} |
| 744 |
|
742 |
|
|
|
743 |
public boolean canSetRepositoryForResource(IResource resource) { |
| 744 |
if (resource == null) { |
| 745 |
return false; |
| 746 |
} |
| 747 |
|
| 748 |
// find first provider that can link repository |
| 749 |
for (AbstractTaskRepositoryLinkProvider linkProvider : repositoryLinkProviders) { |
| 750 |
TaskRepository repository = linkProvider.getTaskRepository(resource, getRepositoryManager()); |
| 751 |
if (repository != null) { |
| 752 |
return linkProvider.canSetTaskRepository(resource); |
| 753 |
} |
| 754 |
} |
| 755 |
// find first provider that can set new repository |
| 756 |
for (AbstractTaskRepositoryLinkProvider linkProvider : repositoryLinkProviders) { |
| 757 |
if (linkProvider.canSetTaskRepository(resource)) { |
| 758 |
return true; |
| 759 |
} |
| 760 |
} |
| 761 |
return false; |
| 762 |
} |
| 763 |
|
| 745 |
/** |
764 |
/** |
| 746 |
* Associate a Task Repository with a workbench project |
765 |
* Associate a Task Repository with a workbench project |
| 747 |
* |
766 |
* |
|
Lines 752-772
Link Here
|
| 752 |
* @throws CoreException |
771 |
* @throws CoreException |
| 753 |
*/ |
772 |
*/ |
| 754 |
public void setRepositoryForResource(IResource resource, TaskRepository repository) throws CoreException { |
773 |
public void setRepositoryForResource(IResource resource, TaskRepository repository) throws CoreException { |
| 755 |
if (resource == null || repository == null || !resource.getProject().isOpen()) { |
774 |
if (resource == null || repository == null) { |
| 756 |
return; |
775 |
return; |
| 757 |
} |
776 |
} |
| 758 |
IProject project = resource.getProject(); |
777 |
|
| 759 |
if (project == null) |
778 |
for (AbstractTaskRepositoryLinkProvider linkProvider : repositoryLinkProviders) { |
| 760 |
return; |
779 |
TaskRepository r = linkProvider.getTaskRepository(resource, getRepositoryManager()); |
| 761 |
IScopeContext projectScope = new ProjectScope(project); |
780 |
boolean canSetRepository = linkProvider.canSetTaskRepository(resource); |
| 762 |
IEclipsePreferences projectNode = projectScope.getNode(PLUGIN_ID); |
781 |
if (r != null && !canSetRepository) { |
| 763 |
if (projectNode != null) { |
782 |
return; |
| 764 |
projectNode.put(PROJECT_REPOSITORY_KIND, repository.getKind()); |
783 |
} |
| 765 |
projectNode.put(PROJECT_REPOSITORY_URL, repository.getUrl()); |
784 |
if (canSetRepository) { |
| 766 |
try { |
785 |
linkProvider.setTaskRepository(resource, repository); |
| 767 |
projectNode.flush(); |
786 |
return; |
| 768 |
} catch (BackingStoreException e) { |
|
|
| 769 |
MylarStatusHandler.fail(e, "Failed to save task repository to project association preference", false); |
| 770 |
} |
787 |
} |
| 771 |
} |
788 |
} |
| 772 |
} |
789 |
} |
|
Lines 776-800
Link Here
|
| 776 |
* project (or resource belonging to a project) |
793 |
* project (or resource belonging to a project) |
| 777 |
*/ |
794 |
*/ |
| 778 |
public TaskRepository getRepositoryForResource(IResource resource, boolean silent) { |
795 |
public TaskRepository getRepositoryForResource(IResource resource, boolean silent) { |
| 779 |
if (resource == null) |
796 |
if (resource == null) { |
| 780 |
return null; |
797 |
return null; |
| 781 |
IProject project = resource.getProject(); |
798 |
} |
| 782 |
if (project == null) |
799 |
|
| 783 |
return null; |
800 |
for (AbstractTaskRepositoryLinkProvider linkProvider : repositoryLinkProviders) { |
| 784 |
TaskRepository taskRepository = null; |
801 |
TaskRepository repository = linkProvider.getTaskRepository(resource, getRepositoryManager()); |
| 785 |
IScopeContext projectScope = new ProjectScope(project); |
802 |
if (repository != null) { |
| 786 |
IEclipsePreferences projectNode = projectScope.getNode(PLUGIN_ID); |
803 |
return repository; |
| 787 |
if (projectNode != null) { |
|
|
| 788 |
String kind = projectNode.get(PROJECT_REPOSITORY_KIND, ""); |
| 789 |
String urlString = projectNode.get(PROJECT_REPOSITORY_URL, ""); |
| 790 |
taskRepository = getRepositoryManager().getRepository(kind, urlString); |
| 791 |
if (taskRepository == null && !silent) { |
| 792 |
MessageDialog |
| 793 |
.openInformation(null, "No Repository Found", |
| 794 |
"No repository was found. Associate a Task Repository with this project via the project's property page."); |
| 795 |
} |
804 |
} |
| 796 |
} |
805 |
} |
| 797 |
return taskRepository; |
806 |
|
|
|
807 |
if (!silent) { |
| 808 |
MessageDialog |
| 809 |
.openInformation(null, "No Repository Found", |
| 810 |
"No repository was found. Associate a Task Repository with this project via the project's property page."); |
| 811 |
} |
| 812 |
|
| 813 |
return null; |
| 798 |
} |
814 |
} |
| 799 |
|
815 |
|
| 800 |
public boolean isEclipse_3_3_workbench() { |
816 |
public boolean isEclipse_3_3_workbench() { |