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 216150 | Differences between
and this patch

Collapse All | Expand All

(-)src/org/eclipse/mylyn/internal/tasks/ui/editors/messages.properties (-6 lines)
Lines 29-40 Link Here
29
29
30
PlanningPageFactory_Planning=Planning
30
PlanningPageFactory_Planning=Planning
31
31
32
PreviewAttributeEditor_Edit=Edit
33
PreviewAttributeEditor_Error=Error
34
PreviewAttributeEditor_Formatting_Wiki_Text=Formatting Wiki Text
35
PreviewAttributeEditor_Loading_preview_=Loading preview...
36
PreviewAttributeEditor_Preview=Preview
37
38
RichTextAttributeEditor_Viewer_Source=View Unformatted Text
32
RichTextAttributeEditor_Viewer_Source=View Unformatted Text
39
33
40
TaskAttachmentDropListener_Note_that_only_the_first_file_dragged_will_be_attached=Note that only the first file dragged will be attached.
34
TaskAttachmentDropListener_Note_that_only_the_first_file_dragged_will_be_attached=Note that only the first file dragged will be attached.
(-)src/org/eclipse/mylyn/internal/tasks/ui/editors/Messages.java (-10 lines)
Lines 71-86 Link Here
71
71
72
	public static String PlanningPageFactory_Planning;
72
	public static String PlanningPageFactory_Planning;
73
73
74
	public static String PreviewAttributeEditor_Edit;
75
76
	public static String PreviewAttributeEditor_Error;
77
78
	public static String PreviewAttributeEditor_Formatting_Wiki_Text;
79
80
	public static String PreviewAttributeEditor_Loading_preview_;
81
82
	public static String PreviewAttributeEditor_Preview;
83
84
	public static String RichTextAttributeEditor_Viewer_Source;
74
	public static String RichTextAttributeEditor_Viewer_Source;
85
75
86
	public static String TaskAttachmentDropListener_Note_that_only_the_first_file_dragged_will_be_attached;
76
	public static String TaskAttachmentDropListener_Note_that_only_the_first_file_dragged_will_be_attached;
(-)src/org/eclipse/mylyn/internal/tasks/ui/search/Messages.java (-6 / +2 lines)
Lines 47-58 Link Here
47
47
48
	public static String RepositorySearchResultView_Refine_Search_;
48
	public static String RepositorySearchResultView_Refine_Search_;
49
49
50
	public static String RepositorySearchResultView_Sort_by;
51
52
	public static String RepositorySearchResultView_Task_Priority;
53
54
	public static String RepositorySearchResultView_Task_Summary;
55
56
	public static String SearchHitCollector_Max_allowed_number_of_hits_returned_exceeded;
50
	public static String SearchHitCollector_Max_allowed_number_of_hits_returned_exceeded;
57
51
58
	public static String SearchHitCollector_Querying_Repository_;
52
	public static String SearchHitCollector_Querying_Repository_;
Lines 72-75 Link Here
72
	public static String SearchResultTreeContentProvider_Incomplete;
66
	public static String SearchResultTreeContentProvider_Incomplete;
73
67
74
	public static String SearchResultTreeContentProvider__unknown_;
68
	public static String SearchResultTreeContentProvider__unknown_;
69
70
	public static String SearchResultSortAction_Sort_Label;
75
}
71
}
(-)src/org/eclipse/mylyn/internal/tasks/ui/search/SearchResultSortAction.java (-33 / +12 lines)
Lines 12-59 Link Here
12
package org.eclipse.mylyn.internal.tasks.ui.search;
12
package org.eclipse.mylyn.internal.tasks.ui.search;
13
13
14
import org.eclipse.jface.action.Action;
14
import org.eclipse.jface.action.Action;
15
import org.eclipse.jface.window.Window;
16
import org.eclipse.mylyn.internal.tasks.ui.dialogs.TaskCompareDialog;
15
17
16
/**
18
/**
17
 * This class sorts search results by a supplied category.
19
 * @author Steffen Pingel
18
 * 
19
 * @author Rob Elves (moved to tasks.ui)
20
 */
20
 */
