1 | // License: GPL. Copyright 2007 by Immanuel Scholz and others
|
---|
2 | package org.openstreetmap.josm.gui.layer.markerlayer;
|
---|
3 |
|
---|
4 | import static org.openstreetmap.josm.tools.I18n.tr;
|
---|
5 | import static org.openstreetmap.josm.tools.I18n.trn;
|
---|
6 |
|
---|
7 | import java.awt.Color;
|
---|
8 | import java.awt.Component;
|
---|
9 | import java.awt.Graphics;
|
---|
10 | import java.awt.Point;
|
---|
11 | import java.awt.event.ActionEvent;
|
---|
12 | import java.awt.event.ActionListener;
|
---|
13 | import java.awt.event.MouseAdapter;
|
---|
14 | import java.awt.event.MouseEvent;
|
---|
15 | import java.io.File;
|
---|
16 | import java.util.Collection;
|
---|
17 |
|
---|
18 | import javax.swing.Icon;
|
---|
19 | import javax.swing.JColorChooser;
|
---|
20 | import javax.swing.JMenuItem;
|
---|
21 | import javax.swing.JOptionPane;
|
---|
22 | import javax.swing.JSeparator;
|
---|
23 | import javax.swing.SwingUtilities;
|
---|
24 |
|
---|
25 | import org.openstreetmap.josm.Main;
|
---|
26 | import org.openstreetmap.josm.actions.RenameLayerAction;
|
---|
27 | import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
|
---|
28 | import org.openstreetmap.josm.gui.MapView;
|
---|
29 | import org.openstreetmap.josm.gui.dialogs.LayerListDialog;
|
---|
30 | import org.openstreetmap.josm.gui.dialogs.LayerListPopup;
|
---|
31 | import org.openstreetmap.josm.gui.layer.Layer;
|
---|
32 | import org.openstreetmap.josm.tools.ColorHelper;
|
---|
33 | import 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 | */
|
---|
46 | public 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 | });
|
---|
86 | }
|
---|
87 |
|
---|
88 | /**
|
---|
89 | * Return a static icon.
|
---|
90 | */
|
---|
91 | @Override public Icon getIcon() {
|
---|
92 | return ImageProvider.get("layer", "marker_small");
|
---|
93 | }
|
---|
94 |
|
---|
95 | @Override public void paint(Graphics g, MapView mv) {
|
---|
96 | boolean mousePressedTmp = mousePressed;
|
---|
97 | Point mousePos = mv.getMousePosition();
|
---|
98 | String mkrCol = Main.pref.get("color.gps marker");
|
---|
99 | String mkrColSpecial = Main.pref.get("color.layer "+name);
|
---|
100 | String mkrTextShow = Main.pref.get("marker.show "+name, "show");
|
---|
101 |
|
---|
102 | if (!mkrColSpecial.equals(""))
|
---|
103 | g.setColor(ColorHelper.html2color(mkrColSpecial));
|
---|
104 | else if (!mkrCol.equals(""))
|
---|
105 | g.setColor(ColorHelper.html2color(mkrCol));
|
---|
106 | else
|
---|
107 | g.setColor(Color.GRAY);
|
---|
108 |
|
---|
109 | for (Marker mkr : data) {
|
---|
110 | if (mousePos != null && mkr.containsPoint(mousePos)) {
|
---|
111 | mkr.paint(g, mv, mousePressedTmp, mkrTextShow);
|
---|
112 | mousePressedTmp = false;
|
---|
113 | } else {
|
---|
114 | mkr.paint(g, mv, false, mkrTextShow);
|
---|
115 | }
|
---|
116 | }
|
---|
117 | }
|
---|
118 |
|
---|
119 | @Override public String getToolTipText() {
|
---|
120 | return data.size()+" "+trn("marker", "markers", data.size());
|
---|
121 | }
|
---|
122 |
|
---|
123 | @Override public void mergeFrom(Layer from) {
|
---|
124 | MarkerLayer layer = (MarkerLayer)from;
|
---|
125 | data.addAll(layer.data);
|
---|
126 | }
|
---|
127 |
|
---|
128 | @Override public boolean isMergable(Layer other) {
|
---|
129 | return other instanceof MarkerLayer;
|
---|
130 | }
|
---|
131 |
|
---|
132 | @Override public void visitBoundingBox(BoundingXYVisitor v) {
|
---|
133 | for (Marker mkr : data)
|
---|
134 | v.visit(mkr.eastNorth);
|
---|
135 | }
|
---|
136 |
|
---|
137 | @Override public Object getInfoComponent() {
|
---|
138 | return "<html>"+trn("{0} consists of {1} marker", "{0} consists of {1} markers", data.size(), name, data.size()) + "</html>";
|
---|
139 | }
|
---|
140 |
|
---|
141 | @Override public Component[] getMenuEntries() {
|
---|
142 | JMenuItem color = new JMenuItem(tr("Customize Color"), ImageProvider.get("colorchooser"));
|
---|
143 | color.addActionListener(new ActionListener(){
|
---|
144 | public void actionPerformed(ActionEvent e) {
|
---|
145 | String col = Main.pref.get("color.layer "+name, Main.pref.get("color.gps marker", ColorHelper.color2html(Color.gray)));
|
---|
146 | JColorChooser c = new JColorChooser(ColorHelper.html2color(col));
|
---|
147 | Object[] options = new Object[]{tr("OK"), tr("Cancel"), tr("Default")};
|
---|
148 | int answer = JOptionPane.showOptionDialog(Main.parent, c, tr("Choose a color"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE, null, options, options[0]);
|
---|
149 | switch (answer) {
|
---|
150 | case 0:
|
---|
151 | Main.pref.put("color.layer "+name, ColorHelper.color2html(c.getColor()));
|
---|
152 | break;
|
---|
153 | case 1:
|
---|
154 | return;
|
---|
155 | case 2:
|
---|
156 | Main.pref.put("color.layer "+name, null);
|
---|
157 | break;
|
---|
158 | }
|
---|
159 | Main.map.repaint();
|
---|
160 | }
|
---|
161 | });
|
---|
162 |
|
---|
163 | return new Component[] {
|
---|
164 | new JMenuItem(new LayerListDialog.ShowHideLayerAction(this)),
|
---|
165 | new JMenuItem(new LayerListDialog.ShowHideMarkerText(this)),
|
---|
166 | new JMenuItem(new LayerListDialog.DeleteLayerAction(this)),
|
---|
167 | new JSeparator(),
|
---|
168 | color,
|
---|
169 | new JMenuItem(new RenameLayerAction(associatedFile, this)),
|
---|
170 | new JSeparator(),
|
---|
171 | new JMenuItem(new LayerListPopup.InfoAction(this))
|
---|
172 | };
|
---|
173 | }
|
---|
174 | }
|
---|