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 }