2017-01-07 10 views
0

Я написал плагин 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 и текстовым дисплеем справа.

Screenshot of Live Coding in Python

ответ

1

Вы можете создать экземпляр LightVirtualFile, заправить любым содержанием и отображения в редакторе как файл существующего типа или пользовательского типа.