diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchListTopComponent.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchListTopComponent.java index 5fa6fd28f0..b8ff025f7e 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchListTopComponent.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchListTopComponent.java @@ -18,6 +18,7 @@ */ package org.sleuthkit.autopsy.keywordsearch; +import java.awt.Component; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.LinkedHashMap; @@ -27,7 +28,11 @@ import java.util.logging.Level; import java.util.logging.Logger; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; +import javax.swing.JLabel; +import javax.swing.JTable; import javax.swing.table.AbstractTableModel; +import javax.swing.table.DefaultTableCellRenderer; +import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; import org.openide.util.NbBundle; import org.openide.windows.TopComponent; @@ -50,7 +55,7 @@ persistenceType = TopComponent.PERSISTENCE_NEVER) preferredID = "KeywordSearchListTopComponent") public final class KeywordSearchListTopComponent extends TopComponent implements KeywordSearchTopComponentInterface { - private Logger logger = Logger.getLogger(KeywordSearchListTopComponent.class.getName()); + private static Logger logger = Logger.getLogger(KeywordSearchListTopComponent.class.getName()); private KeywordTableModel tableModel; public KeywordSearchListTopComponent() { @@ -75,10 +80,10 @@ public final class KeywordSearchListTopComponent extends TopComponent implements keywordTable.setAutoscrolls(true); keywordTable.setTableHeader(null); - keywordTable.setShowHorizontalLines(false); - keywordTable.setShowVerticalLines(false); - keywordTable.setShowGrid(false); - //TODO removing dotted line of selected cell might require custom renderer + keywordTable.setShowHorizontalLines(true); + keywordTable.setShowVerticalLines(true); + //keywordTable.setShowGrid(false) + //TODO removing dotted line of selected cell might require code in custom renderer final int width = keywordTable.getSize().width; TableColumn column = null; for (int i = 0; i < 2; i++) { @@ -88,21 +93,22 @@ public final class KeywordSearchListTopComponent extends TopComponent implements //column.setCellEditor(new DefaultCellEditor(new JCheckBox())); } else { + column.setCellRenderer(new CellTooltipRenderer()); column.setPreferredWidth(((int) (width * 0.7))); } } keywordTable.setCellSelectionEnabled(false); - //keywordTable.setBorder(BorderFactory.createEmptyBorder()); + //keywordTable.setBorder(BorderFactory.createEmptyBorder()); //create some empty rows tableModel.initEmpty(); - + //test tableModel.addKeyword("\\d\\d\\d-\\d\\d\\d-\\d\\d\\d\\d"); tableModel.addKeyword("\\d\\d\\.\\d\\d\\d\\.*"); tableModel.addKeyword("text"); - + } /** This method is called from within the constructor to @@ -313,7 +319,6 @@ public final class KeywordSearchListTopComponent extends TopComponent implements private void deleteAllWordsButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deleteAllWordsButtonActionPerformed tableModel.deleteAll(); }//GEN-LAST:event_deleteAllWordsButtonActionPerformed - // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton addWordButton; private javax.swing.JTextField addWordField; @@ -370,18 +375,17 @@ public final class KeywordSearchListTopComponent extends TopComponent implements } @Override - public Map getQueryList() { + public Map getQueryList() { List selected = getSelectedKeywords(); //filter out blank just in case - Map ret = new LinkedHashMap(); + Map ret = new LinkedHashMap(); for (String s : selected) { - if (!s.trim().equals("")) + if (!s.trim().equals("")) { ret.put(s, false); + } } return ret; } - - @Override public boolean isLuceneQuerySelected() { @@ -416,8 +420,9 @@ public final class KeywordSearchListTopComponent extends TopComponent implements return tableModel.keywordExists(keyword); } - class KeywordTableModel extends AbstractTableModel { + static class KeywordTableModel extends AbstractTableModel { + private static Logger logger = Logger.getLogger(KeywordTableModel.class.getName()); //data private List keywordData = new ArrayList(); @@ -492,28 +497,29 @@ public final class KeywordSearchListTopComponent extends TopComponent implements keywordData.add(0, new TableEntry(keyword)); this.fireTableRowsInserted(keywordData.size() - 1, keywordData.size()); } - + void deleteAll() { keywordData.clear(); initEmpty(); } - + void deleteSelected() { List toDel = new ArrayList(); int i = 0; - for (TableEntry e: keywordData) { - if (e.isActive && !e.keyword.equals("")) + for (TableEntry e : keywordData) { + if (e.isActive && !e.keyword.equals("")) { toDel.add(e); + } } for (TableEntry del : toDel) { keywordData.remove(del); } fireTableDataChanged(); - + } - + void initEmpty() { - for (int i = 0; i<20; ++i) { + for (int i = 0; i < 20; ++i) { keywordData.add(0, new TableEntry("", false)); } fireTableDataChanged(); @@ -535,4 +541,29 @@ public final class KeywordSearchListTopComponent extends TopComponent implements } } } + + /** + * tooltips that show entire query string + */ + public static class CellTooltipRenderer extends JLabel + implements TableCellRenderer { + + + @Override + public Component getTableCellRendererComponent( + JTable table, Object color, + boolean isSelected, boolean hasFocus, + int row, int column) { + + if (column == 0) { + String val = (String)table.getModel().getValueAt(row, column); + setToolTipText(val); + setText(val); + } + return this; + } + + } + + } diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/TermComponentQuery.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/TermComponentQuery.java index e3e9727f4c..ffda074aaf 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/TermComponentQuery.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/TermComponentQuery.java @@ -157,10 +157,10 @@ public class TermComponentQuery implements KeywordSearchQuery { final SolrQuery q = createQuery(); terms = executeQuery(q); - + //get unique match result files - - + + //combine the terms into single Solr query to get files //it's much more efficient and should yield the same file IDs as per match queries //requires http POST query method due to potentially large query size @@ -172,17 +172,18 @@ public class TermComponentQuery implements KeywordSearchQuery { filesQueryB.append(" "); } List uniqueMatches = new ArrayList(); - - LuceneQuery filesQuery = new LuceneQuery(filesQueryB.toString()); - filesQuery.escape(); //TODO escaping invididual terms above instead could make a difference to Solr - try { - uniqueMatches = filesQuery.performQuery(); - } - catch (RuntimeException e) { - logger.log(Level.SEVERE, "Error executing Solr query,", e); + + if (! terms.isEmpty()) { + LuceneQuery filesQuery = new LuceneQuery(filesQueryB.toString()); + filesQuery.escape(); //TODO escaping invididual terms above instead could make a difference to Solr + try { + uniqueMatches = filesQuery.performQuery(); + } catch (RuntimeException e) { + logger.log(Level.SEVERE, "Error executing Solr query,", e); + } } - + //filter out non-matching files using the original query (whether literal or not) //TODO this could be costly, for now just testing how it performs for (FsContent f : uniqueMatches) {