Lots of cleanup.
This commit is contained in:
		
							parent
							
								
									5c6587386e
								
							
						
					
					
						commit
						ec06cf56cf
					
				
							
								
								
									
										6
									
								
								pom.xml
								
								
								
								
							
							
						
						
									
										6
									
								
								pom.xml
								
								
								
								
							| 
						 | 
				
			
			@ -56,5 +56,11 @@
 | 
			
		|||
            <artifactId>jnativehook</artifactId>
 | 
			
		||||
            <version>2.1.0</version>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>com.formdev</groupId>
 | 
			
		||||
            <artifactId>flatlaf</artifactId>
 | 
			
		||||
            <version>1.0-rc3</version>
 | 
			
		||||
        </dependency>
 | 
			
		||||
    </dependencies>
 | 
			
		||||
</project>
 | 
			
		||||
| 
						 | 
				
			
			@ -1,5 +1,6 @@
 | 
			
		|||
package nl.andrewlalis.blockbookbinder;
 | 
			
		||||
 | 
			
		||||
import com.formdev.flatlaf.FlatDarkLaf;
 | 
			
		||||
import nl.andrewlalis.blockbookbinder.view.MainFrame;
 | 
			
		||||
 | 
			
		||||
import javax.swing.*;
 | 
			
		||||
| 
						 | 
				
			
			@ -10,6 +11,7 @@ import javax.swing.*;
 | 
			
		|||
public class BlockBookBinder {
 | 
			
