/**
 * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
 * 
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 * 
 * SPDX-License-Identifier: EPL-2.0
 * 
 * Contributors:
 * Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
 * 
 * 
 *  This copyright notice shows up in the generated Java code
 */
package org.eclipse.osbp.xtext.reportdsl.ui.contentassist;

import com.google.common.base.Objects;
import com.google.inject.Inject;
import java.util.Collection;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.text.contentassist.ICompletionProposal;
import org.eclipse.jface.viewers.StyledString;
import org.eclipse.osbp.preferences.PersistenceUnitConfiguration;
import org.eclipse.osbp.preferences.ProductConfiguration;
import org.eclipse.osbp.preferences.ProductConfigurationPrefs;
import org.eclipse.osbp.xtext.basic.ui.contentassist.BasicDSLProposalProviderHelper;
import org.eclipse.osbp.xtext.datamartdsl.DatamartAttribute;
import org.eclipse.osbp.xtext.datamartdsl.DatamartEntity;
import org.eclipse.osbp.xtext.datamartdsl.DatamartNavigation;
import org.eclipse.osbp.xtext.reportdsl.AutoText;
import org.eclipse.osbp.xtext.reportdsl.BinaryAggregationTypeEnum;
import org.eclipse.osbp.xtext.reportdsl.DatamartTable;
import org.eclipse.osbp.xtext.reportdsl.DatamartTableAttribute;
import org.eclipse.osbp.xtext.reportdsl.DatamartTableDetail;
import org.eclipse.osbp.xtext.reportdsl.DatamartTableFooter;
import org.eclipse.osbp.xtext.reportdsl.DatamartTableGroup;
import org.eclipse.osbp.xtext.reportdsl.DatamartTableHeader;
import org.eclipse.osbp.xtext.reportdsl.Grid;
import org.eclipse.osbp.xtext.reportdsl.Image;
import org.eclipse.osbp.xtext.reportdsl.MultipleAggregationTypeEnum;
import org.eclipse.osbp.xtext.reportdsl.PageDetail;
import org.eclipse.osbp.xtext.reportdsl.PageTemplate;
import org.eclipse.osbp.xtext.reportdsl.StringBinder;
import org.eclipse.osbp.xtext.reportdsl.Style;
import org.eclipse.osbp.xtext.reportdsl.SubSubTitle;
import org.eclipse.osbp.xtext.reportdsl.SubTitle;
import org.eclipse.osbp.xtext.reportdsl.TableAggregation;
import org.eclipse.osbp.xtext.reportdsl.TableAttribute;
import org.eclipse.osbp.xtext.reportdsl.TableBinaryAggregation;
import org.eclipse.osbp.xtext.reportdsl.TableMultipleAggregation;
import org.eclipse.osbp.xtext.reportdsl.TableUnaryAggregation;
import org.eclipse.osbp.xtext.reportdsl.Text;
import org.eclipse.osbp.xtext.reportdsl.Title;
import org.eclipse.osbp.xtext.reportdsl.UnaryAggregationTypeEnum;
import org.eclipse.osbp.xtext.reportdsl.ui.ReportDSLUiDocumentationTranslator;
import org.eclipse.osbp.xtext.reportdsl.ui.contentassist.AbstractReportDSLProposalProvider;
import org.eclipse.osbp.xtext.reportdsl.ui.contentassist.ColorTextApplier;
import org.eclipse.osbp.xtext.reportdsl.ui.contentassist.FileNameTextApplier;
import org.eclipse.osbp.xtext.reportdsl.ui.contentassist.IconNameTextApplier;
import org.eclipse.xtext.AbstractElement;
import org.eclipse.xtext.Assignment;
import org.eclipse.xtext.EnumLiteralDeclaration;
import org.eclipse.xtext.Keyword;
import org.eclipse.xtext.ParserRule;
import org.eclipse.xtext.RuleCall;
import org.eclipse.xtext.TypeRef;
import org.eclipse.xtext.common.ui.contentassist.TerminalsProposalProvider;
import org.eclipse.xtext.ui.editor.contentassist.ConfigurableCompletionProposal;
import org.eclipse.xtext.ui.editor.contentassist.ContentAssistContext;
import org.eclipse.xtext.ui.editor.contentassist.ICompletionProposalAcceptor;

