19 package org.sleuthkit.autopsy.casemodule;
21 import java.awt.BorderLayout;
22 import java.awt.Component;
23 import java.awt.event.ActionEvent;
24 import java.awt.event.ActionListener;
25 import java.beans.PropertyChangeEvent;
26 import java.beans.PropertyChangeListener;
27 import java.util.ArrayList;
28 import java.util.HashMap;
29 import java.util.List;
32 import java.util.logging.Level;
33 import javax.swing.JList;
34 import javax.swing.JPanel;
35 import javax.swing.JSeparator;
36 import javax.swing.ListCellRenderer;
37 import javax.swing.event.DocumentEvent;
38 import org.openide.util.Lookup;
39 import org.openide.util.NbBundle;
48 final class AddImageWizardChooseDataSourceVisual
extends JPanel {
50 static final Logger logger = Logger.
getLogger(AddImageWizardChooseDataSourceVisual.class.getName());
52 private AddImageWizardChooseDataSourcePanel wizPanel;
54 private JPanel currentPanel;
56 private Map<String, DataSourceProcessor> datasourceProcessorsMap =
new HashMap<>();
58 List<String> coreDSPTypes =
new ArrayList<>();
65 AddImageWizardChooseDataSourceVisual(AddImageWizardChooseDataSourcePanel wizPanel) {
67 this.wizPanel = wizPanel;
72 @SuppressWarnings({
"rawtypes",
"unchecked"})
73 private void customInit() {
75 typePanel.setLayout(
new BorderLayout());
77 discoverDataSourceProcessors();
80 typeComboBox.removeAllItems();
82 Set<String> dspTypes = datasourceProcessorsMap.keySet();
86 coreDSPTypes.add(ImageDSProcessor.getType());
88 if (Case.getCurrentCase().getCaseType() != Case.CaseType.MULTI_USER_CASE) {
89 coreDSPTypes.add(LocalDiskDSProcessor.getType());
92 datasourceProcessorsMap.remove(LocalDiskDSProcessor.getType());
94 coreDSPTypes.add(LocalFilesDSProcessor.getType());
96 for (String dspType : coreDSPTypes) {
97 typeComboBox.addItem(dspType);
101 for (String dspType : dspTypes) {
102 if (!coreDSPTypes.contains(dspType)) {
103 typeComboBox.addItem(dspType);
107 typeComboBox.setRenderer(
new ComboboxSeparatorRenderer(typeComboBox.getRenderer()) {
110 protected boolean addSeparatorAfter(JList list, Object value,
int index) {
111 return (index == coreDSPTypes.size() - 1);
116 ActionListener cbActionListener =
new ActionListener() {
118 public void actionPerformed(ActionEvent e) {
119 dspSelectionChanged();
122 typeComboBox.addActionListener(cbActionListener);
123 typeComboBox.setSelectedIndex(0);
126 private void discoverDataSourceProcessors() {
128 for (DataSourceProcessor dsProcessor : Lookup.getDefault().lookupAll(DataSourceProcessor.class)) {
130 if (!datasourceProcessorsMap.containsKey(dsProcessor.getDataSourceType())) {
131 datasourceProcessorsMap.put(dsProcessor.getDataSourceType(), dsProcessor);
133 logger.log(Level.SEVERE,
"discoverDataSourceProcessors(): A DataSourceProcessor already exists for type = {0}", dsProcessor.getDataSourceType());
138 private void dspSelectionChanged() {
140 currentPanel = getCurrentDSProcessor().getPanel();
141 updateCurrentPanel(currentPanel);
149 @SuppressWarnings(
"deprecation")
150 private
void updateCurrentPanel(JPanel panel) {
151 currentPanel = panel;
152 typePanel.removeAll();
153 typePanel.add(currentPanel, BorderLayout.CENTER);
154 typePanel.validate();
156 currentPanel.addPropertyChangeListener(
new PropertyChangeListener() {
158 public void propertyChange(PropertyChangeEvent evt) {
159 if (evt.getPropertyName().equals(DataSourceProcessor.DSP_PANEL_EVENT.UPDATE_UI.toString())) {
162 if (evt.getPropertyName().equals(DataSourceProcessor.DSP_PANEL_EVENT.FOCUS_NEXT.toString())) {
163 wizPanel.moveFocusToNext();
177 protected DataSourceProcessor getCurrentDSProcessor() {
180 String dsType = (String) typeComboBox.getSelectedItem();
181 DataSourceProcessor dsProcessor = datasourceProcessorsMap.get(dsType);
194 public String getName() {
195 return NbBundle.getMessage(this.getClass(),
"AddImageWizardChooseDataSourceVisual.getName.text");
204 private void initComponents() {
206 buttonGroup1 =
new javax.swing.ButtonGroup();
207 jLabel2 =
new javax.swing.JLabel();
208 nextLabel =
new javax.swing.JLabel();
209 inputPanel =
new javax.swing.JPanel();
210 typeTabel =
new javax.swing.JLabel();
211 typePanel =
new javax.swing.JPanel();
212 typeComboBox =
new javax.swing.JComboBox<String>();
214 org.openide.awt.Mnemonics.setLocalizedText(jLabel2,
org.openide.util.NbBundle.getMessage(AddImageWizardChooseDataSourceVisual.class,
"AddImageWizardChooseDataSourceVisual.jLabel2.text"));
216 setPreferredSize(
new java.awt.Dimension(588, 328));
218 org.openide.awt.Mnemonics.setLocalizedText(nextLabel,
org.openide.util.NbBundle.getMessage(AddImageWizardChooseDataSourceVisual.class,
"AddImageWizardChooseDataSourceVisual.nextLabel.text"));
219 nextLabel.setPreferredSize(
new java.awt.Dimension(514, 35));
220 nextLabel.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
222 inputPanel.setBorder(javax.swing.BorderFactory.createEtchedBorder());
224 org.openide.awt.Mnemonics.setLocalizedText(typeTabel,
org.openide.util.NbBundle.getMessage(AddImageWizardChooseDataSourceVisual.class,
"AddImageWizardChooseDataSourceVisual.typeTabel.text"));
226 typePanel.setMinimumSize(
new java.awt.Dimension(0, 65));
227 typePanel.setPreferredSize(
new java.awt.Dimension(521, 65));
229 javax.swing.GroupLayout typePanelLayout =
new javax.swing.GroupLayout(typePanel);
230 typePanel.setLayout(typePanelLayout);
231 typePanelLayout.setHorizontalGroup(
232 typePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
233 .addGap(0, 544, Short.MAX_VALUE)
235 typePanelLayout.setVerticalGroup(
236 typePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
237 .addGap(0, 173, Short.MAX_VALUE)
240 javax.swing.GroupLayout inputPanelLayout =
new javax.swing.GroupLayout(inputPanel);
241 inputPanel.setLayout(inputPanelLayout);
242 inputPanelLayout.setHorizontalGroup(
243 inputPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
244 .addGroup(inputPanelLayout.createSequentialGroup()
246 .addGroup(inputPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
247 .addGroup(inputPanelLayout.createSequentialGroup()
248 .addComponent(typeTabel)
249 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
250 .addComponent(typeComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 292, javax.swing.GroupLayout.PREFERRED_SIZE)
251 .addGap(0, 115, Short.MAX_VALUE))
252 .addComponent(typePanel, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 544, Short.MAX_VALUE))
255 inputPanelLayout.setVerticalGroup(
256 inputPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
257 .addGroup(inputPanelLayout.createSequentialGroup()
259 .addGroup(inputPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
260 .addComponent(typeTabel)
261 .addComponent(typeComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
262 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
263 .addComponent(typePanel, javax.swing.GroupLayout.DEFAULT_SIZE, 173, Short.MAX_VALUE)
267 javax.swing.GroupLayout layout =
new javax.swing.GroupLayout(
this);
268 this.setLayout(layout);
269 layout.setHorizontalGroup(
270 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
271 .addGroup(layout.createSequentialGroup()
273 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
274 .addComponent(inputPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
275 .addGroup(layout.createSequentialGroup()
276 .addComponent(nextLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
277 .addGap(0, 54, Short.MAX_VALUE)))
280 layout.setVerticalGroup(
281 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
282 .addGroup(layout.createSequentialGroup()
284 .addComponent(inputPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
285 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 24, Short.MAX_VALUE)
286 .addComponent(nextLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
291 private javax.swing.ButtonGroup buttonGroup1;
292 private javax.swing.JPanel inputPanel;
293 private javax.swing.JLabel jLabel2;
294 private javax.swing.JLabel nextLabel;
295 private javax.swing.JComboBox<String> typeComboBox;
296 private javax.swing.JPanel typePanel;
297 private javax.swing.JLabel typeTabel;
308 public void updateUI(DocumentEvent e) {
310 this.wizPanel.enableNextButton(getCurrentDSProcessor().isPanelValid());
313 @SuppressWarnings(
"rawtypes")
318 private JPanel separatorPanel =
new JPanel(
new BorderLayout());
320 private JSeparator separator =
new JSeparator();
323 this.delegate = delegate;
326 @SuppressWarnings(
"unchecked")
329 Component comp = delegate.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
330 if (index != -1 && addSeparatorAfter(list, value, index)) {
331 separatorPanel.removeAll();
332 separatorPanel.add(comp, BorderLayout.CENTER);
333 separatorPanel.add(separator, BorderLayout.SOUTH);
334 return separatorPanel;
340 protected abstract boolean addSeparatorAfter(JList list, Object value,
int index);
ComboboxSeparatorRenderer(ListCellRenderer delegate)
ListCellRenderer delegate
Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus)
synchronized static Logger getLogger(String name)