/**
 * Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf, Austria), 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:
 *         Florian Pirchner - Initial implementation
 */

/*
 * generated by Xtext
 */
package org.eclipse.osbp.dsl.datatype.xtext.ui.contentassist;

import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.viewers.StyledString;
import org.eclipse.xtext.Assignment;
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.osbp.dsl.semantic.common.types.LDataType;
import org.eclipse.osbp.dsl.semantic.common.types.LDatatypeConstraint;

/**
 * see http://www.eclipse.org/Xtext/documentation.html#contentAssist on how to
 * customize content assistant
 */
public class DatatypeGrammarProposalProvider
		extends
		org.eclipse.osbp.dsl.datatype.xtext.ui.contentassist.AbstractDatatypeGrammarProposalProvider {

	@Override
	public void completeDtCDigits_MsgCode(EObject model, Assignment assignment,
			ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
		completeMessageCode(model, "digits", context, acceptor);
	}

	@Override
	public void completeDtCDigits_MsgI18nKey(EObject model,
			Assignment assignment, ContentAssistContext context,
			ICompletionProposalAcceptor acceptor) {
		completeMessageI18nKey(model, "digits", context, acceptor);
	}

	@Override
	public void completeDtCAssertFalse_MsgCode(EObject model,
			Assignment assignment, ContentAssistContext context,
			ICompletionProposalAcceptor acceptor) {
		completeMessageCode(model, "assertFalse", context, acceptor);
	}

	@Override
	public void completeDtCAssertFalse_MsgI18nKey(EObject model,
			Assignment assignment, ContentAssistContext context,
			ICompletionProposalAcceptor acceptor) {
		completeMessageI18nKey(model, "assertFalse", context, acceptor);
	}

	@Override
	public void completeDtCAssertTrue_MsgCode(EObject model,
			Assignment assignment, ContentAssistContext context,
			ICompletionProposalAcceptor acceptor) {
		completeMessageCode(model, "assertTrue", context, acceptor);
	}

	@Override
	public void completeDtCAssertTrue_MsgI18nKey(EObject model,
			Assignment assignment, ContentAssistContext context,
			ICompletionProposalAcceptor acceptor) {
		completeMessageI18nKey(model, "assertTrue", context, acceptor);
	}

	@Override
	public void completeDtCDecimalMax_MsgCode(EObject model,
			Assignment assignment, ContentAssistContext context,
			ICompletionProposalAcceptor acceptor) {
		completeMessageCode(model, "decimalMax", context, acceptor);
	}

	@Override
	public void completeDtCDecimalMax_MsgI18nKey(EObject model,
			Assignment assignment, ContentAssistContext context,
			ICompletionProposalAcceptor acceptor) {
		completeMessageI18nKey(model, "decimalMax", context, acceptor);
	}

	@Override
	public void completeDtCDecimalMin_MsgCode(EObject model,
			Assignment assignment, ContentAssistContext context,
			ICompletionProposalAcceptor acceptor) {
		completeMessageCode(model, "decimalMin", context, acceptor);
	}

	@Override
	public void completeDtCDecimalMin_MsgI18nKey(EObject model,
			Assignment assignment, ContentAssistContext context,
			ICompletionProposalAcceptor acceptor) {
		completeMessageI18nKey(model, "decimalMin", context, acceptor);
	}

	@Override
	public void completeDtCFuture_MsgCode(EObject model, Assignment assignment,
			ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
		completeMessageCode(model, "isFuture", context, acceptor);
	}

	@Override
	public void completeDtCFuture_MsgI18nKey(EObject model,
			Assignment assignment, ContentAssistContext context,
			ICompletionProposalAcceptor acceptor) {
		completeMessageI18nKey(model, "isFuture", context, acceptor);
	}

	@Override
	public void completeDtCPast_MsgCode(EObject model, Assignment assignment,
			ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
		completeMessageCode(model, "isPast", context, acceptor);
	}

	@Override
	public void completeDtCPast_MsgI18nKey(EObject model,
			Assignment assignment, ContentAssistContext context,
			ICompletionProposalAcceptor acceptor) {
		completeMessageI18nKey(model, "isPast", context, acceptor);
	}

	@Override
	public void completeDtCNumericMax_MsgCode(EObject model,
			Assignment assignment, ContentAssistContext context,
			ICompletionProposalAcceptor acceptor) {
		completeMessageCode(model, "numericMax", context, acceptor);
	}

	@Override
	public void completeDtCNumericMax_MsgI18nKey(EObject model,
			Assignment assignment, ContentAssistContext context,
			ICompletionProposalAcceptor acceptor) {
		completeMessageI18nKey(model, "numericMax", context, acceptor);
	}

	@Override
	public void completeDtCNumericMin_MsgCode(EObject model,
			Assignment assignment, ContentAssistContext context,
			ICompletionProposalAcceptor acceptor) {
		completeMessageCode(model, "numericMin", context, acceptor);
	}

	@Override
	public void completeDtCNumericMin_MsgI18nKey(EObject model,
			Assignment assignment, ContentAssistContext context,
			ICompletionProposalAcceptor acceptor) {
		completeMessageI18nKey(model, "numericMin", context, acceptor);
	}

	@Override
	public void completeDtCNotNull_MsgCode(EObject model,
			Assignment assignment, ContentAssistContext context,
			ICompletionProposalAcceptor acceptor) {
		completeMessageCode(model, "isNotNull", context, acceptor);
	}

	@Override
	public void completeDtCNotNull_MsgI18nKey(EObject model,
			Assignment assignment, ContentAssistContext context,
			ICompletionProposalAcceptor acceptor) {
		completeMessageI18nKey(model, "isNotNull", context, acceptor);
	}

	@Override
	public void completeDtCNull_MsgCode(EObject model, Assignment assignment,
			ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
		completeMessageCode(model, "isNull", context, acceptor);
	}

	@Override
	public void completeDtCNull_MsgI18nKey(EObject model,
			Assignment assignment, ContentAssistContext context,
			ICompletionProposalAcceptor acceptor) {
		completeMessageI18nKey(model, "isNull", context, acceptor);
	}

	@Override
	public void completeDtCRegEx_MsgCode(EObject model, Assignment assignment,
			ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
		completeMessageCode(model, "regex", context, acceptor);
	}

	@Override
	public void completeDtCRegEx_MsgI18nKey(EObject model,
			Assignment assignment, ContentAssistContext context,
			ICompletionProposalAcceptor acceptor) {
		completeMessageI18nKey(model, "regex", context, acceptor);
	}

	@Override
	public void completeDtCSize_MsgCode(EObject model, Assignment assignment,
			ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
		completeMessageCode(model, "size", context, acceptor);
	}

	@Override
	public void completeDtCSize_MsgI18nKey(EObject model,
			Assignment assignment, ContentAssistContext context,
			ICompletionProposalAcceptor acceptor) {
		completeMessageI18nKey(model, "size", context, acceptor);
	}

	protected void completeMessageCode(EObject model, String name,
			ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
		int replacementOffset = context.getReplaceRegion().getOffset();
		int replacementLength = context.getReplaceRegion().getLength() + 1;

		LDataType lDt = (LDataType) model.eContainer();
		StringBuilder b = new StringBuilder();
		b.append("MSG_Datatype_");
		b.append(lDt.getName());
		b.append("__");
		b.append(name);

		ConfigurableCompletionProposal result = doCreateProposal(b.toString(),
				new StyledString(b.toString()), null, replacementOffset,
				replacementLength);
		result.setPriority(1000);
		result.setMatcher(context.getMatcher());
		result.setReplaceContextLength(context.getReplaceContextLength());
		acceptor.accept(result);
	}

	protected void completeMessageI18nKey(EObject model, String name,
			ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
		int replacementOffset = context.getReplaceRegion().getOffset();
		int replacementLength = context.getReplaceRegion().getLength() + 1;

		LDataType lDt = (LDataType) model.eContainer();
		StringBuilder b = new StringBuilder();
		b.append("MSG_Datatype_");
		b.append(lDt.getName());
		b.append("__");
		b.append(name);
		b.append(".message");

		ConfigurableCompletionProposal result = doCreateProposal(b.toString(),
				new StyledString(b.toString()), null, replacementOffset,
				replacementLength);
		result.setPriority(1000);
		result.setMatcher(context.getMatcher());
		result.setReplaceContextLength(context.getReplaceContextLength());
		acceptor.accept(result);
	}
}
