19 package org.sleuthkit.autopsy.datasourceprocessors.xry;
21 import java.beans.PropertyChangeListener;
22 import java.beans.PropertyChangeSupport;
24 import java.nio.file.Files;
25 import java.nio.file.Path;
26 import java.nio.file.Paths;
27 import java.util.Optional;
28 import javax.swing.JFileChooser;
29 import javax.swing.JPanel;
30 import org.apache.commons.lang3.StringUtils;
38 @SuppressWarnings(
"PMD.SingularField")
39 final class XRYDataSourceProcessorConfigPanel extends JPanel {
41 private static final long serialVersionUID = 1L;
43 private static final String PROP_LAST_USED_PATH =
"LAST_USED_PATH";
44 private static final String SETTINGS_CONTEXT =
"XRYDataSourceProcessorConfigPanel_Settings";
46 private static final XRYDataSourceProcessorConfigPanel INSTANCE =
47 new XRYDataSourceProcessorConfigPanel();
51 private final PropertyChangeSupport pcs;
53 private final JFileChooserFactory chooserHelper =
new JFileChooserFactory();
59 private XRYDataSourceProcessorConfigPanel() {
61 pcs =
new PropertyChangeSupport(
this);
67 private void setLastUsedPath(Path selection) {
68 Path parent = selection.getParent();
69 ModuleSettings.setConfigSetting(SETTINGS_CONTEXT,
70 PROP_LAST_USED_PATH, parent.toString());
77 private Optional<Path> getLastUsedPath() {
78 String lastFolderPath = ModuleSettings.getConfigSetting(
79 SETTINGS_CONTEXT, PROP_LAST_USED_PATH);
80 if (StringUtils.isNotBlank(lastFolderPath)) {
81 Path lastPath = Paths.get(lastFolderPath);
82 if (Files.exists(lastPath)) {
83 return Optional.of(lastPath);
86 return Optional.empty();
92 static XRYDataSourceProcessorConfigPanel getInstance() {
99 void clearErrorText() {
100 errorLabel.setText(null);
106 void setErrorText(String text) {
107 errorLabel.setText(text);
113 void clearSelectedFilePath() {
114 filePathTextField.setText(null);
120 String getSelectedFilePath() {
121 return filePathTextField.getText();
128 public synchronized void addPropertyChangeListener(PropertyChangeListener pcl) {
129 super.addPropertyChangeListener(pcl);
130 pcs.addPropertyChangeListener(pcl);
138 @SuppressWarnings(
"unchecked")
140 private
void initComponents() {
142 filePathTextField =
new javax.swing.JTextField();
143 fileBrowserButton =
new javax.swing.JButton();
144 xrySelectFolderLabel =
new javax.swing.JLabel();
145 errorLabel =
new javax.swing.JLabel();
147 filePathTextField.setEditable(
false);
148 filePathTextField.setText(
org.openide.util.NbBundle.getMessage(XRYDataSourceProcessorConfigPanel.class,
"XRYDataSourceProcessorConfigPanel.filePathTextField.text"));
150 org.openide.awt.Mnemonics.setLocalizedText(fileBrowserButton,
org.openide.util.NbBundle.getMessage(XRYDataSourceProcessorConfigPanel.class,
"XRYDataSourceProcessorConfigPanel.fileBrowserButton.text"));
151 fileBrowserButton.addActionListener(
new java.awt.event.ActionListener() {
152 public void actionPerformed(java.awt.event.ActionEvent evt) {
153 fileBrowserButtonActionPerformed(evt);
157 org.openide.awt.Mnemonics.setLocalizedText(xrySelectFolderLabel,
org.openide.util.NbBundle.getMessage(XRYDataSourceProcessorConfigPanel.class,
"XRYDataSourceProcessorConfigPanel.xrySelectFolderLabel.text"));
159 errorLabel.setForeground(
new java.awt.Color(255, 0, 0));
160 org.openide.awt.Mnemonics.setLocalizedText(errorLabel,
org.openide.util.NbBundle.getMessage(XRYDataSourceProcessorConfigPanel.class,
"XRYDataSourceProcessorConfigPanel.errorLabel.text"));
162 javax.swing.GroupLayout layout =
new javax.swing.GroupLayout(
this);
163 this.setLayout(layout);
164 layout.setHorizontalGroup(
165 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
166 .addGroup(layout.createSequentialGroup()
168 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
169 .addComponent(errorLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
170 .addComponent(xrySelectFolderLabel, javax.swing.GroupLayout.DEFAULT_SIZE, 380, Short.MAX_VALUE)
171 .addGroup(layout.createSequentialGroup()
172 .addComponent(filePathTextField)
173 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
174 .addComponent(fileBrowserButton)))
177 layout.setVerticalGroup(
178 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
179 .addGroup(layout.createSequentialGroup()
181 .addComponent(xrySelectFolderLabel)
182 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
183 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
184 .addComponent(filePathTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
185 .addComponent(fileBrowserButton))
186 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
187 .addComponent(errorLabel)
188 .addContainerGap(235, Short.MAX_VALUE))
196 private void fileBrowserButtonActionPerformed(java.awt.event.ActionEvent evt) {
197 JFileChooser fileChooser = chooserHelper.getChooser();
198 fileChooser.setMultiSelectionEnabled(
false);
199 fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
200 Optional<Path> lastUsedPath = getLastUsedPath();
201 if(lastUsedPath.isPresent()) {
202 fileChooser.setCurrentDirectory(lastUsedPath.get().toFile());
204 int returnVal = fileChooser.showOpenDialog(
this);
205 if (returnVal == JFileChooser.APPROVE_OPTION) {
206 File selection = fileChooser.getSelectedFile();
207 setLastUsedPath(selection.toPath());
208 filePathTextField.setText(selection.getAbsolutePath());
211 pcs.firePropertyChange(DataSourceProcessor.DSP_PANEL_EVENT.UPDATE_UI.toString(),
false,
true);
217 private javax.swing.JLabel errorLabel;
218 private javax.swing.JButton fileBrowserButton;
219 private javax.swing.JTextField filePathTextField;
220 private javax.swing.JLabel xrySelectFolderLabel;