From e0666433e4568d91da073f18c192ab10df7fb0fa Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Thu, 15 Nov 2012 23:20:08 +0100 Subject: [PATCH] improve extract style refactoring: use style where possible after is is extracted --- .../messages/AndroidBundle.properties | 3 +- plugins/android/src/META-INF/plugin.xml | 4 + .../jetbrains/android/dom/AndroidDomUtil.java | 32 +- .../refactoring/AndroidAttributeInfo.java | 6 +- .../AndroidExtractStyleAction.java | 35 +- .../AndroidFindStyleApplicationsAction.java | 203 +++++++++ .../AndroidFindStyleApplicationsDialog.form | 65 +++ .../AndroidFindStyleApplicationsDialog.java | 112 +++++ ...AndroidFindStyleApplicationsProcessor.java | 427 ++++++++++++++++++ .../refactoring/AndroidInlineUtil.java | 99 +--- .../refactoring/AndroidRefactoringUtil.java | 81 ++++ .../refactoring/ExtractStyleDialog.form | 16 +- .../refactoring/ExtractStyleDialog.java | 19 + .../refactoring/ViewStyleUsageData.java | 2 +- 14 files changed, 997 insertions(+), 107 deletions(-) create mode 100644 plugins/android/src/org/jetbrains/android/refactoring/AndroidFindStyleApplicationsAction.java create mode 100644 plugins/android/src/org/jetbrains/android/refactoring/AndroidFindStyleApplicationsDialog.form create mode 100644 plugins/android/src/org/jetbrains/android/refactoring/AndroidFindStyleApplicationsDialog.java create mode 100644 plugins/android/src/org/jetbrains/android/refactoring/AndroidFindStyleApplicationsProcessor.java create mode 100644 plugins/android/src/org/jetbrains/android/refactoring/AndroidRefactoringUtil.java diff --git a/plugins/android/resources/messages/AndroidBundle.properties b/plugins/android/resources/messages/AndroidBundle.properties index d8b2ae99664f..4eb47e0fa348 100644 --- a/plugins/android/resources/messages/AndroidBundle.properties +++ b/plugins/android/resources/messages/AndroidBundle.properties @@ -433,4 +433,5 @@ android.inline.file.inline.all.text=Inline &all references and remove the file android.inline.file.inline.this.text=Inline &this usage and keep the file android.inline.layout.title=Inline Android Layout android.facet.importing.notification.group=Importing Error -android.facet.importing.title=Error when importing module ''{0}'' \ No newline at end of file +android.facet.importing.title=Error when importing module ''{0}'' +android.find.style.applications.title=Use Style Where Possible diff --git a/plugins/android/src/META-INF/plugin.xml b/plugins/android/src/META-INF/plugin.xml index 4fc4d556122f..26ab099ae631 100644 --- a/plugins/android/src/META-INF/plugin.xml +++ b/plugins/android/src/META-INF/plugin.xml @@ -97,6 +97,10 @@ + + + JUnit diff --git a/plugins/android/src/org/jetbrains/android/dom/AndroidDomUtil.java b/plugins/android/src/org/jetbrains/android/dom/AndroidDomUtil.java index b121358700e3..8264c9690dde 100644 --- a/plugins/android/src/org/jetbrains/android/dom/AndroidDomUtil.java +++ b/plugins/android/src/org/jetbrains/android/dom/AndroidDomUtil.java @@ -20,14 +20,13 @@ import com.android.resources.ResourceType; import com.android.sdklib.SdkConstants; import com.intellij.openapi.module.Module; import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiReference; import com.intellij.psi.xml.XmlAttribute; +import com.intellij.psi.xml.XmlAttributeValue; import com.intellij.psi.xml.XmlTag; import com.intellij.util.ArrayUtil; import com.intellij.util.containers.HashMap; -import com.intellij.util.xml.Converter; -import com.intellij.util.xml.DomElement; -import com.intellij.util.xml.ResolvingConverter; -import com.intellij.util.xml.XmlName; +import com.intellij.util.xml.*; import org.jetbrains.android.dom.attrs.AttributeDefinition; import org.jetbrains.android.dom.attrs.AttributeDefinitions; import org.jetbrains.android.dom.attrs.AttributeFormat; @@ -358,4 +357,29 @@ public class AndroidDomUtil { } return class2Name.values(); } + + @Nullable + public static AndroidResourceReferenceBase getAndroidResourceReference(@Nullable GenericAttributeValue attribute, + boolean localOnly) { + if (attribute == null) { + return null; + } + + final ResourceValue resValue = attribute.getValue(); + if (resValue == null || (localOnly && resValue.getPackage() != null)) { + return null; + } + + final XmlAttributeValue value = attribute.getXmlAttributeValue(); + if (value == null) { + return null; + } + + for (PsiReference reference : value.getReferences()) { + if (reference instanceof AndroidResourceReferenceBase) { + return (AndroidResourceReferenceBase)reference; + } + } + return null; + } } diff --git a/plugins/android/src/org/jetbrains/android/refactoring/AndroidAttributeInfo.java b/plugins/android/src/org/jetbrains/android/refactoring/AndroidAttributeInfo.java index ad649f54877d..9e0d38bc53b8 100644 --- a/plugins/android/src/org/jetbrains/android/refactoring/AndroidAttributeInfo.java +++ b/plugins/android/src/org/jetbrains/android/refactoring/AndroidAttributeInfo.java @@ -1,5 +1,6 @@ package org.jetbrains.android.refactoring; +import com.android.sdklib.SdkConstants; import org.jetbrains.android.util.AndroidUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -16,8 +17,9 @@ class AndroidAttributeInfo { myPackage = aPackage; } - public boolean isSystem() { - return AndroidUtils.SYSTEM_RESOURCE_PACKAGE.equals(myPackage); + public String getNamespace() { + final boolean system = AndroidUtils.SYSTEM_RESOURCE_PACKAGE.equals(myPackage); + return system ? SdkConstants.NS_RESOURCES : null; } @NotNull diff --git a/plugins/android/src/org/jetbrains/android/refactoring/AndroidExtractStyleAction.java b/plugins/android/src/org/jetbrains/android/refactoring/AndroidExtractStyleAction.java index 552e88fcf2e4..63269b2d88a5 100644 --- a/plugins/android/src/org/jetbrains/android/refactoring/AndroidExtractStyleAction.java +++ b/plugins/android/src/org/jetbrains/android/refactoring/AndroidExtractStyleAction.java @@ -10,10 +10,11 @@ import com.intellij.openapi.command.WriteCommandAction; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleUtilCore; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Ref; import com.intellij.psi.PsiFile; import com.intellij.psi.xml.XmlAttribute; import com.intellij.psi.xml.XmlTag; -import com.intellij.util.ArrayUtil; +import com.intellij.util.ArrayUtilRt; import com.intellij.util.Processor; import com.intellij.util.containers.HashSet; import org.jetbrains.android.dom.AndroidDomUtil; @@ -106,6 +107,7 @@ public class AndroidExtractStyleAction extends AndroidBaseLayoutRefactoringActio final String styleName; final List styledAttributes; final Module chosenModule; + final boolean searchStyleApplications; if (testConfig == null) { final ExtractStyleDialog dialog = @@ -116,6 +118,7 @@ public class AndroidExtractStyleAction extends AndroidBaseLayoutRefactoringActio if (!dialog.isOK()) { return null; } + searchStyleApplications = dialog.isToSearchStyleApplications(); chosenModule = dialog.getChosenModule(); assert chosenModule != null; @@ -135,8 +138,10 @@ public class AndroidExtractStyleAction extends AndroidBaseLayoutRefactoringActio styledAttributes.add(attribute); } } + searchStyleApplications = false; } final boolean[] success = {false}; + final Ref