19 package org.sleuthkit.autopsy.ingest;
21 import java.awt.Color;
22 import java.awt.Component;
23 import java.awt.Cursor;
24 import java.awt.Dimension;
26 import java.awt.Graphics;
27 import java.beans.PropertyChangeEvent;
28 import java.beans.PropertyChangeListener;
29 import java.beans.PropertyChangeSupport;
30 import java.text.DateFormat;
31 import java.text.SimpleDateFormat;
32 import java.util.ArrayList;
33 import java.util.Collections;
34 import java.util.Date;
35 import java.util.HashMap;
36 import java.util.List;
38 import java.util.logging.Level;
39 import javax.swing.DefaultComboBoxModel;
40 import javax.swing.JLabel;
41 import javax.swing.JPanel;
42 import javax.swing.JTable;
43 import javax.swing.ListSelectionModel;
44 import javax.swing.SwingConstants;
45 import javax.swing.event.ListSelectionEvent;
46 import javax.swing.event.ListSelectionListener;
47 import javax.swing.event.TableModelEvent;
48 import javax.swing.event.TableModelListener;
49 import javax.swing.table.AbstractTableModel;
50 import javax.swing.table.DefaultTableCellRenderer;
51 import javax.swing.table.TableCellRenderer;
52 import org.openide.util.NbBundle;
61 @SuppressWarnings(
"PMD.SingularField")
62 class 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;
70 private static final Logger logger = Logger.getLogger(IngestMessagePanel.class.getName());
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]));
294 public synchronized void addMessage(IngestMessage m) {
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);
305 MessageNotifyUtil.Notify.show(NbBundle.getMessage(
this.getClass(),
"IngestMessagePanel.moduleErr"),
306 NbBundle.getMessage(
this.getClass(),
307 "IngestMessagePanel.moduleErr.errListenUpdates.text"),
308 MessageNotifyUtil.MessageType.ERROR);
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);
328 MessageNotifyUtil.Notify.show(NbBundle.getMessage(
this.getClass(),
"IngestMessagePanel.moduleErr"),
329 NbBundle.getMessage(
this.getClass(),
330 "IngestMessagePanel.moduleErr.errListenUpdates.text"),
331 MessageNotifyUtil.MessageType.ERROR);
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);
348 MessageNotifyUtil.Notify.show(NbBundle.getMessage(
this.getClass(),
"IngestMessagePanel.moduleErr"),
349 NbBundle.getMessage(
this.getClass(),
350 "IngestMessagePanel.moduleErr.errListenUpdates.text"),
351 MessageNotifyUtil.MessageType.ERROR);
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);
363 MessageNotifyUtil.Notify.show(NbBundle.getMessage(
this.getClass(),
"IngestMessagePanel.moduleErr"),
364 NbBundle.getMessage(
this.getClass(),
365 "IngestMessagePanel.moduleErr.errListenUpdates.text"),
366 MessageNotifyUtil.MessageType.ERROR);
372 private final String[] columnNames =
new String[]{
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")};
378 private final List<TableEntry> messageData =
new ArrayList<>();
380 private final Map<String, Map<String, List<IngestMessageGroup>>> groupings =
new HashMap<>();
381 private boolean chronoSort =
true;
382 private static final int MESSAGE_GROUP_THRESH = 3;
387 return columnNames.length;
392 return getNumberGroups();
396 for (TableEntry entry : messageData) {
397 entry.hasBeenSeen(
true);
399 fireTableChanged(
new TableModelEvent(
this));
404 for (TableEntry entry : messageData) {
405 if (!entry.hasBeenSeen()) {
413 return messageData.size();
418 for (TableEntry e : messageData) {
419 total += e.messageGroup.getCount();
426 for (TableEntry e : messageData) {
427 if (!e.hasBeenVisited) {
428 total += e.messageGroup.getCount();
436 for (TableEntry e : messageData) {
437 if (!e.hasBeenVisited) {
446 return columnNames[column];
450 public synchronized Object
getValueAt(
int rowIndex,
int columnIndex) {
453 int numMessages = messageData.size();
454 if (rowIndex > messageData.size() - 1
455 || columnIndex > columnNames.length - 1) {
458 logger.log(Level.WARNING,
"Requested inbox message at" + rowIndex,
", only have " + numMessages);
461 TableEntry entry = messageData.get(rowIndex);
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);
493 return getValueAt(0, c).getClass();
499 for (TableEntry e : messageData) {
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();
531 if (uniqueGroupsCount > MESSAGE_GROUP_THRESH) {
533 messageGroup = uniqGroups.get(0);
534 for (
int i = 1; i < uniqueGroupsCount; ++i) {
535 messageGroup.addAll(uniqGroups.get(i));
543 uniqGroups.add(messageGroup);
547 while ((toRemove = getTableEntryIndex(uniqueness)) != -1) {
548 messageData.remove(toRemove);
550 this.fireTableRowsDeleted(toRemove, toRemove);
553 }
else if (uniqueGroupsCount == 1) {
554 IngestMessageGroup first = uniqGroups.get(0);
556 if (first.getCount() > 1) {
559 messageGroup = first;
563 while ((toRemove = getTableEntryIndex(uniqueness)) != -1) {
564 messageData.remove(toRemove);
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);
591 messageData.add(
new TableEntry(messageGroup));
592 int newRowIndex = messageData.size() - 1;
593 fireTableRowsInserted(newRowIndex, newRowIndex);
596 if (chronoSort ==
false) {
597 Collections.sort(messageData);
598 fireTableDataChanged();
605 fireTableDataChanged();
609 messageData.get(rowNumber).hasBeenVisited(
true);
611 fireTableCellUpdated(rowNumber, 2);
616 for (TableEntry e : messageData) {
617 if (!e.hasBeenVisited) {
618 e.hasBeenVisited(
true);
619 fireTableCellUpdated(row, 2);
626 if (rowNumber < messageData.size()) {
627 return messageData.get(rowNumber).hasBeenVisited();
634 if (rowNumber < messageData.size()) {
635 return messageData.get(rowNumber).messageGroup.getMessageType();
642 if (rowNumber < messageData.size()) {
643 return messageData.get(rowNumber).messageGroup;
649 public synchronized void reSort(
boolean chronoLogical) {
650 if (chronoSort == chronoLogical) {
654 chronoSort = chronoLogical;
655 Collections.sort(messageData);
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();
823 this.rowSelected = rowSelected;
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"));
859 String aValue = boolVal ? bulletChar :
"";
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(
"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 int getRowCount()
synchronized int getTableEntryIndex(String uniqueKey)
synchronized IngestMessageGroup getMessageGroup(int rowNumber)
Class<?> getColumnClass(int c)
boolean isCellEditable(int rowIndex, int columnIndex)
synchronized int getNumberNewMessages()
MessageType getMessageType()
synchronized void markAllSeen()
String getColumnName(int column)
synchronized int getNumberUnreadMessages()
synchronized int getNumberUnreadGroups()
Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
void valueChanged(ListSelectionEvent e)
Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
synchronized int getNumberGroups()
Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
synchronized void setVisitedAll()
void setRowSelected(int rowSelected)
synchronized void addMessage(IngestMessage m)
Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
synchronized void clearMessages()
synchronized int getNumberMessages()
synchronized static Logger getLogger(String name)
synchronized boolean isVisited(int rowNumber)
synchronized MessageType getMessageType(int rowNumber)
synchronized Object getValueAt(int rowIndex, int columnIndex)
synchronized void setVisited(int rowNumber)
synchronized void reSort(boolean chronoLogical)