svn path=/branches/mono-1-1-9/mcs/; revision=50438
[mono.git] / mcs / class / System.Drawing / System.Drawing / FontFamily.cs
1 //
2 // System.Drawing.FontFamily.cs
3 //
4 // Author:
5 //   Dennis Hayes (dennish@Raytek.com)
6 //   Alexandre Pigolkine (pigolkine@gmx.de)
7 //
8 // Copyright (C) 2002/2004 Ximian, Inc http://www.ximian.com
9 //
10 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
11 //
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:
19 // 
20 // The above copyright notice and this permission notice shall be
21 // included in all copies or substantial portions of the Software.
22 // 
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.
30 //
31 using System;
32 using System.Drawing.Text;
33 using System.Text;
34 using System.Runtime.InteropServices;
35
36 namespace System.Drawing {
37
38         public sealed class FontFamily : MarshalByRefObject, IDisposable 
39         {
40                 
41                 static private FontFamily genericMonospace = null;
42                 static private FontFamily genericSansSerif = null;
43                 static private FontFamily genericSerif = null;
44                 private string name;
45                 internal IntPtr nativeFontFamily = IntPtr.Zero;
46                                 
47                 internal FontFamily(IntPtr fntfamily)
48                 {
49                         nativeFontFamily = fntfamily;           
50                         refreshName();                  
51                 }
52                 
53                 internal void refreshName()
54                 {
55                         if (nativeFontFamily != IntPtr.Zero) {
56                                 int language = 0;                       
57                                 StringBuilder sBuilder = new StringBuilder (GDIPlus.FACESIZE * UnicodeEncoding.CharSize);       
58                                 Status status = GDIPlus.GdipGetFamilyName (nativeFontFamily, sBuilder, language);
59                                 GDIPlus.CheckStatus (status);
60                                 name = sBuilder.ToString();                             
61                         }
62                 }
63                 
64                 //Need to come back here, is Arial the right thing to do
65                 internal FontFamily() : this ("Arial", null)
66                 {
67                                                                                 
68                 }
69                 
70                 
71                 ~FontFamily()
72                 {       
73                         Dispose ();
74                 }
75
76                 internal IntPtr NativeObject
77                 {            
78                         get     
79                         {
80                                 return nativeFontFamily;
81                         }
82                         set     
83                         {
84                                 nativeFontFamily = value;
85                         }
86                 }
87
88                 public FontFamily(GenericFontFamilies genericFamily) 
89                 {
90                         Status status;
91                         switch (genericFamily) 
92                         {
93                                 case GenericFontFamilies.Monospace:
94                                         status = GDIPlus.GdipGetGenericFontFamilyMonospace (out nativeFontFamily);
95                                         GDIPlus.CheckStatus (status);
96                                         refreshName ();
97                                         break;
98                                 case GenericFontFamilies.SansSerif:
99                                         status = GDIPlus.GdipGetGenericFontFamilySansSerif (out nativeFontFamily);
100                                         GDIPlus.CheckStatus (status);
101                                         refreshName ();
102                                         break;
103                                 case GenericFontFamilies.Serif:
104                                         status = GDIPlus.GdipGetGenericFontFamilySerif (out nativeFontFamily);
105                                         GDIPlus.CheckStatus (status);
106                                         refreshName ();
107                                         break;
108                                 default:        // Undocumented default 
109                                         status = GDIPlus.GdipGetGenericFontFamilyMonospace (out nativeFontFamily);
110                                         GDIPlus.CheckStatus (status);
111                                         refreshName ();
112                                         break;
113                         }
114                 }
115                 
116                 public FontFamily(string familyName) : this (familyName, null)
117                 {                       
118                 }
119                 
120                 public FontFamily (string familyName, FontCollection collection) 
121                 {
122                         Status status;
123                         if ( collection != null )
124                                 status = GDIPlus.GdipCreateFontFamilyFromName (familyName, collection.nativeFontCollection, out nativeFontFamily);
125                         else
126                                 status = GDIPlus.GdipCreateFontFamilyFromName (familyName, IntPtr.Zero, out nativeFontFamily);
127                         GDIPlus.CheckStatus (status);
128                         
129                         refreshName ();
130                 }
131                 
132                 public string Name 
133                 {
134                         get 
135                         {
136                                 return name;
137                         }
138                 }
139                 
140                 public static FontFamily GenericMonospace 
141                 {
142                         get 
143                         {
144                                 
145                                 IntPtr generic = IntPtr.Zero;
146                                 Status status = GDIPlus.GdipGetGenericFontFamilyMonospace (out generic);
147                                 GDIPlus.CheckStatus (status);
148                                 FontFamily genericMonospace = new FontFamily (generic);                                         
149                                 genericMonospace.refreshName ();
150                                 return genericMonospace;
151                         }
152                 }
153                 
154                 public static FontFamily GenericSansSerif 
155                 {
156                         get 
157                         {
158                                 IntPtr generic = IntPtr.Zero;
159                                 Status status = GDIPlus.GdipGetGenericFontFamilySansSerif (out generic);
160                                 GDIPlus.CheckStatus (status);
161                                 FontFamily genericSansSerif = new FontFamily (generic);
162                                 genericSansSerif.refreshName ();
163                                 return genericSansSerif;
164                         }
165                 }
166                 
167                 public static FontFamily GenericSerif 
168                 {
169                         get 
170                         {
171                                 IntPtr generic = IntPtr.Zero;
172                                 Status status = GDIPlus.GdipGetGenericFontFamilySerif (out generic);
173                                 GDIPlus.CheckStatus (status);
174                                 FontFamily genericSerif = new FontFamily (generic);
175                                 genericSerif.refreshName ();                            
176                                 return genericSerif;
177                         }
178                 }
179                 
180                 //[MONO TODO]
181                 //Need to check how to get the Flags attribute to read 
182                 //bitwise value of the enumeration
183                 internal int GetStyleCheck(FontStyle style)
184                 {
185                         int styleCheck = 0 ;
186                         switch ( style) {
187                                 case FontStyle.Bold:
188                                         styleCheck = 1;
189                                         break;
190                                 case FontStyle.Italic:
191                                         styleCheck = 2;
192                                         break;
193                                 case FontStyle.Regular:
194                                         styleCheck = 0;
195                                         break;
196                                 case FontStyle.Strikeout:
197                                         styleCheck = 8;
198                                         break;
199                                 case FontStyle.Underline:
200                                         styleCheck = 4;
201                                         break;
202                         }
203                         return styleCheck;
204                 }
205
206                 public int GetCellAscent (FontStyle style) 
207                 {
208                         Status status;
209                         short outProperty;
210                         int styleCheck = GetStyleCheck (style);                         
211                         status = GDIPlus.GdipGetCellAscent (nativeFontFamily, styleCheck, out outProperty);
212                         GDIPlus.CheckStatus (status);
213
214                         return (int) outProperty;
215                 }
216                 
217                 public int GetCellDescent (FontStyle style) 
218                 {
219                         Status status;
220                         short outProperty;
221                         int styleCheck = GetStyleCheck (style);                         
222                         status = GDIPlus.GdipGetCellDescent (nativeFontFamily, styleCheck, out outProperty);
223                         GDIPlus.CheckStatus (status);
224
225                         return (int) outProperty;
226                 }
227                 
228                 public int GetEmHeight (FontStyle style) 
229                 {
230                         Status status;
231                         short outProperty;
232                         int styleCheck = GetStyleCheck (style);                         
233                         status = GDIPlus.GdipGetEmHeight (nativeFontFamily, styleCheck, out outProperty);
234                         GDIPlus.CheckStatus (status);
235
236                         return (int) outProperty;
237                 }
238                 
239                 public int GetLineSpacing (FontStyle style)
240                 {
241                         Status status;
242                         short outProperty;
243                         int styleCheck = GetStyleCheck (style);                         
244                         status = GDIPlus.GdipGetLineSpacing (nativeFontFamily, styleCheck, out outProperty);
245                         GDIPlus.CheckStatus (status);   
246
247                         return (int) outProperty;
248                 }
249                 
250                 public bool IsStyleAvailable (FontStyle style)
251                 {
252                         Status status;
253                         bool outProperty;
254                         int styleCheck = GetStyleCheck (style);                         
255                         status = GDIPlus.GdipIsStyleAvailable (nativeFontFamily, styleCheck, out outProperty);
256                         GDIPlus.CheckStatus (status);
257
258                         return outProperty;
259                 }
260                 
261                 public void Dispose ()
262                 {       
263                         Status status = GDIPlus.GdipDeleteFontFamily (nativeFontFamily);
264                         if ( status == Status.Ok ) 
265                                 nativeFontFamily = IntPtr.Zero;                                                         
266                 }               
267                 
268                 public override bool Equals(object obj)
269                 {
270                         if (!(obj is FontFamily))
271                                 return false;
272                                 
273                         FontFamily o = (FontFamily) obj;
274                         return (nativeFontFamily == o.nativeFontFamily);                        
275                 }
276                 
277                 public override int GetHashCode ()
278                 {
279                         return name.GetHashCode ();                     
280                 }
281                         
282                         
283                 public static FontFamily[] Families
284                 {
285                         get {
286                                 
287                                 return GetFamilies (null);
288                         }
289                 }               
290                 
291                 public static FontFamily[] GetFamilies (Graphics graphics)
292                 {
293                         InstalledFontCollection fntcol = new InstalledFontCollection ();
294                         return fntcol.Families;                 
295                 }
296                 
297                 [MonoTODO ("We only support the default system language")]
298                 public string GetName (int language)
299                 {
300                         return name;
301                 }
302                 
303                 public override string ToString ()
304                 {
305                         return "FontFamily :" + name;
306                 }
307
308         }
309 }
310