Package org.eclipse.wst.sse.ui

Source Code of org.eclipse.wst.sse.ui.StructuredTextViewerConfiguration

/*******************************************************************************
* Copyright (c) 2001, 2011 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
*     IBM Corporation - initial API and implementation
*     Jens Lukowski/Innoopract - initial renaming/restructuring
*    
*******************************************************************************/
package org.eclipse.wst.sse.ui;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferenceConverter;
import org.eclipse.jface.text.DefaultInformationControl;
import org.eclipse.jface.text.IAutoEditStrategy;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IDocumentExtension3;
import org.eclipse.jface.text.IDocumentPartitioner;
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.contentassist.IContentAssistProcessor;
import org.eclipse.jface.text.contentassist.IContentAssistant;
import org.eclipse.jface.text.formatter.IContentFormatter;
import org.eclipse.jface.text.hyperlink.IHyperlinkPresenter;
import org.eclipse.jface.text.hyperlink.MultipleHyperlinkPresenter;
import org.eclipse.jface.text.information.IInformationPresenter;
import org.eclipse.jface.text.information.IInformationProvider;
import org.eclipse.jface.text.information.InformationPresenter;
import org.eclipse.jface.text.presentation.IPresentationReconciler;
import org.eclipse.jface.text.quickassist.IQuickAssistAssistant;
import org.eclipse.jface.text.quickassist.QuickAssistAssistant;
import org.eclipse.jface.text.reconciler.IReconciler;
import org.eclipse.jface.text.source.Annotation;
import org.eclipse.jface.text.source.IAnnotationHover;
import org.eclipse.jface.text.source.ISourceViewer;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IWorkbenchPreferenceConstants;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.editors.text.EditorsUI;
import org.eclipse.ui.editors.text.TextSourceViewerConfiguration;
import org.eclipse.ui.texteditor.ChainedPreferenceStore;
import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredPartitioning;
import org.eclipse.wst.sse.core.internal.text.rules.StructuredTextPartitioner;
import org.eclipse.wst.sse.ui.contentassist.StructuredContentAssistProcessor;
import org.eclipse.wst.sse.ui.internal.ExtendedConfigurationBuilder;
import org.eclipse.wst.sse.ui.internal.SSEUIPlugin;
import org.eclipse.wst.sse.ui.internal.StructuredTextAnnotationHover;
import org.eclipse.wst.sse.ui.internal.contentassist.StructuredContentAssistant;
import org.eclipse.wst.sse.ui.internal.correction.CompoundQuickAssistProcessor;
import org.eclipse.wst.sse.ui.internal.derived.HTMLTextPresenter;
import org.eclipse.wst.sse.ui.internal.preferences.EditorPreferenceNames;
import org.eclipse.wst.sse.ui.internal.provisional.style.LineStyleProvider;
import org.eclipse.wst.sse.ui.internal.provisional.style.ReconcilerHighlighter;
import org.eclipse.wst.sse.ui.internal.provisional.style.StructuredPresentationReconciler;
import org.eclipse.wst.sse.ui.internal.reconcile.StructuredRegionProcessor;
import org.eclipse.wst.sse.ui.internal.rules.StructuredDocumentDamagerRepairer;
import org.eclipse.wst.sse.ui.internal.taginfo.AnnotationHoverProcessor;
import org.eclipse.wst.sse.ui.internal.taginfo.BestMatchHover;
import org.eclipse.wst.sse.ui.internal.taginfo.ProblemAnnotationHoverProcessor;
import org.eclipse.wst.sse.ui.internal.taginfo.TextHoverManager;
import org.eclipse.wst.sse.ui.internal.util.EditorUtility;


/**
* Configuration for the source viewer used by StructuredTextEditor.<br />
* Note: While ISourceViewer is passed in for each get configuration, clients
* should create a new viewer configuration instance for each instance of
* source viewer as some methods return the same instance of an object,
* regardless of the sourceviewer.
* <p>
* Clients should subclass and override just those methods which must be
* specific to their needs.
* </p>
*
* @see org.eclipse.wst.sse.ui.StructuredTextEditor
* @see org.eclipse.wst.sse.ui.internal.StructuredTextViewer
* @since 1.0
*/
public class StructuredTextViewerConfiguration extends TextSourceViewerConfiguration {
  /**
   * One instance per configuration because creating a second assistant that
   * is added to a viewer can cause odd key-eating by the wrong one.
   */
  private StructuredContentAssistant fContentAssistant = null;
 
