/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* 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;
import java.awt.*;
import javax.swing.AbstractButton;
import javax.swing.JComponent;
import javax.swing.SwingConstants;
import javax.swing.plaf.ComponentUI;
import de.muntjak.tinylookandfeel.controlpanel.*;
/**
* TinySpinnerButtonUI
*
* @version 1.0
* @author Hans Bickel
*/
public class TinySpinnerButtonUI extends TinyButtonUI {
private int orientation;
protected static Dimension winSize = new Dimension(18, 8);
protected static Dimension xpSize = new Dimension(15, 8);
public static ComponentUI createUI(JComponent c) {
throw new IllegalStateException("Must not be used this way.");
}
/**
* Creates a new Spinner Button. Use either SwingConstants.SOUTH or SwingConstants.NORTH
* for a SpinnerButton of Type up or a down.
* @param type
*/
TinySpinnerButtonUI(int type) {
orientation = type;
}
public void paint(Graphics g, JComponent c) {
AbstractButton button = (AbstractButton) c;
if(!button.isEnabled()) {
g.setColor(Theme.spinnerButtDisabledColor[Theme.style].getColor());
}
else if(button.getModel().isPressed()) {
g.setColor(Theme.spinnerButtPressedColor[Theme.style].getColor());
}
else if(button.getModel().isRollover()) {
g.setColor(Theme.spinnerButtRolloverColor[Theme.style].getColor());
}
else {
g.setColor(Theme.spinnerButtColor[Theme.style].getColor());
}
switch(Theme.derivedStyle[Theme.style]) {
case Theme.TINY_STYLE:
drawTinyButton(g, button);
break;
case Theme.W99_STYLE:
drawWinButton(g, button);
break;
case Theme.YQ_STYLE:
drawXpButton(g, button);
break;
}
if(!button.isEnabled()) {
g.setColor(Theme.spinnerArrowDisabledColor[Theme.style].getColor());
}
else {
g.setColor(Theme.spinnerArrowColor[Theme.style].getColor());
}
switch(Theme.derivedStyle[Theme.style]) {
case Theme.TINY_STYLE:
drawTinyArrow(g, button);
break;
case Theme.W99_STYLE:
drawWinArrow(g, button);
break;
case Theme.YQ_STYLE:
drawXpArrow(g, button);
break;
}
}
private void drawTinyButton(Graphics g, AbstractButton b) {
}
private void drawWinButton(Graphics g, AbstractButton b) {
g.fillRect(0, 0, b.getWidth(), b.getHeight());
int x2 = b.getSize().width - 3;
int y2 = (orientation == SwingConstants.NORTH ? b.getSize().height - 1 : b.getSize().height - 3);
int y1 = (orientation == SwingConstants.NORTH ? 2 : 0);
if(b.getModel().isPressed()) {
g.setColor(Theme.spinnerDarkColor[Theme.style].getColor());
g.drawRect(0, y1, x2, y2 - y1);
return;
}
if(!b.isEnabled()) {
g.setColor(Theme.spinnerLightDisabledColor[Theme.style].getColor());
}
else {
g.setColor(Theme.spinnerLightColor[Theme.style].getColor());
}
g.drawLine(1, y1 + 1, x2 - 2, y1 + 1);
g.drawLine(1, y1 + 2, 1, y2 - 2);
if(!b.isEnabled()) {
g.setColor(Theme.spinnerDarkDisabledColor[Theme.style].getColor());
}
else {
g.setColor(Theme.spinnerDarkColor[Theme.style].getColor());
}
g.drawLine(1, y2 - 1, x2 - 1, y2 - 1);
g.drawLine(x2 - 1, y1 + 1, x2 - 1, y2 - 2);
if(!b.isEnabled()) {
g.setColor(Theme.spinnerBorderDisabledColor[Theme.style].getColor());
}
else {
g.setColor(Theme.spinnerBorderColor[Theme.style].getColor());
}
g.drawLine(0, y2, x2, y2);
g.drawLine(x2, y1, x2, y2);
}
private void drawXpButton(Graphics g, AbstractButton b) {
// g.setColor(Color.RED);
// g.fillRect(0, 0, b.getWidth(), b.getHeight());
// if(true) return;
int x2 = b.getSize().width - 1;
int y2 = b.getSize().height - 1;
int h = b.getSize().height;
int spread1 = Theme.spinnerSpreadLight[Theme.style];
int spread2 = Theme.spinnerSpreadDark[Theme.style];
if(!b.isEnabled()) {
spread1 = Theme.spinnerSpreadLightDisabled[Theme.style];
spread2 = Theme.spinnerSpreadDarkDisabled[Theme.style];
}
float spreadStep1 = 10.0f * spread1 / (h - 2);
float spreadStep2 = 10.0f * spread2 / (h - 2);
int halfY = h / 2;
int yd;
Color c = g.getColor();
for(int y = 1; y < h - 1; y++) {
if(y < halfY) {
yd = halfY - y;
g.setColor(ColorRoutines.lighten(c, (int)(yd * spreadStep1)));
}
else if(y == halfY) {
g.setColor(c);
}
else {
yd = y - halfY;
g.setColor(ColorRoutines.darken(c, (int)(yd * spreadStep2)));
}
g.drawLine(1, y, x2, y);
}
if(!b.isEnabled()) {
g.setColor(Theme.spinnerBorderDisabledColor[Theme.style].getColor());
}
else {
g.setColor(Theme.spinnerBorderColor[Theme.style].getColor());
}
g.drawRect(0, 0, x2, y2);
}
private void drawTinyArrow(Graphics g, AbstractButton b) {
}
private void drawWinArrow(Graphics g, AbstractButton b) {
int x = 6;
int y = (b.getSize().height - 2) / 2;
if(orientation == SwingConstants.NORTH) y += 1;
else y -= 1;
if(b.getModel().isPressed()) {
y += 1;
x += 1;
}
switch (orientation) {
case SwingConstants.NORTH:
g.drawLine(x + 1, y, x + 1, y);
g.drawLine(x, y + 1, x + 2, y + 1);
break;
case SwingConstants.SOUTH:
g.drawLine(x + 1, y + 1, x + 1, y + 1);
g.drawLine(x, y, x + 2, y);
break;
}
}
private void drawXpArrow(Graphics g, AbstractButton b) {
int y = (b.getSize().height - 6) / 2;
switch (orientation) {
case SwingConstants.NORTH:
y --;
g.drawLine(7, y + 2, 7, y + 2);
g.drawLine(6, y + 3, 8, y + 3);
g.drawLine(5, y + 4, 9, y + 4);
g.drawLine(4, y + 5, 6, y + 5);
g.drawLine(8, y + 5, 10, y + 5);
break;
case SwingConstants.SOUTH:
g.drawLine(4, y + 2, 6, y + 2);
g.drawLine(8, y + 2, 10, y + 2);
g.drawLine(5, y + 3, 9, y + 3);
g.drawLine(6, y + 4, 8, y + 4);
g.drawLine(7, y + 5, 7, y + 5);
break;
}
}
/**
* @see javax.swing.plaf.basic.BasicButtonUI#getPreferredSize(javax.swing.JComponent)
*/
public Dimension getPreferredSize(JComponent c) {
switch(Theme.derivedStyle[Theme.style]) {
case Theme.TINY_STYLE:
return xpSize;
case Theme.W99_STYLE:
return winSize;
default:
return xpSize;
}
}
}