Package com.puppetlabs.geppetto.pp.dsl.ui

Source Code of com.puppetlabs.geppetto.pp.dsl.ui.PPUiModule

/**
* Copyright (c) 2013 Puppet Labs, Inc. and other contributors, as listed below.
* 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:
*   Puppet Labs
*/
package com.puppetlabs.geppetto.pp.dsl.ui;

import com.puppetlabs.geppetto.common.tracer.AbstractTracer.DefaultStringProvider;
import com.puppetlabs.geppetto.common.tracer.DefaultTracer;
import com.puppetlabs.geppetto.common.tracer.IStringProvider;
import com.puppetlabs.geppetto.common.tracer.ITracer;
import com.puppetlabs.geppetto.pp.dsl.formatting.IBreakAndAlignAdvice;
import com.puppetlabs.geppetto.pp.dsl.formatting.PPCommentConfiguration;
import com.puppetlabs.geppetto.pp.dsl.lexer.PPOverridingLexer;
import com.puppetlabs.geppetto.pp.dsl.linking.PPSearchPath.ISearchPathProvider;
import com.puppetlabs.geppetto.pp.dsl.ui.builder.NatureAddingEditorCallback;
import com.puppetlabs.geppetto.pp.dsl.ui.builder.PPModuleMetadataBuilder;
import com.puppetlabs.geppetto.pp.dsl.ui.coloring.PPHighlightConfiguration;
import com.puppetlabs.geppetto.pp.dsl.ui.coloring.PPSemanticHighlightingCalculator;
import com.puppetlabs.geppetto.pp.dsl.ui.coloring.PPTokenToAttributeIdMapper;
import com.puppetlabs.geppetto.pp.dsl.ui.container.PPWorkspaceProjectsStateProvider;
import com.puppetlabs.geppetto.pp.dsl.ui.contentassist.PPContentAssistLexer;
import com.puppetlabs.geppetto.pp.dsl.ui.editor.PPSourceViewerConfiguration;
import com.puppetlabs.geppetto.pp.dsl.ui.editor.actions.SaveActions;
import com.puppetlabs.geppetto.pp.dsl.ui.editor.autoedit.PPEditStrategyProvider;
import com.puppetlabs.geppetto.pp.dsl.ui.editor.autoedit.PPTokenTypeToPartionMapper;
import com.puppetlabs.geppetto.pp.dsl.ui.editor.folding.PPFoldingRegionProvider;
import com.puppetlabs.geppetto.pp.dsl.ui.editor.hover.PPDocumentationProvider;
import com.puppetlabs.geppetto.pp.dsl.ui.editor.hover.PPHoverProvider;
import com.puppetlabs.geppetto.pp.dsl.ui.editor.hyperlinking.PPHyperlinkHelper;
import com.puppetlabs.geppetto.pp.dsl.ui.editor.model.PPPartitionTokenScanner;
import com.puppetlabs.geppetto.pp.dsl.ui.editor.toggleComments.PPSingleLineCommentHelper;
import com.puppetlabs.geppetto.pp.dsl.ui.formatting.ResourceIBreakAndAlignAdviceProvider;
import com.puppetlabs.geppetto.pp.dsl.ui.formatting.ResourceICommentFormatterAdviceProviders;
import com.puppetlabs.geppetto.pp.dsl.ui.formatting.ResourceIIndentationInformationProvider;
import com.puppetlabs.geppetto.pp.dsl.ui.formatting.ResourceIPreferredWidthInformationProvider;
import com.puppetlabs.geppetto.pp.dsl.ui.linked.ExtLinkedXtextEditor;
import com.puppetlabs.geppetto.pp.dsl.ui.linked.IExtXtextEditorCustomizer;
import com.puppetlabs.geppetto.pp.dsl.ui.linked.ISaveActions;
import com.puppetlabs.geppetto.pp.dsl.ui.linked.PPEditorCustomizer;
import com.puppetlabs.geppetto.pp.dsl.ui.linking.PPUISearchPathProvider;
import com.puppetlabs.geppetto.pp.dsl.ui.outline.PPLocationInFileProvider;
import com.puppetlabs.geppetto.pp.dsl.ui.preferences.PPPreferencesHelper;
import com.puppetlabs.geppetto.pp.dsl.ui.preferences.data.BreakAndAlignPreferences;
import com.puppetlabs.geppetto.pp.dsl.ui.preferences.data.CommentPreferences;
import com.puppetlabs.geppetto.pp.dsl.ui.preferences.data.FormatterGeneralPreferences;
import com.puppetlabs.geppetto.pp.dsl.ui.preferences.editors.PPPreferenceStoreAccess;
import com.puppetlabs.geppetto.pp.dsl.ui.resource.PPResource;
import com.puppetlabs.geppetto.pp.dsl.ui.resource.PPResourceFactory;
import com.puppetlabs.geppetto.pp.dsl.ui.validation.PreferenceBasedPotentialProblemsAdvisor;
import com.puppetlabs.geppetto.pp.dsl.ui.validation.PreferenceBasedValidationAdvisorProvider;
import com.puppetlabs.geppetto.pp.dsl.validation.IPotentialProblemsAdvisor;
import com.puppetlabs.geppetto.pp.dsl.validation.IValidationAdvisor;
import com.puppetlabs.xtext.dommodel.formatter.comments.ICommentFormatterAdvice;
import com.puppetlabs.xtext.formatting.IPreferredMaxWidthInformation;
import com.puppetlabs.xtext.ui.editor.formatting.ContentFormatterFactory;
import com.puppetlabs.xtext.ui.editor.formatting.ResourceILineSeparatorProvider;
import org.eclipse.jface.text.rules.IPartitionTokenScanner;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.eclipse.xtext.documentation.IEObjectDocumentationProvider;
import org.eclipse.xtext.formatting.IIndentationInformation;
import org.eclipse.xtext.formatting.ILineSeparatorInformation;
import org.eclipse.xtext.linking.lazy.LazyLinker;
import org.eclipse.xtext.resource.ILocationInFileProvider;
import org.eclipse.xtext.resource.IResourceFactory;
import org.eclipse.xtext.resource.XtextResource;
import org.eclipse.xtext.ui.editor.XtextEditor;
import org.eclipse.xtext.ui.editor.XtextSourceViewerConfiguration;
import org.eclipse.xtext.ui.editor.autoedit.AbstractEditStrategyProvider;
import org.eclipse.xtext.ui.editor.folding.IFoldingRegionProvider;
import org.eclipse.xtext.ui.editor.formatting.IContentFormatterFactory;
import org.eclipse.xtext.ui.editor.hover.IEObjectHoverProvider;
import org.eclipse.xtext.ui.editor.hyperlinking.IHyperlinkHelper;
import org.eclipse.xtext.ui.editor.model.IResourceForEditorInputFactory;
import org.eclipse.xtext.ui.editor.model.ITokenTypeToPartitionTypeMapper;
import org.eclipse.xtext.ui.editor.model.ResourceForIEditorInputFactory;
import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess;
import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreInitializer;
import org.eclipse.xtext.ui.editor.syntaxcoloring.AbstractAntlrTokenToAttributeIdMapper;
import org.eclipse.xtext.ui.editor.syntaxcoloring.IHighlightingConfiguration;
import org.eclipse.xtext.ui.editor.syntaxcoloring.ISemanticHighlightingCalculator;
import org.eclipse.xtext.ui.editor.toggleComments.ISingleLineCommentHelper;
import org.eclipse.xtext.ui.resource.IResourceSetProvider;
import org.eclipse.xtext.ui.resource.SimpleResourceSetProvider;

