Code:
/ DotNET / DotNET / 8.0 / untmp / whidbey / REDBITS / ndp / fx / src / Designer / WebForms / System / Web / UI / Design / ExpressionEditor.cs / 1 / ExpressionEditor.cs
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//-----------------------------------------------------------------------------
namespace System.Web.UI.Design {
using System;
using System.Collections;
using System.Collections.Specialized;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Configuration;
using System.Design;
using System.Web.Compilation;
using System.Web.Configuration;
using ExpressionBuilder = System.Web.Configuration.ExpressionBuilder;
///
public abstract class ExpressionEditor {
private const string expressionEditorsByTypeKey = "ExpressionEditorsByType";
private const string expressionEditorsKey = "ExpressionEditors";
private string _expressionPrefix;
public string ExpressionPrefix {
get {
return _expressionPrefix;
}
}
///
///
/// Evalutes the specified expression
///
public abstract object EvaluateExpression(string expression, object parseTimeData, Type propertyType, IServiceProvider serviceProvider);
private static IDictionary GetExpressionEditorsCache(IWebApplication webApp) {
IDictionaryService dictionaryService = (IDictionaryService)webApp.GetService(typeof(IDictionaryService));
if (dictionaryService == null) {
// If there is no IDictionaryService, we don't have a cache
return null;
}
IDictionary expressionEditors = (IDictionary)dictionaryService.GetValue(expressionEditorsKey);
if (expressionEditors == null) {
expressionEditors = new HybridDictionary(true);
dictionaryService.SetValue(expressionEditorsKey, expressionEditors);
}
return expressionEditors;
}
private static IDictionary GetExpressionEditorsByTypeCache(IWebApplication webApp) {
IDictionaryService dictionaryService = (IDictionaryService)webApp.GetService(typeof(IDictionaryService));
if (dictionaryService == null) {
// If there is no IDictionaryService, we don't have a cache
return null;
}
IDictionary expressionEditorsByType = (IDictionary)dictionaryService.GetValue(expressionEditorsByTypeKey);
if (expressionEditorsByType == null) {
expressionEditorsByType = new HybridDictionary();
dictionaryService.SetValue(expressionEditorsByTypeKey, expressionEditorsByType);
}
return expressionEditorsByType;
}
public static ExpressionEditor GetExpressionEditor(Type expressionBuilderType, IServiceProvider serviceProvider) {
if (serviceProvider == null) {
throw new ArgumentNullException("serviceProvider");
}
if (expressionBuilderType == null) {
throw new ArgumentNullException("expressionBuilderType");
}
ExpressionEditor expressionEditor = null;
IWebApplication webApp = (IWebApplication)serviceProvider.GetService(typeof(IWebApplication));
if (webApp != null) {
// See if we have a cached instance already
IDictionary expressionEditorsByType = GetExpressionEditorsByTypeCache(webApp);
if (expressionEditorsByType != null) {
expressionEditor = (ExpressionEditor)expressionEditorsByType[expressionBuilderType];
}
// If not, try to get one
if (expressionEditor == null) {
Configuration config = webApp.OpenWebConfiguration(true);
if (config != null) {
// Get the compilation config section to get the list of expressionbuilders
CompilationSection compilationSection = (CompilationSection)config.GetSection("system.web/compilation");
ExpressionBuilderCollection builders = compilationSection.ExpressionBuilders;
bool foundEditor = false;
string desiredTypeName = expressionBuilderType.FullName;
// Find the one corresponding to this prefix
foreach (ExpressionBuilder expressionBuilder in builders) {
if (String.Equals(expressionBuilder.Type, desiredTypeName, StringComparison.OrdinalIgnoreCase)) {
expressionEditor = GetExpressionEditorInternal(expressionBuilderType, expressionBuilder.ExpressionPrefix, webApp, serviceProvider);
foundEditor = true;
}
}
// If we didn't find the expression builder, register it
if (!foundEditor) {
// Check the ExpressionPrefixAttribute to get the correct ExpressionPrefix
object[] attrs = expressionBuilderType.GetCustomAttributes(typeof(ExpressionPrefixAttribute), true);
ExpressionPrefixAttribute prefixAttr = null;
if (attrs.Length > 0) {
prefixAttr = (ExpressionPrefixAttribute)attrs[0];
}
// If there is a default prefix, try to register the expression builder
if (prefixAttr != null) {
ExpressionBuilder newBuilder = new ExpressionBuilder(prefixAttr.ExpressionPrefix,expressionBuilderType.FullName);
// Not open the configuration as not readonly
config = webApp.OpenWebConfiguration(false);
compilationSection = (CompilationSection)config.GetSection("system.web/compilation");
builders = compilationSection.ExpressionBuilders;
builders.Add(newBuilder);
config.Save();
expressionEditor = GetExpressionEditorInternal(expressionBuilderType, newBuilder.ExpressionPrefix, webApp, serviceProvider);
}
}
}
}
}
return expressionEditor;
}
// Internal way to get ExpressionEditors and also add them to the cache
internal static ExpressionEditor GetExpressionEditorInternal(Type expressionBuilderType, string expressionPrefix, IWebApplication webApp, IServiceProvider serviceProvider) {
if (expressionBuilderType == null) {
throw new ArgumentNullException("expressionBuilderType");
}
ExpressionEditor expressionEditor = null;
// Check the ExpressionEditorAttribute to get the correct ExpressionEditor
object[] attrs = expressionBuilderType.GetCustomAttributes(typeof(ExpressionEditorAttribute), true);
ExpressionEditorAttribute editorAttr = null;
if (attrs.Length > 0) {
editorAttr = (ExpressionEditorAttribute)attrs[0];
}
if (editorAttr != null) {
// Instantiate the ExpressionEditor
string editorTypeName = editorAttr.EditorTypeName;
Type editorType = Type.GetType(editorTypeName);
// If GetType didn't work, try the typeResolutionService
if (editorType == null) {
ITypeResolutionService typeResolutionService = (ITypeResolutionService)serviceProvider.GetService(typeof(ITypeResolutionService));
if (typeResolutionService != null) {
editorType = typeResolutionService.GetType(editorTypeName);
}
}
if ((editorType != null) && (typeof(ExpressionEditor).IsAssignableFrom(editorType))) {
expressionEditor = (ExpressionEditor)Activator.CreateInstance(editorType);
expressionEditor.SetExpressionPrefix(expressionPrefix);
}
// Add it to both caches (if we have caches)
IDictionary expressionEditors = GetExpressionEditorsCache(webApp);
if (expressionEditors != null) {
expressionEditors[expressionPrefix] = expressionEditor;
}
IDictionary expressionEditorsByType = GetExpressionEditorsByTypeCache(webApp);
if (expressionEditorsByType != null) {
expressionEditorsByType[expressionBuilderType] = expressionEditor;
}
}
return expressionEditor;
}
public static ExpressionEditor GetExpressionEditor(string expressionPrefix, IServiceProvider serviceProvider) {
if (serviceProvider == null) {
throw new ArgumentNullException("serviceProvider");
}
// If there is no expressionPrefix, it's a v1 style databinding expression
if (expressionPrefix.Length == 0) {
return null;
}
ExpressionEditor expressionEditor = null;
IWebApplication webApp = (IWebApplication)serviceProvider.GetService(typeof(IWebApplication));
if (webApp != null) {
// See if we have a cached instance already
IDictionary expressionEditors = GetExpressionEditorsCache(webApp);
if (expressionEditors != null) {
expressionEditor = (ExpressionEditor)expressionEditors[expressionPrefix];
}
// If not, try to get one
if (expressionEditor == null) {
string trueExpressionPrefix;
Type type = GetExpressionBuilderType(expressionPrefix, serviceProvider, out trueExpressionPrefix);
if (type != null) {
expressionEditor = GetExpressionEditorInternal(type, trueExpressionPrefix, webApp, serviceProvider);
}
}
}
return expressionEditor;
}
internal static Type GetExpressionBuilderType(string expressionPrefix, IServiceProvider serviceProvider, out string trueExpressionPrefix) {
if (serviceProvider == null) {
throw new ArgumentNullException("serviceProvider");
}
trueExpressionPrefix = expressionPrefix;
// If there is no expressionPrefix, it's a v1 style databinding expression
if (expressionPrefix.Length == 0) {
return null;
}
Type type = null;
IWebApplication webApp = (IWebApplication)serviceProvider.GetService(typeof(IWebApplication));
if (webApp != null) {
Configuration config = webApp.OpenWebConfiguration(true);
if (config != null) {
// Get the compilation config section to get the list of expressionbuilders
CompilationSection compilationSection = (CompilationSection)config.GetSection("system.web/compilation");
ExpressionBuilderCollection builders = compilationSection.ExpressionBuilders;
// Find the one corresponding to this prefix
foreach (ExpressionBuilder expressionBuilder in builders) {
if (String.Equals(expressionPrefix, expressionBuilder.ExpressionPrefix, StringComparison.OrdinalIgnoreCase)) {
trueExpressionPrefix = expressionBuilder.ExpressionPrefix;
// Try to get the type
type = Type.GetType(expressionBuilder.Type);
// If GetType didn't work, try the typeResolutionService
if (type == null) {
ITypeResolutionService typeResolutionService = (ITypeResolutionService)serviceProvider.GetService(typeof(ITypeResolutionService));
if (typeResolutionService != null) {
type = typeResolutionService.GetType(expressionBuilder.Type);
}
}
}
}
}
}
return type;
}
///
///
/// Returns an expression editor sheet that has properties corresponding
/// to an expression that this editor knows how to handle.
///
public virtual ExpressionEditorSheet GetExpressionEditorSheet(string expression, IServiceProvider serviceProvider) {
return new GenericExpressionEditorSheet(expression, serviceProvider);
}
internal void SetExpressionPrefix(string expressionPrefix) {
_expressionPrefix = expressionPrefix;
}
private class GenericExpressionEditorSheet : ExpressionEditorSheet {
private string _expression;
public GenericExpressionEditorSheet(string expression, IServiceProvider serviceProvider) : base(serviceProvider) {
_expression = expression;
}
[DefaultValue("")]
[SRDescription(SR.ExpressionEditor_Expression)]
public string Expression {
get {
if (_expression == null) {
return String.Empty;
}
return _expression;
}
set {
_expression = value;
}
}
public override string GetExpression() {
return _expression;
}
}
}
}
// 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
- CompatibleIComparer.cs
- PeerConnector.cs
- ZipIOModeEnforcingStream.cs
- Model3DCollection.cs
- HtmlPhoneCallAdapter.cs
- ResponseBodyWriter.cs
- ValidationError.cs
- ControlsConfig.cs
- BevelBitmapEffect.cs
- ListBoxItem.cs
- LayoutTableCell.cs
- WebPageTraceListener.cs
- RemotingServices.cs
- Dump.cs
- AssemblySettingAttributes.cs
- DbException.cs
- dtdvalidator.cs
- GeneralTransform3D.cs
- EntityDesignerBuildProvider.cs
- MatrixValueSerializer.cs
- MasterPageCodeDomTreeGenerator.cs
- ByteStream.cs
- AttributeData.cs
- GetIsBrowserClientRequest.cs
- BrushMappingModeValidation.cs
- MultipartIdentifier.cs
- FormatConvertedBitmap.cs
- ObjectSecurity.cs
- MessageEncodingBindingElementImporter.cs
- _NegoStream.cs
- SiteIdentityPermission.cs
- XmlSignatureManifest.cs
- SafeRightsManagementQueryHandle.cs
- MarkupObject.cs
- HandlerBase.cs
- BindingOperations.cs
- ExtentKey.cs
- PageRequestManager.cs
- Hash.cs
- XmlNamedNodeMap.cs
- PresentationSource.cs
- AxParameterData.cs
- NativeCppClassAttribute.cs
- HttpHeaderCollection.cs
- Binding.cs
- OdbcConnectionString.cs
- EventLogLink.cs
- DataGridTable.cs
- _BaseOverlappedAsyncResult.cs
- ResourceDefaultValueAttribute.cs
- BamlRecordReader.cs
- CroppedBitmap.cs
- DesignerActionVerbList.cs
- HttpUnhandledOperationInvoker.cs
- XMLSchema.cs
- CursorInteropHelper.cs
- Cursor.cs
- Funcletizer.cs
- FontDifferentiator.cs
- PeerNodeTraceRecord.cs
- AttachedPropertyBrowsableWhenAttributePresentAttribute.cs
- VScrollProperties.cs
- ObjectMemberMapping.cs
- AuthorizationSection.cs
- FixedSOMTextRun.cs
- ObjectViewListener.cs
- DataList.cs
- HierarchicalDataSourceControl.cs
- TraceData.cs
- LeaseManager.cs
- Script.cs
- StaticFileHandler.cs
- util.cs
- EllipseGeometry.cs
- GeneralTransform.cs
- PenLineCapValidation.cs
- CssClassPropertyAttribute.cs
- CodeTypeDelegate.cs
- FlowStep.cs
- connectionpool.cs
- PolicyValidationException.cs
- TargetPerspective.cs
- Itemizer.cs
- unitconverter.cs
- AVElementHelper.cs
- BinarySerializer.cs
- AssemblyAttributes.cs
- VersionedStream.cs
- UIElementParagraph.cs
- ResetableIterator.cs
- MetadataHelper.cs
- HtmlInputSubmit.cs
- NaturalLanguageHyphenator.cs
- ExceptionValidationRule.cs
- WebConfigurationFileMap.cs
- WorkflowMarkupSerializationProvider.cs
- SqlProviderManifest.cs
- ActiveDesignSurfaceEvent.cs
- EFDataModelProvider.cs
- RegisteredHiddenField.cs