/**
 * see http://www.eclipse.org/Xtext/documentation.html#contentAssist on how to customize content assistant
 */
@SuppressWarnings("all")
public class ReportDSLProposalProvider extends AbstractReportDSLProposalProvider {
  @Inject
  private TerminalsProposalProvider provider;
  
  @Inject
  private BasicDSLProposalProviderHelper providerHelper;
  
  private ICompletionProposal proposal;
  
  public void iconPickerProposal(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor, final String fileExtensions) {
    ICompletionProposal _createCompletionProposal = this.createCompletionProposal("Select icon...", context);
    ConfigurableCompletionProposal fileName = ((ConfigurableCompletionProposal) _createCompletionProposal);
    boolean _notEquals = (!Objects.equal(fileName, null));
    if (_notEquals) {
      IconNameTextApplier applier = new IconNameTextApplier();
      applier.setExtensions(fileExtensions.split(","));
      applier.setContext(context);
      fileName.setTextApplier(applier);
    }
    acceptor.accept(fileName);
  }
  
  @Override
  public void completeTableTrend_Icon(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    this.iconPickerProposal(model, assignment, context, acceptor, ".png");
  }
  
  @Override
  public void completeTableIcon_Icon(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    this.iconPickerProposal(model, assignment, context, acceptor, ".png");
  }
  
  @Override
  public void completeKeyword(final Keyword keyword, final ContentAssistContext contentAssistContext, final ICompletionProposalAcceptor acceptor) {
    boolean _allowedKeyword = this.allowedKeyword(keyword, contentAssistContext, acceptor);
    if (_allowedKeyword) {
      super.completeKeyword(keyword, contentAssistContext, acceptor);
    }
  }
  
  private boolean allowedKeyword(final Keyword keyword, final ContentAssistContext contentAssistContext, final ICompletionProposalAcceptor acceptor) {
    if ((this.isInPageTemplate(contentAssistContext) && this.isAPageTemplateNotAllowedTableRule(keyword, contentAssistContext, acceptor))) {
      return false;
    }
    if (((!this.isPageDetail(contentAssistContext)) && this.isAHeaderFooterNotAllowedTableRule(keyword, contentAssistContext, acceptor))) {
      return false;
    }
    if ((this.isTableHeader(contentAssistContext) && this.isAHeaderNotAllowedTableRule(keyword, contentAssistContext, acceptor))) {
      return false;
    }
    if ((this.isTableGroupHeader(contentAssistContext) && this.isAHeaderFooterNotAllowedTableRule(keyword, contentAssistContext, acceptor))) {
      return false;
    }
    boolean _isDatamartTableGroupNotAllowed = this.isDatamartTableGroupNotAllowed(keyword, contentAssistContext, acceptor);
    if (_isDatamartTableGroupNotAllowed) {
      return false;
    }
    return true;
  }
  
  private boolean isAPageTemplateNotAllowedTableRule(final Keyword keyword, final ContentAssistContext contentAssistContext, final ICompletionProposalAcceptor acceptor) {
    return (((((((this.isDatamartTableRule(keyword, contentAssistContext, acceptor) || this.isDatamartTableAttributeRule(keyword, contentAssistContext, acceptor)) || this.isTableAttributeRule(keyword, contentAssistContext, acceptor)) || this.isDatamartTableGroupRule(keyword, contentAssistContext, acceptor)) || this.isTableAggregationRule(keyword, contentAssistContext, acceptor)) || this.isTableUnaryAggregationRule(keyword, contentAssistContext, acceptor)) || this.isTableMultipleAggregationRule(keyword, contentAssistContext, acceptor)) || this.isTableBinaryAggregationRule(keyword, contentAssistContext, acceptor));
  }
  
  private boolean isAHeaderNotAllowedTableRule(final Keyword keyword, final ContentAssistContext contentAssistContext, final ICompletionProposalAcceptor acceptor) {
    return (((((((((((this.isDatamartTableRule(keyword, contentAssistContext, acceptor) || this.isDatamartTableAttributeRule(keyword, contentAssistContext, acceptor)) || this.isTableAttributeRule(keyword, contentAssistContext, acceptor)) || this.isDatamartTableGroupRule(keyword, contentAssistContext, acceptor)) || this.isImageAttributeRule(keyword, contentAssistContext, acceptor)) || this.isTableAggregationRule(keyword, contentAssistContext, acceptor)) || this.isStringBinderRule(keyword, contentAssistContext, acceptor)) || this.isTitleBinderRule(keyword, contentAssistContext, acceptor)) || this.isSubTitleBinderRule(keyword, contentAssistContext, acceptor)) || this.isSubSubTitleBinderRule(keyword, contentAssistContext, acceptor)) || this.isTextRule(keyword, contentAssistContext, acceptor)) || this.isAutoTextRule(keyword, contentAssistContext, acceptor));
  }
  
