001    package org.springframework.richclient.list;
002    
003    import java.awt.Component;
004    import java.awt.event.ActionListener;
005    import java.util.Locale;
006    
007    import javax.swing.ComboBoxEditor;
008    
009    import org.springframework.context.MessageSource;
010    import org.springframework.context.MessageSourceResolvable;
011    import org.springframework.core.enums.LabeledEnum;
012    import org.springframework.util.Assert;
013    
014    /**
015     * <code>ComboBoxEditor</code> that wraps another editor, but performs
016     * conversion between <code>CodedEnum</code> s and <code>String</code>s.
017     * <br/>It wraps another <code>ComboBoxEditor</code> to avoid visual
018     * differences between the default editor and this editor.
019     * 
020     * @author peter.de.bruycker
021     */
022    public class LabeledEnumComboBoxEditor implements ComboBoxEditor {
023    
024            private Object current;
025    
026            private MessageSource messages;
027    
028            private ComboBoxEditor inner;
029    
030            /**
031             * Constructs a new <code>CodedEnumComboBoxEditor</code> instance.
032             * 
033             * @param messageSource the <code>MessageSource</code> to use for
034             *        conversion
035             * @param editor the <code>ComboBoxEditor</code> to use internally
036             */
037            public LabeledEnumComboBoxEditor(MessageSource messageSource, ComboBoxEditor editor) {
038                    Assert.notNull(editor, "Editor cannot be null");
039                    this.inner = editor;
040                    messages = messageSource;
041            }
042    
043            /**
044             * @see javax.swing.ComboBoxEditor#selectAll()
045             */
046            public void selectAll() {
047                    inner.selectAll();
048            }
049    
050            /**
051             * @see javax.swing.ComboBoxEditor#getEditorComponent()
052             */
053            public Component getEditorComponent() {
054                    return inner.getEditorComponent();
055            }
056    
057            /**
058             * @see javax.swing.ComboBoxEditor#addActionListener(java.awt.event.ActionListener)
059             */
060            public void addActionListener(ActionListener l) {
061                    inner.addActionListener(l);
062            }
063    
064            /**
065             * @see javax.swing.ComboBoxEditor#removeActionListener(java.awt.event.ActionListener)
066             */
067            public void removeActionListener(ActionListener l) {
068                    inner.removeActionListener(l);
069            }
070    
071            /**
072             * @see javax.swing.ComboBoxEditor#getItem()
073             */
074            public Object getItem() {
075                    return current;
076            }
077    
078            /**
079             * @see javax.swing.ComboBoxEditor#setItem(java.lang.Object)
080             */
081            public void setItem(Object anObject) {
082                    current = anObject;
083                    if (anObject != null) {
084                            if (messages != null && anObject instanceof MessageSourceResolvable) {
085                                    inner.setItem(messages.getMessage((MessageSourceResolvable)anObject, Locale.getDefault()));
086                            }
087                            else {
088                                    inner.setItem(((LabeledEnum)anObject).getLabel());
089                            }
090                    }
091                    else {
092                            inner.setItem(null);
093                    }
094            }
095    }