/**
 *                                                                            
 * 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.entitymock.formatting

import com.google.inject.Inject
import org.eclipse.osbp.xtext.oxtype.formatting.GenericFormatter
import org.eclipse.osbp.xtext.oxtype.services.OXtypeGrammarAccess
import org.eclipse.xtext.GrammarUtil
import org.eclipse.xtext.ParserRule
import org.eclipse.xtext.formatting.impl.AbstractDeclarativeFormatter
import org.eclipse.xtext.formatting.impl.FormattingConfig

//import org.eclipse.osbp.xtext.entitymock.services.EntityMockDSLGrammarAccess
/**
 * This class contains custom formatting description.
 * 
 * see : http://www.eclipse.org/Xtext/documentation.html#formatting
 * on how and when to use it 
 * 
 * Also see {@link org.eclipse.xtext.xtext.XtextFormattingTokenSerializer} as an example
 */
class EntityMockDSLFormatter extends AbstractDeclarativeFormatter {

	//	@Inject extension EntityMockDSLGrammarAccess
	@Inject OXtypeGrammarAccess grammarAccess

	override protected void configureFormatting(FormattingConfig c) {

		//		c.setLinewrap(1, 1, 1).around(SL_COMMENTRule)
		//		c.setLinewrap(1, 1, 1).around(ML_COMMENTRule)
		val genericFormatter = new GenericFormatter()
		var ParserRule importDef = GrammarUtil.findRuleForName(grammar.grammar, "EntityModelImport") as ParserRule
		var ParserRule resourceAttr = GrammarUtil.findRuleForName(grammar.grammar, "EntityMockResourceAttribute") as ParserRule
		c.setNoLinewrap().around(resourceAttr)
		genericFormatter.genericFormatting(c, grammar, grammarAccess)
	}
}
