6305 fixed animating of details area

This commit is contained in:
William Schaefer 2020-05-12 06:03:37 -04:00
parent c3156be65b
commit eaab28e734
13 changed files with 553 additions and 556 deletions

View File

@ -3,7 +3,7 @@
<name unique="discovery"/> <name unique="discovery"/>
<kind type="editor"/> <kind type="editor"/>
<state type="separated"/> <state type="separated"/>
<bounds x="76" y="68" width="1400" height="900"/> <bounds x="76" y="68" width="1100" height="700"/>
<frame state="0"/> <frame state="0"/>
<empty-behavior permanent="false"/> <empty-behavior permanent="false"/>

View File

@ -48,14 +48,12 @@ ResultsPanel.currentPageLabel.text=Page: -
ResultsPanel.pageControlsLabel.text=Pages: ResultsPanel.pageControlsLabel.text=Pages:
ResultsPanel.gotoPageLabel.text=Go to Page: ResultsPanel.gotoPageLabel.text=Go to Page:
ResultsPanel.pageSizeLabel.text=Page Size: ResultsPanel.pageSizeLabel.text=Page Size:
ResultsPanel.instancesList.border.title=Instances
DiscoveryExtractAction.title.extractFiles.text=Extract File DiscoveryExtractAction.title.extractFiles.text=Extract File
FileSearchPanel.includeRadioButton.text=Include FileSearchPanel.includeRadioButton.text=Include
FileSearchPanel.excludeRadioButton.text=Exclude FileSearchPanel.excludeRadioButton.text=Exclude
FileSearchPanel.knownFilesCheckbox.toolTipText= FileSearchPanel.knownFilesCheckbox.toolTipText=
FileSearchPanel.knownFilesCheckbox.text=Hide known files FileSearchPanel.knownFilesCheckbox.text=Hide known files
GroupListPanel.groupKeyList.border.title=Groups GroupListPanel.groupKeyList.border.title=Groups
ResultsPanel.resultsSplitPane.toolTipText=
FileSearchPanel.stepThreeLabel.text=Step 3: Choose display settings FileSearchPanel.stepThreeLabel.text=Step 3: Choose display settings
DocumentPanel.fileSizeLabel.toolTipText= DocumentPanel.fileSizeLabel.toolTipText=
DocumentPanel.isDeletedLabel.toolTipText= DocumentPanel.isDeletedLabel.toolTipText=
@ -66,3 +64,4 @@ DiscoveryDialog.videosButton.text=Videos
DiscoveryDialog.imagesButton.text=Images DiscoveryDialog.imagesButton.text=Images
DiscoveryDialog.searchButton.text=Show DiscoveryDialog.searchButton.text=Show
DiscoveryDialog.cancelButton.text=Cancel DiscoveryDialog.cancelButton.text=Cancel
DetailsPanel.instancesList.border.title=Instances

View File

@ -200,14 +200,12 @@ ResultsPanel.openInExternalViewer.name=Open in External Viewer
ResultsPanel.pageControlsLabel.text=Pages: ResultsPanel.pageControlsLabel.text=Pages:
ResultsPanel.gotoPageLabel.text=Go to Page: ResultsPanel.gotoPageLabel.text=Go to Page:
ResultsPanel.pageSizeLabel.text=Page Size: ResultsPanel.pageSizeLabel.text=Page Size:
ResultsPanel.instancesList.border.title=Instances
DiscoveryExtractAction.title.extractFiles.text=Extract File DiscoveryExtractAction.title.extractFiles.text=Extract File
FileSearchPanel.includeRadioButton.text=Include FileSearchPanel.includeRadioButton.text=Include
FileSearchPanel.excludeRadioButton.text=Exclude FileSearchPanel.excludeRadioButton.text=Exclude
FileSearchPanel.knownFilesCheckbox.toolTipText= FileSearchPanel.knownFilesCheckbox.toolTipText=
FileSearchPanel.knownFilesCheckbox.text=Hide known files FileSearchPanel.knownFilesCheckbox.text=Hide known files
GroupListPanel.groupKeyList.border.title=Groups GroupListPanel.groupKeyList.border.title=Groups
ResultsPanel.resultsSplitPane.toolTipText=
FileSearchPanel.stepThreeLabel.text=Step 3: Choose display settings FileSearchPanel.stepThreeLabel.text=Step 3: Choose display settings
DocumentPanel.fileSizeLabel.toolTipText= DocumentPanel.fileSizeLabel.toolTipText=
DocumentPanel.isDeletedLabel.toolTipText= DocumentPanel.isDeletedLabel.toolTipText=
@ -218,6 +216,7 @@ DiscoveryDialog.videosButton.text=Videos
DiscoveryDialog.imagesButton.text=Images DiscoveryDialog.imagesButton.text=Images
DiscoveryDialog.searchButton.text=Show DiscoveryDialog.searchButton.text=Show
DiscoveryDialog.cancelButton.text=Cancel DiscoveryDialog.cancelButton.text=Cancel
DetailsPanel.instancesList.border.title=Instances
ResultsPanel.unableToCreate.text=Unable to create summary. ResultsPanel.unableToCreate.text=Unable to create summary.
ResultsPanel.viewFileInDir.name=View File in Directory ResultsPanel.viewFileInDir.name=View File in Directory
VideoThumbnailPanel.bytes.text=bytes VideoThumbnailPanel.bytes.text=bytes

View File

@ -16,9 +16,9 @@
<Layout> <Layout>
<DimensionLayout dim="0"> <DimensionLayout dim="0">
<Group type="103" groupAlignment="0" attributes="0"> <Group type="103" groupAlignment="0" attributes="0">
<EmptySpace min="0" pref="667" max="32767" attributes="0"/> <EmptySpace min="0" pref="777" max="32767" attributes="0"/>
<Group type="103" rootIndex="1" groupAlignment="0" attributes="0"> <Group type="103" rootIndex="1" groupAlignment="0" attributes="0">
<Component id="detailsSplitPane" alignment="0" pref="667" max="32767" attributes="0"/> <Component id="detailsSplitPane" alignment="0" max="32767" attributes="0"/>
</Group> </Group>
</Group> </Group>
</DimensionLayout> </DimensionLayout>
@ -26,7 +26,7 @@
<Group type="103" groupAlignment="0" attributes="0"> <Group type="103" groupAlignment="0" attributes="0">
<EmptySpace min="0" pref="402" max="32767" attributes="0"/> <EmptySpace min="0" pref="402" max="32767" attributes="0"/>
<Group type="103" rootIndex="1" groupAlignment="0" attributes="0"> <Group type="103" rootIndex="1" groupAlignment="0" attributes="0">
<Component id="detailsSplitPane" alignment="0" pref="402" max="32767" attributes="0"/> <Component id="detailsSplitPane" alignment="0" max="32767" attributes="0"/>
</Group> </Group>
</Group> </Group>
</DimensionLayout> </DimensionLayout>
@ -34,10 +34,100 @@
<SubComponents> <SubComponents>
<Container class="javax.swing.JSplitPane" name="detailsSplitPane"> <Container class="javax.swing.JSplitPane" name="detailsSplitPane">
<Properties> <Properties>
<Property name="dividerLocation" type="int" value="80"/>
<Property name="orientation" type="int" value="0"/> <Property name="orientation" type="int" value="0"/>
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[200, 0]"/>
</Property>
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[700, 500]"/>
</Property>
</Properties> </Properties>
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout"/> <Layout class="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout"/>
<SubComponents>
<Container class="javax.swing.JPanel" name="instancesPanel">
<Properties>
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[0, 60]"/>
</Property>
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[700, 80]"/>
</Property>
</Properties>
<AuxValues>
<AuxValue name="JavaCodeGenerator_VariableLocal" type="java.lang.Boolean" value="true"/>
<AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="0"/>
</AuxValues>
<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>
<Layout>
<DimensionLayout dim="0">
<Group type="103" groupAlignment="0" attributes="0">
<EmptySpace min="0" pref="775" max="32767" attributes="0"/>
<Group type="103" rootIndex="1" groupAlignment="0" attributes="0">
<Component id="instancesScrollPane" alignment="0" max="32767" attributes="0"/>
</Group>
</Group>
</DimensionLayout>
<DimensionLayout dim="1">
<Group type="103" groupAlignment="0" attributes="0">
<EmptySpace min="0" pref="79" max="32767" attributes="0"/>
<Group type="103" rootIndex="1" groupAlignment="0" attributes="0">
<Group type="102" alignment="1" attributes="0">
<EmptySpace min="-2" pref="0" max="-2" attributes="0"/>
<Component id="instancesScrollPane" pref="79" max="32767" attributes="0"/>
</Group>
</Group>
</Group>
</DimensionLayout>
</Layout>
<SubComponents>
<Container class="javax.swing.JScrollPane" name="instancesScrollPane">
<Properties>
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[775, 60]"/>
</Property>
</Properties>
<AuxValues>
<AuxValue name="JavaCodeGenerator_VariableLocal" type="java.lang.Boolean" value="true"/>
<AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="0"/>
<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.JList" name="instancesList">
<Properties>
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
<Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
<TitledBorder title="Instances">
<ResourceString PropertyName="titleX" bundle="org/sleuthkit/autopsy/discovery/Bundle.properties" key="DetailsPanel.instancesList.border.title" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</TitledBorder>
</Border>
</Property>
<Property name="model" type="javax.swing.ListModel" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
<Connection code="instancesListModel" type="code"/>
</Property>
<Property name="selectionMode" type="int" value="0"/>
<Property name="cellRenderer" type="javax.swing.ListCellRenderer" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
<Connection code="new InstancesCellRenderer()" type="code"/>
</Property>
<Property name="visibleRowCount" type="int" value="2"/>
</Properties>
<AuxValues>
<AuxValue name="JavaCodeGenerator_TypeParameters" type="java.lang.String" value="&lt;AbstractFile&gt;"/>
</AuxValues>
</Component>
</SubComponents>
</Container>
</SubComponents>
</Container>
</SubComponents>
</Container> </Container>
</SubComponents> </SubComponents>
</Form> </Form>

