private void ShowWizard <T>(Rect rect, ExtendedEvent.Member member, string title, float width, float height) where T : FieldWizard
 {
     if (GUI.Button(rect, "..."))
     {
         var wiz = ScriptableWizard.DisplayWizard <T>(title, "Close");
         wiz.Member  = member;
         wiz.minSize = new Vector2(width, height);
         wiz.maxSize = new Vector2(width, height);
     }
 }
    private void DrawMethod(ExtendedEvent.Member method, Rect rect)
    {
        if (method.Parameters.Count == 1)
        {
            var parameter = method.Parameters[0];
            rect.yMax += 3;
            rect.yMin += 3;

            switch (parameter.TypeName)
            {
            case "String":
                parameter.StringValue = EditorGUI.TextField(rect, parameter.StringValue);
                break;

            case "Int32":
                parameter.IntValue = EditorGUI.IntField(rect, parameter.IntValue);
                break;

            case "Int64":
                parameter.LongValue = EditorGUI.LongField(rect, parameter.LongValue);
                break;

            case "Single":
                parameter.FloatValue = EditorGUI.FloatField(rect, parameter.FloatValue);
                break;

            case "Double":
                parameter.DoubleValue = EditorGUI.DoubleField(rect, parameter.DoubleValue);
                break;

            case "Boolean":
                parameter.BoolValue = EditorGUI.Toggle(rect, parameter.BoolValue);
                break;

            case "Vector2":
                parameter.Vector2Value = EditorGUI.Vector2Field(rect, "", parameter.Vector2Value);
                break;

            case "Vector3":
                parameter.Vector3Value = EditorGUI.Vector3Field(rect, "", parameter.Vector3Value);
                break;

            case "Vector4":
                rect.y -= 16f;
                parameter.Vector4Value = EditorGUI.Vector4Field(rect, "", parameter.Vector4Value);
                break;

            case "Quaternion":
                rect.y -= 16f;
                var v4 = new Vector4(parameter.QuaternionValue.x, parameter.QuaternionValue.y, parameter.QuaternionValue.z, parameter.QuaternionValue.w);
                v4 = EditorGUI.Vector4Field(rect, "", v4);
                parameter.QuaternionValue = new Quaternion(v4.x, v4.y, v4.z, v4.w);
                break;

            case "Bounds":
                ShowWizard <BoundsWizard>(rect, parameter, "Bounds Editor", 405, 130);
                break;

            case "Rect":
                ShowWizard <RectWizard>(rect, parameter, "Rect Editor", 350, 130);
                break;

            case "Matrix4x4":
                ShowWizard <MatrixWizard>(rect, parameter, "Matrix Editor", 375, 175);
                break;

            case "AnimationCurve":
                parameter.AnimationCurveValue = EditorGUI.CurveField(rect, parameter.AnimationCurveValue);
                break;

            case "Sprite":
                parameter.SpriteValue = (Sprite)EditorGUI.ObjectField(rect, parameter.SpriteValue, parameter.Type, true);
                break;

            case "Object":
            case "GameObject":
                parameter.ObjectValue = EditorGUI.ObjectField(rect, parameter.ObjectValue, parameter.Type, true);
                break;

            case "Enum":
                var enumValue = (Enum)Enum.Parse(parameter.Type, parameter.EnumNames[parameter.EnumValue]);
                enumValue = EditorGUI.EnumPopup(rect, enumValue);
                for (int i = 0; i < parameter.EnumNames.Length; i++)
                {
                    if (parameter.EnumNames[i] == enumValue.ToString())
                    {
                        parameter.EnumValue = i;
                        break;
                    }
                }
                break;

            default:
                EditorGUI.HelpBox(rect, string.Format("The type {0} is not supported", parameter.RepresentableType), MessageType.Warning);
                break;
            }
        }
        else if (method.Parameters.Count > 1)
        {
            rect.yMax += 3;
            rect.yMin += 3;

            if (GUI.Button(rect, "..."))
            {
                var mwiz = ScriptableWizard.DisplayWizard <MethodWizard>("Parameter Editor", "Close");
                mwiz.Method  = method;
                mwiz.minSize = new Vector2(400, 200);
            }
        }
    }
    private void DrawMember(ExtendedEvent.Member member, Rect rect)
    {
        rect.yMax += 3;
        rect.yMin += 3;

        switch (member.TypeName)
        {
        case "String":
            member.StringValue = EditorGUI.TextField(rect, member.StringValue);
            break;

        case "Int32":
            member.IntValue = EditorGUI.IntField(rect, member.IntValue);
            break;

        case "Int64":
            member.LongValue = EditorGUI.LongField(rect, member.LongValue);
            break;

        case "Single":
            member.FloatValue = EditorGUI.FloatField(rect, member.FloatValue);
            break;

        case "Double":
            member.DoubleValue = EditorGUI.DoubleField(rect, member.DoubleValue);
            break;

        case "Boolean":
            member.BoolValue = EditorGUI.Toggle(rect, member.BoolValue);
            break;

        case "Vector2":
            member.Vector2Value = EditorGUI.Vector2Field(rect, "", member.Vector2Value);
            break;

        case "Vector3":
            member.Vector3Value = EditorGUI.Vector3Field(rect, "", member.Vector3Value);
            break;

        case "Vector4":
            rect.y -= 16f;
            member.Vector4Value = EditorGUI.Vector4Field(rect, "", member.Vector4Value);
            break;

        case "Quaternion":
            rect.y -= 16f;
            var v4 = new Vector4(member.QuaternionValue.x, member.QuaternionValue.y, member.QuaternionValue.z, member.QuaternionValue.w);
            v4 = EditorGUI.Vector4Field(rect, "", v4);
            member.QuaternionValue = new Quaternion(v4.x, v4.y, v4.z, v4.w);
            break;

        case "Bounds":
            ShowWizard <BoundsWizard>(rect, member, "Bounds Editor", 405, 130);
            break;

        case "Rect":
            ShowWizard <RectWizard>(rect, member, "Rect Editor", 350, 130);
            break;

        case "Matrix4x4":
            ShowWizard <MatrixWizard>(rect, member, "Matrix Editor", 375, 175);
            break;

        case "AnimationCurve":
            member.AnimationCurveValue = EditorGUI.CurveField(rect, member.AnimationCurveValue);
            break;

        case "Object":
        case "GameObject":
            member.ObjectValue = EditorGUI.ObjectField(rect, member.ObjectValue, member.Type, true);
            break;

        case "Enum":
            var enumValue = (Enum)Enum.Parse(member.Type, member.EnumNames[member.EnumValue]);
            enumValue = EditorGUI.EnumPopup(rect, enumValue);
            for (int i = 0; i < member.EnumNames.Length; i++)
            {
                if (member.EnumNames[i] == enumValue.ToString())
                {
                    member.EnumValue = i;
                    break;
                }
            }
            break;

        default:
            EditorGUI.HelpBox(rect, string.Format("The type {0} is not supported", member.RepresentableType), MessageType.Warning);
            break;
        }
    }