source: josm/trunk/src/org/openstreetmap/josm/gui/widgets/SearchTextResultListPanel.java@ 12304

Last change on this file since 12304 was 12304, checked in by michael2402, 7 years ago

Javadoc for public methods / classes in gui.util and gui.widgets

File size: 6.4 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.widgets;
3
4import java.awt.BorderLayout;
5import java.awt.event.ActionListener;
6import java.awt.event.KeyAdapter;
7import java.awt.event.KeyEvent;
8import java.awt.event.MouseAdapter;
9import java.awt.event.MouseEvent;
10import java.util.ArrayList;
11import java.util.List;
12
13import javax.swing.AbstractListModel;
14import javax.swing.JList;
15import javax.swing.JPanel;
16import javax.swing.JScrollPane;
17import javax.swing.ListSelectionModel;
18import javax.swing.event.DocumentEvent;
19import javax.swing.event.DocumentListener;
20import javax.swing.event.ListSelectionListener;
21
22/**
23 * A panel containing a search text field and a list of results for that search text.
24 * @param <T> The class of the things that are searched
25 */
26public abstract class SearchTextResultListPanel<T> extends JPanel {
27
28 protected final JosmTextField edSearchText;
29 protected final JList<T> lsResult;
30 protected final ResultListModel<T> lsResultModel = new ResultListModel<>();
31
32 protected final transient List<ListSelectionListener> listSelectionListeners = new ArrayList<>();
33
34 private transient ActionListener dblClickListener;
35 private transient ActionListener clickListener;
36
37 protected abstract void filterItems();
38
39 /**
40 * Constructs a new {@code SearchTextResultListPanel}.
41 */
42 public SearchTextResultListPanel() {
43 super(new BorderLayout());
44
45 edSearchText = new JosmTextField();
46 edSearchText.getDocument().addDocumentListener(new DocumentListener() {
47 @Override
48 public void removeUpdate(DocumentEvent e) {
49 filterItems();
50 }
51
52 @Override
53 public void insertUpdate(DocumentEvent e) {
54 filterItems();
55 }
56
57 @Override
58 public void changedUpdate(DocumentEvent e) {
59 filterItems();
60 }
61 });
62 edSearchText.addKeyListener(new KeyAdapter() {
63 @Override
64 public void keyPressed(KeyEvent e) {
65 switch (e.getKeyCode()) {
66 case KeyEvent.VK_DOWN:
67 selectItem(lsResult.getSelectedIndex() + 1);
68 break;
69 case KeyEvent.VK_UP:
70 selectItem(lsResult.getSelectedIndex() - 1);
71 break;
72 case KeyEvent.VK_PAGE_DOWN:
73 selectItem(lsResult.getSelectedIndex() + 10);
74 break;
75 case KeyEvent.VK_PAGE_UP:
76 selectItem(lsResult.getSelectedIndex() - 10);
77 break;
78 case KeyEvent.VK_HOME:
79 selectItem(0);
80 break;
81 case KeyEvent.VK_END:
82 selectItem(lsResultModel.getSize());
83 break;
84 default: // Do nothing
85 }
86 }
87 });
88 add(edSearchText, BorderLayout.NORTH);
89
90 lsResult = new JList<>(lsResultModel);
91 lsResult.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
92 lsResult.addMouseListener(new MouseAdapter() {
93 @Override
94 public void mouseClicked(MouseEvent e) {
95 if (e.getClickCount() > 1) {
96 if (dblClickListener != null)
97 dblClickListener.actionPerformed(null);
98 } else {
99 if (clickListener != null)
100 clickListener.actionPerformed(null);
101 }
102 }
103 });
104 add(new JScrollPane(lsResult), BorderLayout.CENTER);
105 }
106
107 protected static class ResultListModel<T> extends AbstractListModel<T> {
108
109 private transient List<T> items = new ArrayList<>();
110
111 public synchronized void setItems(List<T> items) {
112 this.items = items;
113 fireContentsChanged(this, 0, Integer.MAX_VALUE);
114 }
115
116 @Override
117 public synchronized T getElementAt(int index) {
118 return items.get(index);
119 }
120
121 @Override
122 public synchronized int getSize() {
123 return items.size();
124 }
125
126 public synchronized boolean isEmpty() {
127 return items.isEmpty();
128 }
129 }
130
131 /**
132 * Initializes and clears the panel.
133 */
134 public synchronized void init() {
135 listSelectionListeners.clear();
136 edSearchText.setText("");
137 filterItems();
138 }
139
140 private synchronized void selectItem(int newIndex) {
141 if (newIndex < 0) {
142 newIndex = 0;
143 }
144 if (newIndex > lsResultModel.getSize() - 1) {
145 newIndex = lsResultModel.getSize() - 1;
146 }
147 lsResult.setSelectedIndex(newIndex);
148 lsResult.ensureIndexIsVisible(newIndex);
149 }
150
151 /**
152 * Clear the selected result
153 */
154 public synchronized void clearSelection() {
155 lsResult.clearSelection();
156 }
157
158 /**
159 * Get the number of items available
160 * @return The number of search result items available
161 */
162 public synchronized int getItemCount() {
163 return lsResultModel.getSize();
164 }
165
166 /**
167 * Sets a listener to be invoked on double click
168 * @param dblClickListener The double click listener
169 */
170 public void setDblClickListener(ActionListener dblClickListener) {
171 this.dblClickListener = dblClickListener;
172 }
173
174 /**
175 * Sets a listener to be invoked on ssingle click
176 * @param clickListener The click listener
177 */
178 public void setClickListener(ActionListener clickListener) {
179 this.clickListener = clickListener;
180 }
181
182 /**
183 * Adds a selection listener to the presets list.
184 *
185 * @param selectListener The list selection listener
186 * @since 7412
187 */
188 public synchronized void addSelectionListener(ListSelectionListener selectListener) {
189 lsResult.getSelectionModel().addListSelectionListener(selectListener);
190 listSelectionListeners.add(selectListener);
191 }
192
193 /**
194 * Removes a selection listener from the presets list.
195 *
196 * @param selectListener The list selection listener
197 * @since 7412
198 */
199 public synchronized void removeSelectionListener(ListSelectionListener selectListener) {
200 listSelectionListeners.remove(selectListener);
201 lsResult.getSelectionModel().removeListSelectionListener(selectListener);
202 }
203}
Note: See TracBrowser for help on using the repository browser.