21
public class SearchResultSortAction extends Action {
21
public class SearchResultSortAction extends Action {
22
22
23
	/** The category that this class sorts Bugzilla search results by. */
23
	private final RepositorySearchResultView view;
24
	private final int bugSortOrder;
25
24
26
	/** The view where the Bugzilla search results are displayed. */
25
	public SearchResultSortAction(RepositorySearchResultView view) {
27
	private final RepositorySearchResultView bugPage;
26
		super(Messages.SearchResultSortAction_Sort_Label);
28
27
		this.view = view;
29
	/**
28
		setEnabled(true);
30
	 * Constructor
31
	 * 
32
	 * @param label
33
	 *            The string used as the text for the action, or null if there is no text
34
	 * @param page
35
	 *            The view where the Bugzilla search results are displayed.
36
	 * @param sortOrder
37
	 *            The category that this class sorts Bugzilla search results by
38
	 */
39
	public SearchResultSortAction(String label, RepositorySearchResultView page, int sortOrder) {
40
		super(label);
41
		bugPage = page;
42
		bugSortOrder = sortOrder;
43
	}
29
	}
44
30
45
	/**
46
	 * Reorder the Bugzilla search results.
47
	 */
48
	@Override
31
	@Override
49
	public void run() {
32
	public void run() {
50
		bugPage.setSortOrder(bugSortOrder);
33
		TaskCompareDialog dialog = new TaskCompareDialog(view.getSite(), view.getSorter().getTaskComparator());
51
	}
34
		if (dialog.open() == Window.OK) {
52
35
			view.getViewer().refresh();
53
	/**
36
		}
54
	 * Returns the category that this class sorts Bugzilla search results by.
55
	 */
56
	public int getSortOrder() {
57
		return bugSortOrder;
58
	}
37
	}
59
}
38
}
(-)src/org/eclipse/mylyn/internal/tasks/ui/search/SearchResultSorterPriority.java (-65 lines)
Removed Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2004, 2008 Tasktop Technologies and others.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 *
8
 * Contributors:
9
 *     Tasktop Technologies - initial API and implementation
10
 *******************************************************************************/
11
12
package org.eclipse.mylyn.internal.tasks.ui.search;
13
14
import org.eclipse.jface.viewers.Viewer;
15
import org.eclipse.jface.viewers.ViewerSorter;
16
import org.eclipse.mylyn.tasks.core.ITask;
17
18
/**
19
 * Sorts results of Bugzilla search by bug priority.
20
 * 
21
 * @author Rob Elves (modifications)
22
 */
23
public class SearchResultSorterPriority extends ViewerSorter {
24
25
	/**
26
	 * Returns a negative, zero, or positive number depending on whether the first bug's priority goes before, is the
27
	 * same as, or goes after the second element's priority.
28
	 * <p>
29
	 * 
30
	 * @see org.eclipse.jface.viewers.ViewerSorter#compare(org.eclipse.jface.viewers.Viewer, java.lang.Object,
31
	 *      java.lang.Object)
32
	 */
33
	@Override
34
	public int compare(Viewer viewer, Object e1, Object e2) {
35
		try {
36
			ITask hit1 = (ITask) e1;
37
			ITask hit2 = (ITask) e2;
38
			return hit1.getPriority().compareTo(hit2.getPriority());
39
		} catch (Exception ignored) {
40
			// do nothing
41
		}
42
		// if that didn't work, use the default compare method
43
		return super.compare(viewer, e1, e2);
44
	}
45
46
	/**
47
	 * Returns the category of the given element. The category is a number used to allocate elements to bins; the bins
48
	 * are arranged in ascending numeric order. The elements within a bin are arranged via a second level sort
49
	 * criterion.
50
	 * <p>
51
	 * 
52
	 * @see org.eclipse.jface.viewers.ViewerSorter#category(Object)
53
	 */
54
	@Override
55
	public int category(Object element) {
56
		try {
57
			ITask hit = (ITask) element;
58
			return Integer.parseInt(hit.getTaskId());
59
		} catch (Exception ignored) {
60
			// ignore if there is a problem
61
		}
62
		// if that didn't work, use the default category method
63
		return super.category(element);
64
	}
65
}
(-)src/org/eclipse/mylyn/internal/tasks/ui/search/SearchResultSorterId.java (-73 lines)
Removed Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2004, 2008 Tasktop Technologies and others.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 *
8
 * Contributors:
9
 *     Tasktop Technologies - initial API and implementation
10
 *******************************************************************************/
11
12
package org.eclipse.mylyn.internal.tasks.ui.search;
13
14
import org.eclipse.jface.viewers.Viewer;
15
import org.eclipse.jface.viewers.ViewerSorter;
16
import org.eclipse.mylyn.tasks.core.ITask;
17
18
/**
19
 * Sorts search results (AbstractQueryHit) by taskId.
20
 */
21
public class SearchResultSorterId extends ViewerSorter {
22
23
	/**
24
	 * Returns a negative, zero, or positive number depending on whether the first bug's taskId is less than, equal to,
25
	 * or greater than the second bug's taskId.
26
	 * <p>
27
	 * 
28
	 * @see org.eclipse.jface.viewers.ViewerSorter#compare(org.eclipse.jface.viewers.Viewer, java.lang.Object,
29
	 *      java.lang.Object)
30
	 */
31
	@Override
32
	public int compare(Viewer viewer, Object e1, Object e2) {
33
		try {
34
			// cast the object and get its bug taskId
35
			ITask entry1 = (ITask) e1;
36
			Integer id1 = Integer.parseInt(entry1.getTaskId());
37
38
			// cast the other object and get its bug taskId
39
			ITask entry2 = (ITask) e2;
40
			Integer id2 = Integer.parseInt(entry2.getTaskId());
41
42
			// if neither is null, compare the bug taskId's
43
			if (id1 != null && id2 != null) {
44
				return id1.compareTo(id2);
45
			}
46
		} catch (Exception ignored) {
47
			// ignore if there is a problem
48
		}
49
50
		// if that didn't work, use the default compare method
51
		return super.compare(viewer, e1, e2);
52
	}
53
54
	/**
55
	 * Returns the category of the given element. The category is a number used to allocate elements to bins; the bins
56
	 * are arranged in ascending numeric order. The elements within a bin are arranged via a second level sort
57
	 * criterion.
58
	 * <p>
59
	 * 
60
	 * @see org.eclipse.jface.viewers.ViewerSorter#category(Object)
61
	 */
62
	@Override
63
	public int category(Object element) {
64
		try {
65
			ITask hit = (ITask) element;
66
			return Integer.parseInt(hit.getTaskId());
67
		} catch (Exception ignored) {
68
			// ignore
69
		}
70
		// if that didn't work, use the default category method
71
		return super.category(element);
72
	}
73
}
(-)src/org/eclipse/mylyn/internal/tasks/ui/search/SearchResultSorter.java (-45 / +18 lines)
Lines 7-77 Link Here
7
 *
7
 *
8
 * Contributors:
8
 * Contributors:
9
 *     Tasktop Technologies - initial API and implementation
9
 *     Tasktop Technologies - initial API and implementation
10
 *     Frank Becker - fix for bug 216150
10
 *******************************************************************************/
11
 *******************************************************************************/
11
12
12
package org.eclipse.mylyn.internal.tasks.ui.search;
13
package org.eclipse.mylyn.internal.tasks.ui.search;
13
14
14
import org.eclipse.jface.viewers.Viewer;
15
import org.eclipse.jface.viewers.Viewer;
15
import org.eclipse.jface.viewers.ViewerSorter;
16
import org.eclipse.jface.viewers.ViewerSorter;
16
import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
17
import org.eclipse.mylyn.internal.tasks.ui.util.TaskComparator;
17
import org.eclipse.mylyn.internal.tasks.ui.util.TaskComparator;
18
import org.eclipse.mylyn.internal.tasks.ui.views.TaskKeyComparator;
19
import org.eclipse.mylyn.tasks.core.ITask;
18
import org.eclipse.mylyn.tasks.core.ITask;
20
19
21
/**
20
/**
22
 * Sorts search results by summary.
21
 * Sorts search results.
23
 * 
22
 * 
23
 * @see TaskComparator
24
 * @author Rob Elves
24
 * @author Rob Elves
25
 * @author Frank Becker
25
 */
26
 */
26
public class SearchResultSorter extends ViewerSorter {
27
public class SearchResultSorter extends ViewerSorter {
27
28
28
	private final TaskKeyComparator taskKeyComparator = new TaskKeyComparator();
29
	private final TaskComparator taskComparator;
30
31
	public SearchResultSorter() {
32
		taskComparator = new TaskComparator();
33
	}
29
34
30
	/**
31
	 * Returns a negative, zero, or positive number depending on whether the first bug's summary goes before, is the
32
	 * same as, or goes after the second element's summary.
33
	 * <p>
34
	 * 
35
	 * @see org.eclipse.jface.viewers.ViewerSorter#compare(org.eclipse.jface.viewers.Viewer, java.lang.Object,
36
	 *      java.lang.Object)
37
	 */
38
	@Override
35
	@Override
39
	public int compare(Viewer viewer, Object e1, Object e2) {
36
	public int compare(Viewer viewer, Object e1, Object e2) {
40
		try {
37
		if (e1 instanceof ITask && e2 instanceof ITask) {
41
38
			ITask entry1 = (ITask) e1;
42
			AbstractTask entry1 = (AbstractTask) e1;
39
			ITask entry2 = (ITask) e2;
43
			AbstractTask entry2 = (AbstractTask) e2;
40
			return taskComparator.compare(entry1, entry2);
44
			// NOTE we just comparing ids here, once summary and taskId separated
41
		} else {
45
			// they should have their own column/sorter.
42
			return super.compare(viewer, e1, e2);
46
			return taskKeyComparator.compare(TaskComparator.getSortableFromElement(entry1),
47
					TaskComparator.getSortableFromElement(entry2));
48
			// return taskKeyComparator.compare(entry1.getDescription(),
49
			// entry2.getDescription());
50
		} catch (Exception ignored) {
51
			// do nothing
52
		}
43
		}
53
54
		// if that didn't work, use the default compare method
55
		return super.compare(viewer, e1, e2);
56
	}
44
	}
57
45
58
	/**
46
	public TaskComparator getTaskComparator() {
59
	 * Returns the category of the given element. The category is a number used to allocate elements to bins; the bins
47
		return taskComparator;
60
	 * are arranged in ascending numeric order. The elements within a bin are arranged via a second level sort
61
	 * criterion.
62
	 * <p>
63
	 * 
64
	 * @see org.eclipse.jface.viewers.ViewerSorter#category(Object)
65
	 */
66
	@Override
67
	public int category(Object element) {
68
		try {
69
			ITask hit = (ITask) element;
70
			return Integer.parseInt(hit.getTaskId());
71
		} catch (Exception ignored) {
72
			// ignore if
73
		}
74
		// if that didn't work, use the default category method
75
		return super.category(element);
76
	}
48
	}
49
77
}
50
}
(-)src/org/eclipse/mylyn/internal/tasks/ui/search/RepositorySearchResultView.java (-76 / +35 lines)
Lines 37-43 Link Here
37
import org.eclipse.mylyn.internal.tasks.core.TaskGroup;
37
import org.eclipse.mylyn.internal.tasks.core.TaskGroup;
38
import org.eclipse.mylyn.internal.tasks.core.UnmatchedTaskContainer;
38
import org.eclipse.mylyn.internal.tasks.core.UnmatchedTaskContainer;
39
import org.eclipse.mylyn.internal.tasks.ui.AddExistingTaskJob;
39
import org.eclipse.mylyn.internal.tasks.ui.AddExistingTaskJob;
40
import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
41
import org.eclipse.mylyn.internal.tasks.ui.actions.OpenTaskSearchAction;
40
import org.eclipse.mylyn.internal.tasks.ui.actions.OpenTaskSearchAction;
42
import org.eclipse.mylyn.internal.tasks.ui.actions.OpenWithBrowserAction;
41
import org.eclipse.mylyn.internal.tasks.ui.actions.OpenWithBrowserAction;
43
import org.eclipse.mylyn.internal.tasks.ui.search.SearchResultTreeContentProvider.GroupBy;
42
import org.eclipse.mylyn.internal.tasks.ui.search.SearchResultTreeContentProvider.GroupBy;
Lines 60-65 Link Here
60
import org.eclipse.swt.widgets.Composite;
59
import org.eclipse.swt.widgets.Composite;
61
import org.eclipse.swt.widgets.Event;
60
import org.eclipse.swt.widgets.Event;
62
import org.eclipse.swt.widgets.Layout;
61
import org.eclipse.swt.widgets.Layout;
62
import org.eclipse.ui.IMemento;
63
import org.eclipse.ui.PartInitException;
63
import org.eclipse.ui.PartInitException;
64
import org.eclipse.ui.PlatformUI;
64
import org.eclipse.ui.PlatformUI;
65
import org.eclipse.ui.dialogs.FilteredTree;
65
import org.eclipse.ui.dialogs.FilteredTree;
Lines 89-98 Link Here
89
			groupingActions.add(this);
