Search in sources :

Example 16 with Frame

use of io.jmix.ui.component.Frame in project jmix by jmix-framework.

the class HasWindowManager method openFrame.

/**
 * Load a frame registered in {@code screens.xml} and optionally show it inside a parent component of this
 * frame. <br> It is recommended to use {@link Fragments} bean instead.
 *
 * @param parent      if specified, all parent's sub components will be removed and the frame will be added
 * @param windowAlias frame ID as defined in {@code screens.xml}
 * @return frame's controller instance
 */
@Deprecated
default Frame openFrame(@Nullable Component parent, String windowAlias) {
    WindowConfig windowConfig = AppBeans.get(WindowConfig.class);
    WindowInfo windowInfo = windowConfig.getWindowInfo(windowAlias);
    Frame parentFrame;
    if (this instanceof LegacyFrame) {
        parentFrame = ((LegacyFrame) this).getWrappedFrame();
    } else {
        parentFrame = ((Frame) this);
    }
    return getWindowManager().openFrame(parentFrame, parent, windowInfo);
}
Also used : Frame(io.jmix.ui.component.Frame) LegacyFrame(com.haulmont.cuba.gui.screen.compatibility.LegacyFrame) LegacyFrame(com.haulmont.cuba.gui.screen.compatibility.LegacyFrame)

Example 17 with Frame

use of io.jmix.ui.component.Frame in project jmix by jmix-framework.

the class FieldGroupLoader method getWindowId.

@Nullable
protected String getWindowId(Context context) {
    if (context instanceof ComponentContext) {
        Frame frame = getComponentContext().getFrame();
        Screen screen = UiControllerUtils.getScreen(frame.getFrameOwner());
        return screen.getId();
    }
    return null;
}
Also used : Frame(io.jmix.ui.component.Frame) LegacyFrame(com.haulmont.cuba.gui.screen.compatibility.LegacyFrame) Screen(io.jmix.ui.screen.Screen) Nullable(javax.annotation.Nullable)

Example 18 with Frame

use of io.jmix.ui.component.Frame in project jmix by jmix-framework.

the class FieldGroupLoader method loadField.

