Eclipse E4 RCP StyledText получает состояние INSERT KEY

Для приложения текстового редактора RCP E4, реализованного с помощью StyledText / SourceViewer, необходимо получить статус вставной клавиши.

После получения состояния (вставка, интеллектуальная вставка) приложение должно изменить значок курсора и уведомить другие части о состоянии INSERT (т.е. уведомить элемент управления в строке состояния, как в обычном текстовом редакторе).

SWT.INSERT только прослушивает нажатие клавиши, но ничего, если StyledText находится в INSERT MODE.

styledText.addKeyListener(new KeyAdapter(){
    public void keyPressed(KeyEvent e){
        if(e.keyCode == SWT.INSERT){
            System.out.println("INSERT KEY PRESSED!!!");
        }
    }
};

Я избегал продлевать

org.eclipse.ui.texteditor.AbstractTextEditor

и используйте метод

getInsertMode()

поскольку приложение предназначено для чисто текстового редактора E4.

Намек?

заранее спасибо


person J Robes    schedule 22.06.2016    source источник


Ответы (2)


Во-первых, вам нужно указать StyledText не выполнять действие по умолчанию, когда он видит клавишу Insert:

textWidget.setKeyBinding(SWT.INSERT, SWT.NULL);

Затем вам нужно определить команду, обработчик и привязку клавиш в контексте, чтобы редактор работал с клавишей Insert.

Обработчик команды вставки может обновить отображение состояния и сбросить, а затем сообщить StyledText об обновлении режима перезаписи:

textWidget.invokeAction(ST.TOGGLE_OVERWRITE);

Также обратите внимание, что на клавиатуре Mac нет клавиши Insert!

person greg-449    schedule 22.06.2016

Поскольку я столкнулся с некоторыми трудностями при работе с INSERT_KEY в элементе управления sourceviewer для текстового редактора E4 RCP, я напишу дополнительные сведения в ответ gregg449 (он всегда очень помогает!).

Следуя приведенному выше ответу, я создал контекст привязки, таблицу привязки, команду, обработчик и добавил контекст привязки к требуемой части (части, реализующей SourceViewer).

Следующий код предназначен для SourceViewer и InserKey Handler:

public class CheckKeyBindingSourceViewer extends ITextEditorPart{

    public SourceViewer sv = null;
    public StyledText st = null;

    @PostConstruct
    public void postConstruct(Composite parent) {
        sv = new SourceViewer(parent, null, null, true, SWT.MULTI | SWT.V_SCROLL |SWT.H_SCROLL);
        IDocument doc = new Document("");
        sv.setDocument(doc);
        st = sv.getTextWidget();

        //tell the StyledText not to do the default action when it sees the Insert key
        st.setKeyBinding(SWT.INSERT, SWT.NULL);
    }
}


public class InsertKeyHandler {
    @Execute
    public void execute(@Named(IServiceConstants.ACTIVE_PART) MPart activePart) {
        if (activePart.getObject() instanceof ITextEditorPart){
            ITextEditorPart theSourceViewer = (ITextEditorPart) activePart.getObject();
            theSourceViewer.st.invokeAction(ST.TOGGLE_OVERWRITE);
            //TODO
            //Change cursor sourcewiewer, notify to Statusbar...
        }
    }
}

На следующем рисунке показан Application.e4xmi с созданными контекстом привязки и таблицей привязки. Обратите внимание, что если вы не добавите дополнительный тег «type: user» в таблицу привязок, привязки не будут работать вообще. Это не отражено в учебнике vogella (http://www.vogella.com/tutorials/EclipseRCP/article.html) ни его книга.

Единственное место, где я нашел эту информацию, было в вопросе stackoverflow: привязки клавиш rcp eclipse не работают

Я использую eclipse Mars (4.5.0) как для Linux, так и для Windows, я не знаю, решена ли эта «ошибка» для более новых версий.

Конфигурация привязки клавиш

person J Robes    schedule 30.06.2016