  private boolean isAHeaderFooterNotAllowedTableRule(final Keyword keyword, final ContentAssistContext contentAssistContext, final ICompletionProposalAcceptor acceptor) {
    return (((((this.isDatamartTableRule(keyword, contentAssistContext, acceptor) || this.isDatamartTableAttributeRule(keyword, contentAssistContext, acceptor)) || this.isDatamartTableGroupRule(keyword, contentAssistContext, acceptor)) || this.isTableUnaryAggregationRule(keyword, contentAssistContext, acceptor)) || this.isTableMultipleAggregationRule(keyword, contentAssistContext, acceptor)) || this.isTableBinaryAggregationRule(keyword, contentAssistContext, acceptor));
  }
  
  private boolean isDatamartTableGroupNotAllowed(final Keyword keyword, final ContentAssistContext contentAssistContext, final ICompletionProposalAcceptor acceptor) {
    EObject _currentModel = contentAssistContext.getCurrentModel();
    if ((_currentModel instanceof TableAggregation)) {
      EObject _currentModel_1 = contentAssistContext.getCurrentModel();
      TableAggregation aggregation = ((TableAggregation) _currentModel_1);
      EObject eObj = aggregation.eContainer();
      while (((eObj != null) && ((!(eObj instanceof DatamartTable)) && (!(eObj instanceof Grid))))) {
        eObj = eObj.eContainer();
      }
      if ((eObj instanceof Grid)) {
        return true;
      }
    }
    return false;
  }
  
  private boolean isDatamartTableRule(final Keyword keyword, final ContentAssistContext contentAssistContext, final ICompletionProposalAcceptor acceptor) {
    return this.isFromRuleClass(keyword, contentAssistContext, acceptor, DatamartTable.class);
  }
  
  private boolean isDatamartTableHeaderRule(final Keyword keyword, final ContentAssistContext contentAssistContext, final ICompletionProposalAcceptor acceptor) {
    return this.isFromRuleClass(keyword, contentAssistContext, acceptor, DatamartTableHeader.class);
  }
  
  private boolean isDatamartTableFooterRule(final Keyword keyword, final ContentAssistContext contentAssistContext, final ICompletionProposalAcceptor acceptor) {
    return this.isFromRuleClass(keyword, contentAssistContext, acceptor, DatamartTableHeader.class);
  }
  
  private boolean isDatamartTableAttributeRule(final Keyword keyword, final ContentAssistContext contentAssistContext, final ICompletionProposalAcceptor acceptor) {
    return this.isFromRuleClass(keyword, contentAssistContext, acceptor, DatamartTableAttribute.class);
  }
  
  private boolean isTableAttributeRule(final Keyword keyword, final ContentAssistContext contentAssistContext, final ICompletionProposalAcceptor acceptor) {
    return this.isFromRuleClass(keyword, contentAssistContext, acceptor, TableAttribute.class);
  }
  
  private boolean isDatamartTableGroupRule(final Keyword keyword, final ContentAssistContext contentAssistContext, final ICompletionProposalAcceptor acceptor) {
    return this.isFromRuleClass(keyword, contentAssistContext, acceptor, DatamartTableGroup.class);
  }
  
  private boolean isImageAttributeRule(final Keyword keyword, final ContentAssistContext contentAssistContext, final ICompletionProposalAcceptor acceptor) {
    return this.isFromRuleClass(keyword, contentAssistContext, acceptor, Image.class);
  }
  
  private boolean isTableUnaryAggregationRule(final Keyword keyword, final ContentAssistContext contentAssistContext, final ICompletionProposalAcceptor acceptor) {
    return (this.isFromRuleClass(keyword, contentAssistContext, acceptor, UnaryAggregationTypeEnum.class) || this.isFromRuleClass(keyword, contentAssistContext, acceptor, TableUnaryAggregation.class));
  }
  
