/** * (c) 2011, Alejandro Serrano * Released under the terms of the EPL. */ package net.sf.eclipsefp.haskell.ui.internal.editors.partitioned; import java.util.HashMap; import java.util.Map; import net.sf.eclipsefp.haskell.core.codeassist.ITokenTypes; import net.sf.eclipsefp.haskell.ui.HaskellUIPlugin; import net.sf.eclipsefp.haskell.ui.internal.editors.haskell.text.AnnotationHover; import net.sf.eclipsefp.haskell.ui.internal.editors.haskell.text.HaskellAutoIndentStrategy; import net.sf.eclipsefp.haskell.ui.internal.editors.haskell.text.ScannerManager; import net.sf.eclipsefp.haskell.ui.internal.preferences.editor.IEditorPreferenceNames; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.text.DefaultLineTracker; import org.eclipse.jface.text.IAutoEditStrategy; import org.eclipse.jface.text.TabsToSpacesConverter; import org.eclipse.jface.text.rules.IToken; import org.eclipse.jface.text.rules.WordRule; import org.eclipse.jface.text.source.IAnnotationHover; import org.eclipse.jface.text.source.ISourceViewer; import org.eclipse.jface.text.source.SourceViewerConfiguration; /** * Base class for source configuration of Alex, Happy and UUAGC editors. * @author Alejandro Serrano * */ public class PartitionSourceViewerConfiguration extends SourceViewerConfiguration implements IEditorPreferenceNames { /** The associated editor */ protected final PartitionEditor editor; /** The plugin's preference store */ protected IPreferenceStore prefStore=HaskellUIPlugin.getEditorPreferenceStore(); /** The syntax highlighting and other content management container */ protected ScannerManager scannerManager; protected final Map<String, IToken> tokenByTypes; public PartitionSourceViewerConfiguration( final PartitionEditor editor ) { super(); this.editor = editor; this.tokenByTypes = new HashMap<String, IToken>() { // Eclipse insists on a serial version identifier, not that this hash map // will ever // get serialized... private static final long serialVersionUID = 3579246300065591883L; { put( ITokenTypes.LITERAL_STRING, getScannerManager().createToken( EDITOR_STRING_COLOR, EDITOR_STRING_BOLD ) ); put( ITokenTypes.LITERAL_CHAR, getScannerManager().createToken( EDITOR_CHAR_COLOR, EDITOR_CHAR_BOLD ) ); put( ITokenTypes.DOCUMENTATION_ANNOTATION, getScannerManager() .createToken( EDITOR_DOC_COLOR, EDITOR_DOC_BOLD ) ); put( ITokenTypes.COMMENT, getScannerManager() .createToken( EDITOR_COMMENT_COLOR, EDITOR_COMMENT_BOLD ) ); put( ITokenTypes.PRAGMA, getScannerManager() .createToken( EDITOR_PRAGMA_COLOR, EDITOR_PRAGMA_BOLD ) ); put( ITokenTypes.LITERATE_COMMENT, getScannerManager().createToken( EDITOR_LITERATE_COMMENT_COLOR, EDITOR_LITERATE_COMMENT_BOLD ) ); put( ITokenTypes.KEYWORD, getScannerManager().createToken( EDITOR_KEYWORD_COLOR, EDITOR_KEYWORD_BOLD ) ); put( ITokenTypes.GHC_EXTENSION_KEYWORD, getScannerManager() .createToken( EDITOR_KEYWORD_COLOR, EDITOR_KEYWORD_BOLD ) ); put( ITokenTypes.LITERAL_INTEGER, getScannerManager().createToken( EDITOR_NUMBER_COLOR, EDITOR_NUMBER_BOLD ) ); put( ITokenTypes.LITERAL_RATIONAL, getScannerManager().createToken( EDITOR_NUMBER_COLOR, EDITOR_NUMBER_BOLD ) ); put( ITokenTypes.LITERAL_WORD, getScannerManager().createToken( EDITOR_NUMBER_COLOR, EDITOR_NUMBER_BOLD ) ); put( ITokenTypes.LITERAL_FLOAT, getScannerManager().createToken( EDITOR_NUMBER_COLOR, EDITOR_NUMBER_BOLD ) ); put( ITokenTypes.IDENTIFIER_CONSTRUCTOR, getScannerManager() .createToken( EDITOR_CON_COLOR, EDITOR_CON_BOLD ) ); put( ITokenTypes.IDENTIFIER_VARIABLE, getScannerManager().createToken( EDITOR_VAR_COLOR, EDITOR_VAR_BOLD ) ); put( ITokenTypes.SYMBOL_VARIABLE, getScannerManager().createToken( EDITOR_VARSYM_COLOR, EDITOR_VARSYM_BOLD ) ); put( ITokenTypes.SYMBOL_RESERVED, getScannerManager().createToken( EDITOR_SYMBOL_COLOR, EDITOR_SYMBOL_BOLD ) ); put( ITokenTypes.SYMBOL_SPECIAL, getScannerManager().createToken( EDITOR_SYMBOL_COLOR, EDITOR_SYMBOL_BOLD ) ); put( ITokenTypes.PREPROCESSOR_TEXT, getScannerManager().createToken( EDITOR_CPP_COLOR, EDITOR_CPP_BOLD ) ); put( ITokenTypes.TEMPLATE_HASKELL, getScannerManager().createToken( EDITOR_TH_COLOR, EDITOR_TH_BOLD ) ); } }; } protected WordRule createRuleForToken( final String string, final String token ) { WordRule rule = new WordRule( new SingleWordDetector( string ) ); rule.addWord( string, tokenByTypes.get( token ) ); return rule; } @Override public int getTabWidth( final ISourceViewer sourceViewer ) { return getPreferenceStore().getInt( EDITOR_TAB_WIDTH ); } protected IPreferenceStore getPreferenceStore() { if( prefStore != null ) { return prefStore; } return HaskellUIPlugin.getDefault().getPreferenceStore(); } public void setPreferenceStore( final IPreferenceStore prefStore ) { this.prefStore = prefStore; } /** * Get the scanner manager. If the preference store (prefStore) is set, then * return a new {@link ScannerManager} that uses the preference store; * otherwise, return the ScannerManager singleton instance. * */ public ScannerManager getScannerManager() { if( prefStore != null ) { if( scannerManager == null ) { scannerManager = new ScannerManager( prefStore ); } return scannerManager; } return ScannerManager.getInstance(); } @Override public IAnnotationHover getAnnotationHover( final ISourceViewer sourceViewer ) { return new AnnotationHover(); } @Override public IAutoEditStrategy[] getAutoEditStrategies( final ISourceViewer sv, final String contentType ) { final TabsToSpacesConverter tabConverter = new TabsToSpacesConverter(); tabConverter.setLineTracker( new DefaultLineTracker() ); tabConverter.setNumberOfSpacesPerTab( getTabWidth( sv ) ); return new IAutoEditStrategy[] { new HaskellAutoIndentStrategy(), // is Haskell strategy ok? Probably... tabConverter // convert tabs to spaces too! }; } }