c738ebdc67
Reviewed-by: jasper, ohair
349 lines
11 KiB
Java
349 lines
11 KiB
Java
/*
|
|
* Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved.
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
*
|
|
* This code is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License version 2 only, as
|
|
* published by the Free Software Foundation. Sun designates this
|
|
* particular file as subject to the "Classpath" exception as provided
|
|
* by Sun in the LICENSE file that accompanied this code.
|
|
*
|
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
* version 2 for more details (a copy is included in the LICENSE file that
|
|
* accompanied this code).
|
|
*
|
|
* You should have received a copy of the GNU General Public License version
|
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
*
|
|
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
|
* CA 95054 USA or visit www.sun.com if you need additional information or
|
|
* have any questions.
|
|
*/
|
|
|
|
package javax.swing;
|
|
|
|
import javax.swing.*;
|
|
import javax.swing.event.*;
|
|
import javax.swing.border.*;
|
|
|
|
import java.awt.Component;
|
|
import java.awt.Color;
|
|
import java.awt.Rectangle;
|
|
|
|
import java.io.Serializable;
|
|
import sun.swing.DefaultLookup;
|
|
|
|
|
|
/**
|
|
* Renders an item in a list.
|
|
* <p>
|
|
* <strong><a name="override">Implementation Note:</a></strong>
|
|
* This class overrides
|
|
* <code>invalidate</code>,
|
|
* <code>validate</code>,
|
|
* <code>revalidate</code>,
|
|
* <code>repaint</code>,
|
|
* <code>isOpaque</code>,
|
|
* and
|
|
* <code>firePropertyChange</code>
|
|
* solely to improve performance.
|
|
* If not overridden, these frequently called methods would execute code paths
|
|
* that are unnecessary for the default list cell renderer.
|
|
* If you write your own renderer,
|
|
* take care to weigh the benefits and
|
|
* drawbacks of overriding these methods.
|
|
*
|
|
* <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}.
|
|
*
|
|
* @author Philip Milne
|
|
* @author Hans Muller
|
|
*/
|
|
public class DefaultListCellRenderer extends JLabel
|
|
implements ListCellRenderer, Serializable
|
|
{
|
|
|
|
/**
|
|
* An empty <code>Border</code>. This field might not be used. To change the
|
|
* <code>Border</code> used by this renderer override the
|
|
* <code>getListCellRendererComponent</code> method and set the border
|
|
* of the returned component directly.
|
|
*/
|
|
private static final Border SAFE_NO_FOCUS_BORDER = new EmptyBorder(1, 1, 1, 1);
|
|
private static final Border DEFAULT_NO_FOCUS_BORDER = new EmptyBorder(1, 1, 1, 1);
|
|
protected static Border noFocusBorder = DEFAULT_NO_FOCUS_BORDER;
|
|
|
|
/**
|
|
* Constructs a default renderer object for an item
|
|
* in a list.
|
|
*/
|
|
public DefaultListCellRenderer() {
|
|
super();
|
|
setOpaque(true);
|
|
setBorder(getNoFocusBorder());
|
|
setName("List.cellRenderer");
|
|
}
|
|
|
|
private Border getNoFocusBorder() {
|
|
Border border = DefaultLookup.getBorder(this, ui, "List.cellNoFocusBorder");
|
|
if (System.getSecurityManager() != null) {
|
|
if (border != null) return border;
|
|
return SAFE_NO_FOCUS_BORDER;
|
|
} else {
|
|
if (border != null &&
|
|
(noFocusBorder == null ||
|
|
noFocusBorder == DEFAULT_NO_FOCUS_BORDER)) {
|
|
return border;
|
|
}
|
|
return noFocusBorder;
|
|
}
|
|
}
|
|
|
|
public Component getListCellRendererComponent(
|
|
JList list,
|
|
Object value,
|
|
int index,
|
|
boolean isSelected,
|
|
boolean cellHasFocus)
|
|
{
|
|
setComponentOrientation(list.getComponentOrientation());
|
|
|
|
Color bg = null;
|
|
Color fg = null;
|
|
|
|
JList.DropLocation dropLocation = list.getDropLocation();
|
|
if (dropLocation != null
|
|
&& !dropLocation.isInsert()
|
|
&& dropLocation.getIndex() == index) {
|
|
|
|
bg = DefaultLookup.getColor(this, ui, "List.dropCellBackground");
|
|
fg = DefaultLookup.getColor(this, ui, "List.dropCellForeground");
|
|
|
|
isSelected = true;
|
|
}
|
|
|
|
if (isSelected) {
|
|
setBackground(bg == null ? list.getSelectionBackground() : bg);
|
|
setForeground(fg == null ? list.getSelectionForeground() : fg);
|
|
}
|
|
else {
|
|
setBackground(list.getBackground());
|
|
setForeground(list.getForeground());
|
|
}
|
|
|
|
if (value instanceof Icon) {
|
|
setIcon((Icon)value);
|
|
setText("");
|
|
}
|
|
else {
|
|
setIcon(null);
|
|
setText((value == null) ? "" : value.toString());
|
|
}
|
|
|
|
setEnabled(list.isEnabled());
|
|
setFont(list.getFont());
|
|
|
|
Border border = null;
|
|
if (cellHasFocus) {
|
|
if (isSelected) {
|
|
border = DefaultLookup.getBorder(this, ui, "List.focusSelectedCellHighlightBorder");
|
|
}
|
|
if (border == null) {
|
|
border = DefaultLookup.getBorder(this, ui, "List.focusCellHighlightBorder");
|
|
}
|
|
} else {
|
|
border = getNoFocusBorder();
|
|
}
|
|
setBorder(border);
|
|
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Overridden for performance reasons.
|
|
* See the <a href="#override">Implementation Note</a>
|
|
* for more information.
|
|
*
|
|
* @since 1.5
|
|
* @return <code>true</code> if the background is completely opaque
|
|
* and differs from the JList's background;
|
|
* <code>false</code> otherwise
|
|
*/
|
|
@Override
|
|
public boolean isOpaque() {
|
|
Color back = getBackground();
|
|
Component p = getParent();
|
|
if (p != null) {
|
|
p = p.getParent();
|
|
}
|
|
// p should now be the JList.
|
|
boolean colorMatch = (back != null) && (p != null) &&
|
|
back.equals(p.getBackground()) &&
|
|
p.isOpaque();
|
|
return !colorMatch && super.isOpaque();
|
|
}
|
|
|
|
/**
|
|
* Overridden for performance reasons.
|
|
* See the <a href="#override">Implementation Note</a>
|
|
* for more information.
|
|
*/
|
|
@Override
|
|
public void validate() {}
|
|
|
|
/**
|
|
* Overridden for performance reasons.
|
|
* See the <a href="#override">Implementation Note</a>
|
|
* for more information.
|
|
*
|
|
* @since 1.5
|
|
*/
|
|
@Override
|
|
public void invalidate() {}
|
|
|
|
/**
|
|
* Overridden for performance reasons.
|
|
* See the <a href="#override">Implementation Note</a>
|
|
* for more information.
|
|
*
|
|
* @since 1.5
|
|
*/
|
|
@Override
|
|
public void repaint() {}
|
|
|
|
/**
|
|
* Overridden for performance reasons.
|
|
* See the <a href="#override">Implementation Note</a>
|
|
* for more information.
|
|
*/
|
|
@Override
|
|
public void revalidate() {}
|
|
/**
|
|
* Overridden for performance reasons.
|
|
* See the <a href="#override">Implementation Note</a>
|
|
* for more information.
|
|
*/
|
|
@Override
|
|
public void repaint(long tm, int x, int y, int width, int height) {}
|
|
|
|
/**
|
|
* Overridden for performance reasons.
|
|
* See the <a href="#override">Implementation Note</a>
|
|
* for more information.
|
|
*/
|
|
@Override
|
|
public void repaint(Rectangle r) {}
|
|
|
|
/**
|
|
* Overridden for performance reasons.
|
|
* See the <a href="#override">Implementation Note</a>
|
|
* for more information.
|
|
*/
|
|
@Override
|
|
protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) {
|
|
// Strings get interned...
|
|
if (propertyName == "text"
|
|
|| ((propertyName == "font" || propertyName == "foreground")
|
|
&& oldValue != newValue
|
|
&& getClientProperty(javax.swing.plaf.basic.BasicHTML.propertyKey) != null)) {
|
|
|
|
super.firePropertyChange(propertyName, oldValue, newValue);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Overridden for performance reasons.
|
|
* See the <a href="#override">Implementation Note</a>
|
|
* for more information.
|
|
*/
|
|
@Override
|
|
public void firePropertyChange(String propertyName, byte oldValue, byte newValue) {}
|
|
|
|
/**
|
|
* Overridden for performance reasons.
|
|
* See the <a href="#override">Implementation Note</a>
|
|
* for more information.
|
|
*/
|
|
@Override
|
|
public void firePropertyChange(String propertyName, char oldValue, char newValue) {}
|
|
|
|
/**
|
|
* Overridden for performance reasons.
|
|
* See the <a href="#override">Implementation Note</a>
|
|
* for more information.
|
|
*/
|
|
@Override
|
|
public void firePropertyChange(String propertyName, short oldValue, short newValue) {}
|
|
|
|
/**
|
|
* Overridden for performance reasons.
|
|
* See the <a href="#override">Implementation Note</a>
|
|
* for more information.
|
|
*/
|
|
@Override
|
|
public void firePropertyChange(String propertyName, int oldValue, int newValue) {}
|
|
|
|
/**
|
|
* Overridden for performance reasons.
|
|
* See the <a href="#override">Implementation Note</a>
|
|
* for more information.
|
|
*/
|
|
@Override
|
|
public void firePropertyChange(String propertyName, long oldValue, long newValue) {}
|
|
|
|
/**
|
|
* Overridden for performance reasons.
|
|
* See the <a href="#override">Implementation Note</a>
|
|
* for more information.
|
|
*/
|
|
@Override
|
|
public void firePropertyChange(String propertyName, float oldValue, float newValue) {}
|
|
|
|
/**
|
|
* Overridden for performance reasons.
|
|
* See the <a href="#override">Implementation Note</a>
|
|
* for more information.
|
|
*/
|
|
@Override
|
|
public void firePropertyChange(String propertyName, double oldValue, double newValue) {}
|
|
|
|
/**
|
|
* Overridden for performance reasons.
|
|
* See the <a href="#override">Implementation Note</a>
|
|
* for more information.
|
|
*/
|
|
@Override
|
|
public void firePropertyChange(String propertyName, boolean oldValue, boolean newValue) {}
|
|
|
|
/**
|
|
* A subclass of DefaultListCellRenderer that implements UIResource.
|
|
* DefaultListCellRenderer doesn't implement UIResource
|
|
* directly so that applications can safely override the
|
|
* cellRenderer property with DefaultListCellRenderer 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 DefaultListCellRenderer
|
|
implements javax.swing.plaf.UIResource
|
|
{
|
|
}
|
|
}
|