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.Main;
014import org.openstreetmap.josm.data.coor.LatLon;
015import org.openstreetmap.josm.gui.MapView;
016import org.openstreetmap.josm.tools.template_engine.TemplateEngineDataProvider;
017
018/**
019 * Marker class with button look-and-feel.
020 *
021 * @author Frederik Ramm
022 *
023 */
024public class ButtonMarker extends Marker {
025
026    private final Rectangle buttonRectangle;
027
028    public ButtonMarker(LatLon ll, String buttonImage, MarkerLayer parentLayer, double time, double offset) {
029        super(ll, "", buttonImage, parentLayer, time, offset);
030        buttonRectangle = new Rectangle(0, 0, symbol.getIconWidth(), symbol.getIconHeight());
031    }
032
033    public ButtonMarker(LatLon ll, TemplateEngineDataProvider dataProvider, String buttonImage, MarkerLayer parentLayer, double time,
034            double offset) {
035        super(ll, dataProvider, buttonImage, parentLayer, time, offset);
036        buttonRectangle = new Rectangle(0, 0, symbol.getIconWidth(), symbol.getIconHeight());
037    }
038
039    @Override public boolean containsPoint(Point p) {
040        Point screen = Main.map.mapView.getPoint(getEastNorth());
041        buttonRectangle.setLocation(screen.x+4, screen.y+2);
042        return buttonRectangle.contains(p);
043    }
044
045    @Override public void paint(Graphics g, MapView mv, boolean mousePressed, boolean showTextOrIcon) {
046        if (!showTextOrIcon) {
047            super.paint(g, mv, mousePressed, showTextOrIcon);
048            return;
049        }
050        Point screen = mv.getPoint(getEastNorth());
051        buttonRectangle.setLocation(screen.x+4, screen.y+2);
052        paintIcon(mv, g, screen.x+4, screen.y+2);
053        Border b;
054        Point mousePosition = mv.getMousePosition();
055
056        // mouse is inside the window
057        if (mousePosition != null && mousePressed && containsPoint(mousePosition)) {
058            b = BorderFactory.createBevelBorder(BevelBorder.LOWERED);
059        } else {
060            b = BorderFactory.createBevelBorder(BevelBorder.RAISED);
061        }
062        Insets inset = b.getBorderInsets(mv);
063        Rectangle r = new Rectangle(buttonRectangle);
064        r.grow((inset.top+inset.bottom)/2, (inset.left+inset.right)/2);
065        b.paintBorder(mv, g, r.x, r.y, r.width, r.height);
066
067        String labelText = getText();
068        if (labelText != null && Main.pref.getBoolean("marker.buttonlabels", true)) {
069            g.drawString(labelText, screen.x+4, screen.y+2);
070        }
071    }
072}