--- /dev/null
+package be.nikiroo.utils.ui;
+
+import java.awt.BorderLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.KeyAdapter;
+import java.awt.event.KeyEvent;
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.swing.JButton;
+import javax.swing.JComponent;
+import javax.swing.JFileChooser;
+import javax.swing.JPanel;
+import javax.swing.JTextField;
+
+import be.nikiroo.utils.resources.MetaInfo;
+
+class ConfigItemBrowse<E extends Enum<E>> extends ConfigItem<E> {
+ private static final long serialVersionUID = 1L;
+
+ private boolean dir;
+ private Map<JComponent, JTextField> fields = new HashMap<JComponent, JTextField>();
+
+ /**
+ * Create a new {@link ConfigItemBrowse} for the given {@link MetaInfo}.
+ *
+ * @param info
+ * the {@link MetaInfo}
+ * @param dir
+ * TRUE for directory browsing, FALSE for file browsing
+ */
+ public ConfigItemBrowse(MetaInfo<E> info, boolean dir) {
+ super(info, false);
+ this.dir = dir;
+ }
+
+ @Override
+ protected Object getFromField(int item) {
+ JTextField field = fields.get(getField(item));
+ if (field != null) {
+ return new File(field.getText());
+ }
+
+ return null;
+ }
+
+ @Override
+ protected Object getFromInfo(int item) {
+ String path = info.getString(item, false);
+ if (path != null && !path.isEmpty()) {
+ return new File(path);
+ }
+
+ return null;
+ }
+
+ @Override
+ protected void setToField(Object value, int item) {
+ JTextField field = fields.get(getField(item));
+ if (field != null) {
+ field.setText(value == null ? "" : ((File) value).getPath());
+ }
+ }
+
+ @Override
+ protected void setToInfo(Object value, int item) {
+ info.setString(((File) value).getPath(), item);
+ }
+
+ @Override
+ protected JComponent createEmptyField(final int item) {
+ final JPanel pane = new JPanel(new BorderLayout());
+ final JTextField field = new JTextField();
+ field.addKeyListener(new KeyAdapter() {
+ @Override
+ public void keyTyped(KeyEvent e) {
+ File file = null;
+ if (!field.getText().isEmpty()) {
+ file = new File(field.getText());
+ }
+
+ if (hasValueChanged(file, item)) {
+ setDirtyItem(item);
+ }
+ }
+ });
+
+ final JButton browseButton = new JButton("...");
+ browseButton.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ JFileChooser chooser = new JFileChooser();
+ chooser.setCurrentDirectory((File) getFromInfo(item));
+ chooser.setFileSelectionMode(dir ? JFileChooser.DIRECTORIES_ONLY
+ : JFileChooser.FILES_ONLY);
+ if (chooser.showOpenDialog(ConfigItemBrowse.this) == JFileChooser.APPROVE_OPTION) {
+ File file = chooser.getSelectedFile();
+ if (file != null) {
+ setToField(file, item);
+ if (hasValueChanged(file, item)) {
+ setDirtyItem(item);
+ }
+ }
+ }
+ }
+ });
+
+ pane.add(browseButton, BorderLayout.WEST);
+ pane.add(field, BorderLayout.CENTER);
+
+ fields.put(pane, field);
+ return pane;
+ }
+}