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