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 304356
Collapse All | Expand All

(-)src/org/eclipse/emf/compare/ui/viewer/content/part/ModelContentMergeTabItem.java (-15 / +18 lines)
Lines 16-23 Link Here
16
16
17
// TODO Diff should be made optional. What if a tab doesn't display diff-related information?
17
// TODO Diff should be made optional. What if a tab doesn't display diff-related information?
18
/**
18
/**
19
 * This class will be used to wrap {@link Item} subclasses such as {@link TreeItem} and {@link TableItem} to
19
 * This class will be used to wrap {@link Item} subclasses such as {@link org.eclipse.swt.widgets.TreeItem}
20
 * allow us to call methods such as <tt>getBounds</tt> without explicitely casting each time we do so.
20
 * and {@link org.eclipse.swt.widgets.TableItem} to allow us to call methods such as <tt>getBounds</tt>
21
 * without explicitely casting each time we do so.
21
 * <p>
22
 * <p>
22
 * This wrapper will allow us to maintain a logical structure of the tree : which TreeItem corresponds to
23
 * This wrapper will allow us to maintain a logical structure of the tree : which TreeItem corresponds to
23
 * which difference or visible parent ...
24
 * which difference or visible parent ...
Lines 41-52 Link Here
41
	/** Holds a reference to the difference represented by the wrapped item. */
42
	/** Holds a reference to the difference represented by the wrapped item. */
42
	private final DiffElement difference;
43
	private final DiffElement difference;
43
44
44
	/** Height of the item's control's header. */
45
	private int headerHeight;
46
47
	/** The visible item on which will be drawn UI marquees. */
45
	/** The visible item on which will be drawn UI marquees. */
48
	private Item visibleItem;
46
	private Item visibleItem;
49
47
48
	/** Offset to correct scroll effects and table header when painting curve. */
49
	private int verticalOffset;
50
50
	/**
51
	/**
51
	 * Constructs a wrapper around the given item. This constructor specifies the color to use when drawing UI
52
	 * Constructs a wrapper around the given item. This constructor specifies the color to use when drawing UI
52
	 * components with this item.
53
	 * components with this item.
Lines 125-131 Link Here
125
	 * Returns the color which should be used when drawing the center curve and other UI colored components
126
	 * Returns the color which should be used when drawing the center curve and other UI colored components
126
	 * using this item.
127
	 * using this item.
127
	 * <p>
128
	 * <p>
128
	 * If no colors are specified for this item, {@link ModelContentMergeViewer#getChangedColor()} will be
129
	 * If no colors are specified for this item,
130
	 * {@link org.eclipse.emf.compare.ui.viewer.content.ModelContentMergeViewer#getChangedColor()} will be
129
	 * used as default.
131
	 * used as default.
130
	 * </p>
132
	 * </p>
131
	 * 
133
	 * 
Lines 169-180 Link Here
169
	}
171
	}
170
172
171
	/**
173
	/**
172
	 * Returns the height of the item's control header.
174
	 * Returns the offset needed to compensate scroll effects and table headers when painting curve.
173
	 * 
175
	 * 
174
	 * @return The height of the item's control header.
176
	 * @return the vertical scrollbar offset
175
	 */
177
	 */
176
	public int getHeaderHeight() {
178
	public int getVerticalOffset() {
177
		return headerHeight;
179
		return verticalOffset;
178
	}
180
	}
179
181
180
	/**
182
	/**
Lines 207-219 Link Here
207
	}
209
	}
208
210
209
	/**
211
	/**
210
	 * Returns the value of the item's control header height.
212
	 * Specifies offset to compensate scroll effects or table headers when painting curve.
211
	 * 
213
	 * 
212
	 * @param newHeaderHeight
214
	 * @param offset
213
	 *            The value of the item's control header height.
215
	 *            the vertical offset
214
	 */
216
	 */
215
	public void setHeaderHeight(int newHeaderHeight) {
217
	public void setVerticalOffset(int offset) {
216
		headerHeight = newHeaderHeight;
218
		verticalOffset = offset;
217
	}
219
	}
