/******************************************************************************* | |
* Copyright (c) 2020 IBM Corporation and others. | |
* All rights reserved. This program and the accompanying materials | |
* are made available under the terms of the Eclipse Public License v2.0 | |
* which accompanies this distribution, and is available at | |
* https://www.eclipse.org/legal/epl-2.0/ | |
* | |
* Contributors: | |
* IBM Corporation - initial API and implementation | |
*******************************************************************************/ | |
package org.eclipse.wst.sse.ui.internal.contentassist; | |
import java.util.ArrayList; | |
import java.util.Arrays; | |
import java.util.HashSet; | |
import java.util.List; | |
import java.util.Set; | |
import org.eclipse.core.filebuffers.FileBuffers; | |
import org.eclipse.core.filebuffers.ITextFileBuffer; | |
import org.eclipse.core.runtime.CoreException; | |
import org.eclipse.core.runtime.IConfigurationElement; | |
import org.eclipse.core.runtime.IExecutableExtension; | |
import org.eclipse.core.runtime.IPath; | |
import org.eclipse.core.runtime.IProgressMonitor; | |
import org.eclipse.core.runtime.Platform; | |
import org.eclipse.core.runtime.content.IContentType; | |
import org.eclipse.core.runtime.content.IContentTypeManager; | |
import org.eclipse.jface.text.contentassist.ICompletionProposal; | |
import org.eclipse.jface.text.contentassist.IContentAssistProcessor; | |
import org.eclipse.jface.text.contentassist.IContextInformation; | |
import org.eclipse.jface.text.source.ISourceViewer; | |
import org.eclipse.ui.internal.genericeditor.ContentAssistProcessorRegistry; | |
import org.eclipse.ui.internal.genericeditor.GenericEditorPlugin; | |
import org.eclipse.wst.sse.ui.contentassist.CompletionProposalInvocationContext; | |
import org.eclipse.wst.sse.ui.contentassist.ICompletionProposalComputer; | |
import org.eclipse.wst.sse.ui.internal.Logger; | |
public class GenericCompletionProposalComputer implements ICompletionProposalComputer, IExecutableExtension { | |
List<IContentAssistProcessor> fContentAssistProcessors = null; | |
private String fLastErrorMessage; | |
private String fDefaultFileName = "filename.html"; //$NON-NLS-1$ | |
public void sessionEnded() { | |
fContentAssistProcessors = null; | |
} | |
@Override | |
public void sessionStarted() { | |
} | |
@Override | |
public List<ICompletionProposal> computeCompletionProposals(CompletionProposalInvocationContext context, IProgressMonitor monitor) { | |
ISourceViewer viewer = null; | |
fLastErrorMessage = null; | |
if (context.getViewer() instanceof ISourceViewer) { | |
viewer = (ISourceViewer) context.getViewer(); | |
} | |
if (fContentAssistProcessors == null && viewer != null) { | |
String filename = fDefaultFileName; | |
ITextFileBuffer fileBuffer = FileBuffers.getTextFileBufferManager().getTextFileBuffer(viewer.getDocument()); | |
if (fileBuffer != null) { | |
IPath path = fileBuffer.getLocation(); | |
if (path != null ) { | |
filename = path.lastSegment(); | |
} | |
} | |
IContentTypeManager contentTypeManager = Platform.getContentTypeManager(); | |
ContentAssistProcessorRegistry contentAssistProcessorRegistry = GenericEditorPlugin.getDefault().getContentAssistProcessorRegistry(); | |
Set<IContentType> types = new HashSet<>(); | |
types.addAll(Arrays.asList(contentTypeManager.findContentTypesFor(filename))); | |
IContentType contentType = contentTypeManager.getContentType(IContentTypeManager.CT_TEXT); | |
types.add(contentType); | |
try { | |
fContentAssistProcessors = contentAssistProcessorRegistry.getContentAssistProcessors(viewer, null, types); | |
} | |
catch (NoClassDefFoundError e) { | |
Logger.logException(e); | |
} | |
} | |
List<ICompletionProposal> proposals = new ArrayList<>(); | |
for (IContentAssistProcessor processor : fContentAssistProcessors) { | |
ICompletionProposal[] computed = processor.computeCompletionProposals(context.getViewer(), context.getInvocationOffset()); | |
proposals.addAll(Arrays.asList(computed)); | |
String errorMessage = processor.getErrorMessage(); | |
if (errorMessage != null) { | |
if (fLastErrorMessage == null) { | |
fLastErrorMessage = processor.getErrorMessage(); | |
} | |
else { | |
fLastErrorMessage = fLastErrorMessage.concat("\n").concat(errorMessage); | |
} | |
} | |
} | |
return proposals; | |
} | |
@Override | |
public List<IContextInformation> computeContextInformation(CompletionProposalInvocationContext context, IProgressMonitor monitor) { | |
ISourceViewer viewer = null; | |
fLastErrorMessage = null; | |
if (context.getViewer() instanceof ISourceViewer) { | |
viewer = (ISourceViewer) context.getViewer(); | |
} | |
if (fContentAssistProcessors == null && viewer != null) { | |
IContentTypeManager contentTypeManager = Platform.getContentTypeManager(); | |
ContentAssistProcessorRegistry contentAssistProcessorRegistry = GenericEditorPlugin.getDefault().getContentAssistProcessorRegistry(); | |
Set<IContentType> types = new HashSet<>(); | |
types.addAll(Arrays.asList(contentTypeManager.findContentTypesFor(fDefaultFileName))); | |
IContentType contentType = contentTypeManager.getContentType(IContentTypeManager.CT_TEXT); | |
types.add(contentType); | |
fContentAssistProcessors = contentAssistProcessorRegistry.getContentAssistProcessors(viewer, null, types); | |
} | |
List<IContextInformation> infos = new ArrayList<>(); | |
for (IContentAssistProcessor processor : fContentAssistProcessors) { | |
IContextInformation[] computed = processor.computeContextInformation(context.getViewer(), context.getInvocationOffset()); | |
infos.addAll(Arrays.asList(computed)); | |
String errorMessage = processor.getErrorMessage(); | |
if (errorMessage != null) { | |
if (fLastErrorMessage == null) { | |
fLastErrorMessage = processor.getErrorMessage(); | |
} | |
else { | |
fLastErrorMessage = fLastErrorMessage.concat("\n").concat(errorMessage); | |
} | |
} | |
} | |
return infos; | |
} | |
@Override | |
public String getErrorMessage() { | |
return fLastErrorMessage; | |
} | |
@Override | |
public void setInitializationData(IConfigurationElement config, String propertyName, Object data) throws CoreException { | |
if (data instanceof String) { | |
fDefaultFileName = data.toString(); | |
} | |
} | |
} |