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