package org.archstudio.archipelago2.ext.structures.utils; import java.util.List; import org.archstudio.archipelago2.Archipelago2Utils; import org.archstudio.archipelago2.IArchipelago2Outline; import org.archstudio.archipelago2.ext.structures.logics.CreateMappingLogic; import org.archstudio.bna.IBNAView; import org.archstudio.bna.IBNAWorld; import org.archstudio.bna.IThing; import org.archstudio.bna.IThingLogicManager; import org.archstudio.bna.ui.IBNAMenuListener2; import org.archstudio.bna.utils.Assemblies; import org.archstudio.bna.utils.BNAAction; import org.archstudio.sysutils.UIDGenerator; import org.archstudio.utils.resources.swt.ImageUtils; import org.archstudio.xadl.XadlUtils; import org.archstudio.xadl.bna.facets.IHasObjRef; import org.archstudio.xadl.bna.utils.XArchADTOperations; import org.archstudio.xadl3.structure_3_0.Component; import org.archstudio.xadl3.structure_3_0.Connector; import org.archstudio.xadl3.structure_3_0.Direction; import org.archstudio.xadl3.structure_3_0.Interface; import org.archstudio.xadl3.structure_3_0.InterfaceMapping; import org.archstudio.xadl3.structure_3_0.Link; import org.archstudio.xadl3.structure_3_0.Structure_3_0Package; import org.archstudio.xarchadt.IXArchADT; import org.archstudio.xarchadt.ObjRef; import org.eclipse.jdt.annotation.Nullable; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.widgets.Display; import com.google.common.base.Preconditions; public class MenuContributor { public static final void addNewStructureAction(IMenuManager menuManager, final IXArchADT xarch, final ObjRef xAdlRef, @Nullable final IArchipelago2Outline outline, @Nullable final List<Object> parentElement) { Preconditions.checkNotNull(menuManager); Preconditions.checkNotNull(xarch); Preconditions.checkNotNull(xAdlRef); menuManager.appendToGroup(IBNAMenuListener2.NEW_ELEMENTS_GROUP, new Action("New Structure") { @Override public void run() { final ObjRef newRef = XadlUtils.create(xarch, Structure_3_0Package.Literals.STRUCTURE); xarch.set(newRef, "id", UIDGenerator.generateUID()); XadlUtils.setName(xarch, newRef, "[New Structure]"); XArchADTOperations.add("New structure", xarch, xAdlRef, "topLevelElement", newRef); if (outline != null && parentElement != null) { List<Object> element = Archipelago2Utils.append(parentElement, newRef); outline.selectElement(element); outline.editElement(element, 0); } } @Override public ImageDescriptor getImageDescriptor() { return ImageUtils.toImageDescriptor(ImageUtils.getIcon16ForType(Display.getDefault(), Structure_3_0Package.Literals.STRUCTURE.getInstanceClass())); } }); } public static final void addNewComponentAction(IMenuManager menuManager, final IXArchADT xarch, final ObjRef structureRef, @Nullable final IArchipelago2Outline outline, @Nullable final List<Object> parentElement) { Preconditions.checkNotNull(menuManager); Preconditions.checkNotNull(xarch); Preconditions.checkNotNull(structureRef); menuManager.appendToGroup(IBNAMenuListener2.NEW_ELEMENTS_GROUP, new Action("New Component") { @Override public void run() { ObjRef newRef = XadlUtils.create(xarch, Structure_3_0Package.Literals.COMPONENT); xarch.set(newRef, "id", UIDGenerator.generateUID()); XadlUtils.setName(xarch, newRef, "[New Component]"); XArchADTOperations.add("Add Component", xarch, structureRef, "component", newRef); if (outline != null && parentElement != null) { List<Object> element = Archipelago2Utils.append(parentElement, newRef); outline.selectElement(element); outline.editElement(element, 0); } } @Override public ImageDescriptor getImageDescriptor() { return ImageUtils .toImageDescriptor(ImageUtils.getIcon16ForType(Display.getDefault(), Component.class)); } }); } public static final void addNewConnectorAction(IMenuManager menuManager, final IXArchADT xarch, final ObjRef structureRef, @Nullable final IArchipelago2Outline outline, @Nullable final List<Object> parentElement) { Preconditions.checkNotNull(menuManager); Preconditions.checkNotNull(xarch); Preconditions.checkNotNull(structureRef); menuManager.appendToGroup(IBNAMenuListener2.NEW_ELEMENTS_GROUP, new Action("New Connector") { @Override public void run() { ObjRef newRef = XadlUtils.create(xarch, Structure_3_0Package.Literals.CONNECTOR); xarch.set(newRef, "id", UIDGenerator.generateUID()); XadlUtils.setName(xarch, newRef, "[New Connector]"); XArchADTOperations.add("Add Connector", xarch, structureRef, "connector", newRef); if (outline != null && parentElement != null) { List<Object> element = Archipelago2Utils.append(parentElement, newRef); outline.selectElement(element); outline.editElement(element, 0); } } @Override public ImageDescriptor getImageDescriptor() { return ImageUtils .toImageDescriptor(ImageUtils.getIcon16ForType(Display.getDefault(), Connector.class)); } }); } public static final void addNewInterfaceAction(IMenuManager menuManager, final IXArchADT xarch, final ObjRef brickRef, @Nullable final IArchipelago2Outline outline, @Nullable final List<Object> parentElement) { Preconditions.checkNotNull(menuManager); Preconditions.checkNotNull(xarch); Preconditions.checkNotNull(brickRef); menuManager.appendToGroup(IBNAMenuListener2.NEW_ELEMENTS_GROUP, new Action("New Interface") { @Override public void run() { ObjRef newRef = XadlUtils.create(xarch, Structure_3_0Package.Literals.INTERFACE); xarch.set(newRef, "id", UIDGenerator.generateUID()); XadlUtils.setName(xarch, newRef, "[New Interface]"); xarch.set(newRef, "direction", Direction.NONE); XArchADTOperations.add("Add Interface", xarch, brickRef, "interface", newRef); if (outline != null && parentElement != null) { List<Object> element = Archipelago2Utils.append(parentElement, newRef); outline.selectElement(element); outline.editElement(element, 0); } } @Override public ImageDescriptor getImageDescriptor() { return ImageUtils .toImageDescriptor(ImageUtils.getIcon16ForType(Display.getDefault(), Interface.class)); } }); } public static final void addNewLinkAction(IMenuManager menuManager, final IXArchADT xarch, final ObjRef structureRef, @Nullable final IArchipelago2Outline outline, @Nullable final List<Object> parentElement) { Preconditions.checkNotNull(menuManager); Preconditions.checkNotNull(xarch); Preconditions.checkNotNull(structureRef); menuManager.appendToGroup(IBNAMenuListener2.NEW_ELEMENTS_GROUP, new Action("New Link") { @Override public void run() { ObjRef newRef = XadlUtils.create(xarch, Structure_3_0Package.Literals.LINK); xarch.set(newRef, "id", UIDGenerator.generateUID()); XadlUtils.setName(xarch, newRef, "[New Link]"); XArchADTOperations.add("Add Link", xarch, structureRef, "link", newRef); if (outline != null && parentElement != null) { List<Object> element = Archipelago2Utils.append(parentElement, newRef); outline.selectElement(element); outline.editElement(element, 0); } } @Override public ImageDescriptor getImageDescriptor() { return ImageUtils .toImageDescriptor(ImageUtils.getIcon16ForType(Display.getDefault(), Link.class)); } }); } public static final void addNewMapping(IMenuManager menuManager, final IXArchADT xarch, final IBNAView view, IThing possibleInterfaceThing, final Point initialLocalPoint) { Preconditions.checkNotNull(menuManager); Preconditions.checkNotNull(xarch); Preconditions.checkNotNull(view); Preconditions.checkNotNull(possibleInterfaceThing); possibleInterfaceThing = Assemblies.getRoot(view.getBNAWorld().getBNAModel(), possibleInterfaceThing); // This is only applicable to interfaces. if (possibleInterfaceThing == null) { return; } final ObjRef ifaceRef = possibleInterfaceThing.get(IHasObjRef.OBJREF_KEY); if (ifaceRef == null) { return; } if (!XadlUtils.isInstanceOf(xarch, ifaceRef, Structure_3_0Package.Literals.INTERFACE)) { return; } // This is only applicable to bricks with a substructure. final ObjRef brickRef = xarch.getParent(ifaceRef); final ObjRef subStructureRef = (ObjRef) xarch.get(brickRef, Structure_3_0Package.Literals.BRICK__SUB_STRUCTURE.getName()); if (subStructureRef == null) { return; } menuManager.appendToGroup(IBNAMenuListener2.NEW_ELEMENTS_GROUP, new BNAAction("New Interface-Interface Mapping...") { @Override public void runWithLock() { IBNAWorld world = view.getBNAWorld(); IThingLogicManager logics = world.getThingLogicManager(); CreateMappingLogic createLogic = logics.addThingLogic(CreateMappingLogic.class); createLogic.beginEditing(view, xarch, ifaceRef, subStructureRef); } @Override public ImageDescriptor getImageDescriptor() { return ImageUtils.toImageDescriptor( ImageUtils.getIcon16ForType(Display.getDefault(), InterfaceMapping.class)); } }); } public static final void addClearSubStructureAction(IMenuManager menuManager, final IXArchADT xarch, final ObjRef brickRef) { Preconditions.checkNotNull(menuManager); Preconditions.checkNotNull(xarch); Preconditions.checkNotNull(brickRef); menuManager.appendToGroup(IBNAMenuListener2.NEW_ELEMENTS_GROUP, new Action("Remove SubStructure") { @Override public void run() { xarch.clear(brickRef, Structure_3_0Package.Literals.BRICK__SUB_STRUCTURE.getName()); } }); } }