package eu.ggnet.saft.core.fx; import eu.ggnet.saft.core.*; import eu.ggnet.saft.core.all.*; import eu.ggnet.saft.api.ui.FxController; import eu.ggnet.saft.core.swing.*; import java.io.File; import java.util.concurrent.*; import javafx.embed.swing.SwingNode; import javafx.fxml.FXMLLoader; import javafx.scene.Node; import javafx.scene.layout.Pane; import javafx.stage.*; import static javafx.stage.Modality.APPLICATION_MODAL; import javax.swing.JPanel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * * @author oliver.guenther * @param <T> */ public class FxCreator<T> extends AbstractCreator<T> { private final Window parent; private final Modality modality; private final static Logger L = LoggerFactory.getLogger(FxCreator.class); public FxCreator(Callable<T> before, Window parent, Modality modality) { super(before); this.parent = parent; this.modality = modality; } public FxCreator<?> modality(Modality modality) { return new FxCreator<>(before.getCallable(), parent, modality); } @Override public <D> FxCreator<D> call(Callable<D> callable) { return new FxCreator<>(() -> { if (before.ifPresentIsNull()) return null; // Chainbreaker UiCore.backgroundActivityProperty().set(true); D r = callable.call(); UiCore.backgroundActivityProperty().set(false); return r; }, parent, modality); } @Override public <R extends FxController> UiOk<R> choiceFxml(Class<R> controllerClass) { return new FxOk<>(() -> { if (before.ifPresentIsNull()) return null; // Chainbreaker final T parameter = before.get(); final FXMLLoader loader = FxSaft.constructFxml(controllerClass, parameter); return wrapAndShow(parent, loader.getRoot(), modality, loader.getController()); }, parent, modality); } @Override public <R extends Pane> UiOk<R> choiceFx(Class<R> paneClazz) { return new FxOk<>(() -> { if (before.ifPresentIsNull()) return null; // Chainbreaker final T parameter = before.get(); final R pane = FxSaft.construct(paneClazz, parameter); return wrapAndShow(parent, pane, modality, pane); }, parent, modality); } @Override public <R extends JPanel> FxOk<R> choiceSwing(Class<R> panelClazz) { return new FxOk<>(() -> { if (before.ifPresentIsNull()) return null; // Chainbreaker final T parameter = before.get(); final R panel = SwingSaft.construct(panelClazz, parameter); final SwingNode node = FxCore.wrap(panel); return wrapAndShow(parent, node, modality, panel); }, parent, modality); } private static <T, R, P extends Node> OkCancelResult<R> wrapAndShow(Window parent, Node node, Modality modality, R payload) throws InterruptedException, ExecutionException { return FxSaft.dispatch(() -> { OkCancelStage<SwingNode> s = new OkCancelStage(UiUtil.title(payload.getClass()), node); s.initOwner(parent); if (modality == null) s.initModality(APPLICATION_MODAL); else s.initModality(modality); L.warn("setLocationRelativeTo in JavaFx Mode not yet implemented"); s.showAndWait(); return new OkCancelResult<>(payload, s.isOk()); }); } @Override public FxOk<File> openFileChooser() { return openFileChooser(null); } @Override public FxOk<File> openFileChooser(String title) { return new FxOk<>(() -> { File file = FxSaft.dispatch(() -> { FileChooser fileChooser = new FileChooser(); if (title == null) fileChooser.setTitle("Open File"); else fileChooser.setTitle(title); return fileChooser.showOpenDialog(FxCore.mainStage()); }); return new OkCancelResult<>(file, file != null); }, parent, modality); } @Override public <R extends JPanel> SwingOpenPanel<T, R> openSwing(Class<R> builder) { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override public <R extends JPanel> SwingOpenPanel<T, R> openSwing(Class<R> builder, String id) { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override public <R extends Pane> SwingOpenPane<T, R> openFx(Class<R> builder, String id) { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override public <R extends Pane> SwingOpenPane<T, R> openFx(Class<R> panelClass) { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override public <R extends FxController> SwingOpenFxml<T, R> openFxml(Class<R> controllerClass) { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override public <R extends FxController> SwingOpenFxml<T, R> openFxml(Class<R> controllerClass, String id) { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override public void exec() { Ui.exec(this); } }