diff --git a/app/display/model/src/main/java/org/csstudio/display/builder/model/widgets/EmbeddedDisplayWidget.java b/app/display/model/src/main/java/org/csstudio/display/builder/model/widgets/EmbeddedDisplayWidget.java index a153fa52e5..c2573625a0 100644 --- a/app/display/model/src/main/java/org/csstudio/display/builder/model/widgets/EmbeddedDisplayWidget.java +++ b/app/display/model/src/main/java/org/csstudio/display/builder/model/widgets/EmbeddedDisplayWidget.java @@ -113,6 +113,11 @@ public EnumWidgetProperty createProperty(final Widget widget, static final WidgetPropertyDescriptor propGroupName = CommonWidgetProperties.newStringPropertyDescriptor( WidgetPropertyCategory.DISPLAY, "group_name", Messages.EmbeddedDisplayWidget_GroupName); + /** + * 'rotation' property + */ + static final WidgetPropertyDescriptor propRotation = + CommonWidgetProperties.newDoublePropertyDescriptor(WidgetPropertyCategory.DISPLAY, "rotation", Messages.WidgetProperties_Rotation); /** 'embedded_model' */ public static final WidgetPropertyDescriptor runtimeModel = @@ -279,6 +284,7 @@ private void createGroupWrapper(final Widget widget, final Element embedded_xml, private volatile WidgetProperty group_name; private volatile WidgetProperty embedded_model; private volatile WidgetProperty transparent; + private volatile WidgetProperty rotation; /** Constructor */ public EmbeddedDisplayWidget() @@ -295,6 +301,7 @@ protected void defineProperties(final List> properties) properties.add(group_name = propGroupName.createProperty(this, "")); properties.add(embedded_model = runtimeModel.createProperty(this, null)); properties.add(transparent = propTransparent.createProperty(this, false)); + properties.add(rotation = propRotation.createProperty(this, 0.0)); BorderSupport.addBorderProperties(this, properties); } @@ -344,6 +351,12 @@ public WidgetProperty propTransparent() return transparent; } + /** @return 'rotation' property */ + public WidgetProperty propRotation() + { + return rotation; + } + @Override public WidgetConfigurator getConfigurator(Version persisted_version) throws Exception diff --git a/app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/widgets/EmbeddedDisplayRepresentation.java b/app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/widgets/EmbeddedDisplayRepresentation.java index 14b8cb6b5a..c5856785a4 100644 --- a/app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/widgets/EmbeddedDisplayRepresentation.java +++ b/app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/widgets/EmbeddedDisplayRepresentation.java @@ -16,6 +16,9 @@ import java.util.logging.Level; import javafx.application.Platform; +import javafx.collections.ObservableList; +import javafx.scene.transform.Rotate; +import javafx.scene.transform.Transform; import org.csstudio.display.builder.model.DirtyFlag; import org.csstudio.display.builder.model.DisplayModel; import org.csstudio.display.builder.model.UntypedWidgetPropertyListener; @@ -87,7 +90,7 @@ public class EmbeddedDisplayRepresentation extends RegionBaseRepresentation innerTransforms = inner.getTransforms(); + innerTransforms.add(zoom = new Scale()); + innerTransforms.add(rotation = new Rotate(0, 0, 0)); scroll = new NonCachingScrollPane(inner); scroll.setHbarPolicy(ScrollBarPolicy.AS_NEEDED); @@ -175,13 +183,13 @@ protected void registerListeners() model_widget.propWidth().addUntypedPropertyListener(sizesChangedListener); model_widget.propHeight().addUntypedPropertyListener(sizesChangedListener); model_widget.propResize().addUntypedPropertyListener(sizesChangedListener); + model_widget.propRotation().addUntypedPropertyListener(sizesChangedListener); model_widget.propFile().addUntypedPropertyListener(fileChangedListener); model_widget.propGroupName().addUntypedPropertyListener(fileChangedListener); model_widget.propMacros().addUntypedPropertyListener(fileChangedListener); model_widget.propTransparent().addUntypedPropertyListener(backgroundChangedListener); - fileChanged(null, null, null); } @@ -191,10 +199,12 @@ protected void unregisterListeners() model_widget.propWidth().removePropertyListener(sizesChangedListener); model_widget.propHeight().removePropertyListener(sizesChangedListener); model_widget.propResize().removePropertyListener(sizesChangedListener); + model_widget.propRotation().removePropertyListener(sizesChangedListener); model_widget.propFile().removePropertyListener(fileChangedListener); model_widget.propGroupName().removePropertyListener(fileChangedListener); model_widget.propMacros().removePropertyListener(fileChangedListener); model_widget.propTransparent().removePropertyListener(backgroundChangedListener); + super.unregisterListeners(); } @@ -233,6 +243,13 @@ else if (resize == Resize.StretchContent) zoom_factor_x = content_width > 0 ? (double) widget_width / content_width : 1.0; zoom_factor_y = content_height > 0 ? (double) widget_height / content_height : 1.0; } + + // Apply the rotation + rotate=model_widget.propRotation().getValue(); + rotation.setAngle(rotate); + rotation.setPivotX((double)content_width / 2); + rotation.setPivotY((double) content_height / 2); + } dirty_sizes.mark();