Регистрация действий редактора

Среда текстового редактора представляет множество служебных классов, облегчающих ввод и обновление текста и исходного кода. Рассмотрим рабочую среду, в состав которой редактор входит в качестве отдельного компонента. Каким образом редактор взаимодействует с другими компонентами рабочей среды, такими как контекстные меню, строки меню и панели инструментов?

Действия строки меню редактора

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

Контекстные меню редактора

Контекстные меню редактора создаются и управляются с помощью AbstractTextEditor и TextEditor.

Для регистрации действий в редакторе применяется метод 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.

ИД меню с поддержкой версии 1.0

Если установлен режим совместимости, ИД контекстных меню редактора и линейки задаются с помощью протокола AbstractTextEditor. Для этой цели применяются методы setEditorContextMenuId и setRulerContextMenuId. ИД рекомендуется сбрасывать, если необходимо запретить наследование меню, добавленных в меню базового класса. Например, JavaTextEditor сбрасывает ИД контекстных меню, для того чтобы избежать наследования текстовых расширений из других модулей.

protected void initializeEditor() {
	super.initializeEditor();
	JavaEditorEnvironment.connect(this);
	setSourceViewerConfiguration(new JavaSourceViewerConfiguration());
	setEditorContextMenuId("#JavaEditorContext"); 
	setRulerContextMenuId("#JavaRulerContext"); 
}

Если в структуре идентификаторы не указаны, то применяются идентификаторы по умолчанию, определяемые в AbstractTextEditor.

ИД меню без поддержки версии 1.0

ИД контекстного меню редактора всегда указывается в формате <ИД-редактора>.EditorContext, где <ИД-редактора> - это ИД редактора. ИД редактора определяется в соответствующем объявлении xml. ИД контекстного меню линейки выглядит следующим образом: <ИД-редактора>.RulerContext.