89
			groupingActions.add(this);
90
		}
90
		}
91
91
92
		public GroupBy getGroupBy() {
93
			return groupBy;
94
		}
95
96
		@Override
92
		@Override
97
		public void run() {
93
		public void run() {
98
			for (GroupingAction action : groupingActions) {
94
			for (GroupingAction action : groupingActions) {
Lines 130-157 Link Here
130
		}
126
		}
131
	}
127
	}
132
128
133
	public static final int ORDER_PRIORITY = 1;
129
	private static final String MEMENTO_KEY_SORT = "sort"; //$NON-NLS-1$
134
135
	public static final int ORDER_DESCRIPTION = 2;
136
137
	public static final int ORDER_SEVERITY = 3;
138
139
	public static final int ORDER_STATUS = 4;
140
141
	public static final int ORDER_ID = 5;
142
143
	public static final int ORDER_DEFAULT = ORDER_PRIORITY;
144
145
	private static final String KEY_SORTING = TasksUiPlugin.ID_PLUGIN + ".search.resultpage.sorting"; //$NON-NLS-1$
146
130
147
	private SearchResultContentProvider searchResultProvider;
131
	private SearchResultContentProvider searchResultProvider;
148
132
149
	private int currentSortOrder;
150
151
	private final SearchResultSortAction sortByPriorityAction;
152
153
	private final SearchResultSortAction sortByDescriptionAction;
154
155
	private final OpenSearchResultAction openInEditorAction;
