void DrawToolbar()
    {
        GUILayout.BeginHorizontal(EditorStyles.toolbar, GUILayout.ExpandWidth(true));

        // LHS
        GUILayout.BeginHorizontal(GUILayout.Width(leftBarWidth - 6));

        // Create Button
        GUIContent createButton     = new GUIContent("Create");
        Rect       createButtonRect = GUILayoutUtility.GetRect(createButton, EditorStyles.toolbarDropDown, GUILayout.ExpandWidth(false));

        if (GUI.Button(createButtonRect, createButton, EditorStyles.toolbarDropDown) && anim != null)
        {
            GUIUtility.hotControl = 0;
            EditorUtility.DisplayCustomMenu(createButtonRect, menuItems, -1,
                                            delegate(object userData, string[] options, int selected) {
                if (selected == 0)
                {
                    selectedClip    = CreateNewClip();
                    clipEditor.Clip = selectedClip;
                    clipEditor.InitForNewClip();
                    Repaint();
                }
                else if (menuTargets[selected] != null)
                {
                    tk2dEditor.SpriteAnimationEditor.AnimOperator animOp = menuTargets[selected];
                    tk2dSpriteAnimationClip newSelectedClip = animOp.OnAnimMenu(options[selected], allClips, selectedClip);
                    if (selectedClip != newSelectedClip)
                    {
                        selectedClip    = newSelectedClip;
                        clipEditor.Clip = selectedClip;
                    }

                    if ((animOp.AnimEditOperations & tk2dEditor.SpriteAnimationEditor.AnimEditOperations.AllClipsChanged) != tk2dEditor.SpriteAnimationEditor.AnimEditOperations.None)
                    {
                        FilterClips();
                        Repaint();
                    }
                    if ((animOp.AnimEditOperations & tk2dEditor.SpriteAnimationEditor.AnimEditOperations.NewClipCreated) != tk2dEditor.SpriteAnimationEditor.AnimEditOperations.None)
                    {
                        clipEditor.InitForNewClip();
                        Repaint();
                    }
                }
            }
                                            , null);
        }

        // Filter box
        if (anim != null)
        {
            GUILayout.Space(8);
            string newSearchFilter = GUILayout.TextField(searchFilter, tk2dEditorSkin.ToolbarSearch, GUILayout.ExpandWidth(true));
            if (newSearchFilter != searchFilter)
            {
                searchFilter = newSearchFilter;
                FilterClips();
            }
            if (searchFilter.Length > 0)
            {
                if (GUILayout.Button("", tk2dEditorSkin.ToolbarSearchClear, GUILayout.ExpandWidth(false)))
                {
                    searchFilter = "";
                    FilterClips();
                }
            }
            else
            {
                GUILayout.Label("", tk2dEditorSkin.ToolbarSearchRightCap);
            }
        }

        GUILayout.EndHorizontal();

        // Label
        if (anim != null)
        {
            if (GUILayout.Button(anim.name, EditorStyles.label))
            {
                EditorGUIUtility.PingObject(anim);
            }
        }

        // RHS
        GUILayout.FlexibleSpace();

        if (anim != null && GUILayout.Button("Revert", EditorStyles.toolbarButton))
        {
            Revert();
        }

        if (anim != null && GUILayout.Button("Commit", EditorStyles.toolbarButton))
        {
            Commit();
        }

        GUILayout.EndHorizontal();
    }
    void OnEnable()
    {
        // Detect animOps
        List <tk2dEditor.SpriteAnimationEditor.AnimOperator> animOpList = new List <tk2dEditor.SpriteAnimationEditor.AnimOperator>();

        foreach (var assembly in System.AppDomain.CurrentDomain.GetAssemblies())
        {
            try
            {
                System.Type[] types = assembly.GetTypes();
                foreach (var type in types)
                {
                    if (type.BaseType == typeof(tk2dEditor.SpriteAnimationEditor.AnimOperator))
                    {
                        tk2dEditor.SpriteAnimationEditor.AnimOperator inst = (tk2dEditor.SpriteAnimationEditor.AnimOperator)System.Activator.CreateInstance(type);
                        if (inst != null)
                        {
                            animOpList.Add(inst);
                        }
                    }
                }
            }
            catch { }
        }
        animOpList.Sort((a, b) => a.SortId.CompareTo(b.SortId));
        animOps = animOpList.ToArray();

        // Create menu items
        List <GUIContent> menuItems = new List <GUIContent>();
        List <tk2dEditor.SpriteAnimationEditor.AnimOperator> menuTargets = new List <tk2dEditor.SpriteAnimationEditor.AnimOperator>();

        menuItems.Add(new GUIContent("Clip")); menuTargets.Add(null);

        foreach (tk2dEditor.SpriteAnimationEditor.AnimOperator animOp in animOps)
        {
            for (int i = 0; i < animOp.AnimToolsMenu.Length; ++i)
            {
                menuItems.Add(new GUIContent(animOp.AnimToolsMenu[i]));
                menuTargets.Add(animOp);
            }
        }

        this.menuItems   = menuItems.ToArray();
        this.menuTargets = menuTargets.ToArray();

        // Create clip editor
        if (clipEditor == null)
        {
            clipEditor = new tk2dEditor.SpriteAnimationEditor.ClipEditor();
            clipEditor.clipNameChangedEvent      += ClipNameChanged;
            clipEditor.clipDeletedEvent          += ClipDeleted;
            clipEditor.clipSelectionChangedEvent += ClipSelectionChanged;
            clipEditor.hostEditorWindow           = this;
        }
        clipEditor.animOps = animOps;

        FilterClips();
        if (selectedClipId != -1 && selectedClipId < allClips.Count)
        {
            selectedClip = allClips[selectedClipId];
        }
        else
        {
            selectedClip = null;
        }
    }