View File

@ -1,11 +1,48 @@
/* /*
* To change this license header, choose License Headers in Project Properties. * Autopsy
* To change this template file, choose Tools | Templates *
* and open the template in the editor. * Copyright 2020 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.discovery; package org.sleuthkit.autopsy.discovery;
import com.google.common.eventbus.Subscribe;
import java.awt.Component;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.swing.DefaultListCellRenderer;
import javax.swing.DefaultListModel;
import javax.swing.JList;
import javax.swing.JPopupMenu;
import javax.swing.SwingUtilities;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import org.sleuthkit.autopsy.actions.AddContentTagAction;
import org.sleuthkit.autopsy.actions.DeleteFileContentTagAction;
import org.sleuthkit.autopsy.corecomponents.DataContentPanel; import org.sleuthkit.autopsy.corecomponents.DataContentPanel;
import org.sleuthkit.autopsy.corecomponents.TableFilterNode;
import org.sleuthkit.autopsy.datamodel.FileNode;
import org.sleuthkit.autopsy.directorytree.ExternalViewerAction;
import org.sleuthkit.autopsy.directorytree.ViewContextAction;
import org.sleuthkit.autopsy.modules.hashdatabase.AddContentToHashDbAction;
import org.sleuthkit.autopsy.timeline.actions.ViewFileInTimelineAction;
import org.sleuthkit.datamodel.AbstractFile;
import org.sleuthkit.datamodel.TskCoreException;
/** /**
* *
@ -13,7 +50,11 @@ import org.sleuthkit.autopsy.corecomponents.DataContentPanel;
*/ */
public class DetailsPanel extends javax.swing.JPanel { public class DetailsPanel extends javax.swing.JPanel {
private static final long serialVersionUID = 1L;
private final DataContentPanel dataContentPanel; private final DataContentPanel dataContentPanel;
private final DefaultListModel<AbstractFile> instancesListModel = new DefaultListModel<>();
private ListSelectionListener listener = null;
/** /**
* Creates new form DetailsPanel * Creates new form DetailsPanel
@ -21,7 +62,95 @@ public class DetailsPanel extends javax.swing.JPanel {
public DetailsPanel() { public DetailsPanel() {
initComponents(); initComponents();
dataContentPanel = DataContentPanel.createInstance(); dataContentPanel = DataContentPanel.createInstance();
detailsSplitPane.setBottomComponent(dataContentPanel); detailsSplitPane.setBottomComponent(dataContentPanel);
//Add the context menu when right clicking
instancesList.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
if (SwingUtilities.isRightMouseButton(e)) {
SwingUtilities.invokeLater(() -> {
instancesList.setSelectedIndex(instancesList.locationToIndex(e.getPoint()));
Set<AbstractFile> files = new HashSet<>();
files.add(instancesList.getSelectedValue());
JPopupMenu menu = new JPopupMenu();
menu.add(new ViewContextAction(Bundle.ResultsPanel_viewFileInDir_name(), instancesList.getSelectedValue()));
menu.add(new ExternalViewerAction(Bundle.ResultsPanel_openInExternalViewer_name(), new FileNode(instancesList.getSelectedValue())));
menu.add(ViewFileInTimelineAction.createViewFileAction(instancesList.getSelectedValue()));
menu.add(new DiscoveryExtractAction(files));
menu.add(AddContentTagAction.getInstance().getMenuForContent(files));
menu.add(DeleteFileContentTagAction.getInstance().getMenuForFiles(files));
menu.add(AddContentToHashDbAction.getInstance().getMenuForFiles(files));
menu.show(instancesList, e.getPoint().x, e.getPoint().y);
});
}
}
});
listener = new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
if (!e.getValueIsAdjusting()) {
SwingUtilities.invokeLater(() -> {
AbstractFile file = getSelectedFile();
if (file != null) {
dataContentPanel.setNode(new TableFilterNode(new FileNode(file), false));
} else {
dataContentPanel.setNode(null);
}
});
}
}
};
instancesList.addListSelectionListener(listener);
}
@Subscribe
void handleClearSelectionListener(DiscoveryEventUtils.ClearInstanceSelectionEvent clearEvent) {
instancesList.clearSelection();
}
/**
* Populate the instances list.
*/
@Subscribe
synchronized void handlePopulateInstancesListEvent(DiscoveryEventUtils.PopulateInstancesListEvent populateEvent) {
SwingUtilities.invokeLater(() -> {
List<AbstractFile> files = populateEvent.getInstances();
if (files.isEmpty()) {
//if there are no files currently remove the current items without removing listener to cause content viewer to reset
instancesListModel.removeAllElements();
//send fade out event
DiscoveryEventUtils.getDiscoveryEventBus().post(new DiscoveryEventUtils.DetailsVisibleEvent(false));
} else {
//remove listener so content viewer node is not set multiple times
instancesList.removeListSelectionListener(listener);
instancesListModel.removeAllElements();
for (AbstractFile file : files) {
instancesListModel.addElement(file);
}
//add listener back to allow selection of first index to cause content viewer node to be set
instancesList.addListSelectionListener(listener);
if (!instancesListModel.isEmpty()) {
instancesList.setSelectedIndex(0);
}
//send fade in event
DiscoveryEventUtils.getDiscoveryEventBus().post(new DiscoveryEventUtils.DetailsVisibleEvent(true));
}
});
}
/**
* Get the AbstractFile for the item currently selected in the instances
* list.
*
* @return The AbstractFile which is currently selected.
*/
synchronized AbstractFile getSelectedFile() {
if (instancesList.getSelectedIndex() == -1) {
return null;
} else {
return instancesListModel.getElementAt(instancesList.getSelectedIndex());
}
} }
/** /**
@ -34,27 +163,91 @@ public class DetailsPanel extends javax.swing.JPanel {
private void initComponents() { private void initComponents() {
detailsSplitPane = new javax.swing.JSplitPane(); detailsSplitPane = new javax.swing.JSplitPane();
javax.swing.JPanel instancesPanel = new javax.swing.JPanel();
javax.swing.JScrollPane instancesScrollPane = new javax.swing.JScrollPane();
instancesList = new javax.swing.JList<>();
detailsSplitPane.setDividerLocation(80);
detailsSplitPane.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT); detailsSplitPane.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT);
detailsSplitPane.setMinimumSize(new java.awt.Dimension(200, 0));
detailsSplitPane.setPreferredSize(new java.awt.Dimension(700, 500));
instancesPanel.setMinimumSize(new java.awt.Dimension(0, 60));
instancesPanel.setPreferredSize(new java.awt.Dimension(700, 80));
instancesScrollPane.setPreferredSize(new java.awt.Dimension(775, 60));
instancesList.setBorder(javax.swing.BorderFactory.createTitledBorder(org.openide.util.NbBundle.getMessage(DetailsPanel.class, "DetailsPanel.instancesList.border.title"))); // NOI18N
instancesList.setModel(instancesListModel);
instancesList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
instancesList.setCellRenderer(new InstancesCellRenderer());
instancesList.setVisibleRowCount(2);
instancesScrollPane.setViewportView(instancesList);
javax.swing.GroupLayout instancesPanelLayout = new javax.swing.GroupLayout(instancesPanel);
instancesPanel.setLayout(instancesPanelLayout);
instancesPanelLayout.setHorizontalGroup(
instancesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 775, Short.MAX_VALUE)
.addGroup(instancesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(instancesScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
instancesPanelLayout.setVerticalGroup(
instancesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 79, Short.MAX_VALUE)
.addGroup(instancesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, instancesPanelLayout.createSequentialGroup()
.addGap(0, 0, 0)
.addComponent(instancesScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 79, Short.MAX_VALUE)))
);
detailsSplitPane.setTopComponent(instancesPanel);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout); this.setLayout(layout);
layout.setHorizontalGroup( layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 667, Short.MAX_VALUE) .addGap(0, 777, Short.MAX_VALUE)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(detailsSplitPane, javax.swing.GroupLayout.DEFAULT_SIZE, 667, Short.MAX_VALUE)) .addComponent(detailsSplitPane, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
); );
layout.setVerticalGroup( layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 402, Short.MAX_VALUE) .addGap(0, 402, Short.MAX_VALUE)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(detailsSplitPane, javax.swing.GroupLayout.DEFAULT_SIZE, 402, Short.MAX_VALUE)) .addComponent(detailsSplitPane, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
); );
}// </editor-fold>//GEN-END:initComponents }// </editor-fold>//GEN-END:initComponents
// Variables declaration - do not modify//GEN-BEGIN:variables // Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JSplitPane detailsSplitPane; private javax.swing.JSplitPane detailsSplitPane;
private javax.swing.JList<AbstractFile> instancesList;
// End of variables declaration//GEN-END:variables // End of variables declaration//GEN-END:variables
/**
* Cell renderer for the instances list.
*/
private class InstancesCellRenderer extends DefaultListCellRenderer {
private static final long serialVersionUID = 1L;
@Override
public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
String name = "";
if (value instanceof AbstractFile) {
AbstractFile file = (AbstractFile) value;
try {
name = file.getUniquePath();
} catch (TskCoreException ingored) {
name = file.getParentPath() + "/" + file.getName();
}
}
setText(name);
return this;
}
}
} }

