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

import com.google.inject.Inject
import org.eclipse.xtext.Keyword
import org.eclipse.xtext.formatting.impl.AbstractDeclarativeFormatter
import org.eclipse.xtext.formatting.impl.FormattingConfig
import org.eclipse.osbp.xtext.gridsource.services.GridSourceGrammarAccess

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

	@Inject extension GridSourceGrammarAccess

	override void configureFormatting(FormattingConfig c) {
		val GridSourceGrammarAccess f = getGrammarAccess() as GridSourceGrammarAccess

		c.autoLinewrap = 120

		c.setLinewrap(1, 1, 2).around(propertyAccess.rule)

		// propertyConfigAccess
		c.setLinewrap(0, 1, 2).before(numericToResourceStyleConfigAccess.numberKeyword_0)
		c.setLinewrap(0, 1, 2).before(stringToResourceStyleConfigAccess.stringKeyword_0)

		// nested properties
		c.setNoSpace.after(nestedPathAccess.fullStopKeyword_1)
		c.setNoSpace.before(nestedPathAccess.fullStopKeyword_1)

		// common settings
		c.setLinewrap(0, 0, 2).before(f.getSL_COMMENTRule());
		c.setLinewrap(0, 0, 2).after(f.getSL_COMMENTRule());
		c.setLinewrap(0, 0, 2).before(f.getML_COMMENTRule());
		c.setLinewrap(0, 0, 2).after(f.getML_COMMENTRule());

		for (Keyword kw : f.findKeywords("@")) {
			c.setNoSpace().after(kw);
		}
		for (Keyword kw : f.findKeywords("{")) {
			c.setIndentationIncrement.after(kw)
			c.setLinewrap(0, 1, 1).after(kw)
		}
		for (Keyword kw : f.findKeywords("}")) {
			c.setLinewrap(1, 1, 1).before(kw)
			c.setIndentationDecrement.before(kw)
			c.setLinewrap(1, 1, 1).after(kw)
		}
		for (Keyword kw : f.findKeywords("(")) {
			c.setNoSpace().after(kw);
		}
		for (Keyword kw : f.findKeywords("(")) {
			c.setNoSpace().before(kw);
		}
		for (Keyword kw : f.findKeywords(")")) {
			c.setNoSpace().before(kw);
		}
		for (Keyword kw : f.findKeywords(";")) {
			c.setNoSpace().before(kw);
		}
		for (Keyword kw : f.findKeywords(",")) {
			c.setNoSpace().before(kw);
		}
	}
}
