package jetbrains.mps.ide.editor.util;
/*Generated by MPS */
import jetbrains.mps.openapi.editor.EditorComponent;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.mps.openapi.model.SNode;
import org.jetbrains.annotations.Nullable;
import jetbrains.mps.project.Project;
import jetbrains.mps.ide.project.ProjectHelper;
import jetbrains.mps.nodeEditor.InspectorTool;
import jetbrains.mps.openapi.editor.cells.EditorCell;
import jetbrains.mps.util.annotation.ToRemove;
import com.intellij.openapi.fileEditor.FileEditorManager;
import java.util.List;
import java.util.ArrayList;
import jetbrains.mps.nodeEditor.inspector.InspectorEditorComponent;
import jetbrains.mps.util.SNodeOperations;
import java.util.Collections;
import jetbrains.mps.ide.editor.MPSFileNodeEditor;
import jetbrains.mps.nodeEditor.highlighter.EditorsHelper;
public class EditorComponentUtil {
public EditorComponentUtil() {
}
/**
*
* @param node model element to scroll to
* @param component the method doesn't make sense with this argument == null, however, we tolerate null for convenience
* @return editor component (i.e. editor or inspector) the node has been found in
*/
public static EditorComponent scrollToNode(@NotNull SNode node, @Nullable EditorComponent component) {
if (component == null) {
return null;
}
Project mpsProject = ProjectHelper.getProject(component.getEditorContext().getRepository());
jetbrains.mps.nodeEditor.EditorComponent inspector = (mpsProject == null ? null : mpsProject.getComponent(InspectorTool.class).getInspector());
if (inspector != null) {
boolean searchInInspector = false;
SNode currentTargetNode = node;
while (currentTargetNode != null) {
EditorCell cell = component.findNodeCell(currentTargetNode);
if (cell != null) {
if (currentTargetNode != node) {
// so we are probably in inspector...
// we need to select to find a node in inspector
component.changeSelection(cell);
searchInInspector = true;
}
break;
}
currentTargetNode = currentTargetNode.getParent();
}
currentTargetNode = node;
while (currentTargetNode != null && searchInInspector) {
EditorCell cellInInspector = inspector.findNodeCell(currentTargetNode);
if (cellInInspector != null) {
inspector.scrollToCell(cellInInspector);
return inspector;
}
currentTargetNode = currentTargetNode.getParent();
}
}
component.scrollToNode(node);
return component;
}
/**
*
* @deprecated use the one with openapi parameters counterpart
* @param manager just to access idea project and grab InspectorTool
*/
@Nullable
@Deprecated
@ToRemove(version = 3.3)
public static jetbrains.mps.nodeEditor.EditorComponent scrollToNode(@NotNull SNode node, @Nullable jetbrains.mps.nodeEditor.EditorComponent component, FileEditorManager manager) {
return (jetbrains.mps.nodeEditor.EditorComponent) scrollToNode(node, component);
}
@NotNull
public static List<jetbrains.mps.nodeEditor.EditorComponent> findComponentForNode(SNode node, FileEditorManager fileEditorManager) {
List<jetbrains.mps.nodeEditor.EditorComponent> result = new ArrayList<jetbrains.mps.nodeEditor.EditorComponent>();
jetbrains.mps.nodeEditor.EditorComponent inspector = EditorComponentUtil.findInspector(fileEditorManager);
if (inspector != null) {
if (EditorComponentUtil.isNodeShownInTheComponent(inspector, node)) {
result.add(inspector);
}
}
for (jetbrains.mps.nodeEditor.EditorComponent editorComponent : EditorComponentUtil.getAllEditorComponents(fileEditorManager, false)) {
if (EditorComponentUtil.isNodeShownInTheComponent(editorComponent, node)) {
result.add(editorComponent);
}
}
return result;
}
public static boolean isNodeShownInTheComponent(@NotNull jetbrains.mps.nodeEditor.EditorComponent component, @NotNull SNode node) {
if (component instanceof InspectorEditorComponent) {
SNode editedNode = component.getEditedNode();
return editedNode != null && SNodeOperations.isAncestor(editedNode, node) && (editedNode != node);
} else {
return component.getEditedNode() == node.getContainingRoot();
}
}
public static List<jetbrains.mps.nodeEditor.EditorComponent> getAllEditorComponents(FileEditorManager manager, boolean includeInspector) {
if (manager.getProject().isDisposed()) {
return Collections.emptyList();
}
List<jetbrains.mps.nodeEditor.EditorComponent> result = new ArrayList<jetbrains.mps.nodeEditor.EditorComponent>();
if (includeInspector) {
jetbrains.mps.nodeEditor.EditorComponent inspector = EditorComponentUtil.findInspector(manager);
if (inspector != null) {
result.add(inspector);
}
}
List<MPSFileNodeEditor> allEditors = EditorsHelper.getAllEditors(manager);
for (MPSFileNodeEditor editor : allEditors) {
jetbrains.mps.nodeEditor.EditorComponent currentEditorComponent = (jetbrains.mps.nodeEditor.EditorComponent) editor.getNodeEditor().getCurrentEditorComponent();
if (currentEditorComponent != null) {
result.add(currentEditorComponent);
}
}
return result;
}
@Nullable
public static jetbrains.mps.nodeEditor.EditorComponent findInspector(FileEditorManager manager) {
if (manager.getProject().isDisposed()) {
return null;
}
InspectorTool tool = manager.getProject().getComponent(InspectorTool.class);
if (tool == null) {
return null;
}
return tool.getInspector();
}
}