001 package org.springframework.richclient.form.binding.swing;
002
003 import org.springframework.richclient.form.binding.Binder;
004 import org.springframework.richclient.form.binding.Binding;
005 import org.springframework.richclient.components.FileChooser;
006 import org.springframework.binding.form.FormModel;
007 import org.springframework.util.Assert;
008
009 import javax.swing.*;
010 import java.util.Map;
011
012 public class FileChooserBinder implements Binder
013 {
014 public static final String BINDING_CLIENT_PROPERTY_KEY = "binding";
015
016 private boolean useFile = false;
017
018 private FileChooser.FileChooserMode mode = FileChooser.FileChooserMode.FILE;
019
020 public FileChooserBinder()
021 {
022 }
023
024 @SuppressWarnings("unchecked")
025 protected JComponent createControl(Map context)
026 {
027 return new FileChooser();
028 }
029
030 @SuppressWarnings("unchecked")
031 protected Binding doBind(JComponent control, FormModel formModel,
032 String formPropertyPath, Map context)
033 {
034 final FileChooser chooser = (FileChooser) control;
035 if (useFile)
036 {
037 return new FileChooserBinding(formModel, formPropertyPath,
038 java.io.File.class, chooser, mode, this.useFile);
039 }
040 else
041 {
042 return new FileChooserBinding(formModel, formPropertyPath,
043 String.class, chooser, mode, this.useFile);
044 }
045 }
046
047 @SuppressWarnings("unchecked")
048 public Binding bind(FormModel formModel, String formPropertyPath,
049 Map context)
050 {
051 JComponent control = createControl(context);
052 Assert.notNull(control,
053 "This binder does not support creating a default control.");
054 return bind(control, formModel, formPropertyPath, context);
055 }
056
057 @SuppressWarnings("unchecked")
058 public Binding bind(JComponent control, FormModel formModel,
059 String formPropertyPath, Map context)
060 {
061 Binding binding = (Binding) control
062 .getClientProperty(BINDING_CLIENT_PROPERTY_KEY);
063 if (binding != null)
064 {
065 throw new IllegalStateException(
066 "Component is already bound to property: "
067 + binding.getProperty());
068 }
069 binding = doBind(control, formModel, formPropertyPath, context);
070 control.putClientProperty(BINDING_CLIENT_PROPERTY_KEY, binding);
071 return binding;
072 }
073
074 /**
075 * @param useFile <code>true</code> when used with {@link java.io.File}, <code>false</code> when used with {@link
076 * java.lang.String}
077 */
078 public void setUseFile(boolean useFile)
079 {
080 this.useFile = useFile;
081 }
082
083 /** @return <code>true</code> when the binder uses {@link java.io.File}, otherwise false; */
084 public boolean isUseFile()
085 {
086 return useFile;
087 }
088
089 /**
090 * @param mode Mode in which the control is to be used: <br/> <ul> <li>FileChooserMode.FILE: choose files</li>
091 * <li>FileChooserMode.FOLDER: choose folders</li> </ul>
092 */
093 public void setMode(FileChooser.FileChooserMode mode)
094 {
095 this.mode = mode;
096 }
097
098 /** @return The filechooser mode */
099 public FileChooser.FileChooserMode getMode()
100 {
101 return mode;
102 }
103
104 protected Class<?> getPropertyType(FormModel formModel, String formPropertyPath)
105 {
106 return formModel.getFieldMetadata(formPropertyPath).getPropertyType();
107 }
108 }