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 }