218
220
219
	/**
221
	/**
Lines 246-249 Link Here
246
		result += ')';
248
		result += ')';
247
		return result;
249
		return result;
248
	}
250
	}
251
249
}
252
}
(-)src/org/eclipse/emf/compare/ui/viewer/content/part/AbstractCenterPart.java (-2 / +2 lines)
Lines 126-133 Link Here
126
			leftY = leftItem.getCurveY() + treeTabBorder;
126
			leftY = leftItem.getCurveY() + treeTabBorder;
127
			rightY = rightItem.getCurveY() + treeTabBorder;
127
			rightY = rightItem.getCurveY() + treeTabBorder;
128
		} else {
128
		} else {
129
			leftY = leftItem.getCurveY() + leftItem.getHeaderHeight() + treeTabBorder;
129
			leftY = leftItem.getCurveY() + treeTabBorder + leftItem.getVerticalOffset();
130
			rightY = rightItem.getCurveY() + rightItem.getHeaderHeight() + treeTabBorder;
130
			rightY = rightItem.getCurveY() + treeTabBorder + rightItem.getVerticalOffset();
131
		}
131
		}
132
		final int lineWidth = leftItem.getCurveSize();
132
		final int lineWidth = leftItem.getCurveSize();
133
133
(-)src/org/eclipse/emf/compare/ui/viewer/content/part/diff/ModelContentMergeDiffTab.java (-25 / +109 lines)
Lines 58-63 Link Here
58
import org.eclipse.swt.graphics.Rectangle;
58
import org.eclipse.swt.graphics.Rectangle;
59
import org.eclipse.swt.widgets.Composite;
59
import org.eclipse.swt.widgets.Composite;
60
import org.eclipse.swt.widgets.Item;
60
import org.eclipse.swt.widgets.Item;
61
import org.eclipse.swt.widgets.Scrollable;
61
import org.eclipse.swt.widgets.Tree;
62
import org.eclipse.swt.widgets.Tree;
62
import org.eclipse.swt.widgets.TreeItem;
63
import org.eclipse.swt.widgets.TreeItem;
63
import org.eclipse.swt.widgets.Widget;
64
import org.eclipse.swt.widgets.Widget;
Lines 117-124 Link Here
117
		parent = parentFolder;
118
		parent = parentFolder;
118
119
119
		setUseHashlookup(true);
120
		setUseHashlookup(true);
120
		setContentProvider(new ModelContentMergeDiffTabContentProvider(AdapterUtils.getAdapterFactory()));
121
		setContentProvider(createContentProvider());
121
		setLabelProvider(new AdapterFactoryLabelProvider(AdapterUtils.getAdapterFactory()));
122
		setLabelProvider(createLabelProvider());
122
		getTree().addPaintListener(new TreePaintListener());
123
		getTree().addPaintListener(new TreePaintListener());
123
124
124
		// The following listeners will be used to invalidate the cache of
125
		// The following listeners will be used to invalidate the cache of
Lines 142-147 Link Here
142
	}
143
	}
143
144
144
	/**
145
	/**
146
	 * Utility function to create a new label provider.
147
	 * 
148
	 * @return the new label provider instance.
149
	 */
150
	private AdapterFactoryLabelProvider createLabelProvider() {
151
		return new AdapterFactoryLabelProvider(AdapterUtils.getAdapterFactory());
152
	}
153
154
	/**
155
	 * Utility function to create a new content provider.
156
	 * 
157
	 * @return the new content provider instance.
158
	 */
159
	private ModelContentMergeDiffTabContentProvider createContentProvider() {
160
		return new ModelContentMergeDiffTabContentProvider(AdapterUtils.getAdapterFactory());
161
	}
162
163
	/**
145
	 * {@inheritDoc}
164
	 * {@inheritDoc}
146
	 * 
165
	 * 
147
	 * @see org.eclipse.emf.compare.ui.viewer.content.part.IModelContentMergeViewerTab#dispose()
166
	 * @see org.eclipse.emf.compare.ui.viewer.content.part.IModelContentMergeViewerTab#dispose()
Lines 250-256 Link Here
250
	 * @see org.eclipse.emf.compare.ui.viewer.content.part.IModelContentMergeViewerTab#redraw()
269
	 * @see org.eclipse.emf.compare.ui.viewer.content.part.IModelContentMergeViewerTab#redraw()
251
	 */
270
	 */
252
	public void redraw() {
271
	public void redraw() {
272
		clearCaches();
253
		getTree().redraw();
273
		getTree().redraw();
274
		setupCaches();
254
	}
275
	}
