package org.erlide.ui.internal.compare;
import org.eclipse.compare.CompareConfiguration;
import org.eclipse.compare.ITypedElement;
import org.eclipse.compare.IViewerCreator;
import org.eclipse.compare.structuremergeviewer.DiffNode;
import org.eclipse.compare.structuremergeviewer.StructureDiffViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.swt.widgets.Composite;
public class ErlStructureDiffViewerCreator implements IViewerCreator {
@Override
public Viewer createViewer(final Composite parent,
final CompareConfiguration config) {
final StructureDiffViewer viewer = new StructureDiffViewer(parent, config);
viewer.setStructureCreator(new ErlStructureCreator());
viewer.setComparator(new ErlViewerComparator());
return viewer;
}
private static class ErlViewerComparator extends ViewerComparator {
public ErlViewerComparator() {
}
@Override
public int compare(final Viewer viewer, final Object e1, final Object e2) {
final ErlNode en1 = getErlNode(e1);
final ErlNode en2 = getErlNode(e2);
if (en1 != null && en2 != null) {
return en1.getRange().getOffset() - en2.getRange().getOffset();
}
return super.compare(viewer, e1, e2);
}
private ErlNode getErlNode(final Object e) {
if (e instanceof DiffNode) {
final DiffNode d = (DiffNode) e;
final ITypedElement left = d.getLeft();
if (left instanceof ErlNode) {
return (ErlNode) left;
}
final ITypedElement right = d.getRight();
if (right instanceof ErlNode) {
return (ErlNode) right;
}
}
return null;
}
}
}