diff --git a/app/display/runtime/src/main/java/org/csstudio/display/builder/runtime/app/DisplayRuntimeInstance.java b/app/display/runtime/src/main/java/org/csstudio/display/builder/runtime/app/DisplayRuntimeInstance.java index ffeeb6c07a..ddca7128e8 100644 --- a/app/display/runtime/src/main/java/org/csstudio/display/builder/runtime/app/DisplayRuntimeInstance.java +++ b/app/display/runtime/src/main/java/org/csstudio/display/builder/runtime/app/DisplayRuntimeInstance.java @@ -17,6 +17,7 @@ import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import java.util.concurrent.FutureTask; import java.util.logging.Level; import org.csstudio.display.builder.model.DisplayModel; @@ -24,6 +25,7 @@ import org.csstudio.display.builder.model.Widget; import org.csstudio.display.builder.model.persist.ModelLoader; import org.csstudio.display.builder.model.util.ModelResourceUtil; +import org.csstudio.display.builder.representation.ToolkitListener; import org.csstudio.display.builder.representation.javafx.JFXRepresentation; import org.csstudio.display.builder.runtime.ActionUtil; import org.csstudio.display.builder.runtime.RuntimeUtil; @@ -75,6 +77,7 @@ public class DisplayRuntimeInstance implements AppInstance private final BorderPane layout = new BorderPane(); private final DockItemWithInput dock_item; private final DockItemRepresentation representation; + private FutureTask representation_init = new FutureTask<>(() -> {return null;}); private Node toolbar; /** Property on the 'model_parent' of the JFX scene that holds this DisplayRuntimeInstance */ @@ -186,6 +189,13 @@ DisplayNavigation getNavigation() return navigation; } + /* Clients waiting for the representation to be initialized can get() this, + * which will block until the representation is initialized. + */ + public FutureTask getRepresentation_init() { + return representation_init; + } + private Node createToolbar() { zoom_action = new ZoomAction(this); @@ -311,6 +321,7 @@ public void loadDisplayFile(final DisplayInfo info) try { representation.awaitRepresentation(30, TimeUnit.SECONDS); + representation_init.run(); logger.log(Level.FINE, "Done with representing model of " + info.getPath()); } catch (TimeoutException | InterruptedException ex) @@ -499,6 +510,15 @@ public void onClosed() navigation.dispose(); } + public void addListener(ToolkitListener listener){ + this.getRepresentation().removeListener(listener); + this.getRepresentation().addListener(listener); + } + + public void removeListener(ToolkitListener listener){ + this.getRepresentation().removeListener(listener); + } + @Override public Optional getPositionAndSizeHint() { return Optional.ofNullable(active_model).flatMap(displayModel -> {