  /*
   * One instance per configuration because it's just like content assistant
   */
  private IQuickAssistAssistant fQuickAssistant = null;
  /*
   * One instance per configuration
   */
  private IReconciler fReconciler;
  /**
   * Extended configuration provisionalConfiguration type to contribute
   * additional auto edit strategies
   */
  private final String AUTOEDITSTRATEGY = "autoeditstrategy"; //$NON-NLS-1$
 
  private final String CONTENT_ASSIST_SIZE = "contentassistsize";
 
  private ReconcilerHighlighter fHighlighter = null;
 
  /**
   * Creates a structured text viewer configuration.
   */
  public StructuredTextViewerConfiguration() {
    super();
    // initialize fPreferenceStore with same preference store used in
    // StructuredTextEditor
    fPreferenceStore = createCombinedPreferenceStore();
  }

  /**
   * Create a preference store that combines the source editor preferences
   * with the base editor's preferences.
   *
   * @return IPreferenceStore
   */
  private IPreferenceStore createCombinedPreferenceStore() {
    IPreferenceStore sseEditorPrefs = SSEUIPlugin.getDefault().getPreferenceStore();
    IPreferenceStore baseEditorPrefs = EditorsUI.getPreferenceStore();
    return new ChainedPreferenceStore(new IPreferenceStore[]{sseEditorPrefs, baseEditorPrefs});
  }

  /**
   * Note: Clients cannot override this method because this method returns a
   * specially configured Annotation Hover for the StructuredTextViewer
   *
   * (non-Javadoc)
   * @see org.eclipse.ui.editors.text.TextSourceViewerConfiguration#getAnnotationHover(org.eclipse.jface.text.source.ISourceViewer)
   */
  final public IAnnotationHover getAnnotationHover(ISourceViewer sourceViewer) {
    return new StructuredTextAnnotationHover() {
      protected boolean isIncluded(Annotation annotation) {
        return isShowInVerticalRuler(annotation);
      }
    };
  }

  /**
   * Get color for the preference key. Assumes fPreferenceStore is not null.
   *
   * @param key
   * @return Color for preference key or null if none found
   */
  private Color getColor(String key) {
    RGB rgb = PreferenceConverter.getColor(fPreferenceStore, key);
    return EditorUtility.getColor(rgb);
  }

  /* (non-Javadoc)
   * @see org.eclipse.jface.text.source.SourceViewerConfiguration#getAutoEditStrategies(org.eclipse.jface.text.source.ISourceViewer, java.lang.String)
   */
  public IAutoEditStrategy[] getAutoEditStrategies(ISourceViewer sourceViewer, String contentType) {
    List allStrategies = new ArrayList(0);

    IAutoEditStrategy[] superStrategies = super.getAutoEditStrategies(sourceViewer, contentType);
    for (int i = 0; i < superStrategies.length; i++) {
      allStrategies.add(superStrategies[i]);
    }

    // add auto edit strategies contributed by clients
    List extendedAutoEdits = ExtendedConfigurationBuilder.getInstance().getConfigurations(AUTOEDITSTRATEGY, contentType);
    if (!extendedAutoEdits.isEmpty()) {
      allStrategies.addAll(extendedAutoEdits);
    }

    return (IAutoEditStrategy[]) allStrategies.toArray(new IAutoEditStrategy[allStrategies.size()]);
  }

  /**
   * Returns the configured partitioning for the given source viewer. The
   * partitioning is used when the querying content types from the source
   * viewer's input document.<br />
   * Note: Clients cannot override this method at this time.
   *
   * @param sourceViewer
   *            the source viewer to be configured by this configuration
   * @return the configured partitioning
   * @see #getConfiguredContentTypes(ISourceViewer)
   */
  final public String getConfiguredDocumentPartitioning(ISourceViewer sourceViewer) {
    /*
     * This implementation returns default structured text partitioning
     */
    return IStructuredPartitioning.DEFAULT_STRUCTURED_PARTITIONING;
  }

