package org.nlamah.QL.Builders; import java.util.ArrayList; import java.util.List; import org.nlamah.QL.Interfaces.QLFormElementViewControllerVisitor; import org.nlamah.QL.View.Controllers.ConditionalBlockViewController; import org.nlamah.QL.View.Controllers.ElseIfThenBlockViewController; import org.nlamah.QL.View.Controllers.ElseThenBlockViewController; import org.nlamah.QL.View.Controllers.FormRootViewController; import org.nlamah.QL.View.Controllers.IfThenBlockViewController; import org.nlamah.QL.View.Controllers.QuestionViewController; import org.nlamah.QL.View.Controllers.Abstract.DeclaringFormElementViewController; import org.nlamah.QL.View.Controllers.Abstract.FormElementViewController; import org.nlamah.QL.View.Form.ElseIfThenBlockView; import org.nlamah.QL.View.Form.ElseThenBlockView; import org.nlamah.QL.View.Form.IfThenBlockView; import org.nlamah.QL.View.Form.Abstract.FormElementView; public class QLViewFactory implements QLFormElementViewControllerVisitor { protected FormElementView currentlyCreatedView; public List<FormElementView> gatherChildViews(DeclaringFormElementViewController declaringFormElementViewController) { List<FormElementViewController> childViewControllers = declaringFormElementViewController.childViewControllers(); List<FormElementView> childViews = new ArrayList<FormElementView>(); for (FormElementViewController childViewController : childViewControllers) { childViewController.accept(this); childViews.add(currentlyCreatedView); } return childViews; } public FormElementView gatherViewForFormViewController(FormElementViewController formViewController) { formViewController.accept(this); return currentlyCreatedView; } private void gatherAndAddChildViews(DeclaringFormElementViewController viewController) { FormElementView view = viewController.view(); viewController.setChildViews(gatherChildViews(viewController)); for (FormElementView childView : viewController.childViews()) { view.add(childView); } currentlyCreatedView = view; } private ConditionalBlockViewController addIfThenBlockView (ConditionalBlockViewController conditionalBlockViewController) { FormElementView conditionalBlockView = conditionalBlockViewController.view(); IfThenBlockViewController ifThenBlockViewController = conditionalBlockViewController.ifThenBlockViewController(); ifThenBlockViewController.accept(this); conditionalBlockViewController.setIfThenBlockView((IfThenBlockView) currentlyCreatedView); conditionalBlockView.add(currentlyCreatedView); return conditionalBlockViewController; } private ConditionalBlockViewController addElseIfThenBlockViews(ConditionalBlockViewController conditionalBlockViewController) { FormElementView conditionalBlockView = conditionalBlockViewController.view(); assert(conditionalBlockView != null); List<ElseIfThenBlockViewController> elseIfThenBlockViewControllers = conditionalBlockViewController.elseIfThenBlockViewControllers(); List<ElseIfThenBlockView> elseIfThenBlockViews = new ArrayList<ElseIfThenBlockView>(); for (ElseIfThenBlockViewController elseIfThenBlockViewController : elseIfThenBlockViewControllers) { elseIfThenBlockViewController.accept(this); elseIfThenBlockViews.add((ElseIfThenBlockView) currentlyCreatedView); conditionalBlockView.add(currentlyCreatedView); } conditionalBlockViewController.setElseIfThenBlockViews(elseIfThenBlockViews); return conditionalBlockViewController; } private ConditionalBlockViewController addElseThenBlockView(ConditionalBlockViewController conditionalBlockViewController) { FormElementView conditionalBlockView = conditionalBlockViewController.view(); ElseThenBlockViewController elseThenBlockViewController = conditionalBlockViewController.elseThenBlockViewController(); if (elseThenBlockViewController != null) { elseThenBlockViewController.accept(this); conditionalBlockViewController.setElseThenBlockView((ElseThenBlockView) currentlyCreatedView); conditionalBlockView.add(currentlyCreatedView); } return conditionalBlockViewController; } @Override public void visit(FormRootViewController FormRootViewController) { assert(false); } @Override public void visit(ElseIfThenBlockViewController elseIfThenBlockViewController) { gatherAndAddChildViews(elseIfThenBlockViewController); } @Override public void visit(ElseThenBlockViewController elseThenBlockViewController) { gatherAndAddChildViews(elseThenBlockViewController); } @Override public void visit(IfThenBlockViewController ifThenBlockViewController) { gatherAndAddChildViews(ifThenBlockViewController); } @Override public void visit(ConditionalBlockViewController conditionalBlockViewController) { conditionalBlockViewController = addIfThenBlockView(conditionalBlockViewController); conditionalBlockViewController = addElseIfThenBlockViews(conditionalBlockViewController); conditionalBlockViewController = addElseThenBlockView(conditionalBlockViewController); currentlyCreatedView = conditionalBlockViewController.view(); } @Override public void visit(QuestionViewController questionViewController) { currentlyCreatedView = questionViewController.view(); } }