  private boolean isTableMultipleAggregationRule(final Keyword keyword, final ContentAssistContext contentAssistContext, final ICompletionProposalAcceptor acceptor) {
    return (this.isFromRuleClass(keyword, contentAssistContext, acceptor, MultipleAggregationTypeEnum.class) || this.isFromRuleClass(keyword, contentAssistContext, acceptor, TableMultipleAggregation.class));
  }
  
  private boolean isTableBinaryAggregationRule(final Keyword keyword, final ContentAssistContext contentAssistContext, final ICompletionProposalAcceptor acceptor) {
    return (this.isFromRuleClass(keyword, contentAssistContext, acceptor, BinaryAggregationTypeEnum.class) || this.isFromRuleClass(keyword, contentAssistContext, acceptor, TableBinaryAggregation.class));
  }
  
  private boolean isTableAggregationRule(final Keyword keyword, final ContentAssistContext contentAssistContext, final ICompletionProposalAcceptor acceptor) {
    return this.isFromRuleClass(keyword, contentAssistContext, acceptor, TableAggregation.class);
  }
  
  private boolean isStringBinderRule(final Keyword keyword, final ContentAssistContext contentAssistContext, final ICompletionProposalAcceptor acceptor) {
    return this.isFromRuleClass(keyword, contentAssistContext, acceptor, StringBinder.class);
  }
  
  private boolean isTitleBinderRule(final Keyword keyword, final ContentAssistContext contentAssistContext, final ICompletionProposalAcceptor acceptor) {
    return this.isFromRuleClass(keyword, contentAssistContext, acceptor, Title.class);
  }
  
  private boolean isSubTitleBinderRule(final Keyword keyword, final ContentAssistContext contentAssistContext, final ICompletionProposalAcceptor acceptor) {
    return this.isFromRuleClass(keyword, contentAssistContext, acceptor, SubTitle.class);
  }
  
  private boolean isSubSubTitleBinderRule(final Keyword keyword, final ContentAssistContext contentAssistContext, final ICompletionProposalAcceptor acceptor) {
    return this.isFromRuleClass(keyword, contentAssistContext, acceptor, SubSubTitle.class);
  }
  
  private boolean isTextRule(final Keyword keyword, final ContentAssistContext contentAssistContext, final ICompletionProposalAcceptor acceptor) {
    return this.isFromRuleClass(keyword, contentAssistContext, acceptor, Text.class);
  }
  
  private boolean isAutoTextRule(final Keyword keyword, final ContentAssistContext contentAssistContext, final ICompletionProposalAcceptor acceptor) {
    return this.isFromRuleClass(keyword, contentAssistContext, acceptor, AutoText.class);
  }
  
  private boolean isFromRuleClass(final Keyword keyword, final ContentAssistContext contentAssistContext, final ICompletionProposalAcceptor acceptor, final Class ruleClass) {
    if ((keyword instanceof Keyword)) {
      String ruleClassName = ruleClass.getCanonicalName();
      EObject eObj = keyword.eContainer();
      while (((eObj != null) && (!((eObj instanceof ParserRule) || (eObj instanceof EnumLiteralDeclaration))))) {
        eObj = eObj.eContainer();
      }
      if ((eObj instanceof ParserRule)) {
        ParserRule parserRule = ((ParserRule) eObj);
        TypeRef type = parserRule.getType();
        EClassifier classifier = type.getClassifier();
        Class<?> instanceClass = classifier.getInstanceClass();
        return instanceClass.getCanonicalName().equals(ruleClassName);
      } else {
        if ((eObj instanceof EnumLiteralDeclaration)) {
          EnumLiteralDeclaration enumLiteralDeclaration = ((EnumLiteralDeclaration) eObj);
          String enumClassName = enumLiteralDeclaration.getEnumLiteral().getInstance().getClass().getCanonicalName();
          return enumClassName.equals(ruleClassName);
        }
      }
    }
    return false;
  }
  
  private boolean isInPageTemplate(final ContentAssistContext context) {
    EObject eObj = context.getCurrentModel();
    while (((eObj != null) && (!(eObj instanceof PageTemplate)))) {
      eObj = eObj.eContainer();
    }
    if ((eObj instanceof PageTemplate)) {
      return true;
    }
    return false;
  }
  
