VERSION 1.2.1: drawEllipse3D
authorNiki Roo <niki@nikiroo.be>
Thu, 23 Feb 2017 07:30:08 +0000 (08:30 +0100)
committerNiki Roo <niki@nikiroo.be>
Thu, 23 Feb 2017 07:30:08 +0000 (08:30 +0100)
VERSION
changelog
src/be/nikiroo/utils/ui/UIUtils.java

diff --git a/VERSION b/VERSION
index 524cb55242b53f6a64cc646ea05db6acc7696d2d..6085e946503a10fb4d58a5c7d9a6e572c21ddd2e 100644 (file)
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.1.1
+1.2.1
index 02a6944ae6a2654c5eb795891beacbd623e90b17..1e993c2b3e2438e38d37c3a7e7e2c05c6b54e05a 100644 (file)
--- a/changelog
+++ b/changelog
@@ -1,3 +1,9 @@
+Version 1.1.2
+-------------
+
+New drawEllipse3D method
+       ...in UIUtils
+
 Version 1.1.1
 -------------
 
index 547ff6c3d40fb42e14f45c42d1b65ae02578898e..24cbf64a5f138a26edc64230301ef401e5438482 100644 (file)
@@ -1,5 +1,13 @@
 package be.nikiroo.utils.ui;
 
+import java.awt.Color;
+import java.awt.GradientPaint;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Paint;
+import java.awt.RadialGradientPaint;
+import java.awt.RenderingHints;
+
 import javax.swing.UIManager;
 import javax.swing.UnsupportedLookAndFeelException;
 
@@ -29,4 +37,82 @@ public class UIUtils {
                } catch (IllegalAccessException e) {
                }
        }
+
+       /**
+        * 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
+        */
+       static public void drawEllipse3D(Graphics g, Color color, int x, int y,
+                       int width, int height) {
+               if (g instanceof Graphics2D) {
+                       Graphics2D g2 = (Graphics2D) g;
+                       g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
+                                       RenderingHints.VALUE_ANTIALIAS_ON);
+
+                       // Retains the previous state
+                       Paint oldPaint = g2.getPaint();
+
+                       // Base shape
+                       g2.setColor(color);
+                       g2.fillOval(x, y, width, height);
+
+                       // Compute dark/bright colours
+                       Paint p = null;
+                       Color dark = color.darker();
+                       Color bright = color.brighter();
+                       Color darkEnd = new Color(dark.getRed(), dark.getGreen(),
+                                       dark.getBlue(), 0);
+                       Color darkPartial = new Color(dark.getRed(), dark.getGreen(),
+                                       dark.getBlue(), 64);
+                       Color brightEnd = new Color(bright.getRed(), bright.getGreen(),
+                                       bright.getBlue(), 0);
+
+                       // Adds shadows at the bottom left
+                       p = new GradientPaint(0, height, dark, width, 0, darkEnd);
+                       g2.setPaint(p);
+                       g2.fillOval(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);
+
+                       // Darken the edges
+                       p = new RadialGradientPaint(x + width / 2f, y + height / 2f,
+                                       Math.min(width / 2f, height / 2f), new float[] { 0f, 1f },
+                                       new Color[] { darkEnd, darkPartial },
+                                       RadialGradientPaint.CycleMethod.NO_CYCLE);
+                       g2.setPaint(p);
+                       g2.fillOval(x, y, width, height);
+
+                       // Adds inner highlight at the top right
+                       p = new RadialGradientPaint(x + 3f * width / 4f, y + height / 4f,
+                                       Math.min(width / 4f, height / 4f),
+                                       new float[] { 0.0f, 0.8f },
+                                       new Color[] { bright, brightEnd },
+                                       RadialGradientPaint.CycleMethod.NO_CYCLE);
+                       g2.setPaint(p);
+                       g2.fillOval(x * 2, y, width, height);
+
+                       // Reset original paint
+                       g2.setPaint(oldPaint);
+               } else {
+                       g.setColor(color);
+                       g.fillOval(x, y, width, height);
+               }
+       }
 }