diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index 0ea28ca314..bc3ddec12f 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -92,6 +92,7 @@ image:doc/images/Diagram_closed_arrow_with_dots.png[closed arrow with dots] + - https://github.com/eclipse-sirius/sirius-components/issues/2098[#2098] [forms] Enable vertical scrolling on the Reference widget's when showing more than a few values. +- https://github.com/eclipse-sirius/sirius-components/issues/2123[#2123] [tree] Add support for non-selectable tree items == v2023.6.0 diff --git a/packages/sirius-web/backend/sirius-web-services/src/main/java/org/eclipse/sirius/web/services/explorer/ExplorerDescriptionProvider.java b/packages/sirius-web/backend/sirius-web-services/src/main/java/org/eclipse/sirius/web/services/explorer/ExplorerDescriptionProvider.java index a98d59381f..2f7332f435 100644 --- a/packages/sirius-web/backend/sirius-web-services/src/main/java/org/eclipse/sirius/web/services/explorer/ExplorerDescriptionProvider.java +++ b/packages/sirius-web/backend/sirius-web-services/src/main/java/org/eclipse/sirius/web/services/explorer/ExplorerDescriptionProvider.java @@ -29,8 +29,8 @@ import org.eclipse.sirius.components.compatibility.services.ImageConstants; import org.eclipse.sirius.components.core.RepresentationMetadata; import org.eclipse.sirius.components.core.api.IEditingContext; -import org.eclipse.sirius.components.core.api.IURLParser; import org.eclipse.sirius.components.core.api.IObjectService; +import org.eclipse.sirius.components.core.api.IURLParser; import org.eclipse.sirius.components.core.api.SemanticKindConstants; import org.eclipse.sirius.components.emf.services.EditingContext; import org.eclipse.sirius.components.representations.Failure; @@ -96,6 +96,7 @@ public TreeDescription getDescription() { .imageURLProvider(this::getImageURL) .editableProvider(this::isEditable) .deletableProvider(this::isDeletable) + .selectableProvider(this::isSelectable) .elementsProvider(this::getElements) .hasChildrenProvider(this::hasChildren) .childrenProvider(this::getChildren) @@ -186,6 +187,10 @@ private boolean isDeletable(VariableManager variableManager) { return true; } + private boolean isSelectable(VariableManager variableManager) { + return true; + } + private String getImageURL(VariableManager variableManager) { Object self = variableManager.getVariables().get(VariableManager.SELF); diff --git a/packages/trees/backend/sirius-components-collaborative-trees/src/main/resources/schema/tree.graphqls b/packages/trees/backend/sirius-components-collaborative-trees/src/main/resources/schema/tree.graphqls index ec4848e6b3..97d043ee2a 100644 --- a/packages/trees/backend/sirius-components-collaborative-trees/src/main/resources/schema/tree.graphqls +++ b/packages/trees/backend/sirius-components-collaborative-trees/src/main/resources/schema/tree.graphqls @@ -39,6 +39,7 @@ type TreeItem { imageURL: String! editable: Boolean! deletable: Boolean! + selectable: Boolean! expanded: Boolean! hasChildren: Boolean! children: [TreeItem]! diff --git a/packages/trees/backend/sirius-components-trees/src/main/java/org/eclipse/sirius/components/trees/TreeItem.java b/packages/trees/backend/sirius-components-trees/src/main/java/org/eclipse/sirius/components/trees/TreeItem.java index bbbae739ee..b6992a8e3c 100644 --- a/packages/trees/backend/sirius-components-trees/src/main/java/org/eclipse/sirius/components/trees/TreeItem.java +++ b/packages/trees/backend/sirius-components-trees/src/main/java/org/eclipse/sirius/components/trees/TreeItem.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2019, 2022 Obeo. + * Copyright (c) 2019, 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 @@ -40,6 +40,8 @@ public final class TreeItem { private boolean deletable; + private boolean selectable; + private boolean hasChildren; private boolean expanded; @@ -70,6 +72,10 @@ public boolean isDeletable() { return this.deletable; } + public boolean isSelectable() { + return this.selectable; + } + public String getImageURL() { return this.imageURL; } @@ -116,6 +122,8 @@ public static final class Builder { private boolean deletable; + private boolean selectable; + private boolean hasChildren; private boolean expanded; @@ -142,12 +150,17 @@ public Builder imageURL(String imageURL) { } public Builder editable(boolean editable) { - this.editable = Objects.requireNonNull(editable); + this.editable = editable; return this; } public Builder deletable(boolean deletable) { - this.deletable = Objects.requireNonNull(deletable); + this.deletable = deletable; + return this; + } + + public Builder selectable(boolean selectable) { + this.selectable = selectable; return this; } @@ -172,10 +185,11 @@ public TreeItem build() { treeItem.kind = Objects.requireNonNull(this.kind); treeItem.label = Objects.requireNonNull(this.label); treeItem.imageURL = Objects.requireNonNull(this.imageURL); - treeItem.editable = Objects.requireNonNull(this.editable); - treeItem.deletable = Objects.requireNonNull(this.deletable); - treeItem.expanded = Objects.requireNonNull(this.expanded); - treeItem.hasChildren = Objects.requireNonNull(this.hasChildren); + treeItem.editable = this.editable; + treeItem.deletable = this.deletable; + treeItem.selectable = this.selectable; + treeItem.expanded = this.expanded; + treeItem.hasChildren = this.hasChildren; treeItem.children = Objects.requireNonNull(this.children); return treeItem; } diff --git a/packages/trees/backend/sirius-components-trees/src/main/java/org/eclipse/sirius/components/trees/description/TreeDescription.java b/packages/trees/backend/sirius-components-trees/src/main/java/org/eclipse/sirius/components/trees/description/TreeDescription.java index d2c04065e0..49e47ac5d4 100644 --- a/packages/trees/backend/sirius-components-trees/src/main/java/org/eclipse/sirius/components/trees/description/TreeDescription.java +++ b/packages/trees/backend/sirius-components-trees/src/main/java/org/eclipse/sirius/components/trees/description/TreeDescription.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2019, 2022 Obeo. + * Copyright (c) 2019, 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 @@ -49,6 +49,8 @@ public final class TreeDescription implements IRepresentationDescription { private Function deletableProvider; + private Function selectableProvider; + private Function> elementsProvider; private Function> childrenProvider; @@ -103,6 +105,11 @@ public Function getDeletableProvider() { return this.deletableProvider; } + public Function getSelectableProvider() { + return this.selectableProvider; + } + + public Function> getElementsProvider() { return this.elementsProvider; } @@ -163,6 +170,8 @@ public static final class Builder { private Function deletableProvider; + private Function selectableProvider = (variableManager) -> true; + private Function> elementsProvider; private Function> childrenProvider; @@ -219,6 +228,11 @@ public Builder deletableProvider(Function deletablePro return this; } + public Builder selectableProvider(Function selectableProvider) { + this.selectableProvider = Objects.requireNonNull(selectableProvider); + return this; + } + public Builder elementsProvider(Function> elementsProvider) { this.elementsProvider = Objects.requireNonNull(elementsProvider); return this; @@ -260,6 +274,7 @@ public TreeDescription build() { treeDescription.imageURLProvider = Objects.requireNonNull(this.imageURLProvider); treeDescription.editableProvider = Objects.requireNonNull(this.editableProvider); treeDescription.deletableProvider = Objects.requireNonNull(this.deletableProvider); + treeDescription.selectableProvider = Objects.requireNonNull(this.selectableProvider); treeDescription.elementsProvider = Objects.requireNonNull(this.elementsProvider); treeDescription.childrenProvider = Objects.requireNonNull(this.childrenProvider); treeDescription.hasChildrenProvider = Objects.requireNonNull(this.hasChildrenProvider); diff --git a/packages/trees/backend/sirius-components-trees/src/main/java/org/eclipse/sirius/components/trees/renderer/TreeRenderer.java b/packages/trees/backend/sirius-components-trees/src/main/java/org/eclipse/sirius/components/trees/renderer/TreeRenderer.java index 87e8699b14..20e8fc5fcd 100644 --- a/packages/trees/backend/sirius-components-trees/src/main/java/org/eclipse/sirius/components/trees/renderer/TreeRenderer.java +++ b/packages/trees/backend/sirius-components-trees/src/main/java/org/eclipse/sirius/components/trees/renderer/TreeRenderer.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2019, 2022 Obeo. + * Copyright (c) 2019, 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 @@ -66,6 +66,7 @@ private TreeItem renderTreeItem(VariableManager treeItemVariableManager) { String label = this.treeDescription.getLabelProvider().apply(treeItemVariableManager); boolean editable = this.treeDescription.getEditableProvider().apply(treeItemVariableManager); boolean deletable = this.treeDescription.getDeletableProvider().apply(treeItemVariableManager); + boolean selectable = this.treeDescription.getSelectableProvider().apply(treeItemVariableManager); String imageURL = this.treeDescription.getImageURLProvider().apply(treeItemVariableManager); Boolean hasChildren = this.treeDescription.getHasChildrenProvider().apply(treeItemVariableManager); @@ -85,6 +86,7 @@ private TreeItem renderTreeItem(VariableManager treeItemVariableManager) { .label(label) .editable(editable) .deletable(deletable) + .selectable(selectable) .imageURL(imageURL) .children(childrenTreeItems) .hasChildren(hasChildren) diff --git a/packages/trees/frontend/sirius-components-trees/src/treeitems/TreeItem.tsx b/packages/trees/frontend/sirius-components-trees/src/treeitems/TreeItem.tsx index 145eb83a40..aaa28f6144 100644 --- a/packages/trees/frontend/sirius-components-trees/src/treeitems/TreeItem.tsx +++ b/packages/trees/frontend/sirius-components-trees/src/treeitems/TreeItem.tsx @@ -48,6 +48,9 @@ const useTreeItemStyle = makeStyles((theme) => ({ backgroundColor: 'var(--blue-lagoon-lighten-90)', }, }, + nonSelectable: { + fontStyle: 'italic', + }, arrow: { cursor: 'pointer', }, @@ -191,7 +194,11 @@ export const TreeItem = ({ onExpand={onExpand} onExpandAll={onExpandAll} selection={selection} - setSelection={setSelection} + setSelection={(selection) => { + if (item.selectable) { + setSelection(selection); + } + }} enterEditingMode={enterEditingMode} onClose={closeContextMenu} /> @@ -213,7 +220,11 @@ export const TreeItem = ({ onExpand={onExpand} onExpandAll={onExpandAll} selection={selection} - setSelection={setSelection} + setSelection={(selection) => { + if (childItem.selectable) { + setSelection(selection); + } + }} readOnly={readOnly} textToHighlight={textToHighlight} isFilterEnabled={isFilterEnabled} @@ -289,7 +300,11 @@ export const TreeItem = ({ ); } text = ( - + {itemLabel} ); @@ -301,6 +316,9 @@ export const TreeItem = ({ if (event.ctrlKey || event.metaKey) { event.stopPropagation(); + if (!item.selectable) { + return; + } const isItemInSelection = selection.entries.find((entry) => entry.id === item.id); if (isItemInSelection) { const newSelection: Selection = { entries: selection.entries.filter((entry) => entry.id !== item.id) }; diff --git a/packages/trees/frontend/sirius-components-trees/src/views/ExplorerView.types.ts b/packages/trees/frontend/sirius-components-trees/src/views/ExplorerView.types.ts index 509560b24b..2a55cfc625 100644 --- a/packages/trees/frontend/sirius-components-trees/src/views/ExplorerView.types.ts +++ b/packages/trees/frontend/sirius-components-trees/src/views/ExplorerView.types.ts @@ -50,6 +50,7 @@ export interface GQLTreeItem { expanded: boolean; editable: boolean; deletable: boolean; + selectable: boolean; } export interface GQLGetTreePathVariables { diff --git a/packages/trees/frontend/sirius-components-trees/src/views/__tests__/GraphqlTreeEventSubscription.test.ts b/packages/trees/frontend/sirius-components-trees/src/views/__tests__/GraphqlTreeEventSubscription.test.ts index bccf1a3033..1d176380b1 100644 --- a/packages/trees/frontend/sirius-components-trees/src/views/__tests__/GraphqlTreeEventSubscription.test.ts +++ b/packages/trees/frontend/sirius-components-trees/src/views/__tests__/GraphqlTreeEventSubscription.test.ts @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2019, 2022 Obeo. + * Copyright (c) 2019, 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 @@ -43,6 +43,7 @@ const getDocumentSubscription = gql` label editable deletable + selectable kind imageURL } diff --git a/packages/trees/frontend/sirius-components-trees/src/views/getTreeEventSubscription.ts b/packages/trees/frontend/sirius-components-trees/src/views/getTreeEventSubscription.ts index 9110b651d8..181716c21c 100644 --- a/packages/trees/frontend/sirius-components-trees/src/views/getTreeEventSubscription.ts +++ b/packages/trees/frontend/sirius-components-trees/src/views/getTreeEventSubscription.ts @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2019, 2022 Obeo. + * Copyright (c) 2019, 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 @@ -39,6 +39,7 @@ fragment treeItemFields on TreeItem { label editable deletable + selectable kind imageURL }