org.panbox.desktop.common.gui.AddContactToShareWizard.java Source code

Java tutorial

Introduction

Here is the source code for org.panbox.desktop.common.gui.AddContactToShareWizard.java

Source

/*
 * 
 *               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 java.awt.TrayIcon.MessageType;
import java.io.File;
import java.net.URI;
import java.security.UnrecoverableKeyException;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;

import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SizeRequirements;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.text.Element;
import javax.swing.text.View;
import javax.swing.text.ViewFactory;
import javax.swing.text.html.HTMLEditorKit;
import javax.swing.text.html.InlineView;
import javax.swing.text.html.ParagraphView;

import org.apache.commons.io.FilenameUtils;
import org.apache.log4j.Logger;
import org.panbox.Settings;
import org.panbox.core.Utils;
import org.panbox.core.csp.CSPAdapterFactory;
import org.panbox.core.csp.StorageBackendType;
import org.panbox.core.exception.ShareMetaDataException;
import org.panbox.desktop.common.PanboxClient;
import org.panbox.desktop.common.gui.PasswordEnterDialog.PermissionType;
import org.panbox.desktop.common.gui.addressbook.ContactListCellRenderer;
import org.panbox.desktop.common.gui.addressbook.ContactListModel;
import org.panbox.desktop.common.gui.addressbook.ContactShareParticipant;
import org.panbox.desktop.common.gui.addressbook.PanboxGUIContact;
import org.panbox.desktop.common.gui.addressbook.PanboxMyContact;
import org.panbox.desktop.common.gui.shares.PanboxShare;
import org.panbox.desktop.common.sharemgmt.ShareDoesNotExistException;
import org.panbox.desktop.common.sharemgmt.ShareManagerException;
import org.panbox.desktop.common.urihandler.PanboxURICmdShareInvitation;
import org.panbox.desktop.common.utils.DesktopApi;
import org.panbox.desktop.common.vfs.backend.dropbox.CSPApiException;
import org.panbox.desktop.common.vfs.backend.dropbox.DropboxAPIIntegration;

public class AddContactToShareWizard extends javax.swing.JDialog {

    @SuppressWarnings("serial")
    public class CustomEditorKit extends HTMLEditorKit {

        @Override
        public ViewFactory getViewFactory() {

            return new HTMLFactory() {
                @Override
                public View create(Element e) {
                    View v = super.create(e);
                    if (v instanceof InlineView) {
                        return new InlineView(e) {
                            @Override
                            public int getBreakWeight(int axis, float pos, float len) {
                                return GoodBreakWeight;
                            }

                            @Override
                            public View breakView(int axis, int p0, float pos, float len) {
                                if (axis == View.X_AXIS) {
                                    this.checkPainter();
                                    this.removeUpdate(null, null, null);
                                }
                                return super.breakView(axis, p0, pos, len);
                            }
                        };
                    } else if (v instanceof ParagraphView) {
                        return new ParagraphView(e) {
                            @Override
                            protected SizeRequirements calculateMinorAxisRequirements(int axis,
                                    SizeRequirements r) {
                                if (r == null) {
                                    r = new SizeRequirements();
                                }
                                float pref = this.layoutPool.getPreferredSpan(axis);
                                float min = this.layoutPool.getMinimumSpan(axis);
                                // Don't include insets, Box.getXXXSpan will
                                // include them.
                                r.minimum = (int) min;
                                r.preferred = Math.max(r.minimum, (int) pref);
                                r.maximum = Integer.MAX_VALUE;
                                r.alignment = 0.5f;
                                return r;
                            }

                        };
                    }
                    return v;
                }
            };
        }
    }

    /**
     *
     */
    private static final long serialVersionUID = 4892202577910829210L;

    private final static Logger logger = Logger.getLogger(AddContactToShareWizard.class);

    private PanboxShare share;

    private static final ResourceBundle bundle = ResourceBundle.getBundle("org.panbox.desktop.common.gui.Messages",
            Settings.getInstance().getLocale());

    private PanboxClient client;

    private DropboxAPIIntegration dbapi;

    private boolean hasParticipants;

    private ContactListModel mainModel;

    public AddContactToShareWizard(java.awt.Frame parent, PanboxClient client, PanboxShare share,
            ContactListModel model) throws Exception {
        super(parent);
        this.client = client;
        this.share = share;
        this.mainModel = model;

        this.dbapi = (DropboxAPIIntegration) CSPAdapterFactory.getInstance(StorageBackendType.DROPBOX)
                .getAPIAdapter();

        this.hasParticipants = (share.getContacts().size() != 0);

        initComponents();
        setLocationRelativeTo(parent);

        this.contactList.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
            @Override
            public void valueChanged(ListSelectionEvent e) {
                changedStep();
            }
        });

        changedStep();
    }

    private ContactListModel genContactModel() {
        ContactListModel modelcopy = new ContactListModel();
        for (int i = 0, ctr = 0; i < mainModel.getSize(); i++) {
            PanboxGUIContact ccur = mainModel.get(i);
            List<PanboxGUIContact> clist = share.getContacts();
            // load contacts that may be added
            if (!(ccur instanceof PanboxMyContact) && !clist.contains(ccur) && !clist.contains(ccur)) {
                modelcopy.add(ctr++, ccur);
            }
        }
        return modelcopy;
    }

    private int currentStep = this.STEP_CONTACT_SELECTION; // initial value

    private final int STEP_CONTACT_SELECTION = 0;
    private final int STEP_CSP_ACCESSCONTROL = 1;
    private final int STEP_CREATE_INVITATION = 2;

    private boolean finishedAccessControlConfig = false;

    private void changedStep() {
        JPanel curPanel = null;
        switch (currentStep) {
        case STEP_CONTACT_SELECTION:
            abortBackButton.setText(bundle.getString("Abort"));
            nextFinishButton.setText(bundle.getString("AddContactToShareWizard.nextButton.addContacts.text"));

            List<PanboxGUIContact> contacts = contactList.getSelectedValuesList();
            if ((contacts != null) && (contacts.size() > 0) || finishedAccessControlConfig) {
                nextFinishButton.setEnabled(true);
            } else {
                nextFinishButton.setEnabled(false);
            }

            curPanel = contactListPanel;
            break;
        case STEP_CSP_ACCESSCONTROL:
            abortBackButton.setText(bundle.getString("Back"));
            try {
                // TODO: cleanup, CSP abstraction
                String link = dbapi.getShareConfigurationURL(share.getName(), (share.getContacts().size() != 0))
                        .toString();

                shareConfigLinkEditorPane.setText("<html><p><a href=\"" + link + "\">" + link + "</a></p></html>");
            } catch (Exception e) {
                e.printStackTrace();
            }

            if (finishedAccessControlConfig) {
                nextFinishButton.setText(bundle.getString("Next"));
            } else {
                nextFinishButton.setText(bundle.getString("AddContactToShareWizard.nextButton.openLink.text"));
            }

            curPanel = accessControlPanelDropbox;
            break;
        case STEP_CREATE_INVITATION:
            abortBackButton.setText(bundle.getString("Back"));
            nextFinishButton.setText(bundle.getString("Finish"));
            String link = createShareInvitation();
            shareInvitationLinkEditorPane.setText("<html><p><a href=\"" + link + "\">" + link + "</a></p></html>");
            nextFinishButton.setEnabled(true);
            curPanel = shareInvitationPanel;

            break;
        }

        dialogPanel.removeAll();
        dialogPanel.add(curPanel);
        // javax.swing.GroupLayout dialogPanelLayout = new
        // javax.swing.GroupLayout(
        // dialogPanel);
        // dialogPanel.setLayout(dialogPanelLayout);
        // dialogPanelLayout
        // .setHorizontalGroup(dialogPanelLayout
        // .createParallelGroup(
        // javax.swing.GroupLayout.Alignment.LEADING)
        // .addGroup(
        // dialogPanelLayout
        // .createSequentialGroup()
        // .addContainerGap()
        // .addComponent(
        // curPanel,
        // javax.swing.GroupLayout.DEFAULT_SIZE,
        // javax.swing.GroupLayout.DEFAULT_SIZE,
        // 6).addContainerGap()));
        // dialogPanelLayout
        // .setVerticalGroup(dialogPanelLayout
        // .createParallelGroup(
        // javax.swing.GroupLayout.Alignment.LEADING)
        // .addGroup(
        // dialogPanelLayout
        // .createSequentialGroup()
        // .addContainerGap()
        // .addComponent(
        // curPanel,
        // javax.swing.GroupLayout.DEFAULT_SIZE,
        // javax.swing.GroupLayout.DEFAULT_SIZE,
        // 6).addContainerGap()));
        nextFinishButton.requestFocus();
        invalidate();
        pack();
    }

    private String createShareInvitation() {
        return PanboxURICmdShareInvitation.getPanboxLink(share.getUuid().toString(), share.getType().name())
                .toString();
    }

    /**
     * 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"
    // <editor-fold defaultstate="collapsed"
    // desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        contactListPanel = new javax.swing.JPanel();
        contactListScrollPane = new javax.swing.JScrollPane();
        contactList = new javax.swing.JList<PanboxGUIContact>();
        accessControlPanelDropbox = new javax.swing.JPanel();
        emailsToClipboardCheckBox = new javax.swing.JCheckBox();
        accessControlLinkLabel = new javax.swing.JLabel();
        shareConfigurationLinkPanel = new javax.swing.JPanel();
        jScrollPane3 = new javax.swing.JScrollPane();
        shareConfigLinkEditorPane = new javax.swing.JEditorPane();
        shareInvitationPanel = new javax.swing.JPanel();
        shareInvitationLinkLabel = new javax.swing.JLabel();
        mailInvitationCheckbox = new javax.swing.JCheckBox();
        inviteViaClipboardCheckbox = new javax.swing.JCheckBox();
        shareInvitationLinkPanel = new javax.swing.JPanel();
        jScrollPane2 = new javax.swing.JScrollPane();
        shareInvitationLinkEditorPane = new javax.swing.JEditorPane();
        nextFinishButton = new javax.swing.JButton();
        abortBackButton = new javax.swing.JButton();
        dialogPanel = new javax.swing.JPanel();

        contactList.setModel(genContactModel());
        contactList.setCellRenderer(new ContactListCellRenderer());
        contactListScrollPane.setViewportView(contactList);

        javax.swing.GroupLayout contactListPanelLayout = new javax.swing.GroupLayout(contactListPanel);
        contactListPanel.setLayout(contactListPanelLayout);
        contactListPanelLayout.setHorizontalGroup(
                contactListPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent(
                        contactListScrollPane, javax.swing.GroupLayout.Alignment.TRAILING,
                        javax.swing.GroupLayout.DEFAULT_SIZE, 282, Short.MAX_VALUE));
        contactListPanelLayout.setVerticalGroup(
                contactListPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent(
                        contactListScrollPane, javax.swing.GroupLayout.Alignment.TRAILING,
                        javax.swing.GroupLayout.DEFAULT_SIZE, 350, Short.MAX_VALUE));

        accessControlPanelDropbox.setMaximumSize(null);

        emailsToClipboardCheckBox.setSelected(true);
        emailsToClipboardCheckBox.setText(bundle.getString("PanboxClientGUI.copyEmailToClipboard")); // NOI18N

        accessControlLinkLabel.setText(bundle.getString("AddContactToShareWizard.accesscontrolLinkLabel.text")); // NOI18N

        shareConfigurationLinkPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(
                bundle.getString("AddContactToShareWizard.shareConfigurationLinkPanel.border.title"))); // NOI18N

        shareConfigLinkEditorPane.setEditable(false);
        shareConfigLinkEditorPane.setContentType("text/html"); // NOI18N
        shareConfigLinkEditorPane.setEditorKit(new CustomEditorKit());
        shareConfigLinkEditorPane.setAutoscrolls(false);
        shareConfigLinkEditorPane.setOpaque(false);
        shareConfigLinkEditorPane.addHyperlinkListener(new javax.swing.event.HyperlinkListener() {
            public void hyperlinkUpdate(javax.swing.event.HyperlinkEvent evt) {
                shareConfigLinkEditorPaneHyperlinkUpdate(evt);
            }
        });
        jScrollPane3.setViewportView(shareConfigLinkEditorPane);

        javax.swing.GroupLayout shareConfigurationLinkPanelLayout = new javax.swing.GroupLayout(
                shareConfigurationLinkPanel);
        shareConfigurationLinkPanel.setLayout(shareConfigurationLinkPanelLayout);
        shareConfigurationLinkPanelLayout.setHorizontalGroup(
                shareConfigurationLinkPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(shareConfigurationLinkPanelLayout.createSequentialGroup().addContainerGap()
                                .addComponent(jScrollPane3).addContainerGap()));
        shareConfigurationLinkPanelLayout.setVerticalGroup(shareConfigurationLinkPanelLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(shareConfigurationLinkPanelLayout.createSequentialGroup().addContainerGap()
                        .addComponent(jScrollPane3, javax.swing.GroupLayout.DEFAULT_SIZE, 77, Short.MAX_VALUE)
                        .addContainerGap()));

        javax.swing.GroupLayout accessControlPanelDropboxLayout = new javax.swing.GroupLayout(
                accessControlPanelDropbox);
        accessControlPanelDropbox.setLayout(accessControlPanelDropboxLayout);
        accessControlPanelDropboxLayout.setHorizontalGroup(accessControlPanelDropboxLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addComponent(accessControlLinkLabel, javax.swing.GroupLayout.DEFAULT_SIZE, 470, Short.MAX_VALUE)
                .addGroup(accessControlPanelDropboxLayout.createSequentialGroup()
                        .addComponent(emailsToClipboardCheckBox).addGap(0, 0, Short.MAX_VALUE))
                .addComponent(shareConfigurationLinkPanel, javax.swing.GroupLayout.DEFAULT_SIZE,
                        javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE));
        accessControlPanelDropboxLayout.setVerticalGroup(
                accessControlPanelDropboxLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(accessControlPanelDropboxLayout.createSequentialGroup()
                                .addComponent(accessControlLinkLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 43,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(shareConfigurationLinkPanel, javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(emailsToClipboardCheckBox)));

        shareInvitationPanel.setMaximumSize(new java.awt.Dimension(406, 224));
        shareInvitationPanel.setPreferredSize(new java.awt.Dimension(481, 224));

        shareInvitationLinkLabel.setText(bundle.getString("AddContactToShareWizard.shareInvitationLinkLabel.text")); // NOI18N

        mailInvitationCheckbox.setText(bundle.getString("AddContactToShareWizard.mailInvitationCheckbox.text")); // NOI18N
        mailInvitationCheckbox.setEnabled(Settings.getInstance().isMailtoSchemeSupported());

        inviteViaClipboardCheckbox.setSelected(true);
        inviteViaClipboardCheckbox
                .setText(bundle.getString("AddContactToShareWizard.inviteViaClipboardCheckbox.text")); // NOI18N

        shareInvitationLinkPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(
                bundle.getString("AddContactToShareWizard.shareInvitationLinkPanel.border.title"))); // NOI18N

        shareInvitationLinkEditorPane.setEditable(false);
        shareInvitationLinkEditorPane.setContentType("text/html"); // NOI18N
        shareInvitationLinkEditorPane.setEditorKit(new CustomEditorKit());
        shareInvitationLinkEditorPane.setToolTipText(
                bundle.getString("AddContactToShareWizard.shareInvitationLinkEditorPane.toolTipText")); // NOI18N
        shareInvitationLinkEditorPane.setMaximumSize(new java.awt.Dimension(406, 224));
        shareInvitationLinkEditorPane.setOpaque(false);
        shareInvitationLinkEditorPane.addHyperlinkListener(new javax.swing.event.HyperlinkListener() {
            public void hyperlinkUpdate(javax.swing.event.HyperlinkEvent evt) {
                shareInvitationLinkEditorPaneHyperlinkUpdate(evt);
            }
        });
        jScrollPane2.setViewportView(shareInvitationLinkEditorPane);

        javax.swing.GroupLayout shareInvitationLinkPanelLayout = new javax.swing.GroupLayout(
                shareInvitationLinkPanel);
        shareInvitationLinkPanel.setLayout(shareInvitationLinkPanelLayout);
        shareInvitationLinkPanelLayout.setHorizontalGroup(
                shareInvitationLinkPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(shareInvitationLinkPanelLayout.createSequentialGroup().addContainerGap()
                                .addComponent(jScrollPane2).addContainerGap()));
        shareInvitationLinkPanelLayout.setVerticalGroup(shareInvitationLinkPanelLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(shareInvitationLinkPanelLayout.createSequentialGroup().addContainerGap()
                        .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 87, Short.MAX_VALUE)
                        .addContainerGap()));

        javax.swing.GroupLayout shareInvitationPanelLayout = new javax.swing.GroupLayout(shareInvitationPanel);
        shareInvitationPanel.setLayout(shareInvitationPanelLayout);
        shareInvitationPanelLayout
                .setHorizontalGroup(
                        shareInvitationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addGroup(shareInvitationPanelLayout.createSequentialGroup()
                                        .addComponent(inviteViaClipboardCheckbox).addGap(18, 18, 18)
                                        .addComponent(mailInvitationCheckbox).addContainerGap(206, Short.MAX_VALUE))
                                .addComponent(shareInvitationLinkLabel, javax.swing.GroupLayout.DEFAULT_SIZE, 451,
                                        Short.MAX_VALUE)
                                .addComponent(shareInvitationLinkPanel, javax.swing.GroupLayout.Alignment.TRAILING,
                                        javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE,
                                        Short.MAX_VALUE));
        shareInvitationPanelLayout.setVerticalGroup(shareInvitationPanelLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(shareInvitationPanelLayout.createSequentialGroup()
                        .addComponent(shareInvitationLinkLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 43,
                                javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(shareInvitationLinkPanel, javax.swing.GroupLayout.DEFAULT_SIZE,
                                javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(shareInvitationPanelLayout
                                .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(mailInvitationCheckbox).addComponent(inviteViaClipboardCheckbox))));

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle(bundle.getString("AddContactToShareWizard.title")); // NOI18N
        setMinimumSize(null);
        setModal(true);

        nextFinishButton.setText(bundle.getString("AddContactToShareWizard.nextFinishButton.text")); // NOI18N
        nextFinishButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                nextFinishButtonActionPerformed(evt);
            }
        });

        abortBackButton.setText(bundle.getString("AddContactToShareWizard.abortBackButton.text")); // NOI18N
        abortBackButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                abortBackButtonActionPerformed(evt);
            }
        });

        dialogPanel.setLayout(new java.awt.GridLayout(1, 1));

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup().addContainerGap()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addGroup(javax.swing.GroupLayout.Alignment.TRAILING,
                                        layout.createSequentialGroup().addComponent(abortBackButton)
                                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED,
                                                        132, Short.MAX_VALUE)
                                                .addComponent(nextFinishButton))
                                .addComponent(dialogPanel, javax.swing.GroupLayout.Alignment.TRAILING,
                                        javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE,
                                        Short.MAX_VALUE))
                        .addContainerGap()));
        layout.setVerticalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(layout.createSequentialGroup().addContainerGap()
                                .addComponent(dialogPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 327,
                                        Short.MAX_VALUE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                        .addComponent(abortBackButton).addComponent(nextFinishButton))
                                .addContainerGap()));

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void shareConfigLinkEditorPaneHyperlinkUpdate(javax.swing.event.HyperlinkEvent evt) {// GEN-FIRST:event_shareConfigLinkEditorPaneHyperlinkUpdate
        if (HyperlinkEvent.EventType.ACTIVATED.equals(evt.getEventType())) {
            if (this.finishedAccessControlConfig = openShareConfigLink()) {
                changedStep();
            }
        }
    }// GEN-LAST:event_shareConfigLinkEditorPaneHyperlinkUpdate

    private void shareInvitationLinkEditorPaneHyperlinkUpdate(javax.swing.event.HyperlinkEvent evt) {// GEN-FIRST:event_shareInvitationLinkEditorPaneHyperlinkUpdate

    }// GEN-LAST:event_shareInvitationLinkEditorPaneHyperlinkUpdate

    private boolean openShareConfigLink() {
        String shareid = FilenameUtils.getName(share.getPath());
        boolean shareIsOnline;
        try {
            shareIsOnline = ((shareid != null) && (shareid.length() > 0) && dbapi.exists(File.separator + shareid));
        } catch (CSPApiException e1) {
            logger.error("Could not determine if share with path " + share.getPath() + " and shareid: " + shareid
                    + " has already been uploaded!");
            shareIsOnline = false;
        }

        if (shareIsOnline) {
            if (emailsToClipboardCheckBox.isSelected()) {
                String emails = PanboxGUIContact.getMailAsSepteratedValues(reallyAdded, ";",
                        StorageBackendType.DROPBOX);
                // copy the email of the selected contact into the
                // clipboard
                DesktopApi.copyToClipboard(emails.toString(), false);
            }

            try {
                // share may either already have had participants from the very
                // beginning, or been configured to include participants during
                // accesscontrol config
                URI link = dbapi.getShareConfigurationURL(shareid, hasParticipants || finishedAccessControlConfig);
                DesktopApi.browse(link);
                return true;
            } catch (Exception e) {
                logger.error("handleCSPShareParticipantConfiguration: Error opening share configuration", e);
                JOptionPane.showMessageDialog(this, bundle.getString("PanboxClientGUI.errorOpeningShareConfig"),
                        bundle.getString("error"), JOptionPane.ERROR_MESSAGE);
            }

        } else {
            logger.warn("handleCSPShareParticipantConfiguration: Unknown share type!");
        }

        return false;
    }

    private void abortBackButtonActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_abortBackButtonActionPerformed
        switch (currentStep) {
        case STEP_CONTACT_SELECTION:
            // initial step, only allow aborting this dialog
            this.dispose();
            break;
        case STEP_CSP_ACCESSCONTROL:
            currentStep--;
            changedStep();
            break;
        case STEP_CREATE_INVITATION:
            currentStep--;
            changedStep();
            break;
        }
    }// GEN-LAST:event_abortBackButtonActionPerformed

    private void nextFinishButtonActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_nextFinishButtonActionPerformed
        switch (currentStep) {
        case STEP_CONTACT_SELECTION:
            if (handleContactSelection()) {
                finishedAccessControlConfig = false;
            }
            currentStep++;
            break;
        case STEP_CSP_ACCESSCONTROL:
            if (finishedAccessControlConfig || (this.finishedAccessControlConfig = openShareConfigLink())) {
                currentStep++;
            }
            break;
        case STEP_CREATE_INVITATION:
            if (handleShareInvitationDistribution()) {
                // links were either copied to clipboard or sent via email
                this.dispose();
            }
            break;
        }

        changedStep();
    }// GEN-LAST:event_nextFinishButtonActionPerformed

    private boolean handleShareInvitationDistribution() {

        if (inviteViaClipboardCheckbox.isSelected()) {
            DesktopApi.copyToClipboard(createShareInvitation(), true);
        }

        if (Settings.getInstance().isMailtoSchemeSupported()) {

            if (mailInvitationCheckbox.isSelected()) {
                String emails = PanboxGUIContact.getMailAsSepteratedValues(reallyAdded, ",",
                        StorageBackendType.DROPBOX);

                DesktopApi.browse(URI.create(
                        "mailto:" + emails + "?subject=Panbox%20identity%20link&body=" + createShareInvitation()));
            }
        }

        return true;
    }

    ArrayList<PanboxGUIContact> reallyAdded = new ArrayList<PanboxGUIContact>();

    private boolean handleContactSelection() {
        List<PanboxGUIContact> contacts = contactList.getSelectedValuesList();
        // reallyAdded.clear();

        if (contacts.isEmpty()) {
            return false;
        }

        char[] password = PasswordEnterDialog.invoke(PermissionType.USER);
        try {
            client.showTrayMessage(bundle.getString("PleaseWait"),
                    bundle.getString("tray.addContactToShare.waitMessage"), MessageType.INFO);
            PanboxShare sharenew = null;
            for (int i = 0; i < contacts.size(); i++) {
                // add permission for user
                ContactShareParticipant cp = new ContactShareParticipant(contacts.get(i));
                if (!cp.getContact().isVerified()) {
                    int res = JOptionPane.showConfirmDialog(this, MessageFormat.format(
                            bundle.getString("PanboxClientGUI.addUnverifiedContactWarning.text"), cp.getName()),
                            bundle.getString("PanboxClientGUI.addUnverifiedContactWarning.title"),
                            JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE);

                    if (res == JOptionPane.YES_OPTION) {
                        sharenew = client.addPermissionToShare(share, cp, password);
                        logger.info("Added unverified contact " + cp.getName() + " to share.");
                        reallyAdded.add(contacts.get(i));
                        // TODO: update users list

                    } else if (res == JOptionPane.NO_OPTION) {
                        logger.info("Skipped adding unverified contact " + cp.getName() + " to share.");
                        continue;
                    }
                } else {
                    sharenew = client.addPermissionToShare(share, cp, password);
                    reallyAdded.add(contacts.get(i));
                    // TODO: update users list
                }
            }
            this.share = (sharenew != null) ? sharenew : this.share;
            if (reallyAdded.size() > 0) {
                return true;
            }
            client.showTrayMessage(bundle.getString("tray.addContactToShare.finishTitle"),
                    bundle.getString("tray.addContactToShare.finishMessage"), MessageType.INFO);
        } catch (ShareDoesNotExistException e1) {
            logger.error("Share not found!", e1);
            JOptionPane.showMessageDialog(this, bundle.getString("PanboxClient.shareNotFound"),
                    bundle.getString("client.error"), JOptionPane.ERROR_MESSAGE);
        } catch (ShareManagerException e1) {
            logger.error("Could not add contact to share!", e1);
            JOptionPane.showMessageDialog(this, bundle.getString("PanboxClientGUI.errorWhileAddingContactToShare"),
                    bundle.getString("client.error"), JOptionPane.ERROR_MESSAGE);
        } catch (UnrecoverableKeyException e1) {
            logger.error("Unable to recover key!", e1);
            JOptionPane.showMessageDialog(this, bundle.getString("PanboxClient.unableToRecoverKeys"),
                    bundle.getString("client.error"), JOptionPane.ERROR_MESSAGE);
        } catch (ShareMetaDataException e1) {
            logger.error("Error in share metadata", e1);
            JOptionPane.showMessageDialog(this,
                    bundle.getString("PanboxClientGUI.errorWhileAccessingShareMetadata"),
                    bundle.getString("client.error"), JOptionPane.ERROR_MESSAGE);
        } finally {
            Utils.eraseChars(password);
        }

        return false;
    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton abortBackButton;
    private javax.swing.JLabel accessControlLinkLabel;
    private javax.swing.JPanel accessControlPanelDropbox;
    private javax.swing.JList<PanboxGUIContact> contactList;
    private javax.swing.JPanel contactListPanel;
    private javax.swing.JScrollPane contactListScrollPane;
    private javax.swing.JPanel dialogPanel;
    private javax.swing.JCheckBox emailsToClipboardCheckBox;
    private javax.swing.JCheckBox inviteViaClipboardCheckbox;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JScrollPane jScrollPane3;
    private javax.swing.JCheckBox mailInvitationCheckbox;
    private javax.swing.JButton nextFinishButton;
    private javax.swing.JEditorPane shareConfigLinkEditorPane;
    private javax.swing.JPanel shareConfigurationLinkPanel;
    private javax.swing.JEditorPane shareInvitationLinkEditorPane;
    private javax.swing.JLabel shareInvitationLinkLabel;
    private javax.swing.JPanel shareInvitationLinkPanel;
    private javax.swing.JPanel shareInvitationPanel;
    // End of variables declaration//GEN-END:variables
}