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

Last change on this file since 9372 was 9372, checked in by simon04, 8 years ago

Checkstyle

File size: 5.5 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.event.DocumentEvent;
18import javax.swing.event.DocumentListener;
19import javax.swing.event.ListSelectionListener;
20
21public abstract class SearchTextResultListPanel<T> extends JPanel {
22
23 protected final JosmTextField edSearchText;
24 protected final JList<T> lsResult;
25 protected final ResultListModel<T> lsResultModel = new ResultListModel<>();
26
27 protected final transient List<ListSelectionListener> listSelectionListeners = new ArrayList<>();
28
29 private transient ActionListener dblClickListener;
30 private transient ActionListener clickListener;
31
32 protected abstract void filterItems();
33
34 public SearchTextResultListPanel() {
35 super(new BorderLayout());
36
37 edSearchText = new JosmTextField();
38 edSearchText.getDocument().addDocumentListener(new DocumentListener() {
39 @Override
40 public void removeUpdate(DocumentEvent e) {
41 filterItems();
42 }
43
44 @Override
45 public void insertUpdate(DocumentEvent e) {
46 filterItems();
47 }
48
49 @Override
50 public void changedUpdate(DocumentEvent e) {
51 filterItems();
52 }
53 });
54 edSearchText.addKeyListener(new KeyAdapter() {
55 @Override
56 public void keyPressed(KeyEvent e) {
57 switch (e.getKeyCode()) {
58 case KeyEvent.VK_DOWN:
59 selectItem(lsResult.getSelectedIndex() + 1);
60 break;
61 case KeyEvent.VK_UP:
62 selectItem(lsResult.getSelectedIndex() - 1);
63 break;
64 case KeyEvent.VK_PAGE_DOWN:
65 selectItem(lsResult.getSelectedIndex() + 10);
66 break;
67 case KeyEvent.VK_PAGE_UP:
68 selectItem(lsResult.getSelectedIndex() - 10);
69 break;
70 case KeyEvent.VK_HOME:
71 selectItem(0);
72 break;
73 case KeyEvent.VK_END:
74 selectItem(lsResultModel.getSize());
75 break;
76 }
77 }
78 });
79 add(edSearchText, BorderLayout.NORTH);
80
81 lsResult = new JList<>(lsResultModel);
82 lsResult.addMouseListener(new MouseAdapter() {
83 @Override
84 public void mouseClicked(MouseEvent e) {
85 if (e.getClickCount() > 1) {
86 if (dblClickListener != null)
87 dblClickListener.actionPerformed(null);
88 } else {
89 if (clickListener != null)
90 clickListener.actionPerformed(null);
91 }
92 }
93 });
94 add(new JScrollPane(lsResult), BorderLayout.CENTER);
95 }
96
97 protected static class ResultListModel<T> extends AbstractListModel<T> {
98
99 private transient List<T> items = new ArrayList<>();
100
101 public synchronized void setItems(List<T> items) {
102 this.items = items;
103 fireContentsChanged(this, 0, Integer.MAX_VALUE);
104 }
105
106 @Override
107 public synchronized T getElementAt(int index) {
108 return items.get(index);
109 }
110
111 @Override
112 public synchronized int getSize() {
113 return items.size();
114 }
115
116 public synchronized boolean isEmpty() {
117 return items.isEmpty();
118 }
119 }
120
121 public synchronized void init() {
122 listSelectionListeners.clear();
123 edSearchText.setText("");
124 filterItems();
125 }
126
127 private synchronized void selectItem(int newIndex) {
128 if (newIndex < 0) {
129 newIndex = 0;
130 }
131 if (newIndex > lsResultModel.getSize() - 1) {
132 newIndex = lsResultModel.getSize() - 1;
133 }
134 lsResult.setSelectedIndex(newIndex);
135 lsResult.ensureIndexIsVisible(newIndex);
136 }
137
138 public synchronized void clearSelection() {
139 lsResult.clearSelection();
140 }
141
142 public synchronized int getItemCount() {
143 return lsResultModel.getSize();
144 }
145
146 public void setDblClickListener(ActionListener dblClickListener) {
147 this.dblClickListener = dblClickListener;
148 }
149
150 public void setClickListener(ActionListener clickListener) {
151 this.clickListener = clickListener;
152 }
153
154 /**
155 * Adds a selection listener to the presets list.
156 *
157 * @param selectListener The list selection listener
158 * @since 7412
159 */
160 public synchronized void addSelectionListener(ListSelectionListener selectListener) {
161 lsResult.getSelectionModel().addListSelectionListener(selectListener);
162 listSelectionListeners.add(selectListener);
163 }
164
165 /**
166 * Removes a selection listener from the presets list.
167 *
168 * @param selectListener The list selection listener
169 * @since 7412
170 */
171 public synchronized void removeSelectionListener(ListSelectionListener selectListener) {
172 listSelectionListeners.remove(selectListener);
173 lsResult.getSelectionModel().removeListSelectionListener(selectListener);
174 }
175}
Note: See TracBrowser for help on using the repository browser.