1 package org.opentrafficsim.swing.gui;
2
3 import java.awt.Dimension;
4 import java.awt.event.ActionEvent;
5 import java.awt.event.ActionListener;
6 import java.awt.event.FocusEvent;
7 import java.awt.event.FocusListener;
8
9 import javax.swing.BoxLayout;
10 import javax.swing.JCheckBox;
11 import javax.swing.JComboBox;
12 import javax.swing.JLabel;
13 import javax.swing.JPanel;
14 import javax.swing.JTextField;
15 import javax.swing.event.DocumentEvent;
16 import javax.swing.event.DocumentListener;
17
18 import org.opentrafficsim.base.Identifiable;
19 import org.opentrafficsim.core.gtu.GTU;
20 import org.opentrafficsim.core.network.Link;
21 import org.opentrafficsim.core.network.Node;
22 import org.opentrafficsim.core.network.OTSNetwork;
23
24 import nl.tudelft.simulation.dsol.animation.Locatable;
25
26
27
28
29
30
31
32
33
34
35
36 public class OTSSearchPanel extends JPanel implements ActionListener, FocusListener, DocumentListener
37 {
38
39 private static final long serialVersionUID = 20200127L;
40
41
42 private final OTSAnimationPanel otsAnimationPanel;
43
44
45 private final JComboBox<ObjectKind<?>> typeToSearch;
46
47
48 private final JTextField idTextField;
49
50
51 private final JCheckBox trackObject;
52
53
54
55
56
57 public OTSSearchPanel(final OTSAnimationPanel otsAnimationPanel)
58 {
59 this.otsAnimationPanel = otsAnimationPanel;
60 this.setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
61 this.add(new JLabel(" "));
62 this.add(new JLabel(OTSControlPanel.loadIcon("/View.png")));
63 ObjectKind<?>[] objectKinds = new ObjectKind[] { new ObjectKind<GTU>("GTU")
64 {
65 @Override
66 GTU searchNetwork(final OTSNetwork network, final String id)
67 {
68 return network.getGTU(id);
69 }
70 }, new ObjectKind<Node>("Node")
71 {
72 @Override
73 Node searchNetwork(final OTSNetwork network, final String id)
74 {
75 return network.getNode(id);
76 }
77 }, new ObjectKind<Link>("Link")
78 {
79 @Override
80 Link searchNetwork(final OTSNetwork network, final String id)
81 {
82 return network.getLink(id);
83 }
84 } };
85 this.typeToSearch = new JComboBox<ObjectKind<?>>(objectKinds);
86 this.add(this.typeToSearch);
87
88
89 class AppearanceControlTextField extends JTextField implements AppearanceControl
90 {
91
92 private static final long serialVersionUID = 20180207L;
93
94
95 @Override
96 public boolean isForeground()
97 {
98 return false;
99 }
100
101
102 @Override
103 public boolean isBackground()
104 {
105 return false;
106 }
107
108
109 @Override
110 public String toString()
111 {
112 return "AppearanceControlLabel []";
113 }
114 }
115
116 this.idTextField = new AppearanceControlTextField();
117 this.idTextField.setPreferredSize(new Dimension(100, 0));
118 this.add(this.idTextField);
119 this.trackObject = new JCheckBox("track");
120 this.add(this.trackObject);
121 this.trackObject.setActionCommand("Tracking status changed");
122 this.idTextField.setActionCommand("Id changed");
123 this.typeToSearch.setActionCommand("Type changed");
124 this.trackObject.addActionListener(this);
125 this.idTextField.addActionListener(this);
126 this.typeToSearch.addActionListener(this);
127 this.idTextField.addFocusListener(this);
128 this.idTextField.getDocument().addDocumentListener(this);
129 }
130
131
132
133
134
135
136
137 public void selectAndTrackObject(final String objectKey, final String id, final boolean track)
138 {
139 for (int index = this.typeToSearch.getItemCount(); --index >= 0;)
140 {
141 if (this.typeToSearch.getItemAt(index).getKey().equals(objectKey))
142 {
143 this.typeToSearch.setSelectedIndex(index);
144 }
145 }
146 this.trackObject.setSelected(track);
147 this.idTextField.setText(id);
148 actionPerformed(null);
149 }
150
151
152 @Override
153 public void actionPerformed(final ActionEvent e)
154 {
155 this.otsAnimationPanel.setAutoPan(this.idTextField.getText(), (ObjectKind<?>) this.typeToSearch.getSelectedItem(),
156 this.trackObject.isSelected());
157 }
158
159
160 @Override
161 public final void focusGained(final FocusEvent e)
162 {
163 actionPerformed(null);
164 }
165
166
167 @Override
168 public final void focusLost(final FocusEvent e)
169 {
170
171 }
172
173
174 @Override
175 public final void insertUpdate(final DocumentEvent e)
176 {
177 actionPerformed(null);
178 }
179
180
181 @Override
182 public final void removeUpdate(final DocumentEvent e)
183 {
184 actionPerformed(null);
185 }
186
187
188 @Override
189 public final void changedUpdate(final DocumentEvent e)
190 {
191 actionPerformed(null);
192 }
193
194
195
196
197
198 abstract static class ObjectKind<T extends Locatable & Identifiable>
199 {
200
201 private final String key;
202
203
204
205
206
207 ObjectKind(final String key)
208 {
209 this.key = key;
210 }
211
212
213
214
215
216 public Object getKey()
217 {
218 return this.key;
219 }
220
221
222
223
224
225
226
227 abstract T searchNetwork(OTSNetwork network, String id);
228
229
230
231
232 @Override
233 public String toString()
234 {
235 return this.key;
236 }
237 }
238 }