001// License: GPL. For details, see LICENSE file. 002package org.openstreetmap.josm.gui.layer.markerlayer; 003 004import java.awt.Graphics2D; 005import java.awt.Insets; 006import java.awt.Point; 007import java.awt.Rectangle; 008 009import javax.swing.BorderFactory; 010import javax.swing.border.BevelBorder; 011import javax.swing.border.Border; 012 013import org.openstreetmap.josm.data.coor.LatLon; 014import org.openstreetmap.josm.gui.MainApplication; 015import org.openstreetmap.josm.gui.MapView; 016import org.openstreetmap.josm.spi.preferences.Config; 017import org.openstreetmap.josm.tools.template_engine.TemplateEngineDataProvider; 018 019/** 020 * Marker class with button look-and-feel. 021 * 022 * @author Frederik Ramm 023 * 024 */ 025public class ButtonMarker extends Marker { 026 027 private final Rectangle buttonRectangle; 028 029 public ButtonMarker(LatLon ll, String buttonImage, MarkerLayer parentLayer, double time, double offset) { 030 super(ll, "", buttonImage, parentLayer, time, offset); 031 buttonRectangle = new Rectangle(0, 0, symbol.getIconWidth(), symbol.getIconHeight()); 032 } 033 034 public ButtonMarker(LatLon ll, TemplateEngineDataProvider dataProvider, String buttonImage, MarkerLayer parentLayer, double time, 035 double offset) { 036 super(ll, dataProvider, buttonImage, parentLayer, time, offset); 037 buttonRectangle = new Rectangle(0, 0, symbol.getIconWidth(), symbol.getIconHeight()); 038 } 039 040 @Override public boolean containsPoint(Point p) { 041 Point screen = MainApplication.getMap().mapView.getPoint(this); 042 buttonRectangle.setLocation(screen.x+4, screen.y+2); 043 return buttonRectangle.contains(p); 044 } 045 046 @Override public void paint(Graphics2D g, MapView mv, boolean mousePressed, boolean showTextOrIcon) { 047 if (!showTextOrIcon) { 048 super.paint(g, mv, mousePressed, showTextOrIcon); 049 return; 050 } 051 Point screen = mv.getPoint(this); 052 buttonRectangle.setLocation(screen.x+4, screen.y+2); 053 paintIcon(mv, g, screen.x+4, screen.y+2); 054 boolean lowered = false; 055 if (mousePressed) { 056 Point mousePosition = mv.getMousePosition(); // slow and can throw NPE, see JDK-6840067 057 // mouse is inside the window 058 lowered = mousePosition != null && containsPoint(mousePosition); 059 } 060 Border b = BorderFactory.createBevelBorder(lowered ? BevelBorder.LOWERED : BevelBorder.RAISED); 061 Insets inset = b.getBorderInsets(mv); 062 Rectangle r = new Rectangle(buttonRectangle); 063 r.grow((inset.top+inset.bottom)/2, (inset.left+inset.right)/2); 064 b.paintBorder(mv, g, r.x, r.y, r.width, r.height); 065 066 String labelText = getText(); 067 if (!labelText.isEmpty() && Config.getPref().getBoolean("marker.buttonlabels", true)) { 068 g.drawString(labelText, screen.x+4, screen.y+2); 069 } 070 } 071}