mirror of
https://github.com/overcuriousity/autopsy-flatpak.git
synced 2025-07-15 01:07:42 +00:00
Merge branch 'release-4.13.0' of https://github.com/sleuthkit/autopsy into 5560-fbmessenger-calllogs
This commit is contained in:
commit
583ef12eaf
2
.gitattributes
vendored
2
.gitattributes
vendored
@ -1,7 +1,7 @@
|
||||
*.java text diff=java
|
||||
|
||||
*.txt text
|
||||
*.sh text
|
||||
*.sh eol=lf
|
||||
*.mf text
|
||||
*.xml text
|
||||
*.form text
|
||||
|
@ -2,7 +2,7 @@ Manifest-Version: 1.0
|
||||
OpenIDE-Module: org.sleuthkit.autopsy.core/10
|
||||
OpenIDE-Module-Localizing-Bundle: org/sleuthkit/autopsy/core/Bundle.properties
|
||||
OpenIDE-Module-Layer: org/sleuthkit/autopsy/core/layer.xml
|
||||
OpenIDE-Module-Implementation-Version: 28
|
||||
OpenIDE-Module-Implementation-Version: 29
|
||||
OpenIDE-Module-Requires: org.openide.windows.WindowManager
|
||||
AutoUpdate-Show-In-Client: true
|
||||
AutoUpdate-Essential-Module: true
|
||||
|
@ -122,5 +122,5 @@ nbm.homepage=http://www.sleuthkit.org/
|
||||
nbm.module.author=Brian Carrier
|
||||
nbm.needs.restart=true
|
||||
source.reference.curator-recipes-2.8.0.jar=release/modules/ext/curator-recipes-2.8.0-sources.jar
|
||||
spec.version.base=10.16
|
||||
spec.version.base=10.17
|
||||
|
||||
|
@ -251,7 +251,7 @@
|
||||
<compile-dependency/>
|
||||
<run-dependency>
|
||||
<release-version>3</release-version>
|
||||
<specification-version>1.2</specification-version>
|
||||
<specification-version>1.3</specification-version>
|
||||
</run-dependency>
|
||||
</dependency>
|
||||
</module-dependencies>
|
||||
|
@ -62,15 +62,16 @@ import org.sleuthkit.autopsy.ingest.IngestModuleError;
|
||||
import org.sleuthkit.autopsy.ingest.IngestProfiles;
|
||||
import org.sleuthkit.autopsy.modules.interestingitems.FilesSet;
|
||||
import org.sleuthkit.autopsy.modules.interestingitems.FilesSetsManager;
|
||||
import org.sleuthkit.autopsy.report.infrastructure.ReportProgressLogger;
|
||||
import org.sleuthkit.autopsy.progress.LoggingProgressIndicator;
|
||||
import org.sleuthkit.autopsy.report.infrastructure.ReportGenerator;
|
||||
import org.sleuthkit.autopsy.report.infrastructure.ReportProgressIndicator;
|
||||
import org.sleuthkit.datamodel.Content;
|
||||
import org.sleuthkit.datamodel.TskCoreException;
|
||||
|
||||
/**
|
||||
* Allows Autopsy to be invoked with a command line arguments. Causes Autopsy to
|
||||
* create a case, add a specified data source, run ingest on that data source,
|
||||
* list all data source in a case, generate reports.
|
||||
* Allows Autopsy to be invoked with command line arguments. Arguments exist to
|
||||
* cause Autopsy to create a case, add a specified data source, run ingest on
|
||||
* that data source, list all data sources in the case, and generate reports.
|
||||
*/
|
||||
public class CommandLineIngestManager {
|
||||
|
||||
@ -285,7 +286,8 @@ public class CommandLineIngestManager {
|
||||
}
|
||||
|
||||
// generate reports
|
||||
ReportGenerator generator = new ReportGenerator(CommandLineIngestSettingsPanel.getReportingConfigName(), new ReportProgressLogger()); //NON-NLS
|
||||
ReportProgressIndicator progressIndicator = new ReportProgressIndicator(new LoggingProgressIndicator());
|
||||
ReportGenerator generator = new ReportGenerator(CommandLineIngestSettingsPanel.getReportingConfigName(), progressIndicator);
|
||||
generator.generateReports();
|
||||
} catch (CaseActionException ex) {
|
||||
String caseDirPath = command.getInputs().get(CommandLineCommand.InputType.CASE_FOLDER_PATH.name());
|
||||
@ -335,6 +337,7 @@ public class CommandLineIngestManager {
|
||||
* @param baseCaseName Case name
|
||||
* @param rootOutputDirectory Full path to directory in which case
|
||||
* output folder will be created
|
||||
*
|
||||
* @throws CaseActionException
|
||||
*/
|
||||
private void openCase(String baseCaseName, String rootOutputDirectory) throws CaseActionException {
|
||||
@ -363,6 +366,7 @@ public class CommandLineIngestManager {
|
||||
* Opens existing case.
|
||||
*
|
||||
* @param caseFolderPath full path to case directory
|
||||
*
|
||||
* @throws CaseActionException
|
||||
*/
|
||||
private void openCase(String caseFolderPath) throws CaseActionException {
|
||||
@ -415,11 +419,16 @@ public class CommandLineIngestManager {
|
||||
* @param dataSource The data source.
|
||||
*
|
||||
* @throws
|
||||
* AutoIngestDataSourceProcessor.AutoIngestDataSourceProcessorException if
|
||||
* there was a DSP processing error
|
||||
* AutoIngestDataSourceProcessor.AutoIngestDataSourceProcessorExceptioif
|
||||
* there
|
||||
* was
|
||||
* a
|
||||
* DSP
|
||||
* processing
|
||||
* error
|
||||
*
|
||||
* @throws InterruptedException if the thread running the job processing
|
||||
* task is interrupted while blocked, i.e., if auto ingest is shutting down.
|
||||
* @throws ead running the job processing task is interrupted while
|
||||
* blocked, i.e., if auto ingest is shutting down.
|
||||
*/
|
||||
private void runDataSourceProcessor(Case caseForJob, AutoIngestDataSource dataSource) throws InterruptedException, AutoIngestDataSourceProcessor.AutoIngestDataSourceProcessorException {
|
||||
|
||||
@ -525,9 +534,10 @@ public class CommandLineIngestManager {
|
||||
*
|
||||
* @throws AnalysisStartupException if there is an error analyzing the
|
||||
* data source.
|
||||
* @throws InterruptedException if the thread running the job processing
|
||||
* task is interrupted while blocked, i.e., if auto ingest is shutting
|
||||
* down.
|
||||
* @throws InterruptedException if the thread running the job
|
||||
* processing task is interrupted while
|
||||
* blocked, i.e., if auto ingest is
|
||||
* shutting down.
|
||||
*/
|
||||
private void analyze(AutoIngestDataSource dataSource, String ingestProfileName) throws AnalysisStartupException, InterruptedException {
|
||||
|
||||
@ -628,6 +638,7 @@ public class CommandLineIngestManager {
|
||||
* ingest profiles.
|
||||
*
|
||||
* @param ingestProfileName Ingest profile name
|
||||
*
|
||||
* @return IngestProfile object, or NULL if the profile doesn't exist
|
||||
*/
|
||||
private IngestProfiles.IngestProfile getSelectedProfile(String ingestProfileName) {
|
||||
@ -649,6 +660,7 @@ public class CommandLineIngestManager {
|
||||
* filters (custom and standard).
|
||||
*
|
||||
* @param filterName Name of the file filter
|
||||
*
|
||||
* @return FilesSet object, or NULL if the filter doesn't exist
|
||||
*/
|
||||
private FilesSet getSelectedFilter(String filterName) {
|
||||
@ -711,6 +723,7 @@ public class CommandLineIngestManager {
|
||||
* Returns full path to directory where command outputs should be saved.
|
||||
*
|
||||
* @param caseForJob Case object
|
||||
*
|
||||
* @return Full path to directory where command outputs should be saved
|
||||
*/
|
||||
private String getOutputDirPath(Case caseForJob) {
|
||||
|
@ -16,28 +16,14 @@
|
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
|
||||
<SubComponents>
|
||||
<Container class="javax.swing.JSplitPane" name="jSplitPane1">
|
||||
<Properties>
|
||||
<Property name="dividerLocation" type="int" value="500"/>
|
||||
</Properties>
|
||||
<Container class="org.openide.explorer.view.OutlineView" name="outlineView">
|
||||
<Constraints>
|
||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
|
||||
<BorderConstraints direction="Center"/>
|
||||
</Constraint>
|
||||
</Constraints>
|
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout"/>
|
||||
<SubComponents>
|
||||
<Container class="org.openide.explorer.view.OutlineView" name="outlineView">
|
||||
<Constraints>
|
||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout$JSplitPaneConstraintsDescription">
|
||||
<JSplitPaneConstraints position="left"/>
|
||||
</Constraint>
|
||||
</Constraints>
|
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
|
||||
</Container>
|
||||
</SubComponents>
|
||||
</Container>
|
||||
</SubComponents>
|
||||
</Form>
|
||||
|
@ -65,20 +65,15 @@ public final class AccountsBrowser extends JPanel implements ExplorerManager.Pro
|
||||
|
||||
private final ExplorerManager accountsTableEM = new ExplorerManager();
|
||||
|
||||
final RelationshipBrowser relationshipBrowser;
|
||||
|
||||
/*
|
||||
* This lookup proxies the selection lookup of both he accounts table and
|
||||
* the messages table.
|
||||
*/
|
||||
private final ProxyLookup proxyLookup;
|
||||
|
||||
public AccountsBrowser() {
|
||||
public AccountsBrowser(RelationshipBrowser relationshipBrowser) {
|
||||
initComponents();
|
||||
|
||||
jSplitPane1.setResizeWeight(0.5);
|
||||
jSplitPane1.setDividerLocation(0.75);
|
||||
|
||||
outline = outlineView.getOutline();
|
||||
outlineView.setPropertyColumns(
|
||||
"device", Bundle.AccountNode_device(),
|
||||
@ -91,9 +86,6 @@ public final class AccountsBrowser extends JPanel implements ExplorerManager.Pro
|
||||
outline.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
|
||||
outline.setColumnSorted(3, false, 1); //it would be nice if the column index wasn't hardcoded
|
||||
|
||||
relationshipBrowser = new RelationshipBrowser();
|
||||
jSplitPane1.setRightComponent(relationshipBrowser);
|
||||
|
||||
accountsTableEM.addPropertyChangeListener(evt -> {
|
||||
if (ExplorerManager.PROP_ROOT_CONTEXT.equals(evt.getPropertyName())) {
|
||||
SwingUtilities.invokeLater(this::setColumnWidths);
|
||||
@ -174,20 +166,14 @@ public final class AccountsBrowser extends JPanel implements ExplorerManager.Pro
|
||||
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
|
||||
private void initComponents() {
|
||||
|
||||
jSplitPane1 = new javax.swing.JSplitPane();
|
||||
outlineView = new org.openide.explorer.view.OutlineView();
|
||||
|
||||
setLayout(new java.awt.BorderLayout());
|
||||
|
||||
jSplitPane1.setDividerLocation(500);
|
||||
jSplitPane1.setLeftComponent(outlineView);
|
||||
|
||||
add(jSplitPane1, java.awt.BorderLayout.CENTER);
|
||||
add(outlineView, java.awt.BorderLayout.CENTER);
|
||||
}// </editor-fold>//GEN-END:initComponents
|
||||
|
||||
|
||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||
private javax.swing.JSplitPane jSplitPane1;
|
||||
private org.openide.explorer.view.OutlineView outlineView;
|
||||
// End of variables declaration//GEN-END:variables
|
||||
|
||||
|
@ -49,3 +49,5 @@ VisualizationPanel.forwardButton.text=
|
||||
VisualizationPanel.zoomPercentLabel.text=100%
|
||||
VisualizationPanel.zoomLabel.text=Zoom:
|
||||
VisualizationPanel.snapshotButton.toolTipText=Generate Snapshot report.
|
||||
CVTTopComponent.filtersPane.TabConstraints.tabTitle=Filters
|
||||
CVTTopComponent.filterTabPanel.TabConstraints.tabTitle=Filters
|
||||
|
@ -92,6 +92,8 @@ VisualizationPanel.forwardButton.text=
|
||||
VisualizationPanel.zoomPercentLabel.text=100%
|
||||
VisualizationPanel.zoomLabel.text=Zoom:
|
||||
VisualizationPanel.snapshotButton.toolTipText=Generate Snapshot report.
|
||||
CVTTopComponent.filtersPane.TabConstraints.tabTitle=Filters
|
||||
CVTTopComponent.filterTabPanel.TabConstraints.tabTitle=Filters
|
||||
VisualizationPanel_action_dialogs_title=Communications
|
||||
VisualizationPanel_action_name_text=Snapshot Report
|
||||
VisualizationPanel_module_name=Communications
|
||||
|
@ -14,24 +14,52 @@
|
||||
<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,1,44,0,0,1,-112"/>
|
||||
</AuxValues>
|
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
|
||||
<SubComponents>
|
||||
<Container class="javax.swing.JSplitPane" name="mainSplitPane">
|
||||
<Container class="javax.swing.JTabbedPane" name="filterTabPane">
|
||||
<Events>
|
||||
<EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="filterTabPaneMouseClicked"/>
|
||||
</Events>
|
||||
<Constraints>
|
||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
|
||||
<GridBagConstraints gridX="-1" gridY="-1" gridWidth="1" gridHeight="1" fill="1" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="1.0" weightY="1.0"/>
|
||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
|
||||
<BorderConstraints direction="West"/>
|
||||
</Constraint>
|
||||
</Constraints>
|
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout"/>
|
||||
<SubComponents>
|
||||
<Container class="javax.swing.JPanel" name="filterTabPanel">
|
||||
<Constraints>
|
||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
|
||||
<JTabbedPaneConstraints tabName="Filters">
|
||||
<Property name="tabTitle" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="CVTTopComponent.filterTabPanel.TabConstraints.tabTitle" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
</JTabbedPaneConstraints>
|
||||
</Constraint>
|
||||
</Constraints>
|
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignFlowLayout"/>
|
||||
<SubComponents>
|
||||
<Component class="org.sleuthkit.autopsy.communications.FiltersPanel" name="filtersPane">
|
||||
</Component>
|
||||
</SubComponents>
|
||||
</Container>
|
||||
</SubComponents>
|
||||
</Container>
|
||||
<Container class="javax.swing.JSplitPane" name="splitPane">
|
||||
<Properties>
|
||||
<Property name="dividerLocation" type="int" value="1"/>
|
||||
<Property name="resizeWeight" type="double" value="0.25"/>
|
||||
</Properties>
|
||||
<Constraints>
|
||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
|
||||
<BorderConstraints direction="Center"/>
|
||||
</Constraint>
|
||||
</Constraints>
|
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout"/>
|
||||
<SubComponents>
|
||||
<Component class="org.sleuthkit.autopsy.communications.FiltersPanel" name="filtersPane">
|
||||
<Constraints>
|
||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout$JSplitPaneConstraintsDescription">
|
||||
<JSplitPaneConstraints position="left"/>
|
||||
</Constraint>
|
||||
</Constraints>
|
||||
</Component>
|
||||
<Container class="javax.swing.JTabbedPane" name="browseVisualizeTabPane">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
@ -45,13 +73,16 @@
|
||||
</AccessibilityProperties>
|
||||
<Constraints>
|
||||
<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="left"/>
|
||||
</Constraint>
|
||||
</Constraints>
|
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout"/>
|
||||
<SubComponents>
|
||||
<Component class="org.sleuthkit.autopsy.communications.AccountsBrowser" name="accountsBrowser">
|
||||
<AuxValues>
|
||||
<AuxValue name="JavaCodeGenerator_CreateCodeCustom" type="java.lang.String" value="new org.sleuthkit.autopsy.communications.AccountsBrowser(relationshipBrowser)"/>
|
||||
</AuxValues>
|
||||
<Constraints>
|
||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
|
||||
<JTabbedPaneConstraints tabName="Browse">
|
||||
@ -66,6 +97,9 @@
|
||||
</Constraints>
|
||||
</Component>
|
||||
<Component class="org.sleuthkit.autopsy.communications.VisualizationPanel" name="vizPanel">
|
||||
<AuxValues>
|
||||
<AuxValue name="JavaCodeGenerator_CreateCodeCustom" type="java.lang.String" value="new org.sleuthkit.autopsy.communications.VisualizationPanel(relationshipBrowser)"/>
|
||||
</AuxValues>
|
||||
<Constraints>
|
||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
|
||||
<JTabbedPaneConstraints tabName="Visualize">
|
||||
|
@ -19,14 +19,16 @@
|
||||
package org.sleuthkit.autopsy.communications;
|
||||
|
||||
import com.google.common.eventbus.Subscribe;
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.Component;
|
||||
import java.awt.Font;
|
||||
import java.awt.GridBagConstraints;
|
||||
import java.awt.GridBagLayout;
|
||||
import java.awt.Insets;
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
import javax.swing.ImageIcon;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JSplitPane;
|
||||
import javax.swing.JTabbedPane;
|
||||
import org.openide.util.Lookup;
|
||||
@ -35,7 +37,10 @@ import org.openide.windows.Mode;
|
||||
import org.openide.windows.RetainLocation;
|
||||
import org.openide.windows.TopComponent;
|
||||
import org.openide.windows.WindowManager;
|
||||
import org.sleuthkit.autopsy.communications.relationships.RelationshipBrowser;
|
||||
import org.sleuthkit.autopsy.communications.relationships.SelectionInfo;
|
||||
import org.sleuthkit.autopsy.coreutils.ThreadConfined;
|
||||
import org.sleuthkit.datamodel.CommunicationsFilter;
|
||||
|
||||
/**
|
||||
* Top component which displays the Communications Visualization Tool.
|
||||
@ -48,10 +53,17 @@ import org.sleuthkit.autopsy.coreutils.ThreadConfined;
|
||||
public final class CVTTopComponent extends TopComponent {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
private boolean filtersVisible = true;
|
||||
private final RelationshipBrowser relationshipBrowser = new RelationshipBrowser();
|
||||
private CommunicationsFilter currentFilter;
|
||||
|
||||
@ThreadConfined(type = ThreadConfined.ThreadType.AWT)
|
||||
public CVTTopComponent() {
|
||||
initComponents();
|
||||
|
||||
splitPane.setRightComponent(relationshipBrowser);
|
||||
splitPane.setDividerLocation(0.25);
|
||||
|
||||
setName(Bundle.CVTTopComponent_name());
|
||||
|
||||
/*
|
||||
@ -68,6 +80,8 @@ public final class CVTTopComponent extends TopComponent {
|
||||
Lookup lookup = ((Lookup.Provider)selectedComponent).getLookup();
|
||||
proxyLookup.setNewLookups(lookup);
|
||||
}
|
||||
|
||||
relationshipBrowser.setSelectionInfo(new SelectionInfo(new HashSet<>(), new HashSet<>(), currentFilter));
|
||||
});
|
||||
|
||||
|
||||
@ -80,8 +94,8 @@ public final class CVTTopComponent extends TopComponent {
|
||||
CVTEvents.getCVTEventBus().register(accountsBrowser);
|
||||
CVTEvents.getCVTEventBus().register(filtersPane);
|
||||
|
||||
mainSplitPane.setResizeWeight(0.5);
|
||||
mainSplitPane.setDividerLocation(0.25);
|
||||
filterTabbedPane.setIconAt(0, new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/arrow-left.png")));
|
||||
filterTabbedPane.setTitleAt(0, "");
|
||||
}
|
||||
|
||||
@Subscribe
|
||||
@ -89,6 +103,11 @@ public final class CVTTopComponent extends TopComponent {
|
||||
browseVisualizeTabPane.setSelectedIndex(1);
|
||||
}
|
||||
|
||||
@Subscribe
|
||||
void handle(final CVTEvents.FilterChangeEvent filterChangeEvent) {
|
||||
currentFilter = filterChangeEvent.getNewFilter();
|
||||
}
|
||||
|
||||
/**
|
||||
* 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
|
||||
@ -96,38 +115,68 @@ public final class CVTTopComponent extends TopComponent {
|
||||
*/
|
||||
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
|
||||
private void initComponents() {
|
||||
GridBagConstraints gridBagConstraints;
|
||||
|
||||
mainSplitPane = new JSplitPane();
|
||||
filterTabbedPane = new JTabbedPane();
|
||||
filterTabPanel = new JPanel();
|
||||
filtersPane = new FiltersPanel();
|
||||
splitPane = new JSplitPane();
|
||||
browseVisualizeTabPane = new JTabbedPane();
|
||||
accountsBrowser = new AccountsBrowser();
|
||||
vizPanel = new VisualizationPanel();
|
||||
accountsBrowser = new AccountsBrowser(relationshipBrowser);
|
||||
vizPanel = new VisualizationPanel(relationshipBrowser);
|
||||
|
||||
setLayout(new GridBagLayout());
|
||||
setLayout(new BorderLayout());
|
||||
|
||||
mainSplitPane.setLeftComponent(filtersPane);
|
||||
filterTabbedPane.addMouseListener(new MouseAdapter() {
|
||||
public void mouseClicked(MouseEvent evt) {
|
||||
filterTabbedPaneMouseClicked(evt);
|
||||
}
|
||||
});
|
||||
|
||||
filterTabPanel.setLayout(new BorderLayout());
|
||||
filterTabPanel.add(filtersPane, BorderLayout.CENTER);
|
||||
|
||||
filterTabbedPane.addTab(NbBundle.getMessage(CVTTopComponent.class, "CVTTopComponent.filterTabPanel.TabConstraints.tabTitle"), filterTabPanel); // NOI18N
|
||||
|
||||
add(filterTabbedPane, BorderLayout.WEST);
|
||||
|
||||
splitPane.setDividerLocation(1);
|
||||
splitPane.setResizeWeight(0.25);
|
||||
|
||||
browseVisualizeTabPane.setFont(new Font("Tahoma", 0, 18)); // NOI18N
|
||||
browseVisualizeTabPane.addTab(NbBundle.getMessage(CVTTopComponent.class, "CVTTopComponent.accountsBrowser.TabConstraints.tabTitle_1"), new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/table.png")), accountsBrowser); // NOI18N
|
||||
browseVisualizeTabPane.addTab(NbBundle.getMessage(CVTTopComponent.class, "CVTTopComponent.vizPanel.TabConstraints.tabTitle_1"), new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/emblem-web.png")), vizPanel); // NOI18N
|
||||
|
||||
mainSplitPane.setRightComponent(browseVisualizeTabPane);
|
||||
splitPane.setLeftComponent(browseVisualizeTabPane);
|
||||
browseVisualizeTabPane.getAccessibleContext().setAccessibleName(NbBundle.getMessage(CVTTopComponent.class, "CVTTopComponent.browseVisualizeTabPane.AccessibleContext.accessibleName")); // NOI18N
|
||||
|
||||
gridBagConstraints = new GridBagConstraints();
|
||||
gridBagConstraints.fill = GridBagConstraints.BOTH;
|
||||
gridBagConstraints.weightx = 1.0;
|
||||
gridBagConstraints.weighty = 1.0;
|
||||
add(mainSplitPane, gridBagConstraints);
|
||||
add(splitPane, BorderLayout.CENTER);
|
||||
}// </editor-fold>//GEN-END:initComponents
|
||||
|
||||
private void filterTabbedPaneMouseClicked(MouseEvent evt) {//GEN-FIRST:event_filterTabPaneMouseClicked
|
||||
int index = filterTabbedPane.indexAtLocation(evt.getX(), evt.getY());
|
||||
if(index != -1) {
|
||||
if(filtersVisible) {
|
||||
filterTabbedPane.setIconAt(0, new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/arrow-right.png")));
|
||||
filterTabPanel.removeAll();
|
||||
filterTabPanel.revalidate();
|
||||
filtersVisible = false;
|
||||
} else {
|
||||
filterTabbedPane.setIconAt(0, new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/arrow-left.png")));
|
||||
filterTabPanel.add(filtersPane, BorderLayout.CENTER);
|
||||
filterTabPanel.revalidate();
|
||||
filtersVisible = true;
|
||||
}
|
||||
}
|
||||
}//GEN-LAST:event_filterTabPaneMouseClicked
|
||||
|
||||
|
||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||
private AccountsBrowser accountsBrowser;
|
||||
private JTabbedPane browseVisualizeTabPane;
|
||||
private JTabbedPane filterTabbedPane;
|
||||
private JPanel filterTabPanel;
|
||||
private FiltersPanel filtersPane;
|
||||
private JSplitPane mainSplitPane;
|
||||
private JSplitPane splitPane;
|
||||
private VisualizationPanel vizPanel;
|
||||
// End of variables declaration//GEN-END:variables
|
||||
|
||||
|
@ -18,6 +18,7 @@
|
||||
<SubComponents>
|
||||
<Container class="javax.swing.JScrollPane" name="scrollPane">
|
||||
<Properties>
|
||||
<Property name="autoscrolls" type="boolean" value="true"/>
|
||||
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
|
||||
<Border info="null"/>
|
||||
</Property>
|
||||
@ -37,7 +38,7 @@
|
||||
<Container class="javax.swing.JPanel" name="limitPane">
|
||||
<Constraints>
|
||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
|
||||
<GridBagConstraints gridX="0" gridY="4" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="15" insetsLeft="0" insetsBottom="15" insetsRight="0" anchor="18" weightX="1.0" weightY="1.0"/>
|
||||
<GridBagConstraints gridX="0" gridY="4" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="15" insetsLeft="0" insetsBottom="15" insetsRight="25" anchor="18" weightX="1.0" weightY="1.0"/>
|
||||
</Constraint>
|
||||
</Constraints>
|
||||
|
||||
@ -128,7 +129,7 @@
|
||||
<Container class="javax.swing.JPanel" name="dateRangePane">
|
||||
<Constraints>
|
||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
|
||||
<GridBagConstraints gridX="0" gridY="3" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="15" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="18" weightX="1.0" weightY="0.0"/>
|
||||
<GridBagConstraints gridX="0" gridY="3" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="15" insetsLeft="0" insetsBottom="0" insetsRight="25" anchor="18" weightX="1.0" weightY="0.0"/>
|
||||
</Constraint>
|
||||
</Constraints>
|
||||
|
||||
@ -222,7 +223,7 @@
|
||||
<Container class="javax.swing.JPanel" name="devicesPane">
|
||||
<Constraints>
|
||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
|
||||
<GridBagConstraints gridX="0" gridY="2" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="100" insetsTop="15" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="18" weightX="1.0" weightY="0.0"/>
|
||||
<GridBagConstraints gridX="0" gridY="2" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="100" insetsTop="15" insetsLeft="0" insetsBottom="0" insetsRight="25" anchor="18" weightX="1.0" weightY="0.0"/>
|
||||
</Constraint>
|
||||
</Constraints>
|
||||
|
||||
@ -325,7 +326,7 @@
|
||||
<Container class="javax.swing.JPanel" name="accountTypesPane">
|
||||
<Constraints>
|
||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
|
||||
<GridBagConstraints gridX="0" gridY="1" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="15" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="18" weightX="1.0" weightY="0.0"/>
|
||||
<GridBagConstraints gridX="0" gridY="1" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="15" insetsLeft="0" insetsBottom="0" insetsRight="25" anchor="18" weightX="1.0" weightY="0.0"/>
|
||||
</Constraint>
|
||||
</Constraints>
|
||||
|
||||
@ -422,7 +423,7 @@
|
||||
<Container class="javax.swing.JPanel" name="topPane">
|
||||
<Constraints>
|
||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
|
||||
<GridBagConstraints gridX="0" gridY="0" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="24" weightX="1.0" weightY="0.0"/>
|
||||
<GridBagConstraints gridX="0" gridY="0" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="25" anchor="24" weightX="1.0" weightY="0.0"/>
|
||||
</Constraint>
|
||||
</Constraints>
|
||||
|
||||
|
@ -477,6 +477,7 @@ final public class FiltersPanel extends JPanel {
|
||||
|
||||
setLayout(new java.awt.GridBagLayout());
|
||||
|
||||
scrollPane.setAutoscrolls(true);
|
||||
scrollPane.setBorder(null);
|
||||
|
||||
mainPanel.setLayout(new java.awt.GridBagLayout());
|
||||
@ -541,7 +542,7 @@ final public class FiltersPanel extends JPanel {
|
||||
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
|
||||
gridBagConstraints.weightx = 1.0;
|
||||
gridBagConstraints.weighty = 1.0;
|
||||
gridBagConstraints.insets = new java.awt.Insets(15, 0, 15, 0);
|
||||
gridBagConstraints.insets = new java.awt.Insets(15, 0, 15, 25);
|
||||
mainPanel.add(limitPane, gridBagConstraints);
|
||||
|
||||
startDatePicker.setEnabled(false);
|
||||
@ -608,7 +609,7 @@ final public class FiltersPanel extends JPanel {
|
||||
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
|
||||
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
|
||||
gridBagConstraints.weightx = 1.0;
|
||||
gridBagConstraints.insets = new java.awt.Insets(15, 0, 0, 0);
|
||||
gridBagConstraints.insets = new java.awt.Insets(15, 0, 0, 25);
|
||||
mainPanel.add(dateRangePane, gridBagConstraints);
|
||||
|
||||
devicesPane.setLayout(new java.awt.GridBagLayout());
|
||||
@ -686,7 +687,7 @@ final public class FiltersPanel extends JPanel {
|
||||
gridBagConstraints.ipady = 100;
|
||||
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
|
||||
gridBagConstraints.weightx = 1.0;
|
||||
gridBagConstraints.insets = new java.awt.Insets(15, 0, 0, 0);
|
||||
gridBagConstraints.insets = new java.awt.Insets(15, 0, 0, 25);
|
||||
mainPanel.add(devicesPane, gridBagConstraints);
|
||||
|
||||
accountTypesPane.setLayout(new java.awt.GridBagLayout());
|
||||
@ -760,7 +761,7 @@ final public class FiltersPanel extends JPanel {
|
||||
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
|
||||
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
|
||||
gridBagConstraints.weightx = 1.0;
|
||||
gridBagConstraints.insets = new java.awt.Insets(15, 0, 0, 0);
|
||||
gridBagConstraints.insets = new java.awt.Insets(15, 0, 0, 25);
|
||||
mainPanel.add(accountTypesPane, gridBagConstraints);
|
||||
|
||||
topPane.setLayout(new java.awt.GridBagLayout());
|
||||
@ -810,6 +811,7 @@ final public class FiltersPanel extends JPanel {
|
||||
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
|
||||
gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_END;
|
||||
gridBagConstraints.weightx = 1.0;
|
||||
gridBagConstraints.insets = new java.awt.Insets(0, 0, 0, 25);
|
||||
mainPanel.add(topPane, gridBagConstraints);
|
||||
|
||||
scrollPane.setViewportView(mainPanel);
|
||||
|
@ -11,31 +11,18 @@
|
||||
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
|
||||
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
|
||||
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
|
||||
<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,0,121,0,0,4,-59"/>
|
||||
<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,1,63,0,0,4,-59"/>
|
||||
</AuxValues>
|
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
|
||||
<SubComponents>
|
||||
<Container class="javax.swing.JSplitPane" name="splitPane">
|
||||
<Properties>
|
||||
<Property name="dividerLocation" type="int" value="800"/>
|
||||
<Property name="resizeWeight" type="double" value="0.5"/>
|
||||
</Properties>
|
||||
<Container class="javax.swing.JPanel" name="borderLayoutPanel">
|
||||
<Constraints>
|
||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
|
||||
<BorderConstraints direction="Center"/>
|
||||
</Constraint>
|
||||
</Constraints>
|
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout"/>
|
||||
<SubComponents>
|
||||
<Container class="javax.swing.JPanel" name="borderLayoutPanel">
|
||||
<Constraints>
|
||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout$JSplitPaneConstraintsDescription">
|
||||
<JSplitPaneConstraints position="left"/>
|
||||
</Constraint>
|
||||
</Constraints>
|
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
|
||||
<SubComponents>
|
||||
<Container class="javax.swing.JPanel" name="placeHolderPanel">
|
||||
@ -49,9 +36,9 @@
|
||||
<DimensionLayout dim="0">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<EmptySpace pref="250" max="32767" attributes="0"/>
|
||||
<EmptySpace pref="316" max="32767" attributes="0"/>
|
||||
<Component id="jTextArea1" min="-2" pref="424" max="-2" attributes="0"/>
|
||||
<EmptySpace pref="423" max="32767" attributes="0"/>
|
||||
<EmptySpace pref="481" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
@ -81,75 +68,93 @@
|
||||
</Component>
|
||||
</SubComponents>
|
||||
</Container>
|
||||
<Container class="javax.swing.JPanel" name="toolbar">
|
||||
<Container class="javafx.embed.swing.JFXPanel" name="notificationsJFXPanel">
|
||||
<Constraints>
|
||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
|
||||
<BorderConstraints direction="First"/>
|
||||
<BorderConstraints direction="Last"/>
|
||||
</Constraint>
|
||||
</Constraints>
|
||||
|
||||
<Layout>
|
||||
<DimensionLayout dim="0">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="backButton" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="forwardButton" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="jSeparator4" min="-2" pref="10" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="fastOrganicLayoutButton" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="clearVizButton" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||
<Component id="jSeparator2" min="-2" pref="10" max="-2" attributes="0"/>
|
||||
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||
<Component id="zoomLabel" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||
<Component id="zoomPercentLabel" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||
<Component id="zoomOutButton" min="-2" pref="32" max="-2" attributes="0"/>
|
||||
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||
<Component id="zoomInButton" min="-2" pref="32" max="-2" attributes="0"/>
|
||||
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||
<Component id="zoomActualButton" min="-2" pref="33" max="-2" attributes="0"/>
|
||||
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||
<Component id="fitZoomButton" min="-2" pref="32" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="jSeparator3" min="-2" pref="10" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="snapshotButton" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
<DimensionLayout dim="1">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" attributes="0">
|
||||
<EmptySpace min="-2" pref="3" max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="2" attributes="0">
|
||||
<Component id="fastOrganicLayoutButton" alignment="2" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="zoomOutButton" alignment="2" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="zoomInButton" alignment="2" max="32767" attributes="0"/>
|
||||
<Component id="zoomActualButton" alignment="2" max="32767" attributes="0"/>
|
||||
<Component id="fitZoomButton" alignment="2" max="32767" attributes="0"/>
|
||||
<Component id="zoomLabel" alignment="2" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="zoomPercentLabel" alignment="2" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="clearVizButton" alignment="2" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="jSeparator2" alignment="2" max="32767" attributes="0"/>
|
||||
<Component id="backButton" alignment="2" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="forwardButton" alignment="2" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="snapshotButton" alignment="2" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="jSeparator3" alignment="2" max="32767" attributes="0"/>
|
||||
<Component id="jSeparator4" alignment="2" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace min="-2" pref="3" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout">
|
||||
<Property name="useNullLayout" type="boolean" value="true"/>
|
||||
</Layout>
|
||||
</Container>
|
||||
</SubComponents>
|
||||
</Container>
|
||||
<Container class="javax.swing.JToolBar" name="toolbar">
|
||||
<Properties>
|
||||
<Property name="rollover" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
<Constraints>
|
||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
|
||||
<BorderConstraints direction="North"/>
|
||||
</Constraint>
|
||||
</Constraints>
|
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBoxLayout"/>
|
||||
<SubComponents>
|
||||
<Component class="javax.swing.JButton" name="backButton">
|
||||
<Properties>
|
||||
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
|
||||
<Image iconType="3" name="/org/sleuthkit/autopsy/images/resultset_previous.png"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.backButton.text_1" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.backButton.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
<Property name="focusable" type="boolean" value="false"/>
|
||||
<Property name="horizontalTextPosition" type="int" value="0"/>
|
||||
<Property name="verticalTextPosition" type="int" value="3"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="backButtonActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="forwardButton">
|
||||
<Properties>
|
||||
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
|
||||
<Image iconType="3" name="/org/sleuthkit/autopsy/images/resultset_next.png"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.forwardButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.forwardButton.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
<Property name="focusable" type="boolean" value="false"/>
|
||||
<Property name="horizontalTextPosition" type="int" value="0"/>
|
||||
<Property name="verticalTextPosition" type="int" value="3"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="forwardButtonActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JToolBar$Separator" name="jSeparator3">
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="clearVizButton">
|
||||
<Properties>
|
||||
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
|
||||
<Image iconType="3" name="/org/sleuthkit/autopsy/communications/images/broom.png"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.clearVizButton.text_1" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.clearVizButton.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
<Property name="actionCommand" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.clearVizButton.actionCommand" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
<Property name="focusable" type="boolean" value="false"/>
|
||||
<Property name="horizontalTextPosition" type="int" value="0"/>
|
||||
<Property name="verticalTextPosition" type="int" value="3"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="clearVizButtonActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="fastOrganicLayoutButton">
|
||||
<Properties>
|
||||
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
|
||||
@ -162,8 +167,28 @@
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.fastOrganicLayoutButton.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
<Property name="focusable" type="boolean" value="false"/>
|
||||
<Property name="horizontalTextPosition" type="int" value="0"/>
|
||||
<Property name="verticalTextPosition" type="int" value="3"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="fastOrganicLayoutButtonActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JToolBar$Separator" name="jSeparator2">
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="zoomLabel">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.zoomLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="zoomPercentLabel">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.zoomPercentLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="zoomOutButton">
|
||||
<Properties>
|
||||
@ -184,23 +209,23 @@
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="zoomOutButtonActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="zoomInButton">
|
||||
<Component class="javax.swing.JButton" name="fitZoomButton">
|
||||
<Properties>
|
||||
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
|
||||
<Image iconType="3" name="/org/sleuthkit/autopsy/communications/images/magnifier-zoom-in-green.png"/>
|
||||
<Image iconType="3" name="/org/sleuthkit/autopsy/communications/images/magnifier-zoom-fit.png"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.zoomInButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.fitZoomButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.zoomInButton.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.fitZoomButton.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
<Property name="focusable" type="boolean" value="false"/>
|
||||
<Property name="horizontalTextPosition" type="int" value="0"/>
|
||||
<Property name="verticalTextPosition" type="int" value="3"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="zoomInButtonActionPerformed"/>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="fitZoomButtonActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="zoomActualButton">
|
||||
@ -222,95 +247,26 @@
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="zoomActualButtonActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="fitZoomButton">
|
||||
<Component class="javax.swing.JButton" name="zoomInButton">
|
||||
<Properties>
|
||||
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
|
||||
<Image iconType="3" name="/org/sleuthkit/autopsy/communications/images/magnifier-zoom-fit.png"/>
|
||||
<Image iconType="3" name="/org/sleuthkit/autopsy/communications/images/magnifier-zoom-in-green.png"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.fitZoomButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.zoomInButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.fitZoomButton.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.zoomInButton.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
<Property name="focusable" type="boolean" value="false"/>
|
||||
<Property name="horizontalTextPosition" type="int" value="0"/>
|
||||
<Property name="verticalTextPosition" type="int" value="3"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="fitZoomButtonActionPerformed"/>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="zoomInButtonActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="zoomLabel">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.zoomLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="zoomPercentLabel">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.zoomPercentLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="clearVizButton">
|
||||
<Properties>
|
||||
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
|
||||
<Image iconType="3" name="/org/sleuthkit/autopsy/communications/images/broom.png"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.clearVizButton.text_1" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.clearVizButton.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
<Property name="actionCommand" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.clearVizButton.actionCommand" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="clearVizButtonActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JToolBar$Separator" name="jSeparator2">
|
||||
<Properties>
|
||||
<Property name="orientation" type="int" value="1"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="backButton">
|
||||
<Properties>
|
||||
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
|
||||
<Image iconType="3" name="/org/sleuthkit/autopsy/images/resultset_previous.png"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.backButton.text_1" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.backButton.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="backButtonActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="forwardButton">
|
||||
<Properties>
|
||||
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
|
||||
<Image iconType="3" name="/org/sleuthkit/autopsy/images/resultset_next.png"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.forwardButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.forwardButton.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
<Property name="horizontalTextPosition" type="int" value="10"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="forwardButtonActionPerformed"/>
|
||||
</Events>
|
||||
<Component class="javax.swing.JToolBar$Separator" name="jSeparator1">
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="snapshotButton">
|
||||
<Properties>
|
||||
@ -323,36 +279,14 @@
|
||||
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.snapshotButton.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
<Property name="focusable" type="boolean" value="false"/>
|
||||
<Property name="horizontalTextPosition" type="int" value="0"/>
|
||||
<Property name="verticalTextPosition" type="int" value="3"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="snapshotButtonActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JToolBar$Separator" name="jSeparator3">
|
||||
<Properties>
|
||||
<Property name="orientation" type="int" value="1"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JToolBar$Separator" name="jSeparator4">
|
||||
<Properties>
|
||||
<Property name="orientation" type="int" value="1"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
</SubComponents>
|
||||
</Container>
|
||||
<Container class="javafx.embed.swing.JFXPanel" name="notificationsJFXPanel">
|
||||
<Constraints>
|
||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
|
||||
<BorderConstraints direction="Last"/>
|
||||
</Constraint>
|
||||
</Constraints>
|
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout">
|
||||
<Property name="useNullLayout" type="boolean" value="true"/>
|
||||
</Layout>
|
||||
</Container>
|
||||
</SubComponents>
|
||||
</Container>
|
||||
</SubComponents>
|
||||
</Container>
|
||||
</SubComponents>
|
||||
|
@ -43,6 +43,7 @@ import java.awt.BorderLayout;
|
||||
import java.awt.Color;
|
||||
import java.awt.Desktop;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.FlowLayout;
|
||||
import java.awt.Font;
|
||||
import java.awt.Frame;
|
||||
import java.awt.Graphics;
|
||||
@ -61,7 +62,6 @@ import java.nio.file.Paths;
|
||||
import java.text.DecimalFormat;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.Date;
|
||||
import java.util.EnumSet;
|
||||
import java.util.HashMap;
|
||||
@ -86,7 +86,6 @@ import javax.swing.JMenuItem;
|
||||
import javax.swing.JOptionPane;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JPopupMenu;
|
||||
import javax.swing.JSplitPane;
|
||||
import javax.swing.JTextArea;
|
||||
import javax.swing.JTextField;
|
||||
import javax.swing.JToolBar;
|
||||
@ -96,7 +95,6 @@ import javax.swing.SwingWorker;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.controlsfx.control.Notifications;
|
||||
import org.jdesktop.layout.GroupLayout;
|
||||
import org.jdesktop.layout.LayoutStyle;
|
||||
import org.openide.util.NbBundle;
|
||||
import org.openide.windows.WindowManager;
|
||||
import org.sleuthkit.autopsy.casemodule.Case;
|
||||
@ -112,6 +110,7 @@ import org.sleuthkit.datamodel.AccountDeviceInstance;
|
||||
import org.sleuthkit.datamodel.CommunicationsFilter;
|
||||
import org.sleuthkit.datamodel.CommunicationsManager;
|
||||
import org.sleuthkit.datamodel.TskCoreException;
|
||||
import org.sleuthkit.autopsy.uicomponents.WrapLayout;
|
||||
/**
|
||||
* A panel that goes in the Visualize tab of the Communications Visualization
|
||||
* Tool. Hosts an JGraphX mxGraphComponent that implements the communications
|
||||
@ -160,7 +159,8 @@ final public class VisualizationPanel extends JPanel {
|
||||
private final StateManager stateManager;
|
||||
|
||||
@NbBundle.Messages("VisalizationPanel.paintingError=Problem painting visualization.")
|
||||
public VisualizationPanel() {
|
||||
public VisualizationPanel(RelationshipBrowser relationshipBrowser) {
|
||||
this.relationshipBrowser = relationshipBrowser;
|
||||
initComponents();
|
||||
//initialize invisible JFXPanel that is used to show JFXNotifications over this window.
|
||||
notificationsJFXPanel.setScene(new Scene(new Pane()));
|
||||
@ -221,9 +221,6 @@ final public class VisualizationPanel extends JPanel {
|
||||
graphComponent.getGraphControl().addMouseWheelListener(graphMouseListener);
|
||||
graphComponent.getGraphControl().addMouseListener(graphMouseListener);
|
||||
|
||||
relationshipBrowser = new RelationshipBrowser();
|
||||
splitPane.setRightComponent(relationshipBrowser);
|
||||
|
||||
//feed selection to explorermanager
|
||||
graph.getSelectionModel().addListener(mxEvent.CHANGE, new SelectionListener());
|
||||
final mxEventSource.mxIEventListener undoListener = (Object sender, mxEventObject evt)
|
||||
@ -247,6 +244,8 @@ final public class VisualizationPanel extends JPanel {
|
||||
stateManager = new StateManager(pinnedAccountModel);
|
||||
|
||||
setStateButtonsEnabled();
|
||||
|
||||
toolbar.setLayout(new WrapLayout(FlowLayout.LEFT));
|
||||
}
|
||||
|
||||
@Subscribe
|
||||
@ -373,32 +372,28 @@ final public class VisualizationPanel extends JPanel {
|
||||
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
|
||||
private void initComponents() {
|
||||
|
||||
splitPane = new JSplitPane();
|
||||
borderLayoutPanel = new JPanel();
|
||||
placeHolderPanel = new JPanel();
|
||||
jTextArea1 = new JTextArea();
|
||||
toolbar = new JPanel();
|
||||
fastOrganicLayoutButton = new JButton();
|
||||
zoomOutButton = new JButton();
|
||||
zoomInButton = new JButton();
|
||||
zoomActualButton = new JButton();
|
||||
fitZoomButton = new JButton();
|
||||
zoomLabel = new JLabel();
|
||||
zoomPercentLabel = new JLabel();
|
||||
clearVizButton = new JButton();
|
||||
jSeparator2 = new JToolBar.Separator();
|
||||
notificationsJFXPanel = new JFXPanel();
|
||||
toolbar = new JToolBar();
|
||||
backButton = new JButton();
|
||||
forwardButton = new JButton();
|
||||
snapshotButton = new JButton();
|
||||
jSeparator3 = new JToolBar.Separator();
|
||||
jSeparator4 = new JToolBar.Separator();
|
||||
notificationsJFXPanel = new JFXPanel();
|
||||
clearVizButton = new JButton();
|
||||
fastOrganicLayoutButton = new JButton();
|
||||
jSeparator2 = new JToolBar.Separator();
|
||||
zoomLabel = new JLabel();
|
||||
zoomPercentLabel = new JLabel();
|
||||
zoomOutButton = new JButton();
|
||||
fitZoomButton = new JButton();
|
||||
zoomActualButton = new JButton();
|
||||
zoomInButton = new JButton();
|
||||
jSeparator1 = new JToolBar.Separator();
|
||||
snapshotButton = new JButton();
|
||||
|
||||
setLayout(new BorderLayout());
|
||||
|
||||
splitPane.setDividerLocation(800);
|
||||
splitPane.setResizeWeight(0.5);
|
||||
|
||||
borderLayoutPanel.setLayout(new BorderLayout());
|
||||
|
||||
jTextArea1.setBackground(new Color(240, 240, 240));
|
||||
@ -411,9 +406,9 @@ final public class VisualizationPanel extends JPanel {
|
||||
placeHolderPanel.setLayout(placeHolderPanelLayout);
|
||||
placeHolderPanelLayout.setHorizontalGroup(placeHolderPanelLayout.createParallelGroup(GroupLayout.LEADING)
|
||||
.add(placeHolderPanelLayout.createSequentialGroup()
|
||||
.addContainerGap(250, Short.MAX_VALUE)
|
||||
.addContainerGap(316, Short.MAX_VALUE)
|
||||
.add(jTextArea1, GroupLayout.PREFERRED_SIZE, 424, GroupLayout.PREFERRED_SIZE)
|
||||
.addContainerGap(423, Short.MAX_VALUE))
|
||||
.addContainerGap(481, Short.MAX_VALUE))
|
||||
);
|
||||
placeHolderPanelLayout.setVerticalGroup(placeHolderPanelLayout.createParallelGroup(GroupLayout.LEADING)
|
||||
.add(placeHolderPanelLayout.createSequentialGroup()
|
||||
@ -423,12 +418,72 @@ final public class VisualizationPanel extends JPanel {
|
||||
);
|
||||
|
||||
borderLayoutPanel.add(placeHolderPanel, BorderLayout.CENTER);
|
||||
borderLayoutPanel.add(notificationsJFXPanel, BorderLayout.PAGE_END);
|
||||
|
||||
add(borderLayoutPanel, BorderLayout.CENTER);
|
||||
|
||||
toolbar.setRollover(true);
|
||||
|
||||
backButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/resultset_previous.png"))); // NOI18N
|
||||
backButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.backButton.text_1")); // NOI18N
|
||||
backButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.backButton.toolTipText")); // NOI18N
|
||||
backButton.setFocusable(false);
|
||||
backButton.setHorizontalTextPosition(SwingConstants.CENTER);
|
||||
backButton.setVerticalTextPosition(SwingConstants.BOTTOM);
|
||||
backButton.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent evt) {
|
||||
backButtonActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
toolbar.add(backButton);
|
||||
|
||||
forwardButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/resultset_next.png"))); // NOI18N
|
||||
forwardButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.forwardButton.text")); // NOI18N
|
||||
forwardButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.forwardButton.toolTipText")); // NOI18N
|
||||
forwardButton.setFocusable(false);
|
||||
forwardButton.setHorizontalTextPosition(SwingConstants.CENTER);
|
||||
forwardButton.setVerticalTextPosition(SwingConstants.BOTTOM);
|
||||
forwardButton.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent evt) {
|
||||
forwardButtonActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
toolbar.add(forwardButton);
|
||||
toolbar.add(jSeparator3);
|
||||
|
||||
clearVizButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/broom.png"))); // NOI18N
|
||||
clearVizButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.clearVizButton.text_1")); // NOI18N
|
||||
clearVizButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.clearVizButton.toolTipText")); // NOI18N
|
||||
clearVizButton.setActionCommand(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.clearVizButton.actionCommand")); // NOI18N
|
||||
clearVizButton.setFocusable(false);
|
||||
clearVizButton.setHorizontalTextPosition(SwingConstants.CENTER);
|
||||
clearVizButton.setVerticalTextPosition(SwingConstants.BOTTOM);
|
||||
clearVizButton.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent evt) {
|
||||
clearVizButtonActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
toolbar.add(clearVizButton);
|
||||
|
||||
fastOrganicLayoutButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/arrow-circle-double-135.png"))); // NOI18N
|
||||
fastOrganicLayoutButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.fastOrganicLayoutButton.text")); // NOI18N
|
||||
fastOrganicLayoutButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.fastOrganicLayoutButton.toolTipText")); // NOI18N
|
||||
fastOrganicLayoutButton.setFocusable(false);
|
||||
fastOrganicLayoutButton.setHorizontalTextPosition(SwingConstants.CENTER);
|
||||
fastOrganicLayoutButton.setVerticalTextPosition(SwingConstants.BOTTOM);
|
||||
fastOrganicLayoutButton.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent evt) {
|
||||
fastOrganicLayoutButtonActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
toolbar.add(fastOrganicLayoutButton);
|
||||
toolbar.add(jSeparator2);
|
||||
|
||||
zoomLabel.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomLabel.text")); // NOI18N
|
||||
toolbar.add(zoomLabel);
|
||||
|
||||
zoomPercentLabel.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomPercentLabel.text")); // NOI18N
|
||||
toolbar.add(zoomPercentLabel);
|
||||
|
||||
zoomOutButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/magnifier-zoom-out-red.png"))); // NOI18N
|
||||
zoomOutButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomOutButton.text")); // NOI18N
|
||||
@ -441,30 +496,7 @@ final public class VisualizationPanel extends JPanel {
|
||||
zoomOutButtonActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
|
||||
zoomInButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/magnifier-zoom-in-green.png"))); // NOI18N
|
||||
zoomInButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomInButton.text")); // NOI18N
|
||||
zoomInButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomInButton.toolTipText")); // NOI18N
|
||||
zoomInButton.setFocusable(false);
|
||||
zoomInButton.setHorizontalTextPosition(SwingConstants.CENTER);
|
||||
zoomInButton.setVerticalTextPosition(SwingConstants.BOTTOM);
|
||||
zoomInButton.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent evt) {
|
||||
zoomInButtonActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
|
||||
zoomActualButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/magnifier-zoom-actual.png"))); // NOI18N
|
||||
zoomActualButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomActualButton.text")); // NOI18N
|
||||
zoomActualButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomActualButton.toolTipText")); // NOI18N
|
||||
zoomActualButton.setFocusable(false);
|
||||
zoomActualButton.setHorizontalTextPosition(SwingConstants.CENTER);
|
||||
zoomActualButton.setVerticalTextPosition(SwingConstants.BOTTOM);
|
||||
zoomActualButton.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent evt) {
|
||||
zoomActualButtonActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
toolbar.add(zoomOutButton);
|
||||
|
||||
fitZoomButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/magnifier-zoom-fit.png"))); // NOI18N
|
||||
fitZoomButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.fitZoomButton.text")); // NOI18N
|
||||
@ -477,116 +509,49 @@ final public class VisualizationPanel extends JPanel {
|
||||
fitZoomButtonActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
toolbar.add(fitZoomButton);
|
||||
|
||||
zoomLabel.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomLabel.text")); // NOI18N
|
||||
|
||||
zoomPercentLabel.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomPercentLabel.text")); // NOI18N
|
||||
|
||||
clearVizButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/broom.png"))); // NOI18N
|
||||
clearVizButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.clearVizButton.text_1")); // NOI18N
|
||||
clearVizButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.clearVizButton.toolTipText")); // NOI18N
|
||||
clearVizButton.setActionCommand(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.clearVizButton.actionCommand")); // NOI18N
|
||||
clearVizButton.addActionListener(new ActionListener() {
|
||||
zoomActualButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/magnifier-zoom-actual.png"))); // NOI18N
|
||||
zoomActualButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomActualButton.text")); // NOI18N
|
||||
zoomActualButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomActualButton.toolTipText")); // NOI18N
|
||||
zoomActualButton.setFocusable(false);
|
||||
zoomActualButton.setHorizontalTextPosition(SwingConstants.CENTER);
|
||||
zoomActualButton.setVerticalTextPosition(SwingConstants.BOTTOM);
|
||||
zoomActualButton.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent evt) {
|
||||
clearVizButtonActionPerformed(evt);
|
||||
zoomActualButtonActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
toolbar.add(zoomActualButton);
|
||||
|
||||
jSeparator2.setOrientation(SwingConstants.VERTICAL);
|
||||
|
||||
backButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/resultset_previous.png"))); // NOI18N
|
||||
backButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.backButton.text_1")); // NOI18N
|
||||
backButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.backButton.toolTipText")); // NOI18N
|
||||
backButton.addActionListener(new ActionListener() {
|
||||
zoomInButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/magnifier-zoom-in-green.png"))); // NOI18N
|
||||
zoomInButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomInButton.text")); // NOI18N
|
||||
zoomInButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomInButton.toolTipText")); // NOI18N
|
||||
zoomInButton.setFocusable(false);
|
||||
zoomInButton.setHorizontalTextPosition(SwingConstants.CENTER);
|
||||
zoomInButton.setVerticalTextPosition(SwingConstants.BOTTOM);
|
||||
zoomInButton.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent evt) {
|
||||
backButtonActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
|
||||
forwardButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/resultset_next.png"))); // NOI18N
|
||||
forwardButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.forwardButton.text")); // NOI18N
|
||||
forwardButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.forwardButton.toolTipText")); // NOI18N
|
||||
forwardButton.setHorizontalTextPosition(SwingConstants.LEADING);
|
||||
forwardButton.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent evt) {
|
||||
forwardButtonActionPerformed(evt);
|
||||
zoomInButtonActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
toolbar.add(zoomInButton);
|
||||
toolbar.add(jSeparator1);
|
||||
|
||||
snapshotButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/report/images/image.png"))); // NOI18N
|
||||
snapshotButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.snapshotButton.text_1")); // NOI18N
|
||||
snapshotButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.snapshotButton.toolTipText")); // NOI18N
|
||||
snapshotButton.setFocusable(false);
|
||||
snapshotButton.setHorizontalTextPosition(SwingConstants.CENTER);
|
||||
snapshotButton.setVerticalTextPosition(SwingConstants.BOTTOM);
|
||||
snapshotButton.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent evt) {
|
||||
snapshotButtonActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
toolbar.add(snapshotButton);
|
||||
|
||||
jSeparator3.setOrientation(SwingConstants.VERTICAL);
|
||||
|
||||
jSeparator4.setOrientation(SwingConstants.VERTICAL);
|
||||
|
||||
GroupLayout toolbarLayout = new GroupLayout(toolbar);
|
||||
toolbar.setLayout(toolbarLayout);
|
||||
toolbarLayout.setHorizontalGroup(toolbarLayout.createParallelGroup(GroupLayout.LEADING)
|
||||
.add(toolbarLayout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.add(backButton)
|
||||
.addPreferredGap(LayoutStyle.RELATED)
|
||||
.add(forwardButton)
|
||||
.addPreferredGap(LayoutStyle.RELATED)
|
||||
.add(jSeparator4, GroupLayout.PREFERRED_SIZE, 10, GroupLayout.PREFERRED_SIZE)
|
||||
.addPreferredGap(LayoutStyle.RELATED)
|
||||
.add(fastOrganicLayoutButton)
|
||||
.addPreferredGap(LayoutStyle.RELATED)
|
||||
.add(clearVizButton)
|
||||
.addPreferredGap(LayoutStyle.RELATED)
|
||||
.add(jSeparator2, GroupLayout.PREFERRED_SIZE, 10, GroupLayout.PREFERRED_SIZE)
|
||||
.addPreferredGap(LayoutStyle.RELATED)
|
||||
.add(zoomLabel)
|
||||
.addPreferredGap(LayoutStyle.RELATED)
|
||||
.add(zoomPercentLabel)
|
||||
.addPreferredGap(LayoutStyle.RELATED)
|
||||
.add(zoomOutButton, GroupLayout.PREFERRED_SIZE, 32, GroupLayout.PREFERRED_SIZE)
|
||||
.addPreferredGap(LayoutStyle.RELATED)
|
||||
.add(zoomInButton, GroupLayout.PREFERRED_SIZE, 32, GroupLayout.PREFERRED_SIZE)
|
||||
.addPreferredGap(LayoutStyle.RELATED)
|
||||
.add(zoomActualButton, GroupLayout.PREFERRED_SIZE, 33, GroupLayout.PREFERRED_SIZE)
|
||||
.addPreferredGap(LayoutStyle.RELATED)
|
||||
.add(fitZoomButton, GroupLayout.PREFERRED_SIZE, 32, GroupLayout.PREFERRED_SIZE)
|
||||
.addPreferredGap(LayoutStyle.RELATED)
|
||||
.add(jSeparator3, GroupLayout.PREFERRED_SIZE, 10, GroupLayout.PREFERRED_SIZE)
|
||||
.addPreferredGap(LayoutStyle.RELATED)
|
||||
.add(snapshotButton)
|
||||
.addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
||||
);
|
||||
toolbarLayout.setVerticalGroup(toolbarLayout.createParallelGroup(GroupLayout.LEADING)
|
||||
.add(toolbarLayout.createSequentialGroup()
|
||||
.add(3, 3, 3)
|
||||
.add(toolbarLayout.createParallelGroup(GroupLayout.CENTER)
|
||||
.add(fastOrganicLayoutButton)
|
||||
.add(zoomOutButton)
|
||||
.add(zoomInButton, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.add(zoomActualButton, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.add(fitZoomButton, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.add(zoomLabel)
|
||||
.add(zoomPercentLabel)
|
||||
.add(clearVizButton)
|
||||
.add(jSeparator2, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.add(backButton)
|
||||
.add(forwardButton)
|
||||
.add(snapshotButton)
|
||||
.add(jSeparator3, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.add(jSeparator4, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
||||
.add(3, 3, 3))
|
||||
);
|
||||
|
||||
borderLayoutPanel.add(toolbar, BorderLayout.PAGE_START);
|
||||
borderLayoutPanel.add(notificationsJFXPanel, BorderLayout.PAGE_END);
|
||||
|
||||
splitPane.setLeftComponent(borderLayoutPanel);
|
||||
|
||||
add(splitPane, BorderLayout.CENTER);
|
||||
add(toolbar, BorderLayout.NORTH);
|
||||
}// </editor-fold>//GEN-END:initComponents
|
||||
|
||||
private void fitZoomButtonActionPerformed(ActionEvent evt) {//GEN-FIRST:event_fitZoomButtonActionPerformed
|
||||
@ -726,6 +691,10 @@ final public class VisualizationPanel extends JPanel {
|
||||
}
|
||||
}//GEN-LAST:event_snapshotButtonActionPerformed
|
||||
|
||||
private void fastOrganicLayoutButtonActionPerformed(ActionEvent evt) {//GEN-FIRST:event_fastOrganicLayoutButtonActionPerformed
|
||||
// TODO add your handling code here:
|
||||
}//GEN-LAST:event_fastOrganicLayoutButtonActionPerformed
|
||||
|
||||
private void fitGraph() {
|
||||
graphComponent.zoomTo(1, true);
|
||||
mxPoint translate = graph.getView().getTranslate();
|
||||
@ -883,15 +852,14 @@ final public class VisualizationPanel extends JPanel {
|
||||
private JButton fastOrganicLayoutButton;
|
||||
private JButton fitZoomButton;
|
||||
private JButton forwardButton;
|
||||
private JToolBar.Separator jSeparator1;
|
||||
private JToolBar.Separator jSeparator2;
|
||||
private JToolBar.Separator jSeparator3;
|
||||
private JToolBar.Separator jSeparator4;
|
||||
private JTextArea jTextArea1;
|
||||
private JFXPanel notificationsJFXPanel;
|
||||
private JPanel placeHolderPanel;
|
||||
private JButton snapshotButton;
|
||||
private JSplitPane splitPane;
|
||||
private JPanel toolbar;
|
||||
private JToolBar toolbar;
|
||||
private JButton zoomActualButton;
|
||||
private JButton zoomInButton;
|
||||
private JLabel zoomLabel;
|
||||
|
BIN
Core/src/org/sleuthkit/autopsy/communications/images/arrow-180.png
Executable file
BIN
Core/src/org/sleuthkit/autopsy/communications/images/arrow-180.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 1022 B |
BIN
Core/src/org/sleuthkit/autopsy/communications/images/arrow-left.png
Executable file
BIN
Core/src/org/sleuthkit/autopsy/communications/images/arrow-left.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 1.7 KiB |
BIN
Core/src/org/sleuthkit/autopsy/communications/images/arrow-right.png
Executable file
BIN
Core/src/org/sleuthkit/autopsy/communications/images/arrow-right.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 1.7 KiB |
BIN
Core/src/org/sleuthkit/autopsy/communications/images/arrow.png
Executable file
BIN
Core/src/org/sleuthkit/autopsy/communications/images/arrow.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 1.0 KiB |
@ -199,7 +199,7 @@ class MediaViewImagePanel extends JPanel implements MediaFileViewer.MediaViewPan
|
||||
imageTaggingOptions.setPopupSize(300, 150);
|
||||
|
||||
//Disable image tagging for non-windows users or upon failure to load OpenCV.
|
||||
if (!PlatformUtil.isWindowsOS() || !OpenCvLoader.hasOpenCvLoaded()) {
|
||||
if (!PlatformUtil.isWindowsOS() || !OpenCvLoader.openCvIsLoaded()) {
|
||||
tagsMenu.setEnabled(false);
|
||||
imageTaggingOptions.setEnabled(false);
|
||||
}
|
||||
|
@ -56,6 +56,7 @@ import static org.sleuthkit.autopsy.corecomponents.Bundle.*;
|
||||
import org.sleuthkit.autopsy.corecomponents.ResultViewerPersistence.SortCriterion;
|
||||
import org.sleuthkit.autopsy.coreutils.ImageUtils;
|
||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||
import org.sleuthkit.autopsy.uicomponents.WrapLayout;
|
||||
import org.sleuthkit.datamodel.AbstractFile;
|
||||
import org.sleuthkit.datamodel.TskCoreException;
|
||||
|
||||
|
@ -16,10 +16,8 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.sleuthkit.autopsy.coreutils;
|
||||
|
||||
import java.io.Closeable;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.sql.Connection;
|
||||
@ -43,11 +41,12 @@ import org.sleuthkit.datamodel.SleuthkitCase;
|
||||
import org.sleuthkit.datamodel.TskCoreException;
|
||||
|
||||
/**
|
||||
* An abstraction around an SQLite app DB found in a data source.
|
||||
* This class makes a copy of it, along with any meta files (WAL, SHM),
|
||||
* opens a SQLite connection to it, and runs queries on it.
|
||||
* An abstraction around an SQLite app DB found in a data source. This class
|
||||
* makes a copy of it, along with any meta files (WAL, SHM), opens a SQLite
|
||||
* connection to it, and runs queries on it.
|
||||
*/
|
||||
public final class AppSQLiteDB {
|
||||
|
||||
private final Logger logger = Logger.getLogger(AppSQLiteDB.class.getName());
|
||||
|
||||
private final AbstractFile dbAbstractFile; // AbstractFile for the DB file
|
||||
@ -55,12 +54,12 @@ public final class AppSQLiteDB {
|
||||
private final Connection connection;
|
||||
private final Statement statement;
|
||||
|
||||
|
||||
/**
|
||||
* Class to abstract the abstract file for a DB file and its on disk copy
|
||||
*
|
||||
*/
|
||||
private static final class AppSQLiteDBFileBundle {
|
||||
|
||||
private final AbstractFile dbAbstractFile;
|
||||
private final File dbFileCopy;
|
||||
|
||||
@ -87,30 +86,31 @@ public final class AppSQLiteDB {
|
||||
statement = connection.createStatement();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Looks for the given SQLIte database filename, with matching path substring.
|
||||
* It looks for exact name or a pattern match based on a input parameter.
|
||||
* It makes a copy of each matching file, and creates an instance of
|
||||
* AppSQLiteDB to help query the DB.
|
||||
* Looks for application SQLite database files with a given name or name
|
||||
* substring and a given parent path or parent path substring. For each
|
||||
* database file found, a temporary copy is made and an open connection to
|
||||
* the database in the form of an AppSQLiteDB object is created and
|
||||
* returned.
|
||||
*
|
||||
* A list of AppSQLiteDB instances is returned, one for each
|
||||
* match found.
|
||||
* @param dataSource The data source to be searched for the database
|
||||
* files.
|
||||
* @param dbFileName The database file name or file name substring for
|
||||
* which to search.
|
||||
* @param matchExactName Whether or not the database file name argument is
|
||||
* the full database file name or a substring.
|
||||
* @param parentPathSubstr The parent path substring, may pass the empty
|
||||
* string to match any parent path.
|
||||
*
|
||||
* @param dataSource data source to search in
|
||||
* @param dbName db file name to search
|
||||
* @param matchExactName whether to look for exact file name or a pattern match
|
||||
* @param parentPathSubstr path substring to match
|
||||
*
|
||||
* @return A list of abstract files matching the specified name and path.
|
||||
* Returns an empty list if no matching database is found.
|
||||
* @return A list, possibly empty, of AppSQLiteDB objects for the files that
|
||||
* were found, copied, and connected to.
|
||||
*/
|
||||
public static Collection<AppSQLiteDB> findAppDatabases(DataSource dataSource,
|
||||
String dbName, boolean matchExactName, String parentPathSubstr) {
|
||||
String dbFileName, boolean matchExactName, String parentPathSubstr) {
|
||||
|
||||
List<AppSQLiteDB> appDbs = new ArrayList<> ();
|
||||
List<AppSQLiteDB> appDbs = new ArrayList<>();
|
||||
try {
|
||||
Collection<AppSQLiteDBFileBundle> dbFileBundles = findAndCopySQLiteDB( dataSource, dbName, matchExactName, parentPathSubstr, false);
|
||||
Collection<AppSQLiteDBFileBundle> dbFileBundles = findAndCopySQLiteDB(dataSource, dbFileName, matchExactName, parentPathSubstr, false);
|
||||
dbFileBundles.forEach((dbFileBundle) -> {
|
||||
try {
|
||||
AppSQLiteDB appSQLiteDB = new AppSQLiteDB(dbFileBundle);
|
||||
@ -120,7 +120,7 @@ public final class AppSQLiteDB {
|
||||
}
|
||||
});
|
||||
} catch (TskCoreException ex) {
|
||||
Logger.getLogger(AppSQLiteDB.class.getName()).log(Level.SEVERE, String.format("Error finding App database files with name = '%s' and path = '%s'.", dbName, parentPathSubstr), ex); //NON-NLS
|
||||
Logger.getLogger(AppSQLiteDB.class.getName()).log(Level.SEVERE, String.format("Error finding App database files with name = '%s' and path = '%s'.", dbFileName, parentPathSubstr), ex); //NON-NLS
|
||||
}
|
||||
|
||||
return appDbs;
|
||||
@ -133,17 +133,17 @@ public final class AppSQLiteDB {
|
||||
/**
|
||||
* Attaches a database to the current connection.
|
||||
*
|
||||
* Finds the specified database file in the specified folder.
|
||||
* If found, makes copy of the database in the case folder and
|
||||
* run ATTACH DATABASE sql.
|
||||
* Finds the specified database file in the specified folder. If found,
|
||||
* makes copy of the database in the case folder and run ATTACH DATABASE
|
||||
* sql.
|
||||
*
|
||||
* @param dataSource data source in which to look file the db file
|
||||
* @param dbName name of db file to look for
|
||||
* @param dbPath path in which to look for the db file
|
||||
* @param dbAlias alias name to attach the database as
|
||||
*
|
||||
* @return abstract file for the matching db file.
|
||||
* null if no match is found.
|
||||
* @return abstract file for the matching db file. null if no match is
|
||||
* found.
|
||||
*
|
||||
* @throws SQLException in case of an SQL error
|
||||
*/
|
||||
@ -167,14 +167,17 @@ public final class AppSQLiteDB {
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds database file with the specified name, makes a copy of the file in the case directory,
|
||||
* and returns the AbstractFile as well as the file copy.
|
||||
* Finds database file with the specified name, makes a copy of the file in
|
||||
* the case directory, and returns the AbstractFile as well as the file
|
||||
* copy.
|
||||
*
|
||||
* @param dataSource data source to search in
|
||||
* @param dbName db file name to search
|
||||
* @param matchExactName whether to look for exact file name or a pattern match
|
||||
* @param matchExactName whether to look for exact file name or a pattern
|
||||
* match
|
||||
* @param dbPath path to match
|
||||
* @param matchExactPath whether to look for exact path name or a substring match
|
||||
* @param matchExactPath whether to look for exact path name or a substring
|
||||
* match
|
||||
*
|
||||
* @return a collection of AppSQLiteDBFileBundle
|
||||
*
|
||||
@ -190,7 +193,7 @@ public final class AppSQLiteDB {
|
||||
throw new TskCoreException("Failed to get current case.", ex);
|
||||
}
|
||||
|
||||
List<AppSQLiteDBFileBundle> dbFileBundles = new ArrayList<> ();
|
||||
List<AppSQLiteDBFileBundle> dbFileBundles = new ArrayList<>();
|
||||
long fileId = 0;
|
||||
String localDiskPath = "";
|
||||
|
||||
@ -202,12 +205,12 @@ public final class AppSQLiteDB {
|
||||
if (matchExactName) {
|
||||
whereClause = String.format("LOWER(name) = LOWER('%s')", dbName);
|
||||
} else {
|
||||
whereClause = String.format("LOWER(name) LIKE LOWER('%%%s%%') AND LOWER(name) NOT LIKE LOWER('%%journal%%')", dbName );
|
||||
whereClause = String.format("LOWER(name) LIKE LOWER('%%%s%%') AND LOWER(name) NOT LIKE LOWER('%%journal%%')", dbName);
|
||||
}
|
||||
if (matchExactPath) {
|
||||
whereClause += String.format(" AND LOWER(parent_path) = LOWER('%s')", parentPath );
|
||||
whereClause += String.format(" AND LOWER(parent_path) = LOWER('%s')", parentPath);
|
||||
} else {
|
||||
whereClause += String.format(" AND LOWER(parent_path) LIKE LOWER('%%%s%%')", parentPath );
|
||||
whereClause += String.format(" AND LOWER(parent_path) LIKE LOWER('%%%s%%')", parentPath);
|
||||
}
|
||||
whereClause += String.format(" AND data_source_obj_id = %s", dataSource.getId());
|
||||
|
||||
@ -249,10 +252,9 @@ public final class AppSQLiteDB {
|
||||
statement.executeUpdate(detachDbSql); //NON-NLS
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Runs the given query on the database and returns result set.
|
||||
|
||||
*
|
||||
* @param queryStr SQL string for the query to run
|
||||
*
|
||||
* @return ResultSet from running the query.
|
||||
@ -284,8 +286,6 @@ public final class AppSQLiteDB {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Searches for a meta file associated with the give SQLite database. If
|
||||
* found, it copies this file into the temp directory of the current case.
|
||||
|
@ -121,7 +121,7 @@ public class ImageUtils {
|
||||
}
|
||||
DEFAULT_THUMBNAIL = tempImage;
|
||||
boolean tempFfmpegLoaded = false;
|
||||
if (OpenCvLoader.hasOpenCvLoaded()) {
|
||||
if (OpenCvLoader.openCvIsLoaded()) {
|
||||
try {
|
||||
if (System.getProperty("os.arch").equals("amd64") || System.getProperty("os.arch").equals("x86_64")) { //NON-NLS
|
||||
System.loadLibrary("opencv_ffmpeg248_64"); //NON-NLS
|
||||
|
@ -2,7 +2,7 @@
|
||||
*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2012-2018 Basis Technology Corp.
|
||||
* Copyright 2012-2019 Basis Technology Corp.
|
||||
*
|
||||
* Copyright 2012 42six Solutions.
|
||||
* Contact: aebadirad <at> 42six <dot> com
|
||||
@ -30,108 +30,211 @@ import java.sql.Statement;
|
||||
import java.util.logging.Level;
|
||||
|
||||
/**
|
||||
* Database connection class & utilities.
|
||||
* An abstraction that loads a given SQLite driver, establishes a connection to
|
||||
* a given database, and creates a statement for the connection to support basic
|
||||
* SQL operations on the database.
|
||||
*/
|
||||
public class SQLiteDBConnect implements AutoCloseable {
|
||||
|
||||
public String sDriver = "";
|
||||
public String sUrl = null;
|
||||
public int iTimeout = 30;
|
||||
public Connection conn = null;
|
||||
public Statement statement = null;
|
||||
private static final Logger logger = Logger.getLogger(SQLiteDBConnect.class.getName());
|
||||
private static final int STMT_EXEC_TIMEOUT_SECS = 30;
|
||||
|
||||
/*
|
||||
* Stub constructor for quick instantiation o/t fly for using some of the
|
||||
* ancillary stuff
|
||||
/**
|
||||
* Constructs an abstraction that loads a given SQLite driver, establishes a
|
||||
* connection to a given database, and creates a statement for the
|
||||
* connection to support basic SQL operations on the database.
|
||||
*
|
||||
* @param driver The SQLite driver class name.
|
||||
* @param url The SQLite database URL to which to connect.
|
||||
*
|
||||
* @throws SQLException If there is an error loading the driver,
|
||||
* establishing the connection, or creating a statement
|
||||
* for the connection.
|
||||
*/
|
||||
public SQLiteDBConnect() {
|
||||
}
|
||||
|
||||
/*
|
||||
* quick and dirty constructor to test the database passing the
|
||||
* DriverManager name and the fully loaded url to handle
|
||||
*/
|
||||
/*
|
||||
* NB this will typically be available if you make this class concrete and
|
||||
* not abstract
|
||||
*/
|
||||
public SQLiteDBConnect(String sDriverToLoad, String sUrlToLoad) throws SQLException {
|
||||
init(sDriverToLoad, sUrlToLoad);
|
||||
}
|
||||
|
||||
public final void init(String sDriverVar, String sUrlVar) throws SQLException {
|
||||
setDriver(sDriverVar);
|
||||
setUrl(sUrlVar);
|
||||
setConnection();
|
||||
setStatement();
|
||||
}
|
||||
|
||||
private void setDriver(String sDriverVar) {
|
||||
sDriver = sDriverVar;
|
||||
}
|
||||
|
||||
private void setUrl(String sUrlVar) {
|
||||
sUrl = sUrlVar;
|
||||
}
|
||||
|
||||
public void setConnection() throws SQLException {
|
||||
public SQLiteDBConnect(String driver, String url) throws SQLException {
|
||||
sDriver = driver;
|
||||
sUrl = url;
|
||||
try {
|
||||
Class.forName(sDriver);
|
||||
} catch (ClassNotFoundException e) {
|
||||
|
||||
} catch (ClassNotFoundException ex) {
|
||||
throw new SQLException(ex);
|
||||
}
|
||||
conn = DriverManager.getConnection(sUrl);
|
||||
}
|
||||
|
||||
public Connection getConnection() {
|
||||
return conn;
|
||||
}
|
||||
|
||||
public void setStatement() throws SQLException {
|
||||
if (conn == null) {
|
||||
setConnection();
|
||||
}
|
||||
statement = conn.createStatement();
|
||||
statement.setQueryTimeout(iTimeout); // set timeout to 30 sec.
|
||||
statement.setQueryTimeout(STMT_EXEC_TIMEOUT_SECS);
|
||||
}
|
||||
|
||||
public Statement getStatement() {
|
||||
return statement;
|
||||
}
|
||||
|
||||
public void executeStmt(String instruction) throws SQLException {
|
||||
statement.executeUpdate(instruction);
|
||||
}
|
||||
|
||||
/** processes an array of instructions e.g. a set of SQL command strings
|
||||
* passed from a file
|
||||
/**
|
||||
* Executes an SQL statement. For use with statements that do not return
|
||||
* result sets.
|
||||
*
|
||||
* NB you should ensure you either handle empty lines in files by either
|
||||
* removing them or parsing them out since they will generate spurious
|
||||
* SQLExceptions when they are encountered during the iteration....
|
||||
* @param sqlStatement The SQL statement to execute.
|
||||
*
|
||||
* @throws SQLException If there is an error executing the statement.
|
||||
*/
|
||||
public void executeStmt(String[] instructionSet) throws SQLException {
|
||||
for (int i = 0; i < instructionSet.length; i++) {
|
||||
executeStmt(instructionSet[i]);
|
||||
public void executeStmt(String sqlStatement) throws SQLException {
|
||||
statement.executeUpdate(sqlStatement);
|
||||
}
|
||||
|
||||
/**
|
||||
* Executes one or more SQL statements in sequence. For use with statements
|
||||
* that do not return result sets.
|
||||
*
|
||||
* @param sqlStatements The SQL statements to execute.
|
||||
*
|
||||
* @throws SQLException If there is an error executing the statements.
|
||||
*/
|
||||
public void executeStmt(String[] sqlStatements) throws SQLException {
|
||||
for (String stmt : sqlStatements) {
|
||||
executeStmt(stmt);
|
||||
}
|
||||
}
|
||||
|
||||
public ResultSet executeQry(String instruction) throws SQLException {
|
||||
return statement.executeQuery(instruction);
|
||||
/**
|
||||
* Executes an SQL query and returns a result set. The caller should close
|
||||
* the result set when finished with it, and should not make any other calls
|
||||
* on this object until finished with the result set.
|
||||
*
|
||||
* @param sqlStatement The SQL query to execute.
|
||||
*
|
||||
* @return The result set.
|
||||
*
|
||||
* @throws SQLException If there is an error executing the query.
|
||||
*/
|
||||
public ResultSet executeQry(String sqlStatement) throws SQLException {
|
||||
return statement.executeQuery(sqlStatement);
|
||||
}
|
||||
|
||||
/**
|
||||
* Closes the connection to the database. Should be called when the use of
|
||||
* this object is completed, unless the object was constructed in a try with
|
||||
* resources statement, in which case the closing is automatic when the
|
||||
* object goes out of scope.
|
||||
*/
|
||||
public void closeConnection() {
|
||||
if (conn == null) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
conn.close();
|
||||
} catch (SQLException ex) {
|
||||
logger.log(Level.WARNING, "Unable to close connection to SQLite DB at " + sUrl, ex);
|
||||
}
|
||||
//Implementing Autoclosable.close() allows this class to be used in try-with-resources.
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() {
|
||||
closeConnection();
|
||||
}
|
||||
|
||||
/*
|
||||
* Partially constructs a utility object for doing basic operations on a
|
||||
* SQLite database. The object is not in a usable state. Further
|
||||
* initialization is required. See methods below.
|
||||
*
|
||||
* @deprecated Do not use.
|
||||
*/
|
||||
@Deprecated
|
||||
public SQLiteDBConnect() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads a given SQLite driver, establishes a connection to a given
|
||||
* database, and creates a statement for the connection.
|
||||
*
|
||||
* @param driver The SQLite driver class name.
|
||||
* @param url The SQLite database URL to which to connect.
|
||||
*
|
||||
* @throws SQLException If there is an error establishing the connection or
|
||||
* creating a statement for the connection.
|
||||
*
|
||||
* @deprecated Do not use.
|
||||
*/
|
||||
@Deprecated
|
||||
public final void init(String driver, String url) throws SQLException {
|
||||
sDriver = driver;
|
||||
sUrl = url;
|
||||
closeConnection();
|
||||
setConnection();
|
||||
setStatement();
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets or resets the connection to the SQLite database, if the SQLite
|
||||
* driver and the database URL have been set.
|
||||
*
|
||||
* @throws SQLException If there is an error loading the driver or
|
||||
* establishing the connection.
|
||||
*
|
||||
* @deprecated Do not use.
|
||||
*/
|
||||
@Deprecated
|
||||
public void setConnection() throws SQLException {
|
||||
if (sDriver == null || sDriver.isEmpty() || sUrl == null || sUrl.isEmpty()) {
|
||||
throw new SQLException("Driver and or databse URl not initialized");
|
||||
}
|
||||
closeConnection();
|
||||
try {
|
||||
Class.forName(sDriver);
|
||||
} catch (ClassNotFoundException ex) {
|
||||
throw new SQLException(ex);
|
||||
}
|
||||
conn = DriverManager.getConnection(sUrl);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the connection, if any, to the database.
|
||||
*
|
||||
* @return The connection to the database, may be null.
|
||||
*
|
||||
* @deprecated Do not use.
|
||||
*/
|
||||
@Deprecated
|
||||
public Connection getConnection() {
|
||||
return conn;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a connection to the database if there is none, and creates a
|
||||
* statement using the connection.
|
||||
*
|
||||
* @throws SQLException If there is an error creating the connection or the
|
||||
* staement.
|
||||
*
|
||||
* @deprecated Do not use.
|
||||
*/
|
||||
@Deprecated
|
||||
public void setStatement() throws SQLException {
|
||||
if (conn == null) {
|
||||
setConnection();
|
||||
}
|
||||
statement = conn.createStatement();
|
||||
statement.setQueryTimeout(iTimeout);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the statement, if any, associated with the connection to the
|
||||
* database, if any.
|
||||
*
|
||||
* @return The statement, may be null.
|
||||
*
|
||||
* @deprecated Do not use.
|
||||
*/
|
||||
@Deprecated
|
||||
public Statement getStatement() {
|
||||
return statement;
|
||||
}
|
||||
|
||||
/*
|
||||
* The lack of encapsulation of these fields is an error. Access to them
|
||||
* outside of instances of this class is deprecated.
|
||||
*
|
||||
* @deprecated Do not access.
|
||||
*/
|
||||
public String sDriver = "";
|
||||
public String sUrl = null;
|
||||
public int iTimeout = STMT_EXEC_TIMEOUT_SECS;
|
||||
public Connection conn = null;
|
||||
public Statement statement = null;
|
||||
|
||||
}
|
||||
|
@ -70,8 +70,8 @@ final class ConfigVisualPanel1 extends JPanel {
|
||||
ConfigVisualPanel1() {
|
||||
initComponents();
|
||||
configFileTextField.getDocument().addDocumentListener(new MyDocumentListener(this));
|
||||
refreshDriveList();
|
||||
SwingUtilities.invokeLater(() -> {
|
||||
refreshDriveList();
|
||||
updateControls();
|
||||
});
|
||||
}
|
||||
|
@ -2,3 +2,15 @@ OpenIDE-Module-Name=Report
|
||||
DefaultReportConfigurationPanel.infoLabel.text=This report will be configured on the next screen.
|
||||
ReportBranding.defaultReportTitle.text=Autopsy Forensic Report
|
||||
ReportBranding.defaultReportFooter.text=Powered by Autopsy Open Source Digital Forensics Platform - www.sleuthkit.org
|
||||
ReportProgressPanel.pathLabel.text=pathLabel
|
||||
ReportProgressPanel.reportLabel.text=reportLabel
|
||||
ReportProgressPanel.statusMessageLabel.text=processingLabel
|
||||
ReportProgressPanel.separationLabel.text=:
|
||||
ReportProgressPanel.initPathLabel.noFile=<html><u>No report file</u></html>
|
||||
ReportProgressPanel.start.cancelButton.text=Cancel
|
||||
ReportProgressPanel.start.progress.text=Starting report...
|
||||
ReportProgressPanel.complete.processLbl.text=Complete
|
||||
ReportProgressPanel.complete.processLb2.text=Completed with error
|
||||
ReportProgressPanel.complete.cancelButton.text=Complete
|
||||
ReportProgressPanel.cancel.cancelButton.toolTipText=Canceled
|
||||
ReportProgressPanel.cancel.procLbl.text=Canceled
|
||||
|
@ -2,3 +2,20 @@ OpenIDE-Module-Name=Report
|
||||
DefaultReportConfigurationPanel.infoLabel.text=This report will be configured on the next screen.
|
||||
ReportBranding.defaultReportTitle.text=Autopsy Forensic Report
|
||||
ReportBranding.defaultReportFooter.text=Powered by Autopsy Open Source Digital Forensics Platform - www.sleuthkit.org
|
||||
ReportProgressPanel.pathLabel.text=pathLabel
|
||||
ReportProgressPanel.progress.canceled=Canceled
|
||||
ReportProgressPanel.progress.complete=Complete
|
||||
ReportProgressPanel.progress.error=Error
|
||||
ReportProgressPanel.progress.queuing=Queuing...
|
||||
ReportProgressPanel.progress.running=Running...
|
||||
ReportProgressPanel.reportLabel.text=reportLabel
|
||||
ReportProgressPanel.statusMessageLabel.text=processingLabel
|
||||
ReportProgressPanel.separationLabel.text=:
|
||||
ReportProgressPanel.initPathLabel.noFile=<html><u>No report file</u></html>
|
||||
ReportProgressPanel.start.cancelButton.text=Cancel
|
||||
ReportProgressPanel.start.progress.text=Starting report...
|
||||
ReportProgressPanel.complete.processLbl.text=Complete
|
||||
ReportProgressPanel.complete.processLb2.text=Completed with error
|
||||
ReportProgressPanel.complete.cancelButton.text=Complete
|
||||
ReportProgressPanel.cancel.cancelButton.toolTipText=Canceled
|
||||
ReportProgressPanel.cancel.procLbl.text=Canceled
|
||||
|
@ -2,3 +2,7 @@ OpenIDE-Module-Name=\u30ec\u30dd\u30fc\u30c8
|
||||
DefaultReportConfigurationPanel.infoLabel.text=\u3053\u306e\u30ec\u30dd\u30fc\u30c8\u306f\u6b21\u306e\u30b9\u30af\u30ea\u30fc\u30f3\u3067\u8a2d\u5b9a\u3055\u308c\u307e\u3059\u3002
|
||||
ReportBranding.defaultReportTitle.text=Autopsy\u30d5\u30a9\u30ec\u30f3\u30b8\u30c3\u30af\u30ec\u30dd\u30fc\u30c8
|
||||
ReportBranding.defaultReportFooter.text=Autopsy\u30aa\u30fc\u30d7\u30f3\u30bd\u30fc\u30b9\u30fb\u30c7\u30b8\u30bf\u30eb\u30fb\u30d5\u30a9\u30ec\u30f3\u30b8\u30c3\u30af\u30fb\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u306b\u3088\u308a\u63d0\u4f9b - www.sleuthkit.org
|
||||
ReportProgressPanel.pathLabel.text=\u30d1\u30b9\u30e9\u30d9\u30eb
|
||||
ReportProgressPanel.reportLabel.text=\u30ec\u30dd\u30fc\u30c8\u30e9\u30d9\u30eb
|
||||
ReportProgressPanel.statusMessageLabel.text=\u30d7\u30ed\u30bb\u30b7\u30f3\u30b0\u30e9\u30d9\u30eb
|
||||
ReportProgressPanel.separationLabel.text=:
|
||||
|
@ -63,7 +63,7 @@ public final class ReportBranding implements ReportBrandingProviderI {
|
||||
//initialize with extracting of resource files if needed, ensure 1 writer at a time
|
||||
synchronized (ReportBranding.class) {
|
||||
|
||||
reportsBrandingDir = PlatformUtil.getUserConfigDirectory() + File.separator + ReportGenerator.REPORTS_DIR + File.separator
|
||||
reportsBrandingDir = PlatformUtil.getUserConfigDirectory() + File.separator + ReportGenerator.getReportsDirectory() + File.separator
|
||||
+ "branding"; //NON-NLS
|
||||
File brandingDir = new File(reportsBrandingDir);
|
||||
if (!brandingDir.exists()) {
|
||||
|
@ -79,7 +79,7 @@
|
||||
</FontInfo>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/report/infrastructure/Bundle.properties" key="ReportProgressDialog.reportLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/report/Bundle.properties" key="ReportProgressPanel.reportLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
</Component>
|
||||
@ -91,7 +91,7 @@
|
||||
</FontInfo>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/report/infrastructure/Bundle.properties" key="ReportProgressDialog.pathLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/report/Bundle.properties" key="ReportProgressPanel.pathLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
<Property name="verticalAlignment" type="int" value="1"/>
|
||||
</Properties>
|
||||
@ -104,14 +104,14 @@
|
||||
</FontInfo>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/report/infrastructure/Bundle.properties" key="ReportProgressDialog.separationLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/report/Bundle.properties" key="ReportProgressPanel.separationLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="statusMessageLabel">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/report/infrastructure/Bundle.properties" key="ReportProgressDialog.statusMessageLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/report/Bundle.properties" key="ReportProgressPanel.statusMessageLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
</Component>
|
381
Core/src/org/sleuthkit/autopsy/report/ReportProgressPanel.java
Executable file → Normal file
381
Core/src/org/sleuthkit/autopsy/report/ReportProgressPanel.java
Executable file → Normal file
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2011-2019 Basis Technology Corp.
|
||||
* Copyright 2012-2019 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@ -18,23 +18,137 @@
|
||||
*/
|
||||
package org.sleuthkit.autopsy.report;
|
||||
|
||||
import org.openide.util.NbBundle;
|
||||
import java.awt.Color;
|
||||
import java.awt.Cursor;
|
||||
import java.awt.Desktop;
|
||||
import java.awt.EventQueue;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.awt.event.MouseListener;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.logging.Level;
|
||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||
|
||||
/**
|
||||
* This interface is necessary in order to not break backwards compatibility of
|
||||
* GeneralReportModule interface. See JIRA-5354.
|
||||
* A panel used by a report generation module to show progress.
|
||||
*/
|
||||
public interface ReportProgressPanel {
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
public class ReportProgressPanel extends javax.swing.JPanel {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
private static final Logger logger = Logger.getLogger(ReportProgressPanel.class.getName());
|
||||
private static final Color GREEN = new Color(50, 205, 50);
|
||||
private static final Color RED = new Color(178, 34, 34);
|
||||
private volatile ReportStatus status;
|
||||
|
||||
/**
|
||||
* Used by a report generation module to communicate report generation
|
||||
* status to this panel and its listeners.
|
||||
*/
|
||||
@NbBundle.Messages({
|
||||
"ReportProgressPanel.progress.queuing=Queuing...",
|
||||
"ReportProgressPanel.progress.running=Running...",
|
||||
"ReportProgressPanel.progress.complete=Complete",
|
||||
"ReportProgressPanel.progress.canceled=Canceled",
|
||||
"ReportProgressPanel.progress.error=Error",})
|
||||
public enum ReportStatus {
|
||||
|
||||
QUEUING,
|
||||
RUNNING,
|
||||
COMPLETE,
|
||||
CANCELED,
|
||||
ERROR
|
||||
QUEUING(Bundle.ReportProgressPanel_progress_queuing()),
|
||||
RUNNING(Bundle.ReportProgressPanel_progress_running()),
|
||||
COMPLETE(Bundle.ReportProgressPanel_progress_complete()),
|
||||
CANCELED(Bundle.ReportProgressPanel_progress_canceled()),
|
||||
ERROR(Bundle.ReportProgressPanel_progress_error());
|
||||
|
||||
private final String displayName;
|
||||
|
||||
ReportStatus(String displayName) {
|
||||
this.displayName = displayName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the display name of the report status.
|
||||
*
|
||||
* @return The display name.
|
||||
*/
|
||||
public String getDisplayName() {
|
||||
return displayName;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a panel used by report generation module to show progress.
|
||||
*/
|
||||
public ReportProgressPanel() {
|
||||
initComponents();
|
||||
reportProgressBar.setIndeterminate(true);
|
||||
reportProgressBar.setMaximum(100);
|
||||
statusMessageLabel.setText(Bundle.ReportProgressPanel_progress_queuing());
|
||||
status = ReportStatus.QUEUING;
|
||||
reportLabel.setText("");
|
||||
pathLabel.setText(""); //NON-NLS
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets label text.
|
||||
*
|
||||
* @param reportName The name of the report being generated.
|
||||
* @param reportPath The path to the report file.
|
||||
*/
|
||||
public final void setLabels(String reportName, String reportPath) {
|
||||
reportLabel.setText(reportName);
|
||||
if (null != reportPath) {
|
||||
pathLabel.setText("<html><u>" + shortenPath(reportPath) + "</u></html>"); //NON-NLS
|
||||
pathLabel.setToolTipText(reportPath);
|
||||
String linkPath = reportPath;
|
||||
pathLabel.addMouseListener(new MouseListener() {
|
||||
|
||||
@Override
|
||||
public void mouseClicked(MouseEvent mouseEvent) {
|
||||
/*
|
||||
* Do nothing for this event.
|
||||
*/
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mousePressed(MouseEvent mouseEvent) {
|
||||
/*
|
||||
* Do nothing for this event.
|
||||
*/
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mouseReleased(MouseEvent mouseEvent) {
|
||||
File file = new File(linkPath);
|
||||
try {
|
||||
Desktop.getDesktop().open(file);
|
||||
} catch (IOException ioex) {
|
||||
logger.log(Level.SEVERE, "Error opening report file", ioex);
|
||||
} catch (IllegalArgumentException iaEx) {
|
||||
logger.log(Level.SEVERE, "Error opening report file", iaEx);
|
||||
try {
|
||||
Desktop.getDesktop().open(file.getParentFile());
|
||||
} catch (IOException ioEx2) {
|
||||
logger.log(Level.SEVERE, "Error opening report file parent", ioEx2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mouseEntered(MouseEvent e3) {
|
||||
pathLabel.setForeground(Color.DARK_GRAY);
|
||||
setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mouseExited(MouseEvent e4) {
|
||||
pathLabel.setForeground(Color.BLACK);
|
||||
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
|
||||
}
|
||||
});
|
||||
} else {
|
||||
pathLabel.setText(NbBundle.getMessage(this.getClass(), "ReportProgressPanel.initPathLabel.noFile"));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -42,32 +156,66 @@ public interface ReportProgressPanel {
|
||||
*
|
||||
* @return The report generation status as a ReportStatus enum.
|
||||
*/
|
||||
public ReportStatus getStatus();
|
||||
public ReportStatus getStatus() {
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the current status of the generation of the report.
|
||||
*
|
||||
* @param status The current status.
|
||||
*/
|
||||
protected void setStatus(ReportStatus status) {
|
||||
this.status = status;
|
||||
}
|
||||
|
||||
/**
|
||||
* Starts the progress bar component of this panel.
|
||||
*/
|
||||
public void start();
|
||||
public void start() {
|
||||
EventQueue.invokeLater(() -> {
|
||||
statusMessageLabel.setText(NbBundle.getMessage(this.getClass(), "ReportProgressPanel.start.progress.text"));
|
||||
status = ReportStatus.RUNNING;
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the maximum value of the progress bar component of this panel.
|
||||
*
|
||||
* @param max The maximum value.
|
||||
*/
|
||||
public void setMaximumProgress(int max);
|
||||
public void setMaximumProgress(int max) {
|
||||
EventQueue.invokeLater(() -> {
|
||||
if (status != ReportStatus.CANCELED) {
|
||||
reportProgressBar.setMaximum(max);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Increments the current value of the progress bar component of this panel
|
||||
* by one unit.
|
||||
*/
|
||||
public void increment();
|
||||
public void increment() {
|
||||
EventQueue.invokeLater(() -> {
|
||||
if (status != ReportStatus.CANCELED) {
|
||||
reportProgressBar.setValue(reportProgressBar.getValue() + 1);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the current value of the progress bar component of this panel.
|
||||
*
|
||||
* @param value The value to be set.
|
||||
*/
|
||||
public void setProgress(int value);
|
||||
public void setProgress(int value) {
|
||||
EventQueue.invokeLater(() -> {
|
||||
if (status != ReportStatus.CANCELED) {
|
||||
reportProgressBar.setValue(value);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Changes the the progress bar component of this panel to be determinate or
|
||||
@ -76,7 +224,13 @@ public interface ReportProgressPanel {
|
||||
* @param indeterminate True if the progress bar should be set to
|
||||
* indeterminate.
|
||||
*/
|
||||
public void setIndeterminate(boolean indeterminate);
|
||||
public void setIndeterminate(boolean indeterminate) {
|
||||
EventQueue.invokeLater(() -> {
|
||||
if (status != ReportStatus.CANCELED) {
|
||||
reportProgressBar.setIndeterminate(indeterminate);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Changes the status message label component of this panel to show a given
|
||||
@ -85,7 +239,13 @@ public interface ReportProgressPanel {
|
||||
*
|
||||
* @param statusMessage String to use as label text.
|
||||
*/
|
||||
public void updateStatusLabel(String statusMessage);
|
||||
public void updateStatusLabel(String statusMessage) {
|
||||
EventQueue.invokeLater(() -> {
|
||||
if (status != ReportStatus.CANCELED) {
|
||||
statusMessageLabel.setText(statusMessage);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Makes the components of this panel indicate the final status of
|
||||
@ -93,7 +253,20 @@ public interface ReportProgressPanel {
|
||||
*
|
||||
* @param reportStatus The final status, must be COMPLETE or ERROR.
|
||||
*/
|
||||
public void complete(ReportStatus reportStatus);
|
||||
public void complete(ReportStatus reportStatus) {
|
||||
|
||||
switch (reportStatus) {
|
||||
case COMPLETE:
|
||||
complete(reportStatus, NbBundle.getMessage(this.getClass(), "ReportProgressPanel.complete.processLbl.text"));
|
||||
break;
|
||||
case ERROR:
|
||||
complete(reportStatus, NbBundle.getMessage(this.getClass(), "ReportProgressPanel.complete.processLb2.text"));
|
||||
break;
|
||||
default:
|
||||
complete(reportStatus, "");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Makes the components of this panel indicate the final status of
|
||||
@ -102,7 +275,174 @@ public interface ReportProgressPanel {
|
||||
* @param reportStatus The final status, must be COMPLETE or ERROR.
|
||||
* @param statusMessage String to use as label or error text.
|
||||
*/
|
||||
public void complete(ReportStatus reportStatus, String statusMessage);
|
||||
public void complete(ReportStatus reportStatus, String statusMessage) {
|
||||
EventQueue.invokeLater(() -> {
|
||||
reportProgressBar.setIndeterminate(false);
|
||||
if (status != ReportStatus.CANCELED) {
|
||||
switch (reportStatus) {
|
||||
case COMPLETE: {
|
||||
ReportStatus oldValue = status;
|
||||
status = ReportStatus.COMPLETE;
|
||||
statusMessageLabel.setForeground(Color.BLACK);
|
||||
statusMessageLabel.setText(statusMessage);
|
||||
reportProgressBar.setValue(reportProgressBar.getMaximum());
|
||||
reportProgressBar.setStringPainted(true);
|
||||
reportProgressBar.setForeground(GREEN);
|
||||
reportProgressBar.setString(ReportStatus.COMPLETE.getDisplayName());
|
||||
firePropertyChange(ReportStatus.COMPLETE.toString(), oldValue, status);
|
||||
break;
|
||||
}
|
||||
case ERROR: {
|
||||
ReportStatus oldValue = status;
|
||||
status = ReportStatus.ERROR;
|
||||
statusMessageLabel.setForeground(RED);
|
||||
statusMessageLabel.setText(statusMessage);
|
||||
reportProgressBar.setValue(reportProgressBar.getMaximum());
|
||||
reportProgressBar.setStringPainted(true);
|
||||
reportProgressBar.setForeground(RED);
|
||||
reportProgressBar.setString(ReportStatus.ERROR.getDisplayName());
|
||||
firePropertyChange(ReportStatus.COMPLETE.toString(), oldValue, status);
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Makes the components of this panel indicate generation of the report was
|
||||
* cancelled.
|
||||
*/
|
||||
public void cancel() {
|
||||
switch (status) {
|
||||
case COMPLETE:
|
||||
break;
|
||||
case CANCELED:
|
||||
break;
|
||||
case ERROR:
|
||||
break;
|
||||
default:
|
||||
ReportStatus oldValue = status;
|
||||
status = ReportStatus.CANCELED;
|
||||
reportProgressBar.setIndeterminate(false);
|
||||
reportProgressBar.setValue(0);
|
||||
reportProgressBar.setStringPainted(true);
|
||||
reportProgressBar.setForeground(RED); // Red
|
||||
reportProgressBar.setString(ReportStatus.CANCELED.getDisplayName());
|
||||
firePropertyChange(ReportStatus.CANCELED.toString(), oldValue, status);
|
||||
statusMessageLabel.setForeground(RED);
|
||||
statusMessageLabel.setText(NbBundle.getMessage(this.getClass(), "ReportProgressPanel.cancel.procLbl.text"));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a shortened version of a file path.
|
||||
*
|
||||
* @param path The path to shorten.
|
||||
*
|
||||
* @return The shortened path.
|
||||
*/
|
||||
private String shortenPath(String path) {
|
||||
if (path.length() > 100) {
|
||||
return path.substring(0, 10 + path.substring(10).indexOf(File.separator) + 1) + "..."
|
||||
+ path.substring((path.length() - 70) + path.substring(path.length() - 70).indexOf(File.separator));
|
||||
} else {
|
||||
return path;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This method is called from within the constructor to initialize the form.
|
||||
* WARNING: Do NOT modify this code. The content of this method is always
|
||||
* regenerated by the Form Editor.
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
|
||||
private void initComponents() {
|
||||
|
||||
reportProgressBar = new javax.swing.JProgressBar();
|
||||
reportLabel = new javax.swing.JLabel();
|
||||
pathLabel = new javax.swing.JLabel();
|
||||
separationLabel = new javax.swing.JLabel();
|
||||
statusMessageLabel = new javax.swing.JLabel();
|
||||
|
||||
setFont(getFont().deriveFont(getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
||||
setMinimumSize(new java.awt.Dimension(486, 68));
|
||||
|
||||
reportProgressBar.setFont(reportProgressBar.getFont().deriveFont(reportProgressBar.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
||||
|
||||
reportLabel.setFont(reportLabel.getFont().deriveFont(reportLabel.getFont().getStyle() | java.awt.Font.BOLD, 11));
|
||||
org.openide.awt.Mnemonics.setLocalizedText(reportLabel, org.openide.util.NbBundle.getMessage(ReportProgressPanel.class, "ReportProgressPanel.reportLabel.text")); // NOI18N
|
||||
|
||||
pathLabel.setFont(pathLabel.getFont().deriveFont(pathLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
||||
org.openide.awt.Mnemonics.setLocalizedText(pathLabel, org.openide.util.NbBundle.getMessage(ReportProgressPanel.class, "ReportProgressPanel.pathLabel.text")); // NOI18N
|
||||
pathLabel.setVerticalAlignment(javax.swing.SwingConstants.TOP);
|
||||
|
||||
separationLabel.setFont(separationLabel.getFont().deriveFont(separationLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
||||
org.openide.awt.Mnemonics.setLocalizedText(separationLabel, org.openide.util.NbBundle.getMessage(ReportProgressPanel.class, "ReportProgressPanel.separationLabel.text")); // NOI18N
|
||||
|
||||
org.openide.awt.Mnemonics.setLocalizedText(statusMessageLabel, org.openide.util.NbBundle.getMessage(ReportProgressPanel.class, "ReportProgressPanel.statusMessageLabel.text")); // NOI18N
|
||||
|
||||
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
|
||||
this.setLayout(layout);
|
||||
layout.setHorizontalGroup(
|
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(statusMessageLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.addComponent(reportProgressBar, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addComponent(reportLabel)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(separationLabel)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(pathLabel, javax.swing.GroupLayout.DEFAULT_SIZE, 548, Short.MAX_VALUE)))
|
||||
.addContainerGap())
|
||||
);
|
||||
layout.setVerticalGroup(
|
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addComponent(reportProgressBar, javax.swing.GroupLayout.PREFERRED_SIZE, 16, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||
.addComponent(reportLabel)
|
||||
.addComponent(pathLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.addComponent(separationLabel))
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(statusMessageLabel)
|
||||
.addGap(13, 13, 13))
|
||||
);
|
||||
}// </editor-fold>//GEN-END:initComponents
|
||||
|
||||
|
||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||
private javax.swing.JLabel pathLabel;
|
||||
private javax.swing.JLabel reportLabel;
|
||||
private javax.swing.JProgressBar reportProgressBar;
|
||||
private javax.swing.JLabel separationLabel;
|
||||
private javax.swing.JLabel statusMessageLabel;
|
||||
// End of variables declaration//GEN-END:variables
|
||||
|
||||
/**
|
||||
* Constructs a panel used by a report generation module to show progress.
|
||||
*
|
||||
* @param reportName The report name.
|
||||
* @param reportPath The report path.
|
||||
*
|
||||
* @deprecated Use {@link #ReportProgressPanel()} and {@link #setLabels()}
|
||||
* instead.
|
||||
*/
|
||||
@Deprecated
|
||||
public ReportProgressPanel(String reportName, String reportPath) {
|
||||
this();
|
||||
setLabels(reportName, reportPath);
|
||||
}
|
||||
|
||||
/**
|
||||
* Makes the components of this panel indicate the generation of the report
|
||||
@ -111,5 +451,8 @@ public interface ReportProgressPanel {
|
||||
* @deprecated Use {@link #complete(ReportStatus)}
|
||||
*/
|
||||
@Deprecated
|
||||
public void complete();
|
||||
public void complete() {
|
||||
complete(ReportStatus.COMPLETE);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -6,10 +6,6 @@ ReportWizardFileOptionsVisualPanel.selectAllButton.text=Select All
|
||||
ReportWizardPortableCaseOptionsVisualPanel.errorLabel.text=Windows only
|
||||
ReportWizardPortableCaseOptionsVisualPanel.compressCheckbox.toolTipText=
|
||||
ReportWizardPortableCaseOptionsVisualPanel.compressCheckbox.text=Package case into an archive:
|
||||
ReportProgressDialog.reportLabel.text=reportLabel
|
||||
ReportProgressDialog.statusMessageLabel.text=processingLabel
|
||||
ReportProgressDialog.separationLabel.text=:
|
||||
ReportProgressDialog.pathLabel.text=pathLabel
|
||||
PortableCaseTagsListPanel.jAllTagsCheckBox.text=All Tagged Results
|
||||
PortableCaseTagsListPanel.deselectButton.text=Deselect All
|
||||
PortableCaseTagsListPanel.selectButton.text=Select All
|
||||
@ -151,15 +147,6 @@ ReportGenerator.artTableColHdr.localPath=Local path
|
||||
ReportGenerator.artTableColHdr.remotePath=Remote path
|
||||
ReportGenerator.errors.reportErrorTitle=Error generating report
|
||||
ReportGenerator.errors.reportErrorText=Error generating report:
|
||||
ReportProgressDialog.progress.queuing=Queuing...
|
||||
ReportProgressDialog.initPathLabel.noFile=<html><u>No report file</u></html>
|
||||
ReportProgressDialog.start.cancelButton.text=Cancel
|
||||
ReportProgressDialog.start.progress.text=Starting report...
|
||||
ReportProgressDialog.complete.processLbl.text=Complete
|
||||
ReportProgressDialog.complete.processLb2.text=Completed with error
|
||||
ReportProgressDialog.complete.cancelButton.text=Complete
|
||||
ReportProgressDialog.cancel.cancelButton.toolTipText=Canceled
|
||||
ReportProgressDialog.cancel.procLbl.text=Canceled
|
||||
ReportVisualPanel1.getName.text=Select and Configure Report Modules
|
||||
ReportVisualPanel2.getName.text=Configure Report
|
||||
ReportWizardAction.actionName.text=Generate Report
|
||||
|
@ -9,16 +9,18 @@ PortableCaseTagsListPanel.error.noOpenCase=There is no case open
|
||||
ReportGenerator.artTableColHdr.comment=Comment
|
||||
ReportGenerator.errList.noOpenCase=No open case available.
|
||||
ReportGenerator.tagTable.header.userName=User Name
|
||||
ReportProgressIndicator.cancelledMessage=Report generation cancelled
|
||||
ReportProgressIndicator.completedMessage=Report generation completed
|
||||
ReportProgressIndicator.completedWithErrorsMessage=Report generation completed with errors
|
||||
ReportProgressIndicator.startMessage=Report generation started
|
||||
ReportProgressIndicator.switchToDeterminateMessage=Report generation progress switched to determinate
|
||||
ReportProgressIndicator.switchToIndeterminateMessage=Report generation progress switched to indeterminate
|
||||
ReportWizardFileOptionsVisualPanel.jLabel1.text=Select items to include in File Report:
|
||||
ReportWizardFileOptionsVisualPanel.deselectAllButton.text=Deselect All
|
||||
ReportWizardFileOptionsVisualPanel.selectAllButton.text=Select All
|
||||
ReportWizardPortableCaseOptionsVisualPanel.errorLabel.text=Windows only
|
||||
ReportWizardPortableCaseOptionsVisualPanel.compressCheckbox.toolTipText=
|
||||
ReportWizardPortableCaseOptionsVisualPanel.compressCheckbox.text=Package case into an archive:
|
||||
ReportProgressDialog.reportLabel.text=reportLabel
|
||||
ReportProgressDialog.statusMessageLabel.text=processingLabel
|
||||
ReportProgressDialog.separationLabel.text=:
|
||||
ReportProgressDialog.pathLabel.text=pathLabel
|
||||
PortableCaseTagsListPanel.jAllTagsCheckBox.text=All Tagged Results
|
||||
PortableCaseTagsListPanel.deselectButton.text=Deselect All
|
||||
PortableCaseTagsListPanel.selectButton.text=Select All
|
||||
@ -160,15 +162,6 @@ ReportGenerator.artTableColHdr.localPath=Local path
|
||||
ReportGenerator.artTableColHdr.remotePath=Remote path
|
||||
ReportGenerator.errors.reportErrorTitle=Error generating report
|
||||
ReportGenerator.errors.reportErrorText=Error generating report:
|
||||
ReportProgressDialog.progress.queuing=Queuing...
|
||||
ReportProgressDialog.initPathLabel.noFile=<html><u>No report file</u></html>
|
||||
ReportProgressDialog.start.cancelButton.text=Cancel
|
||||
ReportProgressDialog.start.progress.text=Starting report...
|
||||
ReportProgressDialog.complete.processLbl.text=Complete
|
||||
ReportProgressDialog.complete.processLb2.text=Completed with error
|
||||
ReportProgressDialog.complete.cancelButton.text=Complete
|
||||
ReportProgressDialog.cancel.cancelButton.toolTipText=Canceled
|
||||
ReportProgressDialog.cancel.procLbl.text=Canceled
|
||||
ReportVisualPanel1.getName.text=Select and Configure Report Modules
|
||||
ReportVisualPanel2.getName.text=Configure Report
|
||||
ReportWizardAction.actionName.text=Generate Report
|
||||
|
@ -2,10 +2,6 @@ CTL_ReportWizardAction=\u30ec\u30dd\u30fc\u30c8\u3092\u5b9f\u884c
|
||||
ReportWizardFileOptionsVisualPanel.selectAllButton.text=\u5168\u3066\u9078\u629e
|
||||
ReportWizardFileOptionsVisualPanel.jLabel1.text=\u30d5\u30a1\u30a4\u30eb\u30ec\u30dd\u30fc\u30c8\u306b\u542b\u3081\u308b\u30a2\u30a4\u30c6\u30e0\u3092\u9078\u629e\u3057\u3066\u4e0b\u3055\u3044\uff1a
|
||||
ReportWizardFileOptionsVisualPanel.deselectAllButton.text=\u5168\u3066\u9078\u629e\u89e3\u9664
|
||||
ReportProgressDialog.pathLabel.text=\u30d1\u30b9\u30e9\u30d9\u30eb
|
||||
ReportProgressDialog.reportLabel.text=\u30ec\u30dd\u30fc\u30c8\u30e9\u30d9\u30eb
|
||||
ReportProgressDialog.statusMessageLabel.text=\u30d7\u30ed\u30bb\u30b7\u30f3\u30b0\u30e9\u30d9\u30eb
|
||||
ReportProgressDialog.separationLabel.text=:
|
||||
ReportGenerationPanel.closeButton.text=\u9589\u3058\u308b
|
||||
ReportGenerationPanel.cancelButton.actionCommand=\u30ad\u30e3\u30f3\u30bb\u30eb
|
||||
ReportGenerationPanel.cancelButton.text=\u30ad\u30e3\u30f3\u30bb\u30eb
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2011-2018 Basis Technology Corp.
|
||||
* Copyright 2012-2018 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@ -25,21 +25,21 @@ import javax.swing.Box;
|
||||
import javax.swing.JOptionPane;
|
||||
import javax.swing.SwingUtilities;
|
||||
import org.openide.util.NbBundle;
|
||||
import org.sleuthkit.autopsy.report.ReportProgressPanel;
|
||||
import org.sleuthkit.autopsy.report.ReportProgressPanel.ReportStatus;
|
||||
import org.sleuthkit.autopsy.report.ReportProgressPanel;
|
||||
|
||||
/**
|
||||
* A panel that displays a panel used by a report generation module to show
|
||||
* progress. It provides OK and Cancel buttons.
|
||||
*/
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
class ReportGenerationPanel extends javax.swing.JPanel {
|
||||
final class ReportGenerationPanel extends javax.swing.JPanel {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
private final GridBagConstraints constraints;
|
||||
private final Component glue;
|
||||
private ActionListener actionListener;
|
||||
ReportProgressDialog progressPanel;
|
||||
private final ReportProgressPanel progressPanel;
|
||||
|
||||
/**
|
||||
* Constructs a panel that displays a panel used by a report generation
|
||||
@ -54,10 +54,10 @@ class ReportGenerationPanel extends javax.swing.JPanel {
|
||||
constraints.gridy = 0;
|
||||
constraints.weightx = 1.0;
|
||||
glue = Box.createVerticalGlue();
|
||||
progressPanel = new ReportProgressDialog();
|
||||
progressPanel = new ReportProgressPanel();
|
||||
}
|
||||
|
||||
ReportProgressDialog getProgressPanel() {
|
||||
ReportProgressPanel getProgressPanel() {
|
||||
return progressPanel;
|
||||
}
|
||||
|
||||
|
@ -41,7 +41,6 @@ import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.logging.Level;
|
||||
import javax.swing.JDialog;
|
||||
import javax.swing.JFrame;
|
||||
import org.openide.filesystems.FileUtil;
|
||||
import org.openide.util.NbBundle;
|
||||
import org.openide.windows.WindowManager;
|
||||
@ -55,24 +54,33 @@ import org.sleuthkit.datamodel.SleuthkitCase;
|
||||
import org.sleuthkit.datamodel.TskCoreException;
|
||||
import org.sleuthkit.datamodel.TskData;
|
||||
|
||||
/**
|
||||
* A report generator that generates one or more reports by running
|
||||
* user-selected report modules.
|
||||
*/
|
||||
public class ReportGenerator {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(ReportGenerator.class.getName());
|
||||
|
||||
private ReportProgressPanel progressPanel = null;
|
||||
private ReportGenerationPanel reportGenerationPanel = null;
|
||||
|
||||
private final ReportProgressPanel progressIndicator;
|
||||
private final ReportGenerationPanel reportGenerationPanel;
|
||||
private static final String REPORT_PATH_FMT_STR = "%s" + File.separator + "%s %s %s" + File.separator;
|
||||
|
||||
private final String configName;
|
||||
|
||||
public static final String REPORTS_DIR = "Reports"; //NON-NLS
|
||||
|
||||
private List<String> errorList;
|
||||
private static final String REPORTS_DIR = "Reports"; //NON-NLS
|
||||
private List<String> errorList = new ArrayList<>();
|
||||
|
||||
/**
|
||||
* Displays the list of errors during report generation in user-friendly
|
||||
* way.
|
||||
* Gets the name of the reports directory within the case direcotry
|
||||
* hierarchy.
|
||||
*
|
||||
* @return The directory name.
|
||||
*/
|
||||
public static String getReportsDirectory() {
|
||||
return REPORTS_DIR;
|
||||
}
|
||||
|
||||
/**
|
||||
* Displays a list of errors emitted by report modules during report
|
||||
* generation using this report generator's report progress indicator.
|
||||
*/
|
||||
private void displayReportErrors() {
|
||||
if (!errorList.isEmpty()) {
|
||||
@ -80,41 +88,41 @@ public class ReportGenerator {
|
||||
for (String error : errorList) {
|
||||
errorString += error + "\n";
|
||||
}
|
||||
progressPanel.updateStatusLabel(errorString);
|
||||
progressIndicator.updateStatusLabel(errorString);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a report generator. This constructor uses a logger instead of UI
|
||||
* panel.
|
||||
* Constructs a report generator that generates one or more reports by
|
||||
* running user-selected report modules and uses a report progress indicator
|
||||
* to display progress.
|
||||
*
|
||||
* @param configName Name of the reporting configuration to use
|
||||
* @param progress Fully instantiated progress logger
|
||||
* @param configName The name of the reporting configuration to use.
|
||||
* @param progressIndicator The report progress indicator.
|
||||
*/
|
||||
public ReportGenerator(String configName, ReportProgressLogger progress) {
|
||||
this.errorList = new ArrayList<>();
|
||||
this.progressPanel = progress;
|
||||
public ReportGenerator(String configName, ReportProgressIndicator progressIndicator) {
|
||||
this.progressIndicator = progressIndicator;
|
||||
this.reportGenerationPanel = null;
|
||||
this.configName = configName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a report generator. This constructor uses UI panel to display
|
||||
* progress.
|
||||
* Constructs a report generator that generates one or more reports by
|
||||
* running user-selected report modules and uses a report generation panel
|
||||
* to display progress.
|
||||
*
|
||||
* @param configName Name of the reporting configuration to use
|
||||
* @param panel Fully instantiated progress panel
|
||||
* @param configName The name of the reporting configuration to use.
|
||||
* @param panel The report generation panel.
|
||||
*/
|
||||
public ReportGenerator(String configName, ReportGenerationPanel panel) {
|
||||
this.errorList = new ArrayList<>();
|
||||
ReportGenerator(String configName, ReportGenerationPanel panel) {
|
||||
this.reportGenerationPanel = panel;
|
||||
this.progressPanel = panel.getProgressPanel();
|
||||
this.progressIndicator = panel.getProgressPanel();
|
||||
this.configName = configName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate reports according to previously specified reporting
|
||||
* configuration.
|
||||
* Generates the reports specified by the reporting configuration passed in
|
||||
* via the constructor.
|
||||
*/
|
||||
public void generateReports() {
|
||||
ReportingConfig config = null;
|
||||
@ -122,13 +130,13 @@ public class ReportGenerator {
|
||||
config = ReportingConfigLoader.loadConfig(configName);
|
||||
} catch (ReportConfigException ex) {
|
||||
logger.log(Level.SEVERE, "Unable to load reporting configuration " + configName + ". Exiting", ex);
|
||||
progressPanel.updateStatusLabel("Unable to load reporting configuration " + configName + ". Exiting");
|
||||
progressIndicator.updateStatusLabel("Unable to load reporting configuration " + configName + ". Exiting");
|
||||
return;
|
||||
}
|
||||
|
||||
if (config == null) {
|
||||
logger.log(Level.SEVERE, "Unable to load reporting configuration {0}. Exiting", configName);
|
||||
progressPanel.updateStatusLabel("Unable to load reporting configuration " + configName + ". Exiting");
|
||||
progressIndicator.updateStatusLabel("Unable to load reporting configuration " + configName + ". Exiting");
|
||||
return;
|
||||
}
|
||||
|
||||
@ -162,7 +170,7 @@ public class ReportGenerator {
|
||||
ReportModule module = modules.get(moduleName);
|
||||
if (module == null) {
|
||||
logger.log(Level.SEVERE, "Report module {0} not found", moduleName);
|
||||
progressPanel.updateStatusLabel("Report module " + moduleName + " not found");
|
||||
progressIndicator.updateStatusLabel("Report module " + moduleName + " not found");
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -189,7 +197,7 @@ public class ReportGenerator {
|
||||
TableReportSettings tableSettings = config.getTableReportSettings();
|
||||
if (tableSettings == null) {
|
||||
logger.log(Level.SEVERE, "No table report settings for report module {0}", moduleName);
|
||||
progressPanel.updateStatusLabel("No table report settings for report module " + moduleName);
|
||||
progressIndicator.updateStatusLabel("No table report settings for report module " + moduleName);
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -201,7 +209,7 @@ public class ReportGenerator {
|
||||
FileReportSettings fileSettings = config.getFileReportSettings();
|
||||
if (fileSettings == null) {
|
||||
logger.log(Level.SEVERE, "No file report settings for report module {0}", moduleName);
|
||||
progressPanel.updateStatusLabel("No file report settings for report module " + moduleName);
|
||||
progressIndicator.updateStatusLabel("No file report settings for report module " + moduleName);
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -213,7 +221,7 @@ public class ReportGenerator {
|
||||
settings = new PortableCaseReportModuleSettings();
|
||||
} else if (!(settings instanceof PortableCaseReportModuleSettings)) {
|
||||
logger.log(Level.SEVERE, "Invalid settings for report module {0}", moduleName);
|
||||
progressPanel.updateStatusLabel("Invalid settings for report module " + moduleName);
|
||||
progressIndicator.updateStatusLabel("Invalid settings for report module " + moduleName);
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -221,12 +229,11 @@ public class ReportGenerator {
|
||||
|
||||
} else {
|
||||
logger.log(Level.SEVERE, "Report module {0} has unsupported report module type", moduleName);
|
||||
progressPanel.updateStatusLabel("Report module " + moduleName + " has unsupported report module type");
|
||||
continue;
|
||||
progressIndicator.updateStatusLabel("Report module " + moduleName + " has unsupported report module type");
|
||||
}
|
||||
} catch (IOException e) {
|
||||
logger.log(Level.SEVERE, "Exception while running report module {0}: {1}", new Object[]{moduleName, e.getMessage()});
|
||||
progressPanel.updateStatusLabel("Exception while running report module " + moduleName);
|
||||
progressIndicator.updateStatusLabel("Exception while running report module " + moduleName);
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
@ -244,7 +251,7 @@ public class ReportGenerator {
|
||||
return;
|
||||
}
|
||||
|
||||
final JDialog dialog = new JDialog((JFrame) WindowManager.getDefault().getMainWindow(), true);
|
||||
final JDialog dialog = new JDialog(WindowManager.getDefault().getMainWindow(), true);
|
||||
dialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
|
||||
dialog.setTitle(NbBundle.getMessage(this.getClass(), "ReportGenerator.displayProgress.title.text"));
|
||||
dialog.add(this.reportGenerationPanel);
|
||||
@ -275,7 +282,7 @@ public class ReportGenerator {
|
||||
if (generalReportModule != null) {
|
||||
String reportDir = createReportDirectory(generalReportModule);
|
||||
setupProgressPanel(generalReportModule, reportDir);
|
||||
generalReportModule.generateReport(reportDir, progressPanel);
|
||||
generalReportModule.generateReport(reportDir, progressIndicator);
|
||||
}
|
||||
}
|
||||
|
||||
@ -290,11 +297,11 @@ public class ReportGenerator {
|
||||
String reportDir = createReportDirectory(tableReport);
|
||||
setupProgressPanel(tableReport, reportDir);
|
||||
tableReport.startReport(reportDir);
|
||||
TableReportGenerator generator = new TableReportGenerator(tableReportSettings, progressPanel, tableReport);
|
||||
TableReportGenerator generator = new TableReportGenerator(tableReportSettings, progressIndicator, tableReport);
|
||||
generator.execute();
|
||||
tableReport.endReport();
|
||||
// finish progress, wrap up
|
||||
progressPanel.complete(ReportProgressPanel.ReportStatus.COMPLETE);
|
||||
progressIndicator.complete(ReportProgressPanel.ReportStatus.COMPLETE);
|
||||
errorList = generator.getErrorList();
|
||||
}
|
||||
}
|
||||
@ -315,34 +322,34 @@ public class ReportGenerator {
|
||||
}
|
||||
}
|
||||
setupProgressPanel(fileReportModule, reportDir);
|
||||
if (progressPanel.getStatus() != ReportStatus.CANCELED) {
|
||||
progressPanel.start();
|
||||
progressPanel.updateStatusLabel(
|
||||
if (progressIndicator.getStatus() != ReportStatus.CANCELED) {
|
||||
progressIndicator.start();
|
||||
progressIndicator.updateStatusLabel(
|
||||
NbBundle.getMessage(this.getClass(), "ReportGenerator.progress.queryingDb.text"));
|
||||
}
|
||||
|
||||
List<AbstractFile> files = getFiles();
|
||||
int numFiles = files.size();
|
||||
if (progressPanel.getStatus() != ReportStatus.CANCELED) {
|
||||
if (progressIndicator.getStatus() != ReportStatus.CANCELED) {
|
||||
fileReportModule.startReport(reportDir);
|
||||
fileReportModule.startTable(enabled);
|
||||
}
|
||||
progressPanel.setIndeterminate(false);
|
||||
progressPanel.setMaximumProgress(numFiles);
|
||||
progressIndicator.setIndeterminate(false);
|
||||
progressIndicator.setMaximumProgress(numFiles);
|
||||
|
||||
int i = 0;
|
||||
// Add files to report.
|
||||
for (AbstractFile file : files) {
|
||||
// Check to see if any reports have been cancelled.
|
||||
if (progressPanel.getStatus() == ReportStatus.CANCELED) {
|
||||
if (progressIndicator.getStatus() == ReportStatus.CANCELED) {
|
||||
return;
|
||||
} else {
|
||||
fileReportModule.addRow(file, enabled);
|
||||
progressPanel.increment();
|
||||
progressIndicator.increment();
|
||||
}
|
||||
|
||||
if ((i % 100) == 0) {
|
||||
progressPanel.updateStatusLabel(
|
||||
progressIndicator.updateStatusLabel(
|
||||
NbBundle.getMessage(this.getClass(), "ReportGenerator.progress.processingFile.text",
|
||||
file.getName()));
|
||||
}
|
||||
@ -351,7 +358,7 @@ public class ReportGenerator {
|
||||
|
||||
fileReportModule.endTable();
|
||||
fileReportModule.endReport();
|
||||
progressPanel.complete(ReportStatus.COMPLETE);
|
||||
progressIndicator.complete(ReportStatus.COMPLETE);
|
||||
}
|
||||
}
|
||||
|
||||
@ -362,7 +369,7 @@ public class ReportGenerator {
|
||||
if (portableCaseReportModule != null) {
|
||||
String reportDir = createReportDirectory(portableCaseReportModule);
|
||||
setupProgressPanel(portableCaseReportModule, reportDir);
|
||||
portableCaseReportModule.generateReport(reportDir, settings, progressPanel);
|
||||
portableCaseReportModule.generateReport(reportDir, settings, progressIndicator);
|
||||
}
|
||||
}
|
||||
|
||||
@ -378,7 +385,7 @@ public class ReportGenerator {
|
||||
absFiles = skCase.findAllFilesWhere("meta_type != " + TskData.TSK_FS_META_TYPE_ENUM.TSK_FS_META_TYPE_DIR.getValue()); //NON-NLS
|
||||
return absFiles;
|
||||
} catch (TskCoreException | NoCurrentCaseException ex) {
|
||||
progressPanel.updateStatusLabel(NbBundle.getMessage(this.getClass(), "ReportGenerator.errors.reportErrorText") + ex.getLocalizedMessage());
|
||||
progressIndicator.updateStatusLabel(NbBundle.getMessage(this.getClass(), "ReportGenerator.errors.reportErrorText") + ex.getLocalizedMessage());
|
||||
logger.log(Level.SEVERE, "failed to generate reports. Unable to get all files in the image.", ex); //NON-NLS
|
||||
return Collections.<AbstractFile>emptyList();
|
||||
}
|
||||
|
@ -1,405 +0,0 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2011-2019 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.report.infrastructure;
|
||||
|
||||
import org.openide.util.NbBundle;
|
||||
import java.awt.Color;
|
||||
import java.awt.Cursor;
|
||||
import java.awt.Desktop;
|
||||
import java.awt.EventQueue;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.awt.event.MouseListener;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.logging.Level;
|
||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||
import org.sleuthkit.autopsy.report.ReportProgressPanel;
|
||||
|
||||
/**
|
||||
* A panel used by a report generation module to show progress.
|
||||
*/
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
class ReportProgressDialog extends javax.swing.JPanel implements ReportProgressPanel {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
private static final Logger logger = Logger.getLogger(ReportProgressDialog.class.getName());
|
||||
private static final Color GREEN = new Color(50, 205, 50);
|
||||
private static final Color RED = new Color(178, 34, 34);
|
||||
private volatile ReportProgressPanel.ReportStatus status;
|
||||
|
||||
/**
|
||||
* Constructs a panel used by report generation module to show progress.
|
||||
*/
|
||||
ReportProgressDialog() {
|
||||
initComponents();
|
||||
reportProgressBar.setIndeterminate(true);
|
||||
reportProgressBar.setMaximum(100);
|
||||
statusMessageLabel.setText(NbBundle.getMessage(this.getClass(), "ReportProgressDialog.progress.queuing"));
|
||||
status = ReportStatus.QUEUING;
|
||||
reportLabel.setText("");
|
||||
pathLabel.setText(""); //NON-NLS
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets label text.
|
||||
*
|
||||
* @param reportName The name of the report being generated.
|
||||
* @param reportPath The path to the report file.
|
||||
*/
|
||||
void setLabels(String reportName, String reportPath) {
|
||||
reportLabel.setText(reportName);
|
||||
if (null != reportPath) {
|
||||
pathLabel.setText("<html><u>" + shortenPath(reportPath) + "</u></html>"); //NON-NLS
|
||||
pathLabel.setToolTipText(reportPath);
|
||||
String linkPath = reportPath;
|
||||
pathLabel.addMouseListener(new MouseListener() {
|
||||
|
||||
@Override
|
||||
public void mouseClicked(MouseEvent mouseEvent) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mousePressed(MouseEvent mouseEvent) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mouseReleased(MouseEvent mouseEvent) {
|
||||
File file = new File(linkPath);
|
||||
try {
|
||||
Desktop.getDesktop().open(file);
|
||||
} catch (IOException ioex) {
|
||||
logger.log(Level.SEVERE, "Error opening report file", ioex);
|
||||
} catch (IllegalArgumentException iaEx) {
|
||||
logger.log(Level.SEVERE, "Error opening report file", iaEx);
|
||||
try {
|
||||
Desktop.getDesktop().open(file.getParentFile());
|
||||
} catch (IOException ioEx2) {
|
||||
logger.log(Level.SEVERE, "Error opening report file parent", ioEx2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mouseEntered(MouseEvent e3) {
|
||||
pathLabel.setForeground(Color.DARK_GRAY);
|
||||
setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mouseExited(MouseEvent e4) {
|
||||
pathLabel.setForeground(Color.BLACK);
|
||||
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
|
||||
}
|
||||
});
|
||||
} else {
|
||||
pathLabel.setText(NbBundle.getMessage(this.getClass(), "ReportProgressDialog.initPathLabel.noFile"));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the current status of the generation of the report.
|
||||
*
|
||||
* @return The report generation status as a ReportStatus enum.
|
||||
*/
|
||||
@Override
|
||||
public ReportStatus getStatus() {
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* Starts the progress bar component of this panel.
|
||||
*/
|
||||
@Override
|
||||
public void start() {
|
||||
EventQueue.invokeLater(() -> {
|
||||
statusMessageLabel.setText(NbBundle.getMessage(this.getClass(), "ReportProgressDialog.start.progress.text"));
|
||||
status = ReportStatus.RUNNING;
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the maximum value of the progress bar component of this panel.
|
||||
*
|
||||
* @param max The maximum value.
|
||||
*/
|
||||
@Override
|
||||
public void setMaximumProgress(int max) {
|
||||
EventQueue.invokeLater(() -> {
|
||||
if (status != ReportStatus.CANCELED) {
|
||||
reportProgressBar.setMaximum(max);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Increments the current value of the progress bar component of this panel
|
||||
* by one unit.
|
||||
*/
|
||||
@Override
|
||||
public void increment() {
|
||||
EventQueue.invokeLater(() -> {
|
||||
if (status != ReportStatus.CANCELED) {
|
||||
reportProgressBar.setValue(reportProgressBar.getValue() + 1);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the current value of the progress bar component of this panel.
|
||||
*
|
||||
* @param value The value to be set.
|
||||
*/
|
||||
@Override
|
||||
public void setProgress(int value) {
|
||||
EventQueue.invokeLater(() -> {
|
||||
if (status != ReportStatus.CANCELED) {
|
||||
reportProgressBar.setValue(value);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Changes the the progress bar component of this panel to be determinate or
|
||||
* indeterminate.
|
||||
*
|
||||
* @param indeterminate True if the progress bar should be set to
|
||||
* indeterminate.
|
||||
*/
|
||||
@Override
|
||||
public void setIndeterminate(boolean indeterminate) {
|
||||
EventQueue.invokeLater(() -> {
|
||||
if (status != ReportStatus.CANCELED) {
|
||||
reportProgressBar.setIndeterminate(indeterminate);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Changes the status message label component of this panel to show a given
|
||||
* processing status message. For example, updateStatusLabel("Now processing
|
||||
* files...") sets the label text to "Now processing files..."
|
||||
*
|
||||
* @param statusMessage String to use as label text.
|
||||
*/
|
||||
@Override
|
||||
public void updateStatusLabel(String statusMessage) {
|
||||
EventQueue.invokeLater(() -> {
|
||||
if (status != ReportStatus.CANCELED) {
|
||||
statusMessageLabel.setText(statusMessage);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Makes the components of this panel indicate the final status of
|
||||
* generation of the report.
|
||||
*
|
||||
* @param reportStatus The final status, must be COMPLETE or ERROR.
|
||||
*/
|
||||
@Override
|
||||
public void complete(ReportStatus reportStatus) {
|
||||
|
||||
switch (reportStatus) {
|
||||
case COMPLETE:
|
||||
complete(reportStatus, NbBundle.getMessage(this.getClass(), "ReportProgressDialog.complete.processLbl.text"));
|
||||
break;
|
||||
case ERROR:
|
||||
complete(reportStatus, NbBundle.getMessage(this.getClass(), "ReportProgressDialog.complete.processLb2.text"));
|
||||
break;
|
||||
default:
|
||||
complete(reportStatus, "");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Makes the components of this panel indicate the final status of
|
||||
* generation of the report.
|
||||
*
|
||||
* @param reportStatus The final status, must be COMPLETE or ERROR.
|
||||
* @param statusMessage String to use as label or error text.
|
||||
*/
|
||||
@Override
|
||||
public void complete(ReportStatus reportStatus, String statusMessage) {
|
||||
EventQueue.invokeLater(() -> {
|
||||
reportProgressBar.setIndeterminate(false);
|
||||
if (status != ReportStatus.CANCELED) {
|
||||
switch (reportStatus) {
|
||||
case COMPLETE: {
|
||||
ReportStatus oldValue = status;
|
||||
status = ReportStatus.COMPLETE;
|
||||
statusMessageLabel.setForeground(Color.BLACK);
|
||||
statusMessageLabel.setText(statusMessage);
|
||||
reportProgressBar.setValue(reportProgressBar.getMaximum());
|
||||
reportProgressBar.setStringPainted(true);
|
||||
reportProgressBar.setForeground(GREEN);
|
||||
reportProgressBar.setString("Complete"); //NON-NLS
|
||||
firePropertyChange(ReportStatus.COMPLETE.toString(), oldValue, status);
|
||||
break;
|
||||
}
|
||||
case ERROR: {
|
||||
ReportStatus oldValue = status;
|
||||
status = ReportStatus.ERROR;
|
||||
statusMessageLabel.setForeground(RED);
|
||||
statusMessageLabel.setText(statusMessage);
|
||||
reportProgressBar.setValue(reportProgressBar.getMaximum());
|
||||
reportProgressBar.setStringPainted(true);
|
||||
reportProgressBar.setForeground(RED);
|
||||
reportProgressBar.setString("Error"); //NON-NLS
|
||||
firePropertyChange(ReportStatus.COMPLETE.toString(), oldValue, status);
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Makes the components of this panel indicate generation of the report was
|
||||
* cancelled.
|
||||
*/
|
||||
void cancel() {
|
||||
switch (status) {
|
||||
case COMPLETE:
|
||||
break;
|
||||
case CANCELED:
|
||||
break;
|
||||
case ERROR:
|
||||
break;
|
||||
default:
|
||||
ReportStatus oldValue = status;
|
||||
status = ReportStatus.CANCELED;
|
||||
reportProgressBar.setIndeterminate(false);
|
||||
reportProgressBar.setValue(0);
|
||||
reportProgressBar.setStringPainted(true);
|
||||
reportProgressBar.setForeground(RED); // Red
|
||||
reportProgressBar.setString("Cancelled"); //NON-NLS
|
||||
firePropertyChange(ReportStatus.CANCELED.toString(), oldValue, status);
|
||||
statusMessageLabel.setForeground(RED);
|
||||
statusMessageLabel.setText(NbBundle.getMessage(this.getClass(), "ReportProgressDialog.cancel.procLbl.text"));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a shortened version of a file path.
|
||||
*
|
||||
* @param path The path to shorten.
|
||||
*
|
||||
* @return The shortened path.
|
||||
*/
|
||||
private String shortenPath(String path) {
|
||||
if (path.length() > 100) {
|
||||
return path.substring(0, 10 + path.substring(10).indexOf(File.separator) + 1) + "..."
|
||||
+ path.substring((path.length() - 70) + path.substring(path.length() - 70).indexOf(File.separator));
|
||||
} else {
|
||||
return path;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This method is called from within the constructor to initialize the form.
|
||||
* WARNING: Do NOT modify this code. The content of this method is always
|
||||
* regenerated by the Form Editor.
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
|
||||
private void initComponents() {
|
||||
|
||||
reportProgressBar = new javax.swing.JProgressBar();
|
||||
reportLabel = new javax.swing.JLabel();
|
||||
pathLabel = new javax.swing.JLabel();
|
||||
separationLabel = new javax.swing.JLabel();
|
||||
statusMessageLabel = new javax.swing.JLabel();
|
||||
|
||||
setFont(getFont().deriveFont(getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
||||
setMinimumSize(new java.awt.Dimension(486, 68));
|
||||
|
||||
reportProgressBar.setFont(reportProgressBar.getFont().deriveFont(reportProgressBar.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
||||
|
||||
reportLabel.setFont(reportLabel.getFont().deriveFont(reportLabel.getFont().getStyle() | java.awt.Font.BOLD, 11));
|
||||
org.openide.awt.Mnemonics.setLocalizedText(reportLabel, org.openide.util.NbBundle.getMessage(ReportProgressDialog.class, "ReportProgressDialog.reportLabel.text")); // NOI18N
|
||||
|
||||
pathLabel.setFont(pathLabel.getFont().deriveFont(pathLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
||||
org.openide.awt.Mnemonics.setLocalizedText(pathLabel, org.openide.util.NbBundle.getMessage(ReportProgressDialog.class, "ReportProgressDialog.pathLabel.text")); // NOI18N
|
||||
pathLabel.setVerticalAlignment(javax.swing.SwingConstants.TOP);
|
||||
|
||||
separationLabel.setFont(separationLabel.getFont().deriveFont(separationLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
||||
org.openide.awt.Mnemonics.setLocalizedText(separationLabel, org.openide.util.NbBundle.getMessage(ReportProgressDialog.class, "ReportProgressDialog.separationLabel.text")); // NOI18N
|
||||
|
||||
org.openide.awt.Mnemonics.setLocalizedText(statusMessageLabel, org.openide.util.NbBundle.getMessage(ReportProgressDialog.class, "ReportProgressDialog.statusMessageLabel.text")); // NOI18N
|
||||
|
||||
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
|
||||
this.setLayout(layout);
|
||||
layout.setHorizontalGroup(
|
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(statusMessageLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.addComponent(reportProgressBar, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addComponent(reportLabel)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(separationLabel)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(pathLabel, javax.swing.GroupLayout.DEFAULT_SIZE, 548, Short.MAX_VALUE)))
|
||||
.addContainerGap())
|
||||
);
|
||||
layout.setVerticalGroup(
|
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addComponent(reportProgressBar, javax.swing.GroupLayout.PREFERRED_SIZE, 16, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||
.addComponent(reportLabel)
|
||||
.addComponent(pathLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.addComponent(separationLabel))
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(statusMessageLabel)
|
||||
.addGap(13, 13, 13))
|
||||
);
|
||||
}// </editor-fold>//GEN-END:initComponents
|
||||
|
||||
|
||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||
private javax.swing.JLabel pathLabel;
|
||||
private javax.swing.JLabel reportLabel;
|
||||
private javax.swing.JProgressBar reportProgressBar;
|
||||
private javax.swing.JLabel separationLabel;
|
||||
private javax.swing.JLabel statusMessageLabel;
|
||||
// End of variables declaration//GEN-END:variables
|
||||
|
||||
/**
|
||||
* Makes the components of this panel indicate the generation of the report
|
||||
* is completed.
|
||||
*
|
||||
* @deprecated Use {@link #complete(ReportStatus)}
|
||||
*/
|
||||
@Deprecated
|
||||
@Override
|
||||
public void complete() {
|
||||
complete(ReportStatus.COMPLETE);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,141 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2019 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.report.infrastructure;
|
||||
|
||||
import org.openide.util.NbBundle;
|
||||
import org.sleuthkit.autopsy.progress.ProgressIndicator;
|
||||
import org.sleuthkit.autopsy.report.ReportProgressPanel;
|
||||
|
||||
/**
|
||||
* An adapter that adapts the ReportProgressPanel interface to the
|
||||
* ProgressIndicator interface so that a given progress indicator can be used
|
||||
* where a ReportProgressPanel is expected.
|
||||
*/
|
||||
public class ReportProgressIndicator extends ReportProgressPanel {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
private final ProgressIndicator progressIndicator;
|
||||
private int workUnitsCompleted;
|
||||
|
||||
/**
|
||||
* Constructs an adapter that adapts the ReportProgressPanel interface to
|
||||
* the ProgressIndicator interface so that a given progress indicator can be
|
||||
* used where a ReportProgressPanel is expected.
|
||||
*
|
||||
* @param progressIndicator The progress indicator to be adapted.
|
||||
*/
|
||||
public ReportProgressIndicator(ProgressIndicator progressIndicator) {
|
||||
this.progressIndicator = progressIndicator;
|
||||
}
|
||||
|
||||
@Override
|
||||
@NbBundle.Messages({
|
||||
"ReportProgressIndicator.startMessage=Report generation started"
|
||||
})
|
||||
public void start() {
|
||||
workUnitsCompleted = 0;
|
||||
setStatus(ReportStatus.RUNNING);
|
||||
progressIndicator.start(Bundle.ReportProgressIndicator_startMessage());
|
||||
}
|
||||
|
||||
@Override
|
||||
@NbBundle.Messages({
|
||||
"ReportProgressIndicator.switchToDeterminateMessage=Report generation progress switched to determinate"
|
||||
})
|
||||
public void setMaximumProgress(int max) {
|
||||
progressIndicator.switchToDeterminate(Bundle.ReportProgressIndicator_switchToDeterminateMessage(), 0, max);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void increment() {
|
||||
++workUnitsCompleted;
|
||||
progressIndicator.progress(workUnitsCompleted);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setProgress(int value) {
|
||||
workUnitsCompleted = value;
|
||||
progressIndicator.progress(workUnitsCompleted);
|
||||
}
|
||||
|
||||
@Override
|
||||
@NbBundle.Messages({
|
||||
"ReportProgressIndicator.switchToIndeterminateMessage=Report generation progress switched to indeterminate"
|
||||
})
|
||||
public void setIndeterminate(boolean indeterminate) {
|
||||
progressIndicator.switchToIndeterminate(Bundle.ReportProgressIndicator_switchToIndeterminateMessage());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateStatusLabel(String statusMessage) {
|
||||
if (getStatus() != ReportStatus.CANCELED) {
|
||||
progressIndicator.progress(statusMessage);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@NbBundle.Messages({
|
||||
"ReportProgressIndicator.completedMessage=Report generation completed",
|
||||
"ReportProgressIndicator.completedWithErrorsMessage=Report generation completed with errors",})
|
||||
public void complete(ReportStatus reportStatus) {
|
||||
if (getStatus() != ReportStatus.CANCELED) {
|
||||
switch (reportStatus) {
|
||||
case COMPLETE: {
|
||||
progressIndicator.progress(Bundle.ReportProgressIndicator_completedMessage());
|
||||
break;
|
||||
}
|
||||
case ERROR: {
|
||||
progressIndicator.progress(Bundle.ReportProgressIndicator_completedWithErrorsMessage());
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
progressIndicator.finish();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void complete(ReportStatus reportStatus, String statusMessage) {
|
||||
if (getStatus() != ReportStatus.CANCELED) {
|
||||
progressIndicator.progress(statusMessage);
|
||||
}
|
||||
complete(reportStatus);
|
||||
}
|
||||
|
||||
@Override
|
||||
@NbBundle.Messages({
|
||||
"ReportProgressIndicator.cancelledMessage=Report generation cancelled",})
|
||||
public void cancel() {
|
||||
switch (getStatus()) {
|
||||
case COMPLETE:
|
||||
break;
|
||||
case CANCELED:
|
||||
break;
|
||||
case ERROR:
|
||||
break;
|
||||
default:
|
||||
setStatus(ReportStatus.CANCELED);
|
||||
progressIndicator.progress(Bundle.ReportProgressIndicator_cancelledMessage());
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -1,172 +0,0 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2019 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.report.infrastructure;
|
||||
|
||||
import java.util.logging.Level;
|
||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||
import org.sleuthkit.autopsy.report.ReportProgressPanel;
|
||||
|
||||
/**
|
||||
* Writes progress and status messages to the application log.
|
||||
*/
|
||||
public class ReportProgressLogger implements ReportProgressPanel {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(ReportProgressLogger.class.getName());
|
||||
private volatile ReportProgressPanel.ReportStatus status;
|
||||
|
||||
public ReportProgressLogger() {
|
||||
status = ReportStatus.QUEUING;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the current status of the generation of the report.
|
||||
*
|
||||
* @return The report generation status as a ReportStatus enum.
|
||||
*/
|
||||
@Override
|
||||
public ReportStatus getStatus() {
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* Logs that the report has been started.
|
||||
*/
|
||||
@Override
|
||||
public void start() {
|
||||
status = ReportStatus.RUNNING;
|
||||
logger.log(Level.INFO, "Report started");
|
||||
}
|
||||
|
||||
/**
|
||||
* NO-OP.
|
||||
*
|
||||
* @param max The maximum value.
|
||||
*/
|
||||
@Override
|
||||
public void setMaximumProgress(int max) {
|
||||
}
|
||||
|
||||
/**
|
||||
* NO-OP.
|
||||
*/
|
||||
@Override
|
||||
public void increment() {
|
||||
}
|
||||
|
||||
/**
|
||||
* NO-OP.
|
||||
*
|
||||
* @param value The value to be set.
|
||||
*/
|
||||
@Override
|
||||
public void setProgress(int value) {
|
||||
}
|
||||
|
||||
/**
|
||||
* NO-OP.
|
||||
*
|
||||
* @param indeterminate True if the progress bar should be set to
|
||||
* indeterminate.
|
||||
*/
|
||||
@Override
|
||||
public void setIndeterminate(boolean indeterminate) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Logs the status message.
|
||||
*
|
||||
* @param statusMessage String to use as label text.
|
||||
*/
|
||||
@Override
|
||||
public void updateStatusLabel(String statusMessage) {
|
||||
if (status != ReportStatus.CANCELED) {
|
||||
logger.log(Level.INFO, statusMessage);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Logs the final status of the report generation.
|
||||
*
|
||||
* @param reportStatus The final status, must be COMPLETE or ERROR.
|
||||
* @param statusMessage String to use as label or error text.
|
||||
*/
|
||||
@Override
|
||||
public void complete(ReportStatus reportStatus, String statusMessage) {
|
||||
if (!statusMessage.isEmpty()) {
|
||||
logger.log(Level.INFO, statusMessage);
|
||||
}
|
||||
if (status != ReportStatus.CANCELED) {
|
||||
switch (reportStatus) {
|
||||
case COMPLETE: {
|
||||
status = ReportStatus.COMPLETE;
|
||||
logger.log(Level.INFO, "Report completed");
|
||||
break;
|
||||
}
|
||||
case ERROR: {
|
||||
status = ReportStatus.ERROR;
|
||||
logger.log(Level.INFO, "Report completed with errors");
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Logs the final status of the report generation.
|
||||
*
|
||||
* @param reportStatus The final status, must be COMPLETE or ERROR.
|
||||
*/
|
||||
@Override
|
||||
public void complete(ReportStatus reportStatus) {
|
||||
complete(reportStatus, "");
|
||||
}
|
||||
|
||||
/**
|
||||
* Logs that the generation of the report was cancelled.
|
||||
*/
|
||||
void cancel() {
|
||||
switch (status) {
|
||||
case COMPLETE:
|
||||
break;
|
||||
case CANCELED:
|
||||
break;
|
||||
case ERROR:
|
||||
break;
|
||||
default:
|
||||
status = ReportStatus.CANCELED;
|
||||
logger.log(Level.INFO, "Report cancelled");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Logs the final status of the report generation.
|
||||
*
|
||||
* @deprecated Use {@link #complete(ReportStatus)}
|
||||
*/
|
||||
@Deprecated
|
||||
@Override
|
||||
public void complete() {
|
||||
complete(ReportStatus.COMPLETE);
|
||||
}
|
||||
|
||||
}
|
@ -2,7 +2,7 @@
|
||||
*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2013-2018 Basis Technology Corp.
|
||||
* Copyright 2012-2019 Basis Technology Corp.
|
||||
*
|
||||
* Copyright 2012 42six Solutions.
|
||||
* Contact: aebadirad <at> 42six <dot> com
|
||||
@ -76,7 +76,8 @@ public final class ReportWizardAction extends CallableSystemAction implements Pr
|
||||
*
|
||||
* @param configName Name of the reporting configuration to use
|
||||
* @param displayCaseSpecificData Flag whether to use case specific data in
|
||||
* UI panels or to use all possible result types
|
||||
* UI panels or to use all possible result
|
||||
* types
|
||||
* @param runReports Flag whether to produce report(s)
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
@ -110,6 +111,7 @@ public final class ReportWizardAction extends CallableSystemAction implements Pr
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings(value = "unchecked")
|
||||
private static void saveReportingConfiguration(String configName, WizardDescriptor wiz) throws ReportConfigException {
|
||||
|
||||
ReportingConfig reportingConfig = new ReportingConfig(configName);
|
||||
|
@ -55,11 +55,14 @@ final class ReportingConfigLoader {
|
||||
* an atomic, thread safe way.
|
||||
*
|
||||
* @param configName Name of the reporting configuration
|
||||
*
|
||||
* @return ReportingConfig object if a persisted configuration exists, null
|
||||
* otherwise
|
||||
*
|
||||
* @throws ReportConfigException if an error occurred while reading the
|
||||
* configuration
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
static synchronized ReportingConfig loadConfig(String configName) throws ReportConfigException {
|
||||
|
||||
// construct the configuration directory path
|
||||
@ -114,9 +117,12 @@ final class ReportingConfigLoader {
|
||||
try (NbObjectInputStream in = new NbObjectInputStream(new FileInputStream(filePath))) {
|
||||
moduleConfig.setModuleSettings((ReportModuleSettings) in.readObject());
|
||||
} catch (IOException | ClassNotFoundException ex) {
|
||||
/* NOTE: we do not want to re-throw the exception because we do not
|
||||
want a single error while reading in a (3rd party) report module
|
||||
to prevent us from reading the entire reporting configuration.*/
|
||||
/*
|
||||
* NOTE: we do not want to re-throw the exception because we do
|
||||
* not want a single error while reading in a (3rd party) report
|
||||
* module to prevent us from reading the entire reporting
|
||||
* configuration.
|
||||
*/
|
||||
logger.log(Level.SEVERE, "Unable to read module settings " + filePath, ex);
|
||||
iterator.remove();
|
||||
}
|
||||
@ -132,6 +138,7 @@ final class ReportingConfigLoader {
|
||||
* an atomic, thread safe way.
|
||||
*
|
||||
* @param reportConfig ReportingConfig object to serialize to disk
|
||||
*
|
||||
* @throws ReportConfigException if an error occurred while saving the
|
||||
* configuration
|
||||
*/
|
||||
@ -176,10 +183,13 @@ final class ReportingConfigLoader {
|
||||
}
|
||||
|
||||
// save each ReportModuleSettings object individually
|
||||
/* NOTE: This is done to protect us from errors in reading/writing 3rd
|
||||
party report module settings. If we were to serialize the entire ReportingConfig
|
||||
object, then a single error while reading in a 3rd party report module
|
||||
would prevent us from reading the entire reporting configuration.*/
|
||||
/*
|
||||
* NOTE: This is done to protect us from errors in reading/writing 3rd
|
||||
* party report module settings. If we were to serialize the entire
|
||||
* ReportingConfig object, then a single error while reading in a 3rd
|
||||
* party report module would prevent us from reading the entire
|
||||
* reporting configuration.
|
||||
*/
|
||||
if (reportConfig.getModuleConfigs() == null) {
|
||||
return;
|
||||
}
|
||||
|
@ -98,6 +98,7 @@ class TableReportGenerator {
|
||||
tagNamesFilter = new HashSet<>(tagNames);
|
||||
}
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
private void getAllExistingArtiactTypes() throws NoCurrentCaseException, TskCoreException {
|
||||
// get all possible artifact types
|
||||
ArrayList<BlackboardArtifact.Type> doNotReport = new ArrayList<>();
|
||||
|
@ -38,8 +38,10 @@ SaveSnapShotAsReport.ReportSavedAt=Report saved at [{0}]
|
||||
SaveSnapShotAsReport.Success=Success
|
||||
SaveSnapShotAsReport_OK_Button=OK
|
||||
SaveSnapShotAsReport_Open_Button=Open Report
|
||||
# {0} - supplied report name
|
||||
SaveSnapShotAsReport_Path_Failure_Report=Failed to create report. Supplied report name has invalid characters: {0}
|
||||
SaveSnapShotAsReport_Report_Failed=Report failed
|
||||
# {0} - report location
|
||||
SaveSnapShotAsReport_success_message=Snapshot report successfully created at location: \n\n {0}
|
||||
Timeline.ModuleName=Timeline
|
||||
ViewArtifactInTimelineAction.displayName=View Result in Timeline...
|
||||
|
@ -84,7 +84,9 @@ public class SaveSnapshotAsReport extends Action {
|
||||
"SaveSnapShotAsReport.reportName.header=Enter a report name for the Timeline Snapshot Report.",
|
||||
"SaveSnapShotAsReport.duplicateReportNameError.text=A report with that name already exists.",
|
||||
"SaveSnapShotAsReport_Report_Failed=Report failed",
|
||||
"# {0} - supplied report name",
|
||||
"SaveSnapShotAsReport_Path_Failure_Report=Failed to create report. Supplied report name has invalid characters: {0}",
|
||||
"# {0} - report location",
|
||||
"SaveSnapShotAsReport_success_message=Snapshot report successfully created at location: \n\n {0}",
|
||||
"SaveSnapShotAsReport_Open_Button=Open Report",
|
||||
"SaveSnapShotAsReport_OK_Button=OK"
|
||||
|
5
Core/src/org/sleuthkit/autopsy/corecomponents/WrapLayout.java → Core/src/org/sleuthkit/autopsy/uicomponents/WrapLayout.java
Normal file → Executable file
5
Core/src/org/sleuthkit/autopsy/corecomponents/WrapLayout.java → Core/src/org/sleuthkit/autopsy/uicomponents/WrapLayout.java
Normal file → Executable file
@ -16,7 +16,7 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.sleuthkit.autopsy.corecomponents;
|
||||
package org.sleuthkit.autopsy.uicomponents;
|
||||
|
||||
import java.awt.Component;
|
||||
import java.awt.Container;
|
||||
@ -32,8 +32,9 @@ import javax.swing.SwingUtilities;
|
||||
* Originally written by Rob Camick
|
||||
* https://tips4java.wordpress.com/2008/11/06/wrap-layout/
|
||||
*/
|
||||
class WrapLayout extends FlowLayout {
|
||||
public class WrapLayout extends FlowLayout {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
/**
|
||||
* Constructs a new <code>WrapLayout</code> with a left alignment and a
|
||||
* default 5-unit horizontal and vertical gap.
|
@ -1,8 +1,8 @@
|
||||
Manifest-Version: 1.0
|
||||
OpenIDE-Module: org.sleuthkit.autopsy.corelibs/3
|
||||
OpenIDE-Module-Implementation-Version: 5
|
||||
OpenIDE-Module-Implementation-Version: 6
|
||||
OpenIDE-Module-Localizing-Bundle: org/sleuthkit/autopsy/corelibs/Bundle.properties
|
||||
OpenIDE-Module-Specification-Version: 1.2
|
||||
OpenIDE-Module-Specification-Version: 1.3
|
||||
AutoUpdate-Show-In-Client: true
|
||||
AutoUpdate-Essential-Module: true
|
||||
|
||||
|
@ -59,7 +59,7 @@ public final class OpenCvLoader {
|
||||
*
|
||||
* @return True or false.
|
||||
*/
|
||||
public static boolean hasOpenCvLoaded() {
|
||||
public static boolean openCvIsLoaded() {
|
||||
return openCvLoaded;
|
||||
}
|
||||
|
||||
@ -78,7 +78,7 @@ public final class OpenCvLoader {
|
||||
* of the core OpenCV library during static
|
||||
* initialization of this class.
|
||||
*
|
||||
* @deprecated Use hasOpenCvLoaded instead.
|
||||
* @deprecated Use openCvIsLoaded instead.
|
||||
*/
|
||||
@Deprecated
|
||||
public static boolean isOpenCvLoaded() throws UnsatisfiedLinkError {
|
||||
|
@ -135,7 +135,7 @@
|
||||
<compile-dependency/>
|
||||
<run-dependency>
|
||||
<release-version>10</release-version>
|
||||
<specification-version>10.16</specification-version>
|
||||
<specification-version>10.17</specification-version>
|
||||
</run-dependency>
|
||||
</dependency>
|
||||
<dependency>
|
||||
@ -144,7 +144,7 @@
|
||||
<compile-dependency/>
|
||||
<run-dependency>
|
||||
<release-version>3</release-version>
|
||||
<specification-version>1.2</specification-version>
|
||||
<specification-version>1.3</specification-version>
|
||||
</run-dependency>
|
||||
</dependency>
|
||||
<dependency>
|
||||
|
@ -84,7 +84,7 @@ public class ObjectDetectectionFileIngestModule extends FileIngestModuleAdapter
|
||||
throw new IngestModule.IngestModuleException(errorMsg);
|
||||
}
|
||||
|
||||
if(!OpenCvLoader.hasOpenCvLoaded()) {
|
||||
if(!OpenCvLoader.openCvIsLoaded()) {
|
||||
String errorMsg = Bundle.ObjectDetectionFileIngestModule_openCVNotLoaded();
|
||||
logger.log(Level.SEVERE, errorMsg);
|
||||
throw new IngestModule.IngestModuleException(errorMsg);
|
||||
|
@ -127,7 +127,7 @@
|
||||
<compile-dependency/>
|
||||
<run-dependency>
|
||||
<release-version>10</release-version>
|
||||
<specification-version>10.16</specification-version>
|
||||
<specification-version>10.17</specification-version>
|
||||
</run-dependency>
|
||||
</dependency>
|
||||
<dependency>
|
||||
@ -136,7 +136,7 @@
|
||||
<compile-dependency/>
|
||||
<run-dependency>
|
||||
<release-version>3</release-version>
|
||||
<specification-version>1.2</specification-version>
|
||||
<specification-version>1.3</specification-version>
|
||||
</run-dependency>
|
||||
</dependency>
|
||||
</module-dependencies>
|
||||
|
@ -119,7 +119,7 @@
|
||||
<compile-dependency/>
|
||||
<run-dependency>
|
||||
<release-version>10</release-version>
|
||||
<specification-version>10.16</specification-version>
|
||||
<specification-version>10.17</specification-version>
|
||||
</run-dependency>
|
||||
</dependency>
|
||||
<dependency>
|
||||
@ -128,7 +128,7 @@
|
||||
<compile-dependency/>
|
||||
<run-dependency>
|
||||
<release-version>3</release-version>
|
||||
<specification-version>1.2</specification-version>
|
||||
<specification-version>1.3</specification-version>
|
||||
</run-dependency>
|
||||
</dependency>
|
||||
</module-dependencies>
|
||||
|
@ -60,7 +60,7 @@
|
||||
<compile-dependency/>
|
||||
<run-dependency>
|
||||
<release-version>10</release-version>
|
||||
<specification-version>10.16</specification-version>
|
||||
<specification-version>10.17</specification-version>
|
||||
</run-dependency>
|
||||
</dependency>
|
||||
<dependency>
|
||||
@ -69,7 +69,7 @@
|
||||
<compile-dependency/>
|
||||
<run-dependency>
|
||||
<release-version>3</release-version>
|
||||
<specification-version>1.2</specification-version>
|
||||
<specification-version>1.3</specification-version>
|
||||
</run-dependency>
|
||||
</dependency>
|
||||
</module-dependencies>
|
||||
|
@ -2,9 +2,14 @@ cannotBuildXmlParser=Unable to build XML parser:
|
||||
cannotLoadSEUQA=Unable to load Search Engine URL Query Analyzer settings file, SEUQAMappings.xml:
|
||||
cannotParseXml=Unable to parse XML file:
|
||||
ChromeCacheExtractor.moduleName=ChromeCacheExtractor
|
||||
# {0} - module name
|
||||
# {1} - row number
|
||||
# {2} - table length
|
||||
# {3} - cache path
|
||||
ChromeCacheExtractor.progressMsg={0}: Extracting cache entry {1} of {2} entries from {3}
|
||||
DataSourceUsage_AndroidMedia=Android Media Card
|
||||
DataSourceUsage_FlashDrive=Flash Drive
|
||||
# {0} - OS name
|
||||
DataSourceUsageAnalyzer.customVolume.label=OS Drive ({0})
|
||||
DataSourceUsageAnalyzer.parentModuleName=Recent Activity
|
||||
Extract.indexError.message=Failed to index artifact for keyword search.
|
||||
@ -183,6 +188,7 @@ RecentDocumentsByLnk.parentModuleName.noSpace=RecentActivity
|
||||
RecentDocumentsByLnk.parentModuleName=Recent Activity
|
||||
RegRipperFullNotFound=Full version RegRipper executable not found.
|
||||
RegRipperNotFound=Autopsy RegRipper executable not found.
|
||||
# {0} - file name
|
||||
SearchEngineURLQueryAnalyzer.init.exception.msg=Unable to find {0}.
|
||||
SearchEngineURLQueryAnalyzer.moduleName.text=Search Engine
|
||||
SearchEngineURLQueryAnalyzer.engineName.none=NONE
|
||||
|
@ -258,7 +258,7 @@ final class ExtractRecycleBin extends Extract {
|
||||
addFileSystemFile(skCase, fsContent, parentFolder, fsContent.getName(), deletedTimeStamp);
|
||||
} else if (fsContent.isDir()) {
|
||||
String newPath = parentPath + "\\" + fsContent.getName();
|
||||
AbstractFile childFolder = getOrMakeFolder(skCase, (FsContent) fsContent, parentPath);
|
||||
AbstractFile childFolder = getOrMakeFolder(skCase, fsContent, parentPath);
|
||||
popuplateDeletedDirectory(skCase, childFolder, fsContent.getChildren(), newPath, deletedTimeStamp);
|
||||
}
|
||||
}
|
||||
|
@ -47,7 +47,7 @@
|
||||
<compile-dependency/>
|
||||
<run-dependency>
|
||||
<release-version>10</release-version>
|
||||
<specification-version>10.15</specification-version>
|
||||
<specification-version>10.17</specification-version>
|
||||
</run-dependency>
|
||||
</dependency>
|
||||
<dependency>
|
||||
|
@ -1,5 +1,5 @@
|
||||
#Updated by build script
|
||||
#Wed, 02 Oct 2019 12:06:32 -0400
|
||||
#Fri, 04 Oct 2019 14:30:10 -0400
|
||||
LBL_splash_window_title=Starting Autopsy
|
||||
SPLASH_HEIGHT=314
|
||||
SPLASH_WIDTH=538
|
||||
|
@ -1,4 +1,4 @@
|
||||
#Updated by build script
|
||||
#Wed, 02 Oct 2019 12:06:32 -0400
|
||||
#Fri, 04 Oct 2019 14:30:10 -0400
|
||||
CTL_MainWindow_Title=Autopsy 4.13.0
|
||||
CTL_MainWindow_Title_No_Project=Autopsy 4.13.0
|
||||
|
@ -14,7 +14,7 @@ The Communications Visualization Tool is loaded through the Tools->Communication
|
||||
|
||||
\image html cvt_main.png
|
||||
|
||||
From the left hand column, you can choose which devices to display, which types of data to display, and optionally select a time range. You can also choose to limit the display to only the most recent communications. After any changes to the filters, use the Apply button to update the tables.
|
||||
From the left hand column, you can choose which devices to display, which types of data to display, and optionally select a time range. You can also choose to limit the display to only the most recent communications. After any changes to the filters, use the Apply button to update the tables. You can hide this column by clicking the left arrow at the top of the column.
|
||||
|
||||
The middle column displays each account, its device and type, and the number of associated messages (emails, call logs, etc.). By default it will be sorted in descending order of frequency. The middle column and the right hand column both have a \ref ui_quick_search feature which can be used to quickly find a visible item in their section's table.
|
||||
|
||||
|
Binary file not shown.
Before Width: | Height: | Size: 87 KiB After Width: | Height: | Size: 97 KiB |
@ -6,8 +6,8 @@ app.name=${branding.token}
|
||||
### if left unset, version will default to today's date
|
||||
app.version=4.13.0
|
||||
### build.type must be one of: DEVELOPMENT, RELEASE
|
||||
#build.type=RELEASE
|
||||
build.type=DEVELOPMENT
|
||||
build.type=RELEASE
|
||||
#build.type=DEVELOPMENT
|
||||
|
||||
project.org.netbeans.progress=org-netbeans-api-progress
|
||||
project.org.sleuthkit.autopsy.experimental=Experimental
|
||||
|
@ -36,7 +36,7 @@
|
||||
<compile-dependency/>
|
||||
<run-dependency>
|
||||
<release-version>10</release-version>
|
||||
<specification-version>10.16</specification-version>
|
||||
<specification-version>10.17</specification-version>
|
||||
</run-dependency>
|
||||
</dependency>
|
||||
<dependency>
|
||||
|
Loading…
x
Reference in New Issue
Block a user