/******************************************************************************* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 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 { } }