/*
* 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.list.cellrenderer;
import java.awt.Component;
import java.awt.Graphics;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JList;
import javax.swing.ListCellRenderer;
import javax.swing.SwingConstants;
import org.beanfabrics.model.IIconPM;
import org.beanfabrics.model.ITextPM;
import org.beanfabrics.model.PresentationModel;
import org.beanfabrics.swing.ErrorIconPainter;
/**
* The <code>TextPMListCellRenderer</code> is a {@link ListCellRenderer} that
* renders a {@link ITextPM}.
*
* @author Michael Karneim
* @author Max Gensthaler
*/
@SuppressWarnings("serial")
public class TextPMListCellRenderer extends DefaultListCellRenderer implements PMListCellRenderer {
private ITextPM model;
private ErrorIconPainter errorIconPainter = createDefaultErrorIconPainter();
public TextPMListCellRenderer() {
setInheritsPopupMenu(true);
}
/** {@inheritDoc} */
public boolean supportsPresentationModel(PresentationModel pModel) {
return pModel instanceof ITextPM;
}
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
if (value != null && value instanceof ITextPM) {
model = (ITextPM)value;
setText(model.getText());
setToolTipText(model.isValid() == false ? model.getValidationState().getMessage() : model.getDescription());
if (model instanceof IIconPM) {
IIconPM iconCell = (IIconPM)model;
this.setIcon(iconCell.getIcon());
} else {
this.setIcon(null);
}
} else {
setText("");
setToolTipText(null);
if (getIcon() != null) {
setIcon(null);
}
}
return this;
}
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;
}
}
}