package jetbrains.mps.editor.runtime.impl.cellMenu;
/*Generated by MPS */
import jetbrains.mps.logging.Logger;
import org.apache.log4j.LogManager;
import org.jetbrains.mps.openapi.model.SNode;
import jetbrains.mps.nodeEditor.cellMenu.DefaultReferenceSubstituteInfo;
import jetbrains.mps.smodel.behaviour.BHReflection;
import jetbrains.mps.core.aspects.behaviour.SMethodTrimmedId;
import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SPropertyOperations;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SLinkOperations;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations;
import java.util.List;
import jetbrains.mps.openapi.editor.cells.SubstituteAction;
import java.util.Collections;
import jetbrains.mps.nodeEditor.EditorComponent;
import jetbrains.mps.openapi.editor.cells.EditorCell;
import jetbrains.mps.openapi.editor.cells.CellTraversalUtil;
import jetbrains.mps.smodel.presentation.ReferenceConceptUtil;
import jetbrains.mps.internal.collections.runtime.ListSequence;
import org.jetbrains.mps.openapi.language.SContainmentLink;
import jetbrains.mps.smodel.action.ModelActions;
import jetbrains.mps.smodel.action.DefaultSChildSetter;
/**
* TODO: merge with DefaultReferenceSubstituteInfo
*/
public class DefaultReferenceSubstituteInfoActionsFactory {
private static final Logger LOG = Logger.wrap(LogManager.getLogger(DefaultReferenceSubstituteInfoActionsFactory.class));
private SNode mySourceNode;
private SNode myLinkDeclaration;
private SNode myCurrentReferent;
private DefaultReferenceSubstituteInfo mySubstituteInfo;
public DefaultReferenceSubstituteInfoActionsFactory(SNode sourceNode, SNode linkDeclaration, DefaultReferenceSubstituteInfo substituteInfo) {
mySourceNode = sourceNode;
myLinkDeclaration = linkDeclaration;
SNode genuineLinkDeclaration = ((SNode) BHReflection.invoke(myLinkDeclaration, SMethodTrimmedId.create("getGenuineLink", MetaAdapterFactory.getConcept(0xc72da2b97cce4447L, 0x8389f407dc1158b7L, 0xf979bd086aL, "jetbrains.mps.lang.structure.structure.LinkDeclaration"), "hEwIf_V")));
if (genuineLinkDeclaration == null) {
return;
}
if (SPropertyOperations.hasValue(genuineLinkDeclaration, MetaAdapterFactory.getProperty(0xc72da2b97cce4447L, 0x8389f407dc1158b7L, 0xf979bd086aL, 0xf980556927L, "metaClass"), "aggregation", "reference")) {
DefaultReferenceSubstituteInfoActionsFactory.LOG.error("only reference links are allowed here", myLinkDeclaration);
}
if (!(((boolean) (Boolean) BHReflection.invoke(genuineLinkDeclaration, SMethodTrimmedId.create("isSingular", MetaAdapterFactory.getConcept(0xc72da2b97cce4447L, 0x8389f407dc1158b7L, 0xf979bd086aL, "jetbrains.mps.lang.structure.structure.LinkDeclaration"), "hEwIfAt"))))) {
DefaultReferenceSubstituteInfoActionsFactory.LOG.error("cardinalities 1 or 0..1 are allowed here", myLinkDeclaration);
}
myCurrentReferent = SLinkOperations.getTargetNode(SNodeOperations.getReference(sourceNode, myLinkDeclaration));
mySubstituteInfo = substituteInfo;
}
public List<SubstituteAction> createActions() {
if (myLinkDeclaration == null) {
return Collections.emptyList();
}
EditorComponent editor = (EditorComponent) mySubstituteInfo.getEditorContext().getEditorComponent();
EditorCell referenceCell = editor.findNodeCellWithRole(mySourceNode, ((String) BHReflection.invoke(myLinkDeclaration, SMethodTrimmedId.create("getGenuineRole", MetaAdapterFactory.getConcept(0xc72da2b97cce4447L, 0x8389f407dc1158b7L, 0xf979bd086aL, "jetbrains.mps.lang.structure.structure.LinkDeclaration"), "hEwIfAe"))));
if (referenceCell != null && CellTraversalUtil.getFirstLeaf(CellTraversalUtil.getContainingBigCell(referenceCell)) == referenceCell && ReferenceConceptUtil.getCharacteristicReference(SNodeOperations.getConceptDeclaration(mySourceNode)) == myLinkDeclaration && SNodeOperations.getParent(mySourceNode) != null && ListSequence.fromList(SNodeOperations.getChildren(mySourceNode)).isEmpty()) {
SNode parent = SNodeOperations.getParent(mySourceNode);
SContainmentLink link = mySourceNode.getContainmentLink();
return ModelActions.createChildNodeSubstituteActions(parent, mySourceNode, link, null, new DefaultSChildSetter(link), mySubstituteInfo.getEditorContext());
}
return ModelActions.createReferentSubstituteActions(mySourceNode, myCurrentReferent, myLinkDeclaration, mySubstituteInfo.getOperationContext());
}
}