package eu.ggnet.saft.core.swing;
import eu.ggnet.saft.api.ui.FxController;
import eu.ggnet.saft.core.*;
import eu.ggnet.saft.core.all.*;
import eu.ggnet.saft.core.fx.FxSaft;
import java.awt.Window;
import java.io.File;
import java.util.concurrent.*;
import javafx.embed.swing.JFXPanel;
import javafx.fxml.FXMLLoader;
import javafx.scene.layout.Pane;
import javafx.stage.*;
import javax.swing.JPanel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* @author oliver.guenther
* @param <T>
*/
public class SwingCreator<T> extends AbstractCreator<T> {
private final Logger L = LoggerFactory.getLogger(SwingCreator.class);
private final Window parent;
private final Modality modality;
public SwingCreator(Callable<T> before, Window parent, Modality modality) {
super(before);
this.parent = parent;
this.modality = modality;
}
public SwingCreator<?> modality(Modality modality) {
return new SwingCreator<>(before.getCallable(), parent, modality);
}
@Override
public <D> SwingCreator<D> call(Callable<D> callable) {
return new SwingCreator<>(() -> {
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 Pane> SwingOk<R> choiceFx(Class<R> paneClazz) {
return new SwingOk<>(() -> {
if (before.ifPresentIsNull()) return null; // Chainbreaker
final T parameter = before.get();
SwingCore.ensurePlatformIsRunning();
final R pane = FxSaft.construct(paneClazz, parameter);
JFXPanel p = SwingCore.wrap(pane);
return SwingSaft.wrapInChoiceAndShow(parent, p, modality, pane);
}, parent, modality);
}
@Override
public <R extends FxController> UiOk<R> choiceFxml(Class<R> controllerClass) {
return new SwingOk<>(() -> {
if (before.ifPresentIsNull()) return null; // Chainbreaker
final T parameter = before.get();
SwingCore.ensurePlatformIsRunning();
final FXMLLoader loader = FxSaft.constructFxml(controllerClass, parameter);
JFXPanel p = SwingCore.wrap(loader.getRoot());
return SwingSaft.wrapInChoiceAndShow(parent, p, modality, loader.getController());
}, parent, modality);
}
@Override
public <R extends JPanel> SwingOk<R> choiceSwing(Class<R> panelClazz) {
return new SwingOk<>(() -> {
if (before.ifPresentIsNull()) return null; // Chainbreaker
final T parameter = before.get(); // Call outside all ui threads assumed
final R panel = SwingSaft.construct(panelClazz, parameter);
return SwingSaft.wrapInChoiceAndShow(parent, panel, modality, panel);
}, parent, modality);
}
@Override
public <R extends JPanel> SwingOpenPanel<T, R> openSwing(Class<R> panelClass) {
return openSwing(panelClass, null);
}
@Override
public <R extends JPanel> SwingOpenPanel<T, R> openSwing(Class<R> panelClass, String id) {
return new SwingOpenPanel<>(before.getCallable(), parent, modality, id, panelClass);
}
@Override
public <R extends Pane> SwingOpenPane<T, R> openFx(Class<R> panelClass, String id) {
return new SwingOpenPane<>(before.getCallable(), parent, modality, id, panelClass);
}
@Override
public <R extends Pane> SwingOpenPane<T, R> openFx(Class<R> panelClass) {
return openFx(panelClass, null);
}
@Override
public <R extends FxController> SwingOpenFxml<T, R> openFxml(Class<R> controllerClass) {
return openFxml(controllerClass, null);
}
@Override
public <R extends FxController> SwingOpenFxml<T, R> openFxml(Class<R> controllerClass, String id) {
return new SwingOpenFxml<>(before.getCallable(), parent, modality, id, controllerClass);
}
@Override
public SwingOk<File> openFileChooser() {
return openFileChooser(null);
}
@Override
public SwingOk<File> openFileChooser(String title) {
return new SwingOk<>(() -> {
SwingCore.ensurePlatformIsRunning();
File file = FxSaft.dispatch(() -> {
FileChooser fileChooser = new FileChooser();
if (title == null) fileChooser.setTitle("Open File");
else fileChooser.setTitle(title);
return fileChooser.showOpenDialog(new Stage());
});
return new OkCancelResult<>(file, file != null);
}, parent, modality);
}
@Override
public void exec() {
Ui.exec(this);
}
}