255
276
256
	/**
277
	/**
Lines 260-269 Link Here
260
	 */
281
	 */
261
	@Override
282
	@Override
262
	public void refresh(Object element, boolean updateLabels) {
283
	public void refresh(Object element, boolean updateLabels) {
284
		clearCaches();
263
		super.refresh(element, updateLabels);
285
		super.refresh(element, updateLabels);
264
		mapTreeItems();
286
		setupCaches();
265
		mapDifferences();
266
		mapTreeItemsToUI();
267
	}
287
	}
268
288
269
	/**
289
	/**
Lines 271-287 Link Here
271
	 * 
291
	 * 
272
	 * @see org.eclipse.emf.compare.ui.viewer.content.part.IModelContentMergeViewerTab#setReflectiveInput(java.lang.Object)
292
	 * @see org.eclipse.emf.compare.ui.viewer.content.part.IModelContentMergeViewerTab#setReflectiveInput(java.lang.Object)
273
	 */
293
	 */
294
	@SuppressWarnings("unchecked")
274
	public void setReflectiveInput(Object object) {
295
	public void setReflectiveInput(Object object) {
275
		// We *need* to invalidate the cache here since setInput() would try to
296
		// We *need* to invalidate the cache here since setInput() would try to
276
		// use it otherwise
297
		// use it otherwise
277
		clearCaches();
298
		clearCaches();
278
299
279
		final AdapterFactory adapterFactory = AdapterUtils.getAdapterFactory();
300
		// setLabelProvider(createLabelProvider()); // already set in constructor
280
		setLabelProvider(new AdapterFactoryLabelProvider(adapterFactory));
281
		if (object instanceof EObject) {
301
		if (object instanceof EObject) {
282
			setInput(((EObject)object).eResource());
302
			setInput(((EObject)object).eResource());
283
		} else {
303
		} else {
284
			assert object instanceof Resource;
304
			// may be invoked with a resourceSet, a list of resources, or a single resource
305
			assert object instanceof Resource || object instanceof List;
306
			if (object instanceof List) {
307
				for (Object item : (List)object) {
308
					assert item instanceof Resource;
309
				}
310
			}
285
			setInput(object);
311
			setInput(object);
286
		}
312
		}
287
313
Lines 307-312 Link Here
307
				datas.add(EMFCompareEObjectUtils.getRightElement(items.get(i)));
333
				datas.add(EMFCompareEObjectUtils.getRightElement(items.get(i)));
308
			}
334
			}
309
		}
335
		}
336
337
		// filter null values
338
		final Iterator<EObject> iterator = datas.iterator();
339
		while (iterator.hasNext()) {
340
			if (iterator.next() == null) {
341
				iterator.remove();
342
			}
343
		}
344
345
		// expand those being selected first
346
		for (EObject data : datas) {
347
			reveal(data);
348
		}
310
		setSelection(new StructuredSelection(datas), true);
349
		setSelection(new StructuredSelection(datas), true);
311
		needsRedraw = true;
350
		needsRedraw = true;
312
		redraw();
351
		redraw();
Lines 333-341 Link Here
333
			return res;
372
			return res;
