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    }