1 package com
.intellij
.util
.xml
.ui
.actions
.generate
;
3 import com
.intellij
.codeInsight
.CodeInsightActionHandler
;
4 import com
.intellij
.codeInsight
.generation
.actions
.BaseGenerateAction
;
5 import com
.intellij
.openapi
.application
.Result
;
6 import com
.intellij
.openapi
.command
.WriteCommandAction
;
7 import com
.intellij
.openapi
.editor
.Editor
;
8 import com
.intellij
.openapi
.project
.Project
;
9 import com
.intellij
.psi
.PsiElement
;
10 import com
.intellij
.psi
.PsiFile
;
11 import com
.intellij
.psi
.util
.PsiTreeUtil
;
12 import com
.intellij
.psi
.xml
.XmlFile
;
13 import com
.intellij
.psi
.xml
.XmlTag
;
14 import com
.intellij
.util
.xml
.DomElement
;
15 import com
.intellij
.util
.xml
.DomManager
;
16 import org
.jetbrains
.annotations
.Nullable
;
19 * User: Sergey.Vasiliev
21 public class GenerateDomElementAction
extends BaseGenerateAction
{
23 protected final GenerateDomElementProvider myProvider
;
25 public GenerateDomElementAction(final GenerateDomElementProvider generateProvider
) {
26 super(new CodeInsightActionHandler() {
27 public void invoke(final Project project
, final Editor editor
, final PsiFile file
) {
28 new WriteCommandAction(project
, file
) {
29 protected void run(final Result result
) throws Throwable
{
30 final DomElement element
= generateProvider
.generate(project
, editor
, file
);
31 generateProvider
.navigate(element
);
36 public boolean startInWriteAction() {
41 getTemplatePresentation().setDescription(generateProvider
.getDescription());
42 getTemplatePresentation().setText(generateProvider
.getDescription());
44 myProvider
= generateProvider
;
48 protected DomElement
getContextElement(final Project project
, final Editor editor
, final PsiFile file
) {
49 if (!(file
instanceof XmlFile
)) {
53 int offset
= editor
.getCaretModel().getOffset();
54 PsiElement element
= file
.findElementAt(offset
);
55 if (element
== null) return null;
57 XmlTag tag
= PsiTreeUtil
.getParentOfType(element
, XmlTag
.class);
59 final DomElement domElement
= DomManager
.getDomManager(project
).getDomElement(tag
);
60 if(domElement
!= null) return domElement
;
62 tag
= PsiTreeUtil
.getParentOfType(tag
, XmlTag
.class, true);
67 protected boolean isValidForFile(final Project project
, final Editor editor
, final PsiFile file
) {
68 final DomElement element
= getContextElement(project
, editor
, file
);
69 return element
!= null && myProvider
.isAvailableForElement(element
);