133
	private final OpenSearchResultAction openInEditorAction;
156
134
157
	private final CreateQueryFromSearchAction createQueryAction;
135
	private final CreateQueryFromSearchAction createQueryAction;
Lines 168-173 Link Here
168
146
169
	private final OpenWithBrowserAction openSearchWithBrowserAction;
147
	private final OpenWithBrowserAction openSearchWithBrowserAction;
170
148
149
	private final SearchResultSorter searchResultSorter;
150
151
	private SearchResultSortAction sortByDialogAction;
152
171
	private static final IShowInTargetList SHOW_IN_TARGET_LIST = new IShowInTargetList() {
153
	private static final IShowInTargetList SHOW_IN_TARGET_LIST = new IShowInTargetList() {
172
		public String[] getShowInTargetIds() {
154
		public String[] getShowInTargetIds() {
173
			return SHOW_IN_TARGETS;
155
			return SHOW_IN_TARGETS;
Lines 178-189 Link Here
178
		// Only use the table layout.
160
		// Only use the table layout.
179
		super(FLAG_LAYOUT_TREE);
161
		super(FLAG_LAYOUT_TREE);
180
162
181
		sortByPriorityAction = new SearchResultSortAction(Messages.RepositorySearchResultView_Task_Priority, this,
182
				ORDER_PRIORITY);
183
		sortByDescriptionAction = new SearchResultSortAction(Messages.RepositorySearchResultView_Task_Summary, this,
184
				ORDER_DESCRIPTION);
185
		currentSortOrder = ORDER_DEFAULT;
186
187
		openInEditorAction = new OpenSearchResultAction(Messages.RepositorySearchResultView_Open_in_Editor, this);
163
		openInEditorAction = new OpenSearchResultAction(Messages.RepositorySearchResultView_Open_in_Editor, this);
188
		createQueryAction = new CreateQueryFromSearchAction(
164
		createQueryAction = new CreateQueryFromSearchAction(
189
				Messages.RepositorySearchResultView_Create_Query_from_Search_, this);
165
				Messages.RepositorySearchResultView_Create_Query_from_Search_, this);
Lines 194-200 Link Here
194
170
195
		groupingActions = new ArrayList<GroupingAction>();
171
		groupingActions = new ArrayList<GroupingAction>();
196
		new GroupingAction(Messages.RepositorySearchResultView_Group_By_Owner, GroupBy.OWNER);
172
		new GroupingAction(Messages.RepositorySearchResultView_Group_By_Owner, GroupBy.OWNER);
197
		//new GroupingAction("Group By Complete", GroupBy.COMPLETION);
173
//		new GroupingAction(Messages.RepositorySearchResultView_Group_By_Complete, GroupBy.COMPLETION);
198
174
199
		filterActions = new ArrayList<FilteringAction>();
175
		filterActions = new ArrayList<FilteringAction>();
200
		new FilteringAction(Messages.RepositorySearchResultView_Filter_Completed_Tasks, new ViewerFilter() {
176
		new FilteringAction(Messages.RepositorySearchResultView_Filter_Completed_Tasks, new ViewerFilter() {
Lines 209-214 Link Here
209
				return true;
185
				return true;
210
			}
186
			}
211
		});
187
		});
188
189
		// construct early since to be ready when restoreState() is invoked
190
		searchResultSorter = new SearchResultSorter();
212
	}
191
	}
213
192
214
	@Override
193
	@Override
Lines 242-251 Link Here
242
		DecoratingLabelProvider labelProvider = new DecoratingLabelProvider(new SearchResultsLabelProvider(
221
		DecoratingLabelProvider labelProvider = new DecoratingLabelProvider(new SearchResultsLabelProvider(
243
				searchResultProvider, viewer), PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator());
222
				searchResultProvider, viewer), PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator());
244
		viewer.setLabelProvider(labelProvider);
223
		viewer.setLabelProvider(labelProvider);
245
224
		viewer.setSorter(searchResultSorter);
246
		// Set the order when the search view is loading so that the items are
225
		sortByDialogAction = new SearchResultSortAction(this);
247
		// sorted right away
248
		setSortOrder(currentSortOrder);
249
226
250
		toolTip = new TaskListToolTip(viewer.getControl());
227
		toolTip = new TaskListToolTip(viewer.getControl());
251
	}
228
	}
Lines 319-354 Link Here
319
		super.dispose();
296
		super.dispose();
320
	}
297
	}
321
298
322
	/**
323
	 * Sets the new sorting category, and reorders all of the tasks.
324
	 * 
325
	 * @param sortOrder
326
	 *            The new category to sort by
327
	 */
328
	public void setSortOrder(int sortOrder) {
329
		StructuredViewer viewer = getViewer();
330
331
		switch (sortOrder) {
332
		case ORDER_ID:
333
			viewer.setSorter(new SearchResultSorterId());
334
			break;
335
		case ORDER_DESCRIPTION:
336
			viewer.setSorter(new SearchResultSorter());
337
			break;
338
		case ORDER_PRIORITY:
339
			viewer.setSorter(new SearchResultSorterPriority());
340
			break;
341
		default:
342
			// If the setting is not one of the four valid ones,
343
			// use the default order setting.
344
			sortOrder = ORDER_DEFAULT;
345
			viewer.setSorter(new SearchResultSorterPriority());
346
			break;
347
		}
348
		currentSortOrder = sortOrder;
349
		getSettings().put(KEY_SORTING, currentSortOrder);
350
	}
351
352
	@SuppressWarnings("unchecked")
299
	@SuppressWarnings("unchecked")
