20 package org.sleuthkit.autopsy.contentviewers.artifactviewers;
 
   22 import java.awt.event.ActionEvent;
 
   23 import java.awt.event.ActionListener;
 
   24 import java.util.ArrayList;
 
   25 import java.util.Collection;
 
   26 import java.util.List;
 
   27 import java.util.concurrent.CancellationException;
 
   28 import java.util.concurrent.ExecutionException;
 
   29 import java.util.logging.Level;
 
   30 import javax.swing.GroupLayout;
 
   31 import javax.swing.GroupLayout.Alignment;
 
   32 import javax.swing.GroupLayout.ParallelGroup;
 
   33 import javax.swing.GroupLayout.SequentialGroup;
 
   34 import javax.swing.JButton;
 
   35 import javax.swing.JLabel;
 
   36 import javax.swing.JPanel;
 
   37 import javax.swing.LayoutStyle.ComponentPlacement;
 
   38 import javax.swing.SwingUtilities;
 
   39 import javax.swing.SwingWorker;
 
   40 import org.openide.util.NbBundle.Messages;
 
   58 final class MessageAccountPanel 
extends JPanel {
 
   60     private static final long serialVersionUID = 1L;
 
   61     private final static Logger logger = Logger.getLogger(MessageAccountPanel.class.getName());
 
   63     private AccountFetcher currentFetcher = null;
 
   72     void setArtifact(BlackboardArtifact artifact) {
 
   77         if (artifact == null) {
 
   81         if (currentFetcher != null && !currentFetcher.isDone()) {
 
   82             currentFetcher.cancel(
true);
 
   85         currentFetcher = 
new AccountFetcher(artifact);
 
   86         currentFetcher.execute();
 
   92     class AccountFetcher 
extends SwingWorker<List<AccountContainer>, Void> {
 
   94         private final BlackboardArtifact artifact;
 
  101         AccountFetcher(BlackboardArtifact artifact) {
 
  102             this.artifact = artifact;
 
  106         protected List<AccountContainer> doInBackground() throws Exception {
 
  107             List<AccountContainer> dataList = 
new ArrayList<>();
 
  109             CommunicationsManager commManager = Case.getCurrentCase().getSleuthkitCase().getCommunicationsManager();
 
  110             List<Account> accountList = commManager.getAccountsRelatedToArtifact(artifact);
 
  111             for (Account account : accountList) {
 
  113                     return new ArrayList<>();
 
  116                 Collection<PersonaAccount> personAccounts = PersonaAccount.getPersonaAccountsForAccount(account);
 
  117                 if (personAccounts != null && !personAccounts.isEmpty()) {
 
  118                     for (PersonaAccount personaAccount : PersonaAccount.getPersonaAccountsForAccount(account)) {
 
  119                         dataList.add(
new AccountContainer(account, personaAccount));
 
  122                     dataList.add(
new AccountContainer(account, null));
 
  130         protected void done() {
 
  132                 List<AccountContainer> dataList = 
get();
 
  134                 dataList.forEach(container -> {
 
  135                     container.initalizeSwingControls();
 
  138                 GroupLayout layout = 
new GroupLayout(MessageAccountPanel.this);
 
  139                 layout.setHorizontalGroup(
 
  140                         layout.createParallelGroup(Alignment.LEADING)
 
  141                                 .addGroup(layout.createSequentialGroup()
 
  143                                         .addGroup(getMainHorizontalGroup(layout, dataList))
 
  144                                         .addContainerGap(158, Short.MAX_VALUE)));
 
  146                 layout.setVerticalGroup(getMainVerticalGroup(layout, dataList));
 
  149             } 
catch (CancellationException ex) {
 
  150                 logger.log(Level.INFO, 
"MessageAccoutPanel thread cancelled", ex);
 
  151             } 
catch (InterruptedException | ExecutionException ex) {
 
  152                 logger.log(Level.WARNING, 
"Failed to get account list for MessageAccountPanel", ex);
 
  162         private ParallelGroup getMainHorizontalGroup(GroupLayout layout, List<AccountContainer> data) {
 
  163             ParallelGroup group = layout.createParallelGroup(Alignment.LEADING);
 
  164             for (AccountContainer o : data) {
 
  165                 group.addComponent(o.getAccountLabel());
 
  167             group.addGroup(getPersonaHorizontalGroup(layout, data));
 
  176         private ParallelGroup getMainVerticalGroup(GroupLayout layout, List<AccountContainer> data) {
 
  177             SequentialGroup group = layout.createSequentialGroup();
 
  178             for (AccountContainer o : data) {
 
  180                         .addComponent(o.getAccountLabel())
 
  181                         .addGroup(o.getPersonLineVerticalGroup(layout));
 
  184             group.addContainerGap(83, Short.MAX_VALUE);
 
  186             return layout.createParallelGroup().addGroup(group);
 
  196         private ParallelGroup getButtonGroup(GroupLayout layout, List<AccountContainer> data) {
 
  197             ParallelGroup group = layout.createParallelGroup(Alignment.LEADING);
 
  198             for (AccountContainer o : data) {
 
  199                 group.addComponent(o.getButton());
 
  210         private SequentialGroup getPersonaHorizontalGroup(GroupLayout layout, List<AccountContainer> data) {
 
  211             SequentialGroup group = layout.createSequentialGroup();
 
  212             ParallelGroup pgroup = layout.createParallelGroup(Alignment.LEADING);
 
  214             for (AccountContainer o : data) {
 
  215                 pgroup.addGroup(o.getPersonaSequentialGroup(layout));
 
  219                     .addPreferredGap(ComponentPlacement.RELATED)
 
  220                     .addGroup(getButtonGroup(layout, data));
 
  249             this.persona = personaAccount != null ? personaAccount.
getPersona() : null;
 
  253             "MessageAccountPanel_persona_label=Persona:",
 
  254             "MessageAccountPanel_unknown_label=Unknown",
 
  255             "MessageAccountPanel_button_view_label=View",
 
  256             "MessageAccountPanel_button_create_label=Create" 
  262             accountLabel = 
new JLabel();
 
  263             personaHeader = 
new JLabel(Bundle.MessageAccountPanel_persona_label());
 
  264             personaDisplayName = 
new JLabel();
 
  265             button = 
new JButton();
 
  268             accountLabel.setText(account.getTypeSpecificID());
 
  270             personaDisplayName.setText(persona != null ? persona.
getName() : Bundle.MessageAccountPanel_unknown_label());
 
  271             button.setText(persona != null ? Bundle.MessageAccountPanel_button_view_label() : Bundle.MessageAccountPanel_button_create_label());
 
  283             SwingUtilities.invokeLater(
new Runnable() {
 
  286                     personaDisplayName.setText(persona != null ? persona.
getName() : Bundle.MessageAccountPanel_unknown_label());
 
  287                     button.setText(persona != null ? Bundle.MessageAccountPanel_button_view_label() : Bundle.MessageAccountPanel_button_create_label());
 
  338             SequentialGroup group = layout.createSequentialGroup();
 
  341                     .addComponent(personaHeader)
 
  342                     .addPreferredGap(ComponentPlacement.RELATED)
 
  343                     .addComponent(personaDisplayName);
 
  356             return layout.createParallelGroup(Alignment.BASELINE)
 
  357                     .addComponent(personaHeader)
 
  358                     .addComponent(personaDisplayName)
 
  359                     .addComponent(button);
 
  382             if (persona == null) {
 
  384                         MessageAccountPanel.this,
 
void callback(Persona persona)
PersonaDetailsPanel getDetailsPanel()
SequentialGroup getPersonaSequentialGroup(GroupLayout layout)
void actionPerformed(ActionEvent e)
void initalizeSwingControls()
JLabel personaDisplayName
final AccountContainer accountContainer
void setPersonaName(String name)
final AccountContainer accountContainer
ParallelGroup getPersonLineVerticalGroup(GroupLayout layout)
void setPersona(Persona persona)