2004-06-03 Gonzalo Paniagua Javier <gonzalo@ximian.com>
[mono.git] / mcs / class / System.Web / System.Web.UI.WebControls / Unit.cs
index 2cf17e758d27cfd00bbdab19a063d9f3c4d3ff08..cf915e2fd97ecabd8f15a6add5152c098e8823f5 100644 (file)
@@ -6,7 +6,7 @@
  * Maintainer: gvaish@iitk.ac.in\r
  * Contact: <my_scripts2001@yahoo.com>, <gvaish@iitk.ac.in>\r
  * Implementation: yes\r
- * Status:  99%\r
+ * Status:  100%\r
  *\r
  * (C) Gaurav Vaish (2001)\r
  */\r
@@ -19,140 +19,143 @@ using System.Web.UI;
 \r
 namespace System.Web.UI.WebControls\r
 {\r
+       [TypeConverter(typeof(UnitConverter))]\r
        public struct Unit\r
        {\r
                public static readonly Unit Empty = new Unit();\r
-               \r
+\r
                private static int Min = -32768;\r
                private static int Max = +32767;\r
-               \r
+\r
                private UnitType type;\r
                private double   val;\r
-               \r
+\r
                public static Unit Parse(string s)\r
                {\r
                        return new Unit(s);\r
                }\r
-               \r
+\r
                public static Unit Parse(string s, CultureInfo culture)\r
                {\r
                        return new Unit(s, culture);\r
                }\r
-               \r
+\r
                public static Unit Percentage(double n)\r
                {\r
-                       return new Unit(n);\r
+                       return new Unit (n, UnitType.Percentage);\r
                }\r
-               \r
+\r
                public static Unit Pixel(int n)\r
                {\r
-                       return new Unit(n);\r
+                       return new Unit (n, UnitType.Pixel);\r
                }\r
-               \r
+\r
                public static Unit Point(int n)\r
                {\r
                        return new Unit(n, UnitType.Point);\r
                }\r
-               \r
+\r
                public static bool operator ==(Unit left, Unit right)\r
                {\r
                        return (left.type == right.type && left.val == right.val);\r
                }\r
-               \r
+\r
                public static bool operator !=(Unit left, Unit right)\r
                {\r
                        return !(left == right);\r
                }\r
-               \r
+\r
                public static implicit operator Unit(int n)\r
                {\r
                        return new Unit(n);\r
                }\r
-               \r
+\r
                public Unit(double value)\r
                {\r
                        if(value < Min || value > Max)\r
                        {\r
-                               return ArgumentOutOfRangeException();\r
+                               throw new ArgumentOutOfRangeException();\r
                        }\r
                        val = value;\r
                        type = UnitType.Pixel;\r
                }\r
-               \r
+\r
                public Unit(int value)\r
                {\r
                        if(value < Min || value > Max)\r
                        {\r
-                               return ArgumentOutOfRangeException();\r
+                               throw new ArgumentOutOfRangeException();\r
                        }\r
                        val = value;\r
                        type = UnitType.Pixel;\r
                }\r
-               \r
+\r
                public Unit(string value): this(value, CultureInfo.CurrentCulture)\r
                {\r
                }\r
-               \r
+\r
                public Unit(double value, UnitType type)\r
                {\r
                        if(value < Min || value > Max)\r
                        {\r
-                               return ArgumentOutOfRangeException();\r
+                               throw new ArgumentOutOfRangeException();\r
                        }\r
                        val = value;\r
                        this.type = type;\r
                }\r
-               \r
+\r
                public Unit(string value, CultureInfo culture): this(value, culture, UnitType.Pixel)\r
                {\r
                }\r
-               \r
+\r
                internal Unit(string value, CultureInfo culture, UnitType defType)\r
                {\r
-                       if(value == null || value.Length == 0)\r
-                       {\r
-                               this.val = 0;\r
-                               this.type = UnitType.Pixel;\r
+                       string valueTrim;\r
+                       if (value == null || (valueTrim = value.Trim ()).Length == 0) {\r
+                               val = 0;\r
+                               type = UnitType.Pixel;\r
+                               return;\r
                        }\r
-                       if(culture == null)\r
+\r
+                       if (culture == null)\r
                                culture = CultureInfo.CurrentCulture;\r
-                       string strVal = value.Trim().ToLower();\r
+\r
+                       string strVal = valueTrim.ToLower ();\r
+                       int length = strVal.Length;\r
                        char c;\r
                        int start = -1;\r
-                       int current = 0;\r
-                       for(int i = 0; i < strVal.Length; i++)\r
-                       {\r
-                               c = strVal[i];\r
+                       for (int i = 0; i < length; i++) {\r
+                               c = strVal [i];\r
                                if( (c >= '0' && c <= '9') || (c == '-' || c == '.' || c == ',') )\r
                                        start = i;\r
                        }\r
-                       if(start == -1)\r
-                               throw new ArgumentException();\r
-                       if( (start + 1) < strVal.Length)\r
-                       {\r
-                               this.type = GetTypeFromString(strVal.Substring(start + 1).Trim());\r
-                       } else\r
-                       {\r
-                               this.type = defType;\r
+                       \r
+                       if (start == -1)\r
+                               throw new ArgumentException("No digits in 'value'");\r
+                       \r
+                       start++;\r
+                       if (start < length) {\r
+                               type = GetTypeFromString (strVal.Substring (start).Trim ());\r
+                               val  = 0;\r
+                       } else {\r
+                               type = defType;\r
                        }\r
-                       try\r
-                       {\r
-                               if(type == UnitType.Pixel)\r
-                               {\r
-                                       val = (double)((new In32Converter()).ConvertFromString(null, culture, strVal.Substring(0, start + 1)));\r
-                               } else\r
-                               {\r
-                                       val = (double)((new SingleConverter()).ConvertFromString(null, culture, strVal.Substring(0, start + 1)));\r
-                               }\r
-                       } catch(Exception e)\r
-                       {\r
-                               throw new ArgumentOutOfRangeException();\r
+\r
+                       try {\r
+                               string numbers = strVal.Substring (0, start);\r
+                               if (type == UnitType.Pixel)\r
+                                       val = (double) Int32.Parse (numbers, culture);\r
+                               else\r
+                                       val = (double) Single.Parse (numbers, culture);\r
+                       } catch (Exception) {\r
+                               throw new FormatException ("Error parsing " + value);\r
                        }\r
-                       if(val < Min || val > Max)\r
-                               throw new ArgumentOutOfRangeException();\r
+\r
+                       if (val < Min || val > Max)\r
+                               throw new ArgumentOutOfRangeException ();\r
                }\r
-               \r
-               private UnitType GetTypeFromString(string s)\r
+\r
+               private static UnitType GetTypeFromString(string s)\r
                {\r
                        if(s == null || s.Length == 0)\r
                                return UnitType.Pixel;\r
@@ -167,17 +170,17 @@ namespace System.Web.UI.WebControls
                                "%",\r
                                "em",\r
                                "ex"\r
-                       }\r
+                       };\r
                        int i = 0;\r
                        foreach(string cType in uTypes)\r
                        {\r
-                               if(s == uTypes[i])\r
-                                       return (UnitType)(i + 1);\r
+                               if(s == cType)\r
+                                       return (UnitType)Enum.ToObject(typeof(UnitType), (i + 1));\r
                                i++;\r
                        }\r
                        return UnitType.Pixel;\r
                }\r
-               \r
+\r
                private string GetStringFromPixel(UnitType ut)\r
                {\r
                        string[] uTypes = {\r
@@ -190,20 +193,20 @@ namespace System.Web.UI.WebControls
                                "%",\r
                                "em",\r
                                "ex"\r
-                       }\r
+                       };\r
                        if( !Enum.IsDefined(typeof(UnitType), ut) )\r
                                return "px";\r
-                       return uTypes[ut - 1];\r
+                       return uTypes[(int)ut - 1];\r
                }\r
-               \r
+\r
                public bool IsEmpty\r
                {\r
                        get\r
                        {\r
-                               throw new NotImplementedException();\r
+                               return (type == 0);\r
                        }\r
                }\r
-               \r
+\r
                public UnitType Type\r
                {\r
                        get\r
@@ -213,7 +216,7 @@ namespace System.Web.UI.WebControls
                                return type;\r
                        }\r
                }\r
-               \r
+\r
                public double Value\r
                {\r
                        get\r
@@ -221,7 +224,7 @@ namespace System.Web.UI.WebControls
                                return val;\r
                        }\r
                }\r
-               \r
+\r
                public override bool Equals(object obj)\r
                {\r
                        if(obj != null && obj is Unit)\r
@@ -231,24 +234,24 @@ namespace System.Web.UI.WebControls
                        }\r
                        return false;\r
                }\r
-               \r
+\r
                public override int GetHashCode()\r
                {\r
                        return ( (type.GetHashCode() << 2) | (val.GetHashCode()) );\r
                }\r
-               \r
+\r
                public override string ToString()\r
                {\r
                        if(IsEmpty)\r
                                return String.Empty;\r
-                       return ( val.ToString() + GetStringFromType(type) );\r
+                       return ( val.ToString() + GetStringFromPixel(type) );\r
                }\r
-               \r
-               public override string ToString(CultureInfo culture)\r
+\r
+               public string ToString(CultureInfo culture)\r
                {\r
                        if(IsEmpty)\r
                                return String.Empty;\r
-                       return ( val.ToString(culture) + GetStringFromType(type) );\r
+                       return ( val.ToString(culture.NumberFormat) + GetStringFromPixel(type) );\r
                }\r
        }\r
 }\r