Merge commit 'ee020e75a5de0c1e54557db79f77edc50e05ea04'
[fanfix.git] / src / be / nikiroo / utils / ui / UIUtils.java
index 24cbf64a5f138a26edc64230301ef401e5438482..9f16aabe79c3ba8dc80e8221bace21b2ec5f0d4a 100644 (file)
@@ -8,6 +8,8 @@ import java.awt.Paint;
 import java.awt.RadialGradientPaint;
 import java.awt.RenderingHints;
 
+import javax.swing.JComponent;
+import javax.swing.JScrollPane;
 import javax.swing.UIManager;
 import javax.swing.UnsupportedLookAndFeelException;
 
@@ -58,6 +60,31 @@ public class UIUtils {
         */
        static public void drawEllipse3D(Graphics g, Color color, int x, int y,
                        int width, int height) {
+               drawEllipse3D(g, color, x, y, width, height, true);
+       }
+
+       /**
+        * Draw a 3D-looking ellipse at the given location, if the given
+        * {@link Graphics} object is compatible (with {@link Graphics2D}); draw a
+        * simple ellipse if not.
+        * 
+        * @param g
+        *            the {@link Graphics} to draw on
+        * @param color
+        *            the base colour
+        * @param x
+        *            the X coordinate
+        * @param y
+        *            the Y coordinate
+        * @param width
+        *            the width radius
+        * @param height
+        *            the height radius
+        * @param fill
+        *            fill the content of the ellipse
+        */
+       static public void drawEllipse3D(Graphics g, Color color, int x, int y,
+                       int width, int height, boolean fill) {
                if (g instanceof Graphics2D) {
                        Graphics2D g2 = (Graphics2D) g;
                        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
@@ -68,12 +95,16 @@ public class UIUtils {
 
                        // Base shape
                        g2.setColor(color);
-                       g2.fillOval(x, y, width, height);
+                       if (fill) {
+                               g2.fillOval(x, y, width, height);
+                       } else {
+                               g2.drawOval(x, y, width, height);
+                       }
 
                        // Compute dark/bright colours
                        Paint p = null;
-                       Color dark = color.darker();
-                       Color bright = color.brighter();
+                       Color dark = color.darker().darker();
+                       Color bright = color.brighter().brighter();
                        Color darkEnd = new Color(dark.getRed(), dark.getGreen(),
                                        dark.getBlue(), 0);
                        Color darkPartial = new Color(dark.getRed(), dark.getGreen(),
@@ -84,12 +115,19 @@ public class UIUtils {
                        // Adds shadows at the bottom left
                        p = new GradientPaint(0, height, dark, width, 0, darkEnd);
                        g2.setPaint(p);
-                       g2.fillOval(x, y, width, height);
-
+                       if (fill) {
+                               g2.fillOval(x, y, width, height);
+                       } else {
+                               g2.drawOval(x, y, width, height);
+                       }
                        // Adds highlights at the top right
                        p = new GradientPaint(width, 0, bright, 0, height, brightEnd);
                        g2.setPaint(p);
-                       g2.fillOval(x, y, width, height);
+                       if (fill) {
+                               g2.fillOval(x, y, width, height);
+                       } else {
+                               g2.drawOval(x, y, width, height);
+                       }
 
                        // Darken the edges
                        p = new RadialGradientPaint(x + width / 2f, y + height / 2f,
@@ -97,7 +135,11 @@ public class UIUtils {
                                        new Color[] { darkEnd, darkPartial },
                                        RadialGradientPaint.CycleMethod.NO_CYCLE);
                        g2.setPaint(p);
-                       g2.fillOval(x, y, width, height);
+                       if (fill) {
+                               g2.fillOval(x, y, width, height);
+                       } else {
+                               g2.drawOval(x, y, width, height);
+                       }
 
                        // Adds inner highlight at the top right
                        p = new RadialGradientPaint(x + 3f * width / 4f, y + height / 4f,
@@ -106,13 +148,42 @@ public class UIUtils {
                                        new Color[] { bright, brightEnd },
                                        RadialGradientPaint.CycleMethod.NO_CYCLE);
                        g2.setPaint(p);
-                       g2.fillOval(x * 2, y, width, height);
+                       if (fill) {
+                               g2.fillOval(x * 2, y, width, height);
+                       } else {
+                               g2.drawOval(x * 2, y, width, height);
+                       }
 
                        // Reset original paint
                        g2.setPaint(oldPaint);
                } else {
                        g.setColor(color);
-                       g.fillOval(x, y, width, height);
+                       if (fill) {
+                               g.fillOval(x, y, width, height);
+                       } else {
+                               g.drawOval(x, y, width, height);
+                       }
+               }
+       }
+
+       /**
+        * Add a {@link JScrollPane} around the given panel and use a sensible (for
+        * me) increment for the mouse wheel.
+        * 
+        * @param pane
+        *            the panel to wrap in a {@link JScrollPane}
+        * @param allowHorizontal
+        *            allow horizontal scrolling (not always desired)
+        * 
+        * @return the {@link JScrollPane}
+        */
+       static public JScrollPane scroll(JComponent pane, boolean allowHorizontal) {
+               JScrollPane scroll = new JScrollPane(pane);
+               scroll.getVerticalScrollBar().setUnitIncrement(16);
+               if (!allowHorizontal) {
+                       scroll.setHorizontalScrollBarPolicy(
+                                       JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
                }
+               return scroll;
        }
 }