X-Git-Url: http://git.nikiroo.be/?p=fanfix.git;a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Futils%2Fui%2FUIUtils.java;fp=src%2Fbe%2Fnikiroo%2Futils%2Fui%2FUIUtils.java;h=24cbf64a5f138a26edc64230301ef401e5438482;hp=0000000000000000000000000000000000000000;hb=d46b7b96f94e88a776bcd2dfd756549ffb300cc9;hpb=c9994f27667bc421bcd448d39e55774fddf5c431 diff --git a/src/be/nikiroo/utils/ui/UIUtils.java b/src/be/nikiroo/utils/ui/UIUtils.java new file mode 100644 index 0000000..24cbf64 --- /dev/null +++ b/src/be/nikiroo/utils/ui/UIUtils.java @@ -0,0 +1,118 @@ +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; + +/** + * Some Java Swing utilities. + * + * @author niki + */ +public class UIUtils { + /** + * Set a fake "native look & feel" for the application if possible + * (check for the one currently in use, then try GTK). + *

+ * Must be called prior to any GUI work. + */ + static public void setLookAndFeel() { + // native look & feel + try { + String noLF = "javax.swing.plaf.metal.MetalLookAndFeel"; + String lf = UIManager.getSystemLookAndFeelClassName(); + if (lf.equals(noLF)) + lf = "com.sun.java.swing.plaf.gtk.GTKLookAndFeel"; + UIManager.setLookAndFeel(lf); + } catch (InstantiationException e) { + } catch (ClassNotFoundException e) { + } catch (UnsupportedLookAndFeelException e) { + } 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); + } + } +}