// DspQuote.class //----------------- // Written by Eric Pence, 1997 // This applet displays a random quote from the file DspQuote.txt. // Each quote in this file must exist in a single record. // The calling html document has the following parms (defaults are shown): // // <PARAM name = File value = "DspQuote.txt"> File containing quotes // <PARAM name = FontName value = "Helvetica"> Font to use // <PARAM name = FontSize value = "12"> Font size to use // <PARAM name = BGColor value = "ffffff"> Background color // <PARAM name = TxtColor value = "000000"> Text color import java.applet.*; import java.awt.*; import java.net.*; import java.util.Vector; import java.io.*; public class DspQuote extends Applet { private String QuoteFile; private String Font_Name; private String QuoteTxt; private String str; private String str_work; private Color bgColor; private Color txtColor; private Font dspFont; private FontMetrics fm; private int Font_Size; private int widthOneChar; private int charsPerLine; private int charsInString; private BufferedReader inFile; private Vector QuoteVec; public void init() { try { QuoteFile = getParameter("File"); if (QuoteFile.equals(null)) QuoteFile ="DspQuote.txt"; Font_Name = getParameter("FontName"); if (Font_Name.equals(null)) Font_Name = "Helvetica"; str = getParameter("FontSize"); if (str != null) Font_Size = Integer.parseInt(str); else Font_Size = 12; str = getParameter("BGColor"); if (str != null) bgColor = new Color(Integer.valueOf(str,16).intValue()); else bgColor = Color.white; setBackground(bgColor); str = getParameter("TxtColor"); if (str != null) txtColor = new Color(Integer.valueOf(str,16).intValue()); else txtColor = Color.black; } catch (Exception e) { QuoteFile =" DspQuote.txt"; Font_Name = "Helvetica"; Font_Size = 12; bgColor = Color.white; setBackground(bgColor); txtColor = Color.black; } dspFont = new Font(Font_Name,Font.PLAIN,Font_Size); fm = getFontMetrics(dspFont); // Load the quotes and randomly select and display one. QuoteVec = new Vector(); QuoteTxt = this.loadQuotes(); if (QuoteTxt.equals(" ")) QuoteTxt = this.getQuote(); } // Load quotes into a string vector. String loadQuotes() { try { inFile = new BufferedReader(new InputStreamReader(new URL(getCodeBase(),QuoteFile).openStream())); } catch (Exception ex) { return "An IO error occured while opening the " + QuoteFile + " file."; } try { while ((str = inFile.readLine()) != null) { QuoteVec.addElement(str); } } catch (IOException ex) { return "An IO error occured while reading the " + QuoteFile + " file."; } return " "; } // Get a random quote. String getQuote() { str = (String) (QuoteVec.elementAt((int) (Math.random() * QuoteVec.size()))); return str; } // Get another quote when applet is clicked on. public boolean mouseDown(Event e,int x,int y) { showStatus(""); QuoteTxt = this.getQuote(); repaint(); showStatus("Click on quote to display another quote."); return true; } // Display status message and change pointer when mouse is over applet area. public boolean mouseEnter(Event e,int x,int y) { this.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); showStatus("Click on quote to display another quote."); return true; } // Clear status message and reset pointer when mouse leaves applet area. public boolean mouseExit(Event e,int x,int y) { this.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); showStatus(""); return true; } // Display the quote. public void paint(Graphics g) { int x, y, strWidth, dspWidth, strIdx, endIdx, lastSpace, lastIdx = 0, idx1, idx2; g.setFont(dspFont); g.setColor(txtColor); Dimension dsp = this.getSize(); dspWidth = dsp.width; strWidth = fm.stringWidth(QuoteTxt); // Wrap text if it doesn't fit in display area. if (strWidth > dspWidth) { // Calculate the width of a single character. charsInString = QuoteTxt.length(); widthOneChar = strWidth / charsInString; // Calculate the number of characters on a line. charsPerLine = (dspWidth / widthOneChar) - 12; // allow a little leeway // Start the multi-line text left/top. x = widthOneChar; y = fm.getHeight(); strIdx = 0; endIdx = charsPerLine; boolean moreLines = true; boolean lastTime = false; while (moreLines) { str_work = QuoteTxt.substring(strIdx, endIdx); if (str_work.length() < charsPerLine) idx2 = str_work.length(); else { // Locate last space in current string so words wont truncate lastSpace = str_work.lastIndexOf(' '); if (lastSpace != 0) idx2 = lastSpace; else idx2 = charsPerLine; } // Left-justify string (ignore leading space). if (str_work.substring(0, 1).equals(" ")) str = str_work.substring(1, idx2); else str = str_work.substring(0, idx2); g.drawString(str,x,y); // Write the line of text // Determine if there is more to display lastIdx += idx2; if ((lastIdx < charsInString) && (!lastTime)) { y += fm.getHeight(); // Drop down to next line strIdx = lastIdx + 1; endIdx = strIdx + charsPerLine; if (endIdx >= charsInString) { endIdx = charsInString; lastTime = true; } } else moreLines = false; } } else { // Center the single-line text x = (dspWidth - strWidth) >> 1; y = ((dsp.height - fm.getHeight()) >> 1) + fm.getHeight() - fm.getDescent(); g.drawString(QuoteTxt,x,y); // Write the line of text } } }