  private boolean isPageDetail(final ContentAssistContext context) {
    EObject eObj = context.getCurrentModel();
    while (((eObj != null) && (!(eObj instanceof PageDetail)))) {
      eObj = eObj.eContainer();
    }
    if ((eObj instanceof PageDetail)) {
      return true;
    }
    return false;
  }
  
  private boolean isTableHeader(final ContentAssistContext context) {
    EObject eObj = context.getCurrentModel();
    while (((eObj != null) && (!(eObj instanceof DatamartTableHeader)))) {
      eObj = eObj.eContainer();
    }
    if ((eObj instanceof DatamartTableHeader)) {
      EObject _eContainer = ((DatamartTableHeader)eObj).eContainer();
      return (_eContainer instanceof DatamartTable);
    }
    return false;
  }
  
  private boolean isTableGroupHeader(final ContentAssistContext context) {
    EObject eObj = context.getCurrentModel();
    while (((eObj != null) && (!(eObj instanceof DatamartTableHeader)))) {
      eObj = eObj.eContainer();
    }
    if ((eObj instanceof DatamartTableHeader)) {
      EObject _eContainer = ((DatamartTableHeader)eObj).eContainer();
      return (_eContainer instanceof DatamartTableGroup);
    }
    return false;
  }
  
  private boolean isDatamartTable(final ContentAssistContext context) {
    EObject eObj = context.getCurrentModel();
    if ((eObj instanceof DatamartTable)) {
      return true;
    }
    return false;
  }
  
  private boolean isDatamartTableHeader(final ContentAssistContext context) {
    EObject eObj = context.getCurrentModel();
    if ((eObj instanceof DatamartTableHeader)) {
      return true;
    }
    return false;
  }
  
  private boolean isDatamartTableFooter(final ContentAssistContext context) {
    EObject eObj = context.getCurrentModel();
    if ((eObj instanceof DatamartTableFooter)) {
      return true;
    }
    return false;
  }
  
  @Override
  public void completeColor_Color(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    ICompletionProposal _createCompletionProposal = this.createCompletionProposal("Select color...", context);
    ConfigurableCompletionProposal color = ((ConfigurableCompletionProposal) _createCompletionProposal);
    if ((color != null)) {
      ColorTextApplier applier = new ColorTextApplier();
      applier.setContext(context);
      color.setTextApplier(applier);
    }
    acceptor.accept(color);
  }
  
  @Override
  public void completeImage_Filename(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    AbstractElement _terminal = assignment.getTerminal();
    this.provider.complete_STRING(model, ((RuleCall) _terminal), context, acceptor);
  }
  
  @Override
  public void completePersistenceUnit_Name(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    ProductConfigurationPrefs pref = ProductConfiguration.prefs();
    Collection<PersistenceUnitConfiguration> _persistenceUnits = pref.getPersistenceUnits();
    for (final PersistenceUnitConfiguration persistenceUnit : _persistenceUnits) {
      {
        String _name = persistenceUnit.getName();
        String _plus = ("\"" + _name);
        String _plus_1 = (_plus + "\"");
        ICompletionProposal proposal = this.createCompletionProposal(_plus_1, context);
        acceptor.accept(proposal);
      }
    }
  }
  
  /**
   * This override will enable 1 length non letter characters as keyword.
   */
  @Override
  protected boolean isKeywordWorthyToPropose(final Keyword keyword) {
    return true;
  }
  
  public DatamartTable getContainingDatamartTable(final EObject o) {
    EObject result = o;
    while (((!(result instanceof DatamartTable)) && (result.eContainer() != null))) {
      result = result.eContainer();
    }
    return ((DatamartTable) result);
  }
  
