2 // System.Drawing.StringFormat.cs
5 // Dennis Hayes (dennish@Raytek.com)
6 // Miguel de Icaza (miguel@ximian.com)
7 // Jordi Mas i Hernandez (jordi@ximian.com)
9 // Copyright (C) 2002 Ximian, Inc (http://www.ximian.com)
10 // Copyright (C) 2004,2006 Novell, Inc (http://www.novell.com)
12 // Permission is hereby granted, free of charge, to any person obtaining
13 // a copy of this software and associated documentation files (the
14 // "Software"), to deal in the Software without restriction, including
15 // without limitation the rights to use, copy, modify, merge, publish,
16 // distribute, sublicense, and/or sell copies of the Software, and to
17 // permit persons to whom the Software is furnished to do so, subject to
18 // the following conditions:
20 // The above copyright notice and this permission notice shall be
21 // included in all copies or substantial portions of the Software.
23 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
27 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
28 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
29 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
32 using System.ComponentModel;
33 using System.Drawing.Text;
35 namespace System.Drawing {
37 public sealed class StringFormat : MarshalByRefObject, IDisposable, ICloneable
39 private static StringFormat genericDefault;
40 private IntPtr nativeStrFmt = IntPtr.Zero;
41 private int language = GDIPlus.LANG_NEUTRAL;
43 public StringFormat() : this (0, GDIPlus.LANG_NEUTRAL)
47 public StringFormat(StringFormatFlags options, int language)
49 Status status = GDIPlus.GdipCreateStringFormat (options, language, out nativeStrFmt);
50 GDIPlus.CheckStatus (status);
53 internal StringFormat(IntPtr native)
55 nativeStrFmt = native;
63 public void Dispose ()
66 System.GC.SuppressFinalize (this);
69 void Dispose (bool disposing)
71 if (nativeStrFmt != IntPtr.Zero) {
72 Status status = GDIPlus.GdipDeleteStringFormat (nativeStrFmt);
73 nativeStrFmt = IntPtr.Zero;
74 GDIPlus.CheckStatus (status);
78 public StringFormat (StringFormat format)
81 throw new ArgumentNullException ("format");
83 Status status = GDIPlus.GdipCloneStringFormat (format.NativeObject, out nativeStrFmt);
84 GDIPlus.CheckStatus (status);
87 public StringFormat (StringFormatFlags options)
89 Status status = GDIPlus.GdipCreateStringFormat (options, GDIPlus.LANG_NEUTRAL, out nativeStrFmt);
90 GDIPlus.CheckStatus (status);
93 public StringAlignment Alignment {
95 StringAlignment align;
96 Status status = GDIPlus.GdipGetStringFormatAlign (nativeStrFmt, out align);
97 GDIPlus.CheckStatus (status);
103 if ((value < StringAlignment.Near) || (value > StringAlignment.Far))
104 throw new InvalidEnumArgumentException ("Alignment");
106 Status status = GDIPlus.GdipSetStringFormatAlign (nativeStrFmt, value);
107 GDIPlus.CheckStatus (status);
111 public StringAlignment LineAlignment {
113 StringAlignment align;
114 Status status = GDIPlus.GdipGetStringFormatLineAlign (nativeStrFmt, out align);
115 GDIPlus.CheckStatus (status);
121 if ((value < StringAlignment.Near) || (value > StringAlignment.Far))
122 throw new InvalidEnumArgumentException ("Alignment");
124 Status status = GDIPlus.GdipSetStringFormatLineAlign (nativeStrFmt, value);
125 GDIPlus.CheckStatus (status);
129 public StringFormatFlags FormatFlags {
131 StringFormatFlags flags;
132 Status status = GDIPlus.GdipGetStringFormatFlags (nativeStrFmt, out flags);
133 GDIPlus.CheckStatus (status);
139 Status status = GDIPlus.GdipSetStringFormatFlags (nativeStrFmt, value);
140 GDIPlus.CheckStatus (status);
144 public HotkeyPrefix HotkeyPrefix {
146 HotkeyPrefix hotkeyPrefix;
147 Status status = GDIPlus.GdipGetStringFormatHotkeyPrefix (nativeStrFmt, out hotkeyPrefix);
148 GDIPlus.CheckStatus (status);
154 if ((value < HotkeyPrefix.None) || (value > HotkeyPrefix.Hide))
155 throw new InvalidEnumArgumentException ("HotkeyPrefix");
157 Status status = GDIPlus.GdipSetStringFormatHotkeyPrefix (nativeStrFmt, value);
158 GDIPlus.CheckStatus (status);
163 public StringTrimming Trimming {
165 StringTrimming trimming;
166 Status status = GDIPlus.GdipGetStringFormatTrimming (nativeStrFmt, out trimming);
167 GDIPlus.CheckStatus (status);
172 if ((value < StringTrimming.None) || (value > StringTrimming.EllipsisPath))
173 throw new InvalidEnumArgumentException ("Trimming");
175 Status status = GDIPlus.GdipSetStringFormatTrimming (nativeStrFmt, value);
176 GDIPlus.CheckStatus (status);
180 public static StringFormat GenericDefault {
184 Status status = GDIPlus.GdipStringFormatGetGenericDefault (out ptr);
185 GDIPlus.CheckStatus (status);
187 return new StringFormat (ptr);
192 public int DigitSubstitutionLanguage {
199 public static StringFormat GenericTypographic {
203 Status status = GDIPlus.GdipStringFormatGetGenericTypographic (out ptr);
204 GDIPlus.CheckStatus (status);
206 return new StringFormat (ptr);
210 public StringDigitSubstitute DigitSubstitutionMethod {
212 StringDigitSubstitute substitute;
214 Status status = GDIPlus.GdipGetStringFormatDigitSubstitution(nativeStrFmt, language, out substitute);
215 GDIPlus.CheckStatus (status);
222 public void SetMeasurableCharacterRanges (CharacterRange [] ranges)
224 Status status = GDIPlus.GdipSetStringFormatMeasurableCharacterRanges (nativeStrFmt,
225 ranges.Length, ranges);
227 GDIPlus.CheckStatus (status);
230 internal int GetMeasurableCharacterRangeCount ()
233 Status status = GDIPlus.GdipGetStringFormatMeasurableCharacterRangeCount (nativeStrFmt, out cnt);
235 GDIPlus.CheckStatus (status);
239 public object Clone()
243 Status status = GDIPlus.GdipCloneStringFormat (nativeStrFmt, out native);
244 GDIPlus.CheckStatus (status);
246 return new StringFormat (native);
249 public override string ToString()
251 return "[StringFormat, FormatFlags=" + this.FormatFlags.ToString() + "]";
254 internal IntPtr NativeObject
260 nativeStrFmt = value;
264 public void SetTabStops(float firstTabOffset, float[] tabStops)
266 Status status = GDIPlus.GdipSetStringFormatTabStops(nativeStrFmt, firstTabOffset, tabStops.Length, tabStops);
267 GDIPlus.CheckStatus (status);
270 public void SetDigitSubstitution(int language, StringDigitSubstitute substitute)
272 Status status = GDIPlus.GdipSetStringFormatDigitSubstitution(nativeStrFmt, this.language, substitute);
273 GDIPlus.CheckStatus (status);
276 public float[] GetTabStops(out float firstTabOffset)
281 Status status = GDIPlus.GdipGetStringFormatTabStopCount(nativeStrFmt, out count);
282 GDIPlus.CheckStatus (status);
284 float[] tabStops = new float[count];
287 status = GDIPlus.GdipGetStringFormatTabStops(nativeStrFmt, count, out firstTabOffset, tabStops);
288 GDIPlus.CheckStatus (status);