Пример #1
0
        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");
        }
Пример #2
0
 public int RegisterMessage(MessageBaseElement message)
 {
     messages.Add(message);
     return(messages.Count - 1);
 }
Пример #3
0
        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);
                }
            }
        }