Skip to content

Commit

Permalink
[1265] Handle Flexbox Container on FormDescriptionEditors
Browse files Browse the repository at this point in the history
Bug: eclipse-sirius#1265
Signed-off-by: Axel RICHARD <axel.richard@obeo.fr>
  • Loading branch information
AxelRICHARD committed Jun 15, 2022
1 parent 38e1f3b commit 91f7ab9
Show file tree
Hide file tree
Showing 39 changed files with 1,645 additions and 170 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.adoc
Expand Up @@ -35,6 +35,7 @@
- https://github.com/eclipse-sirius/sirius-components/issues/1248[#1248] [charts] Add support for pie-chart in Form representation
- https://github.com/eclipse-sirius/sirius-components/issues/1255[#1255] [form] Add support for charts in form descriptions editor
- https://github.com/eclipse-sirius/sirius-components/issues/1244[#1244] [form] Add support for flexbox containers on FormDescriptions
- https://github.com/eclipse-sirius/sirius-components/issues/1265[#1265] [form] Add support for flexbox containers on FormDescriptionEditors

== v2022.5.0

Expand Down
Expand Up @@ -31,6 +31,8 @@ public class AddWidgetInput implements IFormDescriptionEditorInput {

private String representationId;

private String containerId;

private String kind;

private int index;
Expand All @@ -39,10 +41,13 @@ public AddWidgetInput() {
// Used by jackson
}

public AddWidgetInput(UUID id, String editingContextId, String representationId) {
public AddWidgetInput(UUID id, String editingContextId, String representationId, String containerId, String kind, int index) {
this.id = Objects.requireNonNull(id);
this.editingContextId = Objects.requireNonNull(editingContextId);
this.representationId = Objects.requireNonNull(representationId);
this.containerId = Objects.requireNonNull(containerId);
this.kind = Objects.requireNonNull(kind);
this.index = Objects.requireNonNull(index);
}

@Override
Expand All @@ -59,6 +64,10 @@ public String getEditingContextId() {
return this.editingContextId;
}

public String getContainerId() {
return this.containerId;
}

public String getKind() {
return this.kind;
}
Expand All @@ -69,8 +78,8 @@ public int getIndex() {

@Override
public String toString() {
String pattern = "{0} '{'id: {1}, editingContextId: {2}, representationId: {3}; kind: {4}, index: {5}}'"; //$NON-NLS-1$
return MessageFormat.format(pattern, this.getClass().getSimpleName(), this.id, this.editingContextId, this.representationId, this.kind, this.index);
String pattern = "{0} '{'id: {1}, editingContextId: {2}, representationId: {3}, containerId: {4}, kind: {5}, index: {6}}'"; //$NON-NLS-1$
return MessageFormat.format(pattern, this.getClass().getSimpleName(), this.id, this.editingContextId, this.representationId, this.containerId, this.kind, this.index);
}

}
Expand Up @@ -31,6 +31,8 @@ public class MoveWidgetInput implements IFormDescriptionEditorInput {

private String representationId;

private String containerId;

private String widgetId;

private int index;
Expand All @@ -39,10 +41,13 @@ public MoveWidgetInput() {
// Used by jackson
}

public MoveWidgetInput(UUID id, String editingContextId, String representationId) {
public MoveWidgetInput(UUID id, String editingContextId, String representationId, String containerId, String widgetId, int index) {
this.id = Objects.requireNonNull(id);
this.editingContextId = Objects.requireNonNull(editingContextId);
this.representationId = Objects.requireNonNull(representationId);
this.containerId = Objects.requireNonNull(containerId);
this.widgetId = Objects.requireNonNull(widgetId);
this.index = Objects.requireNonNull(index);
}

@Override
Expand All @@ -59,6 +64,10 @@ public String getEditingContextId() {
return this.editingContextId;
}

public String getContainerId() {
return this.containerId;
}

public String getWidgetId() {
return this.widgetId;
}
Expand All @@ -69,8 +78,8 @@ public int getIndex() {

@Override
public String toString() {
String pattern = "{0} '{'id: {1}, editingContextId: {2}, representationId: {3}; widgetId: {4}, index: {5}}'"; //$NON-NLS-1$
return MessageFormat.format(pattern, this.getClass().getSimpleName(), this.id, this.editingContextId, this.representationId, this.widgetId, this.index);
String pattern = "{0} '{'id: {1}, editingContextId: {2}, representationId: {3}, containerId: {4}, widgetId: {5}, index: {6}}'"; //$NON-NLS-1$
return MessageFormat.format(pattern, this.getClass().getSimpleName(), this.id, this.editingContextId, this.representationId, this.containerId, this.widgetId, this.index);
}

}
Expand Up @@ -13,6 +13,7 @@
package org.eclipse.sirius.components.collaborative.formdescriptioneditors.handlers;

import java.util.Objects;
import java.util.Optional;

import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EClassifier;
Expand All @@ -30,6 +31,8 @@
import org.eclipse.sirius.components.core.api.IEditingContext;
import org.eclipse.sirius.components.core.api.IObjectService;
import org.eclipse.sirius.components.core.api.IPayload;
import org.eclipse.sirius.components.view.FlexDirection;
import org.eclipse.sirius.components.view.FlexboxContainerDescription;
import org.eclipse.sirius.components.view.FormDescription;
import org.eclipse.sirius.components.view.ViewFactory;
import org.eclipse.sirius.components.view.WidgetDescription;
Expand Down Expand Up @@ -81,9 +84,10 @@ public void handle(One<IPayload> payloadSink, Many<ChangeDescription> changeDesc
ChangeDescription changeDescription = new ChangeDescription(ChangeKind.NOTHING, formDescriptionEditorInput.getRepresentationId(), formDescriptionEditorInput);

if (formDescriptionEditorInput instanceof AddWidgetInput) {
String containerId = ((AddWidgetInput) formDescriptionEditorInput).getContainerId();
String kind = ((AddWidgetInput) formDescriptionEditorInput).getKind();
int index = ((AddWidgetInput) formDescriptionEditorInput).getIndex();
boolean addWidget = this.addWidget(editingContext, formDescriptionEditorContext, kind, index);
boolean addWidget = this.addWidget(editingContext, formDescriptionEditorContext, containerId, kind, index);
if (addWidget) {
payload = new AddWidgetSuccessPayload(formDescriptionEditorInput.getId());
changeDescription = new ChangeDescription(ChangeKind.SEMANTIC_CHANGE, formDescriptionEditorInput.getRepresentationId(), formDescriptionEditorInput);
Expand All @@ -94,23 +98,35 @@ public void handle(One<IPayload> payloadSink, Many<ChangeDescription> changeDesc
changeDescriptionSink.tryEmitNext(changeDescription);
}

protected boolean addWidget(IEditingContext editingContext, IFormDescriptionEditorContext formDescriptionEditorContext, String kind, int index) {
var optionalSelf = this.objectService.getObject(editingContext, formDescriptionEditorContext.getFormDescriptionEditor().getTargetObjectId());
protected boolean addWidget(IEditingContext editingContext, IFormDescriptionEditorContext formDescriptionEditorContext, String containerId, String kind, int index) {
boolean success = false;
var optionalSelf = Optional.empty();
if (containerId != null) {
optionalSelf = this.objectService.getObject(editingContext, containerId);
} else {
optionalSelf = this.objectService.getObject(editingContext, formDescriptionEditorContext.getFormDescriptionEditor().getTargetObjectId());
}
if (optionalSelf.isPresent()) {
Object formDescription = optionalSelf.get();
if (formDescription instanceof FormDescription) {
EClassifier eClassifier = ViewFactory.eINSTANCE.getEPackage().getEClassifier(kind + "Description"); //$NON-NLS-1$
if (eClassifier instanceof EClass) {
var widgetDescription = ViewFactory.eINSTANCE.create((EClass) eClassifier);
if (widgetDescription instanceof WidgetDescription) {
this.createStyle((WidgetDescription) widgetDescription);
((FormDescription) formDescription).getWidgets().add(index, (WidgetDescription) widgetDescription);
return true;
Object container = optionalSelf.get();
EClassifier eClassifier = ViewFactory.eINSTANCE.getEPackage().getEClassifier(kind + "Description"); //$NON-NLS-1$
if (eClassifier instanceof EClass) {
var widgetDescription = ViewFactory.eINSTANCE.create((EClass) eClassifier);
if (widgetDescription instanceof FlexboxContainerDescription) {
((FlexboxContainerDescription) widgetDescription).setFlexDirection(FlexDirection.get(kind));
}
if (widgetDescription instanceof WidgetDescription) {
this.createStyle((WidgetDescription) widgetDescription);
if (container instanceof FormDescription) {
((FormDescription) container).getWidgets().add(index, (WidgetDescription) widgetDescription);
success = true;
} else if (container instanceof FlexboxContainerDescription) {
((FlexboxContainerDescription) container).getChildren().add(index, (WidgetDescription) widgetDescription);
success = true;
}
}
}
}
return false;
return success;
}

private void createStyle(WidgetDescription widgetDescription) {
Expand Down
Expand Up @@ -28,6 +28,7 @@
import org.eclipse.sirius.components.core.api.IEditingContext;
import org.eclipse.sirius.components.core.api.IObjectService;
import org.eclipse.sirius.components.core.api.IPayload;
import org.eclipse.sirius.components.view.FlexboxContainerDescription;
import org.eclipse.sirius.components.view.FormDescription;
import org.eclipse.sirius.components.view.WidgetDescription;
import org.springframework.stereotype.Service;
Expand Down Expand Up @@ -77,9 +78,10 @@ public void handle(One<IPayload> payloadSink, Many<ChangeDescription> changeDesc
ChangeDescription changeDescription = new ChangeDescription(ChangeKind.NOTHING, formDescriptionEditorInput.getRepresentationId(), formDescriptionEditorInput);

if (formDescriptionEditorInput instanceof MoveWidgetInput) {
String containerId = ((MoveWidgetInput) formDescriptionEditorInput).getContainerId();
String widgetId = ((MoveWidgetInput) formDescriptionEditorInput).getWidgetId();
int index = ((MoveWidgetInput) formDescriptionEditorInput).getIndex();
boolean moveWidget = this.moveWidget(editingContext, formDescriptionEditorContext, widgetId, index);
boolean moveWidget = this.moveWidget(editingContext, formDescriptionEditorContext, containerId, widgetId, index);
if (moveWidget) {
payload = new MoveWidgetSuccessPayload(formDescriptionEditorInput.getId());
changeDescription = new ChangeDescription(ChangeKind.SEMANTIC_CHANGE, formDescriptionEditorInput.getRepresentationId(), formDescriptionEditorInput);
Expand All @@ -90,18 +92,36 @@ public void handle(One<IPayload> payloadSink, Many<ChangeDescription> changeDesc
changeDescriptionSink.tryEmitNext(changeDescription);
}

protected boolean moveWidget(IEditingContext editingContext, IFormDescriptionEditorContext formDescriptionEditorContext, String widgetId, int index) {
var optionalSelf = this.objectService.getObject(editingContext, formDescriptionEditorContext.getFormDescriptionEditor().getTargetObjectId());
protected boolean moveWidget(IEditingContext editingContext, IFormDescriptionEditorContext formDescriptionEditorContext, String containerId, String widgetId, int index) {
boolean success = false;
var optionalSelf = Optional.empty();
if (containerId != null) {
optionalSelf = this.objectService.getObject(editingContext, containerId);
} else {
optionalSelf = this.objectService.getObject(editingContext, formDescriptionEditorContext.getFormDescriptionEditor().getTargetObjectId());
}
if (optionalSelf.isPresent()) {
Object formDescription = optionalSelf.get();
if (formDescription instanceof FormDescription) {
Optional<Object> widgetToMove = this.objectService.getObject(editingContext, widgetId);
if (widgetToMove.filter(WidgetDescription.class::isInstance).isPresent()) {
((FormDescription) formDescription).getWidgets().move(index, (WidgetDescription) widgetToMove.get());
return true;
Object container = optionalSelf.get();
var objectToMove = this.objectService.getObject(editingContext, widgetId);
if (objectToMove.filter(WidgetDescription.class::isInstance).isPresent()) {
WidgetDescription widgetToMove = (WidgetDescription) objectToMove.get();
if (container instanceof FormDescription) {
if (container.equals(widgetToMove.eContainer())) {
((FormDescription) container).getWidgets().move(index, widgetToMove);
} else {
((FormDescription) container).getWidgets().add(index, widgetToMove);
}
success = true;
} else if (container instanceof FlexboxContainerDescription) {
if (container.equals(widgetToMove.eContainer())) {
((FlexboxContainerDescription) container).getChildren().move(index, widgetToMove);
} else {
((FlexboxContainerDescription) container).getChildren().add(index, widgetToMove);
}
success = true;
}
}
}
return false;
return success;
}
}
Expand Up @@ -18,18 +18,34 @@ type FormDescriptionEditorRefreshedEventPayload {
type FormDescriptionEditor implements Representation {
id: ID!
metadata: RepresentationMetadata!
widgets: [FormDescriptionEditorWidget!]!
widgets: [AbstractFormDescriptionEditorWidget!]!
}

type FormDescriptionEditorDescription implements RepresentationDescription {
id: ID!
label: String!
}

type FormDescriptionEditorWidget {
interface AbstractFormDescriptionEditorWidget {
id: ID!
kind: String!
label: String!
}

type FormDescriptionEditorWidget implements AbstractFormDescriptionEditorWidget {
id: ID!
kind: String!
label: String!
}

type FormDescriptionEditorFlexboxContainer implements AbstractFormDescriptionEditorWidget {
id: ID!
kind: String!
label: String!
flexDirection: String!
flexWrap: String!
flexGrow: Int!
children: [AbstractFormDescriptionEditorWidget!]!
}

extend type Mutation {
Expand All @@ -42,6 +58,7 @@ input AddWidgetInput {
id: ID!
editingContextId: ID!
representationId: ID!
containerId: ID
kind: String!
index: Int!
}
Expand Down Expand Up @@ -69,6 +86,7 @@ input MoveWidgetInput {
id: ID!
editingContextId: ID!
representationId: ID!
containerId: ID
widgetId: String!
index: Int!
}
Expand Down
Expand Up @@ -44,11 +44,11 @@ public class AddWidgetEventHandlerTests {
public void testArrangeAll() {
var handler = new AddWidgetEventHandler(new IObjectService.NoOp(), new ICollaborativeFormDescriptionEditorMessageService.NoOp(), new SimpleMeterRegistry()) {
@Override
protected boolean addWidget(IEditingContext editingContext, IFormDescriptionEditorContext formDescriptionEditorContext, String kind, int index) {
protected boolean addWidget(IEditingContext editingContext, IFormDescriptionEditorContext formDescriptionEditorContext, String containerId, String kind, int index) {
return true;
}
};
var input = new AddWidgetInput(UUID.randomUUID(), "editingContextId", "representationId"); //$NON-NLS-1$//$NON-NLS-2$
var input = new AddWidgetInput(UUID.randomUUID(), "editingContextId", "representationId", "containerId", "kind", 0); //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$

assertThat(handler.canHandle(input)).isTrue();

Expand Down
@@ -0,0 +1,43 @@
/*******************************************************************************
* Copyright (c) 2022 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;

/**
* Abstract class to be extended by all the widgets of the form-description-editor representation.
*
* @author arichard
*/
public class AbstractFormDescriptionEditorWidget implements IFormDescriptionEditorWidget {

protected String id;

protected String kind;

protected String label;

@Override
public String getId() {
return this.id;
}

@Override
public String getKind() {
return this.kind;
}

@Override
public String getLabel() {
return this.label;
}

}
Expand Up @@ -42,7 +42,7 @@ public final class FormDescriptionEditor implements IRepresentation, ISemanticRe

private String descriptionId;

private List<FormDescriptionEditorWidget> widgets;
private List<AbstractFormDescriptionEditorWidget> widgets;

private FormDescriptionEditor() {
// Prevent instantiation
Expand Down Expand Up @@ -73,7 +73,7 @@ public String getDescriptionId() {
return this.descriptionId;
}

public List<FormDescriptionEditorWidget> getWidgets() {
public List<AbstractFormDescriptionEditorWidget> getWidgets() {
return this.widgets;
}

Expand Down Expand Up @@ -108,7 +108,7 @@ public static final class Builder {

private String descriptionId;

private List<FormDescriptionEditorWidget> widgets;
private List<AbstractFormDescriptionEditorWidget> widgets;

private Builder(String id) {
this.id = Objects.requireNonNull(id);
Expand Down Expand Up @@ -137,7 +137,7 @@ public Builder descriptionId(String descriptionId) {
return this;
}

public Builder widgets(List<FormDescriptionEditorWidget> widgets) {
public Builder widgets(List<AbstractFormDescriptionEditorWidget> widgets) {
this.widgets = Objects.requireNonNull(widgets);
return this;
}
Expand Down

0 comments on commit 91f7ab9

Please sign in to comment.