import java.awt.Point; import java.awt.geom.Point2D; import java.util.ArrayList; import javax.swing.JOptionPane; /** * */ /** * Braille encoder class * * @author crocsg * */ public class Braille2GcodeEncoder { private GCodeGenerator generator = new GCodeGenerator (); private int page_num= 0; private int char_cnt_line = 0; private BrailleGcodeEncoding encoder; private float position_x; private float position_y; private ArrayList pagedot; private ArrayList> linedot; private String bufline = ""; private String pagegcode = ""; private final float Braille_cell_width = 2.3f; private final float Braille_cell_height = 2.3f; private final float Braille_cell_padding = 6.1f; private final float Braille_line_padding = 10f; private boolean pageAvailable = false; private boolean newpage=true; /** * @return the pageAvailable */ public boolean isPageAvailable() { return pageAvailable; } /** * @return the pagegcode */ public String getPagegcode() { return pagegcode; } /** * Constructor */ private Braille2GcodeEncoder() { } /** * Constructor * @param encoder Braille Encoding */ public Braille2GcodeEncoder(BrailleGcodeEncoding encoder) { this.encoder = encoder; } public void startPage () { pagedot = new ArrayList (); position_y = 2;//TODO avoid magic pageAvailable = false; newpage = false; pagegcode = ""; startLine (); } /** * Complete GCode encoding for the current page */ public void endPage () { if ( ! pagedot.isEmpty()) { pagegcode = generator.Header(); for (Point2D.Float p: pagedot) { pagegcode += generator.moveTo(p.getX(),p.getY()); pagegcode += generator.printDot(); } pagegcode += generator.Footer(); pageAvailable = true; int n = JOptionPane.showConfirmDialog( null, "Page " + (page_num+1) + " chargez le papier quand l'embosseuse est disponible", "BrailleRapSP Embosseuse Braille", JOptionPane.OK_CANCEL_OPTION); if (n == JOptionPane.CANCEL_OPTION) { // cancel print System.exit(0); } page_num++; } } /** * Start a new line */ public void startLine () { linedot = new ArrayList > (); for (int i =0; i < encoder.getNline(); i++ ) { linedot.add(new ArrayList()); } position_x = 0; //TODO avoid magic bufline = ""; } /** * @param p Dot position in Braille character * @return Absolute position on page */ private Point2D.Float getDotAbsolutePosition(Point p) { Point2D.Float absolute = new Point2D.Float(); absolute.x = position_x + (float) p.x * Braille_cell_width; absolute.y = position_y + (float) p.y * Braille_cell_height; return absolute; } /** * Update fields for next Braille character */ private void nextCellPosition () { this.position_x += Braille_cell_padding; } /** * Update fields for next line of Braille characters */ private void nextLinePosition () { this.position_y += Braille_line_padding; } /** * End Braille characters line */ private void endLine () { ArrayList dots; // compute braille dots on line for (int i =0; i < bufline.length(); i++) { dots = encoder.GetCharacterDots(bufline.charAt(i)); if (dots != null) { for (int d= 0; d < dots.size (); d++) { int x = dots.get(d).x; int y = dots.get(d).y; linedot.get(y).add(getDotAbsolutePosition(dots.get(d))); } nextCellPosition (); } } // store braille absolute dot on page for (int l = 0; l < linedot.size(); l++) { pagedot.addAll(linedot.get(l)); } nextLinePosition(); } /** * Add a character in page buffer to encode in Braille * @param a character to add */ private void addCharToBuffer (char a) { bufline += a; } /** * Initialize Braille encoder */ public void Open () { startPage (); } /* * Process a character * @param a character to process */ public void processChar (char a) { if (a == '\n') { endLine (); startLine (); } else if (a == 0x0c) endPage (); else { if (newpage) startPage(); addCharToBuffer (a); } } /** * CloseBraille encoder */ public void Close () { endLine (); endPage (); } /* * Request a new page */ public void requestNewPage() { newpage = true; pageAvailable = false; startPage (); } }