001 /*
002 * Copyright 2002-2008 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.selection.binding;
017
018 import org.springframework.binding.form.FormModel;
019 import org.springframework.binding.value.ValueModel;
020 import org.springframework.richclient.form.binding.Binding;
021 import org.springframework.richclient.form.binding.support.AbstractBinder;
022 import org.springframework.richclient.selection.binding.support.LabelProvider;
023 import org.springframework.richclient.selection.binding.support.SimpleSelectField;
024
025 import javax.swing.JComponent;
026 import javax.swing.JLabel;
027 import javax.swing.ListCellRenderer;
028 import java.util.Comparator;
029 import java.util.Map;
030
031 /**
032 * Binder for <code>SelectField</code>.
033 * <p>
034 * The context can contain the following items:
035 * <ul>
036 * <li><code>SELECTABLE_ITEMS_HOLDER_KEY</code>: The ValueModel holding the collection of selectable items</li>
037 * <li><code>LABEL_PROVIDER_KEY</code>: the label provider to provide the text of a given item</li>
038 * <li><code>FILTERED_KEY</code>: boolean value indicating whether the selection dialog will contain a filter field. If
039 * this value is <code>true</code> and the filter properties are not given, the string representation of the item will
040 * be used as filter value.</li>
041 * <li><code>FILTER_PROPERTIES_KEY</code>: array of properties that will be used for filtering</li>
042 * <li><code>RENDERER_KEY</code>: custom ListCellRenderer that will be used in the selection dialog</li>
043 * </ul>
044 *
045 * @author Peter De Bruycker
046 */
047 public class ListSelectionDialogBinder extends AbstractBinder {
048
049 public static final String SELECTABLE_ITEMS_HOLDER_KEY = "selectableItemsHolder";
050
051 public static final String FILTER_PROPERTIES_KEY = "filterProperties";
052
053 public static final String FILTERED_KEY = "filtered";
054
055 public static final String RENDERER_KEY = "renderer";
056
057 public static final String COMPARATOR_KEY = "comparator";
058
059 public static final String LABEL_PROVIDER_KEY = "lavelProvider";
060
061 public static final String DESCRIPTION_KEY_KEY = "descriptionKey";
062
063 public static final String TITLE_KEY_KEY = "titleKey";
064
065 public static final String NULLABLE_KEY = "nullable";
066
067 private ValueModel selectableItemsHolder;
068
069 private String[] filterProperties;
070 private boolean filtered;
071 private LabelProvider labelProvider;
072 private ListCellRenderer renderer;
073 private Comparator comparator;
074 private String descriptionKey;
075 private String titleKey;
076 private boolean nullable = true;
077
078 public ListSelectionDialogBinder() {
079 super(null, new String[] { SELECTABLE_ITEMS_HOLDER_KEY, FILTER_PROPERTIES_KEY, FILTERED_KEY, RENDERER_KEY,
080 LABEL_PROVIDER_KEY, COMPARATOR_KEY, DESCRIPTION_KEY_KEY, TITLE_KEY_KEY, NULLABLE_KEY });
081 }
082
083 protected JComponent createControl(Map context) {
084 // not used
085 return new JLabel("dummy");
086 }
087
088 protected void applyContext(ListSelectionDialogBinding binding, Map context) {
089 if (context.containsKey(SELECTABLE_ITEMS_HOLDER_KEY)) {
090 binding.setSelectableItemsHolder((ValueModel) context.get(SELECTABLE_ITEMS_HOLDER_KEY));
091 } else if (selectableItemsHolder != null) {
092 binding.setSelectableItemsHolder(selectableItemsHolder);
093 }
094
095 if (context.containsKey(FILTER_PROPERTIES_KEY)) {
096 binding.setFilterProperties((String[]) context.get(FILTER_PROPERTIES_KEY));
097 } else if (filterProperties != null) {
098 binding.setFilterProperties(filterProperties);
099 }
100
101 if (context.containsKey(FILTERED_KEY)) {
102 binding.setFiltered(((Boolean) context.get(FILTERED_KEY)).booleanValue());
103 } else if (filterProperties != null) {
104 binding.setFiltered(filtered);
105 }
106
107 if (context.containsKey(RENDERER_KEY)) {
108 binding.setRenderer((ListCellRenderer) context.get(RENDERER_KEY));
109 } else if (renderer != null) {
110 binding.setRenderer(renderer);
111 }
112
113 if (context.containsKey(COMPARATOR_KEY)) {
114 binding.setComparator((Comparator) context.get(COMPARATOR_KEY));
115 } else if (comparator != null) {
116 binding.setComparator(comparator);
117 }
118
119 if (context.containsKey(LABEL_PROVIDER_KEY)) {
120 binding.setLabelProvider((LabelProvider) context.get(LABEL_PROVIDER_KEY));
121 } else if (labelProvider != null) {
122 binding.setLabelProvider(labelProvider);
123 }
124
125 if (context.containsKey(DESCRIPTION_KEY_KEY)) {
126 binding.setDescriptionKey((String) context.get(DESCRIPTION_KEY_KEY));
127 } else if (descriptionKey != null) {
128 binding.setDescriptionKey(descriptionKey);
129 }
130
131 if (context.containsKey(TITLE_KEY_KEY)) {
132 binding.setTitleKey((String) context.get(TITLE_KEY_KEY));
133 } else if (titleKey != null) {
134 binding.setTitleKey(titleKey);
135 }
136
137 if (context.containsKey(NULLABLE_KEY)) {
138 binding.setNullable(((Boolean) context.get(NULLABLE_KEY)).booleanValue());
139 } else {
140 binding.setNullable(nullable);
141 }
142 }
143
144 protected Binding doBind(JComponent notUsed, FormModel formModel, String formPropertyPath, Map context) {
145 ListSelectionDialogBinding binding = new ListSelectionDialogBinding(new SimpleSelectField(), formModel,
146 formPropertyPath);
147 applyContext(binding, context);
148
149 return binding;
150 }
151
152 public void setSelectableItemsHolder(ValueModel selectableItemsHolder) {
153 this.selectableItemsHolder = selectableItemsHolder;
154 }
155
156 public void setFilterProperties(String[] filterProperties) {
157 this.filterProperties = filterProperties;
158 }
159
160 public void setFiltered(boolean filtered) {
161 this.filtered = filtered;
162 }
163
164 public void setRenderer(ListCellRenderer renderer) {
165 this.renderer = renderer;
166 }
167
168 public void setLabelProvider(LabelProvider labelProvider) {
169 this.labelProvider = labelProvider;
170 }
171
172 public void setComparator(Comparator comparator) {
173 this.comparator = comparator;
174 }
175
176 public void setDescriptionKey(String descriptionKey) {
177 this.descriptionKey = descriptionKey;
178 }
179
180 public void setTitleKey(String titleKey) {
181 this.titleKey = titleKey;
182 }
183
184 /**
185 * May return null if no value is set!
186 *
187 * @return whether the field shall be nullable
188 */
189 public Boolean isNullable() {
190 return nullable;
191 }
192
193 public void setNullable(Boolean nullable) {
194 this.nullable = nullable;
195 }
196 }