diff --git a/org.csstudio.display.builder.model/icons/ellipse.png b/org.csstudio.display.builder.model/icons/ellipse.png new file mode 100644 index 000000000..0c4ab427f Binary files /dev/null and b/org.csstudio.display.builder.model/icons/ellipse.png differ diff --git a/org.csstudio.display.builder.model/plugin.properties b/org.csstudio.display.builder.model/plugin.properties index 09d971993..0146dd91a 100644 --- a/org.csstudio.display.builder.model/plugin.properties +++ b/org.csstudio.display.builder.model/plugin.properties @@ -1,5 +1,7 @@ ActionButtonWidget_Description=Button that can open related displays or write PVs ActionButtonWidget_Name=Action Button +EllipseWidget_Description=An ellipse +EllipseWidget_Name=Ellipse EmbeddedDisplayWidget_Description=Widget that embeds another display EmbeddedDisplayWidget_Name=Embedded Display GroupWidget_Description=Group of widgets diff --git a/org.csstudio.display.builder.model/plugin.xml b/org.csstudio.display.builder.model/plugin.xml index b46d0fa90..3f2ce13cf 100644 --- a/org.csstudio.display.builder.model/plugin.xml +++ b/org.csstudio.display.builder.model/plugin.xml @@ -26,6 +26,17 @@ type="org.csstudio.opibuilder.widgets.Rectangle"> + + + + background; + private WidgetProperty transparent; + private WidgetProperty line_color; + private WidgetProperty line_width; + + public EllipseWidget() + { + super(WIDGET_DESCRIPTOR.getType()); + } + + @Override + protected void defineProperties(final List> properties) + { + super.defineProperties(properties); + properties.add(background = displayBackgroundColor.createProperty(this, new WidgetColor(30, 144, 255))); + properties.add(transparent = displayTransparent.createProperty(this, false)); + properties.add(line_color = displayLineColor.createProperty(this, new WidgetColor(0, 0, 255))); + properties.add(line_width = displayLineWidth.createProperty(this, 3)); + } + + /** @return Display 'background_color' */ + public WidgetProperty displayBackgroundColor() + { + return background; + } + + /** @return Display 'transparent' */ + public WidgetProperty displayTransparent() + { + return transparent; + } + + /** @return Display 'line_color' */ + public WidgetProperty displayLineColor() + { + return line_color; + } + + /** @return Display 'line_width' */ + public WidgetProperty displayLineWidth() + { + return line_width; + } +} diff --git a/org.csstudio.display.builder.representation.javafx/plugin.xml b/org.csstudio.display.builder.representation.javafx/plugin.xml index 900f4de31..cc3a3d838 100644 --- a/org.csstudio.display.builder.representation.javafx/plugin.xml +++ b/org.csstudio.display.builder.representation.javafx/plugin.xml @@ -31,6 +31,10 @@ class="org.csstudio.display.builder.representation.javafx.widgets.RectangleRepresentation" type="rectangle"> + + diff --git a/org.csstudio.display.builder.representation.javafx/src/org/csstudio/display/builder/representation/javafx/widgets/EllipseRepresentation.java b/org.csstudio.display.builder.representation.javafx/src/org/csstudio/display/builder/representation/javafx/widgets/EllipseRepresentation.java new file mode 100644 index 000000000..91051284c --- /dev/null +++ b/org.csstudio.display.builder.representation.javafx/src/org/csstudio/display/builder/representation/javafx/widgets/EllipseRepresentation.java @@ -0,0 +1,103 @@ +/******************************************************************************* + * Copyright (c) 2015 Oak Ridge National Laboratory. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + *******************************************************************************/ +package org.csstudio.display.builder.representation.javafx.widgets; + +import org.csstudio.display.builder.model.DirtyFlag; +import org.csstudio.display.builder.model.WidgetProperty; +import org.csstudio.display.builder.model.widgets.EllipseWidget; +import org.csstudio.display.builder.representation.javafx.JFXUtil; + +import javafx.scene.paint.Color; +import javafx.scene.shape.Ellipse; +import javafx.scene.shape.StrokeType; + +/** Creates JavaFX item for model widget + * @author Kay Kasemir + */ +public class EllipseRepresentation extends JFXBaseRepresentation +{ + private final DirtyFlag dirty_position = new DirtyFlag(); + private final DirtyFlag dirty_look = new DirtyFlag(); + private Color background, line_color; + + @Override + public Ellipse createJFXNode() throws Exception + { + final Ellipse ellipse = new Ellipse(); + updateColors(); + return ellipse; + } + + @Override + protected void registerListeners() + { + // JFX Ellipse is based on center, not top-left corner, + // so can't use the default from super.registerListeners(); + model_widget.positionVisible().addUntypedPropertyListener(this::positionChanged); + model_widget.positionX().addUntypedPropertyListener(this::positionChanged); + model_widget.positionY().addUntypedPropertyListener(this::positionChanged); + model_widget.positionWidth().addUntypedPropertyListener(this::positionChanged); + model_widget.positionHeight().addUntypedPropertyListener(this::positionChanged); + + model_widget.displayBackgroundColor().addUntypedPropertyListener(this::lookChanged); + model_widget.displayTransparent().addUntypedPropertyListener(this::lookChanged); + model_widget.displayLineColor().addUntypedPropertyListener(this::lookChanged); + model_widget.displayLineWidth().addUntypedPropertyListener(this::lookChanged); + } + + private void positionChanged(final WidgetProperty property, final Object old_value, final Object new_value) + { + dirty_position.mark(); + toolkit.scheduleUpdate(this); + } + + private void lookChanged(final WidgetProperty property, final Object old_value, final Object new_value) + { + updateColors(); + dirty_look.mark(); + toolkit.scheduleUpdate(this); + } + + private void updateColors() + { + background = model_widget.displayTransparent().getValue() + ? Color.TRANSPARENT + : JFXUtil.convert(model_widget.displayBackgroundColor().getValue()); + line_color = JFXUtil.convert(model_widget.displayLineColor().getValue()); + } + + @Override + public void updateChanges() + { + // Not using default handling of X/Y super.updateChanges(); + if (dirty_position.checkAndClear()) + { + if (model_widget.positionVisible().getValue()) + { + jfx_node.setVisible(true); + final int x = model_widget.positionX().getValue(); + final int y = model_widget.positionY().getValue(); + final int w = model_widget.positionWidth().getValue(); + final int h = model_widget.positionHeight().getValue(); + jfx_node.setCenterX(x + w/2); + jfx_node.setCenterY(y + h/2); + jfx_node.setRadiusX(w/2); + jfx_node.setRadiusY(h/2); + } + else + jfx_node.setVisible(false); + } + if (dirty_look.checkAndClear()) + { + jfx_node.setFill(background); + jfx_node.setStroke(line_color); + jfx_node.setStrokeWidth(model_widget.displayLineWidth().getValue()); + jfx_node.setStrokeType(StrokeType.INSIDE); + } + } +}