--- core/src/resources/converters/BeanNameValueConverter.properties	Thu Aug 09 23:11:41 CEST 2007
+++ core/src/resources/converters/BeanNameValueConverter.properties	Thu Aug 09 23:11:41 CEST 2007
@@ -0,0 +1,9 @@
+org.springframework.aop.config.MethodLocatingFactoryBean#targetBeanName=
+org.springframework.aop.framework.ProxyFactoryBean#targetName=
+org.springframework.aop.scope.ScopedProxyFactoryBean#targetBeanName=
+org.springframework.aop.target.AbstractBeanFactoryBasedTargetSource#targetBeanName=
+org.springframework.beans.factory.config.BeanReferenceFactoryBean#targetBeanName=
+org.springframework.beans.factory.config.ObjectFactoryCreatingFactoryBean#targetBeanName=
+org.springframework.beans.factory.config.PropertyPathFactoryBean#targetBeanName=
+org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean#targetBeanName=
+org.springframework.web.filter.DelegatingFilterProxy#targetBeanName=
--- core/src/com/intellij/spring/model/values/ValueConvertersRegistry.java	(revision 10031)
+++ core/src/com/intellij/spring/model/values/ValueConvertersRegistry.java	Thu Aug 09 23:32:23 CEST 2007
@@ -9,6 +9,7 @@
 import com.intellij.openapi.util.Condition;
 import com.intellij.openapi.util.Pair;
 import com.intellij.psi.PsiType;
+import com.intellij.spring.model.converters.BeanNameValueConverter;
 import com.intellij.spring.model.values.converters.*;
 import com.intellij.util.xml.Converter;
 import com.intellij.util.xml.GenericDomValue;
@@ -70,6 +71,7 @@
     registerConverter(new ResourceValueConverter(), new ResourceValueConverter.ResourceValueConverterCondition());
     registerConverter(new FieldRetrievingFactoryBeanConverter(), new FieldRetrievingFactoryBeanConverter.FactoryClassAndPropertyCondition());
     registerConverter(new EnumValueConverter(), new EnumValueConverter.TypeCondition());
+    registerConverter(new BeanNameValueConverter(), new BeanNameValueConverter.ClassAndPropertyCondition());
   }
 
   public void registerConverter(@NotNull Converter<?> provider, @NotNull final PsiType type) {
--- core/src/com/intellij/spring/model/converters/BeanNameValueConverter.java	Thu Aug 09 23:20:58 CEST 2007
+++ core/src/com/intellij/spring/model/converters/BeanNameValueConverter.java	Thu Aug 09 23:20:58 CEST 2007
@@ -0,0 +1,117 @@
+package com.intellij.spring.model.converters;
+
+import com.intellij.codeInsight.lookup.LookupValueFactory;
+import com.intellij.openapi.diagnostic.Logger;
+import com.intellij.openapi.util.Condition;
+import com.intellij.openapi.util.Pair;
+import com.intellij.psi.PsiClass;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiFile;
+import com.intellij.psi.PsiReference;
+import com.intellij.psi.PsiReferenceBase;
+import com.intellij.psi.PsiType;
+import com.intellij.psi.impl.beanProperties.BeanProperty;
+import com.intellij.psi.xml.XmlFile;
+import com.intellij.spring.SpringManager;
+import com.intellij.spring.SpringModel;
+import com.intellij.spring.model.SpringUtils;
+import com.intellij.spring.model.xml.CommonSpringBean;
+import com.intellij.spring.model.xml.beans.SpringProperty;
+import com.intellij.util.xml.ConvertContext;
+import com.intellij.util.xml.Converter;
+import com.intellij.util.xml.CustomReferenceConverter;
+import com.intellij.util.xml.GenericDomValue;
+import org.jetbrains.annotations.NonNls;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+
+public class BeanNameValueConverter extends Converter<String> implements CustomReferenceConverter<String> {
+
+  private static final Logger LOG = Logger.getInstance("#com.intellij.spring.model.converters.BeanNameValueConverter");
+  @NonNls private static final String SEPARATOR = "#";
+  @NonNls private static final String FACTORIES_RESOURCE_XML = "/resources/converters/BeanNameValueConverter.properties";
+
+  private static final Properties CLASS_TO_PROPERTY_NAME = new Properties();
+
+  static {
+    final InputStream stream = BeanNameValueConverter.class.getResourceAsStream(FACTORIES_RESOURCE_XML);
+    if (stream != null) {
+      try {
+        CLASS_TO_PROPERTY_NAME.load(stream);
+      } catch (IOException e) {
+        LOG.error(e);
+      }
+    }
+  }
+
+  @NotNull
+  public PsiReference[] createReferences(final GenericDomValue<String> genericDomValue, final PsiElement element, final ConvertContext context) {
+    final String stringValue = genericDomValue.getStringValue();
+    return new PsiReference[]{
+        new PsiReferenceBase<PsiElement>(element, true) {
+          public Object[] getVariants() {
+            List lookups = new ArrayList();
+            final SpringModel model = getSpringModel(context);
+            if (model != null) {
+              final List<CommonSpringBean> list = SpringUtils.getAllBeans(model);
+              for (CommonSpringBean bean : list) {
+                final String beanName = bean.getBeanName();
+                if (beanName != null) {
+                  final PsiFile psiFile = SpringUtils.getContainingFile(bean);
+                  if (psiFile != null) {
+                    lookups.add(LookupValueFactory.createLookupValueWithHint(beanName, SpringUtils.getBeanIcon(bean), psiFile.getName()));
+                  }
+                }
+              }
+            }
+            return lookups.toArray(new Object[lookups.size()]);
+          }
+
+          public PsiElement resolve() {
+            final SpringModel model = getSpringModel(context);
+            if (model == null) return null;
+            final CommonSpringBean springBean = SpringUtils.findBeanByReferenceName(model, stringValue);
+            return springBean == null ? null : SpringUtils.getPsiElement(springBean);
+          }
+
+          @Nullable
+          protected SpringModel getSpringModel(final ConvertContext context) {
+            final XmlFile xmlFile = context.getFile();
+            return SpringManager.getInstance(xmlFile.getProject()).getSpringModelByFile(xmlFile);
+          }
+        }
+    };
+  }
+
+
+  public String fromString(@Nullable @NonNls final String s, final ConvertContext context) {
+    return s;
+  }
+
+  public String toString(@Nullable final String s, final ConvertContext context) {
+    return s;
+  }
+
+  public static class ClassAndPropertyCondition implements Condition<Pair<PsiType, GenericDomValue>> {
+    @NonNls
+    public boolean value(final Pair<PsiType, GenericDomValue> pair) {
+      final GenericDomValue element = pair.getSecond();
+      final SpringProperty springProperty = element.getParentOfType(SpringProperty.class, false);
+      if (springProperty != null) {
+        final BeanProperty beanProperty = springProperty.getName().getValue();
+        if (beanProperty != null) {
+          final PsiClass containingClass = beanProperty.getMethod().getContainingClass();
+          final String key = containingClass.getQualifiedName() + SEPARATOR + beanProperty.getName();
+          return CLASS_TO_PROPERTY_NAME.containsKey(key);
+        }
+      }
+      return false;
+    }
+  }
+}
