### Eclipse Workspace Patch 1.0 #P org.eclipse.mylyn.tasks.ui Index: src/org/eclipse/mylyn/internal/tasks/ui/actions/Messages.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/Messages.java,v retrieving revision 1.24 diff -u -r1.24 Messages.java --- src/org/eclipse/mylyn/internal/tasks/ui/actions/Messages.java 17 Apr 2010 06:13:51 -0000 1.24 +++ src/org/eclipse/mylyn/internal/tasks/ui/actions/Messages.java 25 May 2010 18:33:09 -0000 @@ -37,7 +37,7 @@ public static String AddRepositoryAction_Add_a_query_to_the_Task_List; - public static String AddRepositoryAction_Add_Task_Repository; + public static String AddRepositoryAction_Add_Team_Repository; public static String AddRepositoryAction_Do_not_show_again; Index: src/org/eclipse/mylyn/internal/tasks/ui/actions/AddRepositoryAction.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/AddRepositoryAction.java,v retrieving revision 1.24 diff -u -r1.24 AddRepositoryAction.java --- src/org/eclipse/mylyn/internal/tasks/ui/actions/AddRepositoryAction.java 5 Jun 2009 14:28:35 -0000 1.24 +++ src/org/eclipse/mylyn/internal/tasks/ui/actions/AddRepositoryAction.java 25 May 2010 18:33:09 -0000 @@ -45,7 +45,7 @@ private static final String ID = "org.eclipse.mylyn.tasklist.repositories.add"; //$NON-NLS-1$ - public static final String TITLE = Messages.AddRepositoryAction_Add_Task_Repository; + public static final String TITLE = Messages.AddRepositoryAction_Add_Team_Repository; private boolean promptToAddQuery = true; Index: src/org/eclipse/mylyn/internal/tasks/ui/actions/messages.properties =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/messages.properties,v retrieving revision 1.29 diff -u -r1.29 messages.properties --- src/org/eclipse/mylyn/internal/tasks/ui/actions/messages.properties 19 May 2010 20:29:46 -0000 1.29 +++ src/org/eclipse/mylyn/internal/tasks/ui/actions/messages.properties 25 May 2010 18:33:09 -0000 @@ -17,7 +17,7 @@ AddRepositoryAction_Add_new_query=Add new query AddRepositoryAction_Add_a_query_to_the_Task_List=Would you like to add a query to the Task List for this repository? -AddRepositoryAction_Add_Task_Repository=Add Task Repository... +AddRepositoryAction_Add_Team_Repository=Add Repository... AddRepositoryAction_Do_not_show_again=Do not show again AutoUpdateQueryAction_Synchronize_Automatically_Label=Synchronize Automatically @@ -56,7 +56,7 @@ 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. 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. 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. -DeleteAction_Deleting_tasks_from_repositories=Deleting Tasks from Task Repositories +DeleteAction_Deleting_tasks_from_repositories=Deleting Tasks from Team Repositories DeleteAction_Not_supported=(not supported) DeleteAction_Nothing_selected=Nothing selected. DeleteAction_Permanently_delete_from_task_list=Permanently delete the following task from the Task List? @@ -67,11 +67,11 @@ DeleteTaskEditorAction_Delete_Task=Delete Task DeleteTaskRepositoryAction_Confirm_Delete=Confirm Delete -DeleteTaskRepositoryAction_Delete_Specific_Task_Repository=Are you sure you want to delete task repository "{0}"? +DeleteTaskRepositoryAction_Delete_Specific_Task_Repository=Are you sure you want to delete team repository "{0}"? DeleteTaskRepositoryAction_Delete_Repository=Delete Repository DeleteTaskRepositoryAction_Delete_Repository_In_Progress=Deleting repository and related artifacts 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? -DeleteTaskRepositoryAction_Delete_Task_Repository_Failed=Delete Task Repository Failed +DeleteTaskRepositoryAction_Delete_Task_Repository_Failed=Delete Team Repository Failed EditRepositoryPropertiesAction_Properties=Properties Index: src/org/eclipse/mylyn/internal/tasks/ui/views/TaskRepositoryLabelProvider.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskRepositoryLabelProvider.java,v retrieving revision 1.24 diff -u -r1.24 TaskRepositoryLabelProvider.java --- src/org/eclipse/mylyn/internal/tasks/ui/views/TaskRepositoryLabelProvider.java 13 Jan 2009 07:07:36 -0000 1.24 +++ src/org/eclipse/mylyn/internal/tasks/ui/views/TaskRepositoryLabelProvider.java 25 May 2010 18:33:09 -0000 @@ -14,6 +14,7 @@ import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages; +import org.eclipse.mylyn.internal.tasks.core.Category; import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin; import org.eclipse.mylyn.internal.tasks.ui.actions.DisconnectRepositoryAction; import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector; @@ -37,7 +38,9 @@ } public Image getImage(Object object) { - if (object instanceof AbstractRepositoryConnector) { + if (object instanceof Category) { + return CommonImages.getImage(TasksUiImages.CATEGORY); + } else if (object instanceof AbstractRepositoryConnector) { AbstractRepositoryConnector repositoryConnector = (AbstractRepositoryConnector) object; Image image = TasksUiPlugin.getDefault().getBrandingIcon(repositoryConnector.getConnectorKind()); if (image != null) { @@ -67,6 +70,8 @@ return label.toString(); } else if (object instanceof AbstractRepositoryConnector) { return ((AbstractRepositoryConnector) object).getLabel(); + } else if (object instanceof Category) { + return ((Category) object).getLabel(); } else { return null; } Index: src/org/eclipse/mylyn/internal/tasks/ui/views/TaskRepositoriesView.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskRepositoriesView.java,v retrieving revision 1.44 diff -u -r1.44 TaskRepositoriesView.java --- src/org/eclipse/mylyn/internal/tasks/ui/views/TaskRepositoriesView.java 13 Oct 2009 01:11:06 -0000 1.44 +++ src/org/eclipse/mylyn/internal/tasks/ui/views/TaskRepositoriesView.java 25 May 2010 18:33:09 -0000 @@ -22,12 +22,13 @@ import org.eclipse.jface.viewers.DecoratingLabelProvider; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; -import org.eclipse.jface.viewers.IStructuredContentProvider; -import org.eclipse.jface.viewers.TableViewer; -import org.eclipse.jface.viewers.Viewer; +import org.eclipse.jface.viewers.TreeViewer; +import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.mylyn.commons.core.StatusHandler; +import org.eclipse.mylyn.internal.tasks.core.Category; import org.eclipse.mylyn.internal.tasks.core.IRepositoryModelListener; import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryAdapter; +import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager; import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin; import org.eclipse.mylyn.internal.tasks.ui.actions.AddRepositoryAction; import org.eclipse.mylyn.internal.tasks.ui.actions.DeleteTaskRepositoryAction; @@ -50,6 +51,7 @@ import org.eclipse.ui.handlers.IHandlerService; import org.eclipse.ui.part.ViewPart; import org.eclipse.ui.texteditor.IWorkbenchActionDefinitionIds; +import org.eclipse.ui.themes.IThemeManager; /** * @author Mik Kersten @@ -62,7 +64,7 @@ @Deprecated public static final String ID = ITasksUiConstants.ID_VIEW_REPOSITORIES; - private TableViewer viewer; + private TreeViewer viewer; private final Action addRepositoryAction = new AddRepositoryAction(); @@ -121,20 +123,13 @@ } }; - static class ViewContentProvider implements IStructuredContentProvider { - public void inputChanged(Viewer v, Object oldInput, Object newInput) { - } - - public void dispose() { - } + private final TaskRepositoryManager manager; - public Object[] getElements(Object parent) { - return TasksUi.getRepositoryManager().getAllRepositories().toArray(); - } - } + private TeamRepositoriesContentProvider contentProvider; public TaskRepositoriesView() { - TasksUi.getRepositoryManager().addListener(REPOSITORY_LISTENER); + manager = ((TaskRepositoryManager) TasksUi.getRepositoryManager()); + manager.addListener(REPOSITORY_LISTENER); TasksUiPlugin.getDefault().addModelListener(MODEL_LISTENER); } @@ -172,27 +167,17 @@ @Override public void createPartControl(Composite parent) { - viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION); - viewer.setContentProvider(new ViewContentProvider()); + contentProvider = new TeamRepositoriesContentProvider(); + viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION); + viewer.setContentProvider(contentProvider); viewer.setUseHashlookup(true); + ViewerFilter[] filters = { new EmptyCategoriesFilter(contentProvider) }; + viewer.setFilters(filters); viewer.setLabelProvider(new DecoratingLabelProvider(new TaskRepositoryLabelProvider(), PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator())); - viewer.setSorter(new TaskRepositoriesSorter()); + viewer.setSorter(new TaskRepositoriesViewSorter()); -// new ViewerSorter() { -// -// @Override -// public int compare(Viewer viewer, Object e1, Object e2) { -// if (e1 instanceof TaskRepository && e2 instanceof TaskRepository) { -// TaskRepository t1 = (TaskRepository) e1; -// TaskRepository t2 = (TaskRepository) e2; -// return (t1.getKind() + t1.getUrl()).compareTo(t2.getKind() + t2.getUrl()); -// } else { -// return super.compare(viewer, e1, e2); -// } -// } -// }); viewer.setInput(getViewSite()); viewer.addDoubleClickListener(new IDoubleClickListener() { public void doubleClick(DoubleClickEvent event) { @@ -208,13 +193,19 @@ } }); - // FIXME remove listener when view is disposed - TasksUi.getRepositoryManager().addListener(new TaskRepositoryListener()); + final IThemeManager themeManager = getSite().getWorkbenchWindow().getWorkbench().getThemeManager(); + new GradientDrawer(themeManager, getViewer()) { + @Override + protected boolean shouldApplyGradient(org.eclipse.swt.widgets.Event event) { + return event.item.getData() instanceof Category; + } + }; makeActions(); hookContextMenu(); hookGlobalActions(); contributeToActionBars(); + getViewer().expandAll(); getSite().setSelectionProvider(getViewer()); } @@ -288,28 +279,12 @@ public void refresh() { if (viewer != null && !viewer.getControl().isDisposed()) { viewer.refresh(); + viewer.expandAll(); } } - public TableViewer getViewer() { + public TreeViewer getViewer() { return viewer; } - public class TaskRepositoryListener extends TaskRepositoryAdapter { - - @Override - public void repositorySettingsChanged(TaskRepository repository) { - if (PlatformUI.isWorkbenchRunning() && !PlatformUI.getWorkbench().getDisplay().isDisposed()) { - PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() { - public void run() { - if (!getViewer().getControl().isDisposed()) { - getViewer().refresh(true); - } - } - }); - } - } - - } - } Index: src/org/eclipse/mylyn/internal/tasks/ui/views/GradientDrawer.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/GradientDrawer.java,v retrieving revision 1.1 diff -u -r1.1 GradientDrawer.java --- src/org/eclipse/mylyn/internal/tasks/ui/views/GradientDrawer.java 1 Mar 2010 21:44:18 -0000 1.1 +++ src/org/eclipse/mylyn/internal/tasks/ui/views/GradientDrawer.java 25 May 2010 18:33:09 -0000 @@ -40,7 +40,7 @@ private final Listener CATEGORY_GRADIENT_DRAWER = new Listener() { public void handleEvent(Event event) { - if (event.item.getData() instanceof ITaskContainer && !(event.item.getData() instanceof ITask)) { + if (shouldApplyGradient(event)) { Scrollable scrollable = (Scrollable) event.widget; GC gc = event.gc; @@ -99,6 +99,10 @@ } }; + protected boolean shouldApplyGradient(Event event) { + return event.item.getData() instanceof ITaskContainer && !(event.item.getData() instanceof ITask); + } + private final IPropertyChangeListener THEME_CHANGE_LISTENER = new IPropertyChangeListener() { public void propertyChange(PropertyChangeEvent event) { if (event.getProperty().equals(IThemeManager.CHANGE_CURRENT_THEME) Index: plugin.properties =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/plugin.properties,v retrieving revision 1.11 diff -u -r1.11 plugin.properties --- plugin.properties 24 May 2010 02:34:11 -0000 1.11 +++ plugin.properties 25 May 2010 18:33:09 -0000 @@ -25,7 +25,7 @@ views.category.name = Tasks TaskListView.name = Task List -TaskRepositoriesView.name = Task Repositories +TaskRepositoriesView.name = Team Repositories newWizards.category.name = Tasks NewLocalCategoryWizard.name = Category @@ -49,8 +49,8 @@ SynchronizeAllAction.label = Synchronize Changed SynchronizeAllAction.tooltip = Synchronize Changed RestoreTaskListAction.label = Restore Tasks from History... -ShowTaskRepositoriesViewAction.label = Show Task Repositories View -ShowTaskRepositoriesViewAction.tooltip = Show Task Repositories View +ShowTaskRepositoriesViewAction.label = Show Team Repositories View +ShowTaskRepositoriesViewAction.tooltip = Show Team Repositories View OpenTaskSearchAction.label = Search Repository... NewTaskAction.label = New Task NewTaskAction.tooltip = New Task @@ -144,10 +144,10 @@ command.deactivateAllTasks.name = Deactivate Task TaskSearchPage.label = Task Search -ProjectTaskRepositoryPage.name = Task Repository +ProjectTaskRepositoryPage.name = Team Repository -commands.category.repositories.name = Task Repositories -command.addTaskRepository.name = Add Task Repository... +commands.category.repositories.name = Team Repositories +command.addTaskRepository.name = Add Team Repository... command.addTaskRepository.commandParameter.name = Repository Type TaskHyperlinkDetector.name = Tasks Index: plugin.xml =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/plugin.xml,v retrieving revision 1.379 diff -u -r1.379 plugin.xml --- plugin.xml 24 May 2010 21:30:25 -0000 1.379 +++ plugin.xml 25 May 2010 18:33:09 -0000 @@ -1149,6 +1149,9 @@ class="org.eclipse.mylyn.internal.tasks.ui.LocalRepositoryConnectorUi" name="%LocalRepositoryConnectorUi.name" overlayIcon="icons/ovr16/overlay-local.gif"/> + + Index: schema/repositories.exsd =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/schema/repositories.exsd,v retrieving revision 1.24 diff -u -r1.24 repositories.exsd --- schema/repositories.exsd 9 Nov 2009 13:58:07 -0000 1.24 +++ schema/repositories.exsd 25 May 2010 18:33:09 -0000 @@ -24,6 +24,7 @@ + @@ -169,6 +170,26 @@ + + + + (no description available) + + + + + + + + + + + + + + + + Index: src/org/eclipse/mylyn/internal/tasks/ui/util/TasksUiExtensionReader.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/TasksUiExtensionReader.java,v retrieving revision 1.75 diff -u -r1.75 TasksUiExtensionReader.java --- src/org/eclipse/mylyn/internal/tasks/ui/util/TasksUiExtensionReader.java 24 Feb 2010 01:34:02 -0000 1.75 +++ src/org/eclipse/mylyn/internal/tasks/ui/util/TasksUiExtensionReader.java 25 May 2010 18:33:09 -0000 @@ -30,6 +30,7 @@ import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.mylyn.commons.core.StatusHandler; import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages; +import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager; import org.eclipse.mylyn.internal.tasks.core.externalization.TaskListExternalizer; import org.eclipse.mylyn.internal.tasks.ui.IDynamicSubMenuContributor; import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin; @@ -37,6 +38,7 @@ import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView; import org.eclipse.mylyn.tasks.core.AbstractDuplicateDetector; import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector; +import org.eclipse.mylyn.tasks.core.AbstractRepositoryMigrator; import org.eclipse.mylyn.tasks.core.AbstractTaskListMigrator; import org.eclipse.mylyn.tasks.core.RepositoryTemplate; import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi; @@ -57,11 +59,15 @@ IConfigurationElement element; - IConfigurationElement migratorElement; + IConfigurationElement taskListMigratorElement; + + IConfigurationElement repositoryMigratorElement; AbstractRepositoryConnector repositoryConnector; - AbstractTaskListMigrator migrator; + AbstractTaskListMigrator taskListMigrator; + + AbstractRepositoryMigrator repositoryMigrator; private final String id; @@ -94,18 +100,16 @@ } } - public IStatus createMigrator() { - Assert.isTrue(migrator == null); + public IStatus createTaskListMigrator() { + Assert.isTrue(taskListMigrator == null); try { - Object migratorObject = migratorElement.createExecutableExtension(ATTR_CLASS); + Object migratorObject = taskListMigratorElement.createExecutableExtension(ATTR_CLASS); if (migratorObject instanceof AbstractTaskListMigrator) { - migrator = (AbstractTaskListMigrator) migratorObject; + taskListMigrator = (AbstractTaskListMigrator) migratorObject; return Status.OK_STATUS; } else { - return new Status( - IStatus.ERROR, - TasksUiPlugin.ID_PLUGIN, - "Could not load task list migrator migrator: " + migratorObject.getClass().getCanonicalName() //$NON-NLS-1$ + return new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, + "Could not load task list migrator: " + migratorObject.getClass().getCanonicalName() //$NON-NLS-1$ + " must implement " + AbstractTaskListMigrator.class.getCanonicalName()); //$NON-NLS-1$ } } catch (Throwable e) { @@ -114,6 +118,24 @@ } } + public IStatus createRepositoryMigrator() { + Assert.isTrue(repositoryMigrator == null); + try { + Object migratorObject = repositoryMigratorElement.createExecutableExtension(ATTR_CLASS); + if (migratorObject instanceof AbstractRepositoryMigrator) { + repositoryMigrator = (AbstractRepositoryMigrator) migratorObject; + return Status.OK_STATUS; + } else { + return new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, + "Could not load repository migrator: " + migratorObject.getClass().getCanonicalName() //$NON-NLS-1$ + + " must implement " + AbstractRepositoryMigrator.class.getCanonicalName()); //$NON-NLS-1$ + } + } catch (Throwable e) { + return new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, + "Could not load repository migrator extension", e); //$NON-NLS-1$ + } + } + public String getPluginId() { return element.getContributor().getName(); } @@ -158,6 +180,8 @@ public static final String ELMNT_MIGRATOR = "taskListMigrator"; //$NON-NLS-1$ + public static final String ELMNT_REPOSITORY_MIGRATOR = "repositoryMigrator"; //$NON-NLS-1$ + public static final String ATTR_BRANDING_ICON = "brandingIcon"; //$NON-NLS-1$ public static final String ATTR_OVERLAY_ICON = "overlayIcon"; //$NON-NLS-1$ @@ -207,12 +231,13 @@ */ private static Set disabledContributors = new HashSet(); - public static void initStartupExtensions(TaskListExternalizer taskListExternalizer) { + public static void initStartupExtensions(TaskListExternalizer taskListExternalizer, + TaskRepositoryManager repositoryManager) { if (!coreExtensionsRead) { IExtensionRegistry registry = Platform.getExtensionRegistry(); // NOTE: has to be read first, consider improving - initConnectorCores(taskListExternalizer, registry); + initConnectorCores(taskListExternalizer, repositoryManager, registry); IExtensionPoint templatesExtensionPoint = registry.getExtensionPoint(EXTENSION_TEMPLATES); IExtension[] templateExtensions = templatesExtensionPoint.getExtensions(); @@ -256,7 +281,8 @@ } } - private static void initConnectorCores(TaskListExternalizer taskListExternalizer, IExtensionRegistry registry) { + private static void initConnectorCores(TaskListExternalizer taskListExternalizer, + TaskRepositoryManager repositoryManager, IExtensionRegistry registry) { List descriptors = new ArrayList(); MultiStatus result = new MultiStatus(TasksUiPlugin.ID_PLUGIN, 0, "Repository connectors failed to load.", null); //$NON-NLS-1$ @@ -267,16 +293,20 @@ for (IExtension repositoryExtension : repositoryExtensions) { IConfigurationElement[] elements = repositoryExtension.getConfigurationElements(); ConnectorDescriptor descriptor = null; - IConfigurationElement migratorElement = null; + IConfigurationElement tasklistMigratorElement = null; + IConfigurationElement repositoryMigratorElement = null; for (IConfigurationElement element : elements) { if (element.getName().equals(ELMNT_REPOSITORY_CONNECTOR)) { descriptor = new ConnectorDescriptor(element); } else if (element.getName().equals(ELMNT_MIGRATOR)) { - migratorElement = element; + tasklistMigratorElement = element; + } else if (element.getName().equals(ELMNT_REPOSITORY_MIGRATOR)) { + repositoryMigratorElement = element; } } if (descriptor != null) { - descriptor.migratorElement = migratorElement; + descriptor.taskListMigratorElement = tasklistMigratorElement; + descriptor.repositoryMigratorElement = repositoryMigratorElement; descriptors.add(descriptor); if (descriptor.getId() != null) { add(descriptorById, descriptor.getId(), descriptor); @@ -300,14 +330,23 @@ checkForConflicts(descriptors, result, descriptorByConnectorKind); // register connectors - List migrators = new ArrayList(); + List taskListmigrators = new ArrayList(); + List repositoryMigrators = new ArrayList(); for (ConnectorDescriptor descriptor : descriptors) { if (descriptor.repositoryConnector != null) { - TasksUiPlugin.getRepositoryManager().addRepositoryConnector(descriptor.repositoryConnector); - if (descriptor.migratorElement != null) { - IStatus status = descriptor.createMigrator(); - if (status.isOK() && descriptor.migrator != null) { - migrators.add(descriptor.migrator); + repositoryManager.addRepositoryConnector(descriptor.repositoryConnector); + if (descriptor.taskListMigratorElement != null) { + IStatus status = descriptor.createTaskListMigrator(); + if (status.isOK() && descriptor.taskListMigrator != null) { + taskListmigrators.add(descriptor.taskListMigrator); + } else { + result.add(status); + } + } + if (descriptor.repositoryMigratorElement != null) { + IStatus status = descriptor.createRepositoryMigrator(); + if (status.isOK() && descriptor.repositoryMigrator != null) { + repositoryMigrators.add(descriptor.repositoryMigrator); } else { result.add(status); } @@ -319,7 +358,8 @@ StatusHandler.log(result); } - taskListExternalizer.initialize(migrators); + repositoryManager.initialize(repositoryMigrators); + taskListExternalizer.initialize(taskListmigrators); } private static boolean isDisabled(IConfigurationElement element) { Index: src/org/eclipse/mylyn/internal/tasks/ui/wizards/SelectRepositoryPage.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/SelectRepositoryPage.java,v retrieving revision 1.40 diff -u -r1.40 SelectRepositoryPage.java --- src/org/eclipse/mylyn/internal/tasks/ui/wizards/SelectRepositoryPage.java 24 Jul 2009 12:05:45 -0000 1.40 +++ src/org/eclipse/mylyn/internal/tasks/ui/wizards/SelectRepositoryPage.java 25 May 2010 18:33:09 -0000 @@ -26,26 +26,31 @@ import org.eclipse.jface.viewers.DecoratingLabelProvider; import org.eclipse.jface.viewers.IOpenListener; import org.eclipse.jface.viewers.ISelectionChangedListener; -import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.OpenEvent; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; -import org.eclipse.jface.viewers.TableViewer; -import org.eclipse.jface.viewers.Viewer; +import org.eclipse.jface.viewers.TreePath; +import org.eclipse.jface.viewers.TreeSelection; +import org.eclipse.jface.viewers.TreeViewer; +import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.jface.wizard.IWizard; import org.eclipse.jface.wizard.IWizardNode; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.jface.wizard.WizardSelectionPage; import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages; +import org.eclipse.mylyn.internal.tasks.core.Category; import org.eclipse.mylyn.internal.tasks.core.ITaskRepositoryFilter; import org.eclipse.mylyn.internal.tasks.core.LocalRepositoryConnector; import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager; import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin; import org.eclipse.mylyn.internal.tasks.ui.actions.AddRepositoryAction; import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal; -import org.eclipse.mylyn.internal.tasks.ui.views.TaskRepositoriesSorter; +import org.eclipse.mylyn.internal.tasks.ui.views.EmptyCategoriesFilter; +import org.eclipse.mylyn.internal.tasks.ui.views.GradientDrawer; +import org.eclipse.mylyn.internal.tasks.ui.views.TaskRepositoriesViewSorter; import org.eclipse.mylyn.internal.tasks.ui.views.TaskRepositoryLabelProvider; +import org.eclipse.mylyn.internal.tasks.ui.views.TeamRepositoriesContentProvider; import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector; import org.eclipse.mylyn.tasks.core.TaskRepository; import org.eclipse.mylyn.tasks.ui.TasksUi; @@ -60,9 +65,10 @@ import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Table; +import org.eclipse.swt.widgets.Tree; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.handlers.IHandlerService; +import org.eclipse.ui.themes.IThemeManager; /** * @author Mik Kersten @@ -72,7 +78,7 @@ */ public abstract class SelectRepositoryPage extends WizardSelectionPage { - private TableViewer viewer; + private TreeViewer viewer; protected MultiRepositoryAwareWizard wizard; @@ -80,18 +86,7 @@ private final ITaskRepositoryFilter taskRepositoryFilter; - class RepositoryContentProvider implements IStructuredContentProvider { - - public void inputChanged(Viewer v, Object oldInput, Object newInput) { - } - - public void dispose() { - } - - public Object[] getElements(Object parent) { - return repositories.toArray(); - } - } + private TeamRepositoriesContentProvider contentProvider; public SelectRepositoryPage(ITaskRepositoryFilter taskRepositoryFilter) { super(Messages.SelectRepositoryPage_Select_a_repository); @@ -123,11 +118,11 @@ GridLayout layout = new GridLayout(1, true); container.setLayout(layout); - Table table = createTableViewer(container); - viewer.setSorter(new TaskRepositoriesSorter()); + Tree tree = createTableViewer(container); + viewer.setSorter(new TaskRepositoriesViewSorter()); GridData gridData = new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL); - table.setLayoutData(gridData); + tree.setLayoutData(gridData); Composite buttonContainer = new Composite(container, SWT.NULL); GridLayout buttonLayout = new GridLayout(2, false); @@ -182,9 +177,12 @@ setControl(container); } - protected Table createTableViewer(Composite container) { - viewer = new TableViewer(container, SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL); - viewer.setContentProvider(new RepositoryContentProvider()); + protected Tree createTableViewer(Composite container) { + contentProvider = new TeamRepositoriesContentProvider(); + viewer = new TreeViewer(container, SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL); + viewer.setContentProvider(contentProvider); + ViewerFilter[] filters = { new EmptyCategoriesFilter(contentProvider) }; + viewer.setFilters(filters); // viewer.setLabelProvider(new TaskRepositoryLabelProvider()); viewer.setLabelProvider(new DecoratingLabelProvider(new TaskRepositoryLabelProvider(), PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator())); @@ -197,6 +195,7 @@ setSelectedNode(new CustomWizardNode((TaskRepository) selection.getFirstElement())); setPageComplete(true); } else { + setSelectedNode(null); setPageComplete(false); } } @@ -204,13 +203,24 @@ TaskRepository selectedRepository = TasksUiUtil.getSelectedRepository(null); if (selectedRepository != null) { - viewer.setSelection(new StructuredSelection(selectedRepository)); + Category category = ((TaskRepositoryManager) TasksUi.getRepositoryManager()).getCategory(selectedRepository); + Object[] path = { category, selectedRepository }; + viewer.setSelection(new TreeSelection(new TreePath(path))); } else { TaskRepository localRepository = TasksUi.getRepositoryManager().getRepository( LocalRepositoryConnector.CONNECTOR_KIND, LocalRepositoryConnector.REPOSITORY_URL); viewer.setSelection(new StructuredSelection(localRepository)); } + final IThemeManager themeManager = PlatformUI.getWorkbench().getThemeManager(); + + new GradientDrawer(themeManager, getViewer()) { + @Override + protected boolean shouldApplyGradient(org.eclipse.swt.widgets.Event event) { + return event.item.getData() instanceof Category; + } + }; + viewer.addOpenListener(new IOpenListener() { public void open(OpenEvent event) { @@ -224,9 +234,10 @@ } }); - viewer.getTable().showSelection(); - viewer.getTable().setFocus(); - return viewer.getTable(); + viewer.expandAll(); + viewer.getTree().showSelection(); + viewer.getTree().setFocus(); + return viewer.getTree(); } protected abstract IWizard createWizard(TaskRepository taskRepository); @@ -308,7 +319,7 @@ /** * Public for testing. */ - public TableViewer getViewer() { + public TreeViewer getViewer() { return viewer; } Index: src/org/eclipse/mylyn/internal/tasks/ui/views/EmptyCategoriesFilter.java =================================================================== RCS file: src/org/eclipse/mylyn/internal/tasks/ui/views/EmptyCategoriesFilter.java diff -N src/org/eclipse/mylyn/internal/tasks/ui/views/EmptyCategoriesFilter.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/mylyn/internal/tasks/ui/views/EmptyCategoriesFilter.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,36 @@ +/******************************************************************************* + * Copyright (c) 2010 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.views; + +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.jface.viewers.ViewerFilter; +import org.eclipse.mylyn.internal.tasks.core.Category; + +/** + * @author Robert Elves + */ +public class EmptyCategoriesFilter extends ViewerFilter { + + private final TeamRepositoriesContentProvider provider; + + public EmptyCategoriesFilter(TeamRepositoriesContentProvider provider) { + this.provider = provider; + } + + @Override + public boolean select(Viewer viewer, Object parentElement, Object element) { + if (element instanceof Category) { + return provider.getChildren(element).length > 0; + } + return true; + } +} Index: src/org/eclipse/mylyn/internal/tasks/ui/views/TeamRepositoriesContentProvider.java =================================================================== RCS file: src/org/eclipse/mylyn/internal/tasks/ui/views/TeamRepositoriesContentProvider.java diff -N src/org/eclipse/mylyn/internal/tasks/ui/views/TeamRepositoriesContentProvider.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/mylyn/internal/tasks/ui/views/TeamRepositoriesContentProvider.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,73 @@ +/******************************************************************************* + * Copyright (c) 2010 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.views; + +import java.util.HashSet; +import java.util.Set; + +import org.eclipse.jface.viewers.ITreeContentProvider; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.mylyn.internal.tasks.core.Category; +import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager; +import org.eclipse.mylyn.tasks.core.TaskRepository; +import org.eclipse.mylyn.tasks.ui.TasksUi; + +/** + * @author Robert Elves + */ +public class TeamRepositoriesContentProvider implements ITreeContentProvider { + + private final TaskRepositoryManager manager; + + public TeamRepositoriesContentProvider() { + manager = ((TaskRepositoryManager) TasksUi.getRepositoryManager()); + } + + public void inputChanged(Viewer v, Object oldInput, Object newInput) { + } + + public void dispose() { + } + + public Object[] getElements(Object parent) { + + Set objects = new HashSet(); + objects.addAll(manager.getCategories()); + return objects.toArray(); + } + + public Object[] getChildren(Object parentElement) { + if (parentElement instanceof Category) { + Set objects = new HashSet(); + for (TaskRepository repository : TasksUi.getRepositoryManager().getAllRepositories()) { + Category cat = manager.getCategory(repository); + if (cat.equals(parentElement)) { + objects.add(repository); + } +// String categoryId = repository.getProperty(IRepositoryConstants.PROPERTY_CATEGORY); +// if (categoryId != null && ((Category) parentElement).getId().equals(categoryId)) { +// objects.add(repository); +// } + } + return objects.toArray(); + } + return new Object[0]; + } + + public Object getParent(Object element) { + return null; + } + + public boolean hasChildren(Object element) { + return element instanceof Category; + } +} \ No newline at end of file Index: src/org/eclipse/mylyn/internal/tasks/ui/views/TaskRepositoriesViewSorter.java =================================================================== RCS file: src/org/eclipse/mylyn/internal/tasks/ui/views/TaskRepositoriesViewSorter.java diff -N src/org/eclipse/mylyn/internal/tasks/ui/views/TaskRepositoriesViewSorter.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/mylyn/internal/tasks/ui/views/TaskRepositoriesViewSorter.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,67 @@ +/******************************************************************************* + * Copyright (c) 2010 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.views; + +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.mylyn.internal.tasks.core.Category; +import org.eclipse.mylyn.internal.tasks.core.IRepositoryConstants; +import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager; +import org.eclipse.mylyn.tasks.core.TaskRepository; +import org.eclipse.mylyn.tasks.ui.TasksUi; + +/** + * @author Robert Elves + */ +public class TaskRepositoriesViewSorter extends TaskRepositoriesSorter { + @Override + public int compare(Viewer viewer, Object e1, Object e2) { + + if (e1 instanceof Category && e2 instanceof Category) { + return ((Category) e1).compareTo(e2); + } + if (e1 instanceof Category && e2 instanceof TaskRepository) { + + Category cat1 = ((Category) e1); + + String categoryId = ((TaskRepository) e2).getProperty(IRepositoryConstants.PROPERTY_CATEGORY); + Category cat2 = ((TaskRepositoryManager) TasksUi.getRepositoryManager()).getCategory(categoryId); + + return cat1.compareTo(cat2); + + } else if (e1 instanceof TaskRepository && e2 instanceof Category) { + Category cat1 = ((Category) e2); + + String categoryId = ((TaskRepository) e1).getProperty(IRepositoryConstants.PROPERTY_CATEGORY); + Category cat2 = ((TaskRepositoryManager) TasksUi.getRepositoryManager()).getCategory(categoryId); + int result = cat2.compareTo(cat1); + if (result == 0) { + result = 1; + } + return result; + + } else if (e1 instanceof TaskRepository && e2 instanceof TaskRepository) { + String categoryId = ((TaskRepository) e1).getProperty(IRepositoryConstants.PROPERTY_CATEGORY); + Category cat1 = ((TaskRepositoryManager) TasksUi.getRepositoryManager()).getCategory(categoryId); + + String categoryId2 = ((TaskRepository) e2).getProperty(IRepositoryConstants.PROPERTY_CATEGORY); + Category cat2 = ((TaskRepositoryManager) TasksUi.getRepositoryManager()).getCategory(categoryId2); + + int result = cat1.compareTo(cat2); + if (result == 0) { + return super.compare(viewer, e1, e2); + } else { + return result; + } + } + return super.compare(viewer, e1, e2); + } +} Index: src/org/eclipse/mylyn/internal/tasks/ui/LocalRepositoryMigrator.java =================================================================== RCS file: src/org/eclipse/mylyn/internal/tasks/ui/LocalRepositoryMigrator.java diff -N src/org/eclipse/mylyn/internal/tasks/ui/LocalRepositoryMigrator.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/mylyn/internal/tasks/ui/LocalRepositoryMigrator.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,39 @@ +/******************************************************************************* + * Copyright (c) 2010 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 org.eclipse.mylyn.internal.tasks.core.IRepositoryConstants; +import org.eclipse.mylyn.internal.tasks.core.LocalRepositoryConnector; +import org.eclipse.mylyn.tasks.core.AbstractRepositoryMigrator; +import org.eclipse.mylyn.tasks.core.TaskRepository; + +/** + * @author Robert Elves + * @since 3.4 + */ +public class LocalRepositoryMigrator extends AbstractRepositoryMigrator { + + @Override + public String getConnectorKind() { + return LocalRepositoryConnector.CONNECTOR_KIND; + } + + @Override + public boolean migrateRepository(TaskRepository repository) { + if (repository.getProperty(IRepositoryConstants.PROPERTY_CATEGORY) == null) { + repository.setProperty(IRepositoryConstants.PROPERTY_CATEGORY, IRepositoryConstants.CATEGORY_TASKS); + return true; + } + return false; + } + +} #P org.eclipse.mylyn.tasks.core Index: META-INF/MANIFEST.MF =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.core/META-INF/MANIFEST.MF,v retrieving revision 1.365 diff -u -r1.365 MANIFEST.MF --- META-INF/MANIFEST.MF 11 Apr 2010 19:49:55 -0000 1.365 +++ META-INF/MANIFEST.MF 25 May 2010 18:33:10 -0000 @@ -14,6 +14,7 @@ org.eclipse.mylyn.internal.tasks.core;x-friends:="org.eclipse.mylyn.tasks.ui,org.eclipse.mylyn.tasks.bugs", org.eclipse.mylyn.internal.tasks.core.data;x-friends:="org.eclipse.mylyn.tasks.ui,org.eclipse.mylyn.tasks.bugs", org.eclipse.mylyn.internal.tasks.core.externalization;x-friends:="org.eclipse.mylyn.tasks.ui,org.eclipse.mylyn.tasks.bugs", + org.eclipse.mylyn.internal.tasks.core.notifications;x-friends:="org.eclipse.mylyn.tasks.ui,org.eclipse.mylyn.tasks.bugs", org.eclipse.mylyn.internal.tasks.core.sync;x-friends:="org.eclipse.mylyn.tasks.ui,org.eclipse.mylyn.tasks.bugs", org.eclipse.mylyn.tasks.core, org.eclipse.mylyn.tasks.core.data, Index: src/org/eclipse/mylyn/internal/tasks/core/IRepositoryConstants.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/IRepositoryConstants.java,v retrieving revision 1.5 diff -u -r1.5 IRepositoryConstants.java --- src/org/eclipse/mylyn/internal/tasks/core/IRepositoryConstants.java 13 Jan 2009 07:05:10 -0000 1.5 +++ src/org/eclipse/mylyn/internal/tasks/core/IRepositoryConstants.java 25 May 2010 18:33:10 -0000 @@ -29,6 +29,8 @@ public static final String PROPERTY_CONNECTOR_KIND = "kind"; //$NON-NLS-1$ + public static final String PROPERTY_CATEGORY = "category"; //$NON-NLS-1$ + public static final String PROPERTY_URL = "url"; //$NON-NLS-1$ public static final String PROPERTY_LABEL = "label"; //$NON-NLS-1$ @@ -37,4 +39,14 @@ public static final String KIND_UNKNOWN = ""; //$NON-NLS-1$ + public static final String CATEGORY_TASKS = "org.eclipse.mylyn.category.tasks"; //$NON-NLS-1$ + + public static final String CATEGORY_BUGS = "org.eclipse.mylyn.category.bugs"; //$NON-NLS-1$ + + public static final String CATEGORY_BUILD = "org.eclipse.mylyn.category.build"; //$NON-NLS-1$ + + public static final String CATEGORY_REVIEW = "org.eclipse.mylyn.category.review"; //$NON-NLS-1$ + + public static final String CATEGORY_OTHER = "org.eclipse.mylyn.category.other"; //$NON-NLS-1$ + } Index: src/org/eclipse/mylyn/internal/tasks/core/TaskRepositoryManager.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskRepositoryManager.java,v retrieving revision 1.32 diff -u -r1.32 TaskRepositoryManager.java --- src/org/eclipse/mylyn/internal/tasks/core/TaskRepositoryManager.java 10 Jan 2010 05:02:07 -0000 1.32 +++ src/org/eclipse/mylyn/internal/tasks/core/TaskRepositoryManager.java 25 May 2010 18:33:10 -0000 @@ -33,6 +33,7 @@ import org.eclipse.mylyn.commons.core.StatusHandler; import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryDelta.Type; import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector; +import org.eclipse.mylyn.tasks.core.AbstractRepositoryMigrator; import org.eclipse.mylyn.tasks.core.IRepositoryListener; import org.eclipse.mylyn.tasks.core.IRepositoryManager; import org.eclipse.mylyn.tasks.core.ITask; @@ -57,6 +58,7 @@ private final Map repositoryConnectors = new HashMap(); + // connector kinds to corresponding repositories private final Map> repositoryMap = new HashMap>(); private final Set listeners = new CopyOnWriteArraySet(); @@ -67,6 +69,8 @@ public static final String PREFIX_LOCAL = "local-"; //$NON-NLS-1$ + private static final Map repositoryCategories = new HashMap(); + private final PropertyChangeListener PROPERTY_CHANGE_LISTENER = new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent evt) { TaskRepositoryManager.this.notifyRepositorySettingsChanged((TaskRepository) evt.getSource(), @@ -76,7 +80,20 @@ private final TaskRepositoriesExternalizer externalizer = new TaskRepositoriesExternalizer(); + private List migrators; + public TaskRepositoryManager() { + this.migrators = Collections.emptyList(); + Category catTasks = new Category(IRepositoryConstants.CATEGORY_TASKS, "Tasks", 0); //$NON-NLS-1$ + repositoryCategories.put(catTasks.getId(), catTasks); + Category catBugs = new Category(IRepositoryConstants.CATEGORY_BUGS, "Bugs", 100); //$NON-NLS-1$ + repositoryCategories.put(catBugs.getId(), catBugs); + Category catBuild = new Category(IRepositoryConstants.CATEGORY_BUILD, "Build", 200); //$NON-NLS-1$ + repositoryCategories.put(catBuild.getId(), catBuild); + Category catReview = new Category(IRepositoryConstants.CATEGORY_REVIEW, "Review", 300); //$NON-NLS-1$ + repositoryCategories.put(catReview.getId(), catReview); + Category catOther = new Category(IRepositoryConstants.CATEGORY_OTHER, "Other", 400); //$NON-NLS-1$ + repositoryCategories.put(catOther.getId(), catOther); } public synchronized Collection getRepositoryConnectors() { @@ -118,6 +135,7 @@ // TODO 4.0 return false to indicate that remove was unsuccessful return; } + repository.addChangeListener(PROPERTY_CHANGE_LISTENER); } @@ -182,6 +200,19 @@ return sb.toString(); } + public Category getCategory(String id) { + Category category = repositoryCategories.get(IRepositoryConstants.CATEGORY_OTHER); + Category cat = repositoryCategories.get(id); + if (cat != null) { + category = cat; + } + return category; + } + + public Collection getCategories() { + return Collections.unmodifiableCollection(repositoryCategories.values()); + } + public TaskRepository getRepository(String kind, String urlString) { Assert.isNotNull(kind); Assert.isNotNull(urlString); @@ -233,11 +264,11 @@ return null; } - public Set getRepositories(String kind) { - Assert.isNotNull(kind); + public Set getRepositories(String connectorKind) { + Assert.isNotNull(connectorKind); Set result; synchronized (this) { - result = repositoryMap.get(kind); + result = repositoryMap.get(connectorKind); } if (result == null) { return Collections.emptySet(); @@ -309,9 +340,14 @@ if (removeHttpAuthMigration(repository)) { migration = true; } + if (applyMigrators(repository)) { + migration = true; + } if (repositoryMap.containsKey(repository.getConnectorKind())) { repositoryMap.get(repository.getConnectorKind()).add(repository); + repository.addChangeListener(PROPERTY_CHANGE_LISTENER); + } else { orphanedRepositories.add(repository); } @@ -323,6 +359,33 @@ } } + private boolean applyMigrators(final TaskRepository repository) { + final boolean[] result = new boolean[1]; + for (AbstractRepositoryMigrator migrator : migrators) { + if (migrator.getConnectorKind().equals(repository.getConnectorKind())) { + + final AbstractRepositoryMigrator finalRepositoryMigrator = migrator; + result[0] = false; + SafeRunner.run(new ISafeRunnable() { + + public void handleException(Throwable e) { + StatusHandler.log(new Status(IStatus.WARNING, ITasksCoreConstants.ID_PLUGIN, + "Repository migration failed for repository \"" + repository.getUrl() + "\"", e)); //$NON-NLS-1$ //$NON-NLS-2$ + } + + public void run() throws Exception { + if (finalRepositoryMigrator.migrateRepository(repository)) { + result[0] = true; + } + } + + }); + break; + } + } + return result[0]; + } + @SuppressWarnings("deprecation") private boolean removeHttpAuthMigration(TaskRepository repository) { String httpusername = repository.getProperty(TaskRepository.AUTH_HTTP_USERNAME); @@ -447,4 +510,13 @@ } } + public Category getCategory(TaskRepository repository) { + String categoryId = repository.getProperty(IRepositoryConstants.PROPERTY_CATEGORY); + return getCategory(categoryId); + } + + public void initialize(List repositoryMigrators) { + this.migrators = repositoryMigrators; + + } } Index: src/org/eclipse/mylyn/tasks/core/AbstractRepositoryMigrator.java =================================================================== RCS file: src/org/eclipse/mylyn/tasks/core/AbstractRepositoryMigrator.java diff -N src/org/eclipse/mylyn/tasks/core/AbstractRepositoryMigrator.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/mylyn/tasks/core/AbstractRepositoryMigrator.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,30 @@ +/******************************************************************************* + * Copyright (c) 2010 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.tasks.core; + +/** + * Implement a connector specific repository migrator to perform connector specific migration procedures on task + * repositories of the same connector kind upon startup. Override and contribute by the + * org.eclipse.mylyn.tasks.ui.repositories extension point's taskListMigrator element. + * + * @author Robert Elves + * @since 3.4 + */ +public abstract class AbstractRepositoryMigrator { + + public abstract String getConnectorKind(); + + public boolean migrateRepository(TaskRepository repository) { + return false; + } + +} Index: src/org/eclipse/mylyn/internal/tasks/core/Category.java =================================================================== RCS file: src/org/eclipse/mylyn/internal/tasks/core/Category.java diff -N src/org/eclipse/mylyn/internal/tasks/core/Category.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/mylyn/internal/tasks/core/Category.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,59 @@ +/******************************************************************************* + * Copyright (c) 2010 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.core; + +import org.eclipse.core.runtime.PlatformObject; + +/** + * Categories include Tasks, Bugs, Other... + * + * @author Robert Elves + */ +public class Category extends PlatformObject { + + private final String id; + + private final String label; + + private final int rank; + + public Category(String id, String label, int rank) { + this.id = id; + this.label = label; + this.rank = rank; + } + + public String getId() { + return id; + } + + public int compareTo(Object arg0) { + if (arg0 instanceof Category) { + return this.getRank() - ((Category) arg0).getRank(); + } + return 0; + } + + public int getRank() { + return rank; + } + + public String getLabel() { + return label; + } + + @Override + public String toString() { + return getLabel(); + }; + +} #P org.eclipse.mylyn.bugzilla.ui Index: plugin.xml =================================================================== RCS file: /cvsroot/tools/org.eclipse.mylyn/org.eclipse.mylyn.bugzilla.ui/plugin.xml,v retrieving revision 1.109 diff -u -r1.109 plugin.xml --- plugin.xml 24 Jan 2010 14:30:07 -0000 1.109 +++ plugin.xml 25 May 2010 18:33:11 -0000 @@ -30,6 +30,9 @@ + + Index: src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaRepositoryMigrator.java =================================================================== RCS file: src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaRepositoryMigrator.java diff -N src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaRepositoryMigrator.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaRepositoryMigrator.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,39 @@ +/******************************************************************************* + * Copyright (c) 2004, 2008 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.bugzilla.ui.tasklist; + +import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin; +import org.eclipse.mylyn.internal.tasks.core.IRepositoryConstants; +import org.eclipse.mylyn.tasks.core.AbstractRepositoryMigrator; +import org.eclipse.mylyn.tasks.core.TaskRepository; + +/** + * @author Robert Elves + * @since 3.4 + */ +public class BugzillaRepositoryMigrator extends AbstractRepositoryMigrator { + + @Override + public String getConnectorKind() { + return BugzillaCorePlugin.CONNECTOR_KIND; + } + + @Override + public boolean migrateRepository(TaskRepository repository) { + if (repository.getProperty(IRepositoryConstants.PROPERTY_CATEGORY) == null) { + repository.setProperty(IRepositoryConstants.PROPERTY_CATEGORY, IRepositoryConstants.CATEGORY_BUGS); + return true; + } + return false; + } + +}