home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1995 November / PCWK1195.iso / inne / win95 / sieciowe / hotja32.lzh / hotjava / classsrc / awt / fonttable.java < prev    next >
Text File  |  1995-08-11  |  5KB  |  170 lines

  1. /*
  2.  * @(#)FontTable.java    1.11 95/04/10 Sami Shaio
  3.  *
  4.  * Copyright (c) 1994 Sun Microsystems, Inc. All Rights Reserved.
  5.  *
  6.  * Permission to use, copy, modify, and distribute this software
  7.  * and its documentation for NON-COMMERCIAL purposes and without
  8.  * fee is hereby granted provided that this copyright notice
  9.  * appears in all copies. Please refer to the file "copyright.html"
  10.  * for further important copyright and licensing information.
  11.  *
  12.  * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
  13.  * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
  14.  * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
  15.  * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
  16.  * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
  17.  * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
  18.  */
  19. package awt;
  20.  
  21. import java.lang.*;
  22. import java.util.*;
  23.  
  24. /**
  25.  * A class that creates font objects. Fonts are addressed by names in
  26.  * the FontTable. These names may not be the actual name of the font.
  27.  * By default, the names "Helvetica", "TimesRoman", "ZapfDingbats",
  28.  * "Dialog", "DialogInput", and "Courier" are always available.
  29.  * "Dialog" is bound to a native font that is appropriate for dialog
  30.  * components such as buttons or menus. In each font category, the
  31.  * sizes 8, 10, 12, 14, 24, 36 are always available. Other sizes may
  32.  * be specified and will work if the requested font is bound to a
  33.  * scalable font on the local platform or if the platform can do
  34.  * font-scaling. If scaling is not available, then the closest match
  35.  * is returned. 
  36.  * 
  37.  * @version 1.11 10 Apr 1995
  38.  * @author Sami Shaio
  39.  */
  40. public class FontTable {
  41.     static Hashtable    fontTable;
  42.  
  43.     static {
  44.     fontTable = new Hashtable(20);
  45.     }
  46.  
  47.     /**
  48.      * Return a platform-specific font given a generic name. See Font
  49.      * class for the appropriate values for style.
  50.      */
  51.     public Font getFont(String name, int style, int height) {
  52.     String  fName = compoundName(name, style, height);
  53.     Font    f = (Font)(fontTable.get(fName));
  54.  
  55.     if (f==null) {
  56.         try {
  57.         f = new Font(name, style, height);
  58.         } catch (Exception e) {
  59.         return null;
  60.         }
  61.         fontTable.put(fName, f);
  62.     }
  63.  
  64.     return f;
  65.     }
  66.  
  67.     /**
  68.      * Return a platform-specific font given a name of the form
  69.      * <generic_name>:style:size where style can be "plain",
  70.      * "bold", "italic" or "bolditalic".
  71.      */
  72.     public Font getFont(String compoundName) {
  73.     Font        f;
  74.     FontSpec    fspec = parseCompoundName(compoundName);
  75.  
  76.     f = (Font)(fontTable.get(compoundName));
  77.     if (f==null) {
  78.         try {
  79.         f = new Font(fspec.family, fspec.style, fspec.height);
  80.         } catch (Exception e) {
  81.         return null;
  82.         }
  83.         fontTable.put(compoundName, f);
  84.     }
  85.  
  86.     return f;    
  87.     }
  88.  
  89.     /**
  90.      * List the number of fonts on the native platform.
  91.      */
  92.     public int getNativeFontCount() {
  93.     throw new Exception("UNIMPLEMENTED");
  94.     }
  95.  
  96.     /**
  97.      * Return the name of the native font with the given index.
  98.      */
  99.     public String getNativeFont(int index) {
  100.     throw new Exception("UNIMPLEMENTED");
  101.     }
  102.  
  103.     /** Returns a string representation of a font-name, style and height.*/
  104.     public String compoundName(String name, int style, int height) {
  105.     String cn = name + ":";
  106.  
  107.     switch (style & ~Font.UNDERLINE) {
  108.       case Font.BOLD:
  109.         cn = cn + "bold";
  110.         break;
  111.       case Font.ITALIC:
  112.         cn = cn + "italic";
  113.         break;
  114.       case Font.BOLD+Font.ITALIC:
  115.         cn = cn + "bolditalic";
  116.         break;
  117.       case Font.PLAIN:
  118.       default:
  119.         cn = cn + "plain";
  120.         break;
  121.     }
  122.  
  123.     cn = cn + ":" + height;
  124.  
  125.     return cn;
  126.     }
  127.  
  128.     public static FontSpec    parseCompoundName(String cname) {
  129.     int        separator = cname.indexOf('-');
  130.     int        pseparator;
  131.     FontSpec    fspec = new FontSpec();
  132.     String        field;
  133.  
  134.     if (separator == -1) {
  135.         separator = cname.indexOf(':');
  136.     } else {
  137.         separator = cname.substring(0, separator).indexOf(':');
  138.     }
  139.     if (separator != -1) {
  140.         fspec.family = cname.substring(0, separator);
  141.     } else {
  142.         return null;
  143.     }
  144.     pseparator = separator + 1;
  145.     separator = cname.indexOf(':', pseparator);
  146.     if (separator != -1) {
  147.         field = cname.substring(pseparator, separator);
  148.         if (field.equals("plain")) {
  149.         fspec.style = Font.PLAIN;
  150.         } else if (field.equals("bold")) {
  151.         fspec.style = Font.BOLD;
  152.         } else if (field.equals("italic")) {
  153.         fspec.style = Font.ITALIC;
  154.         } else if (field.equals("bolditalic")) {
  155.         fspec.style = Font.BOLD+Font.ITALIC;
  156.         }
  157.         field = cname.substring(separator + 1);
  158.     } else {
  159.         fspec.style = Font.PLAIN;
  160.         field = cname.substring(pseparator);
  161.     }
  162.  
  163.     fspec.height = Integer.parseInt(field);
  164.  
  165.     return fspec;
  166.     }
  167. }
  168.  
  169.  
  170.