improved partial rendering.
[mono.git] / mcs / class / System.Web.Extensions / System.Web.UI / UpdateProgress.cs
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                                 string value = AssociatedUpdatePanelIDInternal;
52                                 if (value == null)
53                                         return String.Empty;
54                                 return value;
55                         }
56                         set {
57                                 AssociatedUpdatePanelIDInternal = value;
58                         }
59                 }
60
61                 public string AssociatedUpdatePanelIDInternal {
62                         get {
63                                 return (string) ViewState ["AssociatedUpdatePanelID"];
64                         }
65                         set {
66                                 ViewState ["AssociatedUpdatePanelID"] = value;
67                         }
68                 }
69
70                 [Category ("Behavior")]
71                 [DefaultValue (500)]
72                 public int DisplayAfter {
73                         get {
74                                 object o = ViewState ["DisplayAfter"];
75                                 if (o == null)
76                                         return 500;
77                                 return (int) o;
78                         }
79                         set {
80                                 ViewState ["DisplayAfter"] = value;
81                         }
82                 }
83
84                 [Category ("Behavior")]
85                 [DefaultValue (true)]
86                 public bool DynamicLayout {
87                         get {
88                                 object o = ViewState ["DynamicLayout"];
89                                 if (o == null)
90                                         return true;
91                                 return (bool) o;
92                         }
93                         set {
94                                 ViewState ["DynamicLayout"] = value;
95                         }
96                 }
97
98                 [PersistenceMode (PersistenceMode.InnerProperty)]
99                 [Browsable (false)]
100                 public ITemplate ProgressTemplate {
101                         get {
102                                 return _progressTemplate;
103                         }
104                         set {
105                                 _progressTemplate = value;
106                         }
107                 }
108
109                 ScriptManager ScriptManager {
110                         get {
111                                 if (_scriptManager == null) {
112                                         _scriptManager = ScriptManager.GetCurrent (Page);
113                                         if (_scriptManager == null)
114                                                 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));
115                                 }
116                                 return _scriptManager;
117                         }
118                 }
119
120                 protected virtual IEnumerable<ScriptDescriptor> GetScriptDescriptors () {
121                         ScriptControlDescriptor descriptor = new ScriptControlDescriptor ("Sys.UI._UpdateProgress", this.ClientID);
122                         descriptor.AddProperty ("associatedUpdatePanelId", AssociatedUpdatePanelIDInternal);
123                         descriptor.AddProperty ("displayAfter", DisplayAfter);
124                         descriptor.AddProperty ("dynamicLayout", DynamicLayout);
125                         yield return descriptor;
126                 }
127
128                 protected virtual IEnumerable<ScriptReference> GetScriptReferences () {
129                         yield break;
130                 }
131
132                 protected override void OnPreRender (EventArgs e) {
133                         base.OnPreRender (e);
134                         ScriptManager.RegisterScriptControl (this);
135
136                         if (_progressTemplate == null)
137                                 throw new InvalidOperationException (String.Format ("A ProgressTemplate must be specified on UpdateProgress control with ID '{0}'.", ID));
138
139                         Control container = new Control ();
140                         _progressTemplate.InstantiateIn (container);
141                         Controls.Add (container);
142                 }
143
144                 protected override void Render (HtmlTextWriter writer) {
145                         if (DynamicLayout)
146                                 writer.AddStyleAttribute (HtmlTextWriterStyle.Display, "none");
147                         else {
148                                 writer.AddStyleAttribute (HtmlTextWriterStyle.Display, "block");
149                                 writer.AddStyleAttribute (HtmlTextWriterStyle.Visibility, "hidden");
150                         }
151                         writer.AddAttribute (HtmlTextWriterAttribute.Id, ClientID);
152                         writer.RenderBeginTag (HtmlTextWriterTag.Div);
153                         base.Render (writer);
154                         writer.RenderEndTag ();
155
156                         ScriptManager.RegisterScriptDescriptors (this);
157                 }
158
159                 #region IScriptControl Members
160
161                 IEnumerable<ScriptDescriptor> IScriptControl.GetScriptDescriptors () {
162                         return GetScriptDescriptors ();
163                 }
164
165                 IEnumerable<ScriptReference> IScriptControl.GetScriptReferences () {
166                         return GetScriptReferences ();
167                 }
168
169                 #endregion
170         }
171 }