Редактор - это компонент рабочей среды, позволяющий редактировать объекты (в роли которых часто выступают файлы). Редакторы работают примерно так же, как и редакторы обычных файлов, но отличаются тем, что они более тесно интегрированы в пользовательский интерфейс рабочей среды платформы. Редактор всегда связан с объектом ввода (IEditorInput). Объект ввода можно сравнить с документом или файлом для редактирования. Сделанные в редакторе изменения вступают в силу после сохранения.
Можно открыть только один редактор для отдельного элемента ввода на странице рабочей среды. Например, если пользователь редактирует readme.txt в рабочей среде, повторное его открытие в той же проекции активирует тот же редактор. (Можно открыть другой редактор с тем же файлом из другого окна рабочей среды или проекции). В отличие от панелей, один тип редактора, например текстовый, можно открыть несколько раз в одной странице рабочей среды с разными вводами.
Точка расширения рабочей среды org.eclipse.ui.editors используется модулями для добавления редакторов к рабочей среде. Модули, добавляющие редактор, должны регистрировать расширение редактора в файле plugin.xml вместе с информацией о конфигурации для редактора. Некоторые сведения о редакторе, такие как класс реализации и имя со значком, используемые в меню рабочей среды и метках, похожи на информацию о панелях. Кроме того, расширения редактора указывают расширения файла или шаблоны имен файлов, распознаваемые редактором. Редакторы также могут задать contributorClass, который является классом, добавляющим действия к меню рабочей среды и панелям инструментов, когда редактор активен.
Интерфейс для редакторов задается в IEditorPart, но модули могут также расширять класс EditorPart, а не создавать IEditorPart с нуля.
Примечание: Расширение редактора можно также настроить для запуска внешних программ или для вызова имеющегося кода java. В этом разделе мы рассматриваем редакторы, которые очень тесно интегрированы в рабочую среду и реализованы с помощью IEditorPart.
Утилита readme является пользовательским редактором, предназначенным главным образом для дополнения собственных страниц конструктора с содержимым к панели конструктора рабочей среды.
Конфигурация расширения редактора выглядит следующим образом.
<extension point = "org.eclipse.ui.editors"> <editor id = "org.eclipse.ui.examples.readmetool.ReadmeEditor" name="%Editors.ReadmeEditor" icon="icons/obj16/editor.png" class="org.eclipse.ui.examples.readmetool.ReadmeEditor" extensions="readme" contributorClass="org.eclipse.ui.examples.readmetool.ReadmeEditorActionBarContributor"> </editor> </extension>
Мы уже знакомы с кодом в конфигурации для ИД, имени, значка и класса. Атрибут расширение описывает типы файлов, распознаваемые редактором. (Можно также указать имена файлов для более точных привязок). Класс использует редактор, contributorClass отвечает за предоставление связанных с редактором действий. Рассмотрим дополняющие классы более подробно.
Дополняющий класс добавляет связанные с редактором действия в меню и панель инструментов рабочей среды. Он должен реализовывать интерфейс IEditorActionBarContributor. Дополняющий класс отделен от самого редактора, так как любая страница рабочей среды может иметь несколько редакторов одного типа. Отдельный дополняющий класс используется совместно всеми редакторами определенного типа вместо того, чтобы каждый редактор создавал отдельные действия и изображения.
В ReadmeEditorActionBarContributor мы добавили три действия "Editor Action1," "Editor Action2," и "Editor Action3." Вот код из конструктора.
public ReadmeEditorActionBarContributor() { ... action1 = new EditorAction(MessageUtil.getString("Editor_Action1")); action1.setToolTipText(MessageUtil.getString("Readme_Editor_Action1")); action1.setDisabledImageDescriptor(ReadmeImages.EDITOR_ACTION1_IMAGE_DISABLE); action1.setImageDescriptor(ReadmeImages.EDITOR_ACTION1_IMAGE_ENABLE); ... action2 = new RetargetAction(IReadmeConstants.RETARGET2, MessageUtil.getString("Editor_Action2")); action2.setToolTipText(MessageUtil.getString("Readme_Editor_Action2")); action2.setDisabledImageDescriptor(ReadmeImages.EDITOR_ACTION2_IMAGE_DISABLE); action2.setImageDescriptor(ReadmeImages.EDITOR_ACTION2_IMAGE_ENABLE); ... action3 = new LabelRetargetAction(IReadmeConstants.LABELRETARGET3, MessageUtil.getString("Editor_Action3")); action3.setDisabledImageDescriptor(ReadmeImages.EDITOR_ACTION3_IMAGE_DISABLE); action3.setImageDescriptor(ReadmeImages.EDITOR_ACTION3_IMAGE_ENABLE); ... }
Имена и значки для действий задаются в коде, а не в plugin.xml. (Пока мы проигнорировали различия между классами действий, так как рассматриваем действия с изменяемыми целями).
Обратите внимание на то, как похожа информация о действии на информацию о viewActions, которая встретилась нам в коде для действия Просмотр. Действия задаются посредством кода, так как нам требуется управлять распределением действий между различными экземплярами одного редактора. При создании действий в конструкторе они не зависят от каких-либо определенных экземпляров редактора.
Когда редактор становится активным и у него есть действия, которые необходимо установить в меню и панели инструментов рабочей среды, дополняющему классу отправляется сообщение setActiveEditor . Дополняющий класс подключает действия редактора к определенному редактору.
public void setActiveEditor(IEditorPart editor) { ... action1.setActiveEditor(editor); ... }
Как мы видим, действие отображается в меню и панели инструментов рабочей среды, когда редактор readme становится активным.
Эти элементы меню и панели инструментов отображаются только тогда, когда редактор активен. Расположение элементов меню и панели инструментов можно указать, как описано в разделе Пути меню и панели инструментов.
Сам по себе редактор readme ReadmeEditor не очень сложный. Он расширяет класс TextEditor, благодаря чему он может добавить настраиваемую страницу содержимого схемы в панель Схема при редактировании файла readme. Он не изменяет действия внутри текстового редактора.
Редакторы часто имеют соответствующие схемы содержимого, дающие структурированное представление содержимого редактора и помогающие просматривать содержимое редактора. Дополнительные сведения по этому вопросу содержатся в разделе Страницы схематического представления.
Мы рассмотрим реализацию текстовых редакторов в разделе Текстовые редакторы и текст платформы.