353
	public Object getAdapter(Class adapter) {
300
	public Object getAdapter(Class adapter) {
354
		return getAdapterDelegate(adapter);
301
		return getAdapterDelegate(adapter);
Lines 373-379 Link Here
373
		super.fillContextMenu(menuManager);
320
		super.fillContextMenu(menuManager);
374
321
375
		// open actions
322
		// open actions
376
377
		menuManager.appendToGroup(IContextMenuConstants.GROUP_OPEN, openInEditorAction);
323
		menuManager.appendToGroup(IContextMenuConstants.GROUP_OPEN, openInEditorAction);
378
324
379
		// Add to Task List menu
325
		// Add to Task List menu
Lines 405-420 Link Here
405
		menuManager.appendToGroup(IContextMenuConstants.GROUP_SEARCH, refineSearchAction);
351
		menuManager.appendToGroup(IContextMenuConstants.GROUP_SEARCH, refineSearchAction);
406
		menuManager.appendToGroup(IContextMenuConstants.GROUP_SEARCH, openSearchWithBrowserAction);
352
		menuManager.appendToGroup(IContextMenuConstants.GROUP_SEARCH, openSearchWithBrowserAction);
407
353
408
		// sort actions
354
		menuManager.appendToGroup(IContextMenuConstants.GROUP_VIEWER_SETUP, sortByDialogAction);
409
410
		MenuManager sortMenuManager = new MenuManager(Messages.RepositorySearchResultView_Sort_by);
411
		sortMenuManager.add(sortByPriorityAction);
412
		sortMenuManager.add(sortByDescriptionAction);
413
414
		sortByPriorityAction.setChecked(currentSortOrder == sortByPriorityAction.getSortOrder());
415
		sortByDescriptionAction.setChecked(currentSortOrder == sortByDescriptionAction.getSortOrder());
416
417
		menuManager.appendToGroup(IContextMenuConstants.GROUP_VIEWER_SETUP, sortMenuManager);
418
		for (Action action : groupingActions) {
355
		for (Action action : groupingActions) {
419
			menuManager.appendToGroup(IContextMenuConstants.GROUP_VIEWER_SETUP, action);
356
			menuManager.appendToGroup(IContextMenuConstants.GROUP_VIEWER_SETUP, action);
420
		}
357
		}
Lines 469-472 Link Here
469
		}
406
		}
470
	}
407
	}
471
408
409
	public SearchResultSorter getSorter() {
410
		return searchResultSorter;
411
	}
412
413
	@Override
414
	public void restoreState(IMemento memento) {
415
		super.restoreState(memento);
416
		IMemento child = memento.getChild(MEMENTO_KEY_SORT);
417
		if (child != null && searchResultSorter != null) {
418
			searchResultSorter.getTaskComparator().restoreState(child);
419
		}
420
	}
421
422
	@Override
423
	public void saveState(IMemento memento) {
424
		super.saveState(memento);
425
		IMemento child = memento.createChild(MEMENTO_KEY_SORT);
426
		if (searchResultSorter != null) {
427
			searchResultSorter.getTaskComparator().saveState(child);
428
		}
429
	}
430
472
}
431
}
(-)src/org/eclipse/mylyn/internal/tasks/ui/search/messages.properties (-3 / +2 lines)
Lines 9-17 Link Here
9
RepositorySearchResultView_Open_in_Editor=Open in Editor
9
RepositorySearchResultView_Open_in_Editor=Open in Editor
10
RepositorySearchResultView_Open_Search_with_Browser_Label=Open Search with Browser
10
RepositorySearchResultView_Open_Search_with_Browser_Label=Open Search with Browser
11
RepositorySearchResultView_Refine_Search_=Refine Search...
11
RepositorySearchResultView_Refine_Search_=Refine Search...
12
RepositorySearchResultView_Sort_by=S&ort by
13
RepositorySearchResultView_Task_Priority=Task Priority
14
RepositorySearchResultView_Task_Summary=Task Summary
15
12
16
SearchHitCollector_Max_allowed_number_of_hits_returned_exceeded=Max allowed number of hits returned exceeded. Some hits may not be displayed. Please narrow query scope.
13
SearchHitCollector_Max_allowed_number_of_hits_returned_exceeded=Max allowed number of hits returned exceeded. Some hits may not be displayed. Please narrow query scope.
17
SearchHitCollector_Querying_Repository_=Querying Repository...
14
SearchHitCollector_Querying_Repository_=Querying Repository...
Lines 25-27 Link Here
25
SearchResultTreeContentProvider_Complete=Complete
22
SearchResultTreeContentProvider_Complete=Complete
26
SearchResultTreeContentProvider_Incomplete=Incomplete
23
SearchResultTreeContentProvider_Incomplete=Incomplete
27
SearchResultTreeContentProvider__unknown_=<unknown>
24
SearchResultTreeContentProvider__unknown_=<unknown>
25
26
SearchResultSortAction_Sort_Label=Sort...
(-)src/org/eclipse/mylyn/internal/tasks/ui/messages.properties (-4 lines)
Lines 35-44 Link Here
35
35
36
TaskLabelDecorator____unknown_host___=\ \ \ [ <unknown host> ]
36
TaskLabelDecorator____unknown_host___=\ \ \ [ <unknown host> ]
37
37
38
TaskListBackupManager_Could_not_backup_task_data=Could not backup task data. Check backup preferences.\n
39
TaskListBackupManager_Error_occured_during_scheduled_tasklist_backup=Error occured during scheduled tasklist backup.\nCheck settings on Tasklist preferences page.
38
TaskListBackupManager_Error_occured_during_scheduled_tasklist_backup=Error occured during scheduled tasklist backup.\nCheck settings on Tasklist preferences page.
40
TaskListBackupManager_Scheduled_task_data_backup=Scheduled task data backup
39
TaskListBackupManager_Scheduled_task_data_backup=Scheduled task data backup
41
TaskListBackupManager_Tasklist_Backup=Tasklist Backup
42
40
43
TaskListNotificationManager_Open_Notification_Job=Open Notification Job
41
TaskListNotificationManager_Open_Notification_Job=Open Notification Job
44
42
Lines 79-86 Link Here
79
TasksUiUtil_Browser_could_not_be_initiated=Browser could not be initiated
77
TasksUiUtil_Browser_could_not_be_initiated=Browser could not be initiated
80
TasksUiUtil_Browser_init_error=Browser init error
78
TasksUiUtil_Browser_init_error=Browser init error
81
TasksUiUtil_Could_not_open_URL_=Could not open URL: 
79
TasksUiUtil_Could_not_open_URL_=Could not open URL: 
82
TasksUiUtil_create_task=Create Task
83
TasksUiUtil_failed_to_create_new_task=Failed to create new task:\n\n
84
TasksUiUtil_No_URL_to_open=No URL to open.
80
TasksUiUtil_No_URL_to_open=No URL to open.
85
81
86
AbstractRetrieveTitleFromUrlJob_Retrieving_summary_from_URL=Retrieving summary from URL
82
AbstractRetrieveTitleFromUrlJob_Retrieving_summary_from_URL=Retrieving summary from URL
(-)src/org/eclipse/mylyn/internal/tasks/ui/Messages.java (-8 lines)
Lines 71-84 Link Here
71
71
72
	public static String TaskLabelDecorator____unknown_host___;
