source: josm/src/org/openstreetmap/josm/gui/layer/markerlayer/MarkerLayer.java@ 200

Last change on this file since 200 was 200, checked in by imi, 17 years ago
  • new MarkerLayer code from Frederik. Supports Audio, Image and WebMarker (links)
File size: 5.8 KB
Line 
1package org.openstreetmap.josm.gui.layer.markerlayer;
2
3import static org.openstreetmap.josm.tools.I18n.tr;
4import static org.openstreetmap.josm.tools.I18n.trn;
5
6import java.awt.Color;
7import java.awt.Component;
8import java.awt.Graphics;
9import java.awt.Point;
10import java.awt.event.ActionEvent;
11import java.awt.event.ActionListener;
12import java.awt.event.MouseAdapter;
13import java.awt.event.MouseEvent;
14import java.io.File;
15import java.util.Collection;
16
17import javax.swing.Icon;
18import javax.swing.JColorChooser;
19import javax.swing.JMenuItem;
20import javax.swing.JOptionPane;
21import javax.swing.JSeparator;
22import javax.swing.SwingUtilities;
23
24import org.openstreetmap.josm.Main;
25import org.openstreetmap.josm.actions.RenameLayerAction;
26import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
27import org.openstreetmap.josm.gui.MapView;
28import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
29import org.openstreetmap.josm.gui.dialogs.LayerListDialog;
30import org.openstreetmap.josm.gui.dialogs.LayerListPopup;
31import org.openstreetmap.josm.gui.layer.Layer;
32import org.openstreetmap.josm.tools.ColorHelper;
33import org.openstreetmap.josm.tools.ImageProvider;
34
35/**
36 * A layer holding markers.
37 *
38 * Markers are GPS points with a name and, optionally, a symbol code attached;
39 * marker layers can be created from waypoints when importing raw GPS data,
40 * but they may also come from other sources.
41 *
42 * The symbol code is for future use.
43 *
44 * The data is read only.
45 */
46public class MarkerLayer extends Layer {
47
48 /**
49 * A list of markers.
50 */
51 public final Collection<Marker> data;
52 private boolean mousePressed = false;
53
54 public MarkerLayer(Collection<Marker> indata, String name, File associatedFile) {
55 super(name);
56 this.associatedFile = associatedFile;
57 this.data = indata;
58
59 SwingUtilities.invokeLater(new Runnable(){
60 public void run() {
61 Main.map.mapView.addMouseListener(new MouseAdapter() {
62 @Override public void mousePressed(MouseEvent e) {
63 if (e.getButton() != MouseEvent.BUTTON1)
64 return;
65 mousePressed = true;
66 if (visible)
67 Main.map.mapView.repaint();
68 }
69 @Override public void mouseReleased(MouseEvent ev) {
70 if (ev.getButton() != MouseEvent.BUTTON1)
71 return;
72 mousePressed = false;
73 if (!visible)
74 return;
75 if (ev.getPoint() != null) {
76 for (Marker mkr : data) {
77 if (mkr.containsPoint(ev.getPoint()))
78 mkr.actionPerformed(new ActionEvent(this, 0, null));
79 }
80 }
81 Main.map.mapView.repaint();
82 }
83 });
84
85 Main.map.mapView.addLayerChangeListener(new LayerChangeListener(){
86 public void activeLayerChange(Layer oldLayer, Layer newLayer) {}
87 public void layerAdded(Layer newLayer) {}
88 public void layerRemoved(Layer oldLayer) {
89 Main.pref.listener.remove(MarkerLayer.this);
90 }
91 });
92 }
93 });
94 }
95
96 /**
97 * Return a static icon.
98 */
99 @Override public Icon getIcon() {
100 return ImageProvider.get("layer", "marker");
101 }
102
103 @Override public void paint(Graphics g, MapView mv) {
104 boolean mousePressedTmp = mousePressed;
105 Point mousePos = mv.getMousePosition();
106 String mkrCol = Main.pref.get("color.gps marker");
107 String mkrColSpecial = Main.pref.get("color.layer "+name);
108 String mkrTextShow = Main.pref.get("marker.show "+name, "show");
109
110 if (!mkrColSpecial.equals(""))
111 g.setColor(ColorHelper.html2color(mkrColSpecial));
112 else if (!mkrCol.equals(""))
113 g.setColor(ColorHelper.html2color(mkrCol));
114 else
115 g.setColor(Color.GRAY);
116
117 for (Marker mkr : data) {
118 if (mousePos != null && mkr.containsPoint(mousePos)) {
119 mkr.paint(g, mv, mousePressedTmp, mkrTextShow);
120 mousePressedTmp = false;
121 } else {
122 mkr.paint(g, mv, false, mkrTextShow);
123 }
124 }
125 }
126
127 @Override public String getToolTipText() {
128 return data.size()+" "+trn("marker", "markers", data.size());
129 }
130
131 @Override public void mergeFrom(Layer from) {
132 MarkerLayer layer = (MarkerLayer)from;
133 data.addAll(layer.data);
134 }
135
136 @Override public boolean isMergable(Layer other) {
137 return other instanceof MarkerLayer;
138 }
139
140 @Override public void visitBoundingBox(BoundingXYVisitor v) {
141 for (Marker mkr : data)
142 v.visit(mkr.eastNorth);
143 }
144
145 @Override public Object getInfoComponent() {
146 return "<html>"+trn("{0} consists of {1} marker", "{0} consists of {1} markers", data.size(), name, data.size()) + "</html>";
147 }
148
149 @Override public Component[] getMenuEntries() {
150 JMenuItem color = new JMenuItem(tr("Customize Color"), ImageProvider.get("colorchooser"));
151 color.addActionListener(new ActionListener(){
152 public void actionPerformed(ActionEvent e) {
153 String col = Main.pref.get("color.layer "+name, Main.pref.get("color.gps marker", ColorHelper.color2html(Color.gray)));
154 JColorChooser c = new JColorChooser(ColorHelper.html2color(col));
155 Object[] options = new Object[]{tr("OK"), tr("Cancel"), tr("Default")};
156 int answer = JOptionPane.showOptionDialog(Main.parent, c, tr("Choose a color"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE, null, options, options[0]);
157 switch (answer) {
158 case 0:
159 Main.pref.put("color.layer "+name, ColorHelper.color2html(c.getColor()));
160 break;
161 case 1:
162 return;
163 case 2:
164 Main.pref.put("color.layer "+name, null);
165 break;
166 }
167 Main.map.repaint();
168 }
169 });
170
171 return new Component[] {
172 new JMenuItem(new LayerListDialog.ShowHideLayerAction(this)),
173 new JMenuItem(new LayerListDialog.ShowHideMarkerText(this)),
174 new JMenuItem(new LayerListDialog.DeleteLayerAction(this)),
175 new JSeparator(),
176 color,
177 new JMenuItem(new RenameLayerAction(associatedFile, this)),
178 new JSeparator(),
179 new JMenuItem(new LayerListPopup.InfoAction(this))
180 };
181 }
182}
Note: See TracBrowser for help on using the repository browser.