/*******************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* 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.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Insets;
import javax.swing.JComponent;
import javax.swing.JTextField;
import javax.swing.border.AbstractBorder;
import javax.swing.plaf.metal.MetalComboBoxEditor;
import de.muntjak.tinylookandfeel.controlpanel.DrawRoutines;
/**
* TinyComboBoxEditor
*
* @version 1.1
* @author Hans Bickel
*/
@SuppressWarnings (
{ "all" } )
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
{
}
}