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

Last change on this file since 10217 was 10217, checked in by Don-vip, 8 years ago

findbugs - SF_SWITCH_NO_DEFAULT + various sonar fixes

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