package org.jetbrains.android.refactoring; import com.intellij.codeInsight.TargetElementUtilBase; import com.intellij.lang.Language; import com.intellij.lang.refactoring.InlineActionHandler; import com.intellij.lang.xml.XMLLanguage; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiReference; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.xml.XmlTag; import org.jetbrains.android.dom.converters.AndroidResourceReferenceBase; import org.jetbrains.android.facet.AndroidFacet; import org.jetbrains.android.util.ErrorReporter; import org.jetbrains.android.util.HintBasedErrorReporter; import org.jetbrains.android.util.ProjectBasedErrorReporter; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.TestOnly; /** * @author Eugene.Kudelevsky */ public class AndroidInlineStyleHandler extends InlineActionHandler { private static AndroidInlineTestConfig ourTestConfig; @TestOnly public static void setTestConfig(@Nullable AndroidInlineTestConfig testConfig) { ourTestConfig = testConfig; } @Override public boolean isEnabledForLanguage(Language l) { return l == XMLLanguage.INSTANCE; } @Override public boolean canInlineElement(PsiElement element) { return element != null && AndroidFacet.getInstance(element) != null && AndroidInlineUtil.getInlinableStyleDataFromContext(element) != null; } @Override public void inlineElement(Project project, final Editor editor, PsiElement element) { final AndroidInlineUtil.MyStyleData data = AndroidInlineUtil.getInlinableStyleDataFromContext(element); if (data != null) { final ErrorReporter reporter = editor != null ? new HintBasedErrorReporter(editor) : new ProjectBasedErrorReporter(project); StyleUsageData usageData = null; if (editor != null) { final PsiReference reference = TargetElementUtilBase.findReference(editor); if (reference instanceof AndroidResourceReferenceBase) { usageData = getUsageDataFromEditor(reference); } } AndroidInlineUtil.doInlineStyleDeclaration(project, data, usageData, reporter, ourTestConfig); } } @Nullable private static StyleUsageData getUsageDataFromEditor(@NotNull PsiReference reference) { final PsiElement usageElement = reference.getElement(); if (usageElement == null) { return null; } final XmlTag tag = PsiTreeUtil.getParentOfType(usageElement, XmlTag.class, false); return tag != null ? AndroidInlineUtil.getStyleUsageData(tag) : null; } }