/******************************************************************************
 *                                                                            *
 *  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.xtext.Keyword
import org.eclipse.xtext.RuleCall
import org.eclipse.xtext.common.ui.contentassist.TerminalsProposalProvider
import org.eclipse.xtext.ui.editor.contentassist.ContentAssistContext
import org.eclipse.xtext.ui.editor.contentassist.ICompletionProposalAcceptor
import org.eclipse.xtext.nodemodel.INode
import org.eclipse.xtext.nodemodel.impl.AbstractNode

/**
 * see http://www.eclipse.org/Xtext/documentation.html#contentAssist on how to customize content assistant
 */
class DialogDslProposalProvider extends AbstractDialogDslProposalProvider {

	@Inject TerminalsProposalProvider provider
	@Inject BasicDSLProposalProviderHelper providerHelper

	override protected StyledString getKeywordDisplayString(Keyword keyword) {
		return BasicDSLProposalProviderHelper.getKeywordDisplayString(keyword,
			DialogDSLDocumentationTranslator.instance())
	}

	/**
	 * This override will enable 1 length non letter characters as keyword.
	 */
	override protected boolean isKeywordWorthyToPropose(Keyword keyword) {
		return true;
	}

	override protected boolean isValidProposal(String proposal, String prefix, ContentAssistContext context) {
		var result = super.isValidProposal(proposal, prefix, context);
		result = !result.existsConflict(proposal, context)
		return result
	}

	// ------------------------ delegates to BasicDSLProposalProviderHelper -----------------
	override public void complete_QualifiedName(EObject model, RuleCall ruleCall, ContentAssistContext context,
		ICompletionProposalAcceptor acceptor) {
		providerHelper.complete_PackageName(model, ruleCall, context, acceptor, this)
	}

	// ------------------------ delegates to TerminalsProposalProvider -----------------
	override public void complete_TRANSLATABLESTRING(EObject model, RuleCall ruleCall, ContentAssistContext context,
		ICompletionProposalAcceptor acceptor) {
		provider.complete_STRING(model, ruleCall, context, acceptor)
	}

	override public void complete_ID(EObject model, RuleCall ruleCall, ContentAssistContext context,
		ICompletionProposalAcceptor acceptor) {
		provider.complete_ID(model, ruleCall, context, acceptor)
	}

	def private boolean existsConflict(boolean isValidProposal, String proposal, ContentAssistContext context) {
		if ("toolbar".equals(proposal)) {
			var lastCompleteNode = context.getLastCompleteNode();
			if (lastCompleteNode instanceof AbstractNode) {
				lastCompleteNode = (lastCompleteNode as AbstractNode)
				var grammarElement = lastCompleteNode.grammarElement
				if (grammarElement instanceof Keyword) {
					var lastCompleteNodeValue = (grammarElement as Keyword).value
					if ('embedded'.equals(lastCompleteNodeValue)) {
						return true
					}
				}
			}
		}
		!isValidProposal
	}
}
