diff options
author | Eugene Kudelevsky <Eugene.Kudelevsky@jetbrains.com> | 2013-08-02 14:09:09 +0400 |
---|---|---|
committer | Eugene Kudelevsky <Eugene.Kudelevsky@jetbrains.com> | 2013-08-02 14:09:09 +0400 |
commit | 98b72fbcaeecb9399b62bb5f999db571bd4cbd2f (patch) | |
tree | 839949ce8790f0e187b5ea31c37d6f668601e459 | |
parent | cf4b9c136e3570e200299858683b3d7825170a6f (diff) | |
download | idea-98b72fbcaeecb9399b62bb5f999db571bd4cbd2f.tar.gz |
IDEA-102176 support navigation in platform xml: for parent styles and resource references in style items
5 files changed, 107 insertions, 11 deletions
diff --git a/android/src/org/jetbrains/android/dom/converters/AndroidResourceReferenceBase.java b/android/src/org/jetbrains/android/dom/converters/AndroidResourceReferenceBase.java index 82f9e42b056..a3d46601116 100644 --- a/android/src/org/jetbrains/android/dom/converters/AndroidResourceReferenceBase.java +++ b/android/src/org/jetbrains/android/dom/converters/AndroidResourceReferenceBase.java @@ -112,7 +112,7 @@ public class AndroidResourceReferenceBase extends PsiReferenceBase.Poly<XmlEleme if (resType == null) { return; } - ResourceManager manager = facet.getResourceManager(resValue.getPackage()); + ResourceManager manager = facet.getResourceManager(resValue.getPackage(), myElement); if (manager != null) { String resName = resValue.getResourceName(); if (resName != null) { diff --git a/android/src/org/jetbrains/android/dom/converters/StyleItemConverter.java b/android/src/org/jetbrains/android/dom/converters/StyleItemConverter.java index 96f6f19e412..aed49be7c73 100644 --- a/android/src/org/jetbrains/android/dom/converters/StyleItemConverter.java +++ b/android/src/org/jetbrains/android/dom/converters/StyleItemConverter.java @@ -39,10 +39,13 @@ import org.jetbrains.annotations.Nullable; */ public class StyleItemConverter extends WrappingConverter { @Nullable - private static ResolvingConverter findConverterForAttribute(String nsPrefix, String localName, @NotNull AndroidFacet facet) { + private static ResolvingConverter findConverterForAttribute(String nsPrefix, + String localName, + @NotNull AndroidFacet facet, + @NotNull GenericDomValue element) { ResourceManager manager = facet.getResourceManager("android".equals(nsPrefix) ? AndroidUtils.SYSTEM_RESOURCE_PACKAGE - : null); + : null, element.getXmlElement()); if (manager != null) { AttributeDefinitions attrDefs = manager.getAttributeDefinitions(); if (attrDefs != null) { @@ -66,7 +69,7 @@ public class StyleItemConverter extends WrappingConverter { if (facet != null) { String namespacePrefix = strs.length == 2 ? strs[0] : null; String localName = strs[strs.length - 1]; - return findConverterForAttribute(namespacePrefix, localName, facet); + return findConverterForAttribute(namespacePrefix, localName, facet, element); } } } diff --git a/android/src/org/jetbrains/android/facet/AndroidFacet.java b/android/src/org/jetbrains/android/facet/AndroidFacet.java index c6578799307..fba854815f5 100644 --- a/android/src/org/jetbrains/android/facet/AndroidFacet.java +++ b/android/src/org/jetbrains/android/facet/AndroidFacet.java @@ -17,8 +17,6 @@ package org.jetbrains.android.facet; import com.android.SdkConstants; import com.android.annotations.NonNull; -import com.android.build.gradle.model.BuildTypeContainer; -import com.android.build.gradle.model.ProductFlavorContainer; import com.android.build.gradle.model.Variant; import com.android.builder.model.SourceProvider; import com.android.ddmlib.AndroidDebugBridge; @@ -54,10 +52,7 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.projectRoots.SdkAdditionalData; import com.intellij.openapi.projectRoots.SdkModificator; -import com.intellij.openapi.roots.ModuleRootAdapter; -import com.intellij.openapi.roots.ModuleRootEvent; -import com.intellij.openapi.roots.ModuleRootManager; -import com.intellij.openapi.roots.OrderRootType; +import com.intellij.openapi.roots.*; import com.intellij.openapi.startup.StartupManager; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.Comparing; @@ -808,7 +803,43 @@ public final class AndroidFacet extends Facet<AndroidFacetConfiguration> { @Nullable public ResourceManager getResourceManager(@Nullable String resourcePackage) { - return SYSTEM_RESOURCE_PACKAGE.equals(resourcePackage) ? getSystemResourceManager() : getLocalResourceManager(); + return getResourceManager(resourcePackage, null); + } + + public ResourceManager getResourceManager(@Nullable String resourcePackage, @Nullable PsiElement contextElement) { + if (SYSTEM_RESOURCE_PACKAGE.equals(resourcePackage)) { + return getSystemResourceManager(); + } + if (contextElement != null && isInAndroidSdk(contextElement)) { + return getSystemResourceManager(); + } + return getLocalResourceManager(); + } + + private static boolean isInAndroidSdk(@NonNull PsiElement element) { + final PsiFile file = element.getContainingFile(); + + if (file == null) { + return false; + } + final VirtualFile vFile = file.getVirtualFile(); + + if (vFile == null) { + return false; + } + final ProjectFileIndex projectFileIndex = ProjectRootManager.getInstance(element.getProject()).getFileIndex(); + final List<OrderEntry> entries = projectFileIndex.getOrderEntriesForFile(vFile); + + for (OrderEntry entry : entries) { + if (entry instanceof JdkOrderEntry) { + final Sdk sdk = ((JdkOrderEntry)entry).getJdk(); + + if (sdk != null && sdk.getSdkType() instanceof AndroidSdkType) { + return true; + } + } + } + return false; } @NotNull diff --git a/android/testData/sdk1.5/platforms/android-1.5/data/res/values/resources.xml b/android/testData/sdk1.5/platforms/android-1.5/data/res/values/resources.xml index 64acfbd4586..352e6bbcf5d 100644 --- a/android/testData/sdk1.5/platforms/android-1.5/data/res/values/resources.xml +++ b/android/testData/sdk1.5/platforms/android-1.5/data/res/values/resources.xml @@ -3,6 +3,7 @@ <integer name="config_mediumAnimTime">400</integer> <style name="MediaButton"> + <item name="android:textColor">@color/my_white</item> <item name="android:background">@null</item> <item name="android:layout_width">71dip</item> <item name="android:layout_height">52dip</item> @@ -16,4 +17,6 @@ <style name="Theme.Holo1.Light"> </style> + + <color name="my_white">#ffffff</color> </resources>
\ No newline at end of file diff --git a/android/testSrc/org/jetbrains/android/dom/AndroidValueResourcesTest.java b/android/testSrc/org/jetbrains/android/dom/AndroidValueResourcesTest.java index 8a6df12899e..75763f1262f 100644 --- a/android/testSrc/org/jetbrains/android/dom/AndroidValueResourcesTest.java +++ b/android/testSrc/org/jetbrains/android/dom/AndroidValueResourcesTest.java @@ -22,13 +22,18 @@ import com.intellij.codeInsight.daemon.impl.HighlightInfo; import com.intellij.codeInsight.intention.IntentionAction; import com.intellij.codeInsight.navigation.actions.GotoDeclarationAction; import com.intellij.openapi.command.WriteCommandAction; +import com.intellij.openapi.editor.LogicalPosition; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.TextRange; +import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; 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.refactoring.actions.InlineAction; import com.intellij.refactoring.util.CommonRefactoringUtil; import org.jetbrains.android.dom.wrappers.LazyValueResourceElementWrapper; @@ -342,6 +347,60 @@ public class AndroidValueResourcesTest extends AndroidDomTest { doTestHighlighting(); } + public void testNavigationInPlatformXml1() throws Exception { + final VirtualFile file = LocalFileSystem.getInstance().findFileByPath( + getTestSdkPath() + "/platforms/" + getPlatformDir() + "/data/res/values/resources.xml"); + myFixture.configureFromExistingVirtualFile(file); + myFixture.getEditor().getCaretModel().moveToLogicalPosition(new LogicalPosition(14, 43)); + PsiElement[] targets = + GotoDeclarationAction.findAllTargetElements(myFixture.getProject(), myFixture.getEditor(), myFixture.getCaretOffset()); + assertNotNull(targets); + assertEquals(1, targets.length); + final PsiElement targetElement = LazyValueResourceElementWrapper.computeLazyElement(targets[0]); + assertInstanceOf(targetElement, XmlAttributeValue.class); + final XmlAttributeValue targetAttrValue = (XmlAttributeValue)targetElement; + assertEquals("Theme", targetAttrValue.getValue()); + assertEquals("name", ((XmlAttribute)targetAttrValue.getParent()).getName()); + assertEquals("style", ((XmlTag)targetAttrValue.getParent().getParent()).getName()); + assertEquals(file, targetElement.getContainingFile().getVirtualFile()); + } + + public void testNavigationInPlatformXml2() throws Exception { + final VirtualFile file = LocalFileSystem.getInstance().findFileByPath( + getTestSdkPath() + "/platforms/" + getPlatformDir() + "/data/res/values/resources.xml"); + myFixture.configureFromExistingVirtualFile(file); + myFixture.getEditor().getCaretModel().moveToLogicalPosition(new LogicalPosition(17, 17)); + PsiElement[] targets = + GotoDeclarationAction.findAllTargetElements(myFixture.getProject(), myFixture.getEditor(), myFixture.getCaretOffset()); + assertNotNull(targets); + assertEquals(1, targets.length); + final PsiElement targetElement = LazyValueResourceElementWrapper.computeLazyElement(targets[0]); + assertInstanceOf(targetElement, XmlAttributeValue.class); + final XmlAttributeValue targetAttrValue = (XmlAttributeValue)targetElement; + assertEquals("Theme", targetAttrValue.getValue()); + assertEquals("name", ((XmlAttribute)targetAttrValue.getParent()).getName()); + assertEquals("style", ((XmlTag)targetAttrValue.getParent().getParent()).getName()); + assertEquals(file, targetElement.getContainingFile().getVirtualFile()); + } + + public void testNavigationInPlatformXml3() throws Exception { + final VirtualFile file = LocalFileSystem.getInstance().findFileByPath( + getTestSdkPath() + "/platforms/" + getPlatformDir() + "/data/res/values/resources.xml"); + myFixture.configureFromExistingVirtualFile(file); + myFixture.getEditor().getCaretModel().moveToLogicalPosition(new LogicalPosition(5, 44)); + PsiElement[] targets = + GotoDeclarationAction.findAllTargetElements(myFixture.getProject(), myFixture.getEditor(), myFixture.getCaretOffset()); + assertNotNull(targets); + assertEquals(1, targets.length); + final PsiElement targetElement = LazyValueResourceElementWrapper.computeLazyElement(targets[0]); + assertInstanceOf(targetElement, XmlAttributeValue.class); + final XmlAttributeValue targetAttrValue = (XmlAttributeValue)targetElement; + assertEquals("my_white", targetAttrValue.getValue()); + assertEquals("name", ((XmlAttribute)targetAttrValue.getParent()).getName()); + assertEquals("color", ((XmlTag)targetAttrValue.getParent().getParent()).getName()); + assertEquals(file, targetElement.getContainingFile().getVirtualFile()); + } + private void doCreateValueResourceFromUsage(VirtualFile virtualFile) { myFixture.configureFromExistingVirtualFile(virtualFile); final List<HighlightInfo> infos = myFixture.doHighlighting(); |