jdk/src/share/classes/javax/swing/plaf/basic/BasicArrowButton.java
changeset 2 90ce3da70b43
child 5506 202f599c92aa
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicArrowButton.java	Sat Dec 01 00:00:00 2007 +0000
@@ -0,0 +1,308 @@
+/*
+ * Copyright 1997-2006 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package javax.swing.plaf.basic;
+
+import java.awt.Dimension;
+import java.awt.Graphics;
+import java.awt.Color;
+
+import javax.swing.*;
+import javax.swing.plaf.UIResource;
+
+/**
+ * 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.  As of 1.4, support for long term storage
+ * of all JavaBeans<sup><font size="-2">TM</font></sup>
+ * has been added to the <code>java.beans</code> package.
+ * Please see {@link java.beans.XMLEncoder}.
+ *
+ * @author David Kloba
+ */
+public class BasicArrowButton extends JButton implements SwingConstants
+{
+        /**
+         * The direction of the arrow. One of
+         * {@code SwingConstants.NORTH}, {@code SwingConstants.SOUTH},
+         * {@code SwingConstants.EAST} or {@code SwingConstants.WEST}.
+         */
+        protected int direction;
+
+        private Color shadow;
+        private Color darkShadow;
+        private Color highlight;
+
+        /**
+         * Creates a {@code BasicArrowButton} whose arrow
+         * is drawn in the specified direction and with the specified
+         * colors.
+         *
+         * @param direction the direction of the arrow; one of
+         *        {@code SwingConstants.NORTH}, {@code SwingConstants.SOUTH},
+         *        {@code SwingConstants.EAST} or {@code SwingConstants.WEST}
+         * @param background the background color of the button
+         * @param shadow the color of the shadow
+         * @param darkShadow the color of the dark shadow
+         * @param highlight the color of the highlight
+         * @since 1.4
+         */
+        public BasicArrowButton(int direction, Color background, Color shadow,
+                         Color darkShadow, Color highlight) {
+            super();
+            setRequestFocusEnabled(false);
+            setDirection(direction);
+            setBackground(background);
+            this.shadow = shadow;
+            this.darkShadow = darkShadow;
+            this.highlight = highlight;
+        }
+
+        /**
+         * Creates a {@code BasicArrowButton} whose arrow
+         * is drawn in the specified direction.
+         *
+         * @param direction the direction of the arrow; one of
+         *        {@code SwingConstants.NORTH}, {@code SwingConstants.SOUTH},
+         *        {@code SwingConstants.EAST} or {@code SwingConstants.WEST}
+         */
+        public BasicArrowButton(int direction) {
+            this(direction, UIManager.getColor("control"), UIManager.getColor("controlShadow"),
+                 UIManager.getColor("controlDkShadow"), UIManager.getColor("controlLtHighlight"));
+        }
+
+        /**
+         * Returns the direction of the arrow.
+         */
+        public int getDirection() {
+            return direction;
+        }
+
+        /**
+         * Sets the direction of the arrow.
+         *
+         * @param direction the direction of the arrow; one of
+         *        of {@code SwingConstants.NORTH},
+         *        {@code SwingConstants.SOUTH},
+         *        {@code SwingConstants.EAST} or {@code SwingConstants.WEST}
+         */
+        public void setDirection(int direction) {
+            this.direction = direction;
+        }
+
+        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 (getBorder() != null && !(getBorder() instanceof UIResource)) {
+                paintBorder(g);
+            } else if (isPressed) {
+                g.setColor(shadow);
+                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(highlight);    // inner 3D border
+                g.drawLine(1, 1, 1, h-3);
+                g.drawLine(2, 1, w-3, 1);
+
+                g.setColor(shadow);       // inner 3D border
+                g.drawLine(1, h-2, w-2, h-2);
+                g.drawLine(w-2, 1, w-2, h-3);
+
+                g.setColor(darkShadow);     // 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);
+
+        }
+
+        /**
+         * Returns the preferred size of the {@code BasicArrowButton}.
+         *
+         * @return the preferred size
+         */
+        public Dimension getPreferredSize() {
+            return new Dimension(16, 16);
+        }
+
+        /**
+         * Returns the minimum size of the {@code BasicArrowButton}.
+         *
+         * @return the minimum size
+         */
+        public Dimension getMinimumSize() {
+            return new Dimension(5, 5);
+        }
+
+        /**
+         * Returns the maximum size of the {@code BasicArrowButton}.
+         *
+         * @return the maximum size
+         */
+        public Dimension getMaximumSize() {
+            return new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE);
+        }
+
+        /**
+         * Returns whether the arrow button should get the focus.
+         * {@code BasicArrowButton}s are used as a child component of
+         * composite components such as {@code JScrollBar} and
+         * {@code JComboBox}. Since the composite component typically gets the
+         * focus, this method is overriden to return {@code false}.
+         *
+         * @return {@code false}
+         */
+        public boolean isFocusTraversable() {
+          return false;
+        }
+
+        /**
+         * Paints a triangle.
+         *
+         * @param g the {@code Graphics} to draw to
+         * @param x the x coordinate
+         * @param y the y coordinate
+         * @param size the size of the triangle to draw
+         * @param direction the direction in which to draw the arrow;
+         *        one of {@code SwingConstants.NORTH},
+         *        {@code SwingConstants.SOUTH}, {@code SwingConstants.EAST} or
+         *        {@code SwingConstants.WEST}
+         * @param isEnabled whether or not the arrow is drawn enabled
+         */
+        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) - 1;
+
+            g.translate(x, y);
+            if(isEnabled)
+                g.setColor(darkShadow);
+            else
+                g.setColor(shadow);
+
+            switch(direction)       {
+            case NORTH:
+                for(i = 0; i < size; i++)      {
+                    g.drawLine(mid-i, i, mid+i, i);
+                }
+                if(!isEnabled)  {
+                    g.setColor(highlight);
+                    g.drawLine(mid-i+2, i, mid+i, i);
+                }
+                break;
+            case SOUTH:
+                if(!isEnabled)  {
+                    g.translate(1, 1);
+                    g.setColor(highlight);
+                    for(i = size-1; i >= 0; i--)   {
+                        g.drawLine(mid-i, j, mid+i, j);
+                        j++;
+                    }
+                    g.translate(-1, -1);
+                    g.setColor(shadow);
+                }
+
+                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(highlight);
+                    g.drawLine(i, mid-i+2, i, mid+i);
+                }
+                break;
+            case EAST:
+                if(!isEnabled)  {
+                    g.translate(1, 1);
+                    g.setColor(highlight);
+                    for(i = size-1; i >= 0; i--)   {
+                        g.drawLine(j, mid-i, j, mid+i);
+                        j++;
+                    }
+                    g.translate(-1, -1);
+                    g.setColor(shadow);
+                }
+
+                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);
+        }
+
+}