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    }