001    /*
002     * Copyright 2002-2004 the original author or authors.
003     *
004     * Licensed under the Apache License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of 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,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    package org.springframework.richclient.form.binding.swing;
017    
018    import org.jdesktop.xswingx.PromptSupport;
019    import org.springframework.binding.form.FormModel;
020    import org.springframework.binding.value.ValueModel;
021    import org.springframework.binding.value.swing.AsYouTypeTextComponentAdapter;
022    import org.springframework.richclient.form.binding.support.AbstractBinding;
023    import org.springframework.richclient.util.RcpSupport;
024    import org.springframework.richclient.text.SelectAllFocusListener;
025    
026    import javax.swing.*;
027    import javax.swing.text.JTextComponent;
028    
029    /**
030     * @author Oliver Hutchison
031     */
032    public class TextComponentBinding extends AbstractBinding
033    {
034    
035        private final JTextComponent textComponent;
036        private boolean convertEmptyStringToNull;
037        private String promptKey;
038        private boolean readOnly;
039        private boolean selectAllOnFocus;
040    
041        public TextComponentBinding(JTextComponent textComponent, FormModel formModel, String formPropertyPath)
042        {
043            super(formModel, formPropertyPath, String.class);
044            this.textComponent = textComponent;
045        }
046    
047        protected JComponent doBindControl()
048        {
049            final ValueModel valueModel = getValueModel();
050            try
051            {
052                textComponent.setText((String) valueModel.getValue());
053            }
054            catch (ClassCastException e)
055            {
056                IllegalArgumentException ex = new IllegalArgumentException("Class cast exception converting '"
057                        + getProperty() + "' property value to string - did you install a type converter?");
058                ex.initCause(e);
059                throw ex;
060            }
061            if (getPromptKey() != null)
062                PromptSupport.setPrompt(RcpSupport.getMessage(getPromptKey()), textComponent);
063            new AsYouTypeTextComponentAdapter(textComponent, valueModel, convertEmptyStringToNull);
064            if(selectAllOnFocus)
065            {
066                textComponent.addFocusListener(new SelectAllFocusListener(textComponent));
067            }
068            return textComponent;
069        }
070    
071        public boolean isReadOnly()
072        {
073            return super.isReadOnly() || readOnly;
074        }
075    
076        public void setReadOnly(boolean readOnly)
077        {
078            this.readOnly = readOnly;
079        }
080    
081        protected void readOnlyChanged()
082        {
083            textComponent.setEditable(!isReadOnly());
084        }
085    
086        protected void enabledChanged()
087        {
088            textComponent.setEnabled(isEnabled());
089        }
090    
091        public String getPromptKey()
092        {
093            return promptKey;
094        }
095    
096        public void setPromptKey(String promptKey)
097        {
098            this.promptKey = promptKey;
099        }
100    
101        public boolean isConvertEmptyStringToNull()
102        {
103            return convertEmptyStringToNull;
104        }
105    
106        public void setConvertEmptyStringToNull(boolean convertEmptyStringToNull)
107        {
108            this.convertEmptyStringToNull = convertEmptyStringToNull;
109        }
110    
111        public boolean isSelectAllOnFocus()
112        {
113            return selectAllOnFocus;
114        }
115    
116        public void setSelectAllOnFocus(boolean selectAllOnFocus)
117        {
118            this.selectAllOnFocus = selectAllOnFocus;
119        }
120    }