Skip to content

Commit

Permalink
[1281] Add support for Link widget in Form representation
Browse files Browse the repository at this point in the history
Bug: #1281
Signed-off-by: Florian Barbin <florian.barbin@obeo.fr>
  • Loading branch information
florianbarbin committed Jun 23, 2022
1 parent 47679f7 commit 12b8e96
Show file tree
Hide file tree
Showing 41 changed files with 3,679 additions and 28 deletions.
4 changes: 3 additions & 1 deletion CHANGELOG.adoc
Expand Up @@ -36,7 +36,9 @@
- 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/1266[#1266] [form] Add styling support on bar-chart and pie-chart Widgets in View DSL
- https://github.com/eclipse-sirius/sirius-components/issues/1275[#1275] [form] Add support for label widget in forms
- https://github.com/eclipse-sirius/sirius-components/issues/1275[#1275] [form] Add support for Label widget in Form representation
- https://github.com/eclipse-sirius/sirius-components/issues/1281[#1281] [form] Add support for Link widget in Form representation


== v2022.5.0

Expand Down
Expand Up @@ -219,6 +219,17 @@ type Link implements Widget {
diagnostics: [Diagnostic!]!
label: String!
url: String!
display: String!
style: LinkStyle
}

type LinkStyle {
color: String
fontSize: Int
italic: Boolean
bold: Boolean
underline: Boolean
strikeThrough: Boolean
}

union Chart = BarChart | PieChart
Expand Down
@@ -0,0 +1,61 @@
/*******************************************************************************
* 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.emf.view.form;

import java.util.Objects;
import java.util.function.Function;

import org.eclipse.sirius.components.forms.LinkStyle;
import org.eclipse.sirius.components.forms.LinkStyle.Builder;
import org.eclipse.sirius.components.representations.VariableManager;
import org.eclipse.sirius.components.view.LinkDescriptionStyle;

/**
* The style provider for the Link Description widget of the View DSL.
*
* @author fbarbin
*/
public class LinkStyleProvider implements Function<VariableManager, LinkStyle> {

private final LinkDescriptionStyle viewStyle;

public LinkStyleProvider(LinkDescriptionStyle viewStyle) {
this.viewStyle = Objects.requireNonNull(viewStyle);
}

@Override
public LinkStyle apply(VariableManager variableManager) {
Builder linkStyleBuilder = LinkStyle.newLinkStyle();

String color = this.viewStyle.getColor();
if (color != null && !color.isBlank()) {
linkStyleBuilder.color(color);
}
int fontSize = this.viewStyle.getFontSize();
boolean italic = this.viewStyle.isItalic();
boolean bold = this.viewStyle.isBold();
boolean underline = this.viewStyle.isUnderline();
boolean strikeThrough = this.viewStyle.isStrikeThrough();

// @formatter:off
return linkStyleBuilder
.fontSize(fontSize)
.italic(italic)
.bold(bold)
.underline(underline)
.strikeThrough(strikeThrough)
.build();
// @formatter:on
}

}
Expand Up @@ -38,6 +38,7 @@
import org.eclipse.sirius.components.forms.CheckboxStyle;
import org.eclipse.sirius.components.forms.FlexDirection;
import org.eclipse.sirius.components.forms.LabelWidgetStyle;
import org.eclipse.sirius.components.forms.LinkStyle;
import org.eclipse.sirius.components.forms.MultiSelectStyle;
import org.eclipse.sirius.components.forms.RadioStyle;
import org.eclipse.sirius.components.forms.SelectStyle;
Expand All @@ -50,6 +51,7 @@
import org.eclipse.sirius.components.forms.description.CheckboxDescription;
import org.eclipse.sirius.components.forms.description.FlexboxContainerDescription;
import org.eclipse.sirius.components.forms.description.LabelDescription;
import org.eclipse.sirius.components.forms.description.LinkDescription;
import org.eclipse.sirius.components.forms.description.MultiSelectDescription;
import org.eclipse.sirius.components.forms.description.RadioDescription;
import org.eclipse.sirius.components.forms.description.SelectDescription;
Expand All @@ -63,6 +65,7 @@
import org.eclipse.sirius.components.representations.VariableManager;
import org.eclipse.sirius.components.view.CheckboxDescriptionStyle;
import org.eclipse.sirius.components.view.LabelDescriptionStyle;
import org.eclipse.sirius.components.view.LinkDescriptionStyle;
import org.eclipse.sirius.components.view.MultiSelectDescriptionStyle;
import org.eclipse.sirius.components.view.Operation;
import org.eclipse.sirius.components.view.RadioDescriptionStyle;
Expand Down Expand Up @@ -426,6 +429,41 @@ public AbstractWidgetDescription caseLabelDescription(org.eclipse.sirius.compone
// @formatter:on
}

@Override
public AbstractWidgetDescription caseLinkDescription(org.eclipse.sirius.components.view.LinkDescription viewLinkDescription) {
String descriptionId = this.getDescriptionId(viewLinkDescription);
WidgetIdProvider idProvider = new WidgetIdProvider();
StringValueProvider labelProvider = this.getStringValueProvider(viewLinkDescription.getLabelExpression());
StringValueProvider valueProvider = this.getStringValueProvider(viewLinkDescription.getValueExpression());
StringValueProvider displayProvider = this.getStringValueProvider(viewLinkDescription.getDisplayExpression());
Function<VariableManager, LinkStyle> styleProvider = variableManager -> {
// @formatter:off
var effectiveStyle = viewLinkDescription.getConditionalStyles().stream()
.filter(style -> this.matches(style.getCondition(), variableManager))
.map(LinkDescriptionStyle.class::cast)
.findFirst()
.orElseGet(viewLinkDescription::getStyle);
// @formatter:on
if (effectiveStyle == null) {
return null;
}
return new LinkStyleProvider(effectiveStyle).apply(variableManager);
};

// @formatter:off
return LinkDescription.newLinkDescription(descriptionId)
.idProvider(idProvider)
.labelProvider(labelProvider)
.urlProvider(valueProvider)
.displayProvider(displayProvider)
.styleProvider(styleProvider)
.diagnosticsProvider(variableManager -> List.of())
.kindProvider(diagnostic -> "") //$NON-NLS-1$
.messageProvider(diagnostic -> "") //$NON-NLS-1$
.build();
// @formatter:on
}

private Function<VariableManager, List<?>> getMultiValueProvider(String expression) {
String safeExpression = Optional.ofNullable(expression).orElse(""); //$NON-NLS-1$
return variableManager -> {
Expand Down
Expand Up @@ -43,6 +43,8 @@
import org.eclipse.sirius.components.forms.Group;
import org.eclipse.sirius.components.forms.LabelWidget;
import org.eclipse.sirius.components.forms.LabelWidgetStyle;
import org.eclipse.sirius.components.forms.Link;
import org.eclipse.sirius.components.forms.LinkStyle;
import org.eclipse.sirius.components.forms.MultiSelect;
import org.eclipse.sirius.components.forms.MultiSelectStyle;
import org.eclipse.sirius.components.forms.Page;
Expand All @@ -67,6 +69,7 @@
import org.eclipse.sirius.components.view.ConditionalBarChartDescriptionStyle;
import org.eclipse.sirius.components.view.ConditionalCheckboxDescriptionStyle;
import org.eclipse.sirius.components.view.ConditionalLabelDescriptionStyle;
import org.eclipse.sirius.components.view.ConditionalLinkDescriptionStyle;
import org.eclipse.sirius.components.view.ConditionalMultiSelectDescriptionStyle;
import org.eclipse.sirius.components.view.ConditionalPieChartDescriptionStyle;
import org.eclipse.sirius.components.view.ConditionalRadioDescriptionStyle;
Expand All @@ -78,6 +81,8 @@
import org.eclipse.sirius.components.view.LabelDescription;
import org.eclipse.sirius.components.view.LabelDescriptionStyle;
import org.eclipse.sirius.components.view.LabelStyle;
import org.eclipse.sirius.components.view.LinkDescription;
import org.eclipse.sirius.components.view.LinkDescriptionStyle;
import org.eclipse.sirius.components.view.MultiSelectDescription;
import org.eclipse.sirius.components.view.MultiSelectDescriptionStyle;
import org.eclipse.sirius.components.view.PieChartDescription;
Expand Down Expand Up @@ -122,7 +127,7 @@ void testRenderEcoreForm() throws Exception {
assertThat(result.getPages()).extracting(Page::getGroups).hasSize(1);

Group group = result.getPages().get(0).getGroups().get(0);
assertThat(group.getWidgets()).hasSize(10);
assertThat(group.getWidgets()).hasSize(11);
Textfield textfield = (Textfield) group.getWidgets().get(0);
Textarea textarea = (Textarea) group.getWidgets().get(1);
MultiSelect multiSelect = (MultiSelect) group.getWidgets().get(2);
Expand All @@ -133,6 +138,7 @@ void testRenderEcoreForm() throws Exception {
ChartWidget chartWidgetWithPieChart = (ChartWidget) group.getWidgets().get(7);
FlexboxContainer flexboxContainer = (FlexboxContainer) group.getWidgets().get(8);
LabelWidget labelWidget = (LabelWidget) group.getWidgets().get(9);
Link link = (Link) group.getWidgets().get(10);

assertThat(textfield.getValue()).isEqualTo("Class1"); //$NON-NLS-1$
assertThat(textfield.getLabel()).isEqualTo("EClass name"); //$NON-NLS-1$
Expand Down Expand Up @@ -161,6 +167,11 @@ void testRenderEcoreForm() throws Exception {
assertThat(labelWidget.getLabel()).isEqualTo("Label EClass name"); //$NON-NLS-1$
this.testNoStyle(labelWidget);

assertThat(link.getLabel()).isEqualTo("Label EClass link"); //$NON-NLS-1$
assertThat(link.getUrl()).isEqualTo("myHyperLink"); //$NON-NLS-1$
assertThat(link.getDisplay()).isEqualTo("myHyperLinkDisplayed"); //$NON-NLS-1$
this.testNoStyle(link);

assertThat(radio.getOptions()).hasSize(3);
assertThat(radio.getOptions()).allSatisfy(option -> {
if (option.getLabel().equals("Class2")) { //$NON-NLS-1$
Expand Down Expand Up @@ -283,7 +294,7 @@ void testRenderEcoreFormWithStyle() throws Exception {
assertThat(result.getPages()).extracting(Page::getGroups).hasSize(1);

Group group = result.getPages().get(0).getGroups().get(0);
assertThat(group.getWidgets()).hasSize(10);
assertThat(group.getWidgets()).hasSize(11);
Textfield textfield = (Textfield) group.getWidgets().get(0);
Textarea textarea = (Textarea) group.getWidgets().get(1);
MultiSelect multiSelect = (MultiSelect) group.getWidgets().get(2);
Expand All @@ -294,6 +305,7 @@ void testRenderEcoreFormWithStyle() throws Exception {
ChartWidget chartWidgetWithPieChart = (ChartWidget) group.getWidgets().get(7);
FlexboxContainer flexboxContainer = (FlexboxContainer) group.getWidgets().get(8);
LabelWidget labelWidget = (LabelWidget) group.getWidgets().get(9);
Link link = (Link) group.getWidgets().get(10);

assertThat(textfield.getValue()).isEqualTo("Class1"); //$NON-NLS-1$
assertThat(textfield.getLabel()).isEqualTo("EClass name"); //$NON-NLS-1$
Expand Down Expand Up @@ -333,6 +345,11 @@ void testRenderEcoreFormWithStyle() throws Exception {
assertThat(labelWidget.getLabel()).isEqualTo("Label EClass name"); //$NON-NLS-1$
this.testStyle(labelWidget);

assertThat(link.getLabel()).isEqualTo("Label EClass link"); //$NON-NLS-1$
assertThat(link.getUrl()).isEqualTo("myHyperLink"); //$NON-NLS-1$
assertThat(link.getDisplay()).isEqualTo("myHyperLinkDisplayed"); //$NON-NLS-1$
this.testStyle(link);

this.checkBarChart(chartWidgetWithBarChart, true, false);

this.checkPieChart(chartWidgetWithPieChart, true, false);
Expand Down Expand Up @@ -370,7 +387,7 @@ void testRenderEcoreFormWithConditionalStyle() throws Exception {
assertThat(result.getPages()).extracting(Page::getGroups).hasSize(1);

Group group = result.getPages().get(0).getGroups().get(0);
assertThat(group.getWidgets()).hasSize(10);
assertThat(group.getWidgets()).hasSize(11);
Textfield textfield = (Textfield) group.getWidgets().get(0);
Textarea textarea = (Textarea) group.getWidgets().get(1);
MultiSelect multiSelect = (MultiSelect) group.getWidgets().get(2);
Expand All @@ -381,6 +398,7 @@ void testRenderEcoreFormWithConditionalStyle() throws Exception {
ChartWidget chartWidgetWithPieChart = (ChartWidget) group.getWidgets().get(7);
FlexboxContainer flexboxContainer = (FlexboxContainer) group.getWidgets().get(8);
LabelWidget labelWidget = (LabelWidget) group.getWidgets().get(9);
Link link = (Link) group.getWidgets().get(10);

assertThat(textfield.getValue()).isEqualTo("Class1"); //$NON-NLS-1$
assertThat(textfield.getLabel()).isEqualTo("EClass name"); //$NON-NLS-1$
Expand Down Expand Up @@ -420,6 +438,11 @@ void testRenderEcoreFormWithConditionalStyle() throws Exception {
assertThat(labelWidget.getLabel()).isEqualTo("Label EClass name"); //$NON-NLS-1$
this.testConditionalStyle(labelWidget);

assertThat(link.getLabel()).isEqualTo("Label EClass link"); //$NON-NLS-1$
assertThat(link.getUrl()).isEqualTo("myHyperLink"); //$NON-NLS-1$
assertThat(link.getDisplay()).isEqualTo("myHyperLinkDisplayed"); //$NON-NLS-1$
this.testConditionalStyle(link);

this.checkBarChart(chartWidgetWithBarChart, false, true);

this.checkPieChart(chartWidgetWithPieChart, false, true);
Expand Down Expand Up @@ -449,14 +472,14 @@ void testEditingEcoreForm() throws Exception {
this.buildFixture();
FormDescription eClassFormDescription = this.createClassFormDescription(false, false);
Form form = this.render(eClassFormDescription, this.eClass1);
assertThat(form.getPages()).flatExtracting(Page::getGroups).flatExtracting(Group::getWidgets).hasSize(10);
assertThat(form.getPages()).flatExtracting(Page::getGroups).flatExtracting(Group::getWidgets).hasSize(11);

this.checkValuesEditing(this.eClass1, form);
}

private void checkValuesEditing(EClass eClass, Form form) {
Group group = form.getPages().get(0).getGroups().get(0);
assertThat(group.getWidgets()).hasSize(10);
assertThat(group.getWidgets()).hasSize(11);

Textfield textfield = (Textfield) group.getWidgets().get(0);
assertThat(textfield.getValue()).isEqualTo("Class1"); //$NON-NLS-1$
Expand Down Expand Up @@ -541,6 +564,8 @@ private FormDescription createClassFormDescription(boolean withStyle, boolean wi
formDescription.getWidgets().add(flexboxContainerDescription);
LabelDescription labelDescription = this.createLabel(withStyle, withConditionalStyle);
formDescription.getWidgets().add(labelDescription);
LinkDescription linkDescription = this.createLink(withStyle, withConditionalStyle);
formDescription.getWidgets().add(linkDescription);
return formDescription;
}

Expand Down Expand Up @@ -801,6 +826,29 @@ private LabelDescription createLabel(boolean withStyle, boolean withConditionalS
return labelDescription;
}

private LinkDescription createLink(boolean withStyle, boolean withConditionalStyle) {
LinkDescription linkDescription = ViewFactory.eINSTANCE.createLinkDescription();
linkDescription.setLabelExpression("aql:'Label EClass link'"); //$NON-NLS-1$
linkDescription.setValueExpression("myHyperLink"); //$NON-NLS-1$
linkDescription.setDisplayExpression("aql:value+'Displayed'"); //$NON-NLS-1$
linkDescription.setName("Class Name"); //$NON-NLS-1$
if (withStyle) {
LinkDescriptionStyle style = ViewFactory.eINSTANCE.createLinkDescriptionStyle();
style.setColor("#de1000"); //$NON-NLS-1$
this.setFontStyle(style);
linkDescription.setStyle(style);
}
if (withConditionalStyle) {
ConditionalLinkDescriptionStyle conditionalStyle = ViewFactory.eINSTANCE.createConditionalLinkDescriptionStyle();
conditionalStyle.setCondition("aql:true"); //$NON-NLS-1$
conditionalStyle.setColor("#fbb800"); //$NON-NLS-1$
this.setConditionalFontStyle(conditionalStyle);
linkDescription.getConditionalStyles().add(conditionalStyle);
}

return linkDescription;
}

private void setFontStyle(LabelStyle labelStyle) {
labelStyle.setFontSize(20);
labelStyle.setItalic(true);
Expand Down Expand Up @@ -878,6 +926,25 @@ private void testConditionalStyle(LabelWidget labelWidget) {
this.testConditionalFontStyle(labelWidgetStyle);
}

private void testNoStyle(Link link) {
LinkStyle linkStyle = link.getStyle();
assertThat(linkStyle).isNull();
}

private void testStyle(Link link) {
LinkStyle linkStyle = link.getStyle();
assertThat(linkStyle).isNotNull();
assertThat(linkStyle.getColor()).isEqualTo("#de1000"); //$NON-NLS-1$
this.testFontStyle(linkStyle);
}

private void testConditionalStyle(Link link) {
LinkStyle linkStyle = link.getStyle();
assertThat(linkStyle).isNotNull();
assertThat(linkStyle.getColor()).isEqualTo("#fbb800"); //$NON-NLS-1$
this.testConditionalFontStyle(linkStyle);
}

private void testStyle(Radio radio) {
RadioStyle radioStyle = radio.getStyle();
assertThat(radioStyle).isNotNull();
Expand Down

0 comments on commit 12b8e96

Please sign in to comment.