Java tutorial
/* * Created on Jan 30, 2004 * * The MIT License * Copyright (c) 2004 Rob Rohan * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software * is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ package org.cfeclipse.cfml.editors; import org.cfeclipse.cfml.CFMLPlugin; import org.cfeclipse.cfml.dictionary.DictionaryManager; import org.cfeclipse.cfml.editors.contentassist.CFEPrimaryAssist; import org.cfeclipse.cfml.editors.formatters.CFMLFormattingStrategy; import org.cfeclipse.cfml.editors.formatters.FormattingPreferences; import org.cfeclipse.cfml.editors.formatters.SQLWordStrategy; import org.cfeclipse.cfml.editors.indentstrategies.CFEIndentStrategy; import org.cfeclipse.cfml.editors.indentstrategies.CFScriptIndentStrategy; import org.cfeclipse.cfml.editors.indentstrategies.TagIndentStrategy; import org.cfeclipse.cfml.editors.partitioner.PartitionTypes; import org.cfeclipse.cfml.editors.partitioner.scanners.CFPartitionScanner; import org.cfeclipse.cfml.editors.partitioner.scanners.CFTagScanner; import org.cfeclipse.cfml.editors.partitioner.scanners.HTMTagScanner; import org.cfeclipse.cfml.editors.partitioner.scanners.TextScanner; import org.cfeclipse.cfml.editors.partitioner.scanners.cfscript.CFScriptScanner; import org.cfeclipse.cfml.editors.partitioner.scanners.css.CSSScanner; import org.cfeclipse.cfml.editors.partitioner.scanners.jscript.JavaScriptScanner; import org.cfeclipse.cfml.editors.partitioner.scanners.sql.SQLScanner; import org.cfeclipse.cfml.editors.text.CFMLReconcilingStrategy; import org.cfeclipse.cfml.editors.text.NotifyingReconciler; import org.cfeclipse.cfml.preferences.AutoIndentPreferenceConstants; import org.cfeclipse.cfml.preferences.CFMLColorsPreferenceConstants; import org.cfeclipse.cfml.preferences.CFMLPreferenceManager; import org.cfeclipse.cfml.preferences.EditorPreferenceConstants; import org.cfeclipse.cfml.preferences.HTMLColorsPreferenceConstants; import org.cfeclipse.cfml.preferences.ParserPreferenceConstants; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.text.DefaultInformationControl; import org.eclipse.jface.text.IAutoEditStrategy; 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.IUndoManager; import org.eclipse.jface.text.TextAttribute; import org.eclipse.jface.text.TextViewerUndoManager; import org.eclipse.jface.text.contentassist.ContentAssistant; import org.eclipse.jface.text.contentassist.IContentAssistant; import org.eclipse.jface.text.formatter.IContentFormatter; import org.eclipse.jface.text.formatter.MultiPassContentFormatter; 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.rules.DefaultDamagerRepairer; 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.util.IPropertyChangeListener; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.editors.text.EditorsUI; import org.eclipse.ui.editors.text.TextSourceViewerConfiguration; import org.eclipse.ui.texteditor.AbstractDecoratedTextEditorPreferenceConstants; /** * <p> * This sets up the whole editor. Assigin partition damagers and repairers, and * assign insight to partitions - bunch of other stuff too. * </p> * <p> * * It is recommended that you <b>DO NOT EDIT THIS CLASS</b>. This class contains * all of the vital setup information for the editor. Before playing with this * class please talk to one of the development team for more information. * </p> * @author Rob */ public class CFConfiguration extends TextSourceViewerConfiguration implements IPropertyChangeListener { private CFDoubleClickStrategy doubleClickStrategy; protected ColorManager colorManager; private ContentAssistant assistant; private TagIndentStrategy indentTagStrategy; private CFScriptIndentStrategy indentCFScriptStrategy; protected CFMLPreferenceManager preferenceManager; private FormattingPreferences formattingPreferences = new FormattingPreferences(); private int tabWidth; //private CFMLEditor editor; private CFMLEditor editor; /** * Configure the tag indent strategy */ private void configTagIndentStrat() { indentTagStrategy.setIndentString(tabWidth, preferenceManager.insertSpacesForTabs()); indentTagStrategy.setTabIndentSingleLine(preferenceManager.tabIndentSingleLine()); indentTagStrategy.setAutoClose_DoubleQuotes( preferenceManager.getBooleanPref(AutoIndentPreferenceConstants.P_AUTOCLOSE_DOUBLE_QUOTES)); indentTagStrategy.setAutoClose_SingleQuotes( preferenceManager.getBooleanPref(AutoIndentPreferenceConstants.P_AUTOCLOSE_SINGLE_QUOTES)); indentTagStrategy.setAutoClose_Hashes( preferenceManager.getBooleanPref(AutoIndentPreferenceConstants.P_AUTOCLOSE_HASHES)); indentTagStrategy.setAutoClose_Brackets( preferenceManager.getBooleanPref(AutoIndentPreferenceConstants.P_AUTOCLOSE_BRACKETS)); indentTagStrategy.setAutoClose_Parens( preferenceManager.getBooleanPref(AutoIndentPreferenceConstants.P_AUTOCLOSE_PARENS)); indentTagStrategy.setAutoClose_Tags( preferenceManager.getBooleanPref(AutoIndentPreferenceConstants.P_AUTOCLOSE_TAGS)); indentTagStrategy.setAutoInsert_CloseTags( preferenceManager.getBooleanPref(AutoIndentPreferenceConstants.P_AUTOINSERT_CLOSE_TAGS)); indentTagStrategy.setUseSmartIndent( preferenceManager.getBooleanPref(AutoIndentPreferenceConstants.P_USE_SMART_INDENT)); indentTagStrategy.setUseSmartPaste( preferenceManager.getBooleanPref(AutoIndentPreferenceConstants.P_USE_SMART_PASTE)); //indentTagStrategy.setAutoClose_DoubleQuotes(preferenceManager.getBooleanPref(ICFMLPreferenceConstants.P_AUTOCLOSE_DOUBLE_QUOTES)); } /** * Configure the script indent strategy */ private void configCFScriptIndentStrat() { indentCFScriptStrategy.setIndentString(tabWidth, preferenceManager.insertSpacesForTabs()); indentCFScriptStrategy.setTabIndentSingleLine(preferenceManager.tabIndentSingleLine()); indentCFScriptStrategy.setAutoClose_DoubleQuotes( preferenceManager.getBooleanPref(AutoIndentPreferenceConstants.P_AUTOCLOSE_DOUBLE_QUOTES)); indentCFScriptStrategy.setAutoClose_SingleQuotes( preferenceManager.getBooleanPref(AutoIndentPreferenceConstants.P_AUTOCLOSE_SINGLE_QUOTES)); indentCFScriptStrategy.setAutoClose_Hashes( preferenceManager.getBooleanPref(AutoIndentPreferenceConstants.P_AUTOCLOSE_HASHES)); indentCFScriptStrategy.setAutoClose_Brackets( preferenceManager.getBooleanPref(AutoIndentPreferenceConstants.P_AUTOCLOSE_BRACKETS)); indentCFScriptStrategy.setAutoClose_Braces( preferenceManager.getBooleanPref(AutoIndentPreferenceConstants.P_AUTOCLOSE_BRACES)); indentCFScriptStrategy.setAutoClose_Parens( preferenceManager.getBooleanPref(AutoIndentPreferenceConstants.P_AUTOCLOSE_PARENS)); indentCFScriptStrategy.setUseSmartIndent( preferenceManager.getBooleanPref(AutoIndentPreferenceConstants.P_USE_SMART_INDENT)); indentCFScriptStrategy.setUseSmartComments( preferenceManager.getBooleanPref(AutoIndentPreferenceConstants.P_USE_SMART_COMMENTS)); } /** * Need a color manager to get partition colors * @param colorManager that would be the color manager */ public CFConfiguration(ColorManager colorManager, CFMLEditor editor) { this.colorManager = colorManager; this.editor = editor; preferenceManager = new CFMLPreferenceManager(); //this.undoManager = new CFEUndoManager(preferenceManager.maxUndoSteps()); indentCFScriptStrategy = new CFScriptIndentStrategy(editor); this.indentTagStrategy = new TagIndentStrategy(editor); tabWidth = preferenceManager.tabWidth(); boolean insertSpacesForTabs = preferenceManager.insertSpacesForTabs(); indentCFScriptStrategy.setIndentString(tabWidth, insertSpacesForTabs); indentCFScriptStrategy.setTabIndentSingleLine(preferenceManager.tabIndentSingleLine()); configTagIndentStrat(); // do we even need this strategy? configCFScriptIndentStrat(); // This ensures that we are notified when the preferences are saved CFMLPlugin.getDefault().getPreferenceStore().addPropertyChangeListener(this); } public int getTabWidth(ISourceViewer sourceViewer) { return tabWidth; } /* (non-Javadoc) * @see org.eclipse.jface.text.source.SourceViewerConfiguration#getContentFormatter(org.eclipse.jface.text.source.ISourceViewer) */ public IContentFormatter getContentFormatter(ISourceViewer sourceViewer) { /* ContentFormatter formatter = new ContentFormatter(); CFMLFormattingStrategy cfmlStrategy = new CFMLFormattingStrategy(); formatter.setFormattingStrategy(cfmlStrategy, IDocument.DEFAULT_CONTENT_TYPE); // this just gives us the whole document formatter.enablePartitionAwareFormatting(false); */ // this is useless until we have a parser basically. each partition is sent to formatter. // for (int i=0;i<PartitionTypes.ALL_PARTITION_TYPES.length;i++) { // formatter.setFormattingStrategy(cfmlStrategy, PartitionTypes.ALL_PARTITION_TYPES[i]); // } SQLWordStrategy sqlStrategy = new SQLWordStrategy(); // formatter.setFormattingStrategy(sqlStrategy, CFPartitionScanner.SQL); MultiPassContentFormatter formatter = new MultiPassContentFormatter( getConfiguredDocumentPartitioning(sourceViewer), IDocument.DEFAULT_CONTENT_TYPE); formatter.setMasterStrategy(new CFMLFormattingStrategy()); if (formattingPreferences.formatSQL()) { formatter.setSlaveStrategy(sqlStrategy, CFPartitionScanner.SQL); } // formatter.setSlaveStrategy(new XmlElementFormattingStrategy(), CFPartitionScanner.CF_SCRIPT); /* */ //formatter.setSlaveStrategy(new XmlCommentFormattingStrategy(), AntEditorPartitionScanner.XML_COMMENT); return formatter; } /** * Returns the prefixes to be used by the line-shift operation. * * @param sourceViewer * the source viewer to be configured by this configuration * @param contentType * the content type for which the prefix is applicable * @return the prefixes or <code>null</code> if the prefix operation should not be supported */ public String[] getIndentPrefixes(ISourceViewer sourceViewer, String contentType) { if (preferenceManager.insertSpacesForTabs()) { return new String[] { preferenceManager.getCanonicalIndent(), " ", "" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ } else { return new String[] { "\t", " ", "" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ } } /* public IUndoManager getUndoManager(ISourceViewer sourceViewer) { return this.undoManager; } */ public IAnnotationHover getAnnotationHover(ISourceViewer sourceViewer) { return new CFAnnotationHover(); } /** * This defines what sections (partitions) are valid for the document */ public String[] getConfiguredContentTypes(ISourceViewer sourceViewer) { return PartitionTypes.ALL_PARTITION_TYPES; // String[] defaultPart = {IDocumentExtension3.DEFAULT_PARTITIONING,editor.EDITOR_CONTEXT}; // return defaultPart; } /** * get the double click strat-m-gee for the view & content type = (section, * partition) * */ public ITextDoubleClickStrategy getDoubleClickStrategy(ISourceViewer sourceViewer, String contentType) { if (this.doubleClickStrategy == null) this.doubleClickStrategy = new CFDoubleClickStrategy(); //return doubleClickStrategy; // Spike:: // Moved this to org.cfeclipse.cfml.editors.dnd.SelectionCursorListener // so that we can handle ctrl and ctrl+shift modifiers // denny modified, we might want to use it again? return this.doubleClickStrategy; } ///////////////////////// SCANNERS ///////////////////////////////////////////// /** * get the scanner for the document and set the default return color * type i.e. the plain text on the document (not a tag) * partitons * @return */ protected TextScanner getTextScanner() { Token textToken = new Token(new TextAttribute(colorManager .getColor(preferenceManager.getColor(CFMLColorsPreferenceConstants.P_COLOR_DEFAULT_TEXT)))); TextScanner scanner = new TextScanner(colorManager, preferenceManager); scanner.setDefaultReturnToken(textToken); return scanner; } /** * gets the html tag scanner (handles highlighting for any non defined tags) * i.e. not cfscript, not cf..., not style, etc * partitons * @return */ protected HTMTagScanner getHTMTagScanner() { Token textToken = new Token(new TextAttribute( colorManager.getColor(preferenceManager.getColor(HTMLColorsPreferenceConstants.P_COLOR_HTM_TAG)))); HTMTagScanner htmtagScanner = new HTMTagScanner(colorManager, preferenceManager); htmtagScanner.setDefaultReturnToken(textToken); return htmtagScanner; } /** * gets the unknown tag scanner (handles highlighting for any non defined tags) * i.e. not cfscript, not cf..., not style, not html etc * partitons * @return */ protected HTMTagScanner getUNKTagScanner() { Token textToken = new Token(new TextAttribute( colorManager.getColor(preferenceManager.getColor(HTMLColorsPreferenceConstants.P_COLOR_UNK_TAG)))); HTMTagScanner unktagScanner = new HTMTagScanner(colorManager, preferenceManager); unktagScanner.setDefaultReturnToken(textToken); return unktagScanner; } /** * gets the unknown tag scanner (handles highlighting for any non defined tags) * i.e. not cfscript, not cf..., not style, not html etc * partitons * @return */ protected HTMTagScanner getTaglibTagScanner() { Token textToken = new Token(new TextAttribute(colorManager .getColor(preferenceManager.getColor(CFMLColorsPreferenceConstants.P_COLOR_TAGLIB_TAG)))); HTMTagScanner unktagScanner = new HTMTagScanner(colorManager, preferenceManager); unktagScanner.setDefaultReturnToken(textToken); return unktagScanner; } /** * gets the cfml tag scanner (handles highlighting cf tags) * partitons * @return */ protected CFTagScanner getCFTagScanner() { Token textToken = new Token(new TextAttribute( colorManager.getColor(preferenceManager.getColor(CFMLColorsPreferenceConstants.P_COLOR_CFTAG)))); CFTagScanner cftagScanner = new CFTagScanner(colorManager, preferenceManager); cftagScanner.setDefaultReturnToken(textToken); return cftagScanner; } /** * gets the cfscript scanner (handles highlighting for cfscript * partitons * @return */ protected CFScriptScanner getCFScriptScanner() { Token textToken = new Token(new TextAttribute(colorManager .getColor(preferenceManager.getColor(CFMLColorsPreferenceConstants.P_COLOR_CFSCRIPT_TEXT)))); CFScriptScanner cfscriptscanner = new CFScriptScanner(colorManager, preferenceManager); cfscriptscanner.setDefaultReturnToken(textToken); return cfscriptscanner; } /** * gets the style scanner (handles highlighting for the style tag) * partitions * @return */ protected CSSScanner getStyleScanner() { Token textToken = new Token(new TextAttribute( colorManager.getColor(preferenceManager.getColor(HTMLColorsPreferenceConstants.P_COLOR_CSS)))); CSSScanner stylescanner = new CSSScanner(colorManager, preferenceManager); stylescanner.setDefaultReturnToken(textToken); return stylescanner; } /** * gets the script scanner (handles highlighting for the script tag) * partitions * @return */ protected JavaScriptScanner getScriptScanner() { Token textToken = new Token(new TextAttribute(colorManager .getColor(preferenceManager.getColor(CFMLColorsPreferenceConstants.P_COLOR_DEFAULT_TEXT)))); JavaScriptScanner scriptscanner = new JavaScriptScanner(colorManager, preferenceManager); scriptscanner.setDefaultReturnToken(textToken); return scriptscanner; } /** * gets the script scanner (handles highlighting for the script tag) * partitions * @return */ protected SQLScanner getSQLScanner() { Token textToken = new Token(new TextAttribute( colorManager.getColor(preferenceManager.getColor(CFMLColorsPreferenceConstants.P_COLOR_SQL_TEXT)))); SQLScanner cfqueryscanner = new SQLScanner(colorManager, preferenceManager); cfqueryscanner.setDefaultReturnToken(textToken); return cfqueryscanner; } /** * gets the form scanner (handles highlighting for the form tags) * partitions * @return */ protected HTMTagScanner getFormScanner() { Token textToken = new Token(new TextAttribute(colorManager .getColor(preferenceManager.getColor(HTMLColorsPreferenceConstants.P_COLOR_HTM_FORM_TAG)))); HTMTagScanner formscanner = new HTMTagScanner(colorManager, preferenceManager); formscanner.setDefaultReturnToken(textToken); return formscanner; } /** * gets the form scanner (handles highlighting for the form tags) * partitions * @return */ protected HTMTagScanner getTableScanner() { Token textToken = new Token(new TextAttribute(colorManager .getColor(preferenceManager.getColor(HTMLColorsPreferenceConstants.P_COLOR_HTM_TABLE_TAG)))); HTMTagScanner tablescanner = new HTMTagScanner(colorManager, preferenceManager); tablescanner.setDefaultReturnToken(textToken); return tablescanner; } ///////////////////////// SCANNERS ///////////////////////////////////////////// public IReconciler getReconciler(ISourceViewer sourceViewer) { NotifyingReconciler reconciler = new NotifyingReconciler(new CFMLReconcilingStrategy(editor)); reconciler.setDelay(CFMLReconcilingStrategy.DELAY); reconciler.addReconcilingParticipant(editor); return reconciler; } /** * get all the damager and repairers for the source type */ public IPresentationReconciler getPresentationReconciler(ISourceViewer sourceViewer) { PresentationReconciler reconciler = new PresentationReconciler(); //setup the partiton scanner to break and fix each part of the //document // // WARNING order is important here - the document will be painted // with the rules in this order - it seems anyway // CF script DefaultDamagerRepairer dr = new DefaultDamagerRepairer(getCFScriptScanner()); reconciler.setDamager(dr, CFPartitionScanner.CF_SCRIPT); reconciler.setRepairer(dr, CFPartitionScanner.CF_SCRIPT); // cfset tag contents. reconciler.setDamager(dr, CFPartitionScanner.CF_SET_STATEMENT); reconciler.setRepairer(dr, CFPartitionScanner.CF_SET_STATEMENT); // cfif and cfelseif tag contents. reconciler.setDamager(dr, CFPartitionScanner.CF_BOOLEAN_STATEMENT); reconciler.setRepairer(dr, CFPartitionScanner.CF_BOOLEAN_STATEMENT); // cfreturn tag contents. reconciler.setDamager(dr, CFPartitionScanner.CF_RETURN_STATEMENT); reconciler.setRepairer(dr, CFPartitionScanner.CF_RETURN_STATEMENT); //HTML part dr = new DefaultDamagerRepairer(getHTMTagScanner()); reconciler.setDamager(dr, CFPartitionScanner.HTM_END_TAG); reconciler.setRepairer(dr, CFPartitionScanner.HTM_END_TAG); reconciler.setDamager(dr, CFPartitionScanner.HTM_START_TAG_BEGIN); reconciler.setRepairer(dr, CFPartitionScanner.HTM_START_TAG_BEGIN); reconciler.setDamager(dr, CFPartitionScanner.HTM_START_TAG_END); reconciler.setRepairer(dr, CFPartitionScanner.HTM_START_TAG_END); reconciler.setDamager(dr, CFPartitionScanner.HTM_TAG_ATTRIBS); reconciler.setRepairer(dr, CFPartitionScanner.HTM_TAG_ATTRIBS); //javascript tag dr = new DefaultDamagerRepairer(getScriptScanner()); reconciler.setDamager(dr, CFPartitionScanner.J_SCRIPT); reconciler.setRepairer(dr, CFPartitionScanner.J_SCRIPT); //style tag dr = new DefaultDamagerRepairer(getStyleScanner()); reconciler.setDamager(dr, CFPartitionScanner.CSS); reconciler.setRepairer(dr, CFPartitionScanner.CSS); dr = new DefaultDamagerRepairer(getTaglibTagScanner()); reconciler.setDamager(dr, CFPartitionScanner.TAGLIB_TAG); reconciler.setRepairer(dr, CFPartitionScanner.TAGLIB_TAG); //SQL dr = new DefaultDamagerRepairer(getSQLScanner()); reconciler.setDamager(dr, CFPartitionScanner.SQL); reconciler.setRepairer(dr, CFPartitionScanner.SQL); //general CF dr = new DefaultDamagerRepairer(getCFTagScanner()); reconciler.setDamager(dr, CFPartitionScanner.CF_START_TAG_BEGIN); reconciler.setRepairer(dr, CFPartitionScanner.CF_START_TAG_BEGIN); reconciler.setDamager(dr, CFPartitionScanner.CF_START_TAG_END); reconciler.setRepairer(dr, CFPartitionScanner.CF_START_TAG_END); reconciler.setDamager(dr, CFPartitionScanner.CF_TAG_ATTRIBS); reconciler.setRepairer(dr, CFPartitionScanner.CF_TAG_ATTRIBS); //general end cftag //dr = new DefaultDamagerRepairer(getCFTagScanner()); reconciler.setDamager(dr, CFPartitionScanner.CF_END_TAG); reconciler.setRepairer(dr, CFPartitionScanner.CF_END_TAG); dr = new DefaultDamagerRepairer(getFormScanner()); reconciler.setDamager(dr, CFPartitionScanner.FORM_END_TAG); reconciler.setRepairer(dr, CFPartitionScanner.FORM_END_TAG); reconciler.setDamager(dr, CFPartitionScanner.FORM_START_TAG_BEGIN); reconciler.setRepairer(dr, CFPartitionScanner.FORM_START_TAG_BEGIN); reconciler.setDamager(dr, CFPartitionScanner.FORM_START_TAG_END); reconciler.setRepairer(dr, CFPartitionScanner.FORM_START_TAG_END); reconciler.setDamager(dr, CFPartitionScanner.FORM_TAG_ATTRIBS); reconciler.setRepairer(dr, CFPartitionScanner.FORM_TAG_ATTRIBS); dr = new DefaultDamagerRepairer(getTableScanner()); reconciler.setDamager(dr, CFPartitionScanner.TABLE_END_TAG); reconciler.setRepairer(dr, CFPartitionScanner.TABLE_END_TAG); reconciler.setDamager(dr, CFPartitionScanner.TABLE_START_TAG_BEGIN); reconciler.setRepairer(dr, CFPartitionScanner.TABLE_START_TAG_BEGIN); reconciler.setDamager(dr, CFPartitionScanner.TABLE_START_TAG_END); reconciler.setRepairer(dr, CFPartitionScanner.TABLE_START_TAG_END); reconciler.setDamager(dr, CFPartitionScanner.TABLE_TAG_ATTRIBS); reconciler.setRepairer(dr, CFPartitionScanner.TABLE_TAG_ATTRIBS); //unknown tags dr = new DefaultDamagerRepairer(getUNKTagScanner()); reconciler.setDamager(dr, CFPartitionScanner.UNK_TAG); reconciler.setRepairer(dr, CFPartitionScanner.UNK_TAG); NonRuleBasedDamagerRepairer ndr = new NonRuleBasedDamagerRepairer(new TextAttribute( colorManager.getColor(preferenceManager.getColor(CFMLColorsPreferenceConstants.P_COLOR_JAVADOC)), colorManager.getColor( preferenceManager.getColor(CFMLColorsPreferenceConstants.P_COLOR_BACKGROUND_JAVADOC)), tabWidth)); reconciler.setDamager(ndr, CFPartitionScanner.JAVADOC_COMMENT); reconciler.setRepairer(ndr, CFPartitionScanner.JAVADOC_COMMENT); // set up the cf comment section ndr = new NonRuleBasedDamagerRepairer(new TextAttribute( colorManager.getColor(preferenceManager.getColor(CFMLColorsPreferenceConstants.P_COLOR_CFCOMMENT)), colorManager.getColor( preferenceManager.getColor(CFMLColorsPreferenceConstants.P_COLOR_BACKGROUND_CFCOMMENT)), tabWidth)); reconciler.setDamager(ndr, CFPartitionScanner.CF_COMMENT); reconciler.setRepairer(ndr, CFPartitionScanner.CF_COMMENT); reconciler.setDamager(ndr, CFPartitionScanner.CF_SCRIPT_COMMENT_BLOCK); reconciler.setRepairer(ndr, CFPartitionScanner.CF_SCRIPT_COMMENT_BLOCK); reconciler.setDamager(ndr, CFPartitionScanner.CF_SCRIPT_COMMENT); reconciler.setRepairer(ndr, CFPartitionScanner.CF_SCRIPT_COMMENT); // .... the default text in the document dr = new DefaultDamagerRepairer(getTextScanner()); reconciler.setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE); reconciler.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE); //set up the html comment section NonRuleBasedDamagerRepairer ndr2 = new NonRuleBasedDamagerRepairer(new TextAttribute(colorManager .getColor(preferenceManager.getColor(HTMLColorsPreferenceConstants.P_COLOR_HTM_COMMENT)))); reconciler.setDamager(ndr2, CFPartitionScanner.HTM_COMMENT); reconciler.setRepairer(ndr2, CFPartitionScanner.HTM_COMMENT); //set up the doctype section NonRuleBasedDamagerRepairer ndr3 = new NonRuleBasedDamagerRepairer(new TextAttribute(colorManager .getColor(preferenceManager.getColor(HTMLColorsPreferenceConstants.P_COLOR_HTM_COMMENT)))); reconciler.setDamager(ndr3, CFPartitionScanner.DOCTYPE); reconciler.setRepairer(ndr3, CFPartitionScanner.DOCTYPE); return reconciler; } /** * Define code insight stuff (mostly assign it to different sections) */ public IContentAssistant getContentAssistant(ISourceViewer sourceViewer) { //make our assistant and processor assistant = new ContentAssistant(); //The Mac Assistant looks a bit odd this is an attempt to fix it assistant.setContextSelectorBackground(colorManager.getColor(new RGB(255, 255, 255))); assistant.setContextSelectorForeground(colorManager.getColor(new RGB(0, 0, 0))); assistant.setContextInformationPopupBackground(colorManager.getColor(new RGB(0, 0, 0))); setupPrimaryCFEContentAssist(sourceViewer); //in javascript tags - try to give js its own type of completion using the //cfscript processor but using the js dictionary... /* CFMLFunctionCompletionProcessor cfscp = new CFMLFunctionCompletionProcessor(); cfscp.changeDictionary(DictionaryManager.JSDIC); assistant.setContentAssistProcessor(cfscp, CFPartitionScanner.J_SCRIPT); */ //IPreferenceStore store = CFMLPlugin.getDefault().getPreferenceStore(); int delay = preferenceManager.insightDelay(); assistant.enableAutoActivation( preferenceManager.getBooleanPref(AutoIndentPreferenceConstants.P_AUTOACTIVATION)); assistant.setAutoActivationDelay(delay); // automatically insert if only one suggestion assistant.enableAutoInsert(preferenceManager.getBooleanPref(AutoIndentPreferenceConstants.P_AUTOINSERT)); //assistant.setDocumentPartitioning(CFDocumentSetupParticipant.CFML_PARTITIONING); assistant.setProposalPopupOrientation(IContentAssistant.PROPOSAL_REMOVE); assistant.setInformationControlCreator(getInformationControlCreator(sourceViewer)); //I set the insights backgrounds to white because //the colors dont work quite right on osx. Even //the default yellow looks stupid //this is the function insight in tag sections assistant.setContextSelectorBackground(colorManager.getColor(new RGB(255, 255, 255))); //this is the tag insight assistant.setProposalSelectorBackground(colorManager.getColor(new RGB(255, 255, 255))); //the popup window when you hit enter on a function name assistant.setContextInformationPopupBackground(colorManager.getColor(new RGB(255, 255, 255))); return assistant; } /** * Returns the information control creator. The creator is a factory creating information * controls for the given source viewer. This implementation always returns a creator for * <code>DefaultInformationControl</code> instances. * * @param sourceViewer the source viewer to be configured by this configuration * @return the information control creator or <code>null</code> if no information support should be installed * @since 2.0 */ public IInformationControlCreator getInformationControlCreator(ISourceViewer sourceViewer) { return new IInformationControlCreator() { public IInformationControl createInformationControl(Shell parent) { return new DefaultInformationControl(parent, new InformationPresenter()); } }; } /** * Sets up the primary CFE Content Assistor. CFE now uses it's own series of * content assist code to future proof the content assist process. This should * allow developers to extend the CFE code easily and more reliably in the future * resulting in fewer hacks and changes to the core code. * @param sourceViewer */ private void setupPrimaryCFEContentAssist(ISourceViewer sourceViewer) { CFEPrimaryAssist mainCFAssistant = new CFEPrimaryAssist(sourceViewer, assistant); // we only do the assist partition types here (excludes comment partitions) for (int i = 0; i < PartitionTypes.ASSIST_PARTITION_TYPES.length; i++) { assistant.setContentAssistProcessor(mainCFAssistant, PartitionTypes.ASSIST_PARTITION_TYPES[i]); } } /** * Register the text hover * @author Oliver Tupman */ public ITextHover getTextHover(ISourceViewer sourceViewer, String contentType) { //keep the hover only in the parts where it should be //i.e. not in comments ... (we could add a javascript //css specific thing in the future...) if (contentType == CFPartitionScanner.HTM_END_TAG || contentType == CFPartitionScanner.HTM_START_TAG_BEGIN || contentType == CFPartitionScanner.HTM_START_TAG_END || contentType == CFPartitionScanner.HTM_TAG_ATTRIBS) { return new CFTextHover(DictionaryManager.getDictionary(DictionaryManager.HTDIC)); } else if (!(contentType == CFPartitionScanner.HTM_COMMENT)) { //load the text hover with the cf dictionary return new CFTextHover(DictionaryManager.getDictionary(DictionaryManager.CFDIC)); } return null; } public IUndoManager getUndoManager(ISourceViewer sourceViewer) { IPreferenceStore generalTextStore = EditorsUI.getPreferenceStore(); return new TextViewerUndoManager( generalTextStore.getInt(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_UNDO_HISTORY_SIZE)); } /** * Returns the autoindent strategy for a give partition type. Currently there are * two separate indent strategies: CFScript & everything else. This is because * the auto-completion & character step-through are now implemented within the * auto-indentors. The auto-indentors differ for the two languages. * r2: just happened upon the fix for this so I just made it non-deprecated, * could probably use some rework now that it can give back an array in 3.1 */ public IAutoEditStrategy[] getAutoEditStrategies(ISourceViewer sourceViewer, String partitionType) { if (partitionType == null) { return new CFEIndentStrategy[] { indentTagStrategy }; } if (partitionType.compareTo(CFPartitionScanner.CF_SCRIPT) == 0 || partitionType.compareTo(CFPartitionScanner.CF_SCRIPT_COMMENT_BLOCK) == 0 || partitionType.compareTo(CFPartitionScanner.CF_SCRIPT_COMMENT) == 0 || partitionType.compareTo(CFPartitionScanner.JAVADOC_COMMENT) == 0) { return new CFEIndentStrategy[] { indentCFScriptStrategy }; } else if (partitionType.compareTo(CFPartitionScanner.J_SCRIPT) == 0) { return new CFEIndentStrategy[] { indentCFScriptStrategy }; } return new CFEIndentStrategy[] { indentTagStrategy }; } // This method gets called when the preference page is saved. public void propertyChange(PropertyChangeEvent event) { // System.out.println("CFConfiguration property change listener notified." + event.getProperty()); String prop = event.getProperty(); Object newValue = event.getNewValue(); boolean setting = false; Object settingObj = null; if (newValue instanceof Boolean) { setting = ((Boolean) newValue).booleanValue(); } else { settingObj = newValue; } // boolean setting = ((Boolean)event.getNewValue()).booleanValue(); // System.out.println("The Property we are setting is: " + prop + " [" + setting + "]"); if (prop.equals(EditorPreferenceConstants.P_INSIGHT_DELAY)) { int delay = preferenceManager.insightDelay(); assistant.enableAutoActivation(true); assistant.setAutoActivationDelay(delay); //System.err.println("Insight delay set to " + delay); } else if (prop.equals(EditorPreferenceConstants.P_INSERT_SPACES_FOR_TABS) || prop.equals(EditorPreferenceConstants.P_TAB_WIDTH)) { tabWidth = preferenceManager.tabWidth(); boolean tabsAsSpaces = preferenceManager.insertSpacesForTabs(); indentCFScriptStrategy.setIndentString(tabWidth, tabsAsSpaces); indentTagStrategy.setIndentString(tabWidth, tabsAsSpaces); } else if (prop.equals(AutoIndentPreferenceConstants.P_AUTOCLOSE_DOUBLE_QUOTES)) { indentCFScriptStrategy.setAutoClose_DoubleQuotes(setting); indentTagStrategy.setAutoClose_DoubleQuotes(setting); } else if (prop.equals(AutoIndentPreferenceConstants.P_AUTOCLOSE_SINGLE_QUOTES)) { indentCFScriptStrategy.setAutoClose_SingleQuotes(setting); indentTagStrategy.setAutoClose_SingleQuotes(setting); } else if (prop.equals(AutoIndentPreferenceConstants.P_AUTOCLOSE_HASHES)) { indentCFScriptStrategy.setAutoClose_Hashes(setting); indentTagStrategy.setAutoClose_Hashes(setting); } else if (prop.equals(AutoIndentPreferenceConstants.P_AUTOCLOSE_BRACKETS)) { indentCFScriptStrategy.setAutoClose_Brackets(setting); indentTagStrategy.setAutoClose_Brackets(setting); } else if (prop.equals(AutoIndentPreferenceConstants.P_AUTOCLOSE_BRACES)) { indentCFScriptStrategy.setAutoClose_Braces(setting); } else if (prop.equals(AutoIndentPreferenceConstants.P_AUTOCLOSE_PARENS)) { indentCFScriptStrategy.setAutoClose_Parens(setting); indentTagStrategy.setAutoClose_Parens(setting); } else if (prop.equals(AutoIndentPreferenceConstants.P_AUTOCLOSE_TAGS)) { indentTagStrategy.setAutoClose_Tags(setting); } else if (prop.equals(AutoIndentPreferenceConstants.P_AUTOINSERT_CLOSE_TAGS)) { indentTagStrategy.setAutoInsert_CloseTags(setting); } else if (prop.equals(AutoIndentPreferenceConstants.P_USE_SMART_COMMENTS)) { indentCFScriptStrategy.setUseSmartComments(setting); } else if (prop.equals(AutoIndentPreferenceConstants.P_USE_SMART_INDENT)) { indentCFScriptStrategy.setUseSmartIndent(setting); indentTagStrategy.setUseSmartIndent(setting); } else if (prop.equals(AutoIndentPreferenceConstants.P_AUTOINDENT_ONTAGCLOSE)) { int indentValue = setting ? TagIndentStrategy.INDENT_ONTAGCLOSE : TagIndentStrategy.INDENT_DONTDOIT; indentTagStrategy.setAutoIndent_OnTagClose(indentValue); } else if (prop.equals(AutoIndentPreferenceConstants.P_USE_SMART_PASTE)) { indentTagStrategy.setUseSmartPaste(setting); } else if (prop.equals(EditorPreferenceConstants.P_TAB_INDENTS_CURRENT_LINE)) { indentTagStrategy.setTabIndentSingleLine(setting); indentCFScriptStrategy.setTabIndentSingleLine(setting); } else if (prop.equals(ParserPreferenceConstants.P_PARSE_REPORT_ERRORS)) { //boolean reportErrors = ((Boolean)event.getNewValue()).booleanValue(); try { CFMLPlugin.getWorkspace().getRoot().deleteMarkers(null, true, IResource.DEPTH_INFINITE); } catch (CoreException ex) { ex.printStackTrace(); } } } }