Merge remote-tracking branch 'upstream/develop' into include_all_drawable_mimetypes

Conflicts:
	ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/DrawableDB.java
This commit is contained in:
jmillman 2015-07-02 12:56:32 -04:00
parent 1138ed5f89
commit bf68bea824
11 changed files with 186 additions and 74 deletions

View File

@ -147,3 +147,7 @@ AutopsyOptionsPanel.jLabelNumThreads.text=Number of threads to use for file inge
FXVideoPanel.progress.bufferingCancelled=media buffering was canceled FXVideoPanel.progress.bufferingCancelled=media buffering was canceled
FXVideoPanel.progress.bufferingInterrupted=media buffering was interrupted FXVideoPanel.progress.bufferingInterrupted=media buffering was interrupted
FXVideoPanel.progress.errorWritingVideoToDisk=Error writing video to disk FXVideoPanel.progress.errorWritingVideoToDisk=Error writing video to disk
DataContentViewerHex.goToOffsetLabel.text=Jump to Offset
DataContentViewerHex.goToOffsetTextField.text=
DataContentViewerHex.goToOffsetTextField.msgDlg=Invalid Offset: {0}
DataContentViewerHex.setDataView.invalidOffset.negativeOffsetValue=Cannot jump to the resultant offset

View File

@ -88,9 +88,13 @@
<Component id="goToPageLabel" min="-2" max="-2" attributes="0"/> <Component id="goToPageLabel" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/> <EmptySpace max="-2" attributes="0"/>
<Component id="goToPageTextField" min="-2" pref="79" max="-2" attributes="0"/> <Component id="goToPageTextField" min="-2" pref="79" max="-2" attributes="0"/>
<EmptySpace pref="205" max="32767" attributes="0"/> <EmptySpace type="separate" max="-2" attributes="0"/>
<Component id="goToOffsetLabel" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="goToOffsetTextField" min="-2" pref="79" max="-2" attributes="0"/>
<EmptySpace max="32767" attributes="0"/>
</Group> </Group>
<Component id="jScrollPane1" alignment="0" pref="622" max="32767" attributes="0"/> <Component id="jScrollPane1" alignment="0" max="32767" attributes="0"/>
</Group> </Group>
</DimensionLayout> </DimensionLayout>
<DimensionLayout dim="1"> <DimensionLayout dim="1">
@ -108,9 +112,11 @@
<Component id="prevPageButton" alignment="0" min="-2" pref="23" max="-2" attributes="0"/> <Component id="prevPageButton" alignment="0" min="-2" pref="23" max="-2" attributes="0"/>
<Component id="goToPageLabel" alignment="0" min="-2" max="-2" attributes="0"/> <Component id="goToPageLabel" alignment="0" min="-2" max="-2" attributes="0"/>
<Component id="goToPageTextField" alignment="0" min="-2" max="-2" attributes="0"/> <Component id="goToPageTextField" alignment="0" min="-2" max="-2" attributes="0"/>
<Component id="goToOffsetLabel" alignment="0" min="-2" max="-2" attributes="0"/>
<Component id="goToOffsetTextField" alignment="0" min="-2" max="-2" attributes="0"/>
</Group> </Group>
<EmptySpace min="-2" pref="0" max="-2" attributes="0"/> <EmptySpace max="-2" attributes="0"/>
<Component id="jScrollPane1" pref="388" max="32767" attributes="0"/> <Component id="jScrollPane1" pref="382" max="32767" attributes="0"/>
</Group> </Group>
</Group> </Group>
</DimensionLayout> </DimensionLayout>
@ -131,6 +137,9 @@
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor"> <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Courier New" size="11" style="0"/> <Font name="Courier New" size="11" style="0"/>
</Property> </Property>
<Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor">
<Color id="Default Cursor"/>
</Property>
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor"> <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[700, 20]"/> <Dimension value="[700, 20]"/>
</Property> </Property>
@ -140,7 +149,7 @@
</Properties> </Properties>
<AuxValues> <AuxValues>
<AuxValue name="JavaCodeGenerator_CreateCodeCustom" type="java.lang.String" value="new JTextPane(){&#xd; public boolean getScrollableTracksViewportWidth() {&#xd; return (getSize().width &lt; 400);&#xd; }};"/> <AuxValue name="JavaCodeGenerator_CreateCodeCustom" type="java.lang.String" value="new JTextPane(){&#xd; public boolean getScrollableTracksViewportWidth() {&#xd; return (getSize().width &lt; 400);&#xd; }};"/>
<AuxValue name="JavaCodeGenerator_CreateCodePost" type="java.lang.String" value="this.outputViewPane.setBackground(new java.awt.Color(255, 255, 255)); // to make sure the background color is white"/> <AuxValue name="JavaCodeGenerator_CreateCodePost" type="java.lang.String" value="this.outputViewPane.setBackground(new java.awt.Color(255, 255, 255)); // to make sure the background color is white&#xd;&#xa;this.outputViewPane.requestFocusInWindow();&#xd;&#xa;this.outputViewPane.setCursor(Cursor.getDefaultCursor());&#xd;&#xa;"/>
</AuxValues> </AuxValues>
</Component> </Component>
</SubComponents> </SubComponents>
@ -278,6 +287,23 @@
</Property> </Property>
</Properties> </Properties>
</Component> </Component>
<Component class="javax.swing.JLabel" name="goToOffsetLabel">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/corecomponents/Bundle.properties" key="DataContentViewerHex.goToOffsetLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
</Component>
<Component class="javax.swing.JTextField" name="goToOffsetTextField">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/corecomponents/Bundle.properties" key="DataContentViewerHex.goToOffsetTextField.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="goToOffsetTextFieldActionPerformed"/>
</Events>
</Component>
</SubComponents> </SubComponents>
</Container> </Container>
</SubComponents> </SubComponents>

