mirror of
https://github.com/overcuriousity/autopsy-flatpak.git
synced 2025-07-06 21:00:22 +00:00
This commit is contained in:
commit
97e034b02a
@ -18,9 +18,12 @@
|
||||
*/
|
||||
package org.sleuthkit.autopsy.corecomponents;
|
||||
|
||||
import java.awt.Component;
|
||||
import java.awt.Cursor;
|
||||
import java.beans.PropertyChangeEvent;
|
||||
import java.beans.PropertyChangeListener;
|
||||
import java.beans.PropertyVetoException;
|
||||
import java.io.IOException;
|
||||
import java.util.logging.Level;
|
||||
import javax.swing.JPanel;
|
||||
import org.openide.explorer.ExplorerManager;
|
||||
@ -35,19 +38,19 @@ import org.sleuthkit.autopsy.coreutils.Logger;
|
||||
* Holds commonalities between all DataResultViewers
|
||||
*/
|
||||
public abstract class AbstractDataResultViewer extends JPanel implements
|
||||
DataResultViewer, Provider, PropertyChangeListener {
|
||||
DataResultViewer, Provider {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(AbstractDataResultViewer.class.getName());
|
||||
|
||||
protected transient ExplorerManager em = new ExplorerManager();
|
||||
private PropertyChangeListener nodeSelListener;
|
||||
|
||||
public AbstractDataResultViewer() {
|
||||
this.em.addPropertyChangeListener(this);
|
||||
}
|
||||
|
||||
//property listener to send nodes to content viewer
|
||||
nodeSelListener = new PropertyChangeListener() {
|
||||
/**
|
||||
* Propagates changes in the current select node from the DataResultViewer
|
||||
* to the DataContentTopComponent
|
||||
* Propagates changes in the current select node from the
|
||||
* DataResultViewer to the DataContentTopComponent
|
||||
*
|
||||
* @param evt
|
||||
*/
|
||||
@ -62,9 +65,9 @@ public abstract class AbstractDataResultViewer extends JPanel implements
|
||||
//|| changed.equals(ExplorerManager.PROP_ROOT_CONTEXT)) {
|
||||
|
||||
// change the cursor to "waiting cursor" for this operation
|
||||
this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
|
||||
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
|
||||
try {
|
||||
Node selectedNode = this.getSelectedNode();
|
||||
Node selectedNode = getSelectedNode();
|
||||
|
||||
// DataContent is designed to return only the default viewer
|
||||
DataContent dataContent = Lookup.getDefault().lookup(DataContent.class);
|
||||
@ -79,7 +82,7 @@ public abstract class AbstractDataResultViewer extends JPanel implements
|
||||
dataContent.setNode(null);
|
||||
}
|
||||
} finally {
|
||||
this.setCursor(null);
|
||||
setCursor(null);
|
||||
}
|
||||
}
|
||||
|
||||
@ -92,10 +95,57 @@ public abstract class AbstractDataResultViewer extends JPanel implements
|
||||
}
|
||||
*/
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Gets the current node selected node
|
||||
* @return
|
||||
*/
|
||||
public abstract Node getSelectedNode();
|
||||
em.addPropertyChangeListener(nodeSelListener);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clearComponent() {
|
||||
em.removePropertyChangeListener(nodeSelListener);
|
||||
|
||||
try {
|
||||
this.em.getRootContext().destroy();
|
||||
em = null;
|
||||
} catch (IOException ex) {
|
||||
// TODO: What's the proper thing to do here? Should it log? Not throw runtime exception?
|
||||
throw new RuntimeException("Error: can't clear the component of the Thumbnail Result Viewer.", ex);
|
||||
}
|
||||
}
|
||||
|
||||
public Node getSelectedNode() {
|
||||
Node result = null;
|
||||
Node[] selectedNodes = this.getExplorerManager().getSelectedNodes();
|
||||
if (selectedNodes.length > 0) {
|
||||
result = selectedNodes[0];
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void expandNode(Node n) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void resetComponent() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Component getComponent() {
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ExplorerManager getExplorerManager() {
|
||||
return this.em;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setSelectedNodes(Node[] selected) {
|
||||
try {
|
||||
this.em.setSelectedNodes(selected);
|
||||
} catch (PropertyVetoException ex) {
|
||||
logger.log(Level.WARNING, "Couldn't set selected nodes.", ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -88,3 +88,10 @@ DataContentViewerHex.goToPageLabel.text=Go to Page:
|
||||
DataContentViewerString.languageLabel.toolTipText=
|
||||
DataContentViewerString.languageLabel.text=Script:
|
||||
DataContentViewerString.languageCombo.toolTipText=Language to attempt when interpreting (extracting and decoding) strings from binary data
|
||||
DataResultViewerThumbnail.pageLabel.text=Page:
|
||||
DataResultViewerThumbnail.curPageLabel.text=-
|
||||
DataResultViewerThumbnail.ofLabel.text=of
|
||||
DataResultViewerThumbnail.totalPagesLabel.text=-
|
||||
DataResultViewerThumbnail.pagesLabel.text=Pages:
|
||||
DataResultViewerThumbnail.pagePrevButton.text=
|
||||
DataResultViewerThumbnail.pageNextButton.text=
|
||||
|
@ -1,4 +1,4 @@
|
||||
<?xml version="1.1" encoding="UTF-8" ?>
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
|
||||
<Form version="1.5" maxVersion="1.7" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
|
||||
<NonVisualComponents>
|
||||
|
@ -50,11 +50,14 @@ import org.sleuthkit.autopsy.corecomponentinterfaces.DataResultViewer;
|
||||
*/
|
||||
@ServiceProvider(service = DataResultViewer.class)
|
||||
public class DataResultViewerTable extends AbstractDataResultViewer {
|
||||
|
||||
private String firstColumnLabel = "Name";
|
||||
private Set<Property> propertiesAcc = new LinkedHashSet<Property>();
|
||||
private static final Logger logger = Logger.getLogger(DataResultViewerTable.class.getName());
|
||||
|
||||
/** Creates new form DataResultViewerTable */
|
||||
/**
|
||||
* Creates new form DataResultViewerTable
|
||||
*/
|
||||
public DataResultViewerTable() {
|
||||
initComponents();
|
||||
|
||||
@ -69,20 +72,23 @@ public class DataResultViewerTable extends AbstractDataResultViewer {
|
||||
|
||||
/**
|
||||
* Expand node
|
||||
*
|
||||
* @param n Node to expand
|
||||
*/
|
||||
@Override
|
||||
public void expandNode(Node n) {
|
||||
super.expandNode(n);
|
||||
|
||||
if (this.tableScrollPanel != null) {
|
||||
OutlineView ov = ((OutlineView) this.tableScrollPanel);
|
||||
ov.expandNode(n);
|
||||
}
|
||||
}
|
||||
|
||||
/** This method is called from within the constructor to
|
||||
* initialize the form.
|
||||
* WARNING: Do NOT modify this code. The content of this method is
|
||||
* always regenerated by the Form Editor.
|
||||
/**
|
||||
* This method is called from within the constructor to initialize the form.
|
||||
* WARNING: Do NOT modify this code. The content of this method is always
|
||||
* regenerated by the Form Editor.
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
|
||||
@ -115,23 +121,9 @@ public class DataResultViewerTable extends AbstractDataResultViewer {
|
||||
private javax.swing.JScrollPane tableScrollPanel;
|
||||
// End of variables declaration//GEN-END:variables
|
||||
|
||||
@Override
|
||||
public ExplorerManager getExplorerManager() {
|
||||
return this.em;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Node getSelectedNode() {
|
||||
Node result = null;
|
||||
Node[] selectedNodes = this.getExplorerManager().getSelectedNodes();
|
||||
if (selectedNodes.length > 0) {
|
||||
result = selectedNodes[0];
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets regular Bean property set properties from first child of Node.
|
||||
*
|
||||
* @param parent Node with at least one child to get properties from
|
||||
* @return Properties,
|
||||
*/
|
||||
@ -152,8 +144,10 @@ public class DataResultViewerTable extends AbstractDataResultViewer {
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets regular Bean property set properties from all first children and, recursively, subchildren of Node.
|
||||
* Note: won't work out the box for lazy load - you need to set all children props for the parent by hand
|
||||
* Gets regular Bean property set properties from all first children and,
|
||||
* recursively, subchildren of Node. Note: won't work out the box for lazy
|
||||
* load - you need to set all children props for the parent by hand
|
||||
*
|
||||
* @param parent Node with at least one child to get properties from
|
||||
* @return Properties,
|
||||
*/
|
||||
@ -172,8 +166,9 @@ public class DataResultViewerTable extends AbstractDataResultViewer {
|
||||
//return ps.getProperties();
|
||||
final Property[] props = ps.getProperties();
|
||||
final int propsNum = props.length;
|
||||
for (int i = 0; i< propsNum; ++i)
|
||||
for (int i = 0; i < propsNum; ++i) {
|
||||
allProperties.add(props[i]);
|
||||
}
|
||||
//}
|
||||
}
|
||||
firstChild = firstChild.getChildren().getNodeAt(0);
|
||||
@ -186,12 +181,14 @@ public class DataResultViewerTable extends AbstractDataResultViewer {
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Gets regular Bean property set properties from all children and, recursively, subchildren of Node.
|
||||
* Note: won't work out the box for lazy load - you need to set all children props for the parent by hand
|
||||
* Gets regular Bean property set properties from all children and,
|
||||
* recursively, subchildren of Node. Note: won't work out the box for lazy
|
||||
* load - you need to set all children props for the parent by hand
|
||||
*
|
||||
* @param parent Node with at least one child to get properties from
|
||||
* @param rows max number of rows to retrieve properties for (can be used for memory optimization)
|
||||
* @param rows max number of rows to retrieve properties for (can be used
|
||||
* for memory optimization)
|
||||
*/
|
||||
private void getAllChildPropertyHeadersRec(Node parent, int rows) {
|
||||
Children children = parent.getChildren();
|
||||
@ -203,8 +200,9 @@ public class DataResultViewerTable extends AbstractDataResultViewer {
|
||||
//return ps.getProperties();
|
||||
final Property[] props = ps.getProperties();
|
||||
final int propsNum = props.length;
|
||||
for (int j = 0; j< propsNum; ++j)
|
||||
for (int j = 0; j < propsNum; ++j) {
|
||||
propertiesAcc.add(props[j]);
|
||||
}
|
||||
//}
|
||||
}
|
||||
getAllChildPropertyHeadersRec(child, rows);
|
||||
@ -216,8 +214,6 @@ public class DataResultViewerTable extends AbstractDataResultViewer {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public void setNode(Node selectedNode) {
|
||||
// change the cursor to "waiting cursor" for this operation
|
||||
@ -342,7 +338,9 @@ public class DataResultViewerTable extends AbstractDataResultViewer {
|
||||
for (int i = 0; i < maxRows; i++) {
|
||||
PropertySet[] props = node.getChildren().getNodeAt(i).getPropertySets();
|
||||
if (props.length == 0) //rare special case
|
||||
{
|
||||
continue;
|
||||
}
|
||||
Property[] property = props[0].getProperties();
|
||||
objs[i] = new Object[property.length];
|
||||
|
||||
@ -370,10 +368,6 @@ public class DataResultViewerTable extends AbstractDataResultViewer {
|
||||
return new DataResultViewerTable();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void resetComponent() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the max width of the column from the given index, header, and table.
|
||||
*
|
||||
@ -411,8 +405,9 @@ public class DataResultViewerTable extends AbstractDataResultViewer {
|
||||
|
||||
// Get maximum width of column data
|
||||
for (int i = 0; i < table.length; i++) {
|
||||
if(index >= table[i].length)
|
||||
if (index >= table[i].length) {
|
||||
continue;
|
||||
}
|
||||
String test = table[i][index].toString();
|
||||
colWidth = Math.max(colWidth, metrics.stringWidth(test));
|
||||
}
|
||||
@ -429,30 +424,13 @@ public class DataResultViewerTable extends AbstractDataResultViewer {
|
||||
|
||||
@Override
|
||||
public void clearComponent() {
|
||||
em.removePropertyChangeListener(this);
|
||||
this.tableScrollPanel.removeAll();
|
||||
this.tableScrollPanel = null;
|
||||
try {
|
||||
this.em.getRootContext().destroy();
|
||||
em = null;
|
||||
} catch (IOException ex) {
|
||||
// TODO: Proper thing to do? Log? Don't throw RuntimeException?
|
||||
throw new RuntimeException("Error: can't clear the component of the Table Result Viewer.", ex);
|
||||
}
|
||||
|
||||
//this destroys em
|
||||
super.clearComponent();
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public Component getComponent() {
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setSelectedNodes(Node[] selected) {
|
||||
try{
|
||||
this.em.setSelectedNodes(selected);
|
||||
} catch (PropertyVetoException ex) {
|
||||
Logger.getLogger(DataResultViewerTable.class.getName())
|
||||
.log(Level.WARNING, "Couldn't set selected nodes.", ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -16,22 +16,155 @@
|
||||
<Layout>
|
||||
<DimensionLayout dim="0">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Component id="thumbnailScrollPanel" alignment="1" pref="675" max="32767" attributes="0"/>
|
||||
<Component id="thumbnailScrollPanel" pref="675" max="32767" attributes="0"/>
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="pageLabel" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||
<Component id="curPageLabel" min="-2" pref="20" max="-2" attributes="0"/>
|
||||
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||
<Component id="ofLabel" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||
<Component id="totalPagesLabel" min="-2" pref="20" max="-2" attributes="0"/>
|
||||
<EmptySpace min="-2" pref="61" max="-2" attributes="0"/>
|
||||
<Component id="pagesLabel" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||
<Component id="pagePrevButton" min="-2" pref="23" max="-2" attributes="0"/>
|
||||
<EmptySpace min="0" pref="0" max="-2" attributes="0"/>
|
||||
<Component id="pageNextButton" min="-2" pref="23" max="-2" attributes="0"/>
|
||||
<EmptySpace max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
<DimensionLayout dim="1">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Component id="thumbnailScrollPanel" alignment="1" pref="336" max="32767" attributes="0"/>
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="103" groupAlignment="3" attributes="0">
|
||||
<Component id="pageLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="curPageLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="ofLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="totalPagesLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="pagesLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="pagePrevButton" alignment="3" min="-2" pref="23" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<Component id="pageNextButton" min="-2" pref="23" max="-2" attributes="0"/>
|
||||
<EmptySpace min="0" pref="0" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
<Component id="thumbnailScrollPanel" min="-2" pref="325" max="-2" attributes="0"/>
|
||||
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
</Layout>
|
||||
<SubComponents>
|
||||
<Container class="javax.swing.JScrollPane" name="thumbnailScrollPanel">
|
||||
<Properties>
|
||||
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="null"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
<AuxValues>
|
||||
<AuxValue name="JavaCodeGenerator_CreateCodeCustom" type="java.lang.String" value="new IconView();"/>
|
||||
</AuxValues>
|
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
|
||||
</Container>
|
||||
<Component class="javax.swing.JLabel" name="pageLabel">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/corecomponents/Bundle.properties" key="DataResultViewerThumbnail.pageLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="curPageLabel">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/corecomponents/Bundle.properties" key="DataResultViewerThumbnail.curPageLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="ofLabel">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/corecomponents/Bundle.properties" key="DataResultViewerThumbnail.ofLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="totalPagesLabel">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/corecomponents/Bundle.properties" key="DataResultViewerThumbnail.totalPagesLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="pagesLabel">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/corecomponents/Bundle.properties" key="DataResultViewerThumbnail.pagesLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="pagePrevButton">
|
||||
<Properties>
|
||||
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
|
||||
<Image iconType="3" name="/org/sleuthkit/autopsy/corecomponents/btn_step_back.png"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/corecomponents/Bundle.properties" key="DataResultViewerThumbnail.pagePrevButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
<Property name="disabledIcon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
|
||||
<Image iconType="3" name="/org/sleuthkit/autopsy/corecomponents/btn_step_back_disabled.png"/>
|
||||
</Property>
|
||||
<Property name="margin" type="java.awt.Insets" editor="org.netbeans.beaninfo.editors.InsetsEditor">
|
||||
<Insets value="[2, 0, 2, 0]"/>
|
||||
</Property>
|
||||
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[27, 31]"/>
|
||||
</Property>
|
||||
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[27, 31]"/>
|
||||
</Property>
|
||||
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[55, 23]"/>
|
||||
</Property>
|
||||
<Property name="rolloverIcon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
|
||||
<Image iconType="3" name="/org/sleuthkit/autopsy/corecomponents/btn_step_back_hover.png"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="pagePrevButtonActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="pageNextButton">
|
||||
<Properties>
|
||||
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
|
||||
<Image iconType="3" name="/org/sleuthkit/autopsy/corecomponents/btn_step_forward.png"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/corecomponents/Bundle.properties" key="DataResultViewerThumbnail.pageNextButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
<Property name="disabledIcon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
|
||||
<Image iconType="3" name="/org/sleuthkit/autopsy/corecomponents/btn_step_forward_disabled.png"/>
|
||||
</Property>
|
||||
<Property name="margin" type="java.awt.Insets" editor="org.netbeans.beaninfo.editors.InsetsEditor">
|
||||
<Insets value="[2, 0, 2, 0]"/>
|
||||
</Property>
|
||||
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[27, 23]"/>
|
||||
</Property>
|
||||
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[27, 23]"/>
|
||||
</Property>
|
||||
<Property name="rolloverIcon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
|
||||
<Image iconType="3" name="/org/sleuthkit/autopsy/corecomponents/btn_step_forward_hover.png"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="pageNextButtonActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
</SubComponents>
|
||||
</Form>
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2011 Basis Technology Corp.
|
||||
* Copyright 2012 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@ -19,96 +19,177 @@
|
||||
package org.sleuthkit.autopsy.corecomponents;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.Component;
|
||||
import java.awt.Cursor;
|
||||
import java.awt.EventQueue;
|
||||
import java.awt.Graphics;
|
||||
import java.beans.PropertyVetoException;
|
||||
import java.io.IOException;
|
||||
import java.util.logging.Level;
|
||||
import java.beans.PropertyChangeEvent;
|
||||
import java.beans.PropertyChangeListener;
|
||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||
import javax.swing.ListSelectionModel;
|
||||
import javax.swing.SwingWorker;
|
||||
import org.netbeans.api.progress.ProgressHandle;
|
||||
import org.netbeans.api.progress.ProgressHandleFactory;
|
||||
import org.openide.explorer.ExplorerManager;
|
||||
import org.openide.explorer.view.IconView;
|
||||
import org.openide.nodes.AbstractNode;
|
||||
import org.openide.nodes.Children;
|
||||
import org.openide.nodes.Node;
|
||||
import org.openide.nodes.NodeEvent;
|
||||
import org.openide.nodes.NodeListener;
|
||||
import org.openide.nodes.NodeMemberEvent;
|
||||
import org.openide.nodes.NodeReorderEvent;
|
||||
import org.openide.util.lookup.ServiceProvider;
|
||||
import org.sleuthkit.autopsy.corecomponentinterfaces.DataResultViewer;
|
||||
|
||||
/**
|
||||
* Thumbnail view of images in data result
|
||||
* Thumbnail view of images in data result with paging support.
|
||||
*
|
||||
* Paging is added to reduce memory footprint and load only up to (currently)
|
||||
* 1000 images at a time. This works whether or not the underlying content nodes
|
||||
* are being lazy loaded or not.
|
||||
*
|
||||
*/
|
||||
@ServiceProvider(service = DataResultViewer.class)
|
||||
public class DataResultViewerThumbnail extends AbstractDataResultViewer {
|
||||
public final class DataResultViewerThumbnail extends AbstractDataResultViewer {
|
||||
|
||||
private transient ExplorerManager em = new ExplorerManager();
|
||||
private static final Logger logger = Logger.getLogger(DataResultViewerThumbnail.class.getName());
|
||||
//flag to keep track if images are being loaded
|
||||
private int curPage;
|
||||
private int totalPages;
|
||||
private final PageUpdater pageUpdater = new PageUpdater();
|
||||
|
||||
/** Creates new form DataResultViewerThumbnail */
|
||||
/**
|
||||
* Creates new form DataResultViewerThumbnail
|
||||
*/
|
||||
public DataResultViewerThumbnail() {
|
||||
super();
|
||||
|
||||
initComponents();
|
||||
|
||||
// only allow one item to be selected at a time
|
||||
((IconView) thumbnailScrollPanel).setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
|
||||
|
||||
|
||||
curPage = -1;
|
||||
totalPages = 0;
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void paint(Graphics g) {
|
||||
super.paint(g);
|
||||
//logger.log(Level.INFO, "PAINT()");
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/** This method is called from within the constructor to
|
||||
* initialize the form.
|
||||
* WARNING: Do NOT modify this code. The content of this method is
|
||||
* always regenerated by the Form Editor.
|
||||
/**
|
||||
* This method is called from within the constructor to initialize the form.
|
||||
* WARNING: Do NOT modify this code. The content of this method is always
|
||||
* regenerated by the Form Editor.
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
|
||||
private void initComponents() {
|
||||
|
||||
thumbnailScrollPanel = new IconView();
|
||||
pageLabel = new javax.swing.JLabel();
|
||||
curPageLabel = new javax.swing.JLabel();
|
||||
ofLabel = new javax.swing.JLabel();
|
||||
totalPagesLabel = new javax.swing.JLabel();
|
||||
pagesLabel = new javax.swing.JLabel();
|
||||
pagePrevButton = new javax.swing.JButton();
|
||||
pageNextButton = new javax.swing.JButton();
|
||||
|
||||
thumbnailScrollPanel.setPreferredSize(null);
|
||||
|
||||
pageLabel.setText(org.openide.util.NbBundle.getMessage(DataResultViewerThumbnail.class, "DataResultViewerThumbnail.pageLabel.text")); // NOI18N
|
||||
|
||||
curPageLabel.setText(org.openide.util.NbBundle.getMessage(DataResultViewerThumbnail.class, "DataResultViewerThumbnail.curPageLabel.text")); // NOI18N
|
||||
|
||||
ofLabel.setText(org.openide.util.NbBundle.getMessage(DataResultViewerThumbnail.class, "DataResultViewerThumbnail.ofLabel.text")); // NOI18N
|
||||
|
||||
totalPagesLabel.setText(org.openide.util.NbBundle.getMessage(DataResultViewerThumbnail.class, "DataResultViewerThumbnail.totalPagesLabel.text")); // NOI18N
|
||||
|
||||
pagesLabel.setText(org.openide.util.NbBundle.getMessage(DataResultViewerThumbnail.class, "DataResultViewerThumbnail.pagesLabel.text")); // NOI18N
|
||||
|
||||
pagePrevButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/corecomponents/btn_step_back.png"))); // NOI18N
|
||||
pagePrevButton.setText(org.openide.util.NbBundle.getMessage(DataResultViewerThumbnail.class, "DataResultViewerThumbnail.pagePrevButton.text")); // NOI18N
|
||||
pagePrevButton.setDisabledIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/corecomponents/btn_step_back_disabled.png"))); // NOI18N
|
||||
pagePrevButton.setMargin(new java.awt.Insets(2, 0, 2, 0));
|
||||
pagePrevButton.setMaximumSize(new java.awt.Dimension(27, 31));
|
||||
pagePrevButton.setMinimumSize(new java.awt.Dimension(27, 31));
|
||||
pagePrevButton.setPreferredSize(new java.awt.Dimension(55, 23));
|
||||
pagePrevButton.setRolloverIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/corecomponents/btn_step_back_hover.png"))); // NOI18N
|
||||
pagePrevButton.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
pagePrevButtonActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
|
||||
pageNextButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/corecomponents/btn_step_forward.png"))); // NOI18N
|
||||
pageNextButton.setText(org.openide.util.NbBundle.getMessage(DataResultViewerThumbnail.class, "DataResultViewerThumbnail.pageNextButton.text")); // NOI18N
|
||||
pageNextButton.setDisabledIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/corecomponents/btn_step_forward_disabled.png"))); // NOI18N
|
||||
pageNextButton.setMargin(new java.awt.Insets(2, 0, 2, 0));
|
||||
pageNextButton.setMaximumSize(new java.awt.Dimension(27, 23));
|
||||
pageNextButton.setMinimumSize(new java.awt.Dimension(27, 23));
|
||||
pageNextButton.setRolloverIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/corecomponents/btn_step_forward_hover.png"))); // NOI18N
|
||||
pageNextButton.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
pageNextButtonActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
|
||||
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
|
||||
this.setLayout(layout);
|
||||
layout.setHorizontalGroup(
|
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(thumbnailScrollPanel, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 675, Short.MAX_VALUE)
|
||||
.addComponent(thumbnailScrollPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 675, Short.MAX_VALUE)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addComponent(pageLabel)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||
.addComponent(curPageLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||
.addComponent(ofLabel)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||
.addComponent(totalPagesLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.addGap(61, 61, 61)
|
||||
.addComponent(pagesLabel)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||
.addComponent(pagePrevButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.addGap(0, 0, 0)
|
||||
.addComponent(pageNextButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.addContainerGap())
|
||||
);
|
||||
layout.setVerticalGroup(
|
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(thumbnailScrollPanel, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 336, Short.MAX_VALUE)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||
.addComponent(pageLabel)
|
||||
.addComponent(curPageLabel)
|
||||
.addComponent(ofLabel)
|
||||
.addComponent(totalPagesLabel)
|
||||
.addComponent(pagesLabel)
|
||||
.addComponent(pagePrevButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addComponent(pageNextButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.addGap(0, 0, 0)))
|
||||
.addComponent(thumbnailScrollPanel, javax.swing.GroupLayout.PREFERRED_SIZE, 325, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.addGap(0, 0, Short.MAX_VALUE))
|
||||
);
|
||||
}// </editor-fold>//GEN-END:initComponents
|
||||
|
||||
private void pagePrevButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_pagePrevButtonActionPerformed
|
||||
previousPage();
|
||||
}//GEN-LAST:event_pagePrevButtonActionPerformed
|
||||
|
||||
private void pageNextButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_pageNextButtonActionPerformed
|
||||
nextPage();
|
||||
}//GEN-LAST:event_pageNextButtonActionPerformed
|
||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||
private javax.swing.JLabel curPageLabel;
|
||||
private javax.swing.JLabel ofLabel;
|
||||
private javax.swing.JLabel pageLabel;
|
||||
private javax.swing.JButton pageNextButton;
|
||||
private javax.swing.JButton pagePrevButton;
|
||||
private javax.swing.JLabel pagesLabel;
|
||||
private javax.swing.JScrollPane thumbnailScrollPanel;
|
||||
private javax.swing.JLabel totalPagesLabel;
|
||||
// End of variables declaration//GEN-END:variables
|
||||
|
||||
@Override
|
||||
public ExplorerManager getExplorerManager() {
|
||||
return this.em;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Node getSelectedNode() {
|
||||
Node result = null;
|
||||
|
||||
Node[] selectedNodes = this.getExplorerManager().getSelectedNodes();
|
||||
if (selectedNodes.length > 0) {
|
||||
result = selectedNodes[0];
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSupported(Node selectedNode) {
|
||||
if (selectedNode == null) {
|
||||
@ -124,24 +205,19 @@ public class DataResultViewerThumbnail extends AbstractDataResultViewer {
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Expand node
|
||||
* @param n Node to expand
|
||||
*/
|
||||
@Override
|
||||
public void expandNode(Node n) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setNode(Node givenNode) {
|
||||
// change the cursor to "waiting cursor" for this operation
|
||||
this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
|
||||
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
|
||||
try {
|
||||
if (givenNode != null) {
|
||||
Node root = new AbstractNode(new ThumbnailViewChildren(givenNode));
|
||||
ThumbnailViewChildren childNode = new ThumbnailViewChildren(givenNode);
|
||||
|
||||
final Node root = new AbstractNode(childNode);
|
||||
pageUpdater.setRoot(root);
|
||||
root.addNodeListener(pageUpdater);
|
||||
em.setRootContext(root);
|
||||
} else {
|
||||
Node emptyNode = new AbstractNode(Children.LEAF);
|
||||
@ -165,36 +241,135 @@ public class DataResultViewerThumbnail extends AbstractDataResultViewer {
|
||||
return new DataResultViewerThumbnail();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void resetComponent() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clearComponent() {
|
||||
em.removePropertyChangeListener(this);
|
||||
this.thumbnailScrollPanel.removeAll();
|
||||
this.thumbnailScrollPanel = null;
|
||||
try {
|
||||
this.em.getRootContext().destroy();
|
||||
em = null;
|
||||
} catch (IOException ex) {
|
||||
// TODO: What's the proper thing to do here? Should it log? Not throw runtime exception?
|
||||
throw new RuntimeException("Error: can't clear the component of the Thumbnail Result Viewer.", ex);
|
||||
|
||||
//this destroyes em
|
||||
super.clearComponent();
|
||||
}
|
||||
|
||||
private void nextPage() {
|
||||
if (curPage < totalPages) {
|
||||
curPage++;
|
||||
|
||||
switchPage();
|
||||
}
|
||||
}
|
||||
|
||||
private void previousPage() {
|
||||
if (curPage > 1) {
|
||||
curPage--;
|
||||
|
||||
switchPage();
|
||||
}
|
||||
}
|
||||
|
||||
private void switchPage() {
|
||||
|
||||
EventQueue.invokeLater(new Runnable() {
|
||||
@Override
|
||||
public Component getComponent() {
|
||||
return this;
|
||||
public void run() {
|
||||
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
|
||||
}
|
||||
});
|
||||
|
||||
//Note the nodes factories are likely creating nodes in EDT anyway, but worker still helps
|
||||
new SwingWorker<Object, Void>() {
|
||||
private ProgressHandle progress;
|
||||
|
||||
@Override
|
||||
protected Object doInBackground() throws Exception {
|
||||
pagePrevButton.setEnabled(false);
|
||||
pageNextButton.setEnabled(false);
|
||||
progress = ProgressHandleFactory.createHandle("Generating Thumbnails...");
|
||||
progress.start();
|
||||
progress.switchToIndeterminate();
|
||||
Node root = em.getRootContext();
|
||||
Node pageNode = root.getChildren().getNodeAt(curPage - 1);
|
||||
em.setExploredContext(pageNode);
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setSelectedNodes(Node[] selected) {
|
||||
try{
|
||||
this.em.setSelectedNodes(selected);
|
||||
} catch (PropertyVetoException ex) {
|
||||
Logger.getLogger(DataResultViewerThumbnail.class.getName())
|
||||
.log(Level.WARNING, "Couldn't set selected nodes.", ex);
|
||||
protected void done() {
|
||||
progress.finish();
|
||||
setCursor(null);
|
||||
updateControls();
|
||||
|
||||
}
|
||||
}.execute();
|
||||
|
||||
}
|
||||
|
||||
private void updateControls() {
|
||||
if (totalPages == 0) {
|
||||
pagePrevButton.setEnabled(false);
|
||||
pageNextButton.setEnabled(false);
|
||||
curPageLabel.setText("");
|
||||
totalPagesLabel.setText("");
|
||||
} else {
|
||||
curPageLabel.setText(Integer.toString(curPage));
|
||||
totalPagesLabel.setText(Integer.toString(totalPages));
|
||||
|
||||
|
||||
pageNextButton.setEnabled(!(curPage == totalPages));
|
||||
pagePrevButton.setEnabled(!(curPage == 1));
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Listens for root change updates and updates the paging controls
|
||||
*/
|
||||
private class PageUpdater implements NodeListener {
|
||||
|
||||
private Node root;
|
||||
|
||||
void setRoot(Node root) {
|
||||
this.root = root;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void propertyChange(PropertyChangeEvent evt) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenAdded(NodeMemberEvent nme) {
|
||||
totalPages = root.getChildren().getNodesCount();
|
||||
|
||||
if (curPage == -1 || curPage > totalPages) {
|
||||
curPage = 1;
|
||||
}
|
||||
|
||||
updateControls();
|
||||
|
||||
|
||||
//force load the curPage node
|
||||
final Node pageNode = root.getChildren().getNodeAt(curPage - 1);
|
||||
|
||||
//em.setSelectedNodes(new Node[]{pageNode});
|
||||
if (pageNode != null) {
|
||||
em.setExploredContext(pageNode);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenRemoved(NodeMemberEvent nme) {
|
||||
totalPages = 0;
|
||||
curPage = -1;
|
||||
updateControls();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenReordered(NodeReorderEvent nre) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void nodeDestroyed(NodeEvent ne) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -54,6 +54,7 @@ class ThumbnailViewChildren extends Children.Keys<Integer> {
|
||||
private Node parent;
|
||||
private final HashMap<Integer, List<Node>> pages = new HashMap<Integer, List<Node>>();
|
||||
private int totalImages = 0;
|
||||
private int totalPages = 0;
|
||||
private static final Logger logger = Logger.getLogger(ThumbnailViewChildren.class.getName());
|
||||
|
||||
/**
|
||||
@ -77,6 +78,15 @@ class ThumbnailViewChildren extends Children.Keys<Integer> {
|
||||
setupKeys();
|
||||
}
|
||||
|
||||
int getTotalPages() {
|
||||
return totalPages;
|
||||
}
|
||||
|
||||
int getTotalImages() {
|
||||
return totalImages;
|
||||
}
|
||||
|
||||
|
||||
private void setupKeys() {
|
||||
//divide the supported content into buckets
|
||||
totalImages = 0;
|
||||
@ -97,10 +107,15 @@ class ThumbnailViewChildren extends Children.Keys<Integer> {
|
||||
return;
|
||||
}
|
||||
|
||||
int totalPages = totalImages / IMAGES_PER_PAGE;
|
||||
totalPages = 0;
|
||||
if (totalImages < IMAGES_PER_PAGE) {
|
||||
totalPages = 1;
|
||||
} else {
|
||||
totalPages = totalImages / IMAGES_PER_PAGE;
|
||||
if (totalPages % totalImages != 0) {
|
||||
++totalPages;
|
||||
}
|
||||
}
|
||||
|
||||
int prevImages = 0;
|
||||
for (int page = 1; page <= totalPages; ++page) {
|
||||
@ -169,7 +184,8 @@ class ThumbnailViewChildren extends Children.Keys<Integer> {
|
||||
}
|
||||
|
||||
/**
|
||||
* Node representing page node, a parent of image nodes, with a name showing children range
|
||||
* Node representing page node, a parent of image nodes, with a name showing
|
||||
* children range
|
||||
*/
|
||||
private class ThumbnailPageNode extends AbstractNode {
|
||||
|
||||
@ -184,9 +200,6 @@ class ThumbnailViewChildren extends Children.Keys<Integer> {
|
||||
this.setIconBaseWithExtension("org/sleuthkit/autopsy/images/Folder-icon.png");
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
//TODO insert node at beginning pressing which goes back to page view
|
||||
@ -201,7 +214,6 @@ class ThumbnailViewChildren extends Children.Keys<Integer> {
|
||||
this.contentImages = contentImages;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void addNotify() {
|
||||
super.addNotify();
|
||||
@ -216,9 +228,6 @@ class ThumbnailViewChildren extends Children.Keys<Integer> {
|
||||
setKeys(new ArrayList<Node>());
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
protected Node[] createNodes(Node wrapped) {
|
||||
if (wrapped != null) {
|
||||
@ -228,8 +237,5 @@ class ThumbnailViewChildren extends Children.Keys<Integer> {
|
||||
return new Node[]{};
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
8
NEWS.txt
8
NEWS.txt
@ -1,14 +1,18 @@
|
||||
---------------- VERSION Current (development) --------------
|
||||
|
||||
New features:
|
||||
- Build scripts enhancements to include module version tracking.
|
||||
|
||||
|
||||
Improvements:
|
||||
- Removed limit on number of results displayed.
|
||||
- Thumbnail viewer - added paging and removed limit of images.
|
||||
- Slight improvements in UI responsiveness for large number of results.
|
||||
- Build scripts enhancements to include module version tracking.
|
||||
- Netbeans RCP upgrade from 7.2 to 7.2.1
|
||||
- Enable user to select any file when opening image.
|
||||
|
||||
Bugfixes:
|
||||
- UI fix for keyword search box.
|
||||
- UI fix for keyword search box when case is changed.
|
||||
|
||||
|
||||
---------------- VERSION 3.0.0 --------------
|
||||
|
Loading…
x
Reference in New Issue
Block a user