package xapi.jre.ui.impl;
import com.github.javaparser.ASTHelper;
import com.github.javaparser.ast.expr.UiAttrExpr;
import com.github.javaparser.ast.expr.UiContainerExpr;
import javafx.scene.layout.VBox;
import xapi.dev.source.ClassBuffer;
import xapi.dev.source.MethodBuffer;
import xapi.dev.source.SourceBuilder;
import xapi.dev.ui.ContainerMetadata;
import xapi.dev.ui.UiComponentGenerator;
import xapi.dev.ui.UiGeneratorTools;
import xapi.dev.ui.UiVisitScope;
import xapi.fu.In1Out1;
import java.util.Optional;
/**
* Created by james on 6/17/16.
*/
public class JavaFxAppComponentGenerator extends UiComponentGenerator {
public JavaFxAppComponentGenerator() {
}
@Override
public UiVisitScope startVisit(
UiGeneratorTools service, ContainerMetadata me, UiContainerExpr n
) {
SourceBuilder<?> out = me.getSourceBuilder();
final Optional<UiAttrExpr> type = n.getAttribute("type");
String container = type
.map(ASTHelper::extractAttrValue)
.orElse(VBox.class.getName());
container = out.addImport(container);
String binder = out.addImport(In1Out1.class);
String controller = out.addImport(me.getControllerType());
final ClassBuffer cb = out.getClassBuffer();
cb.addInterface(binder + "<" + controller + ", " + container + ">");
// Even though we are the mapping for <app />,
// we are actually going to bind to a JavaFX stage;
// this is because we want to be callable within other
// JavaFX code, and Application.launch may only be called once!
String refName = me.getRefName();
final MethodBuffer method = cb.createMethod("public " + container + " io(" + controller + " " + refName + ")");
String varName = me.newVarName("root");
method.println(container + " " + varName + " = new " + container + "();");
me.saveMethod(varName, method);
me.pushPanelName(varName);
return super.startVisit(service, me, n);
}
@Override
public void endVisit(
UiGeneratorTools service, ContainerMetadata me, UiContainerExpr n,
UiVisitScope scope
) {
String panelName = me.popPanelName();
me.getMethod(panelName)
.returnValue(panelName);
super.endVisit(service, me, n, scope);
}
}