Панель - это компонент рабочей среды, с помощью которой можно просматривать структуру или параметры объекта. На странице рабочей среды может быть открыт только один экземпляр какой-либо панели. Когда пользователь делает выбор или вносит другие изменения в панель, эти изменения немедленно отражаются в рабочей среде. Панели часто используются в связке с соответствующими редакторами. Например, панель Схема отображает структуру информации в редакторе. Панель Свойства отображает свойства редактируемого объекта.
Точка расширения org.eclipse.ui.views позволяет модулям добавлять панели к рабочей среде. Модули, добавляющие панель, должны ее зарегистрировать в своем файле plugin.xml и предоставить сведения о конфигурации панели, например класс ее реализации, категорию (или группу) панелей, к которой она принадлежит, имя и значок, которые следует использовать для описания панели в меню и метках.
Интерфейс для панелей задан в IViewPart, но модули могут расширить класс ViewPart, а не создавать IViewPart с нуля.
Мы создали минимальное расширение панели в примере "hello world". Теперь давайте рассмотрим расширение, которое знает о других панелях рабочей среды и отвечает на изменения, вносимые пользователем в рабочую среду при навигации и выборе элементов. Посмотрим на объявление расширения в plugin.xml.
<extension point="org.eclipse.ui.views"> <category id="org.eclipse.ui.examples.readmetool" name="%Views.category"> </category> <view id="org.eclipse.ui.examples.readmetool.views.SectionsView" name="%Views.ReadmeSections" icon="icons/view16/sections.png" category="org.eclipse.ui.examples.readmetool" class="org.eclipse.ui.examples.readmetool.ReadmeSectionsView"> </view> </extension>
Здесь нет ничего нового. Мы видим, что новая панель ReadmeSectionsView добавлена в рабочую среду. Параметры ИД панели, имя и категория заданы так же, как и ранее. Для панели также задан значок, использующий путь относительно каталога установки модуля.
Рассмотрим ReadmeSectionsView. В рабочей среде можно отображать любые панели, с помощью меню Окно->Показать панель->Другие... , где можно выбрать нужную панель из списка Показать панель.
При выборе ReadmeSectionsView отображается панель со списком. Этот список пуст, пока мы не щелкнули на файле с расширением .readme, после чего список заполнится разделами из файла readme.
Как модуль распознает файл readme и как он узнает об изменениях выбора? Ответив на эти ответы, мы сможем понять и принцип создания интегрированных модулей рабочей среды.
Начнем со знакомого метода createPartControl. Как мы видели в примере "Hello World", именно так создаются виджеты, представляющие созданные панели. Пропустим начало кода и перейдем к делу.
public void createPartControl(Composite parent) { viewer = new ListViewer(parent); ... // добавление себя как глобального получателя запросов выбора getSite().getPage().addSelectionListener(this); // заполнение выделения selectionChanged(null, getSite().getPage().getSelection()); }
Панель создает и сохраняет ListViewer и регистрирует себя в качестве получателя запросов выбора на своей странице. Она получает страницу из IViewSite, содержащего информацию о контексте панели, например об окне рабочей среды, содержащей ее странице или модуле. Что происходит при уведомлении об изменении выбора? Выполняется следующий код:
public void selectionChanged(IWorkbenchPart part, ISelection sel) { //если выбран текстовый файл, получить его разделы AdaptableList input = ReadmeModelFactory.getInstance().getSections(sel); viewer.setInput(input); }
Можно подумать, что класс ReadmeModelFactory отвечает за преобразование выбора в разделы readme, которые служат вводом для программы просмотра, созданной с помощью метода createPartControl.
Но как программа просмотра заполнила виджеты списков? Пока предположим, что после того, как программе просмотра стало известно о элементе ввода, она знает как заполнить список виджетов информацией - это же ListViewer. Если же вы хотите немедленно узнать о том, как работает программа просмотра, перейдите к разделу Программы просмотра.
Мы же все еще не знаем, как обнаруживаются файлы readme или откуда появляются сведения о разделах файла. Прояснить ситуацию поможет беглый взгляд на ReadmeModelFactory.
public AdaptableList getSections(ISelection sel) { // если sel не структурирован, выйти из метода if (!(sel instanceof IStructuredSelection)) return null; IStructuredSelection structured = (IStructuredSelection)sel; //если выбран текстовый файл, получить его разделы Object object = structured.getFirstElement(); if (object instanceof IFile) { IFile file = (IFile) object; String extension = file.getFileExtension(); if (extension != null && extension.equals(IReadmeConstants.EXTENSION)) { return getSections(file); } } //выбранный объект не является текстовым файлом return null; }
Мы проверяем выбранный элемент, чтобы убедиться, что это структурированный (множественный) выбор. (Концепция структурированного выбора исходит от программ просмотра JFace). Мы проверяем первый объект выбора, чтобы убедиться в том, что он является файлом (IFile). Если это так, мы проверяем его расширение на совпадение с ".readme". Убедившись, что это именно файл readme, мы можем использовать и другие методы для обработки выбора. Дополнительные сведения об обработке и анализе файлов приведены в разделах о ReadmeModelFactory, MarkElement и DefaultSectionsParser.
В этом примере мы познакомились со многими концепциями рабочей среды. Теперь перейдем к знакомству с другими расширениями рабочей среды и узнаем, как модуль может внести другие дополнения в пользовательский интерфейс рабочей среды.