public virtual void OnGUI()
            {
                using (new EditorHelper.Box(true, 10))
                {
                    using (new EditorHelper.Horizontal())
                    {
                        bool existed = Config.conditionFold.ContainsKey(this);
                        if (!existed)
                        {
                            Config.conditionFold[this] = true;
                        }

                        bool     foldout    = Config.conditionFold[this];
                        GUIStyle gs         = new GUIStyle(EditorStyles.foldout);
                        bool     isSelected = this == selectedObject;

                        if (isSelected)
                        {
                            gs.normal.textColor   = Color.green;
                            gs.onNormal.textColor = Color.green;
                            gs.onActive.textColor = Color.green;
                        }

                        foldout = GUILayout.Toggle(
                            foldout, "Condition #" + order, gs,
                            GUILayout.ExpandWidth(false), GUILayout.Width(140)
                            );

                        if (Config.conditionFold[this] != foldout)
                        {
                            Config.ResetCacheRectData();
                        }
                        Config.conditionFold[this] = foldout;
                        if (!foldout)
                        {
                            return;
                        }

                        IsRemoved = GUILayout.Button("Remove", GUILayout.Width(80));

                        if (GUILayout.Button("Copy", GUILayout.Width(80)))
                        {
                            copiedCondition = this;
                        }

                        IsPasted = GUILayout.Button("Paste", GUILayout.Width(80));
                    }

                    using (new EditorHelper.Indent(-2))
                    {
                        EndConditionName oldConditionName = ShowConditionName();
                        EndConditionName newConditionName = (EndConditionName)EditorGUILayout.EnumPopup(
                            "Condition Name", oldConditionName);
                        conditionName      = newConditionName.ToString();
                        IsConditionChanged = !oldConditionName.Equals(newConditionName);

                        DrawGUI();
                    }
                }
            }
            private EndCondition GenerateEndCondition(EndConditionName conditionName)
            {
                EndCondition condition;

                switch (conditionName)
                {
                case EndConditionName.HeroDeath:
                    condition = new HeroDeathCondition();
                    break;

                case EndConditionName.KillAllEnemy:
                    condition = new KillAllEnemyCondition();
                    break;

                case EndConditionName.ReachCheckpoint:
                    condition = new ReachCheckpointCondition();
                    break;

                case EndConditionName.CountdownTime:
                    condition = new CountdownTimeCondition();
                    break;

                case EndConditionName.TotalBattleTime:
                    condition = new TotalBattleTimeCondition();
                    break;

                default:
                    throw new Exception(string.Format(
                                            "Not recognized end condition name of '{0}'", conditionName
                                            ));
                }

                return(condition);
            }