package gov.nasa.jpl.mbee.mdk.systems_reasoner;
import com.nomagic.actions.ActionsCategory;
import com.nomagic.actions.ActionsManager;
import com.nomagic.actions.NMAction;
import com.nomagic.magicdraw.actions.*;
import com.nomagic.magicdraw.ui.browser.Node;
import com.nomagic.magicdraw.ui.browser.Tree;
import com.nomagic.magicdraw.uml.symbols.DiagramPresentationElement;
import com.nomagic.magicdraw.uml.symbols.PresentationElement;
import com.nomagic.uml2.ext.magicdraw.classes.mdkernel.Classifier;
import com.nomagic.uml2.ext.magicdraw.classes.mdkernel.Element;
import com.nomagic.uml2.ext.magicdraw.classes.mdkernel.InstanceSpecification;
import com.nomagic.uml2.ext.magicdraw.commonbehaviors.mdbasicbehaviors.Behavior;
import gov.nasa.jpl.mbee.mdk.systems_reasoner.actions.*;
import java.util.ArrayList;
import java.util.List;
public class SRConfigurator implements BrowserContextAMConfigurator, DiagramContextAMConfigurator {
public static final String NAME = "Systems Reasoner";
public static final String ID = "Specialize Structure";
public static final String ID_RECURSIVE = "Specialize Structure Recursively";
public static final String ID_RECURSIVE_INDIVIDUAL = "Specialize Recursively & Individually";
private SRAction validateAction = null, specializeStructureRecursiveAction = null, specializeStructureAction = null, createBSTAction = null, ontoBehaviorAction = null, instance2BSTAction = null, createInstanceMenuAction = null, aspectAction, copyAction = null;
@Override
public int getPriority() {
return 0; // medium
}
@Override
public void configure(ActionsManager manager, Tree tree) {
final List<Element> elements = new ArrayList<Element>();
for (final Node n : tree.getSelectedNodes()) {
if (n.getUserObject() instanceof Element) {
elements.add((Element) n.getUserObject());
}
}
configure(manager, elements);
}
@Override
public void configure(ActionsManager manager, DiagramPresentationElement diagram, PresentationElement[] selected, PresentationElement requestor) {
final List<Element> elements = new ArrayList<Element>();
for (final PresentationElement pe : selected) {
if (pe.getElement() != null) {
elements.add(pe.getElement());
}
}
configure(manager, elements);
}
protected void configure(ActionsManager manager, List<Element> elements) {
// refresh the actions for every new click (or selection)
validateAction = null;
ontoBehaviorAction = null;
specializeStructureRecursiveAction = null;
specializeStructureAction = null;
createBSTAction = null;
createInstanceMenuAction = null;
instance2BSTAction = null;
aspectAction = null;
copyAction = null;
ActionsCategory category = (ActionsCategory) manager.getActionFor("SRMain");
if (category == null) {
category = new MDActionsCategory("SRMain", "Systems Reasoner", null, ActionsGroups.APPLICATION_RELATED);
category.setNested(true);
// manager.addCategory(0, category);
}
manager.removeCategory(category);
if (elements.size() > 1) {
category = handleMultipleNodes(category, manager, elements);
}
else if (elements.size() == 1) {
category = handleSingleNode(category, manager, elements.get(0));
}
else {
return;
}
if (category == null) {
return;
}
manager.addCategory(0, category);
category.addAction(validateAction);
if (elements.size() < 2) {
if (elements.get(0) instanceof Behavior) {
category.addAction(ontoBehaviorAction);
}
}
category.addAction(copyAction);
category.addAction(specializeStructureAction);
category.addAction(specializeStructureRecursiveAction);
category.addAction(createBSTAction);
category.addAction(createInstanceMenuAction);
category.addAction(instance2BSTAction);
category.addAction(aspectAction);
//category.addAction(new TestAction());
category.getActions().clear();
category.setUseActionForDisable(true);
if (category.isEmpty()) {
final MDAction mda = new MDAction(null, null, null, "null");
mda.updateState();
mda.setEnabled(false);
category.addAction(mda);
}
}
public ActionsCategory handleMultipleNodes(ActionsCategory category, ActionsManager manager, List<Element> elements) {
final List<Classifier> classifiers = new ArrayList<Classifier>();
final List<InstanceSpecification> instances = new ArrayList<InstanceSpecification>();
final List<Element> validatableElements = new ArrayList<Element>();
boolean hasUneditable = false;
for (Element element : elements) {
if (element != null) {
if (element instanceof Classifier) {
classifiers.add((Classifier) element);
validatableElements.add(element);
}
else if (element instanceof InstanceSpecification) {
instances.add((InstanceSpecification) element);
validatableElements.add(element);
}
if (!hasUneditable && !element.isEditable()) {
hasUneditable = true;
}
}
}
// if nothing in classes, disable category and return it
if (validatableElements.isEmpty()) {
// category = disableCategory(category);
return null;
}
// otherwise, add the classes to the ValidateAction action
validateAction = new ValidateAction(validatableElements);
category.addAction(validateAction);
if (!classifiers.isEmpty()) {
aspectAction = new AspectAction(classifiers);
}
if (!instances.isEmpty()) {
instance2BSTAction = new Instance2BSTAction(instances);
}
return category;
}
public ActionsCategory handleSingleNode(ActionsCategory category, ActionsManager manager, Element element) {
if (element == null) {
return null;
}
if (element instanceof Package) {
copyAction = new CopyAction(element);
}
if (element instanceof Classifier) {
final Classifier classifier = (Classifier) element;
validateAction = new ValidateAction(classifier);
ontoBehaviorAction = new CreateOntoBehaviorBlocks(classifier, false);
specializeStructureAction = new SpecializeStructureAction(classifier, false, ID, false, false);
specializeStructureRecursiveAction = new SpecializeStructureAction(classifier, false, ID_RECURSIVE, true, false);
createBSTAction = new SpecializeStructureAction(classifier, false, ID_RECURSIVE_INDIVIDUAL, true, true);
createInstanceMenuAction = new CreateInstanceMenuAction(classifier);
aspectAction = new AspectAction(classifier);
copyAction = new CopyAction(element);
if (classifier instanceof Behavior) {
}
}
else if (element instanceof InstanceSpecification) {
final InstanceSpecification instance = (InstanceSpecification) element;
validateAction = new ValidateAction(instance);
ArrayList<InstanceSpecification> insts = new ArrayList();
insts.add(instance);
instance2BSTAction = new Instance2BSTAction(insts);
}
else {
return null;
}
return category;
}
public static ActionsCategory disableCategory(ActionsCategory category) {
// once all the categories are disabled, the action category will be disabled
// this is defined in the configure method: category.setNested(true);
for (NMAction s : category.getActions()) {
if (s instanceof SRAction) {
SRAction sra = (SRAction) s;
sra.disable("Not Editable");
}
}
return category;
}
}