  public int[] getConfiguredTextHoverStateMasks(ISourceViewer sourceViewer, String contentType) {
    /*
     * This implementation returns configured text hover state masks for
     * StructuredTextViewers
     */
    TextHoverManager.TextHoverDescriptor[] hoverDescs = SSEUIPlugin.getDefault().getTextHoverManager().getTextHovers();
    int stateMasks[] = new int[hoverDescs.length];
    int stateMasksLength = 0;
    for (int i = 0; i < hoverDescs.length; i++) {
      if (hoverDescs[i].isEnabled()) {
        int j = 0;
        int stateMask = computeStateMask(hoverDescs[i].getModifierString());
        while (j < stateMasksLength) {
          if (stateMasks[j] == stateMask)
            break;
          j++;
        }
        if (j == stateMasksLength)
          stateMasks[stateMasksLength++] = stateMask;
      }
    }
    if (stateMasksLength == hoverDescs.length)
      return stateMasks;

    int[] shortenedStateMasks = new int[stateMasksLength];
    System.arraycopy(stateMasks, 0, shortenedStateMasks, 0, stateMasksLength);
    return shortenedStateMasks;
  }

  /**
   * Returns the content assistant ready to be used with the given source
   * viewer.<br />
   * Note: The same instance of IContentAssistant is returned regardless of
   * the source viewer passed in.
   * <p>
   * Clients should generally not override this method. Instead, clients
   * wanting to add their own processors should override
   * <code>getContentAssistProcessors(ISourceViewer, String)</code>
   * </p>
   *
   * @param sourceViewer
   *            the source viewer to be configured by this configuration
   * @return a content assistant
   * @see #getContentAssistProcessors(ISourceViewer, String)
   */
  public IContentAssistant getContentAssistant(ISourceViewer sourceViewer) {
    /*
     * Note: This method was made final so that StructuredContentAssist is
     * always used and content assist extension point always works.
     */
    if (fContentAssistant == null) {
      fContentAssistant = new StructuredContentAssistant();

      // content assistant configurations
      fContentAssistant.setDocumentPartitioning(getConfiguredDocumentPartitioning(sourceViewer));
      fContentAssistant.enableAutoActivation(true);
      fContentAssistant.setProposalPopupOrientation(IContentAssistant.PROPOSAL_OVERLAY);
      fContentAssistant.setContextInformationPopupOrientation(IContentAssistant.CONTEXT_INFO_ABOVE);
      fContentAssistant.setInformationControlCreator(getInformationControlCreator(sourceViewer));
      fContentAssistant.enableColoredLabels(PlatformUI.getPreferenceStore().getBoolean(IWorkbenchPreferenceConstants.USE_COLORED_LABELS));

      // set content assist preferences
      if (fPreferenceStore != null) {
        int delay = fPreferenceStore.getInt(EditorPreferenceNames.CODEASSIST_AUTOACTIVATION_DELAY);
        fContentAssistant.setAutoActivationDelay(delay);

        Color color = getColor(EditorPreferenceNames.CODEASSIST_PROPOSALS_BACKGROUND);
        fContentAssistant.setProposalSelectorBackground(color);

        color = getColor(EditorPreferenceNames.CODEASSIST_PROPOSALS_FOREGROUND);
        fContentAssistant.setProposalSelectorForeground(color);

        color = getColor(EditorPreferenceNames.CODEASSIST_PARAMETERS_BACKGROUND);
        fContentAssistant.setContextInformationPopupBackground(color);
        fContentAssistant.setContextSelectorBackground(color);

        color = getColor(EditorPreferenceNames.CODEASSIST_PARAMETERS_FOREGROUND);
        fContentAssistant.setContextInformationPopupForeground(color);
        fContentAssistant.setContextSelectorForeground(color);
      }
     
      // add content assist processors for each partition type
      String[] types = getConfiguredContentTypes(sourceViewer);
      for (int i = 0; i < types.length; i++) {
        String type = types[i];

        // add all content assist processors for current partiton type
        IContentAssistProcessor[] processors = getContentAssistProcessors(sourceViewer, type);
        if (processors != null) {
          for (int j = 0; j < processors.length; j++) {
            fContentAssistant.setContentAssistProcessor(processors[j], type);
          }
        }
      }
      IDialogSettings dialogSettings = SSEUIPlugin.getInstance().getDialogSettings();
      if(dialogSettings != null) {
        IDialogSettings section = dialogSettings.getSection(CONTENT_ASSIST_SIZE);
        if(section == null) {
          section = dialogSettings.addNewSection(CONTENT_ASSIST_SIZE);
        }
        fContentAssistant.setRestoreCompletionProposalSize(section);
      }
    }
    return fContentAssistant;
  }

