package jetbrains.mps.idea.core.editor;
import com.intellij.openapi.actionSystem.LangDataKeys;
import com.intellij.psi.PsiElement;
import com.intellij.usages.UsageTarget;
import com.intellij.usages.UsageView;
import jetbrains.mps.ide.actions.MPSCommonDataKeys;
import jetbrains.mps.ide.editor.NodeEditor;
import jetbrains.mps.idea.core.psi.impl.MPSPsiProvider;
import jetbrains.mps.idea.core.usages.NodeUsageTarget;
import jetbrains.mps.project.MPSProject;
import jetbrains.mps.project.Project;
import jetbrains.mps.smodel.ModelAccessHelper;
import jetbrains.mps.util.Computable;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.mps.openapi.model.SNode;
import org.jetbrains.mps.openapi.model.SNodeReference;
import java.util.ArrayList;
import java.util.List;
/**
* danilla 5/17/13
*/
public class IdeaNodeEditor extends NodeEditor {
public IdeaNodeEditor(Project project, SNode node) {
super(project, node);
}
@Override
public Object getData(@NonNls String dataId) {
if (UsageView.USAGE_TARGETS_KEY.is(dataId)) {
assert myProject instanceof MPSProject;
SNodeReference currNodeRef = new ModelAccessHelper(myProject.getModelAccess()).runReadAction(new Computable<SNodeReference>() {
@Override
public SNodeReference compute() {
SNode node = MPSCommonDataKeys.NODE.getData(getCurrentEditorComponent());
if (node == null) {
return null;
}
return node.getReference();
}
});
return new UsageTarget[]{new NodeUsageTarget(currNodeRef, ((MPSProject) myProject).getProject())};
} else if (LangDataKeys.PSI_ELEMENT_ARRAY.is(dataId)) {
assert myProject instanceof MPSProject;
return new ModelAccessHelper(myProject.getModelAccess()).runReadAction(new Computable<PsiElement[]>() {
@Override
public PsiElement[] compute() {
List<SNode> nodes = MPSCommonDataKeys.NODES.getData(getCurrentEditorComponent());
if (nodes == null) {
return null;
}
MPSPsiProvider psiProvider = MPSPsiProvider.getInstance(((MPSProject) myProject).getProject());
List<PsiElement> elements = new ArrayList<PsiElement>(nodes.size());
for (SNode node : nodes) {
elements.add(psiProvider.getPsi(node));
}
return elements.toArray(PsiElement.EMPTY_ARRAY);
}
});
}
return super.getData(dataId);
}
}