001    // License: GPL. Copyright 2007 by Immanuel Scholz and others
002    package org.openstreetmap.josm.gui.layer.markerlayer;
003    
004    import java.awt.Graphics;
005    import java.awt.Insets;
006    import java.awt.Point;
007    import java.awt.Rectangle;
008    
009    import javax.swing.BorderFactory;
010    import javax.swing.border.BevelBorder;
011    import javax.swing.border.Border;
012    
013    import org.openstreetmap.josm.Main;
014    import org.openstreetmap.josm.data.coor.LatLon;
015    import org.openstreetmap.josm.gui.MapView;
016    import org.openstreetmap.josm.tools.template_engine.TemplateEngineDataProvider;
017    
018    /**
019     * Marker class with button look-and-feel.
020     *
021     * @author Frederik Ramm <frederik@remote.org>
022     *
023     */
024    public class ButtonMarker extends Marker {
025    
026        private 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, double offset) {
034            super(ll, dataProvider, buttonImage, parentLayer, time, offset);
035            buttonRectangle = new Rectangle(0, 0, symbol.getIconWidth(), symbol.getIconHeight());
036        }
037    
038        @Override public boolean containsPoint(Point p) {
039            Point screen = Main.map.mapView.getPoint(getEastNorth());
040            buttonRectangle.setLocation(screen.x+4, screen.y+2);
041            return buttonRectangle.contains(p);
042        }
043    
044        @Override public void paint(Graphics g, MapView mv, boolean mousePressed, boolean showTextOrIcon) {
045            if (!showTextOrIcon) {
046                super.paint(g, mv, mousePressed, showTextOrIcon);
047                return;
048            }
049            Point screen = mv.getPoint(getEastNorth());
050            buttonRectangle.setLocation(screen.x+4, screen.y+2);
051            symbol.paintIcon(mv, g, screen.x+4, screen.y+2);
052            Border b;
053            Point mousePosition = mv.getMousePosition();
054    
055            // mouse is inside the window
056            if (mousePosition != null && mousePressed && containsPoint(mousePosition)) {
057                b = BorderFactory.createBevelBorder(BevelBorder.LOWERED);
058            } else {
059                b = BorderFactory.createBevelBorder(BevelBorder.RAISED);
060            }
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 != null) && showTextOrIcon && Main.pref.getBoolean("marker.buttonlabels", true)) {
068                g.drawString(labelText, screen.x+4, screen.y+2);
069            }
070        }
071    }