/* * Autopsy Forensic Browser * * Copyright 2013 Basis Technology Corp. * Contact: carrier <at> sleuthkit <dot> org * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.sleuthkit.autopsy.report; import java.awt.Component; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.Arrays; import java.util.EnumMap; import java.util.List; import java.util.Map; import javax.swing.JCheckBox; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.ListCellRenderer; import javax.swing.ListModel; import javax.swing.event.ListDataListener; import org.openide.util.NbBundle; /** * Visual component of the File Report Configuration panel of the Report Wizard. * * @author jwallace */ class ReportWizardFileOptionsVisualPanel extends javax.swing.JPanel { private List<FileReportDataTypes> options; private Map<FileReportDataTypes, Boolean> optionStates = new EnumMap<>(FileReportDataTypes.class); private ListModel<FileReportDataTypes> model; private ReportWizardFileOptionsPanel wizPanel; public ReportWizardFileOptionsVisualPanel(ReportWizardFileOptionsPanel wizPanel) { this.wizPanel = wizPanel; initComponents(); initOptionsList(); } @Override public String getName() { return NbBundle.getMessage(this.getClass(), "ReportWizardFileOptionsVisualPanel.getName.text"); } /** * Populate the list of File Report Information that can be selected. */ private void initOptionsList() { options = Arrays.asList(FileReportDataTypes.values()); for (FileReportDataTypes col : options) { optionStates.put(col, Boolean.FALSE); } model = new OptionsListModel(); optionsList.setModel(model); optionsList.setCellRenderer(new OptionsListRenderer()); optionsList.setVisibleRowCount(-1); selectAllButton.setEnabled(true); deselectAllButton.setEnabled(false); // Add the ability to enable and disable Tag checkboxes to the list optionsList.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent evt) { int index = optionsList.locationToIndex(evt.getPoint()); FileReportDataTypes value = model.getElementAt(index); optionStates.put(value, !optionStates.get(value)); optionsList.repaint(); boolean anySelected = anySelected(); deselectAllButton.setEnabled(anySelected); wizPanel.setFinish(anySelected); selectAllButton.setEnabled(notAllSelected()); } }); } /** * Are any options selected? * * @return */ private boolean anySelected() { for (Boolean b : optionStates.values()) { if (b) { return true; } } return false; } /** * Are no options selected? * * @return */ private boolean notAllSelected() { for (Boolean b : optionStates.values()) { if (!b) { return true; } } return false; } /** * Get the user-selected settings. * * @return */ Map<FileReportDataTypes, Boolean> getFileReportOptions() { return optionStates; } /** * 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() { jScrollPane1 = new javax.swing.JScrollPane(); optionsList = new javax.swing.JList<>(); selectAllButton = new javax.swing.JButton(); deselectAllButton = new javax.swing.JButton(); jLabel1 = new javax.swing.JLabel(); optionsList.setModel(new javax.swing.AbstractListModel<FileReportDataTypes>() { FileReportDataTypes[] types = { }; public int getSize() { return types.length; } public FileReportDataTypes getElementAt(int i) { return types[i]; } }); jScrollPane1.setViewportView(optionsList); org.openide.awt.Mnemonics.setLocalizedText(selectAllButton, org.openide.util.NbBundle.getMessage(ReportWizardFileOptionsVisualPanel.class, "ReportWizardFileOptionsVisualPanel.selectAllButton.text")); // NOI18N selectAllButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { selectAllButtonActionPerformed(evt); } }); org.openide.awt.Mnemonics.setLocalizedText(deselectAllButton, org.openide.util.NbBundle.getMessage(ReportWizardFileOptionsVisualPanel.class, "ReportWizardFileOptionsVisualPanel.deselectAllButton.text")); // NOI18N deselectAllButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { deselectAllButtonActionPerformed(evt); } }); org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(ReportWizardFileOptionsVisualPanel.class, "ReportWizardFileOptionsVisualPanel.jLabel1.text")); // NOI18N javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jScrollPane1) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jLabel1) .addGroup(layout.createSequentialGroup() .addComponent(selectAllButton, javax.swing.GroupLayout.PREFERRED_SIZE, 87, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(deselectAllButton))) .addGap(0, 210, Short.MAX_VALUE))) .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(10, 10, 10) .addComponent(jLabel1) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 220, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(deselectAllButton) .addComponent(selectAllButton)) .addContainerGap()) ); }// </editor-fold>//GEN-END:initComponents private void selectAllButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_selectAllButtonActionPerformed for (FileReportDataTypes option : options) { optionStates.put(option, Boolean.TRUE); } optionsList.repaint(); selectAllButton.setEnabled(false); deselectAllButton.setEnabled(true); wizPanel.setFinish(true); }//GEN-LAST:event_selectAllButtonActionPerformed private void deselectAllButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deselectAllButtonActionPerformed for (FileReportDataTypes option : options) { optionStates.put(option, Boolean.FALSE); } optionsList.repaint(); selectAllButton.setEnabled(true); deselectAllButton.setEnabled(false); wizPanel.setFinish(false); }//GEN-LAST:event_deselectAllButtonActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton deselectAllButton; private javax.swing.JLabel jLabel1; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JList<FileReportDataTypes> optionsList; private javax.swing.JButton selectAllButton; // End of variables declaration//GEN-END:variables private class OptionsListModel implements ListModel<FileReportDataTypes> { @Override public int getSize() { return options.size(); } @Override public FileReportDataTypes getElementAt(int index) { return options.get(index); } @Override public void addListDataListener(ListDataListener l) { } @Override public void removeListDataListener(ListDataListener l) { } } /** * Render each item in the list to be a selectable check box. */ private class OptionsListRenderer extends JCheckBox implements ListCellRenderer<FileReportDataTypes> { @Override public Component getListCellRendererComponent(JList<? extends FileReportDataTypes> list, FileReportDataTypes value, int index, boolean isSelected, boolean cellHasFocus) { if (value != null) { FileReportDataTypes col = value; setEnabled(list.isEnabled()); setSelected(optionStates.get(col)); setFont(list.getFont()); setBackground(list.getBackground()); setForeground(list.getForeground()); setText(col.getName()); return this; } return new JLabel(); } } }