package jetbrains.mps.ide.actions; /*Generated by MPS */ import jetbrains.mps.workbench.action.BaseAction; import javax.swing.Icon; import com.intellij.openapi.actionSystem.AnActionEvent; import java.util.Map; import jetbrains.mps.internal.collections.runtime.ListSequence; import java.util.List; import org.jetbrains.mps.openapi.model.SNode; import jetbrains.mps.internal.collections.runtime.MapSequence; import jetbrains.mps.internal.collections.runtime.IWhereFilter; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations; import jetbrains.mps.smodel.SModelOperations; import org.jetbrains.annotations.NotNull; import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory; import java.util.ArrayList; import jetbrains.mps.project.MPSProject; import com.intellij.openapi.project.Project; import com.intellij.openapi.actionSystem.CommonDataKeys; import jetbrains.mps.baseLanguage.closures.runtime.Wrappers; import org.jetbrains.mps.openapi.module.ModelAccess; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SPropertyOperations; import java.util.Set; import org.jetbrains.mps.openapi.model.SModel; import jetbrains.mps.internal.collections.runtime.SetSequence; import java.util.HashSet; import jetbrains.mps.internal.collections.runtime.ISelector; import jetbrains.mps.internal.collections.runtime.ITranslator2; import java.util.Collections; import jetbrains.mps.plugins.relations.RelationDescriptor; import jetbrains.mps.plugins.projectplugins.ProjectPluginManager; public class SetNodePackage_Action extends BaseAction { private static final Icon ICON = null; public SetNodePackage_Action() { super("Set Virtual Package...", "", ICON); this.setIsAlwaysVisible(false); this.setExecuteOutsideCommand(true); } @Override public boolean isDumbAware() { return true; } @Override public boolean isApplicable(AnActionEvent event, final Map<String, Object> _params) { return ListSequence.fromList(((List<SNode>) MapSequence.fromMap(_params).get("nodes"))).all(new IWhereFilter<SNode>() { public boolean accept(SNode n) { return SNodeOperations.getParent(n) == null && !(SModelOperations.isReadOnly(SNodeOperations.getModel(n))); } }); } @Override public void doUpdate(@NotNull AnActionEvent event, final Map<String, Object> _params) { this.setEnabledState(event.getPresentation(), this.isApplicable(event, _params)); } @Override protected boolean collectActionData(AnActionEvent event, final Map<String, Object> _params) { if (!(super.collectActionData(event, _params))) { return false; } { List<SNode> nodes = event.getData(MPSCommonDataKeys.NODES); if (nodes != null) { boolean error = false; for (SNode node : ListSequence.fromList(nodes)) { if (!(SNodeOperations.isInstanceOf(node, MetaAdapterFactory.getConcept(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x10802efe25aL, "jetbrains.mps.lang.core.structure.BaseConcept")))) { error = true; break; } } if (error) { nodes = null; } } if (nodes == null) { MapSequence.fromMap(_params).put("nodes", null); } else { MapSequence.fromMap(_params).put("nodes", ListSequence.fromListWithValues(new ArrayList<SNode>(), nodes)); } if (nodes == null) { return false; } } { MPSProject p = event.getData(MPSCommonDataKeys.MPS_PROJECT); MapSequence.fromMap(_params).put("project", p); if (p == null) { return false; } } { Project p = event.getData(CommonDataKeys.PROJECT); MapSequence.fromMap(_params).put("ideaProject", p); if (p == null) { return false; } } return true; } @Override public void doExecute(@NotNull final AnActionEvent event, final Map<String, Object> _params) { final Wrappers._T<List<String>> packages = new Wrappers._T<List<String>>(); final Wrappers._T<String> oldPackage = new Wrappers._T<String>(); ModelAccess modelAccess = ((MPSProject) MapSequence.fromMap(_params).get("project")).getRepository().getModelAccess(); modelAccess.runReadAction(new Runnable() { public void run() { packages.value = SetNodePackage_Action.this.fetchExistingPackages(((List<SNode>) MapSequence.fromMap(_params).get("nodes")), _params); oldPackage.value = SPropertyOperations.getString(ListSequence.fromList(((List<SNode>) MapSequence.fromMap(_params).get("nodes"))).first(), MetaAdapterFactory.getProperty(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x10802efe25aL, 0x115eca8579fL, "virtualPackage")); } }); final SetNodePackageDialog dialog = new SetNodePackageDialog(((MPSProject) MapSequence.fromMap(_params).get("project")), packages.value); dialog.setPackage(oldPackage.value); dialog.show(); if (dialog.isCancelled()) { return; } modelAccess.executeCommandInEDT(new Runnable() { public void run() { for (SNode node : ListSequence.fromList(((List<SNode>) MapSequence.fromMap(_params).get("nodes")))) { SPropertyOperations.set(node, MetaAdapterFactory.getProperty(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x10802efe25aL, 0x115eca8579fL, "virtualPackage"), dialog.getPackage()); if (SNodeOperations.isInstanceOf(node, MetaAdapterFactory.getConcept(0xc72da2b97cce4447L, 0x8389f407dc1158b7L, 0x1103553c5ffL, "jetbrains.mps.lang.structure.structure.AbstractConceptDeclaration"))) { for (SNode aspect : ListSequence.fromList(SetNodePackage_Action.this.findAllAspects(((Project) MapSequence.fromMap(_params).get("ideaProject")), SNodeOperations.cast(node, MetaAdapterFactory.getConcept(0xc72da2b97cce4447L, 0x8389f407dc1158b7L, 0x1103553c5ffL, "jetbrains.mps.lang.structure.structure.AbstractConceptDeclaration")), _params))) { SPropertyOperations.set(((SNode) aspect), MetaAdapterFactory.getProperty(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x10802efe25aL, 0x115eca8579fL, "virtualPackage"), dialog.getPackage()); } } } } }); } /*package*/ List<String> fetchExistingPackages(List<SNode> nlist, final Map<String, Object> _params) { Set<SModel> models = SetSequence.fromSetWithValues(new HashSet<SModel>(), ListSequence.fromList(nlist).select(new ISelector<SNode, SModel>() { public SModel select(SNode n) { return SNodeOperations.getModel(n); } })); Set<String> packages = SetSequence.fromSetWithValues(new HashSet<String>(), SetSequence.fromSet(models).translate(new ITranslator2<SModel, SNode>() { public Iterable<SNode> translate(SModel m) { return jetbrains.mps.lang.smodel.generator.smodelAdapter.SModelOperations.roots(m, MetaAdapterFactory.getConcept(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x10802efe25aL, "jetbrains.mps.lang.core.structure.BaseConcept")); } }).select(new ISelector<SNode, String>() { public String select(SNode r) { return SPropertyOperations.getString(r, MetaAdapterFactory.getProperty(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x10802efe25aL, 0x115eca8579fL, "virtualPackage")); } }).where(new IWhereFilter<String>() { public boolean accept(String p) { return p != null; } })); List<String> result = ListSequence.fromListWithValues(new ArrayList<String>(), packages); Collections.sort(result); return result; } public List<SNode> findAllAspects(Project project, final SNode node, final Map<String, Object> _params) { List<RelationDescriptor> tabs = ProjectPluginManager.getApplicableTabs(project, node); return ListSequence.fromList(tabs).where(new IWhereFilter<RelationDescriptor>() { public boolean accept(RelationDescriptor it) { return it.isApplicable(node); } }).translate(new ITranslator2<RelationDescriptor, SNode>() { public Iterable<SNode> translate(final RelationDescriptor tab) { List<SNode> nodes = tab.getNodes(node); return ListSequence.fromList(nodes).where(new IWhereFilter<SNode>() { public boolean accept(SNode it) { return tab.getBaseNode(it) == node; } }); } }).toListSequence(); } }