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.tree;
017
018 import java.awt.Component;
019 import java.awt.Image;
020 import java.beans.BeanInfo;
021 import java.beans.IntrospectionException;
022 import java.beans.Introspector;
023
024 import javax.swing.ImageIcon;
025 import javax.swing.JTree;
026 import javax.swing.tree.DefaultMutableTreeNode;
027
028 import org.springframework.beans.BeanUtils;
029 import org.springframework.beans.BeanWrapper;
030 import org.springframework.beans.BeanWrapperImpl;
031 import org.springframework.beans.FatalBeanException;
032 import org.springframework.richclient.core.DescribedElement;
033 import org.springframework.richclient.core.VisualizedElement;
034 import org.springframework.util.Assert;
035
036 /**
037 *
038 * @author Keith Donald
039 */
040 public class BeanTreeCellRenderer extends FocusableTreeCellRenderer {
041 private BeanInfo beanInfo;
042
043 private String propertyName;
044
045 public BeanTreeCellRenderer() {
046
047 }
048
049 public BeanTreeCellRenderer(Class beanClass) {
050 this(beanClass, null);
051 }
052
053 public BeanTreeCellRenderer(Class beanClass, String propertyName) {
054 Assert.notNull(beanClass);
055 try {
056 this.beanInfo = Introspector.getBeanInfo(beanClass);
057 }
058 catch (IntrospectionException e) {
059 throw new RuntimeException(e);
060 }
061 this.propertyName = propertyName;
062 }
063
064 /**
065 * @see javax.swing.tree.TreeCellRenderer#getTreeCellRendererComponent(javax.swing.JTree,
066 * java.lang.Object, boolean, boolean, boolean, int, boolean)
067 */
068 public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded,
069 boolean leaf, int row, boolean hasFocus) {
070 super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus);
071 if (value instanceof DefaultMutableTreeNode) {
072 DefaultMutableTreeNode node = (DefaultMutableTreeNode)value;
073 Object bean = node.getUserObject();
074 if (bean != null && !BeanUtils.isSimpleProperty(bean.getClass())) {
075 if (bean instanceof DescribedElement) {
076 DescribedElement element = (DescribedElement)bean;
077 setText(element.getDisplayName());
078 setToolTipText(element.getCaption());
079 }
080 else {
081 BeanWrapper wrapper = new BeanWrapperImpl(bean);
082 try {
083 Object text = propertyName != null ? wrapper.getPropertyValue(propertyName) : wrapper
084 .getPropertyValue("name");
085 setText(String.valueOf(text));
086 }
087 catch (FatalBeanException e) {
088
089 }
090 }
091
092 if (bean instanceof VisualizedElement) {
093 VisualizedElement element = (VisualizedElement) bean;
094 setIcon(element.getIcon());
095 }
096 else {
097 if (beanInfo != null) {
098 Image icon = beanInfo.getIcon(BeanInfo.ICON_COLOR_16x16);
099 if (icon != null) {
100 setIcon(new ImageIcon(icon));
101 }
102 }
103 }
104
105 }
106 }
107 return this;
108 }
109 }