From e871abb0e31ee3792ebccf78f81af350a192ab0c Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Tue, 28 Dec 2010 19:45:39 +0300 Subject: [PATCH] IDEA-20017: "insert...spring bean" does not respect caret location --- .../DefaultGenerateElementProvider.java | 44 +++++++++++++++---- 1 file changed, 36 insertions(+), 8 deletions(-) diff --git a/xml/dom-openapi/src/com/intellij/util/xml/actions/generate/DefaultGenerateElementProvider.java b/xml/dom-openapi/src/com/intellij/util/xml/actions/generate/DefaultGenerateElementProvider.java index 26e52176b0d0..25f768ca8db6 100644 --- a/xml/dom-openapi/src/com/intellij/util/xml/actions/generate/DefaultGenerateElementProvider.java +++ b/xml/dom-openapi/src/com/intellij/util/xml/actions/generate/DefaultGenerateElementProvider.java @@ -16,14 +16,19 @@ package com.intellij.util.xml.actions.generate; +import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiDocumentManager; +import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.xml.XmlElement; +import com.intellij.psi.xml.XmlTag; import com.intellij.util.ReflectionUtil; import com.intellij.util.xml.DomElement; -import com.intellij.util.xml.ui.actions.generate.GenerateDomElementProvider; +import com.intellij.util.xml.DomUtil; import com.intellij.util.xml.reflect.DomCollectionChildDescription; +import com.intellij.util.xml.ui.actions.generate.GenerateDomElementProvider; import org.jetbrains.annotations.Nullable; import java.util.List; @@ -32,7 +37,7 @@ import java.util.List; * User: Sergey.Vasiliev */ public abstract class DefaultGenerateElementProvider extends GenerateDomElementProvider { - private final Class myChildElementClass; + private final Class myChildElementClass; public DefaultGenerateElementProvider(final String name, Class childElementClass) { super(name); @@ -49,17 +54,40 @@ public abstract class DefaultGenerateElementProvider exten @Nullable protected abstract DomElement getParentDomElement(final Project project, final Editor editor, final PsiFile file); + @SuppressWarnings({"unchecked"}) @Nullable public T generate(@Nullable final DomElement parent, final Editor editor) { - if (parent != null) { - final List list = parent.getGenericInfo().getCollectionChildrenDescriptions(); + if (parent == null) { + return null; + } - for (DomCollectionChildDescription childDescription : list) { - if (ReflectionUtil.getRawType(childDescription.getType()).isAssignableFrom(myChildElementClass)) { - int index = getCollectionIndex(parent, childDescription, editor); + final List list = parent.getGenericInfo().getCollectionChildrenDescriptions(); - return index < 0 ? (T)childDescription.addValue(parent, myChildElementClass) : (T)childDescription.addValue(parent, myChildElementClass, index) ; + for (DomCollectionChildDescription childDescription : list) { + if (ReflectionUtil.getRawType(childDescription.getType()).isAssignableFrom(myChildElementClass)) { + + if (editor != null) { + int offset = editor.getCaretModel().getOffset(); + Document document = editor.getDocument(); + XmlTag parentTag = parent.getXmlTag(); + XmlTag childTag = parentTag.createChildTag(childDescription.getXmlElementName(), null, null, true); + String text = childTag.getText(); + document.insertString(offset, text); + Project project = editor.getProject(); + assert project != null; + PsiDocumentManager documentManager = PsiDocumentManager.getInstance(project); + documentManager.commitDocument(document); + PsiFile file = parentTag.getContainingFile(); + PsiElement element = file.findElementAt(offset + 1); + T domElement = DomUtil.findDomElement(element, myChildElementClass); + if (domElement != null) return domElement; + document.deleteString(offset, offset + text.length()); + documentManager.commitDocument(document); } + + int index = getCollectionIndex(parent, childDescription, editor); + + return index < 0 ? (T)childDescription.addValue(parent, myChildElementClass) : (T)childDescription.addValue(parent, myChildElementClass, index) ; } } return null;