private void DisplaySkillSelectionFooter()
        {
            var selectedCollection = SkillCollectionDatabase.Instance.Get(SelectedAssetId, true);

            if (selectedCollection != null)
            {
                GUILayout.BeginHorizontal(GUILayout.Width(200));
                if (GUILayout.Button("+", EditorStyles.toolbarButton))
                {
                    XmlDatabaseEditorUtility.GetGenericMenu(SkillEditorUtility.GetNames(), (index) => {
                        var skillAsset = SkillEditorUtility.CreateAsset(index);
                        selectedCollection.Skills.Add(skillAsset);

                        SelectedSkillIndex = selectedCollection.Skills.Count - 1;
                        EditorWindow.FocusWindowIfItsOpen <SkillCollectionWindow> ();
                    }).ShowAsContext();
                }
                if (GUILayout.Button("-", EditorStyles.toolbarButton) &&
                    EditorUtility.DisplayDialog("Delete Skill", "Are you sure you want to delete the selected skill?", "Delete", "Cancel"))
                {
                    if (SelectedSkillIndex >= 0 && SelectedSkillIndex < selectedCollection.Skills.Count)
                    {
                        selectedCollection.Skills.RemoveAt(SelectedSkillIndex--);
                        if (SelectedSkillIndex == -1 && selectedCollection.Skills.Count > 0)
                        {
                            SelectedSkillIndex = 0;
                        }
                    }
                }
                GUILayout.Label("", EditorStyles.toolbarButton, GUILayout.Width(15));
                GUILayout.EndHorizontal();
            }
        }
        private void DisplaySelectedSkillContent(SkillAsset skill)
        {
            GUILayout.BeginVertical();
            GUILayout.BeginVertical(EditorStyles.helpBox);
            GUILayout.Label("Parameters", EditorStyles.boldLabel);

            GUILayout.BeginHorizontal();
            GUILayout.Label("Skill Name", GUILayout.Width(100));
            skill.Name = EditorGUILayout.TextField(skill.Name);
            GUILayout.EndHorizontal();

            GUILayout.BeginHorizontal();
            GUILayout.Label("Cooldown", GUILayout.Width(100));
            skill.Cooldown = EditorGUILayout.FloatField(skill.Cooldown);
            GUILayout.EndHorizontal();

            GUILayout.BeginHorizontal();
            GUILayout.Label("Cast Time", GUILayout.Width(100));
            skill.CastTime = EditorGUILayout.FloatField(skill.CastTime);
            GUILayout.EndHorizontal();

            GUILayout.BeginHorizontal();
            GUILayout.Label("Range", GUILayout.Width(100));
            skill.Range = EditorGUILayout.FloatField(skill.Range);
            GUILayout.EndHorizontal();

            GUILayout.BeginHorizontal();
            GUILayout.Label("Duration", GUILayout.Width(100));
            skill.Delay = EditorGUILayout.FloatField(skill.Delay);
            GUILayout.EndHorizontal();

            GUILayout.BeginHorizontal();
            GUILayout.Label("Interruptable", GUILayout.Width(100));
            skill.Interruptable = EditorGUILayout.Toggle(skill.Interruptable);
            GUILayout.EndHorizontal();

            GUILayout.BeginHorizontal();
            GUILayout.Label("Unlocked Level", GUILayout.Width(100));
            skill.RequiredLevel = EditorGUILayout.IntField(skill.RequiredLevel);
            GUILayout.EndHorizontal();

            foreach (var extension in SkillEditorUtility.GetExtensions())
            {
                if (extension.CanHandleType(skill.GetType()))
                {
                    extension.OnGUI(skill);
                }
            }
            GUILayout.EndVertical();

            GUILayout.BeginVertical(EditorStyles.helpBox, GUILayout.Height(200));
            GUILayout.Label("Prerequisites", EditorStyles.boldLabel);

            skillPrerequisiteScroll = GUILayout.BeginScrollView(skillPrerequisiteScroll, false, true);

            for (int i = 0; i < skill.Prerequisites.Count; i++)
            {
                SkillPrerequisiteAsset prerequisite = skill.Prerequisites [i];
                GUILayout.BeginHorizontal(EditorStyles.toolbar);
                if (GUILayout.Button("-", EditorStyles.toolbarButton, GUILayout.Width(30)) &&
                    EditorUtility.DisplayDialog("Remove prerequisite", "Are you sure you want to delete the prerequisite?", "Delete", "Cancel"))
                {
                    skill.Prerequisites.RemoveAt(i);
                }
                GUILayout.Label("StatType", GUILayout.Width(100));
                //prerequisite.StatName = EditorGUILayout.TextField (prerequisite.StatName);

                var targetStatType = RPGStatTypeDatabase.Instance.Get(prerequisite.StatName, true);
                if (GUILayout.Button(targetStatType == null ? "Assign Type" : targetStatType.Name, EditorStyles.toolbarButton, GUILayout.Width(100)))
                {
                    XmlDatabaseEditorUtility.ShowContext(RPGStatTypeDatabase.Instance, (statTypeAsset) => {
                        prerequisite.StatName = statTypeAsset.Id;
                    }, typeof(RPGStatTypeWindow));
                }

                GUILayout.Label("StatValue", GUILayout.Width(100));
                prerequisite.StatValue = EditorGUILayout.IntField(prerequisite.StatValue);
                GUILayout.EndHorizontal();
            }

            GUILayout.FlexibleSpace();
            GUILayout.EndScrollView();

            if (GUILayout.Button("Add Prerequisite", EditorStyles.toolbarButton))
            {
                var newPrerequisite = new SkillPrerequisiteAsset();
                skill.Prerequisites.Add(newPrerequisite);
            }

            GUILayout.EndVertical();

            GUILayout.BeginVertical(EditorStyles.helpBox);
            GUILayout.Label("Effects", EditorStyles.boldLabel);
            skillEffectScroll = GUILayout.BeginScrollView(skillEffectScroll, false, true);

            GUILayout.BeginHorizontal();
            GUILayout.Label("", EditorStyles.boldLabel, GUILayout.Width(30));
            GUILayout.Label("Type", EditorStyles.boldLabel, GUILayout.Width(150));
            GUILayout.Label("Delay", EditorStyles.boldLabel, GUILayout.Width(50));
            GUILayout.EndHorizontal();

            for (int i = 0; i < skill.Effects.Count; i++)
            {
                //foreach(var effect in skill.Effects){
                EffectAsset effect = skill.Effects[i];
                GUILayout.BeginHorizontal(EditorStyles.toolbar);

                if (GUILayout.Button("-", EditorStyles.toolbarButton, GUILayout.Width(30)) &&
                    EditorUtility.DisplayDialog("Remove effect", "Are you sure you want to delete the effect?", "Delete", "Cancel"))
                {
                    skill.Effects.RemoveAt(i);
                }

                bool clicked = GUILayout.Toggle(i == SelectedEffectIndex, effect.GetType().Name, ToggleButtonStyle, GUILayout.Width(150));
                if (clicked != (i == SelectedEffectIndex))
                {
                    if (clicked)
                    {
                        SelectedEffectIndex = i;
                        GUI.FocusControl(null);
                    }
                    else
                    {
                        SelectedEffectIndex = -1;
                    }
                }

                effect.Delay = EditorGUILayout.FloatField(effect.Delay, GUILayout.Width(50));
                GUILayout.EndHorizontal();


                if (SelectedEffectIndex == i)
                {
                    GUILayout.BeginVertical(EditorStyles.helpBox);
                    foreach (var extension in EffectEditorUtility.GetExtensions())
                    {
                        if (extension.CanHandleType(effect.GetType()))
                        {
                            extension.OnGUI(effect);
                        }
                    }
                    GUILayout.EndVertical();
                }
            }

            //Object source = null;
            //source = EditorGUILayout.ObjectField(source, typeof(Object), true);
            //AssetDatabase.GetAssetPath (source);


            GUILayout.FlexibleSpace();
            GUILayout.EndScrollView();

            if (GUILayout.Button("Add Effect", EditorStyles.toolbarButton))
            {
                if (typeof(PositionSkillAsset).IsAssignableFrom(skill.GetType()))
                {
                    XmlDatabaseEditorUtility.GetGenericMenu(EffectEditorUtility.GetPositionEffectNames(), (index) => {
                        var skillEffectAsset = EffectEditorUtility.CreatePositionEffectAsset(index);
                        skill.Effects.Add(skillEffectAsset);
                        EditorWindow.FocusWindowIfItsOpen <SkillCollectionWindow> ();
                    }).ShowAsContext();
                }
                else if (typeof(TargetSkillAsset).IsAssignableFrom(skill.GetType()))
                {
                    XmlDatabaseEditorUtility.GetGenericMenu(EffectEditorUtility.GetTargetEffectNames(), (index) => {
                        var skillEffectAsset = EffectEditorUtility.CreateTargetEffectAsset(index);
                        skill.Effects.Add(skillEffectAsset);
                        EditorWindow.FocusWindowIfItsOpen <SkillCollectionWindow> ();
                    }).ShowAsContext();
                }
                else
                {
                    XmlDatabaseEditorUtility.GetGenericMenu(EffectEditorUtility.GetNames(), (index) => {
                        var skillEffectAsset = EffectEditorUtility.CreateAsset(index);
                        skill.Effects.Add(skillEffectAsset);
                        EditorWindow.FocusWindowIfItsOpen <SkillCollectionWindow> ();
                    }).ShowAsContext();
                }
            }

            GUILayout.EndVertical();
            GUILayout.EndVertical();
        }