При добавлении аддона табов перестает работать меню без табов

Проблема такая что у нас есть свой аддон. Многие экраны там сейчас открываются в диалоге для передачи dataContext (1 главный экран в котором происходит сохранение открывает подэкраны в которых происходит редактирование сущностей).

Хотели в аддон добавить возможность открытия таких подэкранов в табе или в том же экране. Где появляется список открытых экранов по типу.
image

То есть в аддоне есть проверка

    public static Component getParentWindow(Component component) {
        if (component == null) return null;
        Component parent = component.getParent().orElse(null);

        if (parent instanceof StandardMainView || parent instanceof Dialog) return parent;
        else return getParentWindow(parent);
    }

    public static boolean isTabbedMenu(View view) {
        Component window = getParentWindow(view);
        return window instanceof StandardTabbedModeMainView;
    }

(Не уверен что такое работает. Не тестил еще)
В общем логика такая что если isTabbedMenu = true то открываем экраны через

viewBuilders.detail(this, Entity.class, EntityEditScreen.class)
                    .editEntity(entity)
                    .withParentDataContext(dataContext)
                    .withOpenMode(ViewOpenMode.THIS_TAB)

Если isTabbedMenu = false то.

        dialogWindows.detail(this, Entity.class)
                .withViewClass(EntityEditScreen.class)
                .editEntity(entity)
                .withParentDataContext(dataContext)

Но при добавлении в наш аддон стартер jmix-tabbedmode-flowui-starter и при запуске приложения с аддон в обычном меню падает ошибка

java.lang.ClassCastException: com.demo.view.main.MainView cannot be cast to class io.jmix.tabbedmode.app.main.StandardTabbedModeMainView (com.demo.view.main.MainView and io.jmix.tabbedmode.app.main.StandardTabbedModeMainView are in unnamed module of loader 'app')
	at io.jmix.tabbedmode.xml.layout.loader.TabbedModeMainViewLoader.createContent(TabbedModeMainViewLoader.java:51) ~[jmix-tabbedmode-flowui-2.5.0.jar:na]
	at io.jmix.flowui.xml.layout.loader.LayoutLoader.createViewContent(LayoutLoader.java:140) ~[jmix-flowui-2.5.0.jar:na]
	at io.jmix.flowui.sys.ViewSupport.loadWindowFromXml(ViewSupport.java:448) ~[jmix-flowui-2.5.0.jar:na]
	at io.jmix.flowui.sys.ViewSupport.initView(ViewSupport.java:123) ~[jmix-flowui-2.5.0.jar:na]
	at io.jmix.flowui.sys.vaadin.JmixSpringInstantiator.init(JmixSpringInstantiator.java:65) ~[jmix-flowui-2.5.0.jar:na]
	at io.jmix.flowui.sys.vaadin.JmixSpringInstantiator.getOrCreate(JmixSpringInstantiator.java:58) ~[jmix-flowui-2.5.0.jar:na]
	at io.jmix.tabbedmode.Views.createInternal(Views.java:129) ~[jmix-tabbedmode-flowui-2.5.0.jar:na]
	at io.jmix.tabbedmode.Views.create(Views.java:117) ~[jmix-tabbedmode-flowui-2.5.0.jar:na]
	at io.jmix.tabbedmode.Views.create(Views.java:123) ~[jmix-tabbedmode-flowui-2.5.0.jar:na]
	at io.jmix.tabbedmode.builder.AbstractViewBuilderProcessor.createView(AbstractViewBuilderProcessor.java:42) ~[jmix-tabbedmode-flowui-2.5.0.jar:na]
	at io.jmix.tabbedmode.builder.ViewBuilderProcessor.build(ViewBuilderProcessor.java:35) ~[jmix-tabbedmode-flowui-2.5.0.jar:na]
	at io.jmix.tabbedmode.builder.AbstractViewBuilder.build(AbstractViewBuilder.java:114) ~[jmix-tabbedmode-flowui-2.5.0.jar:na]
	at io.jmix.tabbedmode.builder.AbstractViewBuilder.open(AbstractViewBuilder.java:120) ~[jmix-tabbedmode-flowui-2.5.0.jar:na]
	at io.jmix.tabbedmode.builder.navigation.TabbedModeViewNavigationProcessor.processNavigation(TabbedModeViewNavigationProcessor.java:55) ~[jmix-tabbedmode-flowui-2.5.0.jar:na]
	at io.jmix.tabbedmode.builder.navigation.TabbedModeViewNavigationProcessor.processNavigation(TabbedModeViewNavigationProcessor.java:32) ~[jmix-tabbedmode-flowui-2.5.0.jar:na]
	at io.jmix.flowui.view.navigation.AbstractViewNavigator.navigate(AbstractViewNavigator.java:164) ~[jmix-flowui-2.5.0.jar:na]
	at io.jmix.securityflowui.authentication.LoginViewSupport.navigateToMainView(LoginViewSupport.java:344) ~[jmix-security-flowui-2.5.0.jar:na]
	at io.jmix.tabbedmode.security.authentication.TabbedModeLoginViewSupport.showInitialView(TabbedModeLoginViewSupport.java:47) ~[jmix-tabbedmode-flowui-2.5.0.jar:na]
	at io.jmix.securityflowui.authentication.LoginViewSupport.onSuccessfulAuthentication(LoginViewSupport.java:245) ~[jmix-security-flowui-2.5.0.jar:na]
	at io.jmix.securityflowui.authentication.LoginViewSupport.authenticate(LoginViewSupport.java:210) ~[jmix-security-flowui-2.5.0.jar:na]
	at com.demo.view.login.LoginView.onLogin(LoginView.java:90) ~[main/:na]

Добрый день.

К сожалению, трубно сказать, что не так без дебага. Если Вы приложите демо проект в котором проблема воспроизводится, мы попробуем разобраться.

Глеб

Как я понимаю. Если просто создать проект с нуля, добавить в gradle implementation 'io.jmix.tabbedmode:jmix-tabbedmode-flowui-starter', а меню оставить StandardMainView то ошибка будет воспроизводится. (ошибка падает при попытке логина)

Просто проект получает доступ к аддону табов из аддона (назовем его add1) в который табы добавлены.

Можно добавить exclude group: 'io.jmix.tabbedmode', module: 'jmix-tabbedmode-flowui-starter' при добавлении add1 в проект. Но тогда проверка window instanceof StandardTabbedModeMainView будет падать по NoClassDefFoundError

Еще вопрос… Как я понял моя проверка isTabbedMenu работать не будет, если в данный момент экран открыт в диалоге. Есть вариант как легко можно получить класс MainView из аддона чтоб проверить его на StandardTabbedModeMainView?

Если надо воспроизвести ошибку именно с аддоном. То просто создать композитный проект с 1 аддоном и добавить в аддон зависимость от табов.

jmix-test.zip (1.0 МБ)

При подключении tabmod’a главный экран обязан наследоваться от StandardTabbedModeMainView, т.к. переопределяется UI класс и отключается Ваадиновская навигация.

Да. Но хотелось бы чтоб в аддоне можно было определять какой мод используется. Таб или стандартный. И в зависимости от этого открывать окна либо в диалоге, либо в табе.

Мб для аддонов можно придумать какую-то легковестную версию? Вынести viewBuilders и добавить возможность определять тип меню в отдельный аддон?

Вам в таком случае проще именно свой аддон сделать более модульным. Вынести базовую часть и два ответвления для route based и tabbed based режимов и подключать в конечный проект или один или другой.