/* * * Panbox - encryption for cloud storage * Copyright (C) 2014-2015 by Fraunhofer SIT and Sirrix AG * * 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/>. * * Additonally, third party code may be provided with notices and open source * licenses from communities and third parties that govern the use of those * portions, and any licenses granted hereunder do not alter any rights and * obligations you may have under such open source licenses, however, the * disclaimer of warranty and limitation of liability provisions of the GPLv3 * will apply to all the product. * */ package org.panbox.desktop.common.gui; import ezvcard.VCard; import ezvcard.property.StructuredName; import org.panbox.Settings; import org.panbox.core.identitymgmt.AbstractAddressbookManager; import org.panbox.desktop.common.PanboxClient; import javax.swing.*; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.filechooser.FileNameExtensionFilter; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.DefaultTableModel; import java.awt.*; import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.ResourceBundle; /** * @author palige * * Dialog for importing contacts from a VCard */ public class ImportIdentitiesWoPINDialog extends javax.swing.JDialog { private static final long serialVersionUID = 7665762037632230830L; private PanboxClient client; private static final ResourceBundle bundle = ResourceBundle.getBundle( "org/panbox/desktop/common/gui/Messages", Settings.getInstance() .getLocale()); // NOI18N private ListSelectionListener contactSelectionListener = new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent e) { checkImportability(); } }; private class VCardNameTableCellRenderer extends DefaultTableCellRenderer { /** * */ private static final long serialVersionUID = 6913177900407781180L; @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if (value instanceof VCard) { VCard vc = (VCard) value; StructuredName sn = vc.getStructuredName(); String name = sn.getGiven() + " " + sn.getFamily() + " (" + vc.getEmails().get(0).getValue() + ")"; return super.getTableCellRendererComponent(table, name, isSelected, hasFocus, row, column); } else { return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); } } } /** * Creates new form ImportIdentitiesDialog */ public ImportIdentitiesWoPINDialog(PanboxClient client) { super(client.getMainWindow()); this.client = client; initComponents(); trustExporterVerifications.setVisible(false); importContactsTable.getSelectionModel().addListSelectionListener( contactSelectionListener); } public ImportIdentitiesWoPINDialog(PanboxClient client, File identityFile) { this(client); fileLocTextField.setText(identityFile.getAbsolutePath()); loadVCardFile(identityFile); } private void checkImportability() { ListSelectionModel model = (ListSelectionModel) importContactsTable .getSelectionModel(); if ((importContactsTable.getRowCount() > 0) && (!model.isSelectionEmpty())) { importButton.setEnabled(true); return; } importButton.setEnabled(false); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ // <editor-fold defaultstate="collapsed" // desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { fileLocLabel = new javax.swing.JLabel(); fileLocTextField = new javax.swing.JTextField(); fileLocButton = new javax.swing.JButton(); verificationStateLabel = new javax.swing.JLabel(); trustExporterVerifications = new javax.swing.JCheckBox(); contactsPanel = new javax.swing.JPanel(); jScrollPane2 = new javax.swing.JScrollPane(); importContactsTable = new javax.swing.JTable(); importButton = new javax.swing.JButton(); cancelButton = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); java.util.ResourceBundle bundle = java.util.ResourceBundle .getBundle("org/panbox/desktop/common/gui/Messages"); // NOI18N setTitle(bundle.getString("ImportIdentitiesDialog.title")); // NOI18N setModal(true); setResizable(false); fileLocLabel.setText(bundle .getString("ImportIdentitiesDialog.fileLocLabel")); // NOI18N fileLocTextField.setEditable(false); fileLocTextField.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { fileLocTextFieldActionPerformed(evt); } }); fileLocButton.setText(bundle .getString("ImportIdentitiesDialog.fileLocButton")); // NOI18N fileLocButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { fileLocButtonActionPerformed(evt); } }); trustExporterVerifications.setText(bundle .getString("ImportIdentitiesDialog.importPINCheckbox")); // NOI18N contactsPanel .setBorder(javax.swing.BorderFactory.createTitledBorder(bundle .getString("ImportIdentitiesDialog.contactsPanel.title"))); // NOI18N importContactsTable.setModel(new javax.swing.table.DefaultTableModel( new Object[][] { }, new String[] { "Contact name" }) { private static final long serialVersionUID = -3283259237115777830L; @SuppressWarnings("rawtypes") Class[] types = new Class[] { java.lang.String.class }; boolean[] canEdit = new boolean[] { false }; @SuppressWarnings({ "rawtypes", "unchecked" }) public Class getColumnClass(int columnIndex) { return types[columnIndex]; } public boolean isCellEditable(int rowIndex, int columnIndex) { return canEdit[columnIndex]; } }); importContactsTable.getTableHeader().setReorderingAllowed(false); jScrollPane2.setViewportView(importContactsTable); importContactsTable .getColumnModel() .getSelectionModel() .setSelectionMode( javax.swing.ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); if (importContactsTable.getColumnModel().getColumnCount() > 0) { importContactsTable.getColumnModel().getColumn(0) .setResizable(false); importContactsTable.getColumnModel().getColumn(0) .setPreferredWidth(140); importContactsTable .getColumnModel() .getColumn(0) .setHeaderValue( bundle.getString("ImportIdentitiesDialog.importContactsTable.columnname")); // NOI18N importContactsTable.getColumnModel().getColumn(0) .setCellRenderer(new VCardNameTableCellRenderer()); } javax.swing.GroupLayout contactsPanelLayout = new javax.swing.GroupLayout( contactsPanel); contactsPanel.setLayout(contactsPanelLayout); contactsPanelLayout.setHorizontalGroup(contactsPanelLayout .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup( contactsPanelLayout .createSequentialGroup() .addContainerGap() .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE).addContainerGap())); contactsPanelLayout .setVerticalGroup(contactsPanelLayout .createParallelGroup( javax.swing.GroupLayout.Alignment.LEADING) .addGroup( contactsPanelLayout .createSequentialGroup() .addComponent( jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 311, Short.MAX_VALUE) .addContainerGap())); importButton.setText(bundle .getString("ImportIdentitiesDialog.importButton")); // NOI18N importButton.setEnabled(false); importButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { importButtonActionPerformed(evt); } }); cancelButton.setText(bundle .getString("ImportIdentitiesDialog.cancelButton")); // NOI18N cancelButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { cancelButtonActionPerformed(evt); } }); javax.swing.GroupLayout layout = new javax.swing.GroupLayout( getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup(layout .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup( javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addContainerGap() .addGroup( layout.createParallelGroup( javax.swing.GroupLayout.Alignment.TRAILING) .addComponent( trustExporterVerifications, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup( javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() .addGroup( layout.createParallelGroup( javax.swing.GroupLayout.Alignment.TRAILING) .addGroup( javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() .addGap(387, 387, 387) .addComponent( verificationStateLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addGroup( javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() .addComponent( fileLocLabel) .addPreferredGap( javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent( fileLocTextField) .addGap(6, 6, 6))) .addGap(14, 14, 14) .addComponent( fileLocButton)) .addComponent( contactsPanel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup( layout.createSequentialGroup() .addComponent( importButton) .addPreferredGap( javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent( cancelButton))) .addContainerGap())); layout.setVerticalGroup(layout .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup( javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addContainerGap() .addGroup( layout.createParallelGroup( javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(fileLocLabel) .addComponent( fileLocTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(fileLocButton)) .addPreferredGap( javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(trustExporterVerifications) .addGap(12, 12, 12) .addComponent(contactsPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap( javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(verificationStateLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addPreferredGap( javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup( layout.createParallelGroup( javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(cancelButton) .addComponent(importButton)) .addContainerGap())); pack(); }// </editor-fold>//GEN-END:initComponents private boolean isVCFVerified; private void loadVCardFile(File vcardFile) { if (!vcardFile.exists() || !vcardFile.canRead()) { JOptionPane.showMessageDialog(this, bundle.getString("cannot.read.vcard.file"), bundle.getString("error"), JOptionPane.ERROR_MESSAGE); } else { // load table values VCard[] vclist = null; // only continue if there are any VCards .. if (((vclist = AbstractAddressbookManager.readVCardFile(vcardFile)) != null) && (vclist.length > 0)) { // remove all existing entries before loading any // new ones DefaultTableModel tableModel = (DefaultTableModel) importContactsTable .getModel(); tableModel.setRowCount(0); for (VCard vc : vclist) { if (AbstractAddressbookManager.vcard2Contact(vc, false) .getCertEnc() == null || AbstractAddressbookManager.vcard2Contact(vc, false).getCertSign() == null) { importContactsTable.setModel(new DefaultTableModel()); JOptionPane.showMessageDialog(this, bundle.getString("error.no.panbox.vcard.file"), bundle.getString("error"), JOptionPane.ERROR_MESSAGE); return; } tableModel.addRow(new Object[] { vc }); } } else { JOptionPane.showMessageDialog(this, bundle.getString("error.reading.contacts.file"), bundle.getString("error"), JOptionPane.ERROR_MESSAGE); } this.fileLocTextField.setText(vcardFile.getAbsolutePath()); } } private void fileLocTextFieldActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_fileLocButtonActionPerformed // File file = new File(fileLocTextField.getText()); // if(!file.exists()) { // // } // loadVCardFile(file); }// GEN-LAST:event_fileLocButtonActionPerformed private void fileLocButtonActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_fileLocButtonActionPerformed JFileChooser fileChooser = new JFileChooser(); FileNameExtensionFilter filter = new FileNameExtensionFilter( "Vcard file (.vcf)", "vcf"); fileChooser.setFileFilter(filter); fileChooser.setMultiSelectionEnabled(false); if (fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { loadVCardFile(fileChooser.getSelectedFile()); } }// GEN-LAST:event_fileLocButtonActionPerformed private void importButtonActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_importButtonActionPerformed // get selected items from list and try to start import .. List<VCard> selectedContacts = new ArrayList<VCard>(); DefaultTableModel tableModel = (DefaultTableModel) importContactsTable .getModel(); if (tableModel.getRowCount() == 0) { JOptionPane.showMessageDialog(this, bundle.getString("list.of.contacts.is.empty"), bundle.getString("error"), JOptionPane.ERROR_MESSAGE); } else { int[] sel = importContactsTable.getSelectedRows(); for (int i = 0; i < sel.length; i++) { VCard v = (VCard) tableModel.getValueAt(sel[i], 0); selectedContacts.add(v); } if (selectedContacts.size() == 0) { JOptionPane.showMessageDialog(this, bundle.getString("no.contacts.selected"), bundle.getString("error"), JOptionPane.ERROR_MESSAGE); } else { // start import of selected contacts client.importContacts(selectedContacts .toArray(new VCard[selectedContacts.size()]), isVCFVerified); this.dispose(); } for (VCard vc : selectedContacts) { System.out.println(vc.getStructuredName().getFamily()); } } }// GEN-LAST:event_importButtonActionPerformed private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_cancelButtonActionPerformed this.dispose(); }// GEN-LAST:event_cancelButtonActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton cancelButton; private javax.swing.JPanel contactsPanel; private javax.swing.JButton fileLocButton; private javax.swing.JLabel fileLocLabel; private javax.swing.JTextField fileLocTextField; private javax.swing.JButton importButton; private javax.swing.JTable importContactsTable; private javax.swing.JScrollPane jScrollPane2; private javax.swing.JCheckBox trustExporterVerifications; private javax.swing.JLabel verificationStateLabel; // End of variables declaration//GEN-END:variables }