You've already forked linux-packaging-mono
							
							
		
			
				
	
	
		
			354 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			354 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| //------------------------------------------------------------------------------
 | |
| // <copyright file="GenericWebPart.cs" company="Microsoft">
 | |
| //     Copyright (c) Microsoft Corporation.  All rights reserved.
 | |
| // </copyright>
 | |
| //------------------------------------------------------------------------------
 | |
| 
 | |
| namespace System.Web.UI.WebControls.WebParts {
 | |
| 
 | |
|     using System;
 | |
|     using System.Collections;
 | |
|     using System.ComponentModel;
 | |
|     using System.Globalization;
 | |
|     using System.Web.UI;
 | |
|     using System.Web.UI.WebControls;
 | |
|     using System.Web.Util;
 | |
| 
 | |
|     /// <devdoc>
 | |
|     /// A WebPart that can wrap any other generic server control, and provide it
 | |
|     /// with "WebPart-ness."
 | |
|     /// 1. Implements several properties if not set on the WebPart by looking for an
 | |
|     /// attribute on the contained control.
 | |
|     /// 2. Implement IWebEditable to allow the PropertyGridEditorPart to tunnel-in
 | |
|     /// and browse the contained control.
 | |
|     /// </devdoc>
 | |
|     [
 | |
|     ToolboxItem(false)
 | |
|     ]
 | |
|     public class GenericWebPart : WebPart {
 | |
| 
 | |
|         internal const string IDPrefix = "gwp";
 | |
|         private Control _childControl;
 | |
|         private IWebPart _childIWebPart;
 | |
|         private string _subtitle;
 | |
| 
 | |
|         /// <devdoc>
 | |
|         /// Intializes an instance of GenericWebPart with the control it is to wrap.
 | |
|         /// </devdoc>
 | |
|         protected internal GenericWebPart(Control control) {
 | |
|             if (control == null) {
 | |
|                 throw new ArgumentNullException("control");
 | |
|             }
 | |
|             if (control is WebPart) {
 | |
|                 throw new ArgumentException(SR.GetString(SR.GenericWebPart_CannotWrapWebPart), "control");
 | |
|             }
 | |
|             if (control is BasePartialCachingControl) {
 | |
|                 throw new ArgumentException(SR.GetString(SR.GenericWebPart_CannotWrapOutputCachedControl), "control");
 | |
|             }
 | |
|             if (String.IsNullOrEmpty(control.ID)) {
 | |
|                 throw new ArgumentException(SR.GetString(SR.GenericWebPart_NoID, control.GetType().FullName));
 | |
|             }
 | |
| 
 | |
|             ID = IDPrefix + control.ID;
 | |
|             _childControl = control;
 | |
|             _childIWebPart = _childControl as IWebPart;
 | |
|             CopyChildAttributes();
 | |
|         }
 | |
| 
 | |
|         public override string CatalogIconImageUrl {
 | |
|             get {
 | |
|                 if (_childIWebPart != null) {
 | |
|                     return _childIWebPart.CatalogIconImageUrl;
 | |
|                 }
 | |
|                 else {
 | |
|                     return base.CatalogIconImageUrl;
 | |
|                 }
 | |
|             }
 | |
|             set {
 | |
|                 if (_childIWebPart != null) {
 | |
|                     _childIWebPart.CatalogIconImageUrl = value;
 | |
|                 }
 | |
|                 else {
 | |
|                     base.CatalogIconImageUrl = value;
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public Control ChildControl {
 | |
|             get {
 | |
|                 Debug.Assert(_childControl != null, "ChildControl cannot be null.");
 | |
|                 return _childControl;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public override string Description {
 | |
|             get {
 | |
|                 if (_childIWebPart != null) {
 | |
|                     return _childIWebPart.Description;
 | |
|                 }
 | |
|                 else {
 | |
|                     return base.Description;
 | |
|                 }
 | |
|             }
 | |
|             set {
 | |
|                 if (_childIWebPart != null) {
 | |
|                     _childIWebPart.Description = value;
 | |
|                 }
 | |
|                 else {
 | |
|                     base.Description = value;
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public override Unit Height {
 | |
|             get {
 | |
|                 WebControl c = ChildControl as WebControl;
 | |
|                 if (c != null) {
 | |
|                     return c.Height;
 | |
|                 }
 | |
|                 else {
 | |
|                     return base.Height;
 | |
|                 }
 | |
|             }
 | |
|             set {
 | |
|                 WebControl c = ChildControl as WebControl;
 | |
|                 if (c != null) {
 | |
|                     c.Height = value;
 | |
|                 }
 | |
|                 else {
 | |
|                     base.Height = value;
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         // Seal the ID property so we can set it in the constructor without an FxCop violation.
 | |
|         public sealed override string ID {
 | |
|             get {
 | |
|                 return base.ID;
 | |
|             }
 | |
|             set {
 | |
|                 base.ID = value;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public override string Subtitle {
 | |
|             get {
 | |
|                 if (_childIWebPart != null) {
 | |
|                     return _childIWebPart.Subtitle;
 | |
|                 }
 | |
|                 else {
 | |
|                     return (_subtitle != null ? _subtitle : String.Empty);
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public override string Title {
 | |
|             get {
 | |
|                 if (_childIWebPart != null) {
 | |
|                     return _childIWebPart.Title;
 | |
|                 }
 | |
|                 else {
 | |
|                     return base.Title;
 | |
|                 }
 | |
|             }
 | |
|             set {
 | |
|                 if (_childIWebPart != null) {
 | |
|                     _childIWebPart.Title = value;
 | |
|                 }
 | |
|                 else {
 | |
|                     base.Title = value;
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public override string TitleIconImageUrl {
 | |
|             get {
 | |
|                 if (_childIWebPart != null) {
 | |
|                     return _childIWebPart.TitleIconImageUrl;
 | |
|                 }
 | |
|                 else {
 | |
|                     return base.TitleIconImageUrl;
 | |
|                 }
 | |
|             }
 | |
|             set {
 | |
|                 if (_childIWebPart != null) {
 | |
|                     _childIWebPart.TitleIconImageUrl = value;
 | |
|                 }
 | |
|                 else {
 | |
|                     base.TitleIconImageUrl = value;
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public override string TitleUrl {
 | |
|             get {
 | |
|                 if (_childIWebPart != null) {
 | |
|                     return _childIWebPart.TitleUrl;
 | |
|                 }
 | |
|                 else {
 | |
|                     return base.TitleUrl;
 | |
|                 }
 | |
|             }
 | |
|             set {
 | |
|                 if (_childIWebPart != null) {
 | |
|                     _childIWebPart.TitleUrl = value;
 | |
|                 }
 | |
|                 else {
 | |
|                     base.TitleUrl = value;
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public override WebPartVerbCollection Verbs {
 | |
|             get {
 | |
|                 if (ChildControl != null) {
 | |
|                     IWebActionable webActionableChildControl = ChildControl as IWebActionable;
 | |
|                     if (webActionableChildControl != null) {
 | |
|                         return new WebPartVerbCollection(base.Verbs, webActionableChildControl.Verbs);
 | |
|                     }
 | |
|                 }
 | |
|                 return base.Verbs;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public override object WebBrowsableObject {
 | |
|             get {
 | |
|                 IWebEditable webEditableChildControl = ChildControl as IWebEditable;
 | |
|                 if (webEditableChildControl != null) {
 | |
|                     return webEditableChildControl.WebBrowsableObject;
 | |
|                 }
 | |
|                 else {
 | |
|                     return ChildControl;
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public override Unit Width {
 | |
|             get {
 | |
|                 WebControl c = ChildControl as WebControl;
 | |
|                 if (c != null) {
 | |
|                     return c.Width;
 | |
|                 }
 | |
|                 else {
 | |
|                     return base.Width;
 | |
|                 }
 | |
|             }
 | |
|             set {
 | |
|                 WebControl c = ChildControl as WebControl;
 | |
|                 if (c != null) {
 | |
|                     c.Width = value;
 | |
|                 }
 | |
|                 else {
 | |
|                     base.Width = value;
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private void CopyChildAttributes() {
 | |
|             // Copy the attribute values from the ChildControl to the GenericWebPart properties.
 | |
|             IAttributeAccessor childAttributeAccessor = ChildControl as IAttributeAccessor;
 | |
|             if (childAttributeAccessor != null) {
 | |
|                 base.AuthorizationFilter = childAttributeAccessor.GetAttribute("AuthorizationFilter");
 | |
|                 base.CatalogIconImageUrl = childAttributeAccessor.GetAttribute("CatalogIconImageUrl");
 | |
|                 base.Description = childAttributeAccessor.GetAttribute("Description");
 | |
| 
 | |
|                 string exportMode = childAttributeAccessor.GetAttribute("ExportMode");
 | |
|                 if (exportMode != null) {
 | |
|                     base.ExportMode = (WebPartExportMode)(Util.GetEnumAttribute(
 | |
|                         "ExportMode", exportMode, typeof(WebPartExportMode)));
 | |
|                 }
 | |
| 
 | |
|                 // Don't need to check base.Subtitle, since we always want to use the Subtitle on the
 | |
|                 // ChildControl if it is present.  Also, the property is not settable on WebPart, so we
 | |
|                 // know that base.Subtitle will always be String.Empty.
 | |
|                 _subtitle = childAttributeAccessor.GetAttribute("Subtitle");
 | |
| 
 | |
|                 base.Title = childAttributeAccessor.GetAttribute("Title");
 | |
|                 base.TitleIconImageUrl = childAttributeAccessor.GetAttribute("TitleIconImageUrl");
 | |
|                 base.TitleUrl = childAttributeAccessor.GetAttribute("TitleUrl");
 | |
|             }
 | |
| 
 | |
|             // Remove all the attributes from the ChildControl, whether or not they were copied
 | |
|             // to the GenericWebPart property.  We want to remove the attributes so they are not
 | |
|             // rendered on the ChildControl.  (VSWhidbey 313674)
 | |
|             WebControl childWebControl = ChildControl as WebControl;
 | |
|             if (childWebControl != null) {
 | |
|                 // If the ChildControl is a WebControl, we want to completely remove the attributes.
 | |
|                 childWebControl.Attributes.Remove("AuthorizationFilter");
 | |
|                 childWebControl.Attributes.Remove("CatalogIconImageUrl");
 | |
|                 childWebControl.Attributes.Remove("Description");
 | |
|                 childWebControl.Attributes.Remove("ExportMode");
 | |
|                 childWebControl.Attributes.Remove("Subtitle");
 | |
|                 childWebControl.Attributes.Remove("Title");
 | |
|                 childWebControl.Attributes.Remove("TitleIconImageUrl");
 | |
|                 childWebControl.Attributes.Remove("TitleUrl");
 | |
|             }
 | |
|             else if (childAttributeAccessor != null) {
 | |
|                 // If the ChildControl is not a WebControl, we cannot remove the attributes, so we set
 | |
|                 // them to null instead.
 | |
|                 childAttributeAccessor.SetAttribute("AuthorizationFilter", null);
 | |
|                 childAttributeAccessor.SetAttribute("CatalogIconImageUrl", null);
 | |
|                 childAttributeAccessor.SetAttribute("Description", null);
 | |
|                 childAttributeAccessor.SetAttribute("ExportMode", null);
 | |
|                 childAttributeAccessor.SetAttribute("Subtitle", null);
 | |
|                 childAttributeAccessor.SetAttribute("Title", null);
 | |
|                 childAttributeAccessor.SetAttribute("TitleIconImageUrl", null);
 | |
|                 childAttributeAccessor.SetAttribute("TitleUrl", null);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         protected internal override void CreateChildControls() {
 | |
|             ((GenericWebPartControlCollection)Controls).AddGenericControl(ChildControl);
 | |
|         }
 | |
| 
 | |
|         protected override ControlCollection CreateControlCollection() {
 | |
|             return new GenericWebPartControlCollection(this);
 | |
|         }
 | |
| 
 | |
|         public override EditorPartCollection CreateEditorParts() {
 | |
|             IWebEditable webEditableChildControl = ChildControl as IWebEditable;
 | |
|             if (webEditableChildControl != null) {
 | |
|                 return new EditorPartCollection(base.CreateEditorParts(), webEditableChildControl.CreateEditorParts());
 | |
|             }
 | |
|             else {
 | |
|                 return base.CreateEditorParts();
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         protected internal override void Render(HtmlTextWriter writer) {
 | |
|             // Copied from CompositeControl.Render()
 | |
|             if (DesignMode) {
 | |
|                 EnsureChildControls();
 | |
|             }
 | |
| 
 | |
|             RenderContents(writer);
 | |
|         }
 | |
| 
 | |
|         private sealed class GenericWebPartControlCollection : ControlCollection {
 | |
|             public GenericWebPartControlCollection(GenericWebPart owner) : base(owner) {
 | |
|                 SetCollectionReadOnly(SR.GenericWebPart_CannotModify);
 | |
|             }
 | |
| 
 | |
|             /// <devdoc>
 | |
|             /// Allows adding the generic control to be wrapped.
 | |
|             /// </devdoc>
 | |
|             public void AddGenericControl(Control control) {
 | |
|                 string originalError = SetCollectionReadOnly(null);
 | |
|                 // Extra try-catch block to prevent elevation of privilege attack via exception filter
 | |
|                 try {
 | |
|                     try {
 | |
|                         Clear();
 | |
|                         Add(control);
 | |
|                     }
 | |
|                     finally {
 | |
|                         SetCollectionReadOnly(originalError);
 | |
|                     }
 | |
|                 }
 | |
|                 catch {
 | |
|                     throw;
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 |