  @Override
  protected boolean isValidProposal(final String proposal, final String prefix, final ContentAssistContext context) {
    boolean _isValidProposal = super.isValidProposal(proposal, prefix, context);
    boolean _not = (!_isValidProposal);
    if (_not) {
      return false;
    } else {
      boolean _equals = "on-group".equals(proposal);
      if (_equals) {
        boolean _isInPageTemplate = this.isInPageTemplate(context);
        return (!_isInPageTemplate);
      } else {
        EObject _currentModel = null;
        if (context!=null) {
          _currentModel=context.getCurrentModel();
        }
        if ((_currentModel instanceof DatamartTableAttribute)) {
          EObject _currentModel_1 = null;
          if (context!=null) {
            _currentModel_1=context.getCurrentModel();
          }
          EObject eObject = _currentModel_1.eContainer();
          while (((eObject != null) && (!(eObject instanceof DatamartTableDetail)))) {
            eObject = eObject.eContainer();
          }
          boolean _and = false;
          if (!(eObject instanceof DatamartTableDetail)) {
            _and = false;
          } else {
            Style _style = null;
            if (((DatamartTableDetail) eObject)!=null) {
              _style=((DatamartTableDetail) eObject).getStyle();
            }
            boolean _tripleNotEquals = (_style != null);
            _and = _tripleNotEquals;
          }
          if (_and) {
            boolean _equals_1 = proposal.equals(((DatamartTableDetail) eObject).getStyle().getName());
            return (!_equals_1);
          }
          return true;
        } else {
          return true;
        }
      }
    }
  }
  
  protected boolean datamartEntityContainsProperty(final DatamartEntity entity, final String proposal) {
    EList<DatamartNavigation> _navigations = entity.getNavigations();
    for (final DatamartNavigation navigation : _navigations) {
      boolean _datamartEntityContainsProperty = this.datamartEntityContainsProperty(navigation.getDatamartEntity(), proposal);
      if (_datamartEntityContainsProperty) {
        return true;
      }
    }
    EList<DatamartAttribute> _attributes = entity.getAttributes();
    for (final DatamartAttribute property : _attributes) {
    }
    return false;
  }
  
  public void filePickerProposal(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor, final String fileExtensions) {
    ICompletionProposal _createCompletionProposal = this.createCompletionProposal("Select input file...", context);
    ConfigurableCompletionProposal fileName = ((ConfigurableCompletionProposal) _createCompletionProposal);
    if ((fileName != null)) {
      FileNameTextApplier applier = new FileNameTextApplier();
      applier.setExtensions(fileExtensions.split(","));
      applier.setContext(context);
      fileName.setTextApplier(applier);
    }
    acceptor.accept(fileName);
  }
  
  /**
   * @see BasicDSLProposalProviderHelper#getKeywordDisplayString(Keyword, BasicDSLUiTranslator)
   * @param keyword the keyword to get the displayed string for
   * @return the displayed string
   */
  @Override
  protected StyledString getKeywordDisplayString(final Keyword keyword) {
    return BasicDSLProposalProviderHelper.getKeywordDisplayString(keyword, 
      ReportDSLUiDocumentationTranslator.instance());
  }
  
  @Override
  public void complete_QualifiedName(final EObject model, final RuleCall ruleCall, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    this.providerHelper.complete_PackageName(model, ruleCall, context, acceptor, this);
  }
  
  @Override
  public void complete_UnsignedNumber(final EObject model, final RuleCall ruleCall, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    this.providerHelper.createNumberProposal(context, acceptor, ruleCall, this);
  }
  
  @Override
  public void complete_SignedNumber(final EObject model, final RuleCall ruleCall, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    this.providerHelper.createNumberProposal(context, acceptor, ruleCall, this);
  }
  
  @Override
  public void complete_INT(final EObject model, final RuleCall ruleCall, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    this.provider.complete_INT(model, ruleCall, context, acceptor);
  }
  
  @Override
  public void complete_ID(final EObject model, final RuleCall ruleCall, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    this.provider.complete_ID(model, ruleCall, context, acceptor);
  }
  
  @Override
  public void complete_TRANSLATABLESTRING(final EObject model, final RuleCall ruleCall, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    this.provider.complete_STRING(model, ruleCall, context, acceptor);
  }
  
  @Override
  public void complete_STRING(final EObject model, final RuleCall ruleCall, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    this.provider.complete_STRING(model, ruleCall, context, acceptor);
  }
  
  @Override
  public void completeTableStringLookup_LookupValue(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    AbstractElement _terminal = assignment.getTerminal();
    this.provider.complete_STRING(model, ((RuleCall) _terminal), context, acceptor);
  }
  
  @Override
  public void completeReportPackage_ExternalCssURI(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    AbstractElement _terminal = assignment.getTerminal();
    this.provider.complete_STRING(model, ((RuleCall) _terminal), context, acceptor);
  }
  
  @Override
  public void completeReportPackage_ExternalCssURIBundle(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    AbstractElement _terminal = assignment.getTerminal();
    this.provider.complete_STRING(model, ((RuleCall) _terminal), context, acceptor);
  }
  
