summaryrefslogtreecommitdiff
path: root/firmal/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'firmal/src/main/java')
-rw-r--r--firmal/src/main/java/bjc/firmal/Firmal.java16
-rw-r--r--firmal/src/main/java/bjc/firmal/FirmalBrowser.java183
-rw-r--r--firmal/src/main/java/bjc/firmal/FirmalPane.java56
3 files changed, 255 insertions, 0 deletions
diff --git a/firmal/src/main/java/bjc/firmal/Firmal.java b/firmal/src/main/java/bjc/firmal/Firmal.java
new file mode 100644
index 0000000..84c91d1
--- /dev/null
+++ b/firmal/src/main/java/bjc/firmal/Firmal.java
@@ -0,0 +1,16 @@
+package bjc.firmal;
+
+import javax.swing.JFrame;
+import javax.swing.WindowConstants;
+
+public class Firmal {
+ public static void main(String[] args) {
+ JFrame frame = FirmalPane.createFirmalPane();
+ frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
+
+ frame.pack();
+ frame.setSize(640, 480);
+
+ frame.setVisible(true);
+ }
+}
diff --git a/firmal/src/main/java/bjc/firmal/FirmalBrowser.java b/firmal/src/main/java/bjc/firmal/FirmalBrowser.java
new file mode 100644
index 0000000..37d08ac
--- /dev/null
+++ b/firmal/src/main/java/bjc/firmal/FirmalBrowser.java
@@ -0,0 +1,183 @@
+package bjc.firmal;
+
+import java.awt.BorderLayout;
+import java.awt.GridLayout;
+import java.awt.event.KeyEvent;
+import java.io.File;
+import java.io.IOException;
+
+import javax.swing.JButton;
+import javax.swing.JEditorPane;
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+
+import bjc.esodata.SingleTape;
+import bjc.esodata.Tape;
+import bjc.utils.gui.SimpleDialogs;
+import bjc.utils.gui.SimpleKeyedButton;
+import bjc.utils.gui.layout.VLayout;
+
+public class FirmalBrowser extends JPanel {
+ public class DirectoryExpected extends RuntimeException {
+ private static final long serialVersionUID = 6614868098505684922L;
+
+ public DirectoryExpected(String pth) {
+ super(String.format("Non-directory '%s' passed where a directory was expected", pth));
+ }
+ }
+
+ private static final long serialVersionUID = 9078988253392361649L;
+
+ private JEditorPane contentPane;
+
+ private String dirName;
+ private String dirPath;
+
+ private Tape<File> loadedFiles;
+
+ private JFrame root;
+
+ public FirmalBrowser(JFrame root) {
+ super();
+
+ this.loadedFiles = new SingleTape<>();
+ this.root = root;
+
+ setLayout(new BorderLayout());
+
+ contentPane = new JEditorPane();
+ contentPane.setEditable(false);
+ contentPane.setContentType("text/html;charset=UTF-8");
+
+ JScrollPane scrollPane = new JScrollPane(contentPane);
+
+ JPanel buttonPanel = new JPanel(new VLayout(2));
+
+ JButton refreshButton = new JButton("Refresh");
+
+ JPanel navButtonPanel = new JPanel();
+ navButtonPanel.setLayout(new GridLayout(2, 2));
+
+ SimpleKeyedButton firstButton = new SimpleKeyedButton("<< First");
+ firstButton.setGlobalDefaultKeystroke("firstFile", "control shift P", (aev) -> {
+ moveFirst();
+ });
+ firstButton.setMnemonic(KeyEvent.VK_F);
+
+ SimpleKeyedButton prevButton = new SimpleKeyedButton("< Previous");
+ prevButton.setGlobalDefaultKeystroke("prevFile", "control P", (ev) -> {
+ movePrevious();
+ });
+
+ SimpleKeyedButton lastButton = new SimpleKeyedButton("Last >>");
+ lastButton.setGlobalDefaultKeystroke("lastFile", "control shift N", (ev) -> {
+ moveLast();
+ });
+
+ SimpleKeyedButton nextButton = new SimpleKeyedButton("Next >");
+ nextButton.setGlobalDefaultKeystroke("nextFile", "control N", (ev) -> {
+ moveNext();
+ });
+
+ navButtonPanel.add(firstButton);
+ navButtonPanel.add(lastButton);
+ navButtonPanel.add(prevButton);
+ navButtonPanel.add(nextButton);
+
+ buttonPanel.add(refreshButton);
+ buttonPanel.add(navButtonPanel);
+
+ add(BorderLayout.PAGE_END, buttonPanel);
+ add(BorderLayout.CENTER, scrollPane);
+ }
+
+ public void moveNext() {
+ boolean res = loadedFiles.right();
+ if (!res) {
+ SimpleDialogs.showMessage(this, "Already There", "No next file. Already at the last one.");
+ return;
+ }
+
+ loadFile(loadedFiles.item());
+ }
+
+ public void moveLast() {
+ if (loadedFiles.atEnd()) {
+ SimpleDialogs.showMessage(this, "Already There", "Already at the last file");
+ return;
+ }
+
+ loadedFiles.last();
+
+ loadFile(loadedFiles.item());
+ }
+
+ public void movePrevious() {
+ boolean res = loadedFiles.left();
+ if (!res) {
+ SimpleDialogs.showMessage(this, "Already There", "No previous file. Already at the first one.");
+ return;
+ }
+
+ loadFile(loadedFiles.item());
+ }
+
+ public void moveFirst() {
+ if (loadedFiles.position() == 0) {
+ SimpleDialogs.showMessage(this, "Already There", "Already at the first file");
+ return;
+ }
+
+ loadedFiles.first();
+
+ loadFile(loadedFiles.item());
+ }
+
+ public void openDirectory(File dir) {
+ if (!dir.isDirectory())
+ throw new DirectoryExpected(dir.getAbsolutePath());
+
+ dirPath = dir.getAbsolutePath();
+ dirName = dir.getName();
+
+ loadedFiles = new SingleTape<>();
+
+ // NOTE: Currently; ignores sub-directories. These should probably be handled in
+ // some way (flag/dialog box?)
+ for (File fle : dir.listFiles()) {
+ if (fle.isDirectory())
+ continue; // See above
+
+ // We don't handle non-html file types for now.
+ if (fle.getName().endsWith(".htm") || fle.getName().endsWith(".html")) {
+ loadedFiles.append(fle);
+ } else {
+ System.err.printf("WARN: Ignoring non-HTML file '%s' in directory '%s' (%s)", fle.getName(), dirName,
+ dirPath);
+ }
+ }
+
+ loadedFiles.first();
+
+ File curFile = loadedFiles.item();
+ loadFile(curFile);
+ }
+
+ private void loadFile(File curFile) {
+ try {
+ contentPane.setPage(curFile.toURI().toURL());
+
+ String msg = String.format("Firmal Browser (Browsing: %s) - %s - %d of %d", dirPath, curFile.getName(),
+ loadedFiles.position(), loadedFiles.size());
+ root.setTitle(msg);
+ } catch (IOException ioex) {
+ String msg = String.format("Couldn't load file '%s' from directory '%s' because %s", curFile, dirName,
+ ioex.getMessage());
+
+ SimpleDialogs.showError(this, "Error loading File", msg);
+
+ ioex.printStackTrace();
+ }
+ }
+}
diff --git a/firmal/src/main/java/bjc/firmal/FirmalPane.java b/firmal/src/main/java/bjc/firmal/FirmalPane.java
new file mode 100644
index 0000000..0e57462
--- /dev/null
+++ b/firmal/src/main/java/bjc/firmal/FirmalPane.java
@@ -0,0 +1,56 @@
+package bjc.firmal;
+
+import java.awt.event.KeyEvent;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.io.File;
+
+import javax.swing.JFrame;
+import javax.swing.JMenu;
+import javax.swing.JMenuBar;
+import javax.swing.JMenuItem;
+import javax.swing.KeyStroke;
+
+import bjc.utils.gui.SimpleFileChooser;
+import bjc.utils.gui.layout.AutosizeLayout;
+
+public class FirmalPane {
+ public static JFrame createFirmalPane() {
+ JFrame mainframe = new JFrame("Firmal Browser");
+ mainframe.setLayout(new AutosizeLayout());
+
+ FirmalBrowser browser = new FirmalBrowser(mainframe);
+
+ JMenuBar menuBar = new JMenuBar();
+
+ JMenu fileMenu = new JMenu("File");
+
+ JMenuItem openItem = new JMenuItem("Open...");
+ openItem.addActionListener((ev) -> {
+ File dir = SimpleFileChooser.pickDirectory(mainframe, "Pick Directory to Browse...");
+
+ // Didn't pick a directory
+ if (dir == null) return;
+
+ browser.openDirectory(dir);
+ });
+ openItem.setMnemonic(KeyEvent.VK_O);
+ openItem.setAccelerator(KeyStroke.getKeyStroke("control O"));
+
+ fileMenu.add(openItem);
+
+ menuBar.add(fileMenu);
+
+ mainframe.addMouseListener(new MouseAdapter() {
+ @Override
+ public void mouseClicked(MouseEvent mev) {
+ if (mev.getButton() == 4) browser.moveNext();
+ if (mev.getButton() == 5) browser.movePrevious();
+ }
+ });
+ mainframe.setJMenuBar(menuBar);
+ mainframe.add(browser);
+
+ return mainframe;
+ }
+}