private int GetPreviousStatus(HaJSElement parent) { MessageBaseElement prev = null; foreach (HaJSElement child in parent.Children) { if (!(child is MessageBaseElement)) { continue; } if (child == this) { return(prev == null ? -1 : prev.statusContext.ElementAt(0)); } else { prev = (MessageBaseElement)child; } } throw new ArgumentException("Internal error - element is not a child of the parent supplied"); }
public int RegisterMessage(MessageBaseElement message) { messages.Add(message); return(messages.Count - 1); }
private void CompileJSRecursive(HaJSElement root, HaJSElement parent) { IndentedStringBuilder sb = GetStringBuilderByContext(root.statusContext); if (root is SwitchElement) { SwitchElement se = (SwitchElement)root; for (int i = 0; i < se.Children.Count; i++) { CaseElement ce = (CaseElement)se.Children[i]; sb.AppendLine(ce.Compile(this, se.Type, i == 0)); sb.Enter(); CompileJSRecursive(ce, root); sb.Leave(); } } else if (root.HasChildren && !root.Parallel) { root.Children.ForEach(x => CompileJSRecursive(x, root)); } else if (root is CommandElement) { CommandElement ce = (CommandElement)root; sb.AppendLine(ce.Compile(this)); } else if (root is MessageBaseElement) { MessageBaseElement mbe = (MessageBaseElement)root; if (mbe.ControlFlowBreaker) { WriteStatusChange(sb, mbe.NextStatus); } sb.AppendLine(mbe.Compile(this)); if (mbe is OkMessageElement) { sb.AppendLine(GetFeature("special_End").Compile(this)); } sb.AppendLine("return;"); string postCompileData = mbe.PostCompile(this, parent); if (root is OptionsMessageElement) { // Special case handled here because OptionMessages are complicated OptionsMessageElement ome = (OptionsMessageElement)root; sb = GetStringBuilderByContext(new HashSet <int>() { ome.NextStatus }); for (int i = 0; i < ome.Children.Count; i++) { OptionElement oe = (OptionElement)ome.Children[i]; sb.AppendLine((i == 0 ? "if" : "else if") + " (selection == " + i.ToString() + ")"); sb.Enter(); CompileJSRecursive(oe, root); sb.Leave(); } } else if (postCompileData != null) { GetStringBuilderByContext(new HashSet <int>() { mbe.NextStatus }).Append(postCompileData); } } }