View File

@ -28,6 +28,8 @@ import org.sleuthkit.autopsy.coreutils.Logger;
import javax.swing.JMenuItem; import javax.swing.JMenuItem;
import javax.swing.JOptionPane; import javax.swing.JOptionPane;
import javax.swing.JTextPane; import javax.swing.JTextPane;
import javax.swing.text.BadLocationException;
import javax.swing.text.Utilities;
import org.openide.nodes.Node; import org.openide.nodes.Node;
import org.openide.util.lookup.ServiceProvider; import org.openide.util.lookup.ServiceProvider;
import org.sleuthkit.autopsy.corecomponentinterfaces.DataContentViewer; import org.sleuthkit.autopsy.corecomponentinterfaces.DataContentViewer;
@ -94,6 +96,8 @@ public class DataContentViewerHex extends javax.swing.JPanel implements DataCont
return (getSize().width < 400); return (getSize().width < 400);
}}; }};
this.outputViewPane.setBackground(new java.awt.Color(255, 255, 255)); // to make sure the background color is white this.outputViewPane.setBackground(new java.awt.Color(255, 255, 255)); // to make sure the background color is white
this.outputViewPane.requestFocusInWindow();
this.outputViewPane.setCursor(Cursor.getDefaultCursor());
totalPageLabel = new javax.swing.JLabel(); totalPageLabel = new javax.swing.JLabel();
ofLabel = new javax.swing.JLabel(); ofLabel = new javax.swing.JLabel();
currentPageLabel = new javax.swing.JLabel(); currentPageLabel = new javax.swing.JLabel();
@ -103,6 +107,8 @@ public class DataContentViewerHex extends javax.swing.JPanel implements DataCont
pageLabel2 = new javax.swing.JLabel(); pageLabel2 = new javax.swing.JLabel();
goToPageTextField = new javax.swing.JTextField(); goToPageTextField = new javax.swing.JTextField();
goToPageLabel = new javax.swing.JLabel(); goToPageLabel = new javax.swing.JLabel();
goToOffsetLabel = new javax.swing.JLabel();
goToOffsetTextField = new javax.swing.JTextField();
copyMenuItem.setText(org.openide.util.NbBundle.getMessage(DataContentViewerHex.class, "DataContentViewerHex.copyMenuItem.text")); // NOI18N copyMenuItem.setText(org.openide.util.NbBundle.getMessage(DataContentViewerHex.class, "DataContentViewerHex.copyMenuItem.text")); // NOI18N
rightClickMenu.add(copyMenuItem); rightClickMenu.add(copyMenuItem);
@ -113,7 +119,8 @@ public class DataContentViewerHex extends javax.swing.JPanel implements DataCont
jScrollPane1.setBackground(new java.awt.Color(255, 255, 255)); jScrollPane1.setBackground(new java.awt.Color(255, 255, 255));
outputViewPane.setEditable(false); outputViewPane.setEditable(false);
outputViewPane.setFont(new Font("Courier New", Font.PLAIN, 11)); // NOI18N NON-NLS outputViewPane.setFont(new java.awt.Font("Courier New", 0, 11)); // NOI18N
outputViewPane.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
outputViewPane.setMinimumSize(new java.awt.Dimension(700, 20)); outputViewPane.setMinimumSize(new java.awt.Dimension(700, 20));
outputViewPane.setPreferredSize(new java.awt.Dimension(700, 400)); outputViewPane.setPreferredSize(new java.awt.Dimension(700, 400));
jScrollPane1.setViewportView(outputViewPane); jScrollPane1.setViewportView(outputViewPane);
@ -132,28 +139,28 @@ public class DataContentViewerHex extends javax.swing.JPanel implements DataCont
pageLabel.setMinimumSize(new java.awt.Dimension(33, 14)); pageLabel.setMinimumSize(new java.awt.Dimension(33, 14));
pageLabel.setPreferredSize(new java.awt.Dimension(33, 14)); pageLabel.setPreferredSize(new java.awt.Dimension(33, 14));
prevPageButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/corecomponents/btn_step_back.png"))); // NOI18N NON-NLS prevPageButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/corecomponents/btn_step_back.png"))); // NOI18N
prevPageButton.setText(org.openide.util.NbBundle.getMessage(DataContentViewerHex.class, "DataContentViewerHex.prevPageButton.text")); // NOI18N prevPageButton.setText(org.openide.util.NbBundle.getMessage(DataContentViewerHex.class, "DataContentViewerHex.prevPageButton.text")); // NOI18N
prevPageButton.setBorderPainted(false); prevPageButton.setBorderPainted(false);
prevPageButton.setContentAreaFilled(false); prevPageButton.setContentAreaFilled(false);
prevPageButton.setDisabledIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/corecomponents/btn_step_back_disabled.png"))); // NOI18N NON-NLS prevPageButton.setDisabledIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/corecomponents/btn_step_back_disabled.png"))); // NOI18N
prevPageButton.setMargin(new java.awt.Insets(2, 0, 2, 0)); prevPageButton.setMargin(new java.awt.Insets(2, 0, 2, 0));
prevPageButton.setPreferredSize(new java.awt.Dimension(23, 23)); prevPageButton.setPreferredSize(new java.awt.Dimension(23, 23));
prevPageButton.setRolloverIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/corecomponents/btn_step_back_hover.png"))); // NOI18N NON-NLS prevPageButton.setRolloverIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/corecomponents/btn_step_back_hover.png"))); // NOI18N
prevPageButton.addActionListener(new java.awt.event.ActionListener() { prevPageButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) { public void actionPerformed(java.awt.event.ActionEvent evt) {
prevPageButtonActionPerformed(evt); prevPageButtonActionPerformed(evt);
} }
}); });
nextPageButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/corecomponents/btn_step_forward.png"))); // NOI18N NON-NLS nextPageButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/corecomponents/btn_step_forward.png"))); // NOI18N
nextPageButton.setText(org.openide.util.NbBundle.getMessage(DataContentViewerHex.class, "DataContentViewerHex.nextPageButton.text")); // NOI18N nextPageButton.setText(org.openide.util.NbBundle.getMessage(DataContentViewerHex.class, "DataContentViewerHex.nextPageButton.text")); // NOI18N
nextPageButton.setBorderPainted(false); nextPageButton.setBorderPainted(false);
nextPageButton.setContentAreaFilled(false); nextPageButton.setContentAreaFilled(false);
nextPageButton.setDisabledIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/corecomponents/btn_step_forward_disabled.png"))); // NOI18N NON-NLS nextPageButton.setDisabledIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/corecomponents/btn_step_forward_disabled.png"))); // NOI18N
nextPageButton.setMargin(new java.awt.Insets(2, 0, 2, 0)); nextPageButton.setMargin(new java.awt.Insets(2, 0, 2, 0));
nextPageButton.setPreferredSize(new java.awt.Dimension(23, 23)); nextPageButton.setPreferredSize(new java.awt.Dimension(23, 23));
nextPageButton.setRolloverIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/corecomponents/btn_step_forward_hover.png"))); // NOI18N NON-NLS nextPageButton.setRolloverIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/corecomponents/btn_step_forward_hover.png"))); // NOI18N
nextPageButton.addActionListener(new java.awt.event.ActionListener() { nextPageButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) { public void actionPerformed(java.awt.event.ActionEvent evt) {
nextPageButtonActionPerformed(evt); nextPageButtonActionPerformed(evt);
@ -174,6 +181,15 @@ public class DataContentViewerHex extends javax.swing.JPanel implements DataCont
goToPageLabel.setText(org.openide.util.NbBundle.getMessage(DataContentViewerHex.class, "DataContentViewerHex.goToPageLabel.text")); // NOI18N goToPageLabel.setText(org.openide.util.NbBundle.getMessage(DataContentViewerHex.class, "DataContentViewerHex.goToPageLabel.text")); // NOI18N
goToOffsetLabel.setText(org.openide.util.NbBundle.getMessage(DataContentViewerHex.class, "DataContentViewerHex.goToOffsetLabel.text")); // NOI18N
goToOffsetTextField.setText(org.openide.util.NbBundle.getMessage(DataContentViewerHex.class, "DataContentViewerHex.goToOffsetTextField.text")); // NOI18N
goToOffsetTextField.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
goToOffsetTextFieldActionPerformed(evt);
}
});
javax.swing.GroupLayout hexViewerPanelLayout = new javax.swing.GroupLayout(hexViewerPanel); javax.swing.GroupLayout hexViewerPanelLayout = new javax.swing.GroupLayout(hexViewerPanel);
hexViewerPanel.setLayout(hexViewerPanelLayout); hexViewerPanel.setLayout(hexViewerPanelLayout);
hexViewerPanelLayout.setHorizontalGroup( hexViewerPanelLayout.setHorizontalGroup(
@ -197,8 +213,12 @@ public class DataContentViewerHex extends javax.swing.JPanel implements DataCont
.addComponent(goToPageLabel) .addComponent(goToPageLabel)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(goToPageTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 79, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(goToPageTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 79, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(205, Short.MAX_VALUE)) .addGap(18, 18, 18)
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 622, Short.MAX_VALUE) .addComponent(goToOffsetLabel)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(goToOffsetTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 79, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addComponent(jScrollPane1)
); );
hexViewerPanelLayout.setVerticalGroup( hexViewerPanelLayout.setVerticalGroup(
hexViewerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) hexViewerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
@ -213,9 +233,11 @@ public class DataContentViewerHex extends javax.swing.JPanel implements DataCont
.addComponent(nextPageButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(nextPageButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(prevPageButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(prevPageButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(goToPageLabel) .addComponent(goToPageLabel)
.addComponent(goToPageTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addComponent(goToPageTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(0, 0, 0) .addComponent(goToOffsetLabel)
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 388, Short.MAX_VALUE)) .addComponent(goToOffsetTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 382, Short.MAX_VALUE))
); );
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
@ -241,11 +263,13 @@ public class DataContentViewerHex extends javax.swing.JPanel implements DataCont
}// </editor-fold>//GEN-END:initComponents }// </editor-fold>//GEN-END:initComponents
private void prevPageButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_prevPageButtonActionPerformed private void prevPageButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_prevPageButtonActionPerformed
setDataView(currentPage - 1); setDataViewByPageNumber(currentPage - 1);
goToPageTextField.setText(Integer.toString(currentPage));
}//GEN-LAST:event_prevPageButtonActionPerformed }//GEN-LAST:event_prevPageButtonActionPerformed
private void nextPageButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_nextPageButtonActionPerformed private void nextPageButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_nextPageButtonActionPerformed
setDataView(currentPage + 1); setDataViewByPageNumber(currentPage + 1);
goToPageTextField.setText(Integer.toString(currentPage));
}//GEN-LAST:event_nextPageButtonActionPerformed }//GEN-LAST:event_nextPageButtonActionPerformed
private void goToPageTextFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_goToPageTextFieldActionPerformed private void goToPageTextFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_goToPageTextFieldActionPerformed
@ -267,11 +291,59 @@ public class DataContentViewerHex extends javax.swing.JPanel implements DataCont
JOptionPane.WARNING_MESSAGE); JOptionPane.WARNING_MESSAGE);
return; return;
} }
setDataView(pageNumber); setDataViewByPageNumber(pageNumber);
}//GEN-LAST:event_goToPageTextFieldActionPerformed }//GEN-LAST:event_goToPageTextFieldActionPerformed
/***
* Calculates the offset relative to the current caret position.
* @param userInput the user provided signed offset value.
* @return returns the resultant offset value relative to the current caret
* position. -1L is returned if the resultant offset cannot be calculated.
*/
private long getOffsetRelativeToCaretPosition(Long userInput) {
String userSelectedLine;
try {
// get the selected line. Extract the current hex offset location.
userSelectedLine = outputViewPane.getText().subSequence(
Utilities.getRowStart(outputViewPane, outputViewPane.getCaretPosition()),
Utilities.getRowEnd(outputViewPane, outputViewPane.getCaretPosition()))
.toString();
// NOTE: This needs to change if the outputFormat of outputViewPane changes.
String hexForUserSelectedLine = userSelectedLine.substring(0, userSelectedLine.indexOf(":"));
return Long.decode(hexForUserSelectedLine) + userInput;
} catch (BadLocationException | StringIndexOutOfBoundsException | NumberFormatException ex) {
// thrown in case the caret location is out of the range of the outputViewPane.
return -1L;
}
}
private void goToOffsetTextFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_goToOffsetTextFieldActionPerformed
long offset;
try {
if (goToOffsetTextField.getText().startsWith("+") || goToOffsetTextField.getText().startsWith("-")) {
offset = getOffsetRelativeToCaretPosition(Long.decode(goToOffsetTextField.getText()));
} else {
offset = Long.decode(goToOffsetTextField.getText());
}
} catch (NumberFormatException ex) {
// notify the user and return
JOptionPane.showMessageDialog(this, NbBundle.getMessage(this.getClass(), "DataContentViewerHex.goToOffsetTextField.msgDlg", goToOffsetTextField.getText()));
return;
}
if (offset >= 0) {
setDataViewByOffset(offset);
} else {
outputViewPane.setText(NbBundle.getMessage(DataContentViewerHex.class, "DataContentViewerHex.setDataView.invalidOffset.negativeOffsetValue"));
}
}//GEN-LAST:event_goToOffsetTextFieldActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables // Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JMenuItem copyMenuItem; private javax.swing.JMenuItem copyMenuItem;
private javax.swing.JLabel currentPageLabel; private javax.swing.JLabel currentPageLabel;
private javax.swing.JLabel goToOffsetLabel;
private javax.swing.JTextField goToOffsetTextField;
private javax.swing.JLabel goToPageLabel; private javax.swing.JLabel goToPageLabel;
private javax.swing.JTextField goToPageTextField; private javax.swing.JTextField goToPageTextField;
private javax.swing.JPanel hexViewerPanel; private javax.swing.JPanel hexViewerPanel;
@ -289,22 +361,37 @@ public class DataContentViewerHex extends javax.swing.JPanel implements DataCont
/** /**
* Sets the DataView (The tabbed panel) * Sets the DataView (The tabbed panel) by page number
* *
* @param page Page to display (1-based counting) * @param page Page to display (1-based counting)
*/ */
private void setDataView(int page) { private void setDataViewByPageNumber(int page) {
if (this.dataSource == null) { if (this.dataSource == null) {
return; return;
} }
if (page == 0) { if (page == 0) {
return; return;
} }
currentPage = page; currentPage = page;
long offset = (currentPage - 1) * pageLength; long offset = (currentPage - 1) * pageLength;
setDataView(offset);
goToOffsetTextField.setText(Long.toString(offset));
}
/**
* Sets the DataView (The tabbed panel) by offset
*
* @param page Page to display (1-based counting)
*/
private void setDataViewByOffset(long offset) {
if (this.dataSource == null) {
return;
}
currentPage = (int) (offset / pageLength) + 1;
setDataView(offset);
goToPageTextField.setText(Integer.toString(currentPage));
}
private void setDataView(long offset) {
// change the cursor to "waiting cursor" for this operation // change the cursor to "waiting cursor" for this operation
this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
@ -316,7 +403,7 @@ public class DataContentViewerHex extends javax.swing.JPanel implements DataCont
bytesRead = dataSource.read(data, offset, pageLength); // read the data bytesRead = dataSource.read(data, offset, pageLength); // read the data
} catch (TskException ex) { } catch (TskException ex) {
errorText = NbBundle.getMessage(this.getClass(), "DataContentViewerHex.setDataView.errorText", offset, errorText = NbBundle.getMessage(this.getClass(), "DataContentViewerHex.setDataView.errorText", offset,
offset + pageLength); offset + pageLength);
logger.log(Level.WARNING, "Error while trying to show the hex content.", ex); //NON-NLS logger.log(Level.WARNING, "Error while trying to show the hex content.", ex); //NON-NLS
} }
} }
@ -324,22 +411,19 @@ public class DataContentViewerHex extends javax.swing.JPanel implements DataCont
// set the data on the bottom and show it // set the data on the bottom and show it
if (bytesRead <= 0) { if (bytesRead <= 0) {
errorText = NbBundle.getMessage(this.getClass(), "DataContentViewerHex.setDataView.errorText", offset, errorText = NbBundle.getMessage(this.getClass(), "DataContentViewerHex.setDataView.errorText", offset,
offset + pageLength); offset + pageLength);
} }
// disable or enable the next button // disable or enable the next button
if ((errorText == null) && (currentPage < totalPages)) { if ((errorText == null) && (currentPage < totalPages)) {
nextPageButton.setEnabled(true); nextPageButton.setEnabled(true);
} } else {
else {
nextPageButton.setEnabled(false); nextPageButton.setEnabled(false);
} }
if ((errorText == null) && (currentPage > 1)) { if ((errorText == null) && (currentPage > 1)) {
prevPageButton.setEnabled(true); prevPageButton.setEnabled(true);
} } else {
else {
prevPageButton.setEnabled(false); prevPageButton.setEnabled(false);
} }
@ -350,8 +434,7 @@ public class DataContentViewerHex extends javax.swing.JPanel implements DataCont
if (errorText == null) { if (errorText == null) {
int showLength = bytesRead < pageLength ? bytesRead : (int) pageLength; int showLength = bytesRead < pageLength ? bytesRead : (int) pageLength;
outputViewPane.setText(DataConversion.byteArrayToHex(data, showLength, offset)); outputViewPane.setText(DataConversion.byteArrayToHex(data, showLength, offset));
} } else {
else {
outputViewPane.setText(errorText); outputViewPane.setText(errorText);
} }
@ -379,7 +462,7 @@ public class DataContentViewerHex extends javax.swing.JPanel implements DataCont
} }
totalPageLabel.setText(Integer.toString(totalPages)); totalPageLabel.setText(Integer.toString(totalPages));
this.setDataView(1); this.setDataViewByPageNumber(1);
} }
@Override @Override
@ -423,6 +506,8 @@ public class DataContentViewerHex extends javax.swing.JPanel implements DataCont
pageLabel2.setVisible(isVisible); pageLabel2.setVisible(isVisible);
goToPageTextField.setVisible(isVisible); goToPageTextField.setVisible(isVisible);
goToPageLabel.setVisible(isVisible); goToPageLabel.setVisible(isVisible);
goToOffsetTextField.setVisible(isVisible);
goToOffsetLabel.setVisible(isVisible);
} }
@Override @Override

