package org.nlamah.QL.Builders;
import java.util.ArrayList;
import java.util.List;
import org.nlamah.QBase.Tools.ArrayTools;
import org.nlamah.QL.Interfaces.QLFormElementVisitor;
import org.nlamah.QL.Model.Form.ComputedQuestion;
import org.nlamah.QL.Model.Form.ConditionalBlock;
import org.nlamah.QL.Model.Form.ElseIfThenBlock;
import org.nlamah.QL.Model.Form.ElseThenBlock;
import org.nlamah.QL.Model.Form.Form;
import org.nlamah.QL.Model.Form.IfThenBlock;
import org.nlamah.QL.Model.Form.InputQuestion;
import org.nlamah.QL.Model.Form.Abstract.DeclaringFormElement;
import org.nlamah.QL.Model.Form.Abstract.FormElement;
import org.nlamah.QL.View.Controllers.ComputedQuestionViewController;
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.Abstract.WidgetView;
import org.nlamah.QL.View.Widgets.CheckboxWidgetView;
import org.nlamah.QL.View.Widgets.ComputedValueWidgetView;
import org.nlamah.QL.View.Widgets.NumberFieldWidgetView;
import org.nlamah.QL.View.Widgets.TextFieldWidgetView;
public class QLViewControllersFactory implements QLFormElementVisitor
{
protected FormRootViewController rootViewController;
protected FormElementViewController currentlyCreatedViewController;
public QLViewControllersFactory(FormRootViewController rootViewController)
{
this.rootViewController = rootViewController;
}
public List<FormElementViewController> createChildViewControllers(DeclaringFormElement declaringFormElement)
{
List<FormElementViewController> childViewControllers = null;
if (ArrayTools.arrayExistsAndHasElements(declaringFormElement.childElements()))
{
childViewControllers = new ArrayList<FormElementViewController>();
for (FormElement formElement : declaringFormElement.childElements())
{
formElement.accept(this);
childViewControllers.add(currentlyCreatedViewController);
}
}
return childViewControllers;
}
public FormElementViewController createFormElementViewController(FormElement formElement)
{
formElement.accept(this);
return currentlyCreatedViewController;
}
private void createAndAddChildViewControllers(DeclaringFormElementViewController viewController, DeclaringFormElement formElement)
{
viewController.setChildViewControllers(createChildViewControllers(formElement));
currentlyCreatedViewController = viewController;
currentlyCreatedViewController.setRootViewController(this.rootViewController);
}
private ConditionalBlockViewController createIfThenBlockViewController(ConditionalBlockViewController conditionalBlockViewController, IfThenBlock ifThenBlock)
{
IfThenBlockViewController ifThenBlockViewController = null;
assert(ifThenBlock != null);
ifThenBlockViewController = new IfThenBlockViewController(ifThenBlock);
ifThenBlockViewController.setChildViewControllers(createChildViewControllers(ifThenBlock));
conditionalBlockViewController.setIfThenBlockViewController(ifThenBlockViewController);
return conditionalBlockViewController;
}
private ConditionalBlockViewController createElseIfThenBlockViewControllers(ConditionalBlockViewController conditionalBlockViewController, List<ElseIfThenBlock> elseIfThenBlocks)
{
List<ElseIfThenBlockViewController> elseIfThenBlockViewControllers = null;
if (ArrayTools.arrayExistsAndHasElements(elseIfThenBlocks))
{
int numberOfElseIfThenViewControllers = elseIfThenBlocks.size();
elseIfThenBlockViewControllers = new ArrayList<ElseIfThenBlockViewController>(numberOfElseIfThenViewControllers);
for (ElseIfThenBlock elseIfThenBlock : elseIfThenBlocks)
{
ElseIfThenBlockViewController viewController = new ElseIfThenBlockViewController(elseIfThenBlock);
viewController.setChildViewControllers(createChildViewControllers(elseIfThenBlock));
elseIfThenBlockViewControllers.add(viewController);
}
}
conditionalBlockViewController.setElseIfThenBlockViewControllers(elseIfThenBlockViewControllers);
return conditionalBlockViewController;
}
private ConditionalBlockViewController createElseThenBlockViewController(ConditionalBlockViewController conditionalBlockViewController, ElseThenBlock elseThenBlock)
{
ElseThenBlockViewController elseThenBlockViewController = null;
if (elseThenBlock != null)
{
elseThenBlockViewController = new ElseThenBlockViewController(elseThenBlock);
elseThenBlockViewController.setChildViewControllers(createChildViewControllers(elseThenBlock));
}
conditionalBlockViewController.setElseThenBlockViewController(elseThenBlockViewController);
return conditionalBlockViewController;
}
@Override
public void visit(ConditionalBlock conditionalBlock)
{
ConditionalBlockViewController conditionalBlockViewController = ConditionalBlockViewControllerFactory.createConditionalBlockViewController(conditionalBlock);
conditionalBlockViewController = createIfThenBlockViewController(conditionalBlockViewController, conditionalBlock.ifThenBlock());
conditionalBlockViewController = createElseIfThenBlockViewControllers(conditionalBlockViewController, conditionalBlock.elseIfThenBlocks());
conditionalBlockViewController = createElseThenBlockViewController(conditionalBlockViewController, conditionalBlock.elseThenBlock());
currentlyCreatedViewController = conditionalBlockViewController;
currentlyCreatedViewController.setRootViewController(this.rootViewController);
}
@Override
public void visit(ElseIfThenBlock elseIfThenBlock)
{
DeclaringFormElementViewController declaringFormElementViewController = new ElseIfThenBlockViewController(elseIfThenBlock);
createAndAddChildViewControllers(declaringFormElementViewController, elseIfThenBlock);
}
@Override
public void visit(ElseThenBlock elseThenBlock)
{
DeclaringFormElementViewController declaringFormElementViewController = new ElseThenBlockViewController(elseThenBlock);
createAndAddChildViewControllers(declaringFormElementViewController, elseThenBlock);
}
@Override
public void visit(Form form)
{
assert false;
}
@Override
public void visit(IfThenBlock ifThenBlock)
{
DeclaringFormElementViewController declaringFormElementViewController = new IfThenBlockViewController(ifThenBlock);
createAndAddChildViewControllers(declaringFormElementViewController, ifThenBlock);
}
@Override
public void visit(InputQuestion inputQuestion)
{
QuestionViewController questionViewController = new QuestionViewController(rootViewController, inputQuestion);
WidgetView widgetView = null;
switch (inputQuestion.returnType())
{
case BOOLEAN:widgetView = new CheckboxWidgetView();
break;
case NUMBER: widgetView = new NumberFieldWidgetView();
break;
case TEXT: widgetView = new TextFieldWidgetView();
break;
default: assert(false);
break;
}
widgetView.setWidgetViewDelegate(questionViewController);
questionViewController.setWidgetView(widgetView);
currentlyCreatedViewController = questionViewController;
}
@Override
public void visit(ComputedQuestion computedQuestion)
{
ComputedQuestionViewController questionViewController = new ComputedQuestionViewController(rootViewController, computedQuestion);
ComputedValueWidgetView widgetView = new ComputedValueWidgetView();
widgetView.setWidgetViewDelegate(questionViewController);
questionViewController.setWidgetView(widgetView);
currentlyCreatedViewController = questionViewController;
}
}