Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.
View | Details | Raw Unified | Return to bug 193849 | Differences between
and this patch

Collapse All | Expand All

(-)src/org/eclipse/mylyn/internal/context/ui/actions/ContextCopyAction.java (-13 / +2 lines)
Lines 9-16 Link Here
9
package org.eclipse.mylyn.internal.context.ui.actions;
9
package org.eclipse.mylyn.internal.context.ui.actions;
10
10
11
import org.eclipse.jface.action.IAction;
11
import org.eclipse.jface.action.IAction;
12
import org.eclipse.jface.dialogs.Dialog;
13
import org.eclipse.jface.dialogs.IDialogSettings;
14
import org.eclipse.jface.dialogs.MessageDialog;
12
import org.eclipse.jface.dialogs.MessageDialog;
15
import org.eclipse.jface.window.Window;
13
import org.eclipse.jface.window.Window;
16
import org.eclipse.mylyn.context.core.ContextCorePlugin;
14
import org.eclipse.mylyn.context.core.ContextCorePlugin;
Lines 29-36 Link Here
29
 */
27
 */
30
public class ContextCopyAction extends TaskContextAction {
28
public class ContextCopyAction extends TaskContextAction {
31
29
32
	private static final String OPEN_TASK_ACTION_DIALOG_SETTINGS = "open.task.action.dialog.settings";
33
34
	private static final String ID_ACTION = "org.eclipse.mylyn.context.ui.task.copy.context.to";
30
	private static final String ID_ACTION = "org.eclipse.mylyn.context.ui.task.copy.context.to";
35
31
36
	public ContextCopyAction() {
32
	public ContextCopyAction() {
Lines 64-79 Link Here
64
				.getActiveWorkbenchWindow()
60
				.getActiveWorkbenchWindow()
65
				.getShell());
61
				.getShell());
66
		dialog.setTitle("Select Target Task");
62
		dialog.setTitle("Select Target Task");
63
		dialog.setMessage("&Select the target task (? = any character, * = any String):");
67
64
68
		IDialogSettings settings = TasksUiPlugin.getDefault().getDialogSettings();
65
		if (dialog.open() != Window.OK) {
69
		IDialogSettings dlgSettings = settings.getSection(OPEN_TASK_ACTION_DIALOG_SETTINGS);
70
		if (dlgSettings == null) {
71
			dlgSettings = settings.addNewSection(OPEN_TASK_ACTION_DIALOG_SETTINGS);
72
		}
73
		dialog.setDialogBoundsSettings(dlgSettings, Dialog.DIALOG_PERSISTLOCATION | Dialog.DIALOG_PERSISTSIZE);
74
75
		int ret = dialog.open();
76
		if (ret != Window.OK) {
77
			return;
66
			return;
78
		}
67
		}
79
68
(-)src/org/eclipse/mylyn/internal/tasks/ui/actions/ActivateTaskDialogAction.java (-11 / +1 lines)
Lines 9-16 Link Here
9
package org.eclipse.mylyn.internal.tasks.ui.actions;
9
package org.eclipse.mylyn.internal.tasks.ui.actions;
10
10
11
import org.eclipse.jface.action.IAction;
11
import org.eclipse.jface.action.IAction;
12
import org.eclipse.jface.dialogs.Dialog;
13
import org.eclipse.jface.dialogs.IDialogSettings;
14
import org.eclipse.jface.window.Window;
12
import org.eclipse.jface.window.Window;
15
import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
13
import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
16
import org.eclipse.mylyn.tasks.core.AbstractTask;
14
import org.eclipse.mylyn.tasks.core.AbstractTask;
Lines 32-50 Link Here
32
		this.window = window;
30
		this.window = window;
33
	}
31
	}
34
32
35
	private static final String ACTIVATE_TASK_ACTION_DIALOG_SETTINGS = "activate.task.action.dialog.settings";
36
37
	@Override
33
	@Override
