void OnEnable()
 {
     filePath   = "";
     working    = false;
     committing = false;
     texture    = null;
     ti         = null;
     EditorUtility.ClearProgressBar();
     colorPickerMode = COLOR_PICKER_MODE.NONE;
 }
        void OnGUI()
        {
            if (WMSK.instance == null)
            {
                DestroyImmediate(this);
                EditorGUIUtility.ExitGUI();
                return;
            }

            EditorGUILayout.HelpBox("This tool will generate countries or provinces based on the color information of a given texture.", MessageType.Info);
            EditorGUILayout.Separator();
            EditorGUILayout.BeginHorizontal();
            if (GUILayout.Button("Load Texture File...", GUILayout.Width(140)))
            {
                filePath = EditorUtility.OpenFilePanelWithFilters("Select Texture File", "", new string[] { "Image files", "png,jpg,jpeg" });
                if (filePath.ToUpper().Contains("PROVINC"))
                {
                    mode = TerritoriesImporterMode.Provinces;
                }
                ReadTexture();
            }
            if (texture != null && GUILayout.Button("Reload Texture", GUILayout.Width(120)))
            {
                ReadTexture();
            }
            EditorGUILayout.EndHorizontal();

            if (texture != null)
            {
                textureRectWidth  = (int)position.width - 400;
                textureRectHeight = (int)position.height - 70;
                textureRect       = new Rect(390, 55, textureRectWidth, textureRectHeight);
                GUI.DrawTexture(textureRect, texture, ScaleMode.StretchToFill);
                EditorGUILayout.Separator();
                EditorGUILayout.BeginHorizontal();
                GUILayout.Label("Creation Mode", GUILayout.Width(150));
                mode = (TerritoriesImporterMode)EditorGUILayout.IntPopup((int)mode, modes, modesValues, GUILayout.Width(120));
                EditorGUILayout.EndHorizontal();
                EditorGUILayout.BeginHorizontal();
                GUILayout.Label("Detail", GUILayout.Width(150));
                EditorGUI.BeginChangeCheck();
                detail = (DETAIL)EditorGUILayout.EnumPopup(detail, GUILayout.Width(120));
                if (EditorGUI.EndChangeCheck())
                {
                    ReadTexture();
                }
                EditorGUILayout.EndHorizontal();
                EditorGUILayout.BeginHorizontal();
                if (mode == TerritoriesImporterMode.Countries)
                {
                    GUI.enabled            = false;
                    snapToCountryFrontiers = false;
                }
                GUILayout.Label("Snap To Country Frontiers", GUILayout.Width(150));
                snapToCountryFrontiers = EditorGUILayout.Toggle(snapToCountryFrontiers, GUILayout.Width(40));
                GUI.enabled            = true;
                EditorGUILayout.EndHorizontal();
                EditorGUILayout.BeginHorizontal();
                GUILayout.Label(new GUIContent("Additive", "Do not remove existing entities"), GUILayout.Width(150));
                additive = EditorGUILayout.Toggle(additive, GUILayout.Width(40));
                EditorGUILayout.EndHorizontal();

                // Background Color
                if (colorTexStyle == null)
                {
                    colorTexStyle             = new GUIStyle(GUI.skin.box);
                    colorTexStyle.fixedWidth  = 120;
                    colorTexStyle.fixedHeight = 17;
                }

                EditorGUILayout.BeginHorizontal();
                GUILayout.Label("Background Color", GUILayout.Width(150));
                if (bgColorTex == null)
                {
                    bgColorTex = MakeTex(150, 25, bgColor);
                    colorTexStyle.normal.background = bgColorTex;
                    Repaint();
                }
                GUILayout.Box(bgColorTex, colorTexStyle, GUILayout.Width(120), GUILayout.Height(17));

                if (colorPickerMode != COLOR_PICKER_MODE.BACKGROUND_COLOR)
                {
                    if (GUILayout.Button("Pick", GUILayout.Width(60)))
                    {
                        colorPickerMode = COLOR_PICKER_MODE.BACKGROUND_COLOR;
                    }
                }
                else if (GUILayout.Button("Cancel", GUILayout.Width(60)))
                {
                    colorPickerMode = COLOR_PICKER_MODE.NONE;
                }
                EditorGUILayout.EndHorizontal();
                if (colorPickerMode == COLOR_PICKER_MODE.BACKGROUND_COLOR)
                {
                    GUILayout.Label("(Click on the texture to select background color)");
                }

                // Colors
                EditorGUILayout.BeginHorizontal();
                GUILayout.Label("Territory Colors (" + ti.goodColorCount + ")", GUILayout.Width(150));
                if (goodColorsTex == null)
                {
                    goodColorsTex = MakeTexGoodColors(250, 25);
                    Repaint();
                }
                GUILayout.Box(goodColorsTex, colorTexStyle, GUILayout.Width(120), GUILayout.Height(17));
                EditorGUILayout.EndHorizontal();
                EditorGUILayout.BeginHorizontal();
                GUILayout.Label("", GUILayout.Width(150));
                if (colorPickerMode != COLOR_PICKER_MODE.GOOD_COLOR)
                {
                    if (GUILayout.Button("Add", GUILayout.Width(60)))
                    {
                        colorPickerMode = COLOR_PICKER_MODE.GOOD_COLOR;
                    }
                    if (GUILayout.Button("Clear", GUILayout.Width(60)))
                    {
                        ti.ClearGoodColors();
                        goodColorsTex = null;
                        GUIUtility.ExitGUI();
                        return;
                    }
                }
                else
                {
                    if (GUILayout.Button("Finish", GUILayout.Width(60)))
                    {
                        colorPickerMode = COLOR_PICKER_MODE.NONE;
                    }
                    GUILayout.Label("(Click on the texture to add a new color)");
                }
                EditorGUILayout.EndHorizontal();

                // Operations
                if (colorPickerMode != COLOR_PICKER_MODE.NONE)
                {
                    Vector2 mousePos = Event.current.mousePosition;
                    if (Event.current.button == 0 && Event.current.type == EventType.MouseDown && textureRect.Contains(mousePos))
                    {
                        Color32 color = GetColor(mousePos - textureRect.min);
                        if (colorPickerMode == COLOR_PICKER_MODE.BACKGROUND_COLOR)
                        {
                            bgColor         = color;
                            bgColorTex      = null;
                            colorPickerMode = COLOR_PICKER_MODE.NONE;
                            GUIUtility.ExitGUI();
                            return;
                        }
                        else if (colorPickerMode == COLOR_PICKER_MODE.GOOD_COLOR)
                        {
                            if (!ti.IsGoodColor(color))
                            {
                                ti.AddGoodColor(color);
                                goodColorsTex = null;
                            }
                        }
                        GUIUtility.ExitGUI();
                    }
                }

                if (working)
                {
                    GUI.enabled = false;
                }
                if (ti != null)
                {
                    EditorGUILayout.Separator();
                    EditorGUILayout.BeginHorizontal();
                    if (ti.goodColorCount == 0)
                    {
                        GUI.enabled = false;
                    }
                    if (GUILayout.Button(mode == TerritoriesImporterMode.Countries ? "Generate Countries" : "Generate Provinces", GUILayout.Width(150)))
                    {
                        if (AskConfirmation())
                        {
                            if (mode == TerritoriesImporterMode.Provinces)
                            {
                                WMSK.instance.editor.ChangeEditingMode(EDITING_MODE.PROVINCES);
                                WMSK.instance.drawAllProvinces = true;
                            }
                            working = true;
                            ti.StartProcess(mode, snapToCountryFrontiers);
                        }
                    }
                    GUI.enabled = true;
                    EditorGUILayout.EndHorizontal();
                }
            }
        }