/******************************************************************************* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Tiny Look and Feel * * (C) Copyright 2003 - 2007 Hans Bickel * * For * licensing information and credits, please refer to the * comment in file * de.muntjak.tinylookandfeel.TinyLookAndFeel * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package de.muntjak.tinylookandfeel.borders; import java.awt.Color; import java.awt.Component; import java.awt.Frame; import java.awt.Graphics; import java.awt.Image; import java.awt.Insets; import java.awt.Rectangle; import java.awt.Robot; import java.awt.Window; import java.awt.image.BufferedImage; import java.util.HashMap; import javax.swing.JFrame; import javax.swing.SwingUtilities; import javax.swing.border.AbstractBorder; import javax.swing.plaf.UIResource; import de.muntjak.tinylookandfeel.Theme; import de.muntjak.tinylookandfeel.TinyLookAndFeel; import de.muntjak.tinylookandfeel.controlpanel.ColorRoutines; import de.muntjak.tinylookandfeel.controlpanel.SBChooser; /** * TinyFrameBorder * * @version 1.0 * @author Hans Bickel */ @SuppressWarnings ( { "all" } ) public class TinyFrameBorder extends AbstractBorder implements UIResource { // cache for already painted captions private static HashMap cache = new HashMap (); public static Color buttonUpperColor, buttonLowerColor; private static TinyFrameBorder onlyInstance; private static Robot robot; private static boolean robotsSupported = true; private Window window; private int titleHeight; private boolean isActive; public static TinyFrameBorder getInstance () { if ( onlyInstance == null ) { onlyInstance = new TinyFrameBorder (); if ( robot == null && robotsSupported ) { try { robot = new Robot (); } catch ( Exception ex ) { robotsSupported = false; } } } return onlyInstance; } public void paintBorder ( Component c, Graphics g, int x, int y, int w, int h ) { window = SwingUtilities.getWindowAncestor ( c ); isActive = window.isActive (); if ( window instanceof JFrame ) { titleHeight = Theme.frameTitleHeight [ Theme.derivedStyle [ Theme.style ] ]; } else { titleHeight = Theme.frameInternalTitleHeight [ Theme.derivedStyle [ Theme.style ] ]; } if ( isActive ) { g.setColor ( Theme.frameBorderColor [ Theme.style ].getColor () ); } else { g.setColor ( Theme.frameBorderDisabledColor [ Theme.style ].getColor () ); } switch ( Theme.derivedStyle [ Theme.style ] ) { case Theme.TINY_STYLE : drawTinyBorder ( g, x, y, w, h ); break; case Theme.W99_STYLE : drawWinBorder ( g, x, y, w, h ); break; case Theme.YQ_STYLE : drawXpBorder ( g, x, y, w, h ); break; } Color col = null; if ( isActive ) { col = Theme.frameCaptionColor [ Theme.style ].getColor (); } else { col = Theme.frameCaptionDisabledColor [ Theme.style ].getColor (); } g.setColor ( col ); switch ( Theme.derivedStyle [ Theme.style ] ) { case Theme.TINY_STYLE : drawTinyCaption ( g, x, y, w, h, col ); break; case Theme.W99_STYLE : drawWinCaption ( g, x, y, w, h, col ); break; case Theme.YQ_STYLE : if ( TinyLookAndFeel.controlPanelInstantiated ) { drawXpCaptionNoCache ( g, x, y, w, h, col ); } else { drawXpCaption ( g, x, y, w, h, col ); } break; } } private void drawTinyBorder ( Graphics g, int x, int y, int w, int h ) { } private void drawWinBorder ( Graphics g, int x, int y, int w, int h ) { // Border color g.drawLine ( x, y, x + w - 2, y ); g.drawLine ( x, y + 1, x, y + h - 2 ); g.drawRect ( x + 2, y + 2, w - 5, h - 5 ); g.drawRect ( x + 3, y + 3, w - 7, h - 7 ); g.setColor ( Color.WHITE ); g.drawLine ( x + 1, y + 1, x + w - 3, y + 1 ); g.drawLine ( x + 1, y + 2, x + 1, y + h - 3 ); g.setColor ( Theme.frameDarkColor [ Theme.style ].getColor () ); g.drawLine ( x, y + h - 1, x + w - 1, y + h - 1 ); g.drawLine ( x + w - 1, y, x + w - 1, y + h - 1 ); g.setColor ( Theme.frameLightColor [ Theme.style ].getColor () ); g.drawLine ( x + 1, y + h - 2, x + w - 2, y + h - 2 ); g.drawLine ( w - 2, y + 1, x + w - 2, y + h - 2 ); } private void drawXpBorder ( Graphics g, int x, int y, int w, int h ) { // left g.drawLine ( x, y + 6, x, y + h - 1 ); g.drawLine ( x + 2, y + titleHeight, x + 2, y + h - 3 ); // right g.drawLine ( x + w - 1, y + 6, x + w - 1, y + h - 1 ); g.drawLine ( x + w - 3, y + titleHeight, x + w - 3, y + h - 3 ); // bottom g.drawLine ( x + 2, y + h - 3, x + w - 3, y + h - 3 ); g.drawLine ( x, y + h - 1, x + w - 1, y + h - 1 ); if ( robot != null ) { int wx = window.getLocationOnScreen ().x - 4; int wy = window.getLocationOnScreen ().y; Rectangle screenRect = new Rectangle ( wx, wy, 4, 4 ); g.drawImage ( robot.createScreenCapture ( screenRect ), x, y, null ); wx = window.getLocationOnScreen ().x + window.getWidth () + 1; screenRect = new Rectangle ( wx, wy, 4, 4 ); g.drawImage ( robot.createScreenCapture ( screenRect ), x + w - 4, y, null ); } else { g.setColor ( Theme.backColor [ Theme.style ].getColor () ); g.fillRect ( 0, 0, w, 3 ); } if ( isActive ) { g.setColor ( Theme.frameCaptionColor [ Theme.style ].getColor () ); } else { g.setColor ( Theme.frameCaptionDisabledColor [ Theme.style ].getColor () ); } // left g.drawLine ( x + 1, y + titleHeight, x + 1, y + h - 2 ); // right g.drawLine ( x + w - 2, y + titleHeight, x + w - 2, y + h - 2 ); // bottom g.drawLine ( x + 1, y + h - 2, x + w - 2, y + h - 2 ); Color c = null; if ( isActive ) { c = Theme.frameBorderColor [ Theme.style ].getColor (); } else { c = Theme.frameBorderDisabledColor [ Theme.style ].getColor (); } g.setColor ( ColorRoutines.getAlphaColor ( c, 82 ) ); g.drawLine ( x, y + 3, x, y + 3 ); g.drawLine ( x + w - 1, y + 3, x + w - 1, y + 3 ); g.setColor ( ColorRoutines.getAlphaColor ( c, 156 ) ); g.drawLine ( x, y + 4, x, y + 4 ); g.drawLine ( x + w - 1, y + 4, x + w - 1, y + 4 ); g.setColor ( ColorRoutines.getAlphaColor ( c, 215 ) ); g.drawLine ( x, y + 5, x, y + 5 ); g.drawLine ( x + w - 1, y + 5, x + w - 1, y + 5 ); } private void drawTinyCaption ( Graphics g, int x, int y, int w, int h, Color c ) { } private void drawWinCaption ( Graphics g, int x, int y, int w, int h, Color c ) { int y2 = y + titleHeight - 2; int tw = w - 8; int maxSat = 56, maxBri = 78; if ( !isActive ) { maxSat = 0; maxBri = 50; } int sat = 0, bri = 0; int memSat = 0, memBri = 0; Color col = c; for ( int i = 0 ; i < tw ; i++ ) { // horizontal g.setColor ( col ); g.drawLine ( x + 4 + i, y + 4, x + 4 + i, y2 ); sat = maxSat * i / tw; bri = maxBri * i / tw; if ( ( sat != memSat ) || ( bri != memBri ) ) { memSat = sat; memBri = bri; col = SBChooser.getAdjustedColor ( c, sat, bri ); } } g.setColor ( Theme.frameBorderColor [ Theme.style ].getColor () ); g.drawLine ( x + 4, y + titleHeight - 1, x + w - 5, y + titleHeight - 1 ); } private void drawXpCaption ( Graphics g, int x, int y, int w, int h, Color c ) { if ( titleHeight == Theme.frameInternalTitleHeight [ Theme.derivedStyle [ Theme.style ] ] ) { drawXpInternalCaption ( g, x, y, w, h, c ); return; } int spread1 = Theme.frameSpreadDarkDisabled [ Theme.style ]; int spread2 = Theme.frameSpreadLightDisabled [ Theme.style ]; int y2 = y; Color borderColor = null; if ( isActive ) { borderColor = Theme.frameBorderColor [ Theme.style ].getColor (); spread1 = Theme.frameSpreadDark [ Theme.style ]; spread2 = Theme.frameSpreadLight [ Theme.style ]; } else { borderColor = Theme.frameBorderDisabledColor [ Theme.style ].getColor (); } // always paint the semi-transparent parts // 1 // blend g.setColor ( ColorRoutines.getAlphaColor ( borderColor, 82 ) ); g.drawLine ( x + 3, y2, x + 3, y2 ); g.drawLine ( x + w - 4, y2, x + w - 4, y2 ); g.setColor ( ColorRoutines.getAlphaColor ( borderColor, 156 ) ); g.drawLine ( x + 4, y2, x + 4, y2 ); g.drawLine ( x + w - 5, y2, x + w - 5, y2 ); g.setColor ( ColorRoutines.getAlphaColor ( borderColor, 215 ) ); g.drawLine ( x + 5, y2, x + 5, y2 ); g.drawLine ( x + w - 6, y2, x + w - 6, y2 ); y2++ ; // 2 Color c2 = ColorRoutines.darken ( c, 4 * spread1 ); g.setColor ( c2 ); g.drawLine ( x + 3, y2, x + 5, y2 ); // left g.drawLine ( x + w - 6, y2, x + w - 4, y2 ); // right // blend g.setColor ( ColorRoutines.getAlphaColor ( c2, 139 ) ); g.drawLine ( x + 2, y2, x + 2, y2 ); g.drawLine ( x + w - 3, y2, x + w - 3, y2 ); g.setColor ( ColorRoutines.getAlphaColor ( c2, 23 ) ); g.drawLine ( x + 1, y2, x + 1, y2 ); g.drawLine ( x + w - 2, y2, x + w - 2, y2 ); y2++ ; // 3 g.setColor ( ColorRoutines.lighten ( c, 10 * spread2 ) ); g.drawLine ( x + 4, y2, x + 5, y2 ); // left g.drawLine ( x + w - 6, y2, x + w - 5, y2 ); // right // darker border g.setColor ( c ); g.drawLine ( x + 3, y2, x + 3, y2 ); g.drawLine ( x + w - 4, y2, x + w - 4, y2 ); c2 = ColorRoutines.darken ( c, 6 * spread1 ); g.setColor ( c2 ); g.drawLine ( x + 2, y2, x + 2, y2 ); g.drawLine ( x + w - 3, y2, x + w - 3, y2 ); // blend g.setColor ( ColorRoutines.getAlphaColor ( c2, 139 ) ); g.drawLine ( x + 1, y2, x + 1, y2 ); g.drawLine ( x + w - 2, y2, x + w - 2, y2 ); y2++ ; // 4 // darker border g.setColor ( c ); g.drawLine ( x + 2, y2, x + 2, y2 ); g.drawLine ( x + w - 3, y2, x + w - 3, y2 ); g.setColor ( ColorRoutines.darken ( c, 6 * spread1 ) ); g.drawLine ( x + 1, y2, x + 1, y2 ); g.drawLine ( x + w - 2, y2, x + w - 2, y2 ); // blend from lightest color g.setColor ( ColorRoutines.lighten ( c, 10 * spread2 ) ); g.drawLine ( x + 3, y2, x + 3, y2 ); g.drawLine ( x + w - 4, y2, x + w - 4, y2 ); g.setColor ( ColorRoutines.lighten ( c, 7 * spread2 ) ); g.drawLine ( x + 4, y2, x + 4, y2 ); g.drawLine ( x + w - 5, y2, x + w - 5, y2 ); g.setColor ( ColorRoutines.lighten ( c, 3 * spread2 ) ); g.drawLine ( x + 5, y2, x + 5, y2 ); g.drawLine ( x + w - 6, y2, x + w - 6, y2 ); g.setColor ( c ); g.drawLine ( x + 6, y2, x + 6, y2 ); g.drawLine ( x + w - 7, y2, x + w - 7, y2 ); y2++ ; // 5 g.setColor ( ColorRoutines.darken ( c, 2 * spread1 ) ); g.drawLine ( x + 5, y2, x + 6, y2 ); // left g.drawLine ( x + x + w - 7, y2, x + w - 6, y2 ); // right // darker border g.setColor ( ColorRoutines.darken ( c, 6 * spread1 ) ); g.drawLine ( x + 1, y2, x + 1, y2 ); g.drawLine ( x + w - 2, y2, x + w - 2, y2 ); // blend from lightest color g.setColor ( ColorRoutines.lighten ( c, 10 * spread2 ) ); g.drawLine ( x + 2, y2, x + 2, y2 ); g.drawLine ( x + w - 3, y2, x + w - 3, y2 ); g.setColor ( ColorRoutines.lighten ( c, 5 * spread2 ) ); g.drawLine ( x + 3, y2, x + 3, y2 ); g.drawLine ( x + w - 4, y2, x + w - 4, y2 ); g.setColor ( c ); g.drawLine ( x + 4, y2, x + 4, y2 ); g.drawLine ( x + w - 5, y2, x + w - 5, y2 ); y2++ ; // 6 // lighten little g.setColor ( ColorRoutines.darken ( c, 4 * spread1 ) ); g.drawLine ( x + 1, y2, x + 1, y2 ); g.drawLine ( x + w - 2, y2, x + w - 2, y2 ); // now either paint from cache or create cached image CaptionKey key = new CaptionKey ( isActive, titleHeight ); Object value = cache.get ( key ); if ( value != null ) { // image is cached - paint and return g.drawImage ( ( Image ) value, x + 6, y, x + w - 6, y + 5, 0, 0, 1, 5, window ); g.drawImage ( ( Image ) value, x + 1, y + 5, x + w - 1, y + titleHeight, 0, 5, 1, titleHeight, window ); // store button colors buttonUpperColor = ColorRoutines.darken ( c, 4 * spread1 ); buttonLowerColor = ColorRoutines.lighten ( c, 10 * spread2 ); return; } Image img = new BufferedImage ( 1, titleHeight, BufferedImage.TYPE_INT_ARGB ); Graphics imgGraphics = img.getGraphics (); // 1 imgGraphics.setColor ( borderColor ); imgGraphics.drawLine ( 0, 0, 1, 0 ); // 2 imgGraphics.setColor ( ColorRoutines.darken ( c, 4 * spread1 ) ); imgGraphics.drawLine ( 0, 1, 1, 1 ); // 3 imgGraphics.setColor ( ColorRoutines.lighten ( c, 10 * spread2 ) ); imgGraphics.drawLine ( 0, 2, 1, 2 ); // 4 imgGraphics.setColor ( c ); imgGraphics.drawLine ( 0, 3, 1, 3 ); // 5 imgGraphics.setColor ( ColorRoutines.darken ( c, 2 * spread1 ) ); imgGraphics.drawLine ( 0, 4, 1, 4 ); // 6 buttonUpperColor = ColorRoutines.darken ( c, 4 * spread1 ); imgGraphics.setColor ( buttonUpperColor ); imgGraphics.drawLine ( 0, 5, 1, 5 ); // 7 - 8 imgGraphics.setColor ( ColorRoutines.darken ( c, 4 * spread1 ) ); imgGraphics.drawLine ( 0, 6, 1, 6 ); imgGraphics.drawLine ( 0, 7, 1, 7 ); // 9 - 12 imgGraphics.setColor ( ColorRoutines.darken ( c, 3 * spread1 ) ); imgGraphics.drawLine ( 0, 8, 1, 8 ); imgGraphics.drawLine ( 0, 9, 1, 9 ); imgGraphics.drawLine ( 0, 10, 1, 10 ); imgGraphics.drawLine ( 0, 11, 1, 11 ); // 13 - 15 imgGraphics.setColor ( ColorRoutines.darken ( c, 2 * spread1 ) ); imgGraphics.drawLine ( 0, 12, 1, 12 ); imgGraphics.drawLine ( 0, 13, 1, 13 ); imgGraphics.drawLine ( 0, 14, 1, 14 ); // 16 - 17 imgGraphics.setColor ( ColorRoutines.darken ( c, spread1 ) ); imgGraphics.drawLine ( 0, 15, 1, 15 ); imgGraphics.drawLine ( 0, 16, 1, 16 ); // 18 - 19 imgGraphics.setColor ( c ); imgGraphics.drawLine ( 0, 17, 1, 17 ); imgGraphics.drawLine ( 0, 18, 1, 18 ); // 20... imgGraphics.setColor ( ColorRoutines.lighten ( c, 2 * spread2 ) ); imgGraphics.drawLine ( 0, 19, 1, 19 ); imgGraphics.setColor ( ColorRoutines.lighten ( c, 4 * spread2 ) ); imgGraphics.drawLine ( 0, 20, 1, 20 ); imgGraphics.setColor ( ColorRoutines.lighten ( c, 5 * spread2 ) ); imgGraphics.drawLine ( 0, 21, 1, 21 ); imgGraphics.setColor ( ColorRoutines.lighten ( c, 6 * spread2 ) ); imgGraphics.drawLine ( 0, 22, 1, 22 ); imgGraphics.setColor ( ColorRoutines.lighten ( c, 8 * spread2 ) ); imgGraphics.drawLine ( 0, 23, 1, 23 ); imgGraphics.setColor ( ColorRoutines.lighten ( c, 9 * spread2 ) ); imgGraphics.drawLine ( 0, 24, 1, 24 ); imgGraphics.setColor ( ColorRoutines.lighten ( c, 10 * spread2 ) ); imgGraphics.drawLine ( 0, 25, 1, 25 ); // 27 imgGraphics.setColor ( ColorRoutines.lighten ( c, 4 * spread2 ) ); imgGraphics.drawLine ( 0, 26, 1, 26 ); // 28 imgGraphics.setColor ( ColorRoutines.darken ( c, 2 * spread1 ) ); imgGraphics.drawLine ( 0, 27, 1, 27 ); // 29 if ( isActive ) { imgGraphics.setColor ( Theme.frameLightColor [ Theme.style ].getColor () ); } else { imgGraphics.setColor ( Theme.frameLightDisabledColor [ Theme.style ] .getColor () ); } imgGraphics.drawLine ( 0, 28, 1, 28 ); // dispose of image graphics imgGraphics.dispose (); // paint image g.drawImage ( img, x + 6, y, x + w - 6, y + 5, 0, 0, 1, 5, window ); g.drawImage ( img, x + 1, y + 5, x + w - 1, y + titleHeight, 0, 5, 1, titleHeight, window ); // add the image to the cache cache.put ( key, img ); } private void drawXpCaptionNoCache ( Graphics g, int x, int y, int w, int h, Color c ) { if ( titleHeight == Theme.frameInternalTitleHeight [ Theme.derivedStyle [ Theme.style ] ] ) { drawXpInternalCaptionNoCache ( g, x, y, w, h, c ); return; } int y2 = y; int spread1 = Theme.frameSpreadDarkDisabled [ Theme.style ]; int spread2 = Theme.frameSpreadLightDisabled [ Theme.style ]; Color borderColor = null; if ( isActive ) { borderColor = Theme.frameBorderColor [ Theme.style ].getColor (); spread1 = Theme.frameSpreadDark [ Theme.style ]; spread2 = Theme.frameSpreadLight [ Theme.style ]; } else { borderColor = Theme.frameBorderDisabledColor [ Theme.style ].getColor (); } // 1 g.setColor ( borderColor ); g.drawLine ( x + 6, y2, x + w - 7, y2 ); // blend g.setColor ( ColorRoutines.getAlphaColor ( borderColor, 82 ) ); g.drawLine ( x + 3, y2, x + 3, y2 ); g.drawLine ( x + w - 4, y2, x + w - 4, y2 ); g.setColor ( ColorRoutines.getAlphaColor ( borderColor, 156 ) ); g.drawLine ( x + 4, y2, x + 4, y2 ); g.drawLine ( x + w - 5, y2, x + w - 5, y2 ); g.setColor ( ColorRoutines.getAlphaColor ( borderColor, 215 ) ); g.drawLine ( x + 5, y2, x + 5, y2 ); g.drawLine ( x + w - 6, y2, x + w - 6, y2 ); y2++ ; // 2 Color c2 = ColorRoutines.darken ( c, 4 * spread1 ); g.setColor ( c2 ); g.drawLine ( x + 3, y2, x + w - 4, y2 ); // blend g.setColor ( ColorRoutines.getAlphaColor ( c2, 139 ) ); g.drawLine ( x + 2, y2, x + 2, y2 ); g.drawLine ( x + w - 3, y2, x + w - 3, y2 ); g.setColor ( ColorRoutines.getAlphaColor ( c2, 23 ) ); g.drawLine ( x + 1, y2, x + 1, y2 ); g.drawLine ( x + w - 2, y2, x + w - 2, y2 ); y2++ ; // 3 g.setColor ( ColorRoutines.lighten ( c, 10 * spread2 ) ); g.drawLine ( x + 4, y2, x + w - 5, y2 ); // darker border g.setColor ( c ); g.drawLine ( x + 3, y2, x + 3, y2 ); g.drawLine ( x + w - 4, y2, x + w - 4, y2 ); c2 = ColorRoutines.darken ( c, 6 * spread1 ); g.setColor ( c2 ); g.drawLine ( x + 2, y2, x + 2, y2 ); g.drawLine ( x + w - 3, y2, x + w - 3, y2 ); // blend g.setColor ( ColorRoutines.getAlphaColor ( c2, 139 ) ); g.drawLine ( x + 1, y2, x + 1, y2 ); g.drawLine ( x + w - 2, y2, x + w - 2, y2 ); y2++ ; // 4 g.setColor ( c ); g.drawLine ( x + 7, y2, x + w - 8, y2 ); // darker border g.setColor ( c ); g.drawLine ( x + 2, y2, x + 2, y2 ); g.drawLine ( x + w - 3, y2, x + w - 3, y2 ); g.setColor ( ColorRoutines.darken ( c, 6 * spread1 ) ); g.drawLine ( x + 1, y2, x + 1, y2 ); g.drawLine ( x + w - 2, y2, x + w - 2, y2 ); // blend from lightest color g.setColor ( ColorRoutines.lighten ( c, 10 * spread2 ) ); g.drawLine ( x + 3, y2, x + 3, y2 ); g.drawLine ( x + w - 4, y2, x + w - 4, y2 ); g.setColor ( ColorRoutines.lighten ( c, 7 * spread2 ) ); g.drawLine ( x + 4, y2, x + 4, y2 ); g.drawLine ( x + w - 5, y2, x + w - 5, y2 ); g.setColor ( ColorRoutines.lighten ( c, 3 * spread2 ) ); g.drawLine ( x + 5, y2, x + 5, y2 ); g.drawLine ( x + w - 6, y2, x + w - 6, y2 ); g.setColor ( c ); g.drawLine ( x + 6, y2, x + 6, y2 ); g.drawLine ( x + w - 7, y2, x + w - 7, y2 ); y2++ ; // 5 g.setColor ( ColorRoutines.darken ( c, 2 * spread1 ) ); g.drawLine ( x + 5, y2, x + w - 6, y2 ); // darker border g.setColor ( ColorRoutines.darken ( c, 6 * spread1 ) ); g.drawLine ( x + 1, y2, x + 1, y2 ); g.drawLine ( x + w - 2, y2, x + w - 2, y2 ); // blend from lightest color g.setColor ( ColorRoutines.lighten ( c, 10 * spread2 ) ); g.drawLine ( x + 2, y2, x + 2, y2 ); g.drawLine ( x + w - 3, y2, x + w - 3, y2 ); g.setColor ( ColorRoutines.lighten ( c, 5 * spread2 ) ); g.drawLine ( x + 3, y2, x + 3, y2 ); g.drawLine ( x + w - 4, y2, x + w - 4, y2 ); g.setColor ( c ); g.drawLine ( x + 4, y2, x + 4, y2 ); g.drawLine ( x + w - 5, y2, x + w - 5, y2 ); y2++ ; // 6 buttonUpperColor = ColorRoutines.darken ( c, 4 * spread1 ); g.setColor ( buttonUpperColor ); g.drawLine ( x + 2, y2, x + w - 3, y2 ); // lighten little g.setColor ( ColorRoutines.darken ( c, 4 * spread1 ) ); g.drawLine ( x + 1, y2, x + 1, y2 ); g.drawLine ( x + w - 2, y2, x + w - 2, y2 ); y2++ ; // 7 - 8 g.setColor ( ColorRoutines.darken ( c, 4 * spread1 ) ); g.fillRect ( x + 1, y2, w - 2, 2 ); y2 += 2; // 9 - 12 g.setColor ( ColorRoutines.darken ( c, 3 * spread1 ) ); g.fillRect ( x + 1, y2, w - 2, 4 ); y2 += 4; // 13 - 15 g.setColor ( ColorRoutines.darken ( c, 2 * spread1 ) ); g.fillRect ( x + 1, y2, w - 2, 3 ); y2 += 3; // 16 - 17 g.setColor ( ColorRoutines.darken ( c, 1 * spread1 ) ); g.fillRect ( x + 1, y2, w - 2, 2 ); y2 += 2; // 18 - 19 g.setColor ( c ); g.fillRect ( x + 1, y2, w - 2, 2 ); y2 += 2; // 20... g.setColor ( ColorRoutines.lighten ( c, 2 * spread2 ) ); g.drawLine ( x + 1, y2, x + w - 2, y2 ); y2++ ; g.setColor ( ColorRoutines.lighten ( c, 4 * spread2 ) ); g.drawLine ( x + 1, y2, x + w - 2, y2 ); y2++ ; g.setColor ( ColorRoutines.lighten ( c, 5 * spread2 ) ); g.drawLine ( x + 1, y2, x + w - 2, y2 ); y2++ ; g.setColor ( ColorRoutines.lighten ( c, 6 * spread2 ) ); g.drawLine ( x + 1, y2, x + w - 2, y2 ); y2++ ; g.setColor ( ColorRoutines.lighten ( c, 8 * spread2 ) ); g.drawLine ( x + 1, y2, x + w - 2, y2 ); y2++ ; g.setColor ( ColorRoutines.lighten ( c, 9 * spread2 ) ); g.drawLine ( x + 1, y2, x + w - 2, y2 ); y2++ ; buttonLowerColor = ColorRoutines.lighten ( c, 10 * spread2 ); g.setColor ( buttonLowerColor ); g.drawLine ( x + 1, y2, x + w - 2, y2 ); y2++ ; // 27 g.setColor ( ColorRoutines.lighten ( c, 4 * spread2 ) ); g.drawLine ( x + 1, y2, x + w - 2, y2 ); y2++ ; // 28 g.setColor ( ColorRoutines.darken ( c, 2 * spread1 ) ); g.drawLine ( x + 1, y2, x + w - 2, y2 ); y2++ ; // 29 if ( isActive ) { g.setColor ( Theme.frameLightColor [ Theme.style ].getColor () ); } else { g.setColor ( Theme.frameLightDisabledColor [ Theme.style ].getColor () ); } g.drawLine ( x + 1, y2, x + w - 2, y2 ); } private void drawXpInternalCaption ( Graphics g, int x, int y, int w, int h, Color c ) { int spread1 = Theme.frameSpreadDarkDisabled [ Theme.style ]; int spread2 = Theme.frameSpreadLightDisabled [ Theme.style ]; int y2 = y; Color borderColor = null; if ( isActive ) { borderColor = Theme.frameBorderColor [ Theme.style ].getColor (); spread1 = Theme.frameSpreadDark [ Theme.style ]; spread2 = Theme.frameSpreadLight [ Theme.style ]; } else { borderColor = Theme.frameBorderDisabledColor [ Theme.style ].getColor (); } // always paint the semi-transparent parts // 1 // blend g.setColor ( ColorRoutines.getAlphaColor ( borderColor, 82 ) ); g.drawLine ( x + 3, y2, x + 3, y2 ); g.drawLine ( x + w - 4, y2, x + w - 4, y2 ); g.setColor ( ColorRoutines.getAlphaColor ( borderColor, 156 ) ); g.drawLine ( x + 4, y2, x + 4, y2 ); g.drawLine ( x + w - 5, y2, x + w - 5, y2 ); g.setColor ( ColorRoutines.getAlphaColor ( borderColor, 215 ) ); g.drawLine ( x + 5, y2, x + 5, y2 ); g.drawLine ( x + w - 6, y2, x + w - 6, y2 ); y2++ ; // 2 Color c2 = ColorRoutines.darken ( c, 4 * spread1 ); g.setColor ( c2 ); g.drawLine ( x + 3, y2, x + 5, y2 ); // left g.drawLine ( x + w - 6, y2, x + w - 4, y2 ); // right // blend g.setColor ( ColorRoutines.getAlphaColor ( c2, 139 ) ); g.drawLine ( x + 2, y2, x + 2, y2 ); g.drawLine ( x + w - 3, y2, x + w - 3, y2 ); g.setColor ( ColorRoutines.getAlphaColor ( c2, 23 ) ); g.drawLine ( x + 1, y2, x + 1, y2 ); g.drawLine ( x + w - 2, y2, x + w - 2, y2 ); y2++ ; // 3 g.setColor ( ColorRoutines.lighten ( c, 10 * spread2 ) ); g.drawLine ( x + 4, y2, x + 5, y2 ); // left g.drawLine ( x + w - 6, y2, x + w - 5, y2 ); // right // darker border g.setColor ( c ); g.drawLine ( x + 3, y2, x + 3, y2 ); g.drawLine ( x + w - 4, y2, x + w - 4, y2 ); c2 = ColorRoutines.darken ( c, 6 * spread1 ); g.setColor ( c2 ); g.drawLine ( x + 2, y2, x + 2, y2 ); g.drawLine ( x + w - 3, y2, x + w - 3, y2 ); // blend g.setColor ( ColorRoutines.getAlphaColor ( c2, 139 ) ); g.drawLine ( x + 1, y2, x + 1, y2 ); g.drawLine ( x + w - 2, y2, x + w - 2, y2 ); y2++ ; // 4 // darker border g.setColor ( c ); g.drawLine ( x + 2, y2, x + 2, y2 ); g.drawLine ( x + w - 3, y2, x + w - 3, y2 ); g.setColor ( ColorRoutines.darken ( c, 6 * spread1 ) ); g.drawLine ( x + 1, y2, x + 1, y2 ); g.drawLine ( x + w - 2, y2, x + w - 2, y2 ); // blend from lightest color g.setColor ( ColorRoutines.lighten ( c, 10 * spread2 ) ); g.drawLine ( x + 3, y2, x + 3, y2 ); g.drawLine ( x + w - 4, y2, x + w - 4, y2 ); g.setColor ( ColorRoutines.lighten ( c, 7 * spread2 ) ); g.drawLine ( x + 4, y2, x + 4, y2 ); g.drawLine ( x + w - 5, y2, x + w - 5, y2 ); g.setColor ( ColorRoutines.lighten ( c, 3 * spread2 ) ); g.drawLine ( x + 5, y2, x + 5, y2 ); g.drawLine ( x + w - 6, y2, x + w - 6, y2 ); g.setColor ( c ); g.drawLine ( x + 6, y2, x + 6, y2 ); g.drawLine ( x + w - 7, y2, x + w - 7, y2 ); y2++ ; // 5 g.setColor ( ColorRoutines.darken ( c, 2 * spread1 ) ); g.drawLine ( x + 5, y2, x + 6, y2 ); // left g.drawLine ( x + x + w - 7, y2, x + w - 6, y2 ); // right // darker border g.setColor ( ColorRoutines.darken ( c, 6 * spread1 ) ); g.drawLine ( x + 1, y2, x + 1, y2 ); g.drawLine ( x + w - 2, y2, x + w - 2, y2 ); // blend from lightest color g.setColor ( ColorRoutines.lighten ( c, 10 * spread2 ) ); g.drawLine ( x + 2, y2, x + 2, y2 ); g.drawLine ( x + w - 3, y2, x + w - 3, y2 ); g.setColor ( ColorRoutines.lighten ( c, 5 * spread2 ) ); g.drawLine ( x + 3, y2, x + 3, y2 ); g.drawLine ( x + w - 4, y2, x + w - 4, y2 ); g.setColor ( c ); g.drawLine ( x + 4, y2, x + 4, y2 ); g.drawLine ( x + w - 5, y2, x + w - 5, y2 ); y2++ ; // 6 // lighten little g.setColor ( ColorRoutines.darken ( c, 4 * spread1 ) ); g.drawLine ( x + 1, y2, x + 1, y2 ); g.drawLine ( x + w - 2, y2, x + w - 2, y2 ); // now either paint from cache or create cached image CaptionKey key = new CaptionKey ( isActive, titleHeight ); Object value = cache.get ( key ); if ( value != null ) { // image is cached - paint and return g.drawImage ( ( Image ) value, x + 6, y, x + w - 6, y + 5, 0, 0, 1, 5, window ); g.drawImage ( ( Image ) value, x + 1, y + 5, x + w - 1, y + titleHeight, 0, 5, 1, titleHeight, window ); // store button colors buttonUpperColor = ColorRoutines.darken ( c, 4 * spread1 ); buttonLowerColor = ColorRoutines.lighten ( c, 10 * spread2 ); return; } Image img = new BufferedImage ( 1, titleHeight, BufferedImage.TYPE_INT_ARGB ); Graphics imgGraphics = img.getGraphics (); // 1 imgGraphics.setColor ( borderColor ); imgGraphics.drawLine ( 0, 0, 1, 0 ); // 2 imgGraphics.setColor ( ColorRoutines.darken ( c, 4 * spread1 ) ); imgGraphics.drawLine ( 0, 1, 1, 1 ); // 3 imgGraphics.setColor ( ColorRoutines.lighten ( c, 10 * spread2 ) ); imgGraphics.drawLine ( 0, 2, 1, 2 ); // 4 imgGraphics.setColor ( c ); imgGraphics.drawLine ( 0, 3, 1, 3 ); // 5 imgGraphics.setColor ( ColorRoutines.darken ( c, 2 * spread1 ) ); imgGraphics.drawLine ( 0, 4, 1, 4 ); // 6 imgGraphics.setColor ( ColorRoutines.darken ( c, 4 * spread1 ) ); imgGraphics.drawLine ( 0, 5, 1, 5 ); // 7 imgGraphics.setColor ( ColorRoutines.darken ( c, 4 * spread1 ) ); imgGraphics.drawLine ( 0, 6, 1, 6 ); // 8 - 10 imgGraphics.setColor ( ColorRoutines.darken ( c, 3 * spread1 ) ); imgGraphics.drawLine ( 0, 7, 1, 7 ); imgGraphics.drawLine ( 0, 8, 1, 8 ); imgGraphics.drawLine ( 0, 9, 1, 9 ); // 11 - 12 imgGraphics.setColor ( ColorRoutines.darken ( c, 2 * spread1 ) ); imgGraphics.drawLine ( 0, 10, 1, 10 ); imgGraphics.drawLine ( 0, 11, 1, 11 ); // 13 imgGraphics.setColor ( ColorRoutines.darken ( c, spread1 ) ); imgGraphics.drawLine ( 0, 12, 1, 12 ); // 14 - 15 imgGraphics.setColor ( c ); imgGraphics.drawLine ( 0, 13, 1, 13 ); imgGraphics.drawLine ( 0, 14, 1, 14 ); // 16... imgGraphics.setColor ( ColorRoutines.lighten ( c, 2 * spread2 ) ); imgGraphics.drawLine ( 0, 15, 1, 15 ); imgGraphics.setColor ( ColorRoutines.lighten ( c, 4 * spread2 ) ); imgGraphics.drawLine ( 0, 16, 1, 16 ); imgGraphics.setColor ( ColorRoutines.lighten ( c, 5 * spread2 ) ); imgGraphics.drawLine ( 0, 17, 1, 17 ); imgGraphics.setColor ( ColorRoutines.lighten ( c, 6 * spread2 ) ); imgGraphics.drawLine ( 0, 18, 1, 18 ); imgGraphics.setColor ( ColorRoutines.lighten ( c, 8 * spread2 ) ); imgGraphics.drawLine ( 0, 19, 1, 19 ); imgGraphics.setColor ( ColorRoutines.lighten ( c, 9 * spread2 ) ); imgGraphics.drawLine ( 0, 20, 1, 20 ); imgGraphics.setColor ( ColorRoutines.lighten ( c, 10 * spread2 ) ); imgGraphics.drawLine ( 0, 21, 1, 21 ); // 23 imgGraphics.setColor ( ColorRoutines.lighten ( c, 4 * spread2 ) ); imgGraphics.drawLine ( 0, 22, 1, 22 ); // 24 imgGraphics.setColor ( ColorRoutines.darken ( c, 2 * spread1 ) ); imgGraphics.drawLine ( 0, 23, 1, 23 ); // 25 if ( isActive ) { imgGraphics.setColor ( Theme.frameLightColor [ Theme.style ].getColor () ); } else { imgGraphics.setColor ( Theme.frameLightDisabledColor [ Theme.style ] .getColor () ); } imgGraphics.drawLine ( 0, 24, 1, 24 ); // dispose of image graphics imgGraphics.dispose (); // paint image g.drawImage ( img, x + 6, y, x + w - 6, y + 5, 0, 0, 1, 5, window ); g.drawImage ( img, x + 1, y + 5, x + w - 1, y + titleHeight, 0, 5, 1, titleHeight, window ); // add the image to the cache cache.put ( key, img ); } private void drawXpInternalCaptionNoCache ( Graphics g, int x, int y, int w, int h, Color c ) { int y2 = y; int spread1 = Theme.frameSpreadDarkDisabled [ Theme.style ]; int spread2 = Theme.frameSpreadLightDisabled [ Theme.style ]; Color borderColor = null; if ( isActive ) { borderColor = Theme.frameBorderColor [ Theme.style ].getColor (); spread1 = Theme.frameSpreadDark [ Theme.style ]; spread2 = Theme.frameSpreadLight [ Theme.style ]; } else { borderColor = Theme.frameBorderDisabledColor [ Theme.style ].getColor (); } // 1 g.setColor ( borderColor ); g.drawLine ( x + 6, y2, x + w - 7, y2 ); // blend g.setColor ( ColorRoutines.getAlphaColor ( borderColor, 82 ) ); g.drawLine ( x + 3, y2, x + 3, y2 ); g.drawLine ( x + w - 4, y2, x + w - 4, y2 ); g.setColor ( ColorRoutines.getAlphaColor ( borderColor, 156 ) ); g.drawLine ( x + 4, y2, x + 4, y2 ); g.drawLine ( x + w - 5, y2, x + w - 5, y2 ); g.setColor ( ColorRoutines.getAlphaColor ( borderColor, 215 ) ); g.drawLine ( x + 5, y2, x + 5, y2 ); g.drawLine ( x + w - 6, y2, x + w - 6, y2 ); y2++ ; // 2 Color c2 = ColorRoutines.darken ( c, 4 * spread1 ); g.setColor ( c2 ); g.drawLine ( x + 3, y2, x + w - 4, y2 ); // blend g.setColor ( ColorRoutines.getAlphaColor ( c2, 139 ) ); g.drawLine ( x + 2, y2, x + 2, y2 ); g.drawLine ( x + w - 3, y2, x + w - 3, y2 ); g.setColor ( ColorRoutines.getAlphaColor ( c2, 23 ) ); g.drawLine ( x + 1, y2, x + 1, y2 ); g.drawLine ( x + w - 2, y2, x + w - 2, y2 ); y2++ ; // 3 g.setColor ( ColorRoutines.lighten ( c, 10 * spread2 ) ); g.drawLine ( x + 4, y2, x + w - 5, y2 ); // darker border g.setColor ( c ); g.drawLine ( x + 3, y2, x + 3, y2 ); g.drawLine ( x + w - 4, y2, x + w - 4, y2 ); c2 = ColorRoutines.darken ( c, 6 * spread1 ); g.setColor ( c2 ); g.drawLine ( x + 2, y2, x + 2, y2 ); g.drawLine ( x + w - 3, y2, x + w - 3, y2 ); // blend g.setColor ( ColorRoutines.getAlphaColor ( c2, 139 ) ); g.drawLine ( x + 1, y2, x + 1, y2 ); g.drawLine ( x + w - 2, y2, x + w - 2, y2 ); y2++ ; // 4 g.setColor ( c ); g.drawLine ( x + 7, y2, x + w - 8, y2 ); // darker border g.setColor ( c ); g.drawLine ( x + 2, y2, x + 2, y2 ); g.drawLine ( x + w - 3, y2, x + w - 3, y2 ); g.setColor ( ColorRoutines.darken ( c, 6 * spread1 ) ); g.drawLine ( x + 1, y2, x + 1, y2 ); g.drawLine ( x + w - 2, y2, x + w - 2, y2 ); // blend from lightest color g.setColor ( ColorRoutines.lighten ( c, 10 * spread2 ) ); g.drawLine ( x + 3, y2, x + 3, y2 ); g.drawLine ( x + w - 4, y2, x + w - 4, y2 ); g.setColor ( ColorRoutines.lighten ( c, 7 * spread2 ) ); g.drawLine ( x + 4, y2, x + 4, y2 ); g.drawLine ( x + w - 5, y2, x + w - 5, y2 ); g.setColor ( ColorRoutines.lighten ( c, 3 * spread2 ) ); g.drawLine ( x + 5, y2, x + 5, y2 ); g.drawLine ( x + w - 6, y2, x + w - 6, y2 ); g.setColor ( c ); g.drawLine ( x + 6, y2, x + 6, y2 ); g.drawLine ( x + w - 7, y2, x + w - 7, y2 ); y2++ ; // 5 g.setColor ( ColorRoutines.darken ( c, 2 * spread1 ) ); g.drawLine ( x + 5, y2, x + w - 6, y2 ); // darker border g.setColor ( ColorRoutines.darken ( c, 6 * spread1 ) ); g.drawLine ( x + 1, y2, x + 1, y2 ); g.drawLine ( x + w - 2, y2, x + w - 2, y2 ); // blend from lightest color g.setColor ( ColorRoutines.lighten ( c, 10 * spread2 ) ); g.drawLine ( x + 2, y2, x + 2, y2 ); g.drawLine ( x + w - 3, y2, x + w - 3, y2 ); g.setColor ( ColorRoutines.lighten ( c, 5 * spread2 ) ); g.drawLine ( x + 3, y2, x + 3, y2 ); g.drawLine ( x + w - 4, y2, x + w - 4, y2 ); g.setColor ( c ); g.drawLine ( x + 4, y2, x + 4, y2 ); g.drawLine ( x + w - 5, y2, x + w - 5, y2 ); y2++ ; // 6 g.setColor ( ColorRoutines.darken ( c, 4 * spread1 ) ); g.drawLine ( x + 2, y2, x + w - 3, y2 ); // lighten little g.setColor ( ColorRoutines.darken ( c, 4 * spread1 ) ); g.drawLine ( x + 1, y2, x + 1, y2 ); g.drawLine ( x + w - 2, y2, x + w - 2, y2 ); y2++ ; // 7 g.setColor ( ColorRoutines.darken ( c, 4 * spread1 ) ); g.fillRect ( x + 1, y2, w - 2, 1 ); y2 += 1; // 8 - 10 g.setColor ( ColorRoutines.darken ( c, 3 * spread1 ) ); g.fillRect ( x + 1, y2, w - 2, 3 ); y2 += 3; // 11 - 12 g.setColor ( ColorRoutines.darken ( c, 2 * spread1 ) ); g.fillRect ( x + 1, y2, w - 2, 2 ); y2 += 2; // 13 g.setColor ( ColorRoutines.darken ( c, 1 * spread1 ) ); g.fillRect ( x + 1, y2, w - 2, 1 ); y2 += 1; // 14 - 15 g.setColor ( c ); g.fillRect ( x + 1, y2, w - 2, 2 ); y2 += 2; // 16... g.setColor ( ColorRoutines.lighten ( c, 2 * spread2 ) ); g.drawLine ( x + 1, y2, x + w - 2, y2 ); y2++ ; g.setColor ( ColorRoutines.lighten ( c, 4 * spread2 ) ); g.drawLine ( x + 1, y2, x + w - 2, y2 ); y2++ ; g.setColor ( ColorRoutines.lighten ( c, 5 * spread2 ) ); g.drawLine ( x + 1, y2, x + w - 2, y2 ); y2++ ; g.setColor ( ColorRoutines.lighten ( c, 6 * spread2 ) ); g.drawLine ( x + 1, y2, x + w - 2, y2 ); y2++ ; g.setColor ( ColorRoutines.lighten ( c, 8 * spread2 ) ); g.drawLine ( x + 1, y2, x + w - 2, y2 ); y2++ ; g.setColor ( ColorRoutines.lighten ( c, 9 * spread2 ) ); g.drawLine ( x + 1, y2, x + w - 2, y2 ); y2++ ; g.setColor ( ColorRoutines.lighten ( c, 10 * spread2 ) ); g.drawLine ( x + 1, y2, x + w - 2, y2 ); y2++ ; // 23 g.setColor ( ColorRoutines.lighten ( c, 4 * spread2 ) ); g.drawLine ( x + 1, y2, x + w - 2, y2 ); y2++ ; // 24 g.setColor ( ColorRoutines.darken ( c, 2 * spread1 ) ); g.drawLine ( x + 1, y2, x + w - 2, y2 ); y2++ ; // 25 if ( isActive ) { g.setColor ( Theme.frameLightColor [ Theme.style ].getColor () ); } else { g.setColor ( Theme.frameLightDisabledColor [ Theme.style ].getColor () ); } g.drawLine ( x + 1, y2, x + w - 2, y2 ); } /** * @see javax.swing.border.Border#getBorderInsets(Component) */ public Insets getBorderInsets ( Component c ) { Window w = SwingUtilities.getWindowAncestor ( c ); if ( w != null && ( w instanceof Frame ) ) { Frame f = ( Frame ) w; // if the frame is maximized, the border should not be visible if ( f.getExtendedState () == ( f.getExtendedState () | Frame.MAXIMIZED_BOTH ) ) { return new Insets ( 0, 0, 0, 0 ); } } return new Insets ( 0, Theme.frameBorderWidth [ Theme.derivedStyle [ Theme.style ] ], Theme.frameBorderWidth [ Theme.derivedStyle [ Theme.style ] ], Theme.frameBorderWidth [ Theme.derivedStyle [ Theme.style ] ] ); } /** * CaptionKey is used as key in the cache HashMap. Overrides equals() and * hashCode(). */ static class CaptionKey { private boolean isActive; private int titleHeight; CaptionKey ( boolean isActive, int titleHeight ) { this.isActive = isActive; this.titleHeight = titleHeight; } public boolean equals ( Object o ) { if ( o == null ) return false; if ( ! ( o instanceof CaptionKey ) ) return false; CaptionKey other = ( CaptionKey ) o; return isActive == other.isActive && titleHeight == other.titleHeight; } public int hashCode () { return ( isActive ? 1 : 2 ) * titleHeight; } } }