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;
31 import org.openide.windows.WindowManager;
32 import java.awt.Cursor;
37 class OpenRecentCasePanel
extends javax.swing.JPanel {
39 private static final long serialVersionUID = 1L;
40 private static final Logger logger = Logger.getLogger(OpenRecentCasePanel.class.getName());
41 private static OpenRecentCasePanel instance;
42 private static String[] caseNames;
43 private static String[] casePaths;
44 private RecentCasesTableModel model;
50 private OpenRecentCasePanel() {
58 static OpenRecentCasePanel getInstance() {
59 if (instance == null) {
60 instance =
new OpenRecentCasePanel();
62 instance.refreshRecentCasesTable();
71 void setCloseButtonActionListener(ActionListener listener) {
72 this.cancelButton.addActionListener(listener);
78 private void refreshRecentCasesTable() {
79 caseNames = RecentCases.getInstance().getRecentCaseNames();
80 casePaths = RecentCases.getInstance().getRecentCasePaths();
81 model =
new RecentCasesTableModel();
82 imagesTable.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
83 imagesTable.setModel(model);
85 int width = tableScrollPane.getPreferredSize().width;
86 imagesTable.getColumnModel().getColumn(0).setPreferredWidth((
int) (.30 * width));
87 imagesTable.getColumnModel().getColumn(1).setPreferredWidth((
int) (.70 * width));
89 if (imagesTable.getRowCount() > 0) {
90 imagesTable.setRowSelectionInterval(0, 0);
91 openButton.setEnabled(
true);
93 openButton.setEnabled(
false);
100 private void openCase() {
101 if (casePaths.length < 1) {
104 final String casePath = casePaths[imagesTable.getSelectedRow()];
105 final String caseName = caseNames[imagesTable.getSelectedRow()];
106 if (!casePath.equals(
"")) {
108 StartupWindowProvider.getInstance().close();
109 CueBannerPanel.closeOpenRecentCasesWindow();
110 }
catch (Exception ex) {
111 logger.log(Level.SEVERE,
"Error closing start up window", ex);
117 if (caseName.equals(
"") || casePath.equals(
"") || (!
new File(casePath).exists())) {
118 JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(),
119 NbBundle.getMessage(this.getClass(),
"RecentItems.openRecentCase.msgDlg.text", caseName),
120 NbBundle.getMessage(this.getClass(),
"CaseOpenAction.msgDlg.cantOpenCase.title"),
121 JOptionPane.ERROR_MESSAGE);
122 RecentCases.getInstance().removeRecentCase(caseName, casePath);
123 if (Case.isCaseOpen() ==
false) {
124 StartupWindowProvider.getInstance().open();
127 SwingUtilities.invokeLater(() -> {
128 WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
133 }
catch (CaseActionException ex) {
134 SwingUtilities.invokeLater(() -> {
135 logger.log(Level.SEVERE, String.format(
"Error opening case with metadata file path %s", casePath), ex);
136 WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
137 JOptionPane.showMessageDialog(
138 WindowManager.getDefault().getMainWindow(),
140 NbBundle.getMessage(this.getClass(),
"CaseOpenAction.msgDlg.cantOpenCase.title"),
141 JOptionPane.ERROR_MESSAGE);
142 if (!Case.isCaseOpen()) {
143 StartupWindowProvider.getInstance().open();
157 private static final long serialVersionUID = 1L;
162 for (String s : caseNames) {
177 String colName = null;
180 colName = NbBundle.getMessage(OpenRecentCasePanel.class,
"OpenRecentCasePanel.colName.caseName");
183 colName = NbBundle.getMessage(OpenRecentCasePanel.class,
"OpenRecentCasePanel.colName.path");
194 switch (columnIndex) {
196 ret = caseNames[rowIndex];
202 logger.log(Level.SEVERE,
"Invalid table column index: {0}", columnIndex);
214 public void setValueAt(Object aValue,
int rowIndex,
int columnIndex) {
225 String shortenedPath = path;
226 if (shortenedPath.length() > 50) {
227 shortenedPath = path.substring(0, 10 + path.substring(10).indexOf(File.separator) + 1) +
"..."
228 + path.substring((path.length() - 20) + path.substring(path.length() - 20).indexOf(File.separator));
230 return shortenedPath;
239 @SuppressWarnings(
"unchecked")
241 private
void initComponents() {
243 jLabel1 =
new javax.swing.JLabel();
244 cancelButton =
new javax.swing.JButton();
245 openButton =
new javax.swing.JButton();
246 tableScrollPane =
new javax.swing.JScrollPane();
247 imagesTable =
new javax.swing.JTable();
249 jLabel1.setText(
org.openide.util.NbBundle.getMessage(OpenRecentCasePanel.class,
"OpenRecentCasePanel.jLabel1.text"));
251 cancelButton.setText(
org.openide.util.NbBundle.getMessage(OpenRecentCasePanel.class,
"OpenRecentCasePanel.cancelButton.text"));
253 openButton.setText(
org.openide.util.NbBundle.getMessage(OpenRecentCasePanel.class,
"OpenRecentCasePanel.openButton.text"));
254 openButton.addActionListener(
new java.awt.event.ActionListener() {
255 public void actionPerformed(java.awt.event.ActionEvent evt) {
256 openButtonActionPerformed(evt);
260 imagesTable.setModel(
new javax.swing.table.DefaultTableModel(
268 imagesTable.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_OFF);
269 imagesTable.setShowHorizontalLines(
false);
270 imagesTable.setShowVerticalLines(
false);
271 imagesTable.getTableHeader().setReorderingAllowed(
false);
272 imagesTable.setUpdateSelectionOnSort(
false);
273 imagesTable.addMouseListener(
new java.awt.event.MouseAdapter() {
274 public void mouseClicked(java.awt.event.MouseEvent evt) {
275 imagesTableMouseClicked(evt);
278 imagesTable.addKeyListener(
new java.awt.event.KeyAdapter() {
279 public void keyPressed(java.awt.event.KeyEvent evt) {
280 imagesTableKeyPressed(evt);
283 tableScrollPane.setViewportView(imagesTable);
285 javax.swing.GroupLayout layout =
new javax.swing.GroupLayout(
this);
286 this.setLayout(layout);
287 layout.setHorizontalGroup(
288 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
289 .addGroup(layout.createSequentialGroup()
291 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
292 .addGroup(layout.createSequentialGroup()
293 .addComponent(jLabel1)
294 .addGap(292, 414, Short.MAX_VALUE))
295 .addGroup(layout.createSequentialGroup()
296 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
297 .addComponent(tableScrollPane)
298 .addGroup(layout.createSequentialGroup()
299 .addGap(0, 0, Short.MAX_VALUE)
300 .addComponent(openButton)
301 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
302 .addComponent(cancelButton)))
303 .addContainerGap())))
305 layout.setVerticalGroup(
306 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
307 .addGroup(layout.createSequentialGroup()
309 .addComponent(jLabel1)
310 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
311 .addComponent(tableScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 168, Short.MAX_VALUE)
312 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
313 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
314 .addComponent(cancelButton)
315 .addComponent(openButton))
320 private void openButtonActionPerformed(java.awt.event.ActionEvent evt) {
324 private void imagesTableMouseClicked(java.awt.event.MouseEvent evt) {
326 if (evt.getClickCount() == 2) {
331 private void imagesTableKeyPressed(java.awt.event.KeyEvent evt) {
332 if (evt.getKeyCode() == KeyEvent.VK_ENTER) {
338 private javax.swing.JButton cancelButton;
339 private javax.swing.JTable imagesTable;
340 private javax.swing.JLabel jLabel1;
341 private javax.swing.JButton openButton;
342 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)