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 java.lang.reflect.Field; 019 import java.util.ArrayList; 020 import java.util.Collections; 021 import java.util.List; 022 023 import javax.swing.JCheckBox; 024 import javax.swing.JComboBox; 025 import javax.swing.JComponent; 026 import javax.swing.JLabel; 027 import javax.swing.JList; 028 import javax.swing.JTextField; 029 030 import org.springframework.beans.InvalidPropertyException; 031 import org.springframework.beans.support.SortDefinition; 032 import org.springframework.binding.form.support.DefaultFormModel; 033 import org.springframework.binding.support.TestBean; 034 import org.springframework.binding.value.ValueModel; 035 import org.springframework.binding.value.support.ObservableList; 036 import org.springframework.binding.value.support.ValueHolder; 037 import org.springframework.richclient.form.FormModelHelper; 038 import org.springframework.richclient.form.binding.swing.SwingBindingFactory.BeanPropertyEditorClosure; 039 import org.springframework.richclient.list.BeanPropertyValueListRenderer; 040 import org.springframework.richclient.test.SpringRichTestCase; 041 042 /** 043 * @author Oliver Hutchison 044 */ 045 public class SwingBindingFactoryTests extends SpringRichTestCase { 046 047 private SwingBindingFactory sbf; 048 049 public void doSetUp() { 050 sbf = new SwingBindingFactory(FormModelHelper.createFormModel(new TestBean())); 051 sbf.setBinderSelectionStrategy(new TestingBinderSelectionStrategy()); 052 } 053 054 public void testSwingBindingFactory() { 055 try { 056 new SwingBindingFactory(null); 057 fail("allowed null form model"); 058 } 059 catch (IllegalArgumentException e) { 060 // expected 061 } 062 } 063 064 public void testCreateBoundTextField() { 065 TestableBinding b = (TestableBinding)sbf.createBoundTextField("name"); 066 assertBindingProperties(b, JTextField.class, null, "name"); 067 assertEquals(Collections.EMPTY_MAP, b.getContext()); 068 } 069 070 public void testCreateBoundCheckBox() { 071 TestableBinding b = (TestableBinding)sbf.createBoundCheckBox("name"); 072 assertBindingProperties(b, JCheckBox.class, null, "name"); 073 assertEquals(Collections.EMPTY_MAP, b.getContext()); 074 } 075 076 public void testCreateBoundLabel() { 077 TestableBinding b = (TestableBinding)sbf.createBoundLabel("name"); 078 assertBindingProperties(b, JLabel.class, null, "name"); 079 assertEquals(Collections.EMPTY_MAP, b.getContext()); 080 } 081 082 public void testCreateBoundComboBoxString() { 083 TestableBinding b = (TestableBinding)sbf.createBoundComboBox("name"); 084 assertBindingProperties(b, JComboBox.class, null, "name"); 085 assertEquals(Collections.EMPTY_MAP, b.getContext()); 086 } 087 088 public void testCreateBoundComboBoxStringObjectArray() { 089 Object[] items = new Object[0]; 090 TestableBinding b = (TestableBinding)sbf.createBoundComboBox("name", items); 091 assertBindingProperties(b, JComboBox.class, null, "name"); 092 assertEquals(1, b.getContext().size(), 1); 093 assertEquals(items, b.getContext().get(ComboBoxBinder.SELECTABLE_ITEMS_KEY)); 094 } 095 096 public void testCreateBoundComboBoxStringValueModel() { 097 ValueModel valueHolder = new ValueHolder(); 098 TestableBinding b = (TestableBinding)sbf.createBoundComboBox("name", valueHolder); 099 assertBindingProperties(b, JComboBox.class, null, "name"); 100 assertEquals(1, b.getContext().size(), 1); 101 assertEquals(valueHolder, b.getContext().get(ComboBoxBinder.SELECTABLE_ITEMS_KEY)); 102 } 103 104 public void testCreateBoundComboBoxStringStringString() { 105 TestableBinding b = (TestableBinding)sbf.createBoundComboBox("name", "listProperty", "displayProperty"); 106 assertBindingProperties(b, JComboBox.class, null, "name"); 107 assertEquals(4, b.getContext().size()); 108 assertEquals(sbf.getFormModel().getValueModel("listProperty"), b.getContext().get( 109 ComboBoxBinder.SELECTABLE_ITEMS_KEY)); 110 assertEquals("displayProperty", 111 ((BeanPropertyValueListRenderer)b.getContext().get(ComboBoxBinder.RENDERER_KEY)).getPropertyName()); 112 assertEquals("displayProperty", 113 ((BeanPropertyEditorClosure)b.getContext().get(ComboBoxBinder.EDITOR_KEY)).getRenderedProperty()); 114 assertEquals("displayProperty", getComparatorProperty(b)); 115 116 try { 117 b = (TestableBinding)sbf.createBoundComboBox("name", "someUnknownProperty", "displayProperty"); 118 fail("cant use an unknown property to provide the selectable items"); 119 } 120 catch (InvalidPropertyException e) { 121 // expected 122 } 123 } 124 125 public void testCreateBoundComboBoxStringValueModelString() { 126 ValueModel selectableItemsHolder = new ValueHolder(new Object()); 127 TestableBinding b = (TestableBinding)sbf.createBoundComboBox("name", selectableItemsHolder, "displayProperty"); 128 assertBindingProperties(b, JComboBox.class, null, "name"); 129 assertEquals(4, b.getContext().size()); 130 assertEquals(selectableItemsHolder, b.getContext().get(ComboBoxBinder.SELECTABLE_ITEMS_KEY)); 131 assertEquals("displayProperty", 132 ((BeanPropertyValueListRenderer)b.getContext().get(ComboBoxBinder.RENDERER_KEY)).getPropertyName()); 133 assertEquals("displayProperty", 134 ((BeanPropertyEditorClosure)b.getContext().get(ComboBoxBinder.EDITOR_KEY)).getRenderedProperty()); 135 assertEquals("displayProperty", getComparatorProperty(b)); 136 } 137 138 public void testCreateBoundListModel() { 139 ValueModel vm = ((DefaultFormModel)sbf.getFormModel()).getFormObjectPropertyAccessStrategy().getPropertyValueModel( 140 "listProperty"); 141 ObservableList observableList = sbf.createBoundListModel("listProperty"); 142 143 ArrayList list = new ArrayList(); 144 list.add(new Integer(1)); 145 vm.setValue(list); 146 assertEquals(new Integer(1), observableList.get(0)); 147 observableList.add(new Integer(2)); 148 assertEquals(1, ((List)vm.getValue()).size()); 149 sbf.getFormModel().commit(); 150 assertEquals(new Integer(2), ((List)vm.getValue()).get(1)); 151 } 152 153 public void testCreateBoundListString() { 154 TestableBinding b = (TestableBinding)sbf.createBoundList("listProperty"); 155 assertBindingProperties(b, JList.class, null, "listProperty"); 156 157 assertEquals(1, b.getContext().size()); 158 } 159 160 public void testCreateBoundListStringObjectString() { 161 Object selectableItems = new Object(); 162 TestableBinding b = (TestableBinding)sbf.createBoundList("listProperty", selectableItems, "displayProperty"); 163 assertBindingProperties(b, JList.class, null, "listProperty"); 164 165 assertEquals(3, b.getContext().size()); 166 assertEquals(selectableItems, 167 ((ValueModel)b.getContext().get(ListBinder.SELECTABLE_ITEMS_KEY)).getValue()); 168 assertEquals("displayProperty", 169 ((BeanPropertyValueListRenderer)b.getContext().get(ListBinder.RENDERER_KEY)).getPropertyName()); 170 assertEquals("displayProperty", getComparatorProperty(b)); 171 assertFalse(b.getContext().containsKey(ListBinder.SELECTION_MODE_KEY)); 172 } 173 174 public void testCreateBoundListStringValueModelString() { 175 ValueModel selectableItemsHolder = new ValueHolder(new Object()); 176 TestableBinding b = (TestableBinding)sbf.createBoundList("listProperty", selectableItemsHolder, 177 "displayProperty"); 178 assertBindingProperties(b, JList.class, null, "listProperty"); 179 180 assertEquals(3, b.getContext().size()); 181 assertEquals(selectableItemsHolder, b.getContext().get(ListBinder.SELECTABLE_ITEMS_KEY)); 182 assertEquals("displayProperty", 183 ((BeanPropertyValueListRenderer)b.getContext().get(ListBinder.RENDERER_KEY)).getPropertyName()); 184 assertEquals("displayProperty", getComparatorProperty(b)); 185 assertFalse(b.getContext().containsKey(ListBinder.SELECTION_MODE_KEY)); 186 } 187 188 private void assertBindingProperties(TestableBinding b, Class controlType, JComponent control, String property) { 189 assertEquals(b.getControlType(), controlType); 190 assertEquals(b.getControl(), control); 191 assertEquals(b.getFormModel(), sbf.getFormModel()); 192 assertEquals(b.getProperty(), property); 193 } 194 195 private String getComparatorProperty(TestableBinding b) { 196 // TODO: remove this nasty reflection once PropertyComparator is extended with the abbility 197 // to query the SortDefinition 198 return ((SortDefinition)getField(b.getContext().get(ListBinder.COMPARATOR_KEY), 199 "sortDefinition")).getProperty(); 200 } 201 202 private Object getField(Object source, String fieldName) { 203 try { 204 Field field = source.getClass().getDeclaredField(fieldName); 205 field.setAccessible(true); 206 return field.get(source); 207 } 208 catch (Exception e) { 209 fail(e.toString()); 210 return null; 211 } 212 } 213 }