diff options
| author | Ben Culkin <scorpress@gmail.com> | 2020-04-12 14:12:10 -0400 |
|---|---|---|
| committer | Ben Culkin <scorpress@gmail.com> | 2020-04-12 14:12:10 -0400 |
| commit | 22204c9475d578efbce882cae0f2b618d35386cb (patch) | |
| tree | 92e1e20bbd4b489c825398b7a4d787d9ea23b62b | |
Initial commit
| -rw-r--r-- | firmal/.classpath | 38 | ||||
| -rw-r--r-- | firmal/.gitignore | 1 | ||||
| -rw-r--r-- | firmal/.project | 23 | ||||
| -rw-r--r-- | firmal/.settings/org.eclipse.jdt.core.prefs | 15 | ||||
| -rw-r--r-- | firmal/.settings/org.eclipse.m2e.core.prefs | 4 | ||||
| -rw-r--r-- | firmal/pom.xml | 15 | ||||
| -rw-r--r-- | firmal/src/main/java/bjc/firmal/Firmal.java | 16 | ||||
| -rw-r--r-- | firmal/src/main/java/bjc/firmal/FirmalBrowser.java | 183 | ||||
| -rw-r--r-- | firmal/src/main/java/bjc/firmal/FirmalPane.java | 56 |
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; + } +} |
