Search in sources :

Example 1 with EnumWidgetProperty

use of org.csstudio.display.builder.model.properties.EnumWidgetProperty in project org.csstudio.display.builder by kasemir.

the class WidgetPropertyUnitTest method testEnum.

/* Test enumerated property read/write API */
@Test
public void testEnum() throws Exception {
    final DisplayModel widget = new DisplayModel();
    final Macros macros = new Macros();
    macros.add("ALIGN", "1");
    widget.propMacros().setValue(macros);
    final EnumWidgetProperty<Align> prop = new EnumWidgetProperty<Align>(alignHoriz, widget, Align.LEFT);
    System.out.println(prop);
    assertThat(prop.getValue(), equalTo(Align.LEFT));
    System.out.println(Arrays.toString(prop.getLabels()));
    assertThat(prop.getLabels(), equalTo(new String[] { "Left", "Center", "Right" }));
    // Set value as enum
    prop.setValue(Align.RIGHT);
    System.out.println(prop);
    assertThat(prop.getValue(), equalTo(Align.RIGHT));
    // Set value as object, using the enum
    prop.setValueFromObject(Align.LEFT);
    System.out.println(prop);
    assertThat(prop.getValue(), equalTo(Align.LEFT));
    // Set value from ordinal
    prop.setValueFromObject(2);
    System.out.println(prop);
    assertThat(prop.getValue(), equalTo(Align.RIGHT));
    // Set value from string with ordinal
    prop.setValueFromObject("1");
    System.out.println(prop);
    assertThat(prop.getValue(), equalTo(Align.CENTER));
    assertThat(prop.getSpecification(), equalTo("1"));
    // Capture invalid ordinal
    try {
        prop.setValueFromObject(20);
        fail("Allowed invalid ordinal");
    } catch (Exception ex) {
        assertThat(ex.getMessage().toLowerCase(), containsString("invalid ordinal"));
    }
    // Capture use of label or name instead of ordinal
    try {
        prop.setValueFromObject("CENTER");
        fail("Allowed name instead of ordinal");
    } catch (Exception ex) {
        assertThat(ex.getMessage().toLowerCase(), containsString("expects ordinal"));
    }
    // Check handling of specification and macros
    prop.setSpecification("0");
    System.out.println(prop);
    assertThat(prop.getValue(), equalTo(Align.LEFT));
    prop.setSpecification("$(ALIGN)");
    System.out.println(prop);
    assertThat(prop.getValue(), equalTo(Align.CENTER));
    System.out.println(prop);
    assertThat(prop.getSpecification(), equalTo("$(ALIGN)"));
}
Also used : EnumWidgetProperty(org.csstudio.display.builder.model.properties.EnumWidgetProperty) CoreMatchers.containsString(org.hamcrest.CoreMatchers.containsString) Macros(org.csstudio.display.builder.model.macros.Macros) Test(org.junit.Test)

Example 2 with EnumWidgetProperty

use of org.csstudio.display.builder.model.properties.EnumWidgetProperty in project org.csstudio.display.builder by kasemir.

the class EnumWidgetPropertyBinding method submit.

/**
 * Submit combo value to model
 */
private void submit() {
    final String entered = jfx_node.getValue();
    // Combo switched to editable, but user never entered anything?
    if (entered == null)
        return;
    updating = true;
    final int ordinal = jfx_node.getItems().indexOf(entered);
    final Object value = (ordinal >= 0) ? ordinal : entered;
    undo.execute(new SetWidgetEnumPropertyAction(widget_property, value));
    if (!other.isEmpty()) {
        final String path = widget_property.getPath();
        for (Widget w : other) {
            final EnumWidgetProperty<?> other_prop = (EnumWidgetProperty<?>) w.getProperty(path);
            undo.execute(new SetWidgetEnumPropertyAction(other_prop, value));
        }
    }
    updating = false;
}
Also used : SetWidgetEnumPropertyAction(org.csstudio.display.builder.editor.undo.SetWidgetEnumPropertyAction) EnumWidgetProperty(org.csstudio.display.builder.model.properties.EnumWidgetProperty) Widget(org.csstudio.display.builder.model.Widget)

