diff options
author | Tor Norbye <tnorbye@google.com> | 2011-03-11 17:23:41 -0800 |
---|---|---|
committer | Android Code Review <code-review@android.com> | 2011-03-11 17:23:41 -0800 |
commit | 087efd604957e0bd577edbb71e2631986f4f6488 (patch) | |
tree | 99660fe2bd20bfb6e29d2e6ffebc4dcca83ebc6d | |
parent | d677414784d91761be1ddc5c994a0996240cea6b (diff) | |
parent | 87269bec9ec19e7308d2dc958235228dbd52827b (diff) | |
download | sdk-087efd604957e0bd577edbb71e2631986f4f6488.zip sdk-087efd604957e0bd577edbb71e2631986f4f6488.tar.gz sdk-087efd604957e0bd577edbb71e2631986f4f6488.tar.bz2 |
Merge "XML code completion improvements"
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); + } } |