PetQuotes


//Author:   James Punteney
//Date:     3/24/98
//Purpose:  Scrolls through a list Pet quotes provided


import java.applet.*;
import java.awt.*;
import java.util.*;
import java.io.*;
import java.net.*;

public class PetQuotes extends java.applet.Applet
{
	//Formatting variables
   String fontType;        //Font characteristics
   Color font_color, backGroundColor;    //Applet Colors
   Font f;
   int font_size;

   //Quote Variables
	String quote = "Like a graceful vase, a cat, even when motionless, seems to flow.", author = "George F. Will";
	String line[] = new String[30];  //Holds individual lines of the quotes for display
	int l = 0;  //Keeps track of the number of lines in a quote.

	//Variables that change depending on quote type (pets, dogs, cats)
	//PetQuotes
	String bakQuote = "Whoever said you can’t buy happiness forgot about little puppies.";  // Insert Quote in case it can't open one
	String bakAuthor = "Gene Hill"; //Insert Author for backup quote
	String strFile = "petQuotes.txt";  //Insert file name to read quotes for
	String urlString = "http://www.simplypets.com/redirects/petQuotes.html"; //Where the Quote goes

public void init()
   {
   	try {
   		readQuotes();
   	}
   	catch(IOException e)  {
			////System.out.println("Error: "+e);
			System.exit(1);
		}
		catch(InterruptedException e)  {
			////System.out.println("Error: "+e);
			System.exit(1);
		}

		// Gets the parameters
      color();         //sets Font Color
      bgColor();       //Sets background Color
      font();          //Gets Font Characteristics
   }

   public void paint(Graphics g)
   {
   	//Set Variables
      int x = 0, y = 0;     //Coordinates for drawing the text
      int clientWidth = 5, clientHeight = 5;     //Keep the drawing area dimensions
      Font f = new Font(fontType, Font.BOLD, font_size);  //Declares font
      Dimension d = getSize();          // Size of applet

      Insets in = getInsets();         // Measures border
      clientWidth = (d.width - in.right - in.left);  //Determines actual drawing area width
      clientHeight = (d.height - in.top - in.bottom);   //Determines actual drawing area height

      g.setColor(backGroundColor);                 //Sets Background color
      g.fillRect(0, 0, getSize().width, getSize().height); //Draws background color

      g.setFont(f);              //iniatilizes font
      g.setColor(font_color);    //Sets Font to chosen Color
      FontMetrics fm = g.getFontMetrics();    //Gets FontMetrics, to measure the strings

		//If did not get a quote from the file use the default quote
		if(quote == "" || quote == null)  {
			quote = bakQuote;
			author = bakAuthor;
		}

		//Splits the quote up into the individual lines
      tokenize(g, clientWidth, clientHeight);  //Calls the method that breaks up the quote
                                               //into different lines that will fit in the applet
      //Reducing Font Size to fit in Applet
      while((l * fm.getHeight()) > clientHeight)  //Loops until all the lines can fit within the
      {                                         // applet.
      	//Checking to make sure the Font doesn't get too small
      	if(font_size > 8)
         	font_size--;   // Reduces the Font size by one
         else {
         	try  {
         		readQuotes();
         	}
         	catch(Exception e) {}
         	font();
         	update(g);
         }
         f = new Font(fontType, Font.BOLD, font_size);  //Sets the font to the new Size
         g.setFont(f);                            //Tell the graphics to use new font size
         fm = g.getFontMetrics();                 //Measures new font size
         tokenize(g, clientWidth, clientHeight);  //Calls Tokenize to readjust lines with the
      }                                           //new font size

      y = (clientHeight - (l * fm.getHeight())) / 2 + (fm.getHeight() / 2); //Centers the Text Vertically
      for(int z = 0; z <= l; z++ )     //Loop to print out the lines of the quote
      {
         x = (clientWidth - fm.stringWidth(line[z])) / 2;   //Gets x coord. to center line Horizontly
         g.drawString(line[z], x, y);     //Draws one line of the quote
         y += f.getSize();        //Moves the y coord. down the height of the font
      }
   }


   public void update(Graphics g)
   {

      paint(g);
   }




