blob: 6f0200c7ce2d33d00167d222ad71680143daadd2 [file] [log] [blame]
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;
}
}