334
		else if (res != null) {
373
		else if (res != null) {
335
			// mapped items are disposed
374
			// mapped items are disposed
336
			mapTreeItems();
375
			clearCaches();
337
			mapDifferences();
376
			setupCaches();
338
			mapTreeItemsToUI();
339
			// won't call this recursively since it could eventually lead to
377
			// won't call this recursively since it could eventually lead to
340
			// stack overflows
378
			// stack overflows
341
			dataToTreeItem.get(element);
379
			dataToTreeItem.get(element);
Lines 367-382 Link Here
367
	 */
405
	 */
368
	@Override
406
	@Override
369
	protected void inputChanged(Object input, Object oldInput) {
407
	protected void inputChanged(Object input, Object oldInput) {
370
		if (input != oldInput) {
408
		// preserve expansion state
371
			final TreePath[] expandedTreePaths = getExpandedTreePaths();
409
		final TreePath[] expandedTreePaths = getExpandedTreePaths();
372
410
		super.inputChanged(input, oldInput);
373
			super.inputChanged(input, oldInput);
411
		setExpandedTreePaths(expandedTreePaths);
374
375
			// Expands all items so that we'll be able to find them back (defeats
376
			// purpose of lazy loading)
377
			expandAll();
378
			setExpandedTreePaths(expandedTreePaths);
379
		}
380
	}
412
	}
381
413
382
	/**
414
	/**
Lines 467-472 Link Here
467
		} else {
499
		} else {
468
			item.setCurveSize(1);
500
			item.setCurveSize(1);
469
		}
501
		}
502
503
		final Scrollable scrollable = (Scrollable)getControl();
504
		int offset = scrollable.getBounds().y + scrollable.getClientArea().height
505
				- (scrollable.getClientArea().y + scrollable.getBounds().height);
506
507
		// if horizontal scrollbar is visible, compensate this as well
508
		if (scrollable.getClientArea().width < ((TreeItem)item.getActualItem()).getBounds().width) {
509
			offset += scrollable.getHorizontalBar().getSize().y;
510
		}
511
		item.setVerticalOffset(offset);
470
	}
512
	}
471
513
472
	/**
514
	/**
Lines 665-674 Link Here
665
				// look for the matchedElement
707
				// look for the matchedElement
666
				data = getTree().getItems()[0].getData();
708
				data = getTree().getItems()[0].getData();
667
			}
709
			}
668
			final Item actualItem = (Item)findItem(data);
710
			final Widget actualWidget = findItem(data);
669
			if (actualItem == null) {
711
			if (actualWidget == null) {
712
				continue;
713
			}
714
			if (!(actualWidget instanceof Item)) {
670
				continue;
715
				continue;
671
			}
716
			}
717
			final Item actualItem = (Item)actualWidget;
672
718
673
			Item visibleItem = null;
719
			Item visibleItem = null;
674
			if (partSide == EMFCompareConstants.LEFT && diff instanceof ModelElementChangeRightTarget
720
			if (partSide == EMFCompareConstants.LEFT && diff instanceof ModelElementChangeRightTarget
Lines 839-846 Link Here
839
		 * 
885
		 * 
840
		 * @see org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider#getElements(java.lang.Object)
886
		 * @see org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider#getElements(java.lang.Object)
841
		 */
887
		 */
888
		@SuppressWarnings("unchecked")
842
		@Override
889
		@Override
843
		public Object[] getElements(Object object) {
890
		public Object[] getElements(Object object) {
891
			// overwritten to ensure contents of ResourceSets, List<Resource>, and Resource are correclty
892
			// returned.
893
			Object[] result = null;
844
			if (object instanceof ResourceSet) {
894
			if (object instanceof ResourceSet) {
845
				final List<Resource> resources = ((ResourceSet)object).getResources();
895
				final List<Resource> resources = ((ResourceSet)object).getResources();
846
				final List<Resource> elements = new ArrayList<Resource>(resources.size());
896
				final List<Resource> elements = new ArrayList<Resource>(resources.size());
Lines 850-858 Link Here
850
						elements.add(resource);
900
						elements.add(resource);
851
					}
901
					}
852
				}
902
				}
853
				return elements.toArray();
903
				result = elements.toArray();
904
			} else if (object instanceof List) {
905
				// we may also display a list of resources
906
				result = ((List)object).toArray();
907
			} else if (object instanceof Resource) {
908
				// return contents of resource
909
				result = ((Resource)object).getContents().toArray();
910
			} else {
911
				result = super.getElements(object);
912
			}
913
			return result;
914
		}
915
916
		/**
917
		 * {@inheritDoc}
918
		 * 
919
		 * @see org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider#getChildren(java.lang.Object)
920
		 */
921
		@Override
922
		public Object[] getChildren(Object object) {
923
			if (object instanceof Resource) {
924
				return ((Resource)object).getContents().toArray();
925
			}
926
			return super.getChildren(object);
927
		}
928
929
		/**
930
		 *{@inheritDoc}
931
		 * 
932
		 * @see org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider#hasChildren(java.lang.Object)
933
		 */
934
		@Override
935
		public boolean hasChildren(Object object) {
936
			if (object instanceof Resource) {
937
				return ((Resource)object).getContents().size() > 0;
854
			}
938
			}
855
			return super.getElements(object);
939
			return super.hasChildren(object);
856
		}
940
		}
857
	}
941
	}
