/* @(#)FontSampler.java */

import edu.neu.ccs.gui.*;
import edu.neu.ccs.util.*;
import edu.neu.ccs.console.*;

import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;
import java.awt.font.*;
import java.awt.event.*;

public class FontSampler
   extends DisplayPanel implements JPTConstants, ConsoleAware
{
   private int width  = 500;
   private int height = 500;
   
   private BufferedPanel window =
       new BufferedPanel(width, height);
   
   
   private GraphicsEnvironment ge =
       GraphicsEnvironment.getLocalGraphicsEnvironment();
       
   private String[] familyList =
       ge.getAvailableFontFamilyNames();
   
   private DropdownView fontFamily =
       new DropdownView(familyList);
   
   
   private TextFieldView fontSize =
       new TextFieldView("24", 50);
   
   private BooleanView bold =
       new BooleanView("Bold", false);
   
   private BooleanView italic =
       new BooleanView("Italic", false);
   
   private TextFieldView sample =
       new TextFieldView("Hello", 200);
   
   
   private SimpleAction showFont =
       new SimpleAction("Show Font") {
           public void perform() {
               showFont();
           }
       };
   
   private SimpleAction showSample =
       new SimpleAction("Show Sample String") {
           public void perform() {
               showSample();
           }
       };
   
   
   private TablePanel innerPanel =
       new TablePanel(
           new Object[] { fontSize, bold, italic },
           HORIZONTAL, 20, 20, WEST);
   
   private TablePanel outerPanel =
       new TablePanel(
           new Object[][] {
               { "Font",   fontFamily },
               { "Size",   innerPanel },
               { "Sample", sample     } },
           5, 5, WEST);
   
   private TablePanel actions =
       new TablePanel(
           new Object[] { showFont, showSample },
           HORIZONTAL, 5, 5, CENTER);
   
   private TablePanel mainPanel =
       new TablePanel(
           new Object[] { window, outerPanel, actions },
           VERTICAL, 10, 10, CENTER);
   
   
   public FontSampler() {
       add(mainPanel);
       frame("Font Sampler");
   }
   
   
   private void showFont() {
       // setup window
       window.clearPanel();
       
       Graphics2D graphics = window.getBufferGraphics();
       
       // setup font
       String name = fontFamily.getViewState();
       
       int size = fontSize.demandInt();
       
       int style =
           (bold.  getBooleanValue() ? Font.BOLD   : 0) |
           (italic.getBooleanValue() ? Font.ITALIC : 0);
           
       Font font = new Font(name, style, size);
       
       // setup paintable
       TextPaintable paintable =
           new TextPaintable
               (null, font, null, null, TextAnchor.CENTER_BASELINE, 0, 0);
       
       // paint characters with codes 32 to 126
       for (int row = 0; row < 6; row++) {
           int y = 100 + 60 * row;
           int base = 32 + 16 * row;
           
           for (int col = 0; col <= 15; col++) {
               int x = 25 + 30 * col;
               int code = base + col;
               
               if (code >= 127)
                   break;
               
               String s ="" + (char) (code);
               
               paintable.setString(s);
               paintable.setAnchorPosition(x, y);
               paintable.paint(graphics);
           }
       }
       
       // repaint window
       window.repaint();
   }
   
   
   private void showSample() {
       // setup window
       window.clearPanel();
       
       Graphics2D graphics = window.getBufferGraphics();
       
       // setup font
       String name = fontFamily.getViewState();
       
       int size = fontSize.demandInt();
       
       int style =
           (bold.  getBooleanValue() ? Font.BOLD   : 0) |
           (italic.getBooleanValue() ? Font.ITALIC : 0);
           
       Font font = new Font(name, style, size);
       
       // setup string
       String string = sample.getViewState();
       
       // other definitions
       TextPaintable  textPaintable;
       Rectangle2D    area;
       
       // setup text paintable
       textPaintable =
           new TextPaintable
               (string, font, null, TextBounds.LOOSE,
                TextAnchor.LEFT_BASELINE, 50, height * 0.40f);
       
       // paint bounds
       area = textPaintable.getBounds2D();
       
       graphics.setPaint(Color.orange);
       graphics.fill(area);
       
       // paint text paintable
       textPaintable.paint(graphics);
       
       // setup text paintable
       textPaintable =
           new TextPaintable
               (string, font, null, TextBounds.TIGHT,
                TextAnchor.LEFT_BASELINE, 50, height * 0.80f);
       
       // paint bounds
       area = textPaintable.getBounds2D();
       
       graphics.setPaint(Color.orange);
       graphics.fill(area);
       
       // paint text paintable
       textPaintable.paint(graphics);
       
       // draw vertical line
       graphics.setPaint(Color.blue);
       
       Line2D line = new Line2D.Double(50, 0, 50, height);
       graphics.draw(line);
       
       // repaint window
       window.repaint();
   }
   
   
   public static void main(String[] args) {
       new FontSampler();
   }
   
}
