private TypeConverter HandleGetTypeConverter(IElement container, NamedObjectSave instance, TypedMemberBase typedMember) { Type memberType = typedMember.MemberType; string memberName = typedMember.MemberName; TypeConverter typeConverter = null; // If the NOS references a FRB type, we need to adjust the type appropriately bool wasTypeModified = false; Type oldType = memberType; bool handled = false; if (instance.SourceType == SourceType.FlatRedBallType) { Type type = TypeManager.GetTypeFromString(instance.SourceClassType); if (type == typeof(Sprite) && memberName == "CurrentChainName") { // special case handling for CurrentChainName typeConverter = new AvailableAnimationChainsStringConverter(container, instance); handled = true; } // Victor Chelaru // October 26, 2015: // I don't think we need this anymore - we should just let the CSVs do their job // defining variables and not rely on reflection. That way plugins will be able to // handle everything without relying on reflection //if (!handled && type != null) //{ // FieldInfo fieldInfo = type.GetField(memberName); // if (fieldInfo != null) // { // memberType = fieldInfo.FieldType; // wasTypeModified = true; // } // if (wasTypeModified == false) // { // PropertyInfo propertyInfo = type.GetProperty(memberName); // if (propertyInfo != null) // { // memberType = propertyInfo.PropertyType; // wasTypeModified = true; // } // } //} } else if (instance.SourceType == SourceType.File) { if (instance.ClassType == "Sprite" && memberName == "CurrentChainName") { // special case handling for CurrentChainName typeConverter = new AvailableAnimationChainsStringConverter(container, instance); handled = true; } } if (!handled) { if (instance.DoesMemberNeedToBeSetByContainer(memberName)) { var availableNamedObjectsAndFiles = new AvailableNamedObjectsAndFiles(container); availableNamedObjectsAndFiles.NamedObjectTypeRestriction = typedMember.MemberType.FullName; typeConverter = availableNamedObjectsAndFiles; } else if (memberType.IsEnum) { typeConverter = new EnumConverter(memberType); } else if (memberType == typeof(Microsoft.Xna.Framework.Color)) { typeConverter = new AvailableColorTypeConverter(); memberType = typeof(string); } else if (IsTypeFile(typedMember)) { AvailableFileStringConverter availableFileStringConverter = new AvailableFileStringConverter(container); availableFileStringConverter.QualifiedRuntimeTypeName = memberType.FullName; if (!string.IsNullOrEmpty(typedMember.CustomTypeName)) { availableFileStringConverter.QualifiedRuntimeTypeName = typedMember.CustomTypeName; } availableFileStringConverter.RemovePathAndExtension = true; typeConverter = availableFileStringConverter; memberType = typeof(string); } else if (instance.SourceType == SourceType.Entity && !string.IsNullOrEmpty(instance.SourceClassType)) { EntitySave entity = ObjectFinder.Self.GetEntitySave(instance.SourceClassType); if (entity != null) { CustomVariable customVariable = entity.GetCustomVariable(memberName); if (customVariable != null) { typeConverter = customVariable.GetTypeConverter(entity); } } } } //else if (this.SourceType == SaveClasses.SourceType.FlatRedBallType && // typedMember != null && typedMember.MemberType != null) //{ //} if (wasTypeModified) { memberType = oldType; } return(typeConverter); }
private TypeConverter HandleGetTypeConverter(IElement container, NamedObjectSave instance, TypedMemberBase typedMember) { Type memberType = typedMember.MemberType; string memberName = typedMember.MemberName; TypeConverter typeConverter = null; // If the NOS references a FRB type, we need to adjust the type appropriately bool wasTypeModified = false; Type oldType = memberType; bool handled = false; if (instance.SourceType == SourceType.FlatRedBallType) { Type type = TypeManager.GetTypeFromString(instance.SourceClassType); if (type == typeof(Sprite) && memberName == "CurrentChainName") { // special case handling for CurrentChainName typeConverter = new AvailableAnimationChainsStringConverter(container, instance); handled = true; } else if (typedMember.MemberType?.Name == "Sprite") { var nosTypeConverter = new AvailableNamedObjectsAndFiles(container); nosTypeConverter.NamedObjectTypeRestriction = "FlatRedBall.Sprite"; typeConverter = nosTypeConverter; handled = true; } } else if (instance.SourceType == SourceType.File) { if (instance.ClassType == "Sprite" && memberName == "CurrentChainName") { // special case handling for CurrentChainName typeConverter = new AvailableAnimationChainsStringConverter(container, instance); handled = true; } } if (!handled) { if (instance.DoesMemberNeedToBeSetByContainer(memberName)) { var availableNamedObjectsAndFiles = new AvailableNamedObjectsAndFiles(container); availableNamedObjectsAndFiles.NamedObjectTypeRestriction = typedMember.MemberType.FullName; typeConverter = availableNamedObjectsAndFiles; } else if (memberType.IsEnum) { typeConverter = new EnumConverter(memberType); } else if (memberType == typeof(Microsoft.Xna.Framework.Color)) { typeConverter = new AvailableColorTypeConverter(); memberType = typeof(string); } else if (IsTypeFile(typedMember)) { AvailableFileStringConverter availableFileStringConverter = new AvailableFileStringConverter(container); availableFileStringConverter.QualifiedRuntimeTypeName = memberType.FullName; if (!string.IsNullOrEmpty(typedMember.CustomTypeName)) { availableFileStringConverter.QualifiedRuntimeTypeName = typedMember.CustomTypeName; } availableFileStringConverter.RemovePathAndExtension = true; typeConverter = availableFileStringConverter; memberType = typeof(string); } else if (instance.SourceType == SourceType.Entity && !string.IsNullOrEmpty(instance.SourceClassType)) { EntitySave entity = ObjectFinder.Self.GetEntitySave(instance.SourceClassType); if (entity != null) { CustomVariable customVariable = entity.GetCustomVariable(memberName); if (customVariable != null) { typeConverter = customVariable.GetTypeConverter(entity); } } } } //else if (this.SourceType == SaveClasses.SourceType.FlatRedBallType && // typedMember != null && typedMember.MemberType != null) //{ //} if (wasTypeModified) { memberType = oldType; } return(typeConverter); }
private static object GetDefaultValueFor(CustomVariable customVariable, IElement element) { object valueToReturn = null; // Lets handle all file types here: //if (customVariable.Type == "Texture2D") if (customVariable.GetIsFile()) { // If we don't return // null then this will // return the name of the // file (like "redball.bmp"). // This will screw up code generation // because texture variables can only be // set to Texture2D instances, not to the // name of the image. valueToReturn = null; } else { try { if (!string.IsNullOrEmpty(customVariable.SourceObject) && !string.IsNullOrEmpty(customVariable.SourceObjectProperty)) { NamedObjectSave nos = element.GetNamedObjectRecursively(customVariable.SourceObject); if (nos != null) { object defaultValue = GetDefaultValueFor(nos, customVariable.SourceObjectProperty, customVariable.OverridingPropertyType); valueToReturn = defaultValue; } } else if (customVariable.Name == "Visible" && element is EntitySave && ((EntitySave)element).ImplementsIVisible) { // This shouldn't be true, we don't want to set the value // because we don't want to kick off events //valueToReturn = true; valueToReturn = null; } else if (customVariable.Name == "Enabled" && element is EntitySave && ((EntitySave)element).ImplementsIWindow) { // This shouldn't be true, we don't want to set the value // because we don't want to kick off events //valueToReturn = true; valueToReturn = null; } else { valueToReturn = GetDefaultValueForPropertyInType(customVariable.Name, "PositionedObject"); } } catch { // do nothing. } if (valueToReturn is Microsoft.Xna.Framework.Color) { string standardName = AvailableColorTypeConverter.GetStandardColorNameFrom((Color)valueToReturn); if (string.IsNullOrEmpty(standardName)) { return("Red"); } else { return(standardName); } } } return(valueToReturn); }