Я написал плагин Eclipse PyDev, и я пытаюсь его перенести в PyCharm, но я не могу найти простой способ отображения текстового представления рядом с источником Python код. Есть ли способ, который проще, чем копирование класса PsiAwareTextEditorImpl
и всех его помощников?Написание расширения PyCharm для отображения текста рядом с исходным кодом
Я получил управление сплиттера, чтобы я мог отображать что-то рядом с исходным кодом Python. В этом prototype branch я отобразил текстовый редактор рядом с редактором Python. Затем я создал текстовый файл для каждого файла Python для хранения текстового текста, но он отображает имя текстового файла, и было бы больно управлять кучей временных файлов.
Я прошел через стандартный класс редактора, PsiAwareTextEditorImpl
, и обнаружил, что у него есть тонна вспомогательных классов и в конечном итоге вызывает EditorPainter.paintTextWithEffects()
. Вот некоторые из вещей, которые она делает, чтобы нарисовать текст:
private void paintTextWithEffects(Graphics2D g, Rectangle clip, int startVisualLine, int endVisualLine) {
final CharSequence text = myDocument.getImmutableCharSequence();
// ...
VisualLinesIterator visLinesIterator = new VisualLinesIterator(myEditor, startVisualLine);
while (!visLinesIterator.atEnd()) {
int visualLine = visLinesIterator.getVisualLine();
if (visualLine > endVisualLine || visualLine >= lineCount) break;
int y = visLinesIterator.getY();
final boolean paintSoftWraps = paintAllSoftWraps ||
myEditor.getCaretModel().getLogicalPosition().line == visLinesIterator.getStartLogicalLine();
final int[] currentLogicalLine = new int[] {-1};
paintLineFragments(g, clip, visLinesIterator, y + myView.getAscent(), new LineFragmentPainter() {
@Override
public void paintBeforeLineStart(Graphics2D g, TextAttributes attributes, int columnEnd, float xEnd, int y) {
// ...
}
@Override
public void paint(Graphics2D g, VisualLineFragmentsIterator.Fragment fragment, int start, int end,
TextAttributes attributes, float xStart, float xEnd, int y) {
// ...
}
@Override
public void paintAfterLineEnd(Graphics2D g, Rectangle clip, IterationState iterationState, int columnStart, float x, int y) {
// ...
}
});
visLinesIterator.advance();
}
ComplexTextFragment.flushDrawingCache(g);
}
Это похоже на тонну работы, если я должен воспроизвести это, так есть некоторые существующие компоненты, которые можно использовать, чтобы отобразить блок текста, который не происходит из файла? Должен ли я создавать свой собственный экземпляр DocumentImpl
и как-то подключать его к редактору?
Вот что выглядит плагин Eclipse с кодом слева на Python и текстовым дисплеем справа.