19 package org.sleuthkit.autopsy.casemodule;
 
   21 import java.awt.BorderLayout;
 
   22 import java.awt.Component;
 
   23 import java.beans.PropertyChangeEvent;
 
   24 import java.beans.PropertyChangeListener;
 
   25 import java.util.HashMap;
 
   27 import java.util.logging.Level;
 
   28 import javax.swing.JList;
 
   29 import javax.swing.JPanel;
 
   30 import javax.swing.JSeparator;
 
   31 import javax.swing.ListCellRenderer;
 
   32 import org.openide.util.Lookup;
 
   33 import org.openide.util.NbBundle;
 
   42 @SuppressWarnings(
"PMD.SingularField") 
 
   43 final class AddImageWizardDataSourceSettingsVisual extends JPanel {
 
   45     private static final Logger logger = Logger.getLogger(AddImageWizardDataSourceSettingsVisual.class.getName());
 
   47     private final AddImageWizardDataSourceSettingsPanel wizPanel;
 
   49     private JPanel currentPanel;
 
   51     private final Map<String, DataSourceProcessor> datasourceProcessorsMap = 
new HashMap<>();
 
   53     private final PanelUpdateListener panelUpdateListener;
 
   55     private String currentDsp;
 
   62     AddImageWizardDataSourceSettingsVisual(AddImageWizardDataSourceSettingsPanel wizPanel) {
 
   64         this.wizPanel = wizPanel;
 
   65         this.panelUpdateListener = 
new PanelUpdateListener();
 
   66         typePanel.setLayout(
new BorderLayout());
 
   67         discoverDataSourceProcessors();
 
   68         currentDsp = ImageDSProcessor.getType(); 
 
   75     private void discoverDataSourceProcessors() {
 
   76         for (DataSourceProcessor dsProcessor : Lookup.getDefault().lookupAll(DataSourceProcessor.class)) {
 
   77             if (!datasourceProcessorsMap.containsKey(dsProcessor.getDataSourceType())) {
 
   78                 datasourceProcessorsMap.put(dsProcessor.getDataSourceType(), dsProcessor);
 
   80                 logger.log(Level.SEVERE, 
"discoverDataSourceProcessors(): A DataSourceProcessor already exists for type = {0}", dsProcessor.getDataSourceType()); 
 
   84         for (DataSourceProcessor dsProcessor : JythonModuleLoader.getDataSourceProcessorModules()) {
 
   85             if (!datasourceProcessorsMap.containsKey(dsProcessor.getDataSourceType())) {
 
   86                 datasourceProcessorsMap.put(dsProcessor.getDataSourceType(), dsProcessor);
 
   88                 logger.log(Level.SEVERE, 
"discoverDataSourceProcessors(): A DataSourceProcessor already exists for type = {0}", dsProcessor.getDataSourceType()); 
 
  100     void setDspSelection(String dsType) {
 
  102         currentPanel = datasourceProcessorsMap.get(dsType).getPanel();
 
  103         updateCurrentPanel(currentPanel);
 
  111     @SuppressWarnings(
"deprecation")
 
  112     private 
void updateCurrentPanel(JPanel panel) {
 
  113         cleanupUpdateListener(currentPanel);
 
  114         currentPanel = panel;
 
  115         typePanel.removeAll();
 
  116         typePanel.add(currentPanel, BorderLayout.CENTER);
 
  117         typePanel.validate();
 
  119         cleanupUpdateListener(currentPanel);
 
  120         currentPanel.addPropertyChangeListener(panelUpdateListener);
 
  121         this.wizPanel.enableNextButton(getCurrentDSProcessor().isPanelValid());
 
  128     private void cleanupUpdateListener(JPanel panel) {
 
  133         PropertyChangeListener[] listeners = panel.getPropertyChangeListeners();
 
  134         if (listeners == null) {
 
  138         for (PropertyChangeListener listener: listeners) {
 
  139             if (listener instanceof PanelUpdateListener) {
 
  140                 panel.removePropertyChangeListener(listener);
 
  151     protected DataSourceProcessor getCurrentDSProcessor() {
 
  154         DataSourceProcessor dsProcessor = datasourceProcessorsMap.get(currentDsp);
 
  166     public String getName() {
 
  167         return NbBundle.getMessage(this.getClass(), 
"AddImageWizardChooseDataSourceVisual.getName.text");
 
  176     private void initComponents() {
 
  178         typePanel = 
new javax.swing.JPanel();
 
  180         setPreferredSize(
new java.awt.Dimension(588, 328));
 
  182         typePanel.setMinimumSize(
new java.awt.Dimension(0, 65));
 
  183         typePanel.setPreferredSize(
new java.awt.Dimension(521, 65));
 
  185         javax.swing.GroupLayout typePanelLayout = 
new javax.swing.GroupLayout(typePanel);
 
  186         typePanel.setLayout(typePanelLayout);
 
  187         typePanelLayout.setHorizontalGroup(
 
  188             typePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  189             .addGap(0, 588, Short.MAX_VALUE)
 
  191         typePanelLayout.setVerticalGroup(
 
  192             typePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  193             .addGap(0, 328, Short.MAX_VALUE)
 
  196         javax.swing.GroupLayout layout = 
new javax.swing.GroupLayout(
this);
 
  197         this.setLayout(layout);
 
  198         layout.setHorizontalGroup(
 
  199             layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  200             .addComponent(typePanel, javax.swing.GroupLayout.DEFAULT_SIZE, 588, Short.MAX_VALUE)
 
  202         layout.setVerticalGroup(
 
  203             layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 
  204             .addComponent(typePanel, javax.swing.GroupLayout.DEFAULT_SIZE, 328, Short.MAX_VALUE)
 
  208     private javax.swing.JPanel typePanel;
 
  211     @SuppressWarnings(
"rawtypes")
 
  216         private final JPanel separatorPanel = 
new JPanel(
new BorderLayout());
 
  218         private final JSeparator separator = 
new JSeparator();
 
  221             this.delegate = delegate;
 
  224         @SuppressWarnings(
"unchecked")
 
  227             Component comp = delegate.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
 
  228             if (index != -1 && addSeparatorAfter(list, value, index)) {
 
  229                 separatorPanel.removeAll();
 
  230                 separatorPanel.add(comp, BorderLayout.CENTER);
 
  231                 separatorPanel.add(separator, BorderLayout.SOUTH);
 
  232                 return separatorPanel;
 
  238         protected abstract boolean addSeparatorAfter(JList list, Object value, 
int index);
 
  249                 wizPanel.enableNextButton(getCurrentDSProcessor().isPanelValid());
 
  252                 wizPanel.moveFocusToNext();
 
ComboboxSeparatorRenderer(ListCellRenderer delegate)
 
Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus)
 
void propertyChange(PropertyChangeEvent evt)
 
final ListCellRenderer delegate