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