### Eclipse Workspace Patch 1.0 #P org.eclipse.mylyn.tasks.core 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 13 May 2010 00:08: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,10 @@ 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_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 13 May 2010 00:08:10 -0000 @@ -57,6 +57,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 +68,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(), @@ -77,6 +80,12 @@ private final TaskRepositoriesExternalizer externalizer = new TaskRepositoriesExternalizer(); public TaskRepositoryManager() { + 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 catOther = new Category(IRepositoryConstants.CATEGORY_OTHER, "Other", 200); //$NON-NLS-1$ + repositoryCategories.put(catOther.getId(), catOther); } public synchronized Collection getRepositoryConnectors() { @@ -118,6 +127,9 @@ // TODO 4.0 return false to indicate that remove was unsuccessful return; } + + checkCategorySet(repository); + repository.addChangeListener(PROPERTY_CHANGE_LISTENER); } @@ -182,6 +194,15 @@ 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 TaskRepository getRepository(String kind, String urlString) { Assert.isNotNull(kind); Assert.isNotNull(urlString); @@ -233,11 +254,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(); @@ -311,7 +332,11 @@ } if (repositoryMap.containsKey(repository.getConnectorKind())) { repositoryMap.get(repository.getConnectorKind()).add(repository); + + checkCategorySet(repository); + repository.addChangeListener(PROPERTY_CHANGE_LISTENER); + } else { orphanedRepositories.add(repository); } @@ -323,6 +348,21 @@ } } + private void checkCategorySet(TaskRepository repository) { + if (repository.getConnectorKind().equals("bugzilla") || repository.getConnectorKind().equals("local")) { + if (repository.getRepositoryUrl().contains("bugs.eclipse.org")) { + repository.setProperty(IRepositoryConstants.PROPERTY_CATEGORY, IRepositoryConstants.CATEGORY_BUGS); + } else { + repository.setProperty(IRepositoryConstants.PROPERTY_CATEGORY, IRepositoryConstants.CATEGORY_TASKS); + } + } else { + String category = repository.getProperty(IRepositoryConstants.PROPERTY_CATEGORY); + if (category == null) { + repository.setProperty(IRepositoryConstants.PROPERTY_CATEGORY, IRepositoryConstants.CATEGORY_OTHER); + } + } + } + @SuppressWarnings("deprecation") private boolean removeHttpAuthMigration(TaskRepository repository) { String httpusername = repository.getProperty(TaskRepository.AUTH_HTTP_USERNAME); @@ -447,4 +487,8 @@ } } + public Category getCategory(TaskRepository repository) { + String categoryId = repository.getProperty(IRepositoryConstants.PROPERTY_CATEGORY); + return getCategory(categoryId); + } } 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.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 13 May 2010 00:08:11 -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 13 May 2010 00:08:11 -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.28 diff -u -r1.28 messages.properties --- src/org/eclipse/mylyn/internal/tasks/ui/actions/messages.properties 17 Apr 2010 06:13:51 -0000 1.28 +++ src/org/eclipse/mylyn/internal/tasks/ui/actions/messages.properties 13 May 2010 00:08:11 -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 Team 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 13 May 2010 00:08:11 -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 13 May 2010 00:08:11 -0000 @@ -22,10 +22,9 @@ 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.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.ui.TasksUiPlugin; @@ -50,6 +49,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 +62,7 @@ @Deprecated public static final String ID = ITasksUiConstants.ID_VIEW_REPOSITORIES; - private TableViewer viewer; + private TreeViewer viewer; private final Action addRepositoryAction = new AddRepositoryAction(); @@ -121,18 +121,6 @@ } }; - static class ViewContentProvider implements IStructuredContentProvider { - public void inputChanged(Viewer v, Object oldInput, Object newInput) { - } - - public void dispose() { - } - - public Object[] getElements(Object parent) { - return TasksUi.getRepositoryManager().getAllRepositories().toArray(); - } - } - public TaskRepositoriesView() { TasksUi.getRepositoryManager().addListener(REPOSITORY_LISTENER); TasksUiPlugin.getDefault().addModelListener(MODEL_LISTENER); @@ -172,27 +160,14 @@ @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()); + viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION); + viewer.setContentProvider(new TeamRepositoriesContentProvider()); viewer.setUseHashlookup(true); 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 +183,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 +269,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 13 May 2010 00:08:11 -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.10 diff -u -r1.10 plugin.properties --- plugin.properties 21 Feb 2010 14:56:49 -0000 1.10 +++ plugin.properties 13 May 2010 00:08:11 -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: 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 13 May 2010 00:08:11 -0000 @@ -26,26 +26,29 @@ 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.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.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 +63,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 +76,7 @@ */ public abstract class SelectRepositoryPage extends WizardSelectionPage { - private TableViewer viewer; + private TreeViewer viewer; protected MultiRepositoryAwareWizard wizard; @@ -80,19 +84,6 @@ 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(); - } - } - public SelectRepositoryPage(ITaskRepositoryFilter taskRepositoryFilter) { super(Messages.SelectRepositoryPage_Select_a_repository); @@ -123,11 +114,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 +173,9 @@ 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) { + viewer = new TreeViewer(container, SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL); + viewer.setContentProvider(new TeamRepositoriesContentProvider()); // viewer.setLabelProvider(new TaskRepositoryLabelProvider()); viewer.setLabelProvider(new DecoratingLabelProvider(new TaskRepositoryLabelProvider(), PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator())); @@ -204,13 +195,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 +226,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 +311,7 @@ /** * Public for testing. */ - public TableViewer getViewer() { + public TreeViewer getViewer() { return viewer; } 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,69 @@ +/******************************************************************************* + * 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.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 TeamRepositoriesContentProvider implements ITreeContentProvider { + public void inputChanged(Viewer v, Object oldInput, Object newInput) { + } + + public void dispose() { + } + + public Object[] getElements(Object parent) { + + Set objects = new HashSet(); + //objects.addAll(TasksUi.getRepositoryManager().getAllRepositories()); + TaskRepositoryManager manager = ((TaskRepositoryManager) TasksUi.getRepositoryManager()); + + objects.add(manager.getCategory(IRepositoryConstants.CATEGORY_TASKS)); + objects.add(manager.getCategory(IRepositoryConstants.CATEGORY_BUGS)); + objects.add(manager.getCategory(IRepositoryConstants.CATEGORY_OTHER)); + + return objects.toArray(); + } + + public Object[] getChildren(Object parentElement) { + if (parentElement instanceof Category) { + Set objects = new HashSet(); + for (TaskRepository repository : TasksUi.getRepositoryManager().getAllRepositories()) { + 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); + } +}