  /**
   * <p>Returns a {@link StructuredContentAssistProcessor} which can be contributed to through
   * the <tt>org.eclipse.wst.sse.ui.completionProposal</tt> extension point.</p>
   *
   * <p>If an extender of this class overrides this method and does not include an
   * implementation of a {@link StructuredContentAssistProcessor} in their returned
   * processors then all of the contributions by the aforementioned extension point
   * will be left out.</p>
   *
   * @param sourceViewer
   *            the source viewer to be configured by this configuration
   * @param partitionType
   *            the partition type for which the content assist processors
   *            are applicable
   * @return IContentAssistProcessors or null if should not be supported
   */
  protected IContentAssistProcessor[] getContentAssistProcessors(ISourceViewer sourceViewer, String partitionType) {
    IContentAssistProcessor processor = new StructuredContentAssistProcessor(
        fContentAssistant, partitionType, sourceViewer, null);
    return new IContentAssistProcessor[]{processor};
  }

  /**
   * Returns the content formatter ready to be used with the given source
   * viewer.
   * <p>
   * It is not recommended that clients override this method as it may
   * become <code>final</code> in the future and replaced by an extensible
   * framework.
   * </p>
   *
   * @param sourceViewer
   *            the source viewer to be configured by this configuration
   * @return a content formatter or <code>null</code> if formatting should
   *         not be supported
   */
  public IContentFormatter getContentFormatter(ISourceViewer sourceViewer) {
    // try to use the StructuredTextMultiPassContentFormatter so that it
    // picks up any additional formatting strategies contributed via the
    // editorConfiguration extension point
    IContentFormatter formatter = null;
    if (sourceViewer != null) {
      IDocument document = sourceViewer.getDocument();
      if (document instanceof IDocumentExtension3) {
        String partitioning = getConfiguredDocumentPartitioning(sourceViewer);
        IDocumentPartitioner partitioner = ((IDocumentExtension3) document).getDocumentPartitioner(partitioning);
        if (partitioner instanceof StructuredTextPartitioner) {
          String defaultPartitionType = ((StructuredTextPartitioner) partitioner).getDefaultPartitionType();
          formatter = new StructuredTextMultiPassContentFormatter(partitioning, defaultPartitionType);
        }
      }
    }

    return formatter;
  }

  /**
   * Returns the double-click strategy ready to be used in this viewer when
   * double clicking onto text of the given content type. Note that if
   * clients want to contribute their own doubleclick strategy, they should
   * use <code>org.eclipse.wst.sse.ui.editorConfiguration</code> extension
   * point's <code>doubleClickStrategy</code> element instead of
   * overriding this method. If clients do override this method, please
   * remember to call <code>super.getDoubleClickStrategy()</code>.
   *
   * @param sourceViewer
   *            the source viewer to be configured by this configuration
   * @param contentType
   *            the content type for which the strategy is applicable
   * @return a double-click strategy or <code>null</code> if double
   *         clicking should not be supported
   */
  public ITextDoubleClickStrategy getDoubleClickStrategy(ISourceViewer sourceViewer, String contentType) {
    ITextDoubleClickStrategy strategy = null;
    Object extendedStrategy = ExtendedConfigurationBuilder.getInstance().getConfiguration(ExtendedConfigurationBuilder.DOUBLECLICKSTRATEGY, contentType);
    if (extendedStrategy instanceof ITextDoubleClickStrategy) {
      strategy = (ITextDoubleClickStrategy) extendedStrategy;
    }
    else {
      strategy = super.getDoubleClickStrategy(sourceViewer, contentType);
    }
    return strategy;
  }

