1 package yukihane.inqubus.gui;
3 import java.awt.EventQueue;
4 import java.awt.event.FocusEvent;
5 import java.awt.event.FocusListener;
6 import java.awt.event.KeyAdapter;
7 import java.awt.event.KeyEvent;
8 import java.nio.file.Path;
9 import java.util.Collection;
10 import java.util.HashSet;
12 import java.util.SortedSet;
13 import java.util.logging.Level;
14 import java.util.logging.Logger;
15 import javax.swing.DefaultComboBoxModel;
16 import javax.swing.JComboBox;
17 import javax.swing.JTextField;
18 import yukihane.inqubus.filewatch.FileWatch;
19 import yukihane.inqubus.filewatch.FileWatchUtil;
21 final class IdComboBox extends JComboBox<String> {
23 private static final Logger logger = Logger.getLogger(IdComboBox.class.getName());
24 private final Set<Path> alternates = new HashSet<>();
25 private final FileWatch videoFileWatcher;
27 IdComboBox(FileWatch videoFileWather) {
29 this.videoFileWatcher = videoFileWather;
32 getEditorComponent().addKeyListener(new AutoCompleteAdapter());
33 getEditorComponent().addFocusListener(new FocusListener() {
36 public void focusGained(FocusEvent e) {
37 logger.log(Level.FINEST, "ID field focus gained");
38 setAlternates(videoFileWatcher.getFiles());
42 public void focusLost(FocusEvent e) {
43 logger.log(Level.FINEST, "ID field focus lost");
49 JTextField getEditorComponent() {
50 return (JTextField) getEditor().getEditorComponent();
53 void setAlternates(Collection<Path> alternates) {
54 this.alternates.clear();
55 this.alternates.addAll(alternates);
59 return getEditorComponent().getText();
62 void setText(String str) {
63 getEditorComponent().setText(str);
66 private class AutoCompleteAdapter extends KeyAdapter {
69 public void keyTyped(final KeyEvent e) {
70 logger.log(Level.FINEST, "key typed");
71 EventQueue.invokeLater(new Runnable() {
75 final String text = getText();
76 final SortedSet<String> alt = FileWatchUtil.getVideoIdsStartWith(alternates, text);
77 final String[] altArray = alt.toArray(new String[0]);
78 DefaultComboBoxModel<String> model = new DefaultComboBoxModel<>(altArray);
79 IdComboBox.this.setModel(model);
82 IdComboBox.this.showPopup();