View | Details | Raw Unified | Return to bug 302907 | Differences between
and this patch

Collapse All | Expand All

(-)src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaRepositoryMigrator.java (+39 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2004, 2008 Tasktop Technologies and others.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 *
8
 * Contributors:
9
 *     Tasktop Technologies - initial API and implementation
10
 *******************************************************************************/
11
12
package org.eclipse.mylyn.internal.bugzilla.ui.tasklist;
13
14
import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin;
15
import org.eclipse.mylyn.internal.tasks.core.IRepositoryConstants;
16
import org.eclipse.mylyn.tasks.core.AbstractRepositoryMigrator;
17
import org.eclipse.mylyn.tasks.core.TaskRepository;
18
19
/**
20
 * @author Robert Elves
21
 * @since 3.4
22
 */
23
public class BugzillaRepositoryMigrator extends AbstractRepositoryMigrator {
24
25
	@Override
26
	public String getConnectorKind() {
27
		return BugzillaCorePlugin.CONNECTOR_KIND;
28
	}
29
30
	@Override
31
	public boolean migrateRepository(TaskRepository repository) {
32
		if (repository.getProperty(IRepositoryConstants.PROPERTY_CATEGORY) == null) {
33
			repository.setProperty(IRepositoryConstants.PROPERTY_CATEGORY, IRepositoryConstants.CATEGORY_BUGS);
34
			return true;
35
		}
36
		return false;
37
	}
38
39
}
(-)META-INF/MANIFEST.MF (+1 lines)
Lines 14-19 Link Here
14
 org.eclipse.mylyn.internal.tasks.core;x-friends:="org.eclipse.mylyn.tasks.ui,org.eclipse.mylyn.tasks.bugs",
14
 org.eclipse.mylyn.internal.tasks.core;x-friends:="org.eclipse.mylyn.tasks.ui,org.eclipse.mylyn.tasks.bugs",
15
 org.eclipse.mylyn.internal.tasks.core.data;x-friends:="org.eclipse.mylyn.tasks.ui,org.eclipse.mylyn.tasks.bugs",
15
 org.eclipse.mylyn.internal.tasks.core.data;x-friends:="org.eclipse.mylyn.tasks.ui,org.eclipse.mylyn.tasks.bugs",
16
 org.eclipse.mylyn.internal.tasks.core.externalization;x-friends:="org.eclipse.mylyn.tasks.ui,org.eclipse.mylyn.tasks.bugs",
16
 org.eclipse.mylyn.internal.tasks.core.externalization;x-friends:="org.eclipse.mylyn.tasks.ui,org.eclipse.mylyn.tasks.bugs",
17
 org.eclipse.mylyn.internal.tasks.core.notifications;x-friends:="org.eclipse.mylyn.tasks.ui,org.eclipse.mylyn.tasks.bugs",
17
 org.eclipse.mylyn.internal.tasks.core.sync;x-friends:="org.eclipse.mylyn.tasks.ui,org.eclipse.mylyn.tasks.bugs",
18
 org.eclipse.mylyn.internal.tasks.core.sync;x-friends:="org.eclipse.mylyn.tasks.ui,org.eclipse.mylyn.tasks.bugs",
18
 org.eclipse.mylyn.tasks.core,
19
 org.eclipse.mylyn.tasks.core,
19
 org.eclipse.mylyn.tasks.core.data,
20
 org.eclipse.mylyn.tasks.core.data,
(-)src/org/eclipse/mylyn/internal/tasks/core/IRepositoryConstants.java (+8 lines)
Lines 29-34 Link Here
29
29
30
	public static final String PROPERTY_CONNECTOR_KIND = "kind"; //$NON-NLS-1$
30
	public static final String PROPERTY_CONNECTOR_KIND = "kind"; //$NON-NLS-1$
31
31
32
	public static final String PROPERTY_CATEGORY = "category"; //$NON-NLS-1$
33
32
	public static final String PROPERTY_URL = "url"; //$NON-NLS-1$
34
	public static final String PROPERTY_URL = "url"; //$NON-NLS-1$
33
35
34
	public static final String PROPERTY_LABEL = "label"; //$NON-NLS-1$
36
	public static final String PROPERTY_LABEL = "label"; //$NON-NLS-1$
Lines 37-40 Link Here
37
39
38
	public static final String KIND_UNKNOWN = "<unknown>"; //$NON-NLS-1$
40
	public static final String KIND_UNKNOWN = "<unknown>"; //$NON-NLS-1$
39
41
42
	public static final String CATEGORY_TASKS = "org.eclipse.mylyn.category.tasks"; //$NON-NLS-1$
43
44
	public static final String CATEGORY_BUGS = "org.eclipse.mylyn.category.bugs"; //$NON-NLS-1$
45
46
	public static final String CATEGORY_OTHER = "org.eclipse.mylyn.category.other"; //$NON-NLS-1$
47
40
}
48
}
(-)src/org/eclipse/mylyn/internal/tasks/core/TaskRepositoryManager.java (-3 / +67 lines)
Lines 33-38 Link Here
33
import org.eclipse.mylyn.commons.core.StatusHandler;
33
import org.eclipse.mylyn.commons.core.StatusHandler;
34
import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryDelta.Type;
34
import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryDelta.Type;
35
import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
35
import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
36
import org.eclipse.mylyn.tasks.core.AbstractRepositoryMigrator;
36
import org.eclipse.mylyn.tasks.core.IRepositoryListener;
37
import org.eclipse.mylyn.tasks.core.IRepositoryListener;
37
import org.eclipse.mylyn.tasks.core.IRepositoryManager;
38
import org.eclipse.mylyn.tasks.core.IRepositoryManager;
38
import org.eclipse.mylyn.tasks.core.ITask;
39
import org.eclipse.mylyn.tasks.core.ITask;
Lines 57-62 Link Here
57
58
58
	private final Map<String, AbstractRepositoryConnector> repositoryConnectors = new HashMap<String, AbstractRepositoryConnector>();
59
	private final Map<String, AbstractRepositoryConnector> repositoryConnectors = new HashMap<String, AbstractRepositoryConnector>();
59
60
61
	// connector kinds to corresponding repositories
60
	private final Map<String, Set<TaskRepository>> repositoryMap = new HashMap<String, Set<TaskRepository>>();
62
	private final Map<String, Set<TaskRepository>> repositoryMap = new HashMap<String, Set<TaskRepository>>();
61
63
62
	private final Set<IRepositoryListener> listeners = new CopyOnWriteArraySet<IRepositoryListener>();
64
	private final Set<IRepositoryListener> listeners = new CopyOnWriteArraySet<IRepositoryListener>();
Lines 67-72 Link Here
67
69
68
	public static final String PREFIX_LOCAL = "local-"; //$NON-NLS-1$
70
	public static final String PREFIX_LOCAL = "local-"; //$NON-NLS-1$
69
71
72
	private static final Map<String, Category> repositoryCategories = new HashMap<String, Category>();