import com.google.inject.Binder;
import com.google.inject.name.Names;

/**
* Use this class to register components to be used within the IDE.
*/
public class PPUiModule extends com.puppetlabs.geppetto.pp.dsl.ui.AbstractPPUiModule {
  public PPUiModule(AbstractUIPlugin plugin) {
    super(plugin);
  }

  /**
   * This binding makes auto edit configurable with preferences
   */
  @Override
  public Class<? extends AbstractEditStrategyProvider> bindAbstractEditStrategyProvider() {
    return PPEditStrategyProvider.class;
  }

  @Override
  public Class<? extends IContentFormatterFactory> bindIContentFormatterFactory() {
    return ContentFormatterFactory.class;
  }

  public Class<? extends IEObjectDocumentationProvider> bindIEObjectDocumentationProvider() {
    return PPDocumentationProvider.class;
  }

  public Class<? extends IEObjectHoverProvider> bindIEObjectHoverProvider() {
    return PPHoverProvider.class;
  }

  /**
   * Binds an editor customizer with PP specific features.
   */
  public Class<? extends IExtXtextEditorCustomizer> bindIExtXtextEditorCustomizer() {
    return PPEditorCustomizer.class;
  }

  /**
   * This binding makes SL comments fold as expected.
   */
  public Class<? extends IFoldingRegionProvider> bindIFoldingRegionProvider() {
    return PPFoldingRegionProvider.class;
  }

  /**
   * This binding adds ability to find/cross reference PP elements (since they do not use EReferences).
   */
  public Class<? extends IHyperlinkHelper> bindIHyperlinkHelper() {
    return PPHyperlinkHelper.class;
  }

  @Override
  public Class<? extends IIndentationInformation> bindIIndentationInformation() {
    return null; // block the super version
  }

  public Class<? extends IHighlightingConfiguration> bindILexicalHighlightingConfiguration() {
    return PPHighlightConfiguration.class;
  }

