19 package org.sleuthkit.autopsy.report.infrastructure;
26 import java.awt.BorderLayout;
27 import java.awt.Component;
28 import java.util.ArrayList;
29 import static java.util.Collections.swap;
30 import java.util.HashMap;
31 import java.util.List;
33 import java.util.logging.Level;
34 import javax.swing.JList;
35 import javax.swing.JPanel;
36 import javax.swing.JRadioButton;
37 import javax.swing.ListCellRenderer;
38 import javax.swing.ListSelectionModel;
39 import javax.swing.event.ListSelectionEvent;
40 import javax.swing.event.ListSelectionListener;
41 import org.openide.DialogDisplayer;
42 import org.openide.NotifyDescriptor;
43 import org.openide.util.NbBundle;
50 @SuppressWarnings(
"PMD.SingularField")
51 final class ReportVisualPanel1 extends JPanel implements ListSelectionListener {
53 private static final Logger logger = Logger.getLogger(ReportVisualPanel1.class.getName());
54 private final ReportWizardPanel1 wizPanel;
55 private final List<ReportModule> modules =
new ArrayList<>();
56 private List<GeneralReportModule> generalModules =
new ArrayList<>();
57 private List<TableReportModule> tableModules =
new ArrayList<>();
58 private List<FileReportModule> fileModules =
new ArrayList<>();
59 private PortableCaseReportModule portableCaseModule;
60 private Map<String, ReportModuleConfig> moduleConfigs;
61 private Integer selectedIndex;
66 public ReportVisualPanel1(ReportWizardPanel1 wizPanel, Map<String, ReportModuleConfig> moduleConfigs) {
67 this.wizPanel = wizPanel;
68 this.moduleConfigs = moduleConfigs;
70 configurationPanel.setLayout(
new BorderLayout());
71 descriptionTextPane.setEditable(
false);
76 private void initModules() {
78 tableModules = ReportModuleLoader.getTableReportModules();
79 generalModules = ReportModuleLoader.getGeneralReportModules();
80 fileModules = ReportModuleLoader.getFileReportModules();
82 for (TableReportModule module : tableModules) {
83 if (!moduleIsValid(module)) {
85 tableModules.remove(module);
89 for (GeneralReportModule module : generalModules) {
90 if (!moduleIsValid(module)) {
92 generalModules.remove(module);
96 for (FileReportModule module : fileModules) {
97 if (!moduleIsValid(module)) {
99 fileModules.remove(module);
104 modules.addAll(tableModules);
105 modules.addAll(fileModules);
106 modules.addAll(generalModules);
108 portableCaseModule =
new PortableCaseReportModule();
109 if (moduleIsValid(portableCaseModule)) {
110 modules.add(portableCaseModule);
112 popupWarning(portableCaseModule);
116 int indexOfHTMLReportModule = 0;
117 for (ReportModule module : modules) {
118 if (module instanceof HTMLReport) {
121 indexOfHTMLReportModule++;
123 swap(modules, indexOfHTMLReportModule, 0);
128 for (ReportModule module : modules) {
129 ReportModuleSettings settings = null;
130 if (moduleConfigs != null) {
132 ReportModuleConfig config = moduleConfigs.get(FactoryClassNameNormalizer.normalize(module.getClass().getCanonicalName()));
133 if (config != null) {
135 settings = config.getModuleSettings();
138 if (config.isEnabled()) {
140 selectedIndex = indx;
144 if (settings == null) {
146 settings = module.getDefaultConfiguration();
149 module.setConfiguration(settings);
153 modulesJList.getSelectionModel().addListSelectionListener(
this);
154 modulesJList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
155 modulesJList.setCellRenderer(
new ModuleCellRenderer());
156 modulesJList.setListData(modules.toArray(
new ReportModule[modules.size()]));
157 modulesJList.setSelectedIndex(selectedIndex);
161 private boolean moduleIsValid(ReportModule module) {
162 return module.getName() != null && !module.getName().isEmpty();
165 private void popupWarning(ReportModule module) {
166 String moduleClassName = module.getClass().getSimpleName();
167 logger.log(Level.WARNING,
"Invalid ReportModule: {0}", moduleClassName);
168 DialogDisplayer.getDefault().notify(
new NotifyDescriptor.Message(
169 NbBundle.getMessage(ReportVisualPanel1.class,
"ReportVisualPanel1.invalidModuleWarning", moduleClassName),
170 NotifyDescriptor.ERROR_MESSAGE));
174 public String getName() {
175 return NbBundle.getMessage(this.getClass(),
"ReportVisualPanel1.getName.text");
178 public ReportModule getSelectedModule() {
179 return modules.get(selectedIndex);
187 TableReportModule getTableModule() {
188 ReportModule mod = getSelectedModule();
189 if (tableModules.contains(mod)) {
190 return (TableReportModule) mod;
200 GeneralReportModule getGeneralModule() {
201 ReportModule mod = getSelectedModule();
202 if (generalModules.contains(mod)) {
203 return (GeneralReportModule) mod;
213 FileReportModule getFileModule() {
214 ReportModule mod = getSelectedModule();
215 if (fileModules.contains(mod)) {
216 return (FileReportModule) mod;
226 PortableCaseReportModule getPortableCaseModule() {
227 ReportModule mod = getSelectedModule();
228 if (portableCaseModule.equals(mod)) {
229 return (PortableCaseReportModule) mod;
239 Map<String, ReportModuleConfig> getUpdatedModuleConfigs() {
240 moduleConfigs =
new HashMap<>();
241 for (ReportModule module : modules) {
243 ReportModuleSettings settings = module.getConfiguration();
244 moduleConfigs.put(FactoryClassNameNormalizer.normalize(module.getClass().getCanonicalName()),
new ReportModuleConfig(module,
false, settings));
248 ReportModule mod = getSelectedModule();
249 ReportModuleConfig config = moduleConfigs.get(FactoryClassNameNormalizer.normalize(mod.getClass().getCanonicalName()));
250 config.setEnabled(
true);
252 return moduleConfigs;
255 Map<String, ReportModule> getReportModules() {
256 Map<String, ReportModule> modulesMap =
new HashMap<>();
257 for (ReportModule module : modules) {
258 modulesMap.put(FactoryClassNameNormalizer.normalize(module.getClass().getCanonicalName()), module);
269 private void initComponents() {
271 reportModulesLabel =
new javax.swing.JLabel();
272 configurationPanel =
new javax.swing.JPanel();
273 descriptionScrollPane =
new javax.swing.JScrollPane();
274 descriptionTextPane =
new javax.swing.JTextPane();
275 modulesScrollPane =
new javax.swing.JScrollPane();
276 modulesJList =
new javax.swing.JList<>();
278 setPreferredSize(
new java.awt.Dimension(650, 250));
280 org.openide.awt.Mnemonics.setLocalizedText(reportModulesLabel,
org.openide.util.NbBundle.getMessage(ReportVisualPanel1.class,
"ReportVisualPanel1.reportModulesLabel.text"));
282 configurationPanel.setBorder(javax.swing.BorderFactory.createLineBorder(
new java.awt.Color(125, 125, 125)));
283 configurationPanel.setOpaque(
false);
285 javax.swing.GroupLayout configurationPanelLayout =
new javax.swing.GroupLayout(configurationPanel);
286 configurationPanel.setLayout(configurationPanelLayout);
287 configurationPanelLayout.setHorizontalGroup(
288 configurationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
289 .addGap(0, 432, Short.MAX_VALUE)
291 configurationPanelLayout.setVerticalGroup(
292 configurationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
293 .addGap(0, 168, Short.MAX_VALUE)
296 descriptionScrollPane.setBorder(null);
298 descriptionTextPane.setBackground(
new java.awt.Color(240, 240, 240));
299 descriptionTextPane.setBorder(null);
300 descriptionTextPane.setOpaque(
false);
301 descriptionScrollPane.setViewportView(descriptionTextPane);
303 modulesJList.setBackground(
new java.awt.Color(240, 240, 240));
304 modulesJList.setModel(
new javax.swing.AbstractListModel<ReportModule>() {
305 ReportModule[] modules = {};
306 public int getSize() {
return modules.length; }
307 public ReportModule getElementAt(
int i) {
return modules[i]; }
309 modulesJList.setOpaque(
false);
310 modulesScrollPane.setViewportView(modulesJList);
312 javax.swing.GroupLayout layout =
new javax.swing.GroupLayout(
this);
313 this.setLayout(layout);
314 layout.setHorizontalGroup(
315 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
316 .addGroup(layout.createSequentialGroup()
318 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
319 .addComponent(reportModulesLabel)
320 .addComponent(modulesScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 190, javax.swing.GroupLayout.PREFERRED_SIZE))
321 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
322 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
323 .addComponent(configurationPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
324 .addComponent(descriptionScrollPane))
327 layout.setVerticalGroup(
328 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
329 .addGroup(layout.createSequentialGroup()
331 .addComponent(reportModulesLabel)
332 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
333 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
334 .addGroup(layout.createSequentialGroup()
335 .addComponent(descriptionScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 32, javax.swing.GroupLayout.PREFERRED_SIZE)
336 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
337 .addComponent(configurationPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
338 .addComponent(modulesScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 208, Short.MAX_VALUE))
343 private javax.swing.JPanel configurationPanel;
344 private javax.swing.JScrollPane descriptionScrollPane;
345 private javax.swing.JTextPane descriptionTextPane;
346 private javax.swing.JList<ReportModule> modulesJList;
347 private javax.swing.JScrollPane modulesScrollPane;
348 private javax.swing.JLabel reportModulesLabel;
352 public void valueChanged(ListSelectionEvent e) {
353 if (e.getValueIsAdjusting()) {
356 configurationPanel.removeAll();
357 ListSelectionModel m = (ListSelectionModel) e.getSource();
359 selectedIndex = m.getMaxSelectionIndex();
361 ReportModule module = modules.get(selectedIndex);
362 JPanel panel = module.getConfigurationPanel();
364 panel =
new JPanel();
367 descriptionTextPane.setText(module.getDescription());
368 configurationPanel.add(panel, BorderLayout.CENTER);
369 configurationPanel.revalidate();
370 configurationPanel.repaint();
374 boolean generalModuleSelected = (module instanceof GeneralReportModule) && !((GeneralReportModule)module).supportsDataSourceSelection();
376 wizPanel.setNext(!generalModuleSelected);
377 wizPanel.setFinish(generalModuleSelected);
385 this.setEnabled(
true);
386 this.setSelected(isSelected);
Component getListCellRendererComponent(JList<?extends ReportModule > list, ReportModule value, int index, boolean isSelected, boolean cellHasFocus)