Autopsy  4.10.0
Graphical digital forensics platform for The Sleuth Kit and other tools.
CreatePortableCasePanel.java
Go to the documentation of this file.
1 /*
2  * Autopsy Forensic Browser
3  *
4  * Copyright 2019 Basis Technology Corp.
5  * Contact: carrier <at> sleuthkit <dot> org
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  */
19 package org.sleuthkit.autopsy.report;
20 
21 import java.awt.Component;
22 import java.awt.event.MouseAdapter;
23 import java.awt.event.MouseEvent;
24 import java.io.File;
25 import java.util.ArrayList;
26 import java.util.LinkedHashMap;
27 import java.util.List;
28 import java.util.Map;
29 import java.util.logging.Level;
30 import javax.swing.JCheckBox;
31 import javax.swing.JFileChooser;
32 import javax.swing.JLabel;
33 import javax.swing.JList;
34 import javax.swing.JOptionPane;
35 import javax.swing.ListCellRenderer;
36 import javax.swing.ListModel;
37 import javax.swing.event.ListDataListener;
38 import org.openide.util.NbBundle;
42 import org.sleuthkit.datamodel.TagName;
43 import org.sleuthkit.datamodel.TskCoreException;
44 
48 @NbBundle.Messages({
49  "CreatePortableCasePanel.error.errorTitle=Error getting tag names for case",
50  "CreatePortableCasePanel.error.noOpenCase=There is no case open",
51  "CreatePortableCasePanel.error.errorLoadingTags=Error loading tags",
52 })
53 @SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
54 class CreatePortableCasePanel extends javax.swing.JPanel {
55 
56  private static final long serialVersionUID = 1L;
57  private List<TagName> tagNames;
58  private final Map<String, Boolean> tagNameSelections = new LinkedHashMap<>();
59  private final TagNamesListModel tagsNamesListModel = new TagNamesListModel();
60  private final TagsNamesListCellRenderer tagsNamesRenderer = new TagsNamesListCellRenderer();
61 
65  public CreatePortableCasePanel() {
66  initComponents();
67  customizeComponents();
68  }
69 
70  private void customizeComponents() {
71  populateTagNameComponents();
72 
73  try {
74  outputFolderTextField.setText(Case.getCurrentCaseThrows().getReportDirectory());
75  } catch (NoCurrentCaseException ex) {
76  Logger.getLogger(CreatePortableCasePanel.class.getName()).log(Level.SEVERE, "Exception while getting open case.", ex);
77  JOptionPane.showMessageDialog(this, Bundle.CreatePortableCasePanel_error_noOpenCase(), Bundle.CreatePortableCasePanel_error_errorTitle(), JOptionPane.ERROR_MESSAGE);
78  }
79  }
80 
81  private void populateTagNameComponents() {
82  // Get the tag names in use for the current case.
83  try {
84  tagNames = Case.getCurrentCaseThrows().getServices().getTagsManager().getTagNamesInUse();
85  } catch (TskCoreException ex) {
86  Logger.getLogger(CreatePortableCasePanel.class.getName()).log(Level.SEVERE, "Failed to get tag names", ex);
87  JOptionPane.showMessageDialog(this, Bundle.CreatePortableCasePanel_error_errorLoadingTags(), Bundle.CreatePortableCasePanel_error_errorTitle(), JOptionPane.ERROR_MESSAGE);
88  } catch (NoCurrentCaseException ex) {
89  Logger.getLogger(CreatePortableCasePanel.class.getName()).log(Level.SEVERE, "Exception while getting open case.", ex);
90  JOptionPane.showMessageDialog(this, Bundle.CreatePortableCasePanel_error_noOpenCase(), Bundle.CreatePortableCasePanel_error_errorTitle(), JOptionPane.ERROR_MESSAGE);
91  }
92 
93  // Mark the tag names as unselected. Note that tagNameSelections is a
94  // LinkedHashMap so that order is preserved and the tagNames and tagNameSelections
95  // containers are "parallel" containers.
96  for (TagName tagName : tagNames) {
97  tagNameSelections.put(tagName.getDisplayName(), Boolean.FALSE);
98  }
99 
100  // Set up the tag names JList component to be a collection of check boxes
101  // for selecting tag names. The mouse click listener updates tagNameSelections
102  // to reflect user choices.
103  tagNamesListBox.setModel(tagsNamesListModel);
104  tagNamesListBox.setCellRenderer(tagsNamesRenderer);
105  tagNamesListBox.setVisibleRowCount(-1);
106  tagNamesListBox.addMouseListener(new MouseAdapter() {
107  @Override
108  public void mousePressed(MouseEvent evt) {
109  JList<?> list = (JList) evt.getSource();
110  int index = list.locationToIndex(evt.getPoint());
111  if (index > -1) {
112  String value = tagsNamesListModel.getElementAt(index);
113  tagNameSelections.put(value, !tagNameSelections.get(value));
114  list.repaint();
115  }
116  }
117  });
118  }
119 
125  List<TagName> getSelectedTagNames() {
126  List<TagName> selectedTagNames = new ArrayList<>();
127  for (TagName tagName : tagNames) {
128  if (tagNameSelections.get(tagName.getDisplayName())) {
129  selectedTagNames.add(tagName);
130  }
131  }
132  return selectedTagNames;
133  }
134 
140  String getOutputFolder() {
141  return outputFolderTextField.getText();
142  }
143 
144  // This class is a list model for the tag names JList component.
145  private class TagNamesListModel implements ListModel<String> {
146 
147  @Override
148  public int getSize() {
149  return tagNames.size();
150  }
151 
152  @Override
153  public String getElementAt(int index) {
154  return tagNames.get(index).getDisplayName();
155  }
156 
157  @Override
158  public void addListDataListener(ListDataListener l) {
159  }
160 
161  @Override
162  public void removeListDataListener(ListDataListener l) {
163  }
164  }
165 
166  // This class renders the items in the tag names JList component as JCheckbox components.
167  private class TagsNamesListCellRenderer extends JCheckBox implements ListCellRenderer<String> {
168  private static final long serialVersionUID = 1L;
169 
170  @Override
171  public Component getListCellRendererComponent(JList<? extends String> list, String value, int index, boolean isSelected, boolean cellHasFocus) {
172  if (value != null) {
173  setEnabled(list.isEnabled());
174  setSelected(tagNameSelections.get(value));
175  setFont(list.getFont());
176  setBackground(list.getBackground());
177  setForeground(list.getForeground());
178  setText(value);
179  return this;
180  }
181  return new JLabel();
182  }
183  }
184 
190  @SuppressWarnings("unchecked")
191  // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
192  private void initComponents() {
193 
194  selectAllButton = new javax.swing.JButton();
195  deselectAllButton = new javax.swing.JButton();
196  jScrollPane1 = new javax.swing.JScrollPane();
197  tagNamesListBox = new javax.swing.JList<>();
198  outputFolderTextField = new javax.swing.JTextField();
199  chooseOutputFolderButton = new javax.swing.JButton();
200  jLabel1 = new javax.swing.JLabel();
201  jLabel2 = new javax.swing.JLabel();
202 
203  org.openide.awt.Mnemonics.setLocalizedText(selectAllButton, org.openide.util.NbBundle.getMessage(CreatePortableCasePanel.class, "CreatePortableCasePanel.selectAllButton.text")); // NOI18N
204  selectAllButton.setMaximumSize(new java.awt.Dimension(99, 23));
205  selectAllButton.setMinimumSize(new java.awt.Dimension(99, 23));
206  selectAllButton.setPreferredSize(new java.awt.Dimension(99, 23));
207  selectAllButton.addActionListener(new java.awt.event.ActionListener() {
208  public void actionPerformed(java.awt.event.ActionEvent evt) {
209  selectAllButtonActionPerformed(evt);
210  }
211  });
212 
213  org.openide.awt.Mnemonics.setLocalizedText(deselectAllButton, org.openide.util.NbBundle.getMessage(CreatePortableCasePanel.class, "CreatePortableCasePanel.deselectAllButton.text")); // NOI18N
214  deselectAllButton.addActionListener(new java.awt.event.ActionListener() {
215  public void actionPerformed(java.awt.event.ActionEvent evt) {
216  deselectAllButtonActionPerformed(evt);
217  }
218  });
219 
220  jScrollPane1.setViewportView(tagNamesListBox);
221 
222  outputFolderTextField.setText(org.openide.util.NbBundle.getMessage(CreatePortableCasePanel.class, "CreatePortableCasePanel.outputFolderTextField.text")); // NOI18N
223 
224  org.openide.awt.Mnemonics.setLocalizedText(chooseOutputFolderButton, org.openide.util.NbBundle.getMessage(CreatePortableCasePanel.class, "CreatePortableCasePanel.chooseOutputFolderButton.text")); // NOI18N
225  chooseOutputFolderButton.addActionListener(new java.awt.event.ActionListener() {
226  public void actionPerformed(java.awt.event.ActionEvent evt) {
227  chooseOutputFolderButtonActionPerformed(evt);
228  }
229  });
230 
231  org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(CreatePortableCasePanel.class, "CreatePortableCasePanel.jLabel1.text")); // NOI18N
232 
233  org.openide.awt.Mnemonics.setLocalizedText(jLabel2, org.openide.util.NbBundle.getMessage(CreatePortableCasePanel.class, "CreatePortableCasePanel.jLabel2.text")); // NOI18N
234 
235  javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
236  this.setLayout(layout);
237  layout.setHorizontalGroup(
238  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
239  .addGroup(layout.createSequentialGroup()
240  .addContainerGap()
241  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
242  .addGroup(layout.createSequentialGroup()
243  .addComponent(jLabel1)
244  .addGap(0, 0, Short.MAX_VALUE))
245  .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
246  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
247  .addGroup(layout.createSequentialGroup()
248  .addComponent(jLabel2)
249  .addGap(0, 0, Short.MAX_VALUE))
250  .addComponent(jScrollPane1))
251  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
252  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
253  .addComponent(deselectAllButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
254  .addComponent(selectAllButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
255  .addGroup(layout.createSequentialGroup()
256  .addComponent(outputFolderTextField)
257  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
258  .addComponent(chooseOutputFolderButton)))
259  .addContainerGap())
260  );
261 
262  layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {deselectAllButton, selectAllButton});
263 
264  layout.setVerticalGroup(
265  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
266  .addGroup(layout.createSequentialGroup()
267  .addContainerGap()
268  .addComponent(jLabel1)
269  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
270  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
271  .addGroup(layout.createSequentialGroup()
272  .addComponent(selectAllButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
273  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
274  .addComponent(deselectAllButton))
275  .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 132, Short.MAX_VALUE))
276  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
277  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
278  .addGroup(layout.createSequentialGroup()
279  .addComponent(jLabel2)
280  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
281  .addComponent(outputFolderTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
282  .addComponent(chooseOutputFolderButton))
283  .addContainerGap())
284  );
285  }// </editor-fold>//GEN-END:initComponents
286 
287  private void selectAllButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_selectAllButtonActionPerformed
288  for (TagName tagName : tagNames) {
289  tagNameSelections.put(tagName.getDisplayName(), Boolean.TRUE);
290  }
291  tagNamesListBox.repaint();
292  }//GEN-LAST:event_selectAllButtonActionPerformed
293 
294  private void deselectAllButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deselectAllButtonActionPerformed
295  for (TagName tagName : tagNames) {
296  tagNameSelections.put(tagName.getDisplayName(), Boolean.FALSE);
297  }
298  tagNamesListBox.repaint();
299  }//GEN-LAST:event_deselectAllButtonActionPerformed
300 
301  private void chooseOutputFolderButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_chooseOutputFolderButtonActionPerformed
302  JFileChooser fileChooser = new JFileChooser();
303  fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
304 
305  File currentSelection = new File(outputFolderTextField.getText());
306  if (currentSelection.exists()) {
307  fileChooser.setCurrentDirectory(currentSelection);
308  }
309 
310  int result = fileChooser.showOpenDialog(this);
311 
312  if (result == JFileChooser.APPROVE_OPTION) {
313  String outputDir = fileChooser.getSelectedFile().getAbsolutePath();
314  outputFolderTextField.setText(outputDir);
315  }
316  }//GEN-LAST:event_chooseOutputFolderButtonActionPerformed
317 
318 
319  // Variables declaration - do not modify//GEN-BEGIN:variables
320  private javax.swing.JButton chooseOutputFolderButton;
321  private javax.swing.JButton deselectAllButton;
322  private javax.swing.JLabel jLabel1;
323  private javax.swing.JLabel jLabel2;
324  private javax.swing.JScrollPane jScrollPane1;
325  private javax.swing.JTextField outputFolderTextField;
326  private javax.swing.JButton selectAllButton;
327  private javax.swing.JList<String> tagNamesListBox;
328  // End of variables declaration//GEN-END:variables
329 }
Component getListCellRendererComponent(JList<?extends String > list, String value, int index, boolean isSelected, boolean cellHasFocus)

Copyright © 2012-2018 Basis Technology. Generated on: Fri Mar 22 2019
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.