/**
 * 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
 * 
 * ============================================================================
 * Initial contribution:
 *     Loetz GmbH & Co. KG
 * 
 * generated by xtext
 */
package org.eclipse.osbp.xtext.dialogdsl.ui.contentassist;

import com.google.inject.Inject;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.viewers.StyledString;
import org.eclipse.osbp.xtext.basic.ui.contentassist.BasicDSLProposalProviderHelper;
import org.eclipse.osbp.xtext.dialogdsl.ui.DialogDSLDocumentationTranslator;
import org.eclipse.osbp.xtext.dialogdsl.ui.contentassist.AbstractDialogDslProposalProvider;
import org.eclipse.xtext.Keyword;
import org.eclipse.xtext.RuleCall;
import org.eclipse.xtext.common.ui.contentassist.TerminalsProposalProvider;
import org.eclipse.xtext.nodemodel.INode;
import org.eclipse.xtext.nodemodel.impl.AbstractNode;
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 DialogDslProposalProvider extends AbstractDialogDslProposalProvider {
  @Inject
  private TerminalsProposalProvider provider;
  
  @Inject
  private BasicDSLProposalProviderHelper providerHelper;
  
  @Override
  protected StyledString getKeywordDisplayString(final Keyword keyword) {
    return BasicDSLProposalProviderHelper.getKeywordDisplayString(keyword, 
      DialogDSLDocumentationTranslator.instance());
  }
  
  /**
   * This override will enable 1 length non letter characters as keyword.
   */
  @Override
  protected boolean isKeywordWorthyToPropose(final Keyword keyword) {
    return true;
  }
  
  @Override
  protected boolean isValidProposal(final String proposal, final String prefix, final ContentAssistContext context) {
    boolean result = super.isValidProposal(proposal, prefix, context);
    boolean _existsConflict = this.existsConflict(result, proposal, context);
    boolean _not = (!_existsConflict);
    result = _not;
    return result;
  }
  
  @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_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_ID(final EObject model, final RuleCall ruleCall, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    this.provider.complete_ID(model, ruleCall, context, acceptor);
  }
  
  private boolean existsConflict(final boolean isValidProposal, final String proposal, final ContentAssistContext context) {
    boolean _xblockexpression = false;
    {
      boolean _equals = "toolbar".equals(proposal);
      if (_equals) {
        INode lastCompleteNode = context.getLastCompleteNode();
        if ((lastCompleteNode instanceof AbstractNode)) {
          lastCompleteNode = ((AbstractNode) lastCompleteNode);
          EObject grammarElement = lastCompleteNode.getGrammarElement();
          if ((grammarElement instanceof Keyword)) {
            String lastCompleteNodeValue = ((Keyword) grammarElement).getValue();
            boolean _equals_1 = "embedded".equals(lastCompleteNodeValue);
            if (_equals_1) {
              return true;
            }
          }
        }
      }
      _xblockexpression = (!isValidProposal);
    }
    return _xblockexpression;
  }
}