  /**
   * The runtime module uses PPLinker.class which performs PP linking and documentation association
   * as part of the linking process. This is not suitable for use in the UI, where the PPResource is
   * instead taking over the responsibility. <br/>
   * Overrides the default runtime module's binding
   *
   * @see #bindIResourceFactory()
   */
  public Class<? extends org.eclipse.xtext.linking.ILinker> bindILinker() {
    return LazyLinker.class;
  }

  /**
   * Add specialization that selects better "significant part" per semantic object than the default.
   * (This is used when a location in a file is wanted for selection when opening the file and there is a reference
   * to the object - which of each features / text should be selected).
   *
   */
  public Class<? extends ILocationInFileProvider> bindILocationInFileProvider() {
    return PPLocationInFileProvider.class;
  }

  @Override
  public Class<? extends IPartitionTokenScanner> bindIPartitionTokenScanner() {
    return PPPartitionTokenScanner.class;
  }

  public Class<? extends IPotentialProblemsAdvisor> bindIPotentialProblemsAdvisor() {
    return PreferenceBasedPotentialProblemsAdvisor.class;
  }

  public Class<? extends IPreferenceStoreAccess> bindIPreferenceStoreAccess() {
    return PPPreferenceStoreAccess.class;
  }

  /**
   * This is an override of the runtime module's configuration as the UI should use PPResource instead of
   * LazyLinkingResource for PP linking to work correctly with the global build index.
   *
   */
  public Class<? extends IResourceFactory> bindIResourceFactory() {
    return PPResourceFactory.class;
  }

  /**
   * Deal with dependency on JDT (not wanted)
   */
  @Override
  public Class<? extends IResourceForEditorInputFactory> bindIResourceForEditorInputFactory() {
    return ResourceForIEditorInputFactory.class;
  }

  /**
   * Deal with dependency on JDT (not wanted)
   */
  @Override
  public Class<? extends IResourceSetProvider> bindIResourceSetProvider() {
    return SimpleResourceSetProvider.class;
  }

  public Class<? extends ISaveActions> bindISaveActions() {
    return SaveActions.class;
  }

  public Class<? extends ISemanticHighlightingCalculator> bindISemanticHighlightingCalculator() {
    return PPSemanticHighlightingCalculator.class;
  }

  @Override
  public Class<? extends ISingleLineCommentHelper> bindISingleLineCommentHelper() {
    return PPSingleLineCommentHelper.class;
  }

  public Class<? extends ITokenTypeToPartitionTypeMapper> bindITokenTypeToPartitionTypeMapper() {
    return PPTokenTypeToPartionMapper.class;
  }

  @Override
  public Class<? extends org.eclipse.xtext.ui.editor.IXtextEditorCallback> bindIXtextEditorCallback() {
    // Bind the Geppetto class that automatically adds puppet and xtext natures (without asking).
    return NatureAddingEditorCallback.class;
  }

  public Class<? extends PPModuleMetadataBuilder> bindModulefileBuilder() {
    return PPModuleMetadataBuilder.class;
  }

  public Class<? extends ISearchPathProvider> bindSearchPathProvider() {
    return PPUISearchPathProvider.class;
  }

  public Class<? extends AbstractAntlrTokenToAttributeIdMapper> bindTokenToAttributeIdMapper() {
    return PPTokenToAttributeIdMapper.class;
  }

  /**
   * This is an override of the runtime modules binding (using a regular LazyLinkingResource).
   */
  public Class<? extends XtextResource> bindXtextResource() {
    return PPResource.class;
  }

  /**
   * Override that injects a wrapper for the external lexer used by the main parser.
   * contributed by org.eclipse.xtext.generator.parser.antlr.ex.ca.ContentAssistParserGeneratorFragment.
   *
   * Without this override, a default generated lexer will be used and this lexer will not be correct as
   * PP parsing requires an external lexer. The binding reuses the main lexer.
   */
  @Override
  public void configureContentAssistLexer(com.google.inject.Binder binder) {
    binder.bind(org.eclipse.xtext.ui.editor.contentassist.antlr.internal.Lexer.class).annotatedWith(
      com.google.inject.name.Names.named(org.eclipse.xtext.ui.LexerUIBindings.CONTENT_ASSIST)).to(
      PPContentAssistLexer.class);
    // This is the default generated one:
    // com.puppetlabs.geppetto.pp.dsl.ui.contentassist.antlr.lexer.InternalPPLexer.class);
  }

  /**
   * Override that injects a wrapper for the external lexer used by the main parser.
   * contributed by org.eclipse.xtext.generator.parser.antlr.ex.ca.ContentAssistParserGeneratorFragment
   */
  @Override
  public void configureContentAssistLexerProvider(com.google.inject.Binder binder) {
    binder.bind(PPContentAssistLexer.class).toProvider(
      org.eclipse.xtext.parser.antlr.LexerProvider.create(PPContentAssistLexer.class));
  }

