From 082c48a6f32b588e3307157d7bd4d24f8a57e9fc Mon Sep 17 00:00:00 2001 From: georgweiss Date: Tue, 2 Jun 2026 13:46:21 +0200 Subject: [PATCH 1/2] Make table widget read-only if all columns are read-only --- .../javafx/widgets/TableRepresentation.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/widgets/TableRepresentation.java b/app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/widgets/TableRepresentation.java index 27b5701a87..12669dd49b 100644 --- a/app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/widgets/TableRepresentation.java +++ b/app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/widgets/TableRepresentation.java @@ -11,6 +11,7 @@ import java.util.Collections; import java.util.List; import java.util.Objects; +import java.util.Optional; import org.csstudio.display.builder.model.DirtyFlag; import org.csstudio.display.builder.model.UntypedWidgetPropertyListener; @@ -78,6 +79,10 @@ public class TableRepresentation extends RegionBaseRepresentation new_headers = new ArrayList<>(); for (ColumnProperty column : model_widget.propColumns().getValue()) new_headers.add(column.name().getValue()); + + Optional anyColumnEditable = model_widget.propColumns().getValue() + .stream().filter(columnProperty -> columnProperty.editable().getValue()).findFirst(); + model_widget.propEditable().setValue(anyColumnEditable.isPresent()); headers = new_headers; dirty_columns.mark(); toolkit.scheduleUpdate(this); @@ -169,6 +174,16 @@ public void selectionChanged(final StringTable table, final int[] rows, final in model_widget.runtimeValue().addPropertyListener(valueListener); model_widget.runtimeCellColors().addPropertyListener(colorsListener); + + model_widget.propEditable().addPropertyListener(new WidgetPropertyListener() { + @Override + public void propertyChanged(WidgetProperty property, Boolean old_value, Boolean new_value) { + if(!new_value){ + List options = model_widget.getColumnOptions(0); + System.out.println(options); + } + } + }); } @Override From 2f09457deaf32e3f1272f5bfea78d18c3fa47b12 Mon Sep 17 00:00:00 2001 From: georgweiss Date: Tue, 2 Jun 2026 14:10:30 +0200 Subject: [PATCH 2/2] Consistent update of TabelWidget editable changes between table and columns --- .../javafx/widgets/TableRepresentation.java | 30 ++++++++++++------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/widgets/TableRepresentation.java b/app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/widgets/TableRepresentation.java index 12669dd49b..69a27a0cc5 100644 --- a/app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/widgets/TableRepresentation.java +++ b/app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/widgets/TableRepresentation.java @@ -53,6 +53,7 @@ public class TableRepresentation extends RegionBaseRepresentation> columnsListener = this::columnsChanged; private final WidgetPropertyListener valueListener = this::valueChanged; private final WidgetPropertyListener>> colorsListener = this::cellColorsChanged; + private final WidgetPropertyListener tableEditableListener = this::tableEditableChanged; /** Most recent column headers */ private volatile List headers = Collections.emptyList(); @@ -69,7 +70,6 @@ public class TableRepresentation extends RegionBaseRepresentation property, Object old_value, Object new_value) -> @@ -80,9 +80,11 @@ public class TableRepresentation extends RegionBaseRepresentation anyColumnEditable = model_widget.propColumns().getValue() .stream().filter(columnProperty -> columnProperty.editable().getValue()).findFirst(); model_widget.propEditable().setValue(anyColumnEditable.isPresent()); + headers = new_headers; dirty_columns.mark(); toolkit.scheduleUpdate(this); @@ -168,22 +170,13 @@ public void selectionChanged(final StringTable table, final int[] rows, final in model_widget.propToolbar().addUntypedPropertyListener(styleListener); model_widget.propRowSelectionMode().addUntypedPropertyListener(styleListener); model_widget.runtimePropSetSelection().addPropertyListener(selectionListener); + model_widget.propEditable().addPropertyListener(tableEditableListener); columnsChanged(model_widget.propColumns(), null, model_widget.propColumns().getValue()); model_widget.propColumns().addPropertyListener(columnsListener); model_widget.runtimeValue().addPropertyListener(valueListener); model_widget.runtimeCellColors().addPropertyListener(colorsListener); - - model_widget.propEditable().addPropertyListener(new WidgetPropertyListener() { - @Override - public void propertyChanged(WidgetProperty property, Boolean old_value, Boolean new_value) { - if(!new_value){ - List options = model_widget.getColumnOptions(0); - System.out.println(options); - } - } - }); } @Override @@ -197,6 +190,7 @@ protected void unregisterListeners() model_widget.propToolbar().removePropertyListener(styleListener); model_widget.propRowSelectionMode().removePropertyListener(styleListener); model_widget.runtimePropSetSelection().removePropertyListener(selectionListener); + model_widget.propEditable().removePropertyListener(tableEditableListener); model_widget.propColumns().removePropertyListener(columnsListener); columnsChanged(model_widget.propColumns(), model_widget.propColumns().getValue(), null); @@ -386,4 +380,18 @@ public void updateChanges() if (dirty_set_selection.checkAndClear()) jfx_node.setSelection(model_widget.runtimePropSetSelection().getValue()); } + + /** + * Listener for the Enabled property of the table widget. If user chooses to make the table non-editable, + * then all columns should be marked as non-editable. + * @param property {@link WidgetProperty} for the table + * @param oldValue Previous value + * @param newValue New value + */ + private void tableEditableChanged(final WidgetProperty property, final Boolean oldValue, final Boolean newValue ){ + if(!newValue){ + model_widget.propColumns().getValue().forEach(column -> + column.editable().setValue(false)); + } + } }