/* * Copyright (c) 2003-2004 Christopher Lenz and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Common Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/cpl-v10.html * * Contributors: * Christopher Lenz - initial API and implementation * * $Id: CssSourceViewerConfiguration.java,v 1.1 2004-09-02 18:11:48 jsurfer Exp $ */ package net.sourceforge.phpeclipse.css.ui.internal.text; import java.util.ArrayList; import java.util.List; import net.sourceforge.phpeclipse.css.core.CssCore; import net.sourceforge.phpeclipse.css.core.profiles.IProfile; import net.sourceforge.phpeclipse.css.core.profiles.IProfileManager; import net.sourceforge.phpeclipse.css.ui.CssUI; import net.sourceforge.phpeclipse.css.ui.internal.CssUIPreferences; import net.sourceforge.phpeclipse.css.ui.text.CssTextTools; import net.sourceforge.phpeclipse.css.ui.text.IColorManager; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.preference.PreferenceConverter; import org.eclipse.jface.text.DefaultAutoIndentStrategy; import org.eclipse.jface.text.DefaultTextDoubleClickStrategy; import org.eclipse.jface.text.IAutoIndentStrategy; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.ITextDoubleClickStrategy; import org.eclipse.jface.text.ITextHover; import org.eclipse.jface.text.contentassist.ContentAssistant; 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.source.IAnnotationHover; import org.eclipse.jface.text.source.IAnnotationModel; import org.eclipse.jface.text.source.ISourceViewer; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IFileEditorInput; import org.eclipse.ui.editors.text.TextSourceViewerConfiguration; import org.eclipse.ui.texteditor.IDocumentProvider; import org.eclipse.ui.texteditor.ITextEditor; /** * Source viewer configuration for CSS. This class takes care of setting up * various aspects of the CSS editor, such as text hovers, syntax highlighting, * reconciling or the double click strategy. */ public final class CssSourceViewerConfiguration extends TextSourceViewerConfiguration { // Constants --------------------------------------------------------------- /** * Alias for the preference constant CONTENTASSIST_AUTOINSERT. */ private static final String AUTOINSERT = CssUIPreferences.CONTENTASSIST_AUTOINSERT; /** * Alias for the preference constant * CONTENTASSIST_AUTOACTIVATION. */ private static final String AUTOACTIVATION = CssUIPreferences.CONTENTASSIST_AUTOACTIVATION; /** * Alias for the preference constant * CONTENTASSIST_AUTOACTIVATION_DELAY. */ private static final String AUTOACTIVATION_DELAY = CssUIPreferences.CONTENTASSIST_AUTOACTIVATION_DELAY; /** * Alias for the preference constant * CONTENTASSIST_PROPOSALS_BACKGROUND. */ private static final String PROPOSALS_BACKGROUND = CssUIPreferences.CONTENTASSIST_PROPOSALS_BACKGROUND; /** * Alias for the preference constant * CONTENTASSIST_PROPOSALS_FOREGROUND. */ private static final String PROPOSALS_FOREGROUND = CssUIPreferences.CONTENTASSIST_PROPOSALS_FOREGROUND; /** * Alias for the preference constant EDITOR_SPACES_FOR_TABS. */ private static final String SPACES_FOR_TABS = CssUIPreferences.EDITOR_SPACES_FOR_TABS; // Instance Variables ------------------------------------------------------ /** * The associated editor. */ private ITextEditor editor; /** * The preference store used. */ private IPreferenceStore store; /** * The CSS profile. */ private IProfile profile; /** * The associated text tools. */ private CssTextTools textTools; // Constructors ------------------------------------------------------------ /** * Default constructor. */ public CssSourceViewerConfiguration() { this(CssUI.getDefault().getTextTools()); } /** * Constructor. * * @param textTools the CSS text tools to associate with the source viewer * configuration */ public CssSourceViewerConfiguration(CssTextTools textTools) { this(textTools, CssUI.getDefault().getPreferenceStore()); } /** * Constructor. * * @param textTools the CSS text tools to associate with the source viewer * configuration * @param store the preference store */ public CssSourceViewerConfiguration( CssTextTools textTools, IPreferenceStore store ) { this(textTools, store, null); } /** * Constructor. * * @param textTools the CSS text tools to associate with the source viewer * configuration * @param store the preference store * @param editor the text editor */ public CssSourceViewerConfiguration( CssTextTools textTools, IPreferenceStore store, ITextEditor editor ) { this.textTools = textTools; this.store = store; this.editor = editor; } // SourceViewerConfiguration Implementation -------------------------------- /* * @see SourceViewerConfiguration#getAnnotationHover(ISourceViewer) */ public IAnnotationHover getAnnotationHover(ISourceViewer sourceViewer) { return new CssAnnotationHover(); } /* * @see SourceViewerConfiguration#getAutoIndentStrategy(ISourceViewer, String) */ public IAutoIndentStrategy getAutoIndentStrategy( ISourceViewer sourceViewer, String contentType ) { if (IDocument.DEFAULT_CONTENT_TYPE.equals(contentType)) { return new CssAutoEditStrategy(); } return new DefaultAutoIndentStrategy(); } /* * @see SourceViewerConfiguration#getConfiguredContentTypes(ISourceViewer) */ public String[] getConfiguredContentTypes(ISourceViewer sourceViewer) { return new String[] { IDocument.DEFAULT_CONTENT_TYPE, CssPartitionScanner.CSS_COMMENT, CssPartitionScanner.CSS_STRING }; } /* * @see SourceViewerConfiguration#getContentAssistant(ISourceViewer) */ public IContentAssistant getContentAssistant(ISourceViewer sourceViewer) { ContentAssistant assistant = new ContentAssistant(); assistant.setContentAssistProcessor( new CssContentAssistProcessor(store, getProfile(), editor), IDocument.DEFAULT_CONTENT_TYPE); assistant.setInformationControlCreator( getInformationControlCreator(sourceViewer)); assistant.enableAutoInsert(store.getBoolean(AUTOINSERT)); assistant.enableAutoActivation(store.getBoolean(AUTOACTIVATION)); assistant.setAutoActivationDelay(store.getInt(AUTOACTIVATION_DELAY)); assistant.setContextInformationPopupOrientation( IContentAssistant.CONTEXT_INFO_BELOW); assistant.setProposalPopupOrientation( IContentAssistant.PROPOSAL_STACKED); assistant.setProposalSelectorBackground(getColorManager().getColor( PreferenceConverter.getColor(store, PROPOSALS_BACKGROUND))); assistant.setProposalSelectorForeground(getColorManager().getColor( PreferenceConverter.getColor(store, PROPOSALS_FOREGROUND))); return assistant; } /* * @see SourceViewerConfiguration#getDoubleClickStrategy(ISourceViewer, String) */ public ITextDoubleClickStrategy getDoubleClickStrategy( ISourceViewer sourceViewer, String contentType ) { if (IDocument.DEFAULT_CONTENT_TYPE.equals(contentType)) { return new CssDoubleClickStrategy(); } return new DefaultTextDoubleClickStrategy(); } /* * @see SourceViewerConfiguration#getIndentPrefixes(ISourceViewer, String) */ public String[] getIndentPrefixes( ISourceViewer sourceViewer, String contentType ) { List retVal = new ArrayList(); int tabWidth = getTabWidth(sourceViewer); boolean useSpaces = store.getBoolean(SPACES_FOR_TABS); for (int i = 0; i <= tabWidth; i++) { StringBuffer prefix = new StringBuffer(); if (useSpaces) { for (int j = 0; j < tabWidth - i; j++) { prefix.append(' '); } if (i > 0) { prefix.append('\t'); } } else { for (int j = 0; j < i; j++) { prefix.append(' '); } if (i < tabWidth) { prefix.append('\t'); } } retVal.add(prefix.toString()); } retVal.add(""); //$NON-NLS-1$ return (String[]) retVal.toArray(new String[retVal.size()]); } /* * @see SourceViewerConfiguration#getPresentationReconciler(ISourceViewer) */ public IPresentationReconciler getPresentationReconciler( ISourceViewer sourceViewer ) { PresentationReconciler reconciler = new PresentationReconciler(); DefaultDamagerRepairer dr; // Comments dr = new DefaultDamagerRepairer(textTools.getCommentScanner()); reconciler.setDamager(dr, CssPartitionScanner.CSS_COMMENT); reconciler.setRepairer(dr, CssPartitionScanner.CSS_COMMENT); // Strings dr = new DefaultDamagerRepairer(textTools.getStringScanner()); reconciler.setDamager(dr, CssPartitionScanner.CSS_STRING); reconciler.setRepairer(dr, CssPartitionScanner.CSS_STRING); // Code dr = new DefaultDamagerRepairer(textTools.getCodeScanner(getProfile())); reconciler.setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE); reconciler.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE); return reconciler; } /* * @see SourceViewerConfiguration#getReconciler(ISourceViewer) */ public IReconciler getReconciler(ISourceViewer sourceViewer) { if ((editor != null) && editor.isEditable()) { MonoReconciler reconciler = new MonoReconciler( new CssReconcilingStrategy(editor), false); reconciler.setProgressMonitor(new NullProgressMonitor()); reconciler.setDelay(500); return reconciler; } return null; } /* * @see SourceViewerConfiguration#getTextHover(ISourceViewer, String) */ public ITextHover getTextHover( ISourceViewer sourceViewer, String contentType ) { if (editor != null) { IDocumentProvider provider = editor.getDocumentProvider(); IEditorInput input = editor.getEditorInput(); IAnnotationModel model = provider.getAnnotationModel(input); return new CssTextHover(model); } return super.getTextHover(sourceViewer, contentType); } // Private Methods --------------------------------------------------------- /** * Returns the color manager associated with this configuration. * * @return the color manager */ private IColorManager getColorManager() { if (textTools != null) { return textTools.getColorManager(); } return null; } /** * Returns the CSS profile for the resource currently being viewed, or * the default profile if this source viewer configuration isn't associated * with an editor. * * @return the profile */ private IProfile getProfile() { if (profile == null) { IResource resource = null; if (editor != null) { IEditorInput input = editor.getEditorInput(); if (input instanceof IFileEditorInput) { resource = ((IFileEditorInput) input).getFile(); } } IProfileManager mgr = CssCore.getDefault().getProfileManager(); profile = mgr.getProfile(resource); } return profile; } }