Example 3 with EnumWidgetProperty

use of org.csstudio.display.builder.model.properties.EnumWidgetProperty in project org.csstudio.display.builder by kasemir.

the class PropertyPanelSection method bindSimplePropertyField.

/**
 * Some 'simple' properties are handled
 *  in static method to allow use in the
 *  RulesDialog
 *  @param undo
 *  @param bindings
 *  @param property
 *  @param other
 *  @return
 */
public static Node bindSimplePropertyField(final UndoableActionManager undo, final List<WidgetPropertyBinding<?, ?>> bindings, final WidgetProperty<?> property, final List<Widget> other) {
    final Widget widget = property.getWidget();
    Node field = null;
    if (property.isReadonly()) {
        // If "Type", use a label with an icon.
        if (property.getName().equals(CommonWidgetProperties.propType.getName())) {
            final String type = widget.getType();
            try {
                final Image image = new Image(WidgetFactory.getInstance().getWidgetDescriptor(type).getIconStream());
                final ImageView icon = new ImageView(image);
                final String name = WidgetFactory.getInstance().getWidgetDescriptor(type).getName();
                field = new Label(name, icon);
            } catch (Exception ex) {
                // Some widgets have no icon (e.g. DisplayModel).
                field = new Label(String.valueOf(property.getValue()));
            }
        } else {
            final TextField text = new TextField();
            text.setText(String.valueOf(property.getValue()));
            text.setDisable(true);
            field = text;
        }
    } else if (property instanceof ColorWidgetProperty) {
        final ColorWidgetProperty color_prop = (ColorWidgetProperty) property;
        final WidgetColorPropertyField color_field = new WidgetColorPropertyField();
        final WidgetColorPropertyBinding binding = new WidgetColorPropertyBinding(undo, color_field, color_prop, other);
        bindings.add(binding);
        binding.bind();
        field = color_field;
    } else if (property instanceof FontWidgetProperty) {
        final FontWidgetProperty font_prop = (FontWidgetProperty) property;
        final Button font_field = new Button();
        font_field.setMaxWidth(Double.MAX_VALUE);
        final WidgetFontPropertyBinding binding = new WidgetFontPropertyBinding(undo, font_field, font_prop, other);
        bindings.add(binding);
        binding.bind();
        field = font_field;
    } else if (property instanceof EnumWidgetProperty<?>) {
        final EnumWidgetProperty<?> enum_prop = (EnumWidgetProperty<?>) property;
        final ComboBox<String> combo = new ComboBox<>();
        combo.setPromptText(property.getDefaultValue().toString());
        combo.getItems().addAll(enum_prop.getLabels());
        combo.setMaxWidth(Double.MAX_VALUE);
        combo.setMaxHeight(Double.MAX_VALUE);
        final ToggleButton macroButton = new ToggleButton("$");
        try {
            macroButton.setGraphic(new ImageView(new Image(ResourceUtil.openPlatformResource("platform:/plugin/org.csstudio.display.builder.editor/icons/macro-edit.png"))));
        } catch (Exception ex) {
            logger.log(Level.WARNING, "Cannot load macro edit image.", ex);
        }
        macroButton.getStyleClass().add("macro_button");
        macroButton.setTooltip(new Tooltip(Messages.MacroEditButton));
        BorderPane.setMargin(macroButton, new Insets(0, 0, 0, 3));
        BorderPane.setAlignment(macroButton, Pos.CENTER);
        final EnumWidgetPropertyBinding binding = new EnumWidgetPropertyBinding(undo, combo, enum_prop, other);
        bindings.add(binding);
        binding.bind();
        final EventHandler<ActionEvent> macro_handler = event -> {
            final boolean use_macro = macroButton.isSelected() || MacroHandler.containsMacros(enum_prop.getSpecification());
            combo.setEditable(use_macro);
            // now that the combo has become editable.
            if (use_macro && combo.getEditor().getText().isEmpty())
                binding.restore();
        };
        macroButton.setOnAction(macro_handler);
        macroButton.setSelected(MacroHandler.containsMacros(enum_prop.getSpecification()));
        macro_handler.handle(null);
        field = new BorderPane(combo, null, macroButton, null, null);
        // When used in RulesDialog, field can get focus.
        // In that case, forward focus to combo
        field.focusedProperty().addListener((ob, o, focused) -> {
            if (focused) {
                combo.requestFocus();
                if (combo.isEditable())
                    combo.getEditor().selectAll();
            }
        });
    } else if (property instanceof BooleanWidgetProperty) {
        final BooleanWidgetProperty bool_prop = (BooleanWidgetProperty) property;
        final ComboBox<String> combo = new ComboBox<>();
        combo.setPromptText(property.getDefaultValue().toString());
        combo.getItems().addAll("true", "false");
        combo.setMaxWidth(Double.MAX_VALUE);
        combo.setMaxHeight(Double.MAX_VALUE);
        combo.setEditable(true);
        // BooleanWidgetPropertyBinding makes either check or combo visible
        // for plain boolean vs. macro-based value
        final CheckBox check = new CheckBox();
        StackPane.setAlignment(check, Pos.CENTER_LEFT);
        final ToggleButton macroButton = new ToggleButton("$");
        try {
            macroButton.setGraphic(new ImageView(new Image(ResourceUtil.openPlatformResource("platform:/plugin/org.csstudio.display.builder.editor/icons/macro-edit.png"))));
        } catch (Exception ex) {
            logger.log(Level.WARNING, "Cannot load macro edit image.", ex);
        }
        macroButton.getStyleClass().add("macro_button");
        macroButton.setTooltip(new Tooltip(Messages.MacroEditButton));
        BorderPane.setMargin(macroButton, new Insets(0, 0, 0, 3));
        BorderPane.setAlignment(macroButton, Pos.CENTER);
        final BooleanWidgetPropertyBinding binding = new BooleanWidgetPropertyBinding(undo, check, combo, macroButton, bool_prop, other);
        bindings.add(binding);
        binding.bind();
        field = new BorderPane(new StackPane(combo, check), null, macroButton, null, null);
        // For RulesDialog, see above
        field.focusedProperty().addListener((ob, o, focused) -> {
            if (focused) {
                if (combo.isVisible()) {
                    combo.requestFocus();
                    combo.getEditor().selectAll();
                } else if (check.isVisible())
                    check.requestFocus();
            }
        });
    } else if (property instanceof ColorMapWidgetProperty) {
        final ColorMapWidgetProperty colormap_prop = (ColorMapWidgetProperty) property;
        final Button map_button = new Button();
        map_button.setMaxWidth(Double.MAX_VALUE);
        final ColorMapPropertyBinding binding = new ColorMapPropertyBinding(undo, map_button, colormap_prop, other);
        bindings.add(binding);
        binding.bind();
        field = map_button;
    } else if (property instanceof WidgetClassProperty) {
        final WidgetClassProperty widget_class_prop = (WidgetClassProperty) property;
        final ComboBox<String> combo = new ComboBox<>();
        combo.setPromptText(property.getDefaultValue().toString());
        combo.setEditable(true);
        // List classes of this widget
        final String type = widget.getType();
        final Collection<String> classes = WidgetClassesService.getWidgetClasses().getWidgetClasses(type);
        combo.getItems().addAll(classes);
        combo.setMaxWidth(Double.MAX_VALUE);
        final WidgetClassBinding binding = new WidgetClassBinding(undo, combo, widget_class_prop, other);
        bindings.add(binding);
        binding.bind();
        field = combo;
    } else if (property instanceof FilenameWidgetProperty) {
        final FilenameWidgetProperty file_prop = (FilenameWidgetProperty) property;
        final TextField text = new TextField();
        text.setPromptText(file_prop.getDefaultValue().toString());
        text.setMaxWidth(Double.MAX_VALUE);
        final Button select_file = new Button("...");
        select_file.setOnAction(event -> {
            try {
                final String filename = FilenameSupport.promptForRelativePath(widget, file_prop.getValue());
                if (filename != null)
                    undo.execute(new SetMacroizedWidgetPropertyAction(file_prop, filename));
            } catch (Exception ex) {
                logger.log(Level.WARNING, "Cannot prompt for " + file_prop, ex);
            }
        });
        final MacroizedWidgetPropertyBinding binding = new MacroizedWidgetPropertyBinding(undo, text, file_prop, other);
        bindings.add(binding);
        binding.bind();
        field = new HBox(text, select_file);
        HBox.setHgrow(text, Priority.ALWAYS);
        // For RulesDialog, see above
        field.focusedProperty().addListener((ob, o, focused) -> {
            if (focused)
                text.requestFocus();
        });
    } else if (property instanceof PVNameWidgetProperty) {
        final PVNameWidgetProperty pv_prop = (PVNameWidgetProperty) property;
        final TextField text = new TextField();
        text.setPromptText(pv_prop.getDefaultValue().toString());
        final MacroizedWidgetPropertyBinding binding = new MacroizedWidgetPropertyBinding(undo, text, pv_prop, other) {

            @Override
            public void bind() {
                super.bind();
                autocomplete_menu.attachField(text);
            }

            @Override
            public void unbind() {
                super.unbind();
                autocomplete_menu.removeField(text);
            }
        };
        bindings.add(binding);
        binding.bind();
        // Allow editing long PV names, including loc://text("Log text with newlines"),
        // in dialog
        final Button open_editor = new Button("...");
        open_editor.setOnAction(event -> {
            final MultiLineInputDialog dialog = new MultiLineInputDialog(pv_prop.getSpecification());
            DialogHelper.positionDialog(dialog, open_editor, -600, 0);
            final Optional<String> result = dialog.showAndWait();
            if (!result.isPresent())
                return;
            undo.execute(new SetMacroizedWidgetPropertyAction(pv_prop, result.get()));
            for (Widget w : other) {
                final MacroizedWidgetProperty<?> other_prop = (MacroizedWidgetProperty<?>) w.getProperty(pv_prop.getName());
                undo.execute(new SetMacroizedWidgetPropertyAction(other_prop, result.get()));
            }
        });
        field = new HBox(text, open_editor);
        HBox.setHgrow(text, Priority.ALWAYS);
        // For RulesDialog, see similar code elsewhere
        field.focusedProperty().addListener((ob, o, focused) -> {
            if (focused)
                text.requestFocus();
        });
    } else if (property instanceof MacroizedWidgetProperty) {
        // MacroizedWidgetProperty needs to be checked _after_ subclasses like PVNameWidgetProperty, FilenameWidgetProperty
        final MacroizedWidgetProperty<?> macro_prop = (MacroizedWidgetProperty<?>) property;
        final TextField text = new TextField();
        text.setPromptText(macro_prop.getDefaultValue().toString());
        final MacroizedWidgetPropertyBinding binding = new MacroizedWidgetPropertyBinding(undo, text, macro_prop, other);
        bindings.add(binding);
        binding.bind();
        if (CommonWidgetProperties.propText.getName().equals(property.getName()) || CommonWidgetProperties.propTooltip.getName().equals(property.getName())) {
            // Allow editing multi-line text in dialog
            final Button open_editor = new Button("...");
            open_editor.setOnAction(event -> {
                final MultiLineInputDialog dialog = new MultiLineInputDialog(macro_prop.getSpecification());
                DialogHelper.positionDialog(dialog, open_editor, -600, 0);
                final Optional<String> result = dialog.showAndWait();
                if (!result.isPresent())
                    return;
                undo.execute(new SetMacroizedWidgetPropertyAction(macro_prop, result.get()));
                for (Widget w : other) {
                    final MacroizedWidgetProperty<?> other_prop = (MacroizedWidgetProperty<?>) w.getProperty(macro_prop.getName());
                    undo.execute(new SetMacroizedWidgetPropertyAction(other_prop, result.get()));
                }
            });
            field = new HBox(text, open_editor);
            HBox.setHgrow(text, Priority.ALWAYS);
            // For RulesDialog, see above
            field.focusedProperty().addListener((ob, o, focused) -> {
                if (focused)
                    text.requestFocus();
            });
        } else
            field = text;
    } else if (property instanceof PointsWidgetProperty) {
        final PointsWidgetProperty points_prop = (PointsWidgetProperty) property;
        final Button points_field = new Button();
        points_field.setMaxWidth(Double.MAX_VALUE);
        final PointsPropertyBinding binding = new PointsPropertyBinding(undo, points_field, points_prop, other);
        bindings.add(binding);
        binding.bind();
        field = points_field;
    }
    return field;
}
Also used : EventHandler(javafx.event.EventHandler) Button(javafx.scene.control.Button) FilenameSupport(org.csstudio.display.builder.representation.javafx.FilenameSupport) HPos(javafx.geometry.HPos) Pos(javafx.geometry.Pos) UndoableActionManager(org.csstudio.display.builder.util.undo.UndoableActionManager) ScriptsWidgetProperty(org.csstudio.display.builder.model.properties.ScriptsWidgetProperty) SetMacroizedWidgetPropertyAction(org.csstudio.display.builder.editor.undo.SetMacroizedWidgetPropertyAction) StackPane(javafx.scene.layout.StackPane) MultiLineInputDialog(org.csstudio.javafx.MultiLineInputDialog) StructuredWidgetProperty(org.csstudio.display.builder.model.StructuredWidgetProperty) MacrosWidgetProperty(org.csstudio.display.builder.model.properties.MacrosWidgetProperty) ComboBox(javafx.scene.control.ComboBox) ResourceUtil(org.csstudio.display.builder.util.ResourceUtil) EnumWidgetProperty(org.csstudio.display.builder.model.properties.EnumWidgetProperty) WidgetProperty(org.csstudio.display.builder.model.WidgetProperty) BooleanWidgetProperty(org.csstudio.display.builder.model.properties.BooleanWidgetProperty) HBox(javafx.scene.layout.HBox) TextField(javafx.scene.control.TextField) Collection(java.util.Collection) WidgetClassProperty(org.csstudio.display.builder.model.properties.WidgetClassProperty) WidgetClassesService(org.csstudio.display.builder.model.persist.WidgetClassesService) Spinner(javafx.scene.control.Spinner) Messages(org.csstudio.display.builder.editor.Messages) CommonWidgetProperties(org.csstudio.display.builder.model.properties.CommonWidgetProperties) MacroizedWidgetProperty(org.csstudio.display.builder.model.MacroizedWidgetProperty) Separator(javafx.scene.control.Separator) Priority(javafx.scene.layout.Priority) List(java.util.List) ColorWidgetProperty(org.csstudio.display.builder.model.properties.ColorWidgetProperty) PointsWidgetProperty(org.csstudio.display.builder.model.properties.PointsWidgetProperty) ToggleButton(javafx.scene.control.ToggleButton) WidgetFactory(org.csstudio.display.builder.model.WidgetFactory) Optional(java.util.Optional) AutocompleteMenu(org.csstudio.display.builder.representation.javafx.AutocompleteMenu) BorderPane(javafx.scene.layout.BorderPane) PVNameWidgetProperty(org.csstudio.display.builder.model.properties.PVNameWidgetProperty) ColumnConstraints(javafx.scene.layout.ColumnConstraints) Plugin.logger(org.csstudio.display.builder.editor.Plugin.logger) FilenameWidgetProperty(org.csstudio.display.builder.model.properties.FilenameWidgetProperty) ArrayList(java.util.ArrayList) Level(java.util.logging.Level) RulesWidgetProperty(org.csstudio.display.builder.model.properties.RulesWidgetProperty) Insets(javafx.geometry.Insets) Tooltip(javafx.scene.control.Tooltip) GridPane(javafx.scene.layout.GridPane) ArrayWidgetProperty(org.csstudio.display.builder.model.ArrayWidgetProperty) Label(javafx.scene.control.Label) WidgetPropertyCategory(org.csstudio.display.builder.model.WidgetPropertyCategory) FontWidgetProperty(org.csstudio.display.builder.model.properties.FontWidgetProperty) Node(javafx.scene.Node) CheckBox(javafx.scene.control.CheckBox) ColorMapWidgetProperty(org.csstudio.display.builder.model.properties.ColorMapWidgetProperty) ActionsWidgetProperty(org.csstudio.display.builder.model.properties.ActionsWidgetProperty) ActionEvent(javafx.event.ActionEvent) MacroHandler(org.csstudio.display.builder.model.macros.MacroHandler) ImageView(javafx.scene.image.ImageView) DialogHelper(org.csstudio.javafx.DialogHelper) Widget(org.csstudio.display.builder.model.Widget) Image(javafx.scene.image.Image) BorderPane(javafx.scene.layout.BorderPane) HBox(javafx.scene.layout.HBox) Insets(javafx.geometry.Insets) PointsWidgetProperty(org.csstudio.display.builder.model.properties.PointsWidgetProperty) FontWidgetProperty(org.csstudio.display.builder.model.properties.FontWidgetProperty) Node(javafx.scene.Node) ColorMapWidgetProperty(org.csstudio.display.builder.model.properties.ColorMapWidgetProperty) Widget(org.csstudio.display.builder.model.Widget) Label(javafx.scene.control.Label) EventHandler(javafx.event.EventHandler) WidgetClassProperty(org.csstudio.display.builder.model.properties.WidgetClassProperty) Image(javafx.scene.image.Image) Button(javafx.scene.control.Button) ToggleButton(javafx.scene.control.ToggleButton) MultiLineInputDialog(org.csstudio.javafx.MultiLineInputDialog) TextField(javafx.scene.control.TextField) ImageView(javafx.scene.image.ImageView) StackPane(javafx.scene.layout.StackPane) ToggleButton(javafx.scene.control.ToggleButton) BooleanWidgetProperty(org.csstudio.display.builder.model.properties.BooleanWidgetProperty) Optional(java.util.Optional) ComboBox(javafx.scene.control.ComboBox) Tooltip(javafx.scene.control.Tooltip) FilenameWidgetProperty(org.csstudio.display.builder.model.properties.FilenameWidgetProperty) MacroizedWidgetProperty(org.csstudio.display.builder.model.MacroizedWidgetProperty) SetMacroizedWidgetPropertyAction(org.csstudio.display.builder.editor.undo.SetMacroizedWidgetPropertyAction) EnumWidgetProperty(org.csstudio.display.builder.model.properties.EnumWidgetProperty) CheckBox(javafx.scene.control.CheckBox) ColorWidgetProperty(org.csstudio.display.builder.model.properties.ColorWidgetProperty) PVNameWidgetProperty(org.csstudio.display.builder.model.properties.PVNameWidgetProperty)

Aggregations

Widget (org.csstudio.display.builder.model.Widget)2 EnumWidgetProperty (org.csstudio.display.builder.model.properties.EnumWidgetProperty)2 ArrayList (java.util.ArrayList)1 Collection (java.util.Collection)1 List (java.util.List)1 Optional (java.util.Optional)1 Level (java.util.logging.Level)1 ActionEvent (javafx.event.ActionEvent)1 EventHandler (javafx.event.EventHandler)1 HPos (javafx.geometry.HPos)1 Insets (javafx.geometry.Insets)1 Pos (javafx.geometry.Pos)1 Node (javafx.scene.Node)1 Button (javafx.scene.control.Button)1 CheckBox (javafx.scene.control.CheckBox)1 ComboBox (javafx.scene.control.ComboBox)1 Label (javafx.scene.control.Label)1 Separator (javafx.scene.control.Separator)1 Spinner (javafx.scene.control.Spinner)1 TextField (javafx.scene.control.TextField)1