diff --git a/packages/formdescriptioneditors/backend/sirius-components-collaborative-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/collaborative/formdescriptioneditors/handlers/AddWidgetEventHandler.java b/packages/formdescriptioneditors/backend/sirius-components-collaborative-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/collaborative/formdescriptioneditors/handlers/AddWidgetEventHandler.java index 85641ba069..d2b3482060 100644 --- a/packages/formdescriptioneditors/backend/sirius-components-collaborative-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/collaborative/formdescriptioneditors/handlers/AddWidgetEventHandler.java +++ b/packages/formdescriptioneditors/backend/sirius-components-collaborative-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/collaborative/formdescriptioneditors/handlers/AddWidgetEventHandler.java @@ -36,6 +36,9 @@ import org.eclipse.sirius.components.formdescriptioneditors.IWidgetDescriptionProvider; import org.eclipse.sirius.components.view.form.FlexDirection; import org.eclipse.sirius.components.view.form.FlexboxContainerDescription; +import org.eclipse.sirius.components.view.form.FormElementDescription; +import org.eclipse.sirius.components.view.form.FormElementFor; +import org.eclipse.sirius.components.view.form.FormElementIf; import org.eclipse.sirius.components.view.form.FormFactory; import org.eclipse.sirius.components.view.form.FormPackage; import org.eclipse.sirius.components.view.form.GroupDescription; @@ -89,14 +92,14 @@ public void handle(One payloadSink, Many changeDesc IPayload payload = new ErrorPayload(formDescriptionEditorInput.id(), message); ChangeDescription changeDescription = new ChangeDescription(ChangeKind.NOTHING, formDescriptionEditorInput.representationId(), formDescriptionEditorInput); - if (formDescriptionEditorInput instanceof AddWidgetInput) { - String containerId = ((AddWidgetInput) formDescriptionEditorInput).containerId(); - String kind = ((AddWidgetInput) formDescriptionEditorInput).kind(); - int index = ((AddWidgetInput) formDescriptionEditorInput).index(); - boolean addWidget = this.addWidget(editingContext, formDescriptionEditorContext, containerId, kind, index); - if (addWidget) { - payload = new SuccessPayload(formDescriptionEditorInput.id()); - changeDescription = new ChangeDescription(ChangeKind.SEMANTIC_CHANGE, formDescriptionEditorInput.representationId(), formDescriptionEditorInput); + if (formDescriptionEditorInput instanceof AddWidgetInput addWidgetInput) { + String containerId = addWidgetInput.containerId(); + String kind = addWidgetInput.kind(); + int index = addWidgetInput.index(); + boolean widgetAdded = this.addWidget(editingContext, containerId, kind, index); + if (widgetAdded) { + payload = new SuccessPayload(addWidgetInput.id()); + changeDescription = new ChangeDescription(ChangeKind.SEMANTIC_CHANGE, formDescriptionEditorInput.representationId(), addWidgetInput); } } @@ -104,24 +107,32 @@ public void handle(One payloadSink, Many changeDesc changeDescriptionSink.tryEmitNext(changeDescription); } - private boolean addWidget(IEditingContext editingContext, IFormDescriptionEditorContext formDescriptionEditorContext, String containerId, String kind, int index) { + private boolean addWidget(IEditingContext editingContext, String containerId, String kind, int index) { boolean success = false; var optionalSelf = this.objectService.getObject(editingContext, containerId); if (optionalSelf.isPresent()) { Object container = optionalSelf.get(); EClassifier eClassifier = this.getWidgetDescriptionType(kind); if (eClassifier instanceof EClass eClass) { - var widgetDescription = EcoreUtil.create(eClass); - if (widgetDescription instanceof FlexboxContainerDescription) { - ((FlexboxContainerDescription) widgetDescription).setFlexDirection(FlexDirection.get(kind)); + var newElement = EcoreUtil.create(eClass); + if (newElement instanceof FlexboxContainerDescription flexboxContainerDescription) { + flexboxContainerDescription.setFlexDirection(FlexDirection.get(kind)); } - if (widgetDescription instanceof WidgetDescription) { - this.createStyle((WidgetDescription) widgetDescription); - if (container instanceof GroupDescription) { - ((GroupDescription) container).getChildren().add(index, (WidgetDescription) widgetDescription); + if (newElement instanceof FormElementDescription formElementDescription) { + if (newElement instanceof WidgetDescription widgetDescription) { + this.createStyle(widgetDescription); + } + if (container instanceof GroupDescription groupDescription) { + groupDescription.getChildren().add(index, formElementDescription); + success = true; + } else if (container instanceof FlexboxContainerDescription flexboxContainerDescription) { + flexboxContainerDescription.getChildren().add(index, formElementDescription); + success = true; + } else if (container instanceof FormElementFor formElementFor) { + formElementFor.getChildren().add(index, formElementDescription); success = true; - } else if (container instanceof FlexboxContainerDescription) { - ((FlexboxContainerDescription) container).getChildren().add(index, (WidgetDescription) widgetDescription); + } else if (container instanceof FormElementIf formElementIf) { + formElementIf.getChildren().add(index, formElementDescription); success = true; } } @@ -138,7 +149,16 @@ private EClassifier getWidgetDescriptionType(String kind) { return optionalType.get(); } } - return FormPackage.eINSTANCE.getEClassifier(kind + "Description"); + + EClassifier result = null; + if (Objects.equals(FormPackage.Literals.FORM_ELEMENT_IF.getName(), kind)) { + result = FormPackage.Literals.FORM_ELEMENT_IF; + } else if (Objects.equals(FormPackage.Literals.FORM_ELEMENT_FOR.getName(), kind)) { + result = FormPackage.Literals.FORM_ELEMENT_FOR; + } else { + result = FormPackage.eINSTANCE.getEClassifier(kind + "Description"); + } + return result; } private void createStyle(WidgetDescription widgetDescription) { diff --git a/packages/formdescriptioneditors/backend/sirius-components-collaborative-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/collaborative/formdescriptioneditors/handlers/MoveWidgetEventHandler.java b/packages/formdescriptioneditors/backend/sirius-components-collaborative-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/collaborative/formdescriptioneditors/handlers/MoveWidgetEventHandler.java index 77bf5ea921..e08bef3936 100644 --- a/packages/formdescriptioneditors/backend/sirius-components-collaborative-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/collaborative/formdescriptioneditors/handlers/MoveWidgetEventHandler.java +++ b/packages/formdescriptioneditors/backend/sirius-components-collaborative-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/collaborative/formdescriptioneditors/handlers/MoveWidgetEventHandler.java @@ -28,8 +28,10 @@ import org.eclipse.sirius.components.core.api.IPayload; import org.eclipse.sirius.components.core.api.SuccessPayload; import org.eclipse.sirius.components.view.form.FlexboxContainerDescription; +import org.eclipse.sirius.components.view.form.FormElementDescription; +import org.eclipse.sirius.components.view.form.FormElementFor; +import org.eclipse.sirius.components.view.form.FormElementIf; import org.eclipse.sirius.components.view.form.GroupDescription; -import org.eclipse.sirius.components.view.form.WidgetDescription; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; @@ -101,21 +103,35 @@ private boolean moveWidget(IEditingContext editingContext, IFormDescriptionEdito if (optionalSelf.isPresent()) { Object container = optionalSelf.get(); var objectToMove = this.objectService.getObject(editingContext, widgetId); - if (objectToMove.filter(WidgetDescription.class::isInstance).isPresent()) { - WidgetDescription widgetToMove = (WidgetDescription) objectToMove.get(); + if (objectToMove.filter(FormElementDescription.class::isInstance).isPresent()) { + FormElementDescription elementToMove = (FormElementDescription) objectToMove.get(); try { - if (container instanceof GroupDescription) { - if (container.equals(widgetToMove.eContainer())) { - ((GroupDescription) container).getChildren().move(index, widgetToMove); + if (container instanceof GroupDescription groupDescription) { + if (groupDescription.equals(elementToMove.eContainer())) { + groupDescription.getChildren().move(index, elementToMove); } else { - ((GroupDescription) container).getChildren().add(index, widgetToMove); + groupDescription.getChildren().add(index, elementToMove); } success = true; - } else if (container instanceof FlexboxContainerDescription) { - if (container.equals(widgetToMove.eContainer())) { - ((FlexboxContainerDescription) container).getChildren().move(index, widgetToMove); + } else if (container instanceof FlexboxContainerDescription flexboxContainerDescription) { + if (flexboxContainerDescription.equals(elementToMove.eContainer())) { + flexboxContainerDescription.getChildren().move(index, elementToMove); } else { - ((FlexboxContainerDescription) container).getChildren().add(index, widgetToMove); + flexboxContainerDescription.getChildren().add(index, elementToMove); + } + success = true; + } else if (container instanceof FormElementFor formElementFor) { + if (formElementFor.equals(elementToMove.eContainer())) { + formElementFor.getChildren().move(index, elementToMove); + } else { + formElementFor.getChildren().add(index, elementToMove); + } + success = true; + } else if (container instanceof FormElementIf formElementIf) { + if (formElementIf.equals(elementToMove.eContainer())) { + formElementIf.getChildren().move(index, elementToMove); + } else { + formElementIf.getChildren().add(index, elementToMove); } success = true; } diff --git a/packages/formdescriptioneditors/backend/sirius-components-collaborative-formdescriptioneditors/src/main/resources/schema/formdescriptioneditor.graphqls b/packages/formdescriptioneditors/backend/sirius-components-collaborative-formdescriptioneditors/src/main/resources/schema/formdescriptioneditor.graphqls index c8fc1f8c3f..e866abdf89 100644 --- a/packages/formdescriptioneditors/backend/sirius-components-collaborative-formdescriptioneditors/src/main/resources/schema/formdescriptioneditor.graphqls +++ b/packages/formdescriptioneditors/backend/sirius-components-collaborative-formdescriptioneditors/src/main/resources/schema/formdescriptioneditor.graphqls @@ -26,6 +26,26 @@ type FormDescriptionEditorDescription implements RepresentationDescription { label: String! } +type FormDescriptionEditorFor implements Widget { + id: ID! + diagnostics: [Diagnostic!]! + hasHelpText: Boolean! + label: String! + iconURL: String + readOnly: Boolean! + children: [Widget!]! +} + +type FormDescriptionEditorIf implements Widget { + id: ID! + diagnostics: [Diagnostic!]! + hasHelpText: Boolean! + label: String! + iconURL: String + readOnly: Boolean! + children: [Widget!]! +} + extend type Mutation { addGroup(input: AddGroupInput!): AddGroupPayload! deleteGroup(input: DeleteGroupInput!): DeleteGroupPayload! diff --git a/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/FormDescriptionEditorFor.java b/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/FormDescriptionEditorFor.java new file mode 100644 index 0000000000..8ea009a896 --- /dev/null +++ b/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/FormDescriptionEditorFor.java @@ -0,0 +1,122 @@ +/******************************************************************************* + * Copyright (c) 2023 Obeo. + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.sirius.components.formdescriptioneditors; + +import java.text.MessageFormat; +import java.util.List; +import java.util.Objects; +import java.util.function.Supplier; + +import org.eclipse.sirius.components.annotations.Immutable; +import org.eclipse.sirius.components.forms.AbstractWidget; +import org.eclipse.sirius.components.forms.validation.Diagnostic; + +/** + * A widget to represent a "For" element when rendering a Form in the context of a FormDescriptionEditor. + * + * @author pcdavid + */ +@Immutable +public final class FormDescriptionEditorFor extends AbstractWidget { + private List children; + + private FormDescriptionEditorFor() { + // Prevent instantiation + } + + public List getChildren() { + return this.children; + } + + public boolean hasHelpText() { + return false; + } + + public static Builder newFormDescriptionEditorFor(String id) { + return new Builder(id); + } + + @Override + public String toString() { + String pattern = "{0} '{'id: {1}, label: {2}'}'"; + return MessageFormat.format(pattern, this.getClass().getSimpleName(), this.getId(), this.label); + } + + /** + * The builder used to create the For widget. + * + * @author pcdavid + */ + @SuppressWarnings("checkstyle:HiddenField") + public static final class Builder { + private String id; + + private String label; + + private String iconURL; + + private List diagnostics; + + private Supplier helpTextProvider; + + private boolean readOnly; + + private List children; + + private Builder(String id) { + this.id = Objects.requireNonNull(id); + } + + public Builder label(String label) { + this.label = Objects.requireNonNull(label); + return this; + } + + public Builder iconURL(String iconURL) { + this.iconURL = Objects.requireNonNull(iconURL); + return this; + } + + public Builder diagnostics(List diagnostics) { + this.diagnostics = Objects.requireNonNull(diagnostics); + return this; + } + + public Builder helpTextProvider(Supplier helpTextProvider) { + this.helpTextProvider = Objects.requireNonNull(helpTextProvider); + return this; + } + + public Builder readOnly(boolean readOnly) { + this.readOnly = readOnly; + return this; + } + + public Builder children(List children) { + this.children = Objects.requireNonNull(children); + return this; + } + + public FormDescriptionEditorFor build() { + FormDescriptionEditorFor formDescriptionEditorFor = new FormDescriptionEditorFor(); + formDescriptionEditorFor.id = Objects.requireNonNull(this.id); + formDescriptionEditorFor.label = Objects.requireNonNull(this.label); + formDescriptionEditorFor.iconURL = this.iconURL; + formDescriptionEditorFor.diagnostics = Objects.requireNonNull(this.diagnostics); + formDescriptionEditorFor.helpTextProvider = this.helpTextProvider; // Optional on purpose + formDescriptionEditorFor.readOnly = this.readOnly; + formDescriptionEditorFor.children = Objects.requireNonNull(this.children); + return formDescriptionEditorFor; + } + } +} diff --git a/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/FormDescriptionEditorIf.java b/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/FormDescriptionEditorIf.java new file mode 100644 index 0000000000..c463cf03ba --- /dev/null +++ b/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/FormDescriptionEditorIf.java @@ -0,0 +1,122 @@ +/******************************************************************************* + * Copyright (c) 2023 Obeo. + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.sirius.components.formdescriptioneditors; + +import java.text.MessageFormat; +import java.util.List; +import java.util.Objects; +import java.util.function.Supplier; + +import org.eclipse.sirius.components.annotations.Immutable; +import org.eclipse.sirius.components.forms.AbstractWidget; +import org.eclipse.sirius.components.forms.validation.Diagnostic; + +/** + * A widget to represent an "If" element when rendering a Form in the context of a FormDescriptionEditor. + * + * @author pcdavid + */ +@Immutable +public final class FormDescriptionEditorIf extends AbstractWidget { + private List children; + + private FormDescriptionEditorIf() { + // Prevent instantiation + } + + public List getChildren() { + return this.children; + } + + public boolean hasHelpText() { + return false; + } + + public static Builder newFormDescriptionEditorIf(String id) { + return new Builder(id); + } + + @Override + public String toString() { + String pattern = "{0} '{'id: {1}, label: {2}'}'"; + return MessageFormat.format(pattern, this.getClass().getSimpleName(), this.getId(), this.label); + } + + /** + * The builder used to create the If widget. + * + * @author pcdavid + */ + @SuppressWarnings("checkstyle:HiddenField") + public static final class Builder { + private String id; + + private String label; + + private String iconURL; + + private List diagnostics; + + private Supplier helpTextProvider; + + private boolean readOnly; + + private List children; + + private Builder(String id) { + this.id = Objects.requireNonNull(id); + } + + public Builder label(String label) { + this.label = Objects.requireNonNull(label); + return this; + } + + public Builder iconURL(String iconURL) { + this.iconURL = Objects.requireNonNull(iconURL); + return this; + } + + public Builder diagnostics(List diagnostics) { + this.diagnostics = Objects.requireNonNull(diagnostics); + return this; + } + + public Builder helpTextProvider(Supplier helpTextProvider) { + this.helpTextProvider = Objects.requireNonNull(helpTextProvider); + return this; + } + + public Builder readOnly(boolean readOnly) { + this.readOnly = readOnly; + return this; + } + + public Builder children(List children) { + this.children = Objects.requireNonNull(children); + return this; + } + + public FormDescriptionEditorIf build() { + FormDescriptionEditorIf formDescriptionEditorIf = new FormDescriptionEditorIf(); + formDescriptionEditorIf.id = Objects.requireNonNull(this.id); + formDescriptionEditorIf.label = Objects.requireNonNull(this.label); + formDescriptionEditorIf.iconURL = this.iconURL; + formDescriptionEditorIf.diagnostics = Objects.requireNonNull(this.diagnostics); + formDescriptionEditorIf.helpTextProvider = this.helpTextProvider; // Optional on purpose + formDescriptionEditorIf.readOnly = this.readOnly; + formDescriptionEditorIf.children = Objects.requireNonNull(this.children); + return formDescriptionEditorIf; + } + } +} diff --git a/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/components/FormDescriptionEditorComponent.java b/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/components/FormDescriptionEditorComponent.java index 66e386f213..0b84018a03 100644 --- a/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/components/FormDescriptionEditorComponent.java +++ b/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/components/FormDescriptionEditorComponent.java @@ -40,11 +40,11 @@ public FormDescriptionEditorComponent(FormDescriptionEditorComponentProps props) @Override public Element render() { - VariableManager variableManager = this.props.getVariableManager(); + VariableManager variableManager = this.props.variableManager(); var formDescription = variableManager.get(VariableManager.SELF, FormDescription.class).get(); - FormDescriptionEditorDescription formDescriptionEditorDescription = this.props.getFormDescriptionEditorDescription(); - var optionalPreviousFormDescriptionEditor = this.props.getOptionalPreviousFormDescriptionEditor(); + FormDescriptionEditorDescription formDescriptionEditorDescription = this.props.formDescriptionEditorDescription(); + var optionalPreviousFormDescriptionEditor = this.props.optionalPreviousFormDescriptionEditor(); String id = optionalPreviousFormDescriptionEditor.map(FormDescriptionEditor::getId).orElseGet(() -> UUID.randomUUID().toString()); String label = optionalPreviousFormDescriptionEditor.map(FormDescriptionEditor::getLabel) @@ -57,10 +57,10 @@ public Element render() { formDescription.getPages().forEach(viewPageDescription -> { VariableManager childVariableManager = variableManager.createChild(); childVariableManager.put(VariableManager.SELF, viewPageDescription); - FormDescriptionEditorPageComponentProps formDescriptionEditorPageComponentProps = new FormDescriptionEditorPageComponentProps(childVariableManager, - this.props.getFormDescriptionEditorDescription(), - this.props.getWidgetDescriptors(), - this.props.getCustomWidgetConverterProviders()); + var formDescriptionEditorPageComponentProps = new FormDescriptionEditorPageComponentProps(childVariableManager, + this.props.formDescriptionEditorDescription(), + this.props.widgetDescriptors(), + this.props.customWidgetConverterProviders()); childrenWidgets.add(new Element(FormDescriptionEditorPageComponent.class, formDescriptionEditorPageComponentProps)); }); diff --git a/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/components/FormDescriptionEditorComponentProps.java b/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/components/FormDescriptionEditorComponentProps.java index cc6d6ac59c..ef197de234 100644 --- a/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/components/FormDescriptionEditorComponentProps.java +++ b/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/components/FormDescriptionEditorComponentProps.java @@ -28,17 +28,9 @@ * * @author arichard */ -public class FormDescriptionEditorComponentProps implements IProps { - - private final VariableManager variableManager; - - private final FormDescriptionEditorDescription formDescriptionEditorDescription; - - private final Optional optionalPreviousFormDescriptionEditor; - - private final List widgetDescriptors; - - private final List customWidgetConverterProviders; +public record FormDescriptionEditorComponentProps(VariableManager variableManager, FormDescriptionEditorDescription formDescriptionEditorDescription, + Optional optionalPreviousFormDescriptionEditor, List widgetDescriptors, List customWidgetConverterProviders) + implements IProps { public FormDescriptionEditorComponentProps(VariableManager variableManager, FormDescriptionEditorDescription formDescriptionEditorDescription, Optional optionalPreviousFormDescriptionEditor, List widgetDescriptors, List customWidgetConverterProviders) { @@ -48,24 +40,4 @@ public FormDescriptionEditorComponentProps(VariableManager variableManager, Form this.widgetDescriptors = Objects.requireNonNull(widgetDescriptors); this.customWidgetConverterProviders = Objects.requireNonNull(customWidgetConverterProviders); } - - public VariableManager getVariableManager() { - return this.variableManager; - } - - public FormDescriptionEditorDescription getFormDescriptionEditorDescription() { - return this.formDescriptionEditorDescription; - } - - public Optional getOptionalPreviousFormDescriptionEditor() { - return this.optionalPreviousFormDescriptionEditor; - } - - public List getCustomWidgetConverterProviders() { - return this.customWidgetConverterProviders; - } - - public List getWidgetDescriptors() { - return this.widgetDescriptors; - } } diff --git a/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/components/FormDescriptionEditorFlexboxContainerComponent.java b/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/components/FormDescriptionEditorFlexboxContainerComponent.java new file mode 100644 index 0000000000..091209e771 --- /dev/null +++ b/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/components/FormDescriptionEditorFlexboxContainerComponent.java @@ -0,0 +1,98 @@ +/******************************************************************************* + * Copyright (c) 2023 Obeo. + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.sirius.components.formdescriptioneditors.components; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +import org.eclipse.sirius.components.forms.FlexDirection; +import org.eclipse.sirius.components.forms.components.FormComponent; +import org.eclipse.sirius.components.forms.description.AbstractWidgetDescription; +import org.eclipse.sirius.components.forms.description.FlexboxContainerDescription; +import org.eclipse.sirius.components.forms.elements.FlexboxContainerElementProps; +import org.eclipse.sirius.components.forms.validation.DiagnosticComponent; +import org.eclipse.sirius.components.forms.validation.DiagnosticComponentProps; +import org.eclipse.sirius.components.representations.Element; +import org.eclipse.sirius.components.representations.Fragment; +import org.eclipse.sirius.components.representations.FragmentProps; +import org.eclipse.sirius.components.representations.IComponent; +import org.eclipse.sirius.components.representations.VariableManager; + +/** + * The component used to create the flexbox container widget. + * + * @author pcdavid + */ +public class FormDescriptionEditorFlexboxContainerComponent implements IComponent { + + private final FormDescriptionEditorFlexboxContainerComponentProps props; + + public FormDescriptionEditorFlexboxContainerComponent(FormDescriptionEditorFlexboxContainerComponentProps props) { + this.props = Objects.requireNonNull(props); + } + + @Override + public Element render() { + VariableManager variableManager = this.props.variableManager(); + FlexboxContainerDescription flexboxContainerDescription = this.props.flexboxContainerDescription(); + + String label = flexboxContainerDescription.getLabelProvider().apply(variableManager); + + VariableManager idVariableManager = variableManager.createChild(); + idVariableManager.put(FormComponent.TARGET_OBJECT_ID, flexboxContainerDescription.getTargetObjectIdProvider().apply(variableManager)); + idVariableManager.put(FormComponent.CONTROL_DESCRIPTION_ID, flexboxContainerDescription.getId()); + idVariableManager.put(FormComponent.WIDGET_LABEL, label); + String id = flexboxContainerDescription.getIdProvider().apply(idVariableManager); + + Boolean readOnly = flexboxContainerDescription.getIsReadOnlyProvider().apply(variableManager); + FlexDirection flexdirection = flexboxContainerDescription.getFlexDirection(); + var borderStyle = flexboxContainerDescription.getBorderStyleProvider().apply(variableManager); + + List children = new ArrayList<>(); + + List childrenWidgets = new ArrayList<>(); + VariableManager childrenVariableManager = variableManager.createChild(); + childrenVariableManager.put(FormComponent.PARENT_ELEMENT_ID, id); + flexboxContainerDescription.getChildren().forEach(controlDescription -> { + if (controlDescription instanceof AbstractWidgetDescription widgetDescription) { + var widgetComponentProps = new FormDescriptionEditorWidgetComponentProps(childrenVariableManager, widgetDescription, this.props.widgetDescriptors()); + childrenWidgets.add(new Element(FormDescriptionEditorWidgetComponent.class, widgetComponentProps)); + } + }); + + var flexboxContainerElementPropsBuilder = FlexboxContainerElementProps.newFlexboxContainerElementProps(id) + .label(label) + .flexDirection(flexdirection) + .children(childrenWidgets); + if (readOnly != null) { + flexboxContainerElementPropsBuilder.readOnly(readOnly); + } + + if (borderStyle != null) { + flexboxContainerElementPropsBuilder.borderStyle(borderStyle); + } + + if (flexboxContainerDescription.getHelpTextProvider() != null) { + flexboxContainerElementPropsBuilder.helpTextProvider(() -> flexboxContainerDescription.getHelpTextProvider().apply(variableManager)); + } + + Element flexboxContainerElement = new Element(FlexboxContainerElementProps.TYPE, flexboxContainerElementPropsBuilder.build()); + children.add(flexboxContainerElement); + + children.add(new Element(DiagnosticComponent.class, new DiagnosticComponentProps(flexboxContainerDescription, variableManager))); + + FragmentProps fragmentProps = new FragmentProps(children); + return new Fragment(fragmentProps); + } +} diff --git a/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/components/FormDescriptionEditorFlexboxContainerComponentProps.java b/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/components/FormDescriptionEditorFlexboxContainerComponentProps.java new file mode 100644 index 0000000000..3d0d33d3ff --- /dev/null +++ b/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/components/FormDescriptionEditorFlexboxContainerComponentProps.java @@ -0,0 +1,37 @@ +/******************************************************************************* + * Copyright (c) 2022, 2023 Obeo. + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.sirius.components.formdescriptioneditors.components; + +import java.util.List; +import java.util.Objects; + +import org.eclipse.sirius.components.forms.description.FlexboxContainerDescription; +import org.eclipse.sirius.components.forms.renderer.IWidgetDescriptor; +import org.eclipse.sirius.components.representations.IProps; +import org.eclipse.sirius.components.representations.VariableManager; + +/** + * The properties of the flexbox container component. + * + * @author arichard + */ +public record FormDescriptionEditorFlexboxContainerComponentProps(VariableManager variableManager, FlexboxContainerDescription flexboxContainerDescription, List widgetDescriptors) + implements IProps { + + public FormDescriptionEditorFlexboxContainerComponentProps(VariableManager variableManager, FlexboxContainerDescription flexboxContainerDescription, List widgetDescriptors) { + this.variableManager = Objects.requireNonNull(variableManager); + this.flexboxContainerDescription = Objects.requireNonNull(flexboxContainerDescription); + this.widgetDescriptors = Objects.requireNonNull(widgetDescriptors); + } + +} diff --git a/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/components/FormDescriptionEditorForComponent.java b/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/components/FormDescriptionEditorForComponent.java new file mode 100644 index 0000000000..d3fe0f36df --- /dev/null +++ b/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/components/FormDescriptionEditorForComponent.java @@ -0,0 +1,75 @@ +/******************************************************************************* + * Copyright (c) 2023 Obeo. + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.sirius.components.formdescriptioneditors.components; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +import org.eclipse.sirius.components.formdescriptioneditors.description.FormDescriptionEditorForDescription; +import org.eclipse.sirius.components.formdescriptioneditors.elements.FormDescriptionEditorForElementProps; +import org.eclipse.sirius.components.forms.components.FormComponent; +import org.eclipse.sirius.components.forms.description.AbstractWidgetDescription; +import org.eclipse.sirius.components.forms.validation.DiagnosticComponent; +import org.eclipse.sirius.components.forms.validation.DiagnosticComponentProps; +import org.eclipse.sirius.components.representations.Element; +import org.eclipse.sirius.components.representations.IComponent; +import org.eclipse.sirius.components.representations.VariableManager; + +/** + * Component used to render a "virtual" widget to represent a For element when rendering in the context of a + * FormDescriptionEditor. + * + * @author pcdavid + */ +public class FormDescriptionEditorForComponent implements IComponent { + + private final FormDescriptionEditorForComponentProps props; + + public FormDescriptionEditorForComponent(FormDescriptionEditorForComponentProps props) { + this.props = Objects.requireNonNull(props); + } + + @Override + public Element render() { + VariableManager variableManager = this.props.variableManager(); + FormDescriptionEditorForDescription forDescription = this.props.formDescriptionEditorForDescription(); + + String label = forDescription.getLabelProvider().apply(variableManager); + VariableManager idVariableManager = variableManager.createChild(); + idVariableManager.put(FormComponent.TARGET_OBJECT_ID, forDescription.getTargetObjectIdProvider().apply(variableManager)); + idVariableManager.put(FormComponent.CONTROL_DESCRIPTION_ID, forDescription.getId()); + idVariableManager.put(FormComponent.WIDGET_LABEL, label); + String id = forDescription.getIdProvider().apply(idVariableManager); + + List childrenWidgets = new ArrayList<>(); + VariableManager childrenVariableManager = variableManager.createChild(); + childrenVariableManager.put(FormComponent.PARENT_ELEMENT_ID, id); + forDescription.getChildren().forEach(controlDescription -> { + if (controlDescription instanceof AbstractWidgetDescription widgetDescription) { + var widgetComponentProps = new FormDescriptionEditorWidgetComponentProps(childrenVariableManager, widgetDescription, this.props.widgetDescriptors()); + childrenWidgets.add(new Element(FormDescriptionEditorWidgetComponent.class, widgetComponentProps)); + } + }); + + childrenWidgets.add(new Element(DiagnosticComponent.class, new DiagnosticComponentProps(forDescription, variableManager))); + + var forElementProps = FormDescriptionEditorForElementProps.newFormDescriptionEditorForElementProps(id) + .label(label) + .children(childrenWidgets) + .build(); + + return new Element(FormDescriptionEditorForElementProps.TYPE, forElementProps); + } + +} diff --git a/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/components/FormDescriptionEditorForComponentProps.java b/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/components/FormDescriptionEditorForComponentProps.java new file mode 100644 index 0000000000..aecd731085 --- /dev/null +++ b/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/components/FormDescriptionEditorForComponentProps.java @@ -0,0 +1,36 @@ +/******************************************************************************* + * Copyright (c) 2023 Obeo. + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.sirius.components.formdescriptioneditors.components; + +import java.util.List; +import java.util.Objects; + +import org.eclipse.sirius.components.formdescriptioneditors.description.FormDescriptionEditorForDescription; +import org.eclipse.sirius.components.forms.renderer.IWidgetDescriptor; +import org.eclipse.sirius.components.representations.IProps; +import org.eclipse.sirius.components.representations.VariableManager; + +/** + * The properties of the form description editor For component. + * + * @author pcdavid + */ +public record FormDescriptionEditorForComponentProps(VariableManager variableManager, FormDescriptionEditorForDescription formDescriptionEditorForDescription, List widgetDescriptors) implements IProps { + + public FormDescriptionEditorForComponentProps(VariableManager variableManager, FormDescriptionEditorForDescription formDescriptionEditorForDescription, List widgetDescriptors) { + this.variableManager = Objects.requireNonNull(variableManager); + this.formDescriptionEditorForDescription = Objects.requireNonNull(formDescriptionEditorForDescription); + this.widgetDescriptors = Objects.requireNonNull(widgetDescriptors); + } + +} diff --git a/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/components/FormDescriptionEditorGroupComponent.java b/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/components/FormDescriptionEditorGroupComponent.java index 64088dc84c..b0b36c2b60 100644 --- a/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/components/FormDescriptionEditorGroupComponent.java +++ b/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/components/FormDescriptionEditorGroupComponent.java @@ -15,25 +15,19 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; -import java.util.stream.Stream; import org.eclipse.emf.ecore.util.ComposedSwitch; import org.eclipse.emf.ecore.util.Switch; import org.eclipse.sirius.components.forms.GroupDisplayMode; import org.eclipse.sirius.components.forms.components.ToolbarActionComponent; import org.eclipse.sirius.components.forms.components.ToolbarActionComponentProps; -import org.eclipse.sirius.components.forms.components.WidgetComponent; -import org.eclipse.sirius.components.forms.components.WidgetComponentProps; import org.eclipse.sirius.components.forms.description.AbstractWidgetDescription; import org.eclipse.sirius.components.forms.description.ButtonDescription; import org.eclipse.sirius.components.forms.elements.GroupElementProps; import org.eclipse.sirius.components.representations.Element; import org.eclipse.sirius.components.representations.IComponent; import org.eclipse.sirius.components.representations.VariableManager; -import org.eclipse.sirius.components.view.form.FormElementFor; -import org.eclipse.sirius.components.view.form.FormElementIf; import org.eclipse.sirius.components.view.form.GroupDescription; -import org.eclipse.sirius.components.view.form.WidgetDescription; /** * The component used to render the form description editor group. @@ -50,20 +44,20 @@ public class FormDescriptionEditorGroupComponent implements IComponent { public FormDescriptionEditorGroupComponent(FormDescriptionEditorGroupComponentProps props) { this.props = props; - List> widgetConverters = this.props.getCustomWidgetConverterProviders().stream() - .map(provider -> provider.getWidgetConverter(props.getFormDescriptionEditorDescription(), props.getVariableManager())) + List> widgetConverters = this.props.customWidgetConverterProviders().stream() + .map(provider -> provider.getWidgetConverter(props.formDescriptionEditorDescription(), props.variableManager())) .toList(); Collection> switches = new ArrayList<>(); - switches.add(new ViewFormDescriptionEditorConverterSwitch(props.getFormDescriptionEditorDescription(), props.getVariableManager(), new ComposedSwitch<>(widgetConverters))); + switches.add(new ViewFormDescriptionEditorConverterSwitch(props.formDescriptionEditorDescription(), props.variableManager(), new ComposedSwitch<>(widgetConverters))); switches.addAll(widgetConverters); this.converter = new ComposedSwitch<>(switches); } @Override public Element render() { - VariableManager variableManager = this.props.getVariableManager(); + VariableManager variableManager = this.props.variableManager(); var groupDescription = variableManager.get(VariableManager.SELF, GroupDescription.class).get(); - String id = this.props.getFormDescriptionEditorDescription().getTargetObjectIdProvider().apply(variableManager); + String id = this.props.formDescriptionEditorDescription().getTargetObjectIdProvider().apply(variableManager); String label = this.getGroupLabel(groupDescription, "Group"); List childrenWidgets = new ArrayList<>(); @@ -77,27 +71,13 @@ public Element render() { } }); - groupDescription.getChildren().stream() - .flatMap(controlDescription -> { - Stream widgets = Stream.empty(); - if (controlDescription instanceof WidgetDescription viewWidgetDescription) { - widgets = Stream.of(viewWidgetDescription); - } else if (controlDescription instanceof FormElementFor formElementFor) { - widgets = formElementFor.getChildren().stream() - .filter(FormElementIf.class::isInstance).map(FormElementIf.class::cast) - .flatMap(formElementIf -> formElementIf.getChildren().stream()) - .filter(WidgetDescription.class::isInstance) - .map(WidgetDescription.class::cast); - } - return widgets; - }) - .forEach(viewWidgetDescription -> { - VariableManager childVariableManager = variableManager.createChild(); - childVariableManager.put(VariableManager.SELF, viewWidgetDescription); - AbstractWidgetDescription widgetDescription = this.converter.doSwitch(viewWidgetDescription); - WidgetComponentProps widgetComponentProps = new WidgetComponentProps(childVariableManager, widgetDescription, this.props.getWidgetDescriptors()); - childrenWidgets.add(new Element(WidgetComponent.class, widgetComponentProps)); - }); + groupDescription.getChildren().forEach(formElementDescription -> { + VariableManager childVariableManager = variableManager.createChild(); + childVariableManager.put(VariableManager.SELF, formElementDescription); + AbstractWidgetDescription widgetDescription = this.converter.doSwitch(formElementDescription); + FormDescriptionEditorWidgetComponentProps widgetComponentProps = new FormDescriptionEditorWidgetComponentProps(childVariableManager, widgetDescription, this.props.widgetDescriptors()); + childrenWidgets.add(new Element(FormDescriptionEditorWidgetComponent.class, widgetComponentProps)); + }); GroupElementProps.Builder groupElementPropsBuilder = GroupElementProps.newGroupElementProps(id) .label(label) diff --git a/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/components/FormDescriptionEditorGroupComponentProps.java b/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/components/FormDescriptionEditorGroupComponentProps.java index 0dddc0117b..d0010dddb6 100644 --- a/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/components/FormDescriptionEditorGroupComponentProps.java +++ b/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/components/FormDescriptionEditorGroupComponentProps.java @@ -26,36 +26,15 @@ * * @author arichard */ -public class FormDescriptionEditorGroupComponentProps implements IProps { +public record FormDescriptionEditorGroupComponentProps(VariableManager variableManager, FormDescriptionEditorDescription formDescriptionEditorDescription, List widgetDescriptors, + List customWidgetConverterProviders) implements IProps { - private final VariableManager variableManager; - - private final FormDescriptionEditorDescription formDescriptionEditorDescription; - - private final List widgetDescriptors; - - private final List customWidgetConverterProviders; - - public FormDescriptionEditorGroupComponentProps(VariableManager variableManager, FormDescriptionEditorDescription formDescriptionEditorDescription, List widgetDescriptors, List customWidgetConverterProviders) { + public FormDescriptionEditorGroupComponentProps(VariableManager variableManager, FormDescriptionEditorDescription formDescriptionEditorDescription, List widgetDescriptors, + List customWidgetConverterProviders) { this.variableManager = Objects.requireNonNull(variableManager); this.formDescriptionEditorDescription = Objects.requireNonNull(formDescriptionEditorDescription); this.widgetDescriptors = Objects.requireNonNull(widgetDescriptors); this.customWidgetConverterProviders = Objects.requireNonNull(customWidgetConverterProviders); } - public VariableManager getVariableManager() { - return this.variableManager; - } - - public FormDescriptionEditorDescription getFormDescriptionEditorDescription() { - return this.formDescriptionEditorDescription; - } - - public List getCustomWidgetConverterProviders() { - return this.customWidgetConverterProviders; - } - - public List getWidgetDescriptors() { - return this.widgetDescriptors; - } } diff --git a/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/components/FormDescriptionEditorIfComponent.java b/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/components/FormDescriptionEditorIfComponent.java new file mode 100644 index 0000000000..4a54f479d0 --- /dev/null +++ b/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/components/FormDescriptionEditorIfComponent.java @@ -0,0 +1,75 @@ +/******************************************************************************* + * Copyright (c) 2023 Obeo. + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.sirius.components.formdescriptioneditors.components; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +import org.eclipse.sirius.components.formdescriptioneditors.description.FormDescriptionEditorIfDescription; +import org.eclipse.sirius.components.formdescriptioneditors.elements.FormDescriptionEditorIfElementProps; +import org.eclipse.sirius.components.forms.components.FormComponent; +import org.eclipse.sirius.components.forms.description.AbstractWidgetDescription; +import org.eclipse.sirius.components.forms.validation.DiagnosticComponent; +import org.eclipse.sirius.components.forms.validation.DiagnosticComponentProps; +import org.eclipse.sirius.components.representations.Element; +import org.eclipse.sirius.components.representations.IComponent; +import org.eclipse.sirius.components.representations.VariableManager; + +/** + * Component used to render a "virtual" widget to represent a If element when rendering in the context of a + * FormDescriptionEditor. + * + * @author pcdavid + */ +public class FormDescriptionEditorIfComponent implements IComponent { + + private final FormDescriptionEditorIfComponentProps props; + + public FormDescriptionEditorIfComponent(FormDescriptionEditorIfComponentProps props) { + this.props = Objects.requireNonNull(props); + } + + @Override + public Element render() { + VariableManager variableManager = this.props.variableManager(); + FormDescriptionEditorIfDescription ifDescription = this.props.formDescriptionEditorIfDescription(); + + String label = ifDescription.getLabelProvider().apply(variableManager); + VariableManager idVariableManager = variableManager.createChild(); + idVariableManager.put(FormComponent.TARGET_OBJECT_ID, ifDescription.getTargetObjectIdProvider().apply(variableManager)); + idVariableManager.put(FormComponent.CONTROL_DESCRIPTION_ID, ifDescription.getId()); + idVariableManager.put(FormComponent.WIDGET_LABEL, label); + String id = ifDescription.getIdProvider().apply(idVariableManager); + + List childrenWidgets = new ArrayList<>(); + VariableManager childrenVariableManager = variableManager.createChild(); + childrenVariableManager.put(FormComponent.PARENT_ELEMENT_ID, id); + ifDescription.getChildren().forEach(controlDescription -> { + if (controlDescription instanceof AbstractWidgetDescription widgetDescription) { + var widgetComponentProps = new FormDescriptionEditorWidgetComponentProps(childrenVariableManager, widgetDescription, this.props.widgetDescriptors()); + childrenWidgets.add(new Element(FormDescriptionEditorWidgetComponent.class, widgetComponentProps)); + } + }); + + childrenWidgets.add(new Element(DiagnosticComponent.class, new DiagnosticComponentProps(ifDescription, variableManager))); + + var ifElementProps = FormDescriptionEditorIfElementProps.newFormDescriptionEditorIfElementProps(id) + .label(label) + .children(childrenWidgets) + .build(); + + return new Element(FormDescriptionEditorIfElementProps.TYPE, ifElementProps); + } + +} diff --git a/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/components/FormDescriptionEditorIfComponentProps.java b/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/components/FormDescriptionEditorIfComponentProps.java new file mode 100644 index 0000000000..c6d7a121fb --- /dev/null +++ b/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/components/FormDescriptionEditorIfComponentProps.java @@ -0,0 +1,37 @@ +/******************************************************************************* + * Copyright (c) 2023 Obeo. + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.sirius.components.formdescriptioneditors.components; + +import java.util.List; +import java.util.Objects; + +import org.eclipse.sirius.components.formdescriptioneditors.description.FormDescriptionEditorIfDescription; +import org.eclipse.sirius.components.forms.renderer.IWidgetDescriptor; +import org.eclipse.sirius.components.representations.IProps; +import org.eclipse.sirius.components.representations.VariableManager; + +/** + * The properties of the form description If component. + * + * @author pcdavid + */ +public record FormDescriptionEditorIfComponentProps(VariableManager variableManager, FormDescriptionEditorIfDescription formDescriptionEditorIfDescription, List widgetDescriptors) + implements IProps { + + public FormDescriptionEditorIfComponentProps(VariableManager variableManager, FormDescriptionEditorIfDescription formDescriptionEditorIfDescription, List widgetDescriptors) { + this.variableManager = Objects.requireNonNull(variableManager); + this.formDescriptionEditorIfDescription = Objects.requireNonNull(formDescriptionEditorIfDescription); + this.widgetDescriptors = Objects.requireNonNull(widgetDescriptors); + } + +} diff --git a/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/components/FormDescriptionEditorWidgetComponent.java b/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/components/FormDescriptionEditorWidgetComponent.java new file mode 100644 index 0000000000..a56a86c917 --- /dev/null +++ b/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/components/FormDescriptionEditorWidgetComponent.java @@ -0,0 +1,64 @@ +/******************************************************************************* + * Copyright (c) 2023 Obeo. + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.sirius.components.formdescriptioneditors.components; + +import org.eclipse.sirius.components.formdescriptioneditors.description.FormDescriptionEditorForDescription; +import org.eclipse.sirius.components.formdescriptioneditors.description.FormDescriptionEditorIfDescription; +import org.eclipse.sirius.components.forms.components.WidgetComponent; +import org.eclipse.sirius.components.forms.components.WidgetComponentProps; +import org.eclipse.sirius.components.forms.description.AbstractWidgetDescription; +import org.eclipse.sirius.components.forms.description.FlexboxContainerDescription; +import org.eclipse.sirius.components.representations.Element; +import org.eclipse.sirius.components.representations.IComponent; +import org.eclipse.sirius.components.representations.VariableManager; + +/** + * Custom component to render both "normal" widgets and FDE-specific ones (For, If). + * + * @author pcdavid + */ +public class FormDescriptionEditorWidgetComponent implements IComponent { + + private final FormDescriptionEditorWidgetComponentProps props; + + public FormDescriptionEditorWidgetComponent(FormDescriptionEditorWidgetComponentProps props) { + this.props = props; + } + + @Override + public Element render() { + VariableManager variableManager = this.props.variableManager(); + AbstractWidgetDescription widgetDescription = this.props.abstractWidgetDescription(); + + Element element = null; + if (widgetDescription instanceof FormDescriptionEditorForDescription formDescriptionEditorForDescription) { + var formDescriptionEditorForComponentProps = new FormDescriptionEditorForComponentProps(variableManager, formDescriptionEditorForDescription, this.props.widgetDescriptors()); + element = new Element(FormDescriptionEditorForComponent.class, formDescriptionEditorForComponentProps); + } else if (widgetDescription instanceof FormDescriptionEditorIfDescription formDescriptionEditorIfDescription) { + var formDescriptionEditorIfComponentProps = new FormDescriptionEditorIfComponentProps(variableManager, formDescriptionEditorIfDescription, this.props.widgetDescriptors()); + element = new Element(FormDescriptionEditorIfComponent.class, formDescriptionEditorIfComponentProps); + } else if (widgetDescription instanceof FlexboxContainerDescription flexboxContainerDescription) { + var formDescriptionEditorFlexboxContainerComponentProps = new FormDescriptionEditorFlexboxContainerComponentProps(variableManager, flexboxContainerDescription, this.props.widgetDescriptors()); + element = new Element(FormDescriptionEditorFlexboxContainerComponent.class, formDescriptionEditorFlexboxContainerComponentProps); + } + + if (element != null) { + return element; + } else { + var widgetComponentProps = new WidgetComponentProps(this.props.variableManager(), this.props.abstractWidgetDescription(), this.props.widgetDescriptors()); + var widgetComponent = new WidgetComponent(widgetComponentProps); + return widgetComponent.render(); + } + } + +} diff --git a/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/components/FormDescriptionEditorWidgetComponentProps.java b/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/components/FormDescriptionEditorWidgetComponentProps.java new file mode 100644 index 0000000000..23f7783d10 --- /dev/null +++ b/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/components/FormDescriptionEditorWidgetComponentProps.java @@ -0,0 +1,35 @@ +/******************************************************************************* + * Copyright (c) 2023 Obeo. + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.sirius.components.formdescriptioneditors.components; + +import java.util.List; +import java.util.Objects; + +import org.eclipse.sirius.components.forms.description.AbstractWidgetDescription; +import org.eclipse.sirius.components.forms.renderer.IWidgetDescriptor; +import org.eclipse.sirius.components.representations.IProps; +import org.eclipse.sirius.components.representations.VariableManager; + +/** + * * The properties of the form description editor widget component. + * + * @author pcdavid + */ +public record FormDescriptionEditorWidgetComponentProps(VariableManager variableManager, AbstractWidgetDescription abstractWidgetDescription, List widgetDescriptors) implements IProps { + + public FormDescriptionEditorWidgetComponentProps(VariableManager variableManager, AbstractWidgetDescription abstractWidgetDescription, List widgetDescriptors) { + this.variableManager = Objects.requireNonNull(variableManager); + this.abstractWidgetDescription = Objects.requireNonNull(abstractWidgetDescription); + this.widgetDescriptors = Objects.requireNonNull(widgetDescriptors); + } +} diff --git a/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/components/ViewFormDescriptionEditorConverterSwitch.java b/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/components/ViewFormDescriptionEditorConverterSwitch.java index fb58ea50a0..f7b5436301 100644 --- a/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/components/ViewFormDescriptionEditorConverterSwitch.java +++ b/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/components/ViewFormDescriptionEditorConverterSwitch.java @@ -25,6 +25,8 @@ import org.eclipse.sirius.components.charts.piechart.PieChartDescription; import org.eclipse.sirius.components.charts.piechart.components.PieChartStyle; import org.eclipse.sirius.components.formdescriptioneditors.description.FormDescriptionEditorDescription; +import org.eclipse.sirius.components.formdescriptioneditors.description.FormDescriptionEditorForDescription; +import org.eclipse.sirius.components.formdescriptioneditors.description.FormDescriptionEditorIfDescription; import org.eclipse.sirius.components.forms.ButtonStyle; import org.eclipse.sirius.components.forms.CheckboxStyle; import org.eclipse.sirius.components.forms.ContainerBorderStyle; @@ -58,6 +60,8 @@ import org.eclipse.sirius.components.view.form.BarChartDescriptionStyle; import org.eclipse.sirius.components.view.form.ButtonDescriptionStyle; import org.eclipse.sirius.components.view.form.CheckboxDescriptionStyle; +import org.eclipse.sirius.components.view.form.FormElementFor; +import org.eclipse.sirius.components.view.form.FormElementIf; import org.eclipse.sirius.components.view.form.LabelDescriptionStyle; import org.eclipse.sirius.components.view.form.LinkDescriptionStyle; import org.eclipse.sirius.components.view.form.ListDescriptionStyle; @@ -549,6 +553,50 @@ private AbstractWidgetDescription createChartWidgetDescription(org.eclipse.siriu return builder.build(); } + @Override + public AbstractWidgetDescription caseFormElementFor(FormElementFor formElementFor) { + VariableManager childVariableManager = this.variableManager.createChild(); + childVariableManager.put(VariableManager.SELF, formElementFor); + String id = this.formDescriptionEditorDescription.getTargetObjectIdProvider().apply(childVariableManager); + + List children = new ArrayList<>(); + formElementFor.getChildren().forEach(viewWidgetDescription -> { + children.add(ViewFormDescriptionEditorConverterSwitch.this.doSwitch(viewWidgetDescription)); + }); + + return FormDescriptionEditorForDescription.newFormDescriptionEditorForDescription(UUID.randomUUID().toString()) + .idProvider(vm -> id) + .targetObjectIdProvider(vm -> "") + .labelProvider(vm -> "for %s in %s".formatted(formElementFor.getIterator(), formElementFor.getIterableExpression())) + .diagnosticsProvider(vm -> List.of()) + .kindProvider(object -> "") + .messageProvider(object -> "") + .children(children) + .build(); + } + + @Override + public AbstractWidgetDescription caseFormElementIf(FormElementIf formElementIf) { + VariableManager childVariableManager = this.variableManager.createChild(); + childVariableManager.put(VariableManager.SELF, formElementIf); + String id = this.formDescriptionEditorDescription.getTargetObjectIdProvider().apply(childVariableManager); + + List children = new ArrayList<>(); + formElementIf.getChildren().forEach(viewWidgetDescription -> { + children.add(ViewFormDescriptionEditorConverterSwitch.this.doSwitch(viewWidgetDescription)); + }); + + return FormDescriptionEditorIfDescription.newFormDescriptionEditorIfDescription(UUID.randomUUID().toString()) + .idProvider(vm -> id) + .targetObjectIdProvider(vm -> "") + .labelProvider(vm -> "if %s".formatted(formElementIf.getPredicateExpression())) + .diagnosticsProvider(vm -> List.of()) + .kindProvider(object -> "") + .messageProvider(object -> "") + .children(children) + .build(); + } + @Override public AbstractWidgetDescription caseWidgetDescription(WidgetDescription widgetDescription) { return ViewFormDescriptionEditorConverterSwitch.this.customWidgetConverter.doSwitch(widgetDescription); diff --git a/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/description/FormDescriptionEditorForDescription.java b/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/description/FormDescriptionEditorForDescription.java new file mode 100644 index 0000000000..33c3468ffc --- /dev/null +++ b/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/description/FormDescriptionEditorForDescription.java @@ -0,0 +1,158 @@ +/******************************************************************************* + * Copyright (c) 2023 Obeo. + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.sirius.components.formdescriptioneditors.description; + +import java.text.MessageFormat; +import java.util.List; +import java.util.Objects; +import java.util.function.Function; + +import org.eclipse.sirius.components.annotations.Immutable; +import org.eclipse.sirius.components.forms.description.AbstractControlDescription; +import org.eclipse.sirius.components.forms.description.AbstractWidgetDescription; +import org.eclipse.sirius.components.representations.VariableManager; + +/** + * The description of the FDE For widget. + * + * @author pcdavid + */ +@Immutable +public final class FormDescriptionEditorForDescription extends AbstractWidgetDescription { + + private Function idProvider; + + private Function labelProvider; + + private List children; + + private FormDescriptionEditorForDescription() { + // Prevent instantiation + } + + public Function getIdProvider() { + return this.idProvider; + } + + public Function getLabelProvider() { + return this.labelProvider; + } + + public List getChildren() { + return this.children; + } + + public static Builder newFormDescriptionEditorForDescription(String id) { + return new Builder(id); + } + + @Override + public String toString() { + String pattern = "{0} '{'id: {1}'}'"; + return MessageFormat.format(pattern, this.getClass().getSimpleName(), this.getId()); + } + + /** + * Builder used to create the FDE Fordescription. + * + * @author pcdavid + */ + @SuppressWarnings("checkstyle:HiddenField") + public static final class Builder { + + private String id; + + private Function idProvider; + + private Function targetObjectIdProvider; + + private Function labelProvider; + + private Function isReadOnlyProvider = variableManager -> false; + + private Function> diagnosticsProvider; + + private Function kindProvider; + + private Function messageProvider; + + private Function helpTextProvider; + + private List children; + + private Builder(String id) { + this.id = Objects.requireNonNull(id); + } + + public Builder idProvider(Function idProvider) { + this.idProvider = Objects.requireNonNull(idProvider); + return this; + } + + public Builder targetObjectIdProvider(Function targetObjectIdProvider) { + this.targetObjectIdProvider = Objects.requireNonNull(targetObjectIdProvider); + return this; + } + + public Builder labelProvider(Function labelProvider) { + this.labelProvider = Objects.requireNonNull(labelProvider); + return this; + } + + public Builder isReadOnlyProvider(Function isReadOnlyProvider) { + this.isReadOnlyProvider = Objects.requireNonNull(isReadOnlyProvider); + return this; + } + + public Builder diagnosticsProvider(Function> diagnosticsProvider) { + this.diagnosticsProvider = Objects.requireNonNull(diagnosticsProvider); + return this; + } + + public Builder kindProvider(Function kindProvider) { + this.kindProvider = Objects.requireNonNull(kindProvider); + return this; + } + + public Builder messageProvider(Function messageProvider) { + this.messageProvider = Objects.requireNonNull(messageProvider); + return this; + } + + public Builder helpTextProvider(Function helpTextProvider) { + this.helpTextProvider = Objects.requireNonNull(helpTextProvider); + return this; + } + + public Builder children(List children) { + this.children = Objects.requireNonNull(children); + return this; + } + + public FormDescriptionEditorForDescription build() { + FormDescriptionEditorForDescription formDescriptionEditorForDescription = new FormDescriptionEditorForDescription(); + formDescriptionEditorForDescription.id = Objects.requireNonNull(this.id); + formDescriptionEditorForDescription.targetObjectIdProvider = Objects.requireNonNull(this.targetObjectIdProvider); + formDescriptionEditorForDescription.idProvider = Objects.requireNonNull(this.idProvider); + formDescriptionEditorForDescription.labelProvider = Objects.requireNonNull(this.labelProvider); + formDescriptionEditorForDescription.isReadOnlyProvider = Objects.requireNonNull(this.isReadOnlyProvider); + formDescriptionEditorForDescription.diagnosticsProvider = Objects.requireNonNull(this.diagnosticsProvider); + formDescriptionEditorForDescription.kindProvider = Objects.requireNonNull(this.kindProvider); + formDescriptionEditorForDescription.messageProvider = Objects.requireNonNull(this.messageProvider); + formDescriptionEditorForDescription.helpTextProvider = this.helpTextProvider; // Optional on purpose + formDescriptionEditorForDescription.children = Objects.requireNonNull(this.children); + return formDescriptionEditorForDescription; + } + + } +} diff --git a/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/description/FormDescriptionEditorIfDescription.java b/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/description/FormDescriptionEditorIfDescription.java new file mode 100644 index 0000000000..0dae01ae75 --- /dev/null +++ b/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/description/FormDescriptionEditorIfDescription.java @@ -0,0 +1,158 @@ +/******************************************************************************* + * Copyright (c) 2023 Obeo. + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.sirius.components.formdescriptioneditors.description; + +import java.text.MessageFormat; +import java.util.List; +import java.util.Objects; +import java.util.function.Function; + +import org.eclipse.sirius.components.annotations.Immutable; +import org.eclipse.sirius.components.forms.description.AbstractControlDescription; +import org.eclipse.sirius.components.forms.description.AbstractWidgetDescription; +import org.eclipse.sirius.components.representations.VariableManager; + +/** + * The description of the FDE If widget. + * + * @author pcdavid + */ +@Immutable +public final class FormDescriptionEditorIfDescription extends AbstractWidgetDescription { + + private Function idProvider; + + private Function labelProvider; + + private List children; + + private FormDescriptionEditorIfDescription() { + // Prevent instantiation + } + + public Function getIdProvider() { + return this.idProvider; + } + + public Function getLabelProvider() { + return this.labelProvider; + } + + public List getChildren() { + return this.children; + } + + public static Builder newFormDescriptionEditorIfDescription(String id) { + return new Builder(id); + } + + @Override + public String toString() { + String pattern = "{0} '{'id: {1}'}'"; + return MessageFormat.format(pattern, this.getClass().getSimpleName(), this.getId()); + } + + /** + * Builder used to create the FDE If description. + * + * @author pcdavid + */ + @SuppressWarnings("checkstyle:HiddenField") + public static final class Builder { + + private String id; + + private Function idProvider; + + private Function targetObjectIdProvider; + + private Function labelProvider; + + private Function isReadOnlyProvider = variableManager -> false; + + private Function> diagnosticsProvider; + + private Function kindProvider; + + private Function messageProvider; + + private Function helpTextProvider; + + private List children; + + private Builder(String id) { + this.id = Objects.requireNonNull(id); + } + + public Builder idProvider(Function idProvider) { + this.idProvider = Objects.requireNonNull(idProvider); + return this; + } + + public Builder targetObjectIdProvider(Function targetObjectIdProvider) { + this.targetObjectIdProvider = Objects.requireNonNull(targetObjectIdProvider); + return this; + } + + public Builder labelProvider(Function labelProvider) { + this.labelProvider = Objects.requireNonNull(labelProvider); + return this; + } + + public Builder isReadOnlyProvider(Function isReadOnlyProvider) { + this.isReadOnlyProvider = Objects.requireNonNull(isReadOnlyProvider); + return this; + } + + public Builder diagnosticsProvider(Function> diagnosticsProvider) { + this.diagnosticsProvider = Objects.requireNonNull(diagnosticsProvider); + return this; + } + + public Builder kindProvider(Function kindProvider) { + this.kindProvider = Objects.requireNonNull(kindProvider); + return this; + } + + public Builder messageProvider(Function messageProvider) { + this.messageProvider = Objects.requireNonNull(messageProvider); + return this; + } + + public Builder helpTextProvider(Function helpTextProvider) { + this.helpTextProvider = Objects.requireNonNull(helpTextProvider); + return this; + } + + public Builder children(List children) { + this.children = Objects.requireNonNull(children); + return this; + } + + public FormDescriptionEditorIfDescription build() { + FormDescriptionEditorIfDescription formDescriptionEditorIfDescription = new FormDescriptionEditorIfDescription(); + formDescriptionEditorIfDescription.id = Objects.requireNonNull(this.id); + formDescriptionEditorIfDescription.targetObjectIdProvider = Objects.requireNonNull(this.targetObjectIdProvider); + formDescriptionEditorIfDescription.idProvider = Objects.requireNonNull(this.idProvider); + formDescriptionEditorIfDescription.labelProvider = Objects.requireNonNull(this.labelProvider); + formDescriptionEditorIfDescription.isReadOnlyProvider = Objects.requireNonNull(this.isReadOnlyProvider); + formDescriptionEditorIfDescription.diagnosticsProvider = Objects.requireNonNull(this.diagnosticsProvider); + formDescriptionEditorIfDescription.kindProvider = Objects.requireNonNull(this.kindProvider); + formDescriptionEditorIfDescription.messageProvider = Objects.requireNonNull(this.messageProvider); + formDescriptionEditorIfDescription.helpTextProvider = this.helpTextProvider; // Optional on purpose + formDescriptionEditorIfDescription.children = Objects.requireNonNull(this.children); + return formDescriptionEditorIfDescription; + } + + } +} diff --git a/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/elements/FormDescriptionEditorForElementProps.java b/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/elements/FormDescriptionEditorForElementProps.java new file mode 100644 index 0000000000..e7a0ece66b --- /dev/null +++ b/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/elements/FormDescriptionEditorForElementProps.java @@ -0,0 +1,116 @@ +/******************************************************************************* + * Copyright (c) 2023 Obeo. + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.sirius.components.formdescriptioneditors.elements; + +import java.text.MessageFormat; +import java.util.List; +import java.util.Objects; + +import org.eclipse.sirius.components.annotations.Immutable; +import org.eclipse.sirius.components.formdescriptioneditors.FormDescriptionEditorIf; +import org.eclipse.sirius.components.representations.Element; +import org.eclipse.sirius.components.representations.IProps; + +/** + * The properties for the {@link FormDescriptionEditorIf} element. + * + * @author pcdavid + */ +@Immutable +public final class FormDescriptionEditorForElementProps implements IProps { + public static final String TYPE = "FormDescriptionEditorFor"; + + private String id; + + private String label; + + private String iconURL; + + private List children; + + private FormDescriptionEditorForElementProps() { + // Prevent instantiation + } + + public String getId() { + return this.id; + } + + public String getLabel() { + return this.label; + } + + public String getIconURL() { + return this.iconURL; + } + + @Override + public List getChildren() { + return this.children; + } + + public static Builder newFormDescriptionEditorForElementProps(String id) { + return new Builder(id); + } + + @Override + public String toString() { + String pattern = "{0} '{'id: {1}, label: {2}'}'"; + return MessageFormat.format(pattern, this.getClass().getSimpleName(), this.id, this.label); + } + + /** + * The builder of the FormDescriptionEditorFor element props. + * + * @author pcdavid + */ + @SuppressWarnings("checkstyle:HiddenField") + public static final class Builder { + + private String id; + + private String label; + + private String iconURL; + + private List children; + + private Builder(String id) { + this.id = Objects.requireNonNull(id); + } + + public Builder label(String label) { + this.label = Objects.requireNonNull(label); + return this; + } + + public Builder iconURL(String iconURL) { + this.iconURL = Objects.requireNonNull(iconURL); + return this; + } + + public Builder children(List children) { + this.children = Objects.requireNonNull(children); + return this; + } + + public FormDescriptionEditorForElementProps build() { + FormDescriptionEditorForElementProps formDescriptionEditorForElementProps = new FormDescriptionEditorForElementProps(); + formDescriptionEditorForElementProps.id = Objects.requireNonNull(this.id); + formDescriptionEditorForElementProps.label = Objects.requireNonNull(this.label); + formDescriptionEditorForElementProps.iconURL = this.iconURL; + formDescriptionEditorForElementProps.children = Objects.requireNonNull(this.children); + return formDescriptionEditorForElementProps; + } + } +} diff --git a/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/elements/FormDescriptionEditorIfElementProps.java b/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/elements/FormDescriptionEditorIfElementProps.java new file mode 100644 index 0000000000..9e6521d69f --- /dev/null +++ b/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/elements/FormDescriptionEditorIfElementProps.java @@ -0,0 +1,116 @@ +/******************************************************************************* + * Copyright (c) 2023 Obeo. + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.sirius.components.formdescriptioneditors.elements; + +import java.text.MessageFormat; +import java.util.List; +import java.util.Objects; + +import org.eclipse.sirius.components.annotations.Immutable; +import org.eclipse.sirius.components.formdescriptioneditors.FormDescriptionEditorIf; +import org.eclipse.sirius.components.representations.Element; +import org.eclipse.sirius.components.representations.IProps; + +/** + * The properties for the {@link FormDescriptionEditorIf} element. + * + * @author pcdavid + */ +@Immutable +public final class FormDescriptionEditorIfElementProps implements IProps { + public static final String TYPE = "FormDescriptionEditorIf"; + + private String id; + + private String label; + + private String iconURL; + + private List children; + + private FormDescriptionEditorIfElementProps() { + // Prevent instantiation + } + + public String getId() { + return this.id; + } + + public String getLabel() { + return this.label; + } + + public String getIconURL() { + return this.iconURL; + } + + @Override + public List getChildren() { + return this.children; + } + + public static Builder newFormDescriptionEditorIfElementProps(String id) { + return new Builder(id); + } + + @Override + public String toString() { + String pattern = "{0} '{'id: {1}, label: {2}'}'"; + return MessageFormat.format(pattern, this.getClass().getSimpleName(), this.id, this.label); + } + + /** + * The builder of the FormDescriptionEditorIf element props. + * + * @author pcdavid + */ + @SuppressWarnings("checkstyle:HiddenField") + public static final class Builder { + + private String id; + + private String label; + + private String iconURL; + + private List children; + + private Builder(String id) { + this.id = Objects.requireNonNull(id); + } + + public Builder label(String label) { + this.label = Objects.requireNonNull(label); + return this; + } + + public Builder iconURL(String iconURL) { + this.iconURL = Objects.requireNonNull(iconURL); + return this; + } + + public Builder children(List children) { + this.children = Objects.requireNonNull(children); + return this; + } + + public FormDescriptionEditorIfElementProps build() { + FormDescriptionEditorIfElementProps formDescriptionEditorIfElementProps = new FormDescriptionEditorIfElementProps(); + formDescriptionEditorIfElementProps.id = Objects.requireNonNull(this.id); + formDescriptionEditorIfElementProps.label = Objects.requireNonNull(this.label); + formDescriptionEditorIfElementProps.iconURL = this.iconURL; + formDescriptionEditorIfElementProps.children = Objects.requireNonNull(this.children); + return formDescriptionEditorIfElementProps; + } + } +} diff --git a/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/renderer/FormDescriptionEditorComponentPropsValidator.java b/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/renderer/FormDescriptionEditorComponentPropsValidator.java index c8478eb29a..242f29b81f 100644 --- a/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/renderer/FormDescriptionEditorComponentPropsValidator.java +++ b/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/renderer/FormDescriptionEditorComponentPropsValidator.java @@ -16,10 +16,18 @@ import org.eclipse.sirius.components.formdescriptioneditors.components.FormDescriptionEditorComponent; import org.eclipse.sirius.components.formdescriptioneditors.components.FormDescriptionEditorComponentProps; +import org.eclipse.sirius.components.formdescriptioneditors.components.FormDescriptionEditorFlexboxContainerComponent; +import org.eclipse.sirius.components.formdescriptioneditors.components.FormDescriptionEditorFlexboxContainerComponentProps; +import org.eclipse.sirius.components.formdescriptioneditors.components.FormDescriptionEditorForComponent; +import org.eclipse.sirius.components.formdescriptioneditors.components.FormDescriptionEditorForComponentProps; import org.eclipse.sirius.components.formdescriptioneditors.components.FormDescriptionEditorGroupComponent; import org.eclipse.sirius.components.formdescriptioneditors.components.FormDescriptionEditorGroupComponentProps; +import org.eclipse.sirius.components.formdescriptioneditors.components.FormDescriptionEditorIfComponent; +import org.eclipse.sirius.components.formdescriptioneditors.components.FormDescriptionEditorIfComponentProps; import org.eclipse.sirius.components.formdescriptioneditors.components.FormDescriptionEditorPageComponent; import org.eclipse.sirius.components.formdescriptioneditors.components.FormDescriptionEditorPageComponentProps; +import org.eclipse.sirius.components.formdescriptioneditors.components.FormDescriptionEditorWidgetComponent; +import org.eclipse.sirius.components.formdescriptioneditors.components.FormDescriptionEditorWidgetComponentProps; import org.eclipse.sirius.components.forms.renderer.FormComponentPropsValidator; import org.eclipse.sirius.components.forms.renderer.IWidgetDescriptor; import org.eclipse.sirius.components.representations.IComponentPropsValidator; @@ -48,6 +56,14 @@ public boolean validateComponentProps(Class componentType, IProps props) { checkValidProps = props instanceof FormDescriptionEditorGroupComponentProps; } else if (FormDescriptionEditorPageComponent.class.equals(componentType)) { checkValidProps = props instanceof FormDescriptionEditorPageComponentProps; + } else if (FormDescriptionEditorFlexboxContainerComponent.class.equals(componentType)) { + checkValidProps = props instanceof FormDescriptionEditorFlexboxContainerComponentProps; + } else if (FormDescriptionEditorForComponent.class.equals(componentType)) { + checkValidProps = props instanceof FormDescriptionEditorForComponentProps; + } else if (FormDescriptionEditorIfComponent.class.equals(componentType)) { + checkValidProps = props instanceof FormDescriptionEditorIfComponentProps; + } else if (FormDescriptionEditorWidgetComponent.class.equals(componentType)) { + checkValidProps = props instanceof FormDescriptionEditorWidgetComponentProps; } else { checkValidProps = this.formComponentPropsValidator.validateComponentProps(componentType, props); } diff --git a/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/renderer/FormDescriptionEditorElementFactory.java b/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/renderer/FormDescriptionEditorElementFactory.java index 7237353273..18697316d4 100644 --- a/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/renderer/FormDescriptionEditorElementFactory.java +++ b/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/renderer/FormDescriptionEditorElementFactory.java @@ -15,7 +15,12 @@ import java.util.List; import org.eclipse.sirius.components.formdescriptioneditors.FormDescriptionEditor; +import org.eclipse.sirius.components.formdescriptioneditors.FormDescriptionEditorFor; +import org.eclipse.sirius.components.formdescriptioneditors.FormDescriptionEditorIf; import org.eclipse.sirius.components.formdescriptioneditors.elements.FormDescriptionEditorElementProps; +import org.eclipse.sirius.components.formdescriptioneditors.elements.FormDescriptionEditorForElementProps; +import org.eclipse.sirius.components.formdescriptioneditors.elements.FormDescriptionEditorIfElementProps; +import org.eclipse.sirius.components.forms.AbstractWidget; import org.eclipse.sirius.components.forms.Page; import org.eclipse.sirius.components.forms.renderer.FormElementFactory; import org.eclipse.sirius.components.forms.renderer.IWidgetDescriptor; @@ -40,6 +45,10 @@ public Object instantiateElement(String type, IProps props, List childre Object object = null; if (FormDescriptionEditorElementProps.TYPE.equals(type) && props instanceof FormDescriptionEditorElementProps) { object = this.instantiateFormDescriptionEditor((FormDescriptionEditorElementProps) props, children); + } else if (FormDescriptionEditorForElementProps.TYPE.equals(type) && props instanceof FormDescriptionEditorForElementProps) { + object = this.instantiateFormDescriptionEditorFor((FormDescriptionEditorForElementProps) props, children); + } else if (FormDescriptionEditorIfElementProps.TYPE.equals(type) && props instanceof FormDescriptionEditorIfElementProps) { + object = this.instantiateFormDescriptionEditorIf((FormDescriptionEditorIfElementProps) props, children); } else { object = this.formElementFactory.instantiateElement(type, props, children); } @@ -60,4 +69,29 @@ private FormDescriptionEditor instantiateFormDescriptionEditor(FormDescriptionEd .build(); } + private FormDescriptionEditorFor instantiateFormDescriptionEditorFor(FormDescriptionEditorForElementProps props, List children) { + List widgets = children.stream() + .filter(AbstractWidget.class::isInstance) + .map(AbstractWidget.class::cast) + .toList(); + + return FormDescriptionEditorFor.newFormDescriptionEditorFor(props.getId()) + .label(props.getLabel()) + .diagnostics(List.of()) + .children(widgets) + .build(); + } + + private FormDescriptionEditorIf instantiateFormDescriptionEditorIf(FormDescriptionEditorIfElementProps props, List children) { + List widgets = children.stream() + .filter(AbstractWidget.class::isInstance) + .map(AbstractWidget.class::cast) + .toList(); + + return FormDescriptionEditorIf.newFormDescriptionEditorIf(props.getId()) + .label(props.getLabel()) + .diagnostics(List.of()) + .children(widgets) + .build(); + } } diff --git a/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/renderer/FormDescriptionEditorInstancePropsValidator.java b/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/renderer/FormDescriptionEditorInstancePropsValidator.java index 635892806e..8fe1576147 100644 --- a/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/renderer/FormDescriptionEditorInstancePropsValidator.java +++ b/packages/formdescriptioneditors/backend/sirius-components-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/renderer/FormDescriptionEditorInstancePropsValidator.java @@ -15,6 +15,8 @@ import java.util.List; import org.eclipse.sirius.components.formdescriptioneditors.elements.FormDescriptionEditorElementProps; +import org.eclipse.sirius.components.formdescriptioneditors.elements.FormDescriptionEditorForElementProps; +import org.eclipse.sirius.components.formdescriptioneditors.elements.FormDescriptionEditorIfElementProps; import org.eclipse.sirius.components.forms.renderer.FormInstancePropsValidator; import org.eclipse.sirius.components.forms.renderer.IWidgetDescriptor; import org.eclipse.sirius.components.representations.IInstancePropsValidator; @@ -39,6 +41,10 @@ public boolean validateInstanceProps(String type, IProps props) { if (FormDescriptionEditorElementProps.TYPE.equals(type)) { checkValidProps = props instanceof FormDescriptionEditorElementProps; + } else if (FormDescriptionEditorForElementProps.TYPE.equals(type)) { + checkValidProps = props instanceof FormDescriptionEditorForElementProps; + } else if (FormDescriptionEditorIfElementProps.TYPE.equals(type)) { + checkValidProps = props instanceof FormDescriptionEditorIfElementProps; } else { checkValidProps = this.formInstancePropsValidator.validateInstanceProps(type, props); } diff --git a/packages/formdescriptioneditors/frontend/sirius-components-formdescriptioneditors/src/FlexboxContainerWidget.tsx b/packages/formdescriptioneditors/frontend/sirius-components-formdescriptioneditors/src/FlexboxContainerWidget.tsx index 95315ef5bc..a650554ca3 100644 --- a/packages/formdescriptioneditors/frontend/sirius-components-formdescriptioneditors/src/FlexboxContainerWidget.tsx +++ b/packages/formdescriptioneditors/frontend/sirius-components-formdescriptioneditors/src/FlexboxContainerWidget.tsx @@ -188,7 +188,7 @@ export const FlexboxContainerWidget = ({ return; } - let index = widget.children.length; + let index = widget.children.length || 0; if (isKind(id) || propertySectionsRegistry.getWidgetContributions().find((contrib) => contrib.name === id)) { const addWidgetInput: GQLAddWidgetInput = { id: crypto.randomUUID(), diff --git a/packages/formdescriptioneditors/frontend/sirius-components-formdescriptioneditors/src/FormDescriptionEditorEventFragment.ts b/packages/formdescriptioneditors/frontend/sirius-components-formdescriptioneditors/src/FormDescriptionEditorEventFragment.ts index c0c2ff1558..b009ee70c0 100644 --- a/packages/formdescriptioneditors/frontend/sirius-components-formdescriptioneditors/src/FormDescriptionEditorEventFragment.ts +++ b/packages/formdescriptioneditors/frontend/sirius-components-formdescriptioneditors/src/FormDescriptionEditorEventFragment.ts @@ -11,11 +11,65 @@ * Obeo - initial API and implementation *******************************************************************************/ import { gql } from '@apollo/client'; -import { flexboxContainerFields, WidgetContribution, widgetFields } from '@eclipse-sirius/sirius-components-forms'; +import { WidgetContribution, widgetFields } from '@eclipse-sirius/sirius-components-forms'; -export const formDescriptionEditorEventSubscription = (contributions: Array) => ` +const widgetContainerContent = (depth: number) => { + if (depth === 0) { + return '...widgetFields'; + } else { + const children = widgetContainerContent(depth - 1); + return ` + ...widgetFields + ... on FlexboxContainer { + ...flexboxContainerProperFields + children { + ${children} + } + } + ... on FormDescriptionEditorIf { + ...ifProperFields + children { + ${children} + } + } + ... on FormDescriptionEditorFor { + ...forProperFields + children { + ${children} + } + } + `; + } +}; + +export const formDescriptionEditorEventSubscription = (contributions: Array) => { + return ` ${widgetFields(contributions)} - ${flexboxContainerFields(contributions)} + + fragment ifProperFields on FormDescriptionEditorIf { + ...commonFields + label + } + + fragment forProperFields on FormDescriptionEditorFor { + ...commonFields + label + } + + fragment flexboxContainerProperFields on FlexboxContainer { + ...commonFields + label + flexDirection + flexWrap + flexGrow + borderStyle { + color + lineStyle + size + radius + } + } + subscription formDescriptionEditorEvent($input: FormDescriptionEditorEventInput!) { formDescriptionEditorEvent(input: $input) { __typename @@ -44,22 +98,19 @@ export const formDescriptionEditorEventSubscription = (contributions: Array ({ formDescriptionEditor: { @@ -242,6 +244,29 @@ export const FormDescriptionEditorRepresentation = ({ Group + Controls +
+ + + For + +
+
+ + + If + +
Widgets
+ {propertySectionsRegistry.getWidgetContributions().map((customWidget) => { return (
); + } else if (widget.__typename === 'FormDescriptionEditorIf') { + const ifPreview: GQLFlexboxContainer = { + ...widget, + flexDirection: 'column', + flexWrap: 'nowrap', + flexGrow: 1, + children: (widget as GQLContainer).children, + borderStyle: { + color: null, + lineStyle: 'solid', + size: 1, + radius: 0, + }, + }; + widgetElement = ( + + ); + } else if (widget.__typename === 'FormDescriptionEditorFor') { + const forPreview: GQLFlexboxContainer = { + ...widget, + flexDirection: 'column', + flexWrap: 'nowrap', + flexGrow: 1, + children: (widget as GQLContainer).children, + borderStyle: { + color: null, + lineStyle: 'solid', + size: 1, + radius: 0, + }, + }; + widgetElement = ( + + ); } else if (widget.__typename === 'Image') { widgetElement = ( { value === 'PieChart' || value === 'FlexboxContainer' || value === 'Image' || - value === 'RichText' + value === 'RichText' || + value === 'FormElementFor' || + value === 'FormElementIf' ); }; diff --git a/packages/formdescriptioneditors/frontend/sirius-components-formdescriptioneditors/src/icons/ForIcon.tsx b/packages/formdescriptioneditors/frontend/sirius-components-formdescriptioneditors/src/icons/ForIcon.tsx new file mode 100644 index 0000000000..38dc1eb9f9 --- /dev/null +++ b/packages/formdescriptioneditors/frontend/sirius-components-formdescriptioneditors/src/icons/ForIcon.tsx @@ -0,0 +1,27 @@ +/******************************************************************************* + * Copyright (c) 2023 Obeo. + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Obeo - initial API and implementation + *******************************************************************************/ +import SvgIcon, { SvgIconProps } from '@material-ui/core/SvgIcon'; + +export const ForIcon = (props: SvgIconProps) => { + return ( + + + + ); +}; diff --git a/packages/formdescriptioneditors/frontend/sirius-components-formdescriptioneditors/src/icons/IfIcon.tsx b/packages/formdescriptioneditors/frontend/sirius-components-formdescriptioneditors/src/icons/IfIcon.tsx new file mode 100644 index 0000000000..132ce6ce27 --- /dev/null +++ b/packages/formdescriptioneditors/frontend/sirius-components-formdescriptioneditors/src/icons/IfIcon.tsx @@ -0,0 +1,27 @@ +/******************************************************************************* + * Copyright (c) 2023 Obeo. + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Obeo - initial API and implementation + *******************************************************************************/ +import SvgIcon, { SvgIconProps } from '@material-ui/core/SvgIcon'; + +export const IfIcon = (props: SvgIconProps) => { + return ( + + + + ); +}; diff --git a/packages/forms/frontend/sirius-components-forms/src/form/FormEventFragments.types.ts b/packages/forms/frontend/sirius-components-forms/src/form/FormEventFragments.types.ts index 7e29561fd6..4c8b06b368 100644 --- a/packages/forms/frontend/sirius-components-forms/src/form/FormEventFragments.types.ts +++ b/packages/forms/frontend/sirius-components-forms/src/form/FormEventFragments.types.ts @@ -362,11 +362,15 @@ export interface GQLLabelWidgetStyle { underline: boolean | null; strikeThrough: boolean | null; } -export interface GQLFlexboxContainer extends GQLWidget { + +export interface GQLContainer extends GQLWidget { + children: GQLWidget[]; +} + +export interface GQLFlexboxContainer extends GQLContainer { flexDirection: GQLFlexDirection; flexWrap: GQLFlexWrap; flexGrow: number; - children: GQLWidget[]; borderStyle: GQLContainerBorderStyle; }