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;
}
}