diff options
Diffstat (limited to 'eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/formatting/XmlQuickAssistManager.java')
-rw-r--r-- | eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/formatting/XmlQuickAssistManager.java | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/formatting/XmlQuickAssistManager.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/formatting/XmlQuickAssistManager.java new file mode 100644 index 000000000..a979a8086 --- /dev/null +++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/formatting/XmlQuickAssistManager.java @@ -0,0 +1,106 @@ +/* + * Copyright (C) 2011 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.formatting; + +import com.android.ide.eclipse.adt.internal.build.AaptQuickFix; +import com.android.ide.eclipse.adt.internal.editors.layout.refactoring.RefactoringAssistant; +import com.android.ide.eclipse.adt.internal.lint.LintFixGenerator; + +import org.eclipse.jface.text.contentassist.ICompletionProposal; +import org.eclipse.jface.text.quickassist.IQuickAssistInvocationContext; +import org.eclipse.jface.text.quickassist.IQuickAssistProcessor; +import org.eclipse.jface.text.source.Annotation; + +import java.util.ArrayList; +import java.util.List; + +/** + * This class implements Quick Assists for XML files. It does not perform any + * quick assistance on its own, but it coordinates the various separate quick + * assists available for XML such that the order is logical. This is necessary + * because without it, the order of suggestions (when more than one assistant + * provides suggestions) is not always optimal. There doesn't seem to be a way + * from non-Java languages to set the sorting order (see + * https://bugs.eclipse.org/bugs/show_bug.cgi?id=229983 ). So instead of + * registering our multiple XML quick assistants via the plugin.xml file, we + * register <b>just</b> this manager, which delegates to the various XML quick + * assistants as appropriate. + */ +public class XmlQuickAssistManager implements IQuickAssistProcessor { + private final IQuickAssistProcessor[] mProcessors; + + /** Constructs a new {@link XmlQuickAssistManager} which orders the quick fixes */ + public XmlQuickAssistManager() { + mProcessors = new IQuickAssistProcessor[] { + new AaptQuickFix(), + new LintFixGenerator(), + new RefactoringAssistant() + }; + } + + @Override + public String getErrorMessage() { + return null; + } + + @Override + public boolean canFix(Annotation annotation) { + for (IQuickAssistProcessor processor : mProcessors) { + if (processor.canFix(annotation)) { + return true; + } + } + + return false; + } + + @Override + public boolean canAssist(IQuickAssistInvocationContext invocationContext) { + for (IQuickAssistProcessor processor : mProcessors) { + if (processor.canAssist(invocationContext)) { + return true; + } + } + + return false; + } + + @Override + public ICompletionProposal[] computeQuickAssistProposals( + IQuickAssistInvocationContext invocationContext) { + List<ICompletionProposal> allProposals = null; + for (IQuickAssistProcessor processor : mProcessors) { + if (processor.canAssist(invocationContext)) { + ICompletionProposal[] proposals = + processor.computeQuickAssistProposals(invocationContext); + if (proposals != null && proposals.length > 0) { + if (allProposals == null) { + allProposals = new ArrayList<ICompletionProposal>(); + } + for (ICompletionProposal proposal : proposals) { + allProposals.add(proposal); + } + } + } + } + + if (allProposals != null) { + return allProposals.toArray(new ICompletionProposal[allProposals.size()]); + } + + return null; + } +} |