/// <summary> /// Parses (AST)Node recursively /// </summary> /// <param name="node">Node to parse</param> /// <param name="condition">Base condition, optional</param> /// <returns>Collection of widgets</returns> public static ElementManager ParseChildNode(Node node, ElementManagerController elementManagerController, ElementManagerCollection parent, ExpressionBool condition = null) { switch (node.Type) { case NodeType.CONDITIONAL: ExpressionFactory expressionFactory = new ExpressionFactory(elementManagerController); // Parse condition ExpressionBool newCondition = expressionFactory.GetCondition(node as ConditionalNode); newCondition = (condition == null) ? newCondition : condition.Combine(newCondition, ExpressionOperator.And) as ExpressionBool; // Add children with new condition parent.AddChildren(node.Children.Select(o => ParseChildNode(o, elementManagerController, parent, newCondition)).Where(o => o != null)); // return parent return(null); case NodeType.FORM: throw new InvalidOperationException("Cannot stack form nodes"); case NodeType.QUESTION: return(CreateElementManager(node as QuestionNode, condition, parent, elementManagerController)); case NodeType.COMPUTED: return(CreateComputedWidget(node as ComputedNode, condition, parent, elementManagerController)); } throw new NotImplementedException(); }
/// <summary> /// Parses Node recursively /// </summary> /// <param name="node">Node to parse</param> /// <param name="condition">Base condition, optional</param> /// <returns>Collection of widgets</returns> public static ElementManager ParseChildNode(QLNode node, ElementManagerController elementManagerController, ElementManagerCollection parent, ExpressionBool condition = null) { ExpressionFactory expressionFactory = new ExpressionFactory(elementManagerController); switch (node) { case ConditionalNode conditionalNode: // Parse condition ExpressionBool newCondition = expressionFactory.GetCondition(conditionalNode); newCondition = (condition == null) ? newCondition : condition.Combine(newCondition, ExpressionOperator.And) as ExpressionBool; // Add children with new condition parent.AddChildren(conditionalNode.Children.Select(o => ParseChildNode(o, elementManagerController, parent, newCondition)).Where(o => o != null)); return(null); case QuestionNode questionNode: return(CreateElementManager(questionNode, condition, parent, elementManagerController, null)); case ComputedNode computedNode: ExpressionValue expression = expressionFactory.ParseExpressionNode(computedNode.Expression); return(CreateElementManager(computedNode, condition, parent, elementManagerController, expression)); } throw new NotImplementedException(); }
public ElementManager(string identifier, string text, string xmlName, ElementManagerController controller, ExpressionBool activationExpression = null) { Text = text; Identifier = identifier; XMLElementName = xmlName; _elementManagerController = controller; _activationExpression = activationExpression; Active = activationExpression == null; }
public void OrTest() { // true || true ExpressionBool expression = _expression1.Combine(_expression2, ExpressionOperator.Or) as ExpressionBool; Assert.IsTrue(expression.Result); // true || true || false expression = expression.Combine(_expression3, ExpressionOperator.Or) as ExpressionBool; Assert.IsTrue(expression.Result); }
public void AndTest() { // true && true ExpressionBool expression = _expression1.Combine(_expression2, ExpressionOperator.And) as ExpressionBool; Assert.IsTrue(expression.Result); // true && true && false expression = expression.Combine(_expression3, ExpressionOperator.And) as ExpressionBool; Assert.IsFalse(expression.Result); }
public void AlterationTest() { // Create inital combination ExpressionBool expression = _expression1.Combine(_expression2, ExpressionOperator.And) as ExpressionBool; Assert.IsTrue(expression.Result); // Alter combined object _expression2 = _expression2.Combine(_expression3, ExpressionOperator.And) as ExpressionBool; Assert.IsTrue(expression.Result); }
public void EqualsTest() { // true == true ExpressionBool expression = _expression1.Combine(_expression2, ExpressionOperator.Equals) as ExpressionBool; Assert.IsTrue(expression.Result); // (true == true) == false expression = expression.Combine(_expression3, ExpressionOperator.Equals) as ExpressionBool; Assert.IsFalse(expression.Result); }
/// <summary> /// Creates widget with computed value /// </summary> /// <param name="node">Node</param> /// <param name="condition">Condition of widget</param> /// <param name="elementManagerController">Widget controller</param> /// <returns></returns> private static ElementManagerLeaf CreateComputedWidget(ComputedNode node, ExpressionBool condition, ElementManager parent, ElementManagerController elementManagerController) { ExpressionFactory expressionFactory = new ExpressionFactory(elementManagerController); ExpressionValue expression = expressionFactory.ParseExpressionNode(node.Expression); switch (node.Expression.GetQValueType()) { case QValueType.BOOLEAN: return(new BoolQuestionManager(node.ID, node.Text, parent, elementManagerController, condition, expression as ExpressionBool)); case QValueType.INTEGER: return(new IntQuestionManager(node.ID, node.Text, parent, elementManagerController, condition, expression as ExpressionInt)); case QValueType.MONEY: return(new MoneyQuestionManager(node.ID, node.Text, parent, elementManagerController, condition, expression as ExpressionDouble)); } throw new NotImplementedException(); }
public void Initialize() { _expression1 = new ExpressionBool(new string[0], () => true); _expression2 = new ExpressionBool(new string[0], () => true); _expression3 = new ExpressionBool(new string[0], () => false); }
private static ElementManagerLeaf CreateElementManager(IQuestionable identifiedNode, ExpressionBool condition, ElementManagerCollection parent, ElementManagerController elementManagerController, ExpressionValue activationExpression) { switch (identifiedNode.ValueType) { case QValueType.Boolean: return(new BoolQuestionManager(identifiedNode.ID, identifiedNode.Text, parent, elementManagerController, condition, activationExpression as ExpressionBool)); case QValueType.Integer: return(new IntQuestionManager(identifiedNode.ID, identifiedNode.Text, parent, elementManagerController, condition, activationExpression as ExpressionInt)); case QValueType.Text: return(new StringQuestionManager(identifiedNode.ID, identifiedNode.Text, parent, elementManagerController, condition, activationExpression as ExpressionText)); case QValueType.Money: return(new MoneyQuestionManager(identifiedNode.ID, identifiedNode.Text, parent, elementManagerController, condition, activationExpression as ExpressionDouble)); case QValueType.Hex: return(new HexQuestionManager(identifiedNode.ID, identifiedNode.Text, parent, elementManagerController, condition, activationExpression as ExpressionHex)); } throw new InvalidOperationException("Unsupported type: " + identifiedNode.ValueType); }
public SectionManager(string identifier, string text, ElementManagerCollection parent, ElementManagerController controller, ExpressionBool activationExpression = null) : base(identifier, text, "section", parent, controller, activationExpression) { }
public ElementManagerLeaf(string identifier, string text, string xmlName, ElementManagerCollection parent, ElementManagerController controller, ExpressionBool activationExpression = null) : base(identifier, text, xmlName, controller, activationExpression) { Parent = parent; }
/// <summary> /// Creates widget from QuestionNode /// </summary> /// <param name="questionNode">Node to parse</param> /// <returns>Parsed widget</returns> private static ElementManagerLeaf CreateElementManager(QuestionNode questionNode, ExpressionBool condition, ElementManager parent, ElementManagerController elementManagerController) { switch (questionNode.ValueType) { case QValueType.BOOLEAN: return(new BoolQuestionManager(questionNode.ID, questionNode.Text, parent, elementManagerController, condition)); case QValueType.INTEGER: return(new IntQuestionManager(questionNode.ID, questionNode.Text, parent, elementManagerController, condition)); case QValueType.TEXT: return(new StringQuestionManager(questionNode.ID, questionNode.Text, parent, elementManagerController, condition)); case QValueType.MONEY: return(new MoneyQuestionManager(questionNode.ID, questionNode.Text, parent, elementManagerController, condition)); } throw new InvalidOperationException("Unsupported type: " + questionNode.ValueType); }
public FormManager(string identifier, string text, ElementManagerController controller, ExpressionBool activationExpression = null) : base(identifier, text, "form", controller, activationExpression) { }
public PageManager(string identifyer, string text, ElementManager parent, ElementManagerController controller, ExpressionBool activationExpression = null) : base(identifyer, text, "page", parent, controller, activationExpression) { }
public ElementManagerCollection(string identifyer, string text, string xmlName, ElementManagerController controller, ExpressionBool activationExpression = null) : base(identifyer, text, xmlName, controller, activationExpression) { _children = new List <ElementManager>(); }
public StringQuestionManager(string identifyer, string text, ElementManager parent, ElementManagerController controller, ExpressionBool activationExpression = null, TypedExpressionValue <string> answerExpression = null) : base(identifyer, text, parent, controller, activationExpression, answerExpression) { }
public HexQuestionManager(string identifier, string text, ElementManagerCollection parent, ElementManagerController controller, ExpressionBool activationExpression = null, TypedExpressionValue <Hexadecimal> answerExpression = null) : base(identifier, text, parent, controller, activationExpression, answerExpression) { }
public QuestionElementManager(string identifyer, string text, ElementManager parent, ElementManagerController controller, ExpressionBool activationExpression = null, TypedExpressionValue <T> answerExpression = null) : base(identifyer, text, "question", parent, controller, activationExpression) { Answer = new QuestionElementValue <T>(default(T), false); IsAnswered = false; _answerExpression = answerExpression; }