38
	public void run(IAction action) {
34
	public void run(IAction action) {
39
		TaskSelectionDialog dlg = new TaskSelectionDialog(window.getShell());
35
		TaskSelectionDialog dlg = new TaskSelectionDialog(window.getShell());
40
		dlg.setTitle("Activate Task");
36
		dlg.setTitle("Activate Task");
41
37
		dlg.setMessage("&Select a task to activate (? = any character, * = any String):");
42
		IDialogSettings settings = TasksUiPlugin.getDefault().getDialogSettings();
43
		IDialogSettings dlgSettings = settings.getSection(ACTIVATE_TASK_ACTION_DIALOG_SETTINGS);
44
		if (dlgSettings == null) {
45
			dlgSettings = settings.addNewSection(ACTIVATE_TASK_ACTION_DIALOG_SETTINGS);
46
		}
47
		dlg.setDialogBoundsSettings(dlgSettings, Dialog.DIALOG_PERSISTLOCATION | Dialog.DIALOG_PERSISTSIZE);
48
38
49
		if (dlg.open() != Window.OK) {
39
		if (dlg.open() != Window.OK) {
50
			return;
40
			return;
(-)src/org/eclipse/mylyn/internal/tasks/ui/actions/OpenTaskAction.java (-18 / +2 lines)
Lines 9-19 Link Here
9
package org.eclipse.mylyn.internal.tasks.ui.actions;
9
package org.eclipse.mylyn.internal.tasks.ui.actions;
10
10
11
import org.eclipse.jface.action.IAction;
11
import org.eclipse.jface.action.IAction;
12
import org.eclipse.jface.dialogs.Dialog;
13
import org.eclipse.jface.dialogs.IDialogSettings;
14
import org.eclipse.jface.window.Window;
12
import org.eclipse.jface.window.Window;
15
import org.eclipse.mylyn.tasks.core.AbstractTask;
13
import org.eclipse.mylyn.tasks.core.AbstractTask;
16
import org.eclipse.mylyn.tasks.ui.TasksUiPlugin;
17
import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
14
import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
18
import org.eclipse.ui.IWorkbenchWindow;
15
import org.eclipse.ui.IWorkbenchWindow;
19
import org.eclipse.ui.IWorkbenchWindowActionDelegate;
16
import org.eclipse.ui.IWorkbenchWindowActionDelegate;
Lines 30-56 Link Here
30
		this.window = window;
27
		this.window = window;
31
	}
28
	}
32
29
33
	private static final String OPEN_TASK_ACTION_DIALOG_SETTINGS = "open.task.action.dialog.settings";
34
35
	private static final String SHOW_IN_BROWSER_SETTING = "show.in.browser.setting";
36
37
	@Override
30
	@Override
38
	public void run(IAction action) {
31
	public void run(IAction action) {
39
		TaskSelectionDialog dlg = new TaskSelectionDialog(window.getShell());
32
		TaskSelectionDialog dlg = new TaskSelectionDialog(window.getShell());
40
		dlg.setTitle("Open Task");
33
		dlg.setTitle("Open Task");
34
		dlg.setMessage("&Select a task to open (? = any character, * = any String):");
41
		dlg.setShowOpenInBrowserOption(true);
35
		dlg.setShowOpenInBrowserOption(true);
42
36
43
		IDialogSettings settings = TasksUiPlugin.getDefault().getDialogSettings();
37
		if (dlg.open() != Window.OK) {
44
		IDialogSettings dlgSettings = settings.getSection(OPEN_TASK_ACTION_DIALOG_SETTINGS);
45
		if (dlgSettings == null) {
46
			dlgSettings = settings.addNewSection(OPEN_TASK_ACTION_DIALOG_SETTINGS);
47
		}
48
		dlg.setDialogBoundsSettings(dlgSettings, Dialog.DIALOG_PERSISTLOCATION | Dialog.DIALOG_PERSISTSIZE);
49
		dlg.setOpenInBrowser(dlgSettings.getBoolean(SHOW_IN_BROWSER_SETTING));
50
51
		int ret = dlg.open();
52
		dlgSettings.put(SHOW_IN_BROWSER_SETTING, dlg.getOpenInBrowser());
53
		if (ret != Window.OK) {
54
			return;
38
			return;
55
		}
39
		}
56
40
(-)src/org/eclipse/mylyn/internal/tasks/ui/actions/TaskSelectionDialog.java (-193 / +267 lines)
Lines 8-59 Link Here
8
8
9
package org.eclipse.mylyn.internal.tasks.ui.actions;
9
package org.eclipse.mylyn.internal.tasks.ui.actions;
10
10
11
import java.util.ArrayList;
11
import java.util.Comparator;
12
import java.util.Collections;
13
import java.util.HashSet;
12
import java.util.HashSet;
14
import java.util.LinkedHashSet;
15
import java.util.List;
16
import java.util.Set;
13
import java.util.Set;
17
import java.util.regex.Pattern;
18
14
15
import org.eclipse.core.runtime.CoreException;
16
import org.eclipse.core.runtime.IProgressMonitor;
17
import org.eclipse.core.runtime.IStatus;
18
import org.eclipse.core.runtime.Status;
19
import org.eclipse.core.runtime.SubProgressMonitor;
20
import org.eclipse.jface.action.Action;
21
import org.eclipse.jface.action.IAction;
22
import org.eclipse.jface.action.IMenuManager;
23
import org.eclipse.jface.dialogs.IDialogSettings;
24
import org.eclipse.jface.layout.GridDataFactory;
25
import org.eclipse.jface.layout.GridLayoutFactory;
19
import org.eclipse.jface.text.ITextSelection;
26
import org.eclipse.jface.text.ITextSelection;
20
import org.eclipse.jface.viewers.ArrayContentProvider;
27
import org.eclipse.jface.viewers.DecoratingLabelProvider;
21
import org.eclipse.jface.viewers.IOpenListener;
22
import org.eclipse.jface.viewers.ISelection;
28
import org.eclipse.jface.viewers.ISelection;
23
import org.eclipse.jface.viewers.IStructuredSelection;
24
import org.eclipse.jface.viewers.OpenEvent;
25
import org.eclipse.jface.viewers.StructuredSelection;
26
import org.eclipse.jface.viewers.TableViewer;
27
import org.eclipse.jface.viewers.Viewer;
28
import org.eclipse.jface.viewers.ViewerComparator;
29
import org.eclipse.jface.viewers.ViewerFilter;
30
import org.eclipse.mylyn.internal.tasks.ui.TaskListColorsAndFonts;
29
import org.eclipse.mylyn.internal.tasks.ui.TaskListColorsAndFonts;
31
import org.eclipse.mylyn.internal.tasks.ui.TaskSearchPage;
30
import org.eclipse.mylyn.internal.tasks.ui.TaskSearchPage;
31
import org.eclipse.mylyn.internal.tasks.ui.views.TaskActivationHistory;
32
import org.eclipse.mylyn.internal.tasks.ui.views.TaskDetailLabelProvider;
32
import org.eclipse.mylyn.internal.tasks.ui.views.TaskElementLabelProvider;
33
import org.eclipse.mylyn.internal.tasks.ui.views.TaskElementLabelProvider;
33
import org.eclipse.mylyn.internal.tasks.ui.views.TaskListFilteredTree;
34
import org.eclipse.mylyn.internal.tasks.ui.views.TaskListFilteredTree;
34
import org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery;
35
import org.eclipse.mylyn.tasks.core.AbstractTask;
35
import org.eclipse.mylyn.tasks.core.AbstractTask;
36
import org.eclipse.mylyn.tasks.core.AbstractTaskContainer;
37
import org.eclipse.mylyn.tasks.core.TaskList;
36
import org.eclipse.mylyn.tasks.core.TaskList;
38
import org.eclipse.mylyn.tasks.ui.TasksUiPlugin;
37
import org.eclipse.mylyn.tasks.ui.TasksUiPlugin;
39
import org.eclipse.search.internal.ui.SearchDialog;
38
import org.eclipse.search.internal.ui.SearchDialog;
40
import org.eclipse.swt.SWT;
39
import org.eclipse.swt.SWT;
41
import org.eclipse.swt.events.KeyAdapter;
42
import org.eclipse.swt.events.KeyEvent;
43
import org.eclipse.swt.events.ModifyEvent;
44
import org.eclipse.swt.events.ModifyListener;
45
import org.eclipse.swt.layout.GridData;
46
import org.eclipse.swt.widgets.Button;
40
import org.eclipse.swt.widgets.Button;
47
import org.eclipse.swt.widgets.Composite;
41
import org.eclipse.swt.widgets.Composite;
48
import org.eclipse.swt.widgets.Control;
42
import org.eclipse.swt.widgets.Control;
49
import org.eclipse.swt.widgets.Label;
50
import org.eclipse.swt.widgets.Shell;
43
import org.eclipse.swt.widgets.Shell;
51
import org.eclipse.swt.widgets.Text;
44
import org.eclipse.ui.IMemento;
52
import org.eclipse.ui.IWorkbenchWindow;
45
import org.eclipse.ui.IWorkbenchWindow;
53
import org.eclipse.ui.PlatformUI;
46
import org.eclipse.ui.PlatformUI;
54
import org.eclipse.ui.dialogs.SelectionStatusDialog;
47
import org.eclipse.ui.dialogs.FilteredItemsSelectionDialog;
48
import org.eclipse.ui.dialogs.SearchPattern;
49
import org.eclipse.ui.forms.events.HyperlinkAdapter;
55
import org.eclipse.ui.forms.events.HyperlinkEvent;
50
import org.eclipse.ui.forms.events.HyperlinkEvent;
56
import org.eclipse.ui.forms.events.IHyperlinkListener;
57
import org.eclipse.ui.forms.widgets.ImageHyperlink;
51
import org.eclipse.ui.forms.widgets.ImageHyperlink;
58
52
59
/**
53
/**
Lines 61-122 Link Here
61
 * @author Mik Kersten
55
 * @author Mik Kersten
62
 * @author Eugene Kuleshov
56
 * @author Eugene Kuleshov
63
 */
57
 */
64
public class TaskSelectionDialog extends SelectionStatusDialog {
58
public class TaskSelectionDialog extends FilteredItemsSelectionDialog {
59
60
	private Button openInBrowserCheck;
61
62
	private static final String TASK_SELECTION_DIALOG_SECTION = "TaskSelectionDialogSection";
63
64
	private static final String OPEN_IN_BROWSER_SETTING = "OpenInBrowser";
65
66
	private static final String SHOW_COMPLETED_TASKS_SETTING = "ShowCompletedTasks";
67
68
	private boolean openInBrowser;
69
70
	public boolean getOpenInBrowser() {
71
		return openInBrowser;
72
	}
73
74
	public void setOpenInBrowser(boolean openInBrowser) {
75
		this.openInBrowser = openInBrowser;
76
	}
65
77
66
	/**
78
	/**
67
	 * Implements a {@link ViewFilter} based on content typed in the filter field
79
	 * Integrates {@link FilteredItemsSelectionDialog} history management with Mylyn's task list activation history
80
	 * <p>
81
	 * Due to {@link SelectionHistory} use of memento-based history storage, many methods are overridden
68
	 */
82
	 */
69
	private static class TaskFilter extends ViewerFilter {
83
	private class TaskSelectionHistory extends SelectionHistory {
70
84
71
		private Pattern pattern;
85
		/**
86
		 * Mylyn's task activation history
87
		 */
88
		private TaskActivationHistory history = TasksUiPlugin.getTaskListManager().getTaskActivationHistory();
72
89
73
		public void setFilterText(String filterText) {
90
		@Override
74
			if (filterText.trim().equals("")) {
91
		public synchronized void accessed(Object object) {
75
				pattern = null;
92
			history.addTask((AbstractTask) object);
76
			} else {
77
				filterText = filterText.replace("\\", "\\\\");
78
				filterText = filterText.replace(".", "\\.");
79
				filterText = filterText.replace("*", ".*");
80
				filterText = filterText.replace("?", ".?");
81
				pattern = Pattern.compile(filterText, Pattern.CASE_INSENSITIVE);
82
			}
83
		}
93
		}
84
94
85
		@Override
95
		@Override
86
		public boolean select(Viewer viewer, Object parentElement, Object element) {
96
		public synchronized boolean contains(Object object) {
87
			if (pattern == null) {
97
			return history.containsTask((AbstractTask) object);
88
				return TasksUiPlugin.getTaskListManager().getTaskActivationHistory().getPreviousTasks().contains(
89
						element);
90
			}
91
			if (element instanceof AbstractTask) {
92
				AbstractTask repositoryTask = (AbstractTask) element;
93
				String taskString = repositoryTask.getTaskKey() + ": " + repositoryTask.getSummary();
94
				return pattern.matcher(taskString).find();
95
			} else if (element instanceof AbstractTask) {
96
				String taskString = ((AbstractTask) element).getSummary();
97
				return pattern.matcher(taskString).find();
98
			}
99
			return false;
100
		}
98
		}
101
	}
102
99
103
	private TableViewer viewer;
100
		@Override
101
		public synchronized boolean remove(Object object) {
102
			return history.removeTask((AbstractTask) object);
103
		}
104
104
105
	private Button openInBrowserCheck;
105
		@Override
106
		public synchronized boolean isEmpty() {
107
			return !history.hasPrevious();
108
		}
106
109
107
	private boolean openInBrowser;
110
		@Override
111
		public void load(IMemento memento) {
112
			// do nothing because tasklist history handles this
113
		}
108
114
109
	public boolean getOpenInBrowser() {
115
		@Override
110
		return openInBrowser;
116
		public void save(IMemento memento) {
111
	}
117
			// do nothing because tasklist history handles this
118
		}
112
119
113
	public void setOpenInBrowser(boolean openInBrowser) {
120
		@Override
114
		this.openInBrowser = openInBrowser;
121
		protected Object restoreItemFromMemento(IMemento memento) {
122
			// do nothing because tasklist history handles this
123
			return null;
124
		}
125
126
		@Override
127
		protected void storeItemToMemento(Object item, IMemento memento) {
128
			// do nothing because tasklist history handles this
129
		}
130
131
		@Override
132
		public synchronized Object[] getHistoryItems() {
133
			return history.getPreviousTasks().toArray();
134
		}
115
	}
135
	}
116
136
137
	private TaskElementLabelProvider labelProvider;
138
117
	public TaskSelectionDialog(Shell parent) {
139
	public TaskSelectionDialog(Shell parent) {
118
		super(parent);
140
		super(parent);
119
		setShellStyle(getShellStyle() | SWT.RESIZE);
141
		setSelectionHistory(new TaskSelectionHistory());
142
143
		labelProvider = new TaskElementLabelProvider(true);
144
		setListLabelProvider(new DecoratingLabelProvider(labelProvider, PlatformUI.getWorkbench()
145
				.getDecoratorManager()
146
				.getLabelDecorator()));
147
		setDetailsLabelProvider(new TaskDetailLabelProvider());
148
		setSeparatorLabel("Task list matches");
149
150
		// If there is a text selection, use it as the initial filter
151
		IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
152
		ISelection selection = window.getSelectionService().getSelection();
153
		if (selection instanceof ITextSelection) {
154
			// Get only get first line
155
			String text = ((ITextSelection) selection).getText();
156
			int n = text.indexOf('\n');
157
			if (n > -1) {
158
				text.substring(0, n);
159
			}
160
			setInitialPattern(text);
161
		}
120
	}
162
	}
121
163
122
	private boolean showOpenInBrowserOption;
164
	private boolean showOpenInBrowserOption;
Lines 129-300 Link Here
129
		return showOpenInBrowserOption;
171
		return showOpenInBrowserOption;
130
	}
172
	}
131
173
174
	private ShowCompletedTasksAction showCompletedTasksAction = new ShowCompletedTasksAction();
175
132
	@Override
176
	@Override
133
	protected Control createDialogArea(Composite parent) {
177
	protected void fillViewMenu(IMenuManager menuManager) {
134
		Composite area = (Composite) super.createDialogArea(parent);
178
		super.fillViewMenu(menuManager);
179
		menuManager.add(showCompletedTasksAction);
180
	}
135
181
136
		Label message = new Label(area, SWT.NONE);
182
	private boolean showCompletedTasks;
137
		message.setText("&Select a task to open (? = any character, * = any String):");
183
138
		final Text filterText = new Text(area, SWT.SINGLE | SWT.BORDER);
184
	private class ShowCompletedTasksAction extends Action {
139
		filterText.setLayoutData(new GridData(SWT.FILL, SWT.DEFAULT, true, false));
185
140
186
		public ShowCompletedTasksAction() {
141
		Label matches = new Label(area, SWT.NONE);
187
			super("Show &Completed Tasks", IAction.AS_CHECK_BOX);
142
		matches.setText("&Matching tasks:");
143
		viewer = new TableViewer(area, SWT.SINGLE | SWT.BORDER);
144
		Control control = viewer.getControl();
145
		GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
146
		control.setLayoutData(gd);
147
		gd.widthHint = 400;
148
		gd.heightHint = 200;
149
150
		if (showOpenInBrowserOption) {
151
			openInBrowserCheck = new Button(area, SWT.CHECK);
152
			openInBrowserCheck.setText("Open with &Browser");
153
			openInBrowserCheck.setSelection(openInBrowser);
154
		}
188
		}
155
189
156
		ImageHyperlink openHyperlink = new ImageHyperlink(area, SWT.NONE);
190
		@Override
191
		public void run() {
192
			showCompletedTasks = isChecked();
193
			applyFilter();
194
		}
195
196
	}
197
198
	@Override
199
	protected Control createExtendedContentArea(Composite parent) {
200
		if (!showOpenInBrowserOption) {
201
			return null;
202
		}
203
204
		Composite composite = new Composite(parent, SWT.NONE);
205
		composite.setLayout(GridLayoutFactory.swtDefaults().margins(0, 5).create());
206
		composite.setLayoutData(GridDataFactory.fillDefaults().create());
207
208
		openInBrowserCheck = new Button(composite, SWT.CHECK);
209
		openInBrowserCheck.setText("Open with &Browser");
210
		openInBrowserCheck.setSelection(openInBrowser);
211
212
		ImageHyperlink openHyperlink = new ImageHyperlink(composite, SWT.NONE);
157
		openHyperlink.setText(TaskListFilteredTree.LABEL_SEARCH);
213
		openHyperlink.setText(TaskListFilteredTree.LABEL_SEARCH);
158
		openHyperlink.setForeground(TaskListColorsAndFonts.COLOR_HYPERLINK_WIDGET);
214
		openHyperlink.setForeground(TaskListColorsAndFonts.COLOR_HYPERLINK_WIDGET);
159
		openHyperlink.setUnderlined(true);
215
		openHyperlink.setUnderlined(true);
160
		openHyperlink.addHyperlinkListener(new IHyperlinkListener() {
216
		openHyperlink.addHyperlinkListener(new HyperlinkAdapter() {
161
217
162
			public void linkActivated(HyperlinkEvent e) {
218
			public void linkActivated(HyperlinkEvent e) {
163
				getShell().close();
219
				getShell().close();
164
				new SearchDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow(), TaskSearchPage.ID).open();
220
				new SearchDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow(), TaskSearchPage.ID).open();
165
			}
221
			}
166
222
167
			public void linkEntered(HyperlinkEvent e) {
223
		});
168
				// ignore
169
			}
170
224
171
			public void linkExited(HyperlinkEvent e) {
225
		return composite;
172
				// ignore
226
	}
173
			}
174
227
175
		});
228
	@Override
176
		
229
	public boolean close() {
177
		final TaskElementLabelProvider labelProvider = new TaskElementLabelProvider(true);
230
		if (openInBrowserCheck != null) {
178
		viewer.setLabelProvider(labelProvider);
231
			openInBrowser = openInBrowserCheck.getSelection();
179
		viewer.setContentProvider(new ArrayContentProvider());
232
		}
180
233
		return super.close();
181
		// Compute all existing tasks or query hits (if corresponding task does
234
	}
182
		// not exist yet...)
183
		Set<AbstractTaskContainer> allTasks = new HashSet<AbstractTaskContainer>();
184
		TaskList taskList = TasksUiPlugin.getTaskListManager().getTaskList();
185
		allTasks.addAll(taskList.getAllTasks());
186
		for (AbstractRepositoryQuery query : taskList.getQueries()) {
187
			allTasks.addAll(query.getChildren());
188
		}
189
190
		// Compute the task navigation history (in recent-to-older order)
191
		final List<AbstractTask> taskHistory = new ArrayList<AbstractTask>(TasksUiPlugin.getTaskListManager()
192
				.getTaskActivationHistory()
193
				.getPreviousTasks());
194
		Collections.reverse(taskHistory);
195
196
		// Compute the task set who will be presented on dialog; the trick to
197
		// make the task history appear first on the list is to add them before
198
		// all other tasks; being a LinkedHashSet, it will not be duplicated
199
		// (this is VERY IMPORTANT)
200
		Set<AbstractTaskContainer> taskSet = new LinkedHashSet<AbstractTaskContainer>(taskHistory);
201
		taskSet.addAll(allTasks);
202
		viewer.setInput(taskSet);
203
204
		final TaskSelectionDialog.TaskFilter filter = new TaskSelectionDialog.TaskFilter();
205
		viewer.addFilter(filter);
206
		viewer.setComparator(new ViewerComparator() {
207
208
			private AbstractTask getCorrespondingTask(Object o) {
209
				if (o instanceof AbstractTask) {
210
					return (AbstractTask) o;
211
				}
212
				return null;
213
			}
214
235
215
			@Override
236
	private class TasksFilter extends ItemsFilter {
216
			public int compare(Viewer viewer, Object e1, Object e2) {
217
				AbstractTask t1 = getCorrespondingTask(e1);
218
				AbstractTask t2 = getCorrespondingTask(e2);
219
				boolean isInHistory1 = taskHistory.contains(t1);
220
				boolean isInHistory2 = taskHistory.contains(t2);
221
222
				// Being on task history takes precedence...
223
				if (isInHistory1 && !isInHistory2) {
224
					return -1;
225
				}
226
				if (!isInHistory1 && isInHistory2) {
227
					return 1;
228
				}
229
230
				// Both are in task history; who is more recent?
231
				if (isInHistory1 && isInHistory2) {
232
					return taskHistory.indexOf(t1) - taskHistory.indexOf(t2);
233
				}
234
237
235
				// Both are not in task history; sort by summary...
238
		private boolean showCompletedTasks;
236
				return labelProvider.getText(e1).compareTo(labelProvider.getText(e2));
237
			}
238
239
239
		});
240
		public TasksFilter(boolean showCompletedTasks) {
240
		viewer.addOpenListener(new IOpenListener() {
241
			super(new SearchPattern());
242
			// Little hack to force always a match inside any part of task text
243
			patternMatcher.setPattern("*" + patternMatcher.getPattern());
244
			this.showCompletedTasks = showCompletedTasks;
245
		}
241
246
242
			public void open(OpenEvent event) {
247
		@Override
243
				if (getOkButton().getEnabled()) {
248
		public boolean isSubFilter(ItemsFilter filter) {
244
					okPressed();
249
			if (!super.isSubFilter(filter)) {
245
				}
250
				return false;
246
			}
251
			}
252
			if (filter instanceof TasksFilter) {
253
				return showCompletedTasks == ((TasksFilter) filter).showCompletedTasks;
254
			}
255
			return true;
256
		}
247
257
248
		});
258
		@Override
259
		public boolean equalsFilter(ItemsFilter filter) {
260
			if (!super.equalsFilter(filter)) {
261
				return false;
262
			}
263
			if (filter instanceof TasksFilter) {
264
				return showCompletedTasks == ((TasksFilter) filter).showCompletedTasks;
265
			}
266
			return true;
267
		}
249
268
250
		filterText.addKeyListener(new KeyAdapter() {
269
		@Override
270
		public boolean isConsistentItem(Object item) {
271
			return item instanceof AbstractTask;
272
		}
251
273
252
			@Override
274
		@Override
253
			public void keyPressed(KeyEvent e) {
275
		public boolean matchItem(Object item) {
254
				if (e.keyCode == SWT.ARROW_DOWN) {
276
			if (!(item instanceof AbstractTask)) {
255
					viewer.getControl().setFocus();
277
				return false;
256
				}
278
			}
279
			if (!showCompletedTasks && ((AbstractTask) item).isCompleted()) {
280
				return false;
257
			}
281
			}
282
			return matches(labelProvider.getText(item));
283
		}
284
	}
258
285
259
		});
286
	@Override
260
		filterText.addModifyListener(new ModifyListener() {
287
	protected ItemsFilter createFilter() {
288
		return new TasksFilter(showCompletedTasks);
289
	}
261
290
262
			public void modifyText(ModifyEvent e) {
291
	/**
263
				filter.setFilterText(filterText.getText());
292
	 * Caches all tasks; populated at first access
264
				viewer.refresh(false);
293
	 */
265
				Object first = viewer.getElementAt(0);
294
	private Set<AbstractTask> allTasks;
266
				if (first != null) {
267
					viewer.setSelection(new StructuredSelection(first));
268
				}
269
			}
270
295
271
		});
296
	@Override
272
		IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
297
	protected void fillContentProvider(AbstractContentProvider contentProvider, ItemsFilter itemsFilter,
273
		ISelection selection = window.getSelectionService().getSelection();
298
			IProgressMonitor progressMonitor) throws CoreException {
274
		if (selection instanceof ITextSelection) {
299
		progressMonitor.beginTask("Search for tasks", 100);
275
			String text = ((ITextSelection) selection).getText();
300
276
			int n = text.indexOf('\n');
301
		if (allTasks == null) {
277
			if (n > -1) {
302
			allTasks = new HashSet<AbstractTask>();
278
				text.substring(0, n);
303
			TaskList taskList = TasksUiPlugin.getTaskListManager().getTaskList();
279
			}
304
			allTasks.addAll(taskList.getAllTasks());
280
			filterText.setText(text);
305
		}
281
			filterText.setSelection(0, text.length());
306
		progressMonitor.worked(10);
307
308
		SubProgressMonitor subMonitor = new SubProgressMonitor(progressMonitor, 90);
309
		subMonitor.beginTask("Scanning tasks", allTasks.size());
310
		for (AbstractTask task : allTasks) {
311
			contentProvider.add(task, itemsFilter);
312
			subMonitor.worked(1);
282
		}
313
		}
314
		subMonitor.done();
283
315
284
		return area;
316
		progressMonitor.done();
285
	}
317
	}
286
318
287
	@Override
319
	@Override
288
	protected void computeResult() {
320
	protected IDialogSettings getDialogSettings() {
289
		setResult(((IStructuredSelection) viewer.getSelection()).toList());
321
		IDialogSettings settings = TasksUiPlugin.getDefault().getDialogSettings();
322
		IDialogSettings section = settings.getSection(TASK_SELECTION_DIALOG_SECTION);
323
		if (section == null) {
324
			section = settings.addNewSection(TASK_SELECTION_DIALOG_SECTION);
325
			section.put(OPEN_IN_BROWSER_SETTING, false);
326
			section.put(SHOW_COMPLETED_TASKS_SETTING, true);
327
		}
328
		return section;
290
	}
329
	}
291
330
292
	@Override
331
	@Override
293
	public boolean close() {
332
	protected void restoreDialog(IDialogSettings settings) {
294
		if (openInBrowserCheck != null) {
333
		openInBrowser = settings.getBoolean(OPEN_IN_BROWSER_SETTING);
295
			openInBrowser = openInBrowserCheck.getSelection();
334
		showCompletedTasks = settings.getBoolean(SHOW_COMPLETED_TASKS_SETTING);
335
		showCompletedTasksAction.setChecked(showCompletedTasks);
336
		super.restoreDialog(settings);
337
	}
338
339
	@Override
340
	protected void storeDialog(IDialogSettings settings) {
341
		settings.put(OPEN_IN_BROWSER_SETTING, openInBrowser);
342
		settings.put(SHOW_COMPLETED_TASKS_SETTING, showCompletedTasks);
343
		super.storeDialog(settings);
344
	}
345
346
	@Override
347
	public String getElementName(Object item) {
348
		return labelProvider.getText(item);
349
	}
350
351
	/**
352
	 * Sort tasks by summary
353
	 */
354
	@SuppressWarnings("unchecked")
355
	@Override
356
	protected Comparator getItemsComparator() {
357
		return new Comparator() {
358
359
			public int compare(Object o1, Object o2) {
360
				return labelProvider.getText(o1).compareTo(labelProvider.getText(o2));
361
			}
362
363
		};
364
	}
365
366
	@Override
367
	protected IStatus validateItem(Object item) {
368
		if (item instanceof AbstractTask) {
369
			return Status.OK_STATUS;
296
		}
370
		}
297
		return super.close();
371
		return new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Selected item is not a task");
298
	}
372
	}
299
373
300
}
374
}
(-)src/org/eclipse/mylyn/internal/tasks/ui/views/TaskActivationHistory.java (-1 / +10 lines)
Lines 8-13 Link Here
8
package org.eclipse.mylyn.internal.tasks.ui.views;
8
package org.eclipse.mylyn.internal.tasks.ui.views;
9
9
10
import java.util.ArrayList;
10
import java.util.ArrayList;
11
import java.util.Collections;
11
import java.util.List;
12
import java.util.List;
12
13
13
import org.eclipse.mylyn.context.core.ContextCorePlugin;
14
import org.eclipse.mylyn.context.core.ContextCorePlugin;
Lines 87-92 Link Here
87
		}
