/*
* TableCellUtilities.java
* Copyright 2008 Connor Petty <cpmeister@users.sourceforge.net>
*
* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Created on Aug 10, 2008, 3:37:34 PM
*/
package pcgen.gui2.util.table;
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.ParseException;
import javax.swing.AbstractCellEditor;
import javax.swing.JComponent;
import javax.swing.JRadioButton;
import javax.swing.JSpinner;
import javax.swing.JTable;
import javax.swing.JToggleButton;
import javax.swing.SpinnerModel;
import javax.swing.SwingConstants;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
/**
*
* @author Connor Petty <cpmeister@users.sourceforge.net>
*/
public final class TableCellUtilities
{
private static final DefaultTableCellRenderer dummyRenderer = new DefaultTableCellRenderer();
private TableCellUtilities()
{
}
public static void setToRowBackground(Component c, JTable table, int row)
{
dummyRenderer.getTableCellRendererComponent(table, null, false, false, row, 0);
Color bg = dummyRenderer.getBackground();
// We have to create a new color object because Nimbus returns
// a color of type DerivedColor, which behaves strange, not sure
// why.
c.setBackground(new Color(bg.getRed(), bg.getGreen(), bg.getBlue()));
}
public static class RadioButtonEditor extends AbstractCellEditor
implements ActionListener,
TableCellEditor
{
private JRadioButton button;
public RadioButtonEditor()
{
this.button = new JRadioButton();
button.setHorizontalAlignment(SwingConstants.CENTER);
button.addActionListener(this);
}
@Override
public Object getCellEditorValue()
{
return button.isSelected();
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected,
int row, int column)
{
boolean selected = false;
if (value instanceof Boolean)
{
selected = ((Boolean) value).booleanValue();
}
else if (value instanceof String)
{
selected = value.equals("true");
}
button.setSelected(selected);
return button;
}
@Override
public void actionPerformed(ActionEvent e)
{
stopCellEditing();
}
}
public static class SpinnerEditor extends AbstractCellEditor
implements TableCellEditor, ChangeListener
{
protected final JSpinner spinner;
public SpinnerEditor()
{
this(new JSpinner());
}
public SpinnerEditor(SpinnerModel model)
{
this(new JSpinner(model));
}
public SpinnerEditor(JSpinner spinner)
{
this.spinner = spinner;
spinner.addChangeListener(this);
}
@Override
public Object getCellEditorValue()
{
return spinner.getValue();
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected,
int row,
int column)
{
spinner.setValue(value);
return spinner;
}
@Override
public void stateChanged(ChangeEvent e)
{
stopCellEditing();
}
@Override
public boolean stopCellEditing()
{
try
{
spinner.commitEdit();
}
catch (ParseException ex)
{
return false;
}
return super.stopCellEditing();
}
}
public static class ToggleButtonRenderer extends JComponent implements TableCellRenderer
{
private JToggleButton button;
private DefaultTableCellRenderer renderer = new DefaultTableCellRenderer();
public ToggleButtonRenderer(JToggleButton button)
{
this.button = button;
button.setHorizontalAlignment(SwingConstants.CENTER);
button.setBorderPainted(true);
setLayout(new GridLayout(1, 1));
add(button);
}
@Override
public Component getTableCellRendererComponent(JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column)
{
renderer.getTableCellRendererComponent(table, value, isSelected,
hasFocus, row,
column);
if (value == null)
{
return renderer;
}
setBackground(renderer.getBackground());
button.setSelected(((Boolean) value).booleanValue());
return this;
}
@Override
protected void paintComponent(Graphics g)
{
g.setColor(getBackground());
g.fillRect(0, 0, getWidth(), getHeight());
}
}
public static class SpinnerRenderer extends DefaultTableCellRenderer
{
private final JSpinner spinner;
public SpinnerRenderer()
{
this(new JSpinner());
}
public SpinnerRenderer(JSpinner spinner)
{
this.spinner = spinner;
}
@Override
public Component getTableCellRendererComponent(JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column)
{
if (value == null)
{
return super.getTableCellRendererComponent(table, value,
isSelected,
hasFocus, row, column);
}
spinner.setValue(value);
spinner.setEnabled(table.isCellEditable(row, column));
return spinner;
}
}
/**
* Align the cell text in a column
*/
public static final class AlignRenderer extends DefaultTableCellRenderer
{
/**
* align is one of:
* SwingConstants.LEFT
* SwingConstants.CENTER
* X.RIGHT
**/
private int align = SwingConstants.LEFT;
private final boolean showTooltips;
/**
* Create a new instance of AlignRenderer without tool tips.
* @param anInt The alignment constant, from SwingConstants.
*/
public AlignRenderer(int anInt)
{
this(anInt, false);
}
/**
* Create a new instance of AlignRenderer
* @param anInt The alignment constant, from SwingConstants.
* @param tooltips Should we show tool tips?
*/
public AlignRenderer(int anInt, boolean tooltips)
{
super();
align = anInt;
this.showTooltips = tooltips;
setHorizontalAlignment(align);
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
{
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
setEnabled((table == null) || table.isEnabled());
setHorizontalAlignment(align);
if (showTooltips)
{
setToolTipText(String.valueOf(value));
}
return this;
}
}
}