Newer
Older
RDLCanvas / src / main / java / org / ntlab / rdlcanvas / generaterdl / ScreenTemplateGenerateRDL.java
package org.ntlab.rdlcanvas.generaterdl;

import org.ntlab.rdlcanvas.models.*;

import java.util.ArrayList;
import java.util.List;


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);

        // [widget:wid]:screen
        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)));

    }


}