001 package org.springframework.richclient.samples.showcase.binding;
002
003 import com.jgoodies.forms.layout.CellConstraints;
004 import com.jgoodies.forms.layout.FormLayout;
005 import org.springframework.richclient.application.ApplicationServicesLocator;
006 import org.springframework.richclient.command.ActionCommand;
007 import org.springframework.richclient.command.config.CommandConfigurer;
008 import org.springframework.richclient.dialog.TitledApplicationDialog;
009 import org.springframework.richclient.form.AbstractForm;
010 import org.springframework.richclient.form.FormModelHelper;
011 import org.springframework.richclient.form.binding.swing.TextComponentBinder;
012 import org.springframework.richclient.form.binding.swing.text.RegExDocumentFactory;
013 import org.springframework.richclient.form.builder.TableFormBuilder;
014
015 import javax.swing.*;
016 import java.util.Collections;
017
018 /**
019 * This dialog shows how the {@link org.springframework.richclient.form.binding.swing.TextComponentBinder} can be used to create
020 * a binding with a specific {@link javax.swing.text.Document} as model behind the {@link javax.swing.JTextField}.
021 *
022 * @author Jan Hoskens
023 */
024 public class DocumentBindingDialog extends TitledApplicationDialog {
025
026 class StringValues {
027
028 String regExp = "[0-9A-z]";
029
030 boolean convertToUppercase = false;
031
032 String value;
033
034 public String getValue() {
035 return value;
036 }
037
038 public void setValue(String value) {
039 this.value = value;
040 }
041
042 public String getRegExp() {
043 return regExp;
044 }
045
046 public void setRegExp(String regExp) {
047 this.regExp = regExp;
048 }
049
050 public boolean isConvertToUppercase() {
051 return convertToUppercase;
052 }
053
054 public void setConvertToUppercase(boolean convertToUppercase) {
055 this.convertToUppercase = convertToUppercase;
056 }
057
058 }
059
060 private class ParentForm extends AbstractForm {
061 private final JPanel childPanel = new JPanel(new FormLayout("fill:default:grow","fill:default:grow"));
062
063 public ParentForm() {
064 super(FormModelHelper.createFormModel(new StringValues()));
065 }
066
067 @Override
068 protected JComponent createFormControl() {
069 JPanel panel = new JPanel(new FormLayout("fill:default:grow","default, 4dlu, default, 4dlu, 30dlu:grow"));
070 TableFormBuilder builder = new TableFormBuilder(getBindingFactory());
071 builder.add("regExp");
072 builder.row();
073 builder.add("convertToUppercase");
074 CellConstraints cc = new CellConstraints();
075 panel.add(builder.getForm(), cc.xy(1,1));
076 panel.add(createBuildBindingCommand().createButton(), cc.xy(1,3));
077 panel.add(childPanel, cc.xy(1,5));
078 return panel;
079 }
080
081 private ActionCommand createBuildBindingCommand() {
082 ActionCommand actionCommand = new ActionCommand("buildBinding"){
083 protected void doExecuteCommand() {
084 String pattern = (String)getValue("regExp");
085 boolean upperCaseOnly = (Boolean) getValue("convertToUppercase");
086 CellConstraints cc = new CellConstraints();
087 ChildForm form = new ChildForm(pattern, upperCaseOnly);
088 childPanel.removeAll();
089 childPanel.add(form.getControl(), cc.xy(1,1));
090 childPanel.revalidate();
091
092 }
093 };
094 ((CommandConfigurer) ApplicationServicesLocator.services().getService(CommandConfigurer.class))
095 .configure(actionCommand);
096 return actionCommand;
097 }
098
099 private class ChildForm extends AbstractForm {
100
101 final String pattern;
102
103 final boolean upperCaseOnly;
104
105 public ChildForm(String pattern, boolean upperCaseOnly) {
106 super(FormModelHelper.createFormModel(new StringValues()));
107 this.pattern = pattern;
108 this.upperCaseOnly = upperCaseOnly;
109 }
110
111 protected JComponent createFormControl() {
112 TableFormBuilder builder = new TableFormBuilder(getBindingFactory());
113 TextComponentBinder binder = new TextComponentBinder();
114 binder.setDocumentFactory(new RegExDocumentFactory(pattern, upperCaseOnly));
115 builder.add(binder.bind(getFormModel(), "value", Collections.emptyMap()), "rowSpec=fill:default:grow");
116 return builder.getForm();
117 }
118 }
119 }
120
121 @Override
122 protected JComponent createTitledDialogContentPane() {
123 return (new ParentForm()).getControl();
124 }
125
126 @Override
127 protected boolean onFinish() {
128 return true;
129 }
130 }