1 // 2 // UpdateProgress.cs 3 // 4 // Author: 5 // Igor Zelmanovich <igorz@mainsoft.com> 6 // 7 // (C) 2007 Mainsoft, Inc. http://www.mainsoft.com 8 // 9 // 10 // Permission is hereby granted, free of charge, to any person obtaining 11 // a copy of this software and associated documentation files (the 12 // "Software"), to deal in the Software without restriction, including 13 // without limitation the rights to use, copy, modify, merge, publish, 14 // distribute, sublicense, and/or sell copies of the Software, and to 15 // permit persons to whom the Software is furnished to do so, subject to 16 // the following conditions: 17 // 18 // The above copyright notice and this permission notice shall be 19 // included in all copies or substantial portions of the Software. 20 // 21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 22 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 23 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 24 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 25 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 26 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 27 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 28 // 29 30 using System; 31 using System.Collections.Generic; 32 using System.Text; 33 using System.ComponentModel; 34 35 namespace System.Web.UI 36 { 37 [PersistChildren (false)] 38 [ParseChildren (true)] 39 [DefaultProperty ("AssociatedUpdatePanelID")] 40 [Designer ("System.Web.UI.Design.UpdateProgressDesigner, System.Web.Extensions.Design, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35")] 41 public class UpdateProgress : Control, IScriptControl 42 { 43 ITemplate _progressTemplate; 44 ScriptManager _scriptManager; 45 46 [Category ("Behavior")] 47 [DefaultValue ("")] 48 [IDReferenceProperty (typeof (UpdatePanel))] 49 public string AssociatedUpdatePanelID { 50 get { 51 return (string) ViewState ["AssociatedUpdatePanelID"] ?? String.Empty; 52 } 53 set { 54 ViewState ["AssociatedUpdatePanelID"] = value; 55 } 56 } 57 58 [Category ("Behavior")] 59 [DefaultValue (500)] 60 public int DisplayAfter { 61 get { 62 object o = ViewState ["DisplayAfter"]; 63 if (o == null) 64 return 500; 65 return (int) o; 66 } 67 set { 68 ViewState ["DisplayAfter"] = value; 69 } 70 } 71 72 [Category ("Behavior")] 73 [DefaultValue (true)] 74 public bool DynamicLayout { 75 get { 76 object o = ViewState ["DynamicLayout"]; 77 if (o == null) 78 return true; 79 return (bool) o; 80 } 81 set { 82 ViewState ["DynamicLayout"] = value; 83 } 84 } 85 86 [PersistenceMode (PersistenceMode.InnerProperty)] 87 [Browsable (false)] 88 public ITemplate ProgressTemplate { 89 get { 90 return _progressTemplate; 91 } 92 set { 93 _progressTemplate = value; 94 } 95 } 96 97 ScriptManager ScriptManager { 98 get { 99 if (_scriptManager == null) { 100 _scriptManager = ScriptManager.GetCurrent (Page); 101 if (_scriptManager == null) 102 throw new InvalidOperationException (String.Format ("The control with ID '{0}' requires a ScriptManager on the page. The ScriptManager must appear before any controls that need it.", ID)); 103 } 104 return _scriptManager; 105 } 106 } 107 GetScriptDescriptors()108 protected virtual IEnumerable<ScriptDescriptor> GetScriptDescriptors () { 109 string updatePanelClientId; 110 if (String.IsNullOrEmpty (AssociatedUpdatePanelID)) 111 updatePanelClientId = null; 112 else { 113 UpdatePanel updatePanel = FindControl (AssociatedUpdatePanelID) as UpdatePanel; 114 if (updatePanel == null) 115 throw new InvalidOperationException ("No UpdatePanel found for AssociatedUpdatePanelID '" + AssociatedUpdatePanelID + "'."); 116 updatePanelClientId = updatePanel.ClientID; 117 } 118 ScriptControlDescriptor descriptor = new ScriptControlDescriptor ("Sys.UI._UpdateProgress", this.ClientID); 119 descriptor.AddProperty ("associatedUpdatePanelId", updatePanelClientId); 120 descriptor.AddProperty ("displayAfter", DisplayAfter); 121 descriptor.AddProperty ("dynamicLayout", DynamicLayout); 122 yield return descriptor; 123 } 124 GetScriptReferences()125 protected virtual IEnumerable<ScriptReference> GetScriptReferences () { 126 yield break; 127 } 128 OnPreRender(EventArgs e)129 protected internal override void OnPreRender (EventArgs e) { 130 base.OnPreRender (e); 131 ScriptManager.RegisterScriptControl (this); 132 133 if (_progressTemplate == null) 134 throw new InvalidOperationException (String.Format ("A ProgressTemplate must be specified on UpdateProgress control with ID '{0}'.", ID)); 135 136 Control container = new Control (); 137 _progressTemplate.InstantiateIn (container); 138 Controls.Add (container); 139 } 140 Render(HtmlTextWriter writer)141 protected internal override void Render (HtmlTextWriter writer) { 142 if (DynamicLayout) 143 writer.AddStyleAttribute (HtmlTextWriterStyle.Display, "none"); 144 else { 145 writer.AddStyleAttribute (HtmlTextWriterStyle.Display, "block"); 146 writer.AddStyleAttribute (HtmlTextWriterStyle.Visibility, "hidden"); 147 } 148 writer.AddAttribute (HtmlTextWriterAttribute.Id, ClientID); 149 writer.RenderBeginTag (HtmlTextWriterTag.Div); 150 base.Render (writer); 151 writer.RenderEndTag (); 152 153 ScriptManager.RegisterScriptDescriptors (this); 154 } 155 156 #region IScriptControl Members 157 IScriptControl.GetScriptDescriptors()158 IEnumerable<ScriptDescriptor> IScriptControl.GetScriptDescriptors () { 159 return GetScriptDescriptors (); 160 } 161 IScriptControl.GetScriptReferences()162 IEnumerable<ScriptReference> IScriptControl.GetScriptReferences () { 163 return GetScriptReferences (); 164 } 165 166 #endregion 167 } 168 } 169