protected FieldGroup.FieldConfig loadField(Element element, Datasource ds, String columnWidth) {
    String id = element.attributeValue("id");
    String property = element.attributeValue("property");
    if (Strings.isNullOrEmpty(id) && Strings.isNullOrEmpty(property)) {
        throw new GuiDevelopmentException(String.format("id/property is not defined for field of FieldGroup '%s'. " + "Set id or property attribute.", resultComponent.getId()), context);
    }
    if (Strings.isNullOrEmpty(property)) {
        property = id;
    } else if (Strings.isNullOrEmpty(id)) {
        id = property;
    }
    Datasource targetDs = ds;
    Datasource datasource = loadDatasource(element);
    if (datasource != null) {
        targetDs = datasource;
    }
    CollectionDatasource optionsDs = null;
    String optDsName = element.attributeValue("optionsDatasource");
    if (StringUtils.isNotBlank(optDsName)) {
        LegacyFrame frame = (LegacyFrame) getComponentContext().getFrame().getFrameOwner();
        DsContext dsContext = frame.getDsContext();
        optionsDs = findDatasourceRecursively(dsContext, optDsName);
        if (optionsDs == null) {
            throw new GuiDevelopmentException(String.format("Options datasource %s not found for field %s", optDsName, id), context);
        }
    }
    boolean customField = false;
    String custom = element.attributeValue("custom");
    if (StringUtils.isNotEmpty(custom)) {
        customField = Boolean.parseBoolean(custom);
    }
    if (StringUtils.isNotEmpty(element.attributeValue("generator"))) {
        customField = true;
    }
    List<Element> elements = element.elements();
    List<Element> customElements = elements.stream().filter(e -> !("formatter".equals(e.getName()) || "validator".equals(e.getName()))).collect(Collectors.toList());
    if (!customElements.isEmpty()) {
        if (customElements.size() > 1) {
            throw new GuiDevelopmentException(String.format("FieldGroup field %s element cannot contains two or more custom field definitions", id), context);
        }
        if (customField) {
            throw new GuiDevelopmentException(String.format("FieldGroup field %s cannot use both custom/generator attribute and inline component definition", id), context);
        }
        customField = true;
    }
    if (!customField && targetDs == null) {
        throw new GuiDevelopmentException(String.format("Datasource is not defined for FieldGroup field '%s'. " + "Only custom fields can have no datasource.", property), context);
    }
    FieldGroup.FieldConfig field = resultComponent.createField(id);
    if (property != null) {
        field.setProperty(property);
    }
    if (datasource != null) {
        field.setDatasource(datasource);
    }
    if (optionsDs != null) {
        field.setOptionsDatasource(optionsDs);
    }
    String stylename = element.attributeValue("stylename");
    if (StringUtils.isNotEmpty(stylename)) {
        field.setStyleName(stylename);
    }
    MetaPropertyPath metaPropertyPath = null;
    if (targetDs != null && property != null) {
        MetaClass metaClass = targetDs.getMetaClass();
        metaPropertyPath = getMetadataTools().resolveMetaPropertyPathOrNull(targetDs.getMetaClass(), property);
        if (metaPropertyPath == null) {
            if (!customField) {
                throw new GuiDevelopmentException(String.format("Property '%s' is not found in entity '%s'", property, metaClass.getName()), context);
            }
        }
    }
    String propertyName = metaPropertyPath != null ? metaPropertyPath.getMetaProperty().getName() : null;
    if (metaPropertyPath != null && DynAttrUtils.isDynamicAttributeProperty(propertyName)) {
        String attributeCode = DynAttrUtils.getAttributeCodeFromProperty(propertyName);
        getDynAttrMetadata().getAttributes(metaPropertyPath.getMetaClass()).stream().filter(attr -> Objects.equals(attributeCode, attr.getCode())).findFirst().ifPresent(attr -> {
            field.setCaption(getMessageBundleTools().getLocalizedValue(attr.getNameMsgBundle(), attr.getName()));
            field.setDescription(getMessageBundleTools().getLocalizedValue(attr.getDescriptionsMsgBundle(), attr.getDescription()));
        });
    } else {
        loadCaption(field, element);
        if (field.getCaption() == null) {
            field.setCaption(getDefaultCaption(field, targetDs));
        }
    }
    loadDescription(field, element);
    loadContextHelp(field, element);
    field.setXmlDescriptor(element);
    Formatter formatter = loadFormatter(element);
    if (formatter != null) {
        field.setFormatter(formatter);
    }
    String defaultWidth = element.attributeValue("width");
    if (StringUtils.isEmpty(defaultWidth)) {
        defaultWidth = columnWidth;
    }
    loadWidth(field, defaultWidth);
    if (customField) {
        field.setCustom(true);
    }
    String required = element.attributeValue("required");
    if (StringUtils.isNotEmpty(required)) {
        field.setRequired(Boolean.parseBoolean(required));
    }
    String requiredMsg = element.attributeValue("requiredMessage");
    if (requiredMsg != null) {
        requiredMsg = loadResourceString(requiredMsg);
        field.setRequiredMessage(requiredMsg);
    }
    String tabIndex = element.attributeValue("tabIndex");
    if (StringUtils.isNotEmpty(tabIndex)) {
        field.setTabIndex(Integer.parseInt(tabIndex));
    }
    loadInputPrompt(field, element);
    if (customElements.size() == 1) {
        // load nested component defined as inline
        Element customFieldElement = customElements.get(0);
        LayoutLoader loader = getLayoutLoader();
        ComponentLoader childComponentLoader = loader.createComponent(customFieldElement);
        childComponentLoader.loadComponent();
        Component customComponent = childComponentLoader.getResultComponent();
        String inlineAttachMode = element.attributeValue("inlineAttachMode");
        if (StringUtils.isNotEmpty(inlineAttachMode)) {
            field.setComponent(customComponent, FieldGroup.FieldAttachMode.valueOf(inlineAttachMode));
        } else {
            field.setComponent(customComponent);
        }
    }
    return field;
}
Also used : Datasource(com.haulmont.cuba.gui.data.Datasource) EmbeddedDatasource(com.haulmont.cuba.gui.data.EmbeddedDatasource) CollectionDatasource(com.haulmont.cuba.gui.data.CollectionDatasource) Iterables(com.google.common.collect.Iterables) MetaClass(io.jmix.core.metamodel.model.MetaClass) java.util(java.util) FieldGroupFieldFactory(com.haulmont.cuba.gui.components.FieldGroupFieldFactory) Datasource(com.haulmont.cuba.gui.data.Datasource) DynamicAttributesGuiTools(com.haulmont.cuba.gui.dynamicattributes.DynamicAttributesGuiTools) Formatter(io.jmix.ui.component.formatter.Formatter) ComponentLoader(io.jmix.ui.xml.layout.ComponentLoader) Security(com.haulmont.cuba.core.global.Security) ComponentLoaderHelper(com.haulmont.cuba.gui.xml.data.ComponentLoaderHelper) MetaPropertyPath(io.jmix.core.metamodel.model.MetaPropertyPath) DynAttrMetadata(io.jmix.dynattr.DynAttrMetadata) Frame(io.jmix.ui.component.Frame) BooleanUtils(org.apache.commons.lang3.BooleanUtils) StringUtils(org.apache.commons.lang3.StringUtils) EntityOp(io.jmix.core.security.EntityOp) Strings(com.google.common.base.Strings) Component(io.jmix.ui.component.Component) LayoutLoader(io.jmix.ui.xml.layout.loader.LayoutLoader) EmbeddedDatasource(com.haulmont.cuba.gui.data.EmbeddedDatasource) MetadataTools(io.jmix.core.MetadataTools) FieldGroup(com.haulmont.cuba.gui.components.FieldGroup) DsContext(com.haulmont.cuba.gui.data.DsContext) Nullable(javax.annotation.Nullable) LegacyFrame(com.haulmont.cuba.gui.screen.compatibility.LegacyFrame) DynAttrUtils(io.jmix.dynattr.DynAttrUtils) Screen(io.jmix.ui.screen.Screen) DeclarativeFieldGenerator(com.haulmont.cuba.gui.xml.DeclarativeFieldGenerator) Collectors(java.util.stream.Collectors) UiControllerUtils(io.jmix.ui.screen.UiControllerUtils) Consumer(java.util.function.Consumer) GuiDevelopmentException(io.jmix.ui.GuiDevelopmentException) AttributeDefinition(io.jmix.dynattr.AttributeDefinition) MsgBundleTools(io.jmix.dynattr.MsgBundleTools) EntityAttrAccess(com.haulmont.cuba.security.entity.EntityAttrAccess) FieldCaptionAlignment(com.haulmont.cuba.gui.components.FieldGroup.FieldCaptionAlignment) Element(org.dom4j.Element) UiComponents(com.haulmont.cuba.gui.UiComponents) MetaProperty(io.jmix.core.metamodel.model.MetaProperty) MessageTools(io.jmix.core.MessageTools) CollectionDatasource(com.haulmont.cuba.gui.data.CollectionDatasource) LayoutLoader(io.jmix.ui.xml.layout.loader.LayoutLoader) DsContext(com.haulmont.cuba.gui.data.DsContext) FieldGroup(com.haulmont.cuba.gui.components.FieldGroup) CollectionDatasource(com.haulmont.cuba.gui.data.CollectionDatasource) Formatter(io.jmix.ui.component.formatter.Formatter) Element(org.dom4j.Element) LegacyFrame(com.haulmont.cuba.gui.screen.compatibility.LegacyFrame) MetaPropertyPath(io.jmix.core.metamodel.model.MetaPropertyPath) ComponentLoader(io.jmix.ui.xml.layout.ComponentLoader) MetaClass(io.jmix.core.metamodel.model.MetaClass) GuiDevelopmentException(io.jmix.ui.GuiDevelopmentException) Component(io.jmix.ui.component.Component)

