19 package org.sleuthkit.autopsy.communications.relationships;
21 import java.awt.Component;
22 import java.awt.KeyboardFocusManager;
23 import java.beans.PropertyChangeEvent;
24 import java.beans.PropertyChangeListener;
25 import static javax.swing.SwingUtilities.isDescendingFrom;
26 import javax.swing.event.TableModelEvent;
27 import javax.swing.event.TableModelListener;
28 import org.netbeans.swing.outline.DefaultOutlineModel;
29 import org.netbeans.swing.outline.Outline;
30 import org.openide.explorer.ExplorerManager;
31 import static org.openide.explorer.ExplorerUtils.createLookup;
32 import org.openide.nodes.AbstractNode;
33 import org.openide.nodes.ChildFactory;
34 import org.openide.nodes.Children;
35 import org.openide.nodes.Node;
36 import org.openide.util.Lookup;
46 class MessagesPanel
extends javax.swing.JPanel implements Lookup.Provider {
48 private static final long serialVersionUID = 1L;
50 private final Outline outline;
51 private final ModifiableProxyLookup proxyLookup;
52 private PropertyChangeListener focusPropertyListener;
54 private final MessageDataContent messageContentViewer;
62 messageContentViewer =
new MessageDataContent();
63 splitPane.setRightComponent(messageContentViewer);
65 proxyLookup =
new ModifiableProxyLookup(createLookup(outlineViewPanel.getExplorerManager(), getActionMap()));
67 outline = outlineViewPanel.getOutlineView().getOutline();
68 outlineViewPanel.getOutlineView().setPropertyColumns(
69 "From", Bundle.MessageViewer_columnHeader_From(),
70 "To", Bundle.MessageViewer_columnHeader_To(),
71 "Date", Bundle.MessageViewer_columnHeader_Date(),
72 "Subject", Bundle.MessageViewer_columnHeader_Subject(),
73 "Attms", Bundle.MessageViewer_columnHeader_Attms()
75 outline.setRootVisible(
false);
76 ((DefaultOutlineModel) outline.getOutlineModel()).setNodesColumnLabel(
"Type");
78 outlineViewPanel.getExplorerManager().addPropertyChangeListener((PropertyChangeEvent evt) -> {
79 if (evt.getPropertyName().equals(ExplorerManager.PROP_SELECTED_NODES)) {
80 final Node[] nodes = outlineViewPanel.getExplorerManager().getSelectedNodes();
82 if (nodes != null && nodes.length == 1) {
83 messageContentViewer.setNode(nodes[0]);
85 messageContentViewer.setNode(null);
93 outlineViewPanel.getOutlineView().getOutline().getOutlineModel().addTableModelListener(
new TableModelListener() {
95 public void tableChanged(TableModelEvent e) {
96 if (e.getType() == TableModelEvent.INSERT) {
97 outline.setRowSelectionInterval(0, 0);
102 splitPane.setResizeWeight(0.5);
103 splitPane.setDividerLocation(0.5);
104 outlineViewPanel.setTableColumnsWidth(5, 10, 10, 15, 50, 10);
107 public MessagesPanel(ChildFactory<?> nodeFactory) {
109 setChildFactory(nodeFactory);
113 public Lookup getLookup() {
118 public void addNotify() {
121 if (focusPropertyListener == null) {
124 focusPropertyListener = (
final PropertyChangeEvent focusEvent) -> {
125 if (focusEvent.getPropertyName().equalsIgnoreCase(
"focusOwner")) {
126 handleFocusChange((Component) focusEvent.getNewValue());
134 KeyboardFocusManager.getCurrentKeyboardFocusManager()
135 .addPropertyChangeListener(
"focusOwner", focusPropertyListener);
138 private void handleFocusChange(Component newFocusOwner) {
139 if (newFocusOwner == null) {
142 if (isDescendingFrom(newFocusOwner, messageContentViewer)) {
144 proxyLookup.setNewLookups(createLookup((messageContentViewer).getExplorerManager(), getActionMap()));
145 }
else if (isDescendingFrom(newFocusOwner, MessagesPanel.this)) {
147 proxyLookup.setNewLookups(createLookup(outlineViewPanel.getExplorerManager(), getActionMap()));
153 public void removeNotify() {
154 super.removeNotify();
155 KeyboardFocusManager.getCurrentKeyboardFocusManager()
156 .removePropertyChangeListener(
"focusOwner", focusPropertyListener);
159 final void setChildFactory(ChildFactory<?> nodeFactory) {
160 outlineViewPanel.getExplorerManager().setRootContext(
162 new DataResultFilterNode(
164 Children.create(nodeFactory,
true)),
165 outlineViewPanel.getExplorerManager()),
true));
173 @SuppressWarnings(
"unchecked")
175 private
void initComponents() {
177 splitPane =
new javax.swing.JSplitPane();
180 setLayout(
new java.awt.BorderLayout());
182 splitPane.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT);
183 splitPane.setLeftComponent(outlineViewPanel);
185 add(splitPane, java.awt.BorderLayout.CENTER);
191 private javax.swing.JSplitPane splitPane;