consider update panel correctly within follow api:
[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                                 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
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
125                 protected virtual IEnumerable<ScriptReference> GetScriptReferences () {
126                         yield break;
127                 }
128
129                 protected 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
141                 protected 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
158                 IEnumerable<ScriptDescriptor> IScriptControl.GetScriptDescriptors () {
159                         return GetScriptDescriptors ();
160                 }
161
162                 IEnumerable<ScriptReference> IScriptControl.GetScriptReferences () {
163                         return GetScriptReferences ();
164                 }
165
166                 #endregion
167         }
168 }