Java tutorial
// $Id$ /* * Gudoku (http://sourceforge.net/projects/gudoku) * Sudoku-Implementierung auf Basis des Google Webtoolkit * (http://code.google.com/webtoolkit/). Die Lsungsalgorithmen in Java laufen * parallel. Die Sudoku-Rtsel werden mittels JDBC in einer Datenbank * gespeichert. * * Copyright (C) 2008 Jrgen Dufner * * Dieses Programm ist freie Software. Sie knnen es unter den Bedingungen der * GNU General Public License, wie von der Free Software Foundation * verffentlicht, weitergeben und/oder modifizieren, entweder gem Version 3 * der Lizenz oder (nach Ihrer Option) jeder spteren Version. * * Die Verffentlichung dieses Programms erfolgt in der Hoffnung, da es Ihnen * von Nutzen sein wird, aber OHNE IRGENDEINE GARANTIE, sogar ohne die * implizite Garantie der MARKTREIFE oder der VERWENDBARKEIT FR EINEN * BESTIMMTEN ZWECK. Details finden Sie in der GNU General Public License. * * Sie sollten ein Exemplar der GNU General Public License zusammen mit diesem * Programm erhalten haben. Falls nicht, siehe <http://www.gnu.org/licenses/>. * */ package de.jdufner.sudoku.generator.pdf; import java.awt.Color; import java.util.Properties; import com.lowagie.text.Element; import com.lowagie.text.Paragraph; import com.lowagie.text.pdf.PdfPCell; import com.lowagie.text.pdf.PdfPTable; import de.jdufner.sudoku.common.board.BoxUtils; import de.jdufner.sudoku.common.board.Cell; import de.jdufner.sudoku.common.board.CellHandler; import de.jdufner.sudoku.common.board.SudokuSize; /** * * @author <a href="mailto:jdufner@users.sf.net">Jürgen Dufner</a> * @since 2009-12-07 * @version $Revision$ */ public final class PdfCellHandler implements CellHandler { private SudokuSize sudokuSize; private Properties pdfStyle; private PdfPTable table = null; public PdfCellHandler(SudokuSize sudokuSize, Properties pdfStyle) { this.sudokuSize = sudokuSize; this.pdfStyle = pdfStyle; } @Override public void handleCell(Cell cell) { PdfPCell pdfCell = null; if (cell.isFixed()) { pdfCell = new PdfPCell(new Paragraph(cell.getValue().toString())); } else { if (Boolean.getBoolean(getPdfStyle().getProperty("sudoku.board.candidates.print"))) { pdfCell = new PdfPCell(buildCandidates()); } else { pdfCell = new PdfPCell(); } } formatZelle(cell.getRowIndex(), cell.getColumnIndex(), pdfCell); table.addCell(pdfCell); } @Override public void initialize() { table = new PdfPTable(getSudokuSize().getHouseSize()); } public PdfPTable getTable() { return table; } private boolean isEvenBlockIndex(final int rowIndex, final int columnIndex) { if (BoxUtils.getBlockIndexByRowIndexAndColumnIndex(rowIndex, columnIndex, getSudokuSize()) % 2 == 0) { return true; } return false; } private void formatZelle(final int zeile, final int spalte, final PdfPCell cell) { cell.setHorizontalAlignment(Element.ALIGN_CENTER); cell.setVerticalAlignment(Element.ALIGN_MIDDLE); cell.setBorderColor(new Color(// Integer.parseInt(getPdfStyle().getProperty("sudoku.board.border.color.red")), // Integer.parseInt(getPdfStyle().getProperty("sudoku.board.border.color.green")), // Integer.parseInt(getPdfStyle().getProperty("sudoku.board.border.color.blue")))); if (isEvenBlockIndex(zeile, spalte)) { cell.setBackgroundColor(new Color(// Integer.parseInt(getPdfStyle().getProperty("sudoku.board.background.odd.color.red")), // Integer.parseInt(getPdfStyle().getProperty("sudoku.board.background.odd.color.green")), // Integer.parseInt(getPdfStyle().getProperty("sudoku.board.background.odd.color.blue")))); } else { cell.setBackgroundColor(new Color(// Integer.parseInt(getPdfStyle().getProperty("sudoku.board.background.even.color.red")), // Integer.parseInt(getPdfStyle().getProperty("sudoku.board.background.even.color.green")), // Integer.parseInt(getPdfStyle().getProperty("sudoku.board.background.even.color.blue")))); } cell.setBorderWidth(PdfConstants.RAHMEN_DUENN); if (BoxUtils.isFirstRowInBlock(zeile, getSudokuSize())) { cell.setBorderWidthTop(PdfConstants.RAHMEN_DICK); } else { cell.setBorderWidthTop(PdfConstants.RAHMEN_DUENN); } if (BoxUtils.isLastColumnInRow(spalte, getSudokuSize())) { cell.setBorderWidthRight(PdfConstants.RAHMEN_DICK); } else { cell.setBorderWidthRight(PdfConstants.RAHMEN_DUENN); } if (BoxUtils.isLastRowInColumn(zeile, getSudokuSize())) { cell.setBorderWidthBottom(PdfConstants.RAHMEN_DICK); } else { cell.setBorderWidthBottom(PdfConstants.RAHMEN_DUENN); } if (BoxUtils.isFirstColumnInBlock(spalte, getSudokuSize())) { cell.setBorderWidthLeft(PdfConstants.RAHMEN_DICK); } else { cell.setBorderWidthLeft(PdfConstants.RAHMEN_DUENN); } cell.setFixedHeight(27f); } /** * * @return 3x3 Tabelle gefllt mit Kandidaten 1-9 */ private PdfPTable buildCandidates() { final float CANDIDATE_FONT_SIZE = 6f; final float CANDIDATE_PADDING = 1f; PdfPTable candidates = new PdfPTable(3); PdfPCell[][] candidate = new PdfPCell[3][3]; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { Paragraph p = new Paragraph(String.valueOf(i * 3 + j + 1)); p.getFont().setSize(CANDIDATE_FONT_SIZE); candidate[i][j] = new PdfPCell(p); candidate[i][j].setPadding(CANDIDATE_PADDING); candidate[i][j].setHorizontalAlignment(Element.ALIGN_CENTER); candidate[i][j].setVerticalAlignment(Element.ALIGN_MIDDLE); candidate[i][j].setBorderColor(new Color(PdfConstants.RAHMEN_FARBE[0], PdfConstants.RAHMEN_FARBE[1], PdfConstants.RAHMEN_FARBE[2])); candidate[i][j].setBorderWidth(PdfConstants.RAHMEN_KEIN); if (i > 0) { candidate[i][j].setBorderWidthTop(PdfConstants.RAHMEN_DUENN); } if (j > 0) { candidate[i][j].setBorderWidthLeft(PdfConstants.RAHMEN_DUENN); } candidates.addCell(candidate[i][j]); } } return candidates; } public SudokuSize getSudokuSize() { return sudokuSize; } public void setSudokuSize(SudokuSize sudokuSize) { this.sudokuSize = sudokuSize; } public Properties getPdfStyle() { return pdfStyle; } public void setPdfStyle(Properties pdfStyle) { this.pdfStyle = pdfStyle; } }