Skip to content

Commit

Permalink
[2236] Add support for For/If in FormDescriptionEditor
Browse files Browse the repository at this point in the history
Bug: #2236
Signed-off-by: Pierre-Charles David <pierre-charles.david@obeo.fr>
  • Loading branch information
pcdavid committed Sep 1, 2023
1 parent 0135956 commit 40dc930
Show file tree
Hide file tree
Showing 34 changed files with 1,679 additions and 144 deletions.
Expand Up @@ -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;
Expand Down Expand Up @@ -89,39 +92,47 @@ public void handle(One<IPayload> payloadSink, Many<ChangeDescription> 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);
}
}

payloadSink.tryEmitValue(payload);
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;
}
}
Expand All @@ -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) {
Expand Down
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}
Expand Down
Expand Up @@ -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!
Expand Down
@@ -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<AbstractWidget> children;

private FormDescriptionEditorFor() {
// Prevent instantiation
}

public List<AbstractWidget> 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<Diagnostic> diagnostics;

private Supplier<String> helpTextProvider;

private boolean readOnly;

private List<AbstractWidget> 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<Diagnostic> diagnostics) {
this.diagnostics = Objects.requireNonNull(diagnostics);
return this;
}

public Builder helpTextProvider(Supplier<String> helpTextProvider) {
this.helpTextProvider = Objects.requireNonNull(helpTextProvider);
return this;
}

public Builder readOnly(boolean readOnly) {
this.readOnly = readOnly;
return this;
}

public Builder children(List<AbstractWidget> 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;
}
}
}

0 comments on commit 40dc930

Please sign in to comment.