From f453eac5b6faa0553d65d5f967445d3b27d78724 Mon Sep 17 00:00:00 2001 From: peter Date: Fri, 4 Dec 2015 14:46:35 +0100 Subject: [PATCH] IDEA-147808 Make "Change template data language" more discoverable --- .../ChangeTemplateDataLanguageAction.java | 16 +++--- .../src/idea/LangActions.xml | 6 +-- .../HtmlUnknownTagInspection.java | 49 +++++++++++++++++++ .../HtmlUnknownTagInspectionBase.java | 22 ++++++--- 4 files changed, 75 insertions(+), 18 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/psi/templateLanguages/ChangeTemplateDataLanguageAction.java b/platform/lang-impl/src/com/intellij/psi/templateLanguages/ChangeTemplateDataLanguageAction.java index 10174a1c72f7..1dbf37cb29d5 100644 --- a/platform/lang-impl/src/com/intellij/psi/templateLanguages/ChangeTemplateDataLanguageAction.java +++ b/platform/lang-impl/src/com/intellij/psi/templateLanguages/ChangeTemplateDataLanguageAction.java @@ -15,16 +15,17 @@ */ package com.intellij.psi.templateLanguages; +import com.intellij.lang.LangBundle; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.CommonDataKeys; -import com.intellij.openapi.actionSystem.PlatformDataKeys; +import com.intellij.openapi.options.ShowSettingsUtil; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.openapi.options.ShowSettingsUtil; -import com.intellij.psi.PsiManager; import com.intellij.psi.FileViewProvider; -import com.intellij.lang.LangBundle; +import com.intellij.psi.PsiManager; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; /** * @author peter @@ -60,7 +61,10 @@ public class ChangeTemplateDataLanguageAction extends AnAction { Project project = e.getData(CommonDataKeys.PROJECT); if (project == null) return; - final VirtualFile virtualFile = e.getData(CommonDataKeys.VIRTUAL_FILE); + editSettings(project, e.getData(CommonDataKeys.VIRTUAL_FILE)); + } + + public static void editSettings(@NotNull Project project, @Nullable final VirtualFile virtualFile) { final TemplateDataLanguageConfigurable configurable = new TemplateDataLanguageConfigurable(project); ShowSettingsUtil.getInstance().editConfigurable(project, configurable, new Runnable() { @Override @@ -71,6 +75,4 @@ public class ChangeTemplateDataLanguageAction extends AnAction { } }); } - - } diff --git a/platform/platform-resources/src/idea/LangActions.xml b/platform/platform-resources/src/idea/LangActions.xml index d9c93b9f312f..a71b4ca358ac 100644 --- a/platform/platform-resources/src/idea/LangActions.xml +++ b/platform/platform-resources/src/idea/LangActions.xml @@ -81,6 +81,8 @@ + + @@ -627,10 +629,6 @@ - - - - diff --git a/xml/impl/src/com/intellij/codeInspection/htmlInspections/HtmlUnknownTagInspection.java b/xml/impl/src/com/intellij/codeInspection/htmlInspections/HtmlUnknownTagInspection.java index 1b12d947a4ca..c9157185aaa2 100644 --- a/xml/impl/src/com/intellij/codeInspection/htmlInspections/HtmlUnknownTagInspection.java +++ b/xml/impl/src/com/intellij/codeInspection/htmlInspections/HtmlUnknownTagInspection.java @@ -16,13 +16,25 @@ package com.intellij.codeInspection.htmlInspections; +import com.intellij.codeInspection.LocalQuickFix; +import com.intellij.codeInspection.LocalQuickFixOnPsiElement; +import com.intellij.lang.LangBundle; +import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.psi.FileViewProvider; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.psi.templateLanguages.ChangeTemplateDataLanguageAction; +import com.intellij.psi.templateLanguages.ConfigurableTemplateLanguageFileViewProvider; +import com.intellij.psi.templateLanguages.TemplateLanguageFileViewProvider; +import com.intellij.psi.templateLanguages.TemplateLanguageUtil; import com.intellij.ui.DocumentAdapter; import com.intellij.ui.FieldPanel; import com.intellij.util.Function; import com.intellij.util.PlatformIcons; +import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -119,4 +131,41 @@ public class HtmlUnknownTagInspection extends HtmlUnknownTagInspectionBase { return result; } + + @Nullable + @Override + protected LocalQuickFix createChangeTemplateDataFix(PsiFile file) { + if (file != TemplateLanguageUtil.getTemplateFile(file)) return null; + + FileViewProvider vp = file.getViewProvider(); + if (vp instanceof ConfigurableTemplateLanguageFileViewProvider) { + final TemplateLanguageFileViewProvider viewProvider = (TemplateLanguageFileViewProvider)vp; + final String text = + LangBundle.message("quickfix.change.template.data.language.text", viewProvider.getTemplateDataLanguage().getDisplayName()); + + return new LocalQuickFixOnPsiElement(file) { + @NotNull + @Override + public String getText() { + return text; + } + + @Override + public void invoke(@NotNull Project project, + @NotNull PsiFile file, + @NotNull PsiElement startElement, + @NotNull PsiElement endElement) { + ChangeTemplateDataLanguageAction.editSettings(project, file.getVirtualFile()); + } + + @Nls + @NotNull + @Override + public String getFamilyName() { + return "Change template data language"; + } + }; + } + return null; + } } diff --git a/xml/xml-analysis-impl/src/com/intellij/codeInspection/htmlInspections/HtmlUnknownTagInspectionBase.java b/xml/xml-analysis-impl/src/com/intellij/codeInspection/htmlInspections/HtmlUnknownTagInspectionBase.java index 1da21a1b73a9..128ed54562b9 100644 --- a/xml/xml-analysis-impl/src/com/intellij/codeInspection/htmlInspections/HtmlUnknownTagInspectionBase.java +++ b/xml/xml-analysis-impl/src/com/intellij/codeInspection/htmlInspections/HtmlUnknownTagInspectionBase.java @@ -24,6 +24,7 @@ import com.intellij.codeInspection.XmlQuickFixFactory; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.Key; import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; import com.intellij.psi.html.HtmlTag; import com.intellij.psi.impl.source.html.dtd.HtmlElementDescriptorImpl; import com.intellij.psi.xml.XmlFile; @@ -38,6 +39,7 @@ import com.intellij.xml.util.XmlUtil; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; @@ -127,14 +129,15 @@ public class HtmlUnknownTagInspectionBase extends HtmlUnknownElementInspection { List quickfixes = new ArrayList(); quickfixes.add(action); if (isOnTheFly) { - LocalQuickFix fix; - if (startTagName.getContainingFile() instanceof XmlFile) { - fix = XmlQuickFixFactory.getInstance().createNSDeclarationIntentionFix(startTagName, "", null); + PsiFile file = startTagName.getContainingFile(); + if (file instanceof XmlFile) { + quickfixes.add(XmlQuickFixFactory.getInstance().createNSDeclarationIntentionFix(startTagName, "", null)); } - else { - fix = null; - } - ContainerUtil.addIfNotNull(fix, quickfixes); + + // People using non-HTML as their template data language (but having not changed this in the IDE) + // will most likely see 'unknown html tag' error, because HTML is usually the default. + // So if they check quick fixes for this error they'll discover Change Template Data Language feature. + ContainerUtil.addIfNotNull(quickfixes, createChangeTemplateDataFix(file)); } if (HtmlUtil.isHtml5Tag(name) && !HtmlUtil.hasNonHtml5Doctype(tag)) { quickfixes.add(new SwitchToHtml5WithHighPriorityAction()); @@ -152,4 +155,9 @@ public class HtmlUnknownTagInspectionBase extends HtmlUnknownElementInspection { } } } + + @Nullable + protected LocalQuickFix createChangeTemplateDataFix(PsiFile file) { + return null; + } }