package org.archstudio.archipelago2.ext.structures.outline; 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.structure_3_0.Structure_3_0Package; import org.archstudio.xarchadt.IXArchADTModelListener; import org.archstudio.xarchadt.ObjRef; import org.archstudio.xarchadt.XArchADTModelEvent; public class StructuresContentProvider extends AbstractArchipelago2ContentProvider implements IXArchADTModelListener { @Override public Object[] getElements(Object inputElement) { ObjRef xAdlRef = (ObjRef) xarch.get(docRef, "xADL"); if (Archipelago2Utils.pathEndsWith(inputElement, xAdlRef, "Structures")) { return XadlUtils .getAllSubstitutionGroupElementsByTag(xarch, xAdlRef, "topLevelElement", "structure") .toArray(); } ObjRef lastRef = Archipelago2Utils.getLastObjRef(inputElement); if (XadlUtils.isInstanceOf(xarch, lastRef, Structure_3_0Package.Literals.STRUCTURE)) { List<Object> children = new ArrayList<>(); children.addAll(xarch.getAll(lastRef, "Component")); children.addAll(xarch.getAll(lastRef, "Connector")); children.addAll(xarch.getAll(lastRef, "Link")); return children.toArray(); } if (XadlUtils.isInstanceOf(xarch, lastRef, Structure_3_0Package.Literals.BRICK)) { List<Object> children = new ArrayList<>(); children.addAll(xarch.getAll(lastRef, "Interface")); return children.toArray(); } return EMPTY_ARRAY; } @Override public void handleXArchADTModelEvent(final XArchADTModelEvent evt) { switch (evt.getEventType()) { case ADD: // Fall through. case REMOVE: // If a structure was added/removed, refresh the structure list. if (evt.getSource().equals(xarch.get(docRef, "xADL")) && evt.getFeatureName().equals("structure")) { display.asyncExec(new Runnable() { @Override public void run() { fireLabelProviderEvent("Structures"); } }); } // If an element in a structure was added/removed, refresh that structure. if (XadlUtils.isInstanceOf(xarch, evt.getSource(), Structure_3_0Package.Literals.STRUCTURE)) { display.asyncExec(new Runnable() { @Override public void run() { fireLabelProviderEvent(evt.getSource()); } }); } // If an interface on a brick was added/removed, refresh that brick. if (XadlUtils.isInstanceOf(xarch, evt.getSource(), Structure_3_0Package.Literals.BRICK)) { display.asyncExec(new Runnable() { @Override public void run() { fireLabelProviderEvent(evt.getSource()); } }); } default: // Ignore. } } }