IDEA-13342
[fedora-idea.git] / dom / openapi / src / com / intellij / util / xml / ui / actions / generate / GenerateDomElementAction.java
blob1eb6a1722a3101fdf1e456405e7b36ca114a7522
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;
18 /**
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);
33 }.execute();
36 public boolean startInWriteAction() {
37 return false;
39 });
41 getTemplatePresentation().setDescription(generateProvider.getDescription());
42 getTemplatePresentation().setText(generateProvider.getDescription());
44 myProvider = generateProvider;
47 @Nullable
48 protected DomElement getContextElement(final Project project, final Editor editor, final PsiFile file) {
49 if (!(file instanceof XmlFile)) {
50 return null;
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);
58 while (tag != null) {
59 final DomElement domElement = DomManager.getDomManager(project).getDomElement(tag);
60 if(domElement != null) return domElement;
62 tag = PsiTreeUtil.getParentOfType(tag, XmlTag.class, true);
64 return null;
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);