/// <summary>
        /// 에디터 갱신
        /// </summary>
        private void RefreshEditor()
        {
            string _filePath = new System.Diagnostics.StackTrace(true).GetFrame(0).GetFileName();

            excelLoaderPath = _filePath.Remove(0, _filePath.IndexOf("Assets")).Replace("\\", "/").Replace("ExcelLoader_Editor.cs", "");

            scriptGenerator = new ScriptGenerator();

            multiListViewState             = new TreeViewState();
            multiListView                  = new ExcelFileTreeView(multiListViewState, settingData, ref listSearchedFiles, null);
            multiListViewState.selectedIDs = listMultiSelects;

            singleListViewState = new TreeViewState();
            singleListView      = new ExcelFileTreeView(singleListViewState, settingData, ref listSearchedFiles, OnClickSingleSelectExcelList);
            singleListView.SetSelection(new List <int>()
            {
                excelSelectID
            });

            sheetListViewState = new TreeViewState();
            sheetListView      = new ExcelSheetTreeView(sheetListViewState, settingData, ref listExcelSheets, OnClickSheetList);

            searchField = new SearchField();
            if (currentLoadType == eExcelLoaderType.SingleSelect)
            {
                sheetListView.SetSelection(new List <int>()
                {
                    sheetSelectID
                });
                OnClickSingleSelectExcelList(excelSelectID, lastSelectExcelName);
                OnClickSheetList(sheetSelectID, lastSelectSheetName);
            }
        }
        private void OnGUI()
        {
            isCompiling    = EditorApplication.isCompiling;
            GUI.enabled    = !isCompiling;
            scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition);
            EditorGUILayout.BeginVertical();

            DrawSelectFolder("엑셀 테이블 경로", ref settingData.excelPath);
            DrawSelectFolder("테이블 클래스 경로", ref settingData.classPath);
            DrawSelectFolder("데이터 저장 경로", ref settingData.dataPath);
            DrawSelectFolder("CSV 저장 경로", ref settingData.csvPath);

            EditorGUILayout.BeginHorizontal();
            if (GUILayout.Button("엑셀 파일 검색", GUILayout.Width(120)))
            {
                listSearchedFiles.Clear();
                string[] _arrData = Directory.GetFiles(settingData.GetExcelFullPath());
                for (int _index = 0; _index < _arrData.Length; _index++)
                {
                    string _extention = GetExtensionString(_arrData[_index]);
                    if (_extention == "xls" || _extention == "xlsx")
                    {
                        listSearchedFiles.Add(_arrData[_index]);
                    }
                }
                multiListView.Reload();
                singleListView.Reload();
            }
            if (GUILayout.Button("네임스페이스 편집", GUILayout.Width(120)))
            {
                if (File.Exists(excelLoaderPath + "Setting/ExcelLoaderNamespace.txt") == false)
                {
                    FileStream _stream = File.Create(excelLoaderPath + "Setting/ExcelLoaderNamespace.txt");
                    _stream.Close();
                    AssetDatabase.Refresh();
                }
                Process.Start(Application.dataPath.Replace("Assets", excelLoaderPath) + "Setting/ExcelLoaderNamespace.txt");
            }
            EditorGUILayout.EndHorizontal();
            eExcelLoaderType _prevLoadType = currentLoadType;

            currentLoadType = (eExcelLoaderType)GUILayout.Toolbar((int)currentLoadType, new string[2] {
                "다중 선택", "단일 선택"
            });
            EditorGUILayout.EndVertical();
            //현재 로드 타입이 이전에 타입과 다르면 선택된 내용을 지워준다.
            if (_prevLoadType != currentLoadType)
            {
                selectWorkbook = null;
                selectSheet    = null;
                listSelectSheetHeaders.Clear();
                excelSelectID       = 0;
                sheetSelectID       = 0;
                lastSelectExcelName = string.Empty;
                lastSelectSheetName = string.Empty;
                listExcelSheets.Clear();
                sheetListView.Reload();

                multiListView.SetSelection(new List <int>());
                multiListView.searchString = string.Empty;
                if (currentLoadType == eExcelLoaderType.MultiSelect)
                {
                    searchField.downOrUpArrowKeyPressed -= singleListView.SetFocusAndEnsureSelectedItem;
                    searchField.downOrUpArrowKeyPressed += multiListView.SetFocusAndEnsureSelectedItem;
                }
                else
                {
                    searchField.downOrUpArrowKeyPressed -= multiListView.SetFocusAndEnsureSelectedItem;
                    searchField.downOrUpArrowKeyPressed += singleListView.SetFocusAndEnsureSelectedItem;
                }
            }

            switch (currentLoadType)
            {
            case eExcelLoaderType.MultiSelect:
            {
                multiListView.searchString = searchField.OnGUI(new Rect(treeViewPadding, treeViewStartPosY - 20, excelListViewWidth, 20), multiListView.searchString);
                multiListView.OnGUI(multiSelectListViewRect);

                GUILayout.Space(treeViewEndPosY + 30);
                Color _deaultColor = GUI.color;
                GUI.color = Color.green;
                if (GUILayout.Button("전체 선택", GUILayout.Width(100)))
                {
                    multiListView.SelectAllRows();
                }
                GUI.color = _deaultColor;
                GUILayout.BeginHorizontal();
                GUI.enabled = !isCompiling && multiListViewState.selectedIDs.Count > 0;
                if (GUILayout.Button("CS 파일 생성/갱신", GUILayout.Width(position.width / 2 - 5)))
                {
                    EditorUtility.DisplayProgressBar("Work...", "CS파일 생성중...", 0);
                    IList <int> _selects = multiListView.GetSelection();
                    listMultiSelects = new List <int>(_selects);
                    string _namespace = LoadNamespaceText();
                    for (int _index = 0; _index < _selects.Count; _index++)
                    {
                        TreeViewItem _item = multiListView.GetItem(_selects[_index]);
                        EditorUtility.DisplayProgressBar("Work...", string.Format("CS파일 생성중({0})...", _item.displayName), (float)(_index + 1) / _selects.Count);

                        string _sheetName;
                        string _excelFilePath;
                        GetExcelFilePathAndSheetName(_item, out _excelFilePath, out _sheetName);

                        LoadExcel(_excelFilePath);
                        ISheet            _tableSheet;
                        List <HeaderData> _headers = LoadSheet(selectWorkbook, _item.displayName, _sheetName, out _tableSheet);
                        string            _log     = string.Format("File Name = {0}, Sheet Name = {1}", _item.displayName, _sheetName);
                        if (_tableSheet == null)
                        {
                            UnityEngine.Debug.LogErrorFormat("ExcelLoader Error : 엑셀 파일에 해당 시트가 존재하지 않습니다. {0}", _log);
                            continue;
                        }
                        if (_headers.Count < 1)
                        {
                            UnityEngine.Debug.LogErrorFormat("ExcelLoader Error : 엑셀 파일에 필드가 존재하지 않습니다. {0}", _log);
                        }
                        else
                        {
                            scriptGenerator.SetScriptGenerator(_sheetName, _namespace, settingData, _headers);
                            scriptGenerator.DataScriptGenerate();
                        }
                    }
                    EditorUtility.ClearProgressBar();
                    AssetDatabase.Refresh();
                }

                //현재 선택한 엑셀파일들중에 CS파일이 생성되지 않은 엑셀이 있는 경우 GUI를 disable한다.
                bool _guiEnable = !isCompiling && multiListViewState.selectedIDs.Count > 0;
                if (_guiEnable == true)
                {
                    IList <int> _selects = multiListView.GetSelection();
                    for (int _index = 0; _index < _selects.Count; _index++)
                    {
                        TreeViewItem _item = multiListView.GetItem(_selects[_index]);
                        string       _sheetName;
                        string       _excelFilePath;
                        GetExcelFilePathAndSheetName(_item, out _excelFilePath, out _sheetName);
                        if (File.Exists(string.Format("{0}/{1}.cs", settingData.GetClassFullPath(), ScriptGenerator.GetDataName(_sheetName))) == false)
                        {
                            _guiEnable = false;
                            break;
                        }
                    }
                }
                GUI.enabled = _guiEnable;

                if (GUILayout.Button("바이너리,CSV 생성/갱신", GUILayout.Width(position.width / 2 - 5)))
                {
                    IList <int> _selects = multiListView.GetSelection();
                    listMultiSelects = new List <int>(_selects);
                    EditorUtility.DisplayProgressBar("Work...", "바이너리 작성중...", 0);
                    for (int _index = 0; _index < _selects.Count; _index++)
                    {
                        TreeViewItem _item = multiListView.GetItem(_selects[_index]);
                        EditorUtility.DisplayProgressBar("Work...", string.Format("바이너리 작성중({0})...", _item.displayName), (float)(_index + 1) / _selects.Count);

                        string _sheetName;
                        string _excelFilePath;
                        GetExcelFilePathAndSheetName(_item, out _excelFilePath, out _sheetName);

                        LoadExcel(_excelFilePath);
                        ISheet            _tableSheet;
                        List <HeaderData> _headers = LoadSheet(selectWorkbook, _item.displayName, _sheetName, out _tableSheet);

                        string _log = string.Format("File Name = {0}, Sheet Name = {1}", _item.displayName, _sheetName);
                        if (_tableSheet == null)
                        {
                            UnityEngine.Debug.LogErrorFormat("ExcelLoader Error : 엑셀 파일에 해당 시트가 존재하지 않습니다. {0}", _log);
                            continue;
                        }
                        Type _tableType = ScriptGenerator.GetType("ExcelLoader.DataContainer");
                        Type _dataType  = ScriptGenerator.GetType(string.Format("{0}Data", _sheetName));
                        if (_dataType == null)
                        {
                            UnityEngine.Debug.LogErrorFormat("ExcelLoader Error : 엑셀 파일에 해당하는 CS파일이 존재하지 않습니다. {0}", _log);
                            continue;
                        }
                        if (_headers.Count < 1)
                        {
                            UnityEngine.Debug.LogErrorFormat("ExcelLoader Error : 엑셀 파일에 필드가 존재하지 않습니다. {0}", _log);
                        }
                        else
                        {
                            if (WriteBinary(_headers, _tableSheet, _tableType, _dataType, settingData.GetDataFullPath(), _sheetName))
                            {
                                WriteCSV(_headers, _tableSheet, _dataType, settingData.GetCsvFullPath(), _sheetName);
                            }
                        }
                    }
                    EditorUtility.ClearProgressBar();
                    AssetDatabase.Refresh();
                    RefreshGUI();
                }
                GUI.enabled = !isCompiling;
                GUILayout.EndHorizontal();
            }
            break;

            case eExcelLoaderType.SingleSelect:
            {
                singleListView.searchString = searchField.OnGUI(new Rect(treeViewPadding, treeViewStartPosY - 20, excelListViewWidth, 20), singleListView.searchString);
                singleListView.OnGUI(singleSelectListViewRect);
                sheetListView.OnGUI(sheetListViewRect);

                GUILayout.Space(treeViewEndPosY + 20 + 20);

                using (new GUILayout.HorizontalScope(EditorStyles.toolbar))
                {
                    GUILayout.Label("Member", GUILayout.MinWidth(100));
                    GUILayout.FlexibleSpace();
                    string[] names  = { "Type", "Array" };
                    int[]    widths = { 55, 40 };
                    for (int i = 0; i < names.Length; i++)
                    {
                        GUILayout.Label(new GUIContent(names[i]), GUILayout.Width(widths[i]));
                    }
                }

                using (new EditorGUILayout.VerticalScope("box"))
                {
                    GUILayout.BeginVertical();
                    if (listSelectSheetHeaders != null)
                    {
                        foreach (HeaderData header in listSelectSheetHeaders)
                        {
                            GUILayout.BeginHorizontal();

                            EditorGUILayout.LabelField(header.name, GUILayout.MinWidth(100));
                            GUILayout.FlexibleSpace();

                            EditorGUILayout.EnumPopup(header.type, GUILayout.Width(60));
                            GUILayout.Space(20);

                            EditorGUILayout.Toggle(header.arrayGroup > 0, GUILayout.Width(20));
                            GUILayout.Space(10);
                            GUILayout.EndHorizontal();
                        }
                    }
                    EditorGUILayout.EndVertical();
                }

                GUILayout.BeginHorizontal();
                GUI.enabled = !isCompiling && listSelectSheetHeaders.Count > 0;
                if (GUILayout.Button("CS 파일 생성/갱신", GUILayout.Width(position.width / 2 - 5)))
                {
                    scriptGenerator.DataScriptGenerate();
                    AssetDatabase.Refresh();
                }
                GUI.enabled = !isCompiling && (selectSheet == null ? false : File.Exists(string.Format("{0}/{1}.cs", settingData.GetClassFullPath(), scriptGenerator.dataFileName)));
                if (GUILayout.Button("바이너리,CSV 생성/갱신", GUILayout.Width(position.width / 2 - 5)))
                {
                    if (WriteBinary(
                            listSelectSheetHeaders,
                            selectSheet,
                            scriptGenerator.GetTableType(),
                            scriptGenerator.GetDataType(),
                            settingData.GetDataFullPath(),
                            scriptGenerator.dataTableName))
                    {
                        WriteCSV(listSelectSheetHeaders, selectSheet, scriptGenerator.GetDataType(), settingData.GetCsvFullPath(), scriptGenerator.dataTableName);
                    }
                    AssetDatabase.Refresh();
                    RefreshGUI();
                }
                GUI.enabled = !isCompiling;
                GUILayout.EndHorizontal();

                //if (GUILayout.Button("테이블 로드 테스트"))
                //{
                //    string _path = settingData.dataPath + '/' + scriptGenerator.dataTableName + ".bytes";
                //    _path = _path.Remove(0, _path.IndexOf("Assets"));
                //    DataContainer _table = DataContainer.LoadTable(AssetDatabase.LoadAssetAtPath<TextAsset>(_path));
                //}
            }
            break;

            default:
                break;
            }
            EditorGUILayout.EndScrollView();
        }