|
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 |
} |