package org.archstudio.archipelago2.ext.statecharts.outline; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import org.archstudio.archipelago2.AbstractArchipelago2ContentProvider; import org.archstudio.archipelago2.Archipelago2Utils; import org.archstudio.xadl.XadlUtils; import org.archstudio.xadl3.statechart_1_0.Statechart_1_0Package; import org.archstudio.xarchadt.IXArchADTModelListener; import org.archstudio.xarchadt.ObjRef; import org.archstudio.xarchadt.XArchADTModelEvent; public class StatechartsContentProvider extends AbstractArchipelago2ContentProvider implements IXArchADTModelListener { /** * Returns <code>true</code> if the element is a statechart ref, <code>false</code> otherwise. * * @param object The element to evaluate. * @return <code>true</code> if the element is a statechart ref, <code>false</code> otherwise. */ private boolean isStatechart(Object object) { if (object instanceof Serializable) { return xarch.isInstanceOf((Serializable) object, Statechart_1_0Package.eNS_URI, Statechart_1_0Package.Literals.STATECHART.getName()); } else { return false; } } @Override public Object[] getElements(Object inputElement) { ObjRef xAdlRef = (ObjRef) xarch.get(docRef, "xADL"); if (Archipelago2Utils.pathEndsWith(inputElement, xAdlRef, "Statecharts")) { return XadlUtils .getAllSubstitutionGroupElementsByTag(xarch, xAdlRef, "topLevelElement", "statechart") .toArray(); } ObjRef lastRef = Archipelago2Utils.getLastObjRef(inputElement); if (isStatechart(lastRef)) { List<Object> children = new ArrayList<>(); children.addAll(xarch.getAll(lastRef, "State")); children.addAll(xarch.getAll(lastRef, "Transition")); return children.toArray(); } return EMPTY_ARRAY; } @Override public void handleXArchADTModelEvent(final XArchADTModelEvent evt) { switch (evt.getEventType()) { case ADD: // Fall through. case REMOVE: // If a statechart was added/removed, refresh the statechart list. if (evt.getSource().equals(xarch.get(docRef, "xADL")) && (isStatechart(evt.getOldValue()) || isStatechart(evt.getNewValue()))) { display.asyncExec(new Runnable() { @Override public void run() { fireLabelProviderEvent("Statecharts"); } }); } // If an element of a statechart was added/removed, refresh that statechart. if (isStatechart(evt.getSource())) { display.asyncExec(new Runnable() { @Override public void run() { fireLabelProviderEvent(evt.getSource()); } }); } default: // Ignore. } } }