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 }