View File

@ -202,11 +202,14 @@
<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/discovery/Bundle.properties" key="DiscoveryDialog.cancelButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/> <ResourceString bundle="org/sleuthkit/autopsy/discovery/Bundle.properties" key="DiscoveryDialog.cancelButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property> </Property>
<Property name="enabled" type="boolean" value="false"/>
</Properties> </Properties>
<Events> <Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="cancelButtonActionPerformed"/> <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="cancelButtonActionPerformed"/>
</Events> </Events>
<AuxValues>
<AuxValue name="JavaCodeGenerator_VariableLocal" type="java.lang.Boolean" value="true"/>
<AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="0"/>
</AuxValues>
</Component> </Component>
</SubComponents> </SubComponents>
</Container> </Container>

View File

@ -37,11 +37,19 @@ final class DiscoveryDialog extends javax.swing.JDialog {
private static final Color SELECTED_COLOR = new Color(216, 230, 242); private static final Color SELECTED_COLOR = new Color(216, 230, 242);
private static final Color UNSELECTED_COLOR = new Color(240, 240, 240); private static final Color UNSELECTED_COLOR = new Color(240, 240, 240);
private SearchWorker searchWorker = null; private SearchWorker searchWorker = null;
private static DiscoveryDialog discoveryDialog;
DiscoveryDialog() { private DiscoveryDialog() {
this(null, true); this(null, true);
} }
public static synchronized DiscoveryDialog getDiscoveryDialogInstance() {
if (discoveryDialog == null) {
discoveryDialog = new DiscoveryDialog();
}
return discoveryDialog;
}
/** /**
* Creates new form DiscoveryDialog * Creates new form DiscoveryDialog
*/ */
@ -100,7 +108,7 @@ final class DiscoveryDialog extends javax.swing.JDialog {
jPanel1 = new javax.swing.JPanel(); jPanel1 = new javax.swing.JPanel();
searchButton = new javax.swing.JButton(); searchButton = new javax.swing.JButton();
errorLabel = new javax.swing.JLabel(); errorLabel = new javax.swing.JLabel();
cancelButton = new javax.swing.JButton(); javax.swing.JButton cancelButton = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
@ -180,7 +188,6 @@ final class DiscoveryDialog extends javax.swing.JDialog {
errorLabel.setForeground(new java.awt.Color(255, 0, 0)); errorLabel.setForeground(new java.awt.Color(255, 0, 0));
org.openide.awt.Mnemonics.setLocalizedText(cancelButton, org.openide.util.NbBundle.getMessage(DiscoveryDialog.class, "DiscoveryDialog.cancelButton.text")); // NOI18N org.openide.awt.Mnemonics.setLocalizedText(cancelButton, org.openide.util.NbBundle.getMessage(DiscoveryDialog.class, "DiscoveryDialog.cancelButton.text")); // NOI18N
cancelButton.setEnabled(false);
cancelButton.addActionListener(new java.awt.event.ActionListener() { cancelButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) { public void actionPerformed(java.awt.event.ActionEvent evt) {
cancelButtonActionPerformed(evt); cancelButtonActionPerformed(evt);
@ -270,12 +277,9 @@ final class DiscoveryDialog extends javax.swing.JDialog {
if (tc.isOpened() == false) { if (tc.isOpened() == false) {
tc.open(); tc.open();
// tc.updateSearchSettings();
// displayErrorMessage(tc);
} }
tc.resetTopComponent(); tc.resetTopComponent();
List<FileSearchFiltering.FileFilter> filters = filterPanel.getFilters(); List<FileSearchFiltering.FileFilter> filters = filterPanel.getFilters();
// enableSearch(false);
DiscoveryEventUtils.getDiscoveryEventBus().post(new DiscoveryEventUtils.SearchStartedEvent(filterPanel.getSelectedType())); DiscoveryEventUtils.getDiscoveryEventBus().post(new DiscoveryEventUtils.SearchStartedEvent(filterPanel.getSelectedType()));
// Get the grouping attribute and group sorting method // Get the grouping attribute and group sorting method
@ -300,10 +304,15 @@ final class DiscoveryDialog extends javax.swing.JDialog {
tc.requestActive(); tc.requestActive();
}//GEN-LAST:event_searchButtonActionPerformed }//GEN-LAST:event_searchButtonActionPerformed
private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelButtonActionPerformed private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelButtonActionPerformed
// cancelSearch(); this.setVisible(false);
}//GEN-LAST:event_cancelButtonActionPerformed }//GEN-LAST:event_cancelButtonActionPerformed
void cancelSearch() {
filterPanel.cancelSearch();
}
/** /**
* The settings are valid so enable the Search button * The settings are valid so enable the Search button
*/ */
@ -324,7 +333,6 @@ final class DiscoveryDialog extends javax.swing.JDialog {
} }
// Variables declaration - do not modify//GEN-BEGIN:variables // Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton cancelButton;
private javax.swing.JButton documentsButton; private javax.swing.JButton documentsButton;
private javax.swing.JLabel errorLabel; private javax.swing.JLabel errorLabel;
private javax.swing.JButton imagesButton; private javax.swing.JButton imagesButton;

View File

@ -1,7 +1,7 @@
/* /*
* Autopsy * Autopsy
* *
* Copyright 2019 Basis Technology Corp. * Copyright 2019-2020 Basis Technology Corp.
* Contact: carrier <at> sleuthkit <dot> org * Contact: carrier <at> sleuthkit <dot> org
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
@ -24,6 +24,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import org.sleuthkit.autopsy.discovery.FileSearch.GroupKey; import org.sleuthkit.autopsy.discovery.FileSearch.GroupKey;
import org.sleuthkit.autopsy.discovery.FileSearchData.FileType; import org.sleuthkit.autopsy.discovery.FileSearchData.FileType;
import org.sleuthkit.datamodel.AbstractFile;
/** /**
* Class to handle event bus and events for file discovery tool. * Class to handle event bus and events for file discovery tool.
@ -70,6 +71,36 @@ final class DiscoveryEventUtils {
} }
} }
static final class ClearInstanceSelectionEvent {
/**
* Construct a new ClearInstanceSelectionEvent.
*/
ClearInstanceSelectionEvent() {
//no arg constructor
}
}
static final class PopulateInstancesListEvent {
private final List<AbstractFile> instances;
/**
* Construct a new PopulateInstancesListEvent.
*/
PopulateInstancesListEvent(List<AbstractFile> files) {
instances = files;
//no arg constructor
}
/**
* @return the instances
*/
List<AbstractFile> getInstances() {
return Collections.unmodifiableList(instances);
}
}
/** /**
* Event to signal the completion of a search being performed. * Event to signal the completion of a search being performed.
*/ */
@ -332,4 +363,22 @@ final class DiscoveryEventUtils {
} }
} }
static class DetailsVisibleEvent {
private final boolean showDetailsArea;
DetailsVisibleEvent(boolean isVisible) {
showDetailsArea = isVisible;
//no arg constructor
}
/**
* @return the showDetailsArea
*/
boolean isShowDetailsArea() {
return showDetailsArea;
}
}
} }

