Merge pull request #512 from mrtizmo/timeline

Pulled static strings into Bundle - Timeline module
This commit is contained in:
Richard Cordovano 2014-03-07 12:28:48 -05:00
commit 88db2f7014
3 changed files with 63 additions and 24 deletions

View File

@ -4,6 +4,29 @@ OpenIDE-Module-Long-Description=\
Events for a selected day are viewable in the built-in result and content viewers. Events for a selected day are viewable in the built-in result and content viewers.
OpenIDE-Module-Name=Timeline OpenIDE-Module-Name=Timeline
CTL_MakeTimeline="Make Timeline (Beta)" CTL_MakeTimeline="Make Timeline (Beta)"
CTL_TimelineView=Generate Timeline
OpenIDE-Module-Short-Description=Displays user activity timeline OpenIDE-Module-Short-Description=Displays user activity timeline
TimelineProgressDialog.jLabel1.text=Creating timeline . . . TimelineProgressDialog.jLabel1.text=Creating timeline . . .
TimelineFrame.title=Timeline TimelineFrame.title=Timeline
Timeline.frameName.text={0} - Autopsy Timeline (Beta)
Timeline.resultsPanel.title=Timeline Results
Timeline.getName=Make Timeline (Beta)
Timeline.runJavaFxThread.progress.creating=Creating timeline . . .
Timeline.runJavaFxThread.progress.genBodyFile=Generating Bodyfile
Timeline.runJavaFxThread.progress.genMacTime=Generating Mactime
Timeline.runJavaFxThread.progress.parseMacTime=Parsing Mactime
Timeline.zoomOutButton.text=Zoom Out
Timeline.goToButton.text=Go To\:
Timeline.yearBarChart.x.years=Years
Timeline.yearBarChart.y.numEvents=Number of Events
Timeline.MonthsBarChart.x.monthYY=Month ({0})
Timeline.MonthsBarChart.y.numEvents=Number of Events
Timeline.eventsByMoBarChart.x.dayOfMo=Day of Month
Timeline.eventsByMoBarChart.y.numEvents=Number of Events
Timeline.node.emptyRoot=Empty Root
Timeline.resultPanel.loading=Loading...
Timeline.node.root=Root
Timeline.propChg.confDlg.timelineOOD.msg=Timeline is out of date. Would you like to regenerate it?
Timeline.propChg.confDlg.timelineOOD.details=Select an option
Timeline.initTimeline.confDlg.genBeforeIngest.msg=You are trying to generate a timeline before ingest has been completed. The timeline may be incomplete. Do you want to continue?
Timeline.initTimeline.confDlg.genBeforeIngest.deails=Timeline

View File

