Added starting application.

This commit is contained in:
Andrew Lalis 2020-11-07 00:11:29 +01:00
parent c36a5126cb
commit 238c6b44db
11 changed files with 251 additions and 0 deletions

4
.gitignore vendored
View File

@ -9,3 +9,7 @@ buildNumber.properties
.mvn/timing.properties .mvn/timing.properties
# https://github.com/takari/maven-wrapper#usage-without-binary-jar # https://github.com/takari/maven-wrapper#usage-without-binary-jar
.mvn/wrapper/maven-wrapper.jar .mvn/wrapper/maven-wrapper.jar
# IntelliJ Configuration Files
.idea/
*.iml

25
pom.xml Normal file
View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>nl.andrewlalis</groupId>
<artifactId>BlockBookBinder</artifactId>
<version>0.0.1</version>
<properties>
<maven.compiler.source>12</maven.compiler.source>
<maven.compiler.target>12</maven.compiler.target>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.14</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,17 @@
package nl.andrewlalis.blockbookbinder;
import nl.andrewlalis.blockbookbinder.view.MainFrame;
import javax.swing.*;
/**
* The main class for the application.
*/
public class BlockBookBinder {
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
var mainFrame = new MainFrame();
mainFrame.setupAndShow();
});
}
}

View File

@ -0,0 +1,19 @@
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!");
}
}

View File

@ -0,0 +1,15 @@
package nl.andrewlalis.blockbookbinder.model;
import lombok.Getter;
import java.util.ArrayList;
import java.util.List;
public class BookContents {
@Getter
private final List<BookPage> pages;
public BookContents() {
this.pages = new ArrayList<>();
}
}

View File

@ -0,0 +1,14 @@
package nl.andrewlalis.blockbookbinder.model;
import lombok.Getter;
import lombok.Setter;
public class BookPage {
@Getter
@Setter
private String content;
public BookPage() {
this.content = "";
}
}

View File

@ -0,0 +1,42 @@
package nl.andrewlalis.blockbookbinder.util;
import lombok.Getter;
import java.io.IOException;
import java.util.Properties;
/**
* Singleton class which handles the properties defined in an external
* properties file.
*/
public class ApplicationProperties {
private static ApplicationProperties instance;
@Getter
private final Properties properties;
public static ApplicationProperties getInstance() {
if (instance == null) {
try {
instance = new ApplicationProperties();
} catch (IOException e) {
System.err.println("Could not load properties!");
System.exit(1);
}
}
return instance;
}
/**
* Shortcut for getting a property.
* @param key The property's key.
* @return The value for that property.
*/
public static String getProp(String key) {
return getInstance().getProperties().getProperty(key);
}
private ApplicationProperties() throws IOException {
this.properties = new Properties();
this.properties.load(this.getClass().getClassLoader().getResourceAsStream("application.properties"));
}
}

View File

@ -0,0 +1,106 @@
package nl.andrewlalis.blockbookbinder.view;
import nl.andrewlalis.blockbookbinder.control.ImportAction;
import nl.andrewlalis.blockbookbinder.util.ApplicationProperties;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.awt.*;
import java.awt.datatransfer.StringSelection;
import java.net.URL;
/**
* The main window of the application.
*/
public class MainFrame extends JFrame {
private Action importAction;
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.setTitle(ApplicationProperties.getProp("frame.title"));
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
final URL iconUrl = this.getClass().getClassLoader().getResource("images/book_and_quill.png");
if (iconUrl != null) {
this.setIconImage(new ImageIcon(iconUrl).getImage());
}
this.initActions();
this.setContentPane(this.buildContentPane());
this.setJMenuBar(this.buildMenuBar());
this.pack();
this.setLocationRelativeTo(null);
this.setVisible(true);
}
private void initActions() {
this.importAction = new ImportAction("Import");
}
private JMenuBar buildMenuBar() {
JMenuBar menuBar = new JMenuBar();
JMenu fileMenu = new JMenu("File");
fileMenu.add(new JMenuItem(this.importAction));
menuBar.add(fileMenu);
JMenu helpMenu = new JMenu("Help");
JMenuItem aboutItem = new JMenuItem("About");
helpMenu.add(aboutItem);
menuBar.add(helpMenu);
return menuBar;
}
private Container buildContentPane() {
JPanel mainPanel = new JPanel(new BorderLayout());
JPanel doublePanel = new JPanel(new GridLayout(1, 2));
mainPanel.add(doublePanel, BorderLayout.CENTER);
final Insets innerPanelInsets = new Insets(5, 5, 5, 5);
JPanel leftPanel = new JPanel(new BorderLayout());
doublePanel.add(leftPanel);
leftPanel.add(new JLabel("Book Preview"), BorderLayout.NORTH);
leftPanel.setBorder(new EmptyBorder(innerPanelInsets));
JTextArea previewPageTextArea = new JTextArea();
JScrollPane previewPageScrollPane = new JScrollPane(previewPageTextArea, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
leftPanel.add(previewPageScrollPane, BorderLayout.CENTER);
JPanel previewButtonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
previewButtonPanel.add(new JButton("<"));
previewButtonPanel.add(new JButton(">"));
leftPanel.add(previewButtonPanel, BorderLayout.SOUTH);
JPanel rightPanel = new JPanel(new BorderLayout());
doublePanel.add(rightPanel);
rightPanel.add(new JLabel("Source Text"), BorderLayout.NORTH);
rightPanel.setBorder(new EmptyBorder(innerPanelInsets));
JTextArea mainTextArea = new JTextArea();
JScrollPane scrollWrappedMainTextArea = new JScrollPane(mainTextArea, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
rightPanel.add(scrollWrappedMainTextArea, BorderLayout.CENTER);
JPanel rightPanelButtonPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
rightPanel.add(rightPanelButtonPanel, BorderLayout.SOUTH);
rightPanelButtonPanel.add(new JButton(this.importAction));
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);
});
bottomPanel.add(exportButton);
mainPanel.add(bottomPanel, BorderLayout.SOUTH);
return mainPanel;
}
}

View File

@ -0,0 +1,9 @@
# Settings for the application's GUI.
frame.title=Block Book Binder
frame.default_width=800
frame.default_height=600
# Settings for Minecraft book interaction.
book.max_pages=100
book.page_max_lines=14
book.page_max_width=113

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 424 B