View File

@ -2,8 +2,11 @@
<Form version="1.4" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JPanelFormInfo"> <Form version="1.4" 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">
<Dimension value="[199, 200]"/>
</Property>
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor"> <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[1400, 900]"/> <Dimension value="[1100, 700]"/>
</Property> </Property>
</Properties> </Properties>
<AuxValues> <AuxValues>
@ -16,16 +19,16 @@
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/> <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/> <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/> <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
<AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,3,-124,0,0,5,120"/> <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,2,-68,0,0,4,76"/>
</AuxValues> </AuxValues>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/> <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
<SubComponents> <SubComponents>
<Container class="javax.swing.JSplitPane" name="mainSplitPane"> <Container class="javax.swing.JSplitPane" name="mainSplitPane">
<Properties> <Properties>
<Property name="dividerLocation" type="int" value="450"/> <Property name="dividerLocation" type="int" value="250"/>
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor"> <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[1400, 828]"/> <Dimension value="[1100, 700]"/>
</Property> </Property>
</Properties> </Properties>
<Constraints> <Constraints>
@ -38,13 +41,15 @@
<SubComponents> <SubComponents>
<Container class="javax.swing.JSplitPane" name="rightSplitPane"> <Container class="javax.swing.JSplitPane" name="rightSplitPane">
<Properties> <Properties>
<Property name="dividerLocation" type="int" value="475"/>
<Property name="orientation" type="int" value="0"/> <Property name="orientation" type="int" value="0"/>
<Property name="resizeWeight" type="double" value="0.5"/> <Property name="resizeWeight" type="double" value="1.0"/>
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor"> <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[1000, 828]"/> <Dimension value="[800, 700]"/>
</Property> </Property>
</Properties> </Properties>
<AuxValues>
<AuxValue name="JavaCodeGenerator_CreateCodeCustom" type="java.lang.String" value="new AnimatedSplitPane()"/>
</AuxValues>
<Constraints> <Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout$JSplitPaneConstraintsDescription"> <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout$JSplitPaneConstraintsDescription">
<JSplitPaneConstraints position="right"/> <JSplitPaneConstraints position="right"/>

View File

