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 }