		||||
	public static void main(String[] args) {
 | 
			
		||||
		SwingUtilities.invokeLater(() -> {
 | 
			
		||||
			FlatDarkLaf.install();
 | 
			
		||||
			var mainFrame = new MainFrame();
 | 
			
		||||
			mainFrame.setupAndShow();
 | 
			
		||||
		});
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,7 +1,7 @@
 | 
			
		|||
package nl.andrewlalis.blockbookbinder.control;
 | 
			
		||||
 | 
			
		||||
import nl.andrewlalis.blockbookbinder.model.build.BookBuilder;
 | 
			
		||||
import nl.andrewlalis.blockbookbinder.view.BookPreviewPanel;
 | 
			
		||||
import nl.andrewlalis.blockbookbinder.view.book.BookPreviewPanel;
 | 
			
		||||
import nl.andrewlalis.blockbookbinder.view.SourceTextPanel;
 | 
			
		||||
 | 
			
		||||
import java.awt.event.ActionEvent;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -39,7 +39,7 @@ public class BookExporter implements Runnable {
 | 
			
		|||
	@Setter
 | 
			
		||||
	private volatile boolean nextPageRequested;
 | 
			
		||||
 | 
			
		||||
	private final PagePasteListener pagePasteListener;
 | 
			
		||||
	private final ExporterKeyListener exporterKeyListener;
 | 
			
		||||
	private final Clipboard clipboard;
 | 
			
		||||
	private Robot robot;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -61,7 +61,7 @@ public class BookExporter implements Runnable {
 | 
			
		|||
		this.beginningExportClip = this.loadAudioClip(ApplicationProperties.getProp("export_dialog.beginning_export"));
 | 
			
		||||
		this.finishClip = this.loadAudioClip(ApplicationProperties.getProp("export_dialog.finish_sound"));
 | 
			
		||||
		this.clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
 | 
			
		||||
		this.pagePasteListener = new PagePasteListener(this);
 | 
			
		||||
		this.exporterKeyListener = new ExporterKeyListener(this);
 | 
			
		||||
		if (this.autoPaste) { // Only initialize the robot if we'll need it.
 | 
			
		||||
			try {
 | 
			
		||||
				this.robot = new Robot();
 | 
			
		||||
| 
						 | 
				
			
			@ -193,7 +193,7 @@ public class BookExporter implements Runnable {
 | 
			
		|||
			logger.setLevel(Level.WARNING);
 | 
			
		||||
			logger.setUseParentHandlers(false);
 | 
			
		||||
			GlobalScreen.registerNativeHook();
 | 
			
		||||
			GlobalScreen.addNativeKeyListener(this.pagePasteListener);
 | 
			
		||||
			GlobalScreen.addNativeKeyListener(this.exporterKeyListener);
 | 
			
		||||
		} catch (NativeHookException nativeHookException) {
 | 
			
		||||
			System.err.println("Could not register native hook.");
 | 
			
		||||
			nativeHookException.printStackTrace();
 | 
			
		||||
| 
						 | 
				
			
			@ -202,7 +202,7 @@ public class BookExporter implements Runnable {
 | 
			
		|||
 | 
			
		||||
	private void stopNativeListener() {
 | 
			
		||||
		try {
 | 
			
		||||
			GlobalScreen.removeNativeKeyListener(this.pagePasteListener);
 | 
			
		||||
			GlobalScreen.removeNativeKeyListener(this.exporterKeyListener);
 | 
			
		||||
			GlobalScreen.unregisterNativeHook();
 | 
			
		||||
		} catch (NativeHookException nativeHookException) {
 | 
			
		||||
			System.err.println("Could not unregister a native hook.");
 | 
			
		||||
| 
						 | 
				
			
			@ -243,9 +243,7 @@ public class BookExporter implements Runnable {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	private void updateStatusLabel(String text) {
 | 
			
		||||
		SwingUtilities.invokeLater(() -> {
 | 
			
		||||
			this.statusPanel.getStatusLabel().setText(text);
 | 
			
		||||
		});
 | 
			
		||||
		SwingUtilities.invokeLater(() -> this.statusPanel.getStatusLabel().setText(text));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private void updateStatusProgressBar(int nextPage) {
 | 
			
		||||
| 
						 | 
				
			
			@ -257,8 +255,6 @@ public class BookExporter implements Runnable {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	private void addStatusMessage(String message) {
 | 
			
		||||
		SwingUtilities.invokeLater(() -> {
 | 
			
		||||
			this.statusPanel.getOutputTextArea().append(message + "\n");
 | 
			
		||||
		});
 | 
			
		||||
		SwingUtilities.invokeLater(() -> this.statusPanel.getOutputTextArea().append(message + "\n"));
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,10 +3,14 @@ package nl.andrewlalis.blockbookbinder.control.export;
 | 
			
		|||
import org.jnativehook.keyboard.NativeKeyEvent;
 | 
			
		||||
import org.jnativehook.keyboard.NativeKeyListener;
 | 
			
		||||
 | 
			
		||||
public class PagePasteListener implements NativeKeyListener {
 | 
			
		||||
	private BookExporter exporterRunnable;
 | 
			
		||||
/**
 | 
			
		||||
 * Native key listener that's used during the export process, to detect when the
 | 
			
		||||
 * user performs certain key actions outside of the focus of this program.
 | 
			
		||||
 */
 | 
			
		||||
public class ExporterKeyListener implements NativeKeyListener {
 | 
			
		||||
	private final BookExporter exporterRunnable;
 | 
			
		||||
 | 
			
		||||
	public PagePasteListener(BookExporter exporterRunnable) {
 | 
			
		||||
	public ExporterKeyListener(BookExporter exporterRunnable) {
 | 
			
		||||
		this.exporterRunnable = exporterRunnable;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1,6 +1,7 @@
 | 
			
		|||
package nl.andrewlalis.blockbookbinder.model;
 | 
			
		||||
 | 
			
		||||
import lombok.Getter;
 | 
			
		||||
import nl.andrewlalis.blockbookbinder.util.ApplicationProperties;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
| 
						 | 
				
			
			@ -35,6 +36,20 @@ public class Book {
 | 
			
		|||
		return book;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public List<Book> splitByPageLimit() {
 | 
			
		||||
		final int pagesPerBook = ApplicationProperties.getIntProp("book.max_pages");
 | 
			
		||||
		List<Book> books = new ArrayList<>((this.getPageCount() / pagesPerBook) + 1);
 | 
			
		||||
		Book currentBook = new Book();
 | 
			
		||||
		for (BookPage page : this.getPages()) {
 | 
			
		||||
			currentBook.addPage(page.copy());
 | 
			
		||||
			if (currentBook.getPageCount() == pagesPerBook) {
 | 
			
		||||
				books.add(currentBook);
 | 
			
		||||
				currentBook = new Book();
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return books;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public String toString() {
 | 
			
		||||
		StringBuilder sb = new StringBuilder("Book of " + this.getPageCount() + " pages:\n");
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,7 +13,7 @@ public class BookPage {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	public boolean addLine(String line) {
 | 
			
		||||
		if (this.lines.size() == ApplicationProperties.getIntProp("book.page_max_lines")) {
 | 
			
		||||
		if (this.lines.size() >= ApplicationProperties.getIntProp("book.page_max_lines")) {
 | 
			
		||||
			return false;
 | 
			
		||||
		}
 | 
			
		||||
		this.lines.add(line);
 | 
			
		||||
| 
						 | 
				
			
			@ -24,8 +24,24 @@ public class BookPage {
 | 
			
		|||
		return !this.lines.isEmpty();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public BookPage copy() {
 | 
			
		||||
		BookPage c = new BookPage();
 | 
			
		||||
		for (String line : this.lines) {
 | 
			
		||||
			c.addLine(line);
 | 
			
		||||
		}
 | 
			
		||||
		return c;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public String toString() {
 | 
			
		||||
		return String.join("\n", this.lines);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static BookPage fromString(String s) {
 | 
			
		||||
		BookPage p = new BookPage();
 | 
			
		||||
		for (String line : s.split("\n")) {
 | 
			
		||||
			p.addLine(line);
 | 
			
		||||
		}
 | 
			
		||||
		return p;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,11 +1,15 @@
 | 
			
		|||
package nl.andrewlalis.blockbookbinder.model;
 | 
			
		||||
 | 
			
		||||
import lombok.Getter;
 | 
			
		||||
import nl.andrewlalis.blockbookbinder.util.ApplicationProperties;
 | 
			
		||||
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
public class CharWidthMapper {
 | 
			
		||||
	@Getter
 | 
			
		||||
	private static final CharWidthMapper instance = new CharWidthMapper();
 | 
			
		||||
 | 
			
		||||
	private final Map<Character, Integer> charWidthMap;
 | 
			
		||||
 | 
			
		||||
	public CharWidthMapper() {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,8 +9,6 @@ import java.util.ArrayList;
 | 
			
		|||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
public class BookBuilder {
 | 
			
		||||
	private final CharWidthMapper charWidthMapper = new CharWidthMapper();
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Builds a full book of pages from the given source text.
 | 
			
		||||
	 * @param source The source text to convert.
 | 
			
		||||
| 
						 | 
				
			
			@ -60,7 +58,7 @@ public class BookBuilder {
 | 
			
		|||
			sourceIndex++;
 | 
			
		||||
			symbolBuilder.setLength(0);
 | 
			
		||||
			symbolBuilder.append(c);
 | 
			
		||||
			int symbolWidth = this.charWidthMapper.getWidth(c);
 | 
			
		||||
			int symbolWidth = CharWidthMapper.getInstance().getWidth(c);
 | 
			
		||||
 | 
			
		||||
			// Since there's a 1-pixel gap between characters, add it to the width if this isn't the first char.
 | 
			
		||||
			if (lineBuilder.length() > 0) {
 | 
			
		||||
| 
						 | 
				
			
			@ -88,7 +86,7 @@ public class BookBuilder {
 | 
			
		|||
				) {
 | 
			
		||||
					char nextChar = sourceChars[sourceIndex];
 | 
			
		||||
					symbolBuilder.append(nextChar);
 | 
			
		||||
					symbolWidth += 1 + this.charWidthMapper.getWidth(nextChar);
 | 
			
		||||
					symbolWidth += 1 + CharWidthMapper.getInstance().getWidth(nextChar);
 | 
			
		||||
					sourceIndex++;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,6 +3,7 @@ package nl.andrewlalis.blockbookbinder.view;
 | 
			
		|||
import nl.andrewlalis.blockbookbinder.model.Book;
 | 
			
		||||
import nl.andrewlalis.blockbookbinder.util.ApplicationProperties;
 | 
			
		||||
import nl.andrewlalis.blockbookbinder.view.about.AboutDialog;
 | 
			
		||||
import nl.andrewlalis.blockbookbinder.view.book.BookPreviewPanel;
 | 
			
		||||
import nl.andrewlalis.blockbookbinder.view.export.ExportToBookDialog;
 | 
			
		||||
 | 
			
		||||
import javax.swing.*;
 | 
			
		||||
| 
						 | 
				
			
			@ -13,11 +14,11 @@ import java.net.URL;
 | 
			
		|||
 * The main window of the application.
 | 
			
		||||
 */
 | 
			
		||||
public class MainFrame extends JFrame {
 | 
			
		||||
 | 
			
		||||
	public void setupAndShow() {
 | 
			
		||||
		final int width = Integer.parseInt(ApplicationProperties.getProp("frame.default_width"));
 | 
			
		||||
		final int height = Integer.parseInt(ApplicationProperties.getProp("frame.default_height"));
 | 
			
		||||
		this.setPreferredSize(new Dimension(width, height));
 | 
			
		||||
		this.setPreferredSize(new Dimension(
 | 
			
		||||
				ApplicationProperties.getIntProp("frame.default_width"),
 | 
			
		||||
				ApplicationProperties.getIntProp("frame.default_height")
 | 
			
		||||
		));
 | 
			
		||||
		this.setTitle(ApplicationProperties.getProp("frame.title"));
 | 
			
		||||
		this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
 | 
			
		||||
		final URL iconUrl = this.getClass().getClassLoader().getResource("images/book_and_quill.png");
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,6 +2,7 @@ package nl.andrewlalis.blockbookbinder.view;
 | 
			
		|||
 | 
			
		||||
import nl.andrewlalis.blockbookbinder.control.CleanSourceActionListener;
 | 
			
		||||
import nl.andrewlalis.blockbookbinder.control.ConvertToBookActionListener;
 | 
			
		||||
import nl.andrewlalis.blockbookbinder.view.book.BookPreviewPanel;
 | 
			
		||||
 | 
			
		||||
import javax.swing.*;
 | 
			
		||||
import javax.swing.border.EmptyBorder;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,7 +9,6 @@ import java.io.BufferedReader;
 | 
			
		|||
import java.io.IOException;
 | 
			
		||||
import java.io.InputStream;
 | 
			
		||||
import java.io.InputStreamReader;
 | 
			
		||||
import java.net.URI;
 | 
			
		||||
import java.net.URISyntaxException;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -31,6 +30,7 @@ public class AboutDialog extends JDialog {
 | 
			
		|||
		textPane.setEditable(false);
 | 
			
		||||
		textPane.setContentType("text/html");
 | 
			
		||||
		textPane.setText(this.getAboutHtml());
 | 
			
		||||
		textPane.setCaretPosition(0);
 | 
			
		||||
		textPane.addHyperlinkListener(e -> {
 | 
			
		||||
			try {
 | 
			
		||||
				if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,23 @@
 | 
			
		|||
package nl.andrewlalis.blockbookbinder.view.book;
 | 
			
		||||
 | 
			
		||||
import javax.swing.text.AttributeSet;
 | 
			
		||||
import javax.swing.text.BadLocationException;
 | 
			
		||||
import javax.swing.text.DocumentFilter;
 | 
			
		||||
 | 
			
		||||
public class BookPageDocumentFilter extends DocumentFilter {
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public void remove(FilterBypass fb, int offset, int length) throws BadLocationException {
 | 
			
		||||
		super.remove(fb, offset, length);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public void insertString(FilterBypass fb, int offset, String string, AttributeSet attr) throws BadLocationException {
 | 
			
		||||
		super.insertString(fb, offset, string, attr);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
 | 
			
		||||
		super.replace(fb, offset, length, text, attrs);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,4 +1,4 @@
 | 
			
		|||
package nl.andrewlalis.blockbookbinder.view;
 | 
			
		||||
package nl.andrewlalis.blockbookbinder.view.book;
 | 
			
		||||
 | 
			
		||||
import lombok.Getter;
 | 
			
		||||
import nl.andrewlalis.blockbookbinder.model.Book;
 | 
			
		||||
		Loading…
	
		Reference in New Issue