[bcl] Remove NET_3_5 defines from class libs
[mono.git] / mcs / class / System.Web.Extensions / System.Web.UI.WebControls / DataPagerField.cs
1 //
2 // System.Web.UI.WebControls.DataPagerField
3 //
4 // Authors:
5 //   Marek Habersack (mhabersack@novell.com)
6 //
7 // (C) 2007-2008 Novell, Inc
8 //
9
10 //
11 // Permission is hereby granted, free of charge, to any person obtaining
12 // a copy of this software and associated documentation files (the
13 // "Software"), to deal in the Software without restriction, including
14 // without limitation the rights to use, copy, modify, merge, publish,
15 // distribute, sublicense, and/or sell copies of the Software, and to
16 // permit persons to whom the Software is furnished to do so, subject to
17 // the following conditions:
18 // 
19 // The above copyright notice and this permission notice shall be
20 // included in all copies or substantial portions of the Software.
21 // 
22 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
25 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
26 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
27 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 //
30 using System;
31 using System.Collections.Specialized;
32 using System.ComponentModel;
33 using System.Globalization;
34 using System.Security.Permissions;
35 using System.Text;
36 using System.Web;
37 using System.Web.UI;
38
39 namespace System.Web.UI.WebControls
40 {
41         [AspNetHostingPermissionAttribute(SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
42         [AspNetHostingPermissionAttribute(SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
43         public abstract class DataPagerField : IStateManager
44         {
45                 static readonly object FieldChangedEvent = new object ();
46                 
47                 EventHandlerList events;
48                 StateBag _state = new StateBag ();
49                 DataPager _dataPager;
50
51                 bool _queryStringHandled;
52                 bool _isTrackingViewState;
53                 string _queryStringNavigateUrl;
54
55                 internal event EventHandler FieldChanged {
56                         add { AddEventHandler (FieldChangedEvent, value); }
57                         remove { RemoveEventHandler (FieldChangedEvent, value); }
58                 }
59                                 
60                 protected DataPagerField ()
61                 {
62                 }
63
64                 protected internal DataPagerField CloneField ()
65                 {
66                         DataPagerField ret = CreateField ();
67                         CopyProperties (ret);
68
69                         return ret;
70                 }
71
72                 protected virtual void CopyProperties (DataPagerField newField)
73                 {
74                         // assuming we should copy only the public properties
75                         newField.Visible = Visible;
76                 }
77
78                 public abstract void CreateDataPagers (DataPagerFieldItem container, int startRowIndex, int maximumRows,
79                                                        int totalRowCount, int fieldIndex);
80
81                 protected abstract DataPagerField CreateField ();
82
83                 protected string GetQueryStringNavigateUrl (int pageNumber)
84                 {
85                         if (_queryStringNavigateUrl == null && _dataPager != null) {
86                                 HttpContext ctx = HttpContext.Current;
87                                 HttpRequest req = ctx != null ? ctx.Request : null;
88                                 string queryFieldName = _dataPager.QueryStringField;
89                                 
90                                 if (req != null) {
91                                         StringBuilder sb = new StringBuilder (req.Path + "?");
92                                         NameValueCollection coll = req.QueryString;
93                                         
94                                         foreach (string k in coll.AllKeys) {
95                                                 if (String.Compare (k, queryFieldName, StringComparison.OrdinalIgnoreCase) == 0)
96                                                         continue;
97                                                 sb.Append (HttpUtility.UrlEncode (k) + "=" + HttpUtility.UrlEncode (coll [k]) + "&");
98                                         }
99
100                                         sb.Append (queryFieldName + "=");
101                                         _queryStringNavigateUrl = sb.ToString ();
102                                 } else
103                                         _queryStringNavigateUrl = String.Empty;
104                         }
105
106                         return _queryStringNavigateUrl + pageNumber.ToString (CultureInfo.InvariantCulture);
107                 }
108
109                 public abstract void HandleEvent (CommandEventArgs e);
110
111                 protected virtual void LoadViewState (Object savedState)
112                 {
113                         if (savedState == null)
114                                 return;
115
116                         ((IStateManager) ViewState).LoadViewState (savedState);
117                 }
118                 
119                 protected virtual void OnFieldChanged ()
120                 {
121                         InvokeEvent (FieldChangedEvent, EventArgs.Empty);
122                 }
123
124                 protected virtual object SaveViewState ()
125                 {
126                         return ((IStateManager) ViewState).SaveViewState ();
127                 }
128
129                 protected virtual void TrackViewState ()
130                 {
131                         _isTrackingViewState = true;
132                         ((IStateManager)ViewState).TrackViewState ();
133                 }
134
135                 protected DataPager DataPager {
136                         get { return _dataPager; }
137                 }
138                 
139                 protected bool QueryStringHandled {
140                         get { return _queryStringHandled; }
141                         set { _queryStringHandled = value; }
142                 }
143
144                 protected string QueryStringValue {
145                         get {
146                                 if (_dataPager == null)
147                                         return String.Empty;
148                                 
149                                 HttpContext ctx = HttpContext.Current;
150                                 HttpRequest req = ctx != null ? ctx.Request : null;
151
152                                 if (req == null)
153                                         return String.Empty;
154
155                                 return req.QueryString [_dataPager.QueryStringField];
156                         }
157                 }
158
159                 protected StateBag ViewState {
160                         get { return _state; }
161                 }
162
163                 public bool Visible {
164                         get {
165                                 object o = ViewState ["Visible"];
166                                 if (o == null)
167                                         return true;
168
169                                 return (bool) o;
170                         }
171                         
172                         set {
173                                 if (value != Visible) {
174                                         ViewState ["Visible"] = value;
175                                         OnFieldChanged ();
176                                 }
177                         }
178                 }
179
180                 protected bool IsTrackingViewState {
181                         get { return _isTrackingViewState; }
182                 }
183                 
184                 void IStateManager.TrackViewState ()
185                 {
186                         TrackViewState ();
187                 }
188
189                 bool IStateManager.IsTrackingViewState {
190                         get { return IsTrackingViewState; }
191                 }
192
193                 object IStateManager.SaveViewState ()
194                 {
195                         return SaveViewState ();
196                 }
197
198                 void IStateManager.LoadViewState (object state)
199                 {
200                         LoadViewState (state);
201                 }
202
203                 internal void SetDataPager (DataPager pager)
204                 {
205                         _dataPager = pager;
206                 }
207
208                 internal bool GetQueryModeStartRowIndex (int totalRowCount, int maximumRows, ref int startRowIndex, ref bool setPagePropertiesNeeded)
209                 {
210                         bool queryMode = !String.IsNullOrEmpty (DataPager.QueryStringField);
211                         if (!queryMode || QueryStringHandled)
212                                 return queryMode;
213
214                         QueryStringHandled = true;
215
216                         // We need to calculate the new start index since it is probably out
217                         // of date because the GET parameter with the page number hasn't
218                         // been processed yet
219                         int pageNumber;
220                         try {
221                                 pageNumber = Int32.Parse (QueryStringValue);
222                         } catch {
223                                 // ignore
224                                 pageNumber = -1;
225                         }
226
227                         if (pageNumber >= 0) {
228                                 pageNumber--; // we're zero-based since we're calculating
229                                 // the offset/index
230                                 if (pageNumber >= 0) {
231                                         // zero-based calculation again
232                                         int pageCount = (totalRowCount - 1) / maximumRows; 
233                                         if (pageNumber <= pageCount) {
234                                                 startRowIndex = pageNumber * maximumRows;
235                                                 setPagePropertiesNeeded = true;
236                                         }
237                                 }
238                         }
239
240                         return true;
241                 }
242                 
243                 void AddEventHandler (object key, EventHandler handler)
244                 {
245                         if (events == null)
246                                 events = new EventHandlerList ();
247                         events.AddHandler (key, handler);
248                 }
249
250                 void RemoveEventHandler (object key, EventHandler handler)
251                 {
252                         if (events == null)
253                                 return;
254                         events.RemoveHandler (key, handler);
255                 }
256
257                 void InvokeEvent (object key, EventArgs args)
258                 {
259                         if (events == null)
260                                 return;
261
262                         EventHandler eh = events [key] as EventHandler;
263                         if (eh == null)
264                                 return;
265                         eh (this, args);
266                 }
267         }
268 }