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

import com.google.inject.Inject
import org.eclipse.xtext.formatting.impl.AbstractDeclarativeFormatter
import org.eclipse.xtext.formatting.impl.FormattingConfig
import org.eclipse.osbp.utils.xtext.GenericFormatter
import org.eclipse.xtext.xbase.services.XtypeGrammarAccess
//import org.eclipse.osbp.xtext.cubedsl.services.CubeDSLGrammarAccess
//import org.eclipse.xtext.ParserRule
//import org.eclipse.xtext.GrammarUtil

/**
 * 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 CubeDSLFormatter extends AbstractDeclarativeFormatter {

//	@Inject extension CubeDSLGrammarAccess
	@Inject XtypeGrammarAccess grammarAccess

	override protected void configureFormatting(FormattingConfig c) {
		val genericFormatter = new GenericFormatter()

//		val ga = grammar as CubeDSLGrammarAccess

//		val ParserRule iRule = GrammarUtil.findRuleForName( grammar.grammar, "Import" ) as ParserRule
//		c.setLinewrap(2).between( iRule, cubeTypeRule )
//		c.setLinewrap(2).before( cubeTypeRule )

//		c.setLinewrap(2).between( CubePackageRule, importRule )
//		c.setLinewrap(2).before( ga.CubePackageAccess.packageKeyword_0 )
//		c.setLinewrap(2).between( importRule, CubeTypeRule )
//		c.setLinewrap(2).before( ga.CubeTypeAccess.cubeKeyword_0 )
//		c.setLinewrap(2).before( CubeTypeAccess.cubeKeyword_0 )
//		c.setLinewrap(2).around( importRule )			// each import statement!
//		c.setLinewrap( 0, 1, 2 ).before( SL_COMMENTRule )
//		c.setLinewrap( 0, 1, 1 ).after ( SL_COMMENTRule )
//		c.setLinewrap().between( SL_COMMENTRule, CubeTypeRule )
//		c.setLinewrap().between( SL_COMMENTRule, CubeEntityRule )
//		c.setNoLinewrap().between( SL_COMMENTRule, SL_COMMENTRule )
//		c.setNoLinewrap().after(SL_COMMENTRule)
//		c.setLinewrap( 0, 1, 2 ).around( ML_COMMENTRule )
//		c.setLinewrap( 0, 1, 2 ).before( ML_COMMENTRule )
//		c.setLinewrap( 0, 1, 2 ).after ( ML_COMMENTRule )
//		c.setLinewrap(1, 1, 1).around(SL_COMMENTRule)
//		c.setLinewrap(1, 1, 1).around(ML_COMMENTRule)
//		c.setLinewrap( 2 ).after( ga.importAccess.importedNamespaceCubeQualifiedNameWithWildCardParserRuleCall_1_0 )

//		c.setNoLinewrap().before( cubePackageAccess.packageKeyword_0 )

		genericFormatter.formatFirstLevelBlocks( c, grammar.grammar, "CubeDimension", "Import" )
		genericFormatter.formatFirstLevelBlocks( c, grammar.grammar, "CubeType"     , "Import" )
		genericFormatter.genericFormatting( c, grammar, grammarAccess )
	}
}
