package jetbrains.mps.ide.actions; /*Generated by MPS */ import jetbrains.mps.plugins.actions.GeneratedActionGroup; import java.util.Set; import com.intellij.openapi.util.Pair; import jetbrains.mps.workbench.ActionPlace; import org.jetbrains.mps.util.Condition; import jetbrains.mps.workbench.action.BaseAction; import jetbrains.mps.internal.collections.runtime.SetSequence; import java.util.HashSet; import com.intellij.openapi.actionSystem.AnActionEvent; import jetbrains.mps.project.MPSProject; import org.jetbrains.mps.openapi.model.SNode; import org.jetbrains.mps.openapi.model.SReference; import jetbrains.mps.internal.collections.runtime.Sequence; import com.intellij.openapi.extensions.PluginId; import jetbrains.mps.resolve.ResolverComponent; import org.jetbrains.mps.openapi.language.SReferenceLink; import org.jetbrains.annotations.Nullable; public class GoByReference_ActionGroup extends GeneratedActionGroup { public static final String ID = "jetbrains.mps.ide.actions.GoByReference_ActionGroup"; private Set<Pair<ActionPlace, Condition<BaseAction>>> myPlaces = SetSequence.fromSet(new HashSet<Pair<ActionPlace, Condition<BaseAction>>>()); public GoByReference_ActionGroup() { super("Go by Reference", ID); this.setIsInternal(false); this.setPopup(true); } public void doUpdate(AnActionEvent event) { removeAll(); final MPSProject mpsProject = event.getData(MPSCommonDataKeys.MPS_PROJECT); SNode node = event.getData(MPSCommonDataKeys.NODE); if (node == null || mpsProject == null) { GoByReference_ActionGroup.this.disable(event.getPresentation()); return; } Iterable<? extends SReference> refs = node.getReferences(); if (!(refs.iterator().hasNext())) { GoByReference_ActionGroup.this.disable(event.getPresentation()); return; } for (SReference ref : Sequence.fromIterable(refs)) { SNode targetNode = ref.getTargetNode(); if (targetNode != null) { String text = "[" + ref.getLink() + "] -> " + ((jetbrains.mps.smodel.SReference) ref).getResolveInfo(); GoByReference_ActionGroup.this.addParameterizedAction(new EditGivenNode_Action(targetNode.getReference(), text), PluginId.getId("jetbrains.mps.ide"), targetNode.getReference(), text); continue; } final SReference finalRef = ref; mpsProject.getModelAccess().runWriteInEDT(new Runnable() { @Override public void run() { String text = "Bad reference: [" + finalRef.getLink() + "] -> " + ((jetbrains.mps.smodel.SReference) finalRef).getResolveInfo(); mpsProject.getModelAccess().executeUndoTransparentCommand(new Runnable() { @Override public void run() { ResolverComponent.getInstance().resolve(finalRef, mpsProject.getRepository()); } }); SReferenceLink role = finalRef.getLink(); SNode sourceNode = finalRef.getSourceNode(); SReference newRef = sourceNode.getReference(role); if (newRef == null) { return; } SNode newTarget = finalRef.getTargetNode(); if (newTarget == null) { return; } GoByReference_ActionGroup.this.addParameterizedAction(new EditGivenNode_Action(newTarget.getReference(), text), PluginId.getId("jetbrains.mps.ide"), newTarget.getReference(), text); } }); } for (Pair<ActionPlace, Condition<BaseAction>> p : this.myPlaces) { this.addPlace(p.first, p.second); } } public void addPlace(ActionPlace place, @Nullable Condition<BaseAction> cond) { SetSequence.fromSet(this.myPlaces).addElement(new Pair<ActionPlace, Condition<BaseAction>>(place, cond)); } public boolean isStrict() { return false; } }