aboutsummaryrefslogtreecommitdiff
path: root/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/AndroidSourceViewerConfig.java
diff options
context:
space:
mode:
Diffstat (limited to 'eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/AndroidSourceViewerConfig.java')
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/AndroidSourceViewerConfig.java243
1 files changed, 243 insertions, 0 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/AndroidSourceViewerConfig.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/AndroidSourceViewerConfig.java
new file mode 100644
index 000000000..b2c10ec3b
--- /dev/null
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/AndroidSourceViewerConfig.java
@@ -0,0 +1,243 @@
+/*
+ * Copyright (C) 2007 The Android Open Source Project
+ *
+ * Licensed under the Eclipse Public License, Version 1.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.eclipse.org/org/documents/epl-v10.php
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.ide.eclipse.adt.internal.editors;
+
+
+import com.android.ide.eclipse.adt.internal.editors.formatting.AndroidXmlFormatter;
+import com.android.ide.eclipse.adt.internal.editors.formatting.AndroidXmlFormattingStrategy;
+
+import org.eclipse.jface.text.DefaultAutoIndentStrategy;
+import org.eclipse.jface.text.IAutoEditStrategy;
+import org.eclipse.jface.text.ITextHover;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
+import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
+import org.eclipse.jface.text.contentassist.IContentAssistant;
+import org.eclipse.jface.text.contentassist.IContextInformation;
+import org.eclipse.jface.text.contentassist.IContextInformationValidator;
+import org.eclipse.jface.text.formatter.IContentFormatter;
+import org.eclipse.jface.text.formatter.MultiPassContentFormatter;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.wst.sse.core.text.IStructuredPartitions;
+import org.eclipse.wst.xml.core.text.IXMLPartitions;
+import org.eclipse.wst.xml.ui.StructuredTextViewerConfigurationXML;
+import org.eclipse.wst.xml.ui.internal.contentassist.XMLContentAssistProcessor;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Base Source Viewer Configuration for Android resources.
+ */
+@SuppressWarnings({"restriction", "deprecation"}) // XMLContentAssistProcessor etc
+public abstract class AndroidSourceViewerConfig extends StructuredTextViewerConfigurationXML {
+
+ public AndroidSourceViewerConfig() {
+ super();
+ }
+
+ @Override
+ public IContentAssistant getContentAssistant(ISourceViewer sourceViewer) {
+ return super.getContentAssistant(sourceViewer);
+ }
+
+ /**
+ * Returns the IContentAssistProcessor that
+ * {@link #getContentAssistProcessors(ISourceViewer, String)} should use
+ * for XML and default/unknown partitions.
+ *
+ * @return An {@link IContentAssistProcessor} or null.
+ */
+ public abstract IContentAssistProcessor getAndroidContentAssistProcessor(
+ ISourceViewer sourceViewer,
+ String partitionType);
+
+ /**
+ * Returns the content assist processors that will be used for content
+ * assist in the given source viewer and for the given partition type.
+ *
+ * @param sourceViewer the source viewer to be configured by this
+ * configuration
+ * @param partitionType the partition type for which the content assist
+ * processors are applicable
+ * @return IContentAssistProcessors or null if should not be supported
+ */
+ @Override
+ protected IContentAssistProcessor[] getContentAssistProcessors(
+ ISourceViewer sourceViewer, String partitionType) {
+ ArrayList<IContentAssistProcessor> processors = new ArrayList<IContentAssistProcessor>();
+ if (partitionType == IStructuredPartitions.UNKNOWN_PARTITION ||
+ partitionType == IStructuredPartitions.DEFAULT_PARTITION ||
+ partitionType == IXMLPartitions.XML_DEFAULT) {
+
+ IContentAssistProcessor processor =
+ getAndroidContentAssistProcessor(sourceViewer, partitionType);
+
+ if (processor != null) {
+ processors.add(processor);
+ }
+ }
+
+ IContentAssistProcessor[] others = super.getContentAssistProcessors(sourceViewer,
+ partitionType);
+ if (others != null && others.length > 0) {
+ for (IContentAssistProcessor p : others) {
+ // Builtin Eclipse WTP code completion assistant? If so,
+ // wrap it with our own filter which hides some unwanted completions.
+ if (p instanceof XMLContentAssistProcessor
+ // On Eclipse 3.7, XMLContentAssistProcessor is no longer used,
+ // and instead org.eclipse.wst.xml.ui.internal.contentassist.
+ // XMLStructuredContentAssistProcessor is used - which isn't available
+ // at compile time in 3.5.
+ || p.getClass().getSimpleName().equals(
+ "XMLStructuredContentAssistProcessor")) { //$NON-NLS-1$
+ processors.add(new FilteringContentAssistProcessor(p));
+ } else {
+ processors.add(p);
+ }
+ }
+ }
+
+ if (processors.size() > 0) {
+ return processors.toArray(new IContentAssistProcessor[processors.size()]);
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public ITextHover getTextHover(ISourceViewer sourceViewer, String contentType) {
+ // TODO text hover for android xml
+ return super.getTextHover(sourceViewer, contentType);
+ }
+
+ @Override
+ public IAutoEditStrategy[] getAutoEditStrategies(
+ ISourceViewer sourceViewer, String contentType) {
+ IAutoEditStrategy[] strategies = super.getAutoEditStrategies(sourceViewer, contentType);
+ List<IAutoEditStrategy> s = new ArrayList<IAutoEditStrategy>(strategies.length + 1);
+ s.add(new AndroidXmlAutoEditStrategy());
+
+ // Add other registered strategies, except the builtin indentation strategy which is
+ // now handled by the above AndroidXmlAutoEditStrategy
+ for (IAutoEditStrategy strategy : strategies) {
+ if (strategy instanceof DefaultAutoIndentStrategy) {
+ continue;
+ }
+ s.add(strategy);
+ }
+
+ return s.toArray(new IAutoEditStrategy[s.size()]);
+ }
+
+ @Override
+ public IContentFormatter getContentFormatter(ISourceViewer sourceViewer) {
+ IContentFormatter formatter = super.getContentFormatter(sourceViewer);
+
+ if (formatter instanceof MultiPassContentFormatter) {
+ ((MultiPassContentFormatter) formatter).setMasterStrategy(
+ new AndroidXmlFormattingStrategy());
+ return formatter;
+ } else {
+ return new AndroidXmlFormatter();
+ }
+ }
+
+ @Override
+ protected Map<String, ?> getHyperlinkDetectorTargets(final ISourceViewer sourceViewer) {
+ @SuppressWarnings("unchecked")
+ Map<String, ?> targets = super.getHyperlinkDetectorTargets(sourceViewer);
+ // If we want to look up more context in our HyperlinkDetector via the
+ // getAdapter method, we should place an IAdaptable object into the map here.
+ targets.put("com.android.ide.eclipse.xmlCode", null); //$NON-NLS-1$
+ return targets;
+ }
+
+ /**
+ * A delegating {@link IContentAssistProcessor} whose purpose is to filter out some
+ * default Eclipse XML completions which are distracting in Android XML files
+ */
+ private static class FilteringContentAssistProcessor implements IContentAssistProcessor {
+ private IContentAssistProcessor mDelegate;
+
+ public FilteringContentAssistProcessor(IContentAssistProcessor delegate) {
+ super();
+ mDelegate = delegate;
+ }
+
+ @Override
+ public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int offset) {
+ ICompletionProposal[] result = mDelegate.computeCompletionProposals(viewer, offset);
+ if (result == null) {
+ return null;
+ }
+
+ List<ICompletionProposal> proposals =
+ new ArrayList<ICompletionProposal>(result.length);
+ for (ICompletionProposal proposal : result) {
+ String replacement = proposal.getDisplayString();
+ if (replacement.charAt(0) == '"' &&
+ replacement.charAt(replacement.length() - 1) == '"') {
+ // Filter out attribute values. In Android XML files (where there is no DTD
+ // etc) the default Eclipse XML code completion simply provides the
+ // existing value as a completion. This is often misleading, since if you
+ // for example have a typo, completion will show your current (wrong)
+ // value as a valid completion.
+ } else if (replacement.contains("Namespace") //$NON-NLS-1$
+ || replacement.startsWith("XSL ") //$NON-NLS-1$
+ || replacement.contains("Schema")) { //$NON-NLS-1$
+ // Eclipse adds in a number of namespace and schema related completions which
+ // are not usually applicable in our files.
+ } else {
+ proposals.add(proposal);
+ }
+ }
+
+ if (proposals.size() == result.length) {
+ return result;
+ } else {
+ return proposals.toArray(new ICompletionProposal[proposals.size()]);
+ }
+ }
+
+ @Override
+ public IContextInformation[] computeContextInformation(ITextViewer viewer, int offset) {
+ return mDelegate.computeContextInformation(viewer, offset);
+ }
+
+ @Override
+ public char[] getCompletionProposalAutoActivationCharacters() {
+ return mDelegate.getCompletionProposalAutoActivationCharacters();
+ }
+
+ @Override
+ public char[] getContextInformationAutoActivationCharacters() {
+ return mDelegate.getContextInformationAutoActivationCharacters();
+ }
+
+ @Override
+ public IContextInformationValidator getContextInformationValidator() {
+ return mDelegate.getContextInformationValidator();
+ }
+
+ @Override
+ public String getErrorMessage() {
+ return mDelegate.getErrorMessage();
+ }
+ }
+}