   private void readQuotes() throws IOException, InterruptedException, NoSuchElementException {
		try  {
			URL urlQuotes = new URL(getCodeBase() + strFile);
			int lineNumber = 0;  //The current Line Number
			String line = "";
			InputStreamReader isr = new InputStreamReader(urlQuotes.openStream());
			BufferedReader brFile = new BufferedReader(isr);
			if(brFile.ready())
				line = brFile.readLine();
			else {
				//System.out.println("File not Ready!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
				boolean readFile = false;
				while(readFile == false)  {
					//System.out.println("In while of file not ready!!!!!!!");
					Thread.sleep(1000);
					int j = 0;
					if(brFile.ready())  {
						line = brFile.readLine();
						readFile = true;
					}
					else  {
						//System.out.println("File not Ready Again??????????????????????????");
						j++;
					}
					if(j == 100)
						readFile = true;
				}

			}

			int numberOfQuotes = Integer.parseInt(line.trim());

			int quoteNumber = (int)((Math.random() * 10000000 % numberOfQuotes)) + 1;   //Generating random starting point
			while((line = brFile.readLine()) != null)  {
				lineNumber++;
				if(lineNumber == quoteNumber)  {
					brFile.close();
					quote = line.substring(0, line.indexOf("||"));
					author = line.substring((line.indexOf("||") + 2));
					brFile.close();
					isr.close();
					return;
				}
			}
			brFile.close();
			isr.close();
		}
		catch(IOException e)  {
			////System.out.println("Error: "+e);
			System.exit(1);
		}
   }

  public void tokenize(Graphics g, int clientWidth,int clientHeight)
  {
      String SingleLine = "";  //String to keep the line that is being worked on
      String word = "";        //String to keep the next word.
      FontMetrics fm = g.getFontMetrics();  //Getting Font measurements
      int space = fm.stringWidth(" ");           // Gets the width of one space
      l = 0;          //Counter to keep track of the number of lines in the quote

      for(StringTokenizer t = new StringTokenizer(quote); t.hasMoreTokens();) //Loops until there are no more words
      {  //Splits the string into words.
         word = t.nextToken();      //Sets word equal to the next word in the quote
         int w = fm.stringWidth(word) + space;  // Gets the length of the word plus a space
         int lw = fm.stringWidth(SingleLine);  // Gets the length of the line

         if(t.hasMoreTokens())                //Checks to see if there are any more words in the string
         {

            if(lw + w > (clientWidth - 10))         //Checks to see if adding the word to the line would
            {                                       //make it longer than the applet width.

               line[l] = SingleLine;
               l++;              //Starts a new line in the quote
               SingleLine = word + " ";      //Adds the last word to the new line
            }
            else
            {

               SingleLine += " " + word;    //Adds the next word onto the current line of text
            }

         }
         else
         {

         	if(lw + w > (clientWidth - 10))         //Checks to see if adding the word to the line would
            {                                       //make it longer than the applet width.
               line[l] = SingleLine;
               l++;                    //Starts a new line in the quote
               line[l] = word + "";     //Adds the last word to the new line
            }
            else
            {
         		SingleLine = SingleLine + " " + word;  //Adds the next word onto the current line of text
         		line[l] = SingleLine;
      		}
      	}
      }

      l++;
      SingleLine = "--";
      //Checking Author to see if it fits
      for(StringTokenizer t = new StringTokenizer(author); t.hasMoreTokens();) //Loops until there are no more words
      {  //Splits the string into words.
         word = t.nextToken();      //Sets word equal to the next word in the quote
         int w = fm.stringWidth(word) + space;  // Gets the length of the word plus a space
         int lw = fm.stringWidth(SingleLine);  // Gets the length of the line

         if(t.hasMoreTokens())                //Checks to see if there are any more words in the string
         {
            if(lw + w > (clientWidth - 10))         //Checks to see if adding the word to the line would
            {                                       //make it longer than the applet width.

               line[l] = SingleLine;
               l++;              //Starts a new line in the quote
               SingleLine = word + " ";      //Adds the last word to the new line
            }
            else
            {
               SingleLine += word + " ";    //Adds the next word onto the current line of text
            }

         }
         else
         {

         	if(lw + w > (clientWidth - 10))         //Checks to see if adding the word to the line would
            {                                       //make it longer than the applet width.
               line[l] = SingleLine;
               l++;                    //Starts a new line in the quote
               line[l] = word + "";     //Adds the last word to the new line
            }
            else
            {
         		SingleLine = SingleLine + " " + word;  //Adds the next word onto the current line of text
         		line[l] = SingleLine;
      		}

      	}
      }
   }

   public void font()
   {  //Sets the Font type from params.
      String fontList[];
      String font;
      int i;

      if(getParameter("font_size") != null)
      {
         font_size = Integer.parseInt(getParameter("font_size"));
      }
      else
      {
         font_size = 18;
      }


      font =  getParameter("font");
      if(font == null)
      {
         fontType ="TimesRoman";
      }
      else
      {
         fontList = getToolkit().getFontList();  //Gets the list of font types

         for(i = 0; i < fontList.length; i++)
         {
            if(font.equalsIgnoreCase(fontList[i]))
            {
               fontType = fontList[i];
               break;
            }
         }
         if(i == fontList.length);
         {
            fontType = "TimesRoman";
         }
      }
   }


