/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* 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 javax.swing.*;
import javax.swing.border.AbstractBorder;
import javax.swing.plaf.UIResource;
import de.muntjak.tinylookandfeel.*;
import de.muntjak.tinylookandfeel.controlpanel.DrawRoutines;
/**
* TinyButtonBorder is the border for JButton, JToggleButton and JSpinner buttons.
*
* @version 1.0
* @author Hans Bickel
*/
public class TinyButtonBorder extends AbstractBorder implements UIResource {
protected final Insets borderInsets = new Insets(2, 2, 2, 2);
/**
* Draws the button border for the given component.
*
* @param mainColor The component to draw its border.
* @param g The graphics context.
* @param x The x coordinate of the top left corner.
* @param y The y coordinate of the top left corner.
* @param w The width.
* @param h The height.
*/
public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) {
switch (Theme.derivedStyle[Theme.style]) {
case Theme.TINY_STYLE :
drawTinyBorder(c, g, x, y, w, h);
break;
case Theme.W99_STYLE :
drawWinBorder(c, g, x, y, w, h);
break;
case Theme.YQ_STYLE :
drawXpBorder(c, g, x, y, w, h);
break;
}
}
private void drawTinyBorder(Component c, Graphics g, int x, int y, int w, int h) {
}
private void drawWinBorder(Component c, Graphics g, int x, int y, int w, int h) {
AbstractButton b = (AbstractButton)c;
boolean isDefault = (c instanceof JButton) && (((JButton)c).isDefaultButton());
if(b.getModel().isPressed() ||
((b instanceof JToggleButton) && b.isSelected()))
{
g.setColor(Color.BLACK);
g.drawRect(0, 0, w - 1, h - 1);
g.setColor(Theme.buttonDarkColor[Theme.style].getColor());
g.drawRect(1, 1, w - 3, h - 3);
return;
}
else if(isDefault && b.isEnabled()) {
g.setColor(Theme.buttonDefaultColor[Theme.style].getColor());
g.drawRect(0, 0, w - 1, h - 1);
x += 1; y += 1; w -= 1; h -= 1;
}
if(!b.isEnabled()) {
g.setColor(Theme.buttonLightDisabledColor[Theme.style].getColor());
}
else {
g.setColor(Theme.buttonLightColor[Theme.style].getColor());
}
g.drawLine(x, y, w - 2, y);
g.drawLine(x, y + 1, x, h - 2);
if(!b.isEnabled()) {
g.setColor(Theme.buttonBorderDisabledColor[Theme.style].getColor());
}
else {
g.setColor(Theme.buttonBorderColor[Theme.style].getColor());
}
g.drawLine(x, h - 1, w - 1, h - 1);
g.drawLine(w - 1, y, w - 1, h - 1);
if(!b.isEnabled()) {
g.setColor(Theme.buttonDarkDisabledColor[Theme.style].getColor());
}
else {
g.setColor(Theme.buttonDarkColor[Theme.style].getColor());
}
g.drawLine(x + 1, h - 2, w - 2, h - 2);
g.drawLine(w - 2, y + 1, w - 2, h - 2);
}
private void drawXpBorder(Component c, Graphics g, int x, int y, int w, int h) {
AbstractButton b = (AbstractButton)c;
boolean isDefault = (c instanceof JButton) && (((JButton)c).isDefaultButton());
boolean isComboBoxButton =
Boolean.TRUE.equals(b.getClientProperty("isComboBoxButton"));
if(isComboBoxButton) {
if (!b.isEnabled()) {
DrawRoutines.drawRoundedBorder(
g, Theme.comboBorderDisabledColor[Theme.style].getColor(), x, y, w, h);
}
else {
DrawRoutines.drawRoundedBorder(
g, Theme.comboBorderColor[Theme.style].getColor(), x, y, w, h);
if(b.getModel().isPressed()) return;
if(b.getModel().isRollover() && Theme.comboRollover[Theme.style]) {
DrawRoutines.drawRolloverBorder(
g, Theme.buttonRolloverColor[Theme.style].getColor(), x, y, w, h);
}
}
}
else { // it's a normal JButton or a JSpinner button
boolean isSpinnerButton =
Boolean.TRUE.equals(b.getClientProperty("isSpinnerButton"));
boolean paintRollover =
(isSpinnerButton && Theme.spinnerRollover[Theme.style]) ||
(!isSpinnerButton && Theme.buttonRollover[Theme.style]);
if (!b.isEnabled()) {
DrawRoutines.drawRoundedBorder(
g, Theme.buttonBorderDisabledColor[Theme.style].getColor(), x, y, w, h);
}
else {
DrawRoutines.drawRoundedBorder(
g, Theme.buttonBorderColor[Theme.style].getColor(), x, y, w, h);
if(b.getModel().isPressed()) return;
if(b.getModel().isRollover() && paintRollover) {
DrawRoutines.drawRolloverBorder(
g, Theme.buttonRolloverColor[Theme.style].getColor(), x, y, w, h);
}
else if(isDefault ||
(Theme.buttonFocusBorder[Theme.style] && b.isFocusOwner()))
{
DrawRoutines.drawRolloverBorder(
g, Theme.buttonDefaultColor[Theme.style].getColor(), x, y, w, h);
}
}
}
}
/**
* Gets the border insets for a given component.
*
* @param c The component to get its border insets.
* @return Always returns the same insets as defined in <code>insets</code>.
*/
public Insets getBorderInsets(Component c) {
return borderInsets;
}
}