/plugins/android/src/org/jetbrains/android/refactoring/AndroidInlineStyleReferenceAction.java

https://bitbucket.org/nbargnesi/idea
Java | 100 lines | 82 code | 15 blank | 3 comment | 15 complexity | 0418ceea27d64d6a5abb542480b46402 MD5 | raw file
  1. package org.jetbrains.android.refactoring;
  2. import com.intellij.openapi.project.Project;
  3. import com.intellij.psi.PsiElement;
  4. import com.intellij.psi.PsiFile;
  5. import com.intellij.psi.util.PsiTreeUtil;
  6. import com.intellij.psi.xml.XmlFile;
  7. import com.intellij.psi.xml.XmlTag;
  8. import com.intellij.refactoring.RefactoringBundle;
  9. import com.intellij.util.xml.DomElement;
  10. import com.intellij.util.xml.DomFileDescription;
  11. import com.intellij.util.xml.DomManager;
  12. import org.jetbrains.android.dom.converters.AndroidResourceReferenceBase;
  13. import org.jetbrains.android.dom.layout.LayoutDomFileDescription;
  14. import org.jetbrains.android.dom.resources.ResourcesDomFileDescription;
  15. import org.jetbrains.android.dom.resources.Style;
  16. import org.jetbrains.android.util.AndroidBundle;
  17. import org.jetbrains.android.util.AndroidUtils;
  18. import org.jetbrains.android.util.ProjectBasedErrorReporter;
  19. import org.jetbrains.annotations.NotNull;
  20. import org.jetbrains.annotations.TestOnly;
  21. /**
  22. * @author Eugene.Kudelevsky
  23. */
  24. public class AndroidInlineStyleReferenceAction extends AndroidBaseXmlRefactoringAction {
  25. public static final String ACTION_ID = "AndroidInlineStyleReferenceAction";
  26. private final AndroidInlineTestConfig myTestConfig;
  27. @TestOnly
  28. AndroidInlineStyleReferenceAction(AndroidInlineTestConfig testConfig) {
  29. myTestConfig = testConfig;
  30. }
  31. @SuppressWarnings("UnusedDeclaration")
  32. public AndroidInlineStyleReferenceAction() {
  33. myTestConfig = null;
  34. }
  35. @Override
  36. protected void doRefactorForTags(@NotNull Project project, @NotNull final XmlTag[] tags) {
  37. assert tags.length == 1;
  38. final XmlTag tag = tags[0];
  39. final PsiFile file = tag.getContainingFile();
  40. if (file == null) {
  41. return;
  42. }
  43. final StyleUsageData usageData = AndroidInlineUtil.getStyleUsageData(tag);
  44. if (usageData == null) {
  45. return;
  46. }
  47. final AndroidResourceReferenceBase reference = usageData.getReference();
  48. final String title = AndroidBundle.message("android.inline.style.title");
  49. final PsiElement[] styleElements = reference.computeTargetElements();
  50. if (styleElements.length == 0) {
  51. AndroidUtils.reportError(project, "Cannot find style by reference '" + reference.getValue() + "'", title);
  52. return;
  53. }
  54. if (styleElements.length > 1) {
  55. AndroidUtils.reportError(project, RefactoringBundle.getCannotRefactorMessage("Unambiguous style reference."), title);
  56. return;
  57. }
  58. final PsiElement styleElement = styleElements[0];
  59. final XmlTag styleTag = PsiTreeUtil.getParentOfType(styleElement, XmlTag.class);
  60. final DomElement domElement = styleTag != null ? DomManager.getDomManager(project).getDomElement(styleTag) : null;
  61. if (!(domElement instanceof Style)) {
  62. AndroidUtils.reportError(project, "Cannot find style by reference '" + reference.getValue() + "'", title);
  63. return;
  64. }
  65. final Style style = (Style)domElement;
  66. String styleName = style.getName().getStringValue();
  67. if (styleName == null) {
  68. AndroidUtils.reportError(project, RefactoringBundle.getCannotRefactorMessage("Style name is not specified."), title);
  69. return;
  70. }
  71. AndroidInlineUtil.doInlineStyleDeclaration(project, new AndroidInlineUtil.MyStyleData(styleName, style, styleElement),
  72. usageData,
  73. new ProjectBasedErrorReporter(project), myTestConfig);
  74. }
  75. @Override
  76. protected boolean isEnabledForTags(@NotNull XmlTag[] tags) {
  77. return tags.length == 1 && AndroidInlineUtil.getStyleUsageData(tags[0]) != null;
  78. }
  79. @Override
  80. protected boolean isMyFile(PsiFile file) {
  81. final DomFileDescription<?> description = DomManager.getDomManager(file.getProject()).getDomFileDescription((XmlFile)file);
  82. return description instanceof LayoutDomFileDescription ||
  83. description instanceof ResourcesDomFileDescription;
  84. }
  85. }