   public void color()
   {  //Sets the font Color from params
      String color = getParameter("color");  //Getting Font color from params.
      if(color == null || color.equalsIgnoreCase("black"))
      {
      font_color = Color.black;
      }
      else if(color.equalsIgnoreCase("white"))
      {
         font_color = Color.white;
      }
      else if(color.equalsIgnoreCase("lightGray"))
      {
         font_color = Color.lightGray;
      }
      else if(color.equalsIgnoreCase("gray"))
      {
         font_color = Color.gray;
      }
      else if(color.equalsIgnoreCase("darkGray"))
      {
         font_color = Color.darkGray;
      }
      else if(color.equalsIgnoreCase("red"))
      {
         font_color = Color.red;
      }
      else if(color.equalsIgnoreCase("pink"))
      {
         font_color = Color.pink;
      }
      else if(color.equalsIgnoreCase("orange"))
      {
         font_color = Color.orange;
      }
      else if(color.equalsIgnoreCase("yellow"))
      {
         font_color = Color.yellow;
      }
      else if(color.equalsIgnoreCase("green"))
      {
         font_color = Color.green;
      }
      else if(color.equalsIgnoreCase("magenta"))
      {
         font_color = Color.magenta;
      }
      else if(color.equalsIgnoreCase("cyan"))
      {
         font_color = Color.cyan;
      }
      else if(color.equalsIgnoreCase("blue"))
      {
         font_color = Color.blue;
      }
      else
      {
         font_color = Color.black;
      }
   }

public void bgColor()
   {  //Sets the background color from params
      String color = getParameter("bgcolor");  //Getting back ground color color from params.
      if(color == null || color.equalsIgnoreCase("white"))
      {
         backGroundColor = Color.white;
      }
      else if(color.equalsIgnoreCase("black"))
      {
         backGroundColor = Color.black;
      }
      else if(color.equalsIgnoreCase("lightGray"))
      {
         backGroundColor = Color.lightGray;
      }
      else if(color.equalsIgnoreCase("gray"))
      {
         backGroundColor = Color.gray;
      }
      else if(color.equalsIgnoreCase("darkGray"))
      {
        backGroundColor = Color.darkGray;
      }
      else if(color.equalsIgnoreCase("red"))
      {
         backGroundColor = Color.red;
      }
      else if(color.equalsIgnoreCase("pink"))
      {
         backGroundColor = Color.pink;
      }
      else if(color.equalsIgnoreCase("orange"))
      {
         backGroundColor = Color.orange;
      }
      else if(color.equalsIgnoreCase("yellow"))
      {
         backGroundColor = Color.yellow;
      }
      else if(color.equalsIgnoreCase("green"))
      {
         backGroundColor = Color.green;
      }
      else if(color.equalsIgnoreCase("magenta"))
      {
         backGroundColor = Color.magenta;
      }
      else if(color.equalsIgnoreCase("cyan"))
      {
         backGroundColor = Color.cyan;
      }
      else if(color.equalsIgnoreCase("blue"))
      {
         backGroundColor = Color.blue;
      }
      else
      {
         backGroundColor = Color.white;
      }
   }

	public String getAppletInfo() {
   	return "Pet Quote Applet by SimplyPets http://www.simplypets.com/";
   }

	public boolean mouseDown (Event me, int x, int y) {
		try {
			if (this.getAppletContext () != null)
				this.getAppletContext ().showDocument (new URL (urlString));
		}
		catch (Exception e) {}
		return true;
	}

   public static void main(java.lang.String[] args) throws IOException, InterruptedException {
		PetQuotes petQuotes = new PetQuotes();
			petQuotes.init();
	}
 }

How to Add Java Applets to Your Site

New on the Java Boutique:

New Review:

Time Management Made Easy with the Quartz Enterprise Job Scheduler
Why not just use the Java timer API? This open source scheduling API boasts simplicity, ease-of-integration, a well-rounded feature set, and it's free!

New Applet:

Reverse Complement
Reverse Complement is a simple applet that converts DNA or RNA sequences into three useful formats.

Elsewhere on internet.com:

WebDeveloper Java
Lots of Java information on webdeveloper.com

WDVL Java
Thorough Java resource at the Web Developer's Virtual Library.

ScriptSearch Java
Hundreds of free Java code files to download.

jGuru: Your View of the Java Universe
Customizable portal with online training, FAQs, regular news updates, and tutorials.