private void RefreshTreeViewBoneStructure(CompositeBone selectedBone)
 {
     treeViewBones.Nodes.Clear();
     if (CompositeEntity.RootBone != null)
     {
         TreeNode selectedNode = InsertBoneNodeInNode(treeViewBones.Nodes, CompositeEntity.RootBone, selectedBone);
         treeViewBones.ExpandAll();
         if (CompositeEntity.RootBone == selectedBone)
         {
             treeViewBones.SelectedNode = treeViewBones.Nodes[0];
         }
         else
         {
             treeViewBones.SelectedNode = selectedNode;
         }
     }
     if (treeViewBones.SelectedNode == null)
     {
         treeViewBones_AfterSelect(treeViewBones, null);
         if (CompositeEntity.RootBone != null)
         {
             treeViewBones.SelectedNode = treeViewBones.Nodes[0];
         }
     }
 }
        private void toolStripButtonAddRootBone_Click(object sender, EventArgs e)
        {
            TreeNode      selectedNode = treeViewBones.SelectedNode;
            CompositeBone selectedBone = null;
            CompositeBone parentBone   = null;
            CompositeBone newBone      = new CompositeBone("", GetNewBoneNodeName());

            newBone.Parent = CompositeEntity;
            if (selectedNode != null)
            {
                selectedBone = selectedNode.Tag as CompositeBone;
                if (selectedBone == CompositeEntity.RootBone)
                {
                    parentBone = selectedBone;
                }
                else
                {
                    parentBone = selectedBone.ParentBone;
                }
            }
            else
            {
                if (CompositeEntity.RootBone == null)
                {
                    throw new Exception("CompositeEntity.RootBone is null");
                }
                else
                {
                    parentBone = CompositeEntity.RootBone;
                }
            }
            parentBone.AddChildBone(newBone);
            RefreshTreeViewBoneStructure(null);
        }
        private void toolStripButtonLevelDownBone_Click(object sender, EventArgs e)
        {
            TreeNode      selectedNode = treeViewBones.SelectedNode;
            CompositeBone selectedBone = null;

            if (selectedNode != null)
            {
                selectedBone = selectedNode.Tag as CompositeBone;
                if (selectedBone == CompositeEntity.RootBone)
                {
                    return;
                }
                else
                {
                    int index = selectedBone.ParentBone.ChildBones.IndexOf(selectedBone);
                    // if it's the last element, upgrade the bone to the parent's level
                    if (index == selectedBone.ParentBone.ChildBones.Count - 1)
                    {
                        CompositeBone grandpa     = selectedBone.ParentBone.ParentBone;
                        int           indexParent = grandpa.ChildBones.IndexOf(selectedBone.ParentBone);
                        selectedBone.ParentBone.ChildBones.Remove(selectedBone);
                        grandpa.ChildBones.Insert(indexParent, selectedBone);
                        selectedBone.ParentBone = grandpa;
                    }
                    // if it's inside the list, simply place it one level down in the list
                    else
                    {
                        selectedBone.ParentBone.ChildBones.Remove(selectedBone);
                        selectedBone.ParentBone.ChildBones.Insert(index + 1, selectedBone);
                    }
                }
                RefreshTreeViewBoneStructure(selectedBone);
            }
        }
        private void treeViewBones_AfterSelect(object sender, TreeViewEventArgs e)
        {
            bool          enabledState = false;
            CompositeBone selectedBone = null;

            if (treeViewBones.SelectedNode != null)
            {
                enabledState = true;
                selectedBone = e.Node.Tag as CompositeBone;
                if (String.IsNullOrEmpty(selectedBone.SceneItem) == false &&
                    CompositeEntity.SceneItemBank.ContainsKey(selectedBone.SceneItem))
                {
                    SceneItem sceneItem = CompositeEntity.SceneItemBank[selectedBone.SceneItem];
                    if (sceneItem != null && sceneItem is ISubItemCollection)
                    {
                        SubItemRefConverter.SubItemsRefs = ((ISubItemCollection)sceneItem).GetSubItemsList();
                    }
                }
                propertyGridBoneProperties.SelectedObject = selectedBone;
            }
            else
            {
                propertyGridBoneProperties.SelectedObject = null;
            }
            toolStripButtonAddChildBone.Enabled = enabledState;
            toolStripButtonDeleteBone.Enabled   = enabledState &&
                                                  treeViewBones.SelectedNode != treeViewBones.Nodes[0];
            groupBoxBoneProps.Enabled          = enabledState;
            toolStripButtonLevelUpBone.Enabled = enabledState && selectedBone != CompositeEntity.RootBone &&
                                                 selectedBone != CompositeEntity.RootBone.ChildBones[0];
            toolStripButtonLevelDownBone.Enabled = enabledState && selectedBone != CompositeEntity.RootBone;
        }
        private void toolStripButtonAddChildBone_Click(object sender, EventArgs e)
        {
            TreeNode selectedNode = treeViewBones.SelectedNode;

            if (selectedNode != null)
            {
                CompositeBone selectedBone = null;
                CompositeBone newBone      = new CompositeBone("", GetNewBoneNodeName());
                newBone.Parent = CompositeEntity;
                selectedBone   = selectedNode.Tag as CompositeBone;
                selectedBone.AddChildBone(newBone);
                RefreshTreeViewBoneStructure(null);
            }
        }
 private bool IsBoneNodeNameUnique(CompositeBone bone, String name)
 {
     if (bone != null)
     {
         if (bone.Name == name)
         {
             return(false);
         }
         foreach (CompositeBone childBone in bone.ChildBones)
         {
             if (IsBoneNodeNameUnique(childBone, name) == false)
             {
                 return(false);
             }
         }
     }
     return(true);
 }
        private void toolStripButtonNewBoneFromItem_Click(object sender, EventArgs e)
        {
            TreeNode selectedNode = treeViewBones.SelectedNode;

            if (selectedNode == null)
            {
                selectedNode = treeViewBones.Nodes[0];
            }
            SceneItem     selectedItem = treeViewSceneItems.SelectedNode.Tag as SceneItem;
            CompositeBone newBone      = new CompositeBone(selectedItem.Name,
                                                           GetUniqueBoneNodeName(selectedItem.Name));

            newBone.Parent = CompositeEntity;
            CompositeBone selectedBone = selectedNode.Tag as CompositeBone;

            selectedBone.AddChildBone(newBone);
            RefreshTreeViewBoneStructure(null);
        }
        private void toolStripButtonDeleteBone_Click(object sender, EventArgs e)
        {
            TreeNode      selectedNode = treeViewBones.SelectedNode;
            CompositeBone selectedBone = null;

            if (selectedNode != null)
            {
                selectedBone = selectedNode.Tag as CompositeBone;
                if (selectedBone == CompositeEntity.RootBone)
                {
                    return;
                }
                else
                {
                    selectedBone.ParentBone.RemoveChildBone(selectedBone);
                    CleanBoneInSceneControl(selectedBone.Name);
                }
                RefreshTreeViewBoneStructure(null);
            }
        }
        private TreeNode InsertBoneNodeInNode(TreeNodeCollection parentNodes, CompositeBone bone, CompositeBone selectedBone)
        {
            String   icon       = (bone == CompositeEntity.RootBone) ? "anchor.png" : "link.png";
            TreeNode returnNode = null;
            TreeNode newNode    = parentNodes.Add(
                "Node" + bone.Name, bone.Name, icon, icon);

            newNode.Tag = bone;
            if (bone.Equals(selectedBone))
            {
                returnNode = newNode;
            }
            foreach (CompositeBone childBone in bone.ChildBones)
            {
                TreeNode childNodeReturnValue = InsertBoneNodeInNode(newNode.Nodes, childBone, selectedBone);
                if (childNodeReturnValue != null)
                {
                    returnNode = childNodeReturnValue;
                }
            }
            return(returnNode);
        }
 private void treeViewBones_AfterLabelEdit(object sender, NodeLabelEditEventArgs e)
 {
     if (e.Node != null)
     {
         String oldName = e.Node.Text;
         String newName = e.Label;
         Console.WriteLine("Renamed node " + oldName + " to " + newName);
         if (String.IsNullOrEmpty(newName) == false &&
             IsBoneNodeNameUnique(CompositeEntity.RootBone, newName))
         {
             CompositeBone bone = e.Node.Tag as CompositeBone;
             bone.Name = newName;
             CleanBoneInSceneControl(oldName);
             // sync bone transforms with the new Bone name
             for (int i = 0; i < CompositeEntity.Animations.Count; i++)
             {
                 // loop through every keyframe to sync them
                 for (int j = 0; j < CompositeEntity.Animations[i].KeyFrames.Count; j++)
                 {
                     CompositeKeyFrame keyframe = CompositeEntity.Animations[i].KeyFrames[j];
                     // loop to find the previous bone
                     for (int k = 0; k < keyframe.BoneTransforms.Count; k++)
                     {
                         CompositeBoneTransform transform = keyframe.BoneTransforms[k];
                         if (transform.BoneReference == oldName)
                         {
                             transform.BoneReference = bone.Name;
                             break;
                         }
                     }
                 }
             }
         }
         else
         {
             e.CancelEdit = true;
         }
     }
 }