@ -1,7 +1,7 @@
/* /*
* Autopsy * Autopsy
* *
* Copyright 2019 Basis Technology Corp. * Copyright 2019-2020 Basis Technology Corp.
* Contact: carrier <at> sleuthkit <dot> org * Contact: carrier <at> sleuthkit <dot> org
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
@ -18,21 +18,17 @@
*/ */
package org.sleuthkit.autopsy.discovery; package org.sleuthkit.autopsy.discovery;
import com.google.common.eventbus.Subscribe;
import java.awt.Graphics;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import javax.swing.SwingUtilities; import javax.swing.JSplitPane;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import org.openide.util.NbBundle; import org.openide.util.NbBundle;
import org.openide.windows.Mode; import org.openide.windows.Mode;
import org.openide.windows.RetainLocation; import org.openide.windows.RetainLocation;
import org.openide.windows.TopComponent; import org.openide.windows.TopComponent;
import org.openide.windows.WindowManager; import org.openide.windows.WindowManager;
import org.sleuthkit.autopsy.corecomponents.DataContentPanel;
import org.sleuthkit.autopsy.corecomponents.TableFilterNode;
import org.sleuthkit.autopsy.coreutils.ThreadConfined; import org.sleuthkit.autopsy.coreutils.ThreadConfined;
import org.sleuthkit.autopsy.datamodel.FileNode;
import org.sleuthkit.datamodel.AbstractFile;
/** /**
* Create a dialog for displaying the file discovery tool * Create a dialog for displaying the file discovery tool
@ -45,10 +41,15 @@ public final class DiscoveryTopComponent extends TopComponent {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private static final String PREFERRED_ID = "DiscoveryTopComponent"; // NON-NLS private static final String PREFERRED_ID = "DiscoveryTopComponent"; // NON-NLS
private final FileSearchPanel fileSearchPanel;
private final GroupListPanel groupListPanel; private final GroupListPanel groupListPanel;
private final DataContentPanel dataContentPanel; private final DetailsPanel detailsPanel;
private final ResultsPanel resultsPanel; private final ResultsPanel resultsPanel;
private int dividerLocation;
private static final int ANIMATION_INCREMENT = 10;
private static final int RESULTS_AREA_SMALL_SIZE = 200;
private SwingAnimator animator = null;
/** /**
* Creates new form FileDiscoveryDialog * Creates new form FileDiscoveryDialog
@ -57,31 +58,14 @@ public final class DiscoveryTopComponent extends TopComponent {
public DiscoveryTopComponent() { public DiscoveryTopComponent() {
initComponents(); initComponents();
setName(Bundle.DiscoveryTopComponent_name()); setName(Bundle.DiscoveryTopComponent_name());
fileSearchPanel = new FileSearchPanel();
dataContentPanel = DataContentPanel.createInstance();
resultsPanel = new ResultsPanel();
groupListPanel = new GroupListPanel(); groupListPanel = new GroupListPanel();
resultsPanel = new ResultsPanel();
detailsPanel = new DetailsPanel();
mainSplitPane.setLeftComponent(groupListPanel); mainSplitPane.setLeftComponent(groupListPanel);
rightSplitPane.setTopComponent(resultsPanel); rightSplitPane.setTopComponent(resultsPanel);
rightSplitPane.setBottomComponent(dataContentPanel); rightSplitPane.setBottomComponent(detailsPanel);
//add list selection listener so the content viewer will be updated with the selected file rightSplitPane.setDividerLocation(1.0);
//when a file is selected in the results panel dividerLocation = rightSplitPane.getDividerLocation();
resultsPanel.addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
if (!e.getValueIsAdjusting()) {
SwingUtilities.invokeLater(() -> {
AbstractFile file = resultsPanel.getSelectedFile();
if (file != null) {
dataContentPanel.setNode(new TableFilterNode(new FileNode(file), false));
} else {
dataContentPanel.setNode(null);
}
});
}
}
});
} }
/** /**
@ -108,19 +92,24 @@ public final class DiscoveryTopComponent extends TopComponent {
DiscoveryEventUtils.getDiscoveryEventBus().register(this); DiscoveryEventUtils.getDiscoveryEventBus().register(this);
DiscoveryEventUtils.getDiscoveryEventBus().register(resultsPanel); DiscoveryEventUtils.getDiscoveryEventBus().register(resultsPanel);
DiscoveryEventUtils.getDiscoveryEventBus().register(groupListPanel); DiscoveryEventUtils.getDiscoveryEventBus().register(groupListPanel);
DiscoveryEventUtils.getDiscoveryEventBus().register(fileSearchPanel); DiscoveryEventUtils.getDiscoveryEventBus().register(detailsPanel);
} }
@Override @Override
protected void componentClosed() { protected void componentClosed() {
fileSearchPanel.cancelSearch(); cancelCurrentSearch();
DiscoveryEventUtils.getDiscoveryEventBus().unregister(this); DiscoveryEventUtils.getDiscoveryEventBus().unregister(this);
DiscoveryEventUtils.getDiscoveryEventBus().unregister(fileSearchPanel);
DiscoveryEventUtils.getDiscoveryEventBus().unregister(groupListPanel); DiscoveryEventUtils.getDiscoveryEventBus().unregister(groupListPanel);
DiscoveryEventUtils.getDiscoveryEventBus().unregister(resultsPanel); DiscoveryEventUtils.getDiscoveryEventBus().unregister(resultsPanel);
DiscoveryEventUtils.getDiscoveryEventBus().unregister(detailsPanel);
super.componentClosed(); super.componentClosed();
} }
private void cancelCurrentSearch() {
final DiscoveryDialog discDialog = DiscoveryDialog.getDiscoveryDialogInstance();
discDialog.cancelSearch();
}
/** /**
* This method is called from within the constructor to initialize the form. * 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 * WARNING: Do NOT modify this code. The content of this method is always
@ -131,18 +120,18 @@ public final class DiscoveryTopComponent extends TopComponent {
private void initComponents() { private void initComponents() {
mainSplitPane = new javax.swing.JSplitPane(); mainSplitPane = new javax.swing.JSplitPane();
rightSplitPane = new javax.swing.JSplitPane(); rightSplitPane = new AnimatedSplitPane();
setPreferredSize(new java.awt.Dimension(1400, 900)); setMinimumSize(new java.awt.Dimension(199, 200));
setPreferredSize(new java.awt.Dimension(1100, 700));
setLayout(new java.awt.BorderLayout()); setLayout(new java.awt.BorderLayout());
mainSplitPane.setDividerLocation(450); mainSplitPane.setDividerLocation(250);
mainSplitPane.setPreferredSize(new java.awt.Dimension(1400, 828)); mainSplitPane.setPreferredSize(new java.awt.Dimension(1100, 700));
rightSplitPane.setDividerLocation(475);
rightSplitPane.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT); rightSplitPane.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT);
rightSplitPane.setResizeWeight(0.5); rightSplitPane.setResizeWeight(1.0);
rightSplitPane.setPreferredSize(new java.awt.Dimension(1000, 828)); rightSplitPane.setPreferredSize(new java.awt.Dimension(800, 700));
mainSplitPane.setRightComponent(rightSplitPane); mainSplitPane.setRightComponent(rightSplitPane);
add(mainSplitPane, java.awt.BorderLayout.CENTER); add(mainSplitPane, java.awt.BorderLayout.CENTER);
@ -159,10 +148,95 @@ public final class DiscoveryTopComponent extends TopComponent {
.collect(Collectors.toList()); .collect(Collectors.toList());
} }
/**
*
* Fades this JPanel in. *
*/
@Subscribe
void handleDetailsVisibleEvent(DiscoveryEventUtils.DetailsVisibleEvent detailsVisibleEvent) {
if (animator != null && animator.isRunning()) {
animator.stop();
}
if (detailsVisibleEvent.isShowDetailsArea()) {
animator = new SwingAnimator(new ShowDetailsAreaCallback());
} else {
animator = new SwingAnimator(new HideDetailsAreaCallback());
}
animator.start();
}
/**
*
* Callback implementation for fading in
*
* @author Greg Cope
*
*
*
*/
private class ShowDetailsAreaCallback implements SwingAnimatorCallback {
@Override
public void callback(Object caller) {
dividerLocation -= ANIMATION_INCREMENT;
repaint();
}
@Override
public boolean hasTerminated() {
if (dividerLocation <= RESULTS_AREA_SMALL_SIZE) {
dividerLocation = RESULTS_AREA_SMALL_SIZE;
return true;
}
return false;
}
}
/**
*
* Callback implementation to fade out
*
* @author Greg Cope
*
*
*
*/
private class HideDetailsAreaCallback implements SwingAnimatorCallback {
@Override
public void callback(Object caller) {
dividerLocation += ANIMATION_INCREMENT;
repaint();
}
@Override
public boolean hasTerminated() {
if (dividerLocation >= rightSplitPane.getHeight()) {
dividerLocation = rightSplitPane.getHeight();
return true;
}
return false;
}
}
// Variables declaration - do not modify//GEN-BEGIN:variables // Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JSplitPane mainSplitPane; private javax.swing.JSplitPane mainSplitPane;
private javax.swing.JSplitPane rightSplitPane; private javax.swing.JSplitPane rightSplitPane;
// End of variables declaration//GEN-END:variables // End of variables declaration//GEN-END:variables
private class AnimatedSplitPane extends JSplitPane {
private static final long serialVersionUID = 1L;
@Override
public void paintComponent(Graphics g) {
if (dividerLocation <= rightSplitPane.getHeight() && dividerLocation >= RESULTS_AREA_SMALL_SIZE) {
rightSplitPane.setDividerLocation(dividerLocation);
}
super.paintComponent(g);
}
}
} }

View File

