public void GenerateBlackBoard(GraphData currentData)
        {
            Blackboard blackboard = new Blackboard(this)
            {
                scrollable = true,
            };

            blackboard.AddToClassList("grayboard");
            //blackboard.Add(new BlackboardSection { title="Exposed Properties" });
            blackboard.addItemRequested = _blackboard => { };
            blackboard.SetPosition(new Rect(10, 30, 200, 200));
            this.Add(blackboard);

            /* Start: how to add to blackboard */

            /*var container = new VisualElement();
             * var blackboardField = new BlackboardField {
             *  text = "Sample_Property",
             *  typeText = "String Property"
             * };
             * var blackboardFieldValue = new TextField("Value") {
             *  value = "Value"
             * };
             * blackboardFieldValue.RegisterValueChangedCallback(evt => {
             *  Debug.Log(evt.newValue);
             * });
             * var blackBoardRow = new BlackboardRow(blackboardField, blackboardFieldValue);
             * container.Add(blackboardField);
             * container.Add(blackBoardRow);
             * blackboard.Add(container);*/
            /* End: how to add to blackboard */
            if (currentData != null)
            {
                blackboard.title    = currentData.name;
                blackboard.subTitle = "Properties";
                FieldInfo[] fields = currentData.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance);
                //Debug.Log(currentData.GetType());
                for (int i = 0; i < fields.Length; i++)
                {
                    FieldInfo fieldInfo = fields[i];
                    if (!hiddenFields.Contains(fieldInfo.Name))
                    {
                        //Debug.Log(fields[i].ToString());
                        string            fName     = SplitCamelCase(fieldInfo.Name);
                        var               container = new VisualElement();
                        BlackboardSection bbField;
                        BlackboardRow     bbRow;
                        switch (fieldInfo.FieldType.ToString())
                        {
                        case "System.String":
                            bbField = new BlackboardSection {
                                title = fName
                            };
                            container.Add(bbField);
                            TextField bbfValue = new TextField()
                            {
                                value     = fieldInfo.GetValue(currentData) as string,
                                multiline = true
                            };
                            bbfValue.RegisterValueChangedCallback(evt => {
                                fieldInfo.SetValue(currentData, evt.newValue);
                                //Debug.Log(evt.newValue);
                            });
                            bbRow = new BlackboardRow(bbField, bbfValue);
                            container.Add(bbRow);
                            break;

                        case "System.Int32":
                            bbField = new BlackboardSection {
                                title = fName
                            };
                            container.Add(bbField);
                            IntegerField bbfIntValue = new IntegerField()
                            {
                                value = (int)fieldInfo.GetValue(currentData)
                            };
                            bbfIntValue.RegisterValueChangedCallback(evt => {
                                fieldInfo.SetValue(currentData, evt.newValue);
                                //Debug.Log(evt.newValue);
                            });
                            bbRow = new BlackboardRow(bbField, bbfIntValue);
                            container.Add(bbRow);
                            break;

                        case "System.Single":
                            bbField = new BlackboardSection {
                                title = fName
                            };
                            container.Add(bbField);
                            FloatField bbfFloatValue = new FloatField()
                            {
                                value = (float)fieldInfo.GetValue(currentData)
                            };
                            bbfFloatValue.RegisterValueChangedCallback(evt => {
                                fieldInfo.SetValue(currentData, evt.newValue);
                                //Debug.Log(evt.newValue);
                            });
                            bbRow = new BlackboardRow(bbField, bbfFloatValue);
                            container.Add(bbRow);
                            break;

                        case "UnityEngine.Vector2":
                            bbField = new BlackboardSection {
                                title = fName
                            };
                            container.Add(bbField);
                            Vector2Field bbfVector2Value = new Vector2Field()
                            {
                                value = (Vector2)fieldInfo.GetValue(currentData)
                            };
                            bbfVector2Value.RegisterValueChangedCallback(evt => {
                                fieldInfo.SetValue(currentData, evt.newValue);
                                //Debug.Log(evt.newValue);
                            });
                            bbRow = new BlackboardRow(bbField, bbfVector2Value);
                            container.Add(bbRow);
                            break;

                        case "UnityEngine.Vector3":
                            bbField = new BlackboardSection {
                                title = fName
                            };
                            container.Add(bbField);
                            Vector3Field bbfVector3Value = new Vector3Field()
                            {
                                value = (Vector3)fieldInfo.GetValue(currentData)
                            };
                            bbfVector3Value.RegisterValueChangedCallback(evt => {
                                fieldInfo.SetValue(currentData, evt.newValue);
                                //Debug.Log(evt.newValue);
                            });
                            bbRow = new BlackboardRow(bbField, bbfVector3Value);
                            container.Add(bbRow);
                            break;

                        case "UnityEngine.AnimationCurve":
                            bbField = new BlackboardSection {
                                title = fName
                            };
                            container.Add(bbField);
                            CurveField bbfAnimationCurveValue = new CurveField()
                            {
                                value = (UnityEngine.AnimationCurve)fieldInfo.GetValue(currentData)
                            };
                            bbfAnimationCurveValue.RegisterValueChangedCallback(evt => {
                                fieldInfo.SetValue(currentData, evt.newValue);
                                //Debug.Log(evt.newValue);
                            });
                            bbRow = new BlackboardRow(bbField, bbfAnimationCurveValue);
                            container.Add(bbRow);
                            break;

                        default:
                            if (fieldInfo.FieldType.ToString().IndexOf("UnityEngine.") == 0)
                            {
                                bbField = new BlackboardSection {
                                    title = fName
                                };
                                container.Add(bbField);
                                ObjectField bbfObjectValue = new ObjectField()
                                {
                                    value             = (UnityEngine.Object)fieldInfo.GetValue(currentData),
                                    allowSceneObjects = false,
                                    objectType        = fieldInfo.FieldType
                                };
                                bbfObjectValue.RegisterValueChangedCallback(evt => {
                                    fieldInfo.SetValue(currentData, evt.newValue);
                                    //Debug.Log(evt.newValue);
                                });
                                bbRow = new BlackboardRow(bbField, bbfObjectValue);
                                container.Add(bbRow);
                            }
                            else
                            {
                                bbField = new BlackboardSection {
                                    title = fName
                                };
                                container.Add(bbField);
                                EnumField bbfEnumValue = new EnumField((System.Enum)fieldInfo.GetValue(currentData))
                                {
                                    value = (System.Enum)fieldInfo.GetValue(currentData)
                                };
                                bbfEnumValue.RegisterValueChangedCallback(evt => {
                                    fieldInfo.SetValue(currentData, evt.newValue);
                                    //Debug.Log(evt.newValue);
                                });
                                bbRow = new BlackboardRow(bbField, bbfEnumValue);
                                container.Add(bbRow);
                            }
                            break;
                        }

                        blackboard.Add(container);
                    }
                }
            }
            // Get the properties of 'Type' class object.
        }