19 package org.sleuthkit.autopsy.casemodule;
21 import java.awt.event.ActionListener;
22 import java.awt.event.KeyEvent;
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;
38 class OpenRecentCasePanel
extends javax.swing.JPanel {
40 private static final long serialVersionUID = 1L;
41 private static final Logger logger = Logger.getLogger(OpenRecentCasePanel.class.getName());
42 private static OpenRecentCasePanel instance;
43 private static String[] caseNames;
44 private static String[] casePaths;
45 private RecentCasesTableModel model;
51 private OpenRecentCasePanel() {
59 static OpenRecentCasePanel getInstance() {
60 if (instance == null) {
61 instance =
new OpenRecentCasePanel();
63 instance.refreshRecentCasesTable();
72 void setCloseButtonActionListener(ActionListener listener) {
73 this.cancelButton.addActionListener(listener);
79 private void refreshRecentCasesTable() {
80 caseNames = RecentCases.getInstance().getRecentCaseNames();
81 casePaths = RecentCases.getInstance().getRecentCasePaths();
82 model =
new RecentCasesTableModel();
83 imagesTable.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
84 imagesTable.setModel(model);
86 int width = tableScrollPane.getPreferredSize().width;
87 imagesTable.getColumnModel().getColumn(0).setPreferredWidth((
int) (.30 * width));
88 imagesTable.getColumnModel().getColumn(1).setPreferredWidth((
int) (.70 * width));
90 if (imagesTable.getRowCount() > 0) {
91 imagesTable.setRowSelectionInterval(0, 0);
92 openButton.setEnabled(
true);
94 openButton.setEnabled(
false);
101 @NbBundle.Messages({
"# {0} - case name",
102 "RecentItems.openRecentCase.msgDlg.text=Case {0} no longer exists.",
103 "CaseOpenAction.msgDlg.cantOpenCase.title=Error Opening Case"})
104 @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
105 private void openCase() {
106 if (casePaths.length < 1) {
109 final String caseMetadataFilePath = casePaths[imagesTable.getSelectedRow()];
110 final String caseName = caseNames[imagesTable.getSelectedRow()];
111 if (!caseMetadataFilePath.isEmpty()) {
113 StartupWindowProvider.getInstance().close();
114 CueBannerPanel.closeOpenRecentCasesWindow();
115 }
catch (Exception ex) {
116 logger.log(Level.SEVERE,
"Error closing start up window", ex);
120 if (caseName.isEmpty() || caseMetadataFilePath.isEmpty() || (!
new File(caseMetadataFilePath).exists())) {
122 JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(),
123 RecentItems_openRecentCase_msgDlg_text(caseName),
124 CaseOpenAction_msgDlg_cantOpenCase_title(),
125 JOptionPane.ERROR_MESSAGE);
126 RecentCases.getInstance().removeRecentCase(caseName, caseMetadataFilePath);
127 StartupWindowProvider.getInstance().open();
132 Case.openAsCurrentCase(caseMetadataFilePath);
133 }
catch (CaseActionException ex) {
134 SwingUtilities.invokeLater(() -> {
135 if (!(ex instanceof CaseActionCancelledException)) {
136 logger.log(Level.SEVERE, String.format(
"Error opening case with metadata file path %s", caseMetadataFilePath), ex);
138 JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(),
139 ex.getLocalizedMessage(),
140 CaseOpenAction_msgDlg_cantOpenCase_title(),
141 JOptionPane.ERROR_MESSAGE);
143 StartupWindowProvider.getInstance().open();
156 private static final long serialVersionUID = 1L;
161 for (String s : caseNames) {
176 String colName = null;
179 colName = NbBundle.getMessage(OpenRecentCasePanel.class,
"OpenRecentCasePanel.colName.caseName");
182 colName = NbBundle.getMessage(OpenRecentCasePanel.class,
"OpenRecentCasePanel.colName.path");
193 switch (columnIndex) {
195 ret = caseNames[rowIndex];
201 logger.log(Level.SEVERE,
"Invalid table column index: {0}", columnIndex);
213 public void setValueAt(Object aValue,
int rowIndex,
int columnIndex) {
224 String shortenedPath = path;
225 if (shortenedPath.length() > 50) {
226 shortenedPath = path.substring(0, 10 + path.substring(10).indexOf(File.separator) + 1) +
"..."
227 + path.substring((path.length() - 20) + path.substring(path.length() - 20).indexOf(File.separator));
229 return shortenedPath;
238 @SuppressWarnings(
"unchecked")
240 private
void initComponents() {
242 jLabel1 =
new javax.swing.JLabel();
243 cancelButton =
new javax.swing.JButton();
244 openButton =
new javax.swing.JButton();
245 tableScrollPane =
new javax.swing.JScrollPane();
246 imagesTable =
new javax.swing.JTable();
248 jLabel1.setText(
org.openide.util.NbBundle.getMessage(OpenRecentCasePanel.class,
"OpenRecentCasePanel.jLabel1.text"));
250 cancelButton.setText(
org.openide.util.NbBundle.getMessage(OpenRecentCasePanel.class,
"OpenRecentCasePanel.cancelButton.text"));
252 openButton.setText(
org.openide.util.NbBundle.getMessage(OpenRecentCasePanel.class,
"OpenRecentCasePanel.openButton.text"));
253 openButton.addActionListener(
new java.awt.event.ActionListener() {
254 public void actionPerformed(java.awt.event.ActionEvent evt) {
255 openButtonActionPerformed(evt);
259 imagesTable.setModel(
new javax.swing.table.DefaultTableModel(
267 imagesTable.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_OFF);
268 imagesTable.setShowHorizontalLines(
false);
269 imagesTable.setShowVerticalLines(
false);
270 imagesTable.getTableHeader().setReorderingAllowed(
false);
271 imagesTable.setUpdateSelectionOnSort(
false);
272 imagesTable.addMouseListener(
new java.awt.event.MouseAdapter() {
273 public void mouseClicked(java.awt.event.MouseEvent evt) {
274 imagesTableMouseClicked(evt);
277 imagesTable.addKeyListener(
new java.awt.event.KeyAdapter() {
278 public void keyPressed(java.awt.event.KeyEvent evt) {
279 imagesTableKeyPressed(evt);
282 tableScrollPane.setViewportView(imagesTable);
284 javax.swing.GroupLayout layout =
new javax.swing.GroupLayout(
this);
285 this.setLayout(layout);
286 layout.setHorizontalGroup(
287 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
288 .addGroup(layout.createSequentialGroup()
290 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
291 .addGroup(layout.createSequentialGroup()
292 .addComponent(jLabel1)
293 .addGap(292, 414, Short.MAX_VALUE))
294 .addGroup(layout.createSequentialGroup()
295 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
296 .addComponent(tableScrollPane)
297 .addGroup(layout.createSequentialGroup()
298 .addGap(0, 0, Short.MAX_VALUE)
299 .addComponent(openButton)
300 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
301 .addComponent(cancelButton)))
302 .addContainerGap())))
304 layout.setVerticalGroup(
305 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
306 .addGroup(layout.createSequentialGroup()
308 .addComponent(jLabel1)
309 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
310 .addComponent(tableScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 168, Short.MAX_VALUE)
311 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
312 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
313 .addComponent(cancelButton)
314 .addComponent(openButton))
319 private void openButtonActionPerformed(java.awt.event.ActionEvent evt) {
323 private void imagesTableMouseClicked(java.awt.event.MouseEvent evt) {
325 if (evt.getClickCount() == 2) {
330 private void imagesTableKeyPressed(java.awt.event.KeyEvent evt) {
331 if (evt.getKeyCode() == KeyEvent.VK_ENTER) {
337 private javax.swing.JButton cancelButton;
338 private javax.swing.JTable imagesTable;
339 private javax.swing.JLabel jLabel1;
340 private javax.swing.JButton openButton;
341 private javax.swing.JScrollPane tableScrollPane;
String getColumnName(int column)
String shortenPath(String path)
Object getValueAt(int rowIndex, int columnIndex)
boolean isCellEditable(int rowIndex, int columnIndex)
void setValueAt(Object aValue, int rowIndex, int columnIndex)