1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package triptracker.client.map.ui;
21
22 import static triptracker.core.Utils.getImageIcon;
23
24 import java.awt.BorderLayout;
25 import java.awt.FlowLayout;
26 import java.awt.event.ActionListener;
27 import java.awt.event.ItemListener;
28 import java.awt.event.KeyEvent;
29 import java.awt.event.MouseListener;
30 import java.io.IOException;
31 import java.util.List;
32
33 import javax.swing.BorderFactory;
34 import javax.swing.ButtonGroup;
35 import javax.swing.ImageIcon;
36 import javax.swing.JButton;
37 import javax.swing.JComboBox;
38 import javax.swing.JLabel;
39 import javax.swing.JPanel;
40 import javax.swing.JRadioButton;
41 import javax.swing.border.EtchedBorder;
42
43 import triptracker.client.net.MapSocket;
44 import triptracker.client.net.MapSocketListener;
45 import triptracker.core.ConnectionState;
46 import triptracker.core.Coordinate;
47 import triptracker.core.Route;
48 import triptracker.core.User;
49
50 @SuppressWarnings("serial")
51 public class MapViewPanel extends SuperPanel implements MapSocketListener {
52
53 private TabbedForm view;
54
55 private JPanel keyPanel;
56
57 private ButtonGroup btnGr;
58 private JRadioButton zoom;
59 private JLabel zoomLabel;
60 private JRadioButton move;
61 private JLabel moveLabel;
62 private JComboBox followBox;
63 private JButton zoomIn;
64 private JButton zoomOut;
65 private JButton resetBtn;
66
67 private JLabel connectionState;
68
69 /***
70 * The constructor creates a JPanel for the map view
71 *
72 */
73 public MapViewPanel(MapSocket model, TabbedForm view) {
74
75 this.view = view;
76
77 setLayout(new BorderLayout());
78
79 keyPanel = new JPanel();
80 keyPanel.setLayout(new FlowLayout());
81 map = new Map(model, this);
82
83 JPanel subMenu = new JPanel();
84 subMenu.setLayout(new BorderLayout());
85 subMenu.add(keyPanel, BorderLayout.WEST);
86 add(map, BorderLayout.CENTER);
87 add(subMenu, BorderLayout.SOUTH);
88
89 EtchedBorder border = (EtchedBorder)BorderFactory.createEtchedBorder();
90
91
92 String[] elements = {"Always inside", "Center on last", "Don't follow"};
93 followBox = new JComboBox(elements);
94
95
96 zoom = new JRadioButton("");
97 zoom.setMnemonic(KeyEvent.VK_Z);
98 zoom.setBorder(border);
99 zoomLabel = new JLabel(getImageIcon("viewmag.png"));
100
101 move = new JRadioButton("");
102 move.setSelected(true);
103 moveLabel = new JLabel(getImageIcon("move.png"));
104
105 JPanel btnPanel = new JPanel();
106 btnPanel.setBorder(border);
107 btnGr = new ButtonGroup();
108 btnGr.add(zoom);
109 btnGr.add(move);
110 btnPanel.add(zoom);
111 btnPanel.add(zoomLabel);
112 btnPanel.add(move);
113 btnPanel.add(moveLabel);
114
115 zoomIn = new JButton(getImageIcon("viewmag+.png"));
116 zoomIn.setMnemonic(KeyEvent.VK_PLUS);
117 zoomIn.setSize(2,2);
118 zoomOut = new JButton(getImageIcon("viewmag-.png"));
119 zoomOut.setMnemonic(KeyEvent.VK_MINUS);
120 zoomOut.setSize(2,2);
121
122 resetBtn = new JButton("Reset");
123 resetBtn.setMnemonic(KeyEvent.VK_R);
124
125 keyPanel.add(zoomIn);
126 keyPanel.add(zoomOut);
127 keyPanel.add(btnPanel);
128 keyPanel.add(followBox);
129 keyPanel.add(resetBtn);
130
131 subMenu.add(connectionState = new JLabel(), BorderLayout.EAST);
132
133
134 new MapViewController(model, this);
135 model.addListener(this);
136 }
137
138 /*** Adds listener to zoomInBtn */
139 public void addZoomInBtnListener(ActionListener listener) {
140 zoomIn.addActionListener(listener);
141 }
142 /*** Adds listener to zoomOutBtn */
143 public void addZoomOutBtnListener(ActionListener listener) {
144 zoomOut.addActionListener(listener);
145 }
146
147 public void addZoomBtnListener(MouseListener listener) {
148 zoom.addMouseListener(listener);
149 zoomLabel.addMouseListener(listener);
150 }
151
152 public void addMoveBtnListener(MouseListener listener) {
153 move.addMouseListener(listener);
154 moveLabel.addMouseListener(listener);
155 }
156
157 public void addFollowBtnListener(ItemListener listener) {
158 followBox.addItemListener(listener);
159 }
160
161 public void addResetBtnListener(ActionListener listener) {
162 resetBtn.addActionListener(listener);
163 }
164
165 /*** Asks server for coordinates to selected route */
166 public void setRoute(boolean realtime, Route route) {
167 setRoute(route);
168 this.realtime = realtime;
169
170 if (realtime){
171 map.setRealtime(realtime);
172
173 }
174 }
175
176 public void setState(String state) {
177 connectionState.setText(state);
178 }
179
180 public void setFollow(int follow){
181 map.setFollow(follow);
182 }
183
184 /*** Called from model when route is recieved from server */
185 public void routeReceived(int routeId, List<Coordinate> coords) {
186 if (coords.size() == 0){
187 setState("Recieved empty route");
188
189 return;
190 }
191
192 map.setCoordList(coords);
193 view.setRoute(coords);
194 }
195
196 /*** {@inheritDoc} */
197
198 public void connectionUpdate(ConnectionState state) {
199 switch (state){
200
201
202
203
204
205
206
207
208
209 case DISCONNECTED:
210 setState("Disconnected from server");
211 break;
212 case WATCHING:
213 map.setRealtime(false);
214 map.repaint();
215 view.setInfo();
216 setState("Route is not beeing tracked");
217 break;
218 case TRACKING:
219 map.setRealtime(true);
220 setState("Route is now beeing tracked");
221 break;
222 }
223 }
224
225 /*** Unimplemented methods from interface */
226 public void usersReceived(List<User> users) { }
227 public void routeList(List<Route> routes) { }
228 public void coordReceived(int routeId, Coordinate coord) { }
229 public void routeUpdate(int routeId, RouteState state) { }
230 public void invalidMessage(String message) { }
231 public void socketError(IOException e) { }
232 public void userReceived(User user) { }
233 public void coordsReceived(List<Coordinate> coords) { }
234
235 /*** Sets mouseKlick to zoom in on klicked position*/
236 public void setZoom() {
237 zoom.setSelected(true);
238 getMap().setZoom();
239 }
240
241 /*** Sets mouseKlick to center on selected position */
242 public void setMove() {
243 move.setSelected(true);
244 getMap().setMove();
245 }
246
247 /*** Resets map to initial state */
248 public void resetMap(){
249 map.reset();
250 }
251
252
253 }