001 package org.springframework.richclient.samples.dataeditor.ui;
002
003 import com.jgoodies.forms.layout.CellConstraints;
004 import com.jgoodies.forms.layout.FormLayout;
005 import com.l2fprod.common.propertysheet.AbstractProperty;
006 import com.l2fprod.common.propertysheet.Property;
007 import com.l2fprod.common.propertysheet.PropertySheetTable;
008 import com.l2fprod.common.propertysheet.PropertySheetTableModel;
009 import com.l2fprod.common.swing.renderer.DefaultCellRenderer;
010 import org.apache.commons.lang.builder.ToStringBuilder;
011 import org.apache.commons.lang.builder.ToStringStyle;
012 import org.springframework.context.support.ClassPathXmlApplicationContext;
013 import org.springframework.richclient.application.Application;
014 import org.springframework.richclient.command.AbstractCommand;
015 import org.springframework.richclient.core.Message;
016 import org.springframework.richclient.dialog.TitledWidgetApplicationDialog;
017 import org.springframework.richclient.form.AbstractForm;
018 import org.springframework.richclient.form.SimpleValidationResultsReporter;
019 import org.springframework.richclient.widget.AbstractTitledWidget;
020 import org.springframework.util.StringUtils;
021
022 import javax.swing.*;
023 import java.awt.event.WindowAdapter;
024 import java.awt.event.WindowEvent;
025 import java.beans.PropertyChangeEvent;
026 import java.beans.PropertyChangeListener;
027 import java.util.ArrayList;
028 import java.util.List;
029
030 public class FormTester
031 {
032 private FormTester(String context)
033 {
034 Application.load((Application) new ClassPathXmlApplicationContext(context).getBean("application"));
035 }
036
037 public static FormTester createFormTesterWithContext(String context)
038 {
039 return new FormTester(context);
040 }
041
042 public void showFormDialog(final AbstractForm form, boolean modal)
043 {
044 AbstractTitledWidget widget = new AbstractTitledWidget()
045 {
046 @Override
047 public JComponent createWidgetContent()
048 {
049 final JTextArea area = new JTextArea(20,40);
050 area.setLineWrap(true);
051 area.setWrapStyleWord(true);
052 form.getFormModel().addPropertyChangeListener(new PropertyChangeListener()
053 {
054 public void propertyChange(PropertyChangeEvent evt)
055 {
056 area.append(evt.getPropertyName() + ": " + evt.getOldValue() + " -> " + evt.getNewValue() + "\n");
057 }
058 });
059 JPanel panel = new JPanel(new FormLayout("fill:pref:nogrow,fill:5dlu:nogrow, fill:pref:grow", "fill:pref:grow"));
060 panel.add(form.getControl(), new CellConstraints(1, 1));
061 JTabbedPane pane = new JTabbedPane();
062 pane.addTab("Properties", new JScrollPane(area));
063 final PropertySheetTableModel propertySheetTableModel = new PropertySheetTableModel();
064 for(final Object property : form.getFormModel().getFieldNames())
065 {
066 Property p = new AbstractProperty()
067 {
068 public String getName()
069 {
070 return property.toString();
071 }
072
073 public String getDisplayName()
074 {
075 return property.toString();
076 }
077
078 public String getShortDescription()
079 {
080 return property.toString();
081 }
082
083 public Class getType()
084 {
085 return form.getFormModel().getFieldMetadata(property.toString()).getPropertyType();
086 }
087
088 public boolean isEditable()
089 {
090 return false;
091 }
092
093 public String getCategory()
094 {
095 return form.getFormModel().getId();
096 }
097
098 public Object getValue()
099 {
100 Object value = form.getFormModel().getValueModel(property.toString()).getValue();
101 if(value == null)
102 {
103 return "«null»";
104 }
105 else if(!StringUtils.hasText(value.toString()))
106 {
107 return "«empty string»";
108 }
109 else
110 {
111 return value;
112 }
113 }
114
115 public void readFromObject(Object o)
116 {
117 throw new UnsupportedOperationException("Method readFromObject not yet implemented");
118 }
119
120 public void writeToObject(Object o)
121 {
122 throw new UnsupportedOperationException("Method writeToObject not yet implemented");
123 }
124 };
125 propertySheetTableModel.addProperty(p);
126 }
127 final PropertySheetTable table = new PropertySheetTable(propertySheetTableModel);
128 new Thread(new Runnable()
129 {
130 public void run()
131 {
132 while(true)
133 {
134 SwingUtilities.invokeLater(new Runnable()
135 {
136 public void run()
137 {
138 propertySheetTableModel.fireTableDataChanged();
139 //table.repaint();
140 }
141 });
142 try
143 {
144 Thread.sleep(500);
145 }
146 catch (InterruptedException e)
147 {
148 e.printStackTrace();
149 }
150 }
151 }
152 }).start();
153 pane.addTab("Valuemodels", new JScrollPane(table));
154 final JTextArea objectArea = new JTextArea(20,40);
155 objectArea.setLineWrap(true);
156 objectArea.setWrapStyleWord(true);
157 new Thread(new Runnable()
158 {
159 public void run()
160 {
161 while(true)
162 {
163 SwingUtilities.invokeLater(new Runnable()
164 {
165 public void run()
166 {
167 objectArea.setText(ToStringBuilder.reflectionToString(form.getFormObject(), ToStringStyle.MULTI_LINE_STYLE));
168 }
169 });
170 try
171 {
172 Thread.sleep(500);
173 }
174 catch (InterruptedException e)
175 {
176 e.printStackTrace();
177 }
178 }
179 }
180 }).start();
181 pane.addTab("Form object", new JScrollPane(objectArea));
182 final JList validationList = new JList();
183 validationList.setCellRenderer(new DefaultCellRenderer()
184 {
185 @Override
186 protected String convertToString(Object o)
187 {
188 if (o instanceof Message)
189 {
190 Message message = (Message) o;
191 return message.getSeverity() + ": " + message.getMessage();
192 }
193 return o.toString();
194 }
195 });
196 new Thread(new Runnable()
197 {
198 public void run()
199 {
200 while(true)
201 {
202 SwingUtilities.invokeLater(new Runnable()
203 {
204 public void run()
205 {
206 validationList.setListData(form.getFormModel().getValidationResults().getMessages().toArray());
207 }
208 });
209 try
210 {
211 Thread.sleep(500);
212 }
213 catch (InterruptedException e)
214 {
215 e.printStackTrace();
216 }
217 }
218 }
219 }).start();
220 pane.addTab("Validations", new JScrollPane(validationList));
221 panel.add(pane, new CellConstraints(3, 1));
222 return panel;
223 }
224
225 @Override
226 public List<? extends AbstractCommand> getCommands()
227 {
228 List<AbstractCommand> commands = new ArrayList<AbstractCommand>();
229 commands.add(form.getCommitCommand());
230 commands.add(form.getRevertCommand());
231 return commands;
232 }
233 };
234 TitledWidgetApplicationDialog dialog = new TitledWidgetApplicationDialog(widget);
235 form.addValidationResultsReporter(new SimpleValidationResultsReporter(form.getFormModel().getValidationResults(), widget));
236 dialog.setTitle("Form test");
237 dialog.setModal(modal);
238 dialog.showDialog();
239 dialog.getParentWindow().addWindowListener(new WindowAdapter()
240 {
241 @Override
242 public void windowClosed(WindowEvent e)
243 {
244 System.exit(0);
245 }
246 });
247 }
248
249 public void showFormJFrame(final AbstractForm form)
250 {
251 JFrame frame = createJFrame(form);
252 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
253 frame.setVisible(true);
254 }
255
256 public JFrame createJFrame(final AbstractForm form)
257 {
258 AbstractTitledWidget widget = new AbstractTitledWidget()
259 {
260 @Override
261 public JComponent createWidgetContent()
262 {
263 form.getFormModel().addPropertyChangeListener(new PropertyChangeListener()
264 {
265 public void propertyChange(PropertyChangeEvent evt)
266 {
267 System.out.println(evt.getPropertyName() + ": " + evt.getOldValue() + " -> " + evt.getNewValue());
268 }
269 });
270 return form.getControl();
271 }
272
273 @Override
274 public List<? extends AbstractCommand> getCommands()
275 {
276 List<AbstractCommand> commands = new ArrayList<AbstractCommand>();
277 commands.add(form.getCommitCommand());
278 commands.add(form.getRevertCommand());
279 return commands;
280 }
281 };
282 form.addValidationResultsReporter(new SimpleValidationResultsReporter(form.getFormModel().getValidationResults(), widget));
283 JFrame frame = new JFrame();
284 frame.add(widget.getComponent());
285 return frame;
286 }
287 }