home *** CD-ROM | disk | FTP | other *** search
/ Chip 1998 November / Chip_1998-11_cd.bin / tema / Cafe / VCSAMPL.BIN / OpenlookButton.java < prev    next >
Text File  |  1997-03-05  |  7KB  |  245 lines

  1. /*
  2.  * @(#)OpenlookButton.java    1.2 97/01/14 Jeff Dinkins
  3.  *
  4.  * Copyright (c) 1995-1997 Sun Microsystems, Inc. All Rights Reserved.
  5.  *
  6.  */
  7.  
  8. import java.applet.*;
  9. import java.lang.*;
  10. import java.util.*;
  11. import java.awt.*;
  12. import java.awt.event.*;
  13.  
  14. /**
  15.  * OpenlookButton - a class that produces a lightweight button.
  16.  *
  17.  * Lightweight components can have "transparent" areas, meaning that
  18.  * you can see the background of the container behind them.
  19.  *
  20.  */
  21. public class OpenlookButton extends Component {
  22.  
  23.   static int capWidth = 20;          // The width of the Button's endcap
  24.   String label;                      // The Button's text
  25.   protected boolean pressed = false; // true if the button is detented.
  26.   ActionListener actionListener;     // Post action events to listeners
  27.   
  28.   
  29.   /**
  30.    * Constructs an OpenlookButton with no label.
  31.    */
  32.   public OpenlookButton() {
  33.       this("");
  34.   }
  35.  
  36.   /**
  37.    * Constructs an OpenlookButton with the specified label.
  38.    * @param label the label of the button
  39.    */
  40.   public OpenlookButton(String label) {
  41.       this.label = label;
  42.       enableEvents(AWTEvent.MOUSE_EVENT_MASK);
  43.   }
  44.  
  45.   /**
  46.    * gets the label
  47.    * @see setLabel
  48.    */
  49.   public String getLabel() {
  50.       return label;
  51.   }
  52.   
  53.   /**
  54.    * sets the label
  55.    * @see getLabel
  56.    */
  57.   public void setLabel(String label) {
  58.       this.label = label;
  59.       invalidate();
  60.       repaint();
  61.   }
  62.   
  63.   /**
  64.    * paints the button
  65.    */
  66.   public void paint(Graphics g) {
  67.       int width = getSize().width - 1;
  68.       int height = getSize().height - 1;
  69.  
  70.       Color interior;
  71.       Color highlight1;
  72.       Color highlight2;
  73.       
  74.       interior = getBackground();
  75.  
  76.       // ***** determine what colors to use
  77.       if(pressed) {
  78.       highlight1 = interior.darker();
  79.       highlight2 = interior.brighter();
  80.       } else {
  81.       highlight1 = interior.brighter();
  82.       highlight2 = interior.darker();
  83.       }
  84.  
  85.       // ***** paint the interior of the button
  86.       g.setColor(interior);
  87.       // left cap
  88.       g.fillArc(0, 0,                 // start
  89.         capWidth, height,            // size
  90.         90, 180);            // angle
  91.  
  92.       // right cap
  93.       g.fillArc(width - capWidth, 0,        // start
  94.         capWidth, height,           // size
  95.         270, 180);            // angle
  96.  
  97.       // inner rectangle
  98.       g.fillRect(capWidth/2, 0, width - capWidth, height);
  99.       
  100.  
  101.       // ***** highlight the perimeter of the button
  102.       // draw upper and lower highlight lines
  103.       g.setColor(highlight1);
  104.       g.drawLine(capWidth/2, 0, width - capWidth/2, 0);
  105.       g.setColor(highlight2);
  106.       g.drawLine(capWidth/2, height, width - capWidth/2, height);
  107.  
  108.       // upper arc left cap
  109.       g.setColor(highlight1);
  110.       g.drawArc(0, 0,                       // start
  111.                 capWidth, height,           // size
  112.                 90, 180-40                  // angle
  113.       );
  114.  
  115.       // lower arc left cap
  116.       g.setColor(highlight2);
  117.       g.drawArc(0, 0,                       // start
  118.                 capWidth, height,           // size
  119.                 270-40, 40                  // angle
  120.       );
  121.  
  122.       // upper arc right cap
  123.       g.setColor(highlight1);
  124.       g.drawArc(width - capWidth, 0,        // start
  125.                 capWidth, height,           // size
  126.                 90-40, 40                   // angle
  127.       );
  128.  
  129.       // lower arc right cap
  130.       g.setColor(highlight2);
  131.       g.drawArc(width - capWidth, 0,        // start
  132.                 capWidth, height,           // size
  133.                 270, 180-40                 // angle
  134.       );
  135.  
  136.       // ***** draw the label centered in the button
  137.       Font f = getFont();
  138.       if(f != null) {
  139.       FontMetrics fm = getFontMetrics(getFont());
  140.       g.setColor(getForeground());
  141.       g.drawString(label,
  142.                width/2 - fm.stringWidth(label)/2,
  143.                height/2 + fm.getHeight()/2 - fm.getMaxDescent()
  144.       );
  145.       }
  146.   }
  147.   
  148.   /**
  149.    * The preferred size of the button. 
  150.    */
  151.   public Dimension getPreferredSize() {
  152.       Font f = getFont();
  153.       if(f != null) {
  154.       FontMetrics fm = getFontMetrics(getFont());
  155.       return new Dimension(fm.stringWidth(label) + capWidth*2,
  156.                    fm.getHeight() + 10);
  157.       } else {
  158.       return new Dimension(100, 50);
  159.       }
  160.   }
  161.   
  162.   /**
  163.    * The minimum size of the button. 
  164.    */
  165.   public Dimension getMinimumSize() {
  166.       return new Dimension(100, 50);
  167.   }
  168.  
  169.   /**
  170.    * Adds the specified action listener to receive action events
  171.    * from this button.
  172.    * @param listener the action listener
  173.    */
  174.    public void addActionListener(ActionListener listener) {
  175.        actionListener = AWTEventMulticaster.add(actionListener, listener);
  176.        enableEvents(AWTEvent.MOUSE_EVENT_MASK);
  177.    }
  178.  
  179.    /**
  180.     * Removes the specified action listener so it no longer receives
  181.     * action events from this button.
  182.     * @param listener the action listener
  183.     */
  184.    public void removeActionListener(ActionListener listener) {
  185.        actionListener = AWTEventMulticaster.remove(actionListener, listener);
  186.    }
  187.  
  188.  
  189.    /**
  190.     * Paints the button and sends an action event to all listeners.
  191.     */
  192.    public void processMouseEvent(MouseEvent e) {
  193.        Graphics g;
  194.        switch(e.getID()) {
  195.           case MouseEvent.MOUSE_PRESSED:
  196.             // render myself inverted....
  197.             pressed = true;
  198.     
  199.         // Repaint might flicker a bit. To avoid this, you can use
  200.         // double buffering (see the Gauge example).
  201.         repaint();
  202.             break;
  203.           case MouseEvent.MOUSE_RELEASED:
  204.             if(actionListener != null) {
  205.                actionListener.actionPerformed(new ActionEvent(
  206.                    this, ActionEvent.ACTION_PERFORMED, label));
  207.             }
  208.             // render myself normal again
  209.             if(pressed == true) {
  210.                 pressed = false;
  211.  
  212.             // Repaint might flicker a bit. To avoid this, you can use
  213.             // double buffering (see the Gauge example).
  214.         repaint();
  215.             }
  216.             break;
  217.           case MouseEvent.MOUSE_ENTERED:
  218.  
  219.             break;
  220.           case MouseEvent.MOUSE_EXITED:
  221.             if(pressed == true) {
  222.                 // Cancel! Don't send action event.
  223.                 pressed = false;
  224.  
  225.             // Repaint might flicker a bit. To avoid this, you can use
  226.             // double buffering (see the Gauge example).
  227.         repaint();
  228.  
  229.                 // Note: for a more complete button implementation,
  230.                 // you wouldn't want to cancel at this point, but
  231.                 // rather detect when the mouse re-entered, and
  232.                 // re-highlight the button. There are a few state
  233.                 // issues that that you need to handle, which we leave
  234.                 // this an an excercise for the reader (I always
  235.                 // wanted to say that!)
  236.             }
  237.             break;
  238.        }
  239.        super.processMouseEvent(e);
  240.    }
  241.  
  242.  
  243. }
  244.  
  245.