  /**
   * Returns the hyperlink presenter for the given source viewer.<br />
   * Note: Clients cannot override this method, and although it's no longer
   * necessary, it must remain for binary compatibility.
   *
   * @param sourceViewer
   *            the source viewer to be configured by this configuration
   * @return a hyperlink presenter specially configured for
   *         StructuredTextViewer
   */
  final public IHyperlinkPresenter getHyperlinkPresenter(ISourceViewer sourceViewer) {
    if (fPreferenceStore == null) {
      return super.getHyperlinkPresenter(sourceViewer);
    }
    return new MultipleHyperlinkPresenter(fPreferenceStore);
  }
 
  /**
   * Returns the information control creator. The creator is a factory
   * creating information controls for the given source viewer.<br />
   * Note: Clients cannot override this method at this time.
   *
   * @param sourceViewer
   *            the source viewer to be configured by this configuration
   * @return the information control creator
   */
  final public IInformationControlCreator getInformationControlCreator(ISourceViewer sourceViewer) {
    // used by hover help
    return new IInformationControlCreator() {
      public IInformationControl createInformationControl(Shell parent) {
        return new DefaultInformationControl(parent, new HTMLTextPresenter(true));
      }
    };
  }

  /**
   * Returns the information presenter ready to be used with the given
   * source viewer.
   * <p>
   * Clients cannot override this method. Instead, clients wanting to add
   * their own information providers should override
   * <code>getInformationProvider(ISourceViewer, String)</code>
   * </p>
   *
   * @param sourceViewer
   *            the source viewer to be configured by this configuration
   * @return a content assistant
   * @see #getInformationProvider(ISourceViewer, String)
   */
  final public IInformationPresenter getInformationPresenter(ISourceViewer sourceViewer) {
    InformationPresenter presenter = new InformationPresenter(getInformationPresenterControlCreator(sourceViewer));

    // information presenter configurations
    presenter.setSizeConstraints(60, 10, true, true);
    presenter.setDocumentPartitioning(getConfiguredDocumentPartitioning(sourceViewer));

    // add information providers for each partition type
    String[] types = getConfiguredContentTypes(sourceViewer);
    for (int i = 0; i < types.length; i++) {
      String type = types[i];

      IInformationProvider provider = getInformationProvider(sourceViewer, type);
      if (provider != null) {
        presenter.setInformationProvider(provider, type);
      }
    }

    return presenter;
  }

  /**
   * Returns the information provider that will be used for information
   * presentation in the given source viewer and for the given partition
   * type.
   *
   * @param sourceViewer
   *            the source viewer to be configured by this configuration
   * @param partitionType
   *            the partition type for which the information provider is
   *            applicable
   * @return IInformationProvider or null if should not be supported
   * @deprecated instead of overriding this method to provide documentation
   *             information, adopters should use the
   *             <code>documentationTextHover</code> element in the
   *             <code>org.eclipse.wst.sse.ui.editorConfiguration</code>
   *             extension point
   */
  protected IInformationProvider getInformationProvider(ISourceViewer sourceViewer, String partitionType) {
    ITextHover bestMatchHover = new BestMatchHover(partitionType);
    return new TextHoverInformationProvider(bestMatchHover);
  }

  /**
   * Returns the information presenter control creator. The creator is a
   * factory creating the presenter controls for the given source viewer.
   *
   * @param sourceViewer
   *            the source viewer to be configured by this configuration
   * @return an information control creator
   */
  private IInformationControlCreator getInformationPresenterControlCreator(ISourceViewer sourceViewer) {
    return new IInformationControlCreator() {
      public IInformationControl createInformationControl(Shell parent) {
        int shellStyle = SWT.RESIZE | SWT.TOOL;
        int style = SWT.V_SCROLL | SWT.H_SCROLL;
        return new DefaultInformationControl(parent, shellStyle, style, new HTMLTextPresenter(false));
      }
    };
  }

