/* * 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.io.Serializable; import java.util.ArrayList; import java.util.List; import javax.swing.JList; import javax.swing.ListCellRenderer; import org.beanfabrics.model.PresentationModel; import org.beanfabrics.swing.list.BnList; /** * The <code>BnListCellRenderer</code> is the general {@link ListCellRenderer} * for the {@link BnList}. * <p> * It delegates calls of * {@link #getListCellRendererComponent(JList, Object, int, boolean, boolean)} * to each of it's installed renderers (see {@link #getInstalledRenderers()}) * until it receives a not-<code>null</code> result. * </p> * <p> * If no renderer component is found at all it returns an {@link EmptyRenderer} * as fallback. * </p> * <p> * To install a custom renderer just add it to the list of installed renderers. * </p> * <p> * For an example about using BnListCellRenderer, please see <a * href="http://www.beanfabrics.org/index.php/BnListCellRenderer" * target="parent">http://www.beanfabrics.org/index.php/BnListCellRenderer</a> * </p> * * @author Michael Karneim */ @SuppressWarnings("serial") public class BnListCellRenderer implements ListCellRenderer, Serializable { public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { if (value instanceof PresentationModel) { for (PMListCellRenderer renderer : installedRenderers) { if (renderer.supportsPresentationModel((PresentationModel)value)) { return renderer.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); } } } return FALLBACK_RENDERER.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); } private final ListCellRenderer FALLBACK_RENDERER = new EmptyRenderer(); private final List<PMListCellRenderer> installedRenderers = new ArrayList<PMListCellRenderer>(); public BnListCellRenderer() { installDefaultRenderers(); } private void installDefaultRenderers() { // TODO (mk) I think a checkbox style renderer makes no sense here since // we can't click on it to change the value // installedRenderers.add( new BooleanPMListCellRenderer()); installedRenderers.add(new TextPMListCellRenderer()); installedRenderers.add(new IconPMListCellRenderer()); } public List<PMListCellRenderer> getInstalledRenderers() { return this.installedRenderers; } }