View File

@ -120,7 +120,7 @@ public final class JythonModuleLoader {
interpreter.exec("import sys"); //NON-NLS interpreter.exec("import sys"); //NON-NLS
String path = Matcher.quoteReplacement(script.getParent()); String path = Matcher.quoteReplacement(script.getParent());
interpreter.exec("sys.path.append('" + path + "')"); //NON-NLS interpreter.exec("sys.path.append('" + path + "')"); //NON-NLS
String moduleName = script.getName().replaceAll(".py", ""); //NON-NLS String moduleName = script.getName().replaceAll("\\.py$", ""); //NON-NLS
// reload the module so that the changes made to it can be loaded. // reload the module so that the changes made to it can be loaded.
interpreter.exec("import " + moduleName); //NON-NLS interpreter.exec("import " + moduleName); //NON-NLS

View File

@ -34,6 +34,7 @@ import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.Lock;
@ -1196,10 +1197,23 @@ public final class DrawableDB {
/** /**
* For performance reasons, keep the file type in memory * For performance reasons, keep the file type in memory
*/ */
private final Map<AbstractFile, Boolean> videoFileMap = new ConcurrentHashMap<>(); private final Map<Long, Boolean> videoFileMap = new ConcurrentHashMap<>();
/**
* is this File a video file?
*
* @param f check if this file is a video. will return false for null file.
*
* @return returns true if this file is a video as determined by {@link ImageGalleryModule#isVideoFile(org.sleuthkit.datamodel.AbstractFile)
* } but caches the result.
* returns false if passed a null AbstractFile
*/
public boolean isVideoFile(AbstractFile f) { public boolean isVideoFile(AbstractFile f) {
return videoFileMap.computeIfAbsent(f, FileTypeUtils::isVideoFile); if (Objects.isNull(f)) {
return false;
} else {
return videoFileMap.computeIfAbsent(f.getId(), (id) -> ImageGalleryModule.isVideoFile(f));
}
} }
/** /**

View File

@ -284,7 +284,7 @@ public abstract class DrawableTileBase extends DrawableUIBase {
} }
@Override @Override
protected void setFileHelper(final Long newFileID) { synchronized protected void setFileHelper(final Long newFileID) {
setFileIDOpt(Optional.ofNullable(newFileID)); setFileIDOpt(Optional.ofNullable(newFileID));
disposeContent(); disposeContent();
@ -351,7 +351,6 @@ public abstract class DrawableTileBase extends DrawableUIBase {
@Subscribe @Subscribe
@Override @Override
public void handleTagAdded(ContentTagAddedEvent evt) { public void handleTagAdded(ContentTagAddedEvent evt) {
handleTagEvent(evt, () -> { handleTagEvent(evt, () -> {
Platform.runLater(() -> { Platform.runLater(() -> {
followUpImageView.setImage(followUpIcon); followUpImageView.setImage(followUpIcon);

View File

@ -35,9 +35,9 @@ abstract public class DrawableUIBase extends AnchorPane implements DrawableView
private final ImageGalleryController controller; private final ImageGalleryController controller;
volatile private Optional<DrawableFile<?>> fileOpt = Optional.empty(); private Optional<DrawableFile<?>> fileOpt = Optional.empty();
volatile private Optional<Long> fileIDOpt = Optional.empty(); private Optional<Long> fileIDOpt = Optional.empty();
public DrawableUIBase(ImageGalleryController controller) { public DrawableUIBase(ImageGalleryController controller) {
this.controller = controller; this.controller = controller;
@ -53,16 +53,16 @@ abstract public class DrawableUIBase extends AnchorPane implements DrawableView
return fileIDOpt; return fileIDOpt;
} }
void setFileIDOpt(Optional<Long> fileIDOpt) { synchronized void setFileIDOpt(Optional<Long> fileIDOpt) {
this.fileIDOpt = fileIDOpt; this.fileIDOpt = fileIDOpt;
} }
void setFileOpt(Optional<DrawableFile<?>> fileOpt) { synchronized void setFileOpt(Optional<DrawableFile<?>> fileOpt) {
this.fileOpt = fileOpt; this.fileOpt = fileOpt;
} }
@Override @Override
public Optional<DrawableFile<?>> getFile() { synchronized public Optional<DrawableFile<?>> getFile() {
if (fileIDOpt.isPresent()) { if (fileIDOpt.isPresent()) {
if (fileOpt.isPresent() && fileOpt.get().getId() == fileIDOpt.get()) { if (fileOpt.isPresent() && fileOpt.get().getId() == fileIDOpt.get()) {
return fileOpt; return fileOpt;
@ -83,7 +83,7 @@ abstract public class DrawableUIBase extends AnchorPane implements DrawableView
protected abstract void setFileHelper(Long newFileID); protected abstract void setFileHelper(Long newFileID);
@Override @Override
public void setFile(Long newFileID) { synchronized public void setFile(Long newFileID) {
if (getFileID().isPresent()) { if (getFileID().isPresent()) {
if (Objects.equals(newFileID, getFileID().get()) == false) { if (Objects.equals(newFileID, getFileID().get()) == false) {
setFileHelper(newFileID); setFileHelper(newFileID);
@ -92,6 +92,4 @@ abstract public class DrawableUIBase extends AnchorPane implements DrawableView
setFileHelper(newFileID); setFileHelper(newFileID);
} }
} }
} }

View File

@ -150,7 +150,7 @@ public class MetaDataPane extends DrawableUIBase {
} }
@Override @Override
protected synchronized void setFileHelper(Long newFileID) { synchronized protected void setFileHelper(Long newFileID) {
setFileIDOpt(Optional.ofNullable(newFileID)); setFileIDOpt(Optional.ofNullable(newFileID));
if (newFileID == null) { if (newFileID == null) {
Platform.runLater(() -> { Platform.runLater(() -> {

View File

@ -290,7 +290,7 @@ public class SlideShowView extends DrawableTileBase {
* 1 => right / forward * 1 => right / forward
*/ */
@ThreadConfined(type = ThreadType.JFX) @ThreadConfined(type = ThreadType.JFX)
private void cycleSlideShowImage(int direction) { synchronized private void cycleSlideShowImage(int direction) {
stopVideo(); stopVideo();
final int groupSize = getGroupPane().getGrouping().fileIds().size(); final int groupSize = getGroupPane().getGrouping().fileIds().size();
final Integer nextIndex = getFileID().map(fileID -> { final Integer nextIndex = getFileID().map(fileID -> {
@ -363,7 +363,6 @@ public class SlideShowView extends DrawableTileBase {
new CategorizeAction(getController()).addTag(getController().getTagsManager().getTagName(cat), ""); new CategorizeAction(getController()).addTag(getController().getTagsManager().getTagName(cat), "");
} }
}); });
} }
} }
} }

