private void DrawNodeInspector(Node node, NodeViewData nodeViewData)
        {
            nodeViewData.name = EditorGUILayout.TextField(nodeViewData.name);

            // Node Delegate Button + Fields
            EditorGUILayout.BeginVertical((GUIStyle)"InspectorBigBox");
            EditorGUILayout.LabelField("Node Delegates:");
            foreach (INodeDelegate nodeDelegate in node.GetNodeDelegates())
            {
                Type nodeDelegateType = nodeDelegate.GetType();
                EditorGUILayout.BeginVertical((GUIStyle)"InspectorBox");
                EditorGUILayout.LabelField(nodeDelegateType.Name, EditorStyles.boldLabel);

                FieldInfo[] fields = TypeUtil.GetInspectorFields(nodeDelegateType);
                foreach (FieldInfo field in fields)
                {
                    EditorGUILayoutUtil.DynamicField(field, nodeDelegate);
                }
                EditorGUILayout.EndVertical();
                EditorGUILayout.Space();
            }

            if (GUILayout.Button("", (GUIStyle)"AddButton", GUILayout.Width(20.0f), GUILayout.Height(20.0f)))
            {
                GenericMenu nodeDelegateMenu = new GenericMenu();
                foreach (Type nodeDelegateType in INodeDelegateUtil.ImplementationTypes)
                {
                    nodeDelegateMenu.AddItem(new GUIContent(nodeDelegateType.Name), false, this.AddNodeDelegateToNode, Tuple.Create(node, nodeDelegateType));
                }
                nodeDelegateMenu.ShowAsContext();
            }
            EditorGUILayout.EndVertical();

            EditorGUILayout.Space();

            // Node Transitions
            EditorGUILayout.BeginVertical((GUIStyle)"InspectorBigBox");
            EditorGUILayout.LabelField("Transitions:");
            IList <NodeTransition> nodeTransitions = this.TargetGraph.GetOutgoingTransitionsForNode(node);

            foreach (NodeTransition nodeTransition in nodeTransitions)
            {
                GUIStyle transitionStyle = this.IsNodeTransitionSelected(nodeTransition) ? (GUIStyle)"SelectedInspectorBox" : (GUIStyle)"InspectorBox";
                Rect     transitionRect  = EditorGUILayout.BeginVertical(transitionStyle, GUILayout.MinHeight(30.0f));
                string   targetText      = "";
                targetText += (nodeTransition.targets.Length > 1) ? "Targets: " : "Target: ";
                targetText += StringUtil.Join(", ", nodeTransition.targets.Select(id => this.GetViewDataForNode(this.TargetGraph.LoadNodeById(id)).name));

                EditorGUILayout.LabelField(targetText, GUILayout.Height(30.0f));

                Rect editButtonRect = new Rect(new Vector2(transitionRect.x + transitionRect.width - 25.0f,
                                                           transitionRect.y + 5.0f),
                                               new Vector2(20.0f, 20.0f));
                if (GUI.Button(editButtonRect, "", (GUIStyle)"EditButton"))
                {
                    this.StartEditingNodeTransition(node, nodeTransition);
                }

                Rect removeButtonRect = new Rect(new Vector2(transitionRect.x + transitionRect.width - 50.0f,
                                                             transitionRect.y + 5.0f),
                                                 new Vector2(20.0f, 20.0f));
                if (GUI.Button(removeButtonRect, "", (GUIStyle)"RemoveButton"))
                {
                    this.AddPendingNodeTransitionRemoval(node, nodeTransition);
                }

                EditorGUILayout.LabelField("Conditions: ");
                Transition transition = nodeTransition.transition;
                transition.WaitForManualExit = EditorGUILayout.Toggle("WaitForManualExit: ", transition.WaitForManualExit);
                foreach (ITransitionCondition transitionCondition in transition.GetTransitionConditions())
                {
                    EditorGUILayout.BeginVertical(transitionStyle);
                    Type transitionConditionType = transitionCondition.GetType();
                    EditorGUILayout.LabelField(transitionConditionType.Name, EditorStyles.boldLabel);

                    FieldInfo[] fields = TypeUtil.GetInspectorFields(transitionConditionType);
                    foreach (FieldInfo field in fields)
                    {
                        EditorGUILayoutUtil.DynamicField(field, transitionCondition);
                    }
                    EditorGUILayout.EndVertical();
                    EditorGUILayout.Space();
                }

                if (GUILayout.Button("", (GUIStyle)"AddButton", GUILayout.Width(20.0f), GUILayout.Height(20.0f)))
                {
                    GenericMenu nodeDelegateMenu = new GenericMenu();
                    foreach (Type transitionConditionType in TypeUtil <ITransitionCondition> .ImplementationTypes)
                    {
                        nodeDelegateMenu.AddItem(new GUIContent(transitionConditionType.Name), false, this.AddTransitionCondition, Tuple.Create(nodeTransition, transitionConditionType));
                    }
                    nodeDelegateMenu.ShowAsContext();
                }
                EditorGUILayout.EndVertical();
                EditorGUILayout.Space();
            }

            if (GUILayout.Button("", (GUIStyle)"AddButton", GUILayout.Width(20.0f), GUILayout.Height(20.0f)))
            {
                this.MakeTransition(node);
            }
            EditorGUILayout.EndVertical();
            EditorGUILayout.Space();
        }