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 java.util.Date;
019
020 import javax.swing.JFormattedTextField;
021 import javax.swing.JFormattedTextField.AbstractFormatter;
022 import javax.swing.JFormattedTextField.AbstractFormatterFactory;
023 import javax.swing.text.DateFormatter;
024 import javax.swing.text.DefaultFormatter;
025 import javax.swing.text.NumberFormatter;
026
027 import org.apache.commons.logging.Log;
028 import org.apache.commons.logging.LogFactory;
029 import org.springframework.binding.value.swing.ValueCommitPolicy;
030 import org.springframework.util.Assert;
031
032 /**
033 *
034 * @author Keith Donald
035 */
036 public class FormatterFactory extends AbstractFormatterFactory {
037
038 private static final Log logger = LogFactory.getLog(FormatterFactory.class);
039
040 private ValueCommitPolicy valueCommitPolicy = ValueCommitPolicy.AS_YOU_TYPE;
041
042 private Class valueClass;
043
044 public FormatterFactory(Class valueClass) {
045 this(valueClass, ValueCommitPolicy.AS_YOU_TYPE);
046 }
047
048 public FormatterFactory(Class valueClass, ValueCommitPolicy policy) {
049 this.valueClass = valueClass;
050 setValueCommitPolicy(policy);
051 }
052
053 public void setValueCommitPolicy(ValueCommitPolicy policy) {
054 Assert.notNull(policy);
055 this.valueCommitPolicy = policy;
056 }
057
058 public AbstractFormatter getFormatter(JFormattedTextField source) {
059 Object value = source.getValue();
060 DefaultFormatter formatter;
061 if (value instanceof Date) {
062 formatter = new DateFormatter();
063 }
064 else if (value instanceof Number) {
065 formatter = new NumberFormatter();
066 }
067 else {
068 formatter = new DefaultFormatter();
069 }
070 if (logger.isDebugEnabled()) {
071 logger.debug("Factory returning new formatter " + formatter + " for text field " + source);
072 }
073 valueCommitPolicy.configure(source, formatter);
074 if (valueClass != null) {
075 formatter.setValueClass(valueClass);
076 }
077 else if (value != null) {
078 formatter.setValueClass(value.getClass());
079 }
080 return formatter;
081 }
082 }