summaryrefslogtreecommitdiff
path: root/src/bjc/imgchain
diff options
context:
space:
mode:
authorBenjamin Culkin <bjculkin@mix.wvu.edu>2018-04-25 12:52:52 -0700
committerBenjamin Culkin <bjculkin@mix.wvu.edu>2018-04-25 12:52:59 -0700
commit697bc0bae293a9f31c00f6e10f33955151228f64 (patch)
tree500b7c9b881972e1d7b78017c39659e060701877 /src/bjc/imgchain
Initial commit
Diffstat (limited to 'src/bjc/imgchain')
-rw-r--r--src/bjc/imgchain/ImgChain.java126
-rw-r--r--src/bjc/imgchain/ImgViewer.java200
-rw-r--r--src/bjc/imgchain/utils/SimpleInputPanel.java45
3 files changed, 371 insertions, 0 deletions
diff --git a/src/bjc/imgchain/ImgChain.java b/src/bjc/imgchain/ImgChain.java
new file mode 100644
index 0000000..f90ae78
--- /dev/null
+++ b/src/bjc/imgchain/ImgChain.java
@@ -0,0 +1,126 @@
+package bjc.imgchain;
+
+import java.awt.GridLayout;
+import java.awt.Image;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.swing.JDesktopPane;
+import javax.swing.JFileChooser;
+import javax.swing.JFrame;
+import javax.swing.JMenu;
+import javax.swing.JMenuBar;
+import javax.swing.JMenuItem;
+import javax.swing.JOptionPane;
+
+public class ImgChain {
+ private final class LoadImageListener implements ActionListener {
+ @Override
+ public void actionPerformed(ActionEvent ev) {
+ JFileChooser jfc = new JFileChooser();
+ jfc.setMultiSelectionEnabled(true);
+
+ int res = jfc.showOpenDialog(desktop);
+
+ if (res != JFileChooser.APPROVE_OPTION) {
+ return;
+ }
+
+ for (File fle : jfc.getSelectedFiles()) {
+ ImgViewer view = new ImgViewer(ImgChain.this, fle);
+
+ if (view.isInitialized()) {
+ desktop.add(view);
+ view.setVisible(true);
+ }
+ }
+ }
+ }
+
+ private JDesktopPane desktop;
+
+ private Map<String, Image> imageRepo;
+
+ public static void main(String[] args) {
+ System.out.println("ImgChain Loading...");
+
+ ImgChain chn = new ImgChain();
+
+ chn.setupGUI();
+ }
+
+ public ImgChain() {
+ imageRepo = new HashMap<>();
+ }
+
+ private void setupGUI() {
+ JFrame frame = new JFrame("ImgChain v1");
+ frame.setLayout(new GridLayout(1, 1));
+
+ desktop = new JDesktopPane();
+
+ JMenuBar menu = setupMenubar(frame);
+
+ frame.setJMenuBar(menu);
+
+ frame.add(desktop);
+
+ frame.setSize(640, 480);
+
+ frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
+
+ frame.setVisible(true);
+ }
+
+ private JMenuBar setupMenubar(JFrame frame) {
+ JMenuBar menu = new JMenuBar();
+
+ JMenu fileMenu = new JMenu("File");
+ fileMenu.setMnemonic('F');
+
+ JMenuItem aboutItem = new JMenuItem("About");
+ aboutItem.setMnemonic('A');
+ aboutItem.addActionListener((ev) -> {
+ JOptionPane.showMessageDialog(frame, "ImgChain v1\nDeveloped by Benjamin Culkin",
+ "About ImgChain", JOptionPane.INFORMATION_MESSAGE);
+ });
+
+ JMenuItem closeItem = new JMenuItem("Close");
+ closeItem.setMnemonic('C');
+ closeItem.addActionListener((ev) -> {
+ frame.dispose();
+ });
+
+ fileMenu.add(aboutItem);
+ fileMenu.addSeparator();
+ fileMenu.add(closeItem);
+
+ JMenu imageMenu = new JMenu("Images");
+ imageMenu.setMnemonic('I');
+
+ JMenuItem loadImage = new JMenuItem("Load Images...");
+ loadImage.setMnemonic('L');
+ loadImage.addActionListener(new LoadImageListener());
+
+ imageMenu.add(loadImage);
+
+ menu.add(fileMenu);
+ menu.add(imageMenu);
+ return menu;
+ }
+
+ public void addImage(String name, Image img) {
+ if (imageRepo.containsKey(name)) {
+ String msg = String.format("Are you sure you want to overwrite stored image '%s'?", name);
+
+ if (JOptionPane.showInternalConfirmDialog(desktop, msg) != JOptionPane.OK_OPTION) {
+ return;
+ }
+ }
+
+ imageRepo.put(name, img);
+ }
+}
diff --git a/src/bjc/imgchain/ImgViewer.java b/src/bjc/imgchain/ImgViewer.java
new file mode 100644
index 0000000..39586a8
--- /dev/null
+++ b/src/bjc/imgchain/ImgViewer.java
@@ -0,0 +1,200 @@
+package bjc.imgchain;
+
+import java.awt.GridLayout;
+import java.awt.Image;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.File;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import javax.imageio.ImageIO;
+import javax.swing.*;
+
+import bjc.imgchain.utils.SimpleInputPanel;
+
+public class ImgViewer extends JInternalFrame {
+ private final class ScaleImageListener implements ActionListener {
+ @Override
+ public void actionPerformed(ActionEvent ev) {
+ int height = Integer.parseInt(JOptionPane.showInputDialog("Enter new image height"));
+ int width = Integer.parseInt(JOptionPane.showInputDialog("Enter new image width"));
+
+ icon.setImage(icon.getImage().getScaledInstance(width, height, Image.SCALE_DEFAULT));
+
+ repaint();
+ }
+ }
+
+ private final class ReloadImageListener implements ActionListener {
+ private final File img;
+
+ private ReloadImageListener(File img) {
+ this.img = img;
+ }
+
+ @Override
+ public void actionPerformed(ActionEvent ev) {
+ try {
+ icon.setImage(ImageIO.read(img));
+ } catch (IOException e) {
+ String msg = String.format("Error: Could not load image %s", img.getPath());
+
+ System.out.printf("%s\n", msg);
+
+ e.printStackTrace();
+
+ JOptionPane.showInternalMessageDialog(ImgViewer.this, msg, "Error loading image",
+ JOptionPane.ERROR_MESSAGE);
+ }
+ }
+ }
+
+ private final class ChangeImageListener implements ActionListener {
+ @Override
+ public void actionPerformed(ActionEvent ev) {
+ JFileChooser jfc = new JFileChooser();
+ jfc.setMultiSelectionEnabled(false);
+
+ int res = jfc.showOpenDialog(ImgViewer.this);
+
+ if (res != JFileChooser.APPROVE_OPTION) {
+ return;
+ }
+
+ try {
+ File tmp = jfc.getSelectedFile();
+
+ icon.setImage(ImageIO.read(tmp));
+
+ img = tmp;
+ } catch (IOException e) {
+ String msg = String.format("Error: Could not load image %s", img.getPath());
+
+ System.out.printf("%s\n", msg);
+
+ e.printStackTrace();
+
+ JOptionPane.showInternalMessageDialog(null, msg, "Error loading image",
+ JOptionPane.ERROR_MESSAGE);
+ }
+ }
+ }
+
+ private static final long serialVersionUID = -4727584150861526435L;
+
+ private File img;
+
+ private boolean initted;
+
+ private ImageIcon icon;
+
+ private ImgChain desktop;
+
+ public ImgViewer(ImgChain desk, File img) {
+ super("Image Viewer - " + img.getName(), true, true, true, true);
+ initted = false;
+
+ this.img = img;
+ this.desktop = desk;
+
+ initted = setupGUI(img);
+ }
+
+ private boolean setupGUI(File img) {
+ setSize(320, 240);
+ setLayout(new GridLayout(1, 1));
+
+ JMenuBar bar = setupMenubar(img);
+
+ setJMenuBar(bar);
+
+ JLabel lab = loadLabel(img);
+ if (lab == null) {
+ return false;
+ }
+
+ add(lab);
+
+ return true;
+ }
+
+ private JMenuBar setupMenubar(File img) {
+ JMenuBar bar = new JMenuBar();
+
+ JMenu fileMenu = new JMenu("File");
+ fileMenu.setMnemonic('F');
+
+ JMenuItem changeImage = new JMenuItem("Change Image");
+ changeImage.setMnemonic('C');
+ changeImage.addActionListener(new ChangeImageListener());
+
+ JMenuItem reloadImage = new JMenuItem("Reload Image");
+ reloadImage.setMnemonic('R');
+ reloadImage.addActionListener(new ReloadImageListener(img));
+
+ JMenuItem storeImage = new JMenuItem("Store Image");
+ storeImage.setMnemonic('S');
+ storeImage.addActionListener((ev) -> {
+ String inp = JOptionPane.showInternalInputDialog(this, "Enter name to store image under");
+
+ if(inp == null) return;
+
+ inp = inp.trim();
+
+ if(inp.equals("")) {
+ return;
+ }
+
+ desktop.addImage(inp, icon.getImage());
+ });
+
+ fileMenu.add(changeImage);
+ fileMenu.add(reloadImage);
+ fileMenu.addSeparator();
+ fileMenu.add(storeImage);
+
+ JMenu editMenu = new JMenu("Edit Image");
+ editMenu.setMnemonic('E');
+
+ JMenuItem scaleImage = new JMenuItem("Scale Image");
+ scaleImage.setMnemonic('S');
+ scaleImage.addActionListener(new ScaleImageListener());
+
+ editMenu.add(scaleImage);
+
+ bar.add(fileMenu);
+ bar.add(editMenu);
+ return bar;
+ }
+
+ private JLabel loadLabel(File img) {
+ JLabel lab = null;
+
+ try {
+ URL imgURL = img.toURI().toURL();
+
+ icon = new ImageIcon(imgURL);
+
+ setSize(icon.getIconWidth(), icon.getIconHeight());
+
+ lab = new JLabel(icon);
+ } catch (MalformedURLException e) {
+ String msg = String.format("Error: Could not load image %s", img.getPath());
+
+ System.out.printf("%s\n", msg);
+
+ e.printStackTrace();
+
+ JOptionPane.showInternalMessageDialog(this, msg, "Error loading image",
+ JOptionPane.ERROR_MESSAGE);
+ }
+
+ return lab;
+ }
+
+ public boolean isInitialized() {
+ return initted;
+ }
+}
diff --git a/src/bjc/imgchain/utils/SimpleInputPanel.java b/src/bjc/imgchain/utils/SimpleInputPanel.java
new file mode 100644
index 0000000..413786a
--- /dev/null
+++ b/src/bjc/imgchain/utils/SimpleInputPanel.java
@@ -0,0 +1,45 @@
+package bjc.imgchain.utils;
+
+import java.awt.BorderLayout;
+
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JTextField;
+
+/**
+ * A simple component for text input
+ *
+ * @author ben
+ *
+ */
+public class SimpleInputPanel extends JPanel {
+ private static final long serialVersionUID = -4734279623645236868L;
+
+ /**
+ * The text field containing the input value
+ */
+ public final JTextField inputValue;
+
+ /**
+ * Create a new input panel
+ *
+ * @param label
+ * The label for the field
+ * @param columns
+ * The number of columns of text input to take
+ */
+ public SimpleInputPanel(final String label, final int columns) {
+ setLayout(new BorderLayout());
+
+ final JLabel inputLabel = new JLabel(label);
+
+ if (columns < 1) {
+ inputValue = new JTextField();
+ } else {
+ inputValue = new JTextField(columns);
+ }
+
+ add(inputLabel, BorderLayout.LINE_START);
+ add(inputValue, BorderLayout.CENTER);
+ }
+}