backport this one too
[mono.git] / mcs / class / System.Drawing / System.Drawing.Printing / MarginsConverter.cs
1 //
2 // System.Drawing.MarginsConverter.cs
3 //
4 // Author:
5 //   Dennis Hayes (dennish@Raytek.com)
6 //   Herve Poussineau (hpoussineau@fr.st)
7 //
8 // (C) 2002 Ximian, Inc
9 //
10
11 //
12 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
13 //
14 // Permission is hereby granted, free of charge, to any person obtaining
15 // a copy of this software and associated documentation files (the
16 // "Software"), to deal in the Software without restriction, including
17 // without limitation the rights to use, copy, modify, merge, publish,
18 // distribute, sublicense, and/or sell copies of the Software, and to
19 // permit persons to whom the Software is furnished to do so, subject to
20 // the following conditions:
21 // 
22 // The above copyright notice and this permission notice shall be
23 // included in all copies or substantial portions of the Software.
24 // 
25 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
26 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
28 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
29 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
30 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
31 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
32 //
33 using System;
34 using System.ComponentModel;
35 using System.Globalization;
36 using System.Text.RegularExpressions;
37 using System.ComponentModel.Design.Serialization;
38 using System.Reflection;\r
39
40 namespace System.Drawing.Printing {
41         /// <summary>
42         /// Summary description for MarginsConverter.
43         /// </summary>
44         public class MarginsConverter : ExpandableObjectConverter {
45                 public MarginsConverter() {
46                 }
47                 #region Methods
48                 public override bool CanConvertFrom(ITypeDescriptorContext context,Type sourceType) {
49                         if (sourceType == typeof(string))
50                                 return true;
51                         
52                         return base.CanConvertFrom(context, sourceType);
53                 }
54                 
55                 public override bool CanConvertTo(ITypeDescriptorContext context,Type destinationType) {
56                         if (destinationType == typeof(string))
57                                 return true;
58                         
59                         if (destinationType == typeof (InstanceDescriptor))
60                                 return true;
61
62                         return base.CanConvertTo(context, destinationType);
63                 }
64                 
65                 public override object ConvertFrom(ITypeDescriptorContext context,CultureInfo culture,object value) {
66                         if (value is string)
67                         {
68                                 if (value == null)
69                                         return new Margins();
70                                 
71                                 // format [left];[right];[top];[bottom]
72                                 string separator = @"( |\t)*";
73                                 separator = separator + ";" + separator;
74                                 string regex = @"(?<left>\d+)" + separator + @"(?<right>\d+)" + separator + @"(?<top>\d+)" + separator + @"(?<bottom>\d+)";
75                                 
76                                 Match match = new Regex(regex).Match(value as string);
77                                 if (!match.Success)
78                                         throw new ArgumentException("value");
79                                 
80                                 int left, right, top, bottom;
81                                 try
82                                 {
83                                         left = int.Parse(match.Groups["left"].Value);
84                                         right = int.Parse(match.Groups["right"].Value);
85                                         top = int.Parse(match.Groups["top"].Value);
86                                         bottom = int.Parse(match.Groups["bottom"].Value);
87                                 }
88                                 catch (Exception e)
89                                 {
90                                         throw new ArgumentException("value", e);
91                                 }
92                                 return new Margins(left, right, top, bottom);
93                         } else
94                                 return base.ConvertFrom(context, culture, value);
95                 }
96                 
97                 public override object ConvertTo(ITypeDescriptorContext context,CultureInfo culture,object value,Type destinationType) {
98                         if (destinationType == typeof(string) && value is Margins)
99                         {
100                                 Margins source = value as Margins;
101                                 string ret = "{0}; {1}; {2}; {3}";
102                                 return String.Format(ret, source.Left, source.Right, source.Top, source.Bottom);
103                         }
104                         if (destinationType == typeof (InstanceDescriptor) && value is Margins) {
105                                 Margins c = (Margins) value;
106                                 ConstructorInfo ctor = typeof(Margins).GetConstructor (new Type[] {typeof(int), typeof(int), typeof(int), typeof(int)} );
107                                 return new InstanceDescriptor (ctor, new object[] {c.Left, c.Right, c.Top, c.Bottom});
108                         }
109
110                         return base.ConvertTo(context, culture, value, destinationType);
111                 }
112                 
113                 public override bool GetCreateInstanceSupported(ITypeDescriptorContext context)
114                 {
115                         return true;
116                 }
117                 
118                 public override object CreateInstance(ITypeDescriptorContext context, System.Collections.IDictionary propertyValues)
119                 {
120                         try
121                         {
122                                 Margins margins = new Margins();
123                                 margins.Left = int.Parse(propertyValues["Left"].ToString());
124                                 margins.Right = int.Parse(propertyValues["Right"].ToString());
125                                 margins.Top = int.Parse(propertyValues["Top"].ToString());
126                                 margins.Bottom = int.Parse(propertyValues["Bottom"].ToString());
127                                 return margins;
128                         }
129                         catch (Exception)
130                         {
131                                 // in case of error, return null
132                                 return null;
133                         }
134                 }
135                 #endregion
136         }
137 }