Example 19 with Frame

use of io.jmix.ui.component.Frame in project jmix by jmix-framework.

the class DeclarativeFieldGenerator method generateField.

@Override
public Component generateField(Datasource datasource, String propertyId) {
    Frame frame = fieldGroup.getFrame();
    if (frame == null) {
        throw new IllegalStateException("Table should be attached to frame");
    }
    FrameOwner controller = frame.getFrameOwner();
    if (controller instanceof LegacyFragmentAdapter) {
        controller = ((LegacyFragmentAdapter) controller).getRealScreen();
    }
    Class<? extends FrameOwner> cCls = controller.getClass();
    Method exactMethod = getAccessibleMethod(cCls, methodName, Datasource.class, String.class);
    if (exactMethod != null) {
        checkGeneratorMethodResultType(exactMethod, frame);
        try {
            return (Component) exactMethod.invoke(controller, datasource, propertyId);
        } catch (Exception e) {
            throw new RuntimeException("Exception in declarative FieldGroup Field generator " + methodName, e);
        }
    }
    Method dsMethod = getAccessibleMethod(cCls, methodName, Datasource.class);
    if (dsMethod != null) {
        checkGeneratorMethodResultType(dsMethod, frame);
        try {
            return (Component) dsMethod.invoke(controller, datasource);
        } catch (Exception e) {
            throw new RuntimeException("Exception in declarative FieldGroup Field generator " + methodName, e);
        }
    }
    Method parameterLessMethod = getAccessibleMethod(cCls, methodName);
    if (parameterLessMethod != null) {
        checkGeneratorMethodResultType(parameterLessMethod, frame);
        try {
            return (Component) parameterLessMethod.invoke(controller);
        } catch (Exception e) {
            throw new RuntimeException("Exception in declarative FieldGroup Field generator " + methodName, e);
        }
    }
    String fieldGroupId = fieldGroup.getId() == null ? "" : fieldGroup.getId();
    throw new IllegalStateException(String.format("No suitable method named %s for column generator of table %s", methodName, fieldGroupId));
}
Also used : Frame(io.jmix.ui.component.Frame) FrameOwner(io.jmix.ui.screen.FrameOwner) MethodUtils.getAccessibleMethod(org.apache.commons.lang3.reflect.MethodUtils.getAccessibleMethod) Method(java.lang.reflect.Method) LegacyFragmentAdapter(com.haulmont.cuba.gui.components.compatibility.LegacyFragmentAdapter) Component(io.jmix.ui.component.Component) GuiDevelopmentException(io.jmix.ui.GuiDevelopmentException)