72
	public static String TaskLabelDecorator____unknown_host___;
73
73
74
	public static String TaskListBackupManager_Could_not_backup_task_data;
75
76
	public static String TaskListBackupManager_Error_occured_during_scheduled_tasklist_backup;
74
	public static String TaskListBackupManager_Error_occured_during_scheduled_tasklist_backup;
77
75
78
	public static String TaskListBackupManager_Scheduled_task_data_backup;
76
	public static String TaskListBackupManager_Scheduled_task_data_backup;
79
77
80
	public static String TaskListBackupManager_Tasklist_Backup;
81
82
	public static String TaskListNotificationManager_Open_Notification_Job;
78
	public static String TaskListNotificationManager_Open_Notification_Job;
83
79
84
	public static String TaskRepositoryLocationUi_Enter_HTTP_password;
80
	public static String TaskRepositoryLocationUi_Enter_HTTP_password;
Lines 139-148 Link Here
139
135
140
	public static String TasksUiUtil_Could_not_open_URL_;
136
	public static String TasksUiUtil_Could_not_open_URL_;
141
137
142
	public static String TasksUiUtil_create_task;
143
144
	public static String TasksUiUtil_failed_to_create_new_task;
145
146
	public static String TasksUiUtil_No_URL_to_open;
138
	public static String TasksUiUtil_No_URL_to_open;
147
139
148
	public static String AbstractRetrieveTitleFromUrlJob_Retrieving_summary_from_URL;
140
	public static String AbstractRetrieveTitleFromUrlJob_Retrieving_summary_from_URL;
(-)src/org/eclipse/mylyn/internal/tasks/ui/util/TaskComparator.java (-61 / +113 lines)
Lines 13-24 Link Here
13
package org.eclipse.mylyn.internal.tasks.ui.util;
13
package org.eclipse.mylyn.internal.tasks.ui.util;
14
14
15
import java.util.Comparator;
15
import java.util.Comparator;
16
import java.util.Date;
16
17
17
import org.eclipse.core.runtime.Assert;
18
import org.eclipse.core.runtime.Assert;
18
import org.eclipse.mylyn.internal.tasks.ui.dialogs.Messages;
19
import org.eclipse.mylyn.internal.tasks.ui.dialogs.Messages;
19
import org.eclipse.mylyn.internal.tasks.ui.views.TaskKeyComparator;
20
import org.eclipse.mylyn.internal.tasks.ui.views.TaskKeyComparator;
20
import org.eclipse.mylyn.tasks.core.IRepositoryElement;
21
import org.eclipse.mylyn.tasks.core.IRepositoryElement;
21
import org.eclipse.mylyn.tasks.core.ITask;
22
import org.eclipse.mylyn.tasks.core.ITask;
23
import org.eclipse.ui.IMemento;
22
24
23
/**
25
/**
24
 * @author Mik Kersten
26
 * @author Mik Kersten
Lines 26-35 Link Here
26
 */
28
 */
