/* * Class for displaying text. * * Copyright 2000 Andy Gill * * $Revision: 1.1 $ * $Date: 2000/09/15 16:14:17 $ */ import java.awt.*; import java.util.*; /** * * @author Andy Gill * @version 0.1 */ class HoodText extends Canvas implements PrettyDisplay { int areaPixWidth = 300; // In Pixels int areaPixHeight = 300; // In Pixels int x = 0; int y = 0; private PrettyContentWidget pcw = null; // The text to be printed. Font[] fonts = new Font[4]; static Color[] colors = { Color.black, Color.black, Color.blue, Color.magenta, Color.red, Color.gray, Color.gray, Color.gray, Color.gray, Color.gray }; static String fontName = ""; static final int xOffset = 5; // sortof an inset static final int yOffset = 5; private Image image; String name; public HoodText(String name) { super(); this.name = name; } public void setContent(PrettyContentWidget pcw) { this.pcw = pcw; int maxX = 0; int maxY = 0; PrettyContentWidget w = this.pcw; PrettyContentWidget prev = null; while (w != null) { PrettyContentWidget next = w.next; w.next = prev; prev = w; if (w.x + w.txt.length() > maxX) { maxX = w.x + w.txt.length(); } if (w.y + 1 > maxY) { maxY = w.y + 1; } w = next; } this.pcw = prev; maxY += 2; // space for title bars Message.message("maxX = " + maxX + " maxY = " + maxY); // Get the font metrics, so we know the size of our box. FontMetrics fm = getFontMetrics(fonts[1]); int fontWidth = fm.stringWidth(" "); int fontHeight = fm.getHeight(); int fontDescent = fm.getDescent(); areaPixWidth = xOffset * 2 + maxX * fontWidth; areaPixHeight = yOffset * 2 + maxY * fontHeight; Message.message("maxX = " + areaPixWidth + " maxY = " + areaPixHeight); image = createImage(areaPixWidth,areaPixHeight); Graphics g = image.getGraphics(); g.setFont(fonts[1]); g.setColor(Color.lightGray); g.fillRect(xOffset, yOffset + fontDescent, areaPixWidth - (xOffset * 2), fontHeight); g.fillRect(xOffset, yOffset + fontDescent + (maxY - 1) * fontHeight, areaPixWidth - (xOffset * 2), fontHeight); g.setFont(fonts[1]); g.setColor(colors[0]); g.drawString("-- " + name,xOffset,fontHeight + yOffset); this.invalidate(); } public void renderText(int time,Graphics g) { Message.message("renderText " + time ); FontMetrics fm = getFontMetrics(fonts[1]); int fontWidth = fm.stringWidth(" "); int fontHeight = fm.getHeight(); int fontDescent = fm.getDescent(); g.setColor(Color.white); g.fillRect(xOffset,fontHeight+yOffset+fontDescent, areaPixWidth-2*xOffset, areaPixHeight-2*(fontHeight+yOffset)); PrettyContentWidget widgets = this.pcw; while (widgets != null) { int x = widgets.x * fontWidth + xOffset; int y = (2 + widgets.y) * fontHeight + yOffset; String text = widgets.txt; int fontNo = 1; int colorNo = widgets.prop; g.setFont(fonts[fontNo]); g.setColor(colors[colorNo]); if (time < widgets.birth) { // dont do anything. } else if (time >= widgets.birth && time < widgets.death) { g.setColor(Color.white); if (time == widgets.birth) { g.setColor(Color.yellow); } g.fillRect(x,y + fontDescent - fontHeight, fontWidth * text.length(), fontHeight); g.setColor(colors[colorNo]); g.drawString(text,x,y); } widgets = widgets.next; } } public Dimension getPreferredSize() { Message.message("get preferedSize"); if (image == null) { return new Dimension(1,1); } else { return new Dimension(image.getWidth(this), image.getHeight(this)); } } public synchronized void setFontSize(int size) { if (fontName.equals("")) { String[] theFonts = getToolkit().getFontList(); // We are looking for Courier *or* Monospaced. for(int i = 0;i < theFonts.length; i++) { System.out.println("font" + theFonts[i]); if (theFonts[i].equals("Courier") || theFonts[i].equals("Monospaced")) { fontName = theFonts[i]; break; } } } System.out.println("Font => " + fontName); // If we've not found it, default to try monospaced, // which *is* the 1.1 standard. if (fontName.equals("")) { fontName = "Monospaced"; } fonts[0] = new Font(fontName, Font.PLAIN, size); fonts[1] = new Font(fontName, Font.BOLD, size); fonts[2] = new Font(fontName, Font.ITALIC, size); fonts[3] = new Font(fontName, Font.BOLD | Font.ITALIC, size); // fonts[1] = fonts[0]; } private int currStep = 0; private int dispStep = -1; public void setStep(int step) { Message.message("setting step to " + step); currStep = step; this.invalidate(); } public void paint(Graphics g) { if (currStep != dispStep) { dispStep = currStep; Message.message("rendering " + dispStep); renderText(dispStep,image.getGraphics()); } g.drawImage(image,0,0,this); } public void update(Graphics g) { paint(g); } }