private void DisplayModifier(float indent, SimulationModifierProvider provider, SimulationObject context)
        {
            string text = string.Empty;

            if (provider.ModifierDescriptor is SingleSimulationModifierDescriptor)
            {
                SingleSimulationModifierDescriptor singleSimulationModifierDescriptor = provider.ModifierDescriptor as SingleSimulationModifierDescriptor;
                text  = text + provider.ModifierDescriptor.Operation.ToString() + " ";
                text += singleSimulationModifierDescriptor.Value;
            }
            else if (provider.ModifierDescriptor is BinarySimulationModifierDescriptor)
            {
                BinarySimulationModifierDescriptor binarySimulationModifierDescriptor = provider.ModifierDescriptor as BinarySimulationModifierDescriptor;
                text += string.Format("{0} ({1} {2} {3})", new object[]
                {
                    provider.ModifierDescriptor.Operation.ToString(),
                    binarySimulationModifierDescriptor.Left,
                    binarySimulationModifierDescriptor.BinaryOperation.ToString(),
                    binarySimulationModifierDescriptor.Right
                });
            }
            else if (provider.ModifierDescriptor is CountSimulationModifierDescriptor)
            {
                CountSimulationModifierDescriptor countSimulationModifierDescriptor = provider.ModifierDescriptor as CountSimulationModifierDescriptor;
                text += string.Format("{0} ({1} {2})", provider.ModifierDescriptor.Operation.ToString(), countSimulationModifierDescriptor.Value, countSimulationModifierDescriptor.XmlSerializableCountPath);
            }
            provider.DisplayContent = this.IndentedToggle(indent, provider.DisplayContent, text, new object[0]);
            if (provider.DisplayContent)
            {
                indent += 20f;
                this.IndentedLabel(indent, "Target:", " <b>{0}</b>", new object[]
                {
                    provider.ModifierDescriptor.TargetPropertyName
                });
                this.IndentedLabel(indent, "Operation:", " <b>{0}</b>", new object[]
                {
                    provider.ModifierDescriptor.Operation.ToString()
                });
                this.IndentedLabel(indent, "Value:", " <b>{0}</b>", new object[]
                {
                    provider.ModifierDescriptor.ComputeValue(context, provider.DescriptorHolder.Context, SimulationPropertyRefreshContext.GetContext(-1)).ToString()
                });
                this.IndentedLabel(indent, "Path:", " <b>{0}</b>", new object[]
                {
                    provider.ModifierDescriptor.Path.ToString()
                });
                this.IndentedLabel(indent, "Source:", " <b>{0} ({1})</b>", new object[]
                {
                    provider.DescriptorHolder.Context.Name,
                    provider.DescriptorHolder.Descriptor.Name
                });
                indent -= 20f;
            }
        }
        protected EffectDescription ParseBinaryModifier(SimulationDescriptor simulationDescriptor, BinarySimulationModifierDescriptor modifierDescriptor, SimulationObject context = null, bool forcePercent = false)
        {
            EffectDescription effectDescription = new EffectDescription();
            bool   round        = false;
            string valueFormat  = string.Empty;
            string empty        = string.Empty;
            float  neutralValue = this.ComputeOperationTypeToken(modifierDescriptor.Operation, ref empty, ref valueFormat, ref round);

            effectDescription.Operator = empty;
            if (forcePercent)
            {
                valueFormat = "#####0%";
            }
            bool   flag   = false;
            string empty2 = string.Empty;
            string empty3 = string.Empty;
            float  num    = this.ComputeOperationTypeToken(modifierDescriptor.BinaryOperation, ref empty3, ref empty2, ref flag);
            object obj    = modifierDescriptor.LeftPrecomputedValue;
            object obj2   = modifierDescriptor.RightPrecomputedValue;

            if (context != null && !modifierDescriptor.IsBindOnSource)
            {
                if (obj is StaticString)
                {
                    obj = context.GetPropertyValue(obj as StaticString);
                }
                if (obj2 is StaticString)
                {
                    obj2 = context.GetPropertyValue(obj2 as StaticString);
                }
            }
            else if (simulationDescriptor.SimulationPropertyDescriptors != null)
            {
                StaticString staticString  = obj as StaticString;
                StaticString staticString2 = obj2 as StaticString;
                for (int i = 0; i < simulationDescriptor.SimulationPropertyDescriptors.Length; i++)
                {
                    if (staticString != null && simulationDescriptor.SimulationPropertyDescriptors[i].Name == staticString && simulationDescriptor.SimulationPropertyDescriptors[i].BaseValue != 0f)
                    {
                        obj          = simulationDescriptor.SimulationPropertyDescriptors[i].BaseValue;
                        staticString = null;
                    }
                    if (staticString2 != null && simulationDescriptor.SimulationPropertyDescriptors[i].Name == staticString2 && simulationDescriptor.SimulationPropertyDescriptors[i].BaseValue != 0f)
                    {
                        obj2          = simulationDescriptor.SimulationPropertyDescriptors[i].BaseValue;
                        staticString2 = null;
                    }
                }
            }
            if (context != null && modifierDescriptor.FindStringValueForParserCalculation)
            {
                if (obj is StaticString)
                {
                    obj = context.GetPropertyValue(obj as StaticString);
                }
                if (obj2 is StaticString)
                {
                    obj2 = context.GetPropertyValue(obj2 as StaticString);
                }
            }
            if (obj is float && obj2 is float)
            {
                float num2 = this.ExecuteOperation(modifierDescriptor.BinaryOperation, (float)obj, (float)obj2);
                if (num2 < 0f && (modifierDescriptor.Operation == SimulationModifierDescriptor.ModifierOperation.Addition || modifierDescriptor.Operation == SimulationModifierDescriptor.ModifierOperation.Percent))
                {
                    effectDescription.Operator = string.Empty;
                }
                effectDescription.ValueFloat  = num2;
                effectDescription.ValueFormat = valueFormat;
                effectDescription.Value       = this.ComputeReadableFloat(num2, round, valueFormat, neutralValue);
            }
            else if (modifierDescriptor.BinaryOperation == SimulationModifierDescriptor.ModifierOperation.Multiplication && (obj is StaticString || obj2 is StaticString))
            {
                if (obj is StaticString && obj2 is float)
                {
                    obj  = obj2;
                    obj2 = modifierDescriptor.LeftPrecomputedValue;
                }
                if (obj2 is StaticString)
                {
                    effectDescription.Per = this.ComputePropertySymbol(obj2 as StaticString);
                }
                if (obj is float)
                {
                    effectDescription.ValueFloat  = (float)obj;
                    effectDescription.ValueFormat = valueFormat;
                    effectDescription.Value       = this.ComputeReadableFloat((float)obj, round, valueFormat, neutralValue);
                }
                else if (obj is StaticString)
                {
                    effectDescription.Value = this.ComputePropertySymbol(obj as StaticString);
                }
            }
            else if (obj is float)
            {
                effectDescription.ValueFloat  = (float)obj;
                effectDescription.ValueFormat = valueFormat;
                effectDescription.Value       = this.ComputeReadableFloat((float)obj, round, valueFormat, neutralValue);
            }
            else
            {
                effectDescription.Value = string.Concat(new string[]
                {
                    obj.ToString(),
                    " ",
                    empty3,
                    " ",
                    obj2.ToString()
                });
            }
            if (string.IsNullOrEmpty(effectDescription.Value))
            {
                return(null);
            }
            return(effectDescription);
        }