73
70
	private final PropertyChangeListener PROPERTY_CHANGE_LISTENER = new PropertyChangeListener() {
74
	private final PropertyChangeListener PROPERTY_CHANGE_LISTENER = new PropertyChangeListener() {
71
		public void propertyChange(PropertyChangeEvent evt) {
75
		public void propertyChange(PropertyChangeEvent evt) {
72
			TaskRepositoryManager.this.notifyRepositorySettingsChanged((TaskRepository) evt.getSource(),
76
			TaskRepositoryManager.this.notifyRepositorySettingsChanged((TaskRepository) evt.getSource(),
Lines 76-82 Link Here
76
80
77
	private final TaskRepositoriesExternalizer externalizer = new TaskRepositoriesExternalizer();
81
	private final TaskRepositoriesExternalizer externalizer = new TaskRepositoriesExternalizer();
78
82
83
	private List<AbstractRepositoryMigrator> migrators;
84
79
	public TaskRepositoryManager() {
85
	public TaskRepositoryManager() {
86
		this.migrators = Collections.emptyList();
87
		Category catTasks = new Category(IRepositoryConstants.CATEGORY_TASKS, "Tasks", 0); //$NON-NLS-1$
88
		repositoryCategories.put(catTasks.getId(), catTasks);
89
		Category catBugs = new Category(IRepositoryConstants.CATEGORY_BUGS, "Bugs", 100); //$NON-NLS-1$
90
		repositoryCategories.put(catBugs.getId(), catBugs);
91
		Category catOther = new Category(IRepositoryConstants.CATEGORY_OTHER, "Other", 200); //$NON-NLS-1$
92
		repositoryCategories.put(catOther.getId(), catOther);
80
	}
93
	}
81
94
82
	public synchronized Collection<AbstractRepositoryConnector> getRepositoryConnectors() {
95
	public synchronized Collection<AbstractRepositoryConnector> getRepositoryConnectors() {
Lines 118-123 Link Here
118
				// TODO 4.0 return false to indicate that remove was unsuccessful
131
				// TODO 4.0 return false to indicate that remove was unsuccessful
119
				return;
132
				return;
120
			}
133
			}
134
121
			repository.addChangeListener(PROPERTY_CHANGE_LISTENER);
135
			repository.addChangeListener(PROPERTY_CHANGE_LISTENER);
122
		}
136
		}
123
137
Lines 182-187 Link Here
182
		return sb.toString();
196
		return sb.toString();
183
	}
197
	}
184
198
199
	public Category getCategory(String id) {
200
		Category category = repositoryCategories.get(IRepositoryConstants.CATEGORY_OTHER);
201
		Category cat = repositoryCategories.get(id);
202
		if (cat != null) {
203
			category = cat;
204
		}
205
		return category;
206
	}
207
185
	public TaskRepository getRepository(String kind, String urlString) {
208
	public TaskRepository getRepository(String kind, String urlString) {
186
		Assert.isNotNull(kind);
209
		Assert.isNotNull(kind);
187
		Assert.isNotNull(urlString);
210
		Assert.isNotNull(urlString);
Lines 233-243 Link Here
233
		return null;
256
		return null;
234
	}
257
	}
235
258
236
	public Set<TaskRepository> getRepositories(String kind) {
259
	public Set<TaskRepository> getRepositories(String connectorKind) {
237
		Assert.isNotNull(kind);
260
		Assert.isNotNull(connectorKind);
238
		Set<TaskRepository> result;
261
		Set<TaskRepository> result;
239
		synchronized (this) {
262
		synchronized (this) {
240
			result = repositoryMap.get(kind);
263
			result = repositoryMap.get(connectorKind);
241
		}
264
		}
242
		if (result == null) {
265
		if (result == null) {
243
			return Collections.emptySet();
266
			return Collections.emptySet();
Lines 309-317 Link Here
309
					if (removeHttpAuthMigration(repository)) {
332
					if (removeHttpAuthMigration(repository)) {
310
						migration = true;
333
						migration = true;
311
					}
334
					}
335
					if (applyMigrators(repository)) {
336
						migration = true;
337
					}
312
					if (repositoryMap.containsKey(repository.getConnectorKind())) {
338
					if (repositoryMap.containsKey(repository.getConnectorKind())) {
313
						repositoryMap.get(repository.getConnectorKind()).add(repository);
339
						repositoryMap.get(repository.getConnectorKind()).add(repository);
340
314
						repository.addChangeListener(PROPERTY_CHANGE_LISTENER);
341
						repository.addChangeListener(PROPERTY_CHANGE_LISTENER);
342
315
					} else {
343
					} else {
316
						orphanedRepositories.add(repository);
344
						orphanedRepositories.add(repository);
317
					}
345
					}
Lines 323-328 Link Here
323
		}
351
		}
324
	}
352
	}
325
353
354
	private boolean applyMigrators(final TaskRepository repository) {
355
		final boolean[] result = new boolean[1];
356
		for (AbstractRepositoryMigrator migrator : migrators) {
357
			if (migrator.getConnectorKind().equals(repository.getConnectorKind())) {
358
359
				final AbstractRepositoryMigrator finalRepositoryMigrator = migrator;
360
				result[0] = false;
361
				SafeRunner.run(new ISafeRunnable() {
362
363
					public void handleException(Throwable e) {
364
						StatusHandler.log(new Status(IStatus.WARNING, ITasksCoreConstants.ID_PLUGIN,
365
								"Repository migration failed for repository \"" + repository.getUrl() + "\"", e)); //$NON-NLS-1$ //$NON-NLS-2$
366
					}
367
368
					public void run() throws Exception {
369
						if (finalRepositoryMigrator.migrateRepository(repository)) {
370
							result[0] = true;
371
						}
372
					}
373
374
				});
375
				break;
376
			}
377
		}
378
		return result[0];
379
	}
380
326
	@SuppressWarnings("deprecation")
381
	@SuppressWarnings("deprecation")
327
	private boolean removeHttpAuthMigration(TaskRepository repository) {
382
	private boolean removeHttpAuthMigration(TaskRepository repository) {
328
		String httpusername = repository.getProperty(TaskRepository.AUTH_HTTP_USERNAME);
383
		String httpusername = repository.getProperty(TaskRepository.AUTH_HTTP_USERNAME);
Lines 447-450 Link Here
447
		}
502
		}
448
	}
503
	}
449
504
505
	public Category getCategory(TaskRepository repository) {
506
		String categoryId = repository.getProperty(IRepositoryConstants.PROPERTY_CATEGORY);
507
		return getCategory(categoryId);
508
	}
509
510
	public void initialize(List<AbstractRepositoryMigrator> repositoryMigrators) {
511
		this.migrators = repositoryMigrators;
512
513
	}
