package jetbrains.mps.execution.lib.ui; /*Generated by MPS */ import com.intellij.openapi.ui.TextFieldWithBrowseButton; import org.jetbrains.annotations.Nullable; import org.jetbrains.mps.openapi.model.SNodeReference; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import org.jetbrains.mps.openapi.module.FindUsagesFacade; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.ide.DataManager; import com.intellij.openapi.project.Project; import jetbrains.mps.workbench.MPSDataKeys; import jetbrains.mps.project.MPSProject; import jetbrains.mps.baseLanguage.closures.runtime.Wrappers; import java.util.List; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.progress.Task; import org.jetbrains.annotations.NotNull; import com.intellij.openapi.progress.ProgressIndicator; import jetbrains.mps.internal.collections.runtime.ListSequence; import jetbrains.mps.progress.ProgressMonitorAdapter; import jetbrains.mps.internal.collections.runtime.ISelector; import org.jetbrains.mps.openapi.model.SNode; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations; import jetbrains.mps.ide.platform.dialogs.choosers.NodeChooserDialog; import jetbrains.mps.smodel.ModelAccessHelper; import jetbrains.mps.util.Computable; import org.jetbrains.mps.openapi.util.ProgressMonitor; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SModelOperations; import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SPropertyOperations; public abstract class NodeChooser extends TextFieldWithBrowseButton.NoPathCompletion { @Nullable private SNodeReference myNodePointer; public NodeChooser() { addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent p0) { final FindUsagesFacade findUsegesManager = FindUsagesFacade.getInstance(); DataContext dataContext = DataManager.getInstance().getDataContext(NodeChooser.this); Project project = MPSDataKeys.PROJECT.getData(dataContext); final MPSProject mpsProject = MPSDataKeys.MPS_PROJECT.getData(dataContext); if (mpsProject == null) { return; } final Wrappers._T<List<SNodeReference>> toChooseFrom = new Wrappers._T<List<SNodeReference>>(); ProgressManager.getInstance().run(new Task.Modal(project, "Searching for nodes", false) { public void run(@NotNull final ProgressIndicator indicator) { mpsProject.getModelAccess().runReadAction(new Runnable() { public void run() { toChooseFrom.value = ListSequence.fromList(findToChooseFromOnInit(findUsegesManager, new ProgressMonitorAdapter(indicator))).select(new ISelector<SNode, SNodeReference>() { public SNodeReference select(SNode it) { return SNodeOperations.getPointer(it); } }).toListSequence(); } }); } }); NodeChooserDialog chooserDialog = new NodeChooserDialog(project, toChooseFrom.value); chooserDialog.show(); final SNodeReference result = chooserDialog.getResult(); if (result != null) { setNode(result); setText(new ModelAccessHelper(mpsProject.getModelAccess()).runReadAction(new Computable<String>() { public String compute() { SNode resultNode = result.resolve(mpsProject.getRepository()); return (resultNode == null ? null : getFqName(resultNode)); } })); } } }); // we don't support entering name of the node manually setEditable(false); } protected abstract List<SNode> findToChooseFromOnInit(FindUsagesFacade manager, ProgressMonitor monitor); @Nullable public SNodeReference getNode() { return this.myNodePointer; } public void setNode(SNodeReference node) { myNodePointer = node; } public static String getFqName(SNode node) { String modelName = SModelOperations.getModelName(SNodeOperations.getModel(node)); // XXX why not node.getFqName or node/.getPresentation? String nodeName; if (SNodeOperations.isInstanceOf(node, MetaAdapterFactory.getInterfaceConcept(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x110396eaaa4L, "jetbrains.mps.lang.core.structure.INamedConcept"))) { nodeName = SPropertyOperations.getString(SNodeOperations.cast(node, MetaAdapterFactory.getInterfaceConcept(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x110396eaaa4L, "jetbrains.mps.lang.core.structure.INamedConcept")), MetaAdapterFactory.getProperty(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x110396eaaa4L, 0x110396ec041L, "name")); } else { nodeName = node.getNodeId().toString(); } if ((modelName == null || modelName.length() == 0)) { return nodeName; } return modelName + '.' + nodeName; } }