19 package org.sleuthkit.autopsy.casemodule;
 
   22 import java.util.ArrayList;
 
   23 import java.util.List;
 
   25 import java.util.TreeSet;
 
   26 import javax.swing.JFileChooser;
 
   27 import javax.swing.JPanel;
 
   29 import org.openide.util.NbBundle;
 
   32 import java.util.logging.Level;
 
   33 import javax.swing.JOptionPane;
 
   41 final class LocalFilesPanel 
extends JPanel {
 
   43     private static final long serialVersionUID = 1L;
 
   44     private final Set<File> currentFiles = 
new TreeSet<>(); 
 
   45     private boolean enableNext = 
false;
 
   46     private static LocalFilesPanel instance;
 
   47     private static final Logger logger = Logger.getLogger(LocalFilesPanel.class.getName());
 
   48     private String displayName = 
"";
 
   53     private LocalFilesPanel() {
 
   58     static synchronized LocalFilesPanel getDefault() {
 
   59         if (instance == null) {
 
   60             instance = 
new LocalFilesPanel();
 
   65     private void customInit() {
 
   66         localFileChooser.setMultiSelectionEnabled(
true);
 
   67         errorLabel.setVisible(
false);
 
   68         selectedPaths.setText(
"");
 
   69         this.displayNameLabel.setText(NbBundle.getMessage(
this.getClass(), 
"LocalFilesPanel.displayNameLabel.text"));
 
   72     public List<String> getContentPaths() {
 
   73         List<String> pathsList = 
new ArrayList<>();
 
   74         if (currentFiles == null) {
 
   77         for (File f : currentFiles) {
 
   78             pathsList.add(f.getAbsolutePath());
 
   83     public String getContentType() {
 
   84         return NbBundle.getMessage(this.getClass(), 
"LocalFilesPanel.contentType.text");
 
   87     public boolean validatePanel() {
 
   89         warnIfPathIsInvalid(getContentPaths());
 
   99     private void warnIfPathIsInvalid(List<String> pathsList) {
 
  100         errorLabel.setVisible(
false);
 
  102         CaseType currentCaseType = Case.getCurrentCase().getCaseType();
 
  104         for (String currentPath : pathsList) {
 
  105             if (!PathValidator.isValid(currentPath, currentCaseType)) {
 
  106                 errorLabel.setVisible(
true);
 
  107                 errorLabel.setText(NbBundle.getMessage(
this.getClass(), 
"DataSourceOnCDriveError.text"));
 
  113     public void select() {
 
  117     public void reset() {
 
  118         currentFiles.clear();
 
  119         selectedPaths.setText(
"");
 
  121         errorLabel.setVisible(
false);
 
  123         this.displayNameLabel.setText(NbBundle.getMessage(
this.getClass(), 
"LocalFilesPanel.displayNameLabel.text"));
 
  126     public String getFileSetName() {
 
  127         return this.displayName;
 
  131     public String toString() {
 
  132         return NbBundle.getMessage(this.getClass(), 
"LocalFilesDSProcessor.toString.text");
 
  140     @SuppressWarnings(
"unchecked")
 
  142     private 
void initComponents() {
 
  144         localFileChooser = 
new javax.swing.JFileChooser();
 
  145         jScrollPane1 = 
new javax.swing.JScrollPane();
 
  146         jTextArea1 = 
new javax.swing.JTextArea();
 
  147         selectButton = 
new javax.swing.JButton();
 
  148         infoLabel = 
new javax.swing.JLabel();
 
  149         clearButton = 
new javax.swing.JButton();
 
  150         jScrollPane2 = 
new javax.swing.JScrollPane();
 
  151         selectedPaths = 
new javax.swing.JTextArea();
 
  152         errorLabel = 
new javax.swing.JLabel();
 
  153         jButton1 = 
new javax.swing.JButton();
 
  154         displayNameLabel = 
new javax.swing.JLabel();
 
  156         localFileChooser.setApproveButtonText(
org.openide.util.NbBundle.getMessage(LocalFilesPanel.class, 
"LocalFilesPanel.localFileChooser.approveButtonText")); 
 
  157         localFileChooser.setApproveButtonToolTipText(
org.openide.util.NbBundle.getMessage(LocalFilesPanel.class, 
"LocalFilesPanel.localFileChooser.approveButtonToolTipText")); 
 
  158         localFileChooser.setDialogTitle(
org.openide.util.NbBundle.getMessage(LocalFilesPanel.class, 
"LocalFilesPanel.localFileChooser.dialogTitle")); 
 
  159         localFileChooser.setFileSelectionMode(javax.swing.JFileChooser.FILES_AND_DIRECTORIES);
 
  161         jTextArea1.setColumns(20);
 
  162         jTextArea1.setRows(5);
 
  163         jScrollPane1.setViewportView(jTextArea1);
 
  165         org.openide.awt.Mnemonics.setLocalizedText(selectButton, 
org.openide.util.NbBundle.getMessage(LocalFilesPanel.class, 
"LocalFilesPanel.selectButton.text")); 
 
  166         selectButton.setToolTipText(
org.openide.util.NbBundle.getMessage(LocalFilesPanel.class, 
"LocalFilesPanel.selectButton.toolTipText")); 
 
  167         selectButton.setActionCommand(
org.openide.util.NbBundle.getMessage(LocalFilesPanel.class, 
"LocalFilesPanel.selectButton.actionCommand")); 
 
  168         selectButton.addActionListener(
new java.awt.event.ActionListener() {
 
  169             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  170                 selectButtonActionPerformed(evt);
 
  174         org.openide.awt.Mnemonics.setLocalizedText(infoLabel, 
org.openide.util.NbBundle.getMessage(LocalFilesPanel.class, 
"LocalFilesPanel.infoLabel.text")); 
 
  176         org.openide.awt.Mnemonics.setLocalizedText(clearButton, 
org.openide.util.NbBundle.getMessage(LocalFilesPanel.class, 
"LocalFilesPanel.clearButton.text")); 
 
  177         clearButton.setToolTipText(
org.openide.util.NbBundle.getMessage(LocalFilesPanel.class, 
"LocalFilesPanel.clearButton.toolTipText")); 
 
  178         clearButton.addActionListener(
new java.awt.event.ActionListener() {
 
  179             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  180                 clearButtonActionPerformed(evt);
 
  184         selectedPaths.setEditable(
false);
 
  185         selectedPaths.setColumns(20);
 
  186         selectedPaths.setRows(5);
 
  187         selectedPaths.setToolTipText(
org.openide.util.NbBundle.getMessage(LocalFilesPanel.class, 
"LocalFilesPanel.selectedPaths.toolTipText")); 
 
  188         jScrollPane2.setViewportView(selectedPaths);
 
  190         errorLabel.setForeground(
new java.awt.Color(255, 0, 0));
 
  191         org.openide.awt.Mnemonics.setLocalizedText(errorLabel, 
org.openide.util.NbBundle.getMessage(LocalFilesPanel.class, 
"LocalFilesPanel.errorLabel.text")); 
 
  193         org.openide.awt.Mnemonics.setLocalizedText(jButton1, 
org.openide.util.NbBundle.getMessage(LocalFilesPanel.class, 
"LocalFilesPanel.jButton1.text")); 
 
  194         jButton1.addActionListener(
new java.awt.event.ActionListener() {
 
  195             public void actionPerformed(java.awt.event.ActionEvent evt) {
 
  196                 jButton1ActionPerformed(evt);
 
  200         org.openide.awt.Mnemonics.setLocalizedText(displayNameLabel, 
org.openide.util.NbBundle.getMessage(LocalFilesPanel.class, 
"LocalFilesPanel.displayNameLabel.text")); 
 
  202         javax.swing.GroupLayout layout = 
new javax.swing.GroupLayout(
this);
 
  203         this.setLayout(layout);
 
  204         layout.setHorizontalGroup(
 
  205             layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  206             .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
 
  207                 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  208                     .addGroup(layout.createSequentialGroup()
 
  209                         .addComponent(infoLabel)
 
  210                         .addGap(0, 0, Short.MAX_VALUE))
 
  211                     .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 389, Short.MAX_VALUE))
 
  212                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  213                 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, 
false)
 
  214                     .addComponent(selectButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
 
  215                     .addComponent(clearButton, javax.swing.GroupLayout.DEFAULT_SIZE, 69, Short.MAX_VALUE))
 
  217             .addGroup(layout.createSequentialGroup()
 
  218                 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  219                     .addComponent(errorLabel)
 
  220                     .addGroup(layout.createSequentialGroup()
 
  221                         .addComponent(displayNameLabel)
 
  222                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
 
  223                         .addComponent(jButton1)))
 
  224                 .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
 
  226         layout.setVerticalGroup(
 
  227             layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  228             .addGroup(layout.createSequentialGroup()
 
  229                 .addComponent(infoLabel)
 
  230                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 
  231                 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
 
  232                     .addGroup(layout.createSequentialGroup()
 
  233                         .addComponent(selectButton)
 
  235                         .addComponent(clearButton))
 
  236                     .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 82, javax.swing.GroupLayout.PREFERRED_SIZE))
 
  238                 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 
  239                     .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)
 
  240                     .addComponent(displayNameLabel))
 
  242                 .addComponent(errorLabel)
 
  247     private void selectButtonActionPerformed(java.awt.event.ActionEvent evt) {
 
  248         int returnVal = localFileChooser.showOpenDialog(
this);
 
  249         if (returnVal == JFileChooser.APPROVE_OPTION) {
 
  250             File[] files = localFileChooser.getSelectedFiles();
 
  251             for (File f : files) {
 
  256             StringBuilder allPaths = 
new StringBuilder();
 
  257             for (File f : currentFiles) {
 
  258                 allPaths.append(f.getAbsolutePath()).append(
"\n");
 
  260             this.selectedPaths.setText(allPaths.toString());
 
  261             this.selectedPaths.setToolTipText(allPaths.toString());
 
  264         enableNext = !currentFiles.isEmpty();
 
  267             firePropertyChange(DataSourceProcessor.DSP_PANEL_EVENT.UPDATE_UI.toString(), 
false, 
true);
 
  268         } 
catch (Exception e) {
 
  269             logger.log(Level.SEVERE, 
"LocalFilesPanel listener threw exception", e); 
 
  270             MessageNotifyUtil.Notify.show(NbBundle.getMessage(
this.getClass(), 
"LocalFilesPanel.moduleErr"),
 
  271                     NbBundle.getMessage(
this.getClass(), 
"LocalFilesPanel.moduleErr.msg"),
 
  272                     MessageNotifyUtil.MessageType.ERROR);
 
  276     private void clearButtonActionPerformed(java.awt.event.ActionEvent evt) {
 
  281     private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
 
  282         String displayName = JOptionPane.showInputDialog(
"New Display Name: ");
 
  283         if (displayName != null && !displayName.equals(
"")) {
 
  284             this.displayName = displayName;
 
  285             this.displayNameLabel.setText(
"Display Name: " + this.displayName);
 
  290     private javax.swing.JButton clearButton;
 
  291     private javax.swing.JLabel displayNameLabel;
 
  292     private javax.swing.JLabel errorLabel;
 
  293     private javax.swing.JLabel infoLabel;
 
  294     private javax.swing.JButton jButton1;
 
  295     private javax.swing.JScrollPane jScrollPane1;
 
  296     private javax.swing.JScrollPane jScrollPane2;
 
  297     private javax.swing.JTextArea jTextArea1;
 
  298     private javax.swing.JFileChooser localFileChooser;
 
  299     private javax.swing.JButton selectButton;
 
  300     private javax.swing.JTextArea selectedPaths;