Started work on modernizing stuff.
This commit is contained in:
		
							parent
							
								
									deb10b1099
								
							
						
					
					
						commit
						e32976fb8b
					
				
							
								
								
									
										13
									
								
								pom.xml
								
								
								
								
							
							
						
						
									
										13
									
								
								pom.xml
								
								
								
								
							| 
						 | 
					@ -6,11 +6,12 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <groupId>nl.andrewlalis</groupId>
 | 
					    <groupId>nl.andrewlalis</groupId>
 | 
				
			||||||
    <artifactId>BlockBookBinder</artifactId>
 | 
					    <artifactId>BlockBookBinder</artifactId>
 | 
				
			||||||
    <version>1.2.0</version>
 | 
					    <version>1.3.0-SNAPSHOT</version>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <properties>
 | 
					    <properties>
 | 
				
			||||||
        <maven.compiler.source>12</maven.compiler.source>
 | 
					        <maven.compiler.source>17</maven.compiler.source>
 | 
				
			||||||
        <maven.compiler.target>12</maven.compiler.target>
 | 
					        <maven.compiler.target>17</maven.compiler.target>
 | 
				
			||||||
 | 
					        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 | 
				
			||||||
    </properties>
 | 
					    </properties>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <build>
 | 
					    <build>
 | 
				
			||||||
| 
						 | 
					@ -46,7 +47,7 @@
 | 
				
			||||||
        <dependency>
 | 
					        <dependency>
 | 
				
			||||||
            <groupId>org.projectlombok</groupId>
 | 
					            <groupId>org.projectlombok</groupId>
 | 
				
			||||||
            <artifactId>lombok</artifactId>
 | 
					            <artifactId>lombok</artifactId>
 | 
				
			||||||
            <version>1.18.14</version>
 | 
					            <version>1.18.28</version>
 | 
				
			||||||
            <scope>provided</scope>
 | 
					            <scope>provided</scope>
 | 
				
			||||||
        </dependency>
 | 
					        </dependency>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -60,13 +61,13 @@
 | 
				
			||||||
        <dependency>
 | 
					        <dependency>
 | 
				
			||||||
            <groupId>com.formdev</groupId>
 | 
					            <groupId>com.formdev</groupId>
 | 
				
			||||||
            <artifactId>flatlaf</artifactId>
 | 
					            <artifactId>flatlaf</artifactId>
 | 
				
			||||||
            <version>1.0-rc3</version>
 | 
					            <version>3.1.1</version>
 | 
				
			||||||
        </dependency>
 | 
					        </dependency>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        <dependency>
 | 
					        <dependency>
 | 
				
			||||||
            <groupId>org.apache.maven</groupId>
 | 
					            <groupId>org.apache.maven</groupId>
 | 
				
			||||||
            <artifactId>maven-model</artifactId>
 | 
					            <artifactId>maven-model</artifactId>
 | 
				
			||||||
            <version>3.6.3</version>
 | 
					            <version>3.9.3</version>
 | 
				
			||||||
        </dependency>
 | 
					        </dependency>
 | 
				
			||||||
    </dependencies>
 | 
					    </dependencies>
 | 
				
			||||||
</project>
 | 
					</project>
 | 
				
			||||||
