blob: 8f5f44f8733bf7e92317a218a87c0733a044cd1a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008 The University of York.
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* Contributors:
* Dimitrios Kolovos - initial API and implementation
******************************************************************************/
package org.eclipse.epsilon.common.dt.editor;
import org.eclipse.epsilon.common.dt.editor.autoclose.AutoCloseEditStrategy;
import org.eclipse.epsilon.common.dt.editor.contentassist.AbstractModuleEditorCompletionProcessor;
import org.eclipse.epsilon.common.dt.editor.hyperlinks.AbstractModuleEditorHyperlinkDetector;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.DefaultIndentLineAutoEditStrategy;
import org.eclipse.jface.text.IAutoEditStrategy;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.ITextDoubleClickStrategy;
import org.eclipse.jface.text.contentassist.ContentAssistant;
import org.eclipse.jface.text.contentassist.IContentAssistant;
import org.eclipse.jface.text.hyperlink.IHyperlinkDetector;
import org.eclipse.jface.text.hyperlink.IHyperlinkPresenter;
import org.eclipse.jface.text.hyperlink.MultipleHyperlinkPresenter;
import org.eclipse.jface.text.presentation.IPresentationReconciler;
import org.eclipse.jface.text.presentation.PresentationReconciler;
import org.eclipse.jface.text.source.DefaultAnnotationHover;
import org.eclipse.jface.text.source.IAnnotationHover;
import org.eclipse.jface.text.source.ISourceViewer;
import org.eclipse.jface.text.source.SourceViewerConfiguration;
import org.eclipse.swt.graphics.RGB;
public class AbstractModuleEditorSourceViewerConfiguration extends SourceViewerConfiguration {
protected AbstractModuleEditor editor = null;
protected AbstractModuleEditorScanner scanner;
protected AbstractModuleEditorNormalFontScanner commentScanner;
protected String[] defaultPrefixes = new String[] {"//"};
public AbstractModuleEditorSourceViewerConfiguration(AbstractModuleEditor editor) {
this.editor = editor;
scanner = new AbstractModuleEditorScanner(editor);
commentScanner = new AbstractModuleEditorNormalFontScanner(scanner.getCommentColor());
//stringScanner = new AbstractModuleEditorNormalFontScanner(scanner.stringColor);
}
@Override
public IPresentationReconciler getPresentationReconciler(ISourceViewer sourceViewer) {
final PresentationReconciler reconciler = new PresentationReconciler();
final MultilineDamagerRepairer dr = new MultilineDamagerRepairer(scanner);
reconciler.setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE);
reconciler.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE);
final MultilineDamagerRepairer commentDR = new MultilineDamagerRepairer(commentScanner);
reconciler.setDamager(commentDR, AbstractModuleEditorPartitionScanner.COMMENT);
reconciler.setRepairer(commentDR, AbstractModuleEditorPartitionScanner.COMMENT);
//final MultilineDamagerRepairer stringDR = new MultilineDamagerRepairer(stringScanner);
//reconciler.setDamager(stringDR, AbstractModuleEditorPartitionScanner.STRING);
//reconciler.setRepairer(stringDR, AbstractModuleEditorPartitionScanner.STRING);
return reconciler;
}
@Override
public IAutoEditStrategy[] getAutoEditStrategies(
ISourceViewer sourceViewer, String contentType) {
return new IAutoEditStrategy[]{new DefaultIndentLineAutoEditStrategy(), new AutoCloseEditStrategy()};
}
@Override
public ITextDoubleClickStrategy getDoubleClickStrategy(ISourceViewer sourceViewer, String contentType) {
return viewer -> {
try {
IDocument doc = viewer.getDocument();
int caretOffset = viewer.getSelectedRange().x;
int start = caretOffset;
int end = caretOffset;
boolean isIdentifierPart = Character.isJavaIdentifierPart(doc.getChar(start));
if (isIdentifierPart) {
while (Character.isJavaIdentifierPart(doc.getChar(start))) {
start--;
}
while (Character.isJavaIdentifierPart(doc.getChar(end))) {
end++;
}
}
viewer.setSelectedRange(start + 1, end - start - 1);
} catch (BadLocationException e) {}
};
}
@Override
public IAnnotationHover getAnnotationHover(ISourceViewer sourceViewer) {
return new DefaultAnnotationHover();
}
AbstractModuleEditorHyperlinkDetector hyperlinkDetector = null;
@Override
public IHyperlinkPresenter getHyperlinkPresenter(ISourceViewer sourceViewer) {
return new MultipleHyperlinkPresenter(new RGB(0, 0, 255));
}
@Override
public IHyperlinkDetector[] getHyperlinkDetectors(ISourceViewer sourceViewer) {
if (!editor.supportsHyperlinks()) return null;
if (hyperlinkDetector == null) {
hyperlinkDetector = new AbstractModuleEditorHyperlinkDetector();
editor.addModuleParsedListener(hyperlinkDetector);
}
return new IHyperlinkDetector[] { hyperlinkDetector };
}
@Override
public IContentAssistant getContentAssistant (ISourceViewer sourceViewer) {
ContentAssistant assistance = new ContentAssistant();
assistance.setContentAssistProcessor(
new AbstractModuleEditorCompletionProcessor(editor), IDocument.DEFAULT_CONTENT_TYPE
);
assistance.enableAutoActivation (true);
assistance.setAutoActivationDelay(500);
assistance.setProposalPopupOrientation(IContentAssistant.PROPOSAL_OVERLAY);
return assistance;
}
public AbstractModuleEditorScanner getScanner() {
return scanner;
}
public AbstractModuleEditorNormalFontScanner getCommentScanner() {
return commentScanner;
}
@Override
public String[] getDefaultPrefixes(ISourceViewer sourceViewer, String contentType) {
return defaultPrefixes;
}
}