using awt = java.awt;
using geom = java.awt.geom;
using font = java.awt.font;
+using TextAttribute = java.awt.font.TextAttribute;
namespace System.Drawing {
static readonly FontFamily _genericSansSerif;
static readonly FontFamily _genericSerif;
static readonly FontCollection _installedFonts;
+ internal static readonly awt.Container Container;
static FontFamily() {
+ Container = new awt.Container();
_installedFonts = new InstalledFontCollection();
- _genericMonospace = new FontFamily("Monospaced");
- _genericSansSerif = new FontFamily("SansSerif");
- _genericSerif = new FontFamily("Serif");
+ _genericMonospace = new FontFamily(GenericFontFamilies.Monospace);
+ _genericSansSerif = new FontFamily(GenericFontFamilies.SansSerif);
+ _genericSerif = new FontFamily(GenericFontFamilies.Serif);
}
private readonly string _name;
+ private awt.FontMetrics _fontMetrics = null;
+ private FontStyle _lastStyle = FontStyle.Regular;
+ private readonly awt.Font _font;
+
// this is unavailable through Java API, usually 2048 for TT fonts
const int UnitsPerEm = 2048;
-
-
-// ~FontFamily()
-// {
-// }
+ // the margin for text drawing
+ const int DrawMargin = 571;
+ #region ctors
+
// dummy ctors to work around convertor problems
internal FontFamily() {}
internal FontFamily(IntPtr family) {}
+
+ static string ToGenericFontName(GenericFontFamilies genericFamily) {
+ switch(genericFamily) {
+ case GenericFontFamilies.SansSerif:
+ return "SansSerif";
+ case GenericFontFamilies.Serif:
+ return "Serif";
+ default:
+ return "Monospaced";
+ }
+ }
- public FontFamily(string familyName) : this(familyName, null)
- {}
+ public FontFamily(string familyName) : this(familyName, null) {
+ }
public FontFamily(string name, FontCollection fontCollection) {
+ if (name == null)
+ throw new ArgumentNullException("name");
+
if (fontCollection == null)
fontCollection = _installedFonts;
- string familyName = fontCollection.GetFamilyName(name);
- if (familyName == null)
- throw new ArgumentException(String.Format("Font family '{0}' not found", name));
+ if (fontCollection.Contains(name))
+ _name = name;
+ else {
+ _name = ToGenericFontName(GenericFontFamilies.SansSerif);
+ fontCollection = _installedFonts;
+ }
- _name = familyName;
+ _font = fontCollection.GetInitialFont( _name );
}
- public FontFamily(GenericFontFamilies genericFamily) {
- switch(genericFamily) {
- case GenericFontFamilies.SansSerif:
- _name = _genericSansSerif._name;
- break;
- case GenericFontFamilies.Serif:
- _name = _genericSerif._name;
- break;
- default:
- _name = _genericMonospace._name;
- break;
- }
+ public FontFamily(GenericFontFamilies genericFamily) : this(ToGenericFontName(genericFamily)) {
}
-
+ #endregion
+
public string Name {
get {
return _name;
}
}
+ internal int GetDrawMargin(FontStyle style) {
+ return DrawMargin;
+ }
+
+ awt.FontMetrics GetMetrics(FontStyle style) {
+ if ((_lastStyle != style) || (_fontMetrics == null)) {
+ java.util.Map attrib = Font.DeriveStyle( FamilyFont.getAttributes(), style, true);
+ attrib.put(TextAttribute.SIZE, new java.lang.Float((float)(UnitsPerEm<<1)));
+ _fontMetrics = Container.getFontMetrics( FamilyFont.deriveFont( attrib ) );
+ }
+ return _fontMetrics;
+ }
+
+ public int GetCellAscent(FontStyle style) {
+ return GetMetrics(style).getMaxAscent()>>1;
+ }
+
+ public int GetCellDescent(FontStyle style) {
+ return GetMetrics(style).getMaxDecent()>>1;
+ }
+
+ public int GetEmHeight(FontStyle style) {
+ return UnitsPerEm;
+ }
+
+ public int GetLineSpacing(FontStyle style) {
+ return GetMetrics(style).getHeight()>>1;
+ }
+
+ public string GetName(int language) {
+ try {
+ CultureInfo culture = new CultureInfo(language, false);
+ java.util.Locale locale = vmw.@internal.EnvironmentUtils.getLocaleFromCultureInfo( culture );
+
+ return FamilyFont.getFamily( locale );
+ }
+ catch {
+ return Name;
+ }
+ }
+
+ public bool IsStyleAvailable(FontStyle style) {
+ //unable to get this infromation from java
+ return true;
+ }
+
+ #region static members
+
public static FontFamily[] Families {
get {
return _installedFonts.Families;
public static FontFamily GenericMonospace {
get {
- return _genericMonospace;
+ return (FontFamily)_genericMonospace.MemberwiseClone();
}
}
public static FontFamily GenericSansSerif {
get {
- return _genericSansSerif;
+ return (FontFamily)_genericSansSerif.MemberwiseClone();
}
}
public static FontFamily GenericSerif {
get {
- return _genericSerif;
+ return (FontFamily)_genericSerif.MemberwiseClone();
}
}
+ public static FontFamily[] GetFamilies(Graphics graphics) {
+ if (graphics == null) {
+ throw new ArgumentNullException("graphics");
+ }
+ return _installedFonts.Families;
+ }
+
+ #endregion
+
+ #region Object members
+
public override bool Equals(object obj) {
if (this == obj)
return true;
return string.Compare(Name, ((FontFamily)obj).Name, true) == 0;
}
- awt.FontMetrics GetMetrics(FontStyle style) {
- awt.Container c = new awt.Container();
- return c.getFontMetrics(new Font(this, (float)(UnitsPerEm<<1), style, GraphicsUnit.World).NativeObject);
- }
-
- public int GetCellAscent(FontStyle style) {
- return GetMetrics(style).getMaxAscent()>>1;
- }
-
- public int GetCellDescent(FontStyle style) {
- return GetMetrics(style).getMaxDecent()>>1;
- }
-
- public int GetEmHeight(FontStyle style) {
- return UnitsPerEm;
- }
-
- public static FontFamily[] GetFamilies(Graphics graphics) {
- if (graphics == null) {
- throw new ArgumentNullException("graphics");
- }
- return _installedFonts.Families;
- }
-
public override int GetHashCode() {
return Name.ToLower().GetHashCode();
}
- public int GetLineSpacing(FontStyle style) {
- return GetMetrics(style).getHeight()>>1;
- }
-
- public string GetName(int language) {
- CultureInfo culture = new CultureInfo(language, false);
- //TBD: get java locale
- return new awt.Font(_name, awt.Font.PLAIN, 1).getFamily(null);
- }
-
- public bool IsStyleAvailable(FontStyle style) {
- return (new Font(this, (float)(UnitsPerEm<<1), style, GraphicsUnit.World).Style & style) == style;
- }
-
public override string ToString() {
return string.Format("[{0}: Name={1}]", GetType().Name, Name);
}
-
+ #endregion
#region IDisposable Members
public void Dispose() {
- // TODO: Add FontFamily.Dispose implementation
}
#endregion
+
+ internal awt.Font FamilyFont {
+ get {
+ return _font;
+ }
+ }
}
}