Как реализуется элемент вклада строки состояния номера строки затмения? - PullRequest
3 голосов
/ 04 ноября 2011

Мне нужно обновить информацию о редакторе строки состояния.У меня уже есть собственная реализация, но я хотел бы взглянуть, как реализован элемент вклада затмения, который показывает номер строки / положение столбца в строке состояния.Может кто-нибудь указать мне, где я могу найти исходный код?

Заранее спасибо, AlexG.

Ответы [ 3 ]

3 голосов
/ 24 октября 2012

Я изучал это, оно довольно сложное, и я не уверен, что получил полную картину, но на случай, если это кому-нибудь поможет ...

Декларативный способ привязки редактора квклад в StatusLine (и Меню и Панель инструментов) осуществляется через IEditorActionBarContributor class.Этот класс объявлен для типа редактора в plugin.xml - и обычно для каждого типа редактора создается один экземпляр (несколько работающих экземпляров одного и того же типа редактора будут совместно использовать экземпляр IEditorActionBarContributor, вызывая его метод doSetActiveEditor() при активации)и он будет удален, когда будет закрыт последний работающий редактор этого типа.

Давайте рассмотрим в качестве примера, как текстовый редактор по умолчанию в Eclipse обновляет информацию «Вставить / переопределить» в строке состояния (изEclipse 3.7)

Текстовый редактор по умолчанию объявлен в org.eclipse.ui.editors s plugin.xml (некоторые строки обрезаны) как:

 <extension point="org.eclipse.ui.editors">
      <editor  name="%Editors.DefaultTextEditor"
            class="org.eclipse.ui.editors.text.TextEditor"
            contributorClass="org.eclipse.ui.editors.text.TextEditorActionContributor"
            id="org.eclipse.ui.DefaultTextEditor">
      </editor>
 </extension>

TextEditorActionContributor - ключ.То, что нас интересует, реализовано в родительском классе BasicTextEditorActionContributor ;он определяет (статически) 4 поля состояния (STATUS_FIELD_DEFS) и хранит внутри себя фиксированную карту (fStatusFields) каждого statusField (скажем, спецификации) в объект StatusLineContributionItem).При вызове из пользовательского интерфейса Eclipse он регистрирует 4 поля в строке состояния (в основном заголовки) в методе contributeToStatusLine(IStatusLineManager statusLineManager) И каждый раз, когда редактор активируется, он передает ему -in doSetActiveEditor(IEditorPart part) - полный наборStatusLineContributionItem с, подготовлено с соответствующим действием Хендлеров.Редактор понимает все это, потому что он реализует ITextEditorExtension.setStatusField().

. В случае AbstractTextEditor он имеет закрытое поле (внутренний класс) типа ToggleOverwriteModeAction, которое вызывает

toggleOverwriteMode()->handleInsertModeChanged()->updateStatusField("InputMode")

Редактор смотрит, есть ли у него statusField, сохраненный с этой категорией, если это так, он вызовет IStatusField.setText("Insert" / "Overwrite"), и это приведет к обновлению сообщения строки состояния.

Это пример, ноЯ предполагаю, что это дает общую идею: экземпляр EditorActionContributor, связанный с типом редактора, содержит список StatusLineContributionItem, который должен быть обновлен, и редактор должен записывать в объекты этого списка при изменении соответствующего статуса.Таким образом, редактор отделен от строки состояния (он не знает, будет ли отображаться изменение статуса в пользовательском интерфейсе).

1 голос
/ 10 ноября 2011

Чтобы узнать, как что-то реализовано в Eclipse, вы также можете использовать так называемый Plug-in spy .Plug-in spy входит в состав Plug-in Development Environmend (PDE) .Это выполнено с ALT + SHIFT + F1 .Более подробную информацию смотрите в этом FAQ по разработке плагинов .

0 голосов
/ 07 ноября 2011

Я не совсем уверен, о чем вы просите, но здесь есть конкретная реализация IStatusLineManager: org.eclipse.jface.action.StatusLineManager

Обычно, если вы хотите получить доступ к строке состояния и у вас есть дескриптор для редактора, вы можете сделать что-то вроде этого (заимствовано из org.eclipse.jdt.internal.ui.javaeditor.AddImportOnSelectionAction:

private IStatusLineManager getStatusLineManager() {
    return fEditor.getEditorSite().getActionBars().getStatusLineManager();
}
...