1717import java .util .concurrent .Future ;
1818import java .util .concurrent .TimeUnit ;
1919import java .util .concurrent .TimeoutException ;
20+ import java .util .concurrent .FutureTask ;
2021import java .util .logging .Level ;
2122
2223import org .csstudio .display .builder .model .DisplayModel ;
2324import org .csstudio .display .builder .model .Preferences ;
2425import org .csstudio .display .builder .model .Widget ;
2526import org .csstudio .display .builder .model .persist .ModelLoader ;
2627import org .csstudio .display .builder .model .util .ModelResourceUtil ;
28+ import org .csstudio .display .builder .representation .ToolkitListener ;
2729import org .csstudio .display .builder .representation .javafx .JFXRepresentation ;
2830import org .csstudio .display .builder .runtime .ActionUtil ;
2931import org .csstudio .display .builder .runtime .RuntimeUtil ;
@@ -75,6 +77,7 @@ public class DisplayRuntimeInstance implements AppInstance
7577 private final BorderPane layout = new BorderPane ();
7678 private final DockItemWithInput dock_item ;
7779 private final DockItemRepresentation representation ;
80+ private FutureTask <Object > representation_init = new FutureTask <>(() -> {return null ;});
7881 private Node toolbar ;
7982
8083 /** Property on the 'model_parent' of the JFX scene that holds this DisplayRuntimeInstance */
@@ -157,10 +160,9 @@ public static DisplayRuntimeInstance ofDisplayModel(final DisplayModel model)
157160 representation .fireContextMenu (model , (int )event .getScreenX (), (int )event .getScreenY ());
158161 }
159162 });
160-
161163 layout .addEventFilter (KeyEvent .KEY_PRESSED , this ::handleKeys );
162-
163164 dock_item .addClosedNotification (this ::onClosed );
165+ representation_init .run ();
164166 }
165167
166168 @ Override
@@ -186,6 +188,13 @@ DisplayNavigation getNavigation()
186188 return navigation ;
187189 }
188190
191+ /* Clients waiting for the representation to be initialized can get() this,
192+ * which will block until the representation is initialized.
193+ */
194+ public FutureTask <Object > getRepresentation_init () {
195+ return representation_init ;
196+ }
197+
189198 private Node createToolbar ()
190199 {
191200 zoom_action = new ZoomAction (this );
@@ -499,6 +508,15 @@ public void onClosed()
499508 navigation .dispose ();
500509 }
501510
511+ public void addListener (ToolkitListener listener ){
512+ this .getRepresentation ().removeListener (listener );
513+ this .getRepresentation ().addListener (listener );
514+ }
515+
516+ public void removeListener (ToolkitListener listener ){
517+ this .getRepresentation ().removeListener (listener );
518+ }
519+
502520 @ Override
503521 public Optional <Rectangle2D > getPositionAndSizeHint () {
504522 return Optional .ofNullable (active_model ).flatMap (displayModel -> {
0 commit comments