use ResolveClientUrl instead of ResolveUrl to be complient with MS.NET
[mono.git] / mcs / class / System.Web / System.Web.UI.WebControls / WebColorConverter.cs
1 // Permission is hereby granted, free of charge, to any person obtaining
2 // a copy of this software and associated documentation files (the
3 // "Software"), to deal in the Software without restriction, including
4 // without limitation the rights to use, copy, modify, merge, publish,
5 // distribute, sublicense, and/or sell copies of the Software, and to
6 // permit persons to whom the Software is furnished to do so, subject to
7 // the following conditions:
8 // 
9 // The above copyright notice and this permission notice shall be
10 // included in all copies or substantial portions of the Software.
11 // 
12 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
13 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
14 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
15 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
16 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
17 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
18 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
19 //
20 // Copyright (c) 2005 Novell, Inc. (http://www.novell.com)
21 //
22 // Authors:
23 //      Peter Bartok    (pbartok@novell.com)
24 //
25 //
26
27 using System.Drawing;
28 using System.Globalization;
29 using System.ComponentModel;
30 using System.Security.Permissions;
31
32 namespace System.Web.UI.WebControls {
33
34         // CAS
35         [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
36         [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
37         public class WebColorConverter : ColorConverter {
38
39                 // Converts from string to Color
40                 public override object ConvertFrom (ITypeDescriptorContext context, CultureInfo culture, object value) 
41                 {
42                         if (value is string) 
43                         {
44                                 string  s;
45
46                                 s = ((string)value).Trim();
47                                 if (s.Length == 0) 
48                                 {
49                                         return Color.Empty;
50                                 }
51
52                                 if (culture == null) {
53                                         culture = CultureInfo.InvariantCulture;
54                                 }
55
56                                 if (s[0] == '#') 
57                                 {
58                                         // Hex
59
60                                         // MS throws a generic exception, wrapping the specific exception, who knows why...
61                                         try 
62                                         {
63                                                 if (s.Length == 7) 
64                                                 {
65                                                         int     v;
66                                                         v = Int32.Parse(s.Substring(1), NumberStyles.HexNumber, culture);
67
68                                                         return Color.FromArgb(255, (v >> 16) & 0xff, (v >> 8) & 0xff, v & 0xff);
69                                                 } 
70                                                 else 
71                                                 {
72                                                         return Color.FromArgb(Int32.Parse(s.Substring(1), NumberStyles.HexNumber, culture));
73                                                 }
74                                         }
75
76                                         catch (FormatException e) 
77                                         {
78                                                 throw new Exception(s + "is not a valid color value", e);
79                                         }
80                                         catch (System.OverflowException e) 
81                                         {
82                                                 throw new Exception(s + " is not a valid color value", e);
83                                         }
84                                 } 
85                                 else 
86                                 {
87                                         // Name or decimal
88                                         int     n = 0;
89
90                                         try 
91                                         {
92                                                 n = Int32.Parse(s, NumberStyles.Integer, culture);
93                                         }
94
95                                         catch (FormatException e) 
96                                         {
97                                                 Color c;
98
99                                                 c = Color.FromName(s);
100                                                 if ((c.A != 0) || (c.R != 0) || (c.G != 0) || (c.B != 0)) 
101                                                 {
102                                                         return c;
103                                                 }
104
105                                                 throw new Exception(s + " is not a valid color value", e);
106                                         }
107
108                                         catch (System.OverflowException e) 
109                                         {
110                                                 throw new Exception(s + " is not a valid color value", e);
111                                         }
112
113                                         catch 
114                                         {
115                                                 throw;
116                                         }
117
118                                         return Color.FromArgb(n);
119                                 }
120                         }
121                         return base.ConvertFrom (context, culture, value);
122                 }
123
124                 // Converts from Color to string
125                 public override object ConvertTo (ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) 
126                 {
127                         if (!(value is Color) || destinationType != typeof (string))
128                                 return base.ConvertTo (context, culture, value, destinationType);
129
130                         Color c = (Color) value;
131
132                         if (culture == null)
133                                 culture = CultureInfo.InvariantCulture;
134
135                         string s = c.ToKnownColor ().ToString ();
136                         if (s != "0")
137                                 return s;
138
139                         return String.Format (culture, "#{0:X2}{1:X2}{2:X2}", c.R, c.G, c.B);
140                 }
141         }
142 }