From 349e30432c8d1a6c26ad000842ca0cc61b23f54a Mon Sep 17 00:00:00 2001 From: Sita Date: Mon, 17 Jun 2024 22:49:30 +0200 Subject: [PATCH] Add support for messaging within stage --- .../sita/modulefx/FxControllerLoader.java | 2 +- .../MessageBusSupportProcessor.java | 49 +++++++++++++++++-- 2 files changed, 46 insertions(+), 5 deletions(-) diff --git a/module-fx/src/main/java/place/sita/modulefx/FxControllerLoader.java b/module-fx/src/main/java/place/sita/modulefx/FxControllerLoader.java index 811b460..0d3bf8c 100644 --- a/module-fx/src/main/java/place/sita/modulefx/FxControllerLoader.java +++ b/module-fx/src/main/java/place/sita/modulefx/FxControllerLoader.java @@ -51,7 +51,7 @@ public Node setupForController(Object bean, String resource, FxSetupContext cont @Override public VirtualTreeGroup virtualTreeGroup() { - return null; + return virtualTreeGroup; } }); diff --git a/module-fx/src/main/java/place/sita/modulefx/processors/MessageBusSupportProcessor.java b/module-fx/src/main/java/place/sita/modulefx/processors/MessageBusSupportProcessor.java index b87490b..b825f2e 100644 --- a/module-fx/src/main/java/place/sita/modulefx/processors/MessageBusSupportProcessor.java +++ b/module-fx/src/main/java/place/sita/modulefx/processors/MessageBusSupportProcessor.java @@ -2,25 +2,66 @@ import place.sita.modulefx.FxSceneBuilderProcessor; import place.sita.modulefx.FxSetupContext; -import place.sita.modulefx.annotations.FxChild; +import place.sita.modulefx.annotations.FxMessageListener; +import place.sita.modulefx.annotations.ModuleFx; +import place.sita.modulefx.messagebus.MessageSender; +import place.sita.modulefx.vtg.MessageListener; import place.sita.modulefx.vtg.VirtualTreeGroupElement; import java.util.Arrays; +import java.util.UUID; +import java.util.concurrent.atomic.AtomicBoolean; public class MessageBusSupportProcessor implements FxSceneBuilderProcessor { @Override public void process(FxSetupContext context) { VirtualTreeGroupElement element = new VirtualTreeGroupElement(); - boolean addedToAnyVirtualTreeGroup = false; + AtomicBoolean addedToAnyVirtualTreeGroup = new AtomicBoolean(false); Object controller = context.controller(); Class controllerClass = controller.getClass(); Arrays.stream(controllerClass.getDeclaredFields()) - .filter(field -> field.isAnnotationPresent(FxChild.class)) + .filter(field -> field.isAnnotationPresent(ModuleFx.class)) + // instance of MessageSender? + .filter(field -> field.getType().isAssignableFrom(MessageSender.class)) .forEach(field -> { - injectChild(controller, field, controllerClass, context); + addedToAnyVirtualTreeGroup.set(true); + UUID elementId = element.getId(); + MessageSender messageSender = new MessageSender() { + @Override + public void send(Object message) { + context.virtualTreeGroup().message(elementId, message); + } + }; + field.setAccessible(true); + try { + field.set(controller, messageSender); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } }); + + Arrays.stream(controllerClass.getMethods()) + .filter(method -> method.isAnnotationPresent(FxMessageListener.class)) + .forEach(method -> { + addedToAnyVirtualTreeGroup.set(true); + element.addListener(new MessageListener() { + @Override + public void receive(Object message) { + try { + method.invoke(controller, message); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + }); + }); + + + if (addedToAnyVirtualTreeGroup.get()) { + context.virtualTreeGroup().addElement(element); + } } }