2 // System.Drawing.MarginsConverter.cs
5 // Dennis Hayes (dennish@Raytek.com)
6 // Herve Poussineau (hpoussineau@fr.st)
8 // (C) 2002 Ximian, Inc
12 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
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:
22 // The above copyright notice and this permission notice shall be
23 // included in all copies or substantial portions of the Software.
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.
34 using System
.ComponentModel
;
35 using System
.Globalization
;
36 using System
.Text
.RegularExpressions
;
37 using System
.ComponentModel
.Design
.Serialization
;
38 using System
.Reflection
;
40 namespace System
.Drawing
.Printing
{
42 /// Summary description for MarginsConverter.
44 public class MarginsConverter
: ExpandableObjectConverter
{
45 public MarginsConverter() {
48 public override bool CanConvertFrom(ITypeDescriptorContext context
,Type sourceType
) {
49 if (sourceType
== typeof(string))
52 return base.CanConvertFrom(context
, sourceType
);
55 public override bool CanConvertTo(ITypeDescriptorContext context
,Type destinationType
) {
56 if (destinationType
== typeof(string))
59 if (destinationType
== typeof (InstanceDescriptor
))
62 return base.CanConvertTo(context
, destinationType
);
65 public override object ConvertFrom(ITypeDescriptorContext context
,CultureInfo culture
,object value) {
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+)";
76 Match match
= new Regex(regex
).Match(value as string);
78 throw new ArgumentException("value");
80 int left
, right
, top
, bottom
;
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
);
90 throw new ArgumentException("value", e
);
92 return new Margins(left
, right
, top
, bottom
);
94 return base.ConvertFrom(context
, culture
, value);
97 public override object ConvertTo(ITypeDescriptorContext context
,CultureInfo culture
,object value,Type destinationType
) {
98 if (destinationType
== typeof(string) && value is Margins
)
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
);
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}
);
110 return base.ConvertTo(context
, culture
, value, destinationType
);
113 public override bool GetCreateInstanceSupported(ITypeDescriptorContext context
)
118 public override object CreateInstance(ITypeDescriptorContext context
, System
.Collections
.IDictionary propertyValues
)
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());
131 // in case of error, return null