Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorspingel2008-02-22 02:26:47 +0000
committerspingel2008-02-22 02:26:47 +0000
commita35da5cc4af62ae59f7e097b97c9bfe8cedd2310 (patch)
tree73f837faa45a713385849a16c00f9532ad1c493f
parent51d5f20b820daa33bf182b0ad408a142883f40ac (diff)
downloadorg.eclipse.mylyn.tasks-a35da5cc4af62ae59f7e097b97c9bfe8cedd2310.tar.gz
org.eclipse.mylyn.tasks-a35da5cc4af62ae59f7e097b97c9bfe8cedd2310.tar.xz
org.eclipse.mylyn.tasks-a35da5cc4af62ae59f7e097b97c9bfe8cedd2310.zip
NEW - bug 217344: [patch] open task dialog should filter according to the currently active task working set
https://bugs.eclipse.org/bugs/show_bug.cgi?id=217344
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/TaskSelectionDialog.java264
-rw-r--r--org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/workingsets/WorkingSetLabelComparator.java25
2 files changed, 282 insertions, 7 deletions
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/TaskSelectionDialog.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/TaskSelectionDialog.java
index 54c79d99a..071137efe 100644
--- a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/TaskSelectionDialog.java
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/TaskSelectionDialog.java
@@ -8,23 +8,34 @@
package org.eclipse.mylyn.internal.tasks.ui.actions;
+import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Comparator;
import java.util.HashSet;
+import java.util.List;
import java.util.Set;
import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.Separator;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.mylyn.internal.tasks.ui.TaskListColorsAndFonts;
import org.eclipse.mylyn.internal.tasks.ui.TaskSearchPage;
import org.eclipse.mylyn.internal.tasks.ui.views.TaskActivationHistory;
@@ -32,7 +43,10 @@ import org.eclipse.mylyn.internal.tasks.ui.views.TaskDetailLabelProvider;
import org.eclipse.mylyn.internal.tasks.ui.views.TaskElementLabelProvider;
import org.eclipse.mylyn.internal.tasks.ui.views.TaskListFilteredTree;
import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
+import org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetUpdater;
+import org.eclipse.mylyn.internal.tasks.ui.workingsets.WorkingSetLabelComparator;
import org.eclipse.mylyn.tasks.core.AbstractTask;
+import org.eclipse.mylyn.tasks.core.AbstractTaskContainer;
import org.eclipse.mylyn.tasks.core.TaskList;
import org.eclipse.mylyn.tasks.ui.TasksUiPlugin;
import org.eclipse.search.internal.ui.SearchDialog;
@@ -43,8 +57,12 @@ import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.IWorkingSet;
+import org.eclipse.ui.IWorkingSetManager;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.FilteredItemsSelectionDialog;
+import org.eclipse.ui.dialogs.IWorkingSetEditWizard;
+import org.eclipse.ui.dialogs.IWorkingSetSelectionDialog;
import org.eclipse.ui.dialogs.SearchPattern;
import org.eclipse.ui.forms.events.HyperlinkAdapter;
import org.eclipse.ui.forms.events.HyperlinkEvent;
@@ -65,6 +83,10 @@ public class TaskSelectionDialog extends FilteredItemsSelectionDialog {
private static final String SHOW_COMPLETED_TASKS_SETTING = "ShowCompletedTasks";
+ private static final String IS_USING_WINDOW_WORKING_SET_SETTING = "IsUsingWindowWorkingSet";
+
+ private static final String WORKING_SET_NAME_SETTING = "WorkingSetName";
+
private boolean openInBrowser;
public boolean getOpenInBrowser() {
@@ -146,6 +168,31 @@ public class TaskSelectionDialog extends FilteredItemsSelectionDialog {
}
}
+ /**
+ * Caches the window working set
+ */
+ private final IWorkingSet windowWorkingSet;
+
+ /**
+ * Set of filtered working sets
+ */
+ private IWorkingSet selectedWorkingSet;
+
+ /**
+ * Refilters if the current working set content has changed
+ */
+ private IPropertyChangeListener workingSetListener = new IPropertyChangeListener() {
+
+ public void propertyChange(PropertyChangeEvent event) {
+ if (event.getProperty().equals(IWorkingSetManager.CHANGE_WORKING_SET_CONTENT_CHANGE)) {
+ if (event.getNewValue().equals(selectedWorkingSet)) {
+ applyFilter();
+ }
+ }
+ }
+
+ };
+
private TaskElementLabelProvider labelProvider;
public TaskSelectionDialog(Shell parent) {
@@ -153,9 +200,9 @@ public class TaskSelectionDialog extends FilteredItemsSelectionDialog {
setSelectionHistory(new TaskSelectionHistory());
labelProvider = new TaskElementLabelProvider(false);
-
+
setListLabelProvider(labelProvider);
-
+
// setListLabelProvider(new DecoratingLabelProvider(labelProvider, PlatformUI.getWorkbench()
// .getDecoratorManager()
// .getLabelDecorator()));
@@ -174,6 +221,11 @@ public class TaskSelectionDialog extends FilteredItemsSelectionDialog {
}
setInitialPattern(text);
}
+
+ windowWorkingSet = window.getActivePage().getAggregateWorkingSet();
+ selectedWorkingSet = windowWorkingSet;
+
+ PlatformUI.getWorkbench().getWorkingSetManager().addPropertyChangeListener(workingSetListener);
}
private boolean showExtendedOpeningOptions;
@@ -192,6 +244,63 @@ public class TaskSelectionDialog extends FilteredItemsSelectionDialog {
protected void fillViewMenu(IMenuManager menuManager) {
super.fillViewMenu(menuManager);
menuManager.add(showCompletedTasksAction);
+ menuManager.add(new Separator());
+
+ // Fill existing tasks working sets
+ menuManager.add(new SelectWorkingSetAction());
+ final DeselectWorkingSetAction deselectAction = new DeselectWorkingSetAction();
+ menuManager.add(deselectAction);
+ final EditWorkingSetAction editAction = new EditWorkingSetAction();
+ menuManager.add(editAction);
+ menuManager.add(new Separator("lruActions"));
+ final FilterWorkingSetAction windowWorkingSetAction = new FilterWorkingSetAction(windowWorkingSet, 1);
+ menuManager.add(windowWorkingSetAction);
+
+ menuManager.addMenuListener(new IMenuListener() {
+
+ private List<ActionContributionItem> lruActions = new ArrayList<ActionContributionItem>();
+
+ public void menuAboutToShow(IMenuManager manager) {
+ deselectAction.setEnabled(selectedWorkingSet != null);
+ editAction.setEnabled(selectedWorkingSet != null && selectedWorkingSet.isEditable());
+
+ // Remove previous LRU actions
+ for (ActionContributionItem action : lruActions) {
+ manager.remove(action);
+ }
+ lruActions.clear();
+
+ // Adds actual LRU actions
+ IWorkingSet[] workingSets = PlatformUI.getWorkbench().getWorkingSetManager().getRecentWorkingSets();
+ Arrays.sort(workingSets, new WorkingSetLabelComparator());
+ int count = 2;
+ for (IWorkingSet workingSet : workingSets) {
+ if (workingSet.getId().equalsIgnoreCase(TaskWorkingSetUpdater.ID_TASK_WORKING_SET)) {
+ IAction action = new FilterWorkingSetAction(workingSet, count++);
+ if (workingSet.equals(selectedWorkingSet)) {
+ action.setChecked(true);
+ }
+ ActionContributionItem ci = new ActionContributionItem(action);
+ lruActions.add(ci);
+ manager.appendToGroup("lruActions", ci);
+ }
+ }
+ windowWorkingSetAction.setChecked(windowWorkingSet.equals(selectedWorkingSet));
+ }
+
+ });
+ }
+
+ /**
+ * All working set filter changes should be made through this method; ensures proper history handling and triggers
+ * refiltering
+ */
+ private void setSelectedWorkingSet(IWorkingSet workingSet) {
+ selectedWorkingSet = workingSet;
+ if (workingSet != null) {
+ PlatformUI.getWorkbench().getWorkingSetManager().addRecentWorkingSet(workingSet);
+ }
+ applyFilter();
}
private boolean showCompletedTasks;
@@ -210,6 +319,82 @@ public class TaskSelectionDialog extends FilteredItemsSelectionDialog {
}
+ private class SelectWorkingSetAction extends Action {
+
+ public SelectWorkingSetAction() {
+ super("Select &Working Set...", IAction.AS_PUSH_BUTTON);
+ }
+
+ @Override
+ public void run() {
+ IWorkingSetSelectionDialog dlg = PlatformUI.getWorkbench()
+ .getWorkingSetManager()
+ .createWorkingSetSelectionDialog(getShell(), false,
+ new String[] { TaskWorkingSetUpdater.ID_TASK_WORKING_SET });
+ if (selectedWorkingSet != null) {
+ dlg.setSelection(new IWorkingSet[] { selectedWorkingSet });
+ }
+ if (dlg.open() == Window.OK) {
+ IWorkingSet[] selection = dlg.getSelection();
+ if (selection.length == 0) {
+ setSelectedWorkingSet(null);
+ } else {
+ setSelectedWorkingSet(selection[0]);
+ }
+ }
+ }
+ }
+
+ private class DeselectWorkingSetAction extends Action {
+
+ public DeselectWorkingSetAction() {
+ super("&Deselect Working Set", IAction.AS_PUSH_BUTTON);
+ }
+
+ @Override
+ public void run() {
+ setSelectedWorkingSet(null);
+ }
+ }
+
+ private class EditWorkingSetAction extends Action {
+
+ public EditWorkingSetAction() {
+ super("&Edit Active Working Set...", IAction.AS_PUSH_BUTTON);
+ }
+
+ @Override
+ public void run() {
+ IWorkingSetEditWizard wizard = PlatformUI.getWorkbench().getWorkingSetManager().createWorkingSetEditWizard(
+ selectedWorkingSet);
+ if (wizard != null) {
+ WizardDialog dlg = new WizardDialog(getShell(), wizard);
+ dlg.open();
+ }
+ }
+ }
+
+ private class FilterWorkingSetAction extends Action {
+
+ private IWorkingSet workingSet;
+
+ public FilterWorkingSetAction(IWorkingSet workingSet, int shortcutKeyNumber) {
+ super("", IAction.AS_RADIO_BUTTON);
+ this.workingSet = workingSet;
+ if (shortcutKeyNumber >= 1 && shortcutKeyNumber <= 9) {
+ setText("&" + String.valueOf(shortcutKeyNumber) + " " + workingSet.getLabel());
+ } else {
+ setText(workingSet.getLabel());
+ }
+ setImageDescriptor(workingSet.getImageDescriptor());
+ }
+
+ @Override
+ public void run() {
+ setSelectedWorkingSet(workingSet);
+ }
+ }
+
@Override
protected Control createExtendedContentArea(Composite parent) {
if (!showExtendedOpeningOptions) {
@@ -242,6 +427,7 @@ public class TaskSelectionDialog extends FilteredItemsSelectionDialog {
@Override
public boolean close() {
+ PlatformUI.getWorkbench().getWorkingSetManager().removePropertyChangeListener(workingSetListener);
if (openInBrowserCheck != null) {
openInBrowser = openInBrowserCheck.getSelection();
}
@@ -250,13 +436,31 @@ public class TaskSelectionDialog extends FilteredItemsSelectionDialog {
private class TasksFilter extends ItemsFilter {
- private boolean showCompletedTasks;
+ private final boolean showCompletedTasks;
+
+ /**
+ * Stores the task containers from selected working set; empty, which can come from no working set selection or
+ * working set with no task containers selected, means no filtering
+ */
+ private final Set<AbstractTaskContainer> elements;
+
+ private Set<AbstractTask> allTasksFromWorkingSets;
- public TasksFilter(boolean showCompletedTasks) {
+ public TasksFilter(boolean showCompletedTasks, IWorkingSet selectedWorkingSet) {
super(new SearchPattern());
// Little hack to force always a match inside any part of task text
patternMatcher.setPattern("*" + patternMatcher.getPattern());
this.showCompletedTasks = showCompletedTasks;
+
+ elements = new HashSet<AbstractTaskContainer>();
+ if (selectedWorkingSet != null) {
+ for (IAdaptable adaptable : selectedWorkingSet.getElements()) {
+ AbstractTaskContainer container = (AbstractTaskContainer) adaptable.getAdapter(AbstractTaskContainer.class);
+ if (container != null) {
+ elements.add(container);
+ }
+ }
+ }
}
@Override
@@ -265,7 +469,17 @@ public class TaskSelectionDialog extends FilteredItemsSelectionDialog {
return false;
}
if (filter instanceof TasksFilter) {
- return showCompletedTasks == ((TasksFilter) filter).showCompletedTasks;
+ TasksFilter tasksFilter = (TasksFilter) filter;
+ if (!showCompletedTasks && tasksFilter.showCompletedTasks) {
+ return false;
+ }
+ if (elements.isEmpty()) {
+ return true;
+ }
+ if (tasksFilter.elements.isEmpty()) {
+ return false;
+ }
+ return elements.containsAll(tasksFilter.elements);
}
return true;
}
@@ -276,7 +490,11 @@ public class TaskSelectionDialog extends FilteredItemsSelectionDialog {
return false;
}
if (filter instanceof TasksFilter) {
- return showCompletedTasks == ((TasksFilter) filter).showCompletedTasks;
+ TasksFilter tasksFilter = (TasksFilter) filter;
+ if (showCompletedTasks != tasksFilter.showCompletedTasks) {
+ return false;
+ }
+ return elements.equals(tasksFilter.elements);
}
return true;
}
@@ -294,13 +512,28 @@ public class TaskSelectionDialog extends FilteredItemsSelectionDialog {
if (!showCompletedTasks && ((AbstractTask) item).isCompleted()) {
return false;
}
+ if (!elements.isEmpty()) {
+ if (allTasksFromWorkingSets == null) {
+ populateTasksFromWorkingSets();
+ }
+ if (!allTasksFromWorkingSets.contains(item)) {
+ return false;
+ }
+ }
return matches(labelProvider.getText(item));
}
+
+ private void populateTasksFromWorkingSets() {
+ allTasksFromWorkingSets = new HashSet<AbstractTask>(1000);
+ for (AbstractTaskContainer container : elements) {
+ allTasksFromWorkingSets.addAll(container.getChildren());
+ }
+ }
}
@Override
protected ItemsFilter createFilter() {
- return new TasksFilter(showCompletedTasks);
+ return new TasksFilter(showCompletedTasks, selectedWorkingSet);
}
/**
@@ -339,6 +572,8 @@ public class TaskSelectionDialog extends FilteredItemsSelectionDialog {
section = settings.addNewSection(TASK_SELECTION_DIALOG_SECTION);
section.put(OPEN_IN_BROWSER_SETTING, false);
section.put(SHOW_COMPLETED_TASKS_SETTING, true);
+ section.put(IS_USING_WINDOW_WORKING_SET_SETTING, true);
+ section.put(WORKING_SET_NAME_SETTING, "");
}
return section;
}
@@ -348,6 +583,15 @@ public class TaskSelectionDialog extends FilteredItemsSelectionDialog {
openInBrowser = settings.getBoolean(OPEN_IN_BROWSER_SETTING);
showCompletedTasks = settings.getBoolean(SHOW_COMPLETED_TASKS_SETTING);
showCompletedTasksAction.setChecked(showCompletedTasks);
+ boolean isUsingWindowWorkingSet = settings.getBoolean(IS_USING_WINDOW_WORKING_SET_SETTING);
+ if (isUsingWindowWorkingSet) {
+ selectedWorkingSet = windowWorkingSet;
+ } else {
+ String workingSetName = settings.get(WORKING_SET_NAME_SETTING);
+ if (workingSetName != null) {
+ selectedWorkingSet = PlatformUI.getWorkbench().getWorkingSetManager().getWorkingSet(workingSetName);
+ }
+ }
super.restoreDialog(settings);
}
@@ -355,6 +599,12 @@ public class TaskSelectionDialog extends FilteredItemsSelectionDialog {
protected void storeDialog(IDialogSettings settings) {
settings.put(OPEN_IN_BROWSER_SETTING, openInBrowser);
settings.put(SHOW_COMPLETED_TASKS_SETTING, showCompletedTasks);
+ settings.put(IS_USING_WINDOW_WORKING_SET_SETTING, selectedWorkingSet == windowWorkingSet);
+ if (selectedWorkingSet == null) {
+ settings.put(WORKING_SET_NAME_SETTING, "");
+ } else {
+ settings.put(WORKING_SET_NAME_SETTING, selectedWorkingSet.getName());
+ }
super.storeDialog(settings);
}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/workingsets/WorkingSetLabelComparator.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/workingsets/WorkingSetLabelComparator.java
new file mode 100644
index 000000000..9d85f048c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/workingsets/WorkingSetLabelComparator.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Mylyn project committers 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
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.workingsets;
+
+import java.text.Collator;
+import java.util.Comparator;
+
+import org.eclipse.ui.IWorkingSet;
+
+/**
+ * @author Willian Mitsuda
+ */
+public class WorkingSetLabelComparator implements Comparator<IWorkingSet> {
+
+ public int compare(IWorkingSet ws1, IWorkingSet ws2) {
+ return Collator.getInstance().compare(ws1.getLabel(), ws2.getLabel());
+ }
+
+} \ No newline at end of file

Back to the top