Autopsy  4.1
Graphical digital forensics platform for The Sleuth Kit and other tools.
OpenRecentCasePanel.java
Go to the documentation of this file.
1 /*
2  * Autopsy Forensic Browser
3  *
4  * Copyright 2011-2017 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.casemodule;
20 
21 import java.awt.event.ActionListener;
22 import java.awt.event.KeyEvent;
23 import java.io.File;
24 import java.util.logging.Level;
25 import javax.swing.JOptionPane;
26 import javax.swing.JTable;
27 import javax.swing.SwingUtilities;
28 import javax.swing.table.AbstractTableModel;
29 import org.openide.util.NbBundle;
30 import org.openide.windows.WindowManager;
32 
36 class OpenRecentCasePanel extends javax.swing.JPanel {
37 
38  private static final long serialVersionUID = 1L;
39  private static final Logger logger = Logger.getLogger(OpenRecentCasePanel.class.getName());
40  private static OpenRecentCasePanel instance;
41  private static String[] caseNames;
42  private static String[] casePaths;
43  private RecentCasesTableModel model;
44 
49  private OpenRecentCasePanel() {
50  initComponents();
51  }
52 
53  /*
54  * Gets the singleton instance of the panel used by the the open recent case
55  * option of the start window.
56  */
57  static OpenRecentCasePanel getInstance() {
58  if (instance == null) {
59  instance = new OpenRecentCasePanel();
60  }
61  instance.refreshRecentCasesTable();
62  return instance;
63  }
64 
70  void setCloseButtonActionListener(ActionListener listener) {
71  this.cancelButton.addActionListener(listener);
72  }
73 
77  private void refreshRecentCasesTable() {
78  caseNames = RecentCases.getInstance().getRecentCaseNames();
79  casePaths = RecentCases.getInstance().getRecentCasePaths();
80  model = new RecentCasesTableModel();
81  imagesTable.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
82  imagesTable.setModel(model);
83 
84  int width = tableScrollPane.getPreferredSize().width;
85  imagesTable.getColumnModel().getColumn(0).setPreferredWidth((int) (.30 * width));
86  imagesTable.getColumnModel().getColumn(1).setPreferredWidth((int) (.70 * width));
87  // If there are any images, let's select the first one
88  if (imagesTable.getRowCount() > 0) {
89  imagesTable.setRowSelectionInterval(0, 0);
90  openButton.setEnabled(true);
91  } else {
92  openButton.setEnabled(false);
93  }
94  }
95 
96  /*
97  * Opens the selected case.
98  */
99  private void openCase() {
100  if (casePaths.length < 1) {
101  return;
102  }
103  final String casePath = casePaths[imagesTable.getSelectedRow()];
104  final String caseName = caseNames[imagesTable.getSelectedRow()];
105  if (!casePath.isEmpty()) {
106  try {
107  StartupWindowProvider.getInstance().close();
108  CueBannerPanel.closeOpenRecentCasesWindow();
109  } catch (Exception ex) {
110  logger.log(Level.SEVERE, "Error closing start up window", ex); //NON-NLS
111  }
112 
113  /*
114  * Open the case.
115  */
116  if (caseName.isEmpty() || casePath.isEmpty() || (!new File(casePath).exists())) {
117  JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(),
118  NbBundle.getMessage(this.getClass(), "RecentItems.openRecentCase.msgDlg.text", caseName),
119  NbBundle.getMessage(this.getClass(), "CaseOpenAction.msgDlg.cantOpenCase.title"),
120  JOptionPane.ERROR_MESSAGE);
121  RecentCases.getInstance().removeRecentCase(caseName, casePath); // remove the recent case if it doesn't exist anymore
122  StartupWindowProvider.getInstance().open();
123  } else {
124  new Thread(() -> {
125  try {
126  Case.openAsCurrentCase(casePath);
127  } catch (CaseActionException ex) {
128  logger.log(Level.SEVERE, String.format("Error opening case with metadata file path %s", casePath), ex); //NON-NLS
129  SwingUtilities.invokeLater(() -> {
130  JOptionPane.showMessageDialog(
131  WindowManager.getDefault().getMainWindow(),
132  ex.getMessage(), // Should be user-friendly
133  NbBundle.getMessage(this.getClass(), "CaseOpenAction.msgDlg.cantOpenCase.title"), //NON-NLS
134  JOptionPane.ERROR_MESSAGE);
135  StartupWindowProvider.getInstance().open();
136  });
137  }
138  }).start();
139  }
140  }
141  }
142 
146  private class RecentCasesTableModel extends AbstractTableModel {
147 
148  private static final long serialVersionUID = 1L;
149 
150  @Override
151  public int getRowCount() {
152  int count = 0;
153  for (String s : caseNames) {
154  if (!s.isEmpty()) {
155  count++;
156  }
157  }
158  return count;
159  }
160 
161  @Override
162  public int getColumnCount() {
163  return 2;
164  }
165 
166  @Override
167  public String getColumnName(int column) {
168  String colName = null;
169  switch (column) {
170  case 0:
171  colName = NbBundle.getMessage(OpenRecentCasePanel.class, "OpenRecentCasePanel.colName.caseName");
172  break;
173  case 1:
174  colName = NbBundle.getMessage(OpenRecentCasePanel.class, "OpenRecentCasePanel.colName.path");
175  break;
176  default:
177  break;
178  }
179  return colName;
180  }
181 
182  @Override
183  public Object getValueAt(int rowIndex, int columnIndex) {
184  Object ret = null;
185  switch (columnIndex) {
186  case 0:
187  ret = caseNames[rowIndex];
188  break;
189  case 1:
190  ret = shortenPath(casePaths[rowIndex]);
191  break;
192  default:
193  logger.log(Level.SEVERE, "Invalid table column index: {0}", columnIndex); //NON-NLS
194  break;
195  }
196  return ret;
197  }
198 
199  @Override
200  public boolean isCellEditable(int rowIndex, int columnIndex) {
201  return false;
202  }
203 
204  @Override
205  public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
206  }
207 
215  private String shortenPath(String path) {
216  String shortenedPath = path;
217  if (shortenedPath.length() > 50) {
218  shortenedPath = path.substring(0, 10 + path.substring(10).indexOf(File.separator) + 1) + "..."
219  + path.substring((path.length() - 20) + path.substring(path.length() - 20).indexOf(File.separator));
220  }
221  return shortenedPath;
222  }
223  }
224 
230  @SuppressWarnings("unchecked")
231  // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
232  private void initComponents() {
233 
234  jLabel1 = new javax.swing.JLabel();
235  cancelButton = new javax.swing.JButton();
236  openButton = new javax.swing.JButton();
237  tableScrollPane = new javax.swing.JScrollPane();
238  imagesTable = new javax.swing.JTable();
239 
240  jLabel1.setText(org.openide.util.NbBundle.getMessage(OpenRecentCasePanel.class, "OpenRecentCasePanel.jLabel1.text")); // NOI18N
241 
242  cancelButton.setText(org.openide.util.NbBundle.getMessage(OpenRecentCasePanel.class, "OpenRecentCasePanel.cancelButton.text")); // NOI18N
243 
244  openButton.setText(org.openide.util.NbBundle.getMessage(OpenRecentCasePanel.class, "OpenRecentCasePanel.openButton.text")); // NOI18N
245  openButton.addActionListener(new java.awt.event.ActionListener() {
246  public void actionPerformed(java.awt.event.ActionEvent evt) {
247  openButtonActionPerformed(evt);
248  }
249  });
250 
251  imagesTable.setModel(new javax.swing.table.DefaultTableModel(
252  new Object [][] {
253 
254  },
255  new String [] {
256 
257  }
258  ));
259  imagesTable.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_OFF);
260  imagesTable.setShowHorizontalLines(false);
261  imagesTable.setShowVerticalLines(false);
262  imagesTable.getTableHeader().setReorderingAllowed(false);
263  imagesTable.setUpdateSelectionOnSort(false);
264  imagesTable.addMouseListener(new java.awt.event.MouseAdapter() {
265  public void mouseClicked(java.awt.event.MouseEvent evt) {
266  imagesTableMouseClicked(evt);
267  }
268  });
269  imagesTable.addKeyListener(new java.awt.event.KeyAdapter() {
270  public void keyPressed(java.awt.event.KeyEvent evt) {
271  imagesTableKeyPressed(evt);
272  }
273  });
274  tableScrollPane.setViewportView(imagesTable);
275 
276  javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
277  this.setLayout(layout);
278  layout.setHorizontalGroup(
279  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
280  .addGroup(layout.createSequentialGroup()
281  .addContainerGap()
282  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
283  .addGroup(layout.createSequentialGroup()
284  .addComponent(jLabel1)
285  .addGap(292, 414, Short.MAX_VALUE))
286  .addGroup(layout.createSequentialGroup()
287  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
288  .addComponent(tableScrollPane)
289  .addGroup(layout.createSequentialGroup()
290  .addGap(0, 0, Short.MAX_VALUE)
291  .addComponent(openButton)
292  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
293  .addComponent(cancelButton)))
294  .addContainerGap())))
295  );
296  layout.setVerticalGroup(
297  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
298  .addGroup(layout.createSequentialGroup()
299  .addContainerGap()
300  .addComponent(jLabel1)
301  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
302  .addComponent(tableScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 168, Short.MAX_VALUE)
303  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
304  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
305  .addComponent(cancelButton)
306  .addComponent(openButton))
307  .addContainerGap())
308  );
309  }// </editor-fold>//GEN-END:initComponents
310 
311  private void openButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_openButtonActionPerformed
312  openCase();
313  }//GEN-LAST:event_openButtonActionPerformed
314 
315  private void imagesTableMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_imagesTableMouseClicked
316  // If it's a doubleclick
317  if (evt.getClickCount() == 2) {
318  openCase();
319  }
320  }//GEN-LAST:event_imagesTableMouseClicked
321 
322  private void imagesTableKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_imagesTableKeyPressed
323  if (evt.getKeyCode() == KeyEvent.VK_ENTER) {
324  openCase();
325  }
326  }//GEN-LAST:event_imagesTableKeyPressed
327 
328  // Variables declaration - do not modify//GEN-BEGIN:variables
329  private javax.swing.JButton cancelButton;
330  private javax.swing.JTable imagesTable;
331  private javax.swing.JLabel jLabel1;
332  private javax.swing.JButton openButton;
333  private javax.swing.JScrollPane tableScrollPane;
334  // End of variables declaration//GEN-END:variables
335 
336 }
synchronized static Logger getLogger(String name)
Definition: Logger.java:161

Copyright © 2012-2016 Basis Technology. Generated on: Mon Apr 24 2017
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.