- /*
 - * @(#)BasicArrowButton.java 1.19 00/02/02
 - *
 - * Copyright 1997-2000 Sun Microsystems, Inc. All Rights Reserved.
 - *
 - * This software is the proprietary information of Sun Microsystems, Inc.
 - * Use is subject to license terms.
 - *
 - */
 - package javax.swing.plaf.basic;
 - import java.awt.Dimension;
 - import java.awt.Graphics;
 - import java.awt.Color;
 - import javax.swing.*;
 - /**
 - * JButton object that draws a scaled Arrow in one of the cardinal directions.
 - * <p>
 - * <strong>Warning:</strong>
 - * Serialized objects of this class will not be compatible with
 - * future Swing releases. The current serialization support is appropriate
 - * for short term storage or RMI between applications running the same
 - * version of Swing. A future release of Swing will provide support for
 - * long term persistence.
 - *
 - * @version 1.19 02/02/00
 - * @author David Kloba
 - */
 - public class BasicArrowButton extends JButton implements SwingConstants
 - {
 - protected int direction;
 - public BasicArrowButton(int direction) {
 - super();
 - setRequestFocusEnabled(false);
 - setDirection(direction);
 - setBackground(UIManager.getColor("control"));
 - }
 - public int getDirection() { return direction; }
 - public void setDirection(int dir) { direction = dir; }
 - public void paint(Graphics g) {
 - Color origColor;
 - boolean isPressed, isEnabled;
 - int w, h, size;
 - w = getSize().width;
 - h = getSize().height;
 - origColor = g.getColor();
 - isPressed = getModel().isPressed();
 - isEnabled = isEnabled();
 - g.setColor(getBackground());
 - g.fillRect(1, 1, w-2, h-2);
 - /// Draw the proper Border
 - if (isPressed) {
 - g.setColor(UIManager.getColor("controlShadow"));
 - g.drawRect(0, 0, w-1, h-1);
 - } else {
 - // Using the background color set above
 - g.drawLine(0, 0, 0, h-1);
 - g.drawLine(1, 0, w-2, 0);
 - g.setColor(UIManager.getColor("controlLtHighlight")); // inner 3D border
 - g.drawLine(1, 1, 1, h-3);
 - g.drawLine(2, 1, w-3, 1);
 - g.setColor(UIManager.getColor("controlShadow")); // inner 3D border
 - g.drawLine(1, h-2, w-2, h-2);
 - g.drawLine(w-2, 1, w-2, h-3);
 - g.setColor(UIManager.getColor("controlDkShadow")); // black drop shadow __|
 - g.drawLine(0, h-1, w-1, h-1);
 - g.drawLine(w-1, h-1, w-1, 0);
 - }
 - // If there's no room to draw arrow, bail
 - if(h < 5 || w < 5) {
 - g.setColor(origColor);
 - return;
 - }
 - if (isPressed) {
 - g.translate(1, 1);
 - }
 - // Draw the arrow
 - size = Math.min((h - 4) / 3, (w - 4) / 3);
 - size = Math.max(size, 2);
 - paintTriangle(g, (w - size) / 2, (h - size) / 2,
 - size, direction, isEnabled);
 - // Reset the Graphics back to it's original settings
 - if (isPressed) {
 - g.translate(-1, -1);
 - }
 - g.setColor(origColor);
 - }
 - public Dimension getPreferredSize() {
 - return new Dimension(16, 16);
 - }
 - public Dimension getMinimumSize() {
 - return new Dimension(5, 5);
 - }
 - public Dimension getMaximumSize() {
 - return new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE);
 - }
 - public boolean isFocusTraversable() {
 - return false;
 - }
 - public void paintTriangle(Graphics g, int x, int y, int size,
 - int direction, boolean isEnabled) {
 - Color oldColor = g.getColor();
 - int mid, i, j;
 - j = 0;
 - size = Math.max(size, 2);
 - mid = size / 2;
 - g.translate(x, y);
 - if(isEnabled)
 - g.setColor(UIManager.getColor("controlDkShadow"));
 - else
 - g.setColor(UIManager.getColor("controlShadow"));
 - switch(direction) {
 - case NORTH:
 - for(i = 0; i < size; i++) {
 - g.drawLine(mid-i, i, mid+i, i);
 - }
 - if(!isEnabled) {
 - g.setColor(UIManager.getColor("controlLtHighlight"));
 - g.drawLine(mid-i+2, i, mid+i, i);
 - }
 - break;
 - case SOUTH:
 - if(!isEnabled) {
 - g.translate(1, 1);
 - g.setColor(UIManager.getColor("controlLtHighlight"));
 - for(i = size-1; i >= 0; i--) {
 - g.drawLine(mid-i, j, mid+i, j);
 - j++;
 - }
 - g.translate(-1, -1);
 - g.setColor(UIManager.getColor("controlShadow"));
 - }
 - j = 0;
 - for(i = size-1; i >= 0; i--) {
 - g.drawLine(mid-i, j, mid+i, j);
 - j++;
 - }
 - break;
 - case WEST:
 - for(i = 0; i < size; i++) {
 - g.drawLine(i, mid-i, i, mid+i);
 - }
 - if(!isEnabled) {
 - g.setColor(UIManager.getColor("controlLtHighlight"));
 - g.drawLine(i, mid-i+2, i, mid+i);
 - }
 - break;
 - case EAST:
 - if(!isEnabled) {
 - g.translate(1, 1);
 - g.setColor(UIManager.getColor("controlLtHighlight"));
 - for(i = size-1; i >= 0; i--) {
 - g.drawLine(j, mid-i, j, mid+i);
 - j++;
 - }
 - g.translate(-1, -1);
 - g.setColor(UIManager.getColor("controlShadow"));
 - }
 - j = 0;
 - for(i = size-1; i >= 0; i--) {
 - g.drawLine(j, mid-i, j, mid+i);
 - j++;
 - }
 - break;
 - }
 - g.translate(-x, -y);
 - g.setColor(oldColor);
 - }
 - }