001 package org.springframework.richclient.form.binding.swing; 002 003 import java.awt.Component; 004 import java.awt.event.ActionListener; 005 006 import javax.swing.ComboBoxEditor; 007 import javax.swing.JComponent; 008 009 import org.springframework.binding.form.FormModel; 010 import org.springframework.context.support.MessageSourceAccessor; 011 import org.springframework.richclient.list.TextValueListRenderer; 012 import org.springframework.util.Assert; 013 014 /** 015 * Binds a Tiger enum in a combobox and supports i18n.<br/> The i18n key of an enum is the full classname + "." + 016 * enumfield.<br/> For example:<br/> x.y.Season.WINTER = Winter<br/> 017 * <p> 018 * configuration happens like this: 019 * </p> 020 * 021 * <pre> 022 * <bean id="binderSelectionStrategy" 023 * class="org.springframework.richclient.form.binding.swing.SwingBinderSelectionStrategy"> 024 * <property name="bindersForPropertyTypes"> 025 * <map> 026 * <entry> 027 * <key> 028 * <value type="java.lang.Class">java.lang.Enum</value> 029 * </key> 030 * <bean class="org.springframework.richclient.form.binding.swing.TigerEnumComboBoxBinder" /> 031 * </entry> 032 * </map> 033 * </property> 034 * </bean> 035 * </pre> 036 * 037 * @author Geoffrey De Smet 038 */ 039 public class EnumComboBoxBinder extends ComboBoxBinder { 040 041 public EnumComboBoxBinder() { 042 super(); 043 } 044 045 protected AbstractListBinding createListBinding(JComponent control, FormModel formModel, String formPropertyPath) { 046 ComboBoxBinding binding = (ComboBoxBinding) super.createListBinding(control, formModel, formPropertyPath); 047 binding.setSelectableItems(createEnumSelectableItems(formModel, formPropertyPath)); 048 MessageSourceAccessor messageSourceAccessor = getMessages(); 049 binding.setRenderer(new EnumListRenderer(messageSourceAccessor)); 050 binding.setEditor(new EnumComboBoxEditor(messageSourceAccessor, binding.getEditor())); 051 return binding; 052 } 053 054 protected Enum[] createEnumSelectableItems(FormModel formModel, String formPropertyPath) { 055 Class propertyType = getPropertyType(formModel, formPropertyPath); 056 Class<Enum> enumPropertyType = propertyType; 057 return enumPropertyType.getEnumConstants(); 058 } 059 060 public class EnumListRenderer extends TextValueListRenderer { 061 062 private MessageSourceAccessor messageSourceAccessor; 063 064 public EnumListRenderer(MessageSourceAccessor messageSourceAccessor) { 065 this.messageSourceAccessor = messageSourceAccessor; 066 } 067 068 protected String getTextValue(Object value) { 069 if (value == null) { 070 return ""; 071 } 072 Enum valueEnum = (Enum) value; 073 Class<? extends Enum> valueClass = valueEnum.getClass(); 074 return messageSourceAccessor.getMessage(valueClass.getName() + "." + valueEnum.name()); 075 } 076 077 } 078 079 public class EnumComboBoxEditor implements ComboBoxEditor { 080 081 private Object current; 082 083 private MessageSourceAccessor messageSourceAccessor; 084 085 private ComboBoxEditor inner; 086 087 public EnumComboBoxEditor(MessageSourceAccessor messageSourceAccessor, ComboBoxEditor editor) { 088 Assert.notNull(editor, "Editor cannot be null"); 089 this.inner = editor; 090 this.messageSourceAccessor = messageSourceAccessor; 091 } 092 093 public void selectAll() { 094 inner.selectAll(); 095 } 096 097 public Component getEditorComponent() { 098 return inner.getEditorComponent(); 099 } 100 101 public void addActionListener(ActionListener l) { 102 inner.addActionListener(l); 103 } 104 105 public void removeActionListener(ActionListener l) { 106 inner.removeActionListener(l); 107 } 108 109 public Object getItem() { 110 return current; 111 } 112 113 public void setItem(Object value) { 114 current = value; 115 if (value != null) { 116 Enum valueEnum = (Enum) value; 117 Class<? extends Enum> valueClass = valueEnum.getClass(); 118 inner.setItem(messageSourceAccessor.getMessage(valueClass.getName() + "." + valueEnum.name())); 119 } else { 120 inner.setItem(null); 121 } 122 } 123 } 124 125 }