org.eclipse.ui.views

Панель - это компонент рабочей среды, с помощью которой можно просматривать структуру или параметры объекта.   На странице рабочей среды может быть открыт только один экземпляр какой-либо панели.   Когда пользователь делает выбор или вносит другие изменения в панель, эти изменения немедленно отражаются в рабочей среде. Панели часто используются в связке с соответствующими редакторами.   Например, панель Схема отображает структуру информации в редакторе.  Панель Свойства отображает свойства редактируемого объекта.

Точка расширения 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, мы можем использовать и другие методы для обработки выбора.   Дополнительные сведения об обработке и анализе файлов приведены в разделах о ReadmeModelFactoryMarkElement и DefaultSectionsParser.

В этом примере мы познакомились со многими концепциями рабочей среды. Теперь перейдем к знакомству с другими расширениями рабочей среды и узнаем, как модуль может внести другие дополнения в пользовательский интерфейс рабочей среды.