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.text;
017    
018    import java.beans.PropertyChangeEvent;
019    import java.beans.PropertyChangeListener;
020    
021    import javax.swing.JComponent;
022    import javax.swing.text.JTextComponent;
023    
024    import org.springframework.binding.form.CommitListener;
025    import org.springframework.binding.form.FormModel;
026    import org.springframework.binding.value.CommitTrigger;
027    import org.springframework.richclient.form.builder.FormComponentInterceptor;
028    import org.springframework.richclient.form.builder.FormComponentInterceptorFactory;
029    import org.springframework.richclient.form.builder.support.AbstractFormComponentInterceptor;
030    
031    /**
032     * @author oliverh
033     */
034    public class TextComponentPopupInterceptorFactory implements FormComponentInterceptorFactory {
035    
036        public TextComponentPopupInterceptorFactory() {
037        }
038    
039        public FormComponentInterceptor getInterceptor(FormModel formModel) {
040            return new TextComponentPopupInterceptor(formModel);
041        }
042    
043        private class TextComponentPopupInterceptor extends AbstractFormComponentInterceptor implements
044                PropertyChangeListener, CommitListener {
045    
046            private CommitTrigger resetTrigger;
047    
048            protected TextComponentPopupInterceptor(FormModel formModel) {
049                super(formModel);
050            }
051    
052            public void processComponent(String propertyName, JComponent component) {
053                JComponent innerComp = getInnerComponent(component);
054                if (innerComp instanceof JTextComponent) {
055                    TextComponentPopup.attachPopup((JTextComponent)innerComp, getResetTrigger());
056                }
057                else if (innerComp instanceof TextComponentContainer) {
058                    TextComponentPopup.attachPopup(((TextComponentContainer)innerComp).getComponent(), getResetTrigger());
059                }
060            }
061    
062            private CommitTrigger getResetTrigger() {
063                if (resetTrigger == null) {
064                    resetTrigger = new CommitTrigger();
065                    registerListeners();
066                }
067                return resetTrigger;
068            }
069    
070            private void registerListeners() {
071                FormModel formModel = getFormModel();
072                formModel.addCommitListener(this);
073                formModel.getFormObjectHolder().addValueChangeListener(this);
074            }
075    
076            public void preCommit(FormModel formModel) {
077                // do nothing            
078            }
079    
080            public void postCommit(FormModel formModel) {
081                resetTrigger.commit();
082            }
083    
084            public void propertyChange(PropertyChangeEvent evt) {
085                resetTrigger.commit();
086            }
087    
088        }
089    }