static Control OrdinaryQuestionWidget(Racr.AstNode n) { Widget w; if (n.Type() == ValueTypes.Boolean) { w = new CheckWidget(n.GetLabel()); var cb = w.GetCheckBox(); cb.CheckedChanged += (object sender, EventArgs e) => { if (!cb.ContainsFocus) return; n.SetValue(cb.Checked); n.Root().Render(); }; } else { w = new TextWidget(n.GetLabel()); var tb = w.GetTextBox(); tb.TextChanged += (object sender, EventArgs e) => { if (!tb.ContainsFocus) return; if (n.Type() == ValueTypes.Number) { try { n.SetValue(Convert.ToDouble(tb.Text)); } catch { return; } } else n.SetValue(tb.Text); n.Root().Render(); }; } n.Parent().Widget().Controls.Add(w); return w; }
static Racr.AstNode findL(string name, Racr.AstNode l, int i) { for (int j = 1; j <= i; j++) { var r = l.Child(j).LLookup(name); if (r != null) return r; } return null; }
static Control GroupWidget(Racr.AstNode n) { var panel = new FlowLayoutPanel(); panel.AutoSize = true; panel.BorderStyle = BorderStyle.Fixed3D; panel.Dock = DockStyle.Fill; panel.FlowDirection = FlowDirection.TopDown; panel.WrapContents = false; n.Parent().Widget().Controls.Add(panel); return panel; }
static Control FormWidget(Racr.AstNode n) { var form = new System.Windows.Forms.Form(); form.Text = "Questionnaire"; var file = new MenuItem("&File"); var open = new MenuItem("&Open"); var save = new MenuItem("&Save"); var quit = new MenuItem("&Quit"); open.Click += (object sender, EventArgs e) => { var ofd = new OpenFileDialog(); if (ofd.ShowDialog() == DialogResult.OK) { var parser = new Parser(QL.Ql, File.ReadAllText(ofd.FileName)); var ast = parser.ParseAst(); ast.Render(); Questionnaire.UpdateQuestions(ast); form.Closed -= FormClosed; form.Close(); } }; save.Click += (object sender, EventArgs e) => { var sfd = new SaveFileDialog(); if (sfd.ShowDialog() == DialogResult.OK && sfd.FileName != "") { File.WriteAllText(sfd.FileName, n.SExpr()); } }; quit.Click += (object sender, EventArgs e) => form.Close(); form.Closed += FormClosed; file.MenuItems.Add(open); file.MenuItems.Add(save); file.MenuItems.Add(quit); form.Menu = new MainMenu(); form.Menu.MenuItems.Add(file); var panel = new FlowLayoutPanel(); panel.AutoSize = true; panel.AutoScroll = true; panel.Dock = DockStyle.Fill; panel.FlowDirection = FlowDirection.TopDown; panel.WrapContents = false; form.Controls.Add(panel); form.Show(); return panel; }
static bool GroupIsLValid(Racr.AstNode n) { return n.GetExpression().Type() == ValueTypes.Boolean; }
static Racr.AstNode GroupLLookup(Racr.AstNode n, string name) { return findL(name, n.GetBody(), n.GetBody().NumChildren()); }
static bool ElementIsShown(Racr.AstNode n) { return !n.IsErrorQuestion() && n.IsActive(); }
static bool ElementIsErrorQuestion(Racr.AstNode n) { return n == n.ErrorQuestion(); }
static Racr.AstNode FromGLookup(Racr.AstNode n, string name) { var ret = findL(name, n.Parent(), n.ChildIndex() - 1); return (ret != null) ? ret : n.ErrorQuestion(); }
static Racr.AstNode FormErrorQuestion(Racr.AstNode n) { return n.GetBody().Child(1); }
static string FormSExpr(Racr.AstNode n) { return "(Form " + String.Join(" ", n.GetBody().Children().Skip(1).Select(x => ((Racr.AstNode)x).SExpr())) + ")"; }
static object ComputationValue(Racr.AstNode n) { var op = n.GetOperator(); var operands = n.GetOperands().Children(); var args = operands.Select(p => ((Racr.AstNode) p).Value()).ToArray(); var func = opTable[op]; try { return func(args); } catch { return null; } }
static ValueTypes ComputationType(Racr.AstNode n) { var op = n.GetOperator(); var inType = ValueTypes.ErrorType; var outType = ValueTypes.ErrorType; var operands = n.GetOperands().Children(); if (op == "&&" || op == "//" || op == "not") inType = outType = ValueTypes.Boolean; else if (op == "=" || op == "<" || op == ">" || op == "<=" || op == ">=" || op == "!=") { inType = ValueTypes.Number; outType = ValueTypes.Boolean; } else if (op == "string=?" || op == "string<?" || op == "string>?" || op == "string<=?" || op == "string>=?") { inType = ValueTypes.String; outType = ValueTypes.Boolean; } else if (op == "+" || op == "-" || op == "*" || op == "/") inType = outType = ValueTypes.Number; else if (op == "string-append") inType = outType = ValueTypes.String; if (operands.Any(x => ((Racr.AstNode) x).Type() != inType)) return ValueTypes.ErrorType; return outType; }
static object ConstantValue(Racr.AstNode n) { return n.GetValue(); }
static ValueTypes ConstantType(Racr.AstNode n) { var val = n.GetValue(); if (val is bool) return ValueTypes.Boolean; if (val is double) return ValueTypes.Number; if (val is string) return ValueTypes.String; return ValueTypes.ErrorType; }
static object UseValue(Racr.AstNode n) { return n.FindActive(n.GetName()).Value(); }
static Racr.AstNode FormRoot(Racr.AstNode n) { return n; }
static string GroupSExpr(Racr.AstNode n) { return "(If " + n.GetExpression().SExpr() + " " + String.Join(" ", n.GetBody().Children().Select(x => ((Racr.AstNode)x).SExpr())) + ")"; }
static bool FormIsValid(Racr.AstNode n) { return n.GetBody().Children(new Racr.Range(2)).All(x => ((Racr.AstNode)x).IsValid()); }
static string OrdinaryQuestionSExpr(Racr.AstNode n) { return "(?? '" + n.GetName() + " " + Lexer.EscapeString(n.GetLabel()) + " " + n.Type() + " " + Lexer.EscapeValue(n.Value()) + ")"; }
static bool FormIsActive(Racr.AstNode n) { return true; }
static string ComputedQuestionSExpr(Racr.AstNode n) { return "(~? '" + n.GetName() + " " + Lexer.EscapeString(n.GetLabel()) + " " + n.GetExpression().SExpr() + ")"; }
static Racr.AstNode ElementFindActive(Racr.AstNode n, string name) { var current = n.GLookup(name); while (!current.IsActive()) current = current.GLookup(name); return current; }
static string UseSExpr(Racr.AstNode n) { return "(~> '" + n.GetName() + ")"; }
static Racr.AstNode GroupGLookup(Racr.AstNode n, string name) { var ret = findL(name, n.Parent(), n.ChildIndex() - 1); return (ret != null) ? ret : n.Parent().GLookup(name); }
static string ConstantSExpr(Racr.AstNode n) { return "(~! " + Lexer.EscapeValue(n.Value()) + ")"; }
static bool GroupIsValid(Racr.AstNode n) { return n.IsLValid() && n.GetBody().Children().All(x => ((Racr.AstNode)x).IsValid()); }
static string ComputationSExpr(Racr.AstNode n) { return "(~~ " + n.GetOperator() + " " + String.Join(" ", n.GetOperands().Children().Select(x => ((Racr.AstNode)x).SExpr())) + ")"; }
static bool GroupIsActive(Racr.AstNode n) { var v = n.GetExpression().Value(); if (v == null) return false; return (bool) v; }
static public void UpdateQuestions(Racr.AstNode n) { switch (n.NodeType()) { case "Form": case "Group": foreach (var c in n.GetBody().Children()) UpdateQuestions(c as Racr.AstNode); break; case "ComputedQuestion": break; default: (n.Widget() as Widget).Set(n.Value()); break; } }