2 // DependencyPropertyChangedEventArgs.cs
5 // Chris Toshok (toshok@ximian.com)
7 // (C) 2007 Novell, Inc.
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 using System.ComponentModel;
30 using System.Globalization;
31 using System.Windows.Converters;
32 using System.Windows.Markup;
34 namespace System.Windows {
37 [TypeConverter (typeof(Int32RectConverter))]
38 [ValueSerializer (typeof(Int32RectValueSerializer))]
39 public struct Int32Rect : IFormattable
41 int _x, _y, _width, _height;
43 public Int32Rect (int x, int y, int width, int height)
48 this._height = height;
51 public static bool operator != (Int32Rect int32Rect1, Int32Rect int32Rect2)
53 return !int32Rect1.Equals(int32Rect2);
56 public static bool operator == (Int32Rect int32Rect1, Int32Rect int32Rect2)
58 return int32Rect1.Equals(int32Rect2);
61 public static Int32Rect Empty {
62 get { return new Int32Rect (0, 0, 0, 0); }
66 get { return _height; }
67 set { _height = value; }
71 get { return _width == 0 && _height == 0; }
75 get { return _width; }
76 set { _width = value; }
89 public bool Equals (Int32Rect value)
91 return (_x == value._x &&
93 _width == value._width &&
94 _height == value._height);
97 public override bool Equals (object o)
99 if (!(o is Int32Rect))
102 return Equals ((Int32Rect)o);
105 public static bool Equals (Int32Rect int32Rect1, Int32Rect int32Rect2)
107 return int32Rect1.Equals (int32Rect2);
110 public override int GetHashCode ()
115 hashCode = (hashCode * 397) ^ _y;
116 hashCode = (hashCode * 397) ^ _width;
117 hashCode = (hashCode * 397) ^ _height;
122 public static Int32Rect Parse (string source)
125 throw new ArgumentNullException ("source");
127 if (source.Trim () == "Empty")
133 var tokenizer = new NumericListTokenizer (source, CultureInfo.InvariantCulture);
138 if (int.TryParse (tokenizer.GetNextToken (), NumberStyles.Integer, CultureInfo.InvariantCulture, out x)
139 && int.TryParse (tokenizer.GetNextToken (), NumberStyles.Integer, CultureInfo.InvariantCulture, out y)
140 && int.TryParse (tokenizer.GetNextToken (), NumberStyles.Integer, CultureInfo.InvariantCulture, out width)
141 && int.TryParse (tokenizer.GetNextToken (), NumberStyles.Integer, CultureInfo.InvariantCulture, out height))
143 if (!tokenizer.HasNoMoreTokens ())
145 throw new InvalidOperationException ("Invalid Int32Rect format: " + source);
147 value = new Int32Rect (x, y, width, height);
151 throw new FormatException (string.Format ("Invalid Int32Rect format: {0}", source));
157 public override string ToString ()
159 return ToString (null);
162 public string ToString (IFormatProvider provider)
164 return ToString (null, provider);
167 string IFormattable.ToString (string format, IFormatProvider provider)
169 return ToString (provider);
172 private string ToString (string format, IFormatProvider provider)
177 if (provider == null)
178 provider = CultureInfo.CurrentCulture;
181 format = string.Empty;
183 var separator = NumericListTokenizer.GetSeparator (provider);
185 var rectFormat = string.Format (
186 "{{0:{0}}}{1}{{1:{0}}}{1}{{2:{0}}}{1}{{3:{0}}}",
188 return string.Format (provider, rectFormat,
189 _x, _y, _width, _height);