X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fde%2Ftodesbaum%2Fjsite%2Fgui%2FKeyDialog.java;h=6f2c38e44f751564f0c451ca975bbb6200fbafc3;hb=7ec476fcc83a2ebe74a9faf3251d9d60fd03f58e;hp=a48d92113e3eeae9d9a14c9a12e43c7384a62331;hpb=77a43c661e9a7c2499c41c8bcee59367ce021974;p=jSite.git diff --git a/src/main/java/de/todesbaum/jsite/gui/KeyDialog.java b/src/main/java/de/todesbaum/jsite/gui/KeyDialog.java index a48d921..6f2c38e 100644 --- a/src/main/java/de/todesbaum/jsite/gui/KeyDialog.java +++ b/src/main/java/de/todesbaum/jsite/gui/KeyDialog.java @@ -1,5 +1,5 @@ /* - * jSite - KeyDialog.java - Copyright © 2010–2012 David Roden + * jSite - KeyDialog.java - Copyright © 2010–2014 David Roden * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,6 +19,7 @@ package de.todesbaum.jsite.gui; import java.awt.BorderLayout; +import java.awt.Component; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.GridBagConstraints; @@ -26,20 +27,29 @@ import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.Toolkit; import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.IOException; import java.text.MessageFormat; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.BorderFactory; +import javax.swing.DefaultListCellRenderer; import javax.swing.JButton; +import javax.swing.JComboBox; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; +import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JSeparator; @@ -47,9 +57,12 @@ import javax.swing.JTextField; import javax.swing.KeyStroke; import javax.swing.SwingConstants; +import net.pterodactylus.util.swing.ComboBoxModelList; import de.todesbaum.jsite.application.Freenet7Interface; +import de.todesbaum.jsite.application.Project; import de.todesbaum.jsite.i18n.I18n; import de.todesbaum.jsite.i18n.I18nContainer; +import de.todesbaum.util.freenet.fcp2.wot.OwnIdentity; /** * A dialog that lets the user edit the private and public key for a project. @@ -76,15 +89,33 @@ public class KeyDialog extends JDialog { /** The “Regenerate” button’s action. */ private Action generateAction; + /** The “Copy from Project” action. */ + private Action copyFromProjectAction; + + /** The “Copy from Identity” action. */ + private Action copyFromIdentityAction; + /** The text field for the private key. */ private JTextField privateKeyTextField; /** The text field for the public key. */ private JTextField publicKeyTextField; + /** The select box for the projects. */ + private JComboBox projectsComboBox; + + /** The select box for the own identities. */ + private JComboBox ownIdentitiesComboBox; + /** Whether the dialog was cancelled. */ private boolean cancelled; + /** The list of projects. */ + private final List projects = new ArrayList(); + + /** The list of own identities. */ + private final List ownIdentities = new ArrayList(); + /** * Creates a new key dialog. * @@ -162,6 +193,49 @@ public class KeyDialog extends JDialog { pack(); } + /** + * Sets the projects to display and copy URIs from. + * + * @param projects + * The list of projects + */ + public void setProjects(Collection projects) { + synchronized (this.projects) { + this.projects.clear(); + this.projects.addAll(projects); + } + projectsComboBox.setSelectedIndex(-1); + } + + /** + * Sets the own identities to display and copy URIs from. + * + * @param ownIdentities + * The list of own identities + */ + public void setOwnIdentities(Collection ownIdentities) { + synchronized (this.ownIdentities) { + this.ownIdentities.clear(); + this.ownIdentities.addAll(ownIdentities); + Collections.sort(this.ownIdentities, new Comparator() { + + @Override + public int compare(OwnIdentity leftOwnIdentity, OwnIdentity rightOwnIdentity) { + return leftOwnIdentity.getNickname().compareToIgnoreCase(rightOwnIdentity.getNickname()); + } + }); + } + int selectedIndex = -1; + int index = 0; + for (OwnIdentity ownIdentity : this.ownIdentities) { + if (ownIdentity.getInsertUri().equals(privateKey) && ownIdentity.getRequestUri().equals(publicKey)) { + selectedIndex = index; + } + index++; + } + ownIdentitiesComboBox.setSelectedIndex(selectedIndex); + } + // // ACTIONS // @@ -206,6 +280,30 @@ public class KeyDialog extends JDialog { cancelAction.putValue(Action.SHORT_DESCRIPTION, I18n.getMessage("jsite.key-dialog.button.cancel.tooltip")); cancelAction.putValue(Action.MNEMONIC_KEY, KeyEvent.VK_ESCAPE); + copyFromProjectAction = new AbstractAction(I18n.getMessage("jsite.key-dialog.button.copy-from-project")) { + + @Override + @SuppressWarnings("synthetic-access") + public void actionPerformed(ActionEvent actionevent) { + actionCopyFromProject(); + } + }; + copyFromProjectAction.putValue(Action.SHORT_DESCRIPTION, I18n.getMessage("jsite.key-dialog.button.copy-from-project.tooltip")); + copyFromProjectAction.putValue(Action.MNEMONIC_KEY, KeyEvent.VK_P); + copyFromProjectAction.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_P, InputEvent.CTRL_DOWN_MASK)); + + copyFromIdentityAction = new AbstractAction(I18n.getMessage("jsite.key-dialog.button.copy-from-identity")) { + + @Override + @SuppressWarnings("synthetic-access") + public void actionPerformed(ActionEvent actionevent) { + actionCopyFromIdentity(); + } + }; + copyFromIdentityAction.putValue(Action.SHORT_DESCRIPTION, I18n.getMessage("jsite.key-dialog.button.copy-from-identity.tooltip")); + copyFromIdentityAction.putValue(Action.MNEMONIC_KEY, KeyEvent.VK_I); + copyFromIdentityAction.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_I, InputEvent.CTRL_DOWN_MASK)); + generateAction = new AbstractAction(I18n.getMessage("jsite.key-dialog.button.generate")) { @Override @@ -236,20 +334,72 @@ public class KeyDialog extends JDialog { contentPanel.add(privateKeyLabel, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.NONE, new Insets(12, 18, 0, 0), 0, 0)); privateKeyTextField = new JTextField(); - contentPanel.add(privateKeyTextField, new GridBagConstraints(1, 1, 1, 1, 1.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(6, 12, 0, 0), 0, 0)); + contentPanel.add(privateKeyTextField, new GridBagConstraints(1, 1, 2, 1, 1.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(6, 12, 0, 0), 0, 0)); final JLabel publicKeyLabel = new JLabel(I18n.getMessage("jsite.key-dialog.label.public-key")); contentPanel.add(publicKeyLabel, new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.NONE, new Insets(6, 18, 0, 0), 0, 0)); publicKeyTextField = new JTextField(); - contentPanel.add(publicKeyTextField, new GridBagConstraints(1, 2, 1, 1, 1.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(6, 12, 0, 0), 0, 0)); + contentPanel.add(publicKeyTextField, new GridBagConstraints(1, 2, 2, 1, 1.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(6, 12, 0, 0), 0, 0)); + + final JLabel copyKeysLabel = new JLabel(I18n.getMessage("jsite.key-dialog.label.copy-keys")); + contentPanel.add(copyKeysLabel, new GridBagConstraints(0, 3, 1, 1, 0.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.NONE, new Insets(12, 0, 0, 0), 0, 0)); + + final JLabel projectLabel = new JLabel(I18n.getMessage("jsite.key-dialog.label.project")); + contentPanel.add(projectLabel, new GridBagConstraints(0, 4, 1, 1, 0.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.NONE, new Insets(12, 18, 0, 0), 0, 0)); + + projectsComboBox = new JComboBox(new ComboBoxModelList(projects)); + projectsComboBox.addActionListener(new ActionListener() { + + @Override + @SuppressWarnings("synthetic-access") + public void actionPerformed(ActionEvent actionEvent) { + copyFromProjectAction.setEnabled(projectsComboBox.getSelectedIndex() > -1); + } + + }); + contentPanel.add(projectsComboBox, new GridBagConstraints(1, 4, 1, 1, 1.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(6, 12, 0, 0), 0, 0)); + + JButton copyFromProjectButton = new JButton(copyFromProjectAction); + contentPanel.add(copyFromProjectButton, new GridBagConstraints(2, 4, 1, 1, 0.0, 0.0, GridBagConstraints.LINE_END, GridBagConstraints.HORIZONTAL, new Insets(6, 12, 0, 0), 0, 0)); + + final JLabel identityLabel = new JLabel(I18n.getMessage("jsite.key-dialog.label.identity")); + contentPanel.add(identityLabel, new GridBagConstraints(0, 5, 1, 1, 0.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.NONE, new Insets(12, 18, 0, 0), 0, 0)); + + ownIdentitiesComboBox = new JComboBox(new ComboBoxModelList(ownIdentities)); + ownIdentitiesComboBox.addActionListener(new ActionListener() { + + @Override + @SuppressWarnings("synthetic-access") + public void actionPerformed(ActionEvent actionevent) { + copyFromIdentityAction.setEnabled(ownIdentitiesComboBox.getSelectedIndex() > -1); + } + }); + ownIdentitiesComboBox.setRenderer(new DefaultListCellRenderer() { + + @Override + public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { + super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + if (value == null) { + setText(""); + } else { + OwnIdentity ownIdentity = (OwnIdentity) value; + setText(String.format("%s (%s)", ownIdentity.getNickname(), ownIdentity.getRequestUri().substring(0, ownIdentity.getRequestUri().indexOf(',')))); + } + return this; + } + }); + contentPanel.add(ownIdentitiesComboBox, new GridBagConstraints(1, 5, 1, 1, 1.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(6, 12, 0, 0), 0, 0)); + + JButton copyFromIdentityButton = new JButton(copyFromIdentityAction); + contentPanel.add(copyFromIdentityButton, new GridBagConstraints(2, 5, 1, 1, 0.0, 0.0, GridBagConstraints.LINE_END, GridBagConstraints.HORIZONTAL, new Insets(6, 12, 0, 0), 0, 0)); final JLabel actionsLabel = new JLabel(I18n.getMessage("jsite.key-dialog.label.actions")); - contentPanel.add(actionsLabel, new GridBagConstraints(0, 3, 1, 1, 0.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.NONE, new Insets(12, 0, 0, 0), 0, 0)); + contentPanel.add(actionsLabel, new GridBagConstraints(0, 6, 1, 1, 0.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.NONE, new Insets(12, 0, 0, 0), 0, 0)); JPanel actionButtonPanel = new JPanel(new FlowLayout(FlowLayout.LEADING, 12, 12)); actionButtonPanel.setBorder(BorderFactory.createEmptyBorder(-12, -12, -12, -12)); - contentPanel.add(actionButtonPanel, new GridBagConstraints(0, 4, 2, 1, 1.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.NONE, new Insets(12, 18, 0, 0), 0, 0)); + contentPanel.add(actionButtonPanel, new GridBagConstraints(0, 7, 3, 1, 1.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.HORIZONTAL, new Insets(12, 18, 0, 0), 0, 0)); actionButtonPanel.add(new JButton(generateAction)); @@ -270,6 +420,9 @@ public class KeyDialog extends JDialog { keysLabel.setText(I18n.getMessage("jsite.key-dialog.label.keys")); privateKeyLabel.setText(I18n.getMessage("jsite.key-dialog.label.private-key")); publicKeyLabel.setText(I18n.getMessage("jsite.key-dialog.label.public-key")); + copyKeysLabel.setText(I18n.getMessage("jsite.key-dialog.label.copy-keys")); + identityLabel.setText(I18n.getMessage("jsite.key-dialog.label.identity")); + projectLabel.setText(I18n.getMessage("jsite.key-dialog.label.project")); actionsLabel.setText(I18n.getMessage("jsite.key-dialog.label.actions")); } }); @@ -302,6 +455,30 @@ public class KeyDialog extends JDialog { } /** + * Copies the public and private key from the selected project. + */ + private void actionCopyFromProject() { + Project project = (Project) projectsComboBox.getSelectedItem(); + if (project == null) { + return; + } + setPublicKey(project.getRequestURI()); + setPrivateKey(project.getInsertURI()); + } + + /** + * Copies the public and private key from the selected identity. + */ + private void actionCopyFromIdentity() { + OwnIdentity ownIdentity = (OwnIdentity) ownIdentitiesComboBox.getSelectedItem(); + if (ownIdentity == null) { + return; + } + setPublicKey(ownIdentity.getRequestUri()); + setPrivateKey(ownIdentity.getInsertUri()); + } + + /** * Generates a new key pair. */ private void actionGenerate() {