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)