@ -1,7 +1,7 @@
/* /*
* Autopsy * Autopsy
* *
* Copyright 2019 Basis Technology Corp. * Copyright 2019-2020 Basis Technology Corp.
* Contact: carrier <at> sleuthkit <dot> org * Contact: carrier <at> sleuthkit <dot> org
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
@ -75,19 +75,10 @@ public final class OpenDiscoveryAction extends CallableSystemAction implements P
@Override @Override
@SuppressWarnings("fallthrough") @SuppressWarnings("fallthrough")
public void performAction() { public void performAction() {
final DiscoveryDialog discDialog = new DiscoveryDialog(); final DiscoveryDialog discDialog = DiscoveryDialog.getDiscoveryDialogInstance();
discDialog.cancelSearch();
discDialog.setVisible(true); discDialog.setVisible(true);
// final DiscoveryTopComponent tc = DiscoveryTopComponent.getTopComponent(); displayErrorMessage(discDialog);
// if (tc != null) {
// if (tc.isOpened() == false) {
// tc.open();
// tc.updateSearchSettings();
// displayErrorMessage(tc);
// }
// tc.toFront();
// tc.requestActive();
//
// }
} }
/** /**
@ -96,7 +87,7 @@ public final class OpenDiscoveryAction extends CallableSystemAction implements P
* *
* @param tc The Discovery Top component. * @param tc The Discovery Top component.
*/ */
private void displayErrorMessage(DiscoveryTopComponent tc) { private void displayErrorMessage(DiscoveryDialog discDialog) {
//check if modules run and assemble message //check if modules run and assemble message
try { try {
SleuthkitCase skCase = Case.getCurrentCaseThrows().getSleuthkitCase(); SleuthkitCase skCase = Case.getCurrentCaseThrows().getSleuthkitCase();
@ -113,7 +104,7 @@ public final class OpenDiscoveryAction extends CallableSystemAction implements P
message += dsmodulesWrapper.getMessage(); message += dsmodulesWrapper.getMessage();
} }
if (!message.isEmpty()) { if (!message.isEmpty()) {
JOptionPane.showMessageDialog(tc, message, Bundle.OpenDiscoveryAction_resultsIncomplete_text(), JOptionPane.INFORMATION_MESSAGE); JOptionPane.showMessageDialog(discDialog, message, Bundle.OpenDiscoveryAction_resultsIncomplete_text(), JOptionPane.INFORMATION_MESSAGE);
} }
} catch (NoCurrentCaseException | TskCoreException ex) { } catch (NoCurrentCaseException | TskCoreException ex) {
logger.log(Level.WARNING, "Exception while determining which modules have been run for Discovery", ex); logger.log(Level.WARNING, "Exception while determining which modules have been run for Discovery", ex);

View File

@ -2,8 +2,11 @@
<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">
<Dimension value="[700, 200]"/>
</Property>
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor"> <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[777, 475]"/> <Dimension value="[700, 700]"/>
</Property> </Property>
</Properties> </Properties>
<AuxValues> <AuxValues>
@ -18,24 +21,7 @@
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/> <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
</AuxValues> </AuxValues>
<Layout> <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
<DimensionLayout dim="0">
<Group type="103" groupAlignment="0" attributes="0">
<Component id="pagingPanel" pref="0" max="32767" attributes="0"/>
<Component id="resultsSplitPane" max="32767" attributes="0"/>
</Group>
</DimensionLayout>
<DimensionLayout dim="1">
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="1" attributes="0">
<Component id="pagingPanel" min="-2" max="-2" attributes="0"/>
<EmptySpace min="-2" pref="0" max="-2" attributes="0"/>
<Component id="resultsSplitPane" pref="34" 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="pagingPanel"> <Container class="javax.swing.JPanel" name="pagingPanel">
<Properties> <Properties>
@ -44,11 +30,22 @@
<EtchetBorder/> <EtchetBorder/>
</Border> </Border>
</Property> </Property>
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[400, 39]"/>
</Property>
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[700, 39]"/>
</Property>
</Properties> </Properties>
<AuxValues> <AuxValues>
<AuxValue name="JavaCodeGenerator_VariableLocal" type="java.lang.Boolean" value="true"/> <AuxValue name="JavaCodeGenerator_VariableLocal" type="java.lang.Boolean" value="true"/>
<AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="0"/> <AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="0"/>
</AuxValues> </AuxValues>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
<BorderConstraints direction="First"/>
</Constraint>
</Constraints>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/> <Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
<SubComponents> <SubComponents>
@ -310,114 +307,22 @@
</Component> </Component>
</SubComponents> </SubComponents>
</Container> </Container>
<Container class="javax.swing.JSplitPane" name="resultsSplitPane">
<Properties>
<Property name="orientation" type="int" value="0"/>
<Property name="resizeWeight" type="double" value="1.0"/>
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/discovery/Bundle.properties" key="ResultsPanel.resultsSplitPane.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="opaque" type="boolean" value="false"/>
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[777, 440]"/>
</Property>
</Properties>
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout"/>
<SubComponents>
<Container class="javax.swing.JPanel" name="instancesPanel">
<Properties>
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[775, 68]"/>
</Property>
</Properties>
<AuxValues>
<AuxValue name="JavaCodeGenerator_VariableLocal" type="java.lang.Boolean" value="true"/>
<AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="0"/>
</AuxValues>
<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>
<DimensionLayout dim="0">
<Group type="103" groupAlignment="0" attributes="0">
<EmptySpace min="0" pref="779" max="32767" attributes="0"/>
<Group type="103" rootIndex="1" groupAlignment="0" attributes="0">
<Component id="instancesScrollPane" alignment="0" max="32767" attributes="0"/>
</Group>
</Group>
</DimensionLayout>
<DimensionLayout dim="1">
<Group type="103" groupAlignment="0" attributes="0">
<EmptySpace min="0" pref="433" max="32767" attributes="0"/>
<Group type="103" rootIndex="1" groupAlignment="0" attributes="0">
<Group type="102" alignment="1" attributes="0">
<EmptySpace min="-2" pref="0" max="-2" attributes="0"/>
<Component id="instancesScrollPane" pref="433" max="32767" attributes="0"/>
</Group>
</Group>
</Group>
</DimensionLayout>
</Layout>
<SubComponents>
<Container class="javax.swing.JScrollPane" name="instancesScrollPane">
<Properties>
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[775, 60]"/>
</Property>
</Properties>
<AuxValues>
<AuxValue name="JavaCodeGenerator_VariableLocal" type="java.lang.Boolean" value="true"/>
<AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="0"/>
<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.JList" name="instancesList">
<Properties>
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
<Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
<TitledBorder title="Instances">
<ResourceString PropertyName="titleX" bundle="org/sleuthkit/autopsy/discovery/Bundle.properties" key="ResultsPanel.instancesList.border.title" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</TitledBorder>
</Border>
</Property>
<Property name="model" type="javax.swing.ListModel" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
<Connection code="instancesListModel" type="code"/>
</Property>
<Property name="selectionMode" type="int" value="0"/>
<Property name="cellRenderer" type="javax.swing.ListCellRenderer" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
<Connection code="new InstancesCellRenderer()" type="code"/>
</Property>
<Property name="visibleRowCount" type="int" value="2"/>
</Properties>
<AuxValues>
<AuxValue name="JavaCodeGenerator_TypeParameters" type="java.lang.String" value="&lt;AbstractFile&gt;"/>
</AuxValues>
</Component>
</SubComponents>
</Container>
</SubComponents>
</Container>
<Container class="javax.swing.JPanel" name="resultsViewerPanel"> <Container class="javax.swing.JPanel" name="resultsViewerPanel">
<Properties> <Properties>
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[0, 160]"/>
</Property>
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor"> <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[0, 380]"/> <Dimension value="[700, 700]"/>
</Property> </Property>
</Properties> </Properties>
<Constraints> <Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout$JSplitPaneConstraintsDescription"> <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
<JSplitPaneConstraints position="left"/> <BorderConstraints direction="Center"/>
</Constraint> </Constraint>
</Constraints> </Constraints>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/> <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
</Container> </Container>
</SubComponents> </SubComponents>
</Container>
</SubComponents>
</Form> </Form>

View File

@ -19,44 +19,25 @@
package org.sleuthkit.autopsy.discovery; package org.sleuthkit.autopsy.discovery;
import com.google.common.eventbus.Subscribe; import com.google.common.eventbus.Subscribe;
import java.awt.Component;
import java.awt.Image; import java.awt.Image;
import java.awt.event.ItemEvent; import java.awt.event.ItemEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set;
import java.util.concurrent.CancellationException; import java.util.concurrent.CancellationException;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import java.util.logging.Level; import java.util.logging.Level;
import javax.swing.DefaultComboBoxModel; import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListCellRenderer;
import javax.swing.DefaultListModel;
import javax.swing.JList;
import javax.swing.JOptionPane; import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
import javax.swing.SwingUtilities; import javax.swing.SwingUtilities;
import javax.swing.SwingWorker; import javax.swing.SwingWorker;
import javax.swing.event.ListSelectionListener;
import org.openide.util.NbBundle.Messages; import org.openide.util.NbBundle.Messages;
import org.sleuthkit.autopsy.actions.AddContentTagAction;
import org.sleuthkit.autopsy.actions.DeleteFileContentTagAction;
import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepoException; import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepoException;
import org.sleuthkit.autopsy.coreutils.ImageUtils; import org.sleuthkit.autopsy.coreutils.ImageUtils;
import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.autopsy.datamodel.FileNode;
import org.sleuthkit.autopsy.directorytree.ExternalViewerAction;
import org.sleuthkit.autopsy.directorytree.ViewContextAction;
import org.sleuthkit.autopsy.timeline.actions.ViewFileInTimelineAction;
import org.sleuthkit.autopsy.discovery.FileSearch.GroupKey; import org.sleuthkit.autopsy.discovery.FileSearch.GroupKey;
import org.sleuthkit.autopsy.modules.hashdatabase.AddContentToHashDbAction;
import org.sleuthkit.datamodel.AbstractFile; import org.sleuthkit.datamodel.AbstractFile;
import org.sleuthkit.datamodel.TskCoreException;
import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepository; import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepository;
import org.sleuthkit.autopsy.textsummarizer.TextSummary; import org.sleuthkit.autopsy.textsummarizer.TextSummary;
import java.awt.Graphics;
/** /**
* Panel for displaying of Discovery results and handling the paging of those * Panel for displaying of Discovery results and handling the paging of those
@ -80,16 +61,6 @@ public class ResultsPanel extends javax.swing.JPanel {
private int groupSize = 0; private int groupSize = 0;
private PageWorker pageWorker; private PageWorker pageWorker;
private final List<SwingWorker<Void, Void>> resultContentWorkers = new ArrayList<>(); private final List<SwingWorker<Void, Void>> resultContentWorkers = new ArrayList<>();
private final DefaultListModel<AbstractFile> instancesListModel = new DefaultListModel<>();
private ListSelectionListener listener = null;
private int dividerLocation = 1;
private static final int ANIMATION_INCREMENT = 10;
private SwingAnimator fadeInAnimator = null;
private SwingAnimator fadeOutAnimator = null;
/** /**
* Creates new form ResultsPanel. * Creates new form ResultsPanel.
@ -104,106 +75,40 @@ public class ResultsPanel extends javax.swing.JPanel {
videoThumbnailViewer.addListSelectionListener((e) -> { videoThumbnailViewer.addListSelectionListener((e) -> {
if (resultType == FileSearchData.FileType.VIDEO) { if (resultType == FileSearchData.FileType.VIDEO) {
if (!e.getValueIsAdjusting()) { if (!e.getValueIsAdjusting()) {
populateInstancesList(); //send populateMesage
DiscoveryEventUtils.getDiscoveryEventBus().post(new DiscoveryEventUtils.PopulateInstancesListEvent(getInstancesForSelected()));
} else { } else {
instancesList.clearSelection(); //send clearSelection message
DiscoveryEventUtils.getDiscoveryEventBus().post(new DiscoveryEventUtils.ClearInstanceSelectionEvent());
} }
} }
}); });
imageThumbnailViewer.addListSelectionListener((e) -> { imageThumbnailViewer.addListSelectionListener((e) -> {
if (resultType == FileSearchData.FileType.IMAGE) { if (resultType == FileSearchData.FileType.IMAGE) {
if (!e.getValueIsAdjusting()) { if (!e.getValueIsAdjusting()) {
populateInstancesList(); List<AbstractFile> files = getInstancesForSelected();
//send populateMesage
DiscoveryEventUtils.getDiscoveryEventBus().post(new DiscoveryEventUtils.PopulateInstancesListEvent(getInstancesForSelected()));
} else { } else {
instancesList.clearSelection(); //send clearSelection message
DiscoveryEventUtils.getDiscoveryEventBus().post(new DiscoveryEventUtils.ClearInstanceSelectionEvent());
} }
} }
}); });
documentPreviewViewer.addListSelectionListener((e) -> { documentPreviewViewer.addListSelectionListener((e) -> {
if (resultType == FileSearchData.FileType.DOCUMENTS) { if (resultType == FileSearchData.FileType.DOCUMENTS) {
if (!e.getValueIsAdjusting()) { if (!e.getValueIsAdjusting()) {
populateInstancesList();
} else {
instancesList.clearSelection();
}
}
});
//Add the context menu when right clicking
instancesList.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
if (SwingUtilities.isRightMouseButton(e)) {
SwingUtilities.invokeLater(() -> {
instancesList.setSelectedIndex(instancesList.locationToIndex(e.getPoint()));
Set<AbstractFile> files = new HashSet<>();
files.add(instancesList.getSelectedValue());
JPopupMenu menu = new JPopupMenu();
menu.add(new ViewContextAction(Bundle.ResultsPanel_viewFileInDir_name(), instancesList.getSelectedValue()));
menu.add(new ExternalViewerAction(Bundle.ResultsPanel_openInExternalViewer_name(), new FileNode(instancesList.getSelectedValue())));
menu.add(ViewFileInTimelineAction.createViewFileAction(instancesList.getSelectedValue()));
menu.add(new DiscoveryExtractAction(files));
menu.add(AddContentTagAction.getInstance().getMenuForContent(files));
menu.add(DeleteFileContentTagAction.getInstance().getMenuForFiles(files));
menu.add(AddContentToHashDbAction.getInstance().getMenuForFiles(files));
menu.show(instancesList, e.getPoint().x, e.getPoint().y);
});
}
}
});
}
/**
* Add a list selection listener to the instances list.
*
* @param listener The ListSelectionListener to add to the instances list.
*/
void addListSelectionListener(ListSelectionListener newListener) {
instancesList.removeListSelectionListener(listener);
listener = newListener;
instancesList.addListSelectionListener(listener);
}
/**
* Populate the instances list.
*/
synchronized void populateInstancesList() {
SwingUtilities.invokeLater(() -> {
List<AbstractFile> files = getInstancesForSelected(); List<AbstractFile> files = getInstancesForSelected();
if (files.isEmpty()) { //send populateMesage
//if there are no files currently remove the current items without removing listener to cause content viewer to reset DiscoveryEventUtils.getDiscoveryEventBus().post(new DiscoveryEventUtils.PopulateInstancesListEvent(getInstancesForSelected()));
instancesListModel.removeAllElements();
fadeOut();
} else { } else {
//remove listener so content viewer node is not set multiple times //send clearSelection message
instancesList.removeListSelectionListener(listener); DiscoveryEventUtils.getDiscoveryEventBus().post(new DiscoveryEventUtils.ClearInstanceSelectionEvent());
instancesListModel.removeAllElements();
for (AbstractFile file : files) {
instancesListModel.addElement(file);
} }
//add listener back to allow selection of first index to cause content viewer node to be set
instancesList.addListSelectionListener(listener);
if (!instancesListModel.isEmpty()) {
instancesList.setSelectedIndex(0);
}
fadeIn();
} }
}); });
}
/**
* Get the AbstractFile for the item currently selected in the instances
* list.
*
* @return The AbstractFile which is currently selected.
*/
synchronized AbstractFile getSelectedFile() {
if (instancesList.getSelectedIndex() == -1) {
return null;
} else {
return instancesListModel.getElementAt(instancesList.getSelectedIndex());
}
} }
/** /**
@ -237,7 +142,9 @@ public class ResultsPanel extends javax.swing.JPanel {
@Subscribe @Subscribe
void handlePageRetrievedEvent(DiscoveryEventUtils.PageRetrievedEvent pageRetrievedEvent) { void handlePageRetrievedEvent(DiscoveryEventUtils.PageRetrievedEvent pageRetrievedEvent) {
SwingUtilities.invokeLater(() -> { SwingUtilities.invokeLater(() -> {
populateInstancesList(); //send populateMesage
DiscoveryEventUtils.getDiscoveryEventBus().post(new DiscoveryEventUtils.PopulateInstancesListEvent(getInstancesForSelected()));
currentPage = pageRetrievedEvent.getPageNumber(); currentPage = pageRetrievedEvent.getPageNumber();
updateControls(); updateControls();
resetResultViewer(); resetResultViewer();
@ -437,15 +344,15 @@ public class ResultsPanel extends javax.swing.JPanel {
javax.swing.Box.Filler filler2 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 0), new java.awt.Dimension(32767, 0)); javax.swing.Box.Filler filler2 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 0), new java.awt.Dimension(32767, 0));
javax.swing.Box.Filler filler3 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 0), new java.awt.Dimension(32767, 0)); javax.swing.Box.Filler filler3 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 0), new java.awt.Dimension(32767, 0));
javax.swing.Box.Filler filler4 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 0), new java.awt.Dimension(32767, 0)); javax.swing.Box.Filler filler4 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 0), new java.awt.Dimension(32767, 0));
resultsSplitPane = new javax.swing.JSplitPane();
javax.swing.JPanel instancesPanel = new javax.swing.JPanel();
javax.swing.JScrollPane instancesScrollPane = new javax.swing.JScrollPane();
instancesList = new javax.swing.JList<>();
resultsViewerPanel = new javax.swing.JPanel(); resultsViewerPanel = new javax.swing.JPanel();
setPreferredSize(new java.awt.Dimension(777, 475)); setMinimumSize(new java.awt.Dimension(700, 200));
setPreferredSize(new java.awt.Dimension(700, 700));
setLayout(new java.awt.BorderLayout());
pagingPanel.setBorder(javax.swing.BorderFactory.createEtchedBorder()); pagingPanel.setBorder(javax.swing.BorderFactory.createEtchedBorder());
pagingPanel.setMinimumSize(new java.awt.Dimension(400, 39));
pagingPanel.setPreferredSize(new java.awt.Dimension(700, 39));
pagingPanel.setLayout(new java.awt.GridBagLayout()); pagingPanel.setLayout(new java.awt.GridBagLayout());
previousPageButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/corecomponents/btn_step_back.png"))); // NOI18N previousPageButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/corecomponents/btn_step_back.png"))); // NOI18N
@ -592,61 +499,12 @@ public class ResultsPanel extends javax.swing.JPanel {
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
pagingPanel.add(filler4, gridBagConstraints); pagingPanel.add(filler4, gridBagConstraints);
resultsSplitPane.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT); add(pagingPanel, java.awt.BorderLayout.PAGE_START);
resultsSplitPane.setResizeWeight(1.0);
resultsSplitPane.setToolTipText(org.openide.util.NbBundle.getMessage(ResultsPanel.class, "ResultsPanel.resultsSplitPane.toolTipText")); // NOI18N
resultsSplitPane.setOpaque(false);
resultsSplitPane.setPreferredSize(new java.awt.Dimension(777, 440));
instancesPanel.setPreferredSize(new java.awt.Dimension(775, 68)); resultsViewerPanel.setMinimumSize(new java.awt.Dimension(0, 160));
resultsViewerPanel.setPreferredSize(new java.awt.Dimension(700, 700));
instancesScrollPane.setPreferredSize(new java.awt.Dimension(775, 60));
instancesList.setBorder(javax.swing.BorderFactory.createTitledBorder(org.openide.util.NbBundle.getMessage(ResultsPanel.class, "ResultsPanel.instancesList.border.title"))); // NOI18N
instancesList.setModel(instancesListModel);
instancesList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
instancesList.setCellRenderer(new InstancesCellRenderer());
instancesList.setVisibleRowCount(2);
instancesScrollPane.setViewportView(instancesList);
javax.swing.GroupLayout instancesPanelLayout = new javax.swing.GroupLayout(instancesPanel);
instancesPanel.setLayout(instancesPanelLayout);
instancesPanelLayout.setHorizontalGroup(
instancesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 779, Short.MAX_VALUE)
.addGroup(instancesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(instancesScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
instancesPanelLayout.setVerticalGroup(
instancesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 433, Short.MAX_VALUE)
.addGroup(instancesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, instancesPanelLayout.createSequentialGroup()
.addGap(0, 0, 0)
.addComponent(instancesScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 433, Short.MAX_VALUE)))
);
resultsSplitPane.setRightComponent(instancesPanel);
resultsViewerPanel.setPreferredSize(new java.awt.Dimension(0, 380));
resultsViewerPanel.setLayout(new java.awt.BorderLayout()); resultsViewerPanel.setLayout(new java.awt.BorderLayout());
resultsSplitPane.setLeftComponent(resultsViewerPanel); add(resultsViewerPanel, java.awt.BorderLayout.CENTER);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(pagingPanel, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
.addComponent(resultsSplitPane, javax.swing.GroupLayout.DEFAULT_SIZE, 29, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addComponent(pagingPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(0, 0, 0)
.addComponent(resultsSplitPane, javax.swing.GroupLayout.DEFAULT_SIZE, 34, Short.MAX_VALUE)
.addGap(0, 0, 0))
);
}// </editor-fold>//GEN-END:initComponents }// </editor-fold>//GEN-END:initComponents
/** /**
@ -729,11 +587,9 @@ public class ResultsPanel extends javax.swing.JPanel {
// Variables declaration - do not modify//GEN-BEGIN:variables // Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JLabel currentPageLabel; private javax.swing.JLabel currentPageLabel;
private javax.swing.JTextField gotoPageField; private javax.swing.JTextField gotoPageField;
private javax.swing.JList<AbstractFile> instancesList;
private javax.swing.JButton nextPageButton; private javax.swing.JButton nextPageButton;
private javax.swing.JComboBox<Integer> pageSizeComboBox; private javax.swing.JComboBox<Integer> pageSizeComboBox;
private javax.swing.JButton previousPageButton; private javax.swing.JButton previousPageButton;
private javax.swing.JSplitPane resultsSplitPane;
private javax.swing.JPanel resultsViewerPanel; private javax.swing.JPanel resultsViewerPanel;
// End of variables declaration//GEN-END:variables // End of variables declaration//GEN-END:variables
@ -864,179 +720,4 @@ public class ResultsPanel extends javax.swing.JPanel {
} }
/**
* Cell renderer for the instances list.
*/
private class InstancesCellRenderer extends DefaultListCellRenderer {
private static final long serialVersionUID = 1L;
@Override
public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
String name = "";
if (value instanceof AbstractFile) {
AbstractFile file = (AbstractFile) value;
try {
name = file.getUniquePath();
} catch (TskCoreException ingored) {
name = file.getParentPath() + "/" + file.getName();
}
}
setText(name);
return this;
}
}
/**
*
* Sets the alpha value
*
* @param a
*
*/
public void setDividerLocation(int a) {
this.dividerLocation = a;
}
/**
*
* Fades this JPanel in. *
*/
public void fadeIn() {
stop();
fadeInAnimator = new SwingAnimator(new FadeInCallback());
fadeInAnimator.start();
}
/**
*
* Fades this JPanel out
*
*/
public void fadeOut() {
stop();
fadeOutAnimator = new SwingAnimator(new FadeOutCallback());
fadeOutAnimator.start();
}
/**
*
* Stops all animators. *
*/
private void stop() {
if (fadeOutAnimator != null && fadeOutAnimator.isRunning()) {
fadeOutAnimator.stop();
}
if (fadeInAnimator != null && fadeInAnimator.isRunning()) {
fadeInAnimator.stop();
}
}
@Override
public void paintComponent(Graphics g) {
if (dividerLocation <= resultsSplitPane.getHeight() && dividerLocation >= (resultsSplitPane.getHeight() - 100)) {
resultsSplitPane.setDividerLocation(dividerLocation);
}
super.paintComponent(g);
}
/**
*
* Callback implementation for fading in
*
* @author Greg Cope
*
*
*
*/
private class FadeInCallback implements SwingAnimatorCallback {
@Override
public void callback(Object caller) {
dividerLocation -= ANIMATION_INCREMENT;
repaint();
}
@Override
public boolean hasTerminated() {
if (dividerLocation <= (resultsSplitPane.getHeight() - 100)) {
dividerLocation = resultsSplitPane.getHeight() - 100;
System.out.println("FADE IN COMPLETE");
return true;
}
return false;
}
}
/**
*
* Callback implementation to fade out
*
* @author Greg Cope
*
*
*
*/
private class FadeOutCallback implements SwingAnimatorCallback {
@Override
public void callback(Object caller) {
dividerLocation += ANIMATION_INCREMENT;
repaint();
}
@Override
public boolean hasTerminated() {
if (dividerLocation >= resultsSplitPane.getHeight()) {
dividerLocation = resultsSplitPane.getHeight();
System.out.println("FADE OUT COMPLETE");
return true;
}
return false;
}
}
} }