diff --git a/pom.xml b/pom.xml index 4af87d0..8e4cce3 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ nl.andrewlalis BlockBookBinder - 1.1.0 + 1.2.0 12 @@ -62,5 +62,11 @@ flatlaf 1.0-rc3 + + + org.apache.maven + maven-model + 3.6.3 + \ No newline at end of file diff --git a/src/main/java/nl/andrewlalis/blockbookbinder/BlockBookBinder.java b/src/main/java/nl/andrewlalis/blockbookbinder/BlockBookBinder.java index a31fda5..ccaf4c3 100644 --- a/src/main/java/nl/andrewlalis/blockbookbinder/BlockBookBinder.java +++ b/src/main/java/nl/andrewlalis/blockbookbinder/BlockBookBinder.java @@ -1,6 +1,7 @@ package nl.andrewlalis.blockbookbinder; import com.formdev.flatlaf.FlatDarkLaf; +import nl.andrewlalis.blockbookbinder.util.VersionReader; import nl.andrewlalis.blockbookbinder.view.MainFrame; import javax.swing.*; @@ -9,6 +10,8 @@ import javax.swing.*; * The main class for the application. */ public class BlockBookBinder { + public static final String VERSION = VersionReader.getVersion(); + public static void main(String[] args) { SwingUtilities.invokeLater(() -> { FlatDarkLaf.install(); diff --git a/src/main/java/nl/andrewlalis/blockbookbinder/control/ConvertToBookActionListener.java b/src/main/java/nl/andrewlalis/blockbookbinder/control/ConvertToBookActionListener.java deleted file mode 100644 index b2b1c73..0000000 --- a/src/main/java/nl/andrewlalis/blockbookbinder/control/ConvertToBookActionListener.java +++ /dev/null @@ -1,29 +0,0 @@ -package nl.andrewlalis.blockbookbinder.control; - -import nl.andrewlalis.blockbookbinder.model.build.BookBuilder; -import nl.andrewlalis.blockbookbinder.view.book.BookPreviewPanel; -import nl.andrewlalis.blockbookbinder.view.SourceTextPanel; - -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - -/** - * Action listener that, when activated, converts the text from the source panel - * into a formatted book. - */ -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()) - ); - } -} diff --git a/src/main/java/nl/andrewlalis/blockbookbinder/control/ImportAction.java b/src/main/java/nl/andrewlalis/blockbookbinder/control/ImportAction.java deleted file mode 100644 index f0c2b6e..0000000 --- a/src/main/java/nl/andrewlalis/blockbookbinder/control/ImportAction.java +++ /dev/null @@ -1,19 +0,0 @@ -package nl.andrewlalis.blockbookbinder.control; - -import javax.swing.*; -import java.awt.event.ActionEvent; - -public class ImportAction extends AbstractAction { - public ImportAction(String name) { - super(name); - } - - public ImportAction(String name, Icon icon) { - super(name, icon); - } - - @Override - public void actionPerformed(ActionEvent e) { - System.out.println("Import!"); - } -} diff --git a/src/main/java/nl/andrewlalis/blockbookbinder/control/export/ExportBookToMinecraftAction.java b/src/main/java/nl/andrewlalis/blockbookbinder/control/export/ExportBookToMinecraftAction.java new file mode 100644 index 0000000..f324244 --- /dev/null +++ b/src/main/java/nl/andrewlalis/blockbookbinder/control/export/ExportBookToMinecraftAction.java @@ -0,0 +1,39 @@ +package nl.andrewlalis.blockbookbinder.control.export; + +import lombok.Getter; +import lombok.Setter; +import nl.andrewlalis.blockbookbinder.model.Book; +import nl.andrewlalis.blockbookbinder.view.book.BookPreviewPanel; +import nl.andrewlalis.blockbookbinder.view.export.ExportToBookDialog; + +import javax.swing.*; +import java.awt.event.ActionEvent; + +public class ExportBookToMinecraftAction extends AbstractAction { + @Getter + private static final ExportBookToMinecraftAction instance = new ExportBookToMinecraftAction(); + + public ExportBookToMinecraftAction() { + super("Export to Minecraft"); + this.putValue(SHORT_DESCRIPTION, "Export the current book to Minecraft."); + } + + @Setter + private BookPreviewPanel bookPreviewPanel; + + @Override + public void actionPerformed(ActionEvent e) { + final Book book = bookPreviewPanel.getBook(); + if (book == null || book.getPageCount() == 0) { + JOptionPane.showMessageDialog( + this.bookPreviewPanel.getRootPane(), + "Cannot export an empty book.", + "Empty Book", + JOptionPane.WARNING_MESSAGE + ); + return; + } + ExportToBookDialog dialog = new ExportToBookDialog(SwingUtilities.getWindowAncestor(this.bookPreviewPanel), bookPreviewPanel.getBook()); + dialog.setupAndShow(); + } +} diff --git a/src/main/java/nl/andrewlalis/blockbookbinder/control/CleanSourceActionListener.java b/src/main/java/nl/andrewlalis/blockbookbinder/control/source/CleanSourceAction.java similarity index 68% rename from src/main/java/nl/andrewlalis/blockbookbinder/control/CleanSourceActionListener.java rename to src/main/java/nl/andrewlalis/blockbookbinder/control/source/CleanSourceAction.java index 794adf6..cac31ba 100644 --- a/src/main/java/nl/andrewlalis/blockbookbinder/control/CleanSourceActionListener.java +++ b/src/main/java/nl/andrewlalis/blockbookbinder/control/source/CleanSourceAction.java @@ -1,19 +1,22 @@ -package nl.andrewlalis.blockbookbinder.control; +package nl.andrewlalis.blockbookbinder.control.source; +import lombok.Getter; +import lombok.Setter; import nl.andrewlalis.blockbookbinder.view.SourceTextPanel; +import javax.swing.*; import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -/** - * Listener for an action where the source text is 'cleaned' by removing any - * trailing whitespace, and removing unnecessary newlines. - */ -public class CleanSourceActionListener implements ActionListener { - private final SourceTextPanel sourceTextPanel; +public class CleanSourceAction extends AbstractAction { + @Getter + private final static CleanSourceAction instance = new CleanSourceAction(); - public CleanSourceActionListener(SourceTextPanel sourceTextPanel) { - this.sourceTextPanel = sourceTextPanel; + @Setter + private SourceTextPanel sourceTextPanel; + + public CleanSourceAction() { + super("Clean Source"); + this.putValue(SHORT_DESCRIPTION, "Clean up the source text."); } @Override diff --git a/src/main/java/nl/andrewlalis/blockbookbinder/control/source/CompileFromSourceAction.java b/src/main/java/nl/andrewlalis/blockbookbinder/control/source/CompileFromSourceAction.java new file mode 100644 index 0000000..3587b78 --- /dev/null +++ b/src/main/java/nl/andrewlalis/blockbookbinder/control/source/CompileFromSourceAction.java @@ -0,0 +1,32 @@ +package nl.andrewlalis.blockbookbinder.control.source; + +import lombok.Getter; +import lombok.Setter; +import nl.andrewlalis.blockbookbinder.model.build.BookBuilder; +import nl.andrewlalis.blockbookbinder.view.SourceTextPanel; +import nl.andrewlalis.blockbookbinder.view.book.BookPreviewPanel; + +import javax.swing.*; +import java.awt.event.ActionEvent; + +public class CompileFromSourceAction extends AbstractAction { + @Getter + private static final CompileFromSourceAction instance = new CompileFromSourceAction(); + + @Setter + private SourceTextPanel sourceTextPanel; + @Setter + private BookPreviewPanel bookPreviewPanel; + + public CompileFromSourceAction() { + super("Compile From Source"); + this.putValue(SHORT_DESCRIPTION, "Compile the current source text into a book."); + } + + @Override + public void actionPerformed(ActionEvent e) { + this.bookPreviewPanel.setBook( + new BookBuilder().build(this.sourceTextPanel.getSourceText()) + ); + } +} diff --git a/src/main/java/nl/andrewlalis/blockbookbinder/control/source/ImportSourceAction.java b/src/main/java/nl/andrewlalis/blockbookbinder/control/source/ImportSourceAction.java new file mode 100644 index 0000000..4ec167c --- /dev/null +++ b/src/main/java/nl/andrewlalis/blockbookbinder/control/source/ImportSourceAction.java @@ -0,0 +1,21 @@ +package nl.andrewlalis.blockbookbinder.control.source; + +import lombok.Getter; + +import javax.swing.*; +import java.awt.event.ActionEvent; + +public class ImportSourceAction extends AbstractAction { + @Getter + private static final ImportSourceAction instance = new ImportSourceAction(); + + public ImportSourceAction() { + super("Import Source"); + this.putValue(SHORT_DESCRIPTION, "Import source text from a file."); + } + + @Override + public void actionPerformed(ActionEvent e) { + + } +} diff --git a/src/main/java/nl/andrewlalis/blockbookbinder/util/VersionReader.java b/src/main/java/nl/andrewlalis/blockbookbinder/util/VersionReader.java new file mode 100644 index 0000000..bc34580 --- /dev/null +++ b/src/main/java/nl/andrewlalis/blockbookbinder/util/VersionReader.java @@ -0,0 +1,30 @@ +package nl.andrewlalis.blockbookbinder.util; + +import org.apache.maven.model.Model; +import org.apache.maven.model.io.xpp3.MavenXpp3Reader; +import org.codehaus.plexus.util.xml.pull.XmlPullParserException; + +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStreamReader; + +public class VersionReader { + public static String getVersion() { + MavenXpp3Reader reader = new MavenXpp3Reader(); + try { + Model model; + if ((new File("pom.xml")).exists()) { + model = reader.read(new FileReader("pom.xml")); + } else { + model = reader.read(new InputStreamReader( + VersionReader.class.getResourceAsStream("/META-INF/maven/nl.andrewlalis/BlockBookBinder/pom.xml") + )); + } + return model.getVersion(); + } catch (IOException | XmlPullParserException e) { + e.printStackTrace(); + return "Unknown"; + } + } +} diff --git a/src/main/java/nl/andrewlalis/blockbookbinder/view/MainFrame.java b/src/main/java/nl/andrewlalis/blockbookbinder/view/MainFrame.java index 53df354..28f763d 100644 --- a/src/main/java/nl/andrewlalis/blockbookbinder/view/MainFrame.java +++ b/src/main/java/nl/andrewlalis/blockbookbinder/view/MainFrame.java @@ -1,10 +1,13 @@ package nl.andrewlalis.blockbookbinder.view; -import nl.andrewlalis.blockbookbinder.model.Book; +import nl.andrewlalis.blockbookbinder.BlockBookBinder; +import nl.andrewlalis.blockbookbinder.control.export.ExportBookToMinecraftAction; +import nl.andrewlalis.blockbookbinder.control.source.CleanSourceAction; +import nl.andrewlalis.blockbookbinder.control.source.CompileFromSourceAction; +import nl.andrewlalis.blockbookbinder.control.source.ImportSourceAction; 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.*; import java.awt.*; @@ -19,7 +22,7 @@ public class MainFrame extends JFrame { ApplicationProperties.getIntProp("frame.default_width"), ApplicationProperties.getIntProp("frame.default_height") )); - this.setTitle(ApplicationProperties.getProp("frame.title")); + this.setTitle(ApplicationProperties.getProp("frame.title") + " Version " + BlockBookBinder.VERSION); this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); final URL iconUrl = this.getClass().getClassLoader().getResource("images/book_and_quill.png"); if (iconUrl != null) { @@ -34,15 +37,41 @@ public class MainFrame extends JFrame { this.setVisible(true); } + private Container buildContentPane() { + JPanel mainPanel = new JPanel(new BorderLayout()); + JPanel doublePanel = new JPanel(new GridLayout(1, 2)); + + BookPreviewPanel bookPreviewPanel = new BookPreviewPanel(); + doublePanel.add(bookPreviewPanel); + CompileFromSourceAction.getInstance().setBookPreviewPanel(bookPreviewPanel); + ExportBookToMinecraftAction.getInstance().setBookPreviewPanel(bookPreviewPanel); + + SourceTextPanel sourceTextPanel = new SourceTextPanel(); + doublePanel.add(sourceTextPanel); + CompileFromSourceAction.getInstance().setSourceTextPanel(sourceTextPanel); + CleanSourceAction.getInstance().setSourceTextPanel(sourceTextPanel); + + mainPanel.add(doublePanel, BorderLayout.CENTER); + + return mainPanel; + } + private JMenuBar buildMenuBar() { JMenuBar menuBar = new JMenuBar(); JMenu fileMenu = new JMenu("File"); + fileMenu.add(ImportSourceAction.getInstance()); JMenuItem exitItem = new JMenuItem("Exit"); exitItem.addActionListener(e -> this.dispose()); fileMenu.add(exitItem); menuBar.add(fileMenu); + JMenu bookMenu = new JMenu("Book"); + bookMenu.add(CompileFromSourceAction.getInstance()); + bookMenu.add(CleanSourceAction.getInstance()); + bookMenu.add(ExportBookToMinecraftAction.getInstance()); + menuBar.add(bookMenu); + JMenu helpMenu = new JMenu("Help"); JMenuItem aboutItem = new JMenuItem("About"); aboutItem.addActionListener(e -> { @@ -55,36 +84,6 @@ public class MainFrame extends JFrame { return menuBar; } - private Container buildContentPane() { - JPanel mainPanel = new JPanel(new BorderLayout()); - - JPanel doublePanel = new JPanel(new GridLayout(1, 2)); - 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"); - JButton cancelExportButton = new JButton("Cancel Export"); - cancelExportButton.setEnabled(false); - exportButton.addActionListener(e -> { - final Book book = bookPreviewPanel.getBook(); - if (book == null || book.getPageCount() == 0) { - JOptionPane.showMessageDialog(this, "Cannot export an empty book.", "Empty Book", JOptionPane.WARNING_MESSAGE); - return; - } - ExportToBookDialog dialog = new ExportToBookDialog(this, bookPreviewPanel.getBook()); - dialog.setupAndShow(); - }); - bottomPanel.add(exportButton); - bottomPanel.add(cancelExportButton); - mainPanel.add(bottomPanel, BorderLayout.SOUTH); - - return mainPanel; - } - @Override public void dispose() { super.dispose(); diff --git a/src/main/java/nl/andrewlalis/blockbookbinder/view/SourceTextPanel.java b/src/main/java/nl/andrewlalis/blockbookbinder/view/SourceTextPanel.java index 8ca6319..b0e26ab 100644 --- a/src/main/java/nl/andrewlalis/blockbookbinder/view/SourceTextPanel.java +++ b/src/main/java/nl/andrewlalis/blockbookbinder/view/SourceTextPanel.java @@ -1,9 +1,5 @@ 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; import java.awt.*; @@ -15,7 +11,7 @@ import java.awt.*; public class SourceTextPanel extends JPanel { private final JTextArea textArea; - public SourceTextPanel(BookPreviewPanel bookPreviewPanel) { + public SourceTextPanel() { super(new BorderLayout()); this.add(new JLabel("Source Text"), BorderLayout.NORTH); @@ -26,17 +22,6 @@ public class SourceTextPanel extends JPanel { 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)); - this.add(rightPanelButtonPanel, BorderLayout.SOUTH); - - JButton convertButton = new JButton("Convert to Book"); - convertButton.addActionListener(new ConvertToBookActionListener(this, bookPreviewPanel)); - rightPanelButtonPanel.add(convertButton); - - JButton cleanButton = new JButton("Clean"); - cleanButton.addActionListener(new CleanSourceActionListener(this)); - rightPanelButtonPanel.add(cleanButton); } public String getSourceText() { diff --git a/src/main/java/nl/andrewlalis/blockbookbinder/view/export/ExportToBookDialog.java b/src/main/java/nl/andrewlalis/blockbookbinder/view/export/ExportToBookDialog.java index a613b31..4d1d42f 100644 --- a/src/main/java/nl/andrewlalis/blockbookbinder/view/export/ExportToBookDialog.java +++ b/src/main/java/nl/andrewlalis/blockbookbinder/view/export/ExportToBookDialog.java @@ -31,8 +31,8 @@ public class ExportToBookDialog extends JDialog { private Thread exporterThread; private BookExporter exporterRunnable; - public ExportToBookDialog(Frame owner, Book book) { - super(owner, "Export to Book", true); + public ExportToBookDialog(Window owner, Book book) { + super(owner, "Export to Book"); this.book = book; } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 7264766..87e1343 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,3 +1,5 @@ +version=1.2.0 + # Settings for the application's GUI. frame.title=Block Book Binder frame.default_width=800