
/*
    An applet for demonstrating the use of several GUI components
    (Canvas, Checkbox, Choice, Panel, Scrollbar, TextField) and their
    associated events.
    
    This file defines two classes: EventDemo and ColorCanvas.
    
    David Eck, September 2, 1996
    
    Modified August 12, 1998 to use Java 1.1. style events.
    Modified February 25, 2000 to use the constants BorderLayout.CENTER, etc.
*/


import java.awt.*;
import java.awt.event.*;
import java.applet.*;

public class EventDemo extends Applet implements ActionListener, ItemListener, AdjustmentListener {

      // An applet that displays a shape and some text.  Color of
      // shape and text is controlled by a vertical scroll bar.
      // Color of background is controlled by a horizontal scroll bar.
      // Text to be displayed can be entered in a TextField.
      // Shape to be displayed can be selected from a Choice componnet.
      // Bright or dim colors can be selected using a Chackbox.
      // The display area is implemented as a ColorCanvas; the 
      // ColorCanvas class is defined later in this file.
      
   ColorCanvas display;  // display area
   Choice shapeChoice;   // for selecting which shape to display
   Checkbox brightColors;// for selecting bright or dim colors
   TextField text;       // for entering the text to be displayed
   Scrollbar hScroll;    // horizontal scroll bar
   Scrollbar vScroll;    // vertical scroll bar
      
   public void init() {  // set up contents of applet
             
       setBackground(Color.red);   // background for applet

       Panel displayPanel = new Panel(); // to hold display and scroll bars
       displayPanel.setLayout(new BorderLayout());
       display = new ColorCanvas("Hello World",ColorCanvas.RECT);
       displayPanel.add(display, BorderLayout.CENTER);
       hScroll = new Scrollbar(Scrollbar.HORIZONTAL,50,1,0,100);
       displayPanel.add(hScroll, BorderLayout.SOUTH);
       vScroll = new Scrollbar(Scrollbar.VERTICAL,0,1,0,100);
       displayPanel.add(vScroll, BorderLayout.EAST);
             
       Panel topPanel = new Panel();  // for controls
       topPanel.setBackground(Color.white);
       topPanel.setLayout(new GridLayout(1,3,5,5));
       shapeChoice = new Choice();
       shapeChoice.add("Rectangle");
       shapeChoice.add("Oval");
       shapeChoice.add("RoundRect");
       topPanel.add(shapeChoice);
       brightColors = new Checkbox("Bright Colors");
       topPanel.add(brightColors);
       text = new TextField("Hello World");
       topPanel.add(text);
             
       setLayout(new BorderLayout(1,1));  // applies to applet itself
       add("Center", displayPanel);
       add("North", topPanel);
             
       setDisplayColors();  // defined below
       
       text.addActionListener(this);  // set this applet to listen for events
       hScroll.addAdjustmentListener(this);
       vScroll.addAdjustmentListener(this);
       shapeChoice.addItemListener(this);
       brightColors.addItemListener(this);
             
   } // end of init()
         

   public Insets getInsets() {  // leave border around edge of applet
      return new Insets(1,1,1,1);
   }


   void setDisplayColors() {
        // Set foreground and background colors of display,
        // depending on values of scroll bars and
        // on state of the checkbox.  (Colors are made
        // using Color.getHSBColor(float,float,float),
        // which creates a color given a hue, a satuation,
        // and a brightness.  The parameters must be between
        // 0.0 and 1.0.)
      float backgroundBrightness = hScroll.getValue() / 100.0F;
      float foregroundHue = vScroll.getValue() / 100.0F;
      float saturation = 1.0F;
      float brightness;
      if (brightColors.getState())
         brightness = 1.0F;
      else 
         brightness = 0.6F;
      Color backgroundColor = 
             Color.getHSBColor(0.0F,0.0F,backgroundBrightness);  // A grayscale color
      Color foregroundColor = 
             Color.getHSBColor(foregroundHue,1.0F,brightness);
      display.setBackground(backgroundColor);
      display.setForeground(foregroundColor);
   } // end of setDisplayColors()
         

   public void itemStateChanged(ItemEvent evt) {  // from the ItemListener interface
   
         // An item event could have been generated by shapeChoice or brightColors.
   
      Object source = evt.getSource();  // object that generated the event
      
      if (source == shapeChoice) {
            // user has selected a shape; set the shape
            // that is shown in the display
         switch (shapeChoice.getSelectedIndex()) {
            case 0:
               display.setShape(ColorCanvas.RECT);
               break;
            case 1:
               display.setShape(ColorCanvas.OVAL);
               break;
            case 2:
               display.setShape(ColorCanvas.ROUNDED);
               break;
         }
      }
      else if (source == brightColors) {
            // user has changed the state of the checkbox;
            // reset the colors for the display,
            // and ask the system to redraw the display
         setDisplayColors();
         display.repaint();
      }
   
   } // end itemStateChanged()



   public void actionPerformed(ActionEvent evt) {   // from the ActionListener interface
        
        // This can only be generated by the TextField, because the user has pressed
        // return.  Set the display text to the contents of the TextField, text.
        
      display.setText(text.getText());
   
   } // end of actionPerformed()
         

   public void adjustmentValueChanged(AdjustmentEvent evt) {
   
         // User has changed the value of one of the scroll bars.
         // In thisprogram, it doesn't matter which one.  Respond
         // by setting the display colors.
         
       setDisplayColors();
       display.repaint();
   
   } // end of adjustmentValueChanged()
               
         
} // end of class Event Demo



class ColorCanvas extends Canvas {
       
      // Display a shape and some text.
      // The canvas's setForeground() and setBackground()
      // methods should be called to set the colors to
      // be used for drawing.
       
   private String text; // text to be displayed
   private int shape;   // code for shape to be displayed;
   private Font font;   // used for displaying the text
       
   public final static int RECT = 0;  // shape code for a rectangle
   public final static int OVAL = 1;  // shape code for an oval
   public final static int ROUNDED = 2; // shape code for an round rect

   public ColorCanvas(String text, int shape) {
       this.text = text;   
       this.shape = shape;
       font = new Font("Serif",Font.PLAIN,18);
   }
   
   public void setText(String text) {
      this.text = text;
      repaint();
   }
   
   public void setShape(int shape) {
      this.shape = shape;
      repaint();
   }
       
   public void paint(Graphics g) {
       int width = getSize().width;   // get size of canvas
       int height = getSize().height;
       int shape_left = width / 9;  // compute position and size of shape
       int shape_top = height / 3;
       int shape_width = (7*width / 9);
       int shape_height = (5*height / 9);
       switch (shape) {   // draw the shape
          case RECT:
             g.fillRect(shape_left,shape_top,shape_width,shape_height);
             break;
          case OVAL:
             g.fillOval(shape_left,shape_top,shape_width,shape_height);
             break;
          case ROUNDED:
             g.fillRoundRect(shape_left,shape_top,shape_width,shape_height,24,24);
             break;
       }
       g.setFont(font);
       g.drawString(text,width/9,2*height/9);  // draw the text
   }
       
 }  // end of class ColorCanvas