  /**
   * Returns the line style providers that will be used for syntax
   * highlighting in the given source viewer.
   * <p>
   * Not fully API since return type LineStyleProvider is not API.
   * </p>
   *
   * @param sourceViewer
   *            the source viewer to be configured by this configuration
   * @param partitionType
   *            the partition type for which the lineStyleProviders are
   *            applicable
   * @return LineStyleProvders or null if should not be supported
   */
  public LineStyleProvider[] getLineStyleProviders(ISourceViewer sourceViewer, String partitionType) {
    return null;
  }

  /**
   * See <code>getLineStyleProviders(ISourceViewer, String)</code> for
   * alternative way to provide highlighting information.
   *
   * @param sourceViewer
   *            the source viewer to be configured by this configuration
   * @return always returns null
   * @see #getLineStyleProviders(ISourceViewer, String)
   */
  public IPresentationReconciler getPresentationReconciler(ISourceViewer sourceViewer) {
    StructuredPresentationReconciler reconciler = new StructuredPresentationReconciler();
    reconciler.setDocumentPartitioning(getConfiguredDocumentPartitioning(sourceViewer));
   
    String[] contentTypes = getConfiguredContentTypes(sourceViewer);
   
    if(contentTypes != null) {
      StructuredDocumentDamagerRepairer dr = null;
     
      for (int i = 0; i < contentTypes.length; i++) {
        if (fHighlighter != null) {
          LineStyleProvider provider = fHighlighter.getProvider(contentTypes[i]);
          if (provider == null)
            continue;
         
          dr = new StructuredDocumentDamagerRepairer(provider);
          dr.setDocument(sourceViewer.getDocument());
          reconciler.setDamager(dr, contentTypes[i]);
          reconciler.setRepairer(dr, contentTypes[i]);
        }
      }
    }
   
    return reconciler;
  }
 
  /* (non-Javadoc)
   * @see org.eclipse.ui.editors.text.TextSourceViewerConfiguration#getOverviewRulerAnnotationHover(org.eclipse.jface.text.source.ISourceViewer)
   */
  public IAnnotationHover getOverviewRulerAnnotationHover(ISourceViewer sourceViewer) {
    return new StructuredTextAnnotationHover(true) {
      protected boolean isIncluded(Annotation annotation) {
        return isShowInOverviewRuler(annotation);
      }
    };
  }

  /*
   * @see org.eclipse.jface.text.source.SourceViewerConfiguration#getQuickAssistAssistant(org.eclipse.jface.text.source.ISourceViewer)
   */
  public IQuickAssistAssistant getQuickAssistAssistant(ISourceViewer sourceViewer) {
    if (fQuickAssistant == null) {
      IQuickAssistAssistant assistant = new QuickAssistAssistant();
      assistant.setQuickAssistProcessor(new CompoundQuickAssistProcessor());
      assistant.setInformationControlCreator(getQuickAssistAssistantInformationControlCreator());

      // Waiting for color preferences, see:
      // https://bugs.eclipse.org/bugs/show_bug.cgi?id=133731
      // set content assist preferences
      if (fPreferenceStore != null) {
        Color color = getColor(EditorPreferenceNames.CODEASSIST_PROPOSALS_BACKGROUND);
        assistant.setProposalSelectorBackground(color);

        color = getColor(EditorPreferenceNames.CODEASSIST_PROPOSALS_FOREGROUND);
        assistant.setProposalSelectorForeground(color);
      }
      fQuickAssistant = assistant;
    }
    return fQuickAssistant;
  }

  /**
   * Returns the information control creator for the quick assist assistant.
   *
   * @return the information control creator
   */
  private IInformationControlCreator getQuickAssistAssistantInformationControlCreator() {
    return new IInformationControlCreator() {
      public IInformationControl createInformationControl(Shell parent) {
        return new DefaultInformationControl(parent, new HTMLTextPresenter(true));
      }
    };
  }