  @Override
  public void completeReport_ExternalCssURI(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    AbstractElement _terminal = assignment.getTerminal();
    this.provider.complete_STRING(model, ((RuleCall) _terminal), context, acceptor);
  }
  
  @Override
  public void completeReport_ExternalCssURIBundle(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    AbstractElement _terminal = assignment.getTerminal();
    this.provider.complete_STRING(model, ((RuleCall) _terminal), context, acceptor);
  }
  
  @Override
  public void completeFont_Family(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    AbstractElement _terminal = assignment.getTerminal();
    this.provider.complete_STRING(model, ((RuleCall) _terminal), context, acceptor);
  }
  
  @Override
  public void completeUomoFormat_Ui_pattern(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    AbstractElement _terminal = assignment.getTerminal();
    this.provider.complete_STRING(model, ((RuleCall) _terminal), context, acceptor);
  }
  
  @Override
  public void completeNumberFormat_Ui_pattern(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    AbstractElement _terminal = assignment.getTerminal();
    this.provider.complete_STRING(model, ((RuleCall) _terminal), context, acceptor);
  }
  
  @Override
  public void completeCurrencyFormat_Ui_pattern(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    AbstractElement _terminal = assignment.getTerminal();
    this.provider.complete_STRING(model, ((RuleCall) _terminal), context, acceptor);
  }
  
  @Override
  public void completeDateFormat_Ui_pattern(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    AbstractElement _terminal = assignment.getTerminal();
    this.provider.complete_STRING(model, ((RuleCall) _terminal), context, acceptor);
  }
  
  @Override
  public void completeDateTimeFormat_Ui_pattern(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    AbstractElement _terminal = assignment.getTerminal();
    this.provider.complete_STRING(model, ((RuleCall) _terminal), context, acceptor);
  }
  
  @Override
  public void completeTimeFormat_Ui_pattern(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    AbstractElement _terminal = assignment.getTerminal();
    this.provider.complete_STRING(model, ((RuleCall) _terminal), context, acceptor);
  }
  
  @Override
  public void completeUomoFormat_Report_pattern(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    AbstractElement _terminal = assignment.getTerminal();
    this.provider.complete_STRING(model, ((RuleCall) _terminal), context, acceptor);
  }
  
  @Override
  public void completeNumberFormat_Report_pattern(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    AbstractElement _terminal = assignment.getTerminal();
    this.provider.complete_STRING(model, ((RuleCall) _terminal), context, acceptor);
  }
  
  @Override
  public void completeCurrencyFormat_Report_pattern(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    AbstractElement _terminal = assignment.getTerminal();
    this.provider.complete_STRING(model, ((RuleCall) _terminal), context, acceptor);
  }
  
  @Override
  public void completeDateFormat_Report_pattern(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    AbstractElement _terminal = assignment.getTerminal();
    this.provider.complete_STRING(model, ((RuleCall) _terminal), context, acceptor);
  }
  
  @Override
  public void completeDateTimeFormat_Report_pattern(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    AbstractElement _terminal = assignment.getTerminal();
    this.provider.complete_STRING(model, ((RuleCall) _terminal), context, acceptor);
  }
  
  @Override
  public void completeTimeFormat_Report_pattern(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    AbstractElement _terminal = assignment.getTerminal();
    this.provider.complete_STRING(model, ((RuleCall) _terminal), context, acceptor);
  }
  
  @Override
  public void completeReportDesignFile_Name(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    AbstractElement _terminal = assignment.getTerminal();
    this.provider.complete_STRING(model, ((RuleCall) _terminal), context, acceptor);
  }
  
  @Override
  public void completeTableFormatter_Format(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    AbstractElement _terminal = assignment.getTerminal();
    this.provider.complete_STRING(model, ((RuleCall) _terminal), context, acceptor);
  }
  
  @Override
  public void completeTableImage_ImagePathPattern(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    AbstractElement _terminal = assignment.getTerminal();
    this.provider.complete_STRING(model, ((RuleCall) _terminal), context, acceptor);
  }
  
  @Override
  public void completeTableImage_ResizeString(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    AbstractElement _terminal = assignment.getTerminal();
    this.provider.complete_STRING(model, ((RuleCall) _terminal), context, acceptor);
  }
}
