package org.ntlab.rdlcanvas.generaterdl;
import org.ntlab.rdlcanvas.models.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class ScreenTemplateGenerateRDL{
public ScreenTemplateGenerateRDL(RDLSpec spec){
createScreenTemplateResourceDeclaration(spec);
createScreenTemplateFormula(spec);
//System.out.println(spec.toString()); //デバッグ用
}
private void createScreenTemplateResourceDeclaration(RDLSpec spec){
//ex screen(1) :: struct
spec.addRDLSpecResourceDeclaration("screen", 1, StructuralType.structure, null);
spec.addRDLSpecResourceDeclaration("scId", 1, StructuralType.id, RDLSpecLang.typeString);
spec.addRDLSpecResourceDeclaration("widget", 2, StructuralType.structure, null);
spec.addRDLSpecResourceDeclaration("wId", 2, StructuralType.id, RDLSpecLang.typeString);
spec.addRDLSpecResourceDeclaration("wText", 2, RDLSpecLang.typeString);
spec.addRDLSpecResourceDeclaration("wType", 2, RDLSpecLang.typeString);
spec.addRDLSpecResourceDeclaration("wState", 2, RDLSpecLang.typeString);
spec.addRDLSpecResourceDeclaration("wX", 2, RDLSpecLang.typeInt);
spec.addRDLSpecResourceDeclaration("wY", 2, RDLSpecLang.typeInt);
spec.addRDLSpecResourceDeclaration("wWidth", 2, RDLSpecLang.typeInt);
spec.addRDLSpecResourceDeclaration("wHeight", 2, RDLSpecLang.typeInt);
spec.addRDLSpecResourceDeclaration("wEnabled", 2, RDLSpecLang.typeBoolean);
spec.addRDLSpecResourceDeclaration("wVisible", 2, RDLSpecLang.typeBoolean);
spec.addRDLSpecResourceDeclaration("wColor", 2, RDLSpecLang.typeString);
//SpecStatementにResourceDeclaretionを追加
for(String name: spec.getResourceMap().keySet()){
spec.addRDLSpecStatement(spec.getRDLSpecResourceDeclaration(name));
}
}
private void createScreenTemplateFormula(RDLSpec spec){
//ex screen:scId
createElementPairDependencyFormula("scId", "screen", spec);
createElementPairDependencyFormula("wText", "widget", spec);
createElementPairDependencyFormula("wType", "widget", spec);
createElementPairDependencyFormula("wState", "widget", spec);
createElementPairDependencyFormula("wX", "widget", spec);
createElementPairDependencyFormula("wY", "widget", spec);
createElementPairDependencyFormula("wHeight", "widget", spec);
createElementPairDependencyFormula("wWidth", "widget", spec);
createElementPairDependencyFormula("wEnabled", "widget", spec);
createElementPairDependencyFormula("wVisible", "widget", spec);
createElementPairDependencyFormula("wColor", "widget", spec);
createNestedDependencyFormula("widget", "wId", "screen", spec);
}
private void createElementPairDependencyFormula(String depending, String depended, RDLSpec spec){
List<RDLSpecEvaluatableTerm> dependedList = new ArrayList<>();
dependedList.add(spec.getRDLSpecResourceDeclaration(depended).getResource());
spec.addRDLSpecStatement(new RDLSpecDependencyFormula(new RDLSpecDependency(spec.getRDLSpecResourceDeclaration(depending).getResource(), dependedList)));
}
private void createNestedDependencyFormula(String depending, String depended, String outsideDepended ,RDLSpec spec){
List<RDLSpecEvaluatableTerm> dependedInsideList = new ArrayList<>();
List<RDLSpecEvaluatableTerm> dependedOutsideList = new ArrayList<>();
dependedInsideList.add(spec.getRDLSpecResourceDeclaration(depended).getResource());
dependedOutsideList.add(spec.getRDLSpecResourceDeclaration(outsideDepended).getResource());
spec.addRDLSpecStatement(new RDLSpecDependencyFormula(new RDLSpecDependency(new RDLSpecDependency(spec.getRDLSpecResourceDeclaration(depending).getResource(), dependedInsideList) ,dependedOutsideList)));
}
}