/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* 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.*;
import java.awt.image.BufferedImage;
import java.util.*;
import javax.swing.*;
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;
/**
* TinyInternalFrameBorder
*
* @version 1.0
* @author Hans Bickel
*
*/
public class TinyInternalFrameBorder extends AbstractBorder implements UIResource {
// cache for already painted captions
private static HashMap cache = new HashMap();
public static Color frameUpperColor, frameLowerColor;
public static Color disabledUpperColor, disabledLowerColor;
private JInternalFrame frame;
private boolean isPalette;
private int titleHeight;
/** indicates whether the internal frame is active */
private boolean isActive;
/**
* @see javax.swing.border.Border#paintBorder(Component, Graphics, int, int, int, int)
*/
public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) {
frame = (JInternalFrame)c;
if(Theme.frameIsTransparent[Theme.style]) {
frame.setOpaque(false);
}
isActive = frame.isSelected();
isPalette = (frame.getClientProperty("isPalette") == Boolean.TRUE);
if(isPalette) {
titleHeight = Theme.framePaletteTitleHeight[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(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);
// outer blend over 3 px
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) {
// Note: this method is equal to TinyFrameBorder.drawXpInternalCaption()
if(isPalette) {
drawXpPaletteCaption(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,
frame);
g.drawImage((Image)value,
x + 1, y + 5, x + w - 1, y + titleHeight,
0, 5, 1, titleHeight,
frame);
// store button colors
if(isActive) {
frameUpperColor = ColorRoutines.darken(c, 4 * spread1);
frameLowerColor = ColorRoutines.lighten(c, 10 * spread2);
}
else {
disabledUpperColor = ColorRoutines.darken(c, 4 * spread1);
disabledLowerColor = 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,
frame);
g.drawImage(img,
x + 1, y + 5, x + w - 1, y + titleHeight,
0, 5, 1, titleHeight,
frame);
// 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(isPalette) {
drawXpPaletteCaptionNoCache(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
if(isActive) {
frameUpperColor = ColorRoutines.darken(c, 4 * spread1);
g.setColor(frameUpperColor);
}
else {
disabledUpperColor = ColorRoutines.darken(c, 4 * spread1);
g.setColor(disabledUpperColor);
}
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 ++;
if(isActive) {
frameLowerColor = ColorRoutines.lighten(c, 10 * spread2);
g.setColor(frameLowerColor);
}
else {
disabledLowerColor = ColorRoutines.lighten(c, 10 * spread2);
g.setColor(disabledLowerColor);
}
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);
}
private void drawXpPaletteCaption(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();
}
// 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,
frame);
g.drawImage((Image)value,
x + 1, y + 5, x + w - 1, y + titleHeight,
0, 5, 1, titleHeight,
frame);
// store button colors
if(isActive) {
frameUpperColor = ColorRoutines.darken(c, 4 * spread1);
frameLowerColor = ColorRoutines.lighten(c, 10 * spread2);
}
else {
disabledUpperColor = ColorRoutines.darken(c, 4 * spread1);
disabledLowerColor = 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.drawLine(0, 6, 1, 6);
// 8
imgGraphics.setColor(ColorRoutines.darken(c, 3 * spread1));
imgGraphics.drawLine(0, 7, 1, 7);
// 9
imgGraphics.setColor(ColorRoutines.darken(c, 2 * spread1));
imgGraphics.drawLine(0, 8, 1, 8);
// 10
imgGraphics.setColor(ColorRoutines.darken(c, spread1));
imgGraphics.drawLine(0, 9, 1, 9);
// 11
imgGraphics.setColor(c);
imgGraphics.drawLine(0, 10, 1, 10);
// 12...
imgGraphics.setColor(ColorRoutines.lighten(c, 2 * spread2));
imgGraphics.drawLine(0, 11, 1, 11);
imgGraphics.setColor(ColorRoutines.lighten(c, 4 * spread2));
imgGraphics.drawLine(0, 12, 1, 12);
imgGraphics.setColor(ColorRoutines.lighten(c, 5 * spread2));
imgGraphics.drawLine(0, 13, 1, 13);
imgGraphics.setColor(ColorRoutines.lighten(c, 6 * spread2));
imgGraphics.drawLine(0, 14, 1, 14);
imgGraphics.setColor(ColorRoutines.lighten(c, 8 * spread2));
imgGraphics.drawLine(0, 15, 1, 15);
imgGraphics.setColor(ColorRoutines.lighten(c, 9 * spread2));
imgGraphics.drawLine(0, 16, 1, 16);
imgGraphics.setColor(ColorRoutines.lighten(c, 10 * spread2));
imgGraphics.drawLine(0, 17, 1, 17);
// 19
imgGraphics.setColor(ColorRoutines.lighten(c, 4 * spread2));
imgGraphics.drawLine(0, 18, 1, 18);
// 20
imgGraphics.setColor(ColorRoutines.darken(c, 2 * spread1));
imgGraphics.drawLine(0, 19, 1, 19);
// 21
if(isActive) {
imgGraphics.setColor(Theme.frameLightColor[Theme.style].getColor());
}
else {
imgGraphics.setColor(Theme.frameLightDisabledColor[Theme.style].getColor());
}
imgGraphics.drawLine(0, 20, 1, 20);
// dispose of image graphics
imgGraphics.dispose();
// paint image
g.drawImage(img,
x + 6, y, x + w - 6, y + 5,
0, 0, 1, 5,
frame);
g.drawImage(img,
x + 1, y + 5, x + w - 1, y + titleHeight,
0, 5, 1, titleHeight,
frame);
// add the image to the cache
cache.put(key, img);
}
private void drawXpPaletteCaptionNoCache(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
if(isActive) {
frameUpperColor = ColorRoutines.darken(c, 4 * spread1);
g.setColor(frameUpperColor);
}
else {
disabledUpperColor = ColorRoutines.darken(c, 4 * spread1);
g.setColor(disabledUpperColor);
}
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
g.setColor(ColorRoutines.darken(c, 3 * spread1));
g.fillRect(x + 1, y2, w - 2, 1);
y2 += 1;
// 9
g.setColor(ColorRoutines.darken(c, 2 * spread1));
g.fillRect(x + 1, y2, w - 2, 1);
y2 += 1;
// 10
g.setColor(ColorRoutines.darken(c, 1 * spread1));
g.fillRect(x + 1, y2, w - 2, 1);
y2 += 1;
// 11
g.setColor(c);
g.fillRect(x + 1, y2, w - 2, 1);
y2 += 1;
// 12...
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 ++;
if(isActive) {
frameLowerColor = ColorRoutines.lighten(c, 10 * spread2);
g.setColor(frameLowerColor);
}
else {
disabledLowerColor = ColorRoutines.lighten(c, 10 * spread2);
g.setColor(disabledLowerColor);
}
g.drawLine(x + 1, y2, x + w - 2, y2);
y2 ++;
// 19
g.setColor(ColorRoutines.lighten(c, 4 * spread2));
g.drawLine(x + 1, y2, x + w - 2, y2);
y2 ++;
// 20
g.setColor(ColorRoutines.darken(c, 2 * spread1));
g.drawLine(x + 1, y2, x + w - 2, y2);
y2 ++;
// 21
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) {
JInternalFrame frame = (JInternalFrame)c;
// if the frame is maximized, the border should not be visible
if(frame.isMaximum()) {
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]]);
}
/**
* inform the border whether the internal frame is active or not
* @param isActive
*/
public void setActive(boolean isActive) {
this.isActive = isActive;
}
/**
* 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;
}
}
}