Search in sources :

Example 1 with PVNameWidgetProperty

use of org.csstudio.display.builder.model.properties.PVNameWidgetProperty 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

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 ToggleButton (javafx.scene.control.ToggleButton)1 Tooltip (javafx.scene.control.Tooltip)1