summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEugene Kudelevsky <Eugene.Kudelevsky@jetbrains.com>2013-08-02 14:09:09 +0400
committerEugene Kudelevsky <Eugene.Kudelevsky@jetbrains.com>2013-08-02 14:09:09 +0400
commit98b72fbcaeecb9399b62bb5f999db571bd4cbd2f (patch)
tree839949ce8790f0e187b5ea31c37d6f668601e459
parentcf4b9c136e3570e200299858683b3d7825170a6f (diff)
downloadidea-98b72fbcaeecb9399b62bb5f999db571bd4cbd2f.tar.gz
IDEA-102176 support navigation in platform xml: for parent styles and resource references in style items
-rw-r--r--android/src/org/jetbrains/android/dom/converters/AndroidResourceReferenceBase.java2
-rw-r--r--android/src/org/jetbrains/android/dom/converters/StyleItemConverter.java9
-rw-r--r--android/src/org/jetbrains/android/facet/AndroidFacet.java45
-rw-r--r--android/testData/sdk1.5/platforms/android-1.5/data/res/values/resources.xml3
-rw-r--r--android/testSrc/org/jetbrains/android/dom/AndroidValueResourcesTest.java59
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();