Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / Orcas / QFE / wpf / src / Framework / System / Windows / Markup / Primitives / ExtensionSimplifierMarkupObject.cs / 1 / ExtensionSimplifierMarkupObject.cs
//------------------------------------------------------------------------ // // Microsoft Windows Client Platform // Copyright (C) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------- using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Text; using System.Windows.Markup; using System.Globalization; namespace System.Windows.Markup.Primitives { ////// Utility class use as a base class for classes wrap another /// instance by delegating MarkupItem implementation to that /// instance. /// internal class MarkupObjectWrapper : MarkupObject { MarkupObject _baseObject; public MarkupObjectWrapper(MarkupObject baseObject) { _baseObject = baseObject; } public override void AssignRootContext(IValueSerializerContext context) { _baseObject.AssignRootContext(context); } public override AttributeCollection Attributes { get { return _baseObject.Attributes; } } public override Type ObjectType { get { return _baseObject.ObjectType; } } public override object Instance { get { return _baseObject.Instance; } } internal override IEnumerableGetProperties(bool mapToConstructorArgs) { return _baseObject.GetProperties(mapToConstructorArgs); } } /// /// Utility class use as a base class for classes wrap another /// instance by delegating MarkupProperty implementation to that /// instance. /// internal class MarkupPropertyWrapper : MarkupProperty { MarkupProperty _baseProperty; /* protected MarkupProperty BaseProperty { get { return _baseProperty; } } */ public MarkupPropertyWrapper(MarkupProperty baseProperty) { _baseProperty = baseProperty; } public override AttributeCollection Attributes { get { return _baseProperty.Attributes; } } public override IEnumerableItems { get { return _baseProperty.Items; } } public override string Name { get { return _baseProperty.Name; } } public override Type PropertyType { get { return _baseProperty.PropertyType; } } public override string StringValue { get { return _baseProperty.StringValue; } } public override IEnumerable TypeReferences { get { return _baseProperty.TypeReferences; } } public override object Value { get { return _baseProperty.Value; } } public override DependencyProperty DependencyProperty { get { return _baseProperty.DependencyProperty; } } public override bool IsAttached { get { return _baseProperty.IsAttached; } } public override bool IsComposite { get { return _baseProperty.IsComposite; } } public override bool IsConstructorArgument { get { return _baseProperty.IsConstructorArgument; } } public override bool IsKey { get { return _baseProperty.IsKey; } } public override bool IsValueAsString { get { return _baseProperty.IsValueAsString; } } public override bool IsContent { get { return _baseProperty.IsContent; } } public override PropertyDescriptor PropertyDescriptor { get { return _baseProperty.PropertyDescriptor; } } /// /// Checks to see that each markup object is of a public type. Used in serialization. /// /// This implementation just checks the base property. /// internal override void VerifyOnlySerializableTypes() { _baseProperty.VerifyOnlySerializableTypes(); } } ////// A MarkupItem wrapper that creates an ExtensionSimplifierProperty wrapper /// for every property returned. All other implementation is delegated to /// the wrapped item. /// internal class ExtensionSimplifierMarkupObject : MarkupObjectWrapper { IValueSerializerContext _context; public ExtensionSimplifierMarkupObject(MarkupObject baseObject, IValueSerializerContext context) : base(baseObject) { _context = context; } /// This is placed in its own method to avoid accessing base.Properties from the /// iterator class generated by the code below because C# produces unverifiable /// code for the expression. private IEnumerableGetBaseProperties(bool mapToConstructorArgs) { return base.GetProperties(mapToConstructorArgs); } internal override IEnumerable GetProperties(bool mapToConstructorArgs) { foreach (MarkupProperty property in GetBaseProperties(mapToConstructorArgs)) { yield return new ExtensionSimplifierProperty(property, _context); } } public override void AssignRootContext(IValueSerializerContext context) { _context = context; base.AssignRootContext(context); } } /// /// A MarkupProperty wrapper that creates simplifies items for objects /// of type MarkupExtension to a string if all its properties can be /// simplified into a string. This is recursive in that a markup extension /// can contain references to other markup extensions which are themselves /// simplified. /// internal class ExtensionSimplifierProperty : MarkupPropertyWrapper { IValueSerializerContext _context; public ExtensionSimplifierProperty(MarkupProperty baseProperty, IValueSerializerContext context) : base(baseProperty) { _context = context; } public override bool IsComposite { get { // See if we can convert an extension into a string. if (!base.IsComposite) { // If it is already a string then we can. return false; } // If the property is a collection, this property is a composite. if (IsCollectionProperty) { return true; } bool first = true; foreach (MarkupObject item in Items) { // If there is more than one MarkupExtension, we can't. // If it is not a markup extension we can't. if (!first || !typeof(MarkupExtension).IsAssignableFrom(item.ObjectType)) { return true; } first = false; // If any of the properties are composite we can't. This is recursive to this // routine because of the wrapping below. item.AssignRootContext(_context); foreach (MarkupProperty property in item.Properties) { if (property.IsComposite) { return true; } } } // We can turn this into a string if we have seen at least one item return first; } } /// This is placed in its own method to avoid accessing base.Items from the /// iterator class generated by the code below because C# produces unverifiable /// code for the expression. private IEnumerableGetBaseItems() { return base.Items; } public override IEnumerable Items { get { // Wrap all of the items from the property we are wrapping. foreach (MarkupObject baseItem in GetBaseItems()) { ExtensionSimplifierMarkupObject item = new ExtensionSimplifierMarkupObject(baseItem, _context); item.AssignRootContext(_context); yield return item; } } } private const int EXTENSIONLENGTH = 9; // the number of characters in the string "Extension" public override string StringValue { get { string result = null; if (!base.IsComposite) { // Escape the text as necessary to avoid being mistaken for a MarkupExtension. result = MarkupExtensionParser.AddEscapeToLiteralString(base.StringValue); } else { // Convert the markup extension into a string foreach (MarkupObject item in Items) { result = ConvertMarkupItemToString(item); break; } if (result == null) { Debug.Fail("No items where found and IsComposite return true"); result = ""; } } return result; } } private string ConvertMarkupItemToString(MarkupObject item) { ValueSerializer typeSerializer = _context.GetValueSerializerFor(typeof(Type)); Debug.Assert(typeSerializer != null, "Could not retrieve typeSerializer for Type"); // Serialize the markup extension into a string StringBuilder resultBuilder = new StringBuilder(); resultBuilder.Append('{'); string typeName = typeSerializer.ConvertToString(item.ObjectType, _context); if (typeName.EndsWith("Extension", StringComparison.Ordinal)) { // The "Extension" suffix is optional, much like the Attribute suffix of an Attribute. // The normalized version is without the suffix. resultBuilder.Append(typeName, 0, typeName.Length - EXTENSIONLENGTH); } else { resultBuilder.Append(typeName); } bool first = true; bool propertyWritten = false; foreach (MarkupProperty property in item.Properties) { resultBuilder.Append(first ? " " : ", "); first = false; if (!property.IsConstructorArgument) { resultBuilder.Append(property.Name); resultBuilder.Append('='); propertyWritten = true; } else { Debug.Assert(!propertyWritten, "An argument was returned after a property was set. All arguments must be returned first and in order"); } string value = property.StringValue; if (value != null && value.Length > 0) { if (value[0] == '{') { if (value.Length > 1 && value[1] == '}') { // It is a literal quote, remove the literals and write the text with escapes. value = value.Substring(2); } else { // It is a nested markup-extension, just insert the text literally. resultBuilder.Append(value); continue; } } // Escape the string for (int i = 0; i < value.Length; i++) { char ch = value[i]; switch (ch) { case '{': resultBuilder.Append(@"\{"); break; case '}': resultBuilder.Append(@"\}"); break; case ',': resultBuilder.Append(@"\,"); break; default: resultBuilder.Append(ch); break; } } } } resultBuilder.Append('}'); return resultBuilder.ToString(); } /// /// Checks to see that each markup object is of a public type. Used in serialization. /// /// This implementation checks the base property, checks the item's type, and recursively checks each of /// the item's properties. /// internal override void VerifyOnlySerializableTypes() { base.VerifyOnlySerializableTypes(); if(base.IsComposite) { foreach (MarkupObject item in Items) { MarkupWriter.VerifyTypeIsSerializable(item.ObjectType); foreach (MarkupProperty property in item.Properties) { property.VerifyOnlySerializableTypes(); } } } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. //------------------------------------------------------------------------ // // Microsoft Windows Client Platform // Copyright (C) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------- using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Text; using System.Windows.Markup; using System.Globalization; namespace System.Windows.Markup.Primitives { ////// Utility class use as a base class for classes wrap another /// instance by delegating MarkupItem implementation to that /// instance. /// internal class MarkupObjectWrapper : MarkupObject { MarkupObject _baseObject; public MarkupObjectWrapper(MarkupObject baseObject) { _baseObject = baseObject; } public override void AssignRootContext(IValueSerializerContext context) { _baseObject.AssignRootContext(context); } public override AttributeCollection Attributes { get { return _baseObject.Attributes; } } public override Type ObjectType { get { return _baseObject.ObjectType; } } public override object Instance { get { return _baseObject.Instance; } } internal override IEnumerableGetProperties(bool mapToConstructorArgs) { return _baseObject.GetProperties(mapToConstructorArgs); } } /// /// Utility class use as a base class for classes wrap another /// instance by delegating MarkupProperty implementation to that /// instance. /// internal class MarkupPropertyWrapper : MarkupProperty { MarkupProperty _baseProperty; /* protected MarkupProperty BaseProperty { get { return _baseProperty; } } */ public MarkupPropertyWrapper(MarkupProperty baseProperty) { _baseProperty = baseProperty; } public override AttributeCollection Attributes { get { return _baseProperty.Attributes; } } public override IEnumerableItems { get { return _baseProperty.Items; } } public override string Name { get { return _baseProperty.Name; } } public override Type PropertyType { get { return _baseProperty.PropertyType; } } public override string StringValue { get { return _baseProperty.StringValue; } } public override IEnumerable TypeReferences { get { return _baseProperty.TypeReferences; } } public override object Value { get { return _baseProperty.Value; } } public override DependencyProperty DependencyProperty { get { return _baseProperty.DependencyProperty; } } public override bool IsAttached { get { return _baseProperty.IsAttached; } } public override bool IsComposite { get { return _baseProperty.IsComposite; } } public override bool IsConstructorArgument { get { return _baseProperty.IsConstructorArgument; } } public override bool IsKey { get { return _baseProperty.IsKey; } } public override bool IsValueAsString { get { return _baseProperty.IsValueAsString; } } public override bool IsContent { get { return _baseProperty.IsContent; } } public override PropertyDescriptor PropertyDescriptor { get { return _baseProperty.PropertyDescriptor; } } /// /// Checks to see that each markup object is of a public type. Used in serialization. /// /// This implementation just checks the base property. /// internal override void VerifyOnlySerializableTypes() { _baseProperty.VerifyOnlySerializableTypes(); } } ////// A MarkupItem wrapper that creates an ExtensionSimplifierProperty wrapper /// for every property returned. All other implementation is delegated to /// the wrapped item. /// internal class ExtensionSimplifierMarkupObject : MarkupObjectWrapper { IValueSerializerContext _context; public ExtensionSimplifierMarkupObject(MarkupObject baseObject, IValueSerializerContext context) : base(baseObject) { _context = context; } /// This is placed in its own method to avoid accessing base.Properties from the /// iterator class generated by the code below because C# produces unverifiable /// code for the expression. private IEnumerableGetBaseProperties(bool mapToConstructorArgs) { return base.GetProperties(mapToConstructorArgs); } internal override IEnumerable GetProperties(bool mapToConstructorArgs) { foreach (MarkupProperty property in GetBaseProperties(mapToConstructorArgs)) { yield return new ExtensionSimplifierProperty(property, _context); } } public override void AssignRootContext(IValueSerializerContext context) { _context = context; base.AssignRootContext(context); } } /// /// A MarkupProperty wrapper that creates simplifies items for objects /// of type MarkupExtension to a string if all its properties can be /// simplified into a string. This is recursive in that a markup extension /// can contain references to other markup extensions which are themselves /// simplified. /// internal class ExtensionSimplifierProperty : MarkupPropertyWrapper { IValueSerializerContext _context; public ExtensionSimplifierProperty(MarkupProperty baseProperty, IValueSerializerContext context) : base(baseProperty) { _context = context; } public override bool IsComposite { get { // See if we can convert an extension into a string. if (!base.IsComposite) { // If it is already a string then we can. return false; } // If the property is a collection, this property is a composite. if (IsCollectionProperty) { return true; } bool first = true; foreach (MarkupObject item in Items) { // If there is more than one MarkupExtension, we can't. // If it is not a markup extension we can't. if (!first || !typeof(MarkupExtension).IsAssignableFrom(item.ObjectType)) { return true; } first = false; // If any of the properties are composite we can't. This is recursive to this // routine because of the wrapping below. item.AssignRootContext(_context); foreach (MarkupProperty property in item.Properties) { if (property.IsComposite) { return true; } } } // We can turn this into a string if we have seen at least one item return first; } } /// This is placed in its own method to avoid accessing base.Items from the /// iterator class generated by the code below because C# produces unverifiable /// code for the expression. private IEnumerableGetBaseItems() { return base.Items; } public override IEnumerable Items { get { // Wrap all of the items from the property we are wrapping. foreach (MarkupObject baseItem in GetBaseItems()) { ExtensionSimplifierMarkupObject item = new ExtensionSimplifierMarkupObject(baseItem, _context); item.AssignRootContext(_context); yield return item; } } } private const int EXTENSIONLENGTH = 9; // the number of characters in the string "Extension" public override string StringValue { get { string result = null; if (!base.IsComposite) { // Escape the text as necessary to avoid being mistaken for a MarkupExtension. result = MarkupExtensionParser.AddEscapeToLiteralString(base.StringValue); } else { // Convert the markup extension into a string foreach (MarkupObject item in Items) { result = ConvertMarkupItemToString(item); break; } if (result == null) { Debug.Fail("No items where found and IsComposite return true"); result = ""; } } return result; } } private string ConvertMarkupItemToString(MarkupObject item) { ValueSerializer typeSerializer = _context.GetValueSerializerFor(typeof(Type)); Debug.Assert(typeSerializer != null, "Could not retrieve typeSerializer for Type"); // Serialize the markup extension into a string StringBuilder resultBuilder = new StringBuilder(); resultBuilder.Append('{'); string typeName = typeSerializer.ConvertToString(item.ObjectType, _context); if (typeName.EndsWith("Extension", StringComparison.Ordinal)) { // The "Extension" suffix is optional, much like the Attribute suffix of an Attribute. // The normalized version is without the suffix. resultBuilder.Append(typeName, 0, typeName.Length - EXTENSIONLENGTH); } else { resultBuilder.Append(typeName); } bool first = true; bool propertyWritten = false; foreach (MarkupProperty property in item.Properties) { resultBuilder.Append(first ? " " : ", "); first = false; if (!property.IsConstructorArgument) { resultBuilder.Append(property.Name); resultBuilder.Append('='); propertyWritten = true; } else { Debug.Assert(!propertyWritten, "An argument was returned after a property was set. All arguments must be returned first and in order"); } string value = property.StringValue; if (value != null && value.Length > 0) { if (value[0] == '{') { if (value.Length > 1 && value[1] == '}') { // It is a literal quote, remove the literals and write the text with escapes. value = value.Substring(2); } else { // It is a nested markup-extension, just insert the text literally. resultBuilder.Append(value); continue; } } // Escape the string for (int i = 0; i < value.Length; i++) { char ch = value[i]; switch (ch) { case '{': resultBuilder.Append(@"\{"); break; case '}': resultBuilder.Append(@"\}"); break; case ',': resultBuilder.Append(@"\,"); break; default: resultBuilder.Append(ch); break; } } } } resultBuilder.Append('}'); return resultBuilder.ToString(); } /// /// Checks to see that each markup object is of a public type. Used in serialization. /// /// This implementation checks the base property, checks the item's type, and recursively checks each of /// the item's properties. /// internal override void VerifyOnlySerializableTypes() { base.VerifyOnlySerializableTypes(); if(base.IsComposite) { foreach (MarkupObject item in Items) { MarkupWriter.VerifyTypeIsSerializable(item.ObjectType); foreach (MarkupProperty property in item.Properties) { property.VerifyOnlySerializableTypes(); } } } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- ColorDialog.cs
- HMACSHA384.cs
- Executor.cs
- ThousandthOfEmRealDoubles.cs
- Int16AnimationBase.cs
- TextInfo.cs
- XmlDocumentFragment.cs
- Matrix.cs
- ILGenerator.cs
- PrefixQName.cs
- PaintValueEventArgs.cs
- ProfileSettingsCollection.cs
- Vector3D.cs
- TextTreeTextBlock.cs
- InvokeMethodActivity.cs
- hresults.cs
- HttpsHostedTransportConfiguration.cs
- ImportStoreException.cs
- __TransparentProxy.cs
- GridToolTip.cs
- DockAndAnchorLayout.cs
- ClassGenerator.cs
- NotifyParentPropertyAttribute.cs
- DbParameterHelper.cs
- WebReferenceOptions.cs
- WebScriptMetadataMessageEncodingBindingElement.cs
- TreeNodeBindingCollection.cs
- DeploymentExceptionMapper.cs
- HealthMonitoringSection.cs
- StylusPointPropertyId.cs
- TreeWalkHelper.cs
- CreatingCookieEventArgs.cs
- AttachedPropertyBrowsableForTypeAttribute.cs
- Color.cs
- RefreshEventArgs.cs
- DataBoundControlAdapter.cs
- IntranetCredentialPolicy.cs
- LoginCancelEventArgs.cs
- RenderData.cs
- ClockGroup.cs
- HtmlContainerControl.cs
- HtmlWindow.cs
- CharAnimationUsingKeyFrames.cs
- AdvancedBindingEditor.cs
- documentation.cs
- SqlParameterizer.cs
- DataGridHeaderBorder.cs
- ContractTypeNameElement.cs
- IssuedSecurityTokenParameters.cs
- RootBrowserWindowProxy.cs
- SqlBulkCopyColumnMapping.cs
- BindingBase.cs
- LinqDataSourceInsertEventArgs.cs
- ContextStaticAttribute.cs
- HelpOperationInvoker.cs
- MultipleViewPattern.cs
- HttpDebugHandler.cs
- InheritedPropertyDescriptor.cs
- DefaultTextStore.cs
- BackEase.cs
- HtmlShimManager.cs
- ConversionValidationRule.cs
- RemotingHelper.cs
- ControlPager.cs
- XmlSchemaSubstitutionGroup.cs
- BindingCompleteEventArgs.cs
- ValuePatternIdentifiers.cs
- ObjectDataSourceDesigner.cs
- HandleCollector.cs
- TraceFilter.cs
- SqlCacheDependency.cs
- SingletonConnectionReader.cs
- FieldDescriptor.cs
- SqlDataReader.cs
- InputLanguageSource.cs
- OSFeature.cs
- ScalarConstant.cs
- EmptyStringExpandableObjectConverter.cs
- FormatException.cs
- TemplateEditingVerb.cs
- ImageList.cs
- PixelFormatConverter.cs
- UriWriter.cs
- FamilyCollection.cs
- WindowsRichEditRange.cs
- SafeHandles.cs
- XmlReader.cs
- DataList.cs
- SiteMapNode.cs
- StringFormat.cs
- ParserExtension.cs
- RestClientProxyHandler.cs
- ClientBuildManagerCallback.cs
- WindowVisualStateTracker.cs
- DataContractSerializerSection.cs
- UserControlCodeDomTreeGenerator.cs
- XamlSerializerUtil.cs
- StreamingContext.cs
- ProvidersHelper.cs
- BaseDataBoundControl.cs