/**********************************************************************
Copyright (c) 2000, 2002 IBM Corp. 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:
IBM Corporation - Initial implementation
Klaus Hartlage - www.eclipseproject.de
**********************************************************************/
package net.sourceforge.phpeclipse.phpeditor;
import java.util.Vector;
import net.sourceforge.phpdt.internal.ui.text.ContentAssistPreference;
import net.sourceforge.phpdt.internal.ui.text.HTMLTextPresenter;
import net.sourceforge.phpdt.internal.ui.text.PHPAnnotationHover;
import net.sourceforge.phpdt.internal.ui.text.java.JavaFormattingStrategy;
import net.sourceforge.phpdt.internal.ui.text.phpdoc.PHPDocCompletionProcessor;
import net.sourceforge.phpdt.ui.PreferenceConstants;
import net.sourceforge.phpdt.ui.text.JavaTextTools;
import net.sourceforge.phpeclipse.PHPCore;
import net.sourceforge.phpeclipse.PHPeclipsePlugin;
import net.sourceforge.phpeclipse.phpeditor.html.HTMLFormattingStrategy;
import net.sourceforge.phpeclipse.phpeditor.php.HTMLCompletionProcessor;
import net.sourceforge.phpeclipse.phpeditor.php.IPHPPartitionScannerConstants;
import net.sourceforge.phpeclipse.phpeditor.php.PHPAutoIndentStrategy;
import net.sourceforge.phpeclipse.phpeditor.php.PHPCompletionProcessor;
import net.sourceforge.phpeclipse.phpeditor.php.PHPDoubleClickSelector;
import net.sourceforge.phpeclipse.phpeditor.util.PHPColorProvider;
import org.eclipse.core.resources.IFile;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.text.DefaultAutoIndentStrategy;
import org.eclipse.jface.text.DefaultInformationControl;
import org.eclipse.jface.text.IAutoIndentStrategy;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IInformationControl;
import org.eclipse.jface.text.IInformationControlCreator;
import org.eclipse.jface.text.ITextDoubleClickStrategy;
import org.eclipse.jface.text.ITextHover;
import org.eclipse.jface.text.TextAttribute;
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.formatter.ContentFormatter;
import org.eclipse.jface.text.formatter.IContentFormatter;
import org.eclipse.jface.text.formatter.IFormattingStrategy;
import org.eclipse.jface.text.presentation.IPresentationReconciler;
import org.eclipse.jface.text.presentation.PresentationReconciler;
import org.eclipse.jface.text.rules.BufferedRuleBasedScanner;
import org.eclipse.jface.text.rules.DefaultDamagerRepairer;
import org.eclipse.jface.text.rules.DefaultPartitioner;
import org.eclipse.jface.text.rules.RuleBasedScanner;
import org.eclipse.jface.text.rules.Token;
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.SWT;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IFileEditorInput;
/**
* Configuration for an SourceViewer
which shows PHP code.
*/
public class PHPSourceViewerConfiguration extends SourceViewerConfiguration {
/**
* Preference key used to look up display tab width.
*
* @since 2.0
*/
public final static String PREFERENCE_TAB_WIDTH = PreferenceConstants.EDITOR_TAB_WIDTH;
/**
* Preference key for inserting spaces rather than tabs.
*
* @since 2.0
*/
public final static String SPACES_FOR_TABS = PreferenceConstants.EDITOR_SPACES_FOR_TABS;
// public static final String HTML_DEFAULT = IPHPPartitionScannerConstants.HTML;
//IDocument.DEFAULT_CONTENT_TYPE;
private JavaTextTools fJavaTextTools;
private PHPEditor fEditor;
private ContentFormatter fFormatter;
private HTMLFormattingStrategy fFormattingStrategy;
/**
* Single token scanner.
*/
static class SingleTokenScanner extends BufferedRuleBasedScanner {
public SingleTokenScanner(TextAttribute attribute) {
setDefaultReturnToken(new Token(attribute));
}
};
/**
* Default constructor.
*/
public PHPSourceViewerConfiguration(JavaTextTools textTools, PHPEditor editor) {
fJavaTextTools = textTools;
fEditor = editor;
}
/*
* @see SourceViewerConfiguration#getContentFormatter(ISourceViewer)
*/
public IContentFormatter getContentFormatter(ISourceViewer sourceViewer) {
// if (fFormatter == null) {
// fFormatter = new ContentFormatter();
// fFormattingStrategy = new HTMLFormattingStrategy(this, sourceViewer);
// fFormatter.setFormattingStrategy(fFormattingStrategy, HTML_DEFAULT);
// fFormatter.enablePartitionAwareFormatting(false);
// fFormatter.setPartitionManagingPositionCategories(getConfiguredContentTypes(null));
// }
// return fFormatter;
if (fFormatter == null) {
//ContentFormatter
fFormatter = new ContentFormatter();
IFormattingStrategy strategy = new JavaFormattingStrategy(sourceViewer);
fFormatter.setFormattingStrategy(strategy, IDocument.DEFAULT_CONTENT_TYPE);
fFormatter.enablePartitionAwareFormatting(false);
fFormatter.setPartitionManagingPositionCategories(getPartitionManagingPositionCategories());
}
return fFormatter;
}
/**
* Returns the names of the document position categories used by the document
* partitioners created by this object to manage their partition information.
* If the partitioners don't use document position categories, the returned
* result is null
.
*
* @return the partition managing position categories or null
* if there is none
*/
public String[] getPartitionManagingPositionCategories() {
return new String[] { DefaultPartitioner.CONTENT_TYPES_CATEGORY };
}
// /**
// * Returns the names of the document position categories used by the document
// * partitioners created by this object to manage their partition information.
// * If the partitioners don't use document position categories, the returned
// * result is null
.
// *
// * @return the partition managing position categories or null
// * if there is none
// */
// private String[] getPartitionManagingPositionCategories() {
// return new String[] { DefaultPartitioner.CONTENT_TYPES_CATEGORY };
// }
public PHPEditor getEditor() {
return fEditor;
}
/**
* Returns the preference store used by this configuration to initialize
* the individual bits and pieces.
*
* @return the preference store used to initialize this configuration
*
* @since 2.0
*/
protected IPreferenceStore getPreferenceStore() {
return PHPeclipsePlugin.getDefault().getPreferenceStore();
}
// /* (non-Javadoc)
// * Method declared on SourceViewerConfiguration
// */
// public IAnnotationHover getAnnotationHover(ISourceViewer sourceViewer) {
// return new PHPAnnotationHover();
// }
/*
* @see SourceViewerConfiguration#getAnnotationHover(ISourceViewer)
*/
public IAnnotationHover getAnnotationHover(ISourceViewer sourceViewer) {
return new PHPAnnotationHover();
}
/* (non-Javadoc)
* Method declared on SourceViewerConfiguration
*/
public IAutoIndentStrategy getAutoIndentStrategy(ISourceViewer sourceViewer, String contentType) {
return (IPHPPartitionScannerConstants.PHP.equals(contentType) ? new PHPAutoIndentStrategy() : new DefaultAutoIndentStrategy());
}
/**
* Returns the PHP source code scanner for this configuration.
*
* @return the PHP source code scanner
*/
protected RuleBasedScanner getCodeScanner() {
return fJavaTextTools.getCodeScanner();
}
/**
* Returns the HTML source code scanner for this configuration.
*
* @return the HTML source code scanner
*/
protected RuleBasedScanner getHTMLScanner() {
return fJavaTextTools.getHTMLScanner();
}
/**
* Returns the Smarty source code scanner for this configuration.
*
* @return the Smarty source code scanner
*/
protected RuleBasedScanner getSmartyScanner() {
return fJavaTextTools.getSmartyScanner();
}
/**
* Returns the SmartyDoc source code scanner for this configuration.
*
* @return the SmartyDoc source code scanner
*/
protected RuleBasedScanner getSmartyDocScanner() {
return fJavaTextTools.getSmartyDocScanner();
}
/**
* Returns the PHPDoc source code scanner for this configuration.
*
* @return the PHPDoc source code scanner
*/
protected RuleBasedScanner getPHPDocScanner() {
return fJavaTextTools.getJavaDocScanner();
}
/* (non-Javadoc)
* Method declared on SourceViewerConfiguration
*/
public String[] getConfiguredContentTypes(ISourceViewer sourceViewer) {
return new String[] {
IPHPPartitionScannerConstants.HTML,
IPHPPartitionScannerConstants.HTML_MULTILINE_COMMENT,
IPHPPartitionScannerConstants.PHP,
IPHPPartitionScannerConstants.PHP_MULTILINE_COMMENT,
IPHPPartitionScannerConstants.CSS,
IPHPPartitionScannerConstants.CSS_MULTILINE_COMMENT,
IPHPPartitionScannerConstants.JAVASCRIPT,
IPHPPartitionScannerConstants.JS_MULTILINE_COMMENT,
IPHPPartitionScannerConstants.SMARTY,
IPHPPartitionScannerConstants.SMARTY_MULTILINE_COMMENT,
IDocument.DEFAULT_CONTENT_TYPE };
}
/* (non-Javadoc)
* Method declared on SourceViewerConfiguration
*/
public IContentAssistant getContentAssistant(ISourceViewer sourceViewer) {
ContentAssistant assistant = new ContentAssistant();
IContentAssistProcessor processor = new HTMLCompletionProcessor();
assistant.setContentAssistProcessor(processor, IPHPPartitionScannerConstants.HTML);
assistant.setContentAssistProcessor(processor, IPHPPartitionScannerConstants.HTML_MULTILINE_COMMENT);
assistant.setContentAssistProcessor(processor, IDocument.DEFAULT_CONTENT_TYPE);
assistant.setContentAssistProcessor(processor, IPHPPartitionScannerConstants.CSS);
assistant.setContentAssistProcessor(processor, IPHPPartitionScannerConstants.CSS_MULTILINE_COMMENT);
assistant.setContentAssistProcessor(processor, IPHPPartitionScannerConstants.JAVASCRIPT);
assistant.setContentAssistProcessor(processor, IPHPPartitionScannerConstants.JS_MULTILINE_COMMENT);
// TODO define special smarty partition content assist
assistant.setContentAssistProcessor(processor, IPHPPartitionScannerConstants.SMARTY);
assistant.setContentAssistProcessor(processor, IPHPPartitionScannerConstants.SMARTY_MULTILINE_COMMENT);
assistant.setContentAssistProcessor(new PHPCompletionProcessor(), IPHPPartitionScannerConstants.PHP);
assistant.setContentAssistProcessor(new PHPDocCompletionProcessor(), IPHPPartitionScannerConstants.PHP_MULTILINE_COMMENT);
// assistant.enableAutoActivation(true);
// assistant.setAutoActivationDelay(500);
// assistant.setProposalPopupOrientation(ContentAssistant.PROPOSAL_OVERLAY);
// ContentAssistPreference.configure(assistant, getPreferenceStore());
// assistant.setContextInformationPopupOrientation(
// ContentAssistant.CONTEXT_INFO_ABOVE);
// assistant.setContextInformationPopupBackground(
// PHPEditorEnvironment.getPHPColorProvider().getColor(
// new RGB(150, 150, 0)));
ContentAssistPreference.configure(assistant, getPreferenceStore());
assistant.setContextInformationPopupOrientation(ContentAssistant.CONTEXT_INFO_ABOVE);
assistant.setInformationControlCreator(getInformationControlCreator(sourceViewer));
return assistant;
}
/* (non-Javadoc)
* Method declared on SourceViewerConfiguration
*/
// public String getDefaultPrefix(ISourceViewer sourceViewer, String contentType) {
// return (PHPPartitionScanner.PHP.equals(contentType) ? "//" : null); //$NON-NLS-1$
// // return (IDocument.DEFAULT_CONTENT_TYPE.equals(contentType) ? "//" : null); //$NON-NLS-1$
// }
/*
* @see SourceViewerConfiguration#getDefaultPrefix(ISourceViewer, String)
* @since 2.0
*/
public String[] getDefaultPrefixes(ISourceViewer sourceViewer, String contentType) {
return new String[] { "//", "" }; //$NON-NLS-1$ //$NON-NLS-2$
}
/* (non-Javadoc)
* Method declared on SourceViewerConfiguration
*/
public ITextDoubleClickStrategy getDoubleClickStrategy(ISourceViewer sourceViewer, String contentType) {
return new PHPDoubleClickSelector();
}
/*
* @see SourceViewerConfiguration#getIndentPrefixes(ISourceViewer, String)
*/
public String[] getIndentPrefixes(ISourceViewer sourceViewer, String contentType) {
Vector vector = new Vector();
// prefix[0] is either '\t' or ' ' x tabWidth, depending on useSpaces
final IPreferenceStore preferences = PHPeclipsePlugin.getDefault().getPreferenceStore();
int tabWidth = preferences.getInt(PHPCore.FORMATTER_TAB_SIZE);
boolean useSpaces = getPreferenceStore().getBoolean(SPACES_FOR_TABS);
for (int i = 0; i <= tabWidth; i++) {
StringBuffer prefix = new StringBuffer();
if (useSpaces) {
for (int j = 0; j + i < tabWidth; 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');
}
vector.add(prefix.toString());
}
vector.add(""); //$NON-NLS-1$
return (String[]) vector.toArray(new String[vector.size()]);
}
/* (non-Javadoc)
* Method declared on SourceViewerConfiguration
*/
public IPresentationReconciler getPresentationReconciler(ISourceViewer sourceViewer) {
// PHPColorProvider provider = PHPEditorEnvironment.getPHPColorProvider();
// JavaColorManager provider = PHPEditorEnvironment.getPHPColorProvider();
PresentationReconciler reconciler = new PresentationReconciler();
DefaultDamagerRepairer dr = new DefaultDamagerRepairer(getHTMLScanner());
reconciler.setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE);
reconciler.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE);
dr = new DefaultDamagerRepairer(getHTMLScanner());
reconciler.setDamager(dr, IPHPPartitionScannerConstants.HTML);
reconciler.setRepairer(dr, IPHPPartitionScannerConstants.HTML);
dr = new DefaultDamagerRepairer(getHTMLScanner());
reconciler.setDamager(dr, IPHPPartitionScannerConstants.CSS);
reconciler.setRepairer(dr, IPHPPartitionScannerConstants.CSS);
dr = new DefaultDamagerRepairer(getHTMLScanner());
reconciler.setDamager(dr, IPHPPartitionScannerConstants.CSS_MULTILINE_COMMENT);
reconciler.setRepairer(dr, IPHPPartitionScannerConstants.CSS_MULTILINE_COMMENT);
dr = new DefaultDamagerRepairer(getHTMLScanner());
reconciler.setDamager(dr, IPHPPartitionScannerConstants.JAVASCRIPT);
reconciler.setRepairer(dr, IPHPPartitionScannerConstants.JAVASCRIPT);
dr = new DefaultDamagerRepairer(getHTMLScanner());
reconciler.setDamager(dr, IPHPPartitionScannerConstants.JS_MULTILINE_COMMENT);
reconciler.setRepairer(dr, IPHPPartitionScannerConstants.JS_MULTILINE_COMMENT);
dr = new DefaultDamagerRepairer(getSmartyScanner());
reconciler.setDamager(dr, IPHPPartitionScannerConstants.SMARTY);
reconciler.setRepairer(dr, IPHPPartitionScannerConstants.SMARTY);
dr = new DefaultDamagerRepairer(getSmartyDocScanner());
reconciler.setDamager(dr, IPHPPartitionScannerConstants.SMARTY_MULTILINE_COMMENT);
reconciler.setRepairer(dr, IPHPPartitionScannerConstants.SMARTY_MULTILINE_COMMENT);
dr =
new DefaultDamagerRepairer(
new SingleTokenScanner(new TextAttribute(fJavaTextTools.getColorManager().getColor(PHPColorProvider.MULTI_LINE_COMMENT))));
reconciler.setDamager(dr, IPHPPartitionScannerConstants.HTML_MULTILINE_COMMENT);
reconciler.setRepairer(dr, IPHPPartitionScannerConstants.HTML_MULTILINE_COMMENT);
dr = new DefaultDamagerRepairer(getCodeScanner());
reconciler.setDamager(dr, IPHPPartitionScannerConstants.PHP);
reconciler.setRepairer(dr, IPHPPartitionScannerConstants.PHP);
dr = new DefaultDamagerRepairer(getPHPDocScanner());
reconciler.setDamager(dr, IPHPPartitionScannerConstants.PHP_MULTILINE_COMMENT);
reconciler.setRepairer(dr, IPHPPartitionScannerConstants.PHP_MULTILINE_COMMENT);
return reconciler;
}
/* (non-Javadoc)
* Method declared on SourceViewerConfiguration
*/
public int getTabWidth(ISourceViewer sourceViewer) {
return getPreferenceStore().getInt(PREFERENCE_TAB_WIDTH);
}
/* (non-Javadoc)
* Method declared on SourceViewerConfiguration
*/
public ITextHover getTextHover(ISourceViewer sourceViewer, String contentType) {
IEditorInput editorInput = fEditor.getEditorInput();
if (editorInput instanceof IFileEditorInput) {
try {
IFile f = ((IFileEditorInput) editorInput).getFile();
return new PHPTextHover(f.getProject());
} catch (NullPointerException e) {
// this exception occurs, if getTextHover is called by preference pages !
}
}
return new PHPTextHover(null);
}
/*
* @see SourceViewerConfiguration#getInformationControlCreator(ISourceViewer)
* @since 2.0
*/
public IInformationControlCreator getInformationControlCreator(ISourceViewer sourceViewer) {
return new IInformationControlCreator() {
public IInformationControl createInformationControl(Shell parent) {
return new DefaultInformationControl(parent, SWT.NONE, new HTMLTextPresenter(true));
// return new HoverBrowserControl(parent);
}
};
}
/*
* @see SourceViewerConfiguration#getInformationPresenter(ISourceViewer)
* @since 2.0
*/
// public IInformationPresenter getInformationPresenter(ISourceViewer sourceViewer) {
// InformationPresenter presenter= new InformationPresenter(getInformationPresenterControlCreator(sourceViewer));
// IInformationProvider provider= new JavaInformationProvider(getEditor());
// presenter.setInformationProvider(provider, IDocument.DEFAULT_CONTENT_TYPE);
// presenter.setInformationProvider(provider, IJavaPartitions.JAVA_DOC);
// presenter.setSizeConstraints(60, 10, true, true);
// return presenter;
// }
/**
* Returns the information presenter control creator. The creator is a factory creating the
* presenter controls for the given source viewer. This implementation always returns a creator
* for DefaultInformationControl
instances.
*
* @param sourceViewer the source viewer to be configured by this configuration
* @return an information control creator
* @since 2.1
*/
private IInformationControlCreator getInformationPresenterControlCreator(ISourceViewer sourceViewer) {
return new IInformationControlCreator() {
public IInformationControl createInformationControl(Shell parent) {
int shellStyle = SWT.RESIZE;
int style = SWT.V_SCROLL | SWT.H_SCROLL;
return new DefaultInformationControl(parent, shellStyle, style, new HTMLTextPresenter(false));
// return new HoverBrowserControl(parent);
}
};
}
}