/**
 * 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 v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * 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.inject.Inject;
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.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.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.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;
  
  @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;
    }
    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 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);
  }
  
  /**
   * 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);
  }
  
  @Override
  public void completeTableIcon_Icon(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);
  }
}
