package net.lucky_dip.sasseditor.editor;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import net.lucky_dip.hamleditor.editor.HamlReconcilingStrategy;
import net.lucky_dip.hamleditor.editor.IColorManager;
import net.lucky_dip.hamleditor.editor.scanners.DefaultScanner;
import net.lucky_dip.sasseditor.editor.contentassist.SassContentAssistantProcessor;
import net.lucky_dip.sasseditor.editor.scanners.SassAttributeScanner;
import net.lucky_dip.sasseditor.editor.scanners.SassClassScanner;
import net.lucky_dip.sasseditor.editor.scanners.SassConstantScanner;
import net.lucky_dip.sasseditor.editor.scanners.SassIDScanner;
import net.lucky_dip.sasseditor.editor.scanners.SassPartitionScanner;
import net.lucky_dip.sasseditor.editor.scanners.SassTagScanner;
import org.eclipse.jface.text.IAutoEditStrategy;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.contentassist.ContentAssistant;
import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
import org.eclipse.jface.text.contentassist.IContentAssistant;
import org.eclipse.jface.text.presentation.IPresentationReconciler;
import org.eclipse.jface.text.presentation.PresentationReconciler;
import org.eclipse.jface.text.reconciler.IReconciler;
import org.eclipse.jface.text.reconciler.MonoReconciler;
import org.eclipse.jface.text.rules.DefaultDamagerRepairer;
import org.eclipse.jface.text.rules.ITokenScanner;
import org.eclipse.jface.text.source.ISourceViewer;
import org.eclipse.jface.text.source.SourceViewerConfiguration;
public class SassConfiguration extends SourceViewerConfiguration
{
private SassIndentLineAutoEditStrategy autoIndent;
private IColorManager colorManager;
private SassEditor editor;
private SassClassScanner classScanner;
private SassIDScanner idScanner;
private SassAttributeScanner attributeScanner;
private SassConstantScanner constantScanner;
private SassTagScanner tagScanner;
public SassConfiguration(IColorManager colorManager, SassEditor editor)
{
this.colorManager = colorManager;
this.editor = editor;
}
public String[] getConfiguredContentTypes(ISourceViewer sourceViewer)
{
List<String> types = new ArrayList<String>();
types.add(IDocument.DEFAULT_CONTENT_TYPE);
types.addAll(Arrays.asList(SassPartitionScanner.SASS_PARTITION_TYPES));
return (String[]) types.toArray(new String[0]);
}
public String getConfiguredDocumentPartitioning(ISourceViewer sourceViewer)
{
return SassEditor.SASS_PARTITIONING;
}
public IReconciler getReconciler(ISourceViewer sourceViewer)
{
HamlReconcilingStrategy strategy = new HamlReconcilingStrategy(editor);
MonoReconciler reconciler = new MonoReconciler(strategy, false);
return reconciler;
}
private ITokenScanner getClassScanner()
{
if (classScanner == null)
{
classScanner = new SassClassScanner(colorManager);
}
return classScanner;
}
private ITokenScanner getIDScanner()
{
if (idScanner == null)
{
idScanner = new SassIDScanner(colorManager);
}
return idScanner;
}
private ITokenScanner getAttributeScanner()
{
if (attributeScanner == null)
{
attributeScanner = new SassAttributeScanner(colorManager);
}
return attributeScanner;
}
private ITokenScanner getConstantScanner()
{
if (constantScanner == null)
{
constantScanner = new SassConstantScanner(colorManager);
}
return constantScanner;
}
private ITokenScanner getTagScanner()
{
if (tagScanner == null)
{
tagScanner = new SassTagScanner(colorManager);
}
return tagScanner;
}
public IPresentationReconciler getPresentationReconciler(ISourceViewer sourceViewer)
{
PresentationReconciler reconciler = new PresentationReconciler();
reconciler.setDocumentPartitioning(getConfiguredDocumentPartitioning(sourceViewer));
DefaultDamagerRepairer dr = new DefaultDamagerRepairer(new DefaultScanner());
reconciler.setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE);
reconciler.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE);
dr = new DefaultDamagerRepairer(getIDScanner());
reconciler.setDamager(dr, SassPartitionScanner.SASS_ID);
reconciler.setRepairer(dr, SassPartitionScanner.SASS_ID);
dr = new DefaultDamagerRepairer(getAttributeScanner());
reconciler.setDamager(dr, SassPartitionScanner.SASS_ATTRIBUTE);
reconciler.setRepairer(dr, SassPartitionScanner.SASS_ATTRIBUTE);
dr = new DefaultDamagerRepairer(getConstantScanner());
reconciler.setDamager(dr, SassPartitionScanner.SASS_CONSTANT);
reconciler.setRepairer(dr, SassPartitionScanner.SASS_CONSTANT);
dr = new DefaultDamagerRepairer(getClassScanner());
reconciler.setDamager(dr, SassPartitionScanner.SASS_CLASS);
reconciler.setRepairer(dr, SassPartitionScanner.SASS_CLASS);
dr = new DefaultDamagerRepairer(getTagScanner());
reconciler.setDamager(dr, SassPartitionScanner.SASS_TAG);
reconciler.setRepairer(dr, SassPartitionScanner.SASS_TAG);
return reconciler;
}
public int getTabWidth(ISourceViewer sourceViewer)
{
return SassIndentLineAutoEditStrategy.INDENT_STRING.length();
}
public String[] getIndentPrefixes(ISourceViewer sourceViewer, String contentType)
{
return new String[] { SassIndentLineAutoEditStrategy.INDENT_STRING };
}
public IAutoEditStrategy[] getAutoEditStrategies(ISourceViewer sourceViewer, String contentType)
{
if (autoIndent == null)
{
autoIndent = new SassIndentLineAutoEditStrategy();
}
return new IAutoEditStrategy[] { autoIndent };
}
public IContentAssistant getContentAssistant(ISourceViewer sourceViewer)
{
ContentAssistant ca = new ContentAssistant();
ca.setDocumentPartitioning(SassEditor.SASS_PARTITIONING);
IContentAssistProcessor pr = new SassContentAssistantProcessor();
ca.setContentAssistProcessor(pr, SassPartitionScanner.SASS_ATTRIBUTE);
ca.setContentAssistProcessor(pr, SassPartitionScanner.SASS_CONSTANT);
ca.setContentAssistProcessor(pr, IDocument.DEFAULT_CONTENT_TYPE);
ca.enableAutoActivation(true);
ca.setAutoActivationDelay(500);
ca.setProposalPopupOrientation(IContentAssistant.CONTEXT_INFO_BELOW);
ca.setContextInformationPopupOrientation(IContentAssistant.CONTEXT_INFO_BELOW);
ca.setInformationControlCreator(getInformationControlCreator(sourceViewer));
return ca;
}
}