MenuConfig
MenuConfig – это специальный класс, который загружает структуру главного меню на основе файла, указанного в свойстве jmix.ui.menu-config.
| Используйте Дизайнер меню Studio для определения структуры меню. |
При создании нового проекта в Studio генерируется файл menu.xml, определяющий структуру главного меню приложения.
<menu-config xmlns="http://jmix.io/schema/ui/menu">
<menu id="application"
caption="msg://ui.ex2/menu.application"
description="Application menu items"
expanded="true"
icon="VIEW_ACTION"
insertBefore="administration">
<item id="User.browse"/>
<separator/>
<item screen="sample_CustomerScreen"
caption="msg://ui.ex2.screen.customer/customerScreen.caption"/>
<item screen="sample_City.browse" id="cities"/>
</menu>
</menu-config>
Существует два режима загрузки файлов, которые определяют структуру меню: composite (по умолчанию) и single.
Используйте свойство jmix.ui.composite-menu для переключения между режимами.
Давайте детально рассмотрим файл menu.xml.
menu-config – это корневой XML-элемент. Элементы menu-config образуют древовидную структуру, где элементы menu являются ветвями, а элементы item и separator - листьями.
Атрибуты меню
menu – это вложенный элемент menu-config. Он обладает следующими атрибутами:
-
id- уникальный идентификатор элемента. -
caption- заголовок элемента меню. Если он не задан, заголовок будет определяться в соответствии с правилом, описанным ниже. -
description- текст, отображаемый в виде всплывающей подсказки при наведении курсора мыши. Вы можете использовать локализованные сообщения из пакета сообщений. -
icon- значок элементаmenu. Подробнее см. в разделе Значки. -
insertBefore,insertAfter- определяют, должен ли элемент быть вставлен до или после определенного элемента или пункта меню с указанным идентификатором. Эти атрибуты используются для вставки элемента в соответствующее место в меню, определенном в файлах дополнений. Не используйте атрибутыinsertBeforeиinsertAfterодновременно. -
stylename- определяет название стиля для пункта меню. Подробнее см. в разделе Темы. -
expanded- определяет, должен ли элементmenuбыть развернут при открытии главного экрана. Значение по умолчанию -false.
Например:
<menu id="application"
caption="msg://ui.ex2/menu.application"
description="Application menu items"
expanded="true"
icon="VIEW_ACTION"
insertBefore="administration">
</menu>
Атрибуты Item
item – это вложенный элемент menu. Он обладает следующими атрибутами:
-
id- уникальный идентификатор элемента. Если атрибутыscreen,bean,classне определены,idиспользуется для указания на экран с тем жеid. Когда пользователь нажимает на пункт меню, на главном экране открывается соответствующий экран.<item id="User.browse"/> -
caption- заголовок элементаitem. Если значение не задано, заголовок будет определяться в соответствии с правилом, описанным ниже.<item screen="sample_CustomerScreen" caption="msg://ui.ex2.screen.customer/customerScreen.caption"/> -
description- текст, который отображается в виде всплывающей подсказки при наведении курсора мыши. Вы также можете использовать локализованные сообщения из пакета сообщений. -
screen- идентификатор экрана. Его можно использовать для многократного включения одного экрана в меню. Когда пользователь нажимает на пункт меню, на главном экране открывается соответствующий экран.<item screen="sample_City.browse" id="cities"/> <item screen="sample_City.browse" id="cities2"/> -
bean- имя бина. Должен использоваться вместе сbeanMethod. Метод бина вызывается, когда пользователь нажимает на пункт меню.menu.xml<item bean="sample_MenuBean" beanMethod="showCityBrowse" caption="Show Cities"/>MenuBean.java@Component("sample_MenuBean") public class MenuBean { @Autowired private ScreenBuilders screenBuilders; public void showCityBrowse(){ final Screen frameOwner = AppUI.getCurrent() .getTopLevelWindowNN().getFrameOwner(); screenBuilders.screen(frameOwner) .withScreenClass(CityBrowse.class) .build() .show(); } }Вы можете передать параметры из пункта меню в метод бина, используя вложенный элемент properties. Например:
menu.xml<item bean="sample_MenuBean" beanMethod="openLink" id="openBeanWithParams" caption="OpenBeanWithParams"> <properties> <property name="url" value="https://jmix.io"/> </properties> </item>MenuBean.java@Component("sample_MenuBean") public class MenuBean { @Autowired private ObjectProvider<WebBrowserTools> webBrowserToolsProvider; public void openLink(Map<String, Object> parameters) { String url = (String) parameters.get("url"); if (url == null) { return; } webBrowserToolsProvider.getObject().showWebPage( url, ParamsMap.of("target", "_blank")); } } -
class- полное имя класса, который реализует интерфейсMenuItemRunnable. Когда пользователь нажимает на пункт меню, создается экземпляр указанного класса и вызывается его метод.menu.xml<item class="ui.ex2.app.CustomMenu" id="jmix" caption="Open page"/>CustomMenu.javapublic class CustomMenu implements MenuItemRunnable, ApplicationContextAware { private ApplicationContext applicationContext; public void openLink(String url) { applicationContext.getBean(WebBrowserTools.class) .showWebPage(url, ParamsMap.of("target", "_blank")); } @Override public void run(FrameOwner origin, MenuItem menuItem) { if (menuItem.getId().equals("jmix")) { openLink("https://jmix.io"); } else { openLink("https://google.com"); } } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } } -
shortcut- сочетание клавиш для данного пункта меню. Возможные модификаторы -ALT,CTRL,SHIFT- разделяются знаком “-”. Например:<item screen="sample_City.browse" id="cities3" shortcut="ALT-C"/>Сочетания клавиш также можно настроить в файле
application.propertiesи затем следующим образом использовать в файлеmenu.xml:menu.xml<item screen="sample_City.browse" id="cities4" shortcut="${sample.menu.city}"/>application.propertiessample.menu.city=ALT-CTRL-C -
Атрибут
openModeопределяет, как будет открываться экран. Он соответствует перечислениюOpenModeсо значениями:NEW_TAB,DIALOG,NEW_WINDOW. Значение по умолчанию -NEW_TAB.<item screen="sample_City.browse" id="cities5" openMode="DIALOG"/> -
icon- значок элементаitem. Подробнее см. в Значки. -
insertBefore,insertAfter- определяют, должен ли элемент быть вставлен до или после определенного элемента или пункта меню с указанным идентификатором. -
resizable- относится только к режиму открытия окнаDIALOG. Управляет возможностью изменения размера окна. Возможные значения −true,false. По умолчанию главное меню не влияет на возможность изменять размер диалоговых окон. -
stylename- определяет название стиля для пункта меню. Подробнее см. в Темы.
Свойства Item
properties – это вложенный элемент item. Он определяет набор свойств для передачи публичным сеттерам экрана. Каждое свойство определяется в элементе property с атрибутом name, который соответствует методу сеттера. Сеттеры вызываются фреймворком между отправкой AfterInitEvent и BeforeShowEvent.
Атрибуты property:
-
name- название свойства. -
value- значениеpropertyдля свойств, не являющихся сущностями. -
entityClass- класс свойства сущности. -
entityId- идентификатор свойства сущности. -
entityFetchPlan- необязательный фетч-план для загрузки свойства сущности.
Например, логическое свойство filterVisible в menu.xml соответствует недействительному методу setFilterVisible(Boolean value) в контроллере экрана:
<item screen="sample_City.browse" id="cities6">
<properties>
<property name="filterVisible" value="false"/>
</properties>
</item>
public void setFilterVisible(Boolean value){
isFilterVisible = value;
}
Пример со свойством сущности:
<item screen="User.edit" caption="User screen">
<properties>
<property name="user"
entityClass="ui.ex2.entity.User"
entityId="60885987-1b61-4247-94c7-dff348347f93"
entityFetchPlan="_base"/>
</properties>
</item>
Определение заголовка меню
Если атрибут caption не указан, локализованное имя элемента menu или item определяется следующим образом: к идентификатору элемента добавляется префикс menu-config с точкой в конце; результирующая строка используется в качестве ключа для пакета сообщений. Например:
menu-config.User.browse = Users
menu-config.cities = Cities
Если id не задан, заголовок будет сгенерирован на основе имени класса (если установлен атрибут class) или имени бина и имени метода бина (если установлен атрибут bean). Поэтому рекомендуется все же установить атрибут id.