package org.archstudio.xarchadt.variability.ui; import java.util.Arrays; import java.util.Comparator; import java.util.Map; import org.archstudio.swtutils.SWTWidgetUtils; import org.archstudio.xadl3.variability_3_0.ChangeSet; import org.archstudio.xadl3.variability_3_0.Variability; import org.archstudio.xadl3.xadlcore_3_0.DocumentRoot; import org.archstudio.xadl3.xadlcore_3_0.XADLType; import org.archstudio.xarchadt.IXArchADTModelListener; import org.archstudio.xarchadt.ObjRef; import org.archstudio.xarchadt.XArchADTModelEvent; import org.archstudio.xarchadt.XArchADTProxy; import org.archstudio.xarchadt.variability.IXArchADTVariability; import org.eclipse.emf.ecore.EObject; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerComparator; import com.google.common.collect.Maps; public class ChangeSetSorter extends ViewerComparator implements IXArchADTModelListener { protected final IXArchADTVariability xarch; protected Viewer viewer = null; public ChangeSetSorter(IXArchADTVariability xarch) { this.xarch = xarch; } @Override public void handleXArchADTModelEvent(XArchADTModelEvent evt) { // if (evt.getXArchRef().equals(xArchRef)) { // if ((evt.getTargetName().equals("changeSetOrder") || evt.getTargetName().equals("appliedChangeSets")) // && evt.getSourcePath().toTagsOnlyString().equals("xArch/variability")) { // refreshView(); // } // } } boolean needsRefresh = false; void refreshView() { needsRefresh = true; final Viewer fViewer = viewer; SWTWidgetUtils.async(fViewer, new Runnable() { @Override public void run() { if (needsRefresh) { needsRefresh = false; fViewer.refresh(); } } }); } @Override public boolean isSorterProperty(Object element, String property) { return false; } @Override public int category(Object element) { throw new UnsupportedOperationException(); } @Override public int compare(Viewer viewer, Object e1, Object e2) { throw new UnsupportedOperationException(); } @Override synchronized public void sort(Viewer viewer, Object[] elements) { this.viewer = viewer; DocumentRoot documentRoot = XArchADTProxy.proxy(xarch, (ObjRef) viewer.getInput()); if (documentRoot != null) { XADLType xadlType = documentRoot.getXADL(); Variability variability = null; if (xadlType != null) { for (EObject tle : xadlType.getTopLevelElement()) { if (tle instanceof Variability) { variability = (Variability) tle; } } } if (variability != null) { final Map<ObjRef, Integer> orderMap = Maps.newHashMap(); for (ChangeSet changeSet : variability.getChangeSet()) { orderMap.put(XArchADTProxy.unproxy(changeSet), orderMap.size()); } final Integer FIRST = Integer.MIN_VALUE; Arrays.sort(elements, new Comparator<Object>() { @Override public int compare(Object o1, Object o2) { Integer i1 = orderMap.get(o1); Integer i2 = orderMap.get(o2); return -(i1 == null ? FIRST : i1).compareTo(i2 == null ? FIRST : i2); } }); } } } }