1 package be
.nikiroo
.utils
.ui
;
3 import java
.awt
.BorderLayout
;
4 import java
.awt
.event
.ActionEvent
;
5 import java
.awt
.event
.ActionListener
;
6 import java
.awt
.event
.KeyAdapter
;
7 import java
.awt
.event
.KeyEvent
;
8 import java
.io
.IOException
;
9 import java
.io
.InputStream
;
11 import javax
.swing
.ImageIcon
;
12 import javax
.swing
.JButton
;
13 import javax
.swing
.JTextField
;
14 import javax
.swing
.SwingUtilities
;
16 import be
.nikiroo
.utils
.IOUtils
;
19 * A generic search/filter bar.
23 public class SearchBar
extends ListenerPanel
{
24 static private final long serialVersionUID
= 1L;
25 static private ImageIcon searchIcon
;
26 static private ImageIcon clearIcon
;
28 private JButton search
;
29 private JTextField text
;
30 private JButton clear
;
32 private boolean realTime
;
35 * Create a new {@link SearchBar}.
38 setLayout(new BorderLayout());
40 // TODO: make an option to change the default setting here:
41 // (can already be manually toggled by the user)
44 if (searchIcon
== null)
45 searchIcon
= getIcon("search-16x16.png");
46 if (clearIcon
== null)
47 clearIcon
= getIcon("clear-16x16.png");
49 search
= new JButton(searchIcon
);
50 if (searchIcon
== null) {
51 search
.setText("[s]");
53 UIUtils
.setButtonPressed(search
, realTime
);
54 search
.addActionListener(new ActionListener() {
56 public void actionPerformed(ActionEvent e
) {
58 UIUtils
.setButtonPressed(search
, realTime
);
62 fireActionPerformed(getText());
67 text
= new JTextField();
68 text
.addKeyListener(new KeyAdapter() {
70 public void keyTyped(final KeyEvent e
) {
72 SwingUtilities
.invokeLater(new Runnable() {
75 boolean empty
= (text
.getText().isEmpty());
76 clear
.setVisible(!empty
);
79 fireActionPerformed(getText());
85 text
.addActionListener(new ActionListener() {
87 public void actionPerformed(ActionEvent e
) {
89 fireActionPerformed(getText());
94 clear
= new JButton(clearIcon
);
95 if (clearIcon
== null) {
98 clear
.setBackground(text
.getBackground());
99 clear
.setVisible(false);
100 clear
.addActionListener(new ActionListener() {
102 public void actionPerformed(ActionEvent e
) {
104 clear
.setVisible(false);
107 fireActionPerformed(getText());
111 add(search
, BorderLayout
.WEST
);
112 add(text
, BorderLayout
.CENTER
);
113 add(clear
, BorderLayout
.EAST
);
117 * Return the current text displayed by this {@link SearchBar}, or an empty
118 * {@link String} if none.
120 * @return the text, cannot be NULL
122 public String
getText() {
123 // Should usually not be NULL, but not impossible
124 String text
= this.text
.getText();
125 return text
== null ?
"" : text
;
129 public void setEnabled(boolean enabled
) {
130 search
.setEnabled(enabled
);
131 clear
.setEnabled(enabled
);
132 text
.setEnabled(enabled
);
133 super.setEnabled(enabled
);
136 private ImageIcon
getIcon(String name
) {
137 InputStream in
= IOUtils
.openResource(SearchBar
.class, name
);
140 return new ImageIcon(IOUtils
.toByteArray(in
));
141 } catch (IOException e
) {