Added more to the bookbuilder, not done yet though.
This commit is contained in:
		
							parent
							
								
									cb6841cdac
								
							
						
					
					
						commit
						c9e7211323
					
				
							
								
								
									
										7
									
								
								pom.xml
								
								
								
								
							
							
						
						
									
										7
									
								
								pom.xml
								
								
								
								
							| 
						 | 
				
			
			@ -21,5 +21,12 @@
 | 
			
		|||
            <version>1.18.14</version>
 | 
			
		||||
            <scope>provided</scope>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <!-- https://mvnrepository.com/artifact/com.1stleg/jnativehook -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>com.1stleg</groupId>
 | 
			
		||||
            <artifactId>jnativehook</artifactId>
 | 
			
		||||
            <version>2.1.0</version>
 | 
			
		||||
        </dependency>
 | 
			
		||||
    </dependencies>
 | 
			
		||||
</project>
 | 
			
		||||
| 
						 | 
				
			
			@ -1,8 +1,11 @@
 | 
			
		|||
package nl.andrewlalis.blockbookbinder;
 | 
			
		||||
 | 
			
		||||
import nl.andrewlalis.blockbookbinder.view.MainFrame;
 | 
			
		||||
import org.jnativehook.GlobalScreen;
 | 
			
		||||
 | 
			
		||||
import javax.swing.*;
 | 
			
		||||
import java.util.logging.Level;
 | 
			
		||||
import java.util.logging.Logger;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The main class for the application.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,41 @@
 | 
			
		|||
package nl.andrewlalis.blockbookbinder.control;
 | 
			
		||||
 | 
			
		||||
import nl.andrewlalis.blockbookbinder.model.Book;
 | 
			
		||||
import nl.andrewlalis.blockbookbinder.view.BookPreviewPanel;
 | 
			
		||||
import org.jnativehook.GlobalScreen;
 | 
			
		||||
import org.jnativehook.NativeHookException;
 | 
			
		||||
 | 
			
		||||
import java.awt.*;
 | 
			
		||||
import java.awt.datatransfer.Clipboard;
 | 
			
		||||
import java.awt.event.ActionEvent;
 | 
			
		||||
import java.awt.event.ActionListener;
 | 
			
		||||
import java.util.logging.Level;
 | 
			
		||||
import java.util.logging.Logger;
 | 
			
		||||
 | 
			
		||||
public class BookExportActionListener implements ActionListener {
 | 
			
		||||
	private final BookPreviewPanel bookPreviewPanel;
 | 
			
		||||
	private final Clipboard clipboard;
 | 
			
		||||
 | 
			
