Среда текстового редактора представляет множество служебных классов, облегчающих ввод и обновление текста и исходного кода. Рассмотрим рабочую среду, в состав которой редактор входит в качестве отдельного компонента. Каким образом редактор взаимодействует с другими компонентами рабочей среды, такими как контекстные меню, строки меню и панели инструментов?
Описание процесса регистрации редакторов в рабочей среде и добавления действий в ее строку меню приведено в разделе, посвященном точке расширения 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
.