Exemplo n.º 1
0
        internal static Component Step_Once(Component currentObj, Visual_Flow_Form form)
        {
            Component next;

            if (currentObj.need_to_decrease_scope)
            {
                Runtime.Decrease_Scope();
                currentObj.need_to_decrease_scope = false;
                if (parse_tree_pkg.did_function_call)
                {
                    if (Runtime.method_return_value != null)
                    {
                        currentObj.values.Add(Runtime.method_return_value);
                    }
                    Runtime.method_return_value = null;
                }
            }
            while (currentObj.number_method_expressions_run <
                   currentObj.method_expressions.Count)
            {
                CallStack.Push(currentObj, (Subchart)form.running_tab);
                Step_Helpers.Set_State_Entering();
                bool b = interpreter_pkg.run_expon(
                    currentObj.method_expressions[currentObj.number_method_expressions_run]
                    as parse_tree.expon,
                    currentObj.Text,
                    currentObj);
                currentObj.number_method_expressions_run++;
                if (b)
                {
                    currentObj.need_to_decrease_scope = true;
                    form.Possible_Tab_Update(form.running_tab);
                    form.currentObj         = ((Subchart)form.running_tab).Start;
                    form.currentObj.running = true;
                    return(form.currentObj);
                }
                else
                {
                    CallStack.Pop();
                }
            }
            if (currentObj.Name == "Oval")
            {
                if (currentObj.Successor != null)
                {
                    next = currentObj.Successor.First_Of();
                    next.reset_this_method_expressions_run();
                    return(next);
                }
                else
                {
                    return(null);
                }
            }
            else if (currentObj.Name == "Return")
            {
                numbers.value v = interpreter_pkg.run_return_value(currentObj.parse_tree,
                                                                   currentObj.Text);
                Runtime.method_return_value = v;
                return(null);
            }
            else if (currentObj.Name == "Rectangle")
            {
                // when running belownormal, upgrade priority to close graphics window
                if (currentObj.Text.ToLower() == "close_graph_window")
                {
                    System.Threading.ThreadPriority p = System.Threading.Thread.CurrentThread.Priority;
                    System.Threading.Thread.CurrentThread.Priority = System.Threading.ThreadPriority.AboveNormal;
                    interpreter_pkg.run_assignment(currentObj.parse_tree,
                                                   currentObj.Text);
                    System.Threading.Thread.CurrentThread.Priority = p;
                }
                else
                {
                    interpreter_pkg.run_assignment(currentObj.parse_tree,
                                                   currentObj.Text);
                }
                next = Find_Successor(currentObj);
                next.reset_this_method_expressions_run();
                return(next);
            }
            else if (currentObj.Name == "IF_Control")
            {
                bool choice = interpreter_pkg.run_boolean(
                    currentObj.parse_tree,
                    currentObj.Text);
                if (choice == true)
                {
                    // go to left child if possible, otherwise
                    // go to the successor of the if
                    if (((IF_Control)currentObj).yes_child != null)
                    {
                        next = ((IF_Control)currentObj).
                               yes_child.First_Of();
                        next.reset_this_method_expressions_run();
                        return(next);
                    }
                    else
                    {
                        next = Find_Successor(currentObj);
                        next.reset_this_method_expressions_run();
                        return(next);
                    }
                }
                else
                {
                    if (((IF_Control)currentObj).no_child != null)
                    {
                        next = ((IF_Control)currentObj).
                               no_child.First_Of();
                        next.reset_this_method_expressions_run();
                        return(next);
                    }
                    else
                    {
                        next = Find_Successor(currentObj);
                        next.reset_this_method_expressions_run();
                        return(next);
                    }
                }
            }
            else if (currentObj.Name == "Parallelogram")
            {
                if (((Parallelogram)currentObj).is_input)
                {
                    interpreter_pkg.run_input(currentObj.parse_tree,
                                              currentObj.Text,
                                              ((Parallelogram)currentObj).prompt,
                                              ((Parallelogram)currentObj).input_is_expression,
                                              ((Parallelogram)currentObj).prompt_tree);
                }
                else
                {
                    interpreter_pkg.run_output(currentObj.parse_tree,
                                               currentObj.Text);
                }
                next = Find_Successor(currentObj);
                next.reset_this_method_expressions_run();
                return(next);
            }
            else if ((currentObj.Name == "Loop") &&
                     (((Loop)currentObj).light_head))
            {
                ((Loop)currentObj).light_head = false;
                if (((Loop)currentObj).before_Child != null)
                {
                    next = ((Loop)currentObj).before_Child.First_Of();
                    next.reset_this_method_expressions_run();
                    return(next);
                }
                else
                {
                    return(currentObj);
                }
            }
            else if (currentObj.Name == "Loop")
            {
                bool choice = interpreter_pkg.run_boolean(
                    currentObj.parse_tree,
                    currentObj.Text);
                // keep going on yes if loop logic reversed, no if not
                if ((!choice && !Component.reverse_loop_logic) ||
                    (choice && Component.reverse_loop_logic))
                {
                    // on false, go to first of after_child if
                    // we can, otherwise back to the top of the loop!
                    if (((Loop)currentObj).after_Child != null)
                    {
                        next = ((Loop)currentObj).after_Child.First_Of();
                        next.reset_this_method_expressions_run();
                        return(next);
                    }
                    else
                    {
                        next = currentObj.First_Of();
                        next.reset_this_method_expressions_run();
                        return(next);
                    }
                }
                else
                {
                    // on true, go to successor of loop
                    next = Find_Successor(currentObj);
                    next.reset_this_method_expressions_run();
                    return(next);
                }
            }
            else
            {
                throw new System.Exception("unrecognized object: " +
                                           currentObj.Name);
            }
        }