/// <summary>
    /// 
    /// </summary>
    /// <param name="pSelected"></param>
    /// <returns>是否点击</returns>
    public bool drawGUI(ref zzGUILibTreeElement pSelected)
    {
        //if (treeNode.changed)
        //    setTreeNode(treeNode);
        bool lOut = false;
        GUILayout.BeginVertical();
        {
            GUILayout.BeginHorizontal();
            {
                foreach (var lTitleInfo in titleList)
                {
                    GUILayout.Label(lTitleInfo.showName, titleStyle,
                        GUILayout.Width(lTitleInfo.width));
                }
            }
            GUILayout.EndHorizontal();
            foreach (var lElement in treeNode.elements)
            {
                var lStyle = getStyle(pSelected, lElement);
                var lShowData = lElement.stringInfo;
                bool lIsClick = false;
                GUILayout.BeginHorizontal();
                {
                    if (lShowData == null)
                    {
                        foreach (var lTitleInfo in titleList)
                            lIsClick |= GUILayout.Button("", lStyle, GUILayout.Width(lTitleInfo.width));
                    }
                    else
                    {
                        foreach (var lTitleInfo in titleList)
                        {
                            string lData;
                            if (!lShowData.TryGetValue(lTitleInfo.name, out lData))
                                lData = "";
                            lIsClick |= GUILayout.Button(lData, lStyle, GUILayout.Width(lTitleInfo.width));
                        }
                    }
                }
                if (lIsClick)
                {
                    pSelected = lElement;
                    lOut = true;
                }
                GUILayout.EndHorizontal();
            }

        }
        GUILayout.EndVertical();

        return lOut;
    }
 zzGUILibTreeElement[] getLevelInFolder(string pLevelRootFolder)
 {
     DirectoryInfo lDirectory = new DirectoryInfo(pLevelRootFolder);
     var lLevelDirectorise =  lDirectory.GetDirectories();
     var lLevelElement = new List<zzGUILibTreeElement>(lLevelDirectorise.Length);
     foreach (var lLevelDir in lLevelDirectorise)
     {
         var lMainFileName = lLevelDir.FullName + "/" + mainFileName;
         if (File.Exists(lMainFileName))
         {
             var lGUIElement = new zzGUILibTreeElement();
             lGUIElement.name = lLevelDir.Name;
             lGUIElement.image = defaultLevelImage;
             lGUIElement.stringData = lLevelDir.Name;
             //lGUIElement.objectData = lInfoElement.data;
             lLevelElement.Add( lGUIElement );
         }
     }
     return lLevelElement.ToArray();
 }
    public void drawTree()
    {
        if (Application.isPlaying)
        {
            viewScroll = GUILayout.BeginScrollView(viewScroll);
            var lNewSelected = selectedElement;
            rootTreeView.imageSize = imageSize;

            if (rootTreeView.drawGUI(ref lNewSelected))
            {
                selectedElement = lNewSelected;
                if (lNewSelected is zzGUILibTreeNode)
                    nodeClickedEvent(selectedElement.stringData);
                else// (lNewSelected is zzGUILibTreeElement)
                {
                    elementClickedEvent(selectedElement.stringData);
                    elementClickedObjectEvent(selectedElement.objectData);
                }
            }
            GUILayout.EndScrollView();
        }
    }
    public static zzGUILibTreeNode getGUITreeNode(this GameSystem.InfoNode pInfoNode,
        Texture2D pDefaultCollapsedNodeImg, Texture2D pDefaultExpandedNodeImg)
    {
        var elements = pInfoNode.elements;
        var image = pInfoNode.image;
        var nodes = pInfoNode.nodes;
        var showName = pInfoNode.showName;
        zzGUILibTreeNode lOut = new zzGUILibTreeNode();
        lOut.name = showName;
        lOut.image = image ? image : pDefaultCollapsedNodeImg;
        lOut.expandedImage = pInfoNode.expandedImage ? pInfoNode.expandedImage : pDefaultExpandedNodeImg;

        var lGUIElements = new List<zzGUILibTreeElement>(elements.Length);
        for (int i = 0; i < elements.Length; ++i)
        {
            var lInfoElement = elements[i];
            if (!lInfoElement.isShow)
                continue;
            var lGUIElement = new zzGUILibTreeElement();
            lGUIElement.name = lInfoElement.showName;
            lGUIElement.image = lInfoElement.image;
            lGUIElement.stringData = lInfoElement.name;
            lGUIElement.objectData = lInfoElement.data;
            //lGUIElements[i] = lGUIElement;
            lGUIElements.Add(lGUIElement);
        }
        lOut.elements = lGUIElements.ToArray();

        var lGUINode = new zzGUILibTreeNode[nodes.Length];
        for (int i = 0; i < nodes.Length; ++i)
        {
            lGUINode[i] = nodes[i].getGUITreeNode(pDefaultCollapsedNodeImg, pDefaultExpandedNodeImg);
        }
        lOut.nodes = lGUINode;

        return lOut;
    }
 public void updateHostList()
 {
     var lServerList = serverList.serverList;
     var lElements = new zzGUILibTreeElement[lServerList.Count];
     int i = 0;
     Dictionary<string, zzGUILibTreeElement> lIdToElement
         = new Dictionary<string, zzGUILibTreeElement>();
     foreach (var lElement in treeInfo.treeInfo.elements)
     {
         //var lInfo = lElement.stringInfo;
         lIdToElement[lElement.stringData] = lElement;
     }
     foreach (var lServerDic in lServerList)
     {
         var lServer = lServerDic.Value;
         Hashtable lTableData = (Hashtable)zzSerializeString.Singleton
             .unpackToData(lServer.comment);
         zzGUILibTreeElement lElement;
         if (lIdToElement.TryGetValue(lServerDic.Key, out lElement))
         {
             lIdToElement.Remove(lServerDic.Key);
         }
         else
         {
             lElement = new zzGUILibTreeElement();
             lElement.stringData = lServerDic.Key;
         }
         //string lHostPlayName = (string)lTableData["playerName"];
         //string lHostMap = (string)lTableData["map"];
         var lStringInfo =new Dictionary<string, string>();
         lStringInfo["mapName"] = (string)lTableData["map"];
         lStringInfo["playerName"] = (string)lTableData["playerName"];
         lStringInfo["IP"] = lServer.IP;
         lElement.stringInfo = lStringInfo;
         lElements[i] = lElement;
         ++i;
     }
     zzGUILibTreeNode lNode = new zzGUILibTreeNode();
     lNode.elements = lElements;
     treeInfo.treeInfo.setData(lNode);
 }
 bool drawSubElement(ref zzGUILibTreeElement pSelected)
 {
     return false;
 }
    /// <summary>
    /// 
    /// </summary>
    /// <param name="pSelected"></param>
    /// <returns>是否点击</returns>
    bool drawSubElement(ref zzGUILibTreeElement pSelected)
    {
        zzGUILibTreeElement lNewSelected = null;
        foreach (var lElement in treeNode.elements)
        {
            GUILayout.BeginHorizontal();
            GUILayout.Space(imageSize * (TreeDepth + 1));
            if (GUILayout.Button(lElement.content,
                    getStyle(pSelected, lElement),
                    GUILayout.Height(imageSize))
                )
                lNewSelected = lElement;
            GUILayout.EndHorizontal();
        }

        if (lNewSelected != null)
        {
            pSelected = lNewSelected;
            return true;
        }
        return false;
    }
    /// <summary>
    /// 
    /// </summary>
    /// <param name="pSelected"></param>
    /// <returns>是否点击</returns>
    bool drawSelfNode(ref zzGUILibTreeElement pSelected)
    {
        GUILayout.BeginHorizontal();
        GUILayout.Space(imageSize * TreeDepth);
        bool lNewExpanded = GUILayout.Toggle(
            expanded,
            expanded ? treeNode.expandedNodeContent : treeNode.collapsedNodeContent,
            getStyle(pSelected, treeNode),
            GUILayout.Height(imageSize));
        GUILayout.EndHorizontal();

        if (expanded != lNewExpanded)
        {
            pSelected = treeNode;
            expanded = lNewExpanded;
            return true;
        }
        return false;
    }
    /// <summary>
    /// 
    /// </summary>
    /// <param name="pSelected"></param>
    /// <returns>是否点击</returns>
    public bool drawGUI(ref zzGUILibTreeElement pSelected)
    {
        if (treeNode.changed)
            setTreeNode(treeNode);

        //zzGUILibTreeElement lNewSelected = null;

        //print("TreeDepth:" + TreeDepth);
        //print(directoryInfo.Name+Folders.Count);
        bool lIsClick = false;
        GUILayout.BeginVertical();
        {
            foreach (var lView in subViews)
            {
                //执行drawSelfNode时会改变expanded,所以先将其保存
                bool lPreExpanded = lView.expanded;
                lView.imageSize = imageSize;
                lIsClick |= lView.drawSelfNode(ref pSelected);
                if (lPreExpanded)
                    lIsClick|=lView.drawGUI(ref pSelected);
            }
            lIsClick |= drawSubElement(ref pSelected);
        }
        GUILayout.EndVertical();
        return lIsClick;
    }