450
}
514
}
(-)src/org/eclipse/mylyn/tasks/core/AbstractRepositoryMigrator.java (+26 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2004, 2008 Tasktop Technologies and others.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 *
8
 * Contributors:
9
 *     Tasktop Technologies - initial API and implementation
10
 *******************************************************************************/
11
12
package org.eclipse.mylyn.tasks.core;
13
14
/**
15
 * @author Robert Elves
16
 * @since 3.4
17
 */
18
public abstract class AbstractRepositoryMigrator {
19
20
	public abstract String getConnectorKind();
21
22
	public boolean migrateRepository(TaskRepository repository) {
23
		return false;
24
	}
25
26
}
(-)src/org/eclipse/mylyn/internal/tasks/core/Category.java (+59 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2010 Tasktop Technologies and others.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 *
8
 * Contributors:
9
 *     Tasktop Technologies - initial API and implementation
10
 *******************************************************************************/
11
12
package org.eclipse.mylyn.internal.tasks.core;
13
14
import org.eclipse.core.runtime.PlatformObject;
15
16
/**
17
 * Categories include Tasks, Bugs, Other...
18
 * 
19
 * @author Robert Elves
20
 */
21
public class Category extends PlatformObject {
22
23
	private final String id;
24
25
	private final String label;
26
27
	private final int rank;
28
29
	public Category(String id, String label, int rank) {
30
		this.id = id;
31
		this.label = label;
32
		this.rank = rank;
33
	}
34
35
	public String getId() {
36
		return id;
37
	}
38
39
	public int compareTo(Object arg0) {
40
		if (arg0 instanceof Category) {
41
			return this.getRank() - ((Category) arg0).getRank();
42
		}
43
		return 0;
44
	}
45
46
	public int getRank() {
47
		return rank;
48
	}
49
50
	public String getLabel() {
51
		return label;
52
	}
53
54
	@Override
55
	public String toString() {
56
		return getLabel();
57
	};
58
59
}
(-)src/org/eclipse/mylyn/internal/tasks/ui/actions/Messages.java (-1 / +1 lines)
Lines 37-43 Link Here
37
37
38
	public static String AddRepositoryAction_Add_a_query_to_the_Task_List;
38
	public static String AddRepositoryAction_Add_a_query_to_the_Task_List;
39
39
40
	public static String AddRepositoryAction_Add_Task_Repository;
40
	public static String AddRepositoryAction_Add_Team_Repository;
41
41
42
	public static String AddRepositoryAction_Do_not_show_again;
42
	public static String AddRepositoryAction_Do_not_show_again;
43
43
(-)src/org/eclipse/mylyn/internal/tasks/ui/actions/AddRepositoryAction.java (-1 / +1 lines)
Lines 45-51 Link Here
45
45
46
	private static final String ID = "org.eclipse.mylyn.tasklist.repositories.add"; //$NON-NLS-1$
46
	private static final String ID = "org.eclipse.mylyn.tasklist.repositories.add"; //$NON-NLS-1$
47
47
48
	public static final String TITLE = Messages.AddRepositoryAction_Add_Task_Repository;
48
	public static final String TITLE = Messages.AddRepositoryAction_Add_Team_Repository;
49
49
50
	private boolean promptToAddQuery = true;
50
	private boolean promptToAddQuery = true;
51
51
(-)src/org/eclipse/mylyn/internal/tasks/ui/actions/messages.properties (-4 / +4 lines)
Lines 17-23 Link Here
17
AddRepositoryAction_Add_new_query=Add new query
17
AddRepositoryAction_Add_new_query=Add new query
18
18
19
AddRepositoryAction_Add_a_query_to_the_Task_List=Would you like to add a query to the Task List for this repository?
19
AddRepositoryAction_Add_a_query_to_the_Task_List=Would you like to add a query to the Task List for this repository?
20
AddRepositoryAction_Add_Task_Repository=Add Task Repository...
20
AddRepositoryAction_Add_Team_Repository=Add Repository...
21
AddRepositoryAction_Do_not_show_again=Do not show again
21
AddRepositoryAction_Do_not_show_again=Do not show again
22
AutoUpdateQueryAction_Synchronize_Automatically_Label=Synchronize Automatically
22
AutoUpdateQueryAction_Synchronize_Automatically_Label=Synchronize Automatically
23
23
Lines 56-62 Link Here
56
DeleteAction_Delete_task_from_task_list_context_planning_deleted=Delete the following task from the Task List? Contexts and planning information will be deleted for the selected task. The server copy will not be deleted and the task will remain in queries that match it if it is not deleted from the repository.
56
DeleteAction_Delete_task_from_task_list_context_planning_deleted=Delete the following task from the Task List? Contexts and planning information will be deleted for the selected task. The server copy will not be deleted and the task will remain in queries that match it if it is not deleted from the repository.
57
DeleteAction_Delete_tasks_from_task_list_context_planning_deleted=Delete the following tasks from the Task List?  Contexts and planning information will be deleted for the selected tasks. The server copy will not be deleted and the tasks will remain in queries that match it if it is not deleted from the repository.
57
DeleteAction_Delete_tasks_from_task_list_context_planning_deleted=Delete the following tasks from the Task List?  Contexts and planning information will be deleted for the selected tasks. The server copy will not be deleted and the tasks will remain in queries that match it if it is not deleted from the repository.
58
DeleteAction_Delete_the_planning_information_and_context_of_all_unmatched_tasks=Delete the planning information and context of all unmatched tasks?  The server copy of these tasks will not be deleted and the task will remain in queries that match it.
58
DeleteAction_Delete_the_planning_information_and_context_of_all_unmatched_tasks=Delete the planning information and context of all unmatched tasks?  The server copy of these tasks will not be deleted and the task will remain in queries that match it.
59
DeleteAction_Deleting_tasks_from_repositories=Deleting Tasks from Task Repositories
59
DeleteAction_Deleting_tasks_from_repositories=Deleting Tasks from Team Repositories
60
DeleteAction_Not_supported=(not supported)
60
DeleteAction_Not_supported=(not supported)
61
DeleteAction_Nothing_selected=Nothing selected.
61
DeleteAction_Nothing_selected=Nothing selected.
62
DeleteAction_Permanently_delete_from_task_list=Permanently delete the following task from the Task List?
62
DeleteAction_Permanently_delete_from_task_list=Permanently delete the following task from the Task List?
Lines 67-77 Link Here
67
67
68
DeleteTaskEditorAction_Delete_Task=Delete Task
68
DeleteTaskEditorAction_Delete_Task=Delete Task
69
DeleteTaskRepositoryAction_Confirm_Delete=Confirm Delete
69
DeleteTaskRepositoryAction_Confirm_Delete=Confirm Delete
70
DeleteTaskRepositoryAction_Delete_Specific_Task_Repository=Are you sure you want to delete task repository "{0}"?
70
DeleteTaskRepositoryAction_Delete_Specific_Task_Repository=Are you sure you want to delete team repository "{0}"?
71
DeleteTaskRepositoryAction_Delete_Repository=Delete Repository
71
DeleteTaskRepositoryAction_Delete_Repository=Delete Repository
72
DeleteTaskRepositoryAction_Delete_Repository_In_Progress=Deleting repository and related artifacts
72
DeleteTaskRepositoryAction_Delete_Repository_In_Progress=Deleting repository and related artifacts
73
DeleteTaskRepositoryAction_Delete_the_selected_task_repositories=This repository is being used by {0} tasks and {1} queries. Do you wish to delete the repository, tasks, and queries?
73
DeleteTaskRepositoryAction_Delete_the_selected_task_repositories=This repository is being used by {0} tasks and {1} queries. Do you wish to delete the repository, tasks, and queries?
74
DeleteTaskRepositoryAction_Delete_Task_Repository_Failed=Delete Task Repository Failed
74
DeleteTaskRepositoryAction_Delete_Task_Repository_Failed=Delete Team Repository Failed
75
75
76
EditRepositoryPropertiesAction_Properties=Properties
76
EditRepositoryPropertiesAction_Properties=Properties
77
77
(-)src/org/eclipse/mylyn/internal/tasks/ui/views/TaskRepositoryLabelProvider.java (-1 / +6 lines)
Lines 14-19 Link Here
14
import org.eclipse.jface.viewers.ILabelProvider;
14
import org.eclipse.jface.viewers.ILabelProvider;
15
import org.eclipse.jface.viewers.ILabelProviderListener;
15
import org.eclipse.jface.viewers.ILabelProviderListener;
16
import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
16
import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
17
import org.eclipse.mylyn.internal.tasks.core.Category;
17
import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
18
import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
18
import org.eclipse.mylyn.internal.tasks.ui.actions.DisconnectRepositoryAction;
19
import org.eclipse.mylyn.internal.tasks.ui.actions.DisconnectRepositoryAction;
19
import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
20
import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
Lines 37-43 Link Here
37
	}
38
	}
