Package org.cfeclipse.cfml.editors

Source Code of org.cfeclipse.cfml.editors.CFConfiguration

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

Related Classes of org.cfeclipse.cfml.editors.CFConfiguration

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.