Merge branch 'accounts_relationships' of https://github.com/sleuthkit/autopsy into accounts_relationships

This commit is contained in:
Raman 2017-11-02 09:26:01 -04:00
commit 4a95926de7
20 changed files with 856 additions and 599 deletions

View File

@ -0,0 +1,88 @@
/*
* Autopsy Forensic Browser
*
* Copyright 2011-2017 Basis Technology Corp.
* Contact: carrier <at> sleuthkit <dot> org
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.sleuthkit.autopsy.communications;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.logging.Level;
import org.openide.nodes.AbstractNode;
import org.openide.nodes.Children;
import org.openide.nodes.Node;
import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.datamodel.Account;
import org.sleuthkit.datamodel.BlackboardArtifact;
import org.sleuthkit.datamodel.CommunicationsFilter;
import org.sleuthkit.datamodel.CommunicationsManager;
import org.sleuthkit.datamodel.TskCoreException;
class AccountDetailsNode extends AbstractNode {
private final static Logger logger = Logger.getLogger(AccountDetailsNode.class.getName());
private final CommunicationsFilter filter; //TODO: Use this
AccountDetailsNode(Set<Account> accounts,CommunicationsFilter filter, CommunicationsManager commsManager) {
super(new AccountRelationshipChildren(accounts, commsManager, filter));
this.filter = filter;
}
/**
* Children object for the relationships that the account is a member of.
*/
private static class AccountRelationshipChildren extends Children.Keys<BlackboardArtifact> {
private final Set<Account> accounts;
private final CommunicationsManager commsManager;
private final CommunicationsFilter filter;//TODO: Use this
private AccountRelationshipChildren(Set<Account> accounts, CommunicationsManager commsManager, CommunicationsFilter filter) {
this.accounts = accounts;
this.commsManager = commsManager;
this.filter = filter;
}
@Override
protected Node[] createNodes(BlackboardArtifact key) {
return new Node[]{new RelationShipFilterNode(key)};
}
@Override
protected void addNotify() {
Set<BlackboardArtifact> keys = new HashSet<>();
for (Account account : accounts) {
List<Account> accountsWithRelationship = new ArrayList<>();
try {
accountsWithRelationship.addAll(commsManager.getAccountsWithRelationship(account)); //TODO: Use filter here
} catch (TskCoreException ex) {
logger.log(Level.WARNING, "Error loading with relationships to " + account, ex);
}
accountsWithRelationship.forEach(otherAcount -> {
try {
keys.addAll(commsManager.getRelationships(account, otherAcount)); //TODO:Use filter here
} catch (TskCoreException ex) {
logger.log(Level.WARNING, "Error loading relationships between " + account + " and " + otherAcount, ex);
}
});
}
setKeys(keys);
}
}
}

View File

@ -1,90 +0,0 @@
/*
* Autopsy Forensic Browser
*
* Copyright 2011-2017 Basis Technology Corp.
* Contact: carrier <at> sleuthkit <dot> org
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.sleuthkit.autopsy.communications;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.openide.nodes.AbstractNode;
import org.openide.nodes.Children;
import org.openide.nodes.Sheet;
import org.openide.util.NbBundle;
import org.openide.util.lookup.Lookups;
import org.sleuthkit.autopsy.casemodule.Case;
import org.sleuthkit.autopsy.datamodel.NodeProperty;
import org.sleuthkit.datamodel.AccountDeviceInstance;
import org.sleuthkit.datamodel.CommunicationsFilter;
import org.sleuthkit.datamodel.TskCoreException;
/**
* Node to represent an Account in the AccountsBrowser
*/
class AccountDeviceInstanceNode extends AbstractNode {
private static final Logger LOGGER = Logger.getLogger(AccountDeviceInstanceNode.class.getName());
private final AccountDeviceInstance accountDeviceInstance;
private final CommunicationsFilter filter;
AccountDeviceInstanceNode(AccountDeviceInstance accountDeviceInstance, CommunicationsFilter filter) {
super(Children.LEAF, Lookups.fixed(accountDeviceInstance));
this.accountDeviceInstance = accountDeviceInstance;
this.filter = filter;
setName(accountDeviceInstance.getAccount().getAccountUniqueID());
setIconBaseWithExtension("org/sleuthkit/autopsy/communications/images/"
+ AccountUtils.getIconFileName(accountDeviceInstance.getAccount().getAccountType()));
}
@Override
@NbBundle.Messages({
"AccountNode.device=Device",
"AccountNode.accountName=Account",
"AccountNode.accountType=Type",
"AccountNode.messageCount=Msg Count"})
protected Sheet createSheet() {
Sheet s = super.createSheet();
Sheet.Set properties = s.get(Sheet.PROPERTIES);
if (properties == null) {
properties = Sheet.createPropertiesSet();
s.put(properties);
}
long msgCount = 0;
try {
msgCount = Case.getCurrentCase().getSleuthkitCase().getCommunicationsManager().getRelationshipsCount(this.filter, accountDeviceInstance);
} catch (TskCoreException ex) {
LOGGER.log(Level.WARNING, "Failed to get message count for account", ex); //NON-NLS
}
properties.put(new NodeProperty<>("type",
Bundle.AccountNode_accountType(),
"type",
accountDeviceInstance.getAccount().getAccountType().getDisplayName())); // NON-NLS
properties.put(new NodeProperty<>("count",
Bundle.AccountNode_messageCount(),
"count",
msgCount)); // NON-NLS
properties.put(new NodeProperty<>("device",
Bundle.AccountNode_device(),
"device",
accountDeviceInstance.getDeviceId())); // NON-NLS
return s;
}
}

View File

@ -1,62 +0,0 @@
/*
* Autopsy Forensic Browser
*
* Copyright 2011-2017 Basis Technology Corp.
* Contact: carrier <at> sleuthkit <dot> org
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.sleuthkit.autopsy.communications;
import java.util.Collections;
import java.util.List;
import org.openide.nodes.Children;
import org.openide.nodes.Node;
class AccountDeviceInstancesNodeChildren extends Children.Keys<AccountDeviceInstanceKey> {
private final List<AccountDeviceInstanceKey> accountDeviceInstanceKeys;
AccountDeviceInstancesNodeChildren(List<AccountDeviceInstanceKey> accountDeviceInstanceKeys) {
super(true);
this.accountDeviceInstanceKeys = accountDeviceInstanceKeys;
}
@Override
protected void removeNotify() {
super.removeNotify();
setKeys(Collections.emptySet());
}
@Override
protected void addNotify() {
super.addNotify();
setKeys(accountDeviceInstanceKeys);
}
//These are the methods for ChildFactory. I am going to keep them around but commented until we make a final descision.
// @Override
// protected boolean createKeys(List<Account> list) {
// list.addAll(accounts);
// return true;
// }
//
// @Override
// protected Node createNodeForKey(Account key) {
// return new AccountDeviceInstanceNode(key);
// }
@Override
protected Node[] createNodes(AccountDeviceInstanceKey key) {
return new Node[]{new AccountDeviceInstanceNode(key.getAccountDeviceInstance(), key.getCommunicationsFilter())};
}
}

View File

@ -1,62 +0,0 @@
/*
* Autopsy Forensic Browser
*
* Copyright 2011-2017 Basis Technology Corp.
* Contact: carrier <at> sleuthkit <dot> org
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.sleuthkit.autopsy.communications;
import java.util.Collections;
import java.util.List;
import org.openide.nodes.Children;
import org.openide.nodes.Node;
class AccountsDeviceInstanceChildren extends Children.Keys<AccountDeviceInstanceKey> {
private final List<AccountDeviceInstanceKey> accountDeviceInstanceKeys;
AccountsDeviceInstanceChildren(List<AccountDeviceInstanceKey> accountDeviceInstanceKeys) {
super(true);
this.accountDeviceInstanceKeys = accountDeviceInstanceKeys;
}
@Override
protected void removeNotify() {
super.removeNotify();
setKeys(Collections.emptySet());
}
@Override
protected void addNotify() {
super.addNotify();
setKeys(accountDeviceInstanceKeys);
}
//These are the methods for ChildFactory. I am going to keep them around but commented until we make a final descision.
// @Override
// protected boolean createKeys(List<Account> list) {
// list.addAll(accounts);
// return true;
// }
//
// @Override
// protected Node createNodeForKey(Account key) {
// return new AccountDeviceInstanceNode(key);
// }
@Override
protected Node[] createNodes(AccountDeviceInstanceKey key) {
return new Node[]{new AccountDeviceInstanceNode(key.getAccountDeviceInstance(), key.getCommunicationsFilter())};
}
}

View File

@ -0,0 +1,128 @@
/*
* Autopsy Forensic Browser
*
* Copyright 2011-2017 Basis Technology Corp.
* Contact: carrier <at> sleuthkit <dot> org
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.sleuthkit.autopsy.communications;
import java.util.Collections;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.openide.nodes.AbstractNode;
import org.openide.nodes.Children;
import org.openide.nodes.Node;
import org.openide.nodes.Sheet;
import org.openide.util.NbBundle;
import org.openide.util.lookup.Lookups;
import org.sleuthkit.autopsy.datamodel.NodeProperty;
import org.sleuthkit.datamodel.AccountDeviceInstance;
import org.sleuthkit.datamodel.CommunicationsFilter;
import org.sleuthkit.datamodel.CommunicationsManager;
import org.sleuthkit.datamodel.TskCoreException;
class AccountsRootChildren extends Children.Keys<AccountDeviceInstanceKey> {
private final List<AccountDeviceInstanceKey> accountDeviceInstanceKeys;
private final CommunicationsManager commsManager;
AccountsRootChildren(List<AccountDeviceInstanceKey> accountDeviceInstanceKeys, CommunicationsManager commsManager) {
super(true);
this.accountDeviceInstanceKeys = accountDeviceInstanceKeys;
this.commsManager = commsManager;
}
@Override
protected void removeNotify() {
super.removeNotify();
setKeys(Collections.emptySet());
}
@Override
protected void addNotify() {
super.addNotify();
setKeys(accountDeviceInstanceKeys);
}
//These are the methods for ChildFactory. I am going to keep them around but commented until we make a final descision.
// @Override
// protected boolean createKeys(List<Account> list) {
// list.addAll(accounts);
// return true;
// }
//
// @Override
// protected Node createNodeForKey(Account key) {
// return new AccountDeviceInstanceNode(key);
// }
@Override
protected Node[] createNodes(AccountDeviceInstanceKey key) {
return new Node[]{new AccountDeviceInstanceNode(key, commsManager)};
}
/**
* Node to represent an Account in the AccountsBrowser
*/
static class AccountDeviceInstanceNode extends AbstractNode {
private static final Logger LOGGER = Logger.getLogger(AccountDeviceInstanceNode.class.getName());
private final AccountDeviceInstance accountDeviceInstance;
private final CommunicationsManager commsManager;
private final CommunicationsFilter filter;
private AccountDeviceInstanceNode(AccountDeviceInstanceKey accountDeviceInstanceKey, CommunicationsManager commsManager) {
super(Children.LEAF, Lookups.fixed(accountDeviceInstanceKey, commsManager));
this.accountDeviceInstance = accountDeviceInstanceKey.getAccountDeviceInstance();
this.commsManager = commsManager;
this.filter = accountDeviceInstanceKey.getCommunicationsFilter();
setName(accountDeviceInstance.getAccount().getAccountUniqueID());
setIconBaseWithExtension("org/sleuthkit/autopsy/communications/images/" + AccountUtils.getIconFileName(accountDeviceInstance.getAccount().getAccountType()));
}
public AccountDeviceInstance getAccountDeviceInstance() {
return accountDeviceInstance;
}
public CommunicationsManager getCommsManager() {
return commsManager;
}
public CommunicationsFilter getFilter() {
return filter;
}
@Override
@NbBundle.Messages(value = {"AccountNode.device=Device", "AccountNode.accountName=Account", "AccountNode.accountType=Type", "AccountNode.messageCount=Msg Count"})
protected Sheet createSheet() {
Sheet s = super.createSheet();
Sheet.Set properties = s.get(Sheet.PROPERTIES);
if (properties == null) {
properties = Sheet.createPropertiesSet();
s.put(properties);
}
long msgCount = 0;
try {
msgCount = commsManager.getRelationshipsCount(filter, accountDeviceInstance);
} catch (TskCoreException ex) {
LOGGER.log(Level.WARNING, "Failed to get message count for account", ex); //NON-NLS
}
properties.put(new NodeProperty<>("type", Bundle.AccountNode_accountType(), "type", accountDeviceInstance.getAccount().getAccountType().getDisplayName())); // NON-NLS
properties.put(new NodeProperty<>("count", Bundle.AccountNode_messageCount(), "count", msgCount)); // NON-NLS
properties.put(new NodeProperty<>("device", Bundle.AccountNode_device(), "device", accountDeviceInstance.getDeviceId())); // NON-NLS
return s;
}
}
}

