+/*
+ * PrintableComponent.java
+ */
+package net.sf.openrocket.gui.print;
+
+import javax.swing.JPanel;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.print.PageFormat;
+import java.awt.print.Printable;
+import java.awt.print.PrinterException;
+
+/**
+ * Common interface for components we want to print. Used by PageFitPrintStrategy
+ *
+ * @author Jason Blood <dyster2000@gmail.com>
+ */
+public class PrintableComponent extends JPanel implements Printable, Comparable<PrintableComponent> {
+
+ /**
+ * The printing offsets.
+ */
+ private int offsetX = 0;
+ private int offsetY = 0;
+
+ /**
+ * Constructor.
+ */
+ public PrintableComponent() {
+ super(false);
+ }
+
+ /**
+ * From the java.awt.print.Printable interface.
+ * <p/>
+ * Prints the page at the specified index into the specified {@link java.awt.Graphics} context in the specified
+ * format. A <code>PrinterJob</code> calls the <code>Printable</code> interface to request that a page be rendered
+ * into the context specified by <code>graphics</code>. The format of the page to be drawn is specified by
+ * <code>pageFormat</code>. The zero based index of the requested page is specified by <code>pageIndex</code>. If
+ * the requested page does not exist then this method returns NO_SUCH_PAGE; otherwise PAGE_EXISTS is returned. The
+ * <code>Graphics</code> class or subclass implements the {@link java.awt.print.PrinterGraphics} interface to
+ * provide additional information. If the <code>Printable</code> object aborts the print job then it throws a
+ * {@link java.awt.print.PrinterException}.
+ * <p/>
+ * Note: This is not currently used in OpenRocket. It's only here for reference.
+ *
+ * @param graphics the context into which the page is drawn
+ * @param pageFormat the size and orientation of the page being drawn
+ * @param pageIndex the zero based index of the page to be drawn
+ *
+ * @return PAGE_EXISTS if the page is rendered successfully or NO_SUCH_PAGE if <code>pageIndex</code> specifies a
+ * non-existent page.
+ *
+ * @throws java.awt.print.PrinterException
+ * thrown when the print job is terminated.
+ */
+ @Override
+ public int print (final Graphics graphics, final PageFormat pageFormat, final int pageIndex)
+ throws PrinterException {
+
+ Graphics2D g2d = (Graphics2D) graphics;
+ PrintUtilities.translateToJavaOrigin(g2d, pageFormat);
+ PrintUtilities.disableDoubleBuffering(this);
+ paint(g2d);
+ PrintUtilities.enableDoubleBuffering(this);
+ return Printable.PAGE_EXISTS;
+ }
+
+ /**
+ * Set the offset this component will be printed to the page.
+ * @param x X offset to print at.
+ * @param y Y offset to print at.
+ */
+ public void setPrintOffset(int x, int y) {
+ offsetX = x;
+ offsetY = y;
+ }
+
+ /**
+ * Get the X offset this component will be printed to the page.
+ * @return X offset to print at.
+ */
+ public int getOffsetX() {
+ return offsetX;
+ }
+
+ /**
+ * Get the Y offset this component will be printed to the page.
+ * @return Y offset to print at.
+ */
+ public int getOffsetY() {
+ return offsetY;
+ }
+
+
+ /**
+ * Compares this object with the specified object for order. Returns a negative integer, zero, or a positive integer
+ * as this object is less than, equal to, or greater than the specified object.
+ *
+ * Bin packing theory says that trying to fit the biggest items first may have a better outcome. So this is sorted
+ * in size descending order, with width taking precedence over height.
+ *
+ * @param other the object to be compared.
+ *
+ * @return a negative integer, zero, or a positive integer as this object is less than, equal to, or greater than the
+ * specified object.
+ *
+ * @throws NullPointerException if the specified object is null
+ * @throws ClassCastException if the specified object's type prevents it from being compared to this object.
+ */
+ @Override
+ public int compareTo(final PrintableComponent other) {
+ int widthDiff = other.getWidth() - getWidth();
+ if (widthDiff > 0) {
+ return 1;
+ }
+ else if (widthDiff < 0) {
+ return -1;
+ }
+ return other.getHeight() - getHeight();
+ }
+}