public static bool GetIsListCsv(this CustomVariable customVariable)
        {
            if (customVariable.GetIsCsv())
            {
                string             fullFileName = FacadeContainer.Self.ProjectValues.ContentDirectory + customVariable.Type;
                ReferencedFileSave foundRfs     = ObjectFinder.Self.GetReferencedFileSaveFromFile(fullFileName);

                if (foundRfs != null)
                {
                    return(foundRfs.CreatesDictionary == false);
                }
            }

            return(false);
        }
        private static void HandleIsSharedVariableSet(CustomVariable customVariable, object oldValue)
        {
            // July 11, 2011
            // We used to loop
            // through all derived
            // elements and set all
            // variables with the same
            // name to be IsShared as well,
            // however, this is bad because now
            // we discourage same-named variables
            // that are not SetByDerived. 
            //if (EditorLogic.CurrentEntitySave != null)
            //{
            //    List<EntitySave> derivedEntities = ObjectFinder.Self.GetAllEntitiesThatInheritFrom(
            //        EditorLogic.CurrentEntitySave.Name);
            //    foreach (EntitySave entity in derivedEntities)
            //    {
            //        foreach (CustomVariable cv in entity.CustomVariables)
            //        {
            //            if (cv.Name == customVariable.Name)
            //            {
            //                cv.IsShared = customVariable.IsShared;
            //            }
            //        }
            //    }
            //}
            bool didErrorOccur = false;
            if (customVariable.SetByDerived && customVariable.IsShared)
            {
                MessageBox.Show("Variables which are SetByDerived cannot be IsShared");
                didErrorOccur = true;
            }

            if (didErrorOccur)
            {
                customVariable.IsShared = (bool)oldValue;
            }

            if (!didErrorOccur)
            {

                if (customVariable.IsShared && customVariable.GetIsCsv())
                {
                    MessageBox.Show("Shared CSV variables are not assigned until either an instance of this object is created, or until LoadStaticContent is called.  Until then, the variable will equal null");

                }
            }
        }
        private void DefaultValueIncludeActivity(CustomVariable instance)
        {

            bool handled = false;

            if (instance.GetIsCsv())
            {
                if (instance.GetIsListCsv())
                {
                    handled = true;
                    var member = IncludeMember("Set CreatesDictionary to true to assign value", typeof(string),
                        (object sender, MemberChangeArgs args) => { },
                        () => { return null; },


                        null,
                        // Let's put this in the variables list
                        new Attribute[] { new CategoryAttribute("\t") });
                    member.IsReadOnly = true;
                }
            }


            if (!handled)
            {
                Type typeToPass = instance.GetRuntimeType();
                if (typeToPass == null)
                {
                    typeToPass = typeof(string);
                }

                var typeConverter =
                    instance.GetTypeConverter(CurrentElement);

                IncludeMember(
                    "DefaultValue",
                    typeToPass,
                    OnMemberChanged,
                    instance.GetValue,
                    typeConverter,
                    new Attribute[] { new CategoryAttribute("\t") });
            }
            else
            {
                ExcludeMember("DefaultValue");
            }
        }
Example #4
0
        /// <summary>
        /// This method populates the mCustomVariables list with default valued variables.  These can later get set in SetCustomVariable, but they need to exist so that 
        /// plugins like the script parser know whether something is a custom variable or not.
        /// </summary>
        /// <param name="cv">The variable to evaluate and add if it is a custom variable.</param>
        private void CreateCustomVariableContainer(CustomVariable cv)
        {
            bool isCustomVariable = true;

            if(!string.IsNullOrEmpty(cv.SourceObject))
            {
                isCustomVariable = false;
            }

            if (isCustomVariable)
            {

                Type positionedObjectType = typeof(PositionedObject);

                PropertyInfo property = positionedObjectType.GetProperty(cv.Name);
                FieldInfo field = positionedObjectType.GetField(cv.Name);
                if (property != null || field != null)
                {
                    isCustomVariable = false;
                }
            }

            if (isCustomVariable)
            {
                EntitySave baseEntitySave = ObjectFinder.Self.GetEntitySave(this.AssociatedIElement.BaseElement);

                if (baseEntitySave != null && baseEntitySave.GetCustomVariable(cv.Name) != null)
                {
                    isCustomVariable = false;
                }
            }

            if (isCustomVariable)
            {
                object defaultValue = null;
                if (cv.GetIsFile())
                {
                    defaultValue = null;
                }
                    
                else if (cv.GetIsCsv())
                {
                    defaultValue = null;
                }
                else if (cv.GetIsVariableState())
                {
                    defaultValue = null;
                }
                else
                {
                    try
                    {
                        defaultValue = TypeManager.GetDefaultForTypeAsType(cv.Type);
                    }
                    catch
                    {
                        throw new Exception("Could not get the default value for variable " + cv);
                    }
                }

                mCustomVariables.Add(new PropertyValuePair(cv.Name, defaultValue));

            }
        }
