This commit was manufactured by cvs2svn to create branch 'mono-1-0'.
[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
38 namespace System.Drawing.Printing {
39         /// <summary>
40         /// Summary description for MarginsConverter.
41         /// </summary>
42         public class MarginsConverter : ExpandableObjectConverter {
43                 public MarginsConverter() {
44                 }
45                 #region Methods
46                 public override bool CanConvertFrom(ITypeDescriptorContext context,Type sourceType) {
47                         if (sourceType == typeof(string))
48                                 return true;
49                         
50                         return base.CanConvertFrom(context, sourceType);
51                 }
52                 
53                 public override bool CanConvertTo(ITypeDescriptorContext context,Type destinationType) {
54                         if (destinationType == typeof(string))
55                                 return true;
56                         
57                         return base.CanConvertTo(context, destinationType);
58                 }
59                 
60                 public override object ConvertFrom(ITypeDescriptorContext context,CultureInfo culture,object value) {
61                         if (value is string)
62                         {
63                                 if (value == null)
64                                         return new Margins();
65                                 
66                                 // format [left];[right];[top];[bottom]
67                                 string separator = @"( |\t)*";
68                                 separator = separator + ";" + separator;
69                                 string regex = @"(?<left>\d+)" + separator + @"(?<right>\d+)" + separator + @"(?<top>\d+)" + separator + @"(?<bottom>\d+)";
70                                 
71                                 Match match = new Regex(regex).Match(value as string);
72                                 if (!match.Success)
73                                         throw new ArgumentException("value");
74                                 
75                                 int left, right, top, bottom;
76                                 try
77                                 {
78                                         left = int.Parse(match.Groups["left"].Value);
79                                         right = int.Parse(match.Groups["right"].Value);
80                                         top = int.Parse(match.Groups["top"].Value);
81                                         bottom = int.Parse(match.Groups["bottom"].Value);
82                                 }
83                                 catch (Exception e)
84                                 {
85                                         throw new ArgumentException("value", e);
86                                 }
87                                 return new Margins(left, right, top, bottom);
88                         } else
89                                 return base.ConvertFrom(context, culture, value);
90                 }
91                 
92                 public override object ConvertTo(ITypeDescriptorContext context,CultureInfo culture,object value,Type destinationType) {
93                         if (destinationType == typeof(string) && value is Margins)
94                         {
95                                 Margins source = value as Margins;
96                                 string ret = "{0}; {1}; {2}; {3}";
97                                 return String.Format(ret, source.Left, source.Right, source.Top, source.Bottom);
98                         } else
99                                 return base.ConvertTo(context, culture, value, destinationType);
100                 }
101                 
102                 public override bool GetCreateInstanceSupported(ITypeDescriptorContext context)
103                 {
104                         return true;
105                 }
106                 
107                 public override object CreateInstance(ITypeDescriptorContext context, System.Collections.IDictionary propertyValues)
108                 {
109                         try
110                         {
111                                 Margins margins = new Margins();
112                                 margins.Left = int.Parse(propertyValues["Left"].ToString());
113                                 margins.Right = int.Parse(propertyValues["Right"].ToString());
114                                 margins.Top = int.Parse(propertyValues["Top"].ToString());
115                                 margins.Bottom = int.Parse(propertyValues["Bottom"].ToString());
116                                 return margins;
117                         }
118                         catch (Exception)
119                         {
120                                 // in case of error, return null
121                                 return null;
122                         }
123                 }
124                 #endregion
125         }
126 }