diff --git a/Core/src/org/sleuthkit/autopsy/report/ReportVisualPanel1.form b/Core/src/org/sleuthkit/autopsy/report/ReportVisualPanel1.form index 2c34a5b380..3ada6ba5e7 100644 --- a/Core/src/org/sleuthkit/autopsy/report/ReportVisualPanel1.form +++ b/Core/src/org/sleuthkit/autopsy/report/ReportVisualPanel1.form @@ -24,10 +24,10 @@ - - + + - + @@ -43,12 +43,12 @@ - + @@ -56,30 +56,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -101,12 +77,12 @@ - + - + @@ -135,5 +111,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Core/src/org/sleuthkit/autopsy/report/ReportVisualPanel1.java b/Core/src/org/sleuthkit/autopsy/report/ReportVisualPanel1.java index d3c52f68f0..972bb3eb0e 100644 --- a/Core/src/org/sleuthkit/autopsy/report/ReportVisualPanel1.java +++ b/Core/src/org/sleuthkit/autopsy/report/ReportVisualPanel1.java @@ -19,89 +19,72 @@ package org.sleuthkit.autopsy.report; import java.awt.BorderLayout; +import java.awt.Component; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import java.util.Map.Entry; +import javax.swing.JList; import javax.swing.JPanel; +import javax.swing.JRadioButton; +import javax.swing.ListCellRenderer; import javax.swing.ListSelectionModel; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; -import javax.swing.table.AbstractTableModel; -import javax.swing.table.TableColumn; import org.openide.util.Lookup; import org.sleuthkit.autopsy.coreutils.Logger; -public final class ReportVisualPanel1 extends JPanel { +public final class ReportVisualPanel1 extends JPanel implements ListSelectionListener { private static final Logger logger = Logger.getLogger(ReportVisualPanel1.class.getName()); private ReportWizardPanel1 wizPanel; - - private Map generalModuleStates = new LinkedHashMap(); - private Map fileListModuleStates = new LinkedHashMap(); private List modules = new ArrayList<>(); - private Map moduleStates; - - private ModulesTableModel modulesModel; - private ModuleSelectionListener modulesListener; + private List generalModules = new ArrayList<>(); + private List tableModules = new ArrayList<>(); + private List fileModules = new ArrayList<>(); + private Integer selectedIndex; /** * Creates new form ReportVisualPanel1 */ public ReportVisualPanel1(ReportWizardPanel1 wizPanel) { - moduleStates = new LinkedHashMap<>(); - initComponents(); - initModules(); this.wizPanel = wizPanel; + initComponents(); configurationPanel.setLayout(new BorderLayout()); descriptionTextPane.setEditable(false); - modulesTable.setRowSelectionInterval(0, 0); + initModules(); } // Initialize the list of ReportModules private void initModules() { - for (ReportModule module : Lookup.getDefault().lookupAll(TableReportModule.class)) { - if (module.getName().equals("Results - HTML")) { - moduleStates.put(module, Boolean.TRUE); - } else { - moduleStates.put(module, Boolean.FALSE); - } - } - for (ReportModule module : Lookup.getDefault().lookupAll(GeneralReportModule.class)) { - moduleStates.put(module, Boolean.FALSE); - } - for (ReportModule module : Lookup.getDefault().lookupAll(FileReportModule.class)) { - moduleStates.put(module, Boolean.FALSE); + for (TableReportModule module : Lookup.getDefault().lookupAll(TableReportModule.class)) { + tableModules.add(module); + modules.add(module); + } + + for (GeneralReportModule module : Lookup.getDefault().lookupAll(GeneralReportModule.class)) { + generalModules.add(module); + modules.add(module); + } + + for (FileReportModule module : Lookup.getDefault().lookupAll(FileReportModule.class)) { + fileModules.add(module); + modules.add(module); } - modules.addAll(moduleStates.keySet()); Collections.sort(modules, new Comparator() { @Override public int compare(ReportModule rm1, ReportModule rm2) { return rm1.getName().compareTo(rm2.getName()); } - }); - modulesModel = new ModulesTableModel(); - modulesListener = new ModuleSelectionListener(); - modulesTable.setModel(modulesModel); - modulesTable.getSelectionModel().addListSelectionListener(modulesListener); - modulesTable.setTableHeader(null); - modulesTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - modulesTable.setRowHeight(modulesTable.getRowHeight() + 5); - - int width = modulesScrollPane.getPreferredSize().width; - for (int i = 0; i < modulesTable.getColumnCount(); i++) { - TableColumn column = modulesTable.getColumnModel().getColumn(i); - if (i == 0) { - column.setPreferredWidth(((int) (width * 0.15))); - } else { - column.setPreferredWidth(((int) (width * 0.84))); - } - } + modulesJList.getSelectionModel().addListSelectionListener(this); + modulesJList.setCellRenderer(new ModuleCellRenderer()); + modulesJList.setListData(modules.toArray()); + selectedIndex = 0; + modulesJList.setSelectedIndex(selectedIndex); } @Override @@ -109,43 +92,50 @@ public final class ReportVisualPanel1 extends JPanel { return "Select and Configure Report Modules"; } + public ReportModule getSelectedModule() { + return modules.get(selectedIndex); + } + /** - * @return the enabled/disabled states of all TableReportModules + * Get the Selection status of the TableModules. + * + * @return */ Map getTableModuleStates() { - Map tableModuleStates = new LinkedHashMap<>(); - for (Entry module : moduleStates.entrySet()) { - if (module.getKey() instanceof TableReportModule) { - tableModuleStates.put((TableReportModule) module.getKey(), module.getValue()); - } + Map reportModuleStates = new LinkedHashMap<>(); + ReportModule mod = getSelectedModule(); + if (tableModules.contains(mod)) { + reportModuleStates.put((TableReportModule) mod, Boolean.TRUE); } - return tableModuleStates; + return reportModuleStates; } /** - * @return the enabled/disabled states of all GeneralReportModules + * Get the selection status of the GeneralReportModules. + * + * @return */ Map getGeneralModuleStates() { - Map generalModuleStates = new LinkedHashMap<>(); - for (Entry module : moduleStates.entrySet()) { - if (module.getKey() instanceof GeneralReportModule) { - generalModuleStates.put((GeneralReportModule) module.getKey(), module.getValue()); - } + Map reportModuleStates = new LinkedHashMap<>(); + ReportModule mod = getSelectedModule(); + if (generalModules.contains(mod)) { + reportModuleStates.put((GeneralReportModule) mod, Boolean.TRUE); } - return generalModuleStates; + return reportModuleStates; } /** - * @return the enabled/disabled states of all FileListReportModules + * Get the selection status of the FileReportModules. + * + * @return */ - Map getFileListModuleStates() { - Map fileModuleStates = new LinkedHashMap<>(); - for (Entry module : moduleStates.entrySet()) { - if (module.getKey() instanceof FileReportModule) { - fileModuleStates.put((FileReportModule) module.getKey(), module.getValue()); - } + Map getFileModuleStates() { + Map reportModuleStates = new LinkedHashMap<>(); + ReportModule mod = getSelectedModule(); + if (fileModules.contains(mod)) { + reportModuleStates.put((FileReportModule) mod, Boolean.TRUE); } - return fileModuleStates; + return reportModuleStates; } /** @@ -156,28 +146,15 @@ public final class ReportVisualPanel1 extends JPanel { // //GEN-BEGIN:initComponents private void initComponents() { - modulesScrollPane = new javax.swing.JScrollPane(); - modulesTable = new javax.swing.JTable(); reportModulesLabel = new javax.swing.JLabel(); configurationPanel = new javax.swing.JPanel(); descriptionScrollPane = new javax.swing.JScrollPane(); descriptionTextPane = new javax.swing.JTextPane(); + modulesScrollPane = new javax.swing.JScrollPane(); + modulesJList = new javax.swing.JList(); setPreferredSize(new java.awt.Dimension(650, 250)); - modulesTable.setBackground(new java.awt.Color(240, 240, 240)); - modulesTable.setModel(new javax.swing.table.DefaultTableModel( - new Object [][] { - - }, - new String [] { - - } - )); - modulesTable.setShowHorizontalLines(false); - modulesTable.setShowVerticalLines(false); - modulesScrollPane.setViewportView(modulesTable); - org.openide.awt.Mnemonics.setLocalizedText(reportModulesLabel, org.openide.util.NbBundle.getMessage(ReportVisualPanel1.class, "ReportVisualPanel1.reportModulesLabel.text")); // NOI18N configurationPanel.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(125, 125, 125))); @@ -190,7 +167,7 @@ public final class ReportVisualPanel1 extends JPanel { ); configurationPanelLayout.setVerticalGroup( configurationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 0, Short.MAX_VALUE) + .addGap(0, 168, Short.MAX_VALUE) ); descriptionScrollPane.setBorder(null); @@ -199,6 +176,14 @@ public final class ReportVisualPanel1 extends JPanel { descriptionTextPane.setBorder(null); descriptionScrollPane.setViewportView(descriptionTextPane); + modulesJList.setBackground(new java.awt.Color(240, 240, 240)); + modulesJList.setModel(new javax.swing.AbstractListModel() { + String[] strings = { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" }; + public int getSize() { return strings.length; } + public Object getElementAt(int i) { return strings[i]; } + }); + modulesScrollPane.setViewportView(modulesJList); + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( @@ -207,8 +192,8 @@ public final class ReportVisualPanel1 extends JPanel { .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(reportModulesLabel) - .addComponent(modulesScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 186, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addGap(10, 10, 10) + .addComponent(modulesScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 190, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(configurationPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(descriptionScrollPane)) @@ -221,11 +206,11 @@ public final class ReportVisualPanel1 extends JPanel { .addComponent(reportModulesLabel) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(modulesScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 208, Short.MAX_VALUE) .addGroup(layout.createSequentialGroup() .addComponent(configurationPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(descriptionScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 32, javax.swing.GroupLayout.PREFERRED_SIZE))) + .addComponent(descriptionScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 32, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(modulesScrollPane)) .addContainerGap()) ); }// //GEN-END:initComponents @@ -233,99 +218,47 @@ public final class ReportVisualPanel1 extends JPanel { private javax.swing.JPanel configurationPanel; private javax.swing.JScrollPane descriptionScrollPane; private javax.swing.JTextPane descriptionTextPane; + private javax.swing.JList modulesJList; private javax.swing.JScrollPane modulesScrollPane; - private javax.swing.JTable modulesTable; private javax.swing.JLabel reportModulesLabel; // End of variables declaration//GEN-END:variables + + @Override + public void valueChanged(ListSelectionEvent e) { + if (e.getValueIsAdjusting()) { + return; + } + configurationPanel.removeAll(); + ListSelectionModel m = (ListSelectionModel) e.getSource(); + // single selection, so max selection index is the only one selected. + selectedIndex = m.getMaxSelectionIndex(); - private class ModulesTableModel extends AbstractTableModel { - - @Override - public int getRowCount() { - return moduleStates.size(); + JPanel panel = new DefaultReportConfigurationPanel(); + ReportModule module = modules.get(selectedIndex); + boolean generalModuleSelected = false; + if (module instanceof GeneralReportModule) { + JPanel generalPanel = ((GeneralReportModule) module).getConfigurationPanel(); + panel = (generalPanel == null) ? new JPanel() : panel; + generalModuleSelected = true; } - @Override - public int getColumnCount() { - return 2; - } + descriptionTextPane.setText(module.getDescription()); + configurationPanel.add(panel, BorderLayout.CENTER); + configurationPanel.revalidate(); - @Override - public Object getValueAt(int rowIndex, int columnIndex) { - if (rowIndex >= moduleStates.size()) { - return ""; - } - if (columnIndex == 0) { - // selection status - return moduleStates.get(modules.get(rowIndex)); - } else { - // module name - return modules.get(rowIndex).getName(); - } - } - - @Override - public boolean isCellEditable(int rowIndex, int columnIndex) { - return columnIndex == 0; - } - - @Override - public void setValueAt(Object aValue, int rowIndex, int columnIndex) { - if (columnIndex == 0) { - moduleStates.put(modules.get(rowIndex), (Boolean) aValue); - } - - // Check if there are any TableReportModules enabled - boolean moduleEnabled = false; - boolean moreConfig = false; - for (Entry module : moduleStates.entrySet()) { - if (module.getValue()) { - if (module.getKey() instanceof TableReportModule - || module.getKey() instanceof FileReportModule) { - moreConfig = true; - } - moduleEnabled = true; - } - } - - if(moreConfig) { - wizPanel.setNext(true); - wizPanel.setFinish(false); - } else if (moduleEnabled) { - wizPanel.setFinish(true); - wizPanel.setNext(false); - } else { - wizPanel.setFinish(false); - wizPanel.setNext(false); - } - } - - @Override - public Class getColumnClass(int c) { - return getValueAt(0, c).getClass(); - } + wizPanel.setNext(!generalModuleSelected); + wizPanel.setFinish(generalModuleSelected); } - - private class ModuleSelectionListener implements ListSelectionListener { + + private class ModuleCellRenderer extends JRadioButton implements ListCellRenderer { @Override - public void valueChanged(ListSelectionEvent e) { - configurationPanel.removeAll(); - int rowIndex = modulesTable.getSelectedRow(); - - JPanel panel = new DefaultReportConfigurationPanel(); - ReportModule module = modules.get(rowIndex); - if (module instanceof GeneralReportModule) { - JPanel generalPanel = ((GeneralReportModule) module).getConfigurationPanel(); - panel = (generalPanel == null) ? panel : generalPanel; - } - - descriptionTextPane.setText(module.getDescription()); - configurationPanel.add(panel, BorderLayout.CENTER); - configurationPanel.revalidate(); - configurationPanel.repaint(); + public Component getListCellRendererComponent(JList list, ReportModule value, int index, boolean isSelected, boolean cellHasFocus) { + this.setText(value.getName()); + this.setEnabled(true); + this.setSelected(isSelected); + return this; } } - } diff --git a/Core/src/org/sleuthkit/autopsy/report/ReportWizardAction.java b/Core/src/org/sleuthkit/autopsy/report/ReportWizardAction.java index 1eecf2ec68..67a91e6521 100644 --- a/Core/src/org/sleuthkit/autopsy/report/ReportWizardAction.java +++ b/Core/src/org/sleuthkit/autopsy/report/ReportWizardAction.java @@ -66,11 +66,11 @@ public final class ReportWizardAction extends CallableSystemAction implements P public static void doReportWizard() { WizardDescriptor wiz = new WizardDescriptor(new ReportWizardIterator()); wiz.setTitleFormat(new MessageFormat("{0} {1}")); - wiz.setTitle("Generate Report"); + wiz.setTitle("Generate Report"); if (DialogDisplayer.getDefault().notify(wiz) == WizardDescriptor.FINISH_OPTION) { ReportGenerator generator = new ReportGenerator((Map)wiz.getProperty("tableModuleStates"), (Map)wiz.getProperty("generalModuleStates"), - (Map)wiz.getProperty("fileListModuleStates")); + (Map)wiz.getProperty("fileModuleStates")); generator.generateArtifactTableReports((Map)wiz.getProperty("artifactStates"), (Map)wiz.getProperty("tagStates")); generator.generateFileListReports((Map)wiz.getProperty("fileReportOptions")); generator.generateGeneralReports(); diff --git a/Core/src/org/sleuthkit/autopsy/report/ReportWizardIterator.java b/Core/src/org/sleuthkit/autopsy/report/ReportWizardIterator.java index 74df5c20ae..bb5f7ef3d9 100644 --- a/Core/src/org/sleuthkit/autopsy/report/ReportWizardIterator.java +++ b/Core/src/org/sleuthkit/autopsy/report/ReportWizardIterator.java @@ -86,19 +86,19 @@ public final class ReportWizardIterator implements WizardDescriptor.Iterator tables = getComponent().getTableModuleStates(); - Map files = getComponent().getFileListModuleStates(); + Map generals = getComponent().getGeneralModuleStates(); wiz.putProperty("tableModuleStates", tables); - wiz.putProperty("generalModuleStates", getComponent().getGeneralModuleStates()); - wiz.putProperty("fileListModuleStates", files); + wiz.putProperty("generalModuleStates", generals); + wiz.putProperty("fileListModuleStates", getComponent().getFileModuleStates()); // Store preferences that WizardIterator will use to determine what // panels need to be shown Preferences prefs = NbPreferences.forModule(ReportWizardPanel1.class); - prefs.putBoolean("tableConfig", any(tables.values())); - prefs.putBoolean("fileConfig", any(files.values())); + prefs.putBoolean("tableModule", any(tables.values())); + prefs.putBoolean("generalModule", any(generals.values())); } /** diff --git a/Core/src/org/sleuthkit/autopsy/report/ReportWizardPanel2.java b/Core/src/org/sleuthkit/autopsy/report/ReportWizardPanel2.java index 35e5b9afc8..c0612cb6dd 100644 --- a/Core/src/org/sleuthkit/autopsy/report/ReportWizardPanel2.java +++ b/Core/src/org/sleuthkit/autopsy/report/ReportWizardPanel2.java @@ -80,15 +80,8 @@ public class ReportWizardPanel2 implements WizardDescriptor.Panel