Я изучал это, оно довольно сложное, и я не уверен, что получил полную картину, но на случай, если это кому-нибудь поможет ...
Декларативный способ привязки редактора квклад в 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, который должен быть обновлен, и редактор должен записывать в объекты этого списка при изменении соответствующего статуса.Таким образом, редактор отделен от строки состояния (он не знает, будет ли отображаться изменение статуса в пользовательском интерфейсе).