View | Details | Raw Unified | Return to bug 175655 | Differences between
and this patch

Collapse All | Expand All

(-)src/org/eclipse/mylyn/internal/context/ui/BrowseFilteredListener.java (+3 lines)
Lines 104-109 Link Here
104
	}
104
	}
105
105
106
	public void mouseUp(MouseEvent event) {
106
	public void mouseUp(MouseEvent event) {
107
		if (true) {
108
			return;
109
		}
107
		final InterestFilter filter = getInterestFilter(viewer);
110
		final InterestFilter filter = getInterestFilter(viewer);
108
		if (filter == null || !(viewer instanceof TreeViewer)) {
111
		if (filter == null || !(viewer instanceof TreeViewer)) {
109
			return;
112
			return;
(-)src/org/eclipse/mylyn/internal/context/ui/FocusedViewerManager.java (-3 / +105 lines)
Lines 10-26 Link Here
10
10
11
import java.util.ArrayList;
11
import java.util.ArrayList;
12
import java.util.Collections;
12
import java.util.Collections;
13
import java.util.HashMap;
14
import java.util.HashSet;
13
import java.util.HashSet;
15
import java.util.List;
14
import java.util.List;
16
import java.util.Map;
15
import java.util.Map;
17
import java.util.Set;
16
import java.util.Set;
17
import java.util.concurrent.ConcurrentHashMap;
18
import java.util.concurrent.CopyOnWriteArrayList;
18
import java.util.concurrent.CopyOnWriteArrayList;
19
19
20
import org.eclipse.core.runtime.IStatus;
20
import org.eclipse.core.runtime.IStatus;
21
import org.eclipse.core.runtime.Status;
21
import org.eclipse.core.runtime.Status;
22
import org.eclipse.jface.viewers.AbstractTreeViewer;
22
import org.eclipse.jface.viewers.AbstractTreeViewer;
23
import org.eclipse.jface.viewers.ISelection;
23
import org.eclipse.jface.viewers.ISelection;
24
import org.eclipse.jface.viewers.StructuredSelection;
24
import org.eclipse.jface.viewers.StructuredViewer;
25
import org.eclipse.jface.viewers.StructuredViewer;
25
import org.eclipse.jface.viewers.TreeViewer;
26
import org.eclipse.jface.viewers.TreeViewer;
26
import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
27
import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
Lines 30-36 Link Here
30
import org.eclipse.mylyn.context.core.IInteractionElement;
31
import org.eclipse.mylyn.context.core.IInteractionElement;
31
import org.eclipse.mylyn.context.ui.ContextUiPlugin;
32
import org.eclipse.mylyn.context.ui.ContextUiPlugin;
32
import org.eclipse.mylyn.monitor.core.StatusHandler;
33
import org.eclipse.mylyn.monitor.core.StatusHandler;
34
import org.eclipse.swt.SWT;
35
import org.eclipse.swt.events.MouseEvent;
36
import org.eclipse.swt.events.MouseListener;
37
import org.eclipse.swt.events.MouseMoveListener;
38
import org.eclipse.swt.graphics.Point;
39
import org.eclipse.swt.widgets.Tree;
40
import org.eclipse.swt.widgets.TreeItem;
33
import org.eclipse.ui.ISelectionListener;
41
import org.eclipse.ui.ISelectionListener;
42
import org.eclipse.ui.IViewPart;
34
import org.eclipse.ui.IWorkbenchPart;
43
import org.eclipse.ui.IWorkbenchPart;
35
import org.eclipse.ui.PlatformUI;
44
import org.eclipse.ui.PlatformUI;
36
45
Lines 42-54 Link Here
42
 */
51
 */
43
public class FocusedViewerManager implements IInteractionContextListener2, ISelectionListener {
52
public class FocusedViewerManager implements IInteractionContextListener2, ISelectionListener {
44
53
54
	enum NodeState {
55
		MORE, LESS
56
	};
57
58
	private final class MoveListener implements MouseMoveListener, MouseListener {
59
60
		private final BrowseFilteredListener browseFilteredListener;
61
62
		private TreeItem lastItem;
63
64
		private final TreeViewer viewer;
65
66
		public MoveListener(TreeViewer viewer) {
67
			this.viewer = viewer;
68
			browseFilteredListener = new BrowseFilteredListener(viewer);
69
		}
70
71
		public void mouseMove(MouseEvent e) {
72
			Tree tree = (Tree) e.widget;
73
74
			// sample points to find item
75
			Point size = tree.getSize();
76
			TreeItem item = null;
77
			final int RATE = 17;
78
			for (int i = 0; i <= RATE && item == null; i++) {
79
				int position = size.y / RATE + (i * size.y / RATE);
80
				item = tree.getItem(new Point(position, e.y));
81
			}
82
			if (item != null) {
83
				item.setData(ID_HOVER, NodeState.LESS);
84
				if (lastItem != null && !lastItem.isDisposed() && !lastItem.equals(item)) {
85
					lastItem.setData(ID_HOVER, NodeState.MORE);
86
					viewer.refresh(item.getData().getClass());
87
				}
88
				lastItem = item;
89
			}
90
		}
91
92
		public void mouseDoubleClick(MouseEvent e) {
93
			// ignore
94
95
		}
96
97
		public void mouseDown(MouseEvent e) {
98
			Tree tree = (Tree) e.widget;
99
			TreeItem item = null;
100
			Point size = tree.getSize();
101
			final int RATE = 17;
102
			for (int i = 0; i <= RATE && item == null; i++) {
103
				int position = size.y / RATE + (i * size.y / RATE);
104
				item = tree.getItem(new Point(position, e.y));
105
			}
106
			browseFilteredListener.unfilterSelection(viewer, new StructuredSelection(item.getData()));
107
//			System.err.println(">>>>>>>>> " + item.getData().getClass());
108
		}
109
110
		public void mouseUp(MouseEvent e) {
111
			// ignore
112
113
		}
114
	}
115
116
	static final String ID_HOVER = "mylyn-hover";
117
45
	private final CopyOnWriteArrayList<StructuredViewer> managedViewers = new CopyOnWriteArrayList<StructuredViewer>();
118
	private final CopyOnWriteArrayList<StructuredViewer> managedViewers = new CopyOnWriteArrayList<StructuredViewer>();
46
119
47
	private final CopyOnWriteArrayList<StructuredViewer> filteredViewers = new CopyOnWriteArrayList<StructuredViewer>();
120
	private final CopyOnWriteArrayList<StructuredViewer> filteredViewers = new CopyOnWriteArrayList<StructuredViewer>();
48
121
49
	private final Map<StructuredViewer, BrowseFilteredListener> listenerMap = new HashMap<StructuredViewer, BrowseFilteredListener>();
122
	private final Map<StructuredViewer, BrowseFilteredListener> listenerMap = new ConcurrentHashMap<StructuredViewer, BrowseFilteredListener>();
123
124
	private final Map<IWorkbenchPart, StructuredViewer> partToViewerMap = new ConcurrentHashMap<IWorkbenchPart, StructuredViewer>();
50
125
51
	private final Map<IWorkbenchPart, StructuredViewer> partToViewerMap = new HashMap<IWorkbenchPart, StructuredViewer>();
126
	private final Map<TreeViewer, MoveListener> decorationMap = new ConcurrentHashMap<TreeViewer, MoveListener>();
127
128
	private final FilteredChildrenDecorationDrawer customDrawer = new FilteredChildrenDecorationDrawer();
52
129
53
	/**
130
	/**
54
	 * For testing.
131
	 * For testing.
Lines 79-84 Link Here
79
		}
156
		}
80
	}
157
	}
81
158
159
	public void addFilterDecorations(StructuredViewer viewer, IViewPart viewPart) {
160
		if (viewer instanceof TreeViewer) {
161
			TreeViewer treeViewer = (TreeViewer) viewer;
162
			treeViewer.getTree().addListener(SWT.EraseItem, customDrawer);
163
			treeViewer.getTree().addListener(SWT.PaintItem, customDrawer);
164
165
			MoveListener listener = new MoveListener(treeViewer);
166
			decorationMap.put(treeViewer, listener);
167
			treeViewer.getTree().addMouseMoveListener(listener);
168
			treeViewer.getTree().addMouseListener(listener);
169
		}
170
	}
171
82
	public void removeManagedViewer(StructuredViewer viewer, IWorkbenchPart viewPart) {
172
	public void removeManagedViewer(StructuredViewer viewer, IWorkbenchPart viewPart) {
83
		managedViewers.remove(viewer);
173
		managedViewers.remove(viewer);
84
		partToViewerMap.remove(viewPart);
174
		partToViewerMap.remove(viewPart);
Lines 89-94 Link Here
89
		}
179
		}
90
	}
180
	}
91
181
182
	public void removeFilterDecorations(StructuredViewer viewer, IViewPart viewPart) {
183
		if (viewer instanceof TreeViewer) {
184
			TreeViewer treeViewer = (TreeViewer) viewer;
185
			treeViewer.getTree().removeListener(SWT.EraseItem, customDrawer);
186
			treeViewer.getTree().removeListener(SWT.PaintItem, customDrawer);
187
188
			MoveListener listener = decorationMap.remove(treeViewer);
189
			treeViewer.getTree().removeMouseMoveListener(listener);
190
			treeViewer.getTree().removeMouseListener(listener);
191
		}
192
	}
193
92
	public void addFilteredViewer(StructuredViewer viewer) {
194
	public void addFilteredViewer(StructuredViewer viewer) {
93
		if (viewer != null && !filteredViewers.contains(viewer)) {
195
		if (viewer != null && !filteredViewers.contains(viewer)) {
94
			filteredViewers.add(viewer);
196
			filteredViewers.add(viewer);
(-)src/org/eclipse/mylyn/context/ui/AbstractFocusViewAction.java (+4 lines)
Lines 421-426 Link Here
421
		}
421
		}
422
422
423
		try {
423
		try {
424
			ContextUiPlugin.getViewerManager().addFilterDecorations(viewer, viewPart);
425
424
			viewer.getControl().setRedraw(false);
426
			viewer.getControl().setRedraw(false);
425
			previousFilters.put(viewer, Arrays.asList(viewer.getFilters()));
427
			previousFilters.put(viewer, Arrays.asList(viewer.getFilters()));
426
428
Lines 466-471 Link Here
466
		}
468
		}
467
469
468
		try {
470
		try {
471
			ContextUiPlugin.getViewerManager().removeFilterDecorations(viewer, viewPart);
472
469
			viewer.getControl().setRedraw(false);
473
			viewer.getControl().setRedraw(false);
470
			if (viewPart != null && manageFilters) {
474
			if (viewPart != null && manageFilters) {
471
				if (previousFilters.containsKey(viewer)) {
475
				if (previousFilters.containsKey(viewer)) {
(-)src/org/eclipse/mylyn/internal/context/ui/CustomTaskListDecorationDrawer.java (+41 lines)
Added Link Here
1
package org.eclipse.mylyn.internal.context.ui;
2
3
import org.eclipse.mylyn.internal.context.ui.FocusedViewerManager.NodeState;
4
import org.eclipse.mylyn.internal.tasks.ui.TasksUiImages;
5
import org.eclipse.swt.SWT;
6
import org.eclipse.swt.graphics.Image;
7
import org.eclipse.swt.widgets.Event;
8
import org.eclipse.swt.widgets.Listener;
9
10
/**
11
 * @author Mik Kersten
12
 */
13
class FilteredChildrenDecorationDrawer implements Listener {
14
15
	private final Image moreImage = TasksUiImages.getImage(TasksUiImages.MORE);
16
17
	/*
18
	 * NOTE: MeasureItem, PaintItem and EraseItem are called repeatedly.
19
	 * Therefore, it is critical for performance that these methods be as
20
	 * efficient as possible.
21
	 */
22
	public void handleEvent(Event event) {
23
		Object data = event.item.getData();
24
		switch (event.type) {
25
		case SWT.EraseItem: {
26
			// ...
27
			break;
28
		}
29
		case SWT.PaintItem: {
30
//			System.err.println(">>>> " + event.x + ", " + event.y);
31
			NodeState value = (NodeState) event.item.getData(FocusedViewerManager.ID_HOVER);
32
			if (value != null && value.equals(NodeState.MORE)) {
33
				event.gc.drawImage(moreImage, event.x + event.width + 5, event.y);
34
			} else if (value != null && value.equals(NodeState.LESS)) {
35
				event.gc.drawImage(TasksUiImages.getImage(TasksUiImages.BLANK), event.x + event.width + 5, event.y);
36
			}
37
			break;
38
		}
39
		}
40
	}
41
}
(-).refactorings/2008/3/12/refactorings.index (+4 lines)
Added Link Here
1
1205966017741	Copy file
2
1205966034038	Delete element
3
1206045710715	Extract constant 'ID_HOVER'
4
1206045869142	Convert anonymous class to nested
(-).refactorings/2008/3/12/refactorings.history (+3 lines)
Added Link Here
1
<?xml version="1.0" encoding="UTF-8"?>
2
<session version="1.0">&#x0A;<refactoring comment="Copy 1 elements(s) to &apos;eview16&apos;&#x0D;&#x0A;- Original project: &apos;org.eclipse.mylyn.context.ui&apos;&#x0D;&#x0A;- Destination element: &apos;eview16&apos;&#x0D;&#x0A;- Original element: &apos;more.png&apos;" description="Copy file" element1="icons/eview16/more.png" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1205966017741" target="/org.eclipse.mylyn.tasks.ui/icons/eview16" units="0" version="1.0"/>&#x0A;<refactoring accessors="true" comment="Delete 1 element(s) from project &apos;org.eclipse.mylyn.context.ui&apos;&#x0D;&#x0A;- Original project: &apos;org.eclipse.mylyn.context.ui&apos;&#x0D;&#x0A;- Original element: &apos;more.png&apos;" description="Delete element" element1="icons/eview16/more.png" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1205966034038" subPackages="false" version="1.0"/>&#x0A;<refactoring comment="Extract constant &apos;org.eclipse.mylyn.internal.context.ui.FocusedViewerManager.ID_HOVER&apos; from expression &apos;&quot;mylyn-hover&quot;&apos;&#x0D;&#x0A;- Original project: &apos;org.eclipse.mylyn.context.ui&apos;&#x0D;&#x0A;- Constant name: &apos;ID_HOVER&apos;&#x0D;&#x0A;- Constant expression: &apos;&quot;mylyn-hover&quot;&apos;&#x0D;&#x0A;- Declared visibility: &apos;private&apos;&#x0D;&#x0A;- Replace occurrences of expression with constant" description="Extract constant &apos;ID_HOVER&apos;" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src&lt;org.eclipse.mylyn.internal.context.ui{FocusedViewerManager.java" name="ID_HOVER" qualify="false" replace="true" selection="3096 13" stamp="1206045710715" version="1.0" visibility="2"/>&#x0A;<refactoring comment="Convert anonymous class &apos;org.eclipse.mylyn.internal.context.ui.FocusedViewerManager.new MouseMoveListener() {...}&apos; in &apos;&apos; to nested class&#x0D;&#x0A;- Original project: &apos;org.eclipse.mylyn.context.ui&apos;&#x0D;&#x0A;- Original element: &apos;org.eclipse.mylyn.internal.context.ui.FocusedViewerManager.new MouseMoveListener() {...}&apos;&#x0D;&#x0A;- Class name: &apos;MoveListener&apos;&#x0D;&#x0A;- Declared visibility: &apos;private&apos;&#x0D;&#x0A;- Declare class &apos;final&apos;" description="Convert anonymous class to nested" final="true" flags="786434" id="org.eclipse.jdt.ui.convert.anonymous" input="/src&lt;org.eclipse.mylyn.internal.context.ui{FocusedViewerManager.java" name="MoveListener" selection="2936 0" stamp="1206045869142" static="false" version="1.0" visibility="2"/>
3
</session>
(-)src/org/eclipse/mylyn/internal/tasks/ui/TasksUiImages.java (+2 lines)
Lines 43-48 Link Here
43
43
44
	private static final URL baseURL = TasksUiPlugin.getDefault().getBundle().getEntry("/icons/");
44
	private static final URL baseURL = TasksUiPlugin.getDefault().getBundle().getEntry("/icons/");
45
45
46
	public static final ImageDescriptor MORE = create(T_EVIEW, "more.png");
47
46
	public static final ImageDescriptor TASK_ACTIVE = create(T_TOOL, "task-active.gif");
48
	public static final ImageDescriptor TASK_ACTIVE = create(T_TOOL, "task-active.gif");
47
49
48
	public static final ImageDescriptor TASK_ACTIVE_CENTERED = create(T_TOOL, "task-active-centered.gif");
50
	public static final ImageDescriptor TASK_ACTIVE_CENTERED = create(T_TOOL, "task-active-centered.gif");

Return to bug 175655