From e767c5516d5aec82c09786117bd77de873fe7eb4 Mon Sep 17 00:00:00 2001 From: Pierre-Charles David Date: Thu, 29 Jun 2023 15:09:21 +0200 Subject: [PATCH] [2123] Add support for non-selectable tree items Bug: https://github.com/eclipse-sirius/sirius-components/issues/2123 Signed-off-by: Pierre-Charles David --- CHANGELOG.adoc | 1 + .../explorer/ExplorerDescriptionProvider.java | 14 +++++++- .../src/main/resources/schema/tree.graphqls | 1 + .../sirius/components/trees/TreeItem.java | 28 ++++++++++++---- .../trees/description/TreeDescription.java | 17 +++++++++- .../trees/renderer/TreeRenderer.java | 4 ++- .../src/treeitems/TreeItem.tsx | 33 +++++++++++++++---- .../src/views/ExplorerView.types.ts | 1 + .../src/views/getTreeEventSubscription.ts | 3 +- 9 files changed, 85 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index 932e9b7ac5..2c3bc9aa0d 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -67,6 +67,7 @@ The help text can include multiple lines (separated by `\n`), but no text format - https://github.com/eclipse-sirius/sirius-components/issues/2083[#2083] [diagram] Add support for edge markers - https://github.com/eclipse-sirius/sirius-components/issues/2086[#2086] [diagram] Add a panel with the default diagram actions - https://github.com/eclipse-sirius/sirius-components/issues/2087[#2087] [diagram] Add support for snap to grid +- 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..0bcc068d91 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,17 @@ private boolean isDeletable(VariableManager variableManager) { return true; } + private boolean isSelectable(VariableManager variableManager) { + Object self = variableManager.getVariables().get(VariableManager.SELF); + boolean selectable = true; + if (self instanceof RepresentationMetadata) { + selectable = false; + } else if (self instanceof Resource) { + selectable = false; + } + return selectable; + } + 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 5c2bf3c915..1ed56c224a 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 @@ -38,6 +38,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 0293053360..06a591909d 100644 --- a/packages/trees/frontend/sirius-components-trees/src/treeitems/TreeItem.tsx +++ b/packages/trees/frontend/sirius-components-trees/src/treeitems/TreeItem.tsx @@ -60,6 +60,9 @@ const useTreeItemStyle = makeStyles((theme) => ({ backgroundColor: 'var(--blue-lagoon-lighten-90)', }, }, + nonSelectable: { + fontStyle: 'italic', + }, arrow: { cursor: 'pointer', }, @@ -227,7 +230,11 @@ export const TreeItem = ({ onExpand={onExpand} onExpandAll={onExpandAll} selection={selection} - setSelection={setSelection} + setSelection={(selection) => { + if (item.selectable) { + setSelection(selection); + } + }} enterEditingMode={enterEditingMode} onClose={closeContextMenu} /> @@ -249,7 +256,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} @@ -366,7 +377,11 @@ export const TreeItem = ({ ); } text = ( - + {itemLabel} ); @@ -380,16 +395,22 @@ export const TreeItem = ({ const isItemInSelection = selection.entries.find((entry) => entry.id === item.id); if (isItemInSelection) { const newSelection: Selection = { entries: selection.entries.filter((entry) => entry.id !== item.id) }; - setSelection(newSelection); + if (item.selectable) { + setSelection(newSelection); + } } else { const { id, label, kind } = item; const newEntry = { id, label, kind }; const newSelection: Selection = { entries: [...selection.entries, newEntry] }; - setSelection(newSelection); + if (item.selectable) { + setSelection(newSelection); + } } } else { const { id, label, kind } = item; - setSelection({ entries: [{ id, label, kind }] }); + if (item.selectable) { + setSelection({ entries: [{ id, label, kind }] }); + } } }; 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 aa40b0d5eb..f009e5911c 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 @@ -49,6 +49,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/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 }