001 /* 002 * Copyright 2002-2007 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; 017 018 import java.util.List; 019 020 import org.springframework.beans.BeanWrapper; 021 import org.springframework.beans.BeanWrapperImpl; 022 import org.springframework.context.MessageSource; 023 import org.springframework.context.NoSuchMessageException; 024 import org.springframework.context.support.MessageSourceAccessor; 025 import org.springframework.util.Assert; 026 import org.springframework.util.ClassUtils; 027 028 /** 029 * @author Keith Donald 030 */ 031 public abstract class BeanTableModel extends BaseTableModel { 032 private BeanWrapper beanWrapper = new BeanWrapperImpl(); 033 034 private Class beanClass; 035 036 private String[] columnPropertyNames; 037 038 private MessageSourceAccessor messages; 039 040 public BeanTableModel(Class beanClass) { 041 this(beanClass, (MessageSource)null); 042 } 043 044 public BeanTableModel(Class beanClass, List rows) { 045 this(beanClass, rows, null); 046 } 047 048 public BeanTableModel(Class beanClass, MessageSource messages) { 049 super(); 050 setBeanClass(beanClass); 051 setMessageSource(messages); 052 } 053 054 public BeanTableModel(Class beanClass, List rows, MessageSource messages) { 055 super(rows); 056 setBeanClass(beanClass); 057 setMessageSource(messages); 058 } 059 060 public void setBeanClass(Class clazz) { 061 this.beanClass = clazz; 062 } 063 064 public void setMessageSource(MessageSource messages) { 065 if (messages != null) { 066 this.messages = new MessageSourceAccessor(messages); 067 createColumnInfo(); 068 } 069 else { 070 this.messages = null; 071 } 072 } 073 074 protected void createColumnInfo() { 075 this.columnPropertyNames = createColumnPropertyNames(); 076 super.createColumnInfo(); 077 } 078 079 protected abstract String[] createColumnPropertyNames(); 080 081 protected String[] createColumnNames() { 082 String[] columnPropertyNames = getColumnPropertyNames(); 083 String[] columnNames = new String[columnPropertyNames.length]; 084 Assert.state(this.messages != null, "First set the MessageSource."); 085 for (int i = 0; i < columnPropertyNames.length; i++) { 086 String className = ClassUtils.getShortNameAsProperty(beanClass); 087 String columnPropertyName = columnPropertyNames[i]; 088 try { 089 columnNames[i] = messages.getMessage(className + "." + columnPropertyName); 090 } catch(NoSuchMessageException e) { 091 columnNames[i] = messages.getMessage(columnPropertyName, columnPropertyName); 092 } 093 } 094 return columnNames; 095 } 096 097 protected String[] getColumnPropertyNames() { 098 return columnPropertyNames; 099 } 100 101 private String getColumnPropertyName(int index) { 102 return columnPropertyNames[index]; 103 } 104 105 protected Object getValueAtInternal(Object row, int columnIndex) { 106 beanWrapper.setWrappedInstance(row); 107 return beanWrapper.getPropertyValue(columnPropertyNames[columnIndex]); 108 } 109 110 protected boolean isCellEditableInternal(Object row, int columnIndex) { 111 beanWrapper.setWrappedInstance(row); 112 return beanWrapper.isWritableProperty(getColumnPropertyName(columnIndex)); 113 } 114 115 protected void setValueAtInternal(Object value, Object bean, int columnIndex) { 116 beanWrapper.setWrappedInstance(bean); 117 beanWrapper.setPropertyValue(getColumnPropertyName(columnIndex), value); 118 } 119 }