protected override void RenameEnded(RenameEndedArgs args)
        {
            base.RenameEnded(args);
            if (args.newName.Length > 0 && args.newName != args.originalName)
            {
                args.acceptedRename = true;

                var renamedItem = FindItem(args.itemID, rootItem);
                if (renamedItem is VariantAxisTreeItem)
                {
                    VariantAxisTreeItem axt = renamedItem as VariantAxisTreeItem;
                    axt.Rename(args.newName);
                    ReloadAndSelect(axt.Info.nameHashCode, false);
                }
                if (renamedItem is VariantTreeItem)
                {
                    VariantTreeItem vt = renamedItem as VariantTreeItem;
                    vt.Rename(args.newName);
                    ReloadAndSelect(vt.Info.nameHashCode, false);
                }
            }
            else
            {
                args.acceptedRename = false;
            }
        }
        protected override void ContextClickedItem(int id)
        {
            m_ContextOnItem = true;
            List <TreeViewItem> selectedNodes = new List <TreeViewItem>();

            foreach (var nodeID in GetSelection())
            {
                selectedNodes.Add(FindItem(nodeID, rootItem));
            }

            if (selectedNodes.Count == 1)
            {
                GenericMenu menu = new GenericMenu();
                if (selectedNodes[0] is VariantAxisTreeItem)
                {
                    VariantAxisTreeItem item = selectedNodes [0] as VariantAxisTreeItem;
                    if (!item.Info.AssignedAxis.IsReadOnly)
                    {
                        menu.AddItem(new GUIContent("Add new variant"), false, AddNewVariant, selectedNodes);
                        menu.AddItem(new GUIContent("Rename"), false, RenameItem, selectedNodes);
                        menu.AddItem(new GUIContent("Delete " + selectedNodes [0].displayName), false, DeleteVariant, selectedNodes);
                    }
                }
                if (selectedNodes [0] is VariantTreeItem)
                {
                    VariantTreeItem item = selectedNodes [0] as VariantTreeItem;
                    if (!item.Info.parent.AssignedAxis.IsReadOnly)
                    {
                        menu.AddItem(new GUIContent("Rename"), false, RenameItem, selectedNodes);
                        menu.AddItem(new GUIContent("Delete " + selectedNodes [0].displayName), false, DeleteVariant, selectedNodes);
                    }
                }
                menu.ShowAsContext();
            }
        }
        protected override void SelectionChanged(IList <int> selectedIds)
        {
            if (selectedIds.Count == 1)
            {
                var selected = FindItem(selectedIds[0], rootItem);

                if (selected is VariantAxisTreeItem)
                {
                    VariantAxisTreeItem item = selected as VariantAxisTreeItem;
                    item.Info.AssignedAxis.ResetSelection();
                }
                if (selected is VariantTreeItem)
                {
                    VariantTreeItem item = selected as VariantTreeItem;
                    item.Info.parent.AssignedAxis.SelectVariant(item.Info.AssignedVariant);
                }
            }
        }
        void DeleteVariant(object b)
        {
            var selectedNodes = b as List <TreeViewItem>;

            if (selectedNodes != null && selectedNodes.Count > 0)
            {
                foreach (var i in selectedNodes)
                {
                    if (i is VariantAxisTreeItem)
                    {
                        VariantAxisTreeItem item = i as VariantAxisTreeItem;
                        VariantOperation.GetOperation().RemoveVariantAxis(item.Info.AssignedAxis);
                    }
                    else if (i is VariantTreeItem)
                    {
                        VariantTreeItem     item = i as VariantTreeItem;
                        VariantAxisTreeItem p    = i.parent as VariantAxisTreeItem;
                        VariantOperation.GetOperation().RemoveVariantFromVariantAxis(item.Info.AssignedVariant, p.Info.AssignedAxis);
                    }
                }
            }
            ForceReloadData(this);
        }
        void RenameItem(object b)
        {
            var selectedNodes = b as List <TreeViewItem>;

            if (selectedNodes != null && selectedNodes.Count > 0)
            {
                if (selectedNodes[0] is VariantAxisTreeItem)
                {
                    VariantAxisTreeItem item = selectedNodes [0] as VariantAxisTreeItem;
                    if (!item.Info.AssignedAxis.IsReadOnly)
                    {
                        BeginRename(FindItem(item.Info.nameHashCode, rootItem), 0.1f);
                    }
                }
                else if (selectedNodes[0] is VariantTreeItem)
                {
                    VariantTreeItem item = selectedNodes [0] as VariantTreeItem;
                    if (!item.Info.parent.AssignedAxis.IsReadOnly)
                    {
                        BeginRename(FindItem(item.Info.nameHashCode, rootItem), 0.1f);
                    }
                }
            }
        }