001    /*
002     * Copyright 2002-2004 the original author or authors.
003     * 
004     * Licensed under the Apache License, Version 2.0 (the "License"); you may not
005     * use this file except in compliance with the License. You may obtain a copy of
006     * the License at
007     * 
008     * http://www.apache.org/licenses/LICENSE-2.0
009     * 
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
012     * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
013     * License for the specific language governing permissions and limitations under
014     * the License.
015     */
016    package org.springframework.richclient.table.renderer;
017    
018    import java.awt.Component;
019    import java.beans.BeanInfo;
020    import java.beans.IntrospectionException;
021    import java.beans.Introspector;
022    
023    import javax.swing.JTable;
024    import javax.swing.table.DefaultTableCellRenderer;
025    import javax.swing.table.TableCellRenderer;
026    
027    import org.apache.commons.logging.Log;
028    import org.apache.commons.logging.LogFactory;
029    import org.springframework.beans.BeanWrapper;
030    import org.springframework.beans.BeanWrapperImpl;
031    
032    /**
033     * Renders a bean by using its default property. If no default property is defined the beans toString method will be
034     * used as the value. To render the default property the table default renderer for the property class will be used to
035     * get the cell component.
036     * 
037     * @see JTable#getDefaultRenderer(Class)
038     * 
039     * @author Keith Donald
040     * @author Mathias Broekelmann
041     */
042    public class BeanTableCellRenderer extends DefaultTableCellRenderer {
043        private static final Log log = LogFactory.getLog(BeanTableCellRenderer.class);
044    
045        private BeanWrapper beanWrapper;
046    
047        public BeanTableCellRenderer() {
048            super();
049        }
050    
051        public BeanTableCellRenderer(BeanWrapper wrapper) {
052            beanWrapper = wrapper;
053        }
054    
055        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
056                int row, int column) {
057            if (value != null) {
058                if (beanWrapper == null) {
059                    beanWrapper = new BeanWrapperImpl(value);
060                } else {
061                    beanWrapper.setWrappedInstance(value);
062                }
063                try {
064                    BeanInfo info = Introspector.getBeanInfo(value.getClass());
065                    int index = info.getDefaultPropertyIndex();
066                    if (index != -1) {
067                        String defaultPropName = beanWrapper.getPropertyDescriptors()[index].getName();
068                        Object val = beanWrapper.getPropertyValue(defaultPropName);
069                        TableCellRenderer r = table.getDefaultRenderer(val.getClass());
070                        return r.getTableCellRendererComponent(table, val, isSelected, hasFocus, row, column);
071                    }
072                } catch (IntrospectionException e) {
073                    log.debug("Error during introspection of bean: " + e.getMessage(), e);
074                }
075            }
076            return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
077        }
078    }