/* * MegaMekLab - Copyright (C) 2008 * * Original author - jtighe (torren@users.sourceforge.net) * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. */ package megameklab.com.ui.Aero.Printing; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.print.PageFormat; import java.awt.print.Paper; import java.awt.print.Printable; import java.awt.print.PrinterException; import java.awt.print.PrinterJob; import java.io.File; import java.util.ArrayList; import java.util.Calendar; import java.util.Vector; import javax.print.attribute.HashPrintRequestAttributeSet; import javax.print.attribute.standard.PrintQuality; import megamek.common.Aero; import megamek.common.SmallCraft; //TODO: uncomment when print issue is fixed and pilot data is ready to position //import megamek.common.Crew; import megamek.common.TechConstants; import megameklab.com.util.ImageHelper; import megameklab.com.util.ImageHelperAero; import megameklab.com.util.UnitUtil; import com.kitfox.svg.SVGException; public class PrintSmallCraftSpheroid implements Printable { private SmallCraft smallCraft = null; private ArrayList<SmallCraft> smallCraftList; PrinterJob masterPrintJob; // TODO: uncomment when print issue is fixed and pilot data is ready to position // private int topMargin = 6; // private int leftMargin = 11; public PrintSmallCraftSpheroid(ArrayList<SmallCraft> list, PrinterJob masterPrintJob) { smallCraftList = list; this.masterPrintJob = masterPrintJob; } public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException { if (pageIndex >= 1) { return Printable.NO_SUCH_PAGE; } Graphics2D g2d = (Graphics2D) graphics; // f.setPaper(this.paper); printImage(g2d, pageFormat); return Printable.PAGE_EXISTS; } public void printImage(Graphics2D g2d, PageFormat pageFormat) { if (g2d == null) { return; } System.gc(); // g2d.drawImage(ImageHelper.getRecordSheet(smallCraft), 18, 18, 558, // 738, Color.BLACK, null); try { ImageHelper.loadSVGImage(new File("data/images/recordsheets/SpheroidSmallScraftTemplate.svg")).render(g2d); } catch (SVGException e) { e.printStackTrace(); } g2d.setColor(Color.BLACK); printSmallCraftSpheroidImage(g2d, ImageHelper.getFluffImage(smallCraft, ImageHelper.imageAero)); printSmallCraftSpheroidData(g2d); printArmor(g2d); printWeaponsNEquipment(g2d); printHeatSinks(g2d); // Armor Pips printFrontArmor(g2d, smallCraft.getOArmor(Aero.LOC_NOSE)); printLeftArmor(g2d, smallCraft.getOArmor(Aero.LOC_LWING)); printRightArmor(g2d, smallCraft.getOArmor(Aero.LOC_RWING)); printRearArmor(g2d, smallCraft.getOArmor(Aero.LOC_AFT)); // Internal Pips printStruct(g2d, smallCraft.get0SI()); g2d.scale(pageFormat.getImageableWidth(), pageFormat.getImageableHeight()); } private void printSmallCraftSpheroidData(Graphics2D g2d) { String smallCraftName = smallCraft.getChassis() + " " + smallCraft.getModel(); g2d.setFont(UnitUtil.getNewFont(g2d, smallCraftName, true, 180, 10.0f)); g2d.drawString(smallCraftName, 52, 117); Font font = UnitUtil.deriveFont(8.0f); g2d.setFont(font); //TODO: Pilot Data: Fix coords. Below coords are pasted from Mech code. //if ((aero.getCrew() != null) && !aero.getCrew().getName().equalsIgnoreCase("unnamed")) { // Crew pilot = aero.getCrew(); // g2d.drawString(pilot.getName(), 270 + leftMargin, topMargin + 119); // g2d.drawString(String.valueOf(pilot.getGunnery()), 295 + leftMargin, topMargin + 132); // g2d.drawString(String.valueOf(pilot.getPiloting()), 365 + leftMargin, topMargin + 132); //} // Test strings // g2d.drawString("Test Pilot", 270 + leftMargin, topMargin + 119); // g2d.drawString("5", 295 + leftMargin, topMargin + 132); // g2d.drawString("5", 365 + leftMargin, topMargin + 132); g2d.drawString(Integer.toString(smallCraft.getWalkMP()), 102, 142); g2d.drawString(Integer.toString(smallCraft.getRunMP()), 102, 152.5f); int tonnage = (int) Math.ceil(smallCraft.getWeight()); if ((tonnage % 5) != 0) { tonnage += 5 - (tonnage % 5); } g2d.drawString(Integer.toString(tonnage), 185, 131.5f); int nextDataLine = 152; int startLine = 188; int lineFeed = 8; switch (smallCraft.getTechLevel()) { case TechConstants.T_INTRO_BOXSET: ImageHelper.printCenterString(g2d, "(Intro)", font, startLine, nextDataLine); nextDataLine += lineFeed; break; case TechConstants.T_IS_TW_NON_BOX: case TechConstants.T_IS_TW_ALL: case TechConstants.T_CLAN_TW: break; case TechConstants.T_IS_ADVANCED: case TechConstants.T_CLAN_ADVANCED: ImageHelper.printCenterString(g2d, "(Advanced)", font, startLine, nextDataLine); nextDataLine += lineFeed; break; case TechConstants.T_IS_EXPERIMENTAL: case TechConstants.T_CLAN_EXPERIMENTAL: ImageHelper.printCenterString(g2d, "(Experimental)", font, startLine, nextDataLine); nextDataLine += lineFeed; break; case TechConstants.T_IS_UNOFFICIAL: case TechConstants.T_CLAN_UNOFFICIAL: ImageHelper.printCenterString(g2d, "(Unofficial)", font, startLine, nextDataLine); nextDataLine += lineFeed; break; } String techBase = "Inner Sphere"; if (smallCraft.isMixedTech()) { if (smallCraft.isClan()) { techBase = "Mixed Tech (Clan)"; } else { techBase = "Mixed Tech (I.S.)"; } } else if (smallCraft.isClan()) { techBase = "Clan"; } g2d.drawString(techBase, 185, 142.5f); if ((smallCraft.getSource() != null) && (smallCraft.getSource().trim().length() > 0)) { String sourceFluff = "Era: "; font = UnitUtil.deriveFont(true, 8.0f); g2d.setFont(font); g2d.drawString(sourceFluff, 138, nextDataLine); font = UnitUtil.getNewFont(g2d, smallCraft.getSource(), false, 51, 8.0f); g2d.setFont(font); g2d.drawString(smallCraft.getSource(), 177, nextDataLine); } else { String yearFluff = "Year: "; font = UnitUtil.deriveFont(true, 8.0f); g2d.setFont(font); g2d.drawString(yearFluff, 138, nextDataLine); font = UnitUtil.deriveFont(8.0f); g2d.setFont(font); g2d.drawString(String.format("%1$s", smallCraft.getYear()), 177, nextDataLine); } // g2d.drawString(Integer.toString(smallCraft.getYear()), 188, 155); // Cost/BV // DecimalFormatSymbols unusualSymbols = // new DecimalFormatSymbols(); // unusualSymbols.setDecimalSeparator('.'); // unusualSymbols.setGroupingSeparator(','); // DecimalFormat myFormatter = new DecimalFormat("#,###", // unusualSymbols); double bv = smallCraft.calculateBattleValue(true, true); if (bv != -1) { font = UnitUtil.deriveFont(true, 8); g2d.setFont(font); g2d.drawString("BV: ", 35, 348); font = UnitUtil.deriveFont(false, 8); g2d.setFont(font); g2d.drawString( String.format("%1$,d", smallCraft.calculateBattleValue(true, true)), 50, 348); } // myFormatter = new DecimalFormat("#,###.##"); // g2d.drawString(String.format("%1$,.0f C-bills", // smallCraft.getCost(true)), // 52, 346.2f); font = UnitUtil.deriveFont(true, 6); g2d.setFont(font); g2d.drawString( Integer.toString(Calendar.getInstance().get(Calendar.YEAR)), 40, 762); } private void printArmor(Graphics2D g2d) { // Armor Font font = UnitUtil.deriveFont(true, 9.0f); g2d.setFont(font); ImageHelper.printCenterString( g2d, String.format("%1$S (%2$s)", smallCraft.getThresh(Aero.LOC_NOSE), smallCraft.getArmor(Aero.LOC_NOSE)), g2d.getFont(), 445, 92); ImageHelper.printCenterString( g2d, String.format("%1$S (%2$s)", smallCraft.getThresh(Aero.LOC_RWING), smallCraft.getArmor(Aero.LOC_RWING)), g2d.getFont(), 520, 412); ImageHelper.printCenterString( g2d, String.format("%1$S (%2$s)", smallCraft.getThresh(Aero.LOC_LWING), smallCraft.getArmor(Aero.LOC_LWING)), g2d.getFont(), 270, 412); ImageHelper.printCenterString(g2d, String.format("%1$S (%2$s)", smallCraft.getThresh(Aero.LOC_AFT), smallCraft.getArmor(Aero.LOC_AFT)), g2d.getFont(), 370, 508); g2d.drawString(String.format("%1$S", smallCraft.get0SI()), 395, 269f); } private void printHeatSinks(Graphics2D g2d) { Font font = UnitUtil.deriveFont(true, 8.0f); g2d.setFont(font); // Heat Sinks if (smallCraft.getHeatType() == Aero.HEAT_DOUBLE) { g2d.drawString(String.format("%1$s (%2$s)", smallCraft.getHeatSinks(), smallCraft.getHeatSinks() * 2), 508, 540); g2d.drawString("Double", 508, 546.5f); } else { g2d.drawString( String.format("%1$s (%1$s)", smallCraft.getHeatSinks()), 508, 540); g2d.drawString("Single", 508, 546.5f); } Dimension column = new Dimension(510, 556); Dimension pipShift = new Dimension(9, 9); for (int pos = 1; pos <= smallCraft.getHeatSinks(); pos++) { ImageHelper.drawHeatSinkPip(g2d, column.width, column.height); column.height += pipShift.height; if ((pos % 10) == 0) { column.height -= pipShift.height * 10; column.width += pipShift.width; } } } private void printWeaponsNEquipment(Graphics2D g2d) { ImageHelperAero.printAeroWeaponsNEquipment(smallCraft, g2d); } public void print(HashPrintRequestAttributeSet aset) { try { for (int pos = 0; pos < smallCraftList.size(); pos++) { PrinterJob pj = PrinterJob.getPrinterJob(); pj.setPrintService(masterPrintJob.getPrintService()); aset.add(PrintQuality.HIGH); PageFormat pageFormat = new PageFormat(); pageFormat = pj.getPageFormat(null); Paper p = pageFormat.getPaper(); p.setImageableArea(0, 0, p.getWidth(), p.getHeight()); pageFormat.setPaper(p); pj.setPrintable(this, pageFormat); smallCraft = smallCraftList.get(pos); pj.setJobName(smallCraft.getChassis() + " " + smallCraft.getModel()); try { pj.print(aset); } catch (Exception ex) { ex.printStackTrace(); } System.gc(); } } catch (Exception ex) { ex.printStackTrace(); } } private void printFrontArmor(Graphics2D g2d, int totalArmor) { float[] topColumn = { 370, 105 }; float[] pipShift = { 7, 7 }; float maxColumns = 8; Vector<float[]> pipPlotter = new Vector<float[]>(200); for (int pos = 1; pos <= 200; pos++) { // ImageHelperAero.drawAeroArmorPip(g2d, topColumn[0], // topColumn[1]); pipPlotter.add(new float[] { topColumn[0], topColumn[1] }); topColumn[0] += pipShift[0]; if ((pos % maxColumns) == 0) { topColumn[1] += pipShift[1]; pipShift[0] *= -1; topColumn[0] += pipShift[0]; /* * if (pos > totalArmor - maxColumns) { topColumn[0] += * pipShift[0] ((maxColumns - (totalArmor - pos)) / 2); } else { * topColumn[0] += pipShift[0] / 2; } */ } } int pipSpace = 200 / totalArmor; for (int pos = 0; pos < 200; pos += pipSpace) { ImageHelperAero.drawAeroArmorPip(g2d, pipPlotter.get(pos)[0], pipPlotter.get(pos)[1]); if (--totalArmor <= 0) { return; } } } private void printRearArmor(Graphics2D g2d, int totalArmor) { float[] topColumn = new float[] { 370, 310 }; float[] pipShift = new float[] { 7, 7 }; float maxColumns = 8; Vector<float[]> pipPlotter = new Vector<float[]>(132); for (int pos = 1; pos <= 132; pos++) { pipPlotter.add(new float[] { topColumn[0], topColumn[1] }); topColumn[0] += pipShift[0]; if ((pos % maxColumns) == 0) { topColumn[1] += pipShift[1]; pipShift[0] *= -1; topColumn[0] += pipShift[0]; } } int pipSpace = 132 / totalArmor; for (int pos = 0; pos < 132; pos += pipSpace) { ImageHelperAero.drawAeroArmorPip(g2d, pipPlotter.get(pos)[0], pipPlotter.get(pos)[1]); if (--totalArmor <= 0) { return; } } } private void printLeftArmor(Graphics2D g2d, int totalArmor) { float[] topColumn = new float[] { 280, 165 }; float[] pipShift = new float[] { 7, 7 }; float maxColumns = 8; Vector<float[]> pipPlotter = new Vector<float[]>(200); for (int pos = 1; pos <= 200; pos++) { pipPlotter.add(new float[] { topColumn[0], topColumn[1] }); topColumn[0] += pipShift[0]; if ((pos % maxColumns) == 0) { topColumn[1] += pipShift[1]; pipShift[0] *= -1; topColumn[0] += pipShift[0]; } } int pipSpace = 200 / totalArmor; for (int pos = 0; pos < 200; pos += pipSpace) { ImageHelperAero.drawAeroArmorPip(g2d, pipPlotter.get(pos)[0], pipPlotter.get(pos)[1]); if (--totalArmor <= 0) { return; } } } private void printRightArmor(Graphics2D g2d, int totalArmor) { float[] topColumn = new float[] { 460, 165 }; float[] pipShift = new float[] { 7, 7 }; float maxColumns = 8; Vector<float[]> pipPlotter = new Vector<float[]>(200); for (int pos = 1; pos <= 200; pos++) { pipPlotter.add(new float[] { topColumn[0], topColumn[1] }); topColumn[0] += pipShift[0]; if ((pos % maxColumns) == 0) { topColumn[1] += pipShift[1]; pipShift[0] *= -1; topColumn[0] += pipShift[0]; } } int pipSpace = 200 / totalArmor; for (int pos = 0; pos < 200; pos += pipSpace) { ImageHelperAero.drawAeroArmorPip(g2d, pipPlotter.get(pos)[0], pipPlotter.get(pos)[1]); if (--totalArmor <= 0) { return; } } } private void printStruct(Graphics2D g2d, int totalArmor) { int posY = 369; int posX = 270; int[] topColumn = new int[] { posY, posX }; int[] pipShift = new int[] { 6, 6 }; Vector<int[]> pipPlotter = new Vector<int[]>(132); for (int pos = 1; pos <= 32; pos++) { pipPlotter.add(new int[] { topColumn[0], topColumn[1] }); topColumn[0] += pipShift[0]; if ((pos % 8) == 0) { topColumn[1] += pipShift[1]; pipShift[0] *= -1; topColumn[0] += pipShift[0]; } } int pipSpace = (int) Math.floor(32 / totalArmor); for (int pos = 0; pos < 32; pos += pipSpace) { ImageHelperAero.drawAeroISPip(g2d, pipPlotter.get(pos)[0], pipPlotter.get(pos)[1]); if (--totalArmor <= 0) { return; } } } private void printSmallCraftSpheroidImage(Graphics2D g2d, Image img) { int width = Math.min(220, img.getWidth(null)); int height = Math.min(130, img.getHeight(null)); int drawingX = 18 + ((220 - width) / 2); int drawingY = 370 + ((130 - height) / 2); g2d.drawImage(img, drawingX, drawingY, width, height, Color.BLACK, null); } }