Merge branch 'master' of github.com:mono/mono into masterwork
[mono.git] / mcs / class / System.Drawing / System.Drawing / FontFamily.jvm.cs
index a869d2714135873fe5cec5450eb106f7a2796e01..900427437620cf1e153b8040883092e6e678f473 100644 (file)
@@ -34,6 +34,7 @@ using System.Globalization;
 using awt = java.awt;
 using geom = java.awt.geom;
 using font = java.awt.font;
+using TextAttribute = java.awt.font.TextAttribute;
 
 namespace System.Drawing {
 
@@ -43,63 +44,123 @@ 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;
@@ -108,22 +169,33 @@ namespace System.Drawing {
                
                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;
@@ -134,61 +206,28 @@ namespace System.Drawing {
                        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;
+                       }
+               }
        }
 }