| 
						 | 
					@ -14,7 +14,7 @@ public class BlockBookBinder {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	public static void main(String[] args) {
 | 
						public static void main(String[] args) {
 | 
				
			||||||
		SwingUtilities.invokeLater(() -> {
 | 
							SwingUtilities.invokeLater(() -> {
 | 
				
			||||||
			FlatDarkLaf.install();
 | 
								FlatDarkLaf.setup();
 | 
				
			||||||
			var mainFrame = new MainFrame();
 | 
								var mainFrame = new MainFrame();
 | 
				
			||||||
			mainFrame.setupAndShow();
 | 
								mainFrame.setupAndShow();
 | 
				
			||||||
		});
 | 
							});
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,99 @@
 | 
				
			||||||
 | 
					package nl.andrewlalis.blockbookbinder.model.build;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import nl.andrewlalis.blockbookbinder.model.Book;
 | 
				
			||||||
 | 
					import nl.andrewlalis.blockbookbinder.model.BookPage;
 | 
				
			||||||
 | 
					import nl.andrewlalis.blockbookbinder.model.CharWidthMapper;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.ArrayList;
 | 
				
			||||||
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class BookBuilder2 {
 | 
				
			||||||
 | 
					    private final int MAX_LINES_PER_PAGE;
 | 
				
			||||||
 | 
					    private final int MAX_CHARS_PER_PAGE;
 | 
				
			||||||
 | 
					    private final int MAX_LINE_PIXEL_WIDTH;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private List<String> lines;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private StringBuilder lineBuilder;
 | 
				
			||||||
 | 
					    private StringBuilder wordBuilder;
 | 
				
			||||||
 | 
					    private int currentLine;
 | 
				
			||||||
 | 
					    private int currentLinePixelWidth;
 | 
				
			||||||
 | 
					    private int currentWordPixelWidth;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public BookBuilder2(int maxLinesPerPage, int maxCharsPerPage, int maxLinePixelWidth) {
 | 
				
			||||||
 | 
					        this.MAX_LINES_PER_PAGE = maxLinesPerPage;
 | 
				
			||||||
 | 
					        this.MAX_CHARS_PER_PAGE = maxCharsPerPage;
 | 
				
			||||||
 | 
					        this.MAX_LINE_PIXEL_WIDTH = maxLinePixelWidth;
 | 
				
			||||||
 | 
					        this.lines = new ArrayList<>();
 | 
				
			||||||
 | 
					        this.lineBuilder = new StringBuilder(64);
 | 
				
			||||||
 | 
					        this.wordBuilder = new StringBuilder(64);
 | 
				
			||||||
 | 
					        this.currentLine = 0;
 | 
				
			||||||
 | 
					        this.currentLinePixelWidth = 0;
 | 
				
			||||||
 | 
					        this.currentWordPixelWidth = 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public BookBuilder2 addText(String text) {
 | 
				
			||||||
 | 
					        int idx = 0;
 | 
				
			||||||
 | 
					        while (idx < text.length()) {
 | 
				
			||||||
 | 
					            final char c = text.charAt(idx++);
 | 
				
			||||||
 | 
					            if (c == '\n') {
 | 
				
			||||||
 | 
					                appendLine();
 | 
				
			||||||
 | 
					            } else if (c == ' ' && lineBuilder.length() == 0) {
 | 
				
			||||||
 | 
					                continue; // Skip spaces at the start of lines.
 | 
				
			||||||
 | 
					            } else { // Read a continuous word.
 | 
				
			||||||
 | 
					                int charsRead = readWord(text, idx - 1);
 | 
				
			||||||
 | 
					                idx += charsRead - 1;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return this;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public Book build() {
 | 
				
			||||||
 | 
					        Book book = new Book();
 | 
				
			||||||
 | 
					        BookPage page = new BookPage();
 | 
				
			||||||
 | 
					        int currentPageLineCount = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for (String line : lines) {
 | 
				
			||||||
 | 
					            page.addLine(line);
 | 
				
			||||||
 | 
					            currentPageLineCount++;
 | 
				
			||||||
 | 
					            if (currentPageLineCount == MAX_LINES_PER_PAGE) {
 | 
				
			||||||
 | 
					                book.addPage(page);
 | 
				
			||||||
 | 
					                page = new BookPage();
 | 
				
			||||||
 | 
					                currentPageLineCount = 0;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (page.hasContent()) {
 | 
				
			||||||
 | 
					            book.addPage(page);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return book;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private int readWord(String text, int firstCharIdx) {
 | 
				
			||||||
 | 
					        currentWordPixelWidth = 0;
 | 
				
			||||||
 | 
					        wordBuilder.setLength(0);
 | 
				
			||||||
 | 
					        int idx = firstCharIdx;
 | 
				
			||||||
 | 
					        while (idx < text.length()) {
 | 
				
			||||||
 | 
					            char c = text.charAt(idx++);
 | 
				
			||||||
 | 
					            if (!Character.isWhitespace(c)) {
 | 
				
			||||||
 | 
					                currentWordPixelWidth += CharWidthMapper.getInstance().getWidth(c) + 1;
 | 
				
			||||||
 | 
					                wordBuilder.append(c);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                // If we notice that our word will cause the current line to exceed max width, go to a newline.
 | 
				
			||||||
 | 
					                if (currentLinePixelWidth + currentWordPixelWidth > MAX_LINE_PIXEL_WIDTH) {
 | 
				
			||||||
 | 
					                    appendLine();
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        String word = wordBuilder.toString();
 | 
				
			||||||
 | 
					        return word.length();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private void appendLine() {
 | 
				
			||||||
 | 
					        this.lines.add(this.lineBuilder.toString());
 | 
				
			||||||
 | 
					        this.lineBuilder.setLength(0);
 | 
				
			||||||
 | 
					        this.currentLine++;
 | 
				
			||||||
 | 
					        this.currentLinePixelWidth = 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
		Reference in New Issue