mirror of
https://github.com/overcuriousity/autopsy-flatpak.git
synced 2025-07-15 09:17:42 +00:00
Merge remote-tracking branch 'upstream/TL-list-view' into 799-tags-and-hashhit-columns-in-list-view
This commit is contained in:
commit
f044c824a9
@ -22,6 +22,7 @@ import java.awt.Dimension;
|
|||||||
import java.awt.Toolkit;
|
import java.awt.Toolkit;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.nio.file.Paths;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import javax.swing.JFileChooser;
|
import javax.swing.JFileChooser;
|
||||||
import javax.swing.JFrame;
|
import javax.swing.JFrame;
|
||||||
@ -31,6 +32,7 @@ import org.apache.commons.io.FilenameUtils;
|
|||||||
import org.openide.util.NbBundle;
|
import org.openide.util.NbBundle;
|
||||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
import org.sleuthkit.autopsy.coreutils.ModuleSettings;
|
import org.sleuthkit.autopsy.coreutils.ModuleSettings;
|
||||||
|
import org.sleuthkit.autopsy.coreutils.PlatformUtil;
|
||||||
import org.sleuthkit.autopsy.modules.hashdatabase.HashDbManager.HashDb;
|
import org.sleuthkit.autopsy.modules.hashdatabase.HashDbManager.HashDb;
|
||||||
import org.sleuthkit.autopsy.modules.hashdatabase.HashDbManager.HashDb.KnownFilesType;
|
import org.sleuthkit.autopsy.modules.hashdatabase.HashDbManager.HashDb.KnownFilesType;
|
||||||
import org.sleuthkit.autopsy.modules.hashdatabase.HashDbManager.HashDbManagerException;
|
import org.sleuthkit.autopsy.modules.hashdatabase.HashDbManager.HashDbManagerException;
|
||||||
@ -249,9 +251,16 @@ final class HashDbImportDatabaseDialog extends javax.swing.JDialog {
|
|||||||
}// </editor-fold>//GEN-END:initComponents
|
}// </editor-fold>//GEN-END:initComponents
|
||||||
|
|
||||||
private void openButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_openButtonActionPerformed
|
private void openButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_openButtonActionPerformed
|
||||||
|
String lastBaseDirectory = Paths.get(PlatformUtil.getUserConfigDirectory(), "HashDatabases").toString();
|
||||||
if (ModuleSettings.settingExists(ModuleSettings.MAIN_SETTINGS, LAST_FILE_PATH_KEY)) {
|
if (ModuleSettings.settingExists(ModuleSettings.MAIN_SETTINGS, LAST_FILE_PATH_KEY)) {
|
||||||
fileChooser.setCurrentDirectory(new File(ModuleSettings.getConfigSetting(ModuleSettings.MAIN_SETTINGS, LAST_FILE_PATH_KEY)));
|
lastBaseDirectory = ModuleSettings.getConfigSetting(ModuleSettings.MAIN_SETTINGS, LAST_FILE_PATH_KEY);
|
||||||
}
|
}
|
||||||
|
File hashDbFolder = new File(lastBaseDirectory);
|
||||||
|
// create the folder if it doesn't exist
|
||||||
|
if (!hashDbFolder.exists()) {
|
||||||
|
hashDbFolder.mkdir();
|
||||||
|
}
|
||||||
|
fileChooser.setCurrentDirectory(hashDbFolder);
|
||||||
if (fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
|
if (fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
|
||||||
File databaseFile = fileChooser.getSelectedFile();
|
File databaseFile = fileChooser.getSelectedFile();
|
||||||
try {
|
try {
|
||||||
|
@ -225,7 +225,8 @@ ReportHTML.writeSum.noCaseNum=<i>No case number</i>
|
|||||||
ReportBodyFile.generateReport.srcModuleName.text=TSK Body File
|
ReportBodyFile.generateReport.srcModuleName.text=TSK Body File
|
||||||
ReportExcel.endReport.srcModuleName.text=Excel Report
|
ReportExcel.endReport.srcModuleName.text=Excel Report
|
||||||
ReportHTML.writeIndex.srcModuleName.text=HTML Report
|
ReportHTML.writeIndex.srcModuleName.text=HTML Report
|
||||||
ReportKML.genReport.srcModuleName.text=KML Report
|
ReportKML.genReport.srcModuleName.text=Geospatial Data
|
||||||
|
ReportKML.genReport.reportName=KML Report
|
||||||
ReportGenerator.artTableColHdr.extension.text=Extension
|
ReportGenerator.artTableColHdr.extension.text=Extension
|
||||||
ReportGenerator.artTableColHdr.mimeType.text=MIME Type
|
ReportGenerator.artTableColHdr.mimeType.text=MIME Type
|
||||||
ReportGenerator.artTableColHdr.processorArchitecture.text=Processor Architecture
|
ReportGenerator.artTableColHdr.processorArchitecture.text=Processor Architecture
|
||||||
|
@ -188,7 +188,7 @@ ReportExcel.endReport.srcModuleName.text=Excel\u30ec\u30dd\u30fc\u30c8
|
|||||||
ReportGenerator.artTableColHdr.extension.text=\u62e1\u5f35\u5b50
|
ReportGenerator.artTableColHdr.extension.text=\u62e1\u5f35\u5b50
|
||||||
ReportGenerator.artTableColHdr.mimeType.text=MIME\u30bf\u30a4\u30d7
|
ReportGenerator.artTableColHdr.mimeType.text=MIME\u30bf\u30a4\u30d7
|
||||||
ReportHTML.writeIndex.srcModuleName.text=HTML\u30ec\u30dd\u30fc\u30c8
|
ReportHTML.writeIndex.srcModuleName.text=HTML\u30ec\u30dd\u30fc\u30c8
|
||||||
ReportKML.genReport.srcModuleName.text=KML\u30ec\u30dd\u30fc\u30c8
|
ReportKML.genReport.reportName=KML\u30ec\u30dd\u30fc\u30c8
|
||||||
ReportGenerator.artTableColHdr.associatedArtifact=\u95a2\u4fc2\u3059\u308b\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8
|
ReportGenerator.artTableColHdr.associatedArtifact=\u95a2\u4fc2\u3059\u308b\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8
|
||||||
ReportGenerator.artTableColHdr.count=\u30ab\u30a6\u30f3\u30c8
|
ReportGenerator.artTableColHdr.count=\u30ab\u30a6\u30f3\u30c8
|
||||||
ReportGenerator.artTableColHdr.devMake=\u6a5f\u5668\u578b\u540d
|
ReportGenerator.artTableColHdr.devMake=\u6a5f\u5668\u578b\u540d
|
||||||
|
File diff suppressed because it is too large
Load Diff
299
Core/src/org/sleuthkit/autopsy/report/stylesheets/style.kml
Executable file
299
Core/src/org/sleuthkit/autopsy/report/stylesheets/style.kml
Executable file
@ -0,0 +1,299 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:kml="http://www.opengis.net/kml/2.2">
|
||||||
|
<Document>
|
||||||
|
<StyleMap id="yellowFeature">
|
||||||
|
<Pair>
|
||||||
|
<key>normal</key>
|
||||||
|
<styleUrl>#n_YellowPushpin</styleUrl>
|
||||||
|
</Pair>
|
||||||
|
<Pair>
|
||||||
|
<key>highlight</key>
|
||||||
|
<styleUrl>#h_YellowPushpin</styleUrl>
|
||||||
|
</Pair>
|
||||||
|
</StyleMap>
|
||||||
|
<Style id="n_YellowPushpin">
|
||||||
|
<IconStyle>
|
||||||
|
<scale>1.0</scale>
|
||||||
|
<Icon>
|
||||||
|
<href>http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png</href>
|
||||||
|
</Icon>
|
||||||
|
<hotSpot x="20" y="2" xunits="pixels" yunits="pixels" />
|
||||||
|
</IconStyle>
|
||||||
|
<LabelStyle>
|
||||||
|
<scale>0</scale>
|
||||||
|
</LabelStyle>
|
||||||
|
<LineStyle>
|
||||||
|
<color>FF00FFFF</color>
|
||||||
|
<width>5.0</width>
|
||||||
|
</LineStyle>
|
||||||
|
<BalloonStyle>
|
||||||
|
<text>$[description]</text>
|
||||||
|
</BalloonStyle>
|
||||||
|
</Style>
|
||||||
|
<Style id="h_YellowPushpin">
|
||||||
|
<IconStyle>
|
||||||
|
<scale>1.3</scale>
|
||||||
|
<Icon>
|
||||||
|
<href>http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png</href>
|
||||||
|
</Icon>
|
||||||
|
<hotSpot x="20" y="2" xunits="pixels" yunits="pixels" />
|
||||||
|
</IconStyle>
|
||||||
|
<LabelStyle>
|
||||||
|
<scale>1</scale>
|
||||||
|
</LabelStyle>
|
||||||
|
<LineStyle>
|
||||||
|
<color>FF00FFFF</color>
|
||||||
|
<width>10.0</width>
|
||||||
|
</LineStyle>
|
||||||
|
<BalloonStyle>
|
||||||
|
<text>$[description]</text>
|
||||||
|
</BalloonStyle>
|
||||||
|
</Style>
|
||||||
|
<StyleMap id="blueFeature">
|
||||||
|
<Pair>
|
||||||
|
<key>normal</key>
|
||||||
|
<styleUrl>#n_bluePushpin</styleUrl>
|
||||||
|
</Pair>
|
||||||
|
<Pair>
|
||||||
|
<key>highlight</key>
|
||||||
|
<styleUrl>#h_bluePushpin</styleUrl>
|
||||||
|
</Pair>
|
||||||
|
</StyleMap>
|
||||||
|
<Style id="n_bluePushpin">
|
||||||
|
<IconStyle>
|
||||||
|
<scale>1.0</scale>
|
||||||
|
<Icon>
|
||||||
|
<href>http://maps.google.com/mapfiles/kml/pushpin/blue-pushpin.png</href>
|
||||||
|
</Icon>
|
||||||
|
<hotSpot x="20" y="2" xunits="pixels" yunits="pixels" />
|
||||||
|
</IconStyle>
|
||||||
|
<LabelStyle>
|
||||||
|
<scale>0</scale>
|
||||||
|
</LabelStyle>
|
||||||
|
<LineStyle>
|
||||||
|
<color>FFE63900</color>
|
||||||
|
<width>5.0</width>
|
||||||
|
</LineStyle>
|
||||||
|
<BalloonStyle>
|
||||||
|
<text>$[description]</text>
|
||||||
|
</BalloonStyle>
|
||||||
|
</Style>
|
||||||
|
<Style id="h_bluePushpin">
|
||||||
|
<IconStyle>
|
||||||
|
<scale>1.3</scale>
|
||||||
|
<Icon>
|
||||||
|
<href>http://maps.google.com/mapfiles/kml/pushpin/blue-pushpin.png</href>
|
||||||
|
</Icon>
|
||||||
|
<hotSpot x="20" y="2" xunits="pixels" yunits="pixels" />
|
||||||
|
</IconStyle>
|
||||||
|
<LabelStyle>
|
||||||
|
<scale>1</scale>
|
||||||
|
</LabelStyle>
|
||||||
|
<LineStyle>
|
||||||
|
<color>FFE63900</color>
|
||||||
|
<width>10.0</width>
|
||||||
|
</LineStyle>
|
||||||
|
<BalloonStyle>
|
||||||
|
<text>$[description]</text>
|
||||||
|
</BalloonStyle>
|
||||||
|
</Style>
|
||||||
|
<StyleMap id="redFeature">
|
||||||
|
<Pair>
|
||||||
|
<key>normal</key>
|
||||||
|
<styleUrl>#n_redPushpin</styleUrl>
|
||||||
|
</Pair>
|
||||||
|
<Pair>
|
||||||
|
<key>highlight</key>
|
||||||
|
<styleUrl>#h_redPushpin</styleUrl>
|
||||||
|
</Pair>
|
||||||
|
</StyleMap>
|
||||||
|
<Style id="n_redPushpin">
|
||||||
|
<IconStyle>
|
||||||
|
<scale>1.0</scale>
|
||||||
|
<Icon>
|
||||||
|
<href>http://maps.google.com/mapfiles/kml/pushpin/red-pushpin.png</href>
|
||||||
|
</Icon>
|
||||||
|
<hotSpot x="20" y="2" xunits="pixels" yunits="pixels" />
|
||||||
|
</IconStyle>
|
||||||
|
<LabelStyle>
|
||||||
|
<scale>0</scale>
|
||||||
|
</LabelStyle>
|
||||||
|
<LineStyle>
|
||||||
|
<color>FF0000FF</color>
|
||||||
|
<width>5.0</width>
|
||||||
|
</LineStyle>
|
||||||
|
<BalloonStyle>
|
||||||
|
<text>$[description]</text>
|
||||||
|
</BalloonStyle>
|
||||||
|
</Style>
|
||||||
|
<Style id="h_redPushpin">
|
||||||
|
<IconStyle>
|
||||||
|
<scale>1.3</scale>
|
||||||
|
<Icon>
|
||||||
|
<href>http://maps.google.com/mapfiles/kml/pushpin/red-pushpin.png</href>
|
||||||
|
</Icon>
|
||||||
|
<hotSpot x="20" y="2" xunits="pixels" yunits="pixels" />
|
||||||
|
</IconStyle>
|
||||||
|
<LabelStyle>
|
||||||
|
<scale>1</scale>
|
||||||
|
</LabelStyle>
|
||||||
|
<LineStyle>
|
||||||
|
<color>FF0000FF</color>
|
||||||
|
<width>10.0</width>
|
||||||
|
</LineStyle>
|
||||||
|
<BalloonStyle>
|
||||||
|
<text>$[description]</text>
|
||||||
|
</BalloonStyle>
|
||||||
|
</Style>
|
||||||
|
<StyleMap id="greenFeature">
|
||||||
|
<Pair>
|
||||||
|
<key>normal</key>
|
||||||
|
<styleUrl>#n_greenPushpin</styleUrl>
|
||||||
|
</Pair>
|
||||||
|
<Pair>
|
||||||
|
<key>highlight</key>
|
||||||
|
<styleUrl>#h_greenPushpin</styleUrl>
|
||||||
|
</Pair>
|
||||||
|
</StyleMap>
|
||||||
|
<Style id="n_greenPushpin">
|
||||||
|
<IconStyle>
|
||||||
|
<scale>1.0</scale>
|
||||||
|
<Icon>
|
||||||
|
<href>http://maps.google.com/mapfiles/kml/pushpin/grn-pushpin.png</href>
|
||||||
|
</Icon>
|
||||||
|
<hotSpot x="20" y="2" xunits="pixels" yunits="pixels" />
|
||||||
|
</IconStyle>
|
||||||
|
<LabelStyle>
|
||||||
|
<scale>1</scale>
|
||||||
|
</LabelStyle>
|
||||||
|
<LineStyle>
|
||||||
|
<color>FF00CC00</color>
|
||||||
|
<width>5.0</width>
|
||||||
|
</LineStyle>
|
||||||
|
<BalloonStyle>
|
||||||
|
<text>
|
||||||
|
A route was planned between these two points. The green line connecting the points is not the actual route, but it indicates which Start and End points are associated with each other.
|
||||||
|
$[description]
|
||||||
|
</text>
|
||||||
|
</BalloonStyle>
|
||||||
|
</Style>
|
||||||
|
<Style id="h_greenPushpin">
|
||||||
|
<IconStyle>
|
||||||
|
<scale>1.3</scale>
|
||||||
|
<Icon>
|
||||||
|
<href>http://maps.google.com/mapfiles/kml/pushpin/grn-pushpin.png</href>
|
||||||
|
</Icon>
|
||||||
|
<hotSpot x="20" y="2" xunits="pixels" yunits="pixels" />
|
||||||
|
</IconStyle>
|
||||||
|
<LabelStyle>
|
||||||
|
<scale>1</scale>
|
||||||
|
</LabelStyle>
|
||||||
|
<LineStyle>
|
||||||
|
<color>FF00CC00</color>
|
||||||
|
<width>10.0</width>
|
||||||
|
</LineStyle>
|
||||||
|
<BalloonStyle>
|
||||||
|
<text>
|
||||||
|
A route was planned between these two points. The green line connecting the points is not the actual route, but it indicates which Start and End points are associated with each other.
|
||||||
|
$[description]
|
||||||
|
</text>
|
||||||
|
</BalloonStyle>
|
||||||
|
</Style>
|
||||||
|
<StyleMap id="purpleFeature">
|
||||||
|
<Pair>
|
||||||
|
<key>normal</key>
|
||||||
|
<styleUrl>#n_purplePushpin</styleUrl>
|
||||||
|
</Pair>
|
||||||
|
<Pair>
|
||||||
|
<key>highlight</key>
|
||||||
|
<styleUrl>#h_purplePushpin</styleUrl>
|
||||||
|
</Pair>
|
||||||
|
</StyleMap>
|
||||||
|
<Style id="n_purplePushpin">
|
||||||
|
<IconStyle>
|
||||||
|
<scale>1.0</scale>
|
||||||
|
<Icon>
|
||||||
|
<href>http://maps.google.com/mapfiles/kml/pushpin/purple-pushpin.png</href>
|
||||||
|
</Icon>
|
||||||
|
<hotSpot x="20" y="2" xunits="pixels" yunits="pixels" />
|
||||||
|
</IconStyle>
|
||||||
|
<LabelStyle>
|
||||||
|
<scale>1</scale>
|
||||||
|
</LabelStyle>
|
||||||
|
<LineStyle>
|
||||||
|
<color>FFCC0066</color>
|
||||||
|
<width>5.0</width>
|
||||||
|
</LineStyle>
|
||||||
|
<BalloonStyle>
|
||||||
|
<text>$[description]</text>
|
||||||
|
</BalloonStyle>
|
||||||
|
</Style>
|
||||||
|
<Style id="h_purplePushpin">
|
||||||
|
<IconStyle>
|
||||||
|
<scale>1.3</scale>
|
||||||
|
<Icon>
|
||||||
|
<href>http://maps.google.com/mapfiles/kml/pushpin/purple-pushpin.png</href>
|
||||||
|
</Icon>
|
||||||
|
<hotSpot x="20" y="2" xunits="pixels" yunits="pixels" />
|
||||||
|
</IconStyle>
|
||||||
|
<LabelStyle>
|
||||||
|
<scale>1</scale>
|
||||||
|
</LabelStyle>
|
||||||
|
<LineStyle>
|
||||||
|
<color>FFCC0066</color>
|
||||||
|
<width>10.0</width>
|
||||||
|
</LineStyle>
|
||||||
|
<BalloonStyle>
|
||||||
|
<text>$[description]</text>
|
||||||
|
</BalloonStyle>
|
||||||
|
</Style>
|
||||||
|
<StyleMap id="whiteFeature">
|
||||||
|
<Pair>
|
||||||
|
<key>normal</key>
|
||||||
|
<styleUrl>#n_whitePushpin</styleUrl>
|
||||||
|
</Pair>
|
||||||
|
<Pair>
|
||||||
|
<key>highlight</key>
|
||||||
|
<styleUrl>#h_whitePushpin</styleUrl>
|
||||||
|
</Pair>
|
||||||
|
</StyleMap>
|
||||||
|
<Style id="n_whitePushpin">
|
||||||
|
<IconStyle>
|
||||||
|
<scale>1.0</scale>
|
||||||
|
<Icon>
|
||||||
|
<href>http://maps.google.com/mapfiles/kml/pushpin/wht-pushpin.png</href>
|
||||||
|
</Icon>
|
||||||
|
<hotSpot x="20" y="2" xunits="pixels" yunits="pixels" />
|
||||||
|
</IconStyle>
|
||||||
|
<LabelStyle>
|
||||||
|
<scale>0</scale>
|
||||||
|
</LabelStyle>
|
||||||
|
<BalloonStyle>
|
||||||
|
<text>$[description]</text>
|
||||||
|
</BalloonStyle>
|
||||||
|
<LineStyle>
|
||||||
|
<color>FFFFFFFF</color>
|
||||||
|
<width>5.0</width>
|
||||||
|
</LineStyle>
|
||||||
|
</Style>
|
||||||
|
<Style id="h_whitePushpin">
|
||||||
|
<IconStyle>
|
||||||
|
<scale>1.3</scale>
|
||||||
|
<Icon>
|
||||||
|
<href>http://maps.google.com/mapfiles/kml/pushpin/wht-pushpin.png</href>
|
||||||
|
</Icon>
|
||||||
|
<hotSpot x="20" y="2" xunits="pixels" yunits="pixels" />
|
||||||
|
</IconStyle>
|
||||||
|
<LabelStyle>
|
||||||
|
<scale>1</scale>
|
||||||
|
</LabelStyle>
|
||||||
|
<LineStyle>
|
||||||
|
<color>FFFFFFFF</color>
|
||||||
|
<width>10.0</width>
|
||||||
|
</LineStyle>
|
||||||
|
<BalloonStyle>
|
||||||
|
<text>$[description]</text>
|
||||||
|
</BalloonStyle>
|
||||||
|
</Style>
|
||||||
|
</Document>
|
||||||
|
</kml>
|
@ -54,7 +54,7 @@
|
|||||||
|
|
||||||
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout"/>
|
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout"/>
|
||||||
<SubComponents>
|
<SubComponents>
|
||||||
<Container class="javafx.embed.swing.JFXPanel" name="jFXVizPanel">
|
<Container class="javafx.embed.swing.JFXPanel" name="jFXViewPanel">
|
||||||
<Constraints>
|
<Constraints>
|
||||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout$JSplitPaneConstraintsDescription">
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout$JSplitPaneConstraintsDescription">
|
||||||
<JSplitPaneConstraints position="left"/>
|
<JSplitPaneConstraints position="left"/>
|
||||||
|
@ -61,7 +61,7 @@ import org.sleuthkit.autopsy.timeline.explorernodes.EventRootNode;
|
|||||||
import org.sleuthkit.autopsy.timeline.ui.HistoryToolBar;
|
import org.sleuthkit.autopsy.timeline.ui.HistoryToolBar;
|
||||||
import org.sleuthkit.autopsy.timeline.ui.StatusBar;
|
import org.sleuthkit.autopsy.timeline.ui.StatusBar;
|
||||||
import org.sleuthkit.autopsy.timeline.ui.TimeZonePanel;
|
import org.sleuthkit.autopsy.timeline.ui.TimeZonePanel;
|
||||||
import org.sleuthkit.autopsy.timeline.ui.VisualizationPanel;
|
import org.sleuthkit.autopsy.timeline.ui.ViewFrame;
|
||||||
import org.sleuthkit.autopsy.timeline.ui.detailview.tree.EventsTree;
|
import org.sleuthkit.autopsy.timeline.ui.detailview.tree.EventsTree;
|
||||||
import org.sleuthkit.autopsy.timeline.ui.filtering.FilterSetPanel;
|
import org.sleuthkit.autopsy.timeline.ui.filtering.FilterSetPanel;
|
||||||
import org.sleuthkit.autopsy.timeline.zooming.ZoomSettingsPane;
|
import org.sleuthkit.autopsy.timeline.zooming.ZoomSettingsPane;
|
||||||
@ -137,7 +137,7 @@ public final class TimeLineTopComponent extends TopComponent implements Explorer
|
|||||||
LOGGER.log(Level.SEVERE, "Failed to lookup Sleuthkit object backing a SingleEvent.", ex); // NON-NLS
|
LOGGER.log(Level.SEVERE, "Failed to lookup Sleuthkit object backing a SingleEvent.", ex); // NON-NLS
|
||||||
Platform.runLater(() -> {
|
Platform.runLater(() -> {
|
||||||
Notifications.create()
|
Notifications.create()
|
||||||
.owner(jFXVizPanel.getScene().getWindow())
|
.owner(jFXViewPanel.getScene().getWindow())
|
||||||
.text(Bundle.TimelineTopComponent_selectedEventListener_errorMsg())
|
.text(Bundle.TimelineTopComponent_selectedEventListener_errorMsg())
|
||||||
.showError();
|
.showError();
|
||||||
});
|
});
|
||||||
@ -260,8 +260,8 @@ public final class TimeLineTopComponent extends TopComponent implements Explorer
|
|||||||
final VBox leftVBox = new VBox(5, timeZonePanel, historyToolBar, zoomSettingsPane, leftTabPane);
|
final VBox leftVBox = new VBox(5, timeZonePanel, historyToolBar, zoomSettingsPane, leftTabPane);
|
||||||
SplitPane.setResizableWithParent(leftVBox, Boolean.FALSE);
|
SplitPane.setResizableWithParent(leftVBox, Boolean.FALSE);
|
||||||
|
|
||||||
final VisualizationPanel visualizationPanel = new VisualizationPanel(controller, eventsTree);
|
final ViewFrame viewFrame = new ViewFrame(controller, eventsTree);
|
||||||
final SplitPane mainSplitPane = new SplitPane(leftVBox, visualizationPanel);
|
final SplitPane mainSplitPane = new SplitPane(leftVBox, viewFrame);
|
||||||
mainSplitPane.setDividerPositions(0);
|
mainSplitPane.setDividerPositions(0);
|
||||||
|
|
||||||
final Scene scene = new Scene(mainSplitPane);
|
final Scene scene = new Scene(mainSplitPane);
|
||||||
@ -278,7 +278,7 @@ public final class TimeLineTopComponent extends TopComponent implements Explorer
|
|||||||
});
|
});
|
||||||
|
|
||||||
//add ui componenets to JFXPanels
|
//add ui componenets to JFXPanels
|
||||||
jFXVizPanel.setScene(scene);
|
jFXViewPanel.setScene(scene);
|
||||||
jFXstatusPanel.setScene(new Scene(new StatusBar(controller)));
|
jFXstatusPanel.setScene(new Scene(new StatusBar(controller)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -297,7 +297,7 @@ public final class TimeLineTopComponent extends TopComponent implements Explorer
|
|||||||
|
|
||||||
jFXstatusPanel = new javafx.embed.swing.JFXPanel();
|
jFXstatusPanel = new javafx.embed.swing.JFXPanel();
|
||||||
splitYPane = new javax.swing.JSplitPane();
|
splitYPane = new javax.swing.JSplitPane();
|
||||||
jFXVizPanel = new javafx.embed.swing.JFXPanel();
|
jFXViewPanel = new javafx.embed.swing.JFXPanel();
|
||||||
horizontalSplitPane = new javax.swing.JSplitPane();
|
horizontalSplitPane = new javax.swing.JSplitPane();
|
||||||
leftFillerPanel = new javax.swing.JPanel();
|
leftFillerPanel = new javax.swing.JPanel();
|
||||||
rightfillerPanel = new javax.swing.JPanel();
|
rightfillerPanel = new javax.swing.JPanel();
|
||||||
@ -308,7 +308,7 @@ public final class TimeLineTopComponent extends TopComponent implements Explorer
|
|||||||
splitYPane.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT);
|
splitYPane.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT);
|
||||||
splitYPane.setResizeWeight(0.9);
|
splitYPane.setResizeWeight(0.9);
|
||||||
splitYPane.setPreferredSize(new java.awt.Dimension(1024, 400));
|
splitYPane.setPreferredSize(new java.awt.Dimension(1024, 400));
|
||||||
splitYPane.setLeftComponent(jFXVizPanel);
|
splitYPane.setLeftComponent(jFXViewPanel);
|
||||||
|
|
||||||
horizontalSplitPane.setDividerLocation(600);
|
horizontalSplitPane.setDividerLocation(600);
|
||||||
horizontalSplitPane.setResizeWeight(0.5);
|
horizontalSplitPane.setResizeWeight(0.5);
|
||||||
@ -361,7 +361,7 @@ public final class TimeLineTopComponent extends TopComponent implements Explorer
|
|||||||
|
|
||||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||||
private javax.swing.JSplitPane horizontalSplitPane;
|
private javax.swing.JSplitPane horizontalSplitPane;
|
||||||
private javafx.embed.swing.JFXPanel jFXVizPanel;
|
private javafx.embed.swing.JFXPanel jFXViewPanel;
|
||||||
private javafx.embed.swing.JFXPanel jFXstatusPanel;
|
private javafx.embed.swing.JFXPanel jFXstatusPanel;
|
||||||
private javax.swing.JPanel leftFillerPanel;
|
private javax.swing.JPanel leftFillerPanel;
|
||||||
private javax.swing.JPanel rightfillerPanel;
|
private javax.swing.JPanel rightfillerPanel;
|
||||||
|
@ -71,7 +71,7 @@ public class SaveSnapshotAsReport extends Action {
|
|||||||
"Timeline.ModuleName=Timeline",
|
"Timeline.ModuleName=Timeline",
|
||||||
"SaveSnapShotAsReport.action.dialogs.title=Timeline",
|
"SaveSnapShotAsReport.action.dialogs.title=Timeline",
|
||||||
"SaveSnapShotAsReport.action.name.text=Snapshot Report",
|
"SaveSnapShotAsReport.action.name.text=Snapshot Report",
|
||||||
"SaveSnapShotAsReport.action.longText=Save a screen capture of the visualization as a report.",
|
"SaveSnapShotAsReport.action.longText=Save a screen capture of the current view of the timeline as a report.",
|
||||||
"# {0} - report file path",
|
"# {0} - report file path",
|
||||||
"SaveSnapShotAsReport.ReportSavedAt=Report saved at [{0}]",
|
"SaveSnapShotAsReport.ReportSavedAt=Report saved at [{0}]",
|
||||||
"SaveSnapShotAsReport.Success=Success",
|
"SaveSnapShotAsReport.Success=Success",
|
||||||
|
@ -21,6 +21,7 @@ package org.sleuthkit.autopsy.timeline.datamodel;
|
|||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Objects;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import org.sleuthkit.autopsy.timeline.datamodel.eventtype.EventType;
|
import org.sleuthkit.autopsy.timeline.datamodel.eventtype.EventType;
|
||||||
|
|
||||||
@ -43,8 +44,7 @@ public class CombinedEvent {
|
|||||||
* epoch.
|
* epoch.
|
||||||
* @param description The full description shared by all the combined events
|
* @param description The full description shared by all the combined events
|
||||||
* @param fileID The ID of the file all the combined events are for.
|
* @param fileID The ID of the file all the combined events are for.
|
||||||
* @param eventMap A map from EventType to the ID of the event for the
|
* @param eventMap A map from EventType to event ID.
|
||||||
* given file ID with that type.
|
|
||||||
*/
|
*/
|
||||||
public CombinedEvent(long epochMillis, String description, long fileID, Map<EventType, Long> eventMap) {
|
public CombinedEvent(long epochMillis, String description, long fileID, Map<EventType, Long> eventMap) {
|
||||||
this.epochMillis = epochMillis;
|
this.epochMillis = epochMillis;
|
||||||
@ -105,7 +105,45 @@ public class CombinedEvent {
|
|||||||
*
|
*
|
||||||
* @return An arbitrary representative event ID for the combined events.
|
* @return An arbitrary representative event ID for the combined events.
|
||||||
*/
|
*/
|
||||||
public Long getRepresentitiveEventID() {
|
public Long getRepresentativeEventID() {
|
||||||
return eventTypeMap.values().stream().findFirst().get();
|
return eventTypeMap.values().stream().findFirst().get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
int hash = 3;
|
||||||
|
hash = 53 * hash + (int) (this.fileID ^ (this.fileID >>> 32));
|
||||||
|
hash = 53 * hash + (int) (this.epochMillis ^ (this.epochMillis >>> 32));
|
||||||
|
hash = 53 * hash + Objects.hashCode(this.description);
|
||||||
|
hash = 53 * hash + Objects.hashCode(this.eventTypeMap);
|
||||||
|
return hash;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if (this == obj) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (obj == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (getClass() != obj.getClass()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
final CombinedEvent other = (CombinedEvent) obj;
|
||||||
|
if (this.fileID != other.fileID) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (this.epochMillis != other.epochMillis) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!Objects.equals(this.description, other.description)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!Objects.equals(this.eventTypeMap, other.eventTypeMap)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -20,7 +20,7 @@ package org.sleuthkit.autopsy.timeline.events;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* A "local" event published by filteredEventsModel to indicate that the user
|
* A "local" event published by filteredEventsModel to indicate that the user
|
||||||
* requested that the current visualization be refreshed with out changing any
|
* requested that the current view be refreshed with out changing any
|
||||||
* of the parameters ( to include more up to date tag data for example.)
|
* of the parameters ( to include more up to date tag data for example.)
|
||||||
*
|
*
|
||||||
* This event is not intended for use out side of the Timeline module.
|
* This event is not intended for use out side of the Timeline module.
|
||||||
|
@ -70,7 +70,7 @@ public class SnapShotReportWriter {
|
|||||||
* @param zoomParams The ZoomParams in effect when the snapshot was
|
* @param zoomParams The ZoomParams in effect when the snapshot was
|
||||||
* taken.
|
* taken.
|
||||||
* @param generationDate The generation Date of the report.
|
* @param generationDate The generation Date of the report.
|
||||||
* @param snapshot A snapshot of the visualization to include in the
|
* @param snapshot A snapshot of the view to include in the
|
||||||
* report.
|
* report.
|
||||||
*/
|
*/
|
||||||
public SnapShotReportWriter(Case currentCase, Path reportFolderPath, String reportName, ZoomParams zoomParams, Date generationDate, BufferedImage snapshot) {
|
public SnapShotReportWriter(Case currentCase, Path reportFolderPath, String reportName, ZoomParams zoomParams, Date generationDate, BufferedImage snapshot) {
|
||||||
|
@ -136,7 +136,7 @@ public abstract class AbstractTimeLineView extends BorderPane {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Refresh this view based on current state of zoom / filters. Primarily
|
* Refresh this view based on current state of zoom / filters. Primarily
|
||||||
* this invokes the background VisualizationUpdateTask returned by
|
* this invokes the background ViewRefreshTask returned by
|
||||||
* getUpdateTask(), which derived classes must implement.
|
* getUpdateTask(), which derived classes must implement.
|
||||||
*
|
*
|
||||||
* TODO: replace this logic with a javafx Service ? -jm
|
* TODO: replace this logic with a javafx Service ? -jm
|
||||||
@ -291,11 +291,11 @@ public abstract class AbstractTimeLineView extends BorderPane {
|
|||||||
* @throws Exception If there is an unhandled exception during the
|
* @throws Exception If there is an unhandled exception during the
|
||||||
* background operation
|
* background operation
|
||||||
*/
|
*/
|
||||||
@NbBundle.Messages(value = {"VisualizationUpdateTask.preparing=Analyzing zoom and filter settings"})
|
@NbBundle.Messages(value = {"ViewRefreshTask.preparing=Analyzing zoom and filter settings"})
|
||||||
@Override
|
@Override
|
||||||
protected Boolean call() throws Exception {
|
protected Boolean call() throws Exception {
|
||||||
updateProgress(-1, 1);
|
updateProgress(-1, 1);
|
||||||
updateMessage(Bundle.VisualizationUpdateTask_preparing());
|
updateMessage(Bundle.ViewRefreshTask_preparing());
|
||||||
Platform.runLater(() -> {
|
Platform.runLater(() -> {
|
||||||
MaskerPane maskerPane = new MaskerPane();
|
MaskerPane maskerPane = new MaskerPane();
|
||||||
maskerPane.textProperty().bind(messageProperty());
|
maskerPane.textProperty().bind(messageProperty());
|
||||||
|
@ -57,7 +57,7 @@ import org.sleuthkit.autopsy.timeline.TimeLineController;
|
|||||||
import org.sleuthkit.autopsy.timeline.datamodel.eventtype.EventType;
|
import org.sleuthkit.autopsy.timeline.datamodel.eventtype.EventType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Abstract base class for TimeLineChart based visualizations.
|
* Abstract base class for TimeLineChart based views.
|
||||||
*
|
*
|
||||||
* @param <X> The type of data plotted along the x axis
|
* @param <X> The type of data plotted along the x axis
|
||||||
* @param <Y> The type of data plotted along the y axis
|
* @param <Y> The type of data plotted along the y axis
|
||||||
@ -74,12 +74,12 @@ public abstract class AbstractTimelineChart<X, Y, NodeType extends Node, ChartTy
|
|||||||
|
|
||||||
private static final Logger LOGGER = Logger.getLogger(AbstractTimelineChart.class.getName());
|
private static final Logger LOGGER = Logger.getLogger(AbstractTimelineChart.class.getName());
|
||||||
|
|
||||||
@NbBundle.Messages("AbstractVisualization.Default_Tooltip.text=Drag the mouse to select a time interval to zoom into.\nRight-click for more actions.")
|
@NbBundle.Messages("AbstractTimelineChart.defaultTooltip.text=Drag the mouse to select a time interval to zoom into.\nRight-click for more actions.")
|
||||||
private static final Tooltip DEFAULT_TOOLTIP = new Tooltip(Bundle.AbstractVisualization_Default_Tooltip_text());
|
private static final Tooltip DEFAULT_TOOLTIP = new Tooltip(Bundle.AbstractTimelineChart_defaultTooltip_text());
|
||||||
private static final Border ONLY_LEFT_BORDER = new Border(new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID, CornerRadii.EMPTY, new BorderWidths(0, 0, 0, 1)));
|
private static final Border ONLY_LEFT_BORDER = new Border(new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID, CornerRadii.EMPTY, new BorderWidths(0, 0, 0, 1)));
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the tool tip to use for this visualization when no more specific
|
* Get the tool tip to use for this view when no more specific
|
||||||
* Tooltip is needed.
|
* Tooltip is needed.
|
||||||
*
|
*
|
||||||
* @return The default Tooltip.
|
* @return The default Tooltip.
|
||||||
@ -89,10 +89,10 @@ public abstract class AbstractTimelineChart<X, Y, NodeType extends Node, ChartTy
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The visualization nodes that are selected.
|
* The nodes that are selected.
|
||||||
*
|
*
|
||||||
* @return An ObservableList<NodeType> of the nodes that are selected in
|
* @return An ObservableList<NodeType> of the nodes that are selected in
|
||||||
* this visualization.
|
* this view.
|
||||||
*/
|
*/
|
||||||
protected ObservableList<NodeType> getSelectedNodes() {
|
protected ObservableList<NodeType> getSelectedNodes() {
|
||||||
return selectedNodes;
|
return selectedNodes;
|
||||||
@ -127,18 +127,18 @@ public abstract class AbstractTimelineChart<X, Y, NodeType extends Node, ChartTy
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the CharType that implements this visualization.
|
* Get the CharType that implements this view.
|
||||||
*
|
*
|
||||||
* @return The CharType that implements this visualization.
|
* @return The CharType that implements this view.
|
||||||
*/
|
*/
|
||||||
protected ChartType getChart() {
|
protected ChartType getChart() {
|
||||||
return chart;
|
return chart;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the ChartType that implements this visualization.
|
* Set the ChartType that implements this view.
|
||||||
*
|
*
|
||||||
* @param chart The ChartType that implements this visualization.
|
* @param chart The ChartType that implements this view.
|
||||||
*/
|
*/
|
||||||
@ThreadConfined(type = ThreadConfined.ThreadType.JFX)
|
@ThreadConfined(type = ThreadConfined.ThreadType.JFX)
|
||||||
protected void setChart(ChartType chart) {
|
protected void setChart(ChartType chart) {
|
||||||
@ -147,7 +147,7 @@ public abstract class AbstractTimelineChart<X, Y, NodeType extends Node, ChartTy
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Apply this visualization's 'selection effect' to the given node.
|
* Apply this view's 'selection effect' to the given node.
|
||||||
*
|
*
|
||||||
* @param node The node to apply the 'effect' to.
|
* @param node The node to apply the 'effect' to.
|
||||||
*/
|
*/
|
||||||
@ -156,7 +156,7 @@ public abstract class AbstractTimelineChart<X, Y, NodeType extends Node, ChartTy
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove this visualization's 'selection effect' from the given node.
|
* Remove this view's 'selection effect' from the given node.
|
||||||
*
|
*
|
||||||
* @param node The node to remvoe the 'effect' from.
|
* @param node The node to remvoe the 'effect' from.
|
||||||
*/
|
*/
|
||||||
@ -168,7 +168,7 @@ public abstract class AbstractTimelineChart<X, Y, NodeType extends Node, ChartTy
|
|||||||
* Should the tick mark at the given value be bold, because it has
|
* Should the tick mark at the given value be bold, because it has
|
||||||
* interesting data associated with it?
|
* interesting data associated with it?
|
||||||
*
|
*
|
||||||
* @param value A value along this visualization's x axis
|
* @param value A value along this view's x axis
|
||||||
*
|
*
|
||||||
* @return True if the tick label for the given value should be bold ( has
|
* @return True if the tick label for the given value should be bold ( has
|
||||||
* relevant data), false otherwise
|
* relevant data), false otherwise
|
||||||
@ -176,7 +176,7 @@ public abstract class AbstractTimelineChart<X, Y, NodeType extends Node, ChartTy
|
|||||||
abstract protected Boolean isTickBold(X value);
|
abstract protected Boolean isTickBold(X value);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Apply this visualization's 'selection effect' to the given node, if
|
* Apply this view's 'selection effect' to the given node, if
|
||||||
* applied is true. If applied is false, remove the affect
|
* applied is true. If applied is false, remove the affect
|
||||||
*
|
*
|
||||||
* @param node The node to apply the 'effect' to
|
* @param node The node to apply the 'effect' to
|
||||||
@ -203,16 +203,16 @@ public abstract class AbstractTimelineChart<X, Y, NodeType extends Node, ChartTy
|
|||||||
abstract protected double getTickSpacing();
|
abstract protected double getTickSpacing();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the X-Axis of this Visualization's chart
|
* Get the X-Axis of this view's chart
|
||||||
*
|
*
|
||||||
* @return The horizontal axis used by this Visualization's chart
|
* @return The horizontal axis used by this view's chart
|
||||||
*/
|
*/
|
||||||
abstract protected Axis<X> getXAxis();
|
abstract protected Axis<X> getXAxis();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the Y-Axis of this Visualization's chart
|
* Get the Y-Axis of this view's chart
|
||||||
*
|
*
|
||||||
* @return The vertical axis used by this Visualization's chart
|
* @return The vertical axis used by this view's chart
|
||||||
*/
|
*/
|
||||||
abstract protected Axis<Y> getYAxis();
|
abstract protected Axis<Y> getYAxis();
|
||||||
|
|
||||||
@ -252,7 +252,7 @@ public abstract class AbstractTimelineChart<X, Y, NodeType extends Node, ChartTy
|
|||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
*
|
*
|
||||||
* @param controller The TimelineController for this visualization.
|
* @param controller The TimelineController for this view.
|
||||||
*/
|
*/
|
||||||
protected AbstractTimelineChart(TimeLineController controller) {
|
protected AbstractTimelineChart(TimeLineController controller) {
|
||||||
super(controller);
|
super(controller);
|
||||||
|
@ -35,13 +35,13 @@ Timeline.ui.ZoomRanges.threeyears.text=Three Years
|
|||||||
Timeline.ui.ZoomRanges.fiveyears.text=Five Years
|
Timeline.ui.ZoomRanges.fiveyears.text=Five Years
|
||||||
Timeline.ui.ZoomRanges.tenyears.text=Ten Years
|
Timeline.ui.ZoomRanges.tenyears.text=Ten Years
|
||||||
Timeline.ui.ZoomRanges.all.text=All
|
Timeline.ui.ZoomRanges.all.text=All
|
||||||
VisualizationPanel.histogramTask.title=Rebuild Histogram
|
ViewFrame.histogramTask.title=Rebuild Histogram
|
||||||
VisualizationPanel.histogramTask.preparing=preparing
|
ViewFrame.histogramTask.preparing=preparing
|
||||||
VisualizationPanel.histogramTask.resetUI=resetting ui
|
ViewFrame.histogramTask.resetUI=resetting ui
|
||||||
VisualizationPanel.histogramTask.queryDb=querying db
|
ViewFrame.histogramTask.queryDb=querying db
|
||||||
VisualizationPanel.histogramTask.updateUI2=updating ui
|
ViewFrame.histogramTask.updateUI2=updating ui
|
||||||
VisualizationPanel.noEventsDialogLabel.text=There are no events visible with the current zoom / filter settings.
|
ViewFrame.noEventsDialogLabel.text=There are no events visible with the current zoom / filter settings.
|
||||||
VisualizationPanel.zoomButton.text=Zoom to events
|
ViewFrame.zoomButton.text=Zoom to events
|
||||||
TimeZonePanel.localRadio.text=Local Time Zone
|
TimeZonePanel.localRadio.text=Local Time Zone
|
||||||
TimeZonePanel.otherRadio.text=GMT / UTC
|
TimeZonePanel.otherRadio.text=GMT / UTC
|
||||||
VisualizationPanel.resetFiltersButton.text=Reset all filters
|
ViewFrame.resetFiltersButton.text=Reset all filters
|
||||||
|
@ -2,23 +2,23 @@ Timeline.node.root=\u30eb\u30fc\u30c8
|
|||||||
Timeline.ui.TimeLineChart.tooltip.text=\u30c0\u30d6\u30eb\u30af\u30ea\u30c3\u30af\u3067\u4e0b\u8a18\u306e\u7bc4\u56f2\u3078\u30ba\u30fc\u30e0\uff1a\n{0}\u301c{1}\n\u53f3\u30af\u30ea\u30c3\u30af\u3067\u5143\u306b\u623b\u308a\u307e\u3059\u3002
|
Timeline.ui.TimeLineChart.tooltip.text=\u30c0\u30d6\u30eb\u30af\u30ea\u30c3\u30af\u3067\u4e0b\u8a18\u306e\u7bc4\u56f2\u3078\u30ba\u30fc\u30e0\uff1a\n{0}\u301c{1}\n\u53f3\u30af\u30ea\u30c3\u30af\u3067\u5143\u306b\u623b\u308a\u307e\u3059\u3002
|
||||||
Timeline.ui.ZoomRanges.all.text=\u5168\u3066
|
Timeline.ui.ZoomRanges.all.text=\u5168\u3066
|
||||||
|
|
||||||
VisualizationPanel.histogramTask.preparing=\u6e96\u5099\u4e2d
|
ViewFrame.histogramTask.preparing=\u6e96\u5099\u4e2d
|
||||||
VisualizationPanel.histogramTask.queryDb=DB\u3092\u30af\u30a8\u30ea\u4e2d
|
ViewFrame.histogramTask.queryDb=DB\u3092\u30af\u30a8\u30ea\u4e2d
|
||||||
VisualizationPanel.histogramTask.resetUI=ui\u3092\u518d\u8a2d\u5b9a\u4e2d
|
ViewFrame.histogramTask.resetUI=ui\u3092\u518d\u8a2d\u5b9a\u4e2d
|
||||||
VisualizationPanel.histogramTask.title=\u30d2\u30b9\u30c8\u30b0\u30e9\u30e0\u3092\u518d\u30d3\u30eb\u30c9
|
ViewFrame.histogramTask.title=\u30d2\u30b9\u30c8\u30b0\u30e9\u30e0\u3092\u518d\u30d3\u30eb\u30c9
|
||||||
VisualizationPanel.histogramTask.updateUI2=ui\u3092\u66f4\u65b0\u4e2d
|
ViewFrame.histogramTask.updateUI2=ui\u3092\u66f4\u65b0\u4e2d
|
||||||
TimeZonePanel.localRadio.text=\u30ed\u30fc\u30ab\u30eb\u30bf\u30a4\u30e0\u30be\u30fc\u30f3
|
TimeZonePanel.localRadio.text=\u30ed\u30fc\u30ab\u30eb\u30bf\u30a4\u30e0\u30be\u30fc\u30f3
|
||||||
VisualizationPanel.countsToggle.text=\u30ab\u30a6\u30f3\u30c8
|
ViewFrame.countsToggle.text=\u30ab\u30a6\u30f3\u30c8
|
||||||
VisualizationPanel.detailsToggle.text=\u8a73\u7d30
|
ViewFrame.detailsToggle.text=\u8a73\u7d30
|
||||||
VisualizationPanel.endLabel.text=\u30a8\u30f3\u30c9\uff1a
|
ViewFrame.endLabel.text=\u30a8\u30f3\u30c9\uff1a
|
||||||
VisualizationPanel.noEventsDialogLabel.text=\u73fe\u5728\u306e\u30ba\u30fc\u30e0\uff0f\u30d5\u30a3\u30eb\u30bf\u30fc\u8a2d\u5b9a\u3067\u306f\u898b\u3048\u308b\u30a4\u30d9\u30f3\u30c8\u304c\u3042\u308a\u307e\u305b\u3093\u3002
|
ViewFrame.noEventsDialogLabel.text=\u73fe\u5728\u306e\u30ba\u30fc\u30e0\uff0f\u30d5\u30a3\u30eb\u30bf\u30fc\u8a2d\u5b9a\u3067\u306f\u898b\u3048\u308b\u30a4\u30d9\u30f3\u30c8\u304c\u3042\u308a\u307e\u305b\u3093\u3002
|
||||||
VisualizationPanel.resetFiltersButton.text=\u5168\u3066\u306e\u30d5\u30a3\u30eb\u30bf\u30fc\u3092\u30ea\u30bb\u30c3\u30c8
|
ViewFrame.resetFiltersButton.text=\u5168\u3066\u306e\u30d5\u30a3\u30eb\u30bf\u30fc\u3092\u30ea\u30bb\u30c3\u30c8
|
||||||
VisualizationPanel.startLabel.text=\u30b9\u30bf\u30fc\u30c8\uff1a
|
ViewFrame.startLabel.text=\u30b9\u30bf\u30fc\u30c8\uff1a
|
||||||
VisualizationPanel.visualizationModeLabel.text=\u30d3\u30b8\u30e5\u30a2\u30e9\u30a4\u30bc\u30fc\u30b7\u30e7\u30f3\u30e2\u30fc\u30c9\uff1a
|
ViewFrame.viewModeLabel.text=\u30d3\u30b8\u30e5\u30a2\u30e9\u30a4\u30bc\u30fc\u30b7\u30e7\u30f3\u30e2\u30fc\u30c9\uff1a
|
||||||
VisualizationPanel.zoomButton.text=\u30a4\u30d9\u30f3\u30c8\u3078\u30ba\u30fc\u30e0
|
ViewFrame.zoomButton.text=\u30a4\u30d9\u30f3\u30c8\u3078\u30ba\u30fc\u30e0
|
||||||
VisualizationPanel.zoomMenuButton.text=\u4e0b\u8a18\u3078\u30ba\u30fc\u30e0\u30a4\u30f3\uff0f\u30ba\u30fc\u30e0\u30a2\u30a6\u30c8
|
ViewFrame.zoomMenuButton.text=\u4e0b\u8a18\u3078\u30ba\u30fc\u30e0\u30a4\u30f3\uff0f\u30ba\u30fc\u30e0\u30a2\u30a6\u30c8
|
||||||
*=Autopsy\u30d5\u30a9\u30ec\u30f3\u30b8\u30c3\u30af\u30d6\u30e9\u30a6\u30b6
|
*=Autopsy\u30d5\u30a9\u30ec\u30f3\u30b8\u30c3\u30af\u30d6\u30e9\u30a6\u30b6
|
||||||
AbstractVisualization.Default_Tooltip.text=\u30de\u30a6\u30b9\u3092\u30c9\u30e9\u30c3\u30b0\u3057\u3066\u30ba\u30fc\u30e0\u3059\u308b\u30bf\u30a4\u30e0\u9593\u9694\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002\n\u305d\u306e\u4ed6\u306e\u30a2\u30af\u30b7\u30e7\u30f3\u306f\u53f3\u30af\u30ea\u30c3\u30af\u3057\u3066\u304f\u3060\u3055\u3044
|
AbstractTimelineChart.defaultTooltip.text=\u30de\u30a6\u30b9\u3092\u30c9\u30e9\u30c3\u30b0\u3057\u3066\u30ba\u30fc\u30e0\u3059\u308b\u30bf\u30a4\u30e0\u9593\u9694\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002\n\u305d\u306e\u4ed6\u306e\u30a2\u30af\u30b7\u30e7\u30f3\u306f\u53f3\u30af\u30ea\u30c3\u30af\u3057\u3066\u304f\u3060\u3055\u3044
|
||||||
IntervalSelector.ClearSelectedIntervalAction.tooltTipText=\u9078\u629e\u3057\u305f\u9593\u9694\u3092\u30af\u30ea\u30a2\u3059\u308b
|
IntervalSelector.ClearSelectedIntervalAction.tooltTipText=\u9078\u629e\u3057\u305f\u9593\u9694\u3092\u30af\u30ea\u30a2\u3059\u308b
|
||||||
IntervalSelector.ZoomAction.name=\u30ba\u30fc\u30e0
|
IntervalSelector.ZoomAction.name=\u30ba\u30fc\u30e0
|
||||||
NoEventsDialog.titledPane.text=\u898b\u308c\u308b\u30a4\u30d9\u30f3\u30c8\u304c\u3042\u308a\u307e\u305b\u3093
|
NoEventsDialog.titledPane.text=\u898b\u308c\u308b\u30a4\u30d9\u30f3\u30c8\u304c\u3042\u308a\u307e\u305b\u3093
|
||||||
@ -40,6 +40,6 @@ Timeline.ui.ZoomRanges.fiveyears.text=5\u5e74
|
|||||||
Timeline.ui.ZoomRanges.tenyears.text=10\u5e74
|
Timeline.ui.ZoomRanges.tenyears.text=10\u5e74
|
||||||
TimeLineChart.zoomHistoryActionGroup.name=\u30ba\u30fc\u30e0\u5c65\u6b74
|
TimeLineChart.zoomHistoryActionGroup.name=\u30ba\u30fc\u30e0\u5c65\u6b74
|
||||||
TimeZonePanel.title=\u6642\u9593\u3092\u6b21\u3067\u8868\u793a\uff1a
|
TimeZonePanel.title=\u6642\u9593\u3092\u6b21\u3067\u8868\u793a\uff1a
|
||||||
VisualizationPanel.refresh=\u30ea\u30d5\u30ec\u30c3\u30b7\u30e5
|
ViewFrame.refresh=\u30ea\u30d5\u30ec\u30c3\u30b7\u30e5
|
||||||
VisualizationPanel.tagsAddedOrDeleted=\u30bf\u30b0\u304c\u4f5c\u6210\u3055\u308c\u307e\u3057\u305f\u304a\u3088\u3073\u307e\u305f\u306f\u524a\u9664\u3055\u308c\u307e\u3057\u305f\u3002\u30d3\u30b8\u30e5\u30a2\u30e9\u30a4\u30bc\u30fc\u30b7\u30e7\u30f3\u304c\u6700\u65b0\u3067\u306f\u306a\u3044\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002
|
ViewFrame.tagsAddedOrDeleted=\u30bf\u30b0\u304c\u4f5c\u6210\u3055\u308c\u307e\u3057\u305f\u304a\u3088\u3073\u307e\u305f\u306f\u524a\u9664\u3055\u308c\u307e\u3057\u305f\u3002\u30d3\u30b8\u30e5\u30a2\u30e9\u30a4\u30bc\u30fc\u30b7\u30e7\u30f3\u304c\u6700\u65b0\u3067\u306f\u306a\u3044\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002
|
||||||
VisualizationUpdateTask.preparing=\u30ba\u30fc\u30e0\u304a\u3088\u3073\u30d5\u30a3\u30eb\u30bf\u30fc\u8a2d\u5b9a\u3092\u89e3\u6790\u4e2d
|
ViewRefreshTask.preparing=\u30ba\u30fc\u30e0\u304a\u3088\u3073\u30d5\u30a3\u30eb\u30bf\u30fc\u8a2d\u5b9a\u3092\u89e3\u6790\u4e2d
|
||||||
|
@ -23,7 +23,7 @@
|
|||||||
<items>
|
<items>
|
||||||
<HBox alignment="CENTER_LEFT" BorderPane.alignment="CENTER" HBox.hgrow="NEVER">
|
<HBox alignment="CENTER_LEFT" BorderPane.alignment="CENTER" HBox.hgrow="NEVER">
|
||||||
<children>
|
<children>
|
||||||
<Label fx:id="visualizationModeLabel" text="Visualisation Mode:" textAlignment="CENTER" wrapText="true" HBox.hgrow="NEVER">
|
<Label fx:id="viewModeLabel" text="View Mode:" textAlignment="CENTER" wrapText="true" HBox.hgrow="NEVER">
|
||||||
<HBox.margin>
|
<HBox.margin>
|
||||||
<Insets right="5.0" />
|
<Insets right="5.0" />
|
||||||
</HBox.margin>
|
</HBox.margin>
|
||||||
@ -93,7 +93,7 @@
|
|||||||
</graphic>
|
</graphic>
|
||||||
</Button>
|
</Button>
|
||||||
<Separator maxWidth="1.7976931348623157E308" orientation="VERTICAL" />
|
<Separator maxWidth="1.7976931348623157E308" orientation="VERTICAL" />
|
||||||
<Button fx:id="refreshButton" alignment="CENTER_RIGHT" mnemonicParsing="false" text="Refresh Vis.">
|
<Button fx:id="refreshButton" alignment="CENTER_RIGHT" mnemonicParsing="false" text="Refresh View">
|
||||||
<graphic>
|
<graphic>
|
||||||
<ImageView fitHeight="16.0" fitWidth="16.0" pickOnBounds="true" preserveRatio="true">
|
<ImageView fitHeight="16.0" fitWidth="16.0" pickOnBounds="true" preserveRatio="true">
|
||||||
<image>
|
<image>
|
@ -97,9 +97,9 @@ import org.sleuthkit.autopsy.timeline.utils.RangeDivisionInfo;
|
|||||||
*
|
*
|
||||||
* TODO: Refactor common code out of histogram and CountsView? -jm
|
* TODO: Refactor common code out of histogram and CountsView? -jm
|
||||||
*/
|
*/
|
||||||
final public class VisualizationPanel extends BorderPane {
|
final public class ViewFrame extends BorderPane {
|
||||||
|
|
||||||
private static final Logger LOGGER = Logger.getLogger(VisualizationPanel.class.getName());
|
private static final Logger LOGGER = Logger.getLogger(ViewFrame.class.getName());
|
||||||
|
|
||||||
private static final Image INFORMATION = new Image("org/sleuthkit/autopsy/timeline/images/information.png", 16, 16, true, true); // NON-NLS
|
private static final Image INFORMATION = new Image("org/sleuthkit/autopsy/timeline/images/information.png", 16, 16, true, true); // NON-NLS
|
||||||
private static final Image WARNING = new Image("org/sleuthkit/autopsy/timeline/images/warning_triangle.png", 16, 16, true, true); // NON-NLS
|
private static final Image WARNING = new Image("org/sleuthkit/autopsy/timeline/images/warning_triangle.png", 16, 16, true, true); // NON-NLS
|
||||||
@ -108,7 +108,7 @@ final public class VisualizationPanel extends BorderPane {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Region that will be stacked in between the no-events "dialog" and the
|
* Region that will be stacked in between the no-events "dialog" and the
|
||||||
* hosted AbstractVisualizationPane in order to gray out the visualization.
|
* hosted AbstractTimelineView in order to gray out the AbstractTimelineView.
|
||||||
*/
|
*/
|
||||||
private final static Region NO_EVENTS_BACKGROUND = new Region() {
|
private final static Region NO_EVENTS_BACKGROUND = new Region() {
|
||||||
{
|
{
|
||||||
@ -159,7 +159,7 @@ final public class VisualizationPanel extends BorderPane {
|
|||||||
@FXML
|
@FXML
|
||||||
private ToolBar toolBar;
|
private ToolBar toolBar;
|
||||||
@FXML
|
@FXML
|
||||||
private Label visualizationModeLabel;
|
private Label viewModeLabel;
|
||||||
@FXML
|
@FXML
|
||||||
private SegmentedButton modeSegButton;
|
private SegmentedButton modeSegButton;
|
||||||
@FXML
|
@FXML
|
||||||
@ -176,7 +176,7 @@ final public class VisualizationPanel extends BorderPane {
|
|||||||
private Button updateDBButton;
|
private Button updateDBButton;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Wraps contained visualization so that we can show notifications over it.
|
* Wraps contained AbstractTimelineView so that we can show notifications over it.
|
||||||
*/
|
*/
|
||||||
private final NotificationPane notificationPane = new NotificationPane();
|
private final NotificationPane notificationPane = new NotificationPane();
|
||||||
|
|
||||||
@ -245,26 +245,26 @@ final public class VisualizationPanel extends BorderPane {
|
|||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
*
|
*
|
||||||
* @param controller The TimeLineController for this VisualizationPanel
|
* @param controller The TimeLineController for this ViewFrame
|
||||||
* @param eventsTree The EventsTree this VisualizationPanel hosts.
|
* @param eventsTree The EventsTree this ViewFrame hosts.
|
||||||
*/
|
*/
|
||||||
public VisualizationPanel(@Nonnull TimeLineController controller, @Nonnull EventsTree eventsTree) {
|
public ViewFrame(@Nonnull TimeLineController controller, @Nonnull EventsTree eventsTree) {
|
||||||
this.controller = controller;
|
this.controller = controller;
|
||||||
this.filteredEvents = controller.getEventsModel();
|
this.filteredEvents = controller.getEventsModel();
|
||||||
this.eventsTree = eventsTree;
|
this.eventsTree = eventsTree;
|
||||||
FXMLConstructor.construct(this, "VisualizationPanel.fxml"); // NON-NLS
|
FXMLConstructor.construct(this, "ViewFrame.fxml"); // NON-NLS
|
||||||
}
|
}
|
||||||
|
|
||||||
@FXML
|
@FXML
|
||||||
@NbBundle.Messages({
|
@NbBundle.Messages({
|
||||||
"VisualizationPanel.visualizationModeLabel.text=Visualization Mode:",
|
"ViewFrame.viewModeLabel.text=View Mode:",
|
||||||
"VisualizationPanel.startLabel.text=Start:",
|
"ViewFrame.startLabel.text=Start:",
|
||||||
"VisualizationPanel.endLabel.text=End:",
|
"ViewFrame.endLabel.text=End:",
|
||||||
"VisualizationPanel.countsToggle.text=Counts",
|
"ViewFrame.countsToggle.text=Counts",
|
||||||
"VisualizationPanel.detailsToggle.text=Details",
|
"ViewFrame.detailsToggle.text=Details",
|
||||||
"VisualizationPanel.listToggle.text=List",
|
"ViewFrame.listToggle.text=List",
|
||||||
"VisualizationPanel.zoomMenuButton.text=Zoom in/out to",
|
"ViewFrame.zoomMenuButton.text=Zoom in/out to",
|
||||||
"VisualizationPanel.tagsAddedOrDeleted=Tags have been created and/or deleted. The visualization may not be up to date."
|
"ViewFrame.tagsAddedOrDeleted=Tags have been created and/or deleted. The view may not be up to date."
|
||||||
})
|
})
|
||||||
void initialize() {
|
void initialize() {
|
||||||
assert endPicker != null : "fx:id=\"endPicker\" was not injected: check your FXML file 'ViewWrapper.fxml'."; // NON-NLS
|
assert endPicker != null : "fx:id=\"endPicker\" was not injected: check your FXML file 'ViewWrapper.fxml'."; // NON-NLS
|
||||||
@ -278,11 +278,11 @@ final public class VisualizationPanel extends BorderPane {
|
|||||||
notificationPane.getStyleClass().add(NotificationPane.STYLE_CLASS_DARK);
|
notificationPane.getStyleClass().add(NotificationPane.STYLE_CLASS_DARK);
|
||||||
setCenter(notificationPane);
|
setCenter(notificationPane);
|
||||||
|
|
||||||
//configure visualization mode toggle
|
//configure view mode toggle
|
||||||
visualizationModeLabel.setText(Bundle.VisualizationPanel_visualizationModeLabel_text());
|
viewModeLabel.setText(Bundle.ViewFrame_viewModeLabel_text());
|
||||||
countsToggle.setText(Bundle.VisualizationPanel_countsToggle_text());
|
countsToggle.setText(Bundle.ViewFrame_countsToggle_text());
|
||||||
detailsToggle.setText(Bundle.VisualizationPanel_detailsToggle_text());
|
detailsToggle.setText(Bundle.ViewFrame_detailsToggle_text());
|
||||||
listToggle.setText(Bundle.VisualizationPanel_listToggle_text());
|
listToggle.setText(Bundle.ViewFrame_listToggle_text());
|
||||||
|
|
||||||
ToggleGroupValue<ViewMode> visModeToggleGroup = new ToggleGroupValue<>();
|
ToggleGroupValue<ViewMode> visModeToggleGroup = new ToggleGroupValue<>();
|
||||||
visModeToggleGroup.add(listToggle, ViewMode.LIST);
|
visModeToggleGroup.add(listToggle, ViewMode.LIST);
|
||||||
@ -302,8 +302,8 @@ final public class VisualizationPanel extends BorderPane {
|
|||||||
ActionUtils.configureButton(new UpdateDB(controller), updateDBButton);
|
ActionUtils.configureButton(new UpdateDB(controller), updateDBButton);
|
||||||
|
|
||||||
/////configure start and end pickers
|
/////configure start and end pickers
|
||||||
startLabel.setText(Bundle.VisualizationPanel_startLabel_text());
|
startLabel.setText(Bundle.ViewFrame_startLabel_text());
|
||||||
endLabel.setText(Bundle.VisualizationPanel_endLabel_text());
|
endLabel.setText(Bundle.ViewFrame_endLabel_text());
|
||||||
|
|
||||||
//suppress stacktraces on malformed input
|
//suppress stacktraces on malformed input
|
||||||
//TODO: should we do anything else? show a warning?
|
//TODO: should we do anything else? show a warning?
|
||||||
@ -344,7 +344,7 @@ final public class VisualizationPanel extends BorderPane {
|
|||||||
}
|
}
|
||||||
})));
|
})));
|
||||||
}
|
}
|
||||||
zoomMenuButton.setText(Bundle.VisualizationPanel_zoomMenuButton_text());
|
zoomMenuButton.setText(Bundle.ViewFrame_zoomMenuButton_text());
|
||||||
ActionUtils.configureButton(new ZoomOut(controller), zoomOutButton);
|
ActionUtils.configureButton(new ZoomOut(controller), zoomOutButton);
|
||||||
ActionUtils.configureButton(new ZoomIn(controller), zoomInButton);
|
ActionUtils.configureButton(new ZoomIn(controller), zoomInButton);
|
||||||
|
|
||||||
@ -355,17 +355,17 @@ final public class VisualizationPanel extends BorderPane {
|
|||||||
TimeLineController.getTimeZone().addListener(timeZoneProp -> refreshTimeUI());
|
TimeLineController.getTimeZone().addListener(timeZoneProp -> refreshTimeUI());
|
||||||
filteredEvents.timeRangeProperty().addListener(timeRangeProp -> refreshTimeUI());
|
filteredEvents.timeRangeProperty().addListener(timeRangeProp -> refreshTimeUI());
|
||||||
filteredEvents.zoomParametersProperty().addListener(zoomListener);
|
filteredEvents.zoomParametersProperty().addListener(zoomListener);
|
||||||
refreshTimeUI(); //populate the viz
|
refreshTimeUI(); //populate the view
|
||||||
|
|
||||||
refreshHistorgram();
|
refreshHistorgram();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handle TagsUpdatedEvents by marking that the visualization needs to be
|
* Handle TagsUpdatedEvents by marking that the view needs to be
|
||||||
* refreshed.
|
* refreshed.
|
||||||
*
|
*
|
||||||
* NOTE: This VisualizationPanel must be registered with the
|
* NOTE: This ViewFrame must be registered with the
|
||||||
* filteredEventsModel's EventBus in order for this handler to be invoked.
|
* filteredEventsModel's EventBus in order for this handler to be invoked.
|
||||||
*
|
*
|
||||||
* @param event The TagsUpdatedEvent to handle.
|
* @param event The TagsUpdatedEvent to handle.
|
||||||
@ -376,7 +376,7 @@ final public class VisualizationPanel extends BorderPane {
|
|||||||
Platform.runLater(() -> {
|
Platform.runLater(() -> {
|
||||||
if (notificationPane.isShowing() == false) {
|
if (notificationPane.isShowing() == false) {
|
||||||
notificationPane.getActions().setAll(new Refresh());
|
notificationPane.getActions().setAll(new Refresh());
|
||||||
notificationPane.show(Bundle.VisualizationPanel_tagsAddedOrDeleted(), new ImageView(INFORMATION));
|
notificationPane.show(Bundle.ViewFrame_tagsAddedOrDeleted(), new ImageView(INFORMATION));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -385,7 +385,7 @@ final public class VisualizationPanel extends BorderPane {
|
|||||||
* Handle a RefreshRequestedEvent from the events model by clearing the
|
* Handle a RefreshRequestedEvent from the events model by clearing the
|
||||||
* refresh notification.
|
* refresh notification.
|
||||||
*
|
*
|
||||||
* NOTE: This VisualizationPanel must be registered with the
|
* NOTE: This ViewFrame must be registered with the
|
||||||
* filteredEventsModel's EventBus in order for this handler to be invoked.
|
* filteredEventsModel's EventBus in order for this handler to be invoked.
|
||||||
*
|
*
|
||||||
* @param event The RefreshRequestedEvent to handle.
|
* @param event The RefreshRequestedEvent to handle.
|
||||||
@ -393,7 +393,7 @@ final public class VisualizationPanel extends BorderPane {
|
|||||||
@Subscribe
|
@Subscribe
|
||||||
public void handleRefreshRequested(RefreshRequestedEvent event) {
|
public void handleRefreshRequested(RefreshRequestedEvent event) {
|
||||||
Platform.runLater(() -> {
|
Platform.runLater(() -> {
|
||||||
if (Bundle.VisualizationPanel_tagsAddedOrDeleted().equals(notificationPane.getText())) {
|
if (Bundle.ViewFrame_tagsAddedOrDeleted().equals(notificationPane.getText())) {
|
||||||
notificationPane.hide();
|
notificationPane.hide();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -401,9 +401,9 @@ final public class VisualizationPanel extends BorderPane {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Handle a DBUpdatedEvent from the events model by refreshing the
|
* Handle a DBUpdatedEvent from the events model by refreshing the
|
||||||
* visualization.
|
* view.
|
||||||
*
|
*
|
||||||
* NOTE: This VisualizationPanel must be registered with the
|
* NOTE: This ViewFrame must be registered with the
|
||||||
* filteredEventsModel's EventBus in order for this handler to be invoked.
|
* filteredEventsModel's EventBus in order for this handler to be invoked.
|
||||||
*
|
*
|
||||||
* @param event The DBUpdatedEvent to handle.
|
* @param event The DBUpdatedEvent to handle.
|
||||||
@ -419,7 +419,7 @@ final public class VisualizationPanel extends BorderPane {
|
|||||||
* Handle a DataSourceAddedEvent from the events model by showing a
|
* Handle a DataSourceAddedEvent from the events model by showing a
|
||||||
* notification.
|
* notification.
|
||||||
*
|
*
|
||||||
* NOTE: This VisualizationPanel must be registered with the
|
* NOTE: This ViewFrame must be registered with the
|
||||||
* filteredEventsModel's EventBus in order for this handler to be invoked.
|
* filteredEventsModel's EventBus in order for this handler to be invoked.
|
||||||
*
|
*
|
||||||
* @param event The DataSourceAddedEvent to handle.
|
* @param event The DataSourceAddedEvent to handle.
|
||||||
@ -427,11 +427,11 @@ final public class VisualizationPanel extends BorderPane {
|
|||||||
@Subscribe
|
@Subscribe
|
||||||
@NbBundle.Messages({
|
@NbBundle.Messages({
|
||||||
"# {0} - datasource name",
|
"# {0} - datasource name",
|
||||||
"VisualizationPanel.notification.newDataSource={0} has been added as a new datasource. The Timeline DB may be out of date."})
|
"ViewFrame.notification.newDataSource={0} has been added as a new datasource. The Timeline DB may be out of date."})
|
||||||
public void handlDataSourceAdded(DataSourceAddedEvent event) {
|
public void handlDataSourceAdded(DataSourceAddedEvent event) {
|
||||||
Platform.runLater(() -> {
|
Platform.runLater(() -> {
|
||||||
notificationPane.getActions().setAll(new UpdateDB(controller));
|
notificationPane.getActions().setAll(new UpdateDB(controller));
|
||||||
notificationPane.show(Bundle.VisualizationPanel_notification_newDataSource(event.getDataSource().getName()), new ImageView(WARNING));
|
notificationPane.show(Bundle.ViewFrame_notification_newDataSource(event.getDataSource().getName()), new ImageView(WARNING));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -439,7 +439,7 @@ final public class VisualizationPanel extends BorderPane {
|
|||||||
* Handle a DataSourceAnalysisCompletedEvent from the events modelby showing
|
* Handle a DataSourceAnalysisCompletedEvent from the events modelby showing
|
||||||
* a notification.
|
* a notification.
|
||||||
*
|
*
|
||||||
* NOTE: This VisualizationPanel must be registered with the
|
* NOTE: This ViewFrame must be registered with the
|
||||||
* filteredEventsModel's EventBus in order for this handler to be invoked.
|
* filteredEventsModel's EventBus in order for this handler to be invoked.
|
||||||
*
|
*
|
||||||
* @param event The DataSourceAnalysisCompletedEvent to handle.
|
* @param event The DataSourceAnalysisCompletedEvent to handle.
|
||||||
@ -447,11 +447,11 @@ final public class VisualizationPanel extends BorderPane {
|
|||||||
@Subscribe
|
@Subscribe
|
||||||
@NbBundle.Messages({
|
@NbBundle.Messages({
|
||||||
"# {0} - datasource name",
|
"# {0} - datasource name",
|
||||||
"VisualizationPanel.notification.analysisComplete=Analysis has finished for {0}. The Timeline DB may be out of date."})
|
"ViewFrame.notification.analysisComplete=Analysis has finished for {0}. The Timeline DB may be out of date."})
|
||||||
public void handleAnalysisCompleted(DataSourceAnalysisCompletedEvent event) {
|
public void handleAnalysisCompleted(DataSourceAnalysisCompletedEvent event) {
|
||||||
Platform.runLater(() -> {
|
Platform.runLater(() -> {
|
||||||
notificationPane.getActions().setAll(new UpdateDB(controller));
|
notificationPane.getActions().setAll(new UpdateDB(controller));
|
||||||
notificationPane.show(Bundle.VisualizationPanel_notification_analysisComplete(event.getDataSource().getName()), new ImageView(WARNING));
|
notificationPane.show(Bundle.ViewFrame_notification_analysisComplete(event.getDataSource().getName()), new ImageView(WARNING));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -464,13 +464,13 @@ final public class VisualizationPanel extends BorderPane {
|
|||||||
}
|
}
|
||||||
|
|
||||||
histogramTask = new LoggedTask<Void>(
|
histogramTask = new LoggedTask<Void>(
|
||||||
NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.histogramTask.title"), true) { // NON-NLS
|
NbBundle.getMessage(ViewFrame.class, "ViewFrame.histogramTask.title"), true) { // NON-NLS
|
||||||
private final Lighting lighting = new Lighting();
|
private final Lighting lighting = new Lighting();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Void call() throws Exception {
|
protected Void call() throws Exception {
|
||||||
|
|
||||||
updateMessage(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.histogramTask.preparing")); // NON-NLS
|
updateMessage(NbBundle.getMessage(ViewFrame.class, "ViewFrame.histogramTask.preparing")); // NON-NLS
|
||||||
|
|
||||||
long max = 0;
|
long max = 0;
|
||||||
final RangeDivisionInfo rangeInfo = RangeDivisionInfo.getRangeDivisionInfo(filteredEvents.getSpanningInterval());
|
final RangeDivisionInfo rangeInfo = RangeDivisionInfo.getRangeDivisionInfo(filteredEvents.getSpanningInterval());
|
||||||
@ -483,7 +483,7 @@ final public class VisualizationPanel extends BorderPane {
|
|||||||
|
|
||||||
//clear old data, and reset ranges and series
|
//clear old data, and reset ranges and series
|
||||||
Platform.runLater(() -> {
|
Platform.runLater(() -> {
|
||||||
updateMessage(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.histogramTask.resetUI")); // NON-NLS
|
updateMessage(NbBundle.getMessage(ViewFrame.class, "ViewFrame.histogramTask.resetUI")); // NON-NLS
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -500,7 +500,7 @@ final public class VisualizationPanel extends BorderPane {
|
|||||||
|
|
||||||
start = end;
|
start = end;
|
||||||
|
|
||||||
updateMessage(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.histogramTask.queryDb")); // NON-NLS
|
updateMessage(NbBundle.getMessage(ViewFrame.class, "ViewFrame.histogramTask.queryDb")); // NON-NLS
|
||||||
//query for current range
|
//query for current range
|
||||||
long count = filteredEvents.getEventCounts(interval).values().stream().mapToLong(Long::valueOf).sum();
|
long count = filteredEvents.getEventCounts(interval).values().stream().mapToLong(Long::valueOf).sum();
|
||||||
bins.add(count);
|
bins.add(count);
|
||||||
@ -510,7 +510,7 @@ final public class VisualizationPanel extends BorderPane {
|
|||||||
final double fMax = Math.log(max);
|
final double fMax = Math.log(max);
|
||||||
final ArrayList<Long> fbins = new ArrayList<>(bins);
|
final ArrayList<Long> fbins = new ArrayList<>(bins);
|
||||||
Platform.runLater(() -> {
|
Platform.runLater(() -> {
|
||||||
updateMessage(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.histogramTask.updateUI2")); // NON-NLS
|
updateMessage(NbBundle.getMessage(ViewFrame.class, "ViewFrame.histogramTask.updateUI2")); // NON-NLS
|
||||||
|
|
||||||
histogramBox.getChildren().clear();
|
histogramBox.getChildren().clear();
|
||||||
|
|
||||||
@ -583,7 +583,7 @@ final public class VisualizationPanel extends BorderPane {
|
|||||||
AbstractTimeLineView view;
|
AbstractTimeLineView view;
|
||||||
ViewMode viewMode = controller.viewModeProperty().get();
|
ViewMode viewMode = controller.viewModeProperty().get();
|
||||||
|
|
||||||
//make new visualization.
|
//make new view.
|
||||||
switch (viewMode) {
|
switch (viewMode) {
|
||||||
case LIST:
|
case LIST:
|
||||||
view = new ListViewPane(controller);
|
view = new ListViewPane(controller);
|
||||||
@ -609,20 +609,20 @@ final public class VisualizationPanel extends BorderPane {
|
|||||||
view = detailViewPane;
|
view = detailViewPane;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
throw new IllegalArgumentException("Unknown VisualizationMode: " + viewMode.toString());
|
throw new IllegalArgumentException("Unknown ViewMode: " + viewMode.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
//Set the new AbstractVisualizationPane as the one hosted by this VisualizationPanel.
|
//Set the new AbstractTimeLineView as the one hosted by this ViewFrame.
|
||||||
Platform.runLater(() -> {
|
Platform.runLater(() -> {
|
||||||
//clear out old vis.
|
//clear out old view.
|
||||||
if (hostedView != null) {
|
if (hostedView != null) {
|
||||||
toolBar.getItems().removeAll(hostedView.getSettingsNodes());
|
toolBar.getItems().removeAll(hostedView.getSettingsNodes());
|
||||||
hostedView.dispose();
|
hostedView.dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
hostedView = view;
|
hostedView = view;
|
||||||
//setup new vis.
|
//setup new view.
|
||||||
ActionUtils.configureButton(new Refresh(), refreshButton);//configure new refresh action for new visualization
|
ActionUtils.configureButton(new Refresh(), refreshButton);//configure new refresh action for new view
|
||||||
hostedView.refresh();
|
hostedView.refresh();
|
||||||
toolBar.getItems().addAll(2, view.getSettingsNodes());
|
toolBar.getItems().addAll(2, view.getSettingsNodes());
|
||||||
notificationPane.setContent(hostedView);
|
notificationPane.setContent(hostedView);
|
||||||
@ -670,7 +670,7 @@ final public class VisualizationPanel extends BorderPane {
|
|||||||
assert zoomButton != null : "fx:id=\"zoomButton\" was not injected: check your FXML file 'NoEventsDialog.fxml'."; // NON-NLS
|
assert zoomButton != null : "fx:id=\"zoomButton\" was not injected: check your FXML file 'NoEventsDialog.fxml'."; // NON-NLS
|
||||||
|
|
||||||
titledPane.setText(Bundle.NoEventsDialog_titledPane_text());
|
titledPane.setText(Bundle.NoEventsDialog_titledPane_text());
|
||||||
noEventsDialogLabel.setText(NbBundle.getMessage(NoEventsDialog.class, "VisualizationPanel.noEventsDialogLabel.text")); // NON-NLS
|
noEventsDialogLabel.setText(NbBundle.getMessage(NoEventsDialog.class, "ViewFrame.noEventsDialogLabel.text")); // NON-NLS
|
||||||
|
|
||||||
dismissButton.setOnAction(actionEvent -> closeCallback.run());
|
dismissButton.setOnAction(actionEvent -> closeCallback.run());
|
||||||
|
|
||||||
@ -699,7 +699,7 @@ final public class VisualizationPanel extends BorderPane {
|
|||||||
LocalDateTime pickerTime = pickerSupplier.get().getLocalDateTime();
|
LocalDateTime pickerTime = pickerSupplier.get().getLocalDateTime();
|
||||||
if (pickerTime != null) {
|
if (pickerTime != null) {
|
||||||
controller.pushTimeRange(intervalMapper.apply(filteredEvents.timeRangeProperty().get(), localDateTimeToEpochMilli(pickerTime)));
|
controller.pushTimeRange(intervalMapper.apply(filteredEvents.timeRangeProperty().get(), localDateTimeToEpochMilli(pickerTime)));
|
||||||
Platform.runLater(VisualizationPanel.this::refreshTimeUI);
|
Platform.runLater(ViewFrame.this::refreshTimeUI);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -767,16 +767,16 @@ final public class VisualizationPanel extends BorderPane {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Action that refreshes the Visualization.
|
* Action that refreshes the View.
|
||||||
*/
|
*/
|
||||||
private class Refresh extends Action {
|
private class Refresh extends Action {
|
||||||
|
|
||||||
@NbBundle.Messages({
|
@NbBundle.Messages({
|
||||||
"VisualizationPanel.refresh.text=Refresh Vis.",
|
"ViewFrame.refresh.text=Refresh View",
|
||||||
"VisualizationPanel.refresh.longText=Refresh the visualization to include information that is in the DB but not visualized, such as newly updated tags."})
|
"ViewFrame.refresh.longText=Refresh the view to include information that is in the DB but not displayed, such as newly updated tags."})
|
||||||
Refresh() {
|
Refresh() {
|
||||||
super(Bundle.VisualizationPanel_refresh_text());
|
super(Bundle.ViewFrame_refresh_text());
|
||||||
setLongText(Bundle.VisualizationPanel_refresh_longText());
|
setLongText(Bundle.ViewFrame_refresh_longText());
|
||||||
setGraphic(new ImageView(REFRESH));
|
setGraphic(new ImageView(REFRESH));
|
||||||
setEventHandler(actionEvent -> filteredEvents.postRefreshRequest());
|
setEventHandler(actionEvent -> filteredEvents.postRefreshRequest());
|
||||||
disabledProperty().bind(hostedView.outOfDateProperty().not());
|
disabledProperty().bind(hostedView.outOfDateProperty().not());
|
@ -105,7 +105,7 @@ public class CountsViewPane extends AbstractTimelineChart<String, Number, Node,
|
|||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
*
|
*
|
||||||
* @param controller The TimelineController for this visualization.
|
* @param controller The TimelineController for this view.
|
||||||
*/
|
*/
|
||||||
@NbBundle.Messages({
|
@NbBundle.Messages({
|
||||||
"# {0} - scale name",
|
"# {0} - scale name",
|
||||||
@ -249,7 +249,7 @@ public class CountsViewPane extends AbstractTimelineChart<String, Number, Node,
|
|||||||
"CountsViewPane.scaleLabel.text=Scale:",
|
"CountsViewPane.scaleLabel.text=Scale:",
|
||||||
"CountsViewPane.scaleHelp.label.text=Scales: ",
|
"CountsViewPane.scaleHelp.label.text=Scales: ",
|
||||||
"CountsViewPane.linearRadio.text=Linear",
|
"CountsViewPane.linearRadio.text=Linear",
|
||||||
"CountsViewPane.scaleHelpLinear=The linear scale is good for many use cases. When this scale is selected, the height of the bars represents the counts in a linear, one-to-one fashion, and the y-axis is labeled with values. When the range of values is very large, time periods with low counts may have a bar that is too small to see. To help the user detect this, the labels for date ranges with events are bold. To see bars that are too small, there are three options: adjust the window size so that the visualization area has more vertical space, adjust the time range shown so that time periods with larger bars are excluded, or adjust the scale setting to logarithmic.",
|
"CountsViewPane.scaleHelpLinear=The linear scale is good for many use cases. When this scale is selected, the height of the bars represents the counts in a linear, one-to-one fashion, and the y-axis is labeled with values. When the range of values is very large, time periods with low counts may have a bar that is too small to see. To help the user detect this, the labels for date ranges with events are bold. To see bars that are too small, there are three options: adjust the window size so that the timeline has more vertical space, adjust the time range shown so that time periods with larger bars are excluded, or adjust the scale setting to logarithmic.",
|
||||||
"CountsViewPane.scaleHelpLog=The logarithmic scale represents the number of events in a non-linear way that compresses the difference between large and small numbers. Note that even with the logarithmic scale, an extremely large difference in counts may still produce bars too small to see. In this case the only option may be to filter events to reduce the difference in counts. NOTE: Because the logarithmic scale is applied to each event type separately, the meaning of the height of the combined bar is not intuitive, and to emphasize this, no labels are shown on the y-axis with the logarithmic scale. The logarithmic scale should be used to quickly compare the counts ",
|
"CountsViewPane.scaleHelpLog=The logarithmic scale represents the number of events in a non-linear way that compresses the difference between large and small numbers. Note that even with the logarithmic scale, an extremely large difference in counts may still produce bars too small to see. In this case the only option may be to filter events to reduce the difference in counts. NOTE: Because the logarithmic scale is applied to each event type separately, the meaning of the height of the combined bar is not intuitive, and to emphasize this, no labels are shown on the y-axis with the logarithmic scale. The logarithmic scale should be used to quickly compare the counts ",
|
||||||
"CountsViewPane.scaleHelpLog2=across time within a type, or across types for one time period, but not both.",
|
"CountsViewPane.scaleHelpLog2=across time within a type, or across types for one time period, but not both.",
|
||||||
"CountsViewPane.scaleHelpLog3= The actual counts (available in tooltips or the result viewer) should be used for absolute comparisons. Use the logarithmic scale with care."})
|
"CountsViewPane.scaleHelpLog3= The actual counts (available in tooltips or the result viewer) should be used for absolute comparisons. Use the logarithmic scale with care."})
|
||||||
@ -336,7 +336,7 @@ public class CountsViewPane extends AbstractTimelineChart<String, Number, Node,
|
|||||||
*/
|
*/
|
||||||
@NbBundle.Messages({
|
@NbBundle.Messages({
|
||||||
"CountsViewPane.loggedTask.name=Updating Counts View",
|
"CountsViewPane.loggedTask.name=Updating Counts View",
|
||||||
"CountsViewPane.loggedTask.updatingCounts=Populating visualization"})
|
"CountsViewPane.loggedTask.updatingCounts=Populating view"})
|
||||||
private class CountsUpdateTask extends ViewRefreshTask<List<String>> {
|
private class CountsUpdateTask extends ViewRefreshTask<List<String>> {
|
||||||
|
|
||||||
CountsUpdateTask() {
|
CountsUpdateTask() {
|
||||||
|
@ -405,25 +405,6 @@ final class EventCountsChart extends StackedBarChart<String, Number> implements
|
|||||||
if (showConfirmDialog == JOptionPane.YES_OPTION) {
|
if (showConfirmDialog == JOptionPane.YES_OPTION) {
|
||||||
controller.setViewMode(ViewMode.DETAIL);
|
controller.setViewMode(ViewMode.DETAIL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* //I would like to use the JAvafx dialog, but it doesn't
|
|
||||||
* block the ui (because it is embeded in a TopComponent)
|
|
||||||
* -jm
|
|
||||||
*
|
|
||||||
* final Dialogs.CommandLink yes = new
|
|
||||||
* Dialogs.CommandLink("Yes", "switch to Details view");
|
|
||||||
* final Dialogs.CommandLink no = new
|
|
||||||
* Dialogs.CommandLink("No", "return to Counts view with a
|
|
||||||
* resolution of Seconds"); Action choice = Dialogs.create()
|
|
||||||
* .title("Switch to Details View?") .masthead("There is no
|
|
||||||
* temporal resolution smaller than Seconds.")
|
|
||||||
* .message("Would you like to switch to the Details view
|
|
||||||
* instead?") .showCommandLinks(Arrays.asList(yes, no));
|
|
||||||
*
|
|
||||||
* if (choice == yes) {
|
|
||||||
* controller.setViewMode(VisualizationMode.DETAIL); }
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -91,7 +91,7 @@ public class DetailViewPane extends AbstractTimelineChart<DateTime, EventStripe,
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Local copy of the zoomParams. Used to backout of a zoomParam change
|
* Local copy of the zoomParams. Used to backout of a zoomParam change
|
||||||
* without needing to requery/redraw the vis.
|
* without needing to requery/redraw the view.
|
||||||
*/
|
*/
|
||||||
private ZoomParams currentZoomParams;
|
private ZoomParams currentZoomParams;
|
||||||
|
|
||||||
@ -347,7 +347,7 @@ public class DetailViewPane extends AbstractTimelineChart<DateTime, EventStripe,
|
|||||||
@NbBundle.Messages({
|
@NbBundle.Messages({
|
||||||
"DetailViewPane.loggedTask.queryDb=Retreiving event data",
|
"DetailViewPane.loggedTask.queryDb=Retreiving event data",
|
||||||
"DetailViewPane.loggedTask.name=Updating Details View",
|
"DetailViewPane.loggedTask.name=Updating Details View",
|
||||||
"DetailViewPane.loggedTask.updateUI=Populating visualization",
|
"DetailViewPane.loggedTask.updateUI=Populating view",
|
||||||
"DetailViewPane.loggedTask.continueButton=Continue",
|
"DetailViewPane.loggedTask.continueButton=Continue",
|
||||||
"DetailViewPane.loggedTask.backButton=Back (Cancel)",
|
"DetailViewPane.loggedTask.backButton=Back (Cancel)",
|
||||||
"# {0} - number of events",
|
"# {0} - number of events",
|
||||||
|
@ -62,7 +62,7 @@ import org.sleuthkit.autopsy.timeline.ui.AbstractTimelineChart;
|
|||||||
import org.sleuthkit.autopsy.timeline.ui.ContextMenuProvider;
|
import org.sleuthkit.autopsy.timeline.ui.ContextMenuProvider;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* One "lane" of a the details visualization, contains all the core logic and
|
* One "lane" of a the details view, contains all the core logic and
|
||||||
* layout code.
|
* layout code.
|
||||||
*
|
*
|
||||||
* NOTE: It was too hard to control the threading of this chart via the
|
* NOTE: It was too hard to control the threading of this chart via the
|
||||||
|
@ -75,7 +75,7 @@ class ListTimeline extends BorderPane {
|
|||||||
private static final Logger LOGGER = Logger.getLogger(ListTimeline.class.getName());
|
private static final Logger LOGGER = Logger.getLogger(ListTimeline.class.getName());
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* call-back used to wrap the event ID inn a ObservableValue<Long>
|
* call-back used to wrap the CombinedEvent in a ObservableValue
|
||||||
*/
|
*/
|
||||||
private static final Callback<TableColumn.CellDataFeatures<CombinedEvent, CombinedEvent>, ObservableValue<CombinedEvent>> CELL_VALUE_FACTORY = param -> new SimpleObjectProperty<>(param.getValue());
|
private static final Callback<TableColumn.CellDataFeatures<CombinedEvent, CombinedEvent>, ObservableValue<CombinedEvent>> CELL_VALUE_FACTORY = param -> new SimpleObjectProperty<>(param.getValue());
|
||||||
|
|
||||||
@ -101,7 +101,7 @@ class ListTimeline extends BorderPane {
|
|||||||
private final TimeLineController controller;
|
private final TimeLineController controller;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* observable list used to track selected events.
|
* Observable list used to track selected events.
|
||||||
*/
|
*/
|
||||||
private final ObservableList<Long> selectedEventIDs = FXCollections.observableArrayList();
|
private final ObservableList<Long> selectedEventIDs = FXCollections.observableArrayList();
|
||||||
|
|
||||||
@ -128,7 +128,7 @@ class ListTimeline extends BorderPane {
|
|||||||
assert typeColumn != null : "fx:id=\"typeColumn\" was not injected: check your FXML file 'ListViewPane.fxml'.";
|
assert typeColumn != null : "fx:id=\"typeColumn\" was not injected: check your FXML file 'ListViewPane.fxml'.";
|
||||||
assert knownColumn != null : "fx:id=\"knownColumn\" was not injected: check your FXML file 'ListViewPane.fxml'.";
|
assert knownColumn != null : "fx:id=\"knownColumn\" was not injected: check your FXML file 'ListViewPane.fxml'.";
|
||||||
|
|
||||||
//override default row with one that provides context menu.S
|
//override default row with one that provides context menus
|
||||||
table.setRowFactory(tableView -> new EventRow());
|
table.setRowFactory(tableView -> new EventRow());
|
||||||
|
|
||||||
//remove idColumn (can be restored for debugging).
|
//remove idColumn (can be restored for debugging).
|
||||||
@ -173,7 +173,7 @@ class ListTimeline extends BorderPane {
|
|||||||
//keep the selectedEventsIDs in sync with the table's selection model, via getRepresentitiveEventID().
|
//keep the selectedEventsIDs in sync with the table's selection model, via getRepresentitiveEventID().
|
||||||
selectedEventIDs.setAll(FluentIterable.from(table.getSelectionModel().getSelectedItems())
|
selectedEventIDs.setAll(FluentIterable.from(table.getSelectionModel().getSelectedItems())
|
||||||
.filter(Objects::nonNull)
|
.filter(Objects::nonNull)
|
||||||
.transform(CombinedEvent::getRepresentitiveEventID)
|
.transform(CombinedEvent::getRepresentativeEventID)
|
||||||
.toSet());
|
.toSet());
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -205,12 +205,12 @@ class ListTimeline extends BorderPane {
|
|||||||
ObservableList<Long> getSelectedEventIDs() {
|
ObservableList<Long> getSelectedEventIDs() {
|
||||||
return selectedEventIDs;
|
return selectedEventIDs;
|
||||||
}
|
}
|
||||||
private static final Image HASH_HIT = new Image("/org/sleuthkit/autopsy/images/hashset_hits.png"); //NOI18N NON-NLS
|
private static final Image HASH_HIT = new Image("/org/sleuthkit/autopsy/images/hashset_hits.png"); // NON-NLS
|
||||||
private static final Image TAG = new Image("/org/sleuthkit/autopsy/images/green-tag-icon-16.png"); // NON-NLS //NOI18N
|
private static final Image TAG = new Image("/org/sleuthkit/autopsy/images/green-tag-icon-16.png"); // NON-NLS
|
||||||
private static final Image PIN = new Image("/org/sleuthkit/autopsy/timeline/images/marker--plus.png"); // NON-NLS //NOI18N
|
private static final Image PIN = new Image("/org/sleuthkit/autopsy/timeline/images/marker--plus.png"); // NON-NLS
|
||||||
private static final Image UNPIN = new Image("/org/sleuthkit/autopsy/timeline/images/marker--minus.png"); // NON-NLS //NOI18N
|
private static final Image UNPIN = new Image("/org/sleuthkit/autopsy/timeline/images/marker--minus.png"); // NON-NLS
|
||||||
|
|
||||||
private class TaggedCell extends EventTableCell {
|
private class TaggedCell extends EventTableCell {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void updateItem(CombinedEvent item, boolean empty) {
|
protected void updateItem(CombinedEvent item, boolean empty) {
|
||||||
@ -223,7 +223,8 @@ class ListTimeline extends BorderPane {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private class HashHitCell extends EventTableCell {
|
|
||||||
|
private class HashHitCell extends EventTableCell {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void updateItem(CombinedEvent item, boolean empty) {
|
protected void updateItem(CombinedEvent item, boolean empty) {
|
||||||
@ -232,7 +233,7 @@ class ListTimeline extends BorderPane {
|
|||||||
if (empty || item == null) {
|
if (empty || item == null) {
|
||||||
setGraphic(null);
|
setGraphic(null);
|
||||||
} else {
|
} else {
|
||||||
setGraphic(getEvent().isHashHit()? new ImageView(HASH_HIT) : null);
|
setGraphic(getEvent().isHashHit() ? new ImageView(HASH_HIT) : null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -248,12 +249,12 @@ class ListTimeline extends BorderPane {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the ID of the event that is selected.
|
* Set the combineded events that are selected in this view.
|
||||||
*
|
*
|
||||||
* @param selectedEventID The ID of the event that should be selected.
|
* @param selectedEvents The events that should be selected.
|
||||||
*/
|
*/
|
||||||
void selectEvents(Collection<CombinedEvent> selectedEvents) {
|
void selectEvents(Collection<CombinedEvent> selectedEvents) {
|
||||||
CombinedEvent firstSelected = selectedEvents.stream().min(Comparator.comparing(CombinedEvent::getStartMillis)).orElseGet(null);
|
CombinedEvent firstSelected = selectedEvents.stream().min(Comparator.comparing(CombinedEvent::getStartMillis)).orElse(null);
|
||||||
table.getSelectionModel().clearSelection();
|
table.getSelectionModel().clearSelection();
|
||||||
table.scrollTo(firstSelected);
|
table.scrollTo(firstSelected);
|
||||||
selectedEvents.forEach(table.getSelectionModel()::select);
|
selectedEvents.forEach(table.getSelectionModel()::select);
|
||||||
@ -353,7 +354,7 @@ class ListTimeline extends BorderPane {
|
|||||||
event = null;
|
event = null;
|
||||||
} else {
|
} else {
|
||||||
//stash the event in the cell for derived classed to use.
|
//stash the event in the cell for derived classed to use.
|
||||||
event = controller.getEventsModel().getEventById(item.getRepresentitiveEventID());
|
event = controller.getEventsModel().getEventById(item.getRepresentativeEventID());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -383,7 +384,7 @@ class ListTimeline extends BorderPane {
|
|||||||
if (empty || item == null) {
|
if (empty || item == null) {
|
||||||
event = null;
|
event = null;
|
||||||
} else {
|
} else {
|
||||||
event = controller.getEventsModel().getEventById(item.getRepresentitiveEventID());
|
event = controller.getEventsModel().getEventById(item.getRepresentativeEventID());
|
||||||
//make context menu
|
//make context menu
|
||||||
try {
|
try {
|
||||||
EventNode node = EventNode.createEventNode(event.getEventID(), controller.getEventsModel());
|
EventNode node = EventNode.createEventNode(event.getEventID(), controller.getEventsModel());
|
||||||
|
@ -31,7 +31,7 @@ import org.sleuthkit.autopsy.timeline.datamodel.FilteredEventsModel;
|
|||||||
import org.sleuthkit.autopsy.timeline.ui.AbstractTimeLineView;
|
import org.sleuthkit.autopsy.timeline.ui.AbstractTimeLineView;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An AbstractTimeLineView that uses a TableView to represent the events.
|
* An AbstractTimeLineView that uses a TableView to display events.
|
||||||
*/
|
*/
|
||||||
public class ListViewPane extends AbstractTimeLineView {
|
public class ListViewPane extends AbstractTimeLineView {
|
||||||
|
|
||||||
|
@ -22,6 +22,7 @@ import java.util.function.Consumer;
|
|||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
import javafx.application.Platform;
|
import javafx.application.Platform;
|
||||||
import javafx.beans.InvalidationListener;
|
import javafx.beans.InvalidationListener;
|
||||||
|
import javafx.beans.binding.BooleanBinding;
|
||||||
import javafx.beans.property.ReadOnlyObjectProperty;
|
import javafx.beans.property.ReadOnlyObjectProperty;
|
||||||
import javafx.fxml.FXML;
|
import javafx.fxml.FXML;
|
||||||
import javafx.scene.control.Label;
|
import javafx.scene.control.Label;
|
||||||
@ -92,7 +93,6 @@ public class ZoomSettingsPane extends TitledPane {
|
|||||||
EventTypeZoomLevel::ordinal,
|
EventTypeZoomLevel::ordinal,
|
||||||
Function.identity());
|
Function.identity());
|
||||||
typeZoomLabel.setText(Bundle.ZoomSettingsPane_typeZoomLabel_text());
|
typeZoomLabel.setText(Bundle.ZoomSettingsPane_typeZoomLabel_text());
|
||||||
typeZoomSlider.disableProperty().bind(controller.viewModeProperty().isEqualTo(ViewMode.LIST));
|
|
||||||
|
|
||||||
descrLODSlider.setMax(DescriptionLoD.values().length - 1);
|
descrLODSlider.setMax(DescriptionLoD.values().length - 1);
|
||||||
configureSliderListeners(descrLODSlider,
|
configureSliderListeners(descrLODSlider,
|
||||||
@ -103,15 +103,14 @@ public class ZoomSettingsPane extends TitledPane {
|
|||||||
Function.identity());
|
Function.identity());
|
||||||
descrLODLabel.setText(Bundle.ZoomSettingsPane_descrLODLabel_text());
|
descrLODLabel.setText(Bundle.ZoomSettingsPane_descrLODLabel_text());
|
||||||
//the description slider is only usefull in the detail view
|
//the description slider is only usefull in the detail view
|
||||||
descrLODSlider.disableProperty().bind(controller.viewModeProperty().isNotEqualTo(ViewMode.DETAIL));
|
descrLODSlider.disableProperty().bind(controller.viewModeProperty().isEqualTo(ViewMode.COUNTS));
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* In order for the selected value in the time unit slider to correspond
|
* In order for the selected value in the time unit slider to correspond
|
||||||
* to the amount of time used as units along the x-axis of the
|
* to the amount of time used as units along the x-axis of the view, and
|
||||||
* visualization, and since we don't want to show "forever" as a time
|
* since we don't want to show "forever" as a time unit, the range of
|
||||||
* unit, the range of the slider is restricted, and there is an offset
|
* the slider is restricted, and there is an offset of 1 between the
|
||||||
* of 1 between the "real" value, and what is shown in the slider
|
* "real" value, and what is shown in the slider labels.
|
||||||
* labels.
|
|
||||||
*/
|
*/
|
||||||
timeUnitSlider.setMax(TimeUnits.values().length - 2);
|
timeUnitSlider.setMax(TimeUnits.values().length - 2);
|
||||||
configureSliderListeners(timeUnitSlider,
|
configureSliderListeners(timeUnitSlider,
|
||||||
@ -122,7 +121,12 @@ public class ZoomSettingsPane extends TitledPane {
|
|||||||
modelTimeRange -> RangeDivisionInfo.getRangeDivisionInfo(modelTimeRange).getPeriodSize().ordinal() - 1,
|
modelTimeRange -> RangeDivisionInfo.getRangeDivisionInfo(modelTimeRange).getPeriodSize().ordinal() - 1,
|
||||||
index -> index + 1); //compensate for the -1 above when mapping to the Enum whose displayName will be shown at index
|
index -> index + 1); //compensate for the -1 above when mapping to the Enum whose displayName will be shown at index
|
||||||
timeUnitLabel.setText(Bundle.ZoomSettingsPane_timeUnitLabel_text());
|
timeUnitLabel.setText(Bundle.ZoomSettingsPane_timeUnitLabel_text());
|
||||||
timeUnitSlider.disableProperty().bind(controller.viewModeProperty().isEqualTo(ViewMode.LIST));
|
|
||||||
|
//hide the whole panel in list mode
|
||||||
|
BooleanBinding notListMode = controller.viewModeProperty().isNotEqualTo(ViewMode.LIST);
|
||||||
|
visibleProperty().bind(notListMode);
|
||||||
|
managedProperty().bind(notListMode);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -178,7 +182,7 @@ public class ZoomSettingsPane extends TitledPane {
|
|||||||
//set the tick labels to the enum displayNames
|
//set the tick labels to the enum displayNames
|
||||||
slider.setLabelFormatter(new EnumSliderLabelFormatter<>(enumClass, labelIndexMapper));
|
slider.setLabelFormatter(new EnumSliderLabelFormatter<>(enumClass, labelIndexMapper));
|
||||||
|
|
||||||
//make a listener to responds to slider value changes (by updating the visualization)
|
//make a listener to responds to slider value changes (by updating the view)
|
||||||
final InvalidationListener sliderListener = observable -> {
|
final InvalidationListener sliderListener = observable -> {
|
||||||
//only process event if the slider value is not changing (user has released slider thumb)
|
//only process event if the slider value is not changing (user has released slider thumb)
|
||||||
if (slider.isValueChanging() == false) {
|
if (slider.isValueChanging() == false) {
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Autopsy Forensic Browser
|
* Autopsy Forensic Browser
|
||||||
*
|
*
|
||||||
* Copyright 2011-2015 Basis Technology Corp.
|
* Copyright 2011-2016 Basis Technology Corp.
|
||||||
* Contact: carrier <at> sleuthkit <dot> org
|
* Contact: carrier <at> sleuthkit <dot> org
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@ -45,6 +45,13 @@ import org.openide.util.NbBundle;
|
|||||||
import org.sleuthkit.autopsy.corecomponents.OptionsPanel;
|
import org.sleuthkit.autopsy.corecomponents.OptionsPanel;
|
||||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
import org.sleuthkit.autopsy.ingest.IngestManager;
|
import org.sleuthkit.autopsy.ingest.IngestManager;
|
||||||
|
import java.awt.Component;
|
||||||
|
import javax.swing.ImageIcon;
|
||||||
|
import javax.swing.JLabel;
|
||||||
|
import static javax.swing.SwingConstants.CENTER;
|
||||||
|
import javax.swing.table.DefaultTableCellRenderer;
|
||||||
|
import javax.swing.table.TableCellRenderer;
|
||||||
|
import org.openide.util.NbBundle.Messages;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* GlobalEditListPanel widget to manage keywords in lists
|
* GlobalEditListPanel widget to manage keywords in lists
|
||||||
@ -52,7 +59,8 @@ import org.sleuthkit.autopsy.ingest.IngestManager;
|
|||||||
class GlobalEditListPanel extends javax.swing.JPanel implements ListSelectionListener, OptionsPanel {
|
class GlobalEditListPanel extends javax.swing.JPanel implements ListSelectionListener, OptionsPanel {
|
||||||
|
|
||||||
private static final Logger logger = Logger.getLogger(GlobalEditListPanel.class.getName());
|
private static final Logger logger = Logger.getLogger(GlobalEditListPanel.class.getName());
|
||||||
private KeywordTableModel tableModel;
|
private static final long serialVersionUID = 1L;
|
||||||
|
private final KeywordTableModel tableModel;
|
||||||
private KeywordList currentKeywordList;
|
private KeywordList currentKeywordList;
|
||||||
private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);
|
private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);
|
||||||
|
|
||||||
@ -85,7 +93,8 @@ class GlobalEditListPanel extends javax.swing.JPanel implements ListSelectionLis
|
|||||||
column.setPreferredWidth(((int) (width * 0.90)));
|
column.setPreferredWidth(((int) (width * 0.90)));
|
||||||
} else {
|
} else {
|
||||||
column.setPreferredWidth(((int) (width * 0.10)));
|
column.setPreferredWidth(((int) (width * 0.10)));
|
||||||
//column.setCellRenderer(new CheckBoxRenderer());
|
column.setCellRenderer(new CheckBoxRenderer());
|
||||||
|
column.setHeaderRenderer(new HeaderRenderer(keywordTable));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
keywordTable.setCellSelectionEnabled(false);
|
keywordTable.setCellSelectionEnabled(false);
|
||||||
@ -686,4 +695,55 @@ class GlobalEditListPanel extends javax.swing.JPanel implements ListSelectionLis
|
|||||||
resync();
|
resync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A cell renderer for boolean cells that shows a center-aligned green check
|
||||||
|
* mark if true, nothing if false.
|
||||||
|
*/
|
||||||
|
private class CheckBoxRenderer extends DefaultTableCellRenderer {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
final ImageIcon theCheck = new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/keywordsearch/checkmark.png")); // NON-NLS
|
||||||
|
|
||||||
|
CheckBoxRenderer() {
|
||||||
|
setHorizontalAlignment(CENTER);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Messages("IsRegularExpression=Keyword is a regular expression")
|
||||||
|
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
|
||||||
|
|
||||||
|
if ((value instanceof Boolean)) {
|
||||||
|
if ((Boolean) value) {
|
||||||
|
setIcon(theCheck);
|
||||||
|
setToolTipText(Bundle.IsRegularExpression());
|
||||||
|
} else {
|
||||||
|
setIcon(null);
|
||||||
|
setToolTipText(null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A cell renderer for header cells that center-aligns the header text.
|
||||||
|
*/
|
||||||
|
private static class HeaderRenderer implements TableCellRenderer {
|
||||||
|
|
||||||
|
private DefaultTableCellRenderer renderer;
|
||||||
|
|
||||||
|
public HeaderRenderer(JTable table) {
|
||||||
|
renderer = (DefaultTableCellRenderer) table.getTableHeader().getDefaultRenderer();
|
||||||
|
renderer.setHorizontalAlignment(JLabel.CENTER);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Component getTableCellRendererComponent(
|
||||||
|
JTable table, Object value, boolean isSelected,
|
||||||
|
boolean hasFocus, int row, int col) {
|
||||||
|
return renderer.getTableCellRendererComponent(
|
||||||
|
table, value, isSelected, hasFocus, row, col);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
BIN
KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/checkmark.png
Executable file
BIN
KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/checkmark.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 279 B |
Loading…
x
Reference in New Issue
Block a user