From deda46528edd55ddd759704f8c5680c2db02316c Mon Sep 17 00:00:00 2001 From: Sergey Vasiliev Date: Wed, 9 Apr 2008 13:39:51 +0400 Subject: [PATCH] jsf generate templates added --- .../util/xml/impl/DomTemplateRunnerImpl.java | 49 +++++++++++++++++++ .../generate/AbstractDomGenerateProvider.java | 56 ++++++++++++++++++++++ .../generate/DefaultGenerateElementProvider.java | 3 +- .../xml/actions/generate/DomTemplateRunner.java | 18 +++++++ resources/src/componentSets/Core.xml | 5 ++ 5 files changed, 130 insertions(+), 1 deletion(-) create mode 100644 dom/impl/src/com/intellij/util/xml/impl/DomTemplateRunnerImpl.java create mode 100644 dom/openapi/src/com/intellij/util/xml/actions/generate/AbstractDomGenerateProvider.java rename dom/openapi/src/com/intellij/util/xml/{ui => }/actions/generate/DefaultGenerateElementProvider.java (95%) create mode 100644 dom/openapi/src/com/intellij/util/xml/actions/generate/DomTemplateRunner.java diff --git a/dom/impl/src/com/intellij/util/xml/impl/DomTemplateRunnerImpl.java b/dom/impl/src/com/intellij/util/xml/impl/DomTemplateRunnerImpl.java new file mode 100644 index 0000000000..bdb6aa029f --- /dev/null +++ b/dom/impl/src/com/intellij/util/xml/impl/DomTemplateRunnerImpl.java @@ -0,0 +1,49 @@ +package com.intellij.util.xml.impl; + +import com.intellij.codeInsight.template.Template; +import com.intellij.codeInsight.template.TemplateManager; +import com.intellij.codeInsight.template.impl.TemplateSettings; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.editor.Editor; +import com.intellij.psi.PsiDocumentManager; +import com.intellij.psi.xml.XmlTag; +import com.intellij.util.xml.DomElement; +import com.intellij.util.xml.actions.generate.DomTemplateRunner; +import org.jetbrains.annotations.Nullable; + +/** + * User: Sergey.Vasiliev + */ +public class DomTemplateRunnerImpl extends DomTemplateRunner { + private Project myProject; + + public DomTemplateRunnerImpl(Project project) { + myProject = project; + } + + public void runTemplate(final T t, final String mappingId, final Editor editor) { + final Template template = getTemplate(mappingId); + runTemplate(t, editor, template); + } + + public void runTemplate(final T t, final Editor editor, @Nullable final Template template) { + if (template != null) { + DomElement copy = t.createStableCopy(); + PsiDocumentManager.getInstance(myProject).doPostponedOperationsAndUnblockDocument(editor.getDocument()); + XmlTag tag = copy.getXmlTag(); + assert tag != null; + editor.getCaretModel().moveToOffset(tag.getTextRange().getStartOffset()); + copy.undefine(); + + PsiDocumentManager.getInstance(myProject).doPostponedOperationsAndUnblockDocument(editor.getDocument()); + + template.setToReformat(true); + TemplateManager.getInstance(myProject).startTemplate(editor, template); + } + } + + @Nullable + protected Template getTemplate(final String mappingId) { + return mappingId != null ? TemplateSettings.getInstance().getTemplateById(mappingId) : null; + } +} \ No newline at end of file diff --git a/dom/openapi/src/com/intellij/util/xml/actions/generate/AbstractDomGenerateProvider.java b/dom/openapi/src/com/intellij/util/xml/actions/generate/AbstractDomGenerateProvider.java new file mode 100644 index 0000000000..5b378d2fd9 --- /dev/null +++ b/dom/openapi/src/com/intellij/util/xml/actions/generate/AbstractDomGenerateProvider.java @@ -0,0 +1,56 @@ +package com.intellij.util.xml.actions.generate; + +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.psi.PsiFile; +import com.intellij.psi.codeStyle.NameUtil; +import com.intellij.util.xml.DomElement; +import com.intellij.util.xml.DomElementNavigationProvider; +import org.jetbrains.annotations.Nullable; + +import java.util.Arrays; + +public abstract class AbstractDomGenerateProvider extends DefaultGenerateElementProvider { + + @Nullable private final String myMappingId; + + public AbstractDomGenerateProvider(final String description, final Class aClass) { + this(description, aClass, null); + } + + public AbstractDomGenerateProvider(final String description, final Class aClass, String mappingId) { + super(description, aClass); + myMappingId = mappingId; + } + + public T generate(final Project project, final Editor editor, final PsiFile file) { + final T t = super.generate(project, editor, file); + + runTemplate(editor, file, t); + + return t; + } + + protected void runTemplate(final Editor editor, final PsiFile file, final T t) { + DomTemplateRunner.getInstance(file.getProject()).runTemplate(t, myMappingId, editor); + } + + protected abstract DomElement getParentDomElement(final Project project, final Editor editor, final PsiFile file); + + protected void doNavigate(final DomElementNavigationProvider navigateProvider, final DomElement copy) { + final DomElement element = getElementToNavigate((T)copy); + if (element != null) { + super.doNavigate(navigateProvider, element); + } + } + + @Nullable + protected DomElement getElementToNavigate(final T t) { + return t; + } + + protected static String getDescription(final Class aClass) { + return StringUtil.join(Arrays.asList(NameUtil.nameToWords(aClass.getSimpleName())), " "); + } +} diff --git a/dom/openapi/src/com/intellij/util/xml/ui/actions/generate/DefaultGenerateElementProvider.java b/dom/openapi/src/com/intellij/util/xml/actions/generate/DefaultGenerateElementProvider.java similarity index 95% rename from dom/openapi/src/com/intellij/util/xml/ui/actions/generate/DefaultGenerateElementProvider.java rename to dom/openapi/src/com/intellij/util/xml/actions/generate/DefaultGenerateElementProvider.java index 0505960715..daaf4949ff 100644 --- a/dom/openapi/src/com/intellij/util/xml/ui/actions/generate/DefaultGenerateElementProvider.java +++ b/dom/openapi/src/com/intellij/util/xml/actions/generate/DefaultGenerateElementProvider.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.intellij.util.xml.ui.actions.generate; +package com.intellij.util.xml.actions.generate; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; @@ -22,6 +22,7 @@ import com.intellij.psi.PsiFile; import com.intellij.psi.xml.XmlElement; 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.reflect.DomCollectionChildDescription; import org.jetbrains.annotations.Nullable; diff --git a/dom/openapi/src/com/intellij/util/xml/actions/generate/DomTemplateRunner.java b/dom/openapi/src/com/intellij/util/xml/actions/generate/DomTemplateRunner.java new file mode 100644 index 0000000000..3982172cfb --- /dev/null +++ b/dom/openapi/src/com/intellij/util/xml/actions/generate/DomTemplateRunner.java @@ -0,0 +1,18 @@ +package com.intellij.util.xml.actions.generate; + +import com.intellij.openapi.project.Project; +import com.intellij.openapi.editor.Editor; +import com.intellij.util.xml.DomElement; + +/** + * User: Sergey.Vasiliev + */ +public abstract class DomTemplateRunner { + + public static DomTemplateRunner getInstance(Project project) { + return project.getComponent(DomTemplateRunner.class); + } + public abstract void runTemplate(final T t, final String mappingId, final Editor editor); + + +} diff --git a/resources/src/componentSets/Core.xml b/resources/src/componentSets/Core.xml index 2a54589932..aa652c2f0b 100644 --- a/resources/src/componentSets/Core.xml +++ b/resources/src/componentSets/Core.xml @@ -73,6 +73,11 @@ + com.intellij.util.xml.actions.generate.DomTemplateRunner + com.intellij.util.xml.impl.DomTemplateRunnerImpl + + + com.intellij.psi.impl.cache.impl.idCache.StdCacheBuilders -- 2.11.4.GIT