001    /*
002     * Copyright 2002-2004 the original author or authors.
003     *
004     * Licensed under the Apache License, Version 2.0 (the "License"); you may not
005     * use this file except in compliance with the License. You may obtain a copy of
006     * the License at
007     *
008     * http://www.apache.org/licenses/LICENSE-2.0
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
012     * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
013     * License for the specific language governing permissions and limitations under
014     * the License.
015     */
016    package org.springframework.richclient.form;
017    
018    import org.springframework.binding.form.FormModel;
019    import org.springframework.binding.form.HierarchicalFormModel;
020    import org.springframework.binding.form.ValidatingFormModel;
021    import org.springframework.binding.form.support.DefaultFormModel;
022    import org.springframework.binding.validation.support.RulesValidator;
023    import org.springframework.binding.value.ValueModel;
024    import org.springframework.richclient.dialog.Messagable;
025    import org.springframework.rules.RulesSource;
026    
027    /**
028     * This provides a collection of useful functions for working with {@link FormModel}s.
029     *
030     * @author Keith Donald
031     * @author Jim Moore
032     */
033    public class FormModelHelper {
034    
035        public static ValidatingFormModel createFormModel(Object formObject, String formId) {
036            return createFormModel(formObject, true, formId);
037        }
038    
039        public static ValidatingFormModel createUnbufferedFormModel(Object formObject, String formId) {
040            return createFormModel(formObject, false, formId);
041        }
042    
043        public static ValidatingFormModel createFormModel(Object formObject, boolean bufferChanges, String formId) {
044            DefaultFormModel formModel = new DefaultFormModel(formObject, bufferChanges);
045            formModel.setId(formId);
046            return formModel;
047        }
048    
049        public static ValidatingFormModel createFormModel(Object formObject, boolean bufferChanges, RulesSource rulesSource,
050                                                          String formId) {
051            DefaultFormModel formModel = new DefaultFormModel(formObject, bufferChanges);
052            formModel.setId(formId);
053            formModel.setValidator(new RulesValidator(formModel, rulesSource));
054            return formModel;
055        }
056    
057        public static ValidatingFormModel createCompoundFormModel(Object formObject, String formId) {
058            DefaultFormModel model = new DefaultFormModel(formObject);
059            model.setId(formId);
060            return model;
061        }
062    
063        public static ValidatingFormModel createFormModel(ValueModel formObjectHolder) {
064            return createFormModel(formObjectHolder, true, null);
065        }
066    
067        public static ValidatingFormModel createFormModel(ValueModel formObjectHolder, String formId) {
068            return createFormModel(formObjectHolder, true, formId);
069        }
070    
071        public static ValidatingFormModel createUnbufferedFormModel(ValueModel formObjectHolder, String formId) {
072            return createFormModel(formObjectHolder, false, formId);
073        }
074    
075        public static ValidatingFormModel createFormModel(ValueModel formObjectHolder, boolean bufferChanges,
076                                                          String formId) {
077            DefaultFormModel formModel = new DefaultFormModel(formObjectHolder, bufferChanges);
078            formModel.setId(formId);
079            return formModel;
080        }
081    
082        public static ValidatingFormModel createCompoundFormModel(ValueModel formObjectHolder, String formId) {
083            DefaultFormModel model = new DefaultFormModel(formObjectHolder);
084            model.setId(formId);
085            return model;
086        }
087    
088        public static ValidatingFormModel createFormModel(Object formObject) {
089            return createFormModel(formObject, true);
090        }
091    
092        public static ValidatingFormModel createUnbufferedFormModel(Object formObject) {
093            return createFormModel(formObject, false);
094        }
095    
096        public static ValidatingFormModel createFormModel(Object formObject, boolean bufferChanges) {
097            return createFormModel(formObject, bufferChanges, null);
098        }
099    
100        public static HierarchicalFormModel createCompoundFormModel(Object formObject) {
101            return createCompoundFormModel(formObject, null);
102        }
103    
104        public static FormModel createChildPageFormModel(HierarchicalFormModel parentModel) {
105            return createChildPageFormModel(parentModel, null);
106        }
107    
108        public static ValidatingFormModel createChildPageFormModel(HierarchicalFormModel parentModel,
109                                                                   String childPageName) {
110            ValidatingFormModel child = createFormModel(parentModel.getFormObjectHolder());
111            child.setId(childPageName);
112            parentModel.addChild(child);
113            return child;
114        }
115    
116        /**
117         * Create a child form model nested by this form model identified by the
118         * provided name. The form object associated with the created child model is
119         * the value model at the specified parent property path.
120         *
121         * @param parentModel                 the model to create the FormModelHelper in
122         * @param childPageName               the name to associate the created FormModelHelper
123         *                                    with in the groupingModel
124         * @param childFormObjectPropertyPath the path into the groupingModel that
125         *                                    the FormModelHelper is for
126         *
127         * @return The child form model
128         */
129        public static ValidatingFormModel createChildPageFormModel(HierarchicalFormModel parentModel, String childPageName,
130                                                                   String childFormObjectPropertyPath) {
131            final ValueModel childValueModel = parentModel.getValueModel(childFormObjectPropertyPath);
132            return createChildPageFormModel(parentModel, childPageName, childValueModel);
133        }
134    
135        public static ValidatingFormModel createChildPageFormModel(HierarchicalFormModel parentModel, String childPageName,
136                                                                   ValueModel childFormObjectHolder) {
137            ValidatingFormModel child = createFormModel(childFormObjectHolder);
138            child.setId(childPageName);
139            parentModel.addChild(child);
140            return child;
141        }
142    
143        public static ValidationResultsReporter createSingleLineResultsReporter(ValidatingFormModel formModel,
144                                                                         Messagable messageReceiver) {
145            return new SimpleValidationResultsReporter(formModel.getValidationResults(), messageReceiver);
146        }
147    
148    
149        /**
150         * Returns the child of the formModel with the given page name.
151         *
152         * @param formModel     the parent model to get the child from
153         * @param childPageName the name of the child to retrieve
154         *
155         * @return null the child can not be found
156         *
157         * @throws IllegalArgumentException if childPageName or formModel are null
158         */
159        public static FormModel getChild(HierarchicalFormModel formModel, String childPageName) {
160            if (childPageName == null) throw new IllegalArgumentException("childPageName == null");
161            if (formModel == null) throw new IllegalArgumentException("formModel == null");
162    
163            final FormModel[] children = formModel.getChildren();
164    
165            if (children == null) return null;
166    
167            for (int i = 0; i < children.length; i++) {
168                final FormModel child = children[i];
169                if (childPageName.equals(child.getId())) return child;
170            }
171    
172            return null;
173        }
174    
175    }