merge r98531
[mono.git] / mcs / class / System.Web.Extensions / System.Web.UI / Timer.cs
1 //
2 // Timer.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         [DefaultProperty ("Interval")]
38         [Designer ("System.Web.UI.Design.TimerDesigner, System.Web.Extensions.Design, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35")]
39         [NonVisualControl]
40         [SupportsEventValidation]
41         [DefaultEvent ("Tick")]
42         public class Timer : Control, IPostBackEventHandler, IScriptControl
43         {
44                 ScriptManager _scriptManager;
45
46                 [Category ("Behavior")]
47                 [DefaultValue (true)]
48                 public bool Enabled {
49                         get {
50                                 object o = ViewState ["Enabled"];
51                                 if (o == null)
52                                         return true;
53                                 return (bool) o;
54                         }
55                         set {
56                                 ViewState ["Enabled"] = value;
57                         }
58                 }
59
60                 [DefaultValue (60000)]
61                 [Category ("Behavior")]
62                 public int Interval {
63                         get {
64                                 object o = ViewState ["Interval"];
65                                 if (o == null)
66                                         return 60000;
67                                 return (int) o;
68                         }
69                         set {
70                                 ViewState ["Interval"] = value;
71                         }
72                 }
73
74                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
75                 [Browsable (false)]
76                 [EditorBrowsable (EditorBrowsableState.Never)]
77                 public override bool Visible {
78                         get {
79                                 return base.Visible;
80                         }
81                         set {
82                                 throw new NotImplementedException ();
83                         }
84                 }
85
86                 ScriptManager ScriptManager {
87                         get {
88                                 if (_scriptManager == null) {
89                                         _scriptManager = ScriptManager.GetCurrent (Page);
90                                         if (_scriptManager == null)
91                                                 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));
92                                 }
93                                 return _scriptManager;
94                         }
95                 }
96
97                 [Category ("Action")]
98                 public event EventHandler<EventArgs> Tick;
99
100                 protected virtual IEnumerable<ScriptDescriptor> GetScriptDescriptors () {
101                         ScriptControlDescriptor descriptor = new ScriptControlDescriptor ("Sys.UI._Timer", this.ClientID);
102                         descriptor.AddProperty ("enabled", Enabled);
103                         descriptor.AddProperty ("interval", Interval);
104                         descriptor.AddProperty ("uniqueID", UniqueID);
105                         yield return descriptor;
106                 }
107
108                 protected virtual IEnumerable<ScriptReference> GetScriptReferences () {
109                         ScriptReference script;
110                         script = new ScriptReference ("MicrosoftAjaxTimer.js", String.Empty);
111                         script.NotifyScriptLoaded = false;
112                         yield return script;
113                 }
114
115                 protected override void OnPreRender (EventArgs e) {
116                         base.OnPreRender (e);
117                         ScriptManager.RegisterScriptControl (this);
118                 }
119
120                 protected virtual void OnTick (EventArgs e) {
121                         if (Tick != null)
122                                 Tick (this, e);
123                 }
124
125                 protected virtual void RaisePostBackEvent (string eventArgument) {
126                         OnTick (EventArgs.Empty);
127                 }
128
129                 protected override void Render (HtmlTextWriter writer) {
130
131                         Page.ClientScript.RegisterForEventValidation (UniqueID);
132
133                         writer.AddStyleAttribute (HtmlTextWriterStyle.Display, "none");
134                         writer.AddStyleAttribute (HtmlTextWriterStyle.Visibility, "hidden");
135                         writer.AddAttribute (HtmlTextWriterAttribute.Id, ClientID);
136                         writer.RenderBeginTag (HtmlTextWriterTag.Span);
137                         base.Render (writer);
138                         writer.RenderEndTag ();
139
140                         ScriptManager.RegisterScriptDescriptors (this);
141                 }
142
143                 #region IPostBackEventHandler Members
144
145                 void IPostBackEventHandler.RaisePostBackEvent (string eventArgument) {
146                         RaisePostBackEvent (eventArgument);
147                 }
148
149                 #endregion
150
151                 #region IScriptControl Members
152
153                 IEnumerable<ScriptDescriptor> IScriptControl.GetScriptDescriptors () {
154                         return GetScriptDescriptors ();
155                 }
156
157                 IEnumerable<ScriptReference> IScriptControl.GetScriptReferences () {
158                         return GetScriptReferences ();
159                 }
160
161                 #endregion
162         }
163 }
164