		||||
	public BookExportActionListener(BookPreviewPanel bookPreviewPanel) {
 | 
			
		||||
		this.bookPreviewPanel = bookPreviewPanel;
 | 
			
		||||
		this.clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public void actionPerformed(ActionEvent e) {
 | 
			
		||||
		System.out.println("Starting export.");
 | 
			
		||||
		final Book book = this.bookPreviewPanel.getBook();
 | 
			
		||||
		BookPagePasteListener pasteListener = new BookPagePasteListener(book, clipboard);
 | 
			
		||||
		try {
 | 
			
		||||
			// For catching native events, set logging here.
 | 
			
		||||
			Logger logger = Logger.getLogger(GlobalScreen.class.getPackage().getName());
 | 
			
		||||
			logger.setLevel(Level.WARNING);
 | 
			
		||||
			logger.setUseParentHandlers(false);
 | 
			
		||||
			GlobalScreen.registerNativeHook();
 | 
			
		||||
			GlobalScreen.addNativeKeyListener(pasteListener);
 | 
			
		||||
		} catch (NativeHookException nativeHookException) {
 | 
			
		||||
			System.err.println("Could not register native hook.");
 | 
			
		||||
			nativeHookException.printStackTrace();
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,51 @@
 | 
			
		|||
package nl.andrewlalis.blockbookbinder.control;
 | 
			
		||||
 | 
			
		||||
import nl.andrewlalis.blockbookbinder.model.Book;
 | 
			
		||||
import org.jnativehook.GlobalScreen;
 | 
			
		||||
import org.jnativehook.NativeHookException;
 | 
			
		||||
import org.jnativehook.keyboard.NativeKeyEvent;
 | 
			
		||||
import org.jnativehook.keyboard.NativeKeyListener;
 | 
			
		||||
 | 
			
		||||
import java.awt.datatransfer.Clipboard;
 | 
			
		||||
import java.awt.datatransfer.StringSelection;
 | 
			
		||||
 | 
			
		||||
public class BookPagePasteListener implements NativeKeyListener {
 | 
			
		||||
	private final Book book;
 | 
			
		||||
	private final Clipboard clipboard;
 | 
			
		||||
	private int nextPage;
 | 
			
		||||
 | 
			
		||||
	public BookPagePasteListener(Book book, Clipboard clipboard) {
 | 
			
		||||
		this.book = book;
 | 
			
		||||
		this.clipboard = clipboard;
 | 
			
		||||
		this.nextPage = 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public void nativeKeyTyped(NativeKeyEvent nativeKeyEvent) {}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public void nativeKeyPressed(NativeKeyEvent nativeKeyEvent) {
 | 
			
		||||
		if (nativeKeyEvent.getKeyCode() == NativeKeyEvent.VC_V && (nativeKeyEvent.getModifiers() & NativeKeyEvent.CTRL_MASK) > 0) {
 | 
			
		||||
			System.out.println("CTRL + V -> Paste!!!");
 | 
			
		||||
			clipboard.setContents(
 | 
			
		||||
					new StringSelection(book.getPages().get(this.nextPage).toString()),
 | 
			
		||||
					null
 | 
			
		||||
			);
 | 
			
		||||
			this.nextPage++;
 | 
			
		||||
			System.out.println("Incremented page.");
 | 
			
		||||
			if (this.nextPage >= this.book.getPageCount()) {
 | 
			
		||||
				try {
 | 
			
		||||
					GlobalScreen.removeNativeKeyListener(this);
 | 
			
		||||
					GlobalScreen.unregisterNativeHook();
 | 
			
		||||
					System.out.println("Done pasting.");
 | 
			
		||||
				} catch (NativeHookException nativeHookException) {
 | 
			
		||||
					System.err.println("Could not unregister a native hook.");
 | 
			
		||||
					nativeHookException.printStackTrace();
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public void nativeKeyReleased(NativeKeyEvent nativeKeyEvent) {}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,23 @@
 | 
			
		|||
package nl.andrewlalis.blockbookbinder.control;
 | 
			
		||||
 | 
			
		||||
import nl.andrewlalis.blockbookbinder.model.BookBuilder;
 | 
			
		||||
import nl.andrewlalis.blockbookbinder.view.BookPreviewPanel;
 | 
			
		||||
import nl.andrewlalis.blockbookbinder.view.SourceTextPanel;
 | 
			
		||||
 | 
			
		||||
import java.awt.event.ActionEvent;
 | 
			
		||||
import java.awt.event.ActionListener;
 | 
			
		||||
 | 
			
		||||
public class ConvertToBookActionListener implements ActionListener {
 | 
			
		||||
	private final SourceTextPanel sourceTextPanel;
 | 
			
		||||
	private final BookPreviewPanel bookPreviewPanel;
 | 
			
		||||
 | 
			
		||||
	public ConvertToBookActionListener(SourceTextPanel sourceTextPanel, BookPreviewPanel bookPreviewPanel) {
 | 
			
		||||
		this.sourceTextPanel = sourceTextPanel;
 | 
			
		||||
		this.bookPreviewPanel = bookPreviewPanel;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public void actionPerformed(ActionEvent e) {
 | 
			
		||||
		this.bookPreviewPanel.setBook(new BookBuilder().build(this.sourceTextPanel.getSourceText()));
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -16,4 +16,14 @@ public class Book {
 | 
			
		|||
	public int getPageCount() {
 | 
			
		||||
		return this.pages.size();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public String toString() {
 | 
			
		||||
		StringBuilder sb = new StringBuilder("Book of " + this.getPageCount() + " pages:\n");
 | 
			
		||||
		for (int i = 0; i < this.getPageCount(); i++) {
 | 
			
		||||
			BookPage page = this.pages.get(i);
 | 
			
		||||
			sb.append("Page ").append(i + 1).append(":\n").append(page).append('\n');
 | 
			
		||||
		}
 | 
			
		||||
		return sb.toString();
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,73 @@
 | 
			
		|||
package nl.andrewlalis.blockbookbinder.model;
 | 
			
		||||
 | 
			
		||||
import nl.andrewlalis.blockbookbinder.util.ApplicationProperties;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Class which helps construct formatted book pages from a source text.
 | 
			
		||||
 */
 | 
			
		||||
public class BookBuilder {
 | 
			
		||||
	public Book build(String source) {
 | 
			
		||||
		Book book = new Book();
 | 
			
		||||
		char[] sourceChars = source.trim().toCharArray();
 | 
			
		||||
 | 
			
		||||
		final int maxLines = ApplicationProperties.getIntProp("book.page_max_lines");
 | 
			
		||||
		final int maxLineWidth = ApplicationProperties.getIntProp("book.page_max_width");
 | 
			
		||||
		final CharWidthMapper charWidthMapper = new CharWidthMapper();
 | 
			
		||||
 | 
			
		||||
		BookPage currentPage = new BookPage();
 | 
			
		||||
		StringBuilder lineStringBuilder = new StringBuilder(64);
 | 
			
		||||
		int pageLineCount = 1; // Current line on the page we're on.
 | 
			
		||||
		int lineCharWidth = 0; // Total pixel width of the current line so far.
 | 
			
		||||
		int i = 0;
 | 
			
		||||
		while (i < sourceChars.length) {
 | 
			
		||||
			final char c = sourceChars[i];
 | 
			
		||||
			if (c == '\n') {
 | 
			
		||||
				i++;
 | 
			
		||||
				continue;
 | 
			
		||||
			}
 | 
			
		||||
			final int cWidth = charWidthMapper.getWidth(c);
 | 
			
		||||
			boolean newLineNeeded = lineCharWidth + cWidth + 1 > maxLineWidth;
 | 
			
		||||
			boolean newPageNeeded = pageLineCount == maxLines && newLineNeeded;
 | 
			
		||||
			System.out.println("Current char: " + c + ", Current Line: " + pageLineCount + ", Current Line Char Width: " + lineCharWidth + ", New line needed: " + newLineNeeded + ", New page needed: " + newPageNeeded);
 | 
			
		||||
 | 
			
		||||
			// Check if the page is full, and append it to the book, and refresh.
 | 
			
		||||
			if (newPageNeeded) {
 | 
			
		||||
				// If necessary, append whatever is left in the last line to the page.
 | 
			
		||||
				if (lineStringBuilder.length() > 0) {
 | 
			
		||||
					currentPage.addLine(lineStringBuilder.toString());
 | 
			
		||||
				}
 | 
			
		||||
				book.getPages().add(currentPage);
 | 
			
		||||
				currentPage = new BookPage();
 | 
			
		||||
				// Reset all buffers and counters for the next page.
 | 
			
		||||
				lineStringBuilder.setLength(0);
 | 
			
		||||
				newLineNeeded = false;
 | 
			
		||||
				pageLineCount = 1;
 | 
			
		||||
				lineCharWidth = 0;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			// Check if the line is full, and append it to the page and refresh.
 | 
			
		||||
			if (newLineNeeded) {
 | 
			
		||||
				currentPage.addLine(lineStringBuilder.toString());
 | 
			
		||||
				// Reset line status info.
 | 
			
		||||
				lineStringBuilder.setLength(0);
 | 
			
		||||
				pageLineCount++;
 | 
			
		||||
				lineCharWidth = 0;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			// Finally, append the char to the current line.
 | 
			
		||||
			lineStringBuilder.append(c);
 | 
			
		||||
			lineCharWidth += cWidth + 1;
 | 
			
		||||
			i++;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Append a final page with the remainder of the text.
 | 
			
		||||
		if (currentPage.hasContent()) {
 | 
			
		||||
			if (lineStringBuilder.length() > 0) {
 | 
			
		||||
				currentPage.addLine(lineStringBuilder.toString());
 | 
			
		||||
			}
 | 
			
		||||
			book.getPages().add(currentPage);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return book;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,14 +1,31 @@
 | 
			
		|||
package nl.andrewlalis.blockbookbinder.model;
 | 
			
		||||
 | 
			
		||||
import lombok.Getter;
 | 
			
		||||
import lombok.Setter;
 | 
			
		||||
import nl.andrewlalis.blockbookbinder.util.ApplicationProperties;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
public class BookPage {
 | 
			
		||||
	@Getter
 | 
			
		||||
	@Setter
 | 
			
		||||
	private String content;
 | 
			
		||||
	private final List<String> lines;
 | 
			
		||||
 | 
			
		||||
	public BookPage() {
 | 
			
		||||
		this.content = "";
 | 
			
		||||
		this.lines = new ArrayList<>(ApplicationProperties.getIntProp("book.page_max_lines"));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public boolean addLine(String line) {
 | 
			
		||||
		if (this.lines.size() == ApplicationProperties.getIntProp("book.page_max_lines")) {
 | 
			
		||||
			return false;
 | 
			
		||||
		}
 | 
			
		||||
		this.lines.add(line);
 | 
			
		||||
		return true;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public boolean hasContent() {
 | 
			
		||||
		return !this.lines.isEmpty();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public String toString() {
 | 
			
		||||
		return String.join("\n", this.lines);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,56 @@
 | 
			
		|||
package nl.andrewlalis.blockbookbinder.model;
 | 
			
		||||
 | 
			
		||||
import nl.andrewlalis.blockbookbinder.util.ApplicationProperties;
 | 
			
		||||
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
public class CharWidthMapper {
 | 
			
		||||
	private final Map<Character, Integer> charWidthMap;
 | 
			
		||||
 | 
			
		||||
	public CharWidthMapper() {
 | 
			
		||||
		this.charWidthMap = new HashMap<>();
 | 
			
		||||
		this.initCharWidthMap();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public int getWidth(char c) {
 | 
			
		||||
		return this.charWidthMap.getOrDefault(c, 0);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private void initCharWidthMap() {
 | 
			
		||||
		this.charWidthMap.put(' ', 3);
 | 
			
		||||
		this.charWidthMap.put('!', 1);
 | 
			
		||||
		this.charWidthMap.put('"', 3);
 | 
			
		||||
		this.charWidthMap.put('\'', 1);
 | 
			
		||||
		this.charWidthMap.put('(', 3);
 | 
			
		||||
		this.charWidthMap.put(')', 3);
 | 
			
		||||
		this.charWidthMap.put('*', 3);
 | 
			
		||||
		this.charWidthMap.put(',', 1);
 | 
			
		||||
		this.charWidthMap.put('.', 1);
 | 
			
		||||
		this.charWidthMap.put(':', 1);
 | 
			
		||||
		this.charWidthMap.put(';', 1);
 | 
			
		||||
		this.charWidthMap.put('<', 4);
 | 
			
		||||
		this.charWidthMap.put('>', 4);
 | 
			
		||||
		this.charWidthMap.put('@', 6);
 | 
			
		||||
		this.charWidthMap.put('I', 3);
 | 
			
		||||
		this.charWidthMap.put('[', 3);
 | 
			
		||||
		this.charWidthMap.put(']', 3);
 | 
			
		||||
		this.charWidthMap.put('`', 2);
 | 
			
		||||
		this.charWidthMap.put('f', 4);
 | 
			
		||||
		this.charWidthMap.put('i', 1);
 | 
			
		||||
		this.charWidthMap.put('k', 4);
 | 
			
		||||
		this.charWidthMap.put('l', 2);
 | 
			
		||||
		this.charWidthMap.put('t', 3);
 | 
			
		||||
		this.charWidthMap.put('{', 3);
 | 
			
		||||
		this.charWidthMap.put('|', 1);
 | 
			
		||||
		this.charWidthMap.put('}', 3);
 | 
			
		||||
		this.charWidthMap.put('~', 6);
 | 
			
		||||
 | 
			
		||||
		final int defaultWidth = ApplicationProperties.getIntProp("book.default_char_width");
 | 
			
		||||
		for (char c = 32; c < 127; c++) {
 | 
			
		||||
			if (!this.charWidthMap.containsKey(c)) {
 | 
			
		||||
				this.charWidthMap.put(c, defaultWidth);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -3,6 +3,8 @@ package nl.andrewlalis.blockbookbinder.util;
 | 
			
		|||
import lombok.Getter;
 | 
			
		||||
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.Properties;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
| 
						 | 
				
			
			@ -14,6 +16,8 @@ public class ApplicationProperties {
 | 
			
		|||
	@Getter
 | 
			
		||||
	private final Properties properties;
 | 
			
		||||
 | 
			
		||||
	private final Map<String, Integer> intPropCache;
 | 
			
		||||
 | 
			
		||||
	public static ApplicationProperties getInstance() {
 | 
			
		||||
		if (instance == null) {
 | 
			
		||||
			try {
 | 
			
		||||
| 
						 | 
				
			
			@ -35,8 +39,18 @@ public class ApplicationProperties {
 | 
			
		|||
		return getInstance().getProperties().getProperty(key);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static Integer getIntProp(String key) {
 | 
			
		||||
		Integer value = getInstance().intPropCache.get(key);
 | 
			
		||||
		if (value == null) {
 | 
			
		||||
			value = Integer.parseInt(getProp(key));
 | 
			
		||||
			getInstance().intPropCache.put(key, value);
 | 
			
		||||
		}
 | 
			
		||||
		return value;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private ApplicationProperties() throws IOException {
 | 
			
		||||
		this.properties = new Properties();
 | 
			
		||||
		this.properties.load(this.getClass().getClassLoader().getResourceAsStream("application.properties"));
 | 
			
		||||
		this.intPropCache = new HashMap<>();
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,30 +1,87 @@
 | 
			
		|||
package nl.andrewlalis.blockbookbinder.view;
 | 
			
		||||
 | 
			
		||||
import lombok.Getter;
 | 
			
		||||
import nl.andrewlalis.blockbookbinder.model.Book;
 | 
			
		||||
import nl.andrewlalis.blockbookbinder.model.BookPage;
 | 
			
		||||
 | 
			
		||||
import javax.swing.*;
 | 
			
		||||
import javax.swing.border.EmptyBorder;
 | 
			
		||||
import java.awt.*;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.io.InputStream;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * A customized panel that's dedicated to showing a book's contents.
 | 
			
		||||
 */
 | 
			
		||||
public class BookPreviewPanel extends JPanel {
 | 
			
		||||
	@Getter
 | 
			
		||||
	private Book book;
 | 
			
		||||
	private int currentPage = 0;
 | 
			
		||||
	private final JTextArea previewPageTextArea;
 | 
			
		||||
	private final JLabel titleLabel;
 | 
			
		||||
 | 
			
		||||
	public BookPreviewPanel() {
 | 
			
		||||
		super(new BorderLayout());
 | 
			
		||||
 | 
			
		||||
		this.add(new JLabel("Book Preview"), BorderLayout.NORTH);
 | 
			
		||||
		this.titleLabel = new JLabel("Book Preview");
 | 
			
		||||
		this.add(this.titleLabel, BorderLayout.NORTH);
 | 
			
		||||
		this.setBorder(new EmptyBorder(5, 5, 5, 5));
 | 
			
		||||
 | 
			
		||||
		JTextArea previewPageTextArea = new JTextArea();
 | 
			
		||||
		JScrollPane previewPageScrollPane = new JScrollPane(previewPageTextArea, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
 | 
			
		||||
		this.previewPageTextArea = new JTextArea();
 | 
			
		||||
		this.previewPageTextArea.setEditable(false);
 | 
			
		||||
		try {
 | 
			
		||||
			InputStream is = this.getClass().getClassLoader().getResourceAsStream("fonts/1_Minecraft-Regular.otf");
 | 
			
		||||
			if (is == null) {
 | 
			
		||||
				throw new IOException("Could not read minecraft font.");
 | 
			
		||||
			}
 | 
			
		||||
			Font mcFont = Font.createFont(Font.TRUETYPE_FONT, is);
 | 
			
		||||
			mcFont = mcFont.deriveFont(24.0f);
 | 
			
		||||
			this.previewPageTextArea.setFont(mcFont);
 | 
			
		||||
		} catch (FontFormatException | IOException e) {
 | 
			
		||||
			e.printStackTrace();
 | 
			
		||||
		}
 | 
			
		||||
		JScrollPane previewPageScrollPane = new JScrollPane(this.previewPageTextArea, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
 | 
			
		||||
		this.add(previewPageScrollPane, BorderLayout.CENTER);
 | 
			
		||||
 | 
			
		||||
		JPanel previewButtonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
 | 
			
		||||
		previewButtonPanel.add(new JButton("<"));
 | 
			
		||||
		previewButtonPanel.add(new JButton(">"));
 | 
			
		||||
		JButton previousPageButton = new JButton("Previous Page");
 | 
			
		||||
		previousPageButton.addActionListener(e -> {
 | 
			
		||||
			if (currentPage > 0) {
 | 
			
		||||
				currentPage--;
 | 
			
		||||
				displayCurrentPage();
 | 
			
		||||
			}
 | 
			
		||||
		});
 | 
			
		||||
		JButton nextPageButton = new JButton("Next Page");
 | 
			
		||||
		nextPageButton.addActionListener(e -> {
 | 
			
		||||
			if (currentPage < book.getPageCount() - 1) {
 | 
			
		||||
				currentPage++;
 | 
			
		||||
				displayCurrentPage();
 | 
			
		||||
			}
 | 
			
		||||
		});
 | 
			
		||||
		previewButtonPanel.add(previousPageButton);
 | 
			
		||||
		previewButtonPanel.add(nextPageButton);
 | 
			
		||||
		this.add(previewButtonPanel, BorderLayout.SOUTH);
 | 
			
		||||
 | 
			
		||||
		this.setBook(new Book());
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private void displayCurrentPage() {
 | 
			
		||||
		if (this.book.getPageCount() == 0) {
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
		BookPage currentPage = this.book.getPages().get(this.currentPage);
 | 
			
		||||
		this.previewPageTextArea.setText(currentPage.toString());
 | 
			
		||||
		this.titleLabel.setText("Book Preview (Page " + (this.currentPage + 1) + " of " + this.book.getPageCount() + ")");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void setBook(Book book) {
 | 
			
		||||
		this.book = book;
 | 
			
		||||
		this.currentPage = 0;
 | 
			
		||||
		this.displayCurrentPage();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void setCurrentPage(int page) {
 | 
			
		||||
		this.currentPage = page;
 | 
			
		||||
		this.displayCurrentPage();
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,6 @@
 | 
			
		|||
package nl.andrewlalis.blockbookbinder.view;
 | 
			
		||||
 | 
			
		||||
import nl.andrewlalis.blockbookbinder.control.BookExportActionListener;
 | 
			
		||||
import nl.andrewlalis.blockbookbinder.control.ImportAction;
 | 
			
		||||
import nl.andrewlalis.blockbookbinder.util.ApplicationProperties;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -56,17 +57,15 @@ public class MainFrame extends JFrame {
 | 
			
		|||
		JPanel mainPanel = new JPanel(new BorderLayout());
 | 
			
		||||
 | 
			
		||||
		JPanel doublePanel = new JPanel(new GridLayout(1, 2));
 | 
			
		||||
		doublePanel.add(new BookPreviewPanel());
 | 
			
		||||
		doublePanel.add(new SourceTextPanel());
 | 
			
		||||
		BookPreviewPanel bookPreviewPanel = new BookPreviewPanel();
 | 
			
		||||
		doublePanel.add(bookPreviewPanel);
 | 
			
		||||
		SourceTextPanel sourceTextPanel = new SourceTextPanel(bookPreviewPanel);
 | 
			
		||||
		doublePanel.add(sourceTextPanel);
 | 
			
		||||
		mainPanel.add(doublePanel, BorderLayout.CENTER);
 | 
			
		||||
 | 
			
		||||
		JPanel bottomPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
 | 
			
		||||
		JButton exportButton = new JButton("Export to Book");
 | 
			
		||||
		exportButton.addActionListener(e -> {
 | 
			
		||||
			System.out.println("Starting export.");
 | 
			
		||||
//			final String fullText = mainTextArea.getText().trim();
 | 
			
		||||
//			Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(fullText.substring(0, 200)), null);
 | 
			
		||||
		});
 | 
			
		||||
		exportButton.addActionListener(new BookExportActionListener(bookPreviewPanel));
 | 
			
		||||
		bottomPanel.add(exportButton);
 | 
			
		||||
		mainPanel.add(bottomPanel, BorderLayout.SOUTH);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,7 @@
 | 
			
		|||
package nl.andrewlalis.blockbookbinder.view;
 | 
			
		||||
 | 
			
		||||
import nl.andrewlalis.blockbookbinder.control.ConvertToBookActionListener;
 | 
			
		||||
 | 
			
		||||
import javax.swing.*;
 | 
			
		||||
import javax.swing.border.EmptyBorder;
 | 
			
		||||
import java.awt.*;
 | 
			
		||||
| 
						 | 
				
			
			@ -9,14 +11,18 @@ import java.awt.*;
 | 
			
		|||
 * a book.
 | 
			
		||||
 */
 | 
			
		||||
public class SourceTextPanel extends JPanel {
 | 
			
		||||
	public SourceTextPanel() {
 | 
			
		||||
	private final JTextArea textArea;
 | 
			
		||||
 | 
			
		||||
	public SourceTextPanel(BookPreviewPanel bookPreviewPanel) {
 | 
			
		||||
		super(new BorderLayout());
 | 
			
		||||
 | 
			
		||||
		this.add(new JLabel("Source Text"), BorderLayout.NORTH);
 | 
			
		||||
		this.setBorder(new EmptyBorder(5, 5, 5, 5));
 | 
			
		||||
 | 
			
		||||
		JTextArea mainTextArea = new JTextArea();
 | 
			
		||||
		JScrollPane scrollWrappedMainTextArea = new JScrollPane(mainTextArea, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
 | 
			
		||||
		this.textArea = new JTextArea();
 | 
			
		||||
		this.textArea.setWrapStyleWord(true);
 | 
			
		||||
		this.textArea.setLineWrap(true);
 | 
			
		||||
		JScrollPane scrollWrappedMainTextArea = new JScrollPane(this.textArea, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
 | 
			
		||||
		this.add(scrollWrappedMainTextArea, BorderLayout.CENTER);
 | 
			
		||||
 | 
			
		||||
		JPanel rightPanelButtonPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
 | 
			
		||||
| 
						 | 
				
			
			@ -24,5 +30,13 @@ public class SourceTextPanel extends JPanel {
 | 
			
		|||
		JButton importButton = new JButton("Import");
 | 
			
		||||
		importButton.setActionCommand("importSource");
 | 
			
		||||
		rightPanelButtonPanel.add(importButton);
 | 
			
		||||
 | 
			
		||||
		JButton convertButton = new JButton("Convert to Book");
 | 
			
		||||
		convertButton.addActionListener(new ConvertToBookActionListener(this, bookPreviewPanel));
 | 
			
		||||
		rightPanelButtonPanel.add(convertButton);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public String getSourceText() {
 | 
			
		||||
		return this.textArea.getText();
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,3 +7,5 @@ frame.default_height=600
 | 
			
		|||
book.max_pages=100
 | 
			
		||||
book.page_max_lines=14
 | 
			
		||||
book.page_max_width=113
 | 
			
		||||
book.page_max_chars=255
 | 
			
		||||
book.default_char_width=5
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue