mirror of
https://github.com/overcuriousity/autopsy-flatpak.git
synced 2025-07-19 19:14:55 +00:00
6305 fixed animating of details area
This commit is contained in:
parent
c3156be65b
commit
eaab28e734
@ -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"/>
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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, "{key}")"/>
|
||||||
|
</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="<AbstractFile>"/>
|
||||||
|
</AuxValues>
|
||||||
|
</Component>
|
||||||
|
</SubComponents>
|
||||||
|
</Container>
|
||||||
|
</SubComponents>
|
||||||
|
</Container>
|
||||||
|
</SubComponents>
|
||||||
</Container>
|
</Container>
|
||||||
</SubComponents>
|
</SubComponents>
|
||||||
</Form>
|
</Form>
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/discovery/Bundle.properties" key="DiscoveryDialog.cancelButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
</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>
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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"/>
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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, "{key}")"/>
|
|
||||||
</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, "{key}")"/>
|
|
||||||
</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="<AbstractFile>"/>
|
|
||||||
</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>
|
||||||
|
@ -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;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user