  /**
   * Returns the reconciler ready to be used with the given source viewer.<br />
   * Note: The same instance of IReconciler is returned regardless of the
   * source viewer passed in.
   * <p>
   * Clients cannot override this method. Instead, clients wanting to add
   * their own reconciling strategy should use the
   * <code>org.eclipse.wst.sse.ui.extensions.sourcevalidation</code>
   * extension point.
   * </p>
   *
   * @param sourceViewer
   *            the source viewer to be configured by this configuration
   * @return a reconciler
   */
  final public IReconciler getReconciler(ISourceViewer sourceViewer) {
    IReconciler reconciler = null;
   
    if (sourceViewer != null) {
      //Only create reconciler if sourceViewer is present
      if (fReconciler == null && sourceViewer != null) {
        StructuredRegionProcessor newReconciler = new StructuredRegionProcessor();
 
        // reconciler configurations
        newReconciler.setDocumentPartitioning(getConfiguredDocumentPartitioning(sourceViewer));
 
        fReconciler = newReconciler;
      }
      reconciler = fReconciler;
    }
   
    return reconciler;
  }

  /**
   * @since 2.0
   * @param treeViewer
   * @return a label provider providing the status line contents
   */
  public ILabelProvider getStatusLineLabelProvider(ISourceViewer sourceViewer) {
    return null;
  }

  /**
   * Create documentation hovers based on hovers contributed via
   * <code>org.eclipse.wst.sse.ui.editorConfiguration</code> extension
   * point
   *
   * @param partitionType
   * @return
   */
  private ITextHover[] createDocumentationHovers(String partitionType) {
    List extendedTextHover = ExtendedConfigurationBuilder.getInstance().getConfigurations(ExtendedConfigurationBuilder.DOCUMENTATIONTEXTHOVER, partitionType);
    ITextHover[] hovers = (ITextHover[]) extendedTextHover.toArray(new ITextHover[extendedTextHover.size()]);
    return hovers;
  }

  public ITextHover getTextHover(ISourceViewer sourceViewer, String contentType, int stateMask) {
    ITextHover textHover = null;

    /*
     * Returns a default problem, annotation, and best match hover
     * depending on stateMask
     */
    TextHoverManager.TextHoverDescriptor[] hoverDescs = SSEUIPlugin.getDefault().getTextHoverManager().getTextHovers();
    int i = 0;
    while (i < hoverDescs.length && textHover == null) {
      if (hoverDescs[i].isEnabled() && computeStateMask(hoverDescs[i].getModifierString()) == stateMask) {
        String hoverType = hoverDescs[i].getId();
        if (TextHoverManager.PROBLEM_HOVER.equalsIgnoreCase(hoverType))
          textHover = new ProblemAnnotationHoverProcessor();
        else if (TextHoverManager.ANNOTATION_HOVER.equalsIgnoreCase(hoverType))
          textHover = new AnnotationHoverProcessor();
        else if (TextHoverManager.COMBINATION_HOVER.equalsIgnoreCase(hoverType))
          textHover = new BestMatchHover(contentType);
        else if (TextHoverManager.DOCUMENTATION_HOVER.equalsIgnoreCase(hoverType)) {
          ITextHover[] hovers = createDocumentationHovers(contentType);
          if (hovers.length > 0) {
            textHover = hovers[0];
          }
        }
      }
      i++;
    }
    return textHover;
  }

  /**
   * Returns the undo manager for the given source viewer.<br />
   * Note: Clients cannot override this method because this method returns a
   * specially configured undo manager for the StructuredTextViewer.
   *
   * @param sourceViewer
   *            the source viewer to be configured by this configuration
   * @return an undo manager specially configured for StructuredTextViewer
   */
  final public IUndoManager getUndoManager(ISourceViewer sourceViewer) {
    /*
     * This implementation returns an UndoManager that is used exclusively
     * in StructuredTextViewer
     */
    return new StructuredTextViewerUndoManager();
  }
 
  public void setHighlighter(ReconcilerHighlighter highlighter) {
    fHighlighter = highlighter;
  }
 
  /**
   * @return the associated content assistnat
   */
  protected StructuredContentAssistant getContentAssistant() {
    return this.fContentAssistant;
  }
}
TOP

Related Classes of org.eclipse.wst.sse.ui.StructuredTextViewerConfiguration

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.