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;
37 @SuppressWarnings(
"PMD.SingularField")
38 final class XRYDataSourceProcessorConfigPanel extends JPanel {
40 private static final long serialVersionUID = 1L;
42 private static final String PROP_LAST_USED_PATH =
"LAST_USED_PATH";
43 private static final String SETTINGS_CONTEXT =
"XRYDataSourceProcessorConfigPanel_Settings";
45 private static final XRYDataSourceProcessorConfigPanel INSTANCE =
46 new XRYDataSourceProcessorConfigPanel();
50 private final PropertyChangeSupport pcs;
56 private XRYDataSourceProcessorConfigPanel() {
58 pcs =
new PropertyChangeSupport(
this);
64 private void setLastUsedPath(Path selection) {
65 Path parent = selection.getParent();
66 ModuleSettings.setConfigSetting(SETTINGS_CONTEXT,
67 PROP_LAST_USED_PATH, parent.toString());
74 private Optional<Path> getLastUsedPath() {
75 String lastFolderPath = ModuleSettings.getConfigSetting(
76 SETTINGS_CONTEXT, PROP_LAST_USED_PATH);
77 if (StringUtils.isNotBlank(lastFolderPath)) {
78 Path lastPath = Paths.get(lastFolderPath);
79 if (Files.exists(lastPath)) {
80 return Optional.of(lastPath);
83 return Optional.empty();
89 static XRYDataSourceProcessorConfigPanel getInstance() {
96 void clearErrorText() {
97 errorLabel.setText(null);
103 void setErrorText(String text) {
104 errorLabel.setText(text);
110 void clearSelectedFilePath() {
111 filePathTextField.setText(null);
117 String getSelectedFilePath() {
118 return filePathTextField.getText();
125 public synchronized void addPropertyChangeListener(PropertyChangeListener pcl) {
126 super.addPropertyChangeListener(pcl);
127 pcs.addPropertyChangeListener(pcl);
135 @SuppressWarnings(
"unchecked")
137 private
void initComponents() {
139 filePathTextField =
new javax.swing.JTextField();
140 fileBrowserButton =
new javax.swing.JButton();
141 xrySelectFolderLabel =
new javax.swing.JLabel();
142 errorLabel =
new javax.swing.JLabel();
144 filePathTextField.setEditable(
false);
145 filePathTextField.setText(
org.openide.util.NbBundle.getMessage(XRYDataSourceProcessorConfigPanel.class,
"XRYDataSourceProcessorConfigPanel.filePathTextField.text"));
147 org.openide.awt.Mnemonics.setLocalizedText(fileBrowserButton,
org.openide.util.NbBundle.getMessage(XRYDataSourceProcessorConfigPanel.class,
"XRYDataSourceProcessorConfigPanel.fileBrowserButton.text"));
148 fileBrowserButton.addActionListener(
new java.awt.event.ActionListener() {
149 public void actionPerformed(java.awt.event.ActionEvent evt) {
150 fileBrowserButtonActionPerformed(evt);
154 org.openide.awt.Mnemonics.setLocalizedText(xrySelectFolderLabel,
org.openide.util.NbBundle.getMessage(XRYDataSourceProcessorConfigPanel.class,
"XRYDataSourceProcessorConfigPanel.xrySelectFolderLabel.text"));
156 errorLabel.setForeground(
new java.awt.Color(255, 0, 0));
157 org.openide.awt.Mnemonics.setLocalizedText(errorLabel,
org.openide.util.NbBundle.getMessage(XRYDataSourceProcessorConfigPanel.class,
"XRYDataSourceProcessorConfigPanel.errorLabel.text"));
159 javax.swing.GroupLayout layout =
new javax.swing.GroupLayout(
this);
160 this.setLayout(layout);
161 layout.setHorizontalGroup(
162 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
163 .addGroup(layout.createSequentialGroup()
165 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
166 .addComponent(errorLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
167 .addComponent(xrySelectFolderLabel, javax.swing.GroupLayout.DEFAULT_SIZE, 380, Short.MAX_VALUE)
168 .addGroup(layout.createSequentialGroup()
169 .addComponent(filePathTextField)
170 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
171 .addComponent(fileBrowserButton)))
174 layout.setVerticalGroup(
175 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
176 .addGroup(layout.createSequentialGroup()
178 .addComponent(xrySelectFolderLabel)
179 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
180 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
181 .addComponent(filePathTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
182 .addComponent(fileBrowserButton))
183 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
184 .addComponent(errorLabel)
185 .addContainerGap(235, Short.MAX_VALUE))
193 private void fileBrowserButtonActionPerformed(java.awt.event.ActionEvent evt) {
194 JFileChooser fileChooser =
new JFileChooser();
195 fileChooser.setMultiSelectionEnabled(
false);
196 fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
197 Optional<Path> lastUsedPath = getLastUsedPath();
198 if(lastUsedPath.isPresent()) {
199 fileChooser.setCurrentDirectory(lastUsedPath.get().toFile());
201 int returnVal = fileChooser.showOpenDialog(
this);
202 if (returnVal == JFileChooser.APPROVE_OPTION) {
203 File selection = fileChooser.getSelectedFile();
204 setLastUsedPath(selection.toPath());
205 filePathTextField.setText(selection.getAbsolutePath());
208 pcs.firePropertyChange(DataSourceProcessor.DSP_PANEL_EVENT.UPDATE_UI.toString(),
false,
true);
214 private javax.swing.JLabel errorLabel;
215 private javax.swing.JButton fileBrowserButton;
216 private javax.swing.JTextField filePathTextField;
217 private javax.swing.JLabel xrySelectFolderLabel;