001 package org.springframework.richclient.form.binding.swing;
002
003 import java.util.ArrayList;
004 import java.util.List;
005 import java.util.Map;
006
007 import javax.swing.JComponent;
008 import javax.swing.JPanel;
009
010 import org.springframework.binding.form.FormModel;
011 import org.springframework.richclient.form.binding.Binding;
012 import org.springframework.richclient.form.binding.support.AbstractBinder;
013
014 /**
015 * Radio button binder for enum values.
016 *
017 * Use this in your Application Context to configure the binder:
018 *
019 * <pre>
020 * <bean name="enumRadioButtonBinder" class="org.springframework.richclient.form.binding.swing.EnumRadioButtonBinder" />
021 * </pre>
022 *
023 * Or when you need an additional null value that can be selected:
024 *
025 * <pre>
026 * <bean name="enumRadioButtonBinder" class="org.springframework.richclient.form.binding.swing.EnumRadioButtonBinder" >
027 * <property name="nullable" value="true" />
028 * </bean>
029 * </pre>
030 *
031 * @author Lieven Doclo
032 */
033 public class EnumRadioButtonBinder extends AbstractBinder {
034
035 private boolean nullable = false;
036
037 /**
038 * Creates a new binder
039 */
040 public EnumRadioButtonBinder() {
041 super(Enum.class);
042 }
043
044 @Override
045 protected JComponent createControl(Map context) {
046 return new JPanel();
047 }
048
049 /**
050 * Sets whether this control can contain a <code>null</code> value
051 *
052 * @param nullable <code>true</code> if the binder needs to contain a
053 * <code>null</code> value
054 */
055 public void setNullable(boolean nullable) {
056 this.nullable = nullable;
057 }
058
059 @Override
060 protected Binding doBind(JComponent control, FormModel formModel, String formPropertyPath, Map context) {
061 EnumRadioButtonBinding binding = new EnumRadioButtonBinding((JPanel) control, formModel, formPropertyPath,
062 getPropertyType(formModel, formPropertyPath), getSelectableEnumsList(formModel, formPropertyPath));
063 return binding;
064
065 }
066
067 /**
068 * Adds the <code>null</code> value if this binder is nullable.
069 */
070 private List<Enum> getSelectableEnumsList(FormModel formModel, String formPropertyPath) {
071 List<Enum> out = new ArrayList<Enum>();
072 if (nullable) {
073 out.add(null);
074 }
075 for (Enum e : ((Class<Enum>) getPropertyType(formModel, formPropertyPath)).getEnumConstants()) {
076 out.add(e);
077 }
078 return out;
079 }
080
081 }