source: josm/trunk/src/org/openstreetmap/josm/gui/layer/markerlayer/ButtonMarker.java@ 13475

Last change on this file since 13475 was 13475, checked in by Don-vip, 6 years ago

fix #16030 - call getMousePosition() only when needed

  • Property svn:eol-style set to native
File size: 2.8 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.layer.markerlayer;
3
4import java.awt.Graphics;
5import java.awt.Insets;
6import java.awt.Point;
7import java.awt.Rectangle;
8
9import javax.swing.BorderFactory;
10import javax.swing.border.BevelBorder;
11import javax.swing.border.Border;
12
13import org.openstreetmap.josm.data.coor.LatLon;
14import org.openstreetmap.josm.gui.MainApplication;
15import org.openstreetmap.josm.gui.MapView;
16import org.openstreetmap.josm.spi.preferences.Config;
17import org.openstreetmap.josm.tools.template_engine.TemplateEngineDataProvider;
18
19/**
20 * Marker class with button look-and-feel.
21 *
22 * @author Frederik Ramm
23 *
24 */
25public class ButtonMarker extends Marker {
26
27 private final Rectangle buttonRectangle;
28
29 public ButtonMarker(LatLon ll, String buttonImage, MarkerLayer parentLayer, double time, double offset) {
30 super(ll, "", buttonImage, parentLayer, time, offset);
31 buttonRectangle = new Rectangle(0, 0, symbol.getIconWidth(), symbol.getIconHeight());
32 }
33
34 public ButtonMarker(LatLon ll, TemplateEngineDataProvider dataProvider, String buttonImage, MarkerLayer parentLayer, double time,
35 double offset) {
36 super(ll, dataProvider, buttonImage, parentLayer, time, offset);
37 buttonRectangle = new Rectangle(0, 0, symbol.getIconWidth(), symbol.getIconHeight());
38 }
39
40 @Override public boolean containsPoint(Point p) {
41 Point screen = MainApplication.getMap().mapView.getPoint(this);
42 buttonRectangle.setLocation(screen.x+4, screen.y+2);
43 return buttonRectangle.contains(p);
44 }
45
46 @Override public void paint(Graphics g, MapView mv, boolean mousePressed, boolean showTextOrIcon) {
47 if (!showTextOrIcon) {
48 super.paint(g, mv, mousePressed, showTextOrIcon);
49 return;
50 }
51 Point screen = mv.getPoint(this);
52 buttonRectangle.setLocation(screen.x+4, screen.y+2);
53 paintIcon(mv, g, screen.x+4, screen.y+2);
54 boolean lowered = false;
55 if (mousePressed) {
56 Point mousePosition = mv.getMousePosition(); // slow and can throw NPE, see JDK-6840067
57 // mouse is inside the window
58 lowered = mousePosition != null && containsPoint(mousePosition);
59 }
60 Border b = BorderFactory.createBevelBorder(lowered ? BevelBorder.LOWERED : BevelBorder.RAISED);
61 Insets inset = b.getBorderInsets(mv);
62 Rectangle r = new Rectangle(buttonRectangle);
63 r.grow((inset.top+inset.bottom)/2, (inset.left+inset.right)/2);
64 b.paintBorder(mv, g, r.x, r.y, r.width, r.height);
65
66 String labelText = getText();
67 if (labelText != null && Config.getPref().getBoolean("marker.buttonlabels", true)) {
68 g.drawString(labelText, screen.x+4, screen.y+2);
69 }
70 }
71}
Note: See TracBrowser for help on using the repository browser.