2001-12-21 Gaurav Vaish <gvaish@iitk.ac.in>
[mono.git] / mcs / class / System.Web / System.Web.UI.WebControls / Style.cs
1 /**\r
2  * Namespace: System.Web.UI.WebControls\r
3  * Class:     Style\r
4  *\r
5  * Author:  Gaurav Vaish\r
6  * Maintainer: gvaish@iitk.ac.in\r
7  * Contact: <my_scripts2001@yahoo.com>, <gvaish@iitk.ac.in>\r
8  * Implementation: yes\r
9  * Status:  100%\r
10  *\r
11  * (C) Gaurav Vaish (2001)\r
12  */\r
13 \r
14 using System;\r
15 using System.Text;\r
16 using System.Collections;\r
17 using System.Drawing;\r
18 using System.Globalization;\r
19 using System.ComponentModel;\r
20 using System.Web;\r
21 using System.Web.UI;\r
22 \r
23 namespace System.Web.UI.WebControls\r
24 {\r
25         public class Style : Component , IStateManager\r
26         {\r
27                 internal static int MARKED      = (0x01 << 0);\r
28                 internal static int BACKCOLOR   = (0x01 << 1);\r
29                 internal static int BORDERCOLOR = (0x01 << 2);\r
30                 internal static int BORDERSTYLE = (0x01 << 3);\r
31                 internal static int BORDERWIDTH = (0x01 << 4);\r
32                 internal static int CSSCLASS    = (0x01 << 5);\r
33                 internal static int FORECOLOR   = (0x01 << 6);\r
34                 internal static int HEIGHT      = (0x01 << 7);\r
35                 internal static int WIDTH       = (0x01 << 8);\r
36                 internal static int FONT_BOLD   = (0x01 << 9);\r
37                 internal static int FONT_ITALIC = (0x01 << 10);\r
38                 internal static int FONT_NAMES  = (0x01 << 11);\r
39                 internal static int FONT_SIZE   = (0x01 << 12);\r
40                 internal static int FONT_STRIKE = (0x01 << 13);\r
41                 internal static int FONT_OLINE  = (0x01 << 14);\r
42                 internal static int FONT_ULINE  = (0x01 << 15);\r
43 \r
44                 internal static string selectionBitString = "_SystemWebUIWebControlsStyle_SBS";\r
45 \r
46                 private StateBag viewState;\r
47                 private int      selectionBits;\r
48                 private bool     selfStateBag;\r
49 \r
50                 private FontInfo font;\r
51 \r
52                 public Style()\r
53                 {\r
54                         Initialize(null);\r
55                         selfStateBag = true;\r
56                 }\r
57 \r
58                 public Style(StateBag bag): base()\r
59                 {\r
60                         Initialize(bag);\r
61                         selfStateBag = false;\r
62                 }\r
63 \r
64                 private void Initialize(StateBag bag)\r
65                 {\r
66                         viewState     = bag;\r
67                         selectionBits = 0x00;\r
68                 }\r
69 \r
70                 internal virtual StateBag ViewState\r
71                 {\r
72                         get\r
73                         {\r
74                                 if(viewState == null)\r
75                                 {\r
76                                         viewState = new StateBag(false);\r
77                                         if(IsTrackingViewState)\r
78                                                 viewState.TrackViewState();\r
79                                 }\r
80                                 return viewState;\r
81                         }\r
82                 }\r
83 \r
84                 internal bool IsSet(int bit)\r
85                 {\r
86                         return ( (selectionBits & bit) != 0x00);\r
87                 }\r
88 \r
89                 internal virtual void Set(int bit)\r
90                 {\r
91                         selectionBits |= bit;\r
92                         if(IsTrackingViewState)\r
93                                 selectionBits |= MARKED;\r
94                 }\r
95 \r
96                 public Color BackColor\r
97                 {\r
98                         get\r
99                         {\r
100                                 if(IsSet(BACKCOLOR))\r
101                                         return (Color)ViewState["BackColor"];\r
102                                 return Color.Empty;\r
103                         }\r
104                         set\r
105                         {\r
106                                 ViewState["BackColor"] = value;\r
107                                 Set(BACKCOLOR);\r
108                         }\r
109                 }\r
110 \r
111                 public Color BorderColor\r
112                 {\r
113                         get\r
114                         {\r
115                                 if(IsSet(BORDERCOLOR))\r
116                                         return (Color)ViewState["BorderColor"];\r
117                                 return Color.Empty;\r
118                         }\r
119                         set\r
120                         {\r
121                                 ViewState["BorderColor"] = value;\r
122                                 Set(BORDERCOLOR);\r
123                         }\r
124                 }\r
125 \r
126                 public BorderStyle BorderStyle\r
127                 {\r
128                         get\r
129                         {\r
130                                 if(IsSet(BORDERSTYLE))\r
131                                         return (BorderStyle)ViewState["BorderStyle"];\r
132                                 return BorderStyle.NotSet;\r
133                         }\r
134                         set\r
135                         {\r
136                                 ViewState["BorderStyle"] = value;\r
137                                 Set(BORDERSTYLE);\r
138                         }\r
139                 }\r
140 \r
141                 public Unit BorderWidth\r
142                 {\r
143                         get\r
144                         {\r
145                                 if(IsSet(BORDERWIDTH))\r
146                                         return (Unit)ViewState["BorderWidth"];\r
147                                 return Unit.Empty;\r
148                         }\r
149                         set\r
150                         {\r
151                                 ViewState["BorderWidth"] = value;\r
152                                 Set(BORDERWIDTH);\r
153                         }\r
154                 }\r
155 \r
156                 public string CssClass\r
157                 {\r
158                         get\r
159                         {\r
160                                 if(IsSet(CSSCLASS))\r
161                                         return (string)ViewState["CssClass"];\r
162                                 return string.Empty;\r
163                         }\r
164                         set\r
165                         {\r
166                                 ViewState["CssClass"] = value;\r
167                                 Set(CSSCLASS);\r
168                         }\r
169                 }\r
170 \r
171                 public Color ForeColor\r
172                 {\r
173                         get\r
174                         {\r
175                                 if(IsSet(FORECOLOR))\r
176                                         return (Color)ViewState["ForeColor"];\r
177                                 return Color.Empty;\r
178                         }\r
179                         set\r
180                         {\r
181                                 ViewState["ForeColor"] = value;\r
182                                 Set(FORECOLOR);\r
183                         }\r
184                 }\r
185 \r
186                 public Unit Height\r
187                 {\r
188                         get\r
189                         {\r
190                                 if(IsSet(HEIGHT))\r
191                                         return (Unit)ViewState["Height"];\r
192                                 return Unit.Empty;\r
193                         }\r
194                         set\r
195                         {\r
196                                 ViewState["Height"] = value;\r
197                                 Set(HEIGHT);\r
198                         }\r
199                 }\r
200 \r
201                 public Unit Width\r
202                 {\r
203                         get\r
204                         {\r
205                                 if(IsSet(WIDTH))\r
206                                         return (Unit)ViewState["Width"];\r
207                                 return Unit.Empty;\r
208                         }\r
209                         set\r
210                         {\r
211                                 ViewState["Width"] = value;\r
212                                 Set(HEIGHT);\r
213                         }\r
214                 }\r
215 \r
216                 public FontInfo Font\r
217                 {\r
218                         get\r
219                         {\r
220                                 if(font==null)\r
221                                         font = new FontInfo(this);\r
222                                 return font;\r
223                         }\r
224                 }\r
225 \r
226                 internal virtual bool IsEmpty\r
227                 {\r
228                         get\r
229                         {\r
230                                 return (selectionBits != 0);\r
231                         }\r
232                 }\r
233 \r
234                 private void AddColor(HtmlTextWriter writer, HtmlTextWriterStyle style, Color color)\r
235                 {\r
236                         if(!color.IsEmpty)\r
237                                 writer.AddStyleAttribute(style, ColorTranslator.ToHtml(color));\r
238                 }\r
239 \r
240                 private static string StringArrayToString(string[] array, char separator)\r
241                 {\r
242                         if(array.Length == 0)\r
243                                 return String.Empty;\r
244                         StringBuilder sb = new StringBuilder();\r
245                         for(int i=0; i < array.Length; i++)\r
246                         {\r
247                                 if(i==0)\r
248                                 {\r
249                                         sb.Append(array[0]);\r
250                                 } else\r
251                                 {\r
252                                         sb.Append(separator);\r
253                                         sb.Append(array[i]);\r
254                                 }\r
255                         }\r
256                         return sb.ToString();\r
257                 }\r
258 \r
259                 public void AddAttributesToRender(HtmlTextWriter writer)\r
260                 {\r
261                         AddAttributesToRender(writer, null);\r
262                 }\r
263 \r
264                 public void AddAttributesToRender(HtmlTextWriter writer, WebControl owner)\r
265                 {\r
266                         if(IsSet(BACKCOLOR))\r
267                         {\r
268                                 AddColor(writer, HtmlTextWriterStyle.BackgroundColor, (Color)ViewState["BackColor"]);\r
269                         }\r
270 \r
271                         if(IsSet(BORDERCOLOR))\r
272                         {\r
273                                 AddColor(writer, HtmlTextWriterStyle.BorderColor, (Color)ViewState["BorderColor"]);\r
274                         }\r
275 \r
276                         if(IsSet(FORECOLOR))\r
277                         {\r
278                                 AddColor(writer, HtmlTextWriterStyle.Color, (Color)ViewState["ForeColor"]);\r
279                         }\r
280 \r
281                         if(IsSet(CSSCLASS))\r
282                         {\r
283                                 string cssClass = (string)ViewState["CssClass"];\r
284                                 if(cssClass.Length > 0)\r
285                                         writer.AddAttribute(HtmlTextWriterAttribute.Class, cssClass);\r
286                         }\r
287 \r
288                         if(!BorderWidth.IsEmpty)\r
289                         {\r
290                                 writer.AddStyleAttribute(HtmlTextWriterStyle.BorderWidth, BorderWidth.ToString(CultureInfo.InvariantCulture));\r
291                                 if(BorderStyle!=BorderStyle.NotSet)\r
292                                 {\r
293                                         writer.AddStyleAttribute(HtmlTextWriterStyle.BorderStyle, Enum.Format(typeof(BorderStyle), BorderStyle, "G"));\r
294                                 } else\r
295                                 {\r
296                                         if(BorderWidth.Value != 0.0)\r
297                                         {\r
298                                                 writer.AddStyleAttribute(HtmlTextWriterStyle.BorderStyle, "solid");\r
299                                         }\r
300                                 }\r
301                         } else\r
302                         {\r
303                                 if(BorderStyle!=BorderStyle.NotSet)\r
304                                 {\r
305                                         writer.AddStyleAttribute(HtmlTextWriterStyle.BorderStyle, Enum.Format(typeof(BorderStyle), BorderStyle, "G"));\r
306                                 }\r
307                         }\r
308 \r
309                         if(Font.Names.Length > 0)\r
310                         {\r
311                                 writer.AddStyleAttribute(HtmlTextWriterStyle.FontFamily, StringArrayToString(Font.Names,','));\r
312                         }\r
313 \r
314                         if(!Font.Size.IsEmpty)\r
315                         {\r
316                                 writer.AddStyleAttribute(HtmlTextWriterStyle.FontSize, Font.Size.ToString(CultureInfo.InvariantCulture));\r
317                         }\r
318 \r
319                         if(Font.Bold)\r
320                         {\r
321                                 writer.AddStyleAttribute(HtmlTextWriterStyle.FontWeight, "bold");\r
322                         }\r
323 \r
324                         if(Font.Italic)\r
325                         {\r
326                                 writer.AddStyleAttribute(HtmlTextWriterStyle.FontStyle, "italic");\r
327                         }\r
328 \r
329                         string textDecoration = String.Empty;\r
330                         if(Font.Strikeout)\r
331                         {\r
332                                 textDecoration += " strikeout";\r
333                         }\r
334                         if(Font.Underline)\r
335                         {\r
336                                 textDecoration += " underline";\r
337                         }\r
338                         if(Font.Overline)\r
339                         {\r
340                                 textDecoration += " overline";\r
341                         }\r
342                         if(textDecoration.Length > 0)\r
343                         {\r
344                                 writer.AddStyleAttribute(HtmlTextWriterStyle.TextDecoration, textDecoration);\r
345                         }\r
346 \r
347                         Unit u = Unit.Empty;\r
348                         if(IsSet(HEIGHT))\r
349                         {\r
350                                 u = (Unit)ViewState["Height"];\r
351                                 writer.AddStyleAttribute(HtmlTextWriterStyle.Height, u.ToString(CultureInfo.InvariantCulture));\r
352                         }\r
353                         if(IsSet(WIDTH))\r
354                         {\r
355                                 u = (Unit)ViewState["Width"];\r
356                                 writer.AddStyleAttribute(HtmlTextWriterStyle.Width, u.ToString(CultureInfo.InvariantCulture));\r
357                         }\r
358                 }\r
359 \r
360                 public virtual void CopyFrom(Style source)\r
361                 {\r
362                         if(source!=null && !source.IsEmpty)\r
363                         {\r
364                                 Font.CopyFrom(source.Font);\r
365                                 if(source.Height!=Unit.Empty)\r
366                                 {\r
367                                         Height = source.Height;\r
368                                 }\r
369                                 if(source.Width!=Unit.Empty)\r
370                                 {\r
371                                         Width = source.Width;\r
372                                 }\r
373                                 if(source.BorderColor!=Color.Empty)\r
374                                 {\r
375                                         BorderColor = source.BorderColor;\r
376                                 }\r
377                                 if(source.BorderWidth!=Unit.Empty)\r
378                                 {\r
379                                         BorderWidth = source.BorderWidth;\r
380                                 }\r
381                                 if(source.BorderStyle!=BorderStyle.NotSet)\r
382                                 {\r
383                                         BorderStyle = source.BorderStyle;\r
384                                 }\r
385                                 if(source.BackColor!=Color.Empty)\r
386                                 {\r
387                                         BackColor = source.BackColor;\r
388                                 }\r
389                                 if(source.CssClass!=String.Empty)\r
390                                 {\r
391                                         CssClass = source.CssClass;\r
392                                 }\r
393                                 if(source.ForeColor!=Color.Empty)\r
394                                 {\r
395                                         ForeColor = source.ForeColor;\r
396                                 }\r
397                         }\r
398                 }\r
399 \r
400                 public virtual void MergeWith(Style with)\r
401                 {\r
402                         if(with!=null && !with.IsEmpty)\r
403                         {\r
404                                 if(IsEmpty)\r
405                                 {\r
406                                         CopyFrom(with);\r
407                                         return;\r
408                                 }\r
409 \r
410                                 Font.MergeWith(with.Font);\r
411                                 if(!IsSet(HEIGHT) && with.Height!=Unit.Empty)\r
412                                 {\r
413                                         Height = with.Height;\r
414                                 }\r
415                                 if(!IsSet(WIDTH) && with.Width!=Unit.Empty)\r
416                                 {\r
417                                         Width = with.Width;\r
418                                 }\r
419                                 if(!IsSet(BORDERCOLOR) && with.BorderColor!=Color.Empty)\r
420                                 {\r
421                                         BorderColor = with.BorderColor;\r
422                                 }\r
423                                 if(!IsSet(BORDERWIDTH) && with.BorderWidth!=Unit.Empty)\r
424                                 {\r
425                                         BorderWidth = with.BorderWidth;\r
426                                 }\r
427                                 if(!IsSet(BORDERSTYLE) && with.BorderStyle!=BorderStyle.NotSet)\r
428                                 {\r
429                                         BorderStyle = with.BorderStyle;\r
430                                 }\r
431                                 if(!IsSet(BACKCOLOR) && with.BackColor!=Color.Empty)\r
432                                 {\r
433                                         BackColor = with.BackColor;\r
434                                 }\r
435                                 if(!IsSet(CSSCLASS) && with.CssClass!=String.Empty)\r
436                                 {\r
437                                         CssClass = with.CssClass;\r
438                                 }\r
439                                 if(!IsSet(FORECOLOR) && with.ForeColor!=Color.Empty)\r
440                                 {\r
441                                         ForeColor = with.ForeColor;\r
442                                 }\r
443                         }\r
444                 }\r
445                 \r
446                 public virtual void Reset()\r
447                 {\r
448                         if(IsSet(BACKCOLOR))\r
449                                 ViewState.Remove("BackColor");\r
450                         if(IsSet(BORDERCOLOR))\r
451                                 ViewState.Remove("BorderColor");\r
452                         if(IsSet(BORDERSTYLE))\r
453                                 ViewState.Remove("BorderStyle");\r
454                         if(IsSet(BORDERWIDTH))\r
455                                 ViewState.Remove("BorderWidth");\r
456                         if(IsSet(CSSCLASS))\r
457                                 ViewState.Remove("CssClass");\r
458                         if(IsSet(FORECOLOR))\r
459                                 ViewState.Remove("ForeColor");\r
460                         if(IsSet(HEIGHT))\r
461                                 ViewState.Remove("Height");\r
462                         if(IsSet(WIDTH))\r
463                                 ViewState.Remove("Width");\r
464                         if(font!=null)\r
465                                 font.Reset();\r
466                         selectionBits = 0x00;\r
467                 }\r
468 \r
469                 protected bool IsTrackingViewState\r
470                 {\r
471                         get\r
472                         {\r
473                                 return ( (selectionBits & MARKED) != 0x00 );\r
474                         }\r
475                 }\r
476 \r
477                 protected internal virtual void TrackViewState()\r
478                 {\r
479                         if(viewState!=null)\r
480                                 ViewState.TrackViewState();\r
481                         Set(MARKED);\r
482                 }\r
483 \r
484                 protected internal object SaveViewState()\r
485                 {\r
486                         if(viewState != null)\r
487                         {\r
488                                 if(IsSet(MARKED))\r
489                                 {\r
490                                         ViewState[selectionBitString] = selectionBits;\r
491                                 }\r
492                                 if(selfStateBag)\r
493                                 {\r
494                                         return ViewState.SaveViewState();\r
495                                 }\r
496                         }\r
497                         return null;\r
498                 }\r
499                 \r
500                 protected internal void LoadViewState(object state)\r
501                 {\r
502                         if(state!=null && selfStateBag)\r
503                         {\r
504                                 ViewState.LoadViewState(state);\r
505                         }\r
506                         if(viewState!=null)\r
507                         {\r
508                                 selectionBits = (int)ViewState[selectionBitString];\r
509                         }\r
510                 }\r
511                 \r
512                 void IStateManager.LoadViewState(object state)\r
513                 {\r
514                         LoadViewState(state);\r
515                 }\r
516                 \r
517                 object IStateManager.SaveViewState()\r
518                 {\r
519                         return SaveViewState();\r
520                 }\r
521                 \r
522                 void IStateManager.TrackViewState()\r
523                 {\r
524                         TrackViewState();\r
525                 }\r
526                 \r
527                 bool IStateManager.IsTrackingViewState\r
528                 {\r
529                         get\r
530                         {\r
531                                 return IsTrackingViewState;\r
532                         }\r
533                 }\r
534         }\r
535 }\r