/*
* 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;
}
}