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

Collapse All | Expand All

(-)src/org/eclipse/mylyn/internal/context/ui/BrowseFilteredListener.java (-1 / +8 lines)
Lines 42-47 Link Here
42
42
43
	private final StructuredViewer viewer;
43
	private final StructuredViewer viewer;
44
44
45
	private boolean wasExternalClick = false;
46
45
	public BrowseFilteredListener(StructuredViewer viewer) {
47
	public BrowseFilteredListener(StructuredViewer viewer) {
46
		this.viewer = viewer;
48
		this.viewer = viewer;
47
	}
49
	}
Lines 78-83 Link Here
78
		}
80
		}
79
	}
81
	}
80
82
83
	public void setWasExternalClick(boolean wasExternalClick) {
84
		this.wasExternalClick = wasExternalClick;
85
	}
86
81
	public void keyPressed(KeyEvent event) {
87
	public void keyPressed(KeyEvent event) {
82
		// ignore
88
		// ignore
83
	}
89
	}
Lines 130-137 Link Here
130
			unfilter(filter, treeViewer, selectedObject);
136
			unfilter(filter, treeViewer, selectedObject);
131
		} else {
137
		} else {
132
			if (event.button == 1) {
138
			if (event.button == 1) {
133
				if ((event.stateMask & SWT.MOD1) != 0) {
139
				if ((event.stateMask & SWT.MOD1) != 0 || wasExternalClick) {
134
					viewer.refresh(selectedObject);
140
					viewer.refresh(selectedObject);
141
					wasExternalClick = false;
135
				} else {
142
				} else {
136
					final Object unfiltered = filter.getLastTemporarilyUnfiltered();
143
					final Object unfiltered = filter.getLastTemporarilyUnfiltered();
137
					if (unfiltered != null) {
144
					if (unfiltered != null) {
(-)src/org/eclipse/mylyn/internal/context/ui/FocusedViewerManager.java (-3 / +28 lines)
Lines 180-185 Link Here
180
			managedViewers.add(viewer);
180
			managedViewers.add(viewer);
181
			partToViewerMap.put(viewPart, viewer);
181
			partToViewerMap.put(viewPart, viewer);
182
			BrowseFilteredListener listener = new BrowseFilteredListener(viewer);
182
			BrowseFilteredListener listener = new BrowseFilteredListener(viewer);
183
			addFilterDecorations(viewer, listener);
183
			listenerMap.put(viewer, listener);
184
			listenerMap.put(viewer, listener);
184
			viewer.getControl().addMouseListener(listener);
185
			viewer.getControl().addMouseListener(listener);
185
			viewer.getControl().addKeyListener(listener);
186
			viewer.getControl().addKeyListener(listener);
Lines 199-207 Link Here
199
		}
200
		}
200
	}
201
	}
201
202
203
	private final Map<TreeViewer, FilteredChildrenDecorationDrawer> decorationMap = new HashMap<TreeViewer, FilteredChildrenDecorationDrawer>();
204
205
	private void removeFilterDecorations(StructuredViewer viewer) {
206
		if (viewer instanceof TreeViewer) {
207
			TreeViewer treeViewer = (TreeViewer) viewer;
208
209
			FilteredChildrenDecorationDrawer filterViewDrawer = decorationMap.remove(treeViewer);
210
			if (filterViewDrawer != null) {
211
				filterViewDrawer.dispose();
212
			}
213
		}
214
	}
215
216
	private void addFilterDecorations(StructuredViewer viewer, BrowseFilteredListener listener) {
217
		if (viewer instanceof TreeViewer) {
218
			TreeViewer treeViewer = (TreeViewer) viewer;
219
			FilteredChildrenDecorationDrawer filteredViewDrawer = new FilteredChildrenDecorationDrawer(treeViewer,
220
					listener);
221
			decorationMap.put(treeViewer, filteredViewDrawer);
222
			filteredViewDrawer.applyToTreeViewer();
223
224
		}
225
	}
226
202
	public void removeManagedViewer(StructuredViewer viewer, IWorkbenchPart viewPart) {
227
	public void removeManagedViewer(StructuredViewer viewer, IWorkbenchPart viewPart) {
203
		managedViewers.remove(viewer);
228
		managedViewers.remove(viewer);
204
		partToViewerMap.remove(viewPart);
229
		partToViewerMap.remove(viewPart);
230
		removeFilterDecorations(viewer);
205
		BrowseFilteredListener listener = listenerMap.get(viewer);
231
		BrowseFilteredListener listener = listenerMap.get(viewer);
206
		if (listener != null && viewer != null && !viewer.getControl().isDisposed()) {
232
		if (listener != null && viewer != null && !viewer.getControl().isDisposed()) {
207
			viewer.getControl().removeMouseListener(listener);
233
			viewer.getControl().removeMouseListener(listener);
Lines 368-376 Link Here
368
		if (viewer instanceof TreeViewer
394
		if (viewer instanceof TreeViewer
369
				&& filteredViewers.contains(viewer)
395
				&& filteredViewers.contains(viewer)
370
				&& hasInterestFilter(viewer, true)
396
				&& hasInterestFilter(viewer, true)
371
				&& ContextUiPlugin.getDefault()
397
				&& ContextUiPlugin.getDefault().getPreferenceStore().getBoolean(
372
						.getPreferenceStore()
398
						IContextUiPreferenceContstants.AUTO_MANAGE_EXPANSION)) {
373
						.getBoolean(IContextUiPreferenceContstants.AUTO_MANAGE_EXPANSION)) {
374
			TreeViewer treeViewer = (TreeViewer) viewer;
399
			TreeViewer treeViewer = (TreeViewer) viewer;
375
400
376
			// HACK to fix bug 278569: [context] errors with Markers view and active Mylyn task
401
			// HACK to fix bug 278569: [context] errors with Markers view and active Mylyn task
(-)src/org/eclipse/mylyn/internal/context/ui/FilteredChildrenDecorationDrawer.java (+186 lines)
Added Link Here
1
package org.eclipse.mylyn.internal.context.ui;
2
3
import org.eclipse.jface.viewers.StructuredSelection;
4
import org.eclipse.jface.viewers.TreeViewer;
5
import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
6
import org.eclipse.swt.SWT;
7
import org.eclipse.swt.events.MouseEvent;
8
import org.eclipse.swt.events.MouseListener;
9
import org.eclipse.swt.events.MouseMoveListener;
10
import org.eclipse.swt.graphics.Image;
11
import org.eclipse.swt.graphics.Point;
12
import org.eclipse.swt.widgets.Event;
13
import org.eclipse.swt.widgets.Listener;
14
import org.eclipse.swt.widgets.Tree;
15
import org.eclipse.swt.widgets.TreeItem;
16
17
/**
18
 * @author Mik Kersten
19
 */
20
21
public class FilteredChildrenDecorationDrawer implements Listener {
22
23
	private final class MoveListener implements MouseMoveListener, MouseListener {
24
25
		private TreeItem lastItem;
26
27
		private final TreeViewer viewer;
28
29
		private final BrowseFilteredListener browseFilteredListener2;
30
31
		public MoveListener(TreeViewer viewer, BrowseFilteredListener browseFilteredListener) {
32
			this.viewer = viewer;
33
			browseFilteredListener2 = browseFilteredListener;
34
		}
35
36
		public void mouseMove(MouseEvent e) {
37
			Tree tree = (Tree) e.widget;
38
			TreeItem item = findItem(tree, e.y);
39
			if (item != null) {
40
				if (lastItem != null && !lastItem.isDisposed() && !lastItem.equals(item)) {
41
					lastItem.setData(ID_HOVER, NodeState.LESS);
42
				}
43
44
				item.setData(ID_HOVER, NodeState.MORE);
45
				if (lastItem == null || (!lastItem.isDisposed() && !lastItem.equals(item))) {
46
					viewer.getTree().redraw();
47
				}
48
				lastItem = item;
49
			} else {
50
				if (lastItem != null && !lastItem.isDisposed() && !lastItem.equals(item)) {
51
					lastItem.setData(ID_HOVER, NodeState.LESS);
52
					viewer.getTree().redraw();
53
				}
54
				lastItem = item;
55
			}
56
		}
57
58
		public void mouseDoubleClick(MouseEvent e) {
59
			// ignore
60
61
		}
62
63
		public void mouseDown(MouseEvent e) {
64
			if (!(e.widget instanceof Tree)) {
65
				// we only handle tree's
66
				return;
67
			}
68
69
			Tree tree = (Tree) e.widget;
70
			TreeItem item = findItem(tree, e.y);
71
72
			if (item == null) {
73
				// we can't do anything if we cant find the tree items
74
				return;
75
			}
76
77
			boolean shouldUnfilter = false;
78
			int selectedX = e.x;
79
			int endOfWidget = item.getBounds().x + +item.getBounds().width;
80
			if (endOfWidget < selectedX
81
					&& item.getBounds().x + item.getBounds().width + IMAGE_PADDING + moreImage.getBounds().width > selectedX) {
82
				// in the bounds of the image
83
				shouldUnfilter = true;
84
			} else if (endOfWidget > tree.getSize().x
85
					&& selectedX > tree.getSize().x - SCROLL_BAR_OFFSET - moreImage.getBounds().width) {
86
				// edge of the view
87
				shouldUnfilter = true;
88
			}
89
90
			// XXX NEED TO MAKE SURE THAT WE DONT AFFECT ALT+CLICK
91
			if (shouldUnfilter) {
92
				browseFilteredListener.setWasExternalClick(true);
93
				browseFilteredListener.unfilterSelection(viewer, new StructuredSelection(item.getData()));
94
			}
95
		}
96
97
		public void mouseUp(MouseEvent e) {
98
			// ignore
99
100
		}
101
	}
102
103
	private static final int SCROLL_BAR_OFFSET = 15;
104
105
	private static final int IMAGE_PADDING = 5;
106
107
	// XXX NEED TO CHANGE THE IMAGE!
108
	private final Image moreImage = CommonImages.getImage(CommonImages.PART_MAXIMIZE);
109
110
	enum NodeState {
111
		MORE, LESS
112
	};
113
114
	private static final String ID_HOVER = "mylyn-hover";
115
116
	private final TreeViewer treeViewer;
117
118
	private MoveListener listener;
119
120
	private final BrowseFilteredListener browseFilteredListener;
121
122
	public FilteredChildrenDecorationDrawer(TreeViewer treeViewer, BrowseFilteredListener browseFilteredListener) {
123
		this.treeViewer = treeViewer;
124
		this.browseFilteredListener = browseFilteredListener;
125
	}
126
127
	public void applyToTreeViewer() {
128
		treeViewer.getTree().addListener(SWT.PaintItem, this);
129
130
		listener = new MoveListener(treeViewer, browseFilteredListener);
131
		treeViewer.getTree().addMouseMoveListener(listener);
132
		treeViewer.getTree().addMouseListener(listener);
133
	}
134
135
	public void dispose() {
136
		if (treeViewer.getTree() == null || treeViewer.getTree().isDisposed()) {
137
			return;
138
		}
139
		treeViewer.getTree().removeListener(SWT.PaintItem, this);
140
141
		treeViewer.getTree().removeMouseMoveListener(listener);
142
		treeViewer.getTree().removeMouseListener(listener);
143
	}
144
145
	/*
146
	 * NOTE: MeasureItem, PaintItem and EraseItem are called repeatedly.
147
	 * Therefore, it is critical for performance that these methods be as
148
	 * efficient as possible.
149
	 */
150
	public void handleEvent(Event event) {
151
152
		if (!(event.widget instanceof Tree)) {
153
			// we only handle tree's
154
			return;
155
		}
156
157
		switch (event.type) {
158
		case SWT.PaintItem: {
159
			Tree tree = (Tree) event.widget;
160
			TreeItem item = findItem(tree, event.y);
161
			if (item == null) {
162
				return;
163
			}
164
165
			int imageStartX = event.x + event.width + IMAGE_PADDING;
166
167
			NodeState value = (NodeState) item.getData(ID_HOVER);
168
			if (value != null && value.equals(NodeState.MORE)) {
169
				event.gc.drawImage(moreImage, imageStartX, event.y);
170
			}
171
			break;
172
		}
173
		}
174
	}
175
176
	private TreeItem findItem(Tree tree, int y) {
177
		TreeItem item = null;
178
		Point size = tree.getSize();
179
		final int RATE = 17;
180
		for (int i = 0; i <= RATE && item == null; i++) {
181
			int position = size.x / RATE + (i * size.x / RATE);
182
			item = tree.getItem(new Point(position, y));
183
		}
184
		return item;
185
	}
186
}

Return to bug 175655