2 using System.Runtime.Serialization;
3 using System.Runtime.InteropServices;
4 using System.ComponentModel;
6 using TextAttribute = java.awt.font.TextAttribute;
8 namespace System.Drawing {
10 public sealed class Font: MarshalByRefObject, ISerializable, ICloneable, IDisposable {
14 const byte DEFAULT_CHARSET = 1;
16 private readonly GraphicsUnit _gUnit = GraphicsUnit.Point;
17 private readonly FontFamily _fontFamily;
18 private readonly awt.Font _jFont;
19 private readonly byte _charset;
22 private readonly string _systemFontName;
27 internal awt.Font NativeObject {
35 void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) {
36 info.AddValue("Name", Name);
37 info.AddValue("Size", Size);
38 info.AddValue("Style", Style, typeof(FontStyle));
39 info.AddValue("Unit", Unit, typeof(GraphicsUnit));
46 private Font (SerializationInfo info, StreamingContext context)
48 info.GetString("Name"),
49 info.GetSingle("Size"),
50 (FontStyle)info.GetValue("Style", typeof(FontStyle)),
51 (GraphicsUnit)info.GetValue("Unit", typeof(GraphicsUnit)) ) {
54 public Font(Font original, FontStyle style) {
55 _jFont = original.NativeObject.deriveFont( DeriveStyle(original.NativeObject.getAttributes(), style, true) );
56 _gUnit = original._gUnit;
57 _fontFamily = original._fontFamily;
58 _charset = original._charset;
61 public Font(FontFamily family, float emSize)
62 : this(family, emSize, FontStyle.Regular, GraphicsUnit.Point, DEFAULT_CHARSET, false) {
65 public Font(FontFamily family, float emSize, FontStyle style)
66 : this(family, emSize, style, GraphicsUnit.Point, DEFAULT_CHARSET, false) {
68 public Font(FontFamily family, float emSize, GraphicsUnit unit)
69 : this(family, emSize, FontStyle.Regular, unit, DEFAULT_CHARSET, false) {
72 public Font(FontFamily family, float emSize, FontStyle style, GraphicsUnit unit)
73 : this(family, emSize, style, unit, DEFAULT_CHARSET, false) {
76 public Font(FontFamily family, float emSize, FontStyle style, GraphicsUnit unit, byte charSet)
77 : this(family, emSize, style, unit, charSet, false) {
80 public Font(FontFamily family, float emSize, FontStyle style, GraphicsUnit unit, byte charSet, bool isVertical) {
82 throw new ArgumentNullException("family");
88 java.util.Hashtable attribs = new java.util.Hashtable();
89 attribs.put(TextAttribute.FAMILY, family.Name/*TODO: family doungrade possibility*/);
91 attribs.put(TextAttribute.POSTURE, TextAttribute.POSTURE_REGULAR);
93 float newSize = emSize * Graphics.UnitConversion[ (int)_gUnit ];
94 attribs.put(TextAttribute.SIZE, new java.lang.Float(newSize));
96 DeriveStyle(attribs, style, false);
98 _jFont = family.FamilyFont.deriveFont(attribs);
101 public Font(string familyName, float emSize)
102 : this(familyName, emSize, FontStyle.Regular, GraphicsUnit.Point, (byte)0, false) {
105 public Font(string familyName, float emSize, FontStyle style)
106 : this(familyName, emSize, style, GraphicsUnit.Point, (byte)0, false) {
109 public Font(string familyName, float emSize, GraphicsUnit unit)
110 : this(familyName, emSize, FontStyle.Regular, unit, (byte)0, false) {
113 public Font(string familyName, float emSize, FontStyle style, GraphicsUnit unit)
114 : this(familyName, emSize, style, unit, (byte)0, false) {
117 public Font(string familyName, float emSize, FontStyle style, GraphicsUnit unit, byte charSet)
118 : this(familyName, emSize, style, unit, charSet, false) {
121 public Font(string familyName, float emSize, FontStyle style, GraphicsUnit unit, byte charSet, bool isVertical)
122 : this (GetFontFamily (familyName), emSize, style, unit, charSet, isVertical) {
126 internal Font (string familyName, float emSize, string systemName)
127 : this (familyName, emSize) {
128 _systemFontName = systemName;
132 static FontFamily GetFontFamily (string familyName) {
134 if (familyName == null)
135 throw new ArgumentNullException ("familyName");
137 // NOTE: If family name is null, empty or invalid,
138 // MS creates Microsoft Sans Serif font.
140 return new FontFamily (familyName);
143 return FontFamily.GenericSansSerif;
149 #region IDisposable members
151 public void Dispose() {
158 public object Clone() {
159 return (Font)MemberwiseClone();
166 public IntPtr ToHfont ()
168 throw new NotImplementedException();
172 #region public properties
176 return _jFont.isBold();
180 public FontFamily FontFamily {
186 public byte GdiCharSet {
192 public bool GdiVerticalFont {
194 return Name.StartsWith("@");
200 return FontFamily.Container.getFontMetrics(NativeObject).getHeight();
206 return _jFont.isItalic();
212 return _jFont.getName();
218 return SizeInPoints / Graphics.UnitConversion[ (int)_gUnit ];
222 public float SizeInPoints {
224 return _jFont.getSize2D();
228 public bool Strikeout {
231 if((java.lang.Boolean)_jFont.getAttributes().get(TextAttribute.STRIKETHROUGH)
232 == TextAttribute.STRIKETHROUGH_ON )
241 public FontStyle Style {
243 FontStyle style = FontStyle.Regular;
245 style |= FontStyle.Bold;
247 style |= FontStyle.Italic;
249 style |= FontStyle.Underline;
251 style |= FontStyle.Strikeout;
257 public bool Underline {
260 if((java.lang.Integer)_jFont.getAttributes().get(TextAttribute.UNDERLINE)
261 == TextAttribute.UNDERLINE_ON )
270 [TypeConverter(typeof(FontConverter.FontUnitConverter))]
271 public GraphicsUnit Unit {
279 public bool IsSystemFont {
281 return !string.IsNullOrEmpty (_systemFontName);
286 public string SystemFontName {
288 return _systemFontName;
295 public override System.String ToString() {
296 return ("[Font: Name="+ Name +", Size="+ Size +", Style="+ Style +", Units="+ Unit +"]");
299 static internal java.util.Map DeriveStyle(java.util.Map attribs, FontStyle style, bool createNew) {
300 java.util.Map newAttribs;
302 newAttribs = new java.util.Hashtable( attribs.size() );
303 object [] keys = attribs.keySet().toArray();
304 for (int i=0; i < keys.Length; i++)
305 newAttribs.put( keys[i], attribs.get( keys[i] ) );
308 newAttribs = attribs;
311 if((style & FontStyle.Bold) == FontStyle.Bold)
312 newAttribs.put(TextAttribute.WEIGHT, TextAttribute.WEIGHT_BOLD);
314 newAttribs.remove(TextAttribute.WEIGHT);
317 if((style & FontStyle.Italic) == FontStyle.Italic)
318 newAttribs.put(TextAttribute.POSTURE, TextAttribute.POSTURE_OBLIQUE);
320 newAttribs.put(TextAttribute.POSTURE, TextAttribute.POSTURE_REGULAR);
323 if((style & FontStyle.Underline) == FontStyle.Underline)
324 newAttribs.put(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON);
326 newAttribs.remove(TextAttribute.UNDERLINE);
329 if((style & FontStyle.Strikeout) == FontStyle.Strikeout)
330 newAttribs.put(TextAttribute.STRIKETHROUGH, TextAttribute.STRIKETHROUGH_ON);
332 newAttribs.remove(TextAttribute.STRIKETHROUGH);