/**
 * 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.table.ui.contentassist;

import com.google.common.base.Objects;
import com.google.common.collect.ImmutableList;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import javax.inject.Inject;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EClass;
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.infogrid.model.gridsource.CxGridNestedField;
import org.eclipse.osbp.infogrid.model.gridsource.CxGridProperty;
import org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropBooleanStyle;
import org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropButtonStyle;
import org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropDateStyle;
import org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropHtmlStyle;
import org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropImageStyle;
import org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropNumberStyle;
import org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropPriceStyle;
import org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropProgressbarStyle;
import org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropQuantityStyle;
import org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropTextStyle;
import org.eclipse.osbp.xtext.basic.ui.BasicDSLDocumentationTranslator;
import org.eclipse.osbp.xtext.basic.ui.contentassist.BasicDSLProposalProviderHelper;
import org.eclipse.osbp.xtext.datamartdsl.AxisEnum;
import org.eclipse.osbp.xtext.datamartdsl.DatamartAxis;
import org.eclipse.osbp.xtext.datamartdsl.DatamartCube;
import org.eclipse.osbp.xtext.datamartdsl.DatamartCubeElement;
import org.eclipse.osbp.xtext.datamartdsl.DatamartDefinition;
import org.eclipse.osbp.xtext.datamartdsl.DatamartDerivedMeasure;
import org.eclipse.osbp.xtext.datamartdsl.DatamartElement;
import org.eclipse.osbp.xtext.datamartdsl.DatamartEntity;
import org.eclipse.osbp.xtext.datamartdsl.DatamartHierarchy;
import org.eclipse.osbp.xtext.datamartdsl.DatamartMeasure;
import org.eclipse.osbp.xtext.datamartdsl.DatamartSetAggregation;
import org.eclipse.osbp.xtext.datamartdsl.DatamartSource;
import org.eclipse.osbp.xtext.datamartdsl.DatamartTask;
import org.eclipse.osbp.xtext.datamartdsl.jvmmodel.DatamartDSLJvmModelInferrer;
import org.eclipse.osbp.xtext.gridsource.scoping.TypeHelper;
import org.eclipse.osbp.xtext.gridsource.ui.contentassist.GridSourceProposalProvider;
import org.eclipse.osbp.xtext.table.Table;
import org.eclipse.osbp.xtext.table.TableAxis;
import org.eclipse.osbp.xtext.table.TableBrokerDatamart;
import org.eclipse.osbp.xtext.table.TableDatamart;
import org.eclipse.osbp.xtext.table.TableEvent;
import org.eclipse.osbp.xtext.table.TableInterval;
import org.eclipse.osbp.xtext.table.TableLookup;
import org.eclipse.osbp.xtext.table.TablePreorder;
import org.eclipse.osbp.xtext.table.TableRangeElement;
import org.eclipse.osbp.xtext.table.TableTable;
import org.eclipse.osbp.xtext.table.TableValue;
import org.eclipse.osbp.xtext.table.ui.TableDSLDocumentationTranslator;
import org.eclipse.osbp.xtext.table.ui.contentassist.AbstractTableDSLProposalProvider;
import org.eclipse.osbp.xtext.table.ui.contentassist.ImageFileNameTextApplier;
import org.eclipse.osbp.xtext.table.ui.contentassist.MyReplacementTextApplier;
import org.eclipse.swt.graphics.Image;
import org.eclipse.xtext.AbstractElement;
import org.eclipse.xtext.Assignment;
import org.eclipse.xtext.Keyword;
import org.eclipse.xtext.ParserRule;
import org.eclipse.xtext.RuleCall;
import org.eclipse.xtext.TypeRef;
import org.eclipse.xtext.XtextPackage;
import org.eclipse.xtext.common.types.JvmOperation;
import org.eclipse.xtext.common.types.JvmType;
import org.eclipse.xtext.common.types.JvmTypeReference;
import org.eclipse.xtext.common.ui.contentassist.TerminalsProposalProvider;
import org.eclipse.xtext.nodemodel.ICompositeNode;
import org.eclipse.xtext.nodemodel.INode;
import org.eclipse.xtext.ui.editor.contentassist.ConfigurableCompletionProposal;
import org.eclipse.xtext.ui.editor.contentassist.ContentAssistContext;
import org.eclipse.xtext.ui.editor.contentassist.ICompletionProposalAcceptor;
import org.eclipse.xtext.xbase.lib.CollectionLiterals;
import org.eclipse.xtext.xbase.lib.Extension;

@SuppressWarnings("all")
public class TableDSLProposalProvider extends AbstractTableDSLProposalProvider {
  @Inject
  @Extension
  private TypeHelper _typeHelper;
  
  @Inject
  private TerminalsProposalProvider provider;
  
  @Inject
  private BasicDSLProposalProviderHelper providerHelper;
  
  @Inject
  @Extension
  private DatamartDSLJvmModelInferrer datamartInferrer;
  
  private String imageSelectionPrompt = "Select image file...";
  
  private String colorSelectionPrompt = "Pick color...";
  
  @Inject
  private GridSourceProposalProvider gridProposalProvider;
  
  /**
   * This override will enable 1 length non letter characters as keyword.
   */
  protected boolean isKeywordWorthyToPropose(final Keyword keyword) {
    return true;
  }
  
  protected StyledString getKeywordDisplayString(final Keyword keyword) {
    BasicDSLDocumentationTranslator _instance = TableDSLDocumentationTranslator.instance();
    return BasicDSLProposalProviderHelper.getKeywordDisplayString(keyword, _instance);
  }
  
  /**
   * imageFilePickerProposal(model, assignment, context, acceptor, ".jpg,.jpeg,.png")
   */
  public void imageFilePickerProposal(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor, final String fileExtensions) {
    ICompletionProposal _createCompletionProposal = this.createCompletionProposal(this.imageSelectionPrompt, context);
    ConfigurableCompletionProposal fileName = ((ConfigurableCompletionProposal) _createCompletionProposal);
    boolean _notEquals = (!Objects.equal(fileName, null));
    if (_notEquals) {
      ImageFileNameTextApplier applier = new ImageFileNameTextApplier();
      String[] _split = fileExtensions.split(",");
      applier.setExtensions(_split);
      applier.setContext(context);
      fileName.setTextApplier(applier);
    }
    acceptor.accept(fileName);
  }
  
  /**
   * This method decides which proposals will be valid.
   */
  protected boolean isValidProposal(final String proposal, final String prefix, final ContentAssistContext context) {
    boolean result = super.isValidProposal(proposal, prefix, context);
    EObject _currentModel = context.getCurrentModel();
    if ((_currentModel instanceof TableAxis)) {
      return this.isAxisValidProposal(context, proposal, result);
    }
    boolean _or = false;
    if (((context.getCurrentModel() instanceof TableValue) || (context.getCurrentModel() instanceof TablePreorder))) {
      _or = true;
    } else {
      EObject _currentModel_1 = context.getCurrentModel();
      _or = (_currentModel_1 instanceof TableEvent);
    }
    if (_or) {
      return this.isValueValidProposal(context, proposal, result);
    } else {
      boolean _or_1 = false;
      EObject _currentModel_2 = context.getCurrentModel();
      if ((_currentModel_2 instanceof TableInterval)) {
        _or_1 = true;
      } else {
        EObject _currentModel_3 = context.getCurrentModel();
        _or_1 = (_currentModel_3 instanceof TableLookup);
      }
      if (_or_1) {
        return this.isIntervalValidProposal(context, proposal, result);
      }
    }
    return result;
  }
  
  public void createProposals(final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    boolean _and = false;
    EObject _currentModel = context.getCurrentModel();
    if (!(_currentModel instanceof CxGridProperty)) {
      _and = false;
    } else {
      boolean _lastCompleteNodeIsStyle = this.getLastCompleteNodeIsStyle(context);
      _and = _lastCompleteNodeIsStyle;
    }
    if (_and) {
      ImmutableList<AbstractElement> _firstSetGrammarElements = context.getFirstSetGrammarElements();
      for (final AbstractElement element : _firstSetGrammarElements) {
        EClass _eClass = element.eClass();
        int _classifierID = _eClass.getClassifierID();
        boolean _equals = (_classifierID == XtextPackage.KEYWORD);
        if (_equals) {
          Keyword keyword = ((Keyword) element);
          boolean _isKeywordWorthyToPropose = this.isKeywordWorthyToPropose(keyword, context);
          if (_isKeywordWorthyToPropose) {
            EObject _currentModel_1 = context.getCurrentModel();
            final CxGridProperty gridProp = ((CxGridProperty) _currentModel_1);
            final CxGridNestedField nestedField = gridProp.getPath();
            JvmOperation _field = nestedField.getField();
            JvmTypeReference _returnType = _field.getReturnType();
            final JvmType nestedFieldType = _returnType.getType();
            EObject eObject = ((EObject) element);
            while ((!(eObject instanceof ParserRule))) {
              EObject _eContainer = eObject.eContainer();
              eObject = _eContainer;
            }
            boolean _notEquals = (!Objects.equal(eObject, null));
            if (_notEquals) {
              ParserRule rule = ((ParserRule) eObject);
              boolean _and_1 = false;
              boolean _isBoolean = this._typeHelper.isBoolean(nestedFieldType);
              if (!_isBoolean) {
                _and_1 = false;
              } else {
                boolean _isBooleanStyle = this.isBooleanStyle(rule);
                _and_1 = _isBooleanStyle;
              }
              if (_and_1) {
                this.setProposal(context, acceptor, keyword);
              } else {
                boolean _and_2 = false;
                boolean _isString = this._typeHelper.isString(nestedFieldType);
                if (!_isString) {
                  _and_2 = false;
                } else {
                  boolean _isTextStyle = this.isTextStyle(rule);
                  _and_2 = _isTextStyle;
                }
                if (_and_2) {
                  this.setProposal(context, acceptor, keyword);
                } else {
                  boolean _isNumber = this._typeHelper.isNumber(nestedFieldType);
                  if (_isNumber) {
                    boolean _and_3 = false;
                    boolean _isNumberWithDigits = this._typeHelper.isNumberWithDigits(nestedFieldType);
                    if (!_isNumberWithDigits) {
                      _and_3 = false;
                    } else {
                      boolean _isProgressStyle = this.isProgressStyle(rule);
                      _and_3 = _isProgressStyle;
                    }
                    if (_and_3) {
                      this.setProposal(context, acceptor, keyword);
                    } else {
                      boolean _isNumberStyle = this.isNumberStyle(rule);
                      if (_isNumberStyle) {
                        this.setProposal(context, acceptor, keyword);
                      }
                    }
                  } else {
                    boolean _and_4 = false;
                    boolean _isDate = this._typeHelper.isDate(nestedFieldType);
                    if (!_isDate) {
                      _and_4 = false;
                    } else {
                      boolean _isDateStyle = this.isDateStyle(rule);
                      _and_4 = _isDateStyle;
                    }
                    if (_and_4) {
                      this.setProposal(context, acceptor, keyword);
                    }
                  }
                }
              }
            }
          }
        }
      }
    } else {
      super.createProposals(context, acceptor);
    }
  }
  
  public boolean getLastCompleteNodeIsStyle(final ContentAssistContext context) {
    INode _lastCompleteNode = context.getLastCompleteNode();
    EObject _grammarElement = null;
    if (_lastCompleteNode!=null) {
      _grammarElement=_lastCompleteNode.getGrammarElement();
    }
    final EObject element = _grammarElement;
    EClass _eClass = element.eClass();
    int _classifierID = _eClass.getClassifierID();
    boolean _equals = (_classifierID == XtextPackage.KEYWORD);
    if (_equals) {
      Keyword keyword = ((Keyword) element);
      String _value = keyword.getValue();
      boolean _equals_1 = "style".equals(_value);
      if (_equals_1) {
        return true;
      }
    }
    return false;
  }
  
  public boolean isBooleanStyle(final ParserRule rule) {
    TypeRef _type = rule.getType();
    EClassifier _classifier = null;
    if (_type!=null) {
      _classifier=_type.getClassifier();
    }
    Class<?> ruleTypeClass = _classifier.getInstanceClass();
    return CxGridPropBooleanStyle.class.equals(ruleTypeClass);
  }
  
  public boolean isTextStyle(final ParserRule rule) {
    TypeRef _type = rule.getType();
    EClassifier _classifier = null;
    if (_type!=null) {
      _classifier=_type.getClassifier();
    }
    Class<?> ruleTypeClass = _classifier.getInstanceClass();
    boolean _or = false;
    boolean _or_1 = false;
    boolean _or_2 = false;
    boolean _equals = CxGridPropTextStyle.class.equals(ruleTypeClass);
    if (_equals) {
      _or_2 = true;
    } else {
      boolean _equals_1 = CxGridPropHtmlStyle.class.equals(ruleTypeClass);
      _or_2 = _equals_1;
    }
    if (_or_2) {
      _or_1 = true;
    } else {
      boolean _equals_2 = CxGridPropButtonStyle.class.equals(ruleTypeClass);
      _or_1 = _equals_2;
    }
    if (_or_1) {
      _or = true;
    } else {
      boolean _equals_3 = CxGridPropImageStyle.class.equals(ruleTypeClass);
      _or = _equals_3;
    }
    return _or;
  }
  
  public boolean isNumberStyle(final ParserRule rule) {
    TypeRef _type = rule.getType();
    EClassifier _classifier = null;
    if (_type!=null) {
      _classifier=_type.getClassifier();
    }
    Class<?> ruleTypeClass = _classifier.getInstanceClass();
    boolean _or = false;
    boolean _or_1 = false;
    boolean _or_2 = false;
    boolean _equals = CxGridPropNumberStyle.class.equals(ruleTypeClass);
    if (_equals) {
      _or_2 = true;
    } else {
      boolean _equals_1 = CxGridPropPriceStyle.class.equals(ruleTypeClass);
      _or_2 = _equals_1;
    }
    if (_or_2) {
      _or_1 = true;
    } else {
      boolean _equals_2 = CxGridPropQuantityStyle.class.equals(ruleTypeClass);
      _or_1 = _equals_2;
    }
    if (_or_1) {
      _or = true;
    } else {
      boolean _equals_3 = CxGridPropImageStyle.class.equals(ruleTypeClass);
      _or = _equals_3;
    }
    return _or;
  }
  
  public boolean isProgressStyle(final ParserRule rule) {
    TypeRef _type = rule.getType();
    EClassifier _classifier = null;
    if (_type!=null) {
      _classifier=_type.getClassifier();
    }
    Class<?> ruleTypeClass = _classifier.getInstanceClass();
    return CxGridPropProgressbarStyle.class.equals(ruleTypeClass);
  }
  
  public boolean isDateStyle(final ParserRule rule) {
    TypeRef _type = rule.getType();
    EClassifier _classifier = null;
    if (_type!=null) {
      _classifier=_type.getClassifier();
    }
    Class<?> ruleTypeClass = _classifier.getInstanceClass();
    return CxGridPropDateStyle.class.equals(ruleTypeClass);
  }
  
  public void setProposal(final ContentAssistContext context, final ICompletionProposalAcceptor acceptor, final Keyword keyword) {
    String _value = keyword.getValue();
    StyledString _keywordDisplayString = this.getKeywordDisplayString(keyword);
    Image _image = this.getImage(keyword);
    final ICompletionProposal proposal = this.createCompletionProposal(_value, _keywordDisplayString, _image, context);
    acceptor.accept(proposal);
  }
  
  public void completeTableIcon_Icon(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    this.imageFilePickerProposal(model, assignment, context, acceptor, ".jpg,.jpeg,.png");
  }
  
  public void completeTableValue_IconName(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    this.imageFilePickerProposal(model, assignment, context, acceptor, ".jpg,.jpeg,.png");
  }
  
  public void completeTableBrokerDatamart_Filter(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    EObject _currentModel = context.getCurrentModel();
    TableBrokerDatamart datamart = ((TableBrokerDatamart) _currentModel);
    HashMap<String, String> filterIdList = CollectionLiterals.<String, String>newHashMap();
    DatamartDefinition _datamartDef = datamart.getDatamartDef();
    this.datamartInferrer.createFilterMap(_datamartDef, filterIdList);
    Set<Map.Entry<String, String>> _entrySet = filterIdList.entrySet();
    for (final Map.Entry<String, String> filter : _entrySet) {
      String _value = filter.getValue();
      String _concat = "\"".concat(_value);
      String _concat_1 = _concat.concat("\"");
      String _key = filter.getKey();
      ICompletionProposal _createCompletionProposal = this.createCompletionProposal(_concat_1, _key, null, context);
      acceptor.accept(_createCompletionProposal);
    }
  }
  
  public void completeTableFormatter_Format(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    ICompletionProposal _createCompletionProposal = this.createCompletionProposal("\"###,##0.00\" /* money */", "money", null, context);
    acceptor.accept(_createCompletionProposal);
    ICompletionProposal _createCompletionProposal_1 = this.createCompletionProposal("\"###,##0.00 &curren;\" /* local national currency */", "local national currency", 
      null, context);
    acceptor.accept(_createCompletionProposal_1);
    ICompletionProposal _createCompletionProposal_2 = this.createCompletionProposal("\"###,##0.00 &curren;&curren;\" /* local international currency */", 
      "local international currency", null, context);
    acceptor.accept(_createCompletionProposal_2);
    ICompletionProposal _createCompletionProposal_3 = this.createCompletionProposal("\"#0.000\" /* quantity */", "quantity", null, context);
    acceptor.accept(_createCompletionProposal_3);
    ICompletionProposal _createCompletionProposal_4 = this.createCompletionProposal("\"#0.00;(#0.00)\" /* negative in parentheses */", "negative in parentheses", null, context);
    acceptor.accept(_createCompletionProposal_4);
    ICompletionProposal _createCompletionProposal_5 = this.createCompletionProposal("\"##0.0 %\" /* ratio as percentage */", "ratio as percentage", null, context);
    acceptor.accept(_createCompletionProposal_5);
    ICompletionProposal _createCompletionProposal_6 = this.createCompletionProposal("\"##0.0 %%\" /* ratio as per mill */", "ratio as per mill", null, context);
    acceptor.accept(_createCompletionProposal_6);
    ICompletionProposal _createCompletionProposal_7 = this.createCompletionProposal("\"##0.0\'%\'\" /* percentage sign */", "percentage sign", null, context);
    acceptor.accept(_createCompletionProposal_7);
    ICompletionProposal _createCompletionProposal_8 = this.createCompletionProposal("\"##0.0\'?\'\" /* per mill sign */", "per mill sign", null, context);
    acceptor.accept(_createCompletionProposal_8);
    ICompletionProposal _createCompletionProposal_9 = this.createCompletionProposal("\"0.0000000000E00\" /* scientific */", "scientific", null, context);
    acceptor.accept(_createCompletionProposal_9);
    ICompletionProposal _createCompletionProposal_10 = this.createCompletionProposal("\"SHORTDATE\" /* short date */", "short date", null, context);
    acceptor.accept(_createCompletionProposal_10);
    ICompletionProposal _createCompletionProposal_11 = this.createCompletionProposal("\"MEDIUMDATE\" /* medium date */", "medium date", null, context);
    acceptor.accept(_createCompletionProposal_11);
    ICompletionProposal _createCompletionProposal_12 = this.createCompletionProposal("\"LONGDATE\" /* long date */", "long date", null, context);
    acceptor.accept(_createCompletionProposal_12);
    ICompletionProposal _createCompletionProposal_13 = this.createCompletionProposal("\"FULLDATE\" /* full date */", "full date", null, context);
    acceptor.accept(_createCompletionProposal_13);
    ICompletionProposal _createCompletionProposal_14 = this.createCompletionProposal("\"SHORTTIME\" /* short time */", "short time", null, context);
    acceptor.accept(_createCompletionProposal_14);
    ICompletionProposal _createCompletionProposal_15 = this.createCompletionProposal("\"MEDIUMTIME\" /* medium time */", "medium time", null, context);
    acceptor.accept(_createCompletionProposal_15);
    ICompletionProposal _createCompletionProposal_16 = this.createCompletionProposal("\"LONGTIME\" /* long time */", "long time", null, context);
    acceptor.accept(_createCompletionProposal_16);
    ICompletionProposal _createCompletionProposal_17 = this.createCompletionProposal("\"FULLTIME\" /* full time */", "full time", null, context);
    acceptor.accept(_createCompletionProposal_17);
    ICompletionProposal _createCompletionProposal_18 = this.createCompletionProposal("\"SHORTDATESHORTTIME\" /* short date short time */", "short date short time", null, context);
    acceptor.accept(_createCompletionProposal_18);
    ICompletionProposal _createCompletionProposal_19 = this.createCompletionProposal("\"SHORTDATEMEDIUMTIME\" /* short date medium time */", "short date medium time", 
      null, context);
    acceptor.accept(_createCompletionProposal_19);
    ICompletionProposal _createCompletionProposal_20 = this.createCompletionProposal("\"SHORTDATELONGTIME\" /* short date long time */", "short date long time", null, context);
    acceptor.accept(_createCompletionProposal_20);
    ICompletionProposal _createCompletionProposal_21 = this.createCompletionProposal("\"SHORTDATEFULLTIME\" /* short date full time */", "short date full time", null, context);
    acceptor.accept(_createCompletionProposal_21);
    ICompletionProposal _createCompletionProposal_22 = this.createCompletionProposal("\"MEDIUMDATESHORTTIME\" /* medium date short time */", "medium date short time", 
      null, context);
    acceptor.accept(_createCompletionProposal_22);
    ICompletionProposal _createCompletionProposal_23 = this.createCompletionProposal("\"MEDIUMDATEMEDIUMTIME\" /* medium date medium time */", "medium date medium time", 
      null, context);
    acceptor.accept(_createCompletionProposal_23);
    ICompletionProposal _createCompletionProposal_24 = this.createCompletionProposal("\"MEDIUMDATELONGTIME\" /* medium date long time */", "medium date long time", null, context);
    acceptor.accept(_createCompletionProposal_24);
    ICompletionProposal _createCompletionProposal_25 = this.createCompletionProposal("\"MEDIUMDATEFULLTIME\" /* medium date full time */", "medium date full time", null, context);
    acceptor.accept(_createCompletionProposal_25);
    ICompletionProposal _createCompletionProposal_26 = this.createCompletionProposal("\"LONGDATESHORTTIME\" /* long date short time */", "long date short time", null, context);
    acceptor.accept(_createCompletionProposal_26);
    ICompletionProposal _createCompletionProposal_27 = this.createCompletionProposal("\"LONGDATEMEDIUMTIME\" /* long date medium time */", "long date medium time", null, context);
    acceptor.accept(_createCompletionProposal_27);
    ICompletionProposal _createCompletionProposal_28 = this.createCompletionProposal("\"LONGDATELONGTIME\" /* long date long time */", "long date long time", null, context);
    acceptor.accept(_createCompletionProposal_28);
    ICompletionProposal _createCompletionProposal_29 = this.createCompletionProposal("\"LONGDATEFULLTIME\" /* long date full time */", "long date full time", null, context);
    acceptor.accept(_createCompletionProposal_29);
    ICompletionProposal _createCompletionProposal_30 = this.createCompletionProposal("\"FULLDATESHORTTIME\" /* full date short time */", "full date short time", null, context);
    acceptor.accept(_createCompletionProposal_30);
    ICompletionProposal _createCompletionProposal_31 = this.createCompletionProposal("\"FULLDATEMEDIUMTIME\" /* full date medium time */", "full date medium time", null, context);
    acceptor.accept(_createCompletionProposal_31);
    ICompletionProposal _createCompletionProposal_32 = this.createCompletionProposal("\"FULLDATELONGTIME\" /* full date long time */", "full date long time", null, context);
    acceptor.accept(_createCompletionProposal_32);
    ICompletionProposal _createCompletionProposal_33 = this.createCompletionProposal("\"FULLDATEFULLTIME\" /* full date full time */", "full date full time", null, context);
    acceptor.accept(_createCompletionProposal_33);
  }
  
  public void completeTableTextColor_Rgb(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    this.colorPickerProposal(model, assignment, context, acceptor);
  }
  
  public void completeTableCellColor_Rgb(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    this.colorPickerProposal(model, assignment, context, acceptor);
  }
  
  public void colorPickerProposal(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    ICompletionProposal _createCompletionProposal = this.createCompletionProposal(this.colorSelectionPrompt, context);
    ConfigurableCompletionProposal pickColor = ((ConfigurableCompletionProposal) _createCompletionProposal);
    boolean _notEquals = (!Objects.equal(pickColor, null));
    if (_notEquals) {
      MyReplacementTextApplier applier = new MyReplacementTextApplier();
      applier.setContext(context);
      pickColor.setTextApplier(applier);
    }
    acceptor.accept(pickColor);
    ICompletionProposal _createCompletionProposal_1 = this.createCompletionProposal("\"230,128,64\" /* orange */", "orange", null, context);
    acceptor.accept(_createCompletionProposal_1);
    ICompletionProposal _createCompletionProposal_2 = this.createCompletionProposal("\"255,182,182\" /* light red */", "light red", null, context);
    acceptor.accept(_createCompletionProposal_2);
    ICompletionProposal _createCompletionProposal_3 = this.createCompletionProposal("\"255,0,0\" /* red */", "red", null, context);
    acceptor.accept(_createCompletionProposal_3);
    ICompletionProposal _createCompletionProposal_4 = this.createCompletionProposal("\"204,102,102\" /* dark red */", "dark red", null, context);
    acceptor.accept(_createCompletionProposal_4);
    ICompletionProposal _createCompletionProposal_5 = this.createCompletionProposal("\"255,255,128\" /*light yellow */", "light yellow", null, context);
    acceptor.accept(_createCompletionProposal_5);
    ICompletionProposal _createCompletionProposal_6 = this.createCompletionProposal("\"255,255,0\" /* yellow */", "yellow", null, context);
    acceptor.accept(_createCompletionProposal_6);
    ICompletionProposal _createCompletionProposal_7 = this.createCompletionProposal("\"128,128,0\" /* dark yellow */", "dark yellow", null, context);
    acceptor.accept(_createCompletionProposal_7);
    ICompletionProposal _createCompletionProposal_8 = this.createCompletionProposal("\"102,204,102\" /* light green */", "light green", null, context);
    acceptor.accept(_createCompletionProposal_8);
    ICompletionProposal _createCompletionProposal_9 = this.createCompletionProposal("\"0,255,0\" /* green */", "green", null, context);
    acceptor.accept(_createCompletionProposal_9);
    ICompletionProposal _createCompletionProposal_10 = this.createCompletionProposal("\"147,183,95\" /* dark green */", "dark green", null, context);
    acceptor.accept(_createCompletionProposal_10);
    ICompletionProposal _createCompletionProposal_11 = this.createCompletionProposal("\"102,102,204\" /* light blue */", "light blue", null, context);
    acceptor.accept(_createCompletionProposal_11);
    ICompletionProposal _createCompletionProposal_12 = this.createCompletionProposal("\"0,0,255\" /* blue */", "blue", null, context);
    acceptor.accept(_createCompletionProposal_12);
    ICompletionProposal _createCompletionProposal_13 = this.createCompletionProposal("\"147,95,183\" /* dark blue */", "dark blue", null, context);
    acceptor.accept(_createCompletionProposal_13);
    ICompletionProposal _createCompletionProposal_14 = this.createCompletionProposal("\"0,0,0\" /* black */", "black", null, context);
    acceptor.accept(_createCompletionProposal_14);
    ICompletionProposal _createCompletionProposal_15 = this.createCompletionProposal("\"255,255,255\" /* white */", "white", null, context);
    acceptor.accept(_createCompletionProposal_15);
  }
  
  public boolean isValueValidProposal(final ContentAssistContext context, final String proposal, final boolean result) {
    boolean _isGrammarToken = this.isGrammarToken(proposal);
    if (_isGrammarToken) {
      return true;
    }
    EObject eObj = context.getCurrentModel();
    String requestedAxisName = "";
    while ((!(eObj instanceof TableDatamart))) {
      {
        EObject _eContainer = eObj.eContainer();
        eObj = _eContainer;
        if ((eObj instanceof TableAxis)) {
          AxisEnum _axis = ((TableAxis) eObj).getAxis();
          String _literal = _axis.getLiteral();
          requestedAxisName = _literal;
        }
      }
    }
    boolean _notEquals = (!Objects.equal(eObj, null));
    if (_notEquals) {
      DatamartDefinition datamart = ((TableDatamart) eObj).getDatamartRef();
      boolean _and = false;
      boolean _notEquals_1 = (!Objects.equal(datamart, null));
      if (!_notEquals_1) {
        _and = false;
      } else {
        DatamartSource _source = datamart.getSource();
        boolean _notEquals_2 = (!Objects.equal(_source, null));
        _and = _notEquals_2;
      }
      if (_and) {
        DatamartSource _source_1 = datamart.getSource();
        if ((_source_1 instanceof DatamartCube)) {
          DatamartSource _source_2 = datamart.getSource();
          EList<DatamartCubeElement> _axisslicer = ((DatamartCube) _source_2).getAxisslicer();
          for (final DatamartCubeElement axis : _axisslicer) {
            if ((axis instanceof DatamartAxis)) {
              AxisEnum _name = ((DatamartAxis) axis).getName();
              String _literal = _name.getLiteral();
              boolean _equals = _literal.equals(requestedAxisName);
              if (_equals) {
                boolean hasMeasures = false;
                boolean hasHierarchy = false;
                boolean hasAggregation = false;
                boolean isCrossjoined = false;
                boolean isUndefined = false;
                EList<DatamartElement> _elements = ((DatamartAxis) axis).getElements();
                for (final DatamartElement element : _elements) {
                  boolean _or = false;
                  if ((element instanceof DatamartMeasure)) {
                    _or = true;
                  } else {
                    _or = (element instanceof DatamartDerivedMeasure);
                  }
                  if (_or) {
                    hasMeasures = true;
                  }
                }
                EList<DatamartElement> _elements_1 = ((DatamartAxis) axis).getElements();
                for (final DatamartElement element_1 : _elements_1) {
                  {
                    if ((element_1 instanceof DatamartHierarchy)) {
                      if (hasHierarchy) {
                        isCrossjoined = true;
                      } else {
                        hasHierarchy = true;
                      }
                      boolean _isAllLevels = ((DatamartHierarchy) element_1).isAllLevels();
                      if (_isAllLevels) {
                        isUndefined = true;
                      }
                    }
                    if ((element_1 instanceof DatamartSetAggregation)) {
                      if (hasAggregation) {
                        isCrossjoined = true;
                      } else {
                        hasAggregation = true;
                      }
                      hasAggregation = true;
                    }
                  }
                }
                if ((hasMeasures && (hasHierarchy || hasAggregation))) {
                  isCrossjoined = true;
                }
                if ((isCrossjoined || isUndefined)) {
                  boolean _equals_1 = "ordinal".equals(proposal);
                  if (_equals_1) {
                    return true;
                  }
                  boolean _equals_2 = "allColumns".equals(proposal);
                  if (_equals_2) {
                    return true;
                  }
                  boolean _equals_3 = "all".equals(proposal);
                  if (_equals_3) {
                    return true;
                  }
                }
                if ((!isUndefined)) {
                  EList<DatamartElement> _elements_2 = ((DatamartAxis) axis).getElements();
                  for (final DatamartElement element_2 : _elements_2) {
                    {
                      boolean _and_1 = false;
                      if (!(element_2 instanceof DatamartMeasure)) {
                        _and_1 = false;
                      } else {
                        boolean _equals_4 = "measure".equals(proposal);
                        _and_1 = _equals_4;
                      }
                      if (_and_1) {
                        return true;
                      }
                      boolean _and_2 = false;
                      if (!(element_2 instanceof DatamartDerivedMeasure)) {
                        _and_2 = false;
                      } else {
                        boolean _equals_5 = "derived".equals(proposal);
                        _and_2 = _equals_5;
                      }
                      if (_and_2) {
                        return true;
                      }
                      boolean _and_3 = false;
                      if (!(element_2 instanceof DatamartHierarchy)) {
                        _and_3 = false;
                      } else {
                        boolean _equals_6 = "level".equals(proposal);
                        _and_3 = _equals_6;
                      }
                      if (_and_3) {
                        return true;
                      }
                      boolean _and_4 = false;
                      if (!(element_2 instanceof DatamartSetAggregation)) {
                        _and_4 = false;
                      } else {
                        boolean _equals_7 = "aggregation".equals(proposal);
                        _and_4 = _equals_7;
                      }
                      if (_and_4) {
                        return true;
                      }
                    }
                  }
                }
              }
            }
          }
        } else {
          boolean _and_1 = false;
          DatamartSource _source_3 = datamart.getSource();
          if (!(_source_3 instanceof DatamartEntity)) {
            _and_1 = false;
          } else {
            boolean _equals_4 = "property".equals(proposal);
            _and_1 = _equals_4;
          }
          if (_and_1) {
            return true;
          } else {
            boolean _and_2 = false;
            DatamartSource _source_4 = datamart.getSource();
            if (!(_source_4 instanceof DatamartTask)) {
              _and_2 = false;
            } else {
              boolean _or_1 = false;
              boolean _equals_5 = "column".equals(proposal);
              if (_equals_5) {
                _or_1 = true;
              } else {
                boolean _equals_6 = "taskId".equals(proposal);
                _or_1 = _equals_6;
              }
              _and_2 = _or_1;
            }
            if (_and_2) {
              return true;
            }
          }
        }
      }
    }
    return false;
  }
  
  public boolean isGrammarToken(final String proposal) {
    boolean _equals = this.imageSelectionPrompt.equals(proposal);
    if (_equals) {
      return true;
    }
    boolean _equals_1 = "icon".equals(proposal);
    if (_equals_1) {
      return true;
    }
    boolean _equals_2 = "image".equals(proposal);
    if (_equals_2) {
      return true;
    }
    boolean _equals_3 = "using".equals(proposal);
    if (_equals_3) {
      return true;
    }
    boolean _equals_4 = "preorder".equals(proposal);
    if (_equals_4) {
      return true;
    }
    boolean _equals_5 = "intervals".equals(proposal);
    if (_equals_5) {
      return true;
    }
    boolean _equals_6 = "lookups".equals(proposal);
    if (_equals_6) {
      return true;
    }
    boolean _equals_7 = "formatter".equals(proposal);
    if (_equals_7) {
      return true;
    }
    boolean _equals_8 = "hidelabel".equals(proposal);
    if (_equals_8) {
      return true;
    }
    boolean _equals_9 = "collapse".equals(proposal);
    if (_equals_9) {
      return true;
    }
    boolean _equals_10 = "up to".equals(proposal);
    if (_equals_10) {
      return true;
    }
    boolean _equals_11 = "number".equals(proposal);
    if (_equals_11) {
      return true;
    }
    boolean _equals_12 = "string".equals(proposal);
    if (_equals_12) {
      return true;
    }
    boolean _equals_13 = "days in past".equals(proposal);
    if (_equals_13) {
      return true;
    }
    boolean _equals_14 = "to".equals(proposal);
    if (_equals_14) {
      return true;
    }
    boolean _equals_15 = "datamart".equals(proposal);
    if (_equals_15) {
      return true;
    }
    boolean _equals_16 = "{".equals(proposal);
    if (_equals_16) {
      return true;
    }
    boolean _equals_17 = "}".equals(proposal);
    if (_equals_17) {
      return true;
    }
    return false;
  }
  
  public boolean isIntervalValidProposal(final ContentAssistContext context, final String proposal, final boolean b) {
    INode _currentNode = context.getCurrentNode();
    ICompositeNode _parent = null;
    if (_currentNode!=null) {
      _parent=_currentNode.getParent();
    }
    EObject _semanticElement = null;
    if (_parent!=null) {
      _semanticElement=_parent.getSemanticElement();
    }
    EObject node = _semanticElement;
    EObject _currentModel = context.getCurrentModel();
    EObject container = _currentModel.eContainer();
    if ((container instanceof TableValue)) {
      if ((node instanceof TableRangeElement)) {
        boolean _or = false;
        boolean _or_1 = false;
        boolean _or_2 = false;
        boolean _or_3 = false;
        boolean _equals = "textcolor".equals(proposal);
        if (_equals) {
          _or_3 = true;
        } else {
          boolean _equals_1 = "cellcolor".equals(proposal);
          _or_3 = _equals_1;
        }
        if (_or_3) {
          _or_2 = true;
        } else {
          boolean _equals_2 = "icon".equals(proposal);
          _or_2 = _equals_2;
        }
        if (_or_2) {
          _or_1 = true;
        } else {
          boolean _equals_3 = "trend".equals(proposal);
          _or_1 = _equals_3;
        }
        if (_or_1) {
          _or = true;
        } else {
          boolean _equals_4 = "tooltip".equals(proposal);
          _or = _equals_4;
        }
        if (_or) {
          return true;
        }
      } else {
        return true;
      }
    }
    return false;
  }
  
  public boolean isAxisValidProposal(final ContentAssistContext context, final String proposal, final boolean b) {
    EObject eObj = context.getCurrentModel();
    while ((!(eObj instanceof Table))) {
      EObject _eContainer = eObj.eContainer();
      eObj = _eContainer;
    }
    boolean _and = false;
    if (!((eObj instanceof Table) && (!(((Table) eObj).getTabletype() instanceof TableTable)))) {
      _and = false;
    } else {
      boolean _equals = "details".equals(proposal);
      _and = _equals;
    }
    if (_and) {
      return false;
    }
    return true;
  }
  
  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);
  }
  
  public void complete_TableQualifiedNameWithWildCard(final EObject model, final RuleCall ruleCall, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    this.providerHelper.complete_PackageName(model, ruleCall, context, acceptor, this);
  }
  
  public void complete_SignedNumber(final EObject model, final RuleCall ruleCall, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    this.providerHelper.createNumberProposal(context, acceptor, ruleCall, this);
  }
  
  public void complete_Number(final EObject model, final RuleCall ruleCall, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    this.providerHelper.createNumberProposal(context, acceptor, ruleCall, this);
  }
  
  public void completePropertyButtonStyle_EventTopic(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    super.completePropertyButtonStyle_EventTopic(model, assignment, context, acceptor);
    this.gridProposalProvider.doCompletePropertyButtonStyle_EventTopic(acceptor, model, context);
  }
  
  public void completePropertyImageStyle_EventTopic(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    super.completePropertyImageStyle_EventTopic(model, assignment, context, acceptor);
    this.gridProposalProvider.doCompletePropertyImageStyle_EventTopic(acceptor, model, context);
  }
  
  public void completeStringToResourceStyleConfig_Value(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    super.completeStringToResourceStyleConfig_Value(model, assignment, context, acceptor);
    this.gridProposalProvider.doCompleteStringToResourceStyleConfig_Value(acceptor, model, context);
  }
  
  public void completeStringToResourceStyleConfig_ResourceThemePath(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    super.completeStringToResourceStyleConfig_ResourceThemePath(model, assignment, context, acceptor);
    this.gridProposalProvider.doCompleteStringToResourceStyleConfig_ResourceThemePath(acceptor, model, context);
  }
  
  public void completeNumericToResourceStyleConfig_ResourceThemePath(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    super.completeNumericToResourceStyleConfig_ResourceThemePath(model, assignment, context, acceptor);
    this.gridProposalProvider.doCompleteNumericToResourceStyleConfig_ResourceThemePath(acceptor, model, context);
  }
  
  public void completeNumericToResourceStyleConfig_Value(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    super.completeNumericToResourceStyleConfig_Value(model, assignment, context, acceptor);
    this.gridProposalProvider.doCompleteNumericToResourceStyleConfig_Value(acceptor, model, context);
  }
  
  public void completePropertyNumberStyle_NumberFormat(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    super.completePropertyNumberStyle_NumberFormat(model, assignment, context, acceptor);
    this.gridProposalProvider.doCompletePropertyNumberStyle_NumberFormat(acceptor, model, context);
  }
  
  public void completePropertyDateStyle_DateFormat(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    super.completePropertyDateStyle_DateFormat(model, assignment, context, acceptor);
    this.gridProposalProvider.doCompletePropertyDateStyle_DateFormat(acceptor, model, context);
  }
  
  public void completePropertyProgressbarStyle_MaxValue(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    super.completePropertyProgressbarStyle_MaxValue(model, assignment, context, acceptor);
    this.gridProposalProvider.doCompletePropertyProgressbarStyle_MaxValue(acceptor, model, context);
  }
  
  public void completePropertyPriceStyle_HtmlPattern(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    super.completePropertyPriceStyle_HtmlPattern(model, assignment, context, acceptor);
    this.gridProposalProvider.doCompletePropertyPriceStyle_HtmlPattern(acceptor, model, context);
  }
  
  public void completePropertyPriceStyle_ValueNumberFormat(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    super.completePropertyPriceStyle_ValueNumberFormat(model, assignment, context, acceptor);
    this.gridProposalProvider.doCompletePropertyPriceStyle_ValueNumberFormat(acceptor, model, context);
  }
  
  public void completePropertyQuantityStyle_HtmlPattern(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    super.completePropertyQuantityStyle_HtmlPattern(model, assignment, context, acceptor);
    this.gridProposalProvider.doCompletePropertyQuantityStyle_HtmlPattern(acceptor, model, context);
  }
  
  public void completePropertyQuantityStyle_ValueNumberFormat(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    super.completePropertyQuantityStyle_ValueNumberFormat(model, assignment, context, acceptor);
    this.gridProposalProvider.doCompletePropertyQuantityStyle_ValueNumberFormat(acceptor, model, context);
  }
  
  public void complete_TRANSLATABLESTRING(final EObject model, final RuleCall ruleCall, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    this.provider.complete_STRING(model, ruleCall, context, acceptor);
  }
  
  public void complete_ID(final EObject model, final RuleCall ruleCall, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    this.provider.complete_ID(model, ruleCall, context, acceptor);
  }
  
  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);
  }
  
  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);
  }
}