88
		}
88
	}
89
	}
89
90
91
	public boolean containsTask(AbstractTask task) {
92
		return history.contains(task);
93
	}
94
95
	public boolean removeTask(AbstractTask task) {
96
		return history.remove(task);
97
	}
98
	
90
	public AbstractTask getPreviousTask() {
99
	public AbstractTask getPreviousTask() {
91
		try {
100
		try {
92
			boolean active = false;
101
			boolean active = false;
Lines 113-119 Link Here
113
	}
122
	}
114
123
115
	public List<AbstractTask> getPreviousTasks() {
124
	public List<AbstractTask> getPreviousTasks() {
116
		return history;
125
		return Collections.unmodifiableList(history);
117
	}
126
	}
118
127
119
	public boolean hasPrevious() {
128
	public boolean hasPrevious() {
(-)src/org/eclipse/mylyn/internal/tasks/ui/views/TaskDetailLabelProvider.java (+55 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2004, 2007 Mylyn project committers and others.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 *******************************************************************************/
8
9
package org.eclipse.mylyn.internal.tasks.ui.views;
10
11
import org.eclipse.jface.resource.ImageDescriptor;
12
import org.eclipse.jface.viewers.ILabelProvider;
13
import org.eclipse.jface.viewers.LabelProvider;
14
import org.eclipse.mylyn.internal.tasks.ui.TasksUiImages;
15
import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
16
import org.eclipse.mylyn.tasks.core.AbstractTask;
17
import org.eclipse.mylyn.tasks.core.TaskRepository;
18
import org.eclipse.mylyn.tasks.ui.TasksUiPlugin;
19
import org.eclipse.swt.graphics.Image;
20
21
/**
22
 * Displays task repository info from a {@link AbstractTask}
23
 * 
24
 * @author Willian Mitsuda
25
 */
26
public class TaskDetailLabelProvider extends LabelProvider implements ILabelProvider {
27
28
	@Override
29
	public Image getImage(Object element) {
30
		if (!(element instanceof AbstractTask)) {
31
			return super.getImage(element);
32
		}
33
34
		AbstractRepositoryConnector connector = TasksUiPlugin.getRepositoryManager().getRepositoryConnector(
35
				(AbstractTask) element);
36
		ImageDescriptor overlay = TasksUiPlugin.getDefault().getOverlayIcon(connector.getConnectorKind());
37
		if (overlay != null) {
38
			return TasksUiImages.getImageWithOverlay(TasksUiImages.REPOSITORY, overlay, false, false);
39
		} else {
40
			return TasksUiImages.getImage(TasksUiImages.REPOSITORY);
41
		}
42
	}
43
44
	@Override
45
	public String getText(Object element) {
46
		if (!(element instanceof AbstractTask)) {
47
			return super.getText(element);
48
		}
49
50
		TaskRepository repository = TasksUiPlugin.getRepositoryManager().getRepository(
51
				((AbstractTask) element).getRepositoryUrl());
52
		return repository.getRepositoryLabel();
53
	}
54
55
}

Return to bug 193849