/*
* Beanfabrics Framework Copyright (C) by Michael Karneim, beanfabrics.org
* Use is subject to license terms. See license.txt.
*/
// TODO javadoc - remove this comment only when the class and all non-public
// methods and fields are documented
package org.beanfabrics.swing.table.cellrenderer;
import java.awt.Component;
import java.awt.Graphics;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;
import org.beanfabrics.model.IIconPM;
import org.beanfabrics.swing.ErrorIconPainter;
import org.beanfabrics.swing.table.BnColumn;
import org.beanfabrics.swing.table.BnTable;
/**
* The <code>IconPMTableCellRenderer</code> is a {@link TableCellRenderer} for
* an {@link IIconPM}.
*
* @author Michael Karneim
*/
@SuppressWarnings("serial")
public class IconPMTableCellRenderer extends DefaultTableCellRenderer {
private IIconPM model;
private BnColumn column;
private ErrorIconPainter errorIconPainter = createDefaultErrorIconPainter();
public IconPMTableCellRenderer() {
super();
setHorizontalAlignment(SwingConstants.CENTER);
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
if (value instanceof IIconPM) {
this.column = getBnColumn(table, column);
return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
} else {
return null;
}
}
private BnColumn getBnColumn(JTable table, int columnIndex) {
if (table instanceof BnTable) {
BnTable bnTable = (BnTable)table;
return bnTable.getColumns()[bnTable.convertColumnIndexToModel(columnIndex)];
}
return null;
}
@Override
protected void setValue(Object value) {
if (value != null && value instanceof IIconPM) {
model = (IIconPM)value;
setIcon(model.getIcon());
setToolTipText(model.isValid() == false ? model.getValidationState().getMessage() : model.getDescription());
if (column != null && column.getAlignment() != null) {
this.setHorizontalAlignment(column.getAlignment());
}
} else {
model = null;
setIcon(null);
setToolTipText(null);
this.setHorizontalAlignment(SwingConstants.CENTER);
}
setInheritsPopupMenu(true);
}
private ErrorIconPainter createDefaultErrorIconPainter() {
ErrorIconPainter result = new ErrorIconPainter();
result.setHorizontalAlignment(invertHorizontalAlignment(getHorizontalAlignment()));
return result;
}
public ErrorIconPainter getErrorIconPainter() {
return errorIconPainter;
}
public void setErrorIconPainter(ErrorIconPainter aErrorIconPainter) {
if (aErrorIconPainter == null) {
throw new IllegalArgumentException("aErrorIconPainter == null");
}
this.errorIconPainter = aErrorIconPainter;
}
/** {@inheritDoc} */
@Override
public void paintChildren(Graphics g) {
super.paintChildren(g);
if (shouldPaintErrorIcon()) {
errorIconPainter.paint(g, this);
}
}
private boolean shouldPaintErrorIcon() {
if (model == null) {
return false;
}
return (model.isValid() == false);
}
@Override
public void setHorizontalAlignment(int alignment) {
super.setHorizontalAlignment(alignment);
if (errorIconPainter != null) {
this.errorIconPainter.setHorizontalAlignment(invertHorizontalAlignment(alignment));
}
}
private int invertHorizontalAlignment(int alignment) {
switch (alignment) {
case SwingConstants.LEFT:
return SwingConstants.RIGHT;
case SwingConstants.RIGHT:
return SwingConstants.LEFT;
case SwingConstants.LEADING:
return SwingConstants.TRAILING;
case SwingConstants.TRAILING:
return SwingConstants.LEADING;
default:
return alignment;
}
}
}