001 /*
002 * Copyright 2002-2004 the original author or authors.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
005 * use this file except in compliance with the License. You may obtain a copy of
006 * the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
012 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
013 * License for the specific language governing permissions and limitations under
014 * the License.
015 */
016 package org.springframework.richclient.form.binding.swing;
017
018 import org.springframework.core.enums.LabeledEnum;
019 import org.springframework.richclient.form.binding.Binder;
020 import org.springframework.richclient.form.binding.support.AbstractBinderSelectionStrategy;
021
022 import javax.swing.*;
023 import javax.swing.text.JTextComponent;
024 import java.util.HashMap;
025 import java.util.Map;
026
027 /**
028 * @author Oliver Hutchison
029 */
030 public class SwingBinderSelectionStrategy extends AbstractBinderSelectionStrategy
031 {
032
033 private Map<String, Binder> idBoundBinders = new HashMap<String, Binder>();
034
035 /*
036 * Default constructor.
037 */
038 public SwingBinderSelectionStrategy()
039 {
040 super(JTextField.class);
041 }
042
043 /**
044 * Set a map with predefined binders
045 *
046 * @param binders
047 */
048 public void setIdBoundBinders(Map binders)
049 {
050 this.idBoundBinders = binders;
051 }
052
053 /**
054 * Register additional map of id bound binders
055 *
056 * @param binders
057 */
058 public void registerIdBoundBinders(Map<String, Binder> binders)
059 {
060 idBoundBinders.putAll(binders);
061 }
062
063 /**
064 * Try to find a binder with a specified id. If no binder is found, try
065 * to locate it into the application context, check whether it's a binder and
066 * add it to the id bound binder map.
067 *
068 * @param id Id of the binder
069 * @return Binder or <code>null</code> if not found.
070 */
071 public Binder getIdBoundBinder(String id)
072 {
073 Binder binder = idBoundBinders.get(id);
074 if (binder == null) // try to locate the binder bean
075 {
076 Object binderBean = getApplicationContext().getBean(id);
077 if (binderBean instanceof Binder)
078 {
079 if (binderBean != null)
080 {
081 idBoundBinders.put(id, (Binder) binderBean);
082 binder = (Binder) binderBean;
083 }
084 }
085 else
086 {
087 throw new IllegalArgumentException("Bean '" + id + "' was found, but was not a binder");
088 }
089 }
090 return binder;
091 }
092
093 /**
094 * Select a binder based on a control type
095 *
096 * @param controlType Type of control
097 * @return The binder for that control
098 */
099 public Binder selectBinder(Class controlType)
100 {
101 return findBinderByControlType(controlType);
102 }
103
104 protected void registerDefaultBinders()
105 {
106 registerBinderForPropertyType(String.class, new TextComponentBinder());
107 registerBinderForPropertyType(boolean.class, new CheckBoxBinder());
108 registerBinderForPropertyType(Boolean.class, new CheckBoxBinder());
109 registerBinderForPropertyType(LabeledEnum.class, new LabeledEnumComboBoxBinder());
110 registerBinderForControlType(JTextComponent.class, new TextComponentBinder());
111 registerBinderForControlType(JFormattedTextField.class, new FormattedTextFieldBinder(null));
112 registerBinderForControlType(JTextArea.class, new TextAreaBinder());
113 registerBinderForControlType(JToggleButton.class, new ToggleButtonBinder());
114 registerBinderForControlType(JCheckBox.class, new CheckBoxBinder());
115 registerBinderForControlType(JComboBox.class, new ComboBoxBinder());
116 registerBinderForControlType(JList.class, new ListBinder());
117 registerBinderForControlType(JLabel.class, new LabelBinder());
118 registerBinderForControlType(JScrollPane.class, new ScrollPaneBinder(this, JTextArea.class));
119 }
120 }