/* ===========================================================
* TradeManager : a application to trade strategies for the Java(tm) platform
* ===========================================================
*
* (C) Copyright 2011-2011, by Simon Allen and Contributors.
*
* Project Info: org.trade
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This library 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 Lesser General Public
* License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*
* [Java is a trademark or registered trademark of Oracle, Inc.
* in the United States and other countries.]
*
* (C) Copyright 2011-2011, by Simon Allen and Contributors.
*
* Original Author: Simon Allen;
* Contributor(s): -;
*
* Changes
* -------
*
*/
package org.trade.ui.widget;
import java.awt.Color;
import java.awt.Component;
import java.awt.Rectangle;
import java.io.Serializable;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.UIManager;
import javax.swing.border.Border;
import javax.swing.border.EmptyBorder;
import javax.swing.table.TableCellRenderer;
import org.trade.core.valuetype.YesNo;
/**
*/
public class YesNoTableRenderer extends JCheckBox implements TableCellRenderer, Serializable {
/**
*
*/
private static final long serialVersionUID = -8331082128500817101L;
protected static Border noFocusBorder = new EmptyBorder(1, 1, 1, 1);
// We need a place to store the color the JLabel should be returned
// to after its foreground and background colors have been set
// to the selection background color.
// These ivars will be made protected when their names are finalized.
private Color unselectedForeground;
private Color unselectedBackground;
/**
* Creates a default table cell renderer.
*/
public YesNoTableRenderer() {
super();
setHorizontalAlignment(SwingConstants.CENTER);
setOpaque(true);
setBorder(noFocusBorder);
}
/**
* Overrides <code>JComponent.setForeground</code> to assign the
* unselected-foreground color to the specified color.
*
* @param c
* set the foreground color to this value
*/
public void setForeground(Color c) {
super.setForeground(c);
unselectedForeground = c;
}
/**
* Overrides <code>JComponent.setForeground</code> to assign the
* unselected-background color to the specified color.
*
* @param c
* set the background color to this value
*/
public void setBackground(Color c) {
super.setBackground(c);
unselectedBackground = c;
}
/**
* Notification from the <code>UIManager</code> that the look and feel [L&F]
* has changed. Replaces the current UI object with the latest version from
* the <code>UIManager</code>.
*
*
* @see JComponent#updateUI
*/
public void updateUI() {
super.updateUI();
setForeground(null);
setBackground(null);
}
// implements javax.swing.table.TableCellRenderer
/**
*
* Returns the default table cell renderer.
*
* @param table
* the <code>JTable</code>
* @param value
* the value to assign to the cell at <code>[row, column]</code>
* @param isSelected
* true if cell is selected
*
* @param row
* the row of the cell to render
* @param column
* the column of the cell to render
*
* @param hasFocus
* boolean
* @return the default table cell renderer * @see
* javax.swing.table.TableCellRenderer
* #getTableCellRendererComponent(JTable, Object, boolean, boolean,
* int, int)
*/
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
if (isSelected) {
super.setForeground(table.getSelectionForeground());
super.setBackground(table.getSelectionBackground());
} else {
super.setForeground((unselectedForeground != null) ? unselectedForeground : table.getForeground());
super.setBackground((unselectedBackground != null) ? unselectedBackground : table.getBackground());
}
setFont(table.getFont());
if (hasFocus) {
setBorder(UIManager.getBorder("Table.focusCellHighlightBorder"));
if (table.isCellEditable(row, column)) {
super.setForeground(UIManager.getColor("Table.focusCellForeground"));
super.setBackground(UIManager.getColor("Table.focusCellBackground"));
}
} else {
setBorder(noFocusBorder);
}
setValue(value);
// ---- begin optimization to avoid painting background ----
Color back = getBackground();
boolean colorMatch = (back != null) && (back.equals(table.getBackground())) && table.isOpaque();
setOpaque(!colorMatch);
// ---- end optimization to aviod painting background ----
return this;
}
/*
* The following methods are overridden as a performance measure to to prune
* code-paths are often called in the case of renders but which we know are
* unnecessary. Great care should be taken when writing your own renderer to
* weigh the benefits and drawbacks of overriding methods like these.
*/
/**
* Overridden for performance reasons. See the
* <a href="#override">Implementation Note</a> for more information.
*/
public void validate() {
}
/**
* Overridden for performance reasons. See the
* <a href="#override">Implementation Note</a> for more information.
*/
public void revalidate() {
}
/**
* Overridden for performance reasons. See the
* <a href="#override">Implementation Note</a> for more information.
*
* @param tm
* long
* @param x
* int
* @param y
* int
* @param width
* int
* @param height
* int
*/
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.
*
* @param r
* Rectangle
*/
public void repaint(Rectangle r) {
}
/**
* Overridden for performance reasons. See the
* <a href="#override">Implementation Note</a> for more information.
*
* @param propertyName
* String
* @param oldValue
* Object
* @param newValue
* Object
*/
protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) {
// Strings get interned...
if (propertyName.equals("text")) {
super.firePropertyChange(propertyName, oldValue, newValue);
}
}
/**
* Overridden for performance reasons. See the
* <a href="#override">Implementation Note</a> for more information.
*
* @param propertyName
* String
* @param oldValue
* boolean
* @param newValue
* boolean
*/
public void firePropertyChange(String propertyName, boolean oldValue, boolean newValue) {
}
/**
* Sets the string for the cell being rendered to <code>value</code>.
*
* @param value
* the string value for this cell; if value is <code>null</code>
* it sets the text value to an empty string
*
*
* @see JLabel#setText
*/
protected void setValue(Object value) {
boolean selected = false;
if (value instanceof Boolean) {
selected = ((Boolean) value).booleanValue();
} else if (value instanceof YesNo) {
if (((YesNo) value).isYes()) {
selected = true;
}
} else if (value instanceof String) {
selected = value.equals("true");
}
setSelected(selected);
}
}