2015-08-29 4 views
0

Я пытаюсь изменить способ перемещения страницы вверх и вниз.Разработка плагина Intellij, переопределение CaretImpl

Я успешно расширил EditorAction и могу изменить размер выполняемого им прыжка.

Это код, который работает для него:

@Override 
    public void execute(Editor editor, DataContext dataContext) { 
      boolean $isWithSelection = false; 
      int  $divider   = 2; 

      int lineHeight = editor.getLineHeight(); 
      Rectangle visibleArea = editor.getScrollingModel().getVisibleArea(); 

      int linesIncrement = (visibleArea.height/lineHeight)/$divider; 

      editor.getScrollingModel().scrollVertically(visibleArea.y - visibleArea.y % lineHeight - linesIncrement * lineHeight); 

      int lineShift = -linesIncrement; 

      editor.getCaretModel().moveCaretRelatively(0, lineShift, $isWithSelection, editor.isColumnMode(), true); 
    } 

Я разделил размер страницы до размера на два.

Но я также хотел бы изменить оплату, которую каретка размещает на странице, когда нет ничего более, чтобы перейти на страницу вверх.

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

На самом деле вы должны иметь возможность делать страницы вверх и вниз и всегда возвращаться к одной и той же строке, одному столбцу и тому же символу.

Страница вверх и вниз по страницам часто используется для пика в коде выше, но Intellij делает это настоящим hastle. Ты станешь, и ты все время закручиваешься.

Так последняя строка:

  editor.getCaretModel().moveCaretRelatively(0, lineShift, $isWithSelection, editor.isColumnMode(), true); 

Отвечает переместить каретку, но получить caretModel это то, что я считаю синглтон, а вот где магия движется кареткой происходит.

Этот метод огромен, и я понятия не имею, о том, что на самом деле перемещает каретку на первый символ, но прежде, чем я есть:

Что мне нужно сделать, чтобы иметь возможность переопределить moveCaretRelatively в CaretImpl?

Могу ли я участвовать в создании Caret for Editor?

EDIT


Примечание! Если вы слишком сильно пролистываете страницу, она также перемещает каретку в первую строку, однако страница вверх после этого, похоже, запоминает вашу позицию каретки. Но страница вверх, а затем страница вниз не делает, , так что, кажется, есть ошибка, так как страница внизу, а затем страница работает, как я хочу

+0

Просто совет, если вы еще не знаете, но у JetBrains есть форум для разработки плагинов. Вы можете искать и спрашивать там. Мне обычно повезло на форумах. – Zarwan

ответ

2

Нет, вы не можете участвовать в создании CaretImpl, и вы не может переопределить метод moveCaretRelatively().

Однако на самом деле вам это не нужно: вместо вызова этого метода вы можете рассчитать точное местоположение, в котором вы хотите, чтобы каретка была перемещена, и вызвать CaretModel.moveToOffset() или CaretModel.moveToLogicalPosition(), чтобы переместить карет там.

+0

Я попытаюсь заглянуть в то, что скоро, когда у меня снова будет время. Благодаря ;) – momomo

Смежные вопросы