19 package org.sleuthkit.autopsy.corecomponents;
21 import com.google.common.eventbus.Subscribe;
22 import java.awt.Component;
23 import java.awt.Cursor;
24 import java.awt.dnd.DnDConstants;
25 import java.awt.event.MouseAdapter;
26 import java.awt.event.MouseEvent;
27 import java.beans.FeatureDescriptor;
28 import java.beans.PropertyChangeEvent;
29 import java.beans.PropertyVetoException;
30 import java.lang.reflect.InvocationTargetException;
31 import java.util.ArrayList;
32 import java.util.Comparator;
33 import java.util.HashMap;
34 import java.util.LinkedList;
35 import java.util.List;
37 import java.util.Queue;
38 import java.util.TreeMap;
39 import java.util.TreeSet;
40 import java.util.concurrent.ConcurrentHashMap;
41 import java.util.logging.Level;
42 import java.util.prefs.PreferenceChangeEvent;
43 import java.util.prefs.Preferences;
44 import javax.swing.ImageIcon;
45 import javax.swing.JOptionPane;
46 import javax.swing.JTable;
47 import javax.swing.ListSelectionModel;
48 import static javax.swing.SwingConstants.CENTER;
49 import javax.swing.SwingUtilities;
50 import javax.swing.UIManager;
51 import javax.swing.event.ChangeEvent;
52 import javax.swing.event.ListSelectionEvent;
53 import javax.swing.event.TableColumnModelEvent;
54 import javax.swing.event.TableColumnModelListener;
55 import javax.swing.event.TreeExpansionListener;
56 import javax.swing.table.TableCellRenderer;
57 import javax.swing.table.TableColumn;
58 import javax.swing.table.TableColumnModel;
59 import org.netbeans.swing.etable.ETableColumn;
60 import org.netbeans.swing.etable.ETableColumnModel;
61 import org.netbeans.swing.outline.DefaultOutlineCellRenderer;
62 import org.netbeans.swing.outline.DefaultOutlineModel;
63 import org.netbeans.swing.outline.Outline;
64 import org.openide.explorer.ExplorerManager;
65 import org.openide.explorer.view.OutlineView;
66 import org.openide.nodes.AbstractNode;
67 import org.openide.nodes.Children;
68 import org.openide.nodes.Node;
69 import org.openide.nodes.Node.Property;
70 import org.openide.nodes.NodeEvent;
71 import org.openide.nodes.NodeListener;
72 import org.openide.nodes.NodeMemberEvent;
73 import org.openide.nodes.NodeReorderEvent;
74 import org.openide.util.ImageUtilities;
75 import org.openide.util.NbBundle;
76 import org.openide.util.NbPreferences;
77 import org.openide.util.lookup.ServiceProvider;
101 @ServiceProvider(service = DataResultViewer.class)
102 @SuppressWarnings(
"PMD.SingularField")
105 private static final long serialVersionUID = 1L;
109 private static final int SAMPLE_ROW_NUM = 100;
112 private static final int COLUMN_PADDING = 15;
115 private static final int MIN_COLUMN_WIDTH = 30;
118 private static final int MAX_COLUMN_WIDTH = 300;
121 private static final int MIN_ROW_HEIGHT = 10;
124 private static final int SCROLL_BAR_WIDTH = ((Integer) UIManager.get(
"ScrollBar.width")).intValue();
127 private static final int FIRST_COL_ADDITIONAL_WIDTH = 0;
129 private static final String NOTEPAD_ICON_PATH =
"org/sleuthkit/autopsy/images/notepad16.png";
130 private static final String RED_CIRCLE_ICON_PATH =
"org/sleuthkit/autopsy/images/red-circle-exclamation.png";
131 private static final String YELLOW_CIRCLE_ICON_PATH =
"org/sleuthkit/autopsy/images/yellow-circle-yield.png";
132 private static final ImageIcon COMMENT_ICON =
new ImageIcon(ImageUtilities.loadImage(NOTEPAD_ICON_PATH,
false));
133 private static final ImageIcon INTERESTING_SCORE_ICON =
new ImageIcon(ImageUtilities.loadImage(YELLOW_CIRCLE_ICON_PATH,
false));
134 private static final ImageIcon NOTABLE_ICON_SCORE =
new ImageIcon(ImageUtilities.loadImage(RED_CIRCLE_ICON_PATH,
false));
135 @NbBundle.Messages(
"DataResultViewerTable.firstColLbl=Name")
136 static private final String FIRST_COLUMN_LABEL = Bundle.DataResultViewerTable_firstColLbl();
150 private final Map<String, PagingSupport> nodeNameToPagingSupportMap =
new ConcurrentHashMap<>();
165 this(null, Bundle.DataResultViewerTable_title());
178 this(explorerManager, Bundle.DataResultViewerTable_title());
192 super(explorerManager);
194 this.columnMap =
new HashMap<>();
195 this.propertiesMap =
new TreeMap<>();
202 initializePagingSupport();
208 exportCSVButton.setEnabled(
false);
214 outlineView.setAllowedDragActions(DnDConstants.ACTION_NONE);
216 outline = outlineView.getOutline();
217 outline.setRowSelectionAllowed(
true);
218 outline.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
219 outline.setRootVisible(
false);
220 outline.setDragEnabled(
false);
227 outline.getColumnModel().addColumnModelListener(outlineViewListener);
230 outline.getColumnModel().addColumnModelListener(iconRendererListener);
236 outline.getTableHeader().addMouseListener(outlineViewListener);
240 if (pagingSupport == null) {
253 setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
258 nodeNameToPagingSupportMap.values().forEach((ps) -> {
259 ps.postPageSizeChangeEvent();
285 @NbBundle.Messages(
"DataResultViewerTable.title=Table")
310 public
void setNode(Node rootNode) {
311 if (!SwingUtilities.isEventDispatchThread()) {
312 LOGGER.log(Level.SEVERE,
"Attempting to run setNode() from non-EDT thread");
323 outline.unsetQuickFilter();
325 this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
327 if (rootNode != null) {
328 this.rootNode = rootNode;
334 String nodeName = rootNode.getName();
335 pagingSupport = nodeNameToPagingSupportMap.get(nodeName);
336 if (pagingSupport == null) {
338 nodeNameToPagingSupportMap.put(nodeName, pagingSupport);
342 rootNode.addNodeListener(
new NodeListener() {
344 public void childrenAdded(NodeMemberEvent nme) {
351 SwingUtilities.invokeLater(() -> {
357 public void childrenRemoved(NodeMemberEvent nme) {
358 SwingUtilities.invokeLater(() -> {
364 public void childrenReordered(NodeReorderEvent nre) {
369 public void nodeDestroyed(NodeEvent ne) {
374 public void propertyChange(PropertyChangeEvent evt) {
385 if (rootNode != null && rootNode.getChildren().getNodesCount() > 0) {
386 this.getExplorerManager().setRootContext(this.rootNode);
387 outline.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
390 Node emptyNode =
new AbstractNode(Children.LEAF);
391 this.getExplorerManager().setRootContext(emptyNode);
392 outline.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
394 outlineView.setPropertyColumns();
397 this.setCursor(null);
408 outlineView.addTreeExpansionListener(listener);
433 List<Node.Property<?>> props = loadColumnOrder();
434 boolean propsExist = props.isEmpty() ==
false;
435 Node.Property<?> firstProp = null;
437 firstProp = props.remove(0);
440 assignColumns(props);
441 if (firstProp != null) {
442 ((DefaultOutlineModel) outline.getOutlineModel()).setNodesColumnLabel(firstProp.getDisplayName());
466 loadColumnVisibility();
473 NodeSelectionInfo selectedChildInfo = ((TableFilterNode) rootNode).getChildNodeSelectionInfo();
474 if (null != selectedChildInfo) {
475 Node[] childNodes = rootNode.getChildren().getNodes(
true);
476 for (
int i = 0; i < childNodes.length; ++i) {
477 Node childNode = childNodes[i];
478 if (selectedChildInfo.
matches(childNode)) {
479 SwingUtilities.invokeLater(() -> {
481 this.getExplorerManager().setExploredContextAndSelection(this.rootNode,
new Node[]{childNode});
482 }
catch (PropertyVetoException ex) {
483 LOGGER.log(Level.SEVERE,
"Failed to select node specified by selected child info", ex);
490 ((TableFilterNode) rootNode).setChildNodeSelectionInfo(null);
509 TableColumnModel columnModel = outline.getColumnModel();
510 int columnCount = columnModel.getColumnCount();
512 for (Map.Entry<Integer, Property<?>> entry : propertiesMap.entrySet()) {
513 final String propName = entry.getValue().getName();
514 if (entry.getKey() < columnCount) {
515 final ETableColumn column = (ETableColumn) columnModel.getColumn(entry.getKey());
516 columnMap.put(propName, column);
528 final TableColumnModel columnModel = outline.getColumnModel();
531 double availableTableWidth = outlineView.getSize().getWidth();
533 for (
int columnIdx = 0; columnIdx < outline.getColumnCount(); columnIdx++) {
534 int columnPadding = (columnIdx == 0) ? FIRST_COL_ADDITIONAL_WIDTH + COLUMN_PADDING : COLUMN_PADDING;
535 TableColumn tableColumn = columnModel.getColumn(columnIdx);
538 int width = MIN_COLUMN_WIDTH;
542 TableCellRenderer headerRenderer = tableColumn.getHeaderRenderer();
543 if (headerRenderer == null) {
544 headerRenderer = outline.getTableHeader().getDefaultRenderer();
546 Object headerValue = tableColumn.getHeaderValue();
547 Component headerComp = headerRenderer.getTableCellRendererComponent(outline, headerValue,
false,
false, 0, columnIdx);
548 width = Math.max(headerComp.getPreferredSize().width + columnPadding, width);
551 Component comp = null;
552 int rowCount = outline.getRowCount();
553 for (
int row = 0; row < Math.min(rowCount, SAMPLE_ROW_NUM); row++) {
554 TableCellRenderer renderer = outline.getCellRenderer(row, columnIdx);
555 comp = outline.prepareRenderer(renderer, row, columnIdx);
556 width = Math.max(comp.getPreferredSize().width + columnPadding, width);
560 if (width > MAX_COLUMN_WIDTH) {
561 width = MAX_COLUMN_WIDTH;
565 if (columnIdx == outline.getColumnCount() - 1) {
566 int rowHeight = comp == null ? MIN_ROW_HEIGHT : comp.getPreferredSize().height;
567 if (headerComp.getPreferredSize().height + rowCount * rowHeight > outlineView.getSize().getHeight()) {
568 availableTableWidth -= SCROLL_BAR_WIDTH;
571 columnModel.getColumn(columnIdx).setPreferredWidth(Math.max(width, (
int) availableTableWidth));
574 columnModel.getColumn(columnIdx).setPreferredWidth(width);
575 availableTableWidth -= width;
581 return outline.getColumnModel();
589 String[] propStrings =
new String[props.size() * 2];
590 for (
int i = 0; i < props.size(); i++) {
591 final Property<?> prop = props.get(i);
592 prop.setValue(
"ComparableColumnTTV", Boolean.TRUE);
595 prop.setValue(
"TreeColumnTTV", Boolean.TRUE);
596 prop.setValue(
"SortingColumnTTV", Boolean.TRUE);
598 propStrings[2 * i] = prop.getName();
599 propStrings[2 * i + 1] = prop.getDisplayName();
601 outlineView.setPropertyColumns(propStrings);
609 if (rootNode == null || propertiesMap.isEmpty()) {
613 TableFilterNode tfn = (TableFilterNode) rootNode;
615 final ETableColumnModel columnModel = (ETableColumnModel) outline.getColumnModel();
616 for (Map.Entry<String, ETableColumn> entry : columnMap.entrySet()) {
617 String columnName = entry.getKey();
618 final String columnHiddenKey = ResultViewerPersistence.getColumnHiddenKey(tfn, columnName);
619 final TableColumn column = entry.getValue();
620 boolean columnHidden = columnModel.isColumnHidden(column);
622 preferences.putBoolean(columnHiddenKey,
true);
624 preferences.remove(columnHiddenKey);
635 if (rootNode == null || propertiesMap.isEmpty()) {
639 TableFilterNode tfn = (TableFilterNode) rootNode;
642 for (Map.Entry<Integer, Property<?>> entry : propertiesMap.entrySet()) {
643 preferences.putInt(ResultViewerPersistence.getColumnPositionKey(tfn, entry.getValue().getName()), entry.getKey());
652 if (rootNode == null || propertiesMap.isEmpty()) {
656 final TableFilterNode tfn = ((TableFilterNode) rootNode);
658 ETableColumnModel columnModel = (ETableColumnModel) outline.getColumnModel();
659 for (Map.Entry<String, ETableColumn> entry : columnMap.entrySet()) {
660 ETableColumn etc = entry.getValue();
661 String columnName = entry.getKey();
663 final String columnSortOrderKey = ResultViewerPersistence.getColumnSortOrderKey(tfn, columnName);
664 final String columnSortRankKey = ResultViewerPersistence.getColumnSortRankKey(tfn, columnName);
665 if (etc.isSorted() && (columnModel.isColumnHidden(etc) ==
false)) {
666 preferences.putBoolean(columnSortOrderKey, etc.isAscending());
667 preferences.putInt(columnSortRankKey, etc.getSortRank());
669 columnModel.setColumnSorted(etc,
true, 0);
670 preferences.remove(columnSortOrderKey);
671 preferences.remove(columnSortRankKey);
684 if (rootNode == null || propertiesMap.isEmpty()) {
688 final TableFilterNode tfn = (TableFilterNode) rootNode;
691 TreeSet<ColumnSortInfo> sortInfos =
new TreeSet<>(Comparator.comparing(ColumnSortInfo::getRank));
692 propertiesMap.entrySet().stream().forEach(entry -> {
693 final String propName = entry.getValue().getName();
695 Integer sortRank = preferences.getInt(ResultViewerPersistence.getColumnSortRankKey(tfn, propName), 0);
697 Boolean sortOrder = preferences.getBoolean(ResultViewerPersistence.getColumnSortOrderKey(tfn, propName),
true);
698 sortInfos.add(
new ColumnSortInfo(entry.getKey(), sortRank, sortOrder));
701 sortInfos.forEach(sortInfo -> outline.setColumnSorted(sortInfo.modelIndex, sortInfo.order, sortInfo.rank));
710 if (rootNode == null || propertiesMap.isEmpty()) {
715 final TableFilterNode tfn = ((TableFilterNode) rootNode);
716 ETableColumnModel columnModel = (ETableColumnModel) outline.getColumnModel();
717 for (Map.Entry<Integer, Property<?>> entry : propertiesMap.entrySet()) {
718 final String propName = entry.getValue().getName();
719 boolean hidden = preferences.getBoolean(ResultViewerPersistence.getColumnHiddenKey(tfn, propName),
false);
720 final TableColumn column = columnMap.get(propName);
721 columnModel.setColumnHidden(column, hidden);
736 List<Property<?>> props = ResultViewerPersistence.getAllChildProperties(rootNode, 100);
743 final TableFilterNode tfn = ((TableFilterNode) rootNode);
744 propertiesMap.clear();
752 int offset = props.size();
756 for (Property<?> prop : props) {
757 Integer value = preferences.getInt(ResultViewerPersistence.getColumnPositionKey(tfn, prop.getName()), -1);
758 if (value >= 0 && value < offset && !propertiesMap.containsKey(value)) {
759 propertiesMap.put(value, prop);
761 propertiesMap.put(offset, prop);
771 compactPropertiesMap();
773 return new ArrayList<>(propertiesMap.values());
783 int size = propertiesMap.size();
784 Queue<Integer> availablePositions =
new LinkedList<>();
785 for (
int i = 0; i < size; i++) {
786 if (!propertiesMap.containsKey(i)) {
787 availablePositions.add(i);
792 if (availablePositions.isEmpty()) {
799 ArrayList<Integer> keys =
new ArrayList<>(propertiesMap.keySet());
800 for (
int key : keys) {
802 propertiesMap.put(availablePositions.remove(), propertiesMap.remove(key));
813 this.outlineView.removeAll();
814 this.outlineView = null;
815 super.clearComponent();
828 this.modelIndex = modelIndex;
852 this.nodeName = nodeName;
857 if (!nodeName.isEmpty()) {
865 postPageChangeEvent();
868 void previousPage() {
870 postPageChangeEvent();
873 @NbBundle.Messages({
"# {0} - totalPages",
874 "DataResultViewerTable.goToPageTextField.msgDlg=Please enter a valid page number between 1 and {0}",
875 "DataResultViewerTable.goToPageTextField.err=Invalid page number"})
877 int originalPage = currentPage;
880 currentPage = Integer.decode(gotoPageTextField.getText());
881 }
catch (NumberFormatException e) {
886 if (currentPage > totalPages || currentPage < 1) {
887 currentPage = originalPage;
888 JOptionPane.showMessageDialog(DataResultViewerTable.this,
889 Bundle.DataResultViewerTable_goToPageTextField_msgDlg(totalPages),
890 Bundle.DataResultViewerTable_goToPageTextField_err(),
891 JOptionPane.WARNING_MESSAGE);
894 postPageChangeEvent();
901 void postPageChangeEvent() {
903 BaseChildFactory.post(nodeName,
new PageChangeEvent(currentPage));
904 }
catch (BaseChildFactory.NoSuchEventBusException ex) {
905 LOGGER.log(Level.WARNING,
"Failed to post page change event.", ex);
907 DataResultViewerTable.this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
915 void postPageSizeChangeEvent() {
919 if (
this == pagingSupport) {
923 BaseChildFactory.post(nodeName,
new PageSizeChangeEvent(UserPreferences.getResultsTablePageSize()));
924 }
catch (BaseChildFactory.NoSuchEventBusException ex) {
925 LOGGER.log(Level.WARNING,
"Failed to post page size change event.", ex);
937 totalPages =
event.getPageCount();
938 if (totalPages > 1) {
940 togglePageControls(
true);
944 if (nodeName.equals(rootNode.getName())) {
956 pageLabel.setVisible(onOff);
957 pagesLabel.setVisible(onOff);
958 pagePrevButton.setVisible(onOff);
959 pageNextButton.setVisible(onOff);
960 pageNumLabel.setVisible(onOff);
961 gotoPageLabel.setVisible(onOff);
962 gotoPageTextField.setVisible(onOff);
963 gotoPageTextField.setVisible(onOff);
968 @NbBundle.Messages({
"# {0} - currentPage",
"# {1} - totalPages",
969 "DataResultViewerTable.pageNumbers.curOfTotal={0} of {1}"})
971 if (totalPages == 0) {
972 pagePrevButton.setEnabled(
false);
973 pageNextButton.setEnabled(
false);
974 pageNumLabel.setText(
"");
975 gotoPageTextField.setText(
"");
976 gotoPageTextField.setEnabled(
false);
978 pageNumLabel.setText(Bundle.DataResultViewerTable_pageNumbers_curOfTotal(Integer.toString(currentPage), Integer.toString(totalPages)));
980 pageNextButton.setEnabled(currentPage != totalPages);
981 pagePrevButton.setEnabled(currentPage != 1);
982 gotoPageTextField.setEnabled(totalPages > 1);
983 gotoPageTextField.setText(
"");
994 @NbBundle.Messages({
"DataResultViewerTable.commentRender.name=C",
995 "DataResultViewerTable.commentRender.toolTip=C(omments) indicates whether the item has a comment",
996 "DataResultViewerTable.scoreRender.name=S",
997 "DataResultViewerTable.scoreRender.toolTip=S(core) indicates whether the item is interesting or notable",
998 "DataResultViewerTable.countRender.name=O",
999 "DataResultViewerTable.countRender.toolTip=O(ccurrences) indicates the number of data sources containing the item in the Central Repository"})
1002 if (e.getSource() instanceof ETableColumnModel) {
1003 TableColumn column = ((TableColumnModel) e.getSource()).getColumn(e.getToIndex());
1004 if (column.getHeaderValue().toString().equals(Bundle.DataResultViewerTable_commentRender_name())) {
1006 outlineView.setPropertyColumnDescription(column.getHeaderValue().toString(), Bundle.DataResultViewerTable_commentRender_toolTip());
1008 }
else if (column.getHeaderValue().toString().equals(Bundle.DataResultViewerTable_scoreRender_name())) {
1010 outlineView.setPropertyColumnDescription(column.getHeaderValue().toString(), Bundle.DataResultViewerTable_scoreRender_toolTip());
1012 }
else if (column.getHeaderValue().toString().equals(Bundle.DataResultViewerTable_countRender_name())) {
1013 outlineView.setPropertyColumnDescription(column.getHeaderValue().toString(), Bundle.DataResultViewerTable_countRender_toolTip());
1049 private class TableListener extends MouseAdapter implements TableColumnModelListener {
1053 private int startColumnIndex = -1;
1054 private int endColumnIndex = -1;
1059 int fromIndex = e.getFromIndex();
1060 int toIndex = e.getToIndex();
1061 if (fromIndex == toIndex) {
1075 if (startColumnIndex == -1) {
1076 startColumnIndex = fromIndex;
1078 endColumnIndex = toIndex;
1081 ArrayList<Integer> indicesList =
new ArrayList<>(propertiesMap.keySet());
1082 int leftIndex = Math.min(fromIndex, toIndex);
1083 int rightIndex = Math.max(fromIndex, toIndex);
1086 List<Integer> range = indicesList.subList(leftIndex, rightIndex + 1);
1087 int rangeSize = range.size();
1089 if (fromIndex < toIndex) {
1092 Property<?> movedProp = propertiesMap.get(range.get(0));
1093 for (
int i = 0; i < rangeSize - 1; i++) {
1094 propertiesMap.put(range.get(i), propertiesMap.get(range.get(i + 1)));
1096 propertiesMap.put(range.get(rangeSize - 1), movedProp);
1100 Property<?> movedProp = propertiesMap.get(range.get(rangeSize - 1));
1101 for (
int i = rangeSize - 1; i > 0; i--) {
1102 propertiesMap.put(range.get(i), propertiesMap.get(range.get(i - 1)));
1104 propertiesMap.put(range.get(0), movedProp);
1123 if (startColumnIndex != -1 && (startColumnIndex == 0 || endColumnIndex == 0)) {
1124 outline.moveColumn(endColumnIndex, startColumnIndex);
1126 startColumnIndex = -1;
1132 storeColumnSorting();
1137 columnAddedOrRemoved();
1142 columnAddedOrRemoved();
1151 if (listenToVisibilitEvents) {
1175 this.listenToVisibilitEvents = b;
1185 private static final long serialVersionUID = 1L;
1187 @NbBundle.Messages({
"DataResultViewerTable.commentRenderer.crComment.toolTip=Comment exists in Central Repository",
1188 "DataResultViewerTable.commentRenderer.tagComment.toolTip=Comment exists on associated tag(s)",
1189 "DataResultViewerTable.commentRenderer.crAndTagComment.toolTip=Comments exist both in Central Repository and on associated tag(s)",
1190 "DataResultViewerTable.commentRenderer.noComment.toolTip=No comments found"})
1193 Component component = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
1194 setBackground(component.getBackground());
1195 setHorizontalAlignment(CENTER);
1196 Object switchValue = null;
1200 switchValue = ((Node.Property) value).getValue();
1201 }
catch (IllegalAccessException | InvocationTargetException ex) {
1206 switchValue = value;
1211 switch ((HasCommentStatus) switchValue) {
1213 setIcon(COMMENT_ICON);
1214 setToolTipText(Bundle.DataResultViewerTable_commentRenderer_crComment_toolTip());
1217 setIcon(COMMENT_ICON);
1218 setToolTipText(Bundle.DataResultViewerTable_commentRenderer_tagComment_toolTip());
1220 case CR_AND_TAG_COMMENTS:
1221 setIcon(COMMENT_ICON);
1222 setToolTipText(Bundle.DataResultViewerTable_commentRenderer_crAndTagComment_toolTip());
1224 case TAG_NO_COMMENT:
1228 setToolTipText(Bundle.DataResultViewerTable_commentRenderer_noComment_toolTip());
1245 private static final long serialVersionUID = 1L;
1254 private ImageIcon
getIcon(Significance significance) {
1255 if (significance == null) {
1259 switch (significance) {
1261 return NOTABLE_ICON_SCORE;
1262 case LIKELY_NOTABLE:
1263 return INTERESTING_SCORE_ICON;
1274 Component component = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
1275 setBackground(component.getBackground());
1276 setHorizontalAlignment(CENTER);
1277 Object switchValue = null;
1281 switchValue = ((Node.Property) value).getValue();
1282 setToolTipText(((FeatureDescriptor) value).getShortDescription());
1283 }
catch (IllegalAccessException | InvocationTargetException ex) {
1289 switchValue = value;
1292 if ((switchValue instanceof
org.
sleuthkit.datamodel.Score)) {
1293 setIcon(getIcon(((
org.
sleuthkit.datamodel.Score) switchValue).getSignificance()));
1308 private static final long serialVersionUID = 1L;
1312 Component component = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
1313 setBackground(component.getBackground());
1314 setHorizontalAlignment(LEFT);
1315 Object countValue = null;
1319 countValue = ((Node.Property) value).getValue();
1320 setToolTipText(((FeatureDescriptor) value).getShortDescription());
1321 }
catch (IllegalAccessException | InvocationTargetException ex) {
1329 if ((countValue instanceof Long)) {
1331 if ((Long) countValue >= 0) {
1332 setText(countValue.toString());
1366 @SuppressWarnings(
"unchecked")
1368 private
void initComponents() {
1370 pageLabel =
new javax.swing.JLabel();
1371 pageNumLabel =
new javax.swing.JLabel();
1372 pagesLabel =
new javax.swing.JLabel();
1373 pagePrevButton =
new javax.swing.JButton();
1374 pageNextButton =
new javax.swing.JButton();
1376 gotoPageLabel =
new javax.swing.JLabel();
1377 gotoPageTextField =
new javax.swing.JTextField();
1378 exportCSVButton =
new javax.swing.JButton();
1380 pageLabel.setText(
org.openide.util.NbBundle.getMessage(
DataResultViewerTable.class,
"DataResultViewerTable.pageLabel.text"));
1382 pageNumLabel.setText(
org.openide.util.NbBundle.getMessage(
DataResultViewerTable.class,
"DataResultViewerTable.pageNumLabel.text"));
1384 pagesLabel.setText(
org.openide.util.NbBundle.getMessage(
DataResultViewerTable.class,
"DataResultViewerTable.pagesLabel.text"));
1386 pagePrevButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/corecomponents/btn_step_back.png")));
1387 pagePrevButton.setText(
org.openide.util.NbBundle.getMessage(
DataResultViewerTable.class,
"DataResultViewerTable.pagePrevButton.text"));
1388 pagePrevButton.setDisabledIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/corecomponents/btn_step_back_disabled.png")));
1389 pagePrevButton.setFocusable(
false);
1390 pagePrevButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
1391 pagePrevButton.setMargin(
new java.awt.Insets(2, 0, 2, 0));
1392 pagePrevButton.setPreferredSize(
new java.awt.Dimension(55, 23));
1393 pagePrevButton.setRolloverIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/corecomponents/btn_step_back_hover.png")));
1394 pagePrevButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
1395 pagePrevButton.addActionListener(
new java.awt.event.ActionListener() {
1396 public void actionPerformed(java.awt.event.ActionEvent evt) {
1397 pagePrevButtonActionPerformed(evt);
1401 pageNextButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/corecomponents/btn_step_forward.png")));
1402 pageNextButton.setText(
org.openide.util.NbBundle.getMessage(
DataResultViewerTable.class,
"DataResultViewerTable.pageNextButton.text"));
1403 pageNextButton.setDisabledIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/corecomponents/btn_step_forward_disabled.png")));
1404 pageNextButton.setFocusable(
false);
1405 pageNextButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
1406 pageNextButton.setMargin(
new java.awt.Insets(2, 0, 2, 0));
1407 pageNextButton.setMaximumSize(
new java.awt.Dimension(27, 23));
1408 pageNextButton.setMinimumSize(
new java.awt.Dimension(27, 23));
1409 pageNextButton.setRolloverIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/corecomponents/btn_step_forward_hover.png")));
1410 pageNextButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
1411 pageNextButton.addActionListener(
new java.awt.event.ActionListener() {
1412 public void actionPerformed(java.awt.event.ActionEvent evt) {
1413 pageNextButtonActionPerformed(evt);
1417 gotoPageLabel.setText(
org.openide.util.NbBundle.getMessage(
DataResultViewerTable.class,
"DataResultViewerTable.gotoPageLabel.text"));
1419 gotoPageTextField.setText(
org.openide.util.NbBundle.getMessage(
DataResultViewerTable.class,
"DataResultViewerTable.gotoPageTextField.text"));
1420 gotoPageTextField.addActionListener(
new java.awt.event.ActionListener() {
1421 public void actionPerformed(java.awt.event.ActionEvent evt) {
1422 gotoPageTextFieldActionPerformed(evt);
1426 exportCSVButton.setText(
org.openide.util.NbBundle.getMessage(
DataResultViewerTable.class,
"DataResultViewerTable.exportCSVButton.text"));
1427 exportCSVButton.addActionListener(
new java.awt.event.ActionListener() {
1428 public void actionPerformed(java.awt.event.ActionEvent evt) {
1429 exportCSVButtonActionPerformed(evt);
1433 javax.swing.GroupLayout layout =
new javax.swing.GroupLayout(
this);
1434 this.setLayout(layout);
1435 layout.setHorizontalGroup(
1436 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
1437 .addComponent(outlineView, javax.swing.GroupLayout.DEFAULT_SIZE, 904, Short.MAX_VALUE)
1438 .addGroup(layout.createSequentialGroup()
1440 .addComponent(pageLabel)
1441 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1442 .addComponent(pageNumLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 53, javax.swing.GroupLayout.PREFERRED_SIZE)
1444 .addComponent(pagesLabel)
1445 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
1446 .addComponent(pagePrevButton, javax.swing.GroupLayout.PREFERRED_SIZE, 16, javax.swing.GroupLayout.PREFERRED_SIZE)
1447 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1448 .addComponent(pageNextButton, javax.swing.GroupLayout.PREFERRED_SIZE, 16, javax.swing.GroupLayout.PREFERRED_SIZE)
1449 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
1450 .addComponent(gotoPageLabel)
1451 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
1452 .addComponent(gotoPageTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 33, javax.swing.GroupLayout.PREFERRED_SIZE)
1453 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
1454 .addComponent(exportCSVButton))
1457 layout.linkSize(javax.swing.SwingConstants.HORIZONTAL,
new java.awt.Component[] {pageNextButton, pagePrevButton});
1459 layout.setVerticalGroup(
1460 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
1461 .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
1463 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
1464 .addComponent(pageLabel)
1465 .addComponent(pageNumLabel)
1466 .addComponent(pagesLabel)
1467 .addComponent(pagePrevButton, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)
1468 .addComponent(pageNextButton, javax.swing.GroupLayout.PREFERRED_SIZE, 15, javax.swing.GroupLayout.PREFERRED_SIZE)
1469 .addComponent(gotoPageLabel)
1470 .addComponent(gotoPageTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
1471 .addComponent(exportCSVButton))
1473 .addComponent(outlineView, javax.swing.GroupLayout.DEFAULT_SIZE, 321, Short.MAX_VALUE)
1477 layout.linkSize(javax.swing.SwingConstants.VERTICAL,
new java.awt.Component[] {pageNextButton, pagePrevButton});
1479 gotoPageLabel.getAccessibleContext().setAccessibleName(
"");
1483 pagingSupport.previousPage();
1487 pagingSupport.nextPage();
1491 pagingSupport.gotoPage();
1494 @NbBundle.Messages({
"DataResultViewerTable.exportCSVButtonActionPerformed.empty=No data to export"
1497 Node currentRoot = this.getExplorerManager().getRootContext();
1498 if (currentRoot != null && currentRoot.getChildren().getNodesCount() > 0) {
javax.swing.JLabel pageLabel
void mouseReleased(MouseEvent e)
boolean matches(Node candidateNode)
javax.swing.JLabel pageNumLabel
Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
TableColumnModel getColumnModel()
final Map< String, ETableColumn > columnMap
Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
org.openide.explorer.view.OutlineView outlineView
void compactPropertiesMap()
ImageIcon getIcon(Significance significance)
void columnRemoved(TableColumnModelEvent e)
void columnAdded(TableColumnModelEvent e)
synchronized List< Node.Property<?> > loadColumnOrder()
synchronized void storeColumnVisibility()
void pageNextButtonActionPerformed(java.awt.event.ActionEvent evt)
void subscribeToPageCountChange(PageCountChangeEvent event)
static void register(String nodeName, Object subscriber)
synchronized void storeColumnSorting()
javax.swing.JButton pageNextButton
synchronized void assignColumns(List< Property<?>> props)
final IconRendererTableListener iconRendererListener
void columnMarginChanged(ChangeEvent e)
static final String FIRST_COLUMN_LABEL
void mouseClicked(MouseEvent e)
void columnSelectionChanged(ListSelectionEvent e)
void columnRemoved(TableColumnModelEvent e)
javax.swing.JTextField gotoPageTextField
final TableListener outlineViewListener
void columnAddedOrRemoved()
void exportCSVButtonActionPerformed(java.awt.event.ActionEvent evt)
boolean listenToVisibilitEvents
void columnMoved(TableColumnModelEvent e)
DataResultViewer createInstance()
javax.swing.JLabel gotoPageLabel
static final String RESULTS_TABLE_PAGE_SIZE
final Map< Integer, Property<?> > propertiesMap
void gotoPageTextFieldActionPerformed(java.awt.event.ActionEvent evt)
void columnSelectionChanged(ListSelectionEvent e)
javax.swing.JButton pagePrevButton
javax.swing.JLabel pagesLabel
synchronized void loadColumnVisibility()
ColumnSortInfo(int modelIndex, int rank, boolean order)
void addTreeExpansionListener(TreeExpansionListener listener)
void listenToVisibilityChanges(boolean b)
synchronized static Logger getLogger(String name)
synchronized void loadColumnSorting()
static void addChangeListener(PreferenceChangeListener listener)
void pagePrevButtonActionPerformed(java.awt.event.ActionEvent evt)
void initializePagingSupport()
static void info(String message)
void columnMoved(TableColumnModelEvent e)
javax.swing.JButton exportCSVButton
DataResultViewerTable(ExplorerManager explorerManager)
void columnMarginChanged(ChangeEvent e)
boolean isSupported(Node candidateRootNode)
static void saveNodesToCSV(Collection<?extends Node > nodesToExport, Component component)
void columnAdded(TableColumnModelEvent e)
synchronized void storeColumnOrder()
DataResultViewerTable(ExplorerManager explorerManager, String title)
void togglePageControls(boolean onOff)