19package org.sleuthkit.autopsy.ingest;
22import java.awt.Component;
23import java.awt.Cursor;
24import java.awt.Dimension;
26import java.awt.Graphics;
27import java.beans.PropertyChangeEvent;
28import java.beans.PropertyChangeListener;
29import java.beans.PropertyChangeSupport;
30import java.text.DateFormat;
31import java.text.SimpleDateFormat;
32import java.util.ArrayList;
33import java.util.Collections;
35import java.util.HashMap;
38import java.util.logging.Level;
39import javax.swing.DefaultComboBoxModel;
40import javax.swing.JLabel;
41import javax.swing.JPanel;
42import javax.swing.JTable;
43import javax.swing.ListSelectionModel;
44import javax.swing.SwingConstants;
45import javax.swing.event.ListSelectionEvent;
46import javax.swing.event.ListSelectionListener;
47import javax.swing.event.TableModelEvent;
48import javax.swing.event.TableModelListener;
49import javax.swing.table.AbstractTableModel;
50import javax.swing.table.DefaultTableCellRenderer;
51import javax.swing.table.TableCellRenderer;
52import org.openide.util.NbBundle;
53import org.sleuthkit.autopsy.coreutils.Logger;
54import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil;
55import org.sleuthkit.autopsy.ingest.IngestMessage.MessageType;
56import org.sleuthkit.datamodel.BlackboardArtifact;
61@SuppressWarnings(
"PMD.SingularField")
62class IngestMessagePanel extends JPanel implements TableModelListener {
64 private final MessageTableModel tableModel;
65 private MessageTableRenderer renderer;
66 private final IngestMessageMainPanel mainPanel;
67 private static final Color ERROR_COLOR =
new Color(255, 90, 90);
68 private volatile int lastRowSelected = -1;
69 private volatile long totalMessages = 0;
71 private static final PropertyChangeSupport messagePcs =
new PropertyChangeSupport(IngestMessagePanel.class);
72 static final String TOTAL_NUM_MESSAGES_CHANGED =
"TOTAL_NUM_MESSAGES_CHANGED";
73 static final String MESSAGES_BOX_CLEARED =
"MESSAGES_BOX_CLEARED";
74 static final String TOTAL_NUM_NEW_MESSAGES_CHANGED =
"TOTAL_NUM_NEW_MESSAGES_CHANGED";
79 public IngestMessagePanel(IngestMessageMainPanel mainPanel) {
80 this.mainPanel = mainPanel;
81 tableModel =
new MessageTableModel();
83 customizeComponents();
86 public void markAllSeen() {
87 tableModel.markAllSeen();
90 int getLastRowSelected() {
91 return this.lastRowSelected;
94 synchronized IngestMessageGroup getSelectedMessage() {
95 if (lastRowSelected < 0) {
99 return tableModel.getMessageGroup(lastRowSelected);
102 synchronized IngestMessageGroup getMessageGroup(
int rowNumber) {
103 return tableModel.getMessageGroup(rowNumber);
106 synchronized static void addPropertyChangeSupportListener(PropertyChangeListener l) {
107 messagePcs.addPropertyChangeListener(l);
115 @SuppressWarnings(
"unchecked")
117 private
void initComponents() {
119 jScrollPane1 =
new javax.swing.JScrollPane();
120 messageTable =
new javax.swing.JTable();
121 controlPanel =
new javax.swing.JPanel();
122 sortByLabel =
new javax.swing.JLabel();
123 sortByComboBox =
new javax.swing.JComboBox<>();
124 totalMessagesNameLabel =
new javax.swing.JLabel();
125 totalMessagesNameVal =
new javax.swing.JLabel();
126 totalUniqueMessagesNameLabel =
new javax.swing.JLabel();
127 totalUniqueMessagesNameVal =
new javax.swing.JLabel();
131 jScrollPane1.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1));
132 jScrollPane1.setOpaque(
false);
133 jScrollPane1.setPreferredSize(
new java.awt.Dimension(32767, 32767));
135 messageTable.setBackground(
new java.awt.Color(221, 221, 235));
136 messageTable.setFont(messageTable.getFont().deriveFont(messageTable.getFont().getSize()+1f));
137 messageTable.setModel(tableModel);
138 messageTable.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_OFF);
139 messageTable.setAutoscrolls(
false);
140 messageTable.setCursor(
new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
141 messageTable.setGridColor(
new java.awt.Color(204, 204, 204));
142 messageTable.setOpaque(
false);
143 messageTable.setSelectionForeground(
new java.awt.Color(0, 0, 0));
144 messageTable.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
145 messageTable.setShowHorizontalLines(
false);
146 messageTable.setShowVerticalLines(
false);
147 messageTable.getTableHeader().setReorderingAllowed(
false);
148 jScrollPane1.setViewportView(messageTable);
150 sortByLabel.setText(org.openide.util.NbBundle.getMessage(IngestMessagePanel.class,
"IngestMessagePanel.sortByLabel.text"));
152 sortByComboBox.setToolTipText(org.openide.util.NbBundle.getMessage(IngestMessagePanel.class,
"IngestMessagePanel.sortByComboBox.toolTipText"));
153 sortByComboBox.addActionListener(
new java.awt.event.ActionListener() {
154 public void actionPerformed(java.awt.event.ActionEvent evt) {
155 sortByComboBoxActionPerformed(evt);
159 totalMessagesNameLabel.setText(org.openide.util.NbBundle.getMessage(IngestMessagePanel.class,
"IngestMessagePanel.totalMessagesNameLabel.text"));
161 totalMessagesNameVal.setText(org.openide.util.NbBundle.getMessage(IngestMessagePanel.class,
"IngestMessagePanel.totalMessagesNameVal.text"));
163 totalUniqueMessagesNameLabel.setText(org.openide.util.NbBundle.getMessage(IngestMessagePanel.class,
"IngestMessagePanel.totalUniqueMessagesNameLabel.text"));
165 totalUniqueMessagesNameVal.setText(org.openide.util.NbBundle.getMessage(IngestMessagePanel.class,
"IngestMessagePanel.totalUniqueMessagesNameVal.text"));
167 javax.swing.GroupLayout controlPanelLayout =
new javax.swing.GroupLayout(controlPanel);
168 controlPanel.setLayout(controlPanelLayout);
169 controlPanelLayout.setHorizontalGroup(
170 controlPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
171 .addGroup(controlPanelLayout.createSequentialGroup()
173 .addComponent(sortByLabel)
174 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
175 .addComponent(sortByComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
176 .addGap(101, 101, 101)
177 .addComponent(totalMessagesNameLabel)
178 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
179 .addComponent(totalMessagesNameVal, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
181 .addComponent(totalUniqueMessagesNameLabel)
182 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
183 .addComponent(totalUniqueMessagesNameVal, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
186 controlPanelLayout.setVerticalGroup(
187 controlPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
188 .addGroup(controlPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
189 .addComponent(sortByComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
190 .addComponent(sortByLabel)
191 .addComponent(totalUniqueMessagesNameLabel)
192 .addComponent(totalUniqueMessagesNameVal)
193 .addComponent(totalMessagesNameLabel)
194 .addComponent(totalMessagesNameVal))
197 javax.swing.GroupLayout layout =
new javax.swing.GroupLayout(
this);
198 this.setLayout(layout);
199 layout.setHorizontalGroup(
200 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
201 .addComponent(controlPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
202 .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 376, Short.MAX_VALUE)
204 layout.setVerticalGroup(
205 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
206 .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
207 .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 201, Short.MAX_VALUE)
209 .addComponent(controlPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
213 private void sortByComboBoxActionPerformed(java.awt.event.ActionEvent evt) {
214 synchronized (
this) {
215 if (sortByComboBox.getSelectedIndex() == 0) {
216 tableModel.reSort(
true);
218 tableModel.reSort(
false);
223 private javax.swing.JPanel controlPanel;
224 private javax.swing.JScrollPane jScrollPane1;
225 private javax.swing.JTable messageTable;
226 private javax.swing.JComboBox<String> sortByComboBox;
227 private javax.swing.JLabel sortByLabel;
228 private javax.swing.JLabel totalMessagesNameLabel;
229 private javax.swing.JLabel totalMessagesNameVal;
230 private javax.swing.JLabel totalUniqueMessagesNameLabel;
231 private javax.swing.JLabel totalUniqueMessagesNameVal;
234 private void customizeComponents() {
235 mainPanel.setOpaque(
true);
236 jScrollPane1.setOpaque(
true);
237 messageTable.setOpaque(
false);
243 sortByComboBox.setModel(
new DefaultComboBoxModel<>(
new String[] {
244 NbBundle.getMessage(this.getClass(),
"IngestMessagePanel.sortByComboBox.model.time"),
245 NbBundle.getMessage(this.getClass(),
"IngestMessagePanel.sortByComboBox.model.priority")}));
247 jScrollPane1.setWheelScrollingEnabled(
true);
249 messageTable.setAutoscrolls(
false);
250 messageTable.setShowHorizontalLines(
false);
251 messageTable.setShowVerticalLines(
false);
253 messageTable.getParent().setBackground(messageTable.getBackground());
255 renderer =
new MessageTableRenderer();
256 int numCols = messageTable.getColumnCount();
259 for (
int i = 0; i < numCols; ++i) {
260 messageTable.getColumnModel().getColumn(i).setCellRenderer(renderer);
263 messageTable.setCellSelectionEnabled(
false);
264 messageTable.setColumnSelectionAllowed(
false);
265 messageTable.setRowSelectionAllowed(
true);
266 messageTable.getSelectionModel().addListSelectionListener(
new MessageVisitedSelection());
269 tableModel.addTableModelListener(
this);
273 public void paint(Graphics g) {
277 setTableSize(messageTable.getParent().getSize());
281 public void setPreferredSize(Dimension dmnsn) {
282 super.setPreferredSize(dmnsn);
283 setTableSize(messageTable.getParent().getSize());
286 void setTableSize(Dimension d) {
287 double[] columnWidths =
new double[]{0.20, 0.08, 0.08, 0.49, 0.15};
288 int numCols = messageTable.getColumnCount();
289 for (
int i = 0; i < numCols; ++i) {
290 messageTable.getColumnModel().getColumn(i).setPreferredWidth((
int) (d.width * columnWidths[i]));
295 tableModel.addMessage(m);
299 final int newMsgUnreadUnique = tableModel.getNumberUnreadGroups();
302 messagePcs.firePropertyChange(TOTAL_NUM_MESSAGES_CHANGED, 0, newMsgUnreadUnique);
303 }
catch (Exception e) {
304 logger.log(Level.SEVERE,
"IngestMessagePanel listener threw exception", e);
306 NbBundle.getMessage(
this.getClass(),
307 "IngestMessagePanel.moduleErr.errListenUpdates.text"),
312 this.totalMessagesNameVal.setText(Long.toString(totalMessages));
313 final int totalMessagesUnique = tableModel.getNumberGroups();
314 this.totalUniqueMessagesNameVal.setText(Integer.toString(totalMessagesUnique));
317 public synchronized void clearMessages() {
318 final int origMsgGroups = tableModel.getNumberUnreadGroups();
320 tableModel.clearMessages();
321 totalMessagesNameVal.setText(
"-");
322 totalUniqueMessagesNameVal.setText(
"-");
325 messagePcs.firePropertyChange(MESSAGES_BOX_CLEARED, origMsgGroups, 0);
326 }
catch (Exception e) {
327 logger.log(Level.SEVERE,
"IngestMessagePanel listener threw exception", e);
329 NbBundle.getMessage(
this.getClass(),
330 "IngestMessagePanel.moduleErr.errListenUpdates.text"),
335 public synchronized int getMessagesCount() {
336 return tableModel.getNumberMessages();
339 private synchronized void setVisited(
int rowNumber) {
340 final int origMsgGroups = tableModel.getNumberUnreadGroups();
341 tableModel.setVisited(rowNumber);
342 lastRowSelected = rowNumber;
345 messagePcs.firePropertyChange(TOOL_TIP_TEXT_KEY, origMsgGroups, tableModel.getNumberUnreadGroups());
346 }
catch (Exception e) {
347 logger.log(Level.SEVERE,
"IngestMessagePanel listener threw exception", e);
349 NbBundle.getMessage(
this.getClass(),
350 "IngestMessagePanel.moduleErr.errListenUpdates.text"),
356 public void tableChanged(TableModelEvent e) {
357 int newMessages = tableModel.getNumberNewMessages();
360 messagePcs.firePropertyChange(
new PropertyChangeEvent(tableModel, TOTAL_NUM_NEW_MESSAGES_CHANGED, -1, newMessages));
361 }
catch (Exception ee) {
362 logger.log(Level.SEVERE,
"IngestMessagePanel listener threw exception", ee);
364 NbBundle.getMessage(
this.getClass(),
365 "IngestMessagePanel.moduleErr.errListenUpdates.text"),
373 NbBundle.getMessage(this.getClass(),
"IngestMessagePanel.MsgTableMod.colNames.module"),
374 NbBundle.getMessage(this.getClass(),
"IngestMessagePanel.MsgTableMod.colNames.num"),
375 NbBundle.getMessage(this.getClass(),
"IngestMessagePanel.MsgTableMod.colNames.new"),
376 NbBundle.getMessage(this.getClass(),
"IngestMessagePanel.MsgTableMod.colNames.subject"),
377 NbBundle.getMessage(this.getClass(),
"IngestMessagePanel.MsgTableMod.colNames.timestamp")};
380 private final Map<String, Map<String, List<IngestMessageGroup>>>
groupings =
new HashMap<>();
397 entry.hasBeenSeen(
true);
399 fireTableChanged(
new TableModelEvent(
this));
405 if (!entry.hasBeenSeen()) {
419 total += e.messageGroup.getCount();
427 if (!e.hasBeenVisited) {
428 total += e.messageGroup.getCount();
437 if (!e.hasBeenVisited) {
450 public synchronized Object
getValueAt(
int rowIndex,
int columnIndex) {
458 logger.log(Level.WARNING,
"Requested inbox message at" + rowIndex,
", only have " + numMessages);
463 switch (columnIndex) {
465 ret = entry.messageGroup.getSource();
468 ret = entry.messageGroup.getCount();
471 ret = !entry.hasBeenSeen();
474 ret = entry.messageGroup.getSubject();
477 ret = entry.messageGroup.getDatePosted();
480 logger.log(Level.SEVERE,
"Invalid table column index: {0}", columnIndex);
500 if (e.messageGroup.getUniqueKey().equals(uniqueKey)) {
513 IngestMessageGroup messageGroup =
null;
516 if (!
groupings.containsKey(moduleName)) {
517 groupings.put(moduleName,
new HashMap<>());
519 final Map<String, List<IngestMessageGroup>> groups =
groupings.get(moduleName);
522 List<IngestMessageGroup> uniqGroups = groups.get(uniqueness);
523 if (uniqGroups ==
null) {
525 uniqGroups =
new ArrayList<>();
526 messageGroup =
new IngestMessageGroup(m);
527 uniqGroups.add(messageGroup);
528 groups.put(uniqueness, uniqGroups);
530 final int uniqueGroupsCount = uniqGroups.size();
533 messageGroup = uniqGroups.get(0);
534 for (
int i = 1; i < uniqueGroupsCount; ++i) {
535 messageGroup.addAll(uniqGroups.get(i));
543 uniqGroups.add(messageGroup);
550 this.fireTableRowsDeleted(toRemove, toRemove);
553 }
else if (uniqueGroupsCount == 1) {
554 IngestMessageGroup first = uniqGroups.get(0);
556 if (first.getCount() > 1) {
559 messageGroup = first;
566 this.fireTableRowsDeleted(toRemove, toRemove);
572 messageGroup =
new IngestMessageGroup(m);
573 uniqGroups.add(messageGroup);
579 messageGroup =
new IngestMessageGroup(m);
580 uniqGroups.add(messageGroup);
587 messageGroup =
new IngestMessageGroup(m);
593 fireTableRowsInserted(newRowIndex, newRowIndex);
598 fireTableDataChanged();
605 fireTableDataChanged();
611 fireTableCellUpdated(rowNumber, 2);
617 if (!e.hasBeenVisited) {
618 e.hasBeenVisited(
true);
619 fireTableCellUpdated(row, 2);
627 return messageData.get(rowNumber).hasBeenVisited();
635 return messageData.get(rowNumber).messageGroup.getMessageType();
649 public synchronized void reSort(
boolean chronoLogical) {
656 fireTableDataChanged();
659 class TableEntry
implements Comparable<TableEntry> {
661 IngestMessageGroup messageGroup;
662 boolean hasBeenVisited =
false;
663 boolean hasBeenSeen =
false;
665 public boolean hasBeenVisited() {
666 return hasBeenVisited;
669 public void hasBeenVisited(
boolean visited) {
670 hasBeenVisited = visited;
673 public boolean hasBeenSeen() {
677 public void hasBeenSeen(
boolean seen) {
681 TableEntry(IngestMessageGroup messageGroup) {
682 this.messageGroup = messageGroup;
686 public int compareTo(TableEntry o) {
687 if (chronoSort ==
true) {
688 return this.messageGroup.getDatePosted().compareTo(o.messageGroup.getDatePosted());
690 return messageGroup.getCount() - o.messageGroup.getCount();
698 static class IngestMessageGroup {
700 static final Color VERY_HIGH_PRI_COLOR =
new Color(164, 164, 202);
701 static final Color HIGH_PRI_COLOR =
new Color(180, 180, 211);
702 static final Color MED_PRI_COLOR =
new Color(199, 199, 222);
703 static final Color LOW_PRI_COLOR =
new Color(221, 221, 235);
704 private final List<IngestMessage> messages;
706 IngestMessageGroup(IngestMessage message) {
707 messages =
new ArrayList<>();
708 messages.add(message);
711 private List<IngestMessage> getMessages() {
715 synchronized void add(IngestMessage message) {
716 messages.add(message);
720 synchronized void addAll(IngestMessageGroup group) {
721 for (IngestMessage m : group.getMessages()) {
726 synchronized int getCount() {
727 return messages.size();
730 synchronized String getDetails() {
731 StringBuilder b =
new StringBuilder(
"");
732 for (IngestMessage m : messages) {
733 String details = m.getDetails();
734 if (details ==
null || details.equals(
"")) {
750 synchronized Color getColor() {
751 int count = messages.size();
753 return VERY_HIGH_PRI_COLOR;
754 }
else if (count < 5) {
755 return HIGH_PRI_COLOR;
756 }
else if (count < 15) {
757 return MED_PRI_COLOR;
759 return LOW_PRI_COLOR;
768 synchronized Date getDatePosted() {
769 return messages.get(messages.size() - 1).getDatePosted();
777 synchronized String getSubject() {
778 return messages.get(0).getSubject();
784 synchronized String getUniqueKey() {
785 return messages.get(0).getUniqueKey();
791 synchronized String getSource() {
792 return messages.get(0).getSource();
798 synchronized BlackboardArtifact getData() {
799 return messages.get(0).getData();
805 synchronized IngestMessage.MessageType getMessageType() {
806 return messages.get(0).getMessageType();
828 if (value instanceof Boolean) {
829 return booleanRenderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
830 }
else if (value instanceof Date) {
831 return dateRenderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
833 return defaultRenderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
843 private final String
bulletChar =
new String(Character.toChars(0x2022));
848 super.setForeground(table.getSelectionForeground());
849 super.setBackground(table.getSelectionBackground());
852 if (value instanceof Boolean) {
853 boolVal = ((Boolean) value);
855 throw new RuntimeException(NbBundle.getMessage(
this.getClass(),
856 "IngestMessagePanel.BooleanRenderer.exception.nonBoolVal.msg"));
861 JLabel cell = (JLabel) super.getTableCellRendererComponent(table, aValue, isSelected, hasFocus, row, column);
864 cell.setHorizontalAlignment(SwingConstants.CENTER);
867 cell.setFont(cell.getFont().deriveFont(Font.PLAIN, cell.getFont().getSize()+5));
869 final IngestMessageGroup messageGroup = tableModel.getMessageGroup(row);
870 if (messageGroup !=
null) {
873 cell.setBackground(ERROR_COLOR);
875 cell.setBackground(Color.orange);
878 cell.setBackground(messageGroup.getColor());
893 JTable table, Object value,
894 boolean isSelected,
boolean hasFocus,
895 int row,
int column) {
897 Component cell = super.getTableCellRendererComponent(
898 table, value,
false,
false, row, column);
900 Font visitedFont = cell.getFont().deriveFont(Font.PLAIN, cell.getFont().getSize()+1);
901 Font notVisitedFont = cell.getFont().deriveFont(Font.BOLD, cell.getFont().getSize()+1);
904 String subject = (String) value;
905 setToolTipText(subject);
906 if (tableModel.isVisited(row)) {
907 cell.setFont(visitedFont);
909 cell.setFont(notVisitedFont);
913 final IngestMessageGroup messageGroup = tableModel.getMessageGroup(row);
914 if (messageGroup !=
null) {
917 cell.setBackground(ERROR_COLOR);
919 cell.setBackground(Color.orange);
922 cell.setBackground(messageGroup.getColor());
934 super.setForeground(table.getSelectionForeground());
935 super.setBackground(table.getSelectionBackground());
937 Object aValue = value;
938 if (value instanceof Date) {
939 Date date = (Date) value;
940 DateFormat df =
new SimpleDateFormat(
"yyyy/MM/dd HH:mm:ss");
941 aValue = df.format(date);
943 throw new RuntimeException(NbBundle.getMessage(
this.getClass(),
944 "IngestMessagePanel.DateRenderer.exception.nonDateVal.text"));
947 Component cell = super.getTableCellRendererComponent(table, aValue, isSelected, hasFocus, row, column);
949 final IngestMessageGroup messageGroup = tableModel.getMessageGroup(row);
950 if (messageGroup !=
null) {
953 cell.setBackground(ERROR_COLOR);
955 cell.setBackground(Color.orange);
958 cell.setBackground(messageGroup.getColor());
973 ListSelectionModel selModel = (ListSelectionModel) e.getSource();
974 if (selModel.isSelectionEmpty() || selModel.getValueIsAdjusting()) {
978 final int minIndex = selModel.getMinSelectionIndex();
979 final int maxIndex = selModel.getMaxSelectionIndex();
981 for (
int i = minIndex; i <= maxIndex; i++) {
982 if (selModel.isSelectedIndex(i)) {
987 selModel.clearSelection();
988 if (selected != -1) {
989 setVisited(selected);
990 messageTable.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
992 IngestMessageGroup m = getMessageGroup(selected);
994 String details = m.getDetails();
995 if (details !=
null && !details.equals(
"")) {
996 mainPanel.showDetails(selected);
999 messageTable.setCursor(
null);
synchronized static Logger getLogger(String name)
static void show(String title, String message, MessageType type, ActionListener actionListener)
MessageType getMessageType()
Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
static final int MESSAGE_GROUP_THRESH
synchronized int getTableEntryIndex(String uniqueKey)
String getColumnName(int column)
synchronized void addMessage(IngestMessage m)
synchronized void clearMessages()
final List< TableEntry > messageData
synchronized boolean isVisited(int rowNumber)
synchronized int getNumberNewMessages()
Class<?> getColumnClass(int c)
synchronized void setVisited(int rowNumber)
synchronized int getNumberMessages()
synchronized IngestMessageGroup getMessageGroup(int rowNumber)
synchronized Object getValueAt(int rowIndex, int columnIndex)
synchronized void setVisitedAll()
synchronized void reSort(boolean chronoLogical)
final Map< String, Map< String, List< IngestMessageGroup > > > groupings
final String[] columnNames
synchronized int getNumberUnreadGroups()
synchronized MessageType getMessageType(int rowNumber)
synchronized void markAllSeen()
synchronized int getNumberUnreadMessages()
boolean isCellEditable(int rowIndex, int columnIndex)
synchronized int getRowCount()
synchronized int getNumberGroups()
void setRowSelected(int rowSelected)
Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
final TableCellRenderer dateRenderer
final TableCellRenderer booleanRenderer
final TableCellRenderer defaultRenderer
void valueChanged(ListSelectionEvent e)