// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.gui.layer.markerlayer; import java.awt.Graphics; import java.awt.Insets; import java.awt.Point; import java.awt.Rectangle; import javax.swing.BorderFactory; import javax.swing.border.BevelBorder; import javax.swing.border.Border; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.data.coor.LatLon; import org.openstreetmap.josm.gui.MapView; import org.openstreetmap.josm.tools.template_engine.TemplateEngineDataProvider; /** * Marker class with button look-and-feel. * * @author Frederik Ramm * */ public class ButtonMarker extends Marker { private final Rectangle buttonRectangle; public ButtonMarker(LatLon ll, String buttonImage, MarkerLayer parentLayer, double time, double offset) { super(ll, "", buttonImage, parentLayer, time, offset); buttonRectangle = new Rectangle(0, 0, symbol.getIconWidth(), symbol.getIconHeight()); } public ButtonMarker(LatLon ll, TemplateEngineDataProvider dataProvider, String buttonImage, MarkerLayer parentLayer, double time, double offset) { super(ll, dataProvider, buttonImage, parentLayer, time, offset); buttonRectangle = new Rectangle(0, 0, symbol.getIconWidth(), symbol.getIconHeight()); } @Override public boolean containsPoint(Point p) { Point screen = Main.map.mapView.getPoint(getEastNorth()); buttonRectangle.setLocation(screen.x+4, screen.y+2); return buttonRectangle.contains(p); } @Override public void paint(Graphics g, MapView mv, boolean mousePressed, boolean showTextOrIcon) { if (!showTextOrIcon) { super.paint(g, mv, mousePressed, showTextOrIcon); return; } Point screen = mv.getPoint(getEastNorth()); buttonRectangle.setLocation(screen.x+4, screen.y+2); paintIcon(mv, g, screen.x+4, screen.y+2); Border b; Point mousePosition = mv.getMousePosition(); // mouse is inside the window if (mousePosition != null && mousePressed && containsPoint(mousePosition)) { b = BorderFactory.createBevelBorder(BevelBorder.LOWERED); } else { b = BorderFactory.createBevelBorder(BevelBorder.RAISED); } Insets inset = b.getBorderInsets(mv); Rectangle r = new Rectangle(buttonRectangle); r.grow((inset.top+inset.bottom)/2, (inset.left+inset.right)/2); b.paintBorder(mv, g, r.x, r.y, r.width, r.height); String labelText = getText(); if (labelText != null && Main.pref.getBoolean("marker.buttonlabels", true)) { g.drawString(labelText, screen.x+4, screen.y+2); } } }