38
39
39
	public Image getImage(Object object) {
40
	public Image getImage(Object object) {
40
		if (object instanceof AbstractRepositoryConnector) {
41
		if (object instanceof Category) {
42
			return CommonImages.getImage(TasksUiImages.CATEGORY);
43
		} else if (object instanceof AbstractRepositoryConnector) {
41
			AbstractRepositoryConnector repositoryConnector = (AbstractRepositoryConnector) object;
44
			AbstractRepositoryConnector repositoryConnector = (AbstractRepositoryConnector) object;
42
			Image image = TasksUiPlugin.getDefault().getBrandingIcon(repositoryConnector.getConnectorKind());
45
			Image image = TasksUiPlugin.getDefault().getBrandingIcon(repositoryConnector.getConnectorKind());
43
			if (image != null) {
46
			if (image != null) {
Lines 67-72 Link Here
67
			return label.toString();
70
			return label.toString();
68
		} else if (object instanceof AbstractRepositoryConnector) {
71
		} else if (object instanceof AbstractRepositoryConnector) {
69
			return ((AbstractRepositoryConnector) object).getLabel();
72
			return ((AbstractRepositoryConnector) object).getLabel();
73
		} else if (object instanceof Category) {
74
			return ((Category) object).getLabel();
70
		} else {
75
		} else {
71
			return null;
76
			return null;
72
		}
77
		}
(-)src/org/eclipse/mylyn/internal/tasks/ui/views/TaskRepositoriesView.java (-52 / +17 lines)
Lines 22-31 Link Here
22
import org.eclipse.jface.viewers.DecoratingLabelProvider;
22
import org.eclipse.jface.viewers.DecoratingLabelProvider;
23
import org.eclipse.jface.viewers.DoubleClickEvent;
23
import org.eclipse.jface.viewers.DoubleClickEvent;
24
import org.eclipse.jface.viewers.IDoubleClickListener;
24
import org.eclipse.jface.viewers.IDoubleClickListener;
25
import org.eclipse.jface.viewers.IStructuredContentProvider;
25
import org.eclipse.jface.viewers.TreeViewer;
26
import org.eclipse.jface.viewers.TableViewer;
27
import org.eclipse.jface.viewers.Viewer;
28
import org.eclipse.mylyn.commons.core.StatusHandler;
26
import org.eclipse.mylyn.commons.core.StatusHandler;
27
import org.eclipse.mylyn.internal.tasks.core.Category;
29
import org.eclipse.mylyn.internal.tasks.core.IRepositoryModelListener;
28
import org.eclipse.mylyn.internal.tasks.core.IRepositoryModelListener;
30
import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryAdapter;
29
import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryAdapter;
31
import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
30
import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
Lines 50-55 Link Here
50
import org.eclipse.ui.handlers.IHandlerService;
49
import org.eclipse.ui.handlers.IHandlerService;
51
import org.eclipse.ui.part.ViewPart;
50
import org.eclipse.ui.part.ViewPart;
52
import org.eclipse.ui.texteditor.IWorkbenchActionDefinitionIds;
51
import org.eclipse.ui.texteditor.IWorkbenchActionDefinitionIds;
52
import org.eclipse.ui.themes.IThemeManager;
53
53
54
/**
54
/**
55
 * @author Mik Kersten
55
 * @author Mik Kersten
Lines 62-68 Link Here
62
	@Deprecated
62
	@Deprecated
63
	public static final String ID = ITasksUiConstants.ID_VIEW_REPOSITORIES;
63
	public static final String ID = ITasksUiConstants.ID_VIEW_REPOSITORIES;
64
64
65
	private TableViewer viewer;
65
	private TreeViewer viewer;
66
66
67
	private final Action addRepositoryAction = new AddRepositoryAction();
67
	private final Action addRepositoryAction = new AddRepositoryAction();
68
68
Lines 121-138 Link Here
121
		}
121
		}
122
	};
122
	};
123
123
124
	static class ViewContentProvider implements IStructuredContentProvider {
125
		public void inputChanged(Viewer v, Object oldInput, Object newInput) {
126
		}
127
128
		public void dispose() {
129
		}
130
131
		public Object[] getElements(Object parent) {
132
			return TasksUi.getRepositoryManager().getAllRepositories().toArray();
133
		}
134
	}
135
136
	public TaskRepositoriesView() {
124
	public TaskRepositoriesView() {
137
		TasksUi.getRepositoryManager().addListener(REPOSITORY_LISTENER);
125
		TasksUi.getRepositoryManager().addListener(REPOSITORY_LISTENER);
138
		TasksUiPlugin.getDefault().addModelListener(MODEL_LISTENER);
126
		TasksUiPlugin.getDefault().addModelListener(MODEL_LISTENER);
Lines 172-198 Link Here
172
160
173
	@Override
161
	@Override
174
	public void createPartControl(Composite parent) {
162
	public void createPartControl(Composite parent) {
175
		viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION);
163
		viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION);
176
		viewer.setContentProvider(new ViewContentProvider());
164
		viewer.setContentProvider(new TeamRepositoriesContentProvider());
177
		viewer.setUseHashlookup(true);
165
		viewer.setUseHashlookup(true);
178
		viewer.setLabelProvider(new DecoratingLabelProvider(new TaskRepositoryLabelProvider(),
166
		viewer.setLabelProvider(new DecoratingLabelProvider(new TaskRepositoryLabelProvider(),
179
				PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator()));
167
				PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator()));
180
168
181
		viewer.setSorter(new TaskRepositoriesSorter());
169
		viewer.setSorter(new TaskRepositoriesViewSorter());
182
170
183
//				new ViewerSorter() {
184
//
185
//			@Override
186
//			public int compare(Viewer viewer, Object e1, Object e2) {
187
//				if (e1 instanceof TaskRepository && e2 instanceof TaskRepository) {
188
//					TaskRepository t1 = (TaskRepository) e1;
189
//					TaskRepository t2 = (TaskRepository) e2;
190
//					return (t1.getKind() + t1.getUrl()).compareTo(t2.getKind() + t2.getUrl());
191
//				} else {
192
//					return super.compare(viewer, e1, e2);
193
//				}
194
//			}
195
//		});
196
		viewer.setInput(getViewSite());
171
		viewer.setInput(getViewSite());
197
		viewer.addDoubleClickListener(new IDoubleClickListener() {
172
		viewer.addDoubleClickListener(new IDoubleClickListener() {
198
			public void doubleClick(DoubleClickEvent event) {
173
			public void doubleClick(DoubleClickEvent event) {
Lines 208-220 Link Here
208
			}
183
			}
209
		});
184
		});
210
185
211
		// FIXME remove listener when view is disposed
186
		final IThemeManager themeManager = getSite().getWorkbenchWindow().getWorkbench().getThemeManager();
212
		TasksUi.getRepositoryManager().addListener(new TaskRepositoryListener());
187
		new GradientDrawer(themeManager, getViewer()) {
188
			@Override
189
			protected boolean shouldApplyGradient(org.eclipse.swt.widgets.Event event) {
190
				return event.item.getData() instanceof Category;
191
			}
192
		};
213
193
214
		makeActions();
194
		makeActions();
215
		hookContextMenu();
195
		hookContextMenu();
216
		hookGlobalActions();
196
		hookGlobalActions();
217
		contributeToActionBars();
197
		contributeToActionBars();
198
		getViewer().expandAll();
218
		getSite().setSelectionProvider(getViewer());
199
		getSite().setSelectionProvider(getViewer());
219
	}
200
	}
220
201
Lines 288-315 Link Here
288
	public void refresh() {
269
	public void refresh() {
289
		if (viewer != null && !viewer.getControl().isDisposed()) {
270
		if (viewer != null && !viewer.getControl().isDisposed()) {
290
			viewer.refresh();
271
			viewer.refresh();
272
			viewer.expandAll();
291
		}
273
		}
292
	}
274
	}
293
275
294
	public TableViewer getViewer() {
276
	public TreeViewer getViewer() {
295
		return viewer;
277
		return viewer;
296
	}
278
	}
297
279
298
	public class TaskRepositoryListener extends TaskRepositoryAdapter {
299
300
		@Override
301
		public void repositorySettingsChanged(TaskRepository repository) {
302
			if (PlatformUI.isWorkbenchRunning() && !PlatformUI.getWorkbench().getDisplay().isDisposed()) {
303
				PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
304
					public void run() {
305
						if (!getViewer().getControl().isDisposed()) {
306
							getViewer().refresh(true);
307
						}
308
					}
309
				});
310
			}
311
		}
312
313
	}
314
315
}
280
}
(-)src/org/eclipse/mylyn/internal/tasks/ui/views/GradientDrawer.java (-1 / +5 lines)
Lines 40-46 Link Here
40
40
41
	private final Listener CATEGORY_GRADIENT_DRAWER = new Listener() {
41
	private final Listener CATEGORY_GRADIENT_DRAWER = new Listener() {
42
		public void handleEvent(Event event) {
42
		public void handleEvent(Event event) {
43
			if (event.item.getData() instanceof ITaskContainer && !(event.item.getData() instanceof ITask)) {
43
			if (shouldApplyGradient(event)) {
44
				Scrollable scrollable = (Scrollable) event.widget;
44
				Scrollable scrollable = (Scrollable) event.widget;
45
				GC gc = event.gc;
45
				GC gc = event.gc;
46
46
Lines 99-104 Link Here
99
		}
99
		}
100
	};
100
	};
101
101
102
	protected boolean shouldApplyGradient(Event event) {
103
		return event.item.getData() instanceof ITaskContainer && !(event.item.getData() instanceof ITask);
104
	}
105
102
	private final IPropertyChangeListener THEME_CHANGE_LISTENER = new IPropertyChangeListener() {
106
	private final IPropertyChangeListener THEME_CHANGE_LISTENER = new IPropertyChangeListener() {
103
		public void propertyChange(PropertyChangeEvent event) {
107
		public void propertyChange(PropertyChangeEvent event) {
104
			if (event.getProperty().equals(IThemeManager.CHANGE_CURRENT_THEME)
108
			if (event.getProperty().equals(IThemeManager.CHANGE_CURRENT_THEME)
(-)plugin.properties (-6 / +6 lines)
Lines 25-31 Link Here
25
25
26
views.category.name = Tasks
26
views.category.name = Tasks
27
TaskListView.name = Task List
27
TaskListView.name = Task List
28
TaskRepositoriesView.name = Task Repositories
28
TaskRepositoriesView.name = Team Repositories
29
29
30
newWizards.category.name = Tasks
30
newWizards.category.name = Tasks
31
NewLocalCategoryWizard.name = Category
31
NewLocalCategoryWizard.name = Category
Lines 49-56 Link Here
49
SynchronizeAllAction.label = Synchronize Changed
49
SynchronizeAllAction.label = Synchronize Changed
50
SynchronizeAllAction.tooltip = Synchronize Changed
50
SynchronizeAllAction.tooltip = Synchronize Changed
51
RestoreTaskListAction.label = Restore Tasks from History...
51
RestoreTaskListAction.label = Restore Tasks from History...
52
ShowTaskRepositoriesViewAction.label = Show Task Repositories View
52
ShowTaskRepositoriesViewAction.label = Show Team Repositories View
53
ShowTaskRepositoriesViewAction.tooltip = Show Task Repositories View
53
ShowTaskRepositoriesViewAction.tooltip = Show Team Repositories View
54
OpenTaskSearchAction.label = Search Repository...
54
OpenTaskSearchAction.label = Search Repository...
55
NewTaskAction.label = New Task
55
NewTaskAction.label = New Task
56
NewTaskAction.tooltip = New Task
56
NewTaskAction.tooltip = New Task
Lines 144-153 Link Here
144
command.deactivateAllTasks.name = Deactivate Task
144
command.deactivateAllTasks.name = Deactivate Task
145
145
146
TaskSearchPage.label = Task Search
146
TaskSearchPage.label = Task Search
147
ProjectTaskRepositoryPage.name = Task Repository
147
ProjectTaskRepositoryPage.name = Team Repository
148
148
149
commands.category.repositories.name = Task Repositories
149
commands.category.repositories.name = Team Repositories
150
command.addTaskRepository.name = Add Task Repository...
150
command.addTaskRepository.name = Add Team Repository...
151
command.addTaskRepository.commandParameter.name = Repository Type
151
command.addTaskRepository.commandParameter.name = Repository Type
152
152
153
TaskHyperlinkDetector.name = Tasks
153
TaskHyperlinkDetector.name = Tasks
(-)plugin.xml (+3 lines)
Lines 1149-1154 Link Here
1149
            class="org.eclipse.mylyn.internal.tasks.ui.LocalRepositoryConnectorUi"
1149
            class="org.eclipse.mylyn.internal.tasks.ui.LocalRepositoryConnectorUi"
1150
            name="%LocalRepositoryConnectorUi.name"
1150
            name="%LocalRepositoryConnectorUi.name"
1151
            overlayIcon="icons/ovr16/overlay-local.gif"/>
1151
            overlayIcon="icons/ovr16/overlay-local.gif"/>
1152
      <repositoryMigrator
1153
            class="org.eclipse.mylyn.internal.tasks.ui.LocalRepositoryMigrator">
1154
      </repositoryMigrator>
1152
   </extension>
1155
   </extension>
1153
         
1156
         
1154
   <extension point="org.eclipse.ui.workbench.texteditor.hyperlinkDetectorTargets">
1157
   <extension point="org.eclipse.ui.workbench.texteditor.hyperlinkDetectorTargets">
(-)schema/repositories.exsd (+21 lines)
Lines 24-29 Link Here
24
            <element ref="connectorCore"/>
24
            <element ref="connectorCore"/>
25
            <element ref="connectorUi" minOccurs="0" maxOccurs="1"/>
25
            <element ref="connectorUi" minOccurs="0" maxOccurs="1"/>
26
            <element ref="taskListMigrator" minOccurs="0" maxOccurs="1"/>
26
            <element ref="taskListMigrator" minOccurs="0" maxOccurs="1"/>
27
            <element ref="repositoryMigrator" minOccurs="0" maxOccurs="1"/>
27
         </sequence>
28
         </sequence>
28
         <attribute name="point" type="string" use="required">
29
         <attribute name="point" type="string" use="required">
29
            <annotation>
30
            <annotation>
Lines 169-174 Link Here
169
      </complexType>
170
      </complexType>
170
   </element>
171
   </element>
171
172
173
   <element name="repositoryMigrator">
174
      <annotation>
175
         <documentation>
176
            (no description available)
177
         </documentation>
178
      </annotation>
179
      <complexType>
180
         <attribute name="class" type="string" use="required">
181
            <annotation>
182
               <documentation>
183
                  
184
               </documentation>
185
               <appInfo>
186
                  <meta.attribute kind="java" basedOn="org.eclipse.mylyn.tasks.core.AbstractRepositoryMigrator:"/>
187
               </appInfo>
188
            </annotation>
189
         </attribute>
190
      </complexType>
191
   </element>
192
172
   <annotation>
193
   <annotation>
173
      <appInfo>
194
      <appInfo>
174
         <meta.section type="since"/>
195
         <meta.section type="since"/>
(-)src/org/eclipse/mylyn/internal/tasks/ui/util/TasksUiExtensionReader.java (-23 / +63 lines)
Lines 30-35 Link Here
30
import org.eclipse.jface.resource.ImageDescriptor;
30
import org.eclipse.jface.resource.ImageDescriptor;
31
import org.eclipse.mylyn.commons.core.StatusHandler;
31
import org.eclipse.mylyn.commons.core.StatusHandler;
32
import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
32
import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
33
import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager;
33
import org.eclipse.mylyn.internal.tasks.core.externalization.TaskListExternalizer;
34
import org.eclipse.mylyn.internal.tasks.core.externalization.TaskListExternalizer;
34
import org.eclipse.mylyn.internal.tasks.ui.IDynamicSubMenuContributor;
35
import org.eclipse.mylyn.internal.tasks.ui.IDynamicSubMenuContributor;
35
import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
36
import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
Lines 37-42 Link Here
37
import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
38
import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
38
import org.eclipse.mylyn.tasks.core.AbstractDuplicateDetector;
39
import org.eclipse.mylyn.tasks.core.AbstractDuplicateDetector;
39
import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
40
import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
41
import org.eclipse.mylyn.tasks.core.AbstractRepositoryMigrator;
40
import org.eclipse.mylyn.tasks.core.AbstractTaskListMigrator;
42
import org.eclipse.mylyn.tasks.core.AbstractTaskListMigrator;
41
import org.eclipse.mylyn.tasks.core.RepositoryTemplate;
43
import org.eclipse.mylyn.tasks.core.RepositoryTemplate;
42
import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi;
44
import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi;
Lines 57-67 Link Here
57
59
58
		IConfigurationElement element;
60
		IConfigurationElement element;
59
61
60
		IConfigurationElement migratorElement;
62
		IConfigurationElement taskListMigratorElement;
63
64
		IConfigurationElement repositoryMigratorElement;
61
65
62
		AbstractRepositoryConnector repositoryConnector;
66
		AbstractRepositoryConnector repositoryConnector;
63
67
64
		AbstractTaskListMigrator migrator;
68
		AbstractTaskListMigrator taskListMigrator;
69
70
		AbstractRepositoryMigrator repositoryMigrator;
65
71
66
		private final String id;
72
		private final String id;
67
73
Lines 94-111 Link Here
94
			}
100
			}
95
		}
101
		}
96
102
97
		public IStatus createMigrator() {
103
		public IStatus createTaskListMigrator() {
98
			Assert.isTrue(migrator == null);
104
			Assert.isTrue(taskListMigrator == null);
99
			try {
105
			try {
100
				Object migratorObject = migratorElement.createExecutableExtension(ATTR_CLASS);
106
				Object migratorObject = taskListMigratorElement.createExecutableExtension(ATTR_CLASS);
101
				if (migratorObject instanceof AbstractTaskListMigrator) {
107
				if (migratorObject instanceof AbstractTaskListMigrator) {
102
					migrator = (AbstractTaskListMigrator) migratorObject;
108
					taskListMigrator = (AbstractTaskListMigrator) migratorObject;
103
					return Status.OK_STATUS;
109
					return Status.OK_STATUS;
104
				} else {
110
				} else {
105
					return new Status(
111
					return new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
106
							IStatus.ERROR,
112
							"Could not load task list migrator: " + migratorObject.getClass().getCanonicalName() //$NON-NLS-1$
107
							TasksUiPlugin.ID_PLUGIN,
108
							"Could not load task list migrator migrator: " + migratorObject.getClass().getCanonicalName() //$NON-NLS-1$
109
									+ " must implement " + AbstractTaskListMigrator.class.getCanonicalName()); //$NON-NLS-1$
113
									+ " must implement " + AbstractTaskListMigrator.class.getCanonicalName()); //$NON-NLS-1$
110
				}
114
				}
111
			} catch (Throwable e) {
115
			} catch (Throwable e) {
Lines 114-119 Link Here
114
			}
118
			}
115
		}
119
		}
116
120
121
		public IStatus createRepositoryMigrator() {
122
			Assert.isTrue(repositoryMigrator == null);
123
			try {
124
				Object migratorObject = repositoryMigratorElement.createExecutableExtension(ATTR_CLASS);
125
				if (migratorObject instanceof AbstractRepositoryMigrator) {
126
					repositoryMigrator = (AbstractRepositoryMigrator) migratorObject;
127
					return Status.OK_STATUS;
128
				} else {
129
					return new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
130
							"Could not load repository migrator: " + migratorObject.getClass().getCanonicalName() //$NON-NLS-1$
131
									+ " must implement " + AbstractRepositoryMigrator.class.getCanonicalName()); //$NON-NLS-1$
132
				}
133
			} catch (Throwable e) {
134
				return new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
135
						"Could not load repository migrator extension", e); //$NON-NLS-1$
136
			}
137
		}
138
117
		public String getPluginId() {
139
		public String getPluginId() {
118
			return element.getContributor().getName();
140
			return element.getContributor().getName();
119
		}
141
		}
Lines 158-163 Link Here
158
180
159
	public static final String ELMNT_MIGRATOR = "taskListMigrator"; //$NON-NLS-1$
181
	public static final String ELMNT_MIGRATOR = "taskListMigrator"; //$NON-NLS-1$
160
182
183
	public static final String ELMNT_REPOSITORY_MIGRATOR = "repositoryMigrator"; //$NON-NLS-1$
184
161
	public static final String ATTR_BRANDING_ICON = "brandingIcon"; //$NON-NLS-1$
185
	public static final String ATTR_BRANDING_ICON = "brandingIcon"; //$NON-NLS-1$
162
186
163
	public static final String ATTR_OVERLAY_ICON = "overlayIcon"; //$NON-NLS-1$
187
	public static final String ATTR_OVERLAY_ICON = "overlayIcon"; //$NON-NLS-1$
Lines 207-218 Link Here
207
	 */
231
	 */
208
	private static Set<String> disabledContributors = new HashSet<String>();
232
	private static Set<String> disabledContributors = new HashSet<String>();
209
233
210
	public static void initStartupExtensions(TaskListExternalizer taskListExternalizer) {
234
	public static void initStartupExtensions(TaskListExternalizer taskListExternalizer,
235
			TaskRepositoryManager repositoryManager) {
211
		if (!coreExtensionsRead) {
236
		if (!coreExtensionsRead) {
212
			IExtensionRegistry registry = Platform.getExtensionRegistry();
237
			IExtensionRegistry registry = Platform.getExtensionRegistry();
213
238
214
			// NOTE: has to be read first, consider improving
239
			// NOTE: has to be read first, consider improving
215
			initConnectorCores(taskListExternalizer, registry);
240
			initConnectorCores(taskListExternalizer, repositoryManager, registry);
216
241
217
			IExtensionPoint templatesExtensionPoint = registry.getExtensionPoint(EXTENSION_TEMPLATES);
242
			IExtensionPoint templatesExtensionPoint = registry.getExtensionPoint(EXTENSION_TEMPLATES);
218
			IExtension[] templateExtensions = templatesExtensionPoint.getExtensions();
243
			IExtension[] templateExtensions = templatesExtensionPoint.getExtensions();
Lines 256-262 Link Here
256
		}
281
		}
257
	}
282
	}
258
283
259
	private static void initConnectorCores(TaskListExternalizer taskListExternalizer, IExtensionRegistry registry) {
284
	private static void initConnectorCores(TaskListExternalizer taskListExternalizer,
285
			TaskRepositoryManager repositoryManager, IExtensionRegistry registry) {
260
		List<ConnectorDescriptor> descriptors = new ArrayList<ConnectorDescriptor>();
286
		List<ConnectorDescriptor> descriptors = new ArrayList<ConnectorDescriptor>();
261
		MultiStatus result = new MultiStatus(TasksUiPlugin.ID_PLUGIN, 0, "Repository connectors failed to load.", null); //$NON-NLS-1$
287
		MultiStatus result = new MultiStatus(TasksUiPlugin.ID_PLUGIN, 0, "Repository connectors failed to load.", null); //$NON-NLS-1$
262
288
Lines 267-282 Link Here
267
		for (IExtension repositoryExtension : repositoryExtensions) {
293
		for (IExtension repositoryExtension : repositoryExtensions) {
268
			IConfigurationElement[] elements = repositoryExtension.getConfigurationElements();
294
			IConfigurationElement[] elements = repositoryExtension.getConfigurationElements();
269
			ConnectorDescriptor descriptor = null;
295
			ConnectorDescriptor descriptor = null;
270
			IConfigurationElement migratorElement = null;
296
			IConfigurationElement tasklistMigratorElement = null;
297
			IConfigurationElement repositoryMigratorElement = null;
271
			for (IConfigurationElement element : elements) {
298
			for (IConfigurationElement element : elements) {
272
				if (element.getName().equals(ELMNT_REPOSITORY_CONNECTOR)) {
299
				if (element.getName().equals(ELMNT_REPOSITORY_CONNECTOR)) {
273
					descriptor = new ConnectorDescriptor(element);
300
					descriptor = new ConnectorDescriptor(element);
274
				} else if (element.getName().equals(ELMNT_MIGRATOR)) {
301
				} else if (element.getName().equals(ELMNT_MIGRATOR)) {
275
					migratorElement = element;
302
					tasklistMigratorElement = element;
303
				} else if (element.getName().equals(ELMNT_REPOSITORY_MIGRATOR)) {
304
					repositoryMigratorElement = element;
276
				}
305
				}
277
			}
306
			}
278
			if (descriptor != null) {
307
			if (descriptor != null) {
279
				descriptor.migratorElement = migratorElement;
308
				descriptor.taskListMigratorElement = tasklistMigratorElement;
309
				descriptor.repositoryMigratorElement = repositoryMigratorElement;
280
				descriptors.add(descriptor);
310
				descriptors.add(descriptor);
281
				if (descriptor.getId() != null) {
311
				if (descriptor.getId() != null) {
282
					add(descriptorById, descriptor.getId(), descriptor);
312
					add(descriptorById, descriptor.getId(), descriptor);
Lines 300-313 Link Here
300
		checkForConflicts(descriptors, result, descriptorByConnectorKind);
330
		checkForConflicts(descriptors, result, descriptorByConnectorKind);
301
331
302
		// register connectors
332
		// register connectors
303
		List<AbstractTaskListMigrator> migrators = new ArrayList<AbstractTaskListMigrator>();
333
		List<AbstractTaskListMigrator> taskListmigrators = new ArrayList<AbstractTaskListMigrator>();
334
		List<AbstractRepositoryMigrator> repositoryMigrators = new ArrayList<AbstractRepositoryMigrator>();
304
		for (ConnectorDescriptor descriptor : descriptors) {
335
		for (ConnectorDescriptor descriptor : descriptors) {
305
			if (descriptor.repositoryConnector != null) {
336
			if (descriptor.repositoryConnector != null) {
306
				TasksUiPlugin.getRepositoryManager().addRepositoryConnector(descriptor.repositoryConnector);
337
				repositoryManager.addRepositoryConnector(descriptor.repositoryConnector);
307
				if (descriptor.migratorElement != null) {
338
				if (descriptor.taskListMigratorElement != null) {
308
					IStatus status = descriptor.createMigrator();
339
					IStatus status = descriptor.createTaskListMigrator();
309
					if (status.isOK() && descriptor.migrator != null) {
340
					if (status.isOK() && descriptor.taskListMigrator != null) {
310
						migrators.add(descriptor.migrator);
341
						taskListmigrators.add(descriptor.taskListMigrator);
342
					} else {
343
						result.add(status);
344
					}
345
				}
346
				if (descriptor.repositoryMigratorElement != null) {
347
					IStatus status = descriptor.createRepositoryMigrator();
348
					if (status.isOK() && descriptor.repositoryMigrator != null) {
349
						repositoryMigrators.add(descriptor.repositoryMigrator);
311
					} else {
350
					} else {
312
						result.add(status);
351
						result.add(status);
313
					}
352
					}
Lines 319-325 Link Here
319
			StatusHandler.log(result);
358
			StatusHandler.log(result);
320
		}
359
		}
321
360
322
		taskListExternalizer.initialize(migrators);
361
		repositoryManager.initialize(repositoryMigrators);
362
		taskListExternalizer.initialize(taskListmigrators);
323
	}
363
	}
324
364
325
	private static boolean isDisabled(IConfigurationElement element) {
365
	private static boolean isDisabled(IConfigurationElement element) {
(-)src/org/eclipse/mylyn/internal/tasks/ui/wizards/SelectRepositoryPage.java (-30 / +33 lines)
Lines 26-51 Link Here
26
import org.eclipse.jface.viewers.DecoratingLabelProvider;
26
import org.eclipse.jface.viewers.DecoratingLabelProvider;
27
import org.eclipse.jface.viewers.IOpenListener;
27
import org.eclipse.jface.viewers.IOpenListener;
28
import org.eclipse.jface.viewers.ISelectionChangedListener;
28
import org.eclipse.jface.viewers.ISelectionChangedListener;
29
import org.eclipse.jface.viewers.IStructuredContentProvider;
30
import org.eclipse.jface.viewers.IStructuredSelection;
29
import org.eclipse.jface.viewers.IStructuredSelection;
31
import org.eclipse.jface.viewers.OpenEvent;
30
import org.eclipse.jface.viewers.OpenEvent;
32
import org.eclipse.jface.viewers.SelectionChangedEvent;
31
import org.eclipse.jface.viewers.SelectionChangedEvent;
33
import org.eclipse.jface.viewers.StructuredSelection;
32
import org.eclipse.jface.viewers.StructuredSelection;
34
import org.eclipse.jface.viewers.TableViewer;
33
import org.eclipse.jface.viewers.TreePath;
35
import org.eclipse.jface.viewers.Viewer;
34
import org.eclipse.jface.viewers.TreeSelection;
35
import org.eclipse.jface.viewers.TreeViewer;
36
import org.eclipse.jface.wizard.IWizard;
36
import org.eclipse.jface.wizard.IWizard;
37
import org.eclipse.jface.wizard.IWizardNode;
37
import org.eclipse.jface.wizard.IWizardNode;
38
import org.eclipse.jface.wizard.WizardDialog;
38
import org.eclipse.jface.wizard.WizardDialog;
39
import org.eclipse.jface.wizard.WizardSelectionPage;
39
import org.eclipse.jface.wizard.WizardSelectionPage;
40
import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
40
import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
41
import org.eclipse.mylyn.internal.tasks.core.Category;
41
import org.eclipse.mylyn.internal.tasks.core.ITaskRepositoryFilter;
42
import org.eclipse.mylyn.internal.tasks.core.ITaskRepositoryFilter;
42
import org.eclipse.mylyn.internal.tasks.core.LocalRepositoryConnector;
43
import org.eclipse.mylyn.internal.tasks.core.LocalRepositoryConnector;
43
import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager;
44
import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager;
44
import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
45
import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
45
import org.eclipse.mylyn.internal.tasks.ui.actions.AddRepositoryAction;
46
import org.eclipse.mylyn.internal.tasks.ui.actions.AddRepositoryAction;
46
import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
47
import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
47
import org.eclipse.mylyn.internal.tasks.ui.views.TaskRepositoriesSorter;
48
import org.eclipse.mylyn.internal.tasks.ui.views.GradientDrawer;
49
import org.eclipse.mylyn.internal.tasks.ui.views.TaskRepositoriesViewSorter;
48
import org.eclipse.mylyn.internal.tasks.ui.views.TaskRepositoryLabelProvider;
50
import org.eclipse.mylyn.internal.tasks.ui.views.TaskRepositoryLabelProvider;
51
import org.eclipse.mylyn.internal.tasks.ui.views.TeamRepositoriesContentProvider;
49
import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
52
import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
50
import org.eclipse.mylyn.tasks.core.TaskRepository;
53
import org.eclipse.mylyn.tasks.core.TaskRepository;
51
import org.eclipse.mylyn.tasks.ui.TasksUi;
54
import org.eclipse.mylyn.tasks.ui.TasksUi;
Lines 60-68 Link Here
60
import org.eclipse.swt.layout.GridLayout;
63
import org.eclipse.swt.layout.GridLayout;
61
import org.eclipse.swt.widgets.Button;
64
import org.eclipse.swt.widgets.Button;
62
import org.eclipse.swt.widgets.Composite;
65
import org.eclipse.swt.widgets.Composite;
63
import org.eclipse.swt.widgets.Table;
66
import org.eclipse.swt.widgets.Tree;
64
import org.eclipse.ui.PlatformUI;
67
import org.eclipse.ui.PlatformUI;
65
import org.eclipse.ui.handlers.IHandlerService;
68
import org.eclipse.ui.handlers.IHandlerService;
69
import org.eclipse.ui.themes.IThemeManager;
66
70
67
/**
71
/**
68
 * @author Mik Kersten
72
 * @author Mik Kersten
Lines 72-78 Link Here
72
 */
76
 */
73
public abstract class SelectRepositoryPage extends WizardSelectionPage {
77
public abstract class SelectRepositoryPage extends WizardSelectionPage {
74
78
75
	private TableViewer viewer;
79
	private TreeViewer viewer;
76
80
77
	protected MultiRepositoryAwareWizard wizard;
81
	protected MultiRepositoryAwareWizard wizard;
78
82
Lines 80-98 Link Here
80
84
81
	private final ITaskRepositoryFilter taskRepositoryFilter;
85
	private final ITaskRepositoryFilter taskRepositoryFilter;
82
86
83
	class RepositoryContentProvider implements IStructuredContentProvider {
84
85
		public void inputChanged(Viewer v, Object oldInput, Object newInput) {
86
		}
87
88
		public void dispose() {
89
		}
90
91
		public Object[] getElements(Object parent) {
92
			return repositories.toArray();
93
		}
94
	}
95
96
	public SelectRepositoryPage(ITaskRepositoryFilter taskRepositoryFilter) {
87
	public SelectRepositoryPage(ITaskRepositoryFilter taskRepositoryFilter) {
97
		super(Messages.SelectRepositoryPage_Select_a_repository);
88
		super(Messages.SelectRepositoryPage_Select_a_repository);
98
89
Lines 123-133 Link Here
123
		GridLayout layout = new GridLayout(1, true);
114
		GridLayout layout = new GridLayout(1, true);
124
		container.setLayout(layout);
115
		container.setLayout(layout);
125
116
126
		Table table = createTableViewer(container);
117
		Tree tree = createTableViewer(container);
127
		viewer.setSorter(new TaskRepositoriesSorter());
118
		viewer.setSorter(new TaskRepositoriesViewSorter());
128
119
129
		GridData gridData = new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL);
120
		GridData gridData = new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL);
130
		table.setLayoutData(gridData);
121
		tree.setLayoutData(gridData);
131
122
132
		Composite buttonContainer = new Composite(container, SWT.NULL);
123
		Composite buttonContainer = new Composite(container, SWT.NULL);
133
		GridLayout buttonLayout = new GridLayout(2, false);
124
		GridLayout buttonLayout = new GridLayout(2, false);
Lines 182-190 Link Here
182
		setControl(container);
173
		setControl(container);
183
	}
174
	}
184
175
185
	protected Table createTableViewer(Composite container) {
176
	protected Tree createTableViewer(Composite container) {
186
		viewer = new TableViewer(container, SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
177
		viewer = new TreeViewer(container, SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
187
		viewer.setContentProvider(new RepositoryContentProvider());
178
		viewer.setContentProvider(new TeamRepositoriesContentProvider());
188
		// viewer.setLabelProvider(new TaskRepositoryLabelProvider());
179
		// viewer.setLabelProvider(new TaskRepositoryLabelProvider());
189
		viewer.setLabelProvider(new DecoratingLabelProvider(new TaskRepositoryLabelProvider(),
180
		viewer.setLabelProvider(new DecoratingLabelProvider(new TaskRepositoryLabelProvider(),
190
				PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator()));
181
				PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator()));
Lines 204-216 Link Here
204
195
205
		TaskRepository selectedRepository = TasksUiUtil.getSelectedRepository(null);
196
		TaskRepository selectedRepository = TasksUiUtil.getSelectedRepository(null);
206
		if (selectedRepository != null) {
197
		if (selectedRepository != null) {
207
			viewer.setSelection(new StructuredSelection(selectedRepository));
198
			Category category = ((TaskRepositoryManager) TasksUi.getRepositoryManager()).getCategory(selectedRepository);
199
			Object[] path = { category, selectedRepository };
200
			viewer.setSelection(new TreeSelection(new TreePath(path)));
208
		} else {
201
		} else {
209
			TaskRepository localRepository = TasksUi.getRepositoryManager().getRepository(
202
			TaskRepository localRepository = TasksUi.getRepositoryManager().getRepository(
210
					LocalRepositoryConnector.CONNECTOR_KIND, LocalRepositoryConnector.REPOSITORY_URL);
203
					LocalRepositoryConnector.CONNECTOR_KIND, LocalRepositoryConnector.REPOSITORY_URL);
211
			viewer.setSelection(new StructuredSelection(localRepository));
204
			viewer.setSelection(new StructuredSelection(localRepository));
212
		}
205
		}
213
206
207
		final IThemeManager themeManager = PlatformUI.getWorkbench().getThemeManager();
208
209
		new GradientDrawer(themeManager, getViewer()) {
210
			@Override
211
			protected boolean shouldApplyGradient(org.eclipse.swt.widgets.Event event) {
212
				return event.item.getData() instanceof Category;
213
			}
214
		};
215
214
		viewer.addOpenListener(new IOpenListener() {
216
		viewer.addOpenListener(new IOpenListener() {
215
217
216
			public void open(OpenEvent event) {
218
			public void open(OpenEvent event) {
Lines 224-232 Link Here
224
			}
226
			}
225
		});
227
		});
226
228
227
		viewer.getTable().showSelection();
229
		viewer.expandAll();
228
		viewer.getTable().setFocus();
230
		viewer.getTree().showSelection();
229
		return viewer.getTable();
231
		viewer.getTree().setFocus();
232
		return viewer.getTree();
230
	}
233
	}
231
234
232
	protected abstract IWizard createWizard(TaskRepository taskRepository);
235
	protected abstract IWizard createWizard(TaskRepository taskRepository);
Lines 308-314 Link Here
308
	/**
311
	/**
309
	 * Public for testing.
312
	 * Public for testing.
310
	 */
313
	 */
311
	public TableViewer getViewer() {
314
	public TreeViewer getViewer() {
312
		return viewer;
315
		return viewer;
313
	}
316
	}
314
317
(-)src/org/eclipse/mylyn/internal/tasks/ui/views/TeamRepositoriesContentProvider.java (+79 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2010 Tasktop Technologies and others.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 *
8
 * Contributors:
9
 *     Tasktop Technologies - initial API and implementation
10
 *******************************************************************************/
11
12
package org.eclipse.mylyn.internal.tasks.ui.views;
13
14
import java.util.HashSet;
15
import java.util.Set;
16
17
import org.eclipse.jface.viewers.ITreeContentProvider;
18
import org.eclipse.jface.viewers.Viewer;
19
import org.eclipse.mylyn.internal.tasks.core.Category;
20
import org.eclipse.mylyn.internal.tasks.core.IRepositoryConstants;
21
import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager;
22
import org.eclipse.mylyn.tasks.core.TaskRepository;
23
import org.eclipse.mylyn.tasks.ui.TasksUi;
24
25
/**
26
 * @author Robert Elves
27
 */
28
public class TeamRepositoriesContentProvider implements ITreeContentProvider {
29
30
	private final TaskRepositoryManager manager;
31
32
	public TeamRepositoriesContentProvider() {
33
		manager = ((TaskRepositoryManager) TasksUi.getRepositoryManager());
34
	}
35
36
	public void inputChanged(Viewer v, Object oldInput, Object newInput) {
37
	}
38
39
	public void dispose() {
40
	}
41
42
	public Object[] getElements(Object parent) {
43
44
		Set<Object> objects = new HashSet<Object>();
45
		//objects.addAll(TasksUi.getRepositoryManager().getAllRepositories());
46
47
		objects.add(manager.getCategory(IRepositoryConstants.CATEGORY_TASKS));
48
		objects.add(manager.getCategory(IRepositoryConstants.CATEGORY_BUGS));
49
		objects.add(manager.getCategory(IRepositoryConstants.CATEGORY_OTHER));
50
51
		return objects.toArray();
52
	}
53
54
	public Object[] getChildren(Object parentElement) {
55
		if (parentElement instanceof Category) {
56
			Set<Object> objects = new HashSet<Object>();
57
			for (TaskRepository repository : TasksUi.getRepositoryManager().getAllRepositories()) {
58
				Category cat = manager.getCategory(repository);
59
				if (cat.equals(parentElement)) {
60
					objects.add(repository);
61
				}
62
//				String categoryId = repository.getProperty(IRepositoryConstants.PROPERTY_CATEGORY);
63
//				if (categoryId != null && ((Category) parentElement).getId().equals(categoryId)) {
64
//					objects.add(repository);
65
//				}
66
			}
67
			return objects.toArray();
68
		}
69
		return new Object[0];
70
	}
71
72
	public Object getParent(Object element) {
73
		return null;
74
	}
75
76
	public boolean hasChildren(Object element) {
77
		return element instanceof Category;
78
	}
79
}
(-)src/org/eclipse/mylyn/internal/tasks/ui/views/TaskRepositoriesViewSorter.java (+67 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2010 Tasktop Technologies and others.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 *
8
 * Contributors:
9
 *     Tasktop Technologies - initial API and implementation
10
 *******************************************************************************/
11
12
package org.eclipse.mylyn.internal.tasks.ui.views;
13
14
import org.eclipse.jface.viewers.Viewer;
15
import org.eclipse.mylyn.internal.tasks.core.Category;
16
import org.eclipse.mylyn.internal.tasks.core.IRepositoryConstants;
17
import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager;
18
import org.eclipse.mylyn.tasks.core.TaskRepository;
19
import org.eclipse.mylyn.tasks.ui.TasksUi;
20
21
/**
22
 * @author Robert Elves
23
 */
24
public class TaskRepositoriesViewSorter extends TaskRepositoriesSorter {
25
	@Override
26
	public int compare(Viewer viewer, Object e1, Object e2) {
27
28
		if (e1 instanceof Category && e2 instanceof Category) {
29
			return ((Category) e1).compareTo(e2);
30
		}
31
		if (e1 instanceof Category && e2 instanceof TaskRepository) {
32
33
			Category cat1 = ((Category) e1);
34
35
			String categoryId = ((TaskRepository) e2).getProperty(IRepositoryConstants.PROPERTY_CATEGORY);
36
			Category cat2 = ((TaskRepositoryManager) TasksUi.getRepositoryManager()).getCategory(categoryId);
37
38
			return cat1.compareTo(cat2);
39
40
		} else if (e1 instanceof TaskRepository && e2 instanceof Category) {
41
			Category cat1 = ((Category) e2);
42
43
			String categoryId = ((TaskRepository) e1).getProperty(IRepositoryConstants.PROPERTY_CATEGORY);
44
			Category cat2 = ((TaskRepositoryManager) TasksUi.getRepositoryManager()).getCategory(categoryId);
45
			int result = cat2.compareTo(cat1);
46
			if (result == 0) {
47
				result = 1;
48
			}
49
			return result;
50
51
		} else if (e1 instanceof TaskRepository && e2 instanceof TaskRepository) {
52
			String categoryId = ((TaskRepository) e1).getProperty(IRepositoryConstants.PROPERTY_CATEGORY);
53
			Category cat1 = ((TaskRepositoryManager) TasksUi.getRepositoryManager()).getCategory(categoryId);
54
55
			String categoryId2 = ((TaskRepository) e2).getProperty(IRepositoryConstants.PROPERTY_CATEGORY);
56
			Category cat2 = ((TaskRepositoryManager) TasksUi.getRepositoryManager()).getCategory(categoryId2);
57
58
			int result = cat1.compareTo(cat2);
59
			if (result == 0) {
60
				return super.compare(viewer, e1, e2);
61
			} else {
62
				return result;
63
			}
64
		}
65
		return super.compare(viewer, e1, e2);
66
	}
67
}
(-)src/org/eclipse/mylyn/internal/tasks/ui/LocalRepositoryMigrator.java (+39 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2010 Tasktop Technologies and others.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 *
8
 * Contributors:
9
 *     Tasktop Technologies - initial API and implementation
10
 *******************************************************************************/
11
12
package org.eclipse.mylyn.internal.tasks.ui;
13
14
import org.eclipse.mylyn.internal.tasks.core.IRepositoryConstants;
15
import org.eclipse.mylyn.internal.tasks.core.LocalRepositoryConnector;
16
import org.eclipse.mylyn.tasks.core.AbstractRepositoryMigrator;
17
import org.eclipse.mylyn.tasks.core.TaskRepository;
18
19
/**
20
 * @author Robert Elves
21
 * @since 3.4
22
 */
23
public class LocalRepositoryMigrator extends AbstractRepositoryMigrator {
24
25
	@Override
26
	public String getConnectorKind() {
27
		return LocalRepositoryConnector.CONNECTOR_KIND;
28
	}
29
30
	@Override
31
	public boolean migrateRepository(TaskRepository repository) {
32
		if (repository.getProperty(IRepositoryConstants.PROPERTY_CATEGORY) == null) {
33
			repository.setProperty(IRepositoryConstants.PROPERTY_CATEGORY, IRepositoryConstants.CATEGORY_TASKS);
34
			return true;
35
		}
36
		return false;
37
	}
38
39
}

Return to bug 302907