001    package org.springframework.richclient.list;
002    
003    import java.awt.Component;
004    import java.awt.event.ActionListener;
005    
006    import javax.swing.ComboBoxEditor;
007    
008    import org.springframework.beans.BeanWrapper;
009    import org.springframework.beans.BeanWrapperImpl;
010    
011    /**
012     * @author Geoffrey De Smet
013     */
014    public class BeanPropertyValueComboBoxEditor implements ComboBoxEditor {
015    
016        private final BeanWrapper beanWrapper = new BeanWrapperImpl();
017    
018        private Object current;
019    
020        private final ComboBoxEditor innerEditor;
021    
022        private final String renderedProperty;
023    
024        /**
025         * Constructs a new <code>BeanPropertyValueComboBoxEditor</code>
026         * instance. The <code>toString</code> method is used to render
027         * the items.
028         *
029         * @param editor
030         *            the <code>ComboBoxEditor</code> to use internally
031         */
032        public BeanPropertyValueComboBoxEditor(ComboBoxEditor editor) {
033            this(editor, null);
034        }
035    
036        /**
037         * Constructs a new <code>BeanPropertyValueComboBoxEditor</code>
038         * instance.
039         *
040         * @param innerEditor
041         *            the <code>ComboBoxEditor</code> which is used to render the value of the property
042         * @param renderedProperty
043         *            the property used to render the items
044         */
045        public BeanPropertyValueComboBoxEditor(ComboBoxEditor innerEditor, String renderedProperty) {
046            this.innerEditor = innerEditor;
047            this.renderedProperty = renderedProperty;
048        }
049    
050        /**
051         * Should only be used if the innerEditor will be set later
052         *
053         * @param renderedProperty
054         */
055        public BeanPropertyValueComboBoxEditor(String renderedProperty) {
056            this(null, renderedProperty);
057        }
058    
059        /**
060         * @see javax.swing.ComboBoxEditor#addActionListener(java.awt.event.ActionListener)
061         */
062        public void addActionListener(ActionListener l) {
063            innerEditor.addActionListener(l);
064        }
065    
066        /**
067         * @see javax.swing.ComboBoxEditor#getEditorComponent()
068         */
069        public Component getEditorComponent() {
070            return innerEditor.getEditorComponent();
071        }
072    
073        /**
074         * @see javax.swing.ComboBoxEditor#getItem()
075         */
076        public Object getItem() {
077            return current;
078        }
079    
080        /**
081         * @see javax.swing.ComboBoxEditor#removeActionListener(java.awt.event.ActionListener)
082         */
083        public void removeActionListener(ActionListener l) {
084            innerEditor.removeActionListener(l);
085        }
086    
087        /**
088         * @see javax.swing.ComboBoxEditor#selectAll()
089         */
090        public void selectAll() {
091            innerEditor.selectAll();
092        }
093    
094        /**
095         * @see javax.swing.ComboBoxEditor#setItem(Object)
096         */
097        public void setItem(Object item) {
098            current = item;
099            if (item == null) {
100                innerEditor.setItem("");
101            } else {
102                beanWrapper.setWrappedInstance(item);
103                if (renderedProperty != null) {
104                    innerEditor.setItem(String.valueOf(beanWrapper.getPropertyValue(renderedProperty)));
105                } else {
106                    innerEditor.setItem(String.valueOf(item));
107                }
108            }
109        }
110        
111        /**
112         * @return the property name
113         */
114        public String getPropertyName() {
115            return this.renderedProperty;
116        }
117    }