/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* 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 java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.*;
import javax.swing.border.AbstractBorder;
import javax.swing.plaf.metal.MetalComboBoxEditor;
import de.muntjak.tinylookandfeel.controlpanel.*;
/**
* TinyComboBoxEditor
*
* @version 1.1
* @author Hans Bickel
*/
public class TinyComboBoxEditor extends MetalComboBoxEditor {
public TinyComboBoxEditor() {
super();
editor = new JTextField("", 9) {
// workaround for 4530952
public void setText(String s) {
if (getText().equals(s)) {
return;
}
super.setText(s);
}
// Note: The following code was introduced with Java 1.5 in
// class javax.swing.plaf.metal.MetalComboBoxEditor.
// With TinyLaF this isn't a good idea, so we create our
// own editor.
// The preferred and minimum sizes are overriden and padded by
// 4 to keep the size as it previously was. Refer to bugs
// 4775789 and 4517214 for details.
// public Dimension getPreferredSize() {
// Dimension pref = super.getPreferredSize();
// pref.height += 4;
// return pref;
// }
// public Dimension getMinimumSize() {
// Dimension min = super.getMinimumSize();
// min.height += 4;
// return min;
// }
};
editor.setBorder(new EditorBorder());
}
class EditorBorder extends AbstractBorder {
/**
* @see javax.swing.border.Border#getBorderInsets(java.awt.Component)
*/
public Insets getBorderInsets(Component c) {
// Note: I just adjusted insets until
// editable and non-editable combo boxes look equal
return new Insets(
1,
Theme.comboInsets[Theme.style].left + 1,
1,
0);
}
/**
* @see javax.swing.border.Border#paintBorder(java.awt.Component, java.awt.Graphics, int, int, int, int)
*/
public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) {
JComponent combo = (JComponent)editor.getParent();
if(combo.getBorder() == null) return;
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) {
if(!c.isEnabled()) {
g.setColor(Theme.textBorderDisabledColor[Theme.style].getColor());
}
else {
g.setColor(Theme.textBorderColor[Theme.style].getColor());
}
g.drawRect(x + 1, y + 1, w - 3, h - 3);
if(!c.isEnabled()) {
g.setColor(Theme.textBorderDarkDisabledColor[Theme.style].getColor());
}
else {
g.setColor(Theme.textBorderDarkColor[Theme.style].getColor());
}
g.drawLine(x, y, x + w - 2, y);
g.drawLine(x, y + 1, x, y + h - 2);
if(!c.isEnabled()) {
g.setColor(Theme.textBorderLightDisabledColor[Theme.style].getColor());
}
else {
g.setColor(Theme.textBorderLightColor[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 - 2);
}
private void drawWinBorder(Component c, Graphics g, int x, int y, int w, int h) {
if(!c.isEnabled()) {
g.setColor(Theme.textBorderDisabledColor[Theme.style].getColor());
}
else {
g.setColor(Theme.textBorderColor[Theme.style].getColor());
}
g.drawLine(x + 1, y + 1, x + w - 1, y + 1);
g.drawLine(x + 1, y + 2, x + 1, y + h - 3);
if(!c.isEnabled()) {
g.setColor(Theme.textBorderDarkDisabledColor[Theme.style].getColor());
}
else {
g.setColor(Theme.textBorderDarkColor[Theme.style].getColor());
}
g.drawLine(x, y, x + w - 1, y);
g.drawLine(x, y + 1, x, y + h - 2);
g.setColor(Theme.backColor[Theme.style].getColor());
g.drawLine(x + 1, y + h - 2, x + w - 1, y + h - 2);
if(!c.isEnabled()) {
g.setColor(Theme.textBorderLightDisabledColor[Theme.style].getColor());
}
else {
g.setColor(Theme.textBorderLightColor[Theme.style].getColor());
}
g.drawLine(x, y + h - 1, x + w - 1, y + h - 1);
}
private void drawXpBorder(Component c, Graphics g, int x, int y, int w, int h) {
// paint border background - next parent is combo box
Color bg = c.getParent().getParent().getBackground();
g.setColor(bg);
g.drawLine(x, y, x + w - 1, y); // top
g.drawLine(x, y, x, y + h - 1); // left
g.drawLine(x, y + h - 1, x + w - 1, y + h - 1); // bottom
if(!c.isEnabled()) {
DrawRoutines.drawEditableComboBorder(
g, Theme.comboBorderDisabledColor[Theme.style].getColor(), 0, 0, w, h);
}
else {
DrawRoutines.drawEditableComboBorder(
g, Theme.comboBorderColor[Theme.style].getColor(), 0, 0, w, h);
}
}
/**
* A subclass of BasicComboBoxEditor that implements UIResource.
* BasicComboBoxEditor doesn't implement UIResource
* directly so that applications can safely override the
* cellRenderer property with BasicListCellRenderer subclasses.
* <p>
* <strong>Warning:</strong>
* Serialized objects of this class will not be compatible with
* future Swing releases. The current serialization support is
* appropriate for short term storage or RMI between applications running
* the same version of Swing. As of 1.4, support for long term storage
* of all JavaBeans<sup><font size="-2">TM</font></sup>
* has been added to the <code>java.beans</code> package.
* Please see {@link java.beans.XMLEncoder}.
*/
public static class UIResource extends TinyComboBoxEditor
implements javax.swing.plaf.UIResource
{
}
}