  public void configureDebugTracing(com.google.inject.Binder binder) {
    binder.bind(IStringProvider.class).to(DefaultStringProvider.class);
    binder.bind(ITracer.class).annotatedWith(Names.named(PPUiConstants.DEBUG_OPTION_MODULEFILE)).toInstance(
      new DefaultTracer(PPUiConstants.DEBUG_OPTION_MODULEFILE));
    binder.bind(ITracer.class).annotatedWith(Names.named(PPUiConstants.DEBUG_OPTION_PARSER)).toInstance(
      new DefaultTracer(PPUiConstants.DEBUG_OPTION_PARSER));
  }

  public void configureDefaultPreferences(Binder binder) {
    binder.bind(IPreferenceStoreInitializer.class).annotatedWith(Names.named("PPPreferencesHelper")) //$NON-NLS-1$
    .to(PPPreferencesHelper.class);
    binder.bind(IPreferenceStoreInitializer.class).annotatedWith(Names.named("FormatterGeneralPreferences")) //$NON-NLS-1$
    .to(FormatterGeneralPreferences.class);
    binder.bind(IPreferenceStoreInitializer.class).annotatedWith(Names.named("CommentPreferences")) //$NON-NLS-1$
    .to(CommentPreferences.class);
    binder.bind(IPreferenceStoreInitializer.class).annotatedWith(Names.named("BreakAndAlignPreferences")) //$NON-NLS-1$
    .to(BreakAndAlignPreferences.class);
  }

  public void configureEditor(Binder binder) {
    binder.bind(XtextEditor.class).to(ExtLinkedXtextEditor.class);
    binder.bind(XtextSourceViewerConfiguration.class).to(PPSourceViewerConfiguration.class);
  }

  /**
   * @see #configureResourceSpecificProviders(Binder)
   */
  public void configureFormatting(com.google.inject.Binder binder) {

    // Binds resource specific comment advice provider for SL comments
    binder.bind(ICommentFormatterAdvice.class) //
    .annotatedWith(com.google.inject.name.Names.named(PPCommentConfiguration.SL_FORMATTER_ADVICE_NAME))//
    .toProvider(ResourceICommentFormatterAdviceProviders.SLCommentAdviceProvider.class);

    // Binds resource specific comment advice provider for ML comments
    binder.bind(ICommentFormatterAdvice.class) //
    .annotatedWith(com.google.inject.name.Names.named(PPCommentConfiguration.ML_FORMATTER_ADVICE_NAME))//
    .toProvider(ResourceICommentFormatterAdviceProviders.MLCommentAdviceProvider.class);

    binder.bind(IBreakAndAlignAdvice.class) //
    .toProvider(ResourceIBreakAndAlignAdviceProvider.class);

  }

  // contributed by org.eclipse.xtext.generator.parser.antlr.ex.rt.AntlrGeneratorFragment
  @Override
  public void configureHighlightingLexer(com.google.inject.Binder binder) {
    binder.bind(org.eclipse.xtext.parser.antlr.Lexer.class).annotatedWith(
      com.google.inject.name.Names.named(org.eclipse.xtext.ui.LexerUIBindings.HIGHLIGHTING)).to(
      PPOverridingLexer.class);
  }

  public void configureIIndentationInformationProvider(Binder binder) {
    binder.bind(IIndentationInformation.class).toProvider(ResourceIIndentationInformationProvider.class);
  }

  /**
   * Binds providers of resource specific information (e.g. resource metadata, scoped preferences,
   * workspace etc.)
   */
  public void configureResourceSpecificProviders(com.google.inject.Binder binder) {
    binder.bind(ILineSeparatorInformation.class).toProvider(ResourceILineSeparatorProvider.class);
    // binder.bind(IIndentationInformation.class).toProvider(ResourceIIndentationInformationProvider.class);
    binder.bind(IPreferredMaxWidthInformation.class).toProvider(ResourceIPreferredWidthInformationProvider.class);

  }

  /**
   * Deal with dependency on JDT (not wanted).
   */
  @Override
  public com.google.inject.Provider<org.eclipse.xtext.resource.containers.IAllContainersState> provideIAllContainersState() {
    // return org.eclipse.xtext.ui.shared.Access.getWorkspaceProjectsState();
    return new PPWorkspaceProjectsStateProvider();
  }

  /**
   * A Provider of validation compliance based on preferences.
   */
  public com.google.inject.Provider<IValidationAdvisor> provideValidationAdvisor() {
    return PreferenceBasedValidationAdvisorProvider.create();
  }

}
TOP

Related Classes of com.puppetlabs.geppetto.pp.dsl.ui.PPUiModule

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.