Example #5
0
        public static TypeConverter GetTypeConverter(this CustomVariable customVariable, IElement containingElement, StateSave stateSave, FlatRedBall.Glue.Plugins.ExportedInterfaces.IGlueState glueState)
        {
            TypeConverter typeConverter = null;

            if (customVariable.GetIsVariableState())
            {
                typeConverter = new AvailableStates(
                    FacadeContainer.Self.GlueState.CurrentNamedObjectSave,
                    FacadeContainer.Self.GlueState.CurrentElement,
                    FacadeContainer.Self.GlueState.CurrentCustomVariable,
                    FacadeContainer.Self.GlueState.CurrentStateSave
                    );
            }
            else
            {
                Type runtimeType = customVariable.GetRuntimeType();

                if (runtimeType != null)
                {
                    if (runtimeType.IsEnum)
                    {
                        typeConverter = new EnumConverter(runtimeType);
                    }
                    else if (runtimeType == typeof(Color))
                    {
                        return(new AvailableColorTypeConverter());
                    }

                    else if ((runtimeType == typeof(string) || runtimeType == typeof(AnimationChainList)) &&
                             customVariable.SourceObjectProperty == "CurrentChainName")
                    {
                        typeConverter = new AvailableAnimationChainsStringConverter(customVariable, stateSave);
                    }
                    else if (customVariable.GetIsFile())
                    {
                        AvailableFileStringConverter converter = new AvailableFileStringConverter(containingElement);
                        converter.QualifiedRuntimeTypeName = runtimeType.FullName;
                        converter.ShowNewFileOption        = false;
                        converter.RemovePathAndExtension   = true;
                        typeConverter = converter;
                    }
                }
                else if (customVariable.GetIsCsv())
                {
                    if (FacadeContainer.Self.ProjectValues == null)
                    {
                        throw new NullReferenceException("The ProjectValues property in FAcadeContainer.Self.ProjectValues must be set before trying to get the CSV type converter for the variable " + customVariable.ToString());
                    }

                    ReferencedFileSave rfs = ObjectFinder.Self.GetAllReferencedFiles().FirstOrDefault(item =>
                                                                                                      item.IsCsvOrTreatedAsCsv && item.GetTypeForCsvFile() == customVariable.Type);

                    AvailableSpreadsheetValueTypeConverter converter = null;
                    if (rfs != null)
                    {
                        converter = new AvailableSpreadsheetValueTypeConverter(
                            FacadeContainer.Self.ProjectValues.ContentDirectory + rfs.Name, containingElement);
                    }
                    else
                    {
                        converter = new AvailableSpreadsheetValueTypeConverter(
                            FacadeContainer.Self.ProjectValues.ContentDirectory + customVariable.Type, containingElement);
                    }
                    converter.ShouldAppendFileName = true;

                    typeConverter = converter;
                }
                else if (customVariable.GetIsFile())
                {
                    // If we got here, that means that the
                    // CustomVariable is a file, but it doesn't
                    // have a System.Type, so it only knows its runtime
                    // type;
                    AvailableFileStringConverter converter = new AvailableFileStringConverter(containingElement);
                    converter.UnqualifiedRuntimeTypeName = customVariable.Type;
                    converter.ShowNewFileOption          = false;
                    converter.RemovePathAndExtension     = true;
                    typeConverter = converter;
                }
            }


            return(typeConverter);
        }
        public static ICodeBlock AppendAssignmentForCustomVariableInElement(ICodeBlock codeBlock, CustomVariable customVariable, IElement saveObject)
        {
            bool hasBase = !string.IsNullOrEmpty(((INamedObjectContainer)saveObject).BaseObject);

            // Victor Chelaru
            // December 17, 2014
            // We used to not go into
            // this if statement if SetByDerived
            // was true, but actually since variables
            // are set bottom-up, there's really no reason
            // to set it only on the derived, because the base
            // will always get assigned first, then the derived
            // can override it.
            //if (!customVariable.SetByDerived && 
            if (customVariable.DefaultValue != null && // if it's null the user doesn't want to change what is set in the file or in the source object
                !customVariable.IsShared && // no need to handle statics here because they're always defined in class scope
                !IsVariableTunnelingToDisabledObject(customVariable, saveObject)
                )
            {


                string variableToAssign = "";

                CustomVariable variableConsideringDefinedByBase = customVariable.GetDefiningCustomVariable();

                IElement containerOfState = null;

                // This can be null
                // if the user takes
                // an Element that inherits
                // from another and has variables
                // from it, then changes the Element
                // to no longer inherit.

                if (variableConsideringDefinedByBase != null)
                {

                    containerOfState = BaseElementTreeNode.GetElementIfCustomVariableIsVariableState(variableConsideringDefinedByBase, saveObject);

                    if (containerOfState == null)
                    {
                        variableToAssign =
                            CodeParser.ParseObjectValue(customVariable.DefaultValue);
                        NamedObjectSave namedObject = saveObject.GetNamedObject(customVariable.SourceObject);


                        if (customVariable.GetIsFile())
                        {
                            variableToAssign = variableToAssign.Replace("\"", "").Replace("-", "_");

                            if (variableToAssign == "<NONE>")
                            {
                                variableToAssign = "null";
                            }
                        }
                        else if (customVariable != null && customVariable.GetIsCsv())
                        {
                            if (ShouldAssignToCsv(customVariable, variableToAssign))
                            {
                                variableToAssign = GetAssignmentToCsvItem(customVariable, saveObject, variableToAssign);
                            }
                            else
                            {
                                variableToAssign = null;
                            }
                        }
                        else if (customVariable.Type == "Color")
                        {
                            variableToAssign = "Color." + variableToAssign.Replace("\"", "");

                        }
                        else if (customVariable.Type != "string" && variableToAssign == "\"\"")
                        {
                            variableToAssign = null;
                        }
                        else
                        {

                            //Not sure why this wasn't localizing variables but it caused a problem with 
                            //variables that tunnel in to a Text's DisplayText not being localized
                            //finish here

                            // Special Case:
                            // We don't want to
                            // set Visible on NOS's
                            // which are added/removed
                            // when Visible is set on them:
                            // Update March 7, 2014 
                            // We do want to set it because if we don't,
                            // then the checks inside the Visible property
                            // don't properly detect that they've been changed.
                            // Therefore, we're going to set it on the underlying
                            // object 
                            bool shouldSetUnderlyingValue = namedObject != null && namedObject.RemoveFromManagersWhenInvisible &&
                                customVariable.SourceObjectProperty == "Visible";

                            if (shouldSetUnderlyingValue)
                            {
                                // Don't change the variable to assign
                            }
                            else
                            {
                                variableToAssign = CodeWriter.MakeLocalizedIfNecessary(namedObject, customVariable.SourceObjectProperty,
                                    customVariable.DefaultValue, variableToAssign, null);
                                variableToAssign = variableToAssign.Replace("+", ".");
                            }
                        }
                    }
                    else
                    {
                        string valueAsString = (string)customVariable.DefaultValue;

                        if (!string.IsNullOrEmpty(valueAsString))
                        {
                            variableToAssign = StateCodeGenerator.FullyQualifyStateValue(containerOfState, (string)customVariable.DefaultValue, customVariable.Type);
                        }
                    }

                    if (!string.IsNullOrEmpty(variableToAssign))
                    {
                        string relativeVersionOfProperty = InstructionManager.GetRelativeForAbsolute(customVariable.Name);
                        if (!string.IsNullOrEmpty(relativeVersionOfProperty))
                        {
                            codeBlock = codeBlock.If("Parent == null");
                        }

                        NamedObjectSave namedObject = saveObject.GetNamedObject(customVariable.SourceObject);

                        bool shouldSetUnderlyingValue = namedObject != null && namedObject.RemoveFromManagersWhenInvisible &&
                            customVariable.SourceObjectProperty == "Visible";

                        if (namedObject != null)
                        {
                            NamedObjectSaveCodeGenerator.AddIfConditionalSymbolIfNecesssary(codeBlock, namedObject);
                        }

                        if (shouldSetUnderlyingValue)
                        {
                            codeBlock.Line(StringHelper.SpaceStrings(namedObject.InstanceName + "." + customVariable.SourceObjectProperty + " = ", variableToAssign + ";"));

                        }
                        else
                        {
                            codeBlock.Line(StringHelper.SpaceStrings(customVariable.Name, "=", variableToAssign + ";"));

                        }


                        if (!string.IsNullOrEmpty(relativeVersionOfProperty))
                        {
                            if (customVariable.Name == "Z")
                            {
                                codeBlock = codeBlock.End().ElseIf("Parent is FlatRedBall.Camera");
                                codeBlock.Line(relativeVersionOfProperty + " = " + variableToAssign + " - 40.0f;");
                            }
                            codeBlock = codeBlock.End().Else();
                            codeBlock.Line(relativeVersionOfProperty + " = " + variableToAssign + ";");
                            codeBlock = codeBlock.End();
                        }
                        

                        if (namedObject != null)
                        {
                            NamedObjectSaveCodeGenerator.AddEndIfIfNecessary(codeBlock, namedObject);
                        }




                    }
                }
            }

            return codeBlock;
        }
        static bool ReferencesCsvFromGlobalContent(CustomVariable customVariable)
        {
            if (customVariable.GetIsCsv() == false)
            {
                return false;
            }
            else
            {

                return customVariable.Type.StartsWith("GlobalContent/");
            }
        }