private void whenImport()
    {
        int row = 1, col = 1;
        int length = GetInt(row++, col);

        paramlist.Clear();
        for (int i = 0; i < length; i++)
        {
            FixClassCircle.ParamMore paramData = new FixClassCircle.ParamMore();
            paramData.desc = GetString(row, col++);
            int leng = GetInt(row, col++);
            for (int j = 0; j < leng; j++)
            {
                FixClassCircle.UseParam useParam = new FixClassCircle.UseParam();
                useParam.NameCh   = GetString(row, col++);
                useParam.NameEng  = GetString(row, col++);
                useParam.type     = (FixClassCircle.ParamType)GetInt(row, col++);
                useParam.EnumDesc = GetString(row, col++);
                paramData.Detail.Add(useParam);
            }
            paramlist.Add(paramData);
            row++;
            col = 1;
        }
        length = GetInt(row++, col);
        serializedNodes.Clear();
        for (int i = 0; i < length; i++)
        {
            FixClassCircle.SerializableNode seriNode = new FixClassCircle.SerializableNode();
            seriNode.tagCh      = GetString(row, col++);
            seriNode.tag        = GetString(row, col++);
            seriNode.paramIndex = GetInt(row, col++);
            int leng = GetInt(row, col++);
            for (int j = 0; j < leng; j++)
            {
                seriNode.otherParamValues.Add(GetString(row, col++));
            }
            seriNode.childCount        = GetInt(row, col++);
            seriNode.indexOfFirstChild = GetInt(row, col++);
            serializedNodes.Add(seriNode);
            row++;
            col = 1;
        }
        OnAfterDeserialize();
    }
    //draw data part
    bool Display(FixClassCircleNoGo.Node node)          //return if Display should do next time
    {
        Rect   titleRect = EditorGUILayout.BeginHorizontal();
        string titlename = node.tagCh;

        if (!string.IsNullOrEmpty(node.tagCh))
        {
            titlename += " / ";
        }
        titlename += node.tag;
        if (_target.ShowSize)
        {
            titlename += " / size:" + node.children.Count;
        }

        if (node.forSearch)
        {
            node.foldout = EditorGUILayout.Foldout(node.foldout, titlename, EditorStyles.foldoutPreDrop);
        }
        else
        {
            node.foldout = EditorGUILayout.Foldout(node.foldout, titlename);
        }

        if (node.editMode)
        {
            if (GUILayout.Button(forbutton6_2, EditorStyles.toolbarButton, GUILayout.Width(20)))
            {
                node.editMode = false;
                //重置搜索
                node.searchStr = "";
                foreach (var child in node.children)
                {
                    child.forSearch = false;
                }
                _target.Record2SerializeOnce();
            }
        }
        else
        {
            if (GUILayout.Button(forbutton6, GUILayout.Width(20)))
            {
                node.editMode = true;
            }
        }
        if (Event.current.isMouse && Event.current.button == 1 && titleRect.Contains(Event.current.mousePosition))
        {
            GenericMenu menu = new GenericMenu();
            menu.AddItem(new GUIContent("Copy Node"), false, copyNode, node);
            if (node.father != null)
            {
                menu.AddItem(new GUIContent("Cut Node"), false, cutNode, node);
            }
            menu.AddItem(new GUIContent("Paste Node as a child"), false, pasteNode, node);
            menu.AddItem(new GUIContent("Empty clipboard"), false, emptyClipboard, null);
            menu.ShowAsContext();
            Event.current.Use();
        }

        if (GUILayout.Button(forbutton1, GUILayout.Width(20)))
        {
            node.children.Add(new FixClassCircleNoGo.Node(_target)
            {
                father = node
            });
            _target.Record2SerializeOnce();
            node.foldout = true;
        }

        /*
         *      if (GUILayout.Button(forbutton2, GUILayout.Width(20)))
         *      {
         *              node.children.Clear();
         *              _target.Record2SerializeOnce();
         *      }*/
        if (node.father != null)
        {
            if (GUILayout.Button(forbutton5, GUILayout.Width(22)))
            {
                FixClassCircleNoGo.Node nodetmp = FixClassCircleNoGo.DuplicateNode(node);
                nodetmp.father = node.father;
                int index = node.father.children.IndexOf(node);
                node.father.children.Insert(index, nodetmp);
                _target.Record2SerializeOnce();
                return(true);
            }
            if (GUILayout.Button(forbutton3, GUILayout.Width(20)))
            {
                node.father.children.Remove(node);
                _target.Record2SerializeOnce();
                return(true);
            }
        }
        EditorGUILayout.EndHorizontal();
        if (!node.foldout)
        {
            EditorGUIUtility.labelWidth -= indentation;
        }
        if (node.editMode)
        {
            GUILayout.BeginHorizontal();
            GUI.color = color_Edit;
            GUILayout.Space(indentation);

            node.tagCh = EditorGUILayout.TextField(node.tagCh, GUILayout.Width(90));
            node.tag   = EditorGUILayout.TextField(node.tag, GUILayout.Width(95));
            if (GUILayout.Button(forbutton4, EditorStyles.radioButton, GUILayout.Width(20)))
            {
                FixClassCircle.ParamMore temp = _target.paramlist[node.paramIndex];
                if (temp.Detail.Count > 0 && temp.Detail[0].type == FixClassCircle.ParamType.IntEnum)
                {
                    string[] ss    = temp.Detail[0].EnumDesc.Split(',');
                    int      index = 0;
                    int.TryParse(node.otherParamValues[0], out index);
                    node.tag = ss[index];
                    _target.Record2SerializeOnce();
                }
            }
            //EditorGUILayout.LabelField("Struct", GUILayout.Width(40));
            node.paramIndex = EditorGUILayout.Popup(node.paramIndex, getParamlistEnumStrArr(), GUILayout.Width(70));
            if (node.paramIndex < 0)
            {
                node.paramIndex = 0;
            }
            node.searchStr = EditorGUILayout.TextField(node.searchStr, GUILayout.Width(70));
            if (GUILayout.Button(forbutton7, GUILayout.Width(20)))
            {
                foreach (var child in node.children)
                {
                    if (node.searchStr.Length > 0 && (child.tag.Contains(node.searchStr) || child.tagCh.Contains(node.searchStr)))
                    {
                        child.forSearch = true;
                    }
                    else
                    {
                        child.forSearch = false;
                        child.foldout   = false;
                    }
                }
            }
            GUI.color = color_normal;
            GUILayout.EndHorizontal();
        }
        if (!node.foldout)
        {
            return(false);
        }
        if (_target.paramlist.Count - 1 < node.paramIndex)
        {
            EditorGUIUtility.labelWidth -= indentation;
            return(false);           //wait until list count is enough
        }
        for (int i = 0; i < _target.paramlist[node.paramIndex].Detail.Count && i < node.otherParamValues.Count; i++)
        {
            FixClassCircle.ParamType tempT = _target.paramlist[node.paramIndex].Detail[i].type;
            if (hidebelowparam && tempT != FixClassCircle.ParamType.BoolHideBelow && tempT != FixClassCircle.ParamType.BoolShowBelow)
            {
                continue;
            }
            GUILayout.BeginHorizontal();
            GUILayout.Space(indentation + 13);
            drawParams(node, i);
            GUILayout.EndHorizontal();
        }
        hidebelowparam = false;

        //---------------------------------------------------
        GUILayout.BeginHorizontal();
        GUILayout.Space(indentation);
        EditorGUIUtility.labelWidth -= indentation;
        GUILayout.BeginVertical();

        foreach (var child in node.children)
        {
            if (Display(child) || forceQuitDraw)
            {
                forceQuitDraw = false;
                GUILayout.EndVertical();
                GUILayout.EndHorizontal();
                return(true);
            }
            EditorGUIUtility.labelWidth += indentation;             // not plus not reduce
        }

        GUILayout.EndVertical();
        GUILayout.EndHorizontal();
        return(false);
    }
    void DrawParamList()
    {
        if (_target == null)
        {
            return;
        }
        EditorGUILayout.BeginHorizontal();
        ParamListFoldOut = EditorGUILayout.Foldout(ParamListFoldOut, "Struct List" + (_target.ShowSize ? (" / size:" + _target.paramlist.Count) : ""));
        if (ParamListEditMode)
        {
            if (GUILayout.Button(forbutton6_2, EditorStyles.toolbarButton, GUILayout.Width(20)))
            {
                ParamListEditMode = false;
            }
        }
        else
        {
            if (GUILayout.Button(forbutton6, GUILayout.Width(20)))
            {
                ParamListEditMode = true;
            }
        }
        if (GUILayout.Button(forbutton1, GUILayout.Width(20)))
        {
            _target.paramlist.Add(new FixClassCircle.ParamMore());
            ParamListFoldOut = true;
        }
        EditorGUILayout.EndHorizontal();
        if (ParamListEditMode)
        {
            EditorGUILayout.BeginHorizontal();
            GUI.color = color_Edit;
            GUILayout.Space(indentation);
            ParamListSize = EditorGUILayout.IntField("size:", ParamListSize);
            if (GUILayout.Button("SetSize"))
            {
                if (ParamListSize < 1)
                {
                    ParamListSize = 1;
                }
                if (ParamListSize < _target.paramlist.Count)
                {
                    _target.paramlist.RemoveRange(ParamListSize, _target.paramlist.Count - ParamListSize);
                }
                else if (ParamListSize > _target.paramlist.Count)
                {
                    for (int tempi = _target.paramlist.Count; tempi < ParamListSize; tempi++)
                    {
                        _target.paramlist.Add(new FixClassCircle.ParamMore());
                    }
                }
            }
            GUI.color = color_normal;
            EditorGUILayout.EndHorizontal();
        }
        if (!ParamListFoldOut)
        {
            return;
        }
        for (int i = 0; i < _target.paramlist.Count; i++)
        {
            FixClassCircle.ParamMore paramnode = _target.paramlist[i];
            EditorGUILayout.BeginHorizontal();
            GUILayout.Space(indentation);
            EditorGUILayout.BeginVertical();
            EditorGUILayout.BeginHorizontal();
            fixFoldoutPos(paramnode.foldout);

            paramnode.foldout = EditorGUILayout.Foldout(paramnode.foldout, i + "-" + paramnode.desc + (_target.ShowSize ? (" / size:" + paramnode.Detail.Count) : ""));
            if (paramnode.EditMode)
            {
                if (GUILayout.Button(forbutton6_2, EditorStyles.toolbarButton, GUILayout.Width(20)))
                {
                    paramnode.EditMode = false;
                }
            }
            else
            {
                if (GUILayout.Button(forbutton6, GUILayout.Width(20)))
                {
                    paramnode.EditMode = true;
                }
            }

            if (GUILayout.Button(forbutton1, GUILayout.Width(20)))
            {
                string defaultName = "Member_" + (paramnode.Detail.Count + 1);
                paramnode.Detail.Add(new FixClassCircle.UseParam()
                {
                    NameCh = defaultName, NameEng = defaultName
                });
                paramnode.foldout = true;
            }
            if (GUILayout.Button(forbutton3, GUILayout.Width(20)))
            {
                _target.paramlist.Remove(paramnode);
                EditorGUILayout.EndHorizontal();
                EditorGUILayout.EndVertical();
                EditorGUILayout.EndHorizontal();
                return;
            }
            EditorGUILayout.EndHorizontal();
            if (paramnode.EditMode)
            {
                EditorGUILayout.BeginHorizontal();
                GUI.color = color_Edit;
                GUILayout.Space(indentation);
                paramnode.desc = EditorGUILayout.TextField("Desc", paramnode.desc);
                GUI.color      = color_normal;
                EditorGUILayout.EndHorizontal();
            }
            if (paramnode.foldout)
            {
                for (int j = 0; j < paramnode.Detail.Count; j++)
                {
                    FixClassCircle.UseParam useParam = paramnode.Detail[j];
                    EditorGUILayout.BeginHorizontal();
                    GUILayout.Space(indentation);
                    EditorGUILayout.BeginVertical();
                    EditorGUILayout.BeginHorizontal();
                    fixFoldoutPos(useParam.foldout);
                    useParam.foldout = EditorGUILayout.Foldout(useParam.foldout, useParam.NameCh);
                    if (GUILayout.Button(forbutton5, GUILayout.Width(22)))
                    {
                        FixClassCircle.UseParam newUse = new FixClassCircle.UseParam();
                        newUse.NameCh   = useParam.NameCh;
                        newUse.NameEng  = useParam.NameEng;
                        newUse.type     = useParam.type;
                        newUse.EnumDesc = useParam.EnumDesc;
                        paramnode.Detail.Insert(j, newUse);
                        resync(i, j, 0);
                        EditorGUILayout.EndHorizontal();
                        EditorGUILayout.EndVertical();
                        EditorGUILayout.EndHorizontal();
                        break;
                    }
                    if (GUILayout.Button(forbutton3, GUILayout.Width(20)))
                    {
                        paramnode.Detail.Remove(useParam);
                        resync(i, j, 1);
                        EditorGUILayout.EndHorizontal();
                        EditorGUILayout.EndVertical();
                        EditorGUILayout.EndHorizontal();
                        break;
                    }
                    EditorGUILayout.EndHorizontal();
                    if (useParam.foldout)
                    {
                        EditorGUILayout.BeginHorizontal();
                        GUILayout.Space(indentation + 13);
                        EditorGUILayout.BeginVertical();

                        useParam.NameCh  = EditorGUILayout.TextField("Name Ch", useParam.NameCh);
                        useParam.NameEng = EditorGUILayout.TextField("Name Eng", useParam.NameEng);
                        useParam.type    = (FixClassCircle.ParamType)EditorGUILayout.EnumPopup("Type", useParam.type);
                        if (useParam.type == FixClassCircle.ParamType.IntEnum || useParam.type == FixClassCircle.ParamType.IntEnumMap)
                        {
                            useParam.EnumDesc = EditorGUILayout.TextField("Enum Desc", useParam.EnumDesc);
                        }
                        else if (!string.IsNullOrEmpty(useParam.EnumDesc))
                        {
                            useParam.EnumDesc = "";
                        }

                        EditorGUILayout.EndVertical();
                        EditorGUILayout.EndHorizontal();
                    }
                    EditorGUILayout.EndVertical();
                    EditorGUILayout.EndHorizontal();
                }
            }
            EditorGUILayout.EndVertical();
            EditorGUILayout.EndHorizontal();
        }
    }