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

Return to bug 175655