package org.intellij.plugins.markdown.ui.preview; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.event.CaretEvent; import com.intellij.openapi.editor.event.CaretListener; import com.intellij.openapi.fileEditor.TextEditor; import com.intellij.pom.Navigatable; import org.intellij.plugins.markdown.ui.split.SplitFileEditor; import org.jetbrains.annotations.NotNull; public class MarkdownSplitEditor extends SplitFileEditor<TextEditor, MarkdownPreviewFileEditor> implements TextEditor { public MarkdownSplitEditor(@NotNull TextEditor mainEditor, @NotNull MarkdownPreviewFileEditor secondEditor) { super(mainEditor, secondEditor); mainEditor.getEditor().getCaretModel().addCaretListener(new MyCaretListener(secondEditor)); } @NotNull @Override public String getName() { return "Markdown split editor"; } @NotNull @Override public Editor getEditor() { return getMainEditor().getEditor(); } @Override public boolean canNavigateTo(@NotNull Navigatable navigatable) { return getMainEditor().canNavigateTo(navigatable); } @Override public void navigateTo(@NotNull Navigatable navigatable) { getMainEditor().navigateTo(navigatable); } private static class MyCaretListener implements CaretListener { @NotNull private final MarkdownPreviewFileEditor myPreviewFileEditor; public MyCaretListener(@NotNull MarkdownPreviewFileEditor previewFileEditor) { myPreviewFileEditor = previewFileEditor; } @Override public void caretPositionChanged(CaretEvent e) { final Editor editor = e.getEditor(); if (editor.getCaretModel().getCaretCount() != 1) { return; } final int offset = editor.logicalPositionToOffset(e.getNewPosition()); myPreviewFileEditor.scrollToSrcOffset(offset); } } }