ElementMenuTreeNode newNode; // used when building up new menus

    // Called only for GUIContainer type classes
    public static ElementMenuTreeNode BuildMenu(ScreenMenuTreeNode screenParent, GUIContainer info)
    {
        ElementMenuTreeNode returnNode = new ElementMenuTreeNode();
        returnNode.info = info;
        returnNode.children = new List<ElementMenuTreeNode>();

        GUIContainer container = returnNode.info as GUIContainer;
        foreach (GUIObject obj in container.Elements)
        {
            // Containers nest, so deal with it slightly different.
            if (obj.GetType() == typeof(GUIContainer) || obj.GetType().BaseType == typeof(GUIContainer))
            {
                ElementMenuTreeNode newNode = ElementMenuTreeNode.BuildMenu(screenParent, obj as GUIContainer);
                if (newNode != null)
                {
                    newNode.screenParent = screenParent;
                    newNode.containerParent = returnNode;
                    returnNode.children.Add(newNode);
                }
            }
            else
            {
                ElementMenuTreeNode newNode = new ElementMenuTreeNode();
                newNode.screenParent = screenParent;
                newNode.containerParent = returnNode;
                returnNode.children.Add(newNode);
            }
        }

        return returnNode;
    }
 public bool CheckIsValid(ScreenMenuTreeNode node)
 {
     return true;
 }
    ElementMenuTreeNode newNode; // used when building up new menus

    public static ScreenMenuTreeNode BuildMenu(GUIScreen info) // pass in the relative path
    {
        ScreenMenuTreeNode returnNode = new ScreenMenuTreeNode();
        returnNode.info = info;
        returnNode.children = new List<ElementMenuTreeNode>();

        foreach (GUIObject obj in returnNode.info.Elements)
        {
            // Containers nest, so deal with it slightly different.
            if (obj.GetType() == typeof(GUIContainer) || obj.GetType().BaseType == typeof(GUIContainer))
            {
                ElementMenuTreeNode newNode = ElementMenuTreeNode.BuildMenu(returnNode, obj as GUIContainer);
                if (newNode != null)
                {
                    newNode.screenParent = returnNode;
                    returnNode.children.Add(newNode);
                }
            }
            else
            {
                ElementMenuTreeNode newNode = new ElementMenuTreeNode();
                newNode.screenParent = returnNode;
                returnNode.children.Add(newNode);
            }
        }

        return returnNode;
    }
    public void ShowAddNodeGUI()
    {
        EditorGUILayout.Space();
        GUILayout.BeginHorizontal();
        GUILayout.Label("Add GUIScene Below to SceneInfo");
        if (GUILayout.Button("CANCEL"))
        {
            newNode = null;
            return;
        }

        if (newNode.CheckIsValid(newNode))
        {
            if (GUILayout.Button("SAVE"))
            {
                newNode.expanded = false;
                newNode.parent = this;
                children.Add(newNode);
                info.Screens.Add(newNode.info);
                newNode = null;
            }
        }
        GUILayout.EndHorizontal();
        EditorGUILayout.Space();
        if (newNode != null)
            newNode.ShowInspectorGUI(-1);
    }
	// this method recursively displays the menu tree for the Editor inspector, and can call methods to add and save
    public override void ShowInspectorGUI(int level)
    {
        base.ShowInspectorGUI(level);

        GUILayout.BeginHorizontal();
        GUILayout.Label(indent + "ScreenInfo");
        bool clicked = GUILayout.Button(xp + "Screen Info", GUILayout.ExpandWidth(false));
        GUILayout.EndHorizontal();
        if (clicked) expanded = !expanded;
        if (expanded)
        {
            Color topColor = GUI.color;
            Color nextColor = topColor;
            nextColor.r = 0.75f;
            nextColor.g = 0.9f;
            GUI.color = nextColor;

            // Display source
            //GUILayout.BeginHorizontal();
            //GUILayout.Label("Loaded From:");
            //filePath = GUILayout.TextField(filePath);
            //GUILayout.EndHorizontal();

            GUILayout.Label("Screens:");
            // Display children
            foreach (ScreenMenuTreeNode n in children)
                n.ShowInspectorGUI(level + 1);

            GUILayout.BeginHorizontal();
            GUILayout.Label("Menus:");
            if (newNode == null)
            {
                if (GUILayout.Button("Add Screen", GUILayout.ExpandWidth(false)))
                {
                    // Add a screen
                    newNode = new ScreenMenuTreeNode();
                    newNode.expanded = true;
                    newNode.info = new GUIScreen();
                    newNode.info.name = "ENTER Screen Name";
                    newNode.children = new List<ElementMenuTreeNode>();
                }
            }
            //if (newNode == null && CheckIsValid(this))
            //{
            //    if(GUILayout.Button("Save Changes!", GUILayout.ExpandWidth(false)))
            //    {
            //        // Save changes into myObject
            //        Save();
            //    }
            //}
            GUILayout.EndHorizontal();
            if(newNode != null)
                ShowAddNodeGUI();
            GUI.color = topColor;
        }
    }
 public void RemoveChild(ScreenMenuTreeNode child)
 {
     info.RemoveScreen(child.info);
     children.Remove(child);
 }