source: osm/applications/editors/josm/plugins/public_transport_layer/src/ptl/PublicTransportLayer.java@ 33528

Last change on this file since 33528 was 33528, checked in by donvip, 7 years ago

fix deprecation warnings

File size: 6.2 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package ptl;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.BasicStroke;
7import java.awt.Color;
8import java.awt.Graphics2D;
9import java.awt.event.ActionEvent;
10import java.util.Collection;
11import java.util.TreeSet;
12
13import javax.swing.AbstractAction;
14import javax.swing.Action;
15import javax.swing.Icon;
16
17import org.openstreetmap.josm.actions.JosmAction;
18import org.openstreetmap.josm.data.Bounds;
19import org.openstreetmap.josm.data.osm.Node;
20import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
21import org.openstreetmap.josm.data.osm.Relation;
22import org.openstreetmap.josm.data.osm.RelationMember;
23import org.openstreetmap.josm.data.osm.Way;
24import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
25import org.openstreetmap.josm.data.osm.visitor.paint.StyledMapRenderer;
26import org.openstreetmap.josm.gui.MainApplication;
27import org.openstreetmap.josm.gui.MapView;
28import org.openstreetmap.josm.gui.layer.Layer;
29import org.openstreetmap.josm.gui.mappaint.Cascade;
30import org.openstreetmap.josm.gui.mappaint.Environment;
31import org.openstreetmap.josm.gui.mappaint.MultiCascade;
32import org.openstreetmap.josm.gui.mappaint.StyleKeys;
33import org.openstreetmap.josm.gui.mappaint.styleelement.TextLabel;
34import org.openstreetmap.josm.gui.mappaint.styleelement.placement.OnLineStrategy;
35import org.openstreetmap.josm.tools.ColorHelper;
36import org.openstreetmap.josm.tools.ImageProvider;
37import org.openstreetmap.josm.tools.Logging;
38import org.openstreetmap.josm.tools.MultiMap;
39import org.openstreetmap.josm.tools.Pair;
40import org.openstreetmap.josm.tools.Utils;
41
42public class PublicTransportLayer extends Layer {
43 private static final ImageProvider ICON = new ImageProvider("presets/misc", "route");
44 private boolean doDrawArrows = true;
45 private boolean doDrawRefLabels = true;
46
47 public PublicTransportLayer() {
48 super(tr("Public transport routes"));
49 }
50
51 @Override
52 public void paint(Graphics2D g, MapView mv, Bounds box) {
53 if (mv == null || mv.getLayerManager().getEditLayer() == null || mv.getLayerManager().getEditLayer().data.selectionEmpty()) {
54 return;
55 }
56 final StyledMapRenderer renderer = new StyledMapRenderer(g, mv, false);
57 renderer.getSettings(false);
58
59 final Collection<Relation> selectedRelations = mv.getLayerManager().getEditLayer().data.getSelectedRelations();
60 final MultiMap<Pair<Node, Node>, String> segmentRefs = new MultiMap<>();
61 for (final Relation relation : selectedRelations) {
62 if (relation.isIncomplete() || relation.hasIncompleteMembers()
63 || !relation.hasTag("type", "route") || !relation.hasTag("public_transport:version", "2")) {
64 continue;
65 }
66
67 final Way way = new Way();
68 Node previousNode = null;
69 for (final RelationMember member : relation.getMembers()) {
70 if (OsmPrimitiveType.NODE.equals(member.getType()) && "stop".equals(member.getRole())) {
71 way.addNode(member.getNode());
72 if (previousNode != null) {
73 segmentRefs.put(Pair.create(previousNode, member.getNode()), relation.get("ref"));
74 }
75 previousNode = member.getNode();
76 }
77 }
78
79 Color color = Color.GREEN;
80 try {
81 color = ColorHelper.html2color(relation.get("colour"));
82 } catch (RuntimeException ignore) {
83 Logging.trace(ignore);
84 }
85 renderer.drawWay(way, color, new BasicStroke(1), null, null, 0, doDrawArrows, false, false, false);
86 }
87
88 if (doDrawRefLabels) {
89 drawRefLabels(renderer, segmentRefs);
90 }
91 }
92
93 protected void drawRefLabels(StyledMapRenderer renderer, MultiMap<Pair<Node, Node>, String> segmentRefs) {
94 Environment env = new Environment();
95 env.mc = new MultiCascade();
96 Cascade c = env.mc.getOrCreateCascade("default");
97 c.put(StyleKeys.FONT_FAMILY, "SansSerif");
98 c.put(StyleKeys.FONT_SIZE, 16);
99 Color color = new Color(0x80FFFFFF, true);
100
101 for (Pair<Node, Node> nodePair : segmentRefs.keySet()) {
102 final String label = Utils.join(tr(", "), new TreeSet<>(segmentRefs.get(nodePair)));
103 c.put(StyleKeys.TEXT, label);
104 final TextLabel text = TextLabel.create(env, color, false);
105 final Way way = new Way();
106 way.addNode(nodePair.a);
107 way.addNode(nodePair.b);
108 renderer.drawText(way, text, OnLineStrategy.INSTANCE);
109 }
110 }
111
112 @Override
113 public Icon getIcon() {
114 return ICON.setMaxSize(ImageProvider.ImageSizes.LAYER).get();
115 }
116
117 @Override
118 public String getToolTipText() {
119 return "";
120 }
121
122 @Override
123 public void mergeFrom(Layer from) {
124 }
125
126 @Override
127 public boolean isMergable(Layer other) {
128 return false;
129 }
130
131 @Override
132 public void visitBoundingBox(BoundingXYVisitor v) {
133 }
134
135 @Override
136 public Object getInfoComponent() {
137 return null;
138 }
139
140 @Override
141 public Action[] getMenuEntries() {
142 return new Action[]{
143 new AbstractAction(tr("Toggle direction arrows")) {
144 @Override
145 public void actionPerformed(ActionEvent e) {
146 doDrawArrows = !doDrawArrows;
147 MainApplication.getMap().repaint();
148 }
149 },
150 new AbstractAction(tr("Toggle reference labels")) {
151 @Override
152 public void actionPerformed(ActionEvent e) {
153 doDrawRefLabels = !doDrawRefLabels;
154 MainApplication.getMap().repaint();
155 }
156 }
157 };
158 }
159
160 public static class AddLayerAction extends JosmAction {
161 public AddLayerAction() {
162 super(tr("Visualize public transport routes"), ICON, tr("Displays stops of selected public transport routes as graph"),
163 null, false, null, false);
164 }
165
166 @Override
167 public void actionPerformed(ActionEvent e) {
168 MainApplication.getLayerManager().addLayer(new PublicTransportLayer());
169 }
170 }
171}
172
Note: See TracBrowser for help on using the repository browser.