Среда текстового редактора представляет множество служебных классов, облегчающих ввод и обновление текста и исходного кода. Рассмотрим рабочую среду, в состав которой редактор входит в качестве отдельного компонента. Каким образом редактор взаимодействует с другими компонентами рабочей среды, такими как контекстные меню, строки меню и панели инструментов?
Описание процесса регистрации редакторов в рабочей среде и добавления действий в ее строку меню приведено в разделе, посвященном точке расширения org.eclipse.ui.editors. В этом разделе эта тема не затрагивается. Ниже приведен пример текста на языке описания, с помощью которого пример редактора Java регистрирует собственный редактор.
<extension
point="org.eclipse.ui.editors">
<editor
name="%javaEditorName"
icon="icons/obj16/java.png"
extensions="jav"
contributorClass="org.eclipse.ui.examples.javaeditor.JavaActionContributor"
class="org.eclipse.ui.examples.javaeditor.JavaEditor"
id="org.eclipse.ui.JavaEditor">
</editor>
</extension>
Действия строки меню рабочей среды предоставляются с помощью класса JavaActionContributor. Он реализует действия, добавляемые в меню Правка и на панель инструментов рабочей среды.
public JavaActionContributor() {
super();
fContentAssistProposal= new RetargetTextEditorAction(JavaEditorMessages.getResourceBundle(), "ContentAssistProposal."); //$NON-NLS-1$
...
fContentAssistTip= new RetargetTextEditorAction(JavaEditorMessages.getResourceBundle(), "ContentAssistTip."); //$NON-NLS-1$
...
fTogglePresentation= new PresentationAction();
}
Первые два действия определены в качестве действий текстового редактора с возможностью изменения целевого объекта. Принцип аналогичен действиям с возможностью изменения целевого объекта, предусмотренным в рабочей среде. Такие действия представляют пункты меню, которые источник действий динамически связывает с соответствующими действиями активного редактора. При изменении активного редактора изменяется действие, с которым связано действие текстового редактора с возможность изменения целевого объекта. Следующий фрагмент исходного кода показывает, что источник действий редактора запрашивает в редакторе действие по заданному ИД:
protected final IAction getAction(ITextEditor editor, String actionId) {
return (editor == null ? null : editor.getAction(actionId));
}
public void setActiveEditor(IEditorPart part) {
super.setActiveEditor(part);
ITextEditor editor= null;
if (part instanceof ITextEditor)
editor= (ITextEditor) part;
fContentAssistProposal.setAction(getAction(editor, "ContentAssistProposal"));
fContentAssistTip.setAction(getAction(editor, "ContentAssistTip"));
fTogglePresentation.setEditor(editor);
fTogglePresentation.update();
}
Следует применять ИД, под которым действие зарегистрировано в редакторе. В данном
случае - JavaTextEditor. (См. также следующий раздел).:
protected void createActions() {
super.createActions();
IAction a= new TextOperationAction(JavaEditorMessages.getResourceBundle(), "ContentAssistProposal.", this, ISourceViewer.CONTENTASSIST_PROPOSALS); //$NON-NLS-1$
a.setActionDefinitionId(ITextEditorActionDefinitionIds.CONTENT_ASSIST_PROPOSALS);
setAction("ContentAssistProposal", a);
a= new TextOperationAction(JavaEditorMessages.getResourceBundle(), "ContentAssistTip.", this, ISourceViewer.CONTENTASSIST_CONTEXT_INFORMATION); //$NON-NLS-1$
a.setActionDefinitionId(ITextEditorActionDefinitionIds.CONTENT_ASSIST_CONTEXT_INFORMATION);
setAction("ContentAssistTip", a);
}
Третье действие добавляется на панель инструментов рабочей среды. Оно позволяет переключаться между отображением в редакторе выделенного диапазона (в соответствии с конфигурацией страницы схематичного представления содержимого примера Java) или всего файла. Оно доступно только на панели инструментов.
Для регистрации действий в редакторе применяется метод createActions. Он применим как к действиям контекстного меню редактора, так и действиям из определений расширений. В примере редактора Java создаются только действия, связанные с действиями с возможностью изменения целевого объекта. Кроме того, пример редактора Java наследует действия, созданные TextEditor и его базовыми классами. Эти действия можно использовать в контекстных меню редактора.
Метод editorContextMenuAboutToShow, определенный в TextEditor, применяется в среде для добавления в контекстное меню редакторов действий, предназначенных для редактирования данных. С помощью пути к меню можно указать конкретное расположение для добавления действия. Допустимые пути для контекстных меню редактора определены в реализации этого метода в AbstractTextEditor.
Действие можно добавить в меню различными способами. Первый способ - добавление с помощью ИД, заданного при регистрации действия в редакторе. Например, при вызове этого метода JavaTextEditor добавляет действия помощника по содержимому. Если действие с указанным ИД не зарегистрировано, оно не добавляется в меню.
public void editorContextMenuAboutToShow(MenuManager menu) {
super.editorContextMenuAboutToShow(menu);
addAction(menu, "ContentAssistProposal");
addAction(menu, "ContentAssistTip");
}
Базовый класс TextEditor добавляет действия другим способом - путем указания группы контекстного меню для размещения действия. В этом случае действия (Сдвинуть влево, Сдвинуть вправо) отображаются в контекстном меню в группе, определенной AbstractTextEditor.
protected void editorContextMenuAboutToShow(IMenuManager menu) {
super.editorContextMenuAboutToShow(menu);
addAction(menu, ITextEditorActionConstants.GROUP_EDIT, ITextEditorActionConstants.SHIFT_RIGHT);
addAction(menu, ITextEditorActionConstants.GROUP_EDIT, ITextEditorActionConstants.SHIFT_LEFT);
}
Метод rulerContextMenuAboutToShow применяется аналогичным образом перед отображением контекстного меню линейки. Реализация этого метода в AbstractTextEditor задает группы меню, доступные для добавления элементов.
Для контекстных меню редактора и линейки можно указать ИД, позволяющие расширять эти меню другим модулями. Текущий принцип задания ИД меню обладает большей гибкостью, чем в исходной версии платформы. Однако для обеспечения поддержки модулей, разработанных для исходной версии, в среде предусмотрен режим совместимости. Режим совместимости можно настроить с помощью метода AbstractTextEditor.setCompatibilityMode(). Значение по умолчанию - true.
Если установлен режим совместимости, ИД контекстных меню редактора и линейки задаются с помощью протокола AbstractTextEditor. Для этой цели применяются методы setEditorContextMenuId и setRulerContextMenuId. ИД рекомендуется сбрасывать, если необходимо запретить наследование меню, добавленных в меню базового класса. Например, JavaTextEditor сбрасывает ИД контекстных меню, для того чтобы избежать наследования текстовых расширений из других модулей.
protected void initializeEditor() {
super.initializeEditor();
JavaEditorEnvironment.connect(this);
setSourceViewerConfiguration(new JavaSourceViewerConfiguration());
setEditorContextMenuId("#JavaEditorContext");
setRulerContextMenuId("#JavaRulerContext");
}
Если в структуре идентификаторы не указаны, то применяются идентификаторы по умолчанию, определяемые в AbstractTextEditor.
ИД контекстного меню редактора всегда указывается в формате <ИД-редактора>.EditorContext,
где <ИД-редактора> - это ИД редактора. ИД редактора
определяется в соответствующем объявлении xml. ИД контекстного меню линейки выглядит
следующим образом: <ИД-редактора>.RulerContext.