Example 20 with Frame

use of io.jmix.ui.component.Frame in project jmix by jmix-framework.

the class PivotScreenBuilder method build.

/**
 * @return created screen
 */
public Screen build() {
    Frame frame = target.getFrame();
    if (frame == null) {
        throw new IllegalStateException(String.format("ShowPivotManager cannot be used by component '%s' which is not added to frame", target.getId()));
    }
    FrameOwner origin = frame.getFrameOwner();
    Screens screens = getScreenContext(origin).getScreens();
    if (dataItems == null) {
        dataItems = Collections.emptyList();
    }
    Map<String, String> properties = getPropertiesWithLocale();
    MapScreenOptions options = new MapScreenOptions(ParamsMap.of("dataItems", dataItems, "properties", properties, "nativeJson", nativeJson));
    return screens.create(SCREEN_ID, OpenMode.NEW_TAB, options);
}
Also used : Frame(io.jmix.ui.component.Frame) FrameOwner(io.jmix.ui.screen.FrameOwner) MapScreenOptions(io.jmix.ui.screen.MapScreenOptions) Screens(io.jmix.ui.Screens)

Aggregations

Frame (io.jmix.ui.component.Frame)24 LegacyFrame (com.haulmont.cuba.gui.screen.compatibility.LegacyFrame)6 Component (io.jmix.ui.component.Component)5 FrameOwner (io.jmix.ui.screen.FrameOwner)4 Screen (io.jmix.ui.screen.Screen)4 MetaClass (io.jmix.core.metamodel.model.MetaClass)3 GuiDevelopmentException (io.jmix.ui.GuiDevelopmentException)3 Window (io.jmix.ui.component.Window)3 CollectionDatasource (com.haulmont.cuba.gui.data.CollectionDatasource)2 MetaProperty (io.jmix.core.metamodel.model.MetaProperty)2 ContainerDataUnit (io.jmix.ui.component.data.meta.ContainerDataUnit)2 EntityDataUnit (io.jmix.ui.component.data.meta.EntityDataUnit)2 CollectionContainer (io.jmix.ui.model.CollectionContainer)2 ScreenSettingsFacet (io.jmix.ui.settings.facet.ScreenSettingsFacet)2 Nullable (javax.annotation.Nullable)2 Strings (com.google.common.base.Strings)1 Iterables (com.google.common.collect.Iterables)1 Security (com.haulmont.cuba.core.global.Security)1 UiComponents (com.haulmont.cuba.gui.UiComponents)1 AbstractWindow (com.haulmont.cuba.gui.components.AbstractWindow)1