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..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 @@ -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; @@ -52,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(); @@ -68,7 +70,6 @@ public class TableRepresentation extends RegionBaseRepresentation property, Object old_value, Object new_value) -> @@ -78,6 +79,12 @@ public class TableRepresentation extends RegionBaseRepresentation new_headers = new ArrayList<>(); for (ColumnProperty column : model_widget.propColumns().getValue()) new_headers.add(column.name().getValue()); + + // If all columns are marked as non-editable, then mark the entire table as non-editable + 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); @@ -163,6 +170,7 @@ 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); @@ -182,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); @@ -371,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)); + } + } }