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

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

update to JOSM 12476

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