27
public class TaskComparator implements Comparator<ITask> {
29
public class TaskComparator implements Comparator<ITask> {
28
30
29
	private final TaskKeyComparator taskKeyComparator = new TaskKeyComparator();
30
31
	public enum SortByIndex {
31
	public enum SortByIndex {
32
		PRIORITY, SUMMARY, DATE_CREATED, TASK_ID;
32
		DATE_CREATED, PRIORITY, SUMMARY, TASK_ID;
33
34
		public static SortByIndex valueOfLabel(String label) {
35
			for (SortByIndex value : values()) {
36
				if (value.getLabel().equals(label)) {
37
					return value;
38
				}
39
			}
40
			return null;
41
		}
33
42
34
		public String getLabel() {
43
		public String getLabel() {
35
			switch (this) {
44
			switch (this) {
Lines 46-64 Link Here
46
			}
55
			}
47
		}
56
		}
48
57
49
		public static SortByIndex valueOfLabel(String label) {
50
			for (SortByIndex value : values()) {
51
				if (value.getLabel().equals(label)) {
52
					return value;
53
				}
54
			}
55
			return null;
56
		}
57
58
	}
58
	}
59
59
60
	public static final int DEFAULT_SORT_DIRECTION = 1;
60
	public static final int DEFAULT_SORT_DIRECTION = 1;
61
61
62
	private static final SortByIndex DEFAULT_SORT_INDEX = SortByIndex.PRIORITY;
63
64
	private static final SortByIndex DEFAULT_SORT_INDEX2 = SortByIndex.DATE_CREATED;
65
66
	private static final String MEMENTO_KEY_SORT_DIRECTION = "sortDirection"; //$NON-NLS-1$
67
68
	private static final String MEMENTO_KEY_SORT_DIRECTION2 = "sortDirection2"; //$NON-NLS-1$
69
70
	private static final String MEMENTO_KEY_SORT_INDEX = "sortIndex"; //$NON-NLS-1$
71
72
	private static final String MEMENTO_KEY_SORT_INDEX2 = "sortIndex2"; //$NON-NLS-1$
73
62
	/**
74
	/**
63
	 * Return a array of values to pass to taskKeyComparator.compare() for sorting
75
	 * Return a array of values to pass to taskKeyComparator.compare() for sorting
64
	 * 
76
	 * 
Lines 78-102 Link Here
78
		return a;
90
		return a;
79
	}
91
	}
80
92
81
	private int sortDirection = DEFAULT_SORT_DIRECTION;
93
	private SortByIndex sortByIndex = DEFAULT_SORT_INDEX;
82
94
83
	private SortByIndex sortByIndex = SortByIndex.PRIORITY;
95
	private SortByIndex sortByIndex2 = DEFAULT_SORT_INDEX2;
96
97
	private int sortDirection = DEFAULT_SORT_DIRECTION;
84
98
85
	private int sortDirection2 = DEFAULT_SORT_DIRECTION;
99
	private int sortDirection2 = DEFAULT_SORT_DIRECTION;
86
100
87
	private SortByIndex sortByIndex2 = SortByIndex.DATE_CREATED;
101
	private final TaskKeyComparator taskKeyComparator = new TaskKeyComparator();
88
102
89
	public TaskComparator() {
103
	public TaskComparator() {
90
	}
104
	}
91
105
92
	public int compare(ITask element1, ITask element2) {
106
	public int compare(ITask element1, ITask element2) {
93
		if (SortByIndex.PRIORITY.equals(sortByIndex)) {
107
		if (DEFAULT_SORT_INDEX.equals(sortByIndex)) {
94
			int result = sortByPriority(element1, element2, sortDirection);
108
			int result = sortByPriority(element1, element2, sortDirection);
95
			if (result != 0) {
109
			if (result != 0) {
96
				return result;
110
				return result;
97
			}
111
			}
98
112
99
			if (SortByIndex.DATE_CREATED.equals(sortByIndex2)) {
113
			if (DEFAULT_SORT_INDEX2.equals(sortByIndex2)) {
100
				return sortByDate(element1, element2, sortDirection2);
114
				return sortByDate(element1, element2, sortDirection2);
101
			} else {
115
			} else {
102
				if (SortByIndex.SUMMARY.equals(sortByIndex2)) {
116
				if (SortByIndex.SUMMARY.equals(sortByIndex2)) {
Lines 107-118 Link Here
107
					return result;
121
					return result;
108
				}
122
				}
109
			}
123
			}
110
		} else if (SortByIndex.DATE_CREATED.equals(sortByIndex)) {
124
		} else if (DEFAULT_SORT_INDEX2.equals(sortByIndex)) {
111
			int result = sortByDate(element1, element2, sortDirection);
125
			int result = sortByDate(element1, element2, sortDirection);
112
			if (result != 0) {
126
			if (result != 0) {
113
				return result;
127
				return result;
114
			}
128
			}
115
			if (SortByIndex.PRIORITY.equals(sortByIndex2)) {
129
			if (DEFAULT_SORT_INDEX.equals(sortByIndex2)) {
116
				return sortByPriority(element1, element2, sortDirection2);
130
				return sortByPriority(element1, element2, sortDirection2);
117
			} else {
131
			} else {
118
				if (SortByIndex.SUMMARY.equals(sortByIndex2)) {
132
				if (SortByIndex.SUMMARY.equals(sortByIndex2)) {
Lines 128-137 Link Here
128
			if (result != 0) {
142
			if (result != 0) {
129
				return result;
143
				return result;
130
			}
144
			}
131
			if (SortByIndex.DATE_CREATED.equals(sortByIndex2)) {
145
			if (DEFAULT_SORT_INDEX2.equals(sortByIndex2)) {
132
				return sortByDate(element1, element2, sortDirection2);
146
				return sortByDate(element1, element2, sortDirection2);
133
			} else {
147
			} else {
134
				if (SortByIndex.PRIORITY.equals(sortByIndex2)) {
148
				if (DEFAULT_SORT_INDEX.equals(sortByIndex2)) {
135
					return sortByPriority(element1, element2, sortDirection2);
149
					return sortByPriority(element1, element2, sortDirection2);
136
				} else if (SortByIndex.TASK_ID.equals(sortByIndex2)) {
150
				} else if (SortByIndex.TASK_ID.equals(sortByIndex2)) {
137
					return sortByID(element1, element2, sortDirection2);
151
					return sortByID(element1, element2, sortDirection2);
Lines 144-153 Link Here
144
			if (result != 0) {
158
			if (result != 0) {
145
				return result;
159
				return result;
146
			}
160
			}
147
			if (SortByIndex.DATE_CREATED.equals(sortByIndex2)) {
161
			if (DEFAULT_SORT_INDEX2.equals(sortByIndex2)) {
148
				return sortByDate(element1, element2, sortDirection2);
162
				return sortByDate(element1, element2, sortDirection2);
149
			} else {
163
			} else {
150
				if (SortByIndex.PRIORITY.equals(sortByIndex2)) {
164
				if (DEFAULT_SORT_INDEX.equals(sortByIndex2)) {
151
					return sortByPriority(element1, element2, sortDirection2);
165
					return sortByPriority(element1, element2, sortDirection2);
152
				} else if (SortByIndex.SUMMARY.equals(sortByIndex2)) {
166
				} else if (SortByIndex.SUMMARY.equals(sortByIndex2)) {
153
					return sortBySummary(element1, element2, sortDirection2);
167
					return sortBySummary(element1, element2, sortDirection2);
Lines 158-200 Link Here
158
		}
172
		}
159
	}
173
	}
160
174
161
	private int sortBySummary(ITask element1, ITask element2, int sortDirection) {
175
	public SortByIndex getSortByIndex() {
162
		String key1 = element1.getSummary();
176
		return sortByIndex;
163
		String key2 = element2.getSummary();
164
		if (key1 == null) {
165
			return (key2 != null) ? sortDirection : 0;
166
		} else if (key2 == null) {
167
			return -sortDirection;
168
		}
169
		return sortDirection * key1.compareToIgnoreCase(key2);
170
	}
177
	}
171
178
172
	private int sortByID(ITask element1, ITask element2, int sortDirection) {
179
	public SortByIndex getSortByIndex2() {
173
		String key1 = element1.getTaskKey();
180
		return sortByIndex2;
174
		String key2 = element2.getTaskKey();
181
	}
175
		if (key1 == null) {
182
176
			return (key2 != null) ? sortDirection : 0;
183
	public int getSortDirection() {
177
		} else if (key2 == null) {
184
		return sortDirection;
178
			return -sortDirection;
185
	}
186
187
	private int getSortDirection(IMemento memento, String key, int defaultValue) {
188
		Integer value = memento.getInteger(key);
189
		if (value != null) {
190
			return value >= 0 ? 1 : -1;
179
		}
191
		}
180
		return sortDirection * taskKeyComparator.compare2(key1, key2);
192
		return defaultValue;
181
	}
193
	}
182
194
183
	private int sortByPriority(ITask element1, ITask element2, int sortDirection) {
195
	public int getSortDirection2() {
184
		return sortDirection * (element1.getPriority().compareToIgnoreCase(element2.getPriority()));
196
		return sortDirection2;
185
	}
197
	}
186
198
187
	private int sortByDate(ITask element1, ITask element2, int sortDirection) {
199
	private SortByIndex getSortIndex(IMemento memento, String key, SortByIndex defaultValue) {
188
		if (element1.getCreationDate() == null) {
200
		String value = memento.getString(key);
189
			return (element2.getCreationDate() != null) ? sortDirection : 0;
201
		if (value != null) {
190
		} else if (element2.getCreationDate() == null) {
202
			try {
191
			return -sortDirection;
203
				return SortByIndex.valueOf(value);
204
			} catch (IllegalArgumentException e) {
205
				// ignore
206
			}
192
		}
207
		}
193
		return sortDirection * (element1.getCreationDate().compareTo(element2.getCreationDate()));
208
		return defaultValue;
194
	}
209
	}
195
210
196
	public SortByIndex getSortByIndex() {
211
	public void restoreState(IMemento memento) {
197
		return sortByIndex;
212
		setSortByIndex(getSortIndex(memento, MEMENTO_KEY_SORT_INDEX, DEFAULT_SORT_INDEX));
213
		setSortDirection(getSortDirection(memento, MEMENTO_KEY_SORT_DIRECTION, DEFAULT_SORT_DIRECTION));
214
		setSortByIndex2(getSortIndex(memento, MEMENTO_KEY_SORT_INDEX2, DEFAULT_SORT_INDEX2));
215
		setSortDirection(getSortDirection(memento, MEMENTO_KEY_SORT_DIRECTION2, DEFAULT_SORT_DIRECTION));
216
	}
217
218
	public void saveState(IMemento memento) {
219
		memento.putString(MEMENTO_KEY_SORT_INDEX, getSortByIndex().name());
220
		memento.putInteger(MEMENTO_KEY_SORT_DIRECTION, getSortDirection());
221
		memento.putString(MEMENTO_KEY_SORT_INDEX2, getSortByIndex2().name());
222
		memento.putInteger(MEMENTO_KEY_SORT_DIRECTION2, getSortDirection2());
198
	}
223
	}
199
224
200
	public void setSortByIndex(SortByIndex sortByIndex) {
225
	public void setSortByIndex(SortByIndex sortByIndex) {
Lines 202-230 Link Here
202
		this.sortByIndex = sortByIndex;
227
		this.sortByIndex = sortByIndex;
203
	}
228
	}
204
229
205
	public int getSortDirection() {
230
	public void setSortByIndex2(SortByIndex sortByIndex) {
206
		return sortDirection;
231
		Assert.isNotNull(sortByIndex);
232
		this.sortByIndex2 = sortByIndex;
207
	}
233
	}
208
234
209
	public void setSortDirection(int sortDirection) {
235
	public void setSortDirection(int sortDirection) {
236
		Assert.isTrue(sortDirection == -1 || sortDirection == 1);
210
		this.sortDirection = sortDirection;
237
		this.sortDirection = sortDirection;
211
	}
238
	}
212
239
213
	public SortByIndex getSortByIndex2() {
240
	public void setSortDirection2(int sortDirection) {
214
		return sortByIndex2;
241
		Assert.isTrue(sortDirection == -1 || sortDirection == 1);
242
		this.sortDirection2 = sortDirection;
215
	}
243
	}
216
244
217
	public void setSortByIndex2(SortByIndex sortByIndex) {
245
	private int sortByDate(ITask element1, ITask element2, int sortDirection) {
218
		Assert.isNotNull(sortByIndex);
246
		Date date1 = element1.getCreationDate();
219
		this.sortByIndex2 = sortByIndex;
247
		Date date2 = element2.getCreationDate();
248
		if (date1 == null) {
249
			return (date2 != null) ? sortDirection : 0;
250
		} else if (date2 == null) {
251
			return -sortDirection;
252
		}
253
		return sortDirection * date1.compareTo(date2);
220
	}
254
	}
221
255
222
	public int getSortDirection2() {
256
	private int sortByID(ITask element1, ITask element2, int sortDirection) {
223
		return sortDirection2;
257
		String key1 = element1.getTaskKey();
258
		String key2 = element2.getTaskKey();
259
		if (key1 == null) {
260
			return (key2 != null) ? sortDirection : 0;
261
		} else if (key2 == null) {
262
			return -sortDirection;
263
		}
264
		return sortDirection * taskKeyComparator.compare2(key1, key2);
224
	}
265
	}
225
266
226
	public void setSortDirection2(int sortDirection) {
267
	private int sortByPriority(ITask element1, ITask element2, int sortDirection) {
227
		this.sortDirection2 = sortDirection;
268
		return sortDirection * element1.getPriority().compareToIgnoreCase(element2.getPriority());
269
	}
270
271
	private int sortBySummary(ITask element1, ITask element2, int sortDirection) {
272
		String key1 = element1.getSummary();
273
		String key2 = element2.getSummary();
274
		if (key1 == null) {
275
			return (key2 != null) ? sortDirection : 0;
276
		} else if (key2 == null) {
277
			return -sortDirection;
278
		}
279
		return sortDirection * key1.compareToIgnoreCase(key2);
228
	}
280
	}
229
281
230
}
282
}
(-).refactorings/2009/3/13/refactorings.history (+4 lines)
Added Link Here
1
<?xml version="1.0" encoding="UTF-8"?>
2
<session version="1.0">
3
<refactoring accessors="true" comment="Delete 2 element(s) from project &apos;org.eclipse.mylyn.tasks.ui&apos;&#x0A;- Original project: &apos;org.eclipse.mylyn.tasks.ui&apos;&#x0A;- Original elements:&#x0A;     org.eclipse.mylyn.internal.tasks.ui.search.SearchResultSorterId.java&#x0A;     org.eclipse.mylyn.internal.tasks.ui.search.SearchResultSorterPriority.java" description="Delete elements" element1="/src&lt;org.eclipse.mylyn.internal.tasks.ui.search{SearchResultSorterId.java" element2="/src&lt;org.eclipse.mylyn.internal.tasks.ui.search{SearchResultSorterPriority.java" elements="2" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1238277505401" subPackages="false" version="1.0"/>
4
</session>
(-).refactorings/2009/3/13/refactorings.index (+1 lines)
Added Link Here
1
1238277505401	Delete elements

Return to bug 216150