Esempio n. 1
0
	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;
	}
Esempio n. 2
0
	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;
	}
Esempio n. 3
0
	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;
	}
Esempio n. 4
0
	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;
	}
Esempio n. 5
0
	static bool GroupIsLValid(Racr.AstNode n) { return n.GetExpression().Type() == ValueTypes.Boolean; }
Esempio n. 6
0
	static Racr.AstNode GroupLLookup(Racr.AstNode n, string name) {
		return findL(name, n.GetBody(), n.GetBody().NumChildren());
	}
Esempio n. 7
0
	static bool ElementIsShown(Racr.AstNode n) { return !n.IsErrorQuestion() && n.IsActive(); }
Esempio n. 8
0
	static bool ElementIsErrorQuestion(Racr.AstNode n) { return n == n.ErrorQuestion(); }
Esempio n. 9
0
	static Racr.AstNode FromGLookup(Racr.AstNode n, string name) {
		var ret = findL(name, n.Parent(), n.ChildIndex() - 1);
		return (ret != null) ? ret : n.ErrorQuestion();
	}
Esempio n. 10
0
	static Racr.AstNode FormErrorQuestion(Racr.AstNode n) { return n.GetBody().Child(1); }
Esempio n. 11
0
	static string FormSExpr(Racr.AstNode n) {
		return "(Form " + String.Join(" ", n.GetBody().Children().Skip(1).Select(x => ((Racr.AstNode)x).SExpr())) + ")";
	}
Esempio n. 12
0
	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; }
	}
Esempio n. 13
0
	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;
	}
Esempio n. 14
0
	static object ConstantValue(Racr.AstNode n) { return n.GetValue(); }
Esempio n. 15
0
	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;
	}
Esempio n. 16
0
	static object UseValue(Racr.AstNode n) { return n.FindActive(n.GetName()).Value(); }
Esempio n. 17
0
	static Racr.AstNode FormRoot(Racr.AstNode n) { return n; }
Esempio n. 18
0
	static string GroupSExpr(Racr.AstNode n) {
		return "(If " + n.GetExpression().SExpr() + " " + String.Join(" ", n.GetBody().Children().Select(x => ((Racr.AstNode)x).SExpr())) + ")";
	}
Esempio n. 19
0
	static bool FormIsValid(Racr.AstNode n) {
		return n.GetBody().Children(new Racr.Range(2)).All(x => ((Racr.AstNode)x).IsValid());
	}
Esempio n. 20
0
	static string OrdinaryQuestionSExpr(Racr.AstNode n) {
		return "(?? '" + n.GetName() + " " + Lexer.EscapeString(n.GetLabel()) + " " + n.Type() + " " + Lexer.EscapeValue(n.Value()) + ")";
	}
Esempio n. 21
0
	static bool FormIsActive(Racr.AstNode n) { return true; }
Esempio n. 22
0
	static string ComputedQuestionSExpr(Racr.AstNode n) {
		return "(~? '" + n.GetName() + " " + Lexer.EscapeString(n.GetLabel()) + " " + n.GetExpression().SExpr() + ")";
	}
Esempio n. 23
0
	static Racr.AstNode ElementFindActive(Racr.AstNode n, string name) {
		var current = n.GLookup(name);
		while (!current.IsActive()) current = current.GLookup(name);
		return current;
	}
Esempio n. 24
0
	static string UseSExpr(Racr.AstNode n) {
		return "(~> '" + n.GetName() + ")";
	}
Esempio n. 25
0
	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);
	}
Esempio n. 26
0
	static string ConstantSExpr(Racr.AstNode n) {
		return "(~! " + Lexer.EscapeValue(n.Value()) + ")";
	}
Esempio n. 27
0
	static bool GroupIsValid(Racr.AstNode n) {
		return n.IsLValid() && n.GetBody().Children().All(x => ((Racr.AstNode)x).IsValid());
	}
Esempio n. 28
0
	static string ComputationSExpr(Racr.AstNode n) {
		return "(~~ " + n.GetOperator() + " " + String.Join(" ", n.GetOperands().Children().Select(x => ((Racr.AstNode)x).SExpr())) + ")";
	}
Esempio n. 29
0
	static bool GroupIsActive(Racr.AstNode n) {
		var v = n.GetExpression().Value();
		if (v == null) return false;
		return (bool) v;
	}
Esempio n. 30
0
	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;
		}
	}