aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTor Norbye <tnorbye@google.com>2011-03-11 17:23:41 -0800
committerAndroid Code Review <code-review@android.com>2011-03-11 17:23:41 -0800
commit087efd604957e0bd577edbb71e2631986f4f6488 (patch)
tree99660fe2bd20bfb6e29d2e6ffebc4dcca83ebc6d
parentd677414784d91761be1ddc5c994a0996240cea6b (diff)
parent87269bec9ec19e7308d2dc958235228dbd52827b (diff)
downloadsdk-087efd604957e0bd577edbb71e2631986f4f6488.zip
sdk-087efd604957e0bd577edbb71e2631986f4f6488.tar.gz
sdk-087efd604957e0bd577edbb71e2631986f4f6488.tar.bz2
Merge "XML code completion improvements"
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/AndroidContentAssist.java15
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiElementNode.java2
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiResourceAttributeNode.java25
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/manifest/model/UiElementNodeTest.java35
4 files changed, 68 insertions, 9 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/AndroidContentAssist.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/AndroidContentAssist.java
index 0309dc2..9bc09ec 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/AndroidContentAssist.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/AndroidContentAssist.java
@@ -29,6 +29,7 @@ import com.android.ide.eclipse.adt.internal.editors.layout.gle2.DomUtilities;
import com.android.ide.eclipse.adt.internal.editors.uimodel.UiAttributeNode;
import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
import com.android.ide.eclipse.adt.internal.editors.uimodel.UiFlagAttributeNode;
+import com.android.ide.eclipse.adt.internal.editors.uimodel.UiResourceAttributeNode;
import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
import com.android.sdklib.SdkConstants;
@@ -62,8 +63,6 @@ import java.util.regex.Pattern;
*/
public abstract class AndroidContentAssist implements IContentAssistProcessor {
- private static final String ATTRIBUTE_ICON_FILENAME = "attribute";
-
/** Regexp to detect a full attribute after an element tag.
* <pre>Syntax:
* name = "..." quoted string with all but < and "
@@ -353,6 +352,18 @@ public abstract class AndroidContentAssist implements IContentAssistProcessor {
}
}
}
+
+ if (choices == null && value.startsWith("@")) { //$NON-NLS-1$
+ // Special case: If the attribute value looks like a reference to a
+ // resource, offer to complete it, since in many cases our metadata
+ // does not correctly state whether a resource value is allowed. We don't
+ // offer these for an empty completion context, but if the user has
+ // actually typed "@", in that case list resource matches.
+ // For example, for android:minHeight this makes completion on @dimen/
+ // possible.
+ choices = UiResourceAttributeNode.computeResourceStringMatches(currentUiNode,
+ value);
+ }
}
if (choices == null) {
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiElementNode.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiElementNode.java
index b969d30..93b6baf 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiElementNode.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiElementNode.java
@@ -1546,7 +1546,7 @@ public class UiElementNode implements IPropertySource {
* e.g. SdkConstants.NS_RESOURCES
* @return The first prefix declared or the default "android" prefix.
*/
- private String lookupNamespacePrefix(Node node, String nsUri) {
+ public static String lookupNamespacePrefix(Node node, String nsUri) {
// Note: Node.lookupPrefix is not implemented in wst/xml/core NodeImpl.java
// The following code emulates this simple call:
// String prefix = node.lookupPrefix(SdkConstants.NS_RESOURCES);
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiResourceAttributeNode.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiResourceAttributeNode.java
index 1af04a8..9032b46 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiResourceAttributeNode.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/uimodel/UiResourceAttributeNode.java
@@ -16,7 +16,7 @@
package com.android.ide.eclipse.adt.internal.editors.uimodel;
-import static com.android.ide.common.layout.LayoutConstants.ANDROID_NS_NAME_PREFIX;
+import static com.android.ide.eclipse.adt.AdtConstants.ANDROID_PKG;
import com.android.ide.eclipse.adt.internal.editors.AndroidXmlEditor;
import com.android.ide.eclipse.adt.internal.editors.descriptors.AttributeDescriptor;
@@ -198,13 +198,15 @@ public class UiResourceAttributeNode extends UiTextAttributeNode {
*/
@Override
public String[] getPossibleValues(String prefix) {
+ return computeResourceStringMatches(getUiParent(), prefix);
+ }
+
+ public static String[] computeResourceStringMatches(UiElementNode uiNode, String prefix) {
ResourceRepository repository = null;
boolean isSystem = false;
-
- UiElementNode uiNode = getUiParent();
AndroidXmlEditor editor = uiNode.getEditor();
- if (prefix == null || !prefix.contains(ANDROID_NS_NAME_PREFIX)) {
+ if (prefix == null || !prefix.regionMatches(1, ANDROID_PKG, 0, ANDROID_PKG.length())) {
IProject project = editor.getProject();
if (project != null) {
// get the resource repository for this project and the system resources.
@@ -242,12 +244,23 @@ public class UiResourceAttributeNode extends UiTextAttributeNode {
// resource types.
for (ResourceType resType : resTypes) {
- results.add("@" + resType.getName() + "/"); //$NON-NLS-1$ //$NON-NLS-2$
+ if (isSystem) {
+ results.add("@" + ANDROID_PKG + ':' + resType.getName() + "/"); //$NON-NLS-1$ //$NON-NLS-2$
+ } else {
+ results.add("@" + resType.getName() + "/"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
if (resType == ResourceType.ID) {
// Also offer the + version to create an id from scratch
results.add("@+" + resType.getName() + "/"); //$NON-NLS-1$ //$NON-NLS-2$
}
}
+
+ // Also add in @android: prefix to completion such that if user has typed
+ // "@an" we offer to complete it.
+ if (prefix == null ||
+ ANDROID_PKG.regionMatches(0, prefix, 1, prefix.length() - 1)) {
+ results.add('@' + ANDROID_PKG + ':');
+ }
} else if (repository != null) {
// We have a style name and a repository. Find all resources that match this
// type and recreate suggestions out of them.
@@ -261,7 +274,7 @@ public class UiResourceAttributeNode extends UiTextAttributeNode {
}
if (isSystem) {
- sb.append(ANDROID_NS_NAME_PREFIX);
+ sb.append(ANDROID_PKG).append(':');
}
sb.append(typeName).append('/');
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/manifest/model/UiElementNodeTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/manifest/model/UiElementNodeTest.java
index 30f709c..ccf4e83 100644
--- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/manifest/model/UiElementNodeTest.java
+++ b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/manifest/model/UiElementNodeTest.java
@@ -16,15 +16,24 @@
package com.android.ide.eclipse.adt.internal.editors.manifest.model;
+import static com.android.ide.common.layout.LayoutConstants.ANDROID_URI;
+
import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
+import com.android.ide.eclipse.adt.internal.editors.descriptors.XmlnsAttributeDescriptor;
import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor.Mandatory;
import com.android.ide.eclipse.adt.internal.editors.mock.MockXmlNode;
import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
import org.w3c.dom.Node;
import java.util.Iterator;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+
import junit.framework.TestCase;
public class UiElementNodeTest extends TestCase {
@@ -252,4 +261,30 @@ public class UiElementNodeTest extends TestCase {
}
+ public void testlookupNamespacePrefix() throws Exception {
+ // Setup
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+ factory.setNamespaceAware(true);
+ factory.setValidating(false);
+ DocumentBuilder builder = factory.newDocumentBuilder();
+ Document document = builder.newDocument();
+ Element rootElement = document.createElement("root");
+ Attr attr = document.createAttributeNS(XmlnsAttributeDescriptor.XMLNS_URI,
+ "xmlns:customPrefix");
+ attr.setValue(ANDROID_URI);
+ rootElement.getAttributes().setNamedItemNS(attr);
+ document.appendChild(rootElement);
+ Element root = document.getDocumentElement();
+ root.appendChild(document.createTextNode(" "));
+ Element foo = document.createElement("foo");
+ root.appendChild(foo);
+ root.appendChild(document.createTextNode(" "));
+ Element bar = document.createElement("bar");
+ root.appendChild(bar);
+ Element baz = document.createElement("baz");
+ root.appendChild(baz);
+
+ String prefix = UiElementNode.lookupNamespacePrefix(baz, ANDROID_URI);
+ assertEquals("customPrefix", prefix);
+ }
}