Пакет org.eclipse.jface.resource содержит определения классов, с помощью которых модули могут управлять такими ресурсами пользовательского интерфейса, как шрифты и значки.
Многие точки расширения рабочей среды позволяют модулям добавлять значки для отображения связанных элементов в рабочей среде. Поскольку операционные системы с графическим пользовательским интерфейсом поддерживают ограниченное число изображений и шрифтов, при разработке модуля особое внимание следует уделить управлению ресурсами пользовательского интерфейса модуля. В некоторых случаях может потребоваться обеспечить их совместное использование несколькими управляющими элементами.
Ссылки на значки уже упоминались в описании модуля утилиты readme. Некоторые из них были указаны в файле 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>
Кроме того, ранее в качестве примера был приведен исходный код, динамически описывающий изображения. Ниже приведен фрагмент исходного кода метода ReadmeEditorActionBarContributor утилиты readme.
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); ...
Среда JFace предоставляет базовую поддержку классов, с помощью которых модули могут управлять значками и шрифтами. При этом соответствующие графические объекты платформы создаются и уничтожаются автоматически. Эти классы можно использовать непосредственно в модуле, как это было показано выше, либо косвенным образом. В последнем случае рабочая среда с их помощью получает изображения, описанные в тексте на языке описания точки расширения.
Класс SWT Image представляет изображение с точки зрения операционной системы. Поскольку большинство операционных систем с графическим пользовательским ограничивает число одновременно открываемых изображений, особое внимание при разработке модуля следует уделить их созданию, а также уничтожению после использования. Классы JFace ImageDescriptor и ImageRegistry позволяют модулям избежать непосредственного выполнения таких операций, как создание, уничтожение изображений и управление ими.
Класс ImageDescriptor можно применять в качестве упрощенного описания изображения. Он задает все параметры, необходимые для создания изображения, такие как URL и имя файла. ImageDescriptor выделяет фактическое изображение платформы только в том случае, если оно запрашивается методом createImage().
Дескрипторы изображений рекомендуется применять, если исходный код структурирован таким образом, что все значки заданы в одном расположении и выделяются по мере необходимости. Дескрипторы изображений можно создать в любое время, не обращая внимание на ресурсы операционной системы. Например, при необходимости все дескрипторы можно создать в ходе инициализации.
Класс ImageRegistry применяется в качестве хранилища списка изображений с именами. Клиенты могут добавлять дескрипторы изображений или изображения SWT непосредственно в этот список. В ответ на запрос изображения реестр возвращает само изображение, если оно уже создано, либо создает его в соответствии с дескриптором. Такой подход позволяет клиентам реестра совместно работать с изображениями.
Клиент не должен отвечать за уничтожение изображений, добавляемых в реестр и загружаемых из него. Поскольку изображения доступны нескольким клиентам, они управляются реестром. Изображения уничтожаются реестром в процессе завершения работы системы графического пользовательского интерфейса.
В файле plugin.xml рекомендуется указывать значки для объектов пользовательского интерфейса модулей. Для многих точек расширения рабочей среды предусмотрены параметры настройки файлов изображений. Если вместе с определением расширения в файл plugin.xml добавлены значки, то стратегия управления изображениями выбирается платформой. Поскольку значки, как правило, хранятся в каталоге модуля, такой подход позволяет указывать значки и управлять файлами из одного места.
Другие способы следует рассматривать только в том случае, если значок нельзя указать в определении расширения.
Подход, предусматривающий создание изображения явным образом, рекомендуется применять, если изображение используется редко и не является общим. Изображение можно создать непосредственно с помощью SWT и удалить после применения.
Кроме того, изображения можно создать явным образом с помощью класса ImageDescriptor, вызвав метод createImage(). Как и в первом случае для удаления ненужного изображения применяется метод dispose(). Например, если изображение создается при открытии окна диалога, после его закрытия оно должно быть удалено.
Если изображение часто используется различными объектами пользовательского интерфейса, его дескриптор рекомендуется зарегистрировать в реестре изображений ImageRegistry. Изображения, входящие в состав реестра, доступны всем объектам, запрашивающим их по имени. Поскольку изображения совместно используются несколькими объектами, их не следует удалять самостоятельно.
Размещение изображения в реестре представляет собой оптимальную стратегию в случае частого использования изображения (например, в течение срока действия модуля) несколькими объектами. Недостаток такого подхода заключается в том, что изображения удаляются из реестра только после завершения работы графического пользовательского интерфейса. Поскольку число изображений платформы (SWT), которые могут быть одновременно открыты, ограничено, рекомендуется обратить особое внимание на число изображений, регистрируемых модулями в реестре.
Класс AbstractUIPlugin задает протокол, предназначенный для создания реестра изображений, доступного на уровне модуля.
Значок, часто применяемый для представления элементов в конкретной программе просмотра, можно связать с аналогичными элементами этой программы просмотра с помощью источника меток. Поскольку источник меток отвечает за возврат изображений, связанных с объектами программы просмотра, он может управлять созданием изображений, а также совместным использованием изображений разными объектами программы просмотра.
Источник создания меток поддерживает все способы создания изображений, рассмотренные ранее. В различных реализациях метода getImage(), определенного в производных классах LabelProvider, применяется множество разных подходов. В том числе кэширование отдельного значка и создание таблицы, разделяющей изображения по типам. Изображения, созданные источником меток, следует удалять с помощью метода dispose(), который вызывается после завершения программы просмотра.
Источник меток представляет собой эффективный компромисс между явным созданием изображения и использованием реестра изображений. Он сочетает в себе возможность совместного использования значков, характерную для реестра, а также обеспечивает контроль над процессом создания и удаления изображений.
В процессе точной настройки модуля можно экспериментально проверить различные способы создания изображений. В некоторых случаях целесообразно изолировать операции, связанные с принятием решений, в отдельном классе и разрешить клиентам получать изображения только с помощью этого класса. Такой подход позволяет дополнительно настроить процедуру создания в соответствии с фактическими характеристиками производительности модуля.
Класс ResourceManager используется для хранения соответствий между изображениями и их дескрипторами, так что изображение может быть повторно использовано через его дескриптор. В ответ на запрос изображения реестр возвращает само изображение, если оно уже создано, либо создает его в соответствии с дескриптором. Такой подход позволяет клиентам реестра совместно работать с изображениями.
Главный ResourceManager - DeviceResourceManager. он создается в Display. Класс ResourceManager, определяющийся с помощью JFaceResources.getResources() - DeviceResourceManager и может быть использован как главный. Если вам нужен ResourceManager с меньшим жизненным циклом, чем DeviceResourceManager, то можно создать производный LocalResourceManager.
DeviceResourceManager автоматически уничтожается при уничтожении Display, создавшего его.
Клиент не должен отвечать за уничтожение изображений, добавляемых в администратор ресурсов и загружаемых из него. Поскольку изображения доступны нескольким клиентам, они управляются администратором ресурсов. Изображения уничтожаются реестром при уничтожении ResourceManager, хранящего их.
Шрифты представляют собой еще один пример ограниченных ресурсов операционных систем платформы. Особенности создания и удаления шрифтов, включая компромиссы между производительностью и размером, аналогичны случаю изображений. В общем случае SWT запрашивает шрифты в платформе в соответствии с заданными именами.
Класс FontRegistry содержит таблицу имен шрифтов. Он управляет выделением и удалением шрифтов.
В модулях не рекомендуется выделять и описывать шрифты, характерные для платформы. Хотя реестр шрифтов применяется в среде JFace, большинство модулей не взаимодействует с ним. Для обращения к шрифтам рекомендуется применять класс JFaceResources.
Как правило, на странице параметров пользователям разрешается настраивать шрифты приложения. Для этого с помощью FontFieldEditor следует получить имя шрифта, указанное пользователем, а с помощью FontRegistry - сохранить этот шрифт. Класс FontFieldEditor применим только на страницах параметров.
Класс JFaceResources управляет доступом к общим шрифтам и изображениям платформы. Он обслуживает внутренний реестр шрифтов и изображений, обеспечивающий совместное использование конкретных шрифтов и изображений несколькими клиентами.
Для общего доступа к изображениям в рабочей среде и отдельных модулях предусмотрено несколько способов. Реестр изображений JFaceResources не получил широкого распространения в рабочей среде и исходном коде модулей.
Применение шрифтов гораздо проще. Рабочая среда и большинство модулей запрашивают шрифты по логическому имени с помощью класса JFaceResources. Для применение шрифтов в пользовательском интерфейсе модулей предусмотрены методы getDialogFont() и getDefaultFont().