Для более тонкой настройки расширенной темы можно создать значки, встроенные в шрифты, либо использовать готовые внешние библиотеки значков.
-
Создайте в модуле web класс
enum
, реализующий интерфейсcom.vaadin.server.FontIcon
, в который поместите новые значки:link:../../../../../source/gui/add_icons_enum.java[role=include]
-
Добавьте новые стили и файлы шрифта в расширение темы. Рекомендуется создать отдельную папку
fonts
в главном каталоге расширения темы, например,modules/web/themes/halo/com.company.demo/fonts
. Поместите в неё стили и файлы шрифтов в своих собственных подпапках, например,fonts/icomoon
.Файлы шрифта включают в себя набор следующих расширений:
-
.eot
, -
.svg
, -
.ttf
, -
.woff
.Использованный в этом примере набор шрифтов
icomoon
из открытой библиотеки представлен в виде 4 файлов:icomoon.eot
,icomoon.svg
,icomoon.ttf
,icomoon.woff
, которые используются совместно.
-
-
Создайте файл стилей, в который включите
@font-face
и CSS класс со стилем для значка. Ниже представлен пример файлаicomoon.scss
, где имя классаIcoMoon
соответствует значению, возвращаемому методомFontIcon#getFontFamily
:link:../../../../../source/gui/add_icons_icomoon.scss[role=include]
-
Подключите файл стилей шрифта в
halo-ext.scss
или другой файл расширения данной темы:link:../../../../../source/gui/add_icons_halo-ext.scss[role=include]
-
Затем создайте новый набор значков, то есть enum, реализующий интерфейс
Icons.Icon
:link:../../../../../source/gui/IcoMoonIcon.java[role=include]
-
Создайте новый
IconProvider
.Для работы с наборами значков в платформе есть механизм, основанный на использовании
IconProvider
иIconResolver
.IconProvider
- это интерфейс-маркер, доступный только в веб-модуле, который предоставляет доступ к ресурсу (com.vaadin.server.Resource
) по переданному пути.Бин
IconResolver
проходится по всем бинам, реализующимIconProvider
, в поисках того, кто может предоставить ресурс к данному значку.Чтобы использовать этот механизм, необходимо создать собственную реализацию
IconProvider
, например, так:link:../../../../../source/gui/IcoMoonIconProvider.java[role=include]
Здесь мы явно назначаем порядок для этого бина аннотацией
@Order
. -
Далее нужно зарегистрировать набор значков в файле свойств приложения:
cuba.iconsConfig = +com.company.demo.gui.icons.IcoMoonIcon
Теперь вы можете использовать значки по прямой ссылке на класс и элемент enum
в XML-дескрипторе экрана:
link:../../../../../source/gui/add_icons_usage.xml[role=include]
или в контроллере Java:
link:../../../../../source/gui/add_icons_usage.java[role=include]
В результате, новые значки добавились к кнопкам:
- Переопределение значков с помощью наборов
-
Механизм наборов значков позволяет переопределять некоторые значки из других наборов. Для этого необходимо создать и зарегистрировать новый набор значков (enumeration) с теми же именами значков (options), но с другими путями (
source
). В примере ниже создан новый наборMyIcon
, в котором переопределены стандартные значки из набораCubaIcon
.-
Стандартный набор:
link:../../../../../source/gui/CubaIcon.java[role=include]
-
Новый набор:
link:../../../../../source/gui/MyIcon.java[role=include]
-
Регистрация нового набора в
web-app.properties
:cuba.iconsConfig = +com.company.demo.gui.icons.MyIcon
Теперь вместо стандартного значка OK будет использовано новое изображение:
link:../../../../../source/gui/overridden_icon.java[role=include]
При необходимости игнорировать переопределение и использовать стандартные значки, просто используйте путь к значку вместо имени элемента перечисления:
<button caption="Created" icon="icons/create.png"/>
или
button.setIcon(CubaIcon.CREATE_ACTION.source());
-