X-Git-Url: https://git.pterodactylus.net/?p=jkeytool.git;a=blobdiff_plain;f=src%2Fnet%2Fpterodactylus%2Fjkeytool%2Fgui%2FMainFrame.java;h=cd6052a943109610d0b6bbf2c2d07d3f9fc940a9;hp=749a80116fac91da8acdc522365509fd6051a939;hb=a472334662c884abba8d2c1d47bed9f0c11525d3;hpb=027dedb5560859fe63d2fff3fe1e83cf0fea7123 diff --git a/src/net/pterodactylus/jkeytool/gui/MainFrame.java b/src/net/pterodactylus/jkeytool/gui/MainFrame.java index 749a801..cd6052a 100644 --- a/src/net/pterodactylus/jkeytool/gui/MainFrame.java +++ b/src/net/pterodactylus/jkeytool/gui/MainFrame.java @@ -19,8 +19,28 @@ package net.pterodactylus.jkeytool.gui; +import java.awt.event.ActionEvent; +import java.awt.event.InputEvent; +import java.awt.event.KeyEvent; +import java.awt.event.WindowEvent; +import java.awt.event.WindowListener; +import java.beans.PropertyVetoException; +import java.io.File; +import java.security.KeyStore; + +import javax.swing.AbstractAction; +import javax.swing.Action; +import javax.swing.JDesktopPane; +import javax.swing.JFileChooser; import javax.swing.JFrame; +import javax.swing.JInternalFrame; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JOptionPane; +import javax.swing.KeyStroke; +import net.pterodactylus.jkeytool.core.Core; +import net.pterodactylus.jkeytool.core.CoreListener; import net.pterodactylus.jkeytool.main.Main; /** @@ -28,16 +48,44 @@ import net.pterodactylus.jkeytool.main.Main; * * @author David Roden <droden@gmail.com> */ -public class MainFrame { +public class MainFrame implements CoreListener, WindowListener { + + /** Object used for synchronization. */ + private final Object syncObject = new Object(); /** The main frame. */ private final JFrame mainFrame; + /** The main frame’s desktop. */ + private final JDesktopPane desktop; + + /** The jkeytool core. */ + private final Core core; + + /** The “File -> Quit” action. */ + private Action fileQuitAction; + + /** The “open keystore” action. */ + private Action openKeystoreAction; + + /** The last directory when opening keystores. */ + private File lastOpenKeystoreDirectory = null; + /** * Creates a new jkeytool main frame. + * + * @param core + * The core of the jkeytool application */ - public MainFrame() { + public MainFrame(Core core) { + this.core = core; mainFrame = new JFrame("jkeytool " + Main.getVersion()); + constructActions(); + mainFrame.setJMenuBar(constructMenuBar()); + mainFrame.addWindowListener(this); + desktop = new JDesktopPane(); + mainFrame.setContentPane(desktop); + mainFrame.pack(); } // @@ -51,4 +99,248 @@ public class MainFrame { mainFrame.setVisible(true); } + // + // PRIVATE METHODS + // + + /** + * Constructs all actions. + */ + private void constructActions() { + fileQuitAction = new AbstractAction("Quit") { + + /** + * {@inheritDoc} + */ + @SuppressWarnings("synthetic-access") + public void actionPerformed(ActionEvent actionEvent) { + actionFileQuit(); + } + }; + fileQuitAction.putValue(Action.MNEMONIC_KEY, KeyEvent.VK_Q); + fileQuitAction.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_Q, InputEvent.CTRL_DOWN_MASK)); + + openKeystoreAction = new AbstractAction("Open Keystore") { + + @SuppressWarnings("synthetic-access") + public void actionPerformed(ActionEvent actionEvent) { + actionKeystoreOpen(); + } + }; + openKeystoreAction.putValue(Action.MNEMONIC_KEY, KeyEvent.VK_O); + openKeystoreAction.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_DOWN_MASK)); + } + + /** + * Creates the menu bar. + * + * @return The menu bar + */ + private JMenuBar constructMenuBar() { + JMenuBar menuBar = new JMenuBar(); + + menuBar.add(constructFileMenu()); + menuBar.add(constructKeystoreMenu()); + + return menuBar; + } + + /** + * Creates the “File” menu. + * + * @return The “File” menu + */ + private JMenu constructFileMenu() { + JMenu fileMenu = new JMenu("File"); + + fileMenu.add(fileQuitAction); + + return fileMenu; + } + + /** + * Creates the “Key Store” menu. + * + * @return The “Key Store” menu + */ + private JMenu constructKeystoreMenu() { + JMenu keystoreMenu = new JMenu("Key Store"); + + keystoreMenu.add(constructNewKeystoreTypeMenu()); + keystoreMenu.add(openKeystoreAction); + + return keystoreMenu; + } + + /** + * Creates a new menu containing all the types for new key stores. + * + * @return A menu containing all new key store types + */ + private JMenu constructNewKeystoreTypeMenu() { + JMenu keystoreTypeMenu = new JMenu("New Key Store"); + keystoreTypeMenu.setMnemonic(KeyEvent.VK_N); + + for (final String keystoreType : new String[] { "JKS", "PKCS12" }) { + Action keystoreTypeAction = new AbstractAction(keystoreType) { + + /** + * {@inheritDoc} + */ + @SuppressWarnings("synthetic-access") + public void actionPerformed(ActionEvent actionEvent) { + actionNewKeystore(keystoreType); + } + }; + keystoreTypeMenu.add(keystoreTypeAction); + } + + return keystoreTypeMenu; + } + + private void constructKeyStoreWindow(KeyStore keyStore) { + JInternalFrame internalFrame = new JInternalFrame("Key Store (" + keyStore.getType() + ")", true, true, true, true); + internalFrame.getContentPane().add(new ListKeyStorePanel(keyStore)); + internalFrame.setBounds(10, 10, 200, 200); + desktop.add(internalFrame); + internalFrame.setVisible(true); + try { + internalFrame.setSelected(true); + } catch (PropertyVetoException pve1) { + pve1.printStackTrace(); + } + } + + // + // PRIVATE ACTIONS + // + + /** + * Quits the program. + */ + private void actionFileQuit() { + /* TODO - ask for confirmation. */ + System.exit(0); + } + + /** + * Shows a file selection dialog and loads a keystore from a file. + */ + private void actionKeystoreOpen() { + File directory; + synchronized (syncObject) { + if (lastOpenKeystoreDirectory == null) { + lastOpenKeystoreDirectory = new File("."); + } + directory = lastOpenKeystoreDirectory; + } + JFileChooser fileChooser = new JFileChooser(directory); + fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY); + fileChooser.setMultiSelectionEnabled(false); + int returnedOption = fileChooser.showOpenDialog(mainFrame); + if (returnedOption != JFileChooser.APPROVE_OPTION) { + return; + } + core.loadKeyStore(fileChooser.getSelectedFile()); + synchronized (syncObject) { + lastOpenKeystoreDirectory = fileChooser.getCurrentDirectory(); + } + } + + /** + * Tells the core to create a new key store. + * + * @see Core#createKeyStore(String) + * @param keystoreType + * The type of the key store + */ + private void actionNewKeystore(String keystoreType) { + core.createKeyStore(keystoreType); + } + + // + // INTERFACE CoreListener + // + + /** + * {@inheritDoc} + */ + public void keyStoreCreated(KeyStore keyStore) { + constructKeyStoreWindow(keyStore); + } + + /** + * {@inheritDoc} + */ + public void keyStoreNotCreated(String keyStoreType, Throwable reason) { + JOptionPane.showMessageDialog(mainFrame, "Could not create a key store of type “" + keyStoreType + "”.", "Could Not Create Key Store", JOptionPane.ERROR_MESSAGE); + } + + /** + * {@inheritDoc} + */ + public void keyStoreLoaded(File keyStoreFile, KeyStore keyStore) { + constructKeyStoreWindow(keyStore); + } + + /** + * {@inheritDoc} + */ + public void keyStoreNotLoaded(File keyStoreFile) { + JOptionPane.showMessageDialog(mainFrame, "Could not load key store from “" + keyStoreFile.getName() + "”.", "Could Not Load Key Store", JOptionPane.ERROR_MESSAGE); + } + + // + // INTERFACE WindowListener + // + + /** + * {@inheritDoc} + */ + public void windowActivated(WindowEvent e) { + /* ignore. */ + } + + /** + * {@inheritDoc} + */ + public void windowClosed(WindowEvent e) { + /* ignore. */ + } + + /** + * {@inheritDoc} + */ + public void windowClosing(WindowEvent e) { + System.exit(0); + } + + /** + * {@inheritDoc} + */ + public void windowDeactivated(WindowEvent e) { + /* ignore. */ + } + + /** + * {@inheritDoc} + */ + public void windowDeiconified(WindowEvent e) { + /* ignore. */ + } + + /** + * {@inheritDoc} + */ + public void windowIconified(WindowEvent e) { + /* ignore. */ + } + + /** + * {@inheritDoc} + */ + public void windowOpened(WindowEvent e) { + /* ignore. */ + } + }