View File

@ -107,7 +107,6 @@ class GroupTreeCell extends TreeCell<TreeNode> {
setStyle(""); setStyle("");
}); });
} else { } else {
if (isNull(treeNode.getGroup())) { if (isNull(treeNode.getGroup())) {
final String groupName = getGroupName(); final String groupName = getGroupName();
//"dummy" group in file system tree <=> a folder with no drawables //"dummy" group in file system tree <=> a folder with no drawables
@ -141,7 +140,7 @@ class GroupTreeCell extends TreeCell<TreeNode> {
private String getGroupName() { private String getGroupName() {
return Optional.ofNullable(getItem()) return Optional.ofNullable(getItem())
.map((TreeNode t) -> StringUtils.defaultIfBlank(t.getPath(), DrawableGroup.getBlankGroupName())) .map(treeNode -> StringUtils.defaultIfBlank(treeNode.getPath(), DrawableGroup.getBlankGroupName()))
.orElse(""); .orElse("");
} }

View File

@ -28,7 +28,6 @@ import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.value.ObservableValue; import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections; import javafx.collections.FXCollections;
import javafx.collections.ListChangeListener; import javafx.collections.ListChangeListener;
import javafx.collections.ObservableList;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.scene.control.ComboBox; import javafx.scene.control.ComboBox;
import javafx.scene.control.ListView; import javafx.scene.control.ListView;
@ -151,13 +150,15 @@ public class NavPanel extends TabPane {
} }
}); });
initHashTree();
initNavTree();
controller.getGroupManager().getAnalyzedGroups().addListener((ListChangeListener.Change<? extends DrawableGroup> change) -> { controller.getGroupManager().getAnalyzedGroups().addListener((ListChangeListener.Change<? extends DrawableGroup> change) -> {
TreeItem<TreeNode> selectedItem = activeTreeProperty.get().getSelectionModel().getSelectedItem(); TreeItem<TreeNode> selectedItem = activeTreeProperty.get().getSelectionModel().getSelectedItem();
boolean wasPermuted = false; boolean wasPermuted = false;
while (change.next()) { while (change.next()) {
if (change.wasPermutated()) {
// Handle this afterward
wasPermuted = true;
break;
}
for (DrawableGroup g : change.getAddedSubList()) { for (DrawableGroup g : change.getAddedSubList()) {
insertIntoNavTree(g); insertIntoNavTree(g);
if (g.getHashSetHitsCount() > 0) { if (g.getHashSetHitsCount() > 0) {
@ -168,11 +169,6 @@ public class NavPanel extends TabPane {
removeFromNavTree(g); removeFromNavTree(g);
removeFromHashTree(g); removeFromHashTree(g);
} }
if (change.wasPermutated()) {
// Handle this afterward
wasPermuted = true;
break;
}
} }
if (wasPermuted) { if (wasPermuted) {
@ -182,16 +178,10 @@ public class NavPanel extends TabPane {
Platform.runLater(() -> { Platform.runLater(() -> {
setFocusedGroup(selectedItem.getValue().getGroup()); setFocusedGroup(selectedItem.getValue().getGroup());
}); });
} }
}); });
for (DrawableGroup g : controller.getGroupManager().getAnalyzedGroups()) { rebuildTrees();
insertIntoNavTree(g);
if (g.getHashSetHitsCount() > 0) {
insertIntoHashTree(g);
}
}
controller.viewState().addListener((ObservableValue<? extends GroupViewState> observable, GroupViewState oldValue, GroupViewState newValue) -> { controller.viewState().addListener((ObservableValue<? extends GroupViewState> observable, GroupViewState oldValue, GroupViewState newValue) -> {
if (newValue != null && newValue.getGroup() != null) { if (newValue != null && newValue.getGroup() != null) {
@ -204,9 +194,7 @@ public class NavPanel extends TabPane {
navTreeRoot = new GroupTreeItem("", null, sortByBox.getSelectionModel().selectedItemProperty().get()); navTreeRoot = new GroupTreeItem("", null, sortByBox.getSelectionModel().selectedItemProperty().get());
hashTreeRoot = new GroupTreeItem("", null, sortByBox.getSelectionModel().selectedItemProperty().get()); hashTreeRoot = new GroupTreeItem("", null, sortByBox.getSelectionModel().selectedItemProperty().get());
ObservableList<DrawableGroup> groups = controller.getGroupManager().getAnalyzedGroups(); for (DrawableGroup g : controller.getGroupManager().getAnalyzedGroups()) {
for (DrawableGroup g : groups) {
insertIntoNavTree(g); insertIntoNavTree(g);
if (g.getHashSetHitsCount() > 0) { if (g.getHashSetHitsCount() > 0) {
insertIntoHashTree(g); insertIntoHashTree(g);