//////////////////////////////////////////////////////////////////////////////
//                    Copyright (C) 1996 Paton J. Lewis.
//////////////////////////////////////////////////////////////////////////////
//
//  Author: Paton J. Lewis (pjl@cs.brown.edu)
// History: 15-Jan-96 Begun.
//          15-Jan-96 Version 1.0 completed.
//          15-May-96 Updated to version 1.1.
//          07-Oct-98 Updated to version 1.2.
// Purpose: Displays Java fonts.
//
//////////////////////////////////////////////////////////////////////////////

import java.awt.*;
import java.applet.Applet;

//////////////////////////////////////////////////////////////////////////////

public class FontViewer extends Applet
  {
  public void init()
    {
    resize(width,height);

    Panel panel=new Panel();
    canvas=new FontCanvas();
    nameField=new FontNameField(canvas);
    baseField=new BaseField(canvas);

    add(panel);
    panel.add(new Label("Font:"));
    panel.add(nameField);
    panel.add(new Label("     Format:"));
    panel.add(baseField);
    add(canvas);
    add(new Label(appName+" "+appVers+" "+copyright));
    }

  public void start()
    {
    nameField.select(dfltFont);
    canvas.setFont(dfltFont);
    baseField.select("Octal");
    canvas.setBase(8);
    }

  private final String  appName="FontViewer";
  private final String  appVers="1.2";
  private final String  copyright="Copyright \251 1996-1998 Paton J. Lewis";
  private final String  dfltFont="TimesRoman";
  private final int     width=650;
  private final int     height=650;
  private FontCanvas    canvas;
  private FontNameField nameField;
  private BaseField     baseField;
  };

//////////////////////////////////////////////////////////////////////////////

class FontNameField extends Choice
  {
  public FontNameField(FontCanvas fontCanvas_)
    {
    fontCanvas=fontCanvas_;
    String fonts[]=Toolkit.getDefaultToolkit().getFontList();
    for(int index=0; index<fonts.length; index++)
      addItem(fonts[index]);
    }

  public boolean action(Event event, Object what)
    {
    if(event.id==Event.ACTION_EVENT)
      {
      fontCanvas.setFont(getSelectedItem());
      return true;
      }
    else
      return super.action(event,what);
    }

  private FontCanvas fontCanvas;
  }

//////////////////////////////////////////////////////////////////////////////

class BaseField extends Choice
  {
  public BaseField(FontCanvas fontCanvas_)
    {
    fontCanvas=fontCanvas_;
    addItem("Octal");
    addItem("Decimal");
    addItem("Hexadecimal");
    }

  public boolean action(Event event, Object what)
    {
    if(event.id==Event.ACTION_EVENT)
      {
      if(getSelectedItem()=="Octal")
        fontCanvas.setBase(8);
      else if(getSelectedItem()=="Decimal")
        fontCanvas.setBase(10);
      else if(getSelectedItem()=="Hexadecimal")
        fontCanvas.setBase(16);
      return true;
      }
    else
      return super.action(event,what);
    }

  private FontCanvas fontCanvas;
  }

//////////////////////////////////////////////////////////////////////////////

class FontCanvas extends Canvas
  {
  public void setFont(String fontName_)
    {
    fontName=fontName_;
    resize(width,height);
    repaint();
    }

  public void setBase(int base_)
    {
    base=base_;
    repaint();
    }

  public synchronized void update(Graphics g)
    {
    paint(g);
    }

  public void paint(Graphics g)
    {
    Font fontRoman=new Font("TimesRoman",Font.PLAIN,pointSize);
    Font font=new Font(fontName,Font.PLAIN,pointSize);
    int leading=getFontMetrics(font).getHeight();
    g.setColor(Color.white);
    g.fillRect(0,0,width,height);
    int x=leftBorder, y=leading;
    for(int index=33; index<256; index++)
      {
      g.setColor(Color.black);
      g.setFont(font);
      g.drawString(new Character((char)index).toString(),x,y);
      g.setColor(Color.gray);
      g.setFont(fontRoman);
      g.drawString(Integer.toString(index,base),x+tabWid,y);
      if(y+leading>height)
        {
        x+=colWid;
        y=leading;
        }
      else
        y+=leading;
      }
    }

  private final int pointSize=12;
  private final int width=600;
  private final int height=550;
  private final int leftBorder=10;
  private final int tabWid=20;
  private final int colWid=90;
  private int       base=10;
  private String    fontName;
  };
