home *** CD-ROM | disk | FTP | other *** search
Java Source | 1997-06-01 | 14.8 KB | 435 lines |
- package GUITools;
- import java.AWT.*;
- import java.AWT.event.*;
- import java.AWT.image.*;
-
- /**
- * Image button class written by Shai Almog 1996.
- * The sorce is in the public domain and may be modified and used freely.
- * It is not a requirment but I would consider it good manners if you credit me
- * and EDM/2 (www.edm2.com) in applications in which this code was used ;-)
- * The ImageButton class is a class that presents a button with an image on it.
- * It has several features which are not common with most ImageButtons:
- * 1. It's fully compatible with java.AWT.Button since it derives from it.
- * 2. It has 3 modes Image/Text (regular button)/Text and Image.
- * 3. It has 2 types regular and toggle (toggle stays pressed).
- * 4. It can be constructed with 1 to 3 images. If you give it only one image it
- * will use the class ImageButtonDrawingEngine to draw the up and down states.
- * 5. It has a disabled mode.
- **/
- public class ImageButton extends Button implements ImageObserver, MouseListener
- {
- public ImageButton()
- {
- initImageButton();
- }
-
- /**
- * This constructor takes the label of the button as a parameter.
- **/
- public ImageButton(String caption)
- {
- initImageButton();
- setCaption(caption);
- }
-
- /**
- * This constructor takes an Image object as a parameter.
- **/
- public ImageButton(Image imageInstance)
- {
- initImageButton();
- buttonUp = imageInstance; // Setting the images for the buttons.
- buttonDown = buttonUp; // They are all identical since there is only one picture.
- buttonDisabled = buttonUp;
- waitForImage(buttonUp); // If the image did not finish loading then wait for it.
- }
-
- /**
- * This constructor takes both the label and the Image as a parameters.
- **/
- public ImageButton(String caption, Image imageInstance)
- {
- initImageButton();
- setCaption(caption);
- buttonUp = imageInstance; // Setting the images for the buttons.
- buttonDown = buttonUp; // They are all identical since there is only one picture.
- buttonDisabled = buttonUp;
- waitForImage(buttonUp); // If the image did not finish loading then wait for it.
- }
-
- /**
- * This constructor takes both the label and the image name as a parameters.
- **/
- public ImageButton(String caption, String imageName)
- {
- Toolkit Tk = getToolkit();
- buttonUp = Tk.getImage(imageName); // Loading the image from disk.
- initImageButton();
- setCaption(caption);
- buttonDown = buttonUp; // Setting the images for the buttons.
- buttonDisabled = buttonUp; // They are all identical since there is only one picture.
- waitForImage(buttonUp); // If the image did not finish loading then wait for it.
- }
-
- /**
- * This constructor takes both the label and three image name's as a parameters.
- * These are used for button up/down/disabled states.
- **/
- public ImageButton(String caption, String imageNameButtonUp, String
- imageNameButtonDown, String imageNameButtonDisabled)
- {
-
- Toolkit Tk = getToolkit();
- buttonUp = Tk.getImage(imageNameButtonUp); // Loading the image's from disk.
- buttonDown = Tk.getImage(imageNameButtonDown);
- buttonDisabled = Tk.getImage(imageNameButtonDisabled);
- initImageButton();
- setCaption(caption);
- waitForImage(buttonUp);// If the image did not finish loading then wait for it.
- // The reason I only wait for button up is that this class is designed
- // to run localy so there will not be a significant delay.
- }
-
- public void setUpImage(Image imageInstance) // Sets the image displayed
- { // when the button is up.
- buttonUp = imageInstance;
- }
-
- public void setDownImage(Image imageInstance) // Sets the image displayed
- { // when the button is down.
- buttonDown = imageInstance;
- }
-
- public void setDisabledImage(Image imageInstance) // Sets the image displayed
- { // when the button is disabled.
- buttonDisabled = imageInstance;
- }
-
- public void setToggleOn() // Turns the toggle mode on.
- {
- buttonMode = BUTTON_MODE_TOGGLE;
- }
-
- public void setToggleOff() // Turns the toggle mode off.
- {
- buttonMode = BUTTON_MODE_NORMAL;
- repaint();
- }
-
- public void setTextX(int x) // Sets the x in which the text on an Image & Text button shows.
- {
- textOnImageButtonX = x;
- repaint();
- }
-
- public void setTextY(int y) // Sets the y in which the text on an Image & Text button shows.
- {
- textOnImageButtonX = y;
- repaint();
- }
-
- public void setImageMode() // Sets the button to show as an image button.
- {
- buttonType = BUTTON_TYPE_IMAGE;
- repaint();
- }
-
- public void setTextMode() // Sets the button to show as a regular button.
- {
- buttonType = BUTTON_TYPE_TEXT;
- repaint();
- }
-
- /**
- * Sets the button to show as an image button with text too.
- **/
- public void setTextAndImageMode()
- {
- buttonType = BUTTON_TYPE_TEXT_AND_IMAGE;
- repaint();
- }
-
- public void setColorOfTextOnButton(Color colorOfTextOnButton) // This will set the color
- { // of the text on the button in case this is an image button with text too.
- this.colorOfTextOnButton = colorOfTextOnButton;
- }
-
- /**
- * Toggles the button bettwean disabled and enabled mode.
- **/
- public void setEnabled(boolean mode)
- {
- super.setEnabled(mode);
- if (mode)
- {
- buttonState = BUTTON_STATE_UP;
- }
- else
- {
- buttonState = BUTTON_STATE_DISABLED;
- }
- }
-
- public void setCaption(String caption)
- {
- this.caption = caption;
- }
-
- public void paint(Graphics g)
- {
- if (BUTTON_TYPE_TEXT == buttonType)
- { // Using the default Java button.
- super.paint(g);
- return;
- }
- switch (buttonState)
- {
- case BUTTON_STATE_UP:
- {
- drawButtonUp(g); // Draws the button up.
- if(BUTTON_TYPE_TEXT_AND_IMAGE == buttonType)
- {
- g.setColor(colorOfTextOnButton);
- // Set the text color to the buttons text color.
- g.drawString(caption,textOnImageButtonX,
- textOnImageButtonY);
- // Draw the string on the button.
- }
- break;
- }
- case BUTTON_STATE_DOWN :
- {
- drawButtonDown(g); // Draws the button down.
- if(BUTTON_TYPE_TEXT_AND_IMAGE == buttonType)
- {
- g.setColor(colorOfTextOnButton);
- g.drawString(caption,textOnImageButtonX,
- textOnImageButtonY);
- }
- break;
- }
- case BUTTON_STATE_DISABLED :
- {
- drawButtonDisabled(g); // Draws the button disabled.
- if(BUTTON_TYPE_TEXT_AND_IMAGE == buttonType)
- {
- g.setColor(colorOfTextOnButton);
- g.drawString(caption,textOnImageButtonX,
- textOnImageButtonY);
- }
- break;
- }
- }
-
- }
-
- /**
- * This method is part of the ImageObserver interface, it's called by Image
- * producers to inform us of new information regarding the image.
- * I use this method to wait for the image to compleately load and is sets
- * imageReady to true the moment the image is ready.
- **/
- public boolean ImageUpdate(Image i,int flags, int x,int y,int height, int width)
- {
- imageReady = imageReady || ((flags & ALLBITS) == 0);
- return(true);
- }
-
- /**
- * This action will cause the button to be pressed.
- * The reason I did not use the action event was that it does not send events
- * for both press and release, we need to know both so we can draw the button
- * correctly.
- **/
- public void mousePressed(MouseEvent e)
- {
- if (buttonMode != BUTTON_MODE_TOGGLE)
- if(buttonState == BUTTON_STATE_UP)
- {
- buttonState = BUTTON_STATE_DOWN;
- repaint();
- }
- }
-
- public void mouseClicked(MouseEvent e)
- {
- // This method is needed by the mouse listener interface.
- }
-
- /**
- * This action will cause the button to be released.
- * The reason I did not use the action event was that it does not send events
- * for both press and release, we need to know both so we can draw the button
- * correctly.
- **/
- public void mouseReleased(MouseEvent e)
- {
- if (buttonMode != BUTTON_MODE_TOGGLE)
- {
- if(buttonState == BUTTON_STATE_DOWN)
- {
- buttonState = BUTTON_STATE_UP;
- repaint();
- }
- }
- else
- {
- if(buttonState == BUTTON_STATE_DOWN)
- {
- buttonState = BUTTON_STATE_UP;
- }
- else
- {
- buttonState = BUTTON_STATE_DOWN;
- }
- repaint();
- }
- }
-
- public void mouseEntered(MouseEvent e)
- {
- // This methods is needed by the mouse listener interface.
- }
-
- public void mouseExited(MouseEvent e)
- {
- // This methods is needed by the mouse listener interface.
- }
-
- /**
- * This method draws the button down.
- **/
- private void drawButtonDown(Graphics g)
- {
- Dimension buttonSize = getSize();
- if (buttonDown == buttonUp) // If the same image is used for all the buttons.
- { // Then call the ImageButtonDrawingEngine to redraw the frame.
- ImageButtonDrawingEngine.drawButtonDown(g);
- g.drawImage(buttonDown
- , 0 + ImageButtonDrawingEngine.X_SPACE
- , 0 + ImageButtonDrawingEngine.Y_SPACE
- , buttonSize.width + ImageButtonDrawingEngine.X_SPACE
- , buttonSize.height + ImageButtonDrawingEngine.Y_SPACE
- , this);
- }
- // Otherwize simply draw the correct image.
- else g.drawImage(buttonDown,0,0,buttonSize.width,buttonSize.height,this);
- }
-
- /**
- * This method draws the button down.
- **/
- private void drawButtonUp(Graphics g)
- {
- Dimension buttonSize = getSize();
- if (buttonDown == buttonUp) // If the same image is used for all the buttons.
- { // Then call the ImageButtonDrawingEngine to redraw the frame.
- ImageButtonDrawingEngine.drawButtonUp(g);
- g.drawImage(buttonUp
- , 0 + ImageButtonDrawingEngine.X_SPACE
- , 0 +ImageButtonDrawingEngine.Y_SPACE
- , buttonSize.width + ImageButtonDrawingEngine.X_SPACE
- , buttonSize.height + ImageButtonDrawingEngine.Y_SPACE
- , this);
- }
- // Otherwize simply draw the correct image.
- else g.drawImage(buttonUp,0,0,buttonSize.width,buttonSize.height,this);
- }
-
- /**
- * This method draws the button down.
- **/
- private void drawButtonDisabled(Graphics g)
- {
- Dimension buttonSize = getSize();
- if (buttonDown == buttonUp) // If the same image is used for all the buttons.
- { // Then call the ImageButtonDrawingEngine to redraw the frame.
- ImageButtonDrawingEngine.drawButtonDisabled(g);
- g.drawImage(buttonDisabled
- , 0 + ImageButtonDrawingEngine.X_SPACE
- , 0 + ImageButtonDrawingEngine.Y_SPACE
- , buttonSize.width + ImageButtonDrawingEngine.X_SPACE
- , buttonSize.height + ImageButtonDrawingEngine.Y_SPACE
- , this);
- }
- // Otherwise simply draw the correct image.
- else g.drawImage(buttonDisabled,0,0,buttonSize.width,buttonSize.height,this);
- }
-
- /**
- * This method is closely related to the ImageUpdate method.
- * This method waits for ImageUpdate to set a switch that the image is ready,
- * thus we can know that the image is in fact in memory. This is due to the
- * Image producer - consumer - observer concept.
- **/
- private void waitForImage(Image imageToWaitFor)
- {
- Dimension buttonSize = getSize();
- Toolkit Tk = getToolkit();
- if (!Tk.prepareImage(buttonUp,buttonSize.width,buttonSize.height,this))
- while (!imageReady);
- repaint();
- }
-
- /**
- * This method initializes the button and is called by all the constructors.
- **/
- private void initImageButton()
- {
- addMouseListener(this); // Listen to mouse related events.
- }
-
- private static final int BUTTON_TYPE_IMAGE = 0; // These are reuqired
- private static final int BUTTON_TYPE_TEXT = 1; // to toggle the button
- private static final int BUTTON_TYPE_TEXT_AND_IMAGE = 2; // to image
- private int buttonType = BUTTON_TYPE_IMAGE;// and text modes.
- private int textOnImageButtonX; // These determin where the text in a
- private int textOnImageButtonY; // BUTTON_TYPE_TEXT_AND_IMAGE will sit.
- private Color colorOfTextOnButton = Color.black;
-
- private static final int BUTTON_MODE_NORMAL = 0; // These are required to
- private static final int BUTTON_MODE_TOGGLE = 1; // toggle the button to toggle
- private int buttonMode = BUTTON_MODE_NORMAL; // mode where it stays pressed.
-
- private static final int BUTTON_STATE_UP = 0; // These constants reflect the
- private static final int BUTTON_STATE_DOWN = 1; // state of the button.
- private static final int BUTTON_STATE_DISABLED = 2;
- private int buttonState = BUTTON_STATE_UP; // This variable contains one
- // of the three constants above.
-
- private boolean imageReady = false; // This variable is used by the ImageUpdate method.
-
- private Image buttonUp,// The Image of the button when it's up.
- buttonDown, // The Image of the button when it's down.
- buttonDisabled; // The Image of the button when it's disbaled.
- private String caption; // The text on the button.
- }
-
-
- /**
- * This class was built with the purpose of separating the engine that draws
- * the button pressed and normal from the rest of the code so it can be
- * replaced easily.
- */
- class ImageButtonDrawingEngine
- {
- public static void drawButtonDown(Graphics g)
- {
- Rectangle bounds = g.getClipBounds();
- g.draw3DRect(0,0,bounds.width,bounds.height,false);
- }
- public static void drawButtonUp(Graphics g)
- {
- Rectangle bounds = g.getClipBounds();
- g.draw3DRect(0,0,bounds.width,bounds.height,false);
- }
- public static void drawButtonDisabled(Graphics g)
- {
- Rectangle bounds = g.getClipBounds();
- g.draw3DRect(0,0,bounds.width,bounds.height,false);
- }
- public static int X_SPACE = 2;
- public static int Y_SPACE = 2;
- }
-