View File

@ -1,11 +1,9 @@
CVTTopComponent.jTextField1.text=place holder for messages ,thumbnail list, etc
CVTTopComponent.jTextField2.text=place holder for message viewer
CVTTopComponent.TabConstraints.tabTitle=Visualize CVTTopComponent.TabConstraints.tabTitle=Visualize
CVTTopComponent.accountsBrowser.TabConstraints.tabTitle=Browse CVTTopComponent.accountsBrowser.TabConstraints.tabTitle=Browse
FiltersPanel.applyFiltersButton.text=Apply Filters FiltersPanel.applyFiltersButton.text=Apply
FiltersPanel.devicesLabel.text=Devices: FiltersPanel.devicesLabel.text=Devices:
FiltersPanel.accountTypesLabel.text=Account Types: FiltersPanel.accountTypesLabel.text=Account Types:
FiltersPanel.filtersTitleLabel.text=Filters FiltersPanel.filtersTitleLabel.text=Account Filters
FiltersPanel.unCheckAllAccountTypesButton.text=Uncheck All FiltersPanel.unCheckAllAccountTypesButton.text=Uncheck All
FiltersPanel.checkAllAccountTypesButton.text=Check All FiltersPanel.checkAllAccountTypesButton.text=Check All
FiltersPanel.unCheckAllDevicesButton.text=Uncheck All FiltersPanel.unCheckAllDevicesButton.text=Uncheck All

View File

@ -17,10 +17,10 @@
<DimensionLayout dim="0"> <DimensionLayout dim="0">
<Group type="103" groupAlignment="0" attributes="0"> <Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0"> <Group type="102" alignment="0" attributes="0">
<EmptySpace max="-2" attributes="0"/> <EmptySpace min="-2" max="-2" attributes="0"/>
<Component id="filtersPane" min="-2" pref="244" max="-2" attributes="0"/> <Component id="filtersPane" pref="244" max="32767" attributes="0"/>
<EmptySpace type="unrelated" max="-2" attributes="0"/> <EmptySpace type="unrelated" min="-2" max="-2" attributes="0"/>
<Component id="HSplitPane" pref="1322" max="32767" attributes="0"/> <Component id="splitPane" pref="1322" max="32767" attributes="0"/>
<EmptySpace min="-2" max="-2" attributes="0"/> <EmptySpace min="-2" max="-2" attributes="0"/>
</Group> </Group>
</Group> </Group>
@ -31,7 +31,7 @@
<EmptySpace min="-2" max="-2" attributes="0"/> <EmptySpace min="-2" max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0"> <Group type="103" groupAlignment="0" attributes="0">
<Component id="filtersPane" max="32767" attributes="0"/> <Component id="filtersPane" max="32767" attributes="0"/>
<Component id="HSplitPane" max="32767" attributes="0"/> <Component id="splitPane" max="32767" attributes="0"/>
</Group> </Group>
<EmptySpace min="-2" max="-2" attributes="0"/> <EmptySpace min="-2" max="-2" attributes="0"/>
</Group> </Group>
@ -39,9 +39,10 @@
</DimensionLayout> </DimensionLayout>
</Layout> </Layout>
<SubComponents> <SubComponents>
<Container class="javax.swing.JSplitPane" name="HSplitPane"> <Container class="javax.swing.JSplitPane" name="splitPane">
<Properties> <Properties>
<Property name="dividerLocation" type="int" value="600"/> <Property name="dividerLocation" type="int" value="600"/>
<Property name="resizeWeight" type="double" value="0.3"/>
</Properties> </Properties>
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout"/> <Layout class="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout"/>
@ -106,45 +107,6 @@
</Container> </Container>
</SubComponents> </SubComponents>
</Container> </Container>
<Container class="javax.swing.JSplitPane" name="VSplitPane">
<Properties>
<Property name="dividerLocation" type="int" value="200"/>
<Property name="orientation" type="int" value="0"/>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout$JSplitPaneConstraintsDescription">
<JSplitPaneConstraints position="right"/>
</Constraint>
</Constraints>
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout"/>
<SubComponents>
<Component class="javax.swing.JTextField" name="jTextField1">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="CVTTopComponent.jTextField1.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout$JSplitPaneConstraintsDescription">
<JSplitPaneConstraints position="top"/>
</Constraint>
</Constraints>
</Component>
<Component class="javax.swing.JTextField" name="jTextField2">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="CVTTopComponent.jTextField2.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout$JSplitPaneConstraintsDescription">
<JSplitPaneConstraints position="right"/>
</Constraint>
</Constraints>
</Component>
</SubComponents>
</Container>
</SubComponents> </SubComponents>
</Container> </Container>
<Component class="org.sleuthkit.autopsy.communications.FiltersPanel" name="filtersPane"> <Component class="org.sleuthkit.autopsy.communications.FiltersPanel" name="filtersPane">

View File

