001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.layer.markerlayer;
003
004import java.awt.Graphics;
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(Graphics 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}