@ -108,7 +108,7 @@ import org.sleuthkit.datamodel.TskCoreException;
@ActionRegistration(displayName = "#CTL_MakeTimeline", lazy = false) @ActionRegistration(displayName = "#CTL_MakeTimeline", lazy = false)
@ActionReferences(value = { @ActionReferences(value = {
@ActionReference(path = "Menu/Tools", position = 100)}) @ActionReference(path = "Menu/Tools", position = 100)})
@NbBundle.Messages(value = "CTL_TimelineView=Generate Timeline") //@NbBundle.Messages(value = "CTL_TimelineView=Generate Timeline")
/** /**
* The Timeline Action entry point. Collects data and pushes data to javafx * The Timeline Action entry point. Collects data and pushes data to javafx
* widgets * widgets
@ -180,7 +180,8 @@ public class Timeline extends CallableSystemAction implements Presenter.Toolbar,
//Making the main frame * //Making the main frame *
mainFrame = new TimelineFrame(); mainFrame = new TimelineFrame();
mainFrame.setFrameName(Case.getCurrentCase().getName() + " - Autopsy Timeline (Beta)"); mainFrame.setFrameName(
NbBundle.getMessage(this.getClass(), "Timeline.frameName.text", Case.getCurrentCase().getName()));
//use the same icon on jframe as main application //use the same icon on jframe as main application
mainFrame.setIconImage(WindowManager.getDefault().getMainWindow().getIconImage()); mainFrame.setIconImage(WindowManager.getDefault().getMainWindow().getIconImage());
@ -191,7 +192,9 @@ public class Timeline extends CallableSystemAction implements Presenter.Toolbar,
//dataContentPanel.setAlignmentX(Component.RIGHT_ALIGNMENT); //dataContentPanel.setAlignmentX(Component.RIGHT_ALIGNMENT);
//dataContentPanel.setPreferredSize(new Dimension(FRAME_WIDTH, (int) (FRAME_HEIGHT * 0.4))); //dataContentPanel.setPreferredSize(new Dimension(FRAME_WIDTH, (int) (FRAME_HEIGHT * 0.4)));
dataResultPanel = DataResultPanel.createInstance("Timeline Results", "", Node.EMPTY, 0, dataContentPanel); dataResultPanel = DataResultPanel.createInstance(
NbBundle.getMessage(this.getClass(), "Timeline.resultsPanel.title"),
"", Node.EMPTY, 0, dataContentPanel);
dataResultPanel.setContentViewer(dataContentPanel); dataResultPanel.setContentViewer(dataContentPanel);
//dataResultPanel.setAlignmentX(Component.LEFT_ALIGNMENT); //dataResultPanel.setAlignmentX(Component.LEFT_ALIGNMENT);
//dataResultPanel.setPreferredSize(new Dimension((int)(FRAME_WIDTH * 0.5), (int) (FRAME_HEIGHT * 0.5))); //dataResultPanel.setPreferredSize(new Dimension((int)(FRAME_WIDTH * 0.5), (int) (FRAME_HEIGHT * 0.5)));
@ -216,7 +219,8 @@ public class Timeline extends CallableSystemAction implements Presenter.Toolbar,
public void run() { public void run() {
try { try {
// start the progress bar // start the progress bar
progress = ProgressHandleFactory.createHandle("Creating timeline . . ."); progress = ProgressHandleFactory.createHandle(
NbBundle.getMessage(this.getClass(), "Timeline.runJavaFxThread.progress.creating"));
progress.start(); progress.start();
fxChartEvents = null; //important to reset old data fxChartEvents = null; //important to reset old data
@ -244,11 +248,13 @@ public class Timeline extends CallableSystemAction implements Presenter.Toolbar,
if (!mactimeFile.exists()) { if (!mactimeFile.exists()) {
progressDialog.setProgressTotal(3); //total 3 units progressDialog.setProgressTotal(3); //total 3 units
logger.log(Level.INFO, "Creating body file"); logger.log(Level.INFO, "Creating body file");
progressDialog.updateProgressBar("Generating Bodyfile"); progressDialog.updateProgressBar(
NbBundle.getMessage(this.getClass(), "Timeline.runJavaFxThread.progress.genBodyFile"));
String bodyFilePath = makeBodyFile(); String bodyFilePath = makeBodyFile();
progressDialog.updateProgressBar(++currentProgress); progressDialog.updateProgressBar(++currentProgress);
logger.log(Level.INFO, "Creating mactime file: " + mactimeFile.getAbsolutePath()); logger.log(Level.INFO, "Creating mactime file: " + mactimeFile.getAbsolutePath());
progressDialog.updateProgressBar("Generating Mactime"); progressDialog.updateProgressBar(
NbBundle.getMessage(this.getClass(), "Timeline.runJavaFxThread.progress.genMacTime"));
makeMacTime(bodyFilePath); makeMacTime(bodyFilePath);
progressDialog.updateProgressBar(++currentProgress); progressDialog.updateProgressBar(++currentProgress);
data = null; data = null;
@ -258,7 +264,8 @@ public class Timeline extends CallableSystemAction implements Presenter.Toolbar,
} }
progressDialog.updateProgressBar("Parsing Mactime"); progressDialog.updateProgressBar(
NbBundle.getMessage(this.getClass(), "Timeline.runJavaFxThread.progress.parseMacTime"));
if (data == null) { if (data == null) {
logger.log(Level.INFO, "Parsing mactime file: " + mactimeFile.getAbsolutePath()); logger.log(Level.INFO, "Parsing mactime file: " + mactimeFile.getAbsolutePath());
data = parseMacTime(mactimeFile); //The sum total of the mactime parsing. YearEpochs contain everything you need to make a timeline. data = parseMacTime(mactimeFile); //The sum total of the mactime parsing. YearEpochs contain everything you need to make a timeline.
@ -274,7 +281,7 @@ public class Timeline extends CallableSystemAction implements Presenter.Toolbar,
fxDropdownSelectYears = new ComboBox<String>(listSelect); fxDropdownSelectYears = new ComboBox<String>(listSelect);
//Buttons for navigating up and down the timeline //Buttons for navigating up and down the timeline
fxZoomOutButton = new Button("Zoom Out"); fxZoomOutButton = new Button(NbBundle.getMessage(this.getClass(), "Timeline.zoomOutButton.text"));
fxZoomOutButton.setOnAction(new EventHandler<ActionEvent>() { fxZoomOutButton.setOnAction(new EventHandler<ActionEvent>() {
@Override @Override
public void handle(ActionEvent e) { public void handle(ActionEvent e) {
@ -306,7 +313,8 @@ public class Timeline extends CallableSystemAction implements Presenter.Toolbar,
//Adding things to the V and H boxes. //Adding things to the V and H boxes.
//hBox_Charts stores the pseudo menu bar at the top of the timeline. |Zoom Out|View Year: [Select Year]|| //hBox_Charts stores the pseudo menu bar at the top of the timeline. |Zoom Out|View Year: [Select Year]||
fxHBoxCharts.getChildren().addAll(fxZoomOutButton, new Label("Go To:"), fxDropdownSelectYears); fxHBoxCharts.getChildren().addAll(fxZoomOutButton, new Label(
NbBundle.getMessage(this.getClass(), "Timeline.goToButton.text")), fxDropdownSelectYears);
fxVBox.getChildren().addAll(fxHBoxCharts, fxScrollEvents); //FxBox_V holds things in a visual stack. fxVBox.getChildren().addAll(fxHBoxCharts, fxScrollEvents); //FxBox_V holds things in a visual stack.
fxGroupCharts.getChildren().add(fxVBox); //Adding the FxBox to the group. Groups make things easier to manipulate without having to update a hundred things every change. fxGroupCharts.getChildren().add(fxVBox); //Adding the FxBox to the group. Groups make things easier to manipulate without having to update a hundred things every change.
fxPanelCharts.setScene(fxSceneCharts); fxPanelCharts.setScene(fxSceneCharts);
@ -351,8 +359,8 @@ public class Timeline extends CallableSystemAction implements Presenter.Toolbar,
final Label l = new Label(""); final Label l = new Label("");
l.setStyle("-fx-font: 24 arial;"); l.setStyle("-fx-font: 24 arial;");
l.setTextFill(Color.AZURE); l.setTextFill(Color.AZURE);
xAxis.setLabel("Years"); xAxis.setLabel(NbBundle.getMessage(this.getClass(), "Timeline.yearBarChart.x.years"));
yAxis.setLabel("Number of Events"); yAxis.setLabel(NbBundle.getMessage(this.getClass(), "Timeline.yearBarChart.y.numEvents"));
//Charts are made up of individual pieces of Chart.Data. In this case, a piece of barData is a single bar on the graph. //Charts are made up of individual pieces of Chart.Data. In this case, a piece of barData is a single bar on the graph.
//Data is packaged into a series, which can be assigned custom colors or styling //Data is packaged into a series, which can be assigned custom colors or styling
//After the series are created, 1 or more series are packaged into a single chart. //After the series are created, 1 or more series are packaged into a single chart.
@ -417,8 +425,8 @@ public class Timeline extends CallableSystemAction implements Presenter.Toolbar,
private BarChart<String, Number> createMonthsWithDrill(final YearEpoch ye) { private BarChart<String, Number> createMonthsWithDrill(final YearEpoch ye) {
final CategoryAxis xAxis = new CategoryAxis(); final CategoryAxis xAxis = new CategoryAxis();
final NumberAxis yAxis = new NumberAxis(); final NumberAxis yAxis = new NumberAxis();
xAxis.setLabel("Month (" + ye.year + ")"); xAxis.setLabel(NbBundle.getMessage(this.getClass(), "Timeline.MonthsBarChart.x.monthYY", ye.year));
yAxis.setLabel("Number of Events"); yAxis.setLabel(NbBundle.getMessage(this.getClass(), "Timeline.MonthsBarChart.y.numEvents"));
ObservableList<BarChart.Series<String, Number>> bcData = FXCollections.observableArrayList(); ObservableList<BarChart.Series<String, Number>> bcData = FXCollections.observableArrayList();
BarChart.Series<String, Number> se = new BarChart.Series<String, Number>(); BarChart.Series<String, Number> se = new BarChart.Series<String, Number>();
@ -481,8 +489,8 @@ public class Timeline extends CallableSystemAction implements Presenter.Toolbar,
private BarChart<String, Number> createEventsByMonth(final MonthEpoch me, final YearEpoch ye) { private BarChart<String, Number> createEventsByMonth(final MonthEpoch me, final YearEpoch ye) {
final CategoryAxis xAxis = new CategoryAxis(); final CategoryAxis xAxis = new CategoryAxis();
final NumberAxis yAxis = new NumberAxis(); final NumberAxis yAxis = new NumberAxis();
xAxis.setLabel("Day of Month"); xAxis.setLabel(NbBundle.getMessage(this.getClass(), "Timeline.eventsByMoBarChart.x.dayOfMo"));
yAxis.setLabel("Number of Events"); yAxis.setLabel(NbBundle.getMessage(this.getClass(), "Timeline.eventsByMoBarChart.y.numEvents"));
ObservableList<BarChart.Data<String, Number>> bcData = makeObservableListByMonthAllDays(me, ye.getYear()); ObservableList<BarChart.Data<String, Number>> bcData = makeObservableListByMonthAllDays(me, ye.getYear());
BarChart.Series<String, Number> series = new BarChart.Series<String, Number>(bcData); BarChart.Series<String, Number> series = new BarChart.Series<String, Number>(bcData);
series.setName(me.getMonthName() + " " + ye.getYear()); series.setName(me.getMonthName() + " " + ye.getYear());
@ -511,9 +519,10 @@ public class Timeline extends CallableSystemAction implements Presenter.Toolbar,
@Override @Override
public void run() { public void run() {
//reset the view and free the current nodes before loading new ones //reset the view and free the current nodes before loading new ones
final FileRootNode d = new FileRootNode("Empty Root", new ArrayList<Long>()); final FileRootNode d = new FileRootNode(
NbBundle.getMessage(this.getClass(), "Timeline.node.emptyRoot"), new ArrayList<Long>());
dataResultPanel.setNode(d); dataResultPanel.setNode(d);
dataResultPanel.setPath("Loading..."); dataResultPanel.setPath(NbBundle.getMessage(this.getClass(), "Timeline.resultPanel.loading"));
} }
}); });
final int day = (Integer.valueOf((barData.getXValue()).split("-")[1])); final int day = (Integer.valueOf((barData.getXValue()).split("-")[1]));
@ -529,7 +538,8 @@ public class Timeline extends CallableSystemAction implements Presenter.Toolbar,
SwingUtilities.invokeLater(new Runnable() { SwingUtilities.invokeLater(new Runnable() {
@Override @Override
public void run() { public void run() {
final FileRootNode d = new FileRootNode("Root", afs); final FileRootNode d = new FileRootNode(
NbBundle.getMessage(this.getClass(), "Timeline.node.root"), afs);
dataResultPanel.setNode(d); dataResultPanel.setNode(d);
//set result viewer title path with the current date //set result viewer title path with the current date
String dateString = ye.getYear() + "-" + (1 + me.getMonthInt()) + "-" + +de.dayNum; String dateString = ye.getYear() + "-" + (1 + me.getMonthInt()) + "-" + +de.dayNum;
@ -630,7 +640,12 @@ public class Timeline extends CallableSystemAction implements Presenter.Toolbar,
return; return;
} }
int answer = JOptionPane.showConfirmDialog(mainFrame, "Timeline is out of date. Would you like to regenerate it?", "Select an option", JOptionPane.YES_NO_OPTION); int answer = JOptionPane.showConfirmDialog(mainFrame,
NbBundle.getMessage(this.getClass(),
"Timeline.propChg.confDlg.timelineOOD.msg"),
NbBundle.getMessage(this.getClass(),
"Timeline.propChg.confDlg.timelineOOD.details"),
JOptionPane.YES_NO_OPTION);
if (answer != JOptionPane.YES_OPTION) { if (answer != JOptionPane.YES_OPTION) {
return; return;
} }
@ -1150,9 +1165,10 @@ public class Timeline extends CallableSystemAction implements Presenter.Toolbar,
if (IngestManager.getDefault().isIngestRunning()) { if (IngestManager.getDefault().isIngestRunning()) {
int answer = JOptionPane.showConfirmDialog(new JFrame(), int answer = JOptionPane.showConfirmDialog(new JFrame(),
"You are trying to generate a timeline before " NbBundle.getMessage(this.getClass(),
+ "ingest has been completed. The timeline may be " "Timeline.initTimeline.confDlg.genBeforeIngest.msg"),
+ "incomplete. Do you want to continue?", "Timeline", NbBundle.getMessage(this.getClass(),
"Timeline.initTimeline.confDlg.genBeforeIngest.deails"),
JOptionPane.YES_NO_OPTION); JOptionPane.YES_NO_OPTION);
if (answer != JOptionPane.YES_OPTION) { if (answer != JOptionPane.YES_OPTION) {
return; return;
@ -1204,7 +1220,7 @@ public class Timeline extends CallableSystemAction implements Presenter.Toolbar,
@Override @Override
public String getName() { public String getName() {
return "Make Timeline (Beta)"; return NbBundle.getMessage(this.getClass(), "Timeline.getName");
} }
@Override @Override