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

import com.google.common.base.Objects;
import com.google.inject.Inject;
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.menu.MenuEntry;
import org.eclipse.osbp.xtext.menu.ui.MenuDSLDocumentationTranslator;
import org.eclipse.osbp.xtext.menu.ui.contentassist.AbstractMenuDslProposalProvider;
import org.eclipse.osbp.xtext.menu.ui.contentassist.ImageFileNameTextApplier;
import org.eclipse.xtext.AbstractElement;
import org.eclipse.xtext.Assignment;
import org.eclipse.xtext.Keyword;
import org.eclipse.xtext.RuleCall;
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 MenuDslProposalProvider extends AbstractMenuDslProposalProvider {
  private String imageSelectionPrompt = "Select image file...";
  
  @Inject
  private TerminalsProposalProvider provider;
  
  @Inject
  private BasicDSLProposalProviderHelper providerHelper;
  
  @Override
  protected StyledString getKeywordDisplayString(final Keyword keyword) {
    return BasicDSLProposalProviderHelper.getKeywordDisplayString(keyword, MenuDSLDocumentationTranslator.instance());
  }
  
  /**
   * This override will enable 1 length non letter characters as keyword.
   */
  @Override
  protected boolean isKeywordWorthyToPropose(final Keyword keyword) {
    return true;
  }
  
  @Override
  public void completeMenuEntry_Icon(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    this.imageFilePickerProposal(model, assignment, context, acceptor, ".png");
  }
  
  @Override
  public void completeMenuPackage_CollapsedImage(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    this.imageFilePickerProposal(model, assignment, context, acceptor, ".png");
  }
  
  @Override
  public void completeMenuPackage_ExpandedImage(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    this.imageFilePickerProposal(model, assignment, context, acceptor, ".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();
      applier.setExtensions(fileExtensions.split(","));
      applier.setContext(context);
      fileName.setTextApplier(applier);
    }
    acceptor.accept(fileName);
  }
  
  /**
   * This method decides which proposals will be valid.
   */
  @Override
  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 MenuEntry)) {
      return this.isEntryValidProposal(context, proposal, result);
    }
    return result;
  }
  
  public boolean isEntryValidProposal(final ContentAssistContext context, final String proposal, final boolean result) {
    boolean _isGrammarToken = this.isGrammarToken(proposal);
    if (_isGrammarToken) {
      return true;
    }
    return true;
  }
  
  public boolean isGrammarToken(final String proposal) {
    boolean _equals = this.imageSelectionPrompt.equals(proposal);
    if (_equals) {
      return true;
    }
    boolean _equals_1 = "dialog".equals(proposal);
    if (_equals_1) {
      return true;
    }
    boolean _equals_2 = "image".equals(proposal);
    if (_equals_2) {
      return true;
    }
    boolean _equals_3 = "table".equals(proposal);
    if (_equals_3) {
      return true;
    }
    boolean _equals_4 = "perspective".equals(proposal);
    if (_equals_4) {
      return true;
    }
    boolean _equals_5 = "process".equals(proposal);
    if (_equals_5) {
      return true;
    }
    boolean _equals_6 = "showBadge".equals(proposal);
    if (_equals_6) {
      return true;
    }
    boolean _equals_7 = "described by".equals(proposal);
    if (_equals_7) {
      return true;
    }
    boolean _equals_8 = "entry".equals(proposal);
    if (_equals_8) {
      return true;
    }
    boolean _equals_9 = "expandedImage".equals(proposal);
    if (_equals_9) {
      return true;
    }
    boolean _equals_10 = "collapsedImage".equals(proposal);
    if (_equals_10) {
      return true;
    }
    boolean _equals_11 = "width".equals(proposal);
    if (_equals_11) {
      return true;
    }
    return false;
  }
  
  @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_TRANSLATABLEID(final EObject model, final RuleCall ruleCall, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
    this.provider.complete_ID(model, ruleCall, context, acceptor);
  }
  
  @Override
  public void completeMenuPackage_Width(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);
  }
}
