public override void OnInspectorGUI()
    {
        GUILayout.BeginHorizontal();
        GUILayout.Label("Show Default Inspector");
        GUILayout.FlexibleSpace();
        Color oldColor = GUI.color;
        showDefaultInspector = GUILayout.Toggle(showDefaultInspector, "");
        GUILayout.EndHorizontal();

        if (showDefaultInspector)
            DrawDefaultInspector();

        if (!onSelected) // this must be Pauls name.
        {
            onSelected = true;
            OnSelected();  //?this is called just to get OnSelected called when the first gui call happens ?
        }

        // Save / Load
        GUILayout.BeginHorizontal();
        if (GUILayout.Button("SAVE TO OBJECT"))
        {
            if (menuTree.info != null)
            {
                //myObject.screenInfo = menuTree.info;
                myObject.screenInfo = new ScreenInfo();
                myObject.screenInfo.Screens = new List<GUIScreen>();
                foreach (GUIScreen screen in menuTree.info.Screens)
                {
                    GUIScreen newScreen = new GUIScreen();
                    newScreen.CopyFrom(screen);
                    myObject.screenInfo.Screens.Add(newScreen);
                }
            }
        }
        if (GUILayout.Button("READ FROM OBJECT"))
        {
            menuTree = SIIMenuTreeNode.BuildMenu(myObject.screenInfo);
        }
        GUILayout.EndHorizontal();

        GUI.color = Color.cyan;
        if (menuTree != null)
            menuTree.ShowInspectorGUI(0);
        else
        {
            GUILayout.Button("No Menu exists for XMLName");
        }
        GUI.color = oldColor;
        return;
    }
 public bool CheckIsValid(SIIMenuTreeNode node)
 {
     if (node == null) return false;
     if (node.filePath != null && node.filePath.Contains("ENTER")) return false;
     // here, depending on the node type, see if there is enough info to use this node
     return node.valid;
 }
    public static SIIMenuTreeNode BuildMenu(ScreenInfo screenInfo)
    {
        if (screenInfo == null) return null;

        SIIMenuTreeNode returnNode = new SIIMenuTreeNode();
        returnNode.filePath = "Object";
        returnNode.info = new ScreenInfo();
        returnNode.info.Screens = new List<GUIScreen>();

        returnNode.children = new List<ScreenMenuTreeNode>();

        foreach(GUIScreen screen in screenInfo.Screens)
        {
            GUIScreen newScreen = new GUIScreen();
            newScreen.CopyFrom(screen);
            returnNode.info.Screens.Add(newScreen);

            ScreenMenuTreeNode newNode = ScreenMenuTreeNode.BuildMenu(newScreen);
            newNode.parent = returnNode;
            returnNode.children.Add(newNode);
        }

        return returnNode;
    }
	virtual public void OnSelected() // look at a particular instance object
	{
        myObject = target as ScreenInfoData;
        menuTree = SIIMenuTreeNode.BuildMenu(myObject.XMLFile.name);
	}
    ScreenMenuTreeNode newNode; // used when building up new menus


    public static SIIMenuTreeNode BuildMenu(string fileName) // pass in the relative path
    {
        SIIMenuTreeNode returnNode = new SIIMenuTreeNode();
        returnNode.filePath = fileName;

        Serializer<ScreenInfo> serializer = new Serializer<ScreenInfo>();
        ScreenInfo screenInfo = serializer.Load("GUIScripts/" + fileName); // if this load fails, then we should probably create a default empty file
        // If null, the load failed.
        if (screenInfo == null) return null;

        returnNode.info = new ScreenInfo();
        returnNode.info.Screens = screenInfo.Screens;
        returnNode.info.Initialize();

        returnNode.children = new List<ScreenMenuTreeNode>();

        foreach (GUIScreen screen in returnNode.info.Screens)
        {
            ScreenMenuTreeNode newNode = ScreenMenuTreeNode.BuildMenu(screen);
            newNode.parent = returnNode;
            returnNode.children.Add(newNode);
        }

        return returnNode;
    }