/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Liquid Look and Feel *
* *
* Author, Miroslav Lazarevic *
* *
* For licensing information and credits, please refer to the *
* comment in file com.birosoft.liquid.LiquidLookAndFeel *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
package com.birosoft.liquid;
import java.awt.*;
import javax.swing.*;
import javax.swing.border.AbstractBorder;
import javax.swing.plaf.UIResource;
/**
* LiquidFrameBorder
*
* @version 0.1
* @author Miroslav Lazarević
*/
public class LiquidFrameBorder extends AbstractBorder implements UIResource {
/**
*
*/
private static final long serialVersionUID = 8570979060763637626L;
private static LiquidFrameBorder onlyInstance;
// private static Robot robot;
// private static boolean robotsSupported = true;
private boolean prevState = false;
private Window window;
/** indicates whether the internal frame is active */
private boolean isActive = true;
public static LiquidFrameBorder getInstance() {
if (onlyInstance == null) {
onlyInstance = new LiquidFrameBorder();
// 20060202 MEV - What the hell is this for?! It isn't even USED, yet
// causes Permission exceptions when ran from Webstart!
/*
if ((robot == null) && robotsSupported) {
try {
robot = new Robot();
} catch (AWTException e) {
robotsSupported = false;
}
}
*/
}
return onlyInstance;
}
private void isWindowRealActive(Window window) {
isActive = window.isActive();
if (isActive) {
prevState = true;
}
if (!prevState && !isActive) {
isActive = true;
}
}
/**
* Uses the skins to paint the border
* @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) {
window = SwingUtilities.getWindowAncestor(c);
if (window instanceof JDialog) {
JDialog d = (JDialog) window;
if (d.isModal()) {
isActive = true;
} else {
isWindowRealActive(window);
}
} else {
isWindowRealActive(window);
}
int frameTitleHeight = UIManager.getInt(
"InternalFrame.frameTitleHeight");
drawLeftTop(g, isActive, 4, frameTitleHeight);
g.translate(0, frameTitleHeight);
drawLeft(g, isActive, 4, h - frameTitleHeight - 4);
g.translate(0, -frameTitleHeight);
g.translate(0, h - 4);
//getSkinBottom().draw(g, index, w, 4);
drawBottom(g, isActive, w, 4);
g.translate(0, -(h - 4));
g.translate(w - 4, 0);
drawRightTop(g, isActive, 4, frameTitleHeight);
g.translate(0, frameTitleHeight);
drawRight(g, isActive, 4, h - frameTitleHeight - 4);
g.translate(0, -frameTitleHeight);
g.translate(-(w - 4), 0);
}
private void drawLeftTop(Graphics g, boolean isSelected, int w, int h) {
if (LiquidLookAndFeel.winDecoPanther) {
Color c = new Color(198, 198, 198);
g.setColor(c);
g.fillRect(0, 0, w, h);
return;
}
Color c = isSelected ? new Color(62, 145, 235) : new Color(175, 214, 255);
g.setColor(c);
g.fillRect(0, 0, w, h);
c = isSelected ? new Color(94, 172, 255) : new Color(226, 240, 255);
g.setColor(c);
g.drawLine(0, 0, w, 0);
g.drawLine(0, 0, 0, h);
c = isSelected ? new Color(60, 141, 228) : new Color(170, 207, 247);
g.setColor(c);
g.drawLine(1, 1, w, 1);
for (int i = 4; i < h; i += 4) {
c = isSelected ? new Color(59, 138, 223) : new Color(166, 203, 242);
g.setColor(c);
g.drawLine(1, i, w, i);
c = isSelected ? new Color(60, 141, 228) : new Color(170, 207, 247);
g.setColor(c);
g.drawLine(1, i + 1, w, i + 1);
}
c = isSelected ? new Color(47, 111, 180) : new Color(135, 164, 196);
g.setColor(c);
g.drawLine(w - 1, h - 1, w - 1, h - 1);
}
private void drawLeft(Graphics g, boolean isSelected, int w, int h) {
if (LiquidLookAndFeel.winDecoPanther) {
Color c = new Color(198, 198, 198);
g.setColor(c);
g.fillRect(0, 0, w, h);
return;
}
Color c = isSelected ? new Color(62, 145, 235) : new Color(175, 214, 255);
g.setColor(c);
g.fillRect(0, 0, w, h);
c = isSelected ? new Color(94, 172, 255) : new Color(226, 240, 255);
g.setColor(c);
g.drawLine(0, 0, 0, h);
c = isSelected ? new Color(59, 138, 223) : new Color(166, 203, 242);
g.setColor(c);
g.drawLine(1, 0, w, 0);
for (int i = 3; i < h; i += 4) {
c = isSelected ? new Color(59, 138, 223) : new Color(166, 203, 242);
g.setColor(c);
g.drawLine(1, i, w, i);
c = isSelected ? new Color(60, 141, 228) : new Color(170, 207, 247);
g.setColor(c);
g.drawLine(1, i + 1, w, i + 1);
}
c = isSelected ? new Color(47, 111, 180) : new Color(135, 164, 196);
g.setColor(c);
g.drawLine(w - 1, 0, w - 1, h);
}
private void drawRightTop(Graphics g, boolean isSelected, int w, int h) {
if (LiquidLookAndFeel.winDecoPanther) {
Color c = new Color(198, 198, 198);
g.setColor(c);
g.fillRect(0, 0, w, h);
return;
}
Color c = isSelected ? new Color(62, 145, 235) : new Color(175, 214, 255);
g.setColor(c);
g.fillRect(0, 0, w, h);
c = isSelected ? new Color(94, 172, 255) : new Color(226, 240, 255);
g.setColor(c);
g.drawLine(0, 0, w - 2, 0);
c = isSelected ? new Color(60, 141, 228) : new Color(170, 207, 247);
g.setColor(c);
g.drawLine(0, 1, w - 2, 1);
for (int i = 4; i < h; i += 4) {
c = isSelected ? new Color(59, 138, 223) : new Color(166, 203, 242);
g.setColor(c);
g.drawLine(0, i, w - 2, i);
c = isSelected ? new Color(60, 141, 228) : new Color(170, 207, 247);
g.setColor(c);
g.drawLine(0, i + 1, w - 2, i + 1);
}
c = isSelected ? new Color(94, 172, 255) : new Color(226, 240, 255);
g.setColor(c);
g.drawLine(0, h - 1, 0, h - 1);
c = isSelected ? new Color(47, 111, 180) : new Color(135, 164, 196);
g.setColor(c);
g.drawLine(w - 1, 0, w - 1, h);
}
private void drawRight(Graphics g, boolean isSelected, int w, int h) {
if (LiquidLookAndFeel.winDecoPanther) {
Color c = new Color(198, 198, 198);
g.setColor(c);
g.fillRect(0, 0, w, h);
return;
}
Color c = isSelected ? new Color(62, 145, 235) : new Color(175, 214, 255);
g.setColor(c);
g.fillRect(0, 0, w, h);
c = isSelected ? new Color(94, 172, 255) : new Color(226, 240, 255);
g.setColor(c);
g.drawLine(0, 0, 0, h);
c = isSelected ? new Color(59, 138, 223) : new Color(166, 203, 242);
g.setColor(c);
g.drawLine(1, 0, w, 0);
for (int i = 3; i < h; i += 4) {
c = isSelected ? new Color(59, 138, 223) : new Color(166, 203, 242);
g.setColor(c);
g.drawLine(1, i, w, i);
c = isSelected ? new Color(60, 141, 228) : new Color(170, 207, 247);
g.setColor(c);
g.drawLine(1, i + 1, w, i + 1);
}
c = isSelected ? new Color(47, 111, 180) : new Color(135, 164, 196);
g.setColor(c);
g.drawLine(w - 1, 0, w - 1, h);
}
private void drawBottom(Graphics g, boolean isSelected, int w, int h) {
if (LiquidLookAndFeel.winDecoPanther) {
Color c = new Color(198, 198, 198);
g.setColor(c);
g.fillRect(0, 0, w, h);
return;
}
Color c = isSelected ? new Color(62, 145, 235) : new Color(175, 214, 255);
g.setColor(c);
g.fillRect(1, 0, w - 1, h - 1);
c = isSelected ? new Color(94, 172, 255) : new Color(226, 240, 255);
g.setColor(c);
g.drawLine(3, 0, w - 4, 0);
g.drawLine(0, 0, 0, h - 2);
c = isSelected ? new Color(47, 111, 180) : new Color(135, 164, 196);
g.setColor(c);
g.drawLine(0, h - 1, w, h - 1);
g.drawLine(w - 1, 0, w - 1, h - 1);
}
/**
*
* @see javax.swing.border.Border#getBorderInsets(Component)
*/
public Insets getBorderInsets(Component c) {
if (LiquidLookAndFeel.winDecoPanther) {
return new Insets(0, 1, 1, 1);
}
return new Insets(0, 4, 4, 4);
}
/**
* inform the border whether the internal frame is active or not
* @param isActive
*/
public void setActive(boolean isActive) {
this.isActive = isActive;
}
}