858
}
942
}
(-)src/org/eclipse/emf/compare/ui/viewer/content/part/property/ModelContentMergePropertyTab.java (-12 / +32 lines)
Lines 46-51 Link Here
46
import org.eclipse.swt.widgets.Composite;
46
import org.eclipse.swt.widgets.Composite;
47
import org.eclipse.swt.widgets.Control;
47
import org.eclipse.swt.widgets.Control;
48
import org.eclipse.swt.widgets.Item;
48
import org.eclipse.swt.widgets.Item;
49
import org.eclipse.swt.widgets.Scrollable;
49
import org.eclipse.swt.widgets.TableColumn;
50
import org.eclipse.swt.widgets.TableColumn;
50
import org.eclipse.swt.widgets.TableItem;
51
import org.eclipse.swt.widgets.TableItem;
51
import org.eclipse.swt.widgets.Widget;
52
import org.eclipse.swt.widgets.Widget;
Lines 207-218 Link Here
207
			key += '/' + fragments[fragments.length - 1];
208
			key += '/' + fragments[fragments.length - 1];
208
		final ModelContentMergeTabItem item = dataToItem.get(key);
209
		final ModelContentMergeTabItem item = dataToItem.get(key);
209
		if (item != null) {
210
		if (item != null) {
210
			if (getSelectedElements().contains(item.getActualItem()))
211
			computeUIInfoFor(item);
211
				item.setCurveSize(2);
212
			else
213
				item.setCurveSize(1);
214
			item.setCurveY(((TableItem)item.getActualItem()).getBounds().y
215
					+ ((TableItem)item.getActualItem()).getBounds().height / 2);
216
		}
212
		}
217
		return item;
213
		return item;
218
	}
214
	}
Lines 245-256 Link Here
245
				if (nextTableItem.getBounds().y >= getTable().getClientArea().y
241
				if (nextTableItem.getBounds().y >= getTable().getClientArea().y
246
						&& nextTableItem.getBounds().y <= getTable().getClientArea().y
242
						&& nextTableItem.getBounds().y <= getTable().getClientArea().y
247
								+ getTable().getClientArea().height) {
243
								+ getTable().getClientArea().height) {
248
					if (getSelectedElements().contains(nextTableItem))
244
					computeUIInfoFor(next);
249
						next.setCurveSize(2);
250
					else
251
						next.setCurveSize(1);
252
					next.setCurveY(nextTableItem.getBounds().y + nextTableItem.getBounds().height / 2);
253
					next.setHeaderHeight(getTable().getHeaderHeight());
254
					result.add(next);
245
					result.add(next);
255
				}
246
				}
256
			}
247
			}
Lines 259-264 Link Here
259
	}
250
	}
260
251
261
	/**
252
	/**
253
	 * This will compute the necessary GUI information for the given {@link ModelContentMergeTabItem}.
254
	 * 
255
	 * @param item
256
	 *            The item which UI information is to be set.
257
	 */
258
	private void computeUIInfoFor(ModelContentMergeTabItem item) {
259
		final TableItem actualItem = (TableItem)item.getActualItem();
260
		// compute vertical offset
261
		final Scrollable scrollable = (Scrollable)getControl();
262
		int offset = scrollable.getBounds().y + scrollable.getClientArea().height
263
				- (scrollable.getClientArea().y + scrollable.getBounds().height);
264
265
		// if horizontal scrollbar is visible, compensate this as well
266
		if (scrollable.getClientArea().width < actualItem.getBounds().width) {
267
			offset += scrollable.getHorizontalBar().getSize().y;
268
		}
269
		item.setVerticalOffset(offset);
270
271
		// compute curve
272
		item.setCurveY(actualItem.getBounds().y + actualItem.getBounds().height / 2);
273
274
		if (getSelectedElements().contains(item.getActualItem())) {
275
			item.setCurveSize(2);
276
		} else {
277
			item.setCurveSize(1);
278
		}
279
	}
280
281
	/**
262
	 * {@inheritDoc}
282
	 * {@inheritDoc}
263
	 * 
283
	 * 
264
	 * @see org.eclipse.emf.compare.ui.viewer.content.part.IModelContentMergeViewerTab#redraw()
284
	 * @see org.eclipse.emf.compare.ui.viewer.content.part.IModelContentMergeViewerTab#redraw()

Return to bug 304356