@ -46,8 +46,10 @@ public final class CVTTopComponent extends TopComponent implements ExplorerManag
private final ExplorerManager em = new ExplorerManager(); private final ExplorerManager em = new ExplorerManager();
public CVTTopComponent() { public CVTTopComponent() {
initComponents(); initComponents();
setName(Bundle.CVTTopComponent_name()); setName(Bundle.CVTTopComponent_name());
splitPane.setRightComponent(new MessageBrowser());
} }
/** /**
@ -58,16 +60,14 @@ public final class CVTTopComponent extends TopComponent implements ExplorerManag
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() { private void initComponents() {
HSplitPane = new javax.swing.JSplitPane(); splitPane = new javax.swing.JSplitPane();
BrowseVisualizeTabPane = new javax.swing.JTabbedPane(); BrowseVisualizeTabPane = new javax.swing.JTabbedPane();
accountsBrowser = new org.sleuthkit.autopsy.communications.AccountsBrowser(); accountsBrowser = new org.sleuthkit.autopsy.communications.AccountsBrowser();
jPanel1 = new javax.swing.JPanel(); jPanel1 = new javax.swing.JPanel();
VSplitPane = new javax.swing.JSplitPane();
jTextField1 = new javax.swing.JTextField();
jTextField2 = new javax.swing.JTextField();
filtersPane = new org.sleuthkit.autopsy.communications.FiltersPanel(); filtersPane = new org.sleuthkit.autopsy.communications.FiltersPanel();
HSplitPane.setDividerLocation(600); splitPane.setDividerLocation(600);
splitPane.setResizeWeight(0.3);
BrowseVisualizeTabPane.setFont(new java.awt.Font("Tahoma", 0, 18)); // NOI18N BrowseVisualizeTabPane.setFont(new java.awt.Font("Tahoma", 0, 18)); // NOI18N
BrowseVisualizeTabPane.addTab(org.openide.util.NbBundle.getMessage(CVTTopComponent.class, "CVTTopComponent.accountsBrowser.TabConstraints.tabTitle"), new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/table.png")), accountsBrowser); // NOI18N BrowseVisualizeTabPane.addTab(org.openide.util.NbBundle.getMessage(CVTTopComponent.class, "CVTTopComponent.accountsBrowser.TabConstraints.tabTitle"), new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/table.png")), accountsBrowser); // NOI18N
@ -87,18 +87,7 @@ public final class CVTTopComponent extends TopComponent implements ExplorerManag
BrowseVisualizeTabPane.addTab(org.openide.util.NbBundle.getMessage(CVTTopComponent.class, "CVTTopComponent.TabConstraints.tabTitle"), new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/emblem-web.png")), jPanel1); // NOI18N BrowseVisualizeTabPane.addTab(org.openide.util.NbBundle.getMessage(CVTTopComponent.class, "CVTTopComponent.TabConstraints.tabTitle"), new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/emblem-web.png")), jPanel1); // NOI18N
HSplitPane.setLeftComponent(BrowseVisualizeTabPane); splitPane.setLeftComponent(BrowseVisualizeTabPane);
VSplitPane.setDividerLocation(200);
VSplitPane.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT);
jTextField1.setText(org.openide.util.NbBundle.getMessage(CVTTopComponent.class, "CVTTopComponent.jTextField1.text")); // NOI18N
VSplitPane.setTopComponent(jTextField1);
jTextField2.setText(org.openide.util.NbBundle.getMessage(CVTTopComponent.class, "CVTTopComponent.jTextField2.text")); // NOI18N
VSplitPane.setRightComponent(jTextField2);
HSplitPane.setRightComponent(VSplitPane);
filtersPane.setBorder(javax.swing.BorderFactory.createEtchedBorder()); filtersPane.setBorder(javax.swing.BorderFactory.createEtchedBorder());
filtersPane.setMinimumSize(new java.awt.Dimension(256, 495)); filtersPane.setMinimumSize(new java.awt.Dimension(256, 495));
@ -109,9 +98,9 @@ public final class CVTTopComponent extends TopComponent implements ExplorerManag
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup() .addGroup(layout.createSequentialGroup()
.addContainerGap() .addContainerGap()
.addComponent(filtersPane, javax.swing.GroupLayout.PREFERRED_SIZE, 244, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(filtersPane, javax.swing.GroupLayout.PREFERRED_SIZE, 244, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(HSplitPane, javax.swing.GroupLayout.DEFAULT_SIZE, 1322, Short.MAX_VALUE) .addComponent(splitPane, javax.swing.GroupLayout.DEFAULT_SIZE, 1322, Short.MAX_VALUE)
.addContainerGap()) .addContainerGap())
); );
layout.setVerticalGroup( layout.setVerticalGroup(
@ -120,7 +109,7 @@ public final class CVTTopComponent extends TopComponent implements ExplorerManag
.addContainerGap() .addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(filtersPane, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(filtersPane, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(HSplitPane)) .addComponent(splitPane))
.addContainerGap()) .addContainerGap())
); );
}// </editor-fold>//GEN-END:initComponents }// </editor-fold>//GEN-END:initComponents
@ -128,13 +117,10 @@ public final class CVTTopComponent extends TopComponent implements ExplorerManag
// Variables declaration - do not modify//GEN-BEGIN:variables // Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JTabbedPane BrowseVisualizeTabPane; private javax.swing.JTabbedPane BrowseVisualizeTabPane;
private javax.swing.JSplitPane HSplitPane;
private javax.swing.JSplitPane VSplitPane;
private org.sleuthkit.autopsy.communications.AccountsBrowser accountsBrowser; private org.sleuthkit.autopsy.communications.AccountsBrowser accountsBrowser;
private org.sleuthkit.autopsy.communications.FiltersPanel filtersPane; private org.sleuthkit.autopsy.communications.FiltersPanel filtersPane;
private javax.swing.JPanel jPanel1; private javax.swing.JPanel jPanel1;
private javax.swing.JTextField jTextField1; private javax.swing.JSplitPane splitPane;
private javax.swing.JTextField jTextField2;
// End of variables declaration//GEN-END:variables // End of variables declaration//GEN-END:variables
@Override @Override

View File

@ -28,11 +28,6 @@
</SubComponents> </SubComponents>
</Container> </Container>
</NonVisualComponents> </NonVisualComponents>
<Properties>
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[256, 469]"/>
</Property>
</Properties>
<AuxValues> <AuxValues>
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/> <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/> <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
@ -56,7 +51,7 @@
<Group type="102" alignment="0" attributes="0"> <Group type="102" alignment="0" attributes="0">
<Component id="filtersTitleLabel" min="-2" max="-2" attributes="0"/> <Component id="filtersTitleLabel" min="-2" max="-2" attributes="0"/>
<EmptySpace max="32767" attributes="0"/> <EmptySpace max="32767" attributes="0"/>
<Component id="applyFiltersButton" min="-2" max="-2" attributes="0"/> <Component id="applyFiltersButton" min="-2" pref="83" max="-2" attributes="0"/>
</Group> </Group>
</Group> </Group>
<EmptySpace max="-2" attributes="0"/> <EmptySpace max="-2" attributes="0"/>
@ -90,6 +85,9 @@
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="FiltersPanel.applyFiltersButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/> <ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="FiltersPanel.applyFiltersButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property> </Property>
<Property name="horizontalTextPosition" type="int" value="10"/> <Property name="horizontalTextPosition" type="int" value="10"/>
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="null"/>
</Property>
</Properties> </Properties>
<Events> <Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="applyFiltersButtonActionPerformed"/> <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="applyFiltersButtonActionPerformed"/>
@ -98,7 +96,7 @@
<Component class="javax.swing.JLabel" name="filtersTitleLabel"> <Component class="javax.swing.JLabel" name="filtersTitleLabel">
<Properties> <Properties>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor"> <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Tahoma" size="18" style="0"/> <Font name="Tahoma" size="16" style="0"/>
</Property> </Property>
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor"> <Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
<Image iconType="3" name="/org/sleuthkit/autopsy/communications/images/funnel.png"/> <Image iconType="3" name="/org/sleuthkit/autopsy/communications/images/funnel.png"/>
@ -116,7 +114,7 @@
<Group type="102" attributes="0"> <Group type="102" attributes="0">
<Group type="103" groupAlignment="0" attributes="0"> <Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="1" attributes="0"> <Group type="102" alignment="1" attributes="0">
<EmptySpace pref="51" max="32767" attributes="0"/> <EmptySpace pref="43" max="32767" attributes="0"/>
<Component id="unCheckAllAccountTypesButton" min="-2" max="-2" attributes="0"/> <Component id="unCheckAllAccountTypesButton" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/> <EmptySpace max="-2" attributes="0"/>
<Component id="checkAllAccountTypesButton" min="-2" max="-2" attributes="0"/> <Component id="checkAllAccountTypesButton" min="-2" max="-2" attributes="0"/>

View File

@ -33,15 +33,16 @@ import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.autopsy.coreutils.ThreadConfined; import org.sleuthkit.autopsy.coreutils.ThreadConfined;
import org.sleuthkit.datamodel.Account; import org.sleuthkit.datamodel.Account;
import org.sleuthkit.datamodel.AccountDeviceInstance; import org.sleuthkit.datamodel.AccountDeviceInstance;
import org.sleuthkit.datamodel.AccountTypeFilter;
import org.sleuthkit.datamodel.CommunicationsFilter; import org.sleuthkit.datamodel.CommunicationsFilter;
import org.sleuthkit.datamodel.CommunicationsManager; import org.sleuthkit.datamodel.CommunicationsManager;
import org.sleuthkit.datamodel.DataSource; import org.sleuthkit.datamodel.DataSource;
import org.sleuthkit.datamodel.DeviceFilter; import org.sleuthkit.datamodel.DeviceFilter;
import org.sleuthkit.datamodel.AccountTypeFilter;
import org.sleuthkit.datamodel.TskCoreException; import org.sleuthkit.datamodel.TskCoreException;
/** /**
* * Panel that holds the Filter control widgets and translates user filtering
* changes into queries against the CommunicationsManager
*/ */
final public class FiltersPanel extends javax.swing.JPanel { final public class FiltersPanel extends javax.swing.JPanel {
@ -133,8 +134,6 @@ final public class FiltersPanel extends javax.swing.JPanel {
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() { private void initComponents() {
jList1 = new javax.swing.JList<>();
jList1.setModel(new javax.swing.AbstractListModel<String>() { jList1.setModel(new javax.swing.AbstractListModel<String>() {
String[] strings = { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" }; String[] strings = { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" };
public int getSize() { return strings.length; } public int getSize() { return strings.length; }
@ -142,18 +141,17 @@ final public class FiltersPanel extends javax.swing.JPanel {
}); });
jScrollPane1.setViewportView(jList1); jScrollPane1.setViewportView(jList1);
setPreferredSize(new java.awt.Dimension(256, 469));
applyFiltersButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/control-double.png"))); // NOI18N applyFiltersButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/control-double.png"))); // NOI18N
applyFiltersButton.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.applyFiltersButton.text")); // NOI18N applyFiltersButton.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.applyFiltersButton.text")); // NOI18N
applyFiltersButton.setHorizontalTextPosition(javax.swing.SwingConstants.LEADING); applyFiltersButton.setHorizontalTextPosition(javax.swing.SwingConstants.LEADING);
applyFiltersButton.setPreferredSize(null);
applyFiltersButton.addActionListener(new java.awt.event.ActionListener() { applyFiltersButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) { public void actionPerformed(java.awt.event.ActionEvent evt) {
applyFiltersButtonActionPerformed(evt); applyFiltersButtonActionPerformed(evt);
} }
}); });
filtersTitleLabel.setFont(new java.awt.Font("Tahoma", 0, 18)); // NOI18N filtersTitleLabel.setFont(new java.awt.Font("Tahoma", 0, 16)); // NOI18N
filtersTitleLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/funnel.png"))); // NOI18N filtersTitleLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/funnel.png"))); // NOI18N
filtersTitleLabel.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.filtersTitleLabel.text")); // NOI18N filtersTitleLabel.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.filtersTitleLabel.text")); // NOI18N
@ -184,7 +182,7 @@ final public class FiltersPanel extends javax.swing.JPanel {
.addGroup(jPanel2Layout.createSequentialGroup() .addGroup(jPanel2Layout.createSequentialGroup()
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel2Layout.createSequentialGroup() .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel2Layout.createSequentialGroup()
.addContainerGap(51, Short.MAX_VALUE) .addContainerGap(43, Short.MAX_VALUE)
.addComponent(unCheckAllAccountTypesButton) .addComponent(unCheckAllAccountTypesButton)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(checkAllAccountTypesButton)) .addComponent(checkAllAccountTypesButton))
@ -232,15 +230,12 @@ final public class FiltersPanel extends javax.swing.JPanel {
.addGroup(jPanel3Layout.createSequentialGroup() .addGroup(jPanel3Layout.createSequentialGroup()
.addComponent(devicesLabel) .addComponent(devicesLabel)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addComponent(devicesPane, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(jPanel3Layout.createSequentialGroup() .addGroup(jPanel3Layout.createSequentialGroup()
.addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(devicesPane, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(unCheckAllDevicesButton)
.addGroup(jPanel3Layout.createSequentialGroup() .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(checkAllDevicesButton))
.addComponent(unCheckAllDevicesButton)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(checkAllDevicesButton)))
.addGap(0, 0, 0))
); );
jPanel3Layout.setVerticalGroup( jPanel3Layout.setVerticalGroup(
jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
@ -268,7 +263,7 @@ final public class FiltersPanel extends javax.swing.JPanel {
.addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
.addComponent(filtersTitleLabel) .addComponent(filtersTitleLabel)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(applyFiltersButton))) .addComponent(applyFiltersButton, javax.swing.GroupLayout.PREFERRED_SIZE, 83, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addContainerGap()) .addContainerGap())
); );
layout.setVerticalGroup( layout.setVerticalGroup(
@ -277,7 +272,7 @@ final public class FiltersPanel extends javax.swing.JPanel {
.addContainerGap() .addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(filtersTitleLabel) .addComponent(filtersTitleLabel)
.addComponent(applyFiltersButton)) .addComponent(applyFiltersButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(18, 18, 18) .addGap(18, 18, 18)
.addComponent(jPanel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(jPanel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
@ -304,15 +299,14 @@ final public class FiltersPanel extends javax.swing.JPanel {
commsFilter.addAndFilter(getDeviceFilter()); commsFilter.addAndFilter(getDeviceFilter());
commsFilter.addAndFilter(getAccountTypeFilter()); commsFilter.addAndFilter(getAccountTypeFilter());
final CommunicationsManager communicationsManager = Case.getCurrentCase().getSleuthkitCase().getCommunicationsManager(); final CommunicationsManager commsManager = Case.getCurrentCase().getSleuthkitCase().getCommunicationsManager();
accountDeviceInstances.addAll(communicationsManager.getAccountDeviceInstancesWithRelationships(commsFilter)); accountDeviceInstances.addAll(commsManager.getAccountDeviceInstancesWithRelationships(commsFilter));
List<AccountDeviceInstanceKey> accountDeviceInstanceKeys = new ArrayList<>(); List<AccountDeviceInstanceKey> accountDeviceInstanceKeys = new ArrayList<>();
accountDeviceInstances.forEach((accountDevInstance) -> { accountDeviceInstances.forEach(accountDeviceInstance
accountDeviceInstanceKeys.add(new AccountDeviceInstanceKey(accountDevInstance, commsFilter ) ); -> accountDeviceInstanceKeys.add(new AccountDeviceInstanceKey(accountDeviceInstance, commsFilter)));
});
em.setRootContext(new AbstractNode(new AccountsRootChildren(accountDeviceInstanceKeys, commsManager)));
em.setRootContext(new AbstractNode(new AccountsDeviceInstanceChildren(accountDeviceInstanceKeys)));
} catch (TskCoreException ex) { } catch (TskCoreException ex) {
logger.log(Level.SEVERE, "There was a error loading the accounts.", ex); logger.log(Level.SEVERE, "There was a error loading the accounts.", ex);
} }
@ -331,7 +325,7 @@ final public class FiltersPanel extends javax.swing.JPanel {
.map(entry -> entry.getKey()).collect(Collectors.toSet())); .map(entry -> entry.getKey()).collect(Collectors.toSet()));
return accountTypeFilter; return accountTypeFilter;
} }
@ThreadConfined(type = ThreadConfined.ThreadType.AWT) @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
private void setAllTypesSelected(boolean selected) { private void setAllTypesSelected(boolean selected) {
setAllSelected(accountTypeMap, selected); setAllSelected(accountTypeMap, selected);
@ -372,7 +366,7 @@ final public class FiltersPanel extends javax.swing.JPanel {
private final javax.swing.JLabel devicesLabel = new javax.swing.JLabel(); private final javax.swing.JLabel devicesLabel = new javax.swing.JLabel();
private final javax.swing.JPanel devicesPane = new javax.swing.JPanel(); private final javax.swing.JPanel devicesPane = new javax.swing.JPanel();
private final javax.swing.JLabel filtersTitleLabel = new javax.swing.JLabel(); private final javax.swing.JLabel filtersTitleLabel = new javax.swing.JLabel();
private javax.swing.JList<String> jList1; private final javax.swing.JList<String> jList1 = new javax.swing.JList<>();
private final javax.swing.JPanel jPanel2 = new javax.swing.JPanel(); private final javax.swing.JPanel jPanel2 = new javax.swing.JPanel();
private final javax.swing.JPanel jPanel3 = new javax.swing.JPanel(); private final javax.swing.JPanel jPanel3 = new javax.swing.JPanel();
private final javax.swing.JScrollPane jScrollPane1 = new javax.swing.JScrollPane(); private final javax.swing.JScrollPane jScrollPane1 = new javax.swing.JScrollPane();

View File

@ -0,0 +1,61 @@
<?xml version="1.0" encoding="UTF-8" ?>
<Form version="1.4" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
<AuxValues>
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="true"/>
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
</AuxValues>
<Layout>
<DimensionLayout dim="0">
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="1" attributes="0">
<EmptySpace min="-2" pref="0" max="-2" attributes="0"/>
<Component id="splitPane" pref="652" max="32767" attributes="0"/>
</Group>
</Group>
</DimensionLayout>
<DimensionLayout dim="1">
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0">
<EmptySpace min="-2" pref="0" max="-2" attributes="0"/>
<Component id="splitPane" pref="1083" max="32767" attributes="0"/>
<EmptySpace min="-2" pref="0" max="-2" attributes="0"/>
</Group>
</Group>
</DimensionLayout>
</Layout>
<SubComponents>
<Container class="javax.swing.JSplitPane" name="splitPane">
<Properties>
<Property name="dividerLocation" type="int" value="400"/>
<Property name="dividerSize" type="int" value="10"/>
<Property name="orientation" type="int" value="0"/>
<Property name="resizeWeight" type="double" value="0.4"/>
</Properties>
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout"/>
<SubComponents>
<Component class="org.sleuthkit.autopsy.communications.MessageDataContent" name="messageDataContent">
<Properties>
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="null"/>
</Property>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout$JSplitPaneConstraintsDescription">
<JSplitPaneConstraints position="bottom"/>
</Constraint>
</Constraints>
</Component>
</SubComponents>
</Container>
</SubComponents>
</Form>

View File

@ -0,0 +1,151 @@
/*
* Autopsy Forensic Browser
*
* Copyright 2011-2017 Basis Technology Corp.
* Contact: carrier <at> sleuthkit <dot> org
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obt ain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.sleuthkit.autopsy.communications;
import com.google.common.collect.Iterables;
import java.util.HashSet;
import java.util.Set;
import java.util.logging.Level;
import org.openide.explorer.ExplorerManager;
import org.openide.nodes.Node;
import org.sleuthkit.autopsy.communications.AccountsRootChildren.AccountDeviceInstanceNode;
import org.sleuthkit.autopsy.corecomponents.DataResultPanel;
import org.sleuthkit.autopsy.corecomponents.TableFilterNode;
import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.datamodel.Account;
import org.sleuthkit.datamodel.CommunicationsFilter;
import org.sleuthkit.datamodel.CommunicationsManager;
/**
* The right hand side of the CVT. Has a DataResultPanel to show messages and
* account details, and a Content viewer to show individual
*/
final class MessageBrowser extends javax.swing.JPanel implements ExplorerManager.Provider {
private static final Logger logger = Logger.getLogger(MessageBrowser.class.getName());
private static final long serialVersionUID = 1L;
private ExplorerManager parentExplorereManager;
private final DataResultPanel messagesResultPanel;
private ExplorerManager internalExplorerManager;
MessageBrowser() {
initComponents();
messagesResultPanel = DataResultPanel.createInstanceUninitialized("Account", "", Node.EMPTY, 0, messageDataContent);
splitPane.setTopComponent(messagesResultPanel);
splitPane.setBottomComponent(messageDataContent);
}
@Override
public void addNotify() {
super.addNotify();
this.parentExplorereManager = ExplorerManager.find(this);
internalExplorerManager = new ExplorerManager();
parentExplorereManager.addPropertyChangeListener(pce -> {
if (pce.getPropertyName().equals(ExplorerManager.PROP_SELECTED_NODES)) {
final Node[] selectedNodes = parentExplorereManager.getSelectedNodes();
if (selectedNodes.length == 0) {
messagesResultPanel.setNode(null);
messagesResultPanel.setPath("");
} else {
Set<Account> accounts = new HashSet<>();
CommunicationsFilter filter = null;
CommunicationsManager commsManager = null;
for (Node n : selectedNodes) {
if (n instanceof AccountDeviceInstanceNode) {
final AccountDeviceInstanceNode adiNode = (AccountDeviceInstanceNode) n;
accounts.add(adiNode.getAccountDeviceInstance().getAccount());
if (commsManager == null) {
commsManager = adiNode.getCommsManager();
}
if (filter == null) {
filter = adiNode.getFilter();
} else if (filter != adiNode.getFilter()) {
///this should never happen...
logger.log(Level.WARNING, "Not all AccountDeviceInstanceNodes have the same filter. Using the first.");
}
} else {
///this should never happen...
logger.log(Level.WARNING, "Unexpected Node encountered: " + n.toString());
}
}
messagesResultPanel.setNode(new TableFilterNode(new AccountDetailsNode(accounts, filter, commsManager), true));
if (accounts.size() == 1) {
messagesResultPanel.setPath(Iterables.getOnlyElement(accounts).getAccountUniqueID());
} else {
messagesResultPanel.setPath(accounts.size() + " accounts");
}
}
}
});
messagesResultPanel.open();
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
splitPane = new javax.swing.JSplitPane();
messageDataContent = new org.sleuthkit.autopsy.communications.MessageDataContent();
splitPane.setDividerLocation(400);
splitPane.setDividerSize(10);
splitPane.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT);
splitPane.setResizeWeight(0.4);
messageDataContent.setMinimumSize(null);
splitPane.setBottomComponent(messageDataContent);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addGap(0, 0, 0)
.addComponent(splitPane, javax.swing.GroupLayout.DEFAULT_SIZE, 652, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(0, 0, 0)
.addComponent(splitPane, javax.swing.GroupLayout.DEFAULT_SIZE, 1083, Short.MAX_VALUE)
.addGap(0, 0, 0))
);
}// </editor-fold>//GEN-END:initComponents
// Variables declaration - do not modify//GEN-BEGIN:variables
private org.sleuthkit.autopsy.communications.MessageDataContent messageDataContent;
private javax.swing.JSplitPane splitPane;
// End of variables declaration//GEN-END:variables
@Override
public ExplorerManager getExplorerManager() {
return internalExplorerManager;
}
}

View File

@ -0,0 +1,38 @@
/*
* Autopsy Forensic Browser
*
* Copyright 2011-2017 Basis Technology Corp.
* Contact: carrier <at> sleuthkit <dot> org
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.sleuthkit.autopsy.communications;
import java.beans.PropertyChangeEvent;
import org.sleuthkit.autopsy.contentviewers.MessageContentViewer;
import org.sleuthkit.autopsy.corecomponentinterfaces.DataContent;
/**
* Extend MessageContentViewer so that it implements DataContent and can be set
* as the only ContentViewer for a DataResultPanel
*/
public class MessageDataContent extends MessageContentViewer implements DataContent {
private static final long serialVersionUID = 1L;
@Override
public void propertyChange(PropertyChangeEvent evt) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
}

View File

@ -0,0 +1,124 @@
/*
* Autopsy Forensic Browser
*
* Copyright 2011-2017 Basis Technology Corp.
* Contact: carrier <at> sleuthkit <dot> org
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.sleuthkit.autopsy.communications;
import java.util.logging.Level;
import org.apache.commons.lang3.StringUtils;
import org.openide.nodes.Sheet;
import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.autopsy.datamodel.BlackboardArtifactNode;
import org.sleuthkit.autopsy.datamodel.NodeProperty;
import org.sleuthkit.datamodel.BlackboardArtifact;
import org.sleuthkit.datamodel.BlackboardAttribute;
import org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE;
import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME;
import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_SENT;
import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_START;
import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL_FROM;
import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL_TO;
import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_FROM;
import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_TO;
import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SUBJECT;
import org.sleuthkit.datamodel.TskCoreException;
/**
*
*/
public class RelationShipFilterNode extends BlackboardArtifactNode {
private static final Logger logger = Logger.getLogger(RelationShipFilterNode.class.getName());
public RelationShipFilterNode(BlackboardArtifact artifact) {
super(artifact);
final String stripEnd = StringUtils.stripEnd(artifact.getDisplayName(), "s");
String removeEndIgnoreCase = StringUtils.removeEndIgnoreCase(stripEnd, "message");
setDisplayName(removeEndIgnoreCase.isEmpty() ? stripEnd : removeEndIgnoreCase);
}
@Override
protected Sheet createSheet() {
Sheet s = new Sheet();
Sheet.Set ss = s.get(Sheet.PROPERTIES);
if (ss == null) {
ss = Sheet.createPropertiesSet();
s.put(ss);
}
ss.put(new NodeProperty<>("Type", "Type", "Type", getDisplayName()));
final BlackboardArtifact artifact = getArtifact();
BlackboardArtifact.ARTIFACT_TYPE fromID = BlackboardArtifact.ARTIFACT_TYPE.fromID(getArtifact().getArtifactTypeID());
if (null != fromID) {
switch (fromID) {
case TSK_EMAIL_MSG:
ss.put(new NodeProperty<>("From", "From", "From",
getAttributeDisplayString(artifact, TSK_EMAIL_FROM)));
ss.put(new NodeProperty<>("To", "To", "To",
getAttributeDisplayString(artifact, TSK_EMAIL_TO)));
ss.put(new NodeProperty<>("Date", "Date", "Date",
getAttributeDisplayString(artifact, TSK_DATETIME_SENT)));
ss.put(new NodeProperty<>("Subject", "Subject", "Subject",
getAttributeDisplayString(artifact, TSK_SUBJECT)));
break;
case TSK_MESSAGE:
ss.put(new NodeProperty<>("From", "From", "From",
getAttributeDisplayString(artifact, TSK_PHONE_NUMBER_FROM)));
ss.put(new NodeProperty<>("To", "To", "To",
getAttributeDisplayString(artifact, TSK_PHONE_NUMBER_TO)));
ss.put(new NodeProperty<>("Date", "Date", "Date",
getAttributeDisplayString(artifact, TSK_DATETIME)));
ss.put(new NodeProperty<>("Subject", "Subject", "Subject",
getAttributeDisplayString(artifact, TSK_SUBJECT)));
break;
case TSK_CALLLOG:
ss.put(new NodeProperty<>("From", "From", "From",
getAttributeDisplayString(artifact, TSK_PHONE_NUMBER_FROM)));
ss.put(new NodeProperty<>("To", "To", "To",
getAttributeDisplayString(artifact, TSK_PHONE_NUMBER_TO)));
ss.put(new NodeProperty<>("Date", "Date", "Date",
getAttributeDisplayString(artifact, TSK_DATETIME_START)));
break;
default:
break;
}
}
return s;
}
/**
*
* @param artifact the value of artifact
* @param attributeType the value of TSK_SUBJECT1
*
* @throws TskCoreException
*/
private static String getAttributeDisplayString(final BlackboardArtifact artifact, final ATTRIBUTE_TYPE attributeType) {
try {
BlackboardAttribute attribute = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.fromID(attributeType.getTypeID())));
if (attribute == null) {
return "";
} else {
return attribute.getDisplayString();
}
} catch (TskCoreException tskCoreException) {
logger.log(Level.WARNING, "Error getting attribute value.", tskCoreException);
return "";
}
}
}

View File

@ -37,4 +37,4 @@ MessageContentViewer.directionText.text=direction
MessageContentViewer.ccLabel.text=CC: MessageContentViewer.ccLabel.text=CC:
MessageContentViewer.showImagesToggleButton.text=Show Images MessageContentViewer.showImagesToggleButton.text=Show Images
MessageContentViewer.showImagesToggleButton.hide.text=Hide Images MessageContentViewer.showImagesToggleButton.hide.text=Hide Images
MessageContentViewer.htmlbodyScrollPane.TabConstraints.tabTitle=HTML MessageContentViewer.htmlPane.TabConstraints.tabTitle=HTML

View File

@ -3,7 +3,7 @@
<Form version="1.5" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JPanelFormInfo"> <Form version="1.5" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
<Properties> <Properties>
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor"> <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[650, 546]"/> <Dimension value="null"/>
</Property> </Property>
</Properties> </Properties>
<AuxValues> <AuxValues>
@ -21,22 +21,24 @@
<Layout> <Layout>
<DimensionLayout dim="0"> <DimensionLayout dim="0">
<Group type="103" groupAlignment="0" attributes="0"> <Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="1" attributes="0"> <Group type="102" alignment="0" attributes="0">
<EmptySpace max="-2" attributes="0"/> <EmptySpace min="-2" pref="5" max="-2" attributes="0"/>
<Component id="envelopePanel" max="32767" attributes="0"/> <Group type="103" groupAlignment="0" attributes="0">
<EmptySpace max="-2" attributes="0"/> <Component id="msgbodyTabbedPane" max="32767" attributes="0"/>
<Component id="envelopePanel" max="32767" attributes="0"/>
</Group>
<EmptySpace min="-2" pref="5" max="-2" attributes="0"/>
</Group> </Group>
<Component id="msgbodyTabbedPane" alignment="0" max="32767" attributes="0"/>
</Group> </Group>
</DimensionLayout> </DimensionLayout>
<DimensionLayout dim="1"> <DimensionLayout dim="1">
<Group type="103" groupAlignment="0" attributes="0"> <Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0"> <Group type="102" alignment="0" attributes="0">
<EmptySpace min="-2" pref="5" max="-2" attributes="0"/>
<Component id="envelopePanel" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/> <EmptySpace max="-2" attributes="0"/>
<Component id="envelopePanel" max="32767" attributes="0"/> <Component id="msgbodyTabbedPane" pref="471" max="32767" attributes="0"/>
<EmptySpace max="-2" attributes="0"/> <EmptySpace min="0" pref="0" max="-2" attributes="0"/>
<Component id="msgbodyTabbedPane" min="-2" pref="397" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
</Group> </Group>
</Group> </Group>
</DimensionLayout> </DimensionLayout>
@ -53,53 +55,46 @@
<DimensionLayout dim="0"> <DimensionLayout dim="0">
<Group type="103" groupAlignment="0" attributes="0"> <Group type="103" groupAlignment="0" attributes="0">
<Group type="102" attributes="0"> <Group type="102" attributes="0">
<EmptySpace max="-2" attributes="0"/> <EmptySpace min="-2" pref="5" max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0"> <Group type="103" groupAlignment="0" attributes="0">
<Group type="102" attributes="0"> <Group type="102" attributes="0">
<Group type="103" groupAlignment="0" attributes="0"> <Group type="103" groupAlignment="0" attributes="0">
<Component id="fromLabel" alignment="0" min="-2" max="-2" attributes="0"/> <Component id="fromLabel" alignment="0" min="-2" max="-2" attributes="0"/>
<Component id="toLabel" alignment="0" min="-2" max="-2" attributes="0"/> <Component id="toLabel" alignment="0" min="-2" max="-2" attributes="0"/>
</Group> </Group>
<EmptySpace type="unrelated" max="-2" attributes="0"/> <EmptySpace type="unrelated" min="-2" max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0">
<Component id="fromText" max="32767" attributes="0"/>
<Component id="toText" max="32767" attributes="0"/>
</Group>
<Group type="103" groupAlignment="0" attributes="0"> <Group type="103" groupAlignment="0" attributes="0">
<Group type="102" attributes="0"> <Group type="102" attributes="0">
<EmptySpace min="-2" pref="8" max="-2" attributes="0"/> <Component id="toText" max="32767" attributes="0"/>
<Component id="datetimeText" min="-2" max="-2" attributes="0"/>
</Group>
<Group type="102" alignment="1" attributes="0">
<EmptySpace max="-2" attributes="0"/> <EmptySpace max="-2" attributes="0"/>
<Component id="directionText" min="-2" max="-2" attributes="0"/> <Component id="directionText" min="-2" pref="66" max="-2" attributes="0"/>
</Group>
<Group type="102" attributes="0">
<Component id="fromText" max="32767" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="datetimeText" min="-2" pref="140" max="-2" attributes="0"/>
</Group> </Group>
</Group> </Group>
</Group> </Group>
<Group type="102" attributes="0"> <Group type="102" attributes="0">
<Group type="103" groupAlignment="0" attributes="0"> <Component id="ccLabel" min="-2" max="-2" attributes="0"/>
<Group type="102" attributes="0"> <EmptySpace min="-2" pref="26" max="-2" attributes="0"/>
<Component id="ccLabel" min="-2" max="-2" attributes="0"/> <Component id="ccText" max="32767" attributes="0"/>
<EmptySpace type="separate" max="-2" attributes="0"/> </Group>
<Component id="ccText" min="-2" max="-2" attributes="0"/> <Group type="102" alignment="0" attributes="0">
</Group> <Component id="subjectLabel" min="-2" max="-2" attributes="0"/>
<Group type="102" alignment="0" attributes="0"> <EmptySpace min="-2" max="-2" attributes="0"/>
<Component id="subjectLabel" min="-2" max="-2" attributes="0"/> <Component id="subjectText" max="32767" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="subjectText" min="-2" pref="400" max="-2" attributes="0"/>
</Group>
</Group>
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
</Group> </Group>
</Group> </Group>
<EmptySpace max="-2" attributes="0"/> <EmptySpace min="-2" pref="5" max="-2" attributes="0"/>
</Group> </Group>
</Group> </Group>
</DimensionLayout> </DimensionLayout>
<DimensionLayout dim="1"> <DimensionLayout dim="1">
<Group type="103" groupAlignment="0" attributes="0"> <Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0"> <Group type="102" alignment="0" attributes="0">
<EmptySpace max="-2" attributes="0"/> <EmptySpace min="-2" pref="5" max="-2" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0"> <Group type="103" groupAlignment="3" attributes="0">
<Component id="fromLabel" alignment="3" min="-2" max="-2" attributes="0"/> <Component id="fromLabel" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="datetimeText" alignment="3" min="-2" max="-2" attributes="0"/> <Component id="datetimeText" alignment="3" min="-2" max="-2" attributes="0"/>
@ -116,12 +111,12 @@
<Component id="ccLabel" alignment="3" min="-2" max="-2" attributes="0"/> <Component id="ccLabel" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="ccText" alignment="3" min="-2" max="-2" attributes="0"/> <Component id="ccText" alignment="3" min="-2" max="-2" attributes="0"/>
</Group> </Group>
<EmptySpace type="separate" max="-2" attributes="0"/> <EmptySpace type="unrelated" max="-2" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0"> <Group type="103" groupAlignment="3" attributes="0">
<Component id="subjectLabel" alignment="3" min="-2" max="-2" attributes="0"/> <Component id="subjectLabel" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="subjectText" alignment="3" min="-2" max="-2" attributes="0"/> <Component id="subjectText" alignment="3" min="-2" max="-2" attributes="0"/>
</Group> </Group>
<EmptySpace pref="24" max="32767" attributes="0"/> <EmptySpace min="-2" pref="5" max="-2" attributes="0"/>
</Group> </Group>
</Group> </Group>
</DimensionLayout> </DimensionLayout>
@ -136,6 +131,7 @@
</Component> </Component>
<Component class="javax.swing.JLabel" name="datetimeText"> <Component class="javax.swing.JLabel" name="datetimeText">
<Properties> <Properties>
<Property name="horizontalAlignment" type="int" value="4"/>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor"> <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/contentviewers/Bundle.properties" key="MessageContentViewer.datetimeText.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/> <ResourceString bundle="org/sleuthkit/autopsy/contentviewers/Bundle.properties" key="MessageContentViewer.datetimeText.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property> </Property>
@ -192,6 +188,7 @@
</Component> </Component>
<Component class="javax.swing.JLabel" name="directionText"> <Component class="javax.swing.JLabel" name="directionText">
<Properties> <Properties>
<Property name="horizontalAlignment" type="int" value="4"/>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor"> <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/contentviewers/Bundle.properties" key="MessageContentViewer.directionText.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/> <ResourceString bundle="org/sleuthkit/autopsy/contentviewers/Bundle.properties" key="MessageContentViewer.directionText.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property> </Property>
@ -247,81 +244,64 @@
</Component> </Component>
</SubComponents> </SubComponents>
</Container> </Container>
<Container class="javax.swing.JScrollPane" name="htmlbodyScrollPane"> <Container class="javax.swing.JPanel" name="htmlPane">
<Constraints> <Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription"> <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
<JTabbedPaneConstraints tabName="HTML"> <JTabbedPaneConstraints tabName="HTML">
<Property name="tabTitle" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor"> <Property name="tabTitle" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/contentviewers/Bundle.properties" key="MessageContentViewer.htmlbodyScrollPane.TabConstraints.tabTitle" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/> <ResourceString bundle="org/sleuthkit/autopsy/contentviewers/Bundle.properties" key="MessageContentViewer.htmlPane.TabConstraints.tabTitle" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property> </Property>
</JTabbedPaneConstraints> </JTabbedPaneConstraints>
</Constraint> </Constraint>
</Constraints> </Constraints>
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/> <Layout>
<DimensionLayout dim="0">
<Group type="103" groupAlignment="0" attributes="0">
<Component id="jScrollPane2" alignment="0" max="32767" attributes="0"/>
<Group type="102" alignment="1" attributes="0">
<EmptySpace pref="533" max="32767" attributes="0"/>
<Component id="showImagesToggleButton" min="-2" max="-2" attributes="0"/>
<EmptySpace min="-2" pref="3" max="-2" attributes="0"/>
</Group>
</Group>
</DimensionLayout>
<DimensionLayout dim="1">
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0">
<Component id="showImagesToggleButton" min="-2" max="-2" attributes="0"/>
<EmptySpace min="-2" max="-2" attributes="0"/>
<Component id="jScrollPane2" max="32767" attributes="0"/>
<EmptySpace min="0" pref="0" max="-2" attributes="0"/>
</Group>
</Group>
</DimensionLayout>
</Layout>
<SubComponents> <SubComponents>
<Container class="javax.swing.JPanel" name="jPanel2"> <Container class="javax.swing.JScrollPane" name="jScrollPane2">
<AuxValues>
<AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
</AuxValues>
<Layout> <Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
<DimensionLayout dim="0">
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="1" attributes="0">
<EmptySpace pref="536" max="32767" attributes="0"/>
<Component id="showImagesToggleButton" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
</Group>
<Group type="103" rootIndex="1" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0">
<EmptySpace max="-2" attributes="0"/>
<Component id="jScrollPane2" pref="623" max="32767" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
</Group>
</Group>
</Group>
</DimensionLayout>
<DimensionLayout dim="1">
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0">
<EmptySpace max="-2" attributes="0"/>
<Component id="showImagesToggleButton" min="-2" max="-2" attributes="0"/>
<EmptySpace pref="333" max="32767" attributes="0"/>
</Group>
<Group type="103" rootIndex="1" groupAlignment="0" attributes="0">
<Group type="102" alignment="1" attributes="0">
<EmptySpace min="0" pref="34" max="32767" attributes="0"/>
<Component id="jScrollPane2" min="-2" pref="333" max="-2" attributes="0"/>
</Group>
</Group>
</Group>
</DimensionLayout>
</Layout>
<SubComponents> <SubComponents>
<Container class="javax.swing.JScrollPane" name="jScrollPane2"> <Component class="javax.swing.JTextPane" name="htmlbodyTextPane">
<AuxValues>
<AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
</AuxValues>
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
<SubComponents>
<Component class="javax.swing.JTextPane" name="htmlbodyTextPane">
<Properties>
<Property name="editable" type="boolean" value="false"/>
</Properties>
</Component>
</SubComponents>
</Container>
<Component class="javax.swing.JToggleButton" name="showImagesToggleButton">
<Properties> <Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor"> <Property name="editable" type="boolean" value="false"/>
<ResourceString bundle="org/sleuthkit/autopsy/contentviewers/Bundle.properties" key="MessageContentViewer.showImagesToggleButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties> </Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="showImagesToggleButtonActionPerformed"/>
</Events>
</Component> </Component>
</SubComponents> </SubComponents>
</Container> </Container>
<Component class="javax.swing.JToggleButton" name="showImagesToggleButton">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/contentviewers/Bundle.properties" key="MessageContentViewer.showImagesToggleButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="showImagesToggleButtonActionPerformed"/>
</Events>
</Component>
</SubComponents> </SubComponents>
</Container> </Container>
<Container class="javax.swing.JScrollPane" name="rtfbodyScrollPane"> <Container class="javax.swing.JScrollPane" name="rtfbodyScrollPane">

View File

@ -20,6 +20,8 @@ package org.sleuthkit.autopsy.contentviewers;
import java.awt.Component; import java.awt.Component;
import java.util.logging.Level; import java.util.logging.Level;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.openide.nodes.Node; import org.openide.nodes.Node;
import org.openide.util.NbBundle; import org.openide.util.NbBundle;
import org.openide.util.lookup.ServiceProvider; import org.openide.util.lookup.ServiceProvider;
@ -28,8 +30,6 @@ import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.datamodel.BlackboardArtifact; import org.sleuthkit.datamodel.BlackboardArtifact;
import org.sleuthkit.datamodel.BlackboardAttribute; import org.sleuthkit.datamodel.BlackboardAttribute;
import org.sleuthkit.datamodel.TskCoreException; import org.sleuthkit.datamodel.TskCoreException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
/** /**
* Shows SMS/MMS/EMail messages * Shows SMS/MMS/EMail messages
@ -37,16 +37,16 @@ import org.jsoup.nodes.Document;
@ServiceProvider(service = DataContentViewer.class, position = 4) @ServiceProvider(service = DataContentViewer.class, position = 4)
public class MessageContentViewer extends javax.swing.JPanel implements DataContentViewer { public class MessageContentViewer extends javax.swing.JPanel implements DataContentViewer {
private static final Logger LOGGER = Logger.getLogger(MessageContentViewer.class.getName()); private static final Logger LOGGER = Logger.getLogger(MessageContentViewer.class.getName());
private static final int HDR_TAB_INDEX = 0; private static final int HDR_TAB_INDEX = 0;
private static final int TEXT_TAB_INDEX = 1; private static final int TEXT_TAB_INDEX = 1;
private static final int HTML_TAB_INDEX = 2; private static final int HTML_TAB_INDEX = 2;
private static final int RTF_TAB_INDEX = 3; private static final int RTF_TAB_INDEX = 3;
private static final long serialVersionUID = 1L;
private BlackboardArtifact artifact; // Artifact currently being displayed private BlackboardArtifact artifact; // Artifact currently being displayed
/** /**
* Creates new form MessageContentViewer * Creates new form MessageContentViewer
*/ */
@ -80,20 +80,20 @@ public class MessageContentViewer extends javax.swing.JPanel implements DataCont
headersTextArea = new javax.swing.JTextArea(); headersTextArea = new javax.swing.JTextArea();
textbodyScrollPane = new javax.swing.JScrollPane(); textbodyScrollPane = new javax.swing.JScrollPane();
textbodyTextArea = new javax.swing.JTextArea(); textbodyTextArea = new javax.swing.JTextArea();
htmlbodyScrollPane = new javax.swing.JScrollPane(); htmlPane = new javax.swing.JPanel();
jPanel2 = new javax.swing.JPanel();
jScrollPane2 = new javax.swing.JScrollPane(); jScrollPane2 = new javax.swing.JScrollPane();
htmlbodyTextPane = new javax.swing.JTextPane(); htmlbodyTextPane = new javax.swing.JTextPane();
showImagesToggleButton = new javax.swing.JToggleButton(); showImagesToggleButton = new javax.swing.JToggleButton();
rtfbodyScrollPane = new javax.swing.JScrollPane(); rtfbodyScrollPane = new javax.swing.JScrollPane();
rtfbodyTextPane = new javax.swing.JTextPane(); rtfbodyTextPane = new javax.swing.JTextPane();
setMinimumSize(new java.awt.Dimension(650, 546)); setMinimumSize(null);
envelopePanel.setBackground(new java.awt.Color(204, 204, 204)); envelopePanel.setBackground(new java.awt.Color(204, 204, 204));
org.openide.awt.Mnemonics.setLocalizedText(fromLabel, org.openide.util.NbBundle.getMessage(MessageContentViewer.class, "MessageContentViewer.fromLabel.text")); // NOI18N org.openide.awt.Mnemonics.setLocalizedText(fromLabel, org.openide.util.NbBundle.getMessage(MessageContentViewer.class, "MessageContentViewer.fromLabel.text")); // NOI18N
datetimeText.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
org.openide.awt.Mnemonics.setLocalizedText(datetimeText, org.openide.util.NbBundle.getMessage(MessageContentViewer.class, "MessageContentViewer.datetimeText.text")); // NOI18N org.openide.awt.Mnemonics.setLocalizedText(datetimeText, org.openide.util.NbBundle.getMessage(MessageContentViewer.class, "MessageContentViewer.datetimeText.text")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(fromText, org.openide.util.NbBundle.getMessage(MessageContentViewer.class, "MessageContentViewer.fromText.text")); // NOI18N org.openide.awt.Mnemonics.setLocalizedText(fromText, org.openide.util.NbBundle.getMessage(MessageContentViewer.class, "MessageContentViewer.fromText.text")); // NOI18N
@ -110,6 +110,7 @@ public class MessageContentViewer extends javax.swing.JPanel implements DataCont
org.openide.awt.Mnemonics.setLocalizedText(subjectText, org.openide.util.NbBundle.getMessage(MessageContentViewer.class, "MessageContentViewer.subjectText.text")); // NOI18N org.openide.awt.Mnemonics.setLocalizedText(subjectText, org.openide.util.NbBundle.getMessage(MessageContentViewer.class, "MessageContentViewer.subjectText.text")); // NOI18N
directionText.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
org.openide.awt.Mnemonics.setLocalizedText(directionText, org.openide.util.NbBundle.getMessage(MessageContentViewer.class, "MessageContentViewer.directionText.text")); // NOI18N org.openide.awt.Mnemonics.setLocalizedText(directionText, org.openide.util.NbBundle.getMessage(MessageContentViewer.class, "MessageContentViewer.directionText.text")); // NOI18N
javax.swing.GroupLayout envelopePanelLayout = new javax.swing.GroupLayout(envelopePanel); javax.swing.GroupLayout envelopePanelLayout = new javax.swing.GroupLayout(envelopePanel);
@ -117,40 +118,36 @@ public class MessageContentViewer extends javax.swing.JPanel implements DataCont
envelopePanelLayout.setHorizontalGroup( envelopePanelLayout.setHorizontalGroup(
envelopePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) envelopePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(envelopePanelLayout.createSequentialGroup() .addGroup(envelopePanelLayout.createSequentialGroup()
.addContainerGap() .addGap(5, 5, 5)
.addGroup(envelopePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(envelopePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(envelopePanelLayout.createSequentialGroup() .addGroup(envelopePanelLayout.createSequentialGroup()
.addGroup(envelopePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(envelopePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(fromLabel) .addComponent(fromLabel)
.addComponent(toLabel)) .addComponent(toLabel))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(envelopePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(fromText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(toText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addGroup(envelopePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(envelopePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(envelopePanelLayout.createSequentialGroup() .addGroup(envelopePanelLayout.createSequentialGroup()
.addGap(8, 8, 8) .addComponent(toText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(datetimeText))
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, envelopePanelLayout.createSequentialGroup()
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(directionText)))) .addComponent(directionText, javax.swing.GroupLayout.PREFERRED_SIZE, 66, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(envelopePanelLayout.createSequentialGroup()
.addComponent(fromText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(datetimeText, javax.swing.GroupLayout.PREFERRED_SIZE, 140, javax.swing.GroupLayout.PREFERRED_SIZE))))
.addGroup(envelopePanelLayout.createSequentialGroup() .addGroup(envelopePanelLayout.createSequentialGroup()
.addGroup(envelopePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(ccLabel)
.addGroup(envelopePanelLayout.createSequentialGroup() .addGap(26, 26, 26)
.addComponent(ccLabel) .addComponent(ccText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addGap(18, 18, 18) .addGroup(envelopePanelLayout.createSequentialGroup()
.addComponent(ccText)) .addComponent(subjectLabel)
.addGroup(envelopePanelLayout.createSequentialGroup() .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(subjectLabel) .addComponent(subjectText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGap(5, 5, 5))
.addComponent(subjectText, javax.swing.GroupLayout.PREFERRED_SIZE, 400, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addGap(0, 0, Short.MAX_VALUE)))
.addContainerGap())
); );
envelopePanelLayout.setVerticalGroup( envelopePanelLayout.setVerticalGroup(
envelopePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) envelopePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(envelopePanelLayout.createSequentialGroup() .addGroup(envelopePanelLayout.createSequentialGroup()
.addContainerGap() .addGap(5, 5, 5)
.addGroup(envelopePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addGroup(envelopePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(fromLabel) .addComponent(fromLabel)
.addComponent(datetimeText) .addComponent(datetimeText)
@ -164,11 +161,11 @@ public class MessageContentViewer extends javax.swing.JPanel implements DataCont
.addGroup(envelopePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addGroup(envelopePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(ccLabel) .addComponent(ccLabel)
.addComponent(ccText)) .addComponent(ccText))
.addGap(18, 18, 18) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(envelopePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addGroup(envelopePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(subjectLabel) .addComponent(subjectLabel)
.addComponent(subjectText)) .addComponent(subjectText))
.addContainerGap(24, Short.MAX_VALUE)) .addGap(5, 5, 5))
); );
headersTextArea.setEditable(false); headersTextArea.setEditable(false);
@ -195,35 +192,26 @@ public class MessageContentViewer extends javax.swing.JPanel implements DataCont
} }
}); });
javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2); javax.swing.GroupLayout htmlPaneLayout = new javax.swing.GroupLayout(htmlPane);
jPanel2.setLayout(jPanel2Layout); htmlPane.setLayout(htmlPaneLayout);
jPanel2Layout.setHorizontalGroup( htmlPaneLayout.setHorizontalGroup(
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) htmlPaneLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel2Layout.createSequentialGroup() .addComponent(jScrollPane2)
.addContainerGap(536, Short.MAX_VALUE) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, htmlPaneLayout.createSequentialGroup()
.addContainerGap(533, Short.MAX_VALUE)
.addComponent(showImagesToggleButton) .addComponent(showImagesToggleButton)
.addContainerGap()) .addGap(3, 3, 3))
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel2Layout.createSequentialGroup()
.addContainerGap()
.addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 623, Short.MAX_VALUE)
.addContainerGap()))
); );
jPanel2Layout.setVerticalGroup( htmlPaneLayout.setVerticalGroup(
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) htmlPaneLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel2Layout.createSequentialGroup() .addGroup(htmlPaneLayout.createSequentialGroup()
.addContainerGap()
.addComponent(showImagesToggleButton) .addComponent(showImagesToggleButton)
.addContainerGap(333, Short.MAX_VALUE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jScrollPane2)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel2Layout.createSequentialGroup() .addGap(0, 0, 0))
.addGap(0, 34, Short.MAX_VALUE)
.addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 333, javax.swing.GroupLayout.PREFERRED_SIZE)))
); );
htmlbodyScrollPane.setViewportView(jPanel2); msgbodyTabbedPane.addTab(org.openide.util.NbBundle.getMessage(MessageContentViewer.class, "MessageContentViewer.htmlPane.TabConstraints.tabTitle"), htmlPane); // NOI18N
msgbodyTabbedPane.addTab(org.openide.util.NbBundle.getMessage(MessageContentViewer.class, "MessageContentViewer.htmlbodyScrollPane.TabConstraints.tabTitle"), htmlbodyScrollPane); // NOI18N
rtfbodyTextPane.setEditable(false); rtfbodyTextPane.setEditable(false);
rtfbodyScrollPane.setViewportView(rtfbodyTextPane); rtfbodyScrollPane.setViewportView(rtfbodyTextPane);
@ -234,37 +222,37 @@ public class MessageContentViewer extends javax.swing.JPanel implements DataCont
this.setLayout(layout); this.setLayout(layout);
layout.setHorizontalGroup( layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addGroup(layout.createSequentialGroup()
.addContainerGap() .addGap(5, 5, 5)
.addComponent(envelopePanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addContainerGap()) .addComponent(msgbodyTabbedPane)
.addComponent(msgbodyTabbedPane) .addComponent(envelopePanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addGap(5, 5, 5))
); );
layout.setVerticalGroup( layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup() .addGroup(layout.createSequentialGroup()
.addContainerGap() .addGap(5, 5, 5)
.addComponent(envelopePanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(envelopePanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(msgbodyTabbedPane, javax.swing.GroupLayout.PREFERRED_SIZE, 397, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(msgbodyTabbedPane, javax.swing.GroupLayout.DEFAULT_SIZE, 471, Short.MAX_VALUE)
.addContainerGap()) .addGap(0, 0, 0))
); );
}// </editor-fold>//GEN-END:initComponents }// </editor-fold>//GEN-END:initComponents
private void showImagesToggleButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_showImagesToggleButtonActionPerformed private void showImagesToggleButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_showImagesToggleButtonActionPerformed
try { try {
BlackboardAttribute attr = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL_CONTENT_HTML)); BlackboardAttribute attr = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL_CONTENT_HTML));
if (attr != null && !attr.getValueString().isEmpty()) { if (attr != null && !attr.getValueString().isEmpty()) {
if (showImagesToggleButton.isSelected()) { if (showImagesToggleButton.isSelected()) {
showImagesToggleButton.setText(org.openide.util.NbBundle.getMessage(MessageContentViewer.class, "MessageContentViewer.showImagesToggleButton.hide.text")); showImagesToggleButton.setText(org.openide.util.NbBundle.getMessage(MessageContentViewer.class, "MessageContentViewer.showImagesToggleButton.hide.text"));
this.htmlbodyTextPane.setText("<html><body>" + attr.getValueString() + "</body></html>"); this.htmlbodyTextPane.setText("<html><body>" + attr.getValueString() + "</body></html>");
} } else {
else {
showImagesToggleButton.setText(org.openide.util.NbBundle.getMessage(MessageContentViewer.class, "MessageContentViewer.showImagesToggleButton.text")); showImagesToggleButton.setText(org.openide.util.NbBundle.getMessage(MessageContentViewer.class, "MessageContentViewer.showImagesToggleButton.text"));
this.htmlbodyTextPane.setText("<html><body>" + cleanseHTML(attr.getValueString()) + "</body></html>"); this.htmlbodyTextPane.setText("<html><body>" + cleanseHTML(attr.getValueString()) + "</body></html>");
} }
} }
@ -284,9 +272,8 @@ public class MessageContentViewer extends javax.swing.JPanel implements DataCont
private javax.swing.JLabel fromText; private javax.swing.JLabel fromText;
private javax.swing.JScrollPane headersScrollPane; private javax.swing.JScrollPane headersScrollPane;
private javax.swing.JTextArea headersTextArea; private javax.swing.JTextArea headersTextArea;
private javax.swing.JScrollPane htmlbodyScrollPane; private javax.swing.JPanel htmlPane;
private javax.swing.JTextPane htmlbodyTextPane; private javax.swing.JTextPane htmlbodyTextPane;
private javax.swing.JPanel jPanel2;
private javax.swing.JScrollPane jScrollPane2; private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JTabbedPane msgbodyTabbedPane; private javax.swing.JTabbedPane msgbodyTabbedPane;
private javax.swing.JScrollPane rtfbodyScrollPane; private javax.swing.JScrollPane rtfbodyScrollPane;
@ -302,27 +289,30 @@ public class MessageContentViewer extends javax.swing.JPanel implements DataCont
private void customizeComponents() { private void customizeComponents() {
// do any customizations here // do any customizations here
Utilities.configureTextPaneAsHtml(htmlbodyTextPane); Utilities.configureTextPaneAsHtml(htmlbodyTextPane);
Utilities.configureTextPaneAsRtf(rtfbodyTextPane); Utilities.configureTextPaneAsRtf(rtfbodyTextPane);
} }
@Override @Override
public void setNode(Node node) { public void setNode(Node node) {
if (node == null) {
return;
}
artifact = node.getLookup().lookup(BlackboardArtifact.class); artifact = node.getLookup().lookup(BlackboardArtifact.class);
if (artifact == null) { if (artifact == null) {
return; return;
} }
if (artifact.getArtifactTypeID() == BlackboardArtifact.ARTIFACT_TYPE.TSK_MESSAGE.getTypeID()) { if (artifact.getArtifactTypeID() == BlackboardArtifact.ARTIFACT_TYPE.TSK_MESSAGE.getTypeID()) {
displayMsg(); displayMsg();
} } else if (artifact.getArtifactTypeID() == BlackboardArtifact.ARTIFACT_TYPE.TSK_EMAIL_MSG.getTypeID()) {
else if (artifact.getArtifactTypeID() == BlackboardArtifact.ARTIFACT_TYPE.TSK_EMAIL_MSG.getTypeID()) {
displayEmailMsg(); displayEmailMsg();
} }
} }
@Override @Override
@ -352,211 +342,197 @@ public class MessageContentViewer extends javax.swing.JPanel implements DataCont
@Override @Override
public boolean isSupported(Node node) { public boolean isSupported(Node node) {
BlackboardArtifact artifact = node.getLookup().lookup(BlackboardArtifact.class); BlackboardArtifact artifact = node.getLookup().lookup(BlackboardArtifact.class);
return ( (artifact != null) return ((artifact != null)
&& ((artifact.getArtifactTypeID() == BlackboardArtifact.ARTIFACT_TYPE.TSK_EMAIL_MSG.getTypeID()) && ((artifact.getArtifactTypeID() == BlackboardArtifact.ARTIFACT_TYPE.TSK_EMAIL_MSG.getTypeID())
|| (artifact.getArtifactTypeID() == BlackboardArtifact.ARTIFACT_TYPE.TSK_MESSAGE.getTypeID()))); || (artifact.getArtifactTypeID() == BlackboardArtifact.ARTIFACT_TYPE.TSK_MESSAGE.getTypeID())));
} }
@Override @Override
public int isPreferred(Node node) { public int isPreferred(Node node) {
if ( isSupported(node)){ if (isSupported(node)) {
return 6; return 6;
} }
return 0; return 0;
} }
private void displayEmailMsg() {
private void displayEmailMsg()
{
directionText.setVisible(false); directionText.setVisible(false);
showImagesToggleButton.setVisible(false); showImagesToggleButton.setVisible(false);
showImagesToggleButton.setText("Show Images"); showImagesToggleButton.setText("Show Images");
showImagesToggleButton.setSelected(false); showImagesToggleButton.setSelected(false);
try { try {
BlackboardAttribute attr = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL_FROM)); BlackboardAttribute attr = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL_FROM));
this.fromText.setText(attr.getValueString()); this.fromText.setText(attr.getValueString());
attr = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL_TO)); attr = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL_TO));
if (attr != null) { if (attr != null) {
this.toText.setText(attr.getValueString()); this.toText.setText(attr.getValueString());
} }
attr = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL_CC)); attr = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL_CC));
if (attr != null && !attr.getValueString().isEmpty()) { if (attr != null && !attr.getValueString().isEmpty()) {
this.ccText.setVisible(true); this.ccText.setVisible(true);
this.ccText.setText(attr.getValueString()); this.ccText.setText(attr.getValueString());
} } else {
else {
this.ccText.setVisible(false); this.ccText.setVisible(false);
} }
attr = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SUBJECT)); attr = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SUBJECT));
if (attr != null && !attr.getValueString().isEmpty()) { if (attr != null && !attr.getValueString().isEmpty()) {
this.subjectText.setVisible(true); this.subjectText.setVisible(true);
this.subjectText.setText(attr.getValueString()); this.subjectText.setText(attr.getValueString());
} } else {
else {
this.subjectText.setVisible(false); this.subjectText.setVisible(false);
} }
attr = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_RCVD)); attr = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_RCVD));
if (attr != null && !attr.getDisplayString().isEmpty()) { if (attr != null && !attr.getDisplayString().isEmpty()) {
this.datetimeText.setVisible(true); this.datetimeText.setVisible(true);
this.datetimeText.setText(attr.getDisplayString()); this.datetimeText.setText(attr.getDisplayString());
} } else {
else {
this.datetimeText.setVisible(false); this.datetimeText.setVisible(false);
} }
int selectedTabIndex = -1; int selectedTabIndex = -1;
attr = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL_CONTENT_PLAIN)); attr = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL_CONTENT_PLAIN));
if (attr != null && !attr.getValueString().isEmpty()) { if (attr != null && !attr.getValueString().isEmpty()) {
this.textbodyTextArea.setVisible(true); this.textbodyTextArea.setVisible(true);
this.textbodyTextArea.setText(attr.getValueString()); this.textbodyTextArea.setText(attr.getValueString());
msgbodyTabbedPane.setEnabledAt(TEXT_TAB_INDEX, true); msgbodyTabbedPane.setEnabledAt(TEXT_TAB_INDEX, true);
selectedTabIndex = TEXT_TAB_INDEX; selectedTabIndex = TEXT_TAB_INDEX;
} } else {
else {
msgbodyTabbedPane.setEnabledAt(TEXT_TAB_INDEX, false); msgbodyTabbedPane.setEnabledAt(TEXT_TAB_INDEX, false);
} }
attr = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL_CONTENT_HTML)); attr = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL_CONTENT_HTML));
if (attr != null && !attr.getValueString().isEmpty()) { if (attr != null && !attr.getValueString().isEmpty()) {
this.showImagesToggleButton.setVisible(true); this.showImagesToggleButton.setVisible(true);
this.htmlbodyTextPane.setVisible(true); this.htmlbodyTextPane.setVisible(true);
this.htmlbodyTextPane.setText("<html><body>" + cleanseHTML(attr.getValueString()) + "</body></html>"); this.htmlbodyTextPane.setText("<html><body>" + cleanseHTML(attr.getValueString()) + "</body></html>");
//this.htmlbodyTextPane.setText(cleanseHTML(attr.getValueString())); //this.htmlbodyTextPane.setText(cleanseHTML(attr.getValueString()));
msgbodyTabbedPane.setEnabledAt(HTML_TAB_INDEX, true); msgbodyTabbedPane.setEnabledAt(HTML_TAB_INDEX, true);
selectedTabIndex = HTML_TAB_INDEX; selectedTabIndex = HTML_TAB_INDEX;
} } else {
else {
msgbodyTabbedPane.setEnabledAt(HTML_TAB_INDEX, false); msgbodyTabbedPane.setEnabledAt(HTML_TAB_INDEX, false);
this.htmlbodyTextPane.setVisible(false); this.htmlbodyTextPane.setVisible(false);
} }
attr = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL_CONTENT_RTF)); attr = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL_CONTENT_RTF));
if (attr != null && !attr.getValueString().isEmpty()) { if (attr != null && !attr.getValueString().isEmpty()) {
this.rtfbodyTextPane.setVisible(true); this.rtfbodyTextPane.setVisible(true);
this.rtfbodyTextPane.setText(attr.getValueString()); this.rtfbodyTextPane.setText(attr.getValueString());
msgbodyTabbedPane.setEnabledAt(RTF_TAB_INDEX, true); msgbodyTabbedPane.setEnabledAt(RTF_TAB_INDEX, true);
selectedTabIndex = RTF_TAB_INDEX; selectedTabIndex = RTF_TAB_INDEX;
} } else {
else {
msgbodyTabbedPane.setEnabledAt(RTF_TAB_INDEX, false); msgbodyTabbedPane.setEnabledAt(RTF_TAB_INDEX, false);
} }
attr = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_HEADERS)); attr = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_HEADERS));
if (attr != null && !attr.getValueString().isEmpty()) { if (attr != null && !attr.getValueString().isEmpty()) {
this.headersTextArea.setVisible(true); this.headersTextArea.setVisible(true);
this.headersTextArea.setText(attr.getValueString()); this.headersTextArea.setText(attr.getValueString());
if (selectedTabIndex < 0) { if (selectedTabIndex < 0) {
selectedTabIndex = HDR_TAB_INDEX; selectedTabIndex = HDR_TAB_INDEX;
} }
} } else {
else {
msgbodyTabbedPane.setEnabledAt(HDR_TAB_INDEX, false); msgbodyTabbedPane.setEnabledAt(HDR_TAB_INDEX, false);
} }
msgbodyTabbedPane.setSelectedIndex(selectedTabIndex); msgbodyTabbedPane.setSelectedIndex(selectedTabIndex);
} } catch (TskCoreException ex) {
catch (TskCoreException ex) {
LOGGER.log(Level.WARNING, "Failed to get attributes for email message.", ex); //NON-NLS LOGGER.log(Level.WARNING, "Failed to get attributes for email message.", ex); //NON-NLS
} }
} }
private void displayMsg() { private void displayMsg() {
this.ccText.setVisible(false); this.ccText.setVisible(false);
this.showImagesToggleButton.setVisible(false); this.showImagesToggleButton.setVisible(false);
msgbodyTabbedPane.setEnabledAt(HTML_TAB_INDEX, false); msgbodyTabbedPane.setEnabledAt(HTML_TAB_INDEX, false);
msgbodyTabbedPane.setEnabledAt(RTF_TAB_INDEX, false); msgbodyTabbedPane.setEnabledAt(RTF_TAB_INDEX, false);
msgbodyTabbedPane.setEnabledAt(HDR_TAB_INDEX, false); msgbodyTabbedPane.setEnabledAt(HDR_TAB_INDEX, false);
try { try {
BlackboardAttribute attr = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_FROM)); BlackboardAttribute attr = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_FROM));
if (attr != null) { if (attr != null) {
this.fromText.setText(attr.getValueString()); this.fromText.setText(attr.getValueString());
}else { } else {
this.fromText.setVisible(false); this.fromText.setVisible(false);
} }
attr = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_TO)); attr = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_TO));
if (attr != null) { if (attr != null) {
this.toText.setText(attr.getValueString()); this.toText.setText(attr.getValueString());
}else { } else {
this.toText.setVisible(false); this.toText.setVisible(false);
} }
attr = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DIRECTION)); attr = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DIRECTION));
if (attr != null) { if (attr != null) {
this.directionText.setText(attr.getValueString()); this.directionText.setText(attr.getValueString());
}else { } else {
this.directionText.setVisible(false); this.directionText.setVisible(false);
} }
attr = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SUBJECT)); attr = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SUBJECT));
if (attr != null && !attr.getValueString().isEmpty()) { if (attr != null && !attr.getValueString().isEmpty()) {
this.subjectText.setVisible(true); this.subjectText.setVisible(true);
this.subjectText.setText(attr.getValueString()); this.subjectText.setText(attr.getValueString());
} } else {
else {
this.subjectText.setVisible(false); this.subjectText.setVisible(false);
} }
attr = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME)); attr = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME));
if (attr != null && !attr.getDisplayString().isEmpty()) { if (attr != null && !attr.getDisplayString().isEmpty()) {
this.datetimeText.setVisible(true); this.datetimeText.setVisible(true);
this.datetimeText.setText(attr.getDisplayString()); this.datetimeText.setText(attr.getDisplayString());
} } else {
else {
this.datetimeText.setVisible(false); this.datetimeText.setVisible(false);
} }
attr = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_TEXT)); attr = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_TEXT));
if (attr != null && !attr.getValueString().isEmpty()) { if (attr != null && !attr.getValueString().isEmpty()) {
this.textbodyTextArea.setVisible(true); this.textbodyTextArea.setVisible(true);
this.textbodyTextArea.setText(attr.getValueString()); this.textbodyTextArea.setText(attr.getValueString());
msgbodyTabbedPane.setEnabledAt(TEXT_TAB_INDEX, true); msgbodyTabbedPane.setEnabledAt(TEXT_TAB_INDEX, true);
} } else {
else {
msgbodyTabbedPane.setEnabledAt(TEXT_TAB_INDEX, false); msgbodyTabbedPane.setEnabledAt(TEXT_TAB_INDEX, false);
} }
msgbodyTabbedPane.setSelectedIndex(TEXT_TAB_INDEX); msgbodyTabbedPane.setSelectedIndex(TEXT_TAB_INDEX);
} } catch (TskCoreException ex) {
catch (TskCoreException ex) {
LOGGER.log(Level.WARNING, "Failed to get attributes for message.", ex); //NON-NLS LOGGER.log(Level.WARNING, "Failed to get attributes for message.", ex); //NON-NLS
} }
} }
/** /**
* Cleans out input HTML string * Cleans out input HTML string
*
* @param htmlInString The HTML string to cleanse
*
* @return The cleansed HTML String
*/ */
private String cleanseHTML(String htmlInString) { private String cleanseHTML(String htmlInString) {
Document doc = Jsoup.parse(htmlInString); Document doc = Jsoup.parse(htmlInString);
// fix all img tags // fix all img tags
doc.select("img[src]").forEach((img) -> { doc.select("img[src]").forEach((img) -> {
img.attr("src", ""); img.attr("src", "");
}); });
return doc.html(); return doc.html();
} }
} }

View File

@ -20,12 +20,10 @@ package org.sleuthkit.autopsy.corecomponentinterfaces;
import java.beans.PropertyChangeListener; import java.beans.PropertyChangeListener;
import org.openide.nodes.Node; import org.openide.nodes.Node;
import org.openide.windows.TopComponent;
/** /**
* The interface for the "bottom right component" window. * The interface for the "bottom right component" window.
* *
* @author jantonius
*/ */
public interface DataContent extends PropertyChangeListener { public interface DataContent extends PropertyChangeListener {

View File

@ -22,6 +22,7 @@ import java.awt.Cursor;
import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener; import java.beans.PropertyChangeListener;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.List; import java.util.List;
import javax.swing.JTabbedPane; import javax.swing.JTabbedPane;
import javax.swing.SwingUtilities; import javax.swing.SwingUtilities;
@ -260,11 +261,7 @@ public class DataResultPanel extends javax.swing.JPanel implements DataResult, C
*/ */
@Override @Override
public List<DataResultViewer> getViewers() { public List<DataResultViewer> getViewers() {
List<DataResultViewer> viewers = new ArrayList<>(); return Collections.unmodifiableList(resultViewers);
resultViewers.forEach((viewer) -> {
viewers.add(viewer);
});
return viewers;
} }
/** /**
@ -397,9 +394,7 @@ public class DataResultPanel extends javax.swing.JPanel implements DataResult, C
* @param selectedNodes The nodes to be selected. * @param selectedNodes The nodes to be selected.
*/ */
public void setSelectedNodes(Node[] selectedNodes) { public void setSelectedNodes(Node[] selectedNodes) {
this.resultViewers.forEach((viewer) -> { this.resultViewers.forEach((viewer) -> viewer.setSelectedNodes(selectedNodes));
viewer.setSelectedNodes(selectedNodes);
});
} }
/** /**
@ -517,14 +512,10 @@ public class DataResultPanel extends javax.swing.JPanel implements DataResult, C
explorerManager = null; explorerManager = null;
} }
this.resultViewers.forEach((viewer) -> { this.resultViewers.forEach((viewer) -> viewer.setNode(null));
viewer.setNode(null);
});
if (!this.isMain) { if (!this.isMain) {
this.resultViewers.forEach((viewer) -> { this.resultViewers.forEach(DataResultViewer::clearComponent);
viewer.clearComponent();
});
this.directoryTablePath.removeAll(); this.directoryTablePath.removeAll();
this.directoryTablePath = null; this.directoryTablePath = null;
this.numberMatchLabel.removeAll(); this.numberMatchLabel.removeAll();
@ -563,9 +554,7 @@ public class DataResultPanel extends javax.swing.JPanel implements DataResult, C
* Pass the selected nodes to all of the result viewers * Pass the selected nodes to all of the result viewers
* sharing this explorer manager. * sharing this explorer manager.
*/ */
resultViewers.forEach((viewer) -> { resultViewers.forEach((viewer) -> viewer.setSelectedNodes(selectedNodes));
viewer.setSelectedNodes(selectedNodes);
});
/* /*
* Passing null signals that either multiple nodes are * Passing null signals that either multiple nodes are

View File

@ -764,7 +764,7 @@ public class DataResultViewerTable extends AbstractDataResultViewer {
Component component = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col); Component component = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col);
// only override the color if a node is not selected // only override the color if a node is not selected
if (!isSelected) { if (currentRoot != null && !isSelected) {
Node node = currentRoot.getChildren().getNodeAt(table.convertRowIndexToModel(row)); Node node = currentRoot.getChildren().getNodeAt(table.convertRowIndexToModel(row));
boolean tagFound = false; boolean tagFound = false;
if (node != null) { if (node != null) {