/* * Copyright (C) 2011 Ives van der Flaas * * 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 * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package be.ac.ua.comp.scarletnebula.gui; import java.awt.BorderLayout; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Collection; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.SwingWorker; import javax.swing.border.BevelBorder; import be.ac.ua.comp.scarletnebula.core.CloudProvider; import be.ac.ua.comp.scarletnebula.gui.keywizards.ImportKeyWizard; import be.ac.ua.comp.scarletnebula.gui.keywizards.KeyRecorder; import be.ac.ua.comp.scarletnebula.gui.keywizards.NewKeyWizard; import be.ac.ua.comp.scarletnebula.misc.Utils; import be.ac.ua.comp.scarletnebula.wizard.DataRecorder; import be.ac.ua.comp.scarletnebula.wizard.WizardListener; public class InteractiveKeyPanel extends JPanel { private final class AddKeyActionListener implements ActionListener { private final CloudProvider provider; private AddKeyActionListener(final CloudProvider provider) { this.provider = provider; } @Override public void actionPerformed(final ActionEvent e) { final NewKeyWizard wiz = new NewKeyWizard( (JDialog) Utils.findWindow(InteractiveKeyPanel.this), provider); wiz.addWizardListener(new AddToListWizardListener()); wiz.start(); } } private final class ModifySelectedActionListener implements ActionListener { private final CloudProvider provider; private ModifySelectedActionListener(final CloudProvider provider) { this.provider = provider; } @Override public void actionPerformed(final ActionEvent e) { final ImportKeyWizard wiz = new ImportKeyWizard( (JDialog) Utils.findWindow(InteractiveKeyPanel.this), provider); wiz.addWizardListener(new AddToListWizardListener()); wiz.start(); } } private final class RemoveSelectedActionListener implements ActionListener { private final CloudProvider provider; private RemoveSelectedActionListener(final CloudProvider provider) { this.provider = provider; } @Override public void actionPerformed(final ActionEvent e) { final Collection<String> keynames = keylist.getSelection(); final String options[] = { "Delete key" + (keynames.size() > 1 ? "s" : ""), "Cancel" }; if (!keynames.isEmpty()) { final int result = JOptionPane .showOptionDialog( InteractiveKeyPanel.this, "Deleting " + (keynames.size() > 1 ? "keys" : "a key") + " will permanently remove it both locally and on the remote CloudProvider.\nProceed?", "Remove key", JOptionPane.OK_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE, null, options, options[0]); if (result == JOptionPane.OK_OPTION) { for (final String key : keynames) { keylist.removeKey(key); } keylist.assureDefaultKey(); (new SwingWorker<Object, Object>() { @Override protected Exception doInBackground() throws Exception { try { for (final String key : keynames) { provider.deleteKey(key); } } catch (final Exception ignore) { // If the key can't be deleted, just leave it... } return null; } }).execute(); } } } } private final class AddToListWizardListener implements WizardListener { private AddToListWizardListener() { } @Override public void onFinish(final DataRecorder recorder) { final KeyRecorder rec = (KeyRecorder) recorder; keylist.add(rec.keyname, rec.makeDefault); } @Override public void onCancel(final DataRecorder recorder) { } } private static final long serialVersionUID = 1L; private KeylistWithDefault keylist; public InteractiveKeyPanel(final CloudProvider provider) { super(new BorderLayout()); placeComponents(provider); } private final void placeComponents(final CloudProvider provider) { final JButton addButton = new JButton(Utils.icon("add22.png")); addButton.addActionListener(new AddKeyActionListener(provider)); final JButton modifyButton = new JButton("Import Key"); modifyButton.addActionListener(new ModifySelectedActionListener( provider)); final JButton removeButton = new JButton(Utils.icon("remove22.png")); removeButton.addActionListener(new RemoveSelectedActionListener( provider)); keylist = new KeylistWithDefault(provider); final JScrollPane keylistScrollPane = new JScrollPane(keylist); keylistScrollPane.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createEmptyBorder(15, 20, 15, 20), BorderFactory.createBevelBorder(BevelBorder.LOWERED))); add(keylistScrollPane, BorderLayout.CENTER); final JPanel buttonPanel = new JPanel(); buttonPanel.setLayout(new GridBagLayout()); buttonPanel.setBorder(BorderFactory.createEmptyBorder(0, 20, 20, 20)); final GridBagConstraints c = new GridBagConstraints(); c.weighty = 1.0; c.fill = GridBagConstraints.VERTICAL; c.gridx = 0; c.gridy = 0; buttonPanel.add(addButton, c); c.gridx = 1; buttonPanel.add(modifyButton, c); c.gridx = 2; buttonPanel.add(removeButton, c); add(buttonPanel, BorderLayout.SOUTH); } }