From a0c19218831778d3cb2d4a7ac4652b812a8ac0a9 Mon Sep 17 00:00:00 2001 From: Alexander McLean Date: Sat, 19 Apr 2025 09:40:29 -0400 Subject: [PATCH 1/6] got things printing :D --- .../MusicBrainzLabelGenerator.java | 53 ++++++++++++++++++- .../java/com/CDPrintable/ProgramWindow.java | 1 + 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/CDPrintable/MusicBrainzResources/MusicBrainzLabelGenerator.java b/src/main/java/com/CDPrintable/MusicBrainzResources/MusicBrainzLabelGenerator.java index ebb2d17..282a7d4 100644 --- a/src/main/java/com/CDPrintable/MusicBrainzResources/MusicBrainzLabelGenerator.java +++ b/src/main/java/com/CDPrintable/MusicBrainzResources/MusicBrainzLabelGenerator.java @@ -10,11 +10,28 @@ package com.CDPrintable.MusicBrainzResources; +import java.awt.*; +import java.awt.print.*; import java.util.ArrayList; -public class MusicBrainzLabelGenerator { +public class MusicBrainzLabelGenerator implements Printable { private ArrayList finalizedReleaseList; + @Override + public int print(java.awt.Graphics graphics, java.awt.print.PageFormat pageFormat, int pageIndex) { + if (pageIndex > 0) { + return NO_SUCH_PAGE; + } + + Graphics2D g2d = (Graphics2D) graphics; + g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY()); + g2d.setFont(new Font("Arial", Font.PLAIN, 12)); + g2d.setColor(Color.BLACK); + g2d.drawString("CD Labels", 0, 0); + + return PAGE_EXISTS; + } + public MusicBrainzLabelGenerator() { finalizedReleaseList = new ArrayList<>(); } @@ -22,4 +39,38 @@ public MusicBrainzLabelGenerator() { public void addRelease(MusicBrainzFinalizedRelease release) { finalizedReleaseList.add(release); } + + public void printLabel() { + PrinterJob job = PrinterJob.getPrinterJob(); + job.setPrintable(this); + + boolean doPrint = job.printDialog(); + if (doPrint) { + try { + job.print(); + } catch (PrinterException e) { + e.printStackTrace(); + } + } + } + + private double[] getDPI() { + PrinterJob job = PrinterJob.getPrinterJob(); + PageFormat pageFormat = job.defaultPage(); + Paper paper = pageFormat.getPaper(); + + // Get the width and height of the paper in points (1 point = 1/72 inch) + double widthInPoints = paper.getWidth(); + double heightInPoints = paper.getHeight(); + + // Assume standard paper size (e.g., 8.5 x 11 inches for Letter) + double widthInInches = 8.5; + double heightInInches = 11.0; + + // Calculate DPI + double dpiX = widthInPoints / widthInInches; + double dpiY = heightInPoints / heightInInches; + + return new double[]{dpiX, dpiY}; + } } diff --git a/src/main/java/com/CDPrintable/ProgramWindow.java b/src/main/java/com/CDPrintable/ProgramWindow.java index b8dd5cd..a7ad5d0 100644 --- a/src/main/java/com/CDPrintable/ProgramWindow.java +++ b/src/main/java/com/CDPrintable/ProgramWindow.java @@ -458,6 +458,7 @@ private void createTrackDialog(String title, String artist, int trackCount, Stri int result = JOptionPane.showConfirmDialog(null, mainPanel, "Tracks", JOptionPane.YES_NO_OPTION); if (result == JOptionPane.YES_OPTION) { labelGenerator.addRelease(new MusicBrainzFinalizedRelease(title, artist, tracks)); + labelGenerator.printLabel(); } else if (result == JOptionPane.NO_OPTION) { System.out.println("she rejected you..."); } From 9c5ceb54f5c2daad160a22e132cc899a9385752b Mon Sep 17 00:00:00 2001 From: Alexander McLean Date: Sat, 19 Apr 2025 11:54:34 -0400 Subject: [PATCH 2/6] IT WORKS but dosent print --- src/main/java/com/CDPrintable/Main.java | 4 + .../MusicBrainzLabelGenerator.java | 182 ++++++++++++++++-- .../java/com/CDPrintable/ProgramWindow.java | 2 +- 3 files changed, 175 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/CDPrintable/Main.java b/src/main/java/com/CDPrintable/Main.java index fad2b6c..4105ff6 100644 --- a/src/main/java/com/CDPrintable/Main.java +++ b/src/main/java/com/CDPrintable/Main.java @@ -10,8 +10,12 @@ package com.CDPrintable; +import com.CDPrintable.MusicBrainzResources.MusicBrainzLabelGenerator; + public class Main { public static void main(String[] args) { +// MusicBrainzLabelGenerator lg = new MusicBrainzLabelGenerator(); +// lg.displayPageAsImage(); ProgramWindow window = new ProgramWindow(); } } \ No newline at end of file diff --git a/src/main/java/com/CDPrintable/MusicBrainzResources/MusicBrainzLabelGenerator.java b/src/main/java/com/CDPrintable/MusicBrainzResources/MusicBrainzLabelGenerator.java index 282a7d4..1f92a1b 100644 --- a/src/main/java/com/CDPrintable/MusicBrainzResources/MusicBrainzLabelGenerator.java +++ b/src/main/java/com/CDPrintable/MusicBrainzResources/MusicBrainzLabelGenerator.java @@ -10,30 +10,128 @@ package com.CDPrintable.MusicBrainzResources; +import javax.swing.*; import java.awt.*; +import java.awt.image.BufferedImage; import java.awt.print.*; import java.util.ArrayList; public class MusicBrainzLabelGenerator implements Printable { - private ArrayList finalizedReleaseList; + private final ArrayList finalizedReleaseList; + public int LABEL_WIDTH; + public int LABEL_MAX_HEIGHT; + public int dpiX; + public int dpiY; + public int marginTop; + public int marginBottom; + public int marginLeft; + public int marginRight; + private int fontSize = 10; + public double pageWidth = 8.5; + public double pageHeight = 11; + + public int getFontSize() { + return fontSize; + } + + public void setFontSize(int fontSize) { + this.fontSize = fontSize; + } + + public MusicBrainzLabelGenerator() { + double[] dpi = getDPI(); + this.dpiX = (int) dpi[0]; + this.dpiY = (int) dpi[1]; + + this.LABEL_WIDTH = 4 * dpiX; // Example: 1 inch width + this.LABEL_MAX_HEIGHT = 2 * dpiY; // Example: 1 inch height + + finalizedReleaseList = new ArrayList<>(); + System.out.println("DPI: dpiX=" + dpiX + ", dpiY=" + dpiY); + System.out.println("Label dimensions: " + LABEL_WIDTH + "x" + LABEL_MAX_HEIGHT); + + double[] margins = getMargins(); + this.marginTop = (int) margins[0]; + this.marginBottom = (int) margins[1]; + this.marginLeft = (int) margins[2]; + this.marginRight = (int) margins[3]; + System.out.println("Margins: " + margins[0] + "x" + margins[1] + "x" + margins[2] + "x" + margins[3]); + } + + public int getLabelWidth() { + return LABEL_WIDTH; + } + + public void setLabelWidth(int labelWidth) { + LABEL_WIDTH = labelWidth * dpiX; + } + + public int getLabelMaxHeight() { + return LABEL_MAX_HEIGHT; + } + + public void setLabelMaxHeight(int labelMaxHeight) { + LABEL_MAX_HEIGHT = labelMaxHeight * dpiY; + } @Override - public int print(java.awt.Graphics graphics, java.awt.print.PageFormat pageFormat, int pageIndex) { + public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) { if (pageIndex > 0) { return NO_SUCH_PAGE; } Graphics2D g2d = (Graphics2D) graphics; g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY()); - g2d.setFont(new Font("Arial", Font.PLAIN, 12)); g2d.setColor(Color.BLACK); - g2d.drawString("CD Labels", 0, 0); - return PAGE_EXISTS; - } + Font font = new Font("Arial", Font.PLAIN, fontSize); + g2d.setFont(font); + FontMetrics fontMetrics = g2d.getFontMetrics(); - public MusicBrainzLabelGenerator() { - finalizedReleaseList = new ArrayList<>(); + int x = 0; + int y = 0; + int labelStartY; + for (MusicBrainzFinalizedRelease release : finalizedReleaseList) { + labelStartY = y; + // Draw title + String title = release.getTitle(); + g2d.drawString(title, x, y); + y += fontMetrics.getHeight(); + + // Draw artist + String artist = release.getArtist(); + g2d.drawString(artist, x, y); + y += fontMetrics.getHeight(); + + // Draw tracks + StringBuilder sb = new StringBuilder(); + StringBuilder trackLineBuilder = new StringBuilder(); + for (MusicBrainzTrack track : release.getTracks()) { + String trackText = track.getTrackNumber() + ". " + track.getTitle(); + if (fontMetrics.stringWidth(trackLineBuilder.toString()) + fontMetrics.stringWidth(trackText) > LABEL_WIDTH) { + sb.append(trackLineBuilder.toString().trim()).append("\n"); + trackLineBuilder.setLength(0); + } + trackLineBuilder.append(trackText).append(" "); + } + sb.append(trackLineBuilder.toString().trim()); + + String[] lines = sb.toString().split("\n"); +// if (lines.length * fontMetrics.getHeight() > ) + for (String line : lines) { + if (y + fontMetrics.getHeight() > LABEL_MAX_HEIGHT + labelStartY) { + break; // Stop if the text exceeds the label height + } + System.out.println("Drawing line: " + line); + g2d.drawString(line, x, y); + y += fontMetrics.getHeight(); + } + + // Add spacing between releases + y += fontMetrics.getHeight(); + } + + return PAGE_EXISTS; } public void addRelease(MusicBrainzFinalizedRelease release) { @@ -63,9 +161,11 @@ private double[] getDPI() { double widthInPoints = paper.getWidth(); double heightInPoints = paper.getHeight(); - // Assume standard paper size (e.g., 8.5 x 11 inches for Letter) - double widthInInches = 8.5; - double heightInInches = 11.0; + System.out.println("Paper size: " + widthInPoints + "x" + heightInPoints); + + // Dynamically calculate the paper size in inches based on the imageable area + double widthInInches = widthInPoints / 72; + double heightInInches = heightInPoints / 72; // Calculate DPI double dpiX = widthInPoints / widthInInches; @@ -73,4 +173,62 @@ private double[] getDPI() { return new double[]{dpiX, dpiY}; } -} + + private double[] getMargins() { + PrinterJob job = PrinterJob.getPrinterJob(); + PageFormat pageFormat = job.defaultPage(); + Paper paper = pageFormat.getPaper(); + + // Get paper dimensions + double paperWidth = paper.getWidth(); + double paperHeight = paper.getHeight(); + + // Get imageable area dimensions + double imageableX = paper.getImageableX(); + double imageableY = paper.getImageableY(); + double imageableWidth = paper.getImageableWidth(); + double imageableHeight = paper.getImageableHeight(); + + // Calculate margins + double leftMargin = imageableX; + double rightMargin = paperWidth - (imageableX + imageableWidth); + double topMargin = imageableY; + double bottomMargin = paperHeight - (imageableY + imageableHeight); + + return new double[]{leftMargin, rightMargin, topMargin, bottomMargin}; + } + + public void displayPageAsImage() { + try { + // Create a PrinterJob and PageFormat + PrinterJob job = PrinterJob.getPrinterJob(); + PageFormat pageFormat = job.defaultPage(); + + // Define the image dimensions based on the paper size + Paper paper = pageFormat.getPaper(); + int width = (int) paper.getWidth(); + int height = (int) paper.getHeight(); + + // Create a BufferedImage + BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); + Graphics2D g2d = image.createGraphics(); + + // Set up the Graphics2D object + g2d.setColor(Color.WHITE); + g2d.fillRect(0, 0, width, height); + + // Render the page content + this.print(g2d, pageFormat, 0); + g2d.dispose(); + + // Create an ImageIcon from the BufferedImage + ImageIcon pageIcon = new ImageIcon(image); + + // Display the image in a JOptionPane + JOptionPane.showMessageDialog(null, new JLabel(pageIcon), "Page Preview", JOptionPane.PLAIN_MESSAGE); + } catch (Exception e) { + e.printStackTrace(); + JOptionPane.showMessageDialog(null, "An error occurred while generating the page image.", "Error", JOptionPane.ERROR_MESSAGE); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/CDPrintable/ProgramWindow.java b/src/main/java/com/CDPrintable/ProgramWindow.java index a7ad5d0..d6c6db7 100644 --- a/src/main/java/com/CDPrintable/ProgramWindow.java +++ b/src/main/java/com/CDPrintable/ProgramWindow.java @@ -458,7 +458,7 @@ private void createTrackDialog(String title, String artist, int trackCount, Stri int result = JOptionPane.showConfirmDialog(null, mainPanel, "Tracks", JOptionPane.YES_NO_OPTION); if (result == JOptionPane.YES_OPTION) { labelGenerator.addRelease(new MusicBrainzFinalizedRelease(title, artist, tracks)); - labelGenerator.printLabel(); + labelGenerator.displayPageAsImage(); } else if (result == JOptionPane.NO_OPTION) { System.out.println("she rejected you..."); } From 8f29b17bcbf4e8658d87f9d753735122e66915a3 Mon Sep 17 00:00:00 2001 From: Alexander McLean Date: Sat, 19 Apr 2025 14:05:44 -0400 Subject: [PATCH 3/6] IT FREAKING PRINTS!!!!!!!!!!!!!!!! --- .../MusicBrainzLabelGenerator.java | 83 +++++++++++-------- .../java/com/CDPrintable/ProgramWindow.java | 2 +- src/main/resources/version.properties | 2 +- 3 files changed, 49 insertions(+), 38 deletions(-) diff --git a/src/main/java/com/CDPrintable/MusicBrainzResources/MusicBrainzLabelGenerator.java b/src/main/java/com/CDPrintable/MusicBrainzResources/MusicBrainzLabelGenerator.java index 1f92a1b..1d2017d 100644 --- a/src/main/java/com/CDPrintable/MusicBrainzResources/MusicBrainzLabelGenerator.java +++ b/src/main/java/com/CDPrintable/MusicBrainzResources/MusicBrainzLabelGenerator.java @@ -76,64 +76,75 @@ public void setLabelMaxHeight(int labelMaxHeight) { @Override public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) { - if (pageIndex > 0) { - return NO_SUCH_PAGE; - } - Graphics2D g2d = (Graphics2D) graphics; g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY()); g2d.setColor(Color.BLACK); + // Set font and metrics Font font = new Font("Arial", Font.PLAIN, fontSize); g2d.setFont(font); FontMetrics fontMetrics = g2d.getFontMetrics(); - int x = 0; - int y = 0; - int labelStartY; - for (MusicBrainzFinalizedRelease release : finalizedReleaseList) { - labelStartY = y; - // Draw title - String title = release.getTitle(); - g2d.drawString(title, x, y); - y += fontMetrics.getHeight(); + // Determine how many lines a sheet of paper can hold + double paperMaxLines = Math.floor(((pageHeight * 72) - marginTop - marginBottom) / fontSize); + System.out.println("paperMaxLines=" + paperMaxLines); - // Draw artist - String artist = release.getArtist(); - g2d.drawString(artist, x, y); - y += fontMetrics.getHeight(); + // Find label max height in lines + double labelLineMaxHeight = Math.floor((double) LABEL_MAX_HEIGHT / fontSize); + System.out.println("labelLineMaxHeight=" + labelLineMaxHeight); - // Draw tracks - StringBuilder sb = new StringBuilder(); - StringBuilder trackLineBuilder = new StringBuilder(); + // Make an array of the lines for the releases + ArrayList lines = new ArrayList<>(); + for (MusicBrainzFinalizedRelease release : finalizedReleaseList) { + lines.add(release.getTitle()); + lines.add(release.getArtist()); + StringBuilder finalLine = new StringBuilder(); + StringBuilder lineBuilder = new StringBuilder(); for (MusicBrainzTrack track : release.getTracks()) { - String trackText = track.getTrackNumber() + ". " + track.getTitle(); - if (fontMetrics.stringWidth(trackLineBuilder.toString()) + fontMetrics.stringWidth(trackText) > LABEL_WIDTH) { - sb.append(trackLineBuilder.toString().trim()).append("\n"); - trackLineBuilder.setLength(0); + String line = track.getTrackNumber() + ". " + track.getTitle() + " "; + if (fontMetrics.stringWidth(line + lineBuilder) > LABEL_WIDTH) { + lineBuilder.append("\n"); + lines.add(lineBuilder.toString()); + lineBuilder.delete(0, lineBuilder.length()); } - trackLineBuilder.append(trackText).append(" "); + lineBuilder.append(line); } - sb.append(trackLineBuilder.toString().trim()); + lines.add(lineBuilder.toString()); + lines.add(""); + System.out.println(lines.toString()); + } - String[] lines = sb.toString().split("\n"); -// if (lines.length * fontMetrics.getHeight() > ) - for (String line : lines) { - if (y + fontMetrics.getHeight() > LABEL_MAX_HEIGHT + labelStartY) { - break; // Stop if the text exceeds the label height - } - System.out.println("Drawing line: " + line); - g2d.drawString(line, x, y); - y += fontMetrics.getHeight(); + // Get empty lines to find where releases start/end + ArrayList emptyLines = new ArrayList<>(); + for (int i = 0; i < lines.size(); i++) { + if (lines.get(i).isEmpty()) { + emptyLines.add(i); } + } + + System.out.println("emptyLines=" + emptyLines); + + int startLine = (int) (pageIndex * paperMaxLines); + double endLine = Math.min(startLine + paperMaxLines, lines.size()); - // Add spacing between releases + if (startLine > lines.size()) { + return NO_SUCH_PAGE; + } + + int y = 0; + + // Draw. Every. Dang. Line + // ALERT! The code below stops you from pulling girls. Wait, that's the whole codebase! + for (int i = startLine; i < endLine; i++) { + String line = lines.get(i); + g2d.drawString(line, 0, y + fontMetrics.getAscent()); y += fontMetrics.getHeight(); } return PAGE_EXISTS; } + public void addRelease(MusicBrainzFinalizedRelease release) { finalizedReleaseList.add(release); } diff --git a/src/main/java/com/CDPrintable/ProgramWindow.java b/src/main/java/com/CDPrintable/ProgramWindow.java index d6c6db7..a7ad5d0 100644 --- a/src/main/java/com/CDPrintable/ProgramWindow.java +++ b/src/main/java/com/CDPrintable/ProgramWindow.java @@ -458,7 +458,7 @@ private void createTrackDialog(String title, String artist, int trackCount, Stri int result = JOptionPane.showConfirmDialog(null, mainPanel, "Tracks", JOptionPane.YES_NO_OPTION); if (result == JOptionPane.YES_OPTION) { labelGenerator.addRelease(new MusicBrainzFinalizedRelease(title, artist, tracks)); - labelGenerator.displayPageAsImage(); + labelGenerator.printLabel(); } else if (result == JOptionPane.NO_OPTION) { System.out.println("she rejected you..."); } diff --git a/src/main/resources/version.properties b/src/main/resources/version.properties index 95acfff..bf5c94b 100644 --- a/src/main/resources/version.properties +++ b/src/main/resources/version.properties @@ -1,4 +1,4 @@ # Application version. # MAJOR MINOR PATCH -version=1.10.10 \ No newline at end of file +version=2.0.0 \ No newline at end of file From d7d59a02cadf2eff3e32c937759f7906e46d2f9d Mon Sep 17 00:00:00 2001 From: Alexander McLean Date: Sat, 19 Apr 2025 14:58:24 -0400 Subject: [PATCH 4/6] seems to be perfect --- .../MusicBrainzLabelGenerator.java | 130 ++++++++++-------- .../java/com/CDPrintable/ProgramWindow.java | 2 +- 2 files changed, 74 insertions(+), 58 deletions(-) diff --git a/src/main/java/com/CDPrintable/MusicBrainzResources/MusicBrainzLabelGenerator.java b/src/main/java/com/CDPrintable/MusicBrainzResources/MusicBrainzLabelGenerator.java index 1d2017d..3c53dcc 100644 --- a/src/main/java/com/CDPrintable/MusicBrainzResources/MusicBrainzLabelGenerator.java +++ b/src/main/java/com/CDPrintable/MusicBrainzResources/MusicBrainzLabelGenerator.java @@ -80,65 +80,69 @@ public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) { g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY()); g2d.setColor(Color.BLACK); - // Set font and metrics Font font = new Font("Arial", Font.PLAIN, fontSize); g2d.setFont(font); FontMetrics fontMetrics = g2d.getFontMetrics(); - // Determine how many lines a sheet of paper can hold - double paperMaxLines = Math.floor(((pageHeight * 72) - marginTop - marginBottom) / fontSize); - System.out.println("paperMaxLines=" + paperMaxLines); + double lineHeight = fontMetrics.getHeight(); + double maxLinesPerPage = Math.floor(((pageHeight * 72) - marginTop - marginBottom) / lineHeight); - // Find label max height in lines - double labelLineMaxHeight = Math.floor((double) LABEL_MAX_HEIGHT / fontSize); - System.out.println("labelLineMaxHeight=" + labelLineMaxHeight); + ArrayList> releasesAsLines = new ArrayList<>(); + ArrayList currentReleaseLines = new ArrayList<>(); - // Make an array of the lines for the releases - ArrayList lines = new ArrayList<>(); for (MusicBrainzFinalizedRelease release : finalizedReleaseList) { - lines.add(release.getTitle()); - lines.add(release.getArtist()); - StringBuilder finalLine = new StringBuilder(); + ArrayList releaseLines = new ArrayList<>(); + releaseLines.add(release.getTitle()); + releaseLines.add(release.getArtist()); + StringBuilder lineBuilder = new StringBuilder(); for (MusicBrainzTrack track : release.getTracks()) { String line = track.getTrackNumber() + ". " + track.getTitle() + " "; - if (fontMetrics.stringWidth(line + lineBuilder) > LABEL_WIDTH) { - lineBuilder.append("\n"); - lines.add(lineBuilder.toString()); - lineBuilder.delete(0, lineBuilder.length()); + if (fontMetrics.stringWidth(lineBuilder + line) > LABEL_WIDTH) { + releaseLines.add(lineBuilder.toString()); + lineBuilder = new StringBuilder(); } lineBuilder.append(line); } - lines.add(lineBuilder.toString()); - lines.add(""); - System.out.println(lines.toString()); + if (!lineBuilder.isEmpty()) { + releaseLines.add(lineBuilder.toString()); + } + + releaseLines.add(""); // spacer line + releasesAsLines.add(releaseLines); } - // Get empty lines to find where releases start/end - ArrayList emptyLines = new ArrayList<>(); - for (int i = 0; i < lines.size(); i++) { - if (lines.get(i).isEmpty()) { - emptyLines.add(i); + // Group releases into pages + ArrayList>> pages = new ArrayList<>(); + ArrayList> currentPage = new ArrayList<>(); + int currentLineCount = 0; + + for (ArrayList releaseLines : releasesAsLines) { + if (currentLineCount + releaseLines.size() > maxLinesPerPage && !currentPage.isEmpty()) { + pages.add(currentPage); + currentPage = new ArrayList<>(); + currentLineCount = 0; } + currentPage.add(releaseLines); + currentLineCount += releaseLines.size(); } - System.out.println("emptyLines=" + emptyLines); - - int startLine = (int) (pageIndex * paperMaxLines); - double endLine = Math.min(startLine + paperMaxLines, lines.size()); + if (!currentPage.isEmpty()) { + pages.add(currentPage); + } - if (startLine > lines.size()) { + // Handle page out of bounds + if (pageIndex >= pages.size()) { return NO_SUCH_PAGE; } + // Draw the releases for this page int y = 0; - - // Draw. Every. Dang. Line - // ALERT! The code below stops you from pulling girls. Wait, that's the whole codebase! - for (int i = startLine; i < endLine; i++) { - String line = lines.get(i); - g2d.drawString(line, 0, y + fontMetrics.getAscent()); - y += fontMetrics.getHeight(); + for (ArrayList releaseLines : pages.get(pageIndex)) { + for (String line : releaseLines) { + g2d.drawString(line, 0, y + fontMetrics.getAscent()); + y += fontMetrics.getHeight(); + } } return PAGE_EXISTS; @@ -201,45 +205,57 @@ private double[] getMargins() { double imageableHeight = paper.getImageableHeight(); // Calculate margins - double leftMargin = imageableX; double rightMargin = paperWidth - (imageableX + imageableWidth); - double topMargin = imageableY; double bottomMargin = paperHeight - (imageableY + imageableHeight); - return new double[]{leftMargin, rightMargin, topMargin, bottomMargin}; + return new double[]{imageableX, rightMargin, imageableY, bottomMargin}; } - public void displayPageAsImage() { + public void displayPagesAsImages() { try { - // Create a PrinterJob and PageFormat + // Create PrinterJob and PageFormat PrinterJob job = PrinterJob.getPrinterJob(); PageFormat pageFormat = job.defaultPage(); - - // Define the image dimensions based on the paper size Paper paper = pageFormat.getPaper(); + + // Define image dimensions based on paper size int width = (int) paper.getWidth(); int height = (int) paper.getHeight(); - // Create a BufferedImage - BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); - Graphics2D g2d = image.createGraphics(); + // Go through each page index until NO_SUCH_PAGE is returned + int pageIndex = 0; + while (true) { + // Create BufferedImage and draw page content + BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); + Graphics2D g2d = image.createGraphics(); - // Set up the Graphics2D object - g2d.setColor(Color.WHITE); - g2d.fillRect(0, 0, width, height); + // White background + g2d.setColor(Color.WHITE); + g2d.fillRect(0, 0, width, height); - // Render the page content - this.print(g2d, pageFormat, 0); - g2d.dispose(); + int result = this.print(g2d, pageFormat, pageIndex); + g2d.dispose(); - // Create an ImageIcon from the BufferedImage - ImageIcon pageIcon = new ImageIcon(image); + // If there's no such page, break out of the loop + if (result != Printable.PAGE_EXISTS) { + break; + } - // Display the image in a JOptionPane - JOptionPane.showMessageDialog(null, new JLabel(pageIcon), "Page Preview", JOptionPane.PLAIN_MESSAGE); + // Show the image in a JOptionPane + ImageIcon icon = new ImageIcon(image); + JOptionPane.showMessageDialog( + null, + new JLabel(icon), + "Page Preview - Page " + (pageIndex + 1), + JOptionPane.PLAIN_MESSAGE + ); + + pageIndex++; + } } catch (Exception e) { e.printStackTrace(); - JOptionPane.showMessageDialog(null, "An error occurred while generating the page image.", "Error", JOptionPane.ERROR_MESSAGE); + JOptionPane.showMessageDialog(null, "An error occurred while generating page images.", "Error", JOptionPane.ERROR_MESSAGE); } } + } \ No newline at end of file diff --git a/src/main/java/com/CDPrintable/ProgramWindow.java b/src/main/java/com/CDPrintable/ProgramWindow.java index a7ad5d0..6b31688 100644 --- a/src/main/java/com/CDPrintable/ProgramWindow.java +++ b/src/main/java/com/CDPrintable/ProgramWindow.java @@ -458,7 +458,7 @@ private void createTrackDialog(String title, String artist, int trackCount, Stri int result = JOptionPane.showConfirmDialog(null, mainPanel, "Tracks", JOptionPane.YES_NO_OPTION); if (result == JOptionPane.YES_OPTION) { labelGenerator.addRelease(new MusicBrainzFinalizedRelease(title, artist, tracks)); - labelGenerator.printLabel(); + labelGenerator.displayPagesAsImages(); } else if (result == JOptionPane.NO_OPTION) { System.out.println("she rejected you..."); } From ed0f63c7466469132e69cc7c18f15f1e711e300b Mon Sep 17 00:00:00 2001 From: Alexander McLean Date: Sat, 19 Apr 2025 15:06:42 -0400 Subject: [PATCH 5/6] made max label height be respected --- .../MusicBrainzResources/MusicBrainzLabelGenerator.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/CDPrintable/MusicBrainzResources/MusicBrainzLabelGenerator.java b/src/main/java/com/CDPrintable/MusicBrainzResources/MusicBrainzLabelGenerator.java index 3c53dcc..d35fd0c 100644 --- a/src/main/java/com/CDPrintable/MusicBrainzResources/MusicBrainzLabelGenerator.java +++ b/src/main/java/com/CDPrintable/MusicBrainzResources/MusicBrainzLabelGenerator.java @@ -88,7 +88,6 @@ public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) { double maxLinesPerPage = Math.floor(((pageHeight * 72) - marginTop - marginBottom) / lineHeight); ArrayList> releasesAsLines = new ArrayList<>(); - ArrayList currentReleaseLines = new ArrayList<>(); for (MusicBrainzFinalizedRelease release : finalizedReleaseList) { ArrayList releaseLines = new ArrayList<>(); @@ -98,10 +97,12 @@ public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) { StringBuilder lineBuilder = new StringBuilder(); for (MusicBrainzTrack track : release.getTracks()) { String line = track.getTrackNumber() + ". " + track.getTitle() + " "; + // Split stuff up IF the line gets too long if (fontMetrics.stringWidth(lineBuilder + line) > LABEL_WIDTH) { releaseLines.add(lineBuilder.toString()); - lineBuilder = new StringBuilder(); + lineBuilder.delete(0, lineBuilder.length()); } + if (releaseLines.size() * fontMetrics.getHeight() >= LABEL_MAX_HEIGHT) {break;} lineBuilder.append(line); } if (!lineBuilder.isEmpty()) { From aa8ecca556256a2fade2f70991efc6c49fb92a14 Mon Sep 17 00:00:00 2001 From: Alexander McLean Date: Sat, 19 Apr 2025 15:23:26 -0400 Subject: [PATCH 6/6] finally done --- src/main/java/com/CDPrintable/ProgramWindow.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/CDPrintable/ProgramWindow.java b/src/main/java/com/CDPrintable/ProgramWindow.java index 6b31688..b8dd5cd 100644 --- a/src/main/java/com/CDPrintable/ProgramWindow.java +++ b/src/main/java/com/CDPrintable/ProgramWindow.java @@ -458,7 +458,6 @@ private void createTrackDialog(String title, String artist, int trackCount, Stri int result = JOptionPane.showConfirmDialog(null, mainPanel, "Tracks", JOptionPane.YES_NO_OPTION); if (result == JOptionPane.YES_OPTION) { labelGenerator.addRelease(new MusicBrainzFinalizedRelease(title, artist, tracks)); - labelGenerator.displayPagesAsImages(); } else if (result == JOptionPane.NO_OPTION) { System.out.println("she rejected you..."); }