summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Culkin <scorpress@gmail.com>2020-04-12 14:12:10 -0400
committerBen Culkin <scorpress@gmail.com>2020-04-12 14:12:10 -0400
commit22204c9475d578efbce882cae0f2b618d35386cb (patch)
tree92e1e20bbd4b489c825398b7a4d787d9ea23b62b
Initial commit
-rw-r--r--firmal/.classpath38
-rw-r--r--firmal/.gitignore1
-rw-r--r--firmal/.project23
-rw-r--r--firmal/.settings/org.eclipse.jdt.core.prefs15
-rw-r--r--firmal/.settings/org.eclipse.m2e.core.prefs4
-rw-r--r--firmal/pom.xml15
-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
9 files changed, 351 insertions, 0 deletions
diff --git a/firmal/.classpath b/firmal/.classpath
new file mode 100644
index 0000000..002ad57
--- /dev/null
+++ b/firmal/.classpath
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" output="target/classes" path="src/main/java">
+ <attributes>
+ <attribute name="optional" value="true"/>
+ <attribute name="maven.pomderived" value="true"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
+ <attributes>
+ <attribute name="maven.pomderived" value="true"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry kind="src" output="target/test-classes" path="src/test/java">
+ <attributes>
+ <attribute name="optional" value="true"/>
+ <attribute name="maven.pomderived" value="true"/>
+ <attribute name="test" value="true"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources">
+ <attributes>
+ <attribute name="maven.pomderived" value="true"/>
+ <attribute name="test" value="true"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
+ <attributes>
+ <attribute name="maven.pomderived" value="true"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
+ <attributes>
+ <attribute name="maven.pomderived" value="true"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/firmal/.gitignore b/firmal/.gitignore
new file mode 100644
index 0000000..b83d222
--- /dev/null
+++ b/firmal/.gitignore
@@ -0,0 +1 @@
+/target/
diff --git a/firmal/.project b/firmal/.project
new file mode 100644
index 0000000..7a0a8fe
--- /dev/null
+++ b/firmal/.project
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>firmal</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.m2e.core.maven2Builder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.m2e.core.maven2Nature</nature>
+ </natures>
+</projectDescription>
diff --git a/firmal/.settings/org.eclipse.jdt.core.prefs b/firmal/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..db24ee7
--- /dev/null
+++ b/firmal/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,15 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore
+org.eclipse.jdt.core.compiler.release=disabled
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/firmal/.settings/org.eclipse.m2e.core.prefs b/firmal/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..f897a7f
--- /dev/null
+++ b/firmal/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/firmal/pom.xml b/firmal/pom.xml
new file mode 100644
index 0000000..74aca8c
--- /dev/null
+++ b/firmal/pom.xml
@@ -0,0 +1,15 @@
+<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>bjc</groupId>
+ <artifactId>firmal</artifactId>
+ <version>0.0.1-SNAPSHOT</version>
+ <name>firmal</name>
+ <description>Local browser for directories of HTML files. Created originally for browsing downloaded tumblr blogs</description>
+ <dependencies>
+ <dependency>
+ <groupId>bjc</groupId>
+ <artifactId>BJC-Utils2</artifactId>
+ <version>1.0.0</version>
+ </dependency>
+ </dependencies>
+</project> \ No newline at end of file
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;
+ }
+}