001    /* 
002     * Copyright (c) Holger Pfaff - http://pfaff.ws
003     *
004     * This software maybe used for any purpose provided the
005     * above copyright notice is retained. It is supplied as is.
006     * No warranty expressed or implied - Use at your own risk.
007     */
008    
009    import java.awt.*;
010    import java.awt.event.*;
011    import java.util.*;
012    
013    /**
014      * (#)Xbox.java
015      * @author   Holger Pfaff
016      * @version  3.2 19-Mar-2004<br><br>
017      *
018      * A simple on/off style box with an Caption
019      */
020    
021    public class Xbox extends Knob {
022    
023      /**
024       * the state
025       */
026      protected boolean state = false;
027      
028      /**
029       * Standard constructor
030       *
031       * @param   label   the label
032       */
033      public Xbox(String label) {
034        super(label);
035        borderType  = NONE;
036        borderDepth = 0;
037        iconDist    = 3;
038        iconPos     = LEFT;
039        mode        = LEFT;
040      }
041    
042      /**
043       * overwrite Caption.paintIcon()
044       *
045       * @param   g       Graphics object to use
046       * @param   x       x-position of describing rect
047       * @param   y       y-position of describing rect
048       * @param   w       width of describing rect
049       * @param   h       height of describing rect
050       */
051      public void paintIcon(Graphics g, int x, int y, int w, int h) {
052        ++x; ++y; w-=2; h-=2;
053        drawRectangle(g, getBackground(), x, y, --w, --h, 1, RAISED); w--; h--;
054        if(state && isEnabled()) {
055          drawLine(g,                   null, x + 1,     y + 2, x + w - 1, y + h,     1, RAISED);
056          drawLine(g, dim(g.getColor(), 128), x + 1,     y + 1, x + w,     y + h,     1, RAISED);
057          drawLine(g,                   null, x + 2,     y + 1, x + w,     y + h - 1, 1, RAISED);
058          drawLine(g,                   null, x + w - 1, y + 1, x + 1,     y + h - 1, 1, RAISED);
059          drawLine(g, dim(g.getColor(), 128), x + w,     y + 1, x + 1,     y + h,     1, RAISED);
060          drawLine(g,                   null, x + w,     y + 2, x + 2,     y + h,     1, RAISED);
061        }
062      }
063    
064      /**
065       * overwrite Caption.measureIcon()
066       *
067       * @return Dimension of Icon
068       */
069      public Dimension measureIcon() {
070        int h = measureCaption("X", getFont(), getFont(), "").height;
071        return new Dimension(h, h);
072      }
073    
074      /**
075       * change state on mousePress Event
076       */
077      public void onPress() {
078        entered = false;
079        setState(!state);
080        notifyItemListeners(new ItemEvent(this, 0, this, state ? ItemEvent.SELECTED : ItemEvent.DESELECTED));
081      }
082    
083      /**
084       * ignore mouseRelease Event
085       */
086      public void onRelease() {
087      }
088      
089      /**
090       * set a new state
091       *
092       * @param   state     the state
093       */
094      public void setState(boolean state) {
095        this.state = state;
096        repaint();
097      }
098      
099      /**
100       * @return current state
101       */
102      public boolean getState() {
103        return state;
104      }
105    }