/**
*
*/
package org.goko.tools.editor.component;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.text.rules.EndOfLineRule;
import org.eclipse.jface.text.rules.IPredicateRule;
import org.eclipse.jface.text.rules.MultiLineRule;
import org.eclipse.jface.text.rules.RuleBasedPartitionScanner;
import org.eclipse.jface.text.rules.Token;
import org.eclipse.jface.text.rules.WordPatternRule;
import org.goko.tools.editor.component.detector.CoordinateWordDetector;
import org.goko.tools.editor.component.detector.FWordDetector;
import org.goko.tools.editor.component.detector.GWordDetector;
import org.goko.tools.editor.component.detector.MWordDetector;
import org.goko.tools.editor.component.detector.NWordDetector;
import org.goko.tools.editor.component.scanner.GCodeDecimalRule;
/**
* @author Psyko
* @date 22 mai 2016
*/
public class GCodePartitionScanner extends RuleBasedPartitionScanner
{
public final static String GCODE_G_COMMENT = "__g_comment";
public final static String GCODE_G_WORD = "__g_word";
public final static String GCODE_M_WORD = "__m_word";
public final static String GCODE_G0_WORD = "__g0_word";
public final static String GCODE_G1_WORD = "__g1_word";
public final static String GCODE_COORD_WORD = "__coord_word";
public final static String GCODE_DECIMAL = "__decimal";
public final static String GCODE_LINE_WORD = "__line_word";
public final static String GCODE_FEEDRATE_WORD = "__feedrate_word";
public final static String GCODE_DEFAULT = "__default";
public final static String TEXT = "__text";
public final static String DFTL = "__dftl_partition_content_type";
public GCodePartitionScanner()
{
Token Comment = new Token(GCODE_G_COMMENT);
Token gword = new Token(GCODE_G_WORD);
Token coordinate = new Token(GCODE_COORD_WORD);
Token line = new Token(GCODE_LINE_WORD);
Token feedrate = new Token(GCODE_FEEDRATE_WORD);
Token mword = new Token(GCODE_M_WORD);
Token decimal = new Token(GCODE_DECIMAL);
Token dftl = new Token(DFTL);
setDefaultReturnToken(dftl);
List<IPredicateRule> rules = new ArrayList<IPredicateRule>();
rules.add(new MultiLineRule("(", ")", Comment));
rules.add(new EndOfLineRule(";", Comment));
rules.add(new WordPatternRule(new GWordDetector(), "G", null, gword));
rules.add(new WordPatternRule(new GWordDetector(), "g", null, gword));
rules.add(new WordPatternRule(new NWordDetector(), "N", null, line));
rules.add(new WordPatternRule(new NWordDetector(), "n", null, line));
rules.add(new WordPatternRule(new FWordDetector(), "F", null, feedrate));
rules.add(new WordPatternRule(new FWordDetector(), "f", null, feedrate));
rules.add(new WordPatternRule(new MWordDetector(), "M", null, mword));
rules.add(new WordPatternRule(new MWordDetector(), "m", null, mword));
// Coordinates
CoordinateWordDetector coordinateWordDetector = new CoordinateWordDetector();
rules.add(new WordPatternRule(coordinateWordDetector, "X", null, coordinate));
rules.add(new WordPatternRule(coordinateWordDetector, "x", null, coordinate));
rules.add(new WordPatternRule(coordinateWordDetector, "Y", null, coordinate));
rules.add(new WordPatternRule(coordinateWordDetector, "y", null, coordinate));
rules.add(new WordPatternRule(coordinateWordDetector, "Z", null, coordinate));
rules.add(new WordPatternRule(coordinateWordDetector, "z", null, coordinate));
rules.add(new WordPatternRule(coordinateWordDetector, "A", null, coordinate));
rules.add(new WordPatternRule(coordinateWordDetector, "a", null, coordinate));
rules.add(new WordPatternRule(coordinateWordDetector, "B", null, coordinate));
rules.add(new WordPatternRule(coordinateWordDetector, "b", null, coordinate));
rules.add(new WordPatternRule(coordinateWordDetector, "C", null, coordinate));
rules.add(new WordPatternRule(coordinateWordDetector, "c", null, coordinate));
rules.add(new WordPatternRule(coordinateWordDetector, "I", null, coordinate));
rules.add(new WordPatternRule(coordinateWordDetector, "i", null, coordinate));
rules.add(new WordPatternRule(coordinateWordDetector, "J", null, coordinate));
rules.add(new WordPatternRule(coordinateWordDetector, "j", null, coordinate));
rules.add(new WordPatternRule(coordinateWordDetector, "K", null, coordinate));
rules.add(new WordPatternRule(coordinateWordDetector, "k", null, coordinate));
rules.add(new WordPatternRule(new FWordDetector(), "F", null, gword));
rules.add(new WordPatternRule(new FWordDetector(), "f", null, gword));
rules.add(new GCodeDecimalRule(decimal));
setPredicateRules(rules.toArray(new IPredicateRule[]{}));//PredicateRules(rules);
}
}