// License: GPL. For details, see Readme.txt file. package org.openstreetmap.gui.jmapviewer; import static org.openstreetmap.gui.jmapviewer.FeatureAdapter.tr; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Image; import java.awt.Point; import java.awt.Rectangle; import java.awt.font.TextAttribute; import java.awt.geom.Rectangle2D; import java.awt.image.ImageObserver; import java.util.HashMap; import org.openstreetmap.gui.jmapviewer.interfaces.Attributed; import org.openstreetmap.gui.jmapviewer.interfaces.ICoordinate; public class AttributionSupport { private Attributed source; private Image attrImage; private String attrTermsText; private String attrTermsUrl; public static final Font ATTR_FONT = new Font("Arial", Font.PLAIN, 10); public static final Font ATTR_LINK_FONT; protected Rectangle attrTextBounds; protected Rectangle attrToUBounds; protected Rectangle attrImageBounds; static { HashMap<TextAttribute, Integer> aUnderline = new HashMap<>(); aUnderline.put(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON); ATTR_LINK_FONT = ATTR_FONT.deriveFont(aUnderline); } public void initialize(Attributed source) { this.source = source; boolean requireAttr = source.requiresAttribution(); if (requireAttr) { attrImage = source.getAttributionImage(); attrTermsText = source.getTermsOfUseText(); attrTermsUrl = source.getTermsOfUseURL(); if (attrTermsUrl != null && attrTermsText == null) { attrTermsText = tr("Background Terms of Use"); } } else { attrImage = null; attrTermsUrl = null; } } public void paintAttribution(Graphics g, int width, int height, ICoordinate topLeft, ICoordinate bottomRight, int zoom, ImageObserver observer) { if (source == null || !source.requiresAttribution()) { attrToUBounds = null; attrImageBounds = null; attrTextBounds = null; return; } // Draw attribution Font font = g.getFont(); g.setFont(ATTR_LINK_FONT); // Draw terms of use text int termsTextHeight = 0; int termsTextY = height; if (attrTermsText != null) { Rectangle2D termsStringBounds = g.getFontMetrics().getStringBounds(attrTermsText, g); int textRealHeight = (int) termsStringBounds.getHeight(); termsTextHeight = textRealHeight - 5; int termsTextWidth = (int) termsStringBounds.getWidth(); termsTextY = height - termsTextHeight; int x = 2; int y = height - termsTextHeight; attrToUBounds = new Rectangle(x, y-termsTextHeight, termsTextWidth, textRealHeight); g.setColor(Color.black); g.drawString(attrTermsText, x + 1, y + 1); g.setColor(Color.white); g.drawString(attrTermsText, x, y); } else { attrToUBounds = null; } // Draw attribution logo if (attrImage != null) { int x = 2; int imgWidth = attrImage.getWidth(observer); int imgHeight = attrImage.getHeight(observer); int y = termsTextY - imgHeight - termsTextHeight - 5; attrImageBounds = new Rectangle(x, y, imgWidth, imgHeight); g.drawImage(attrImage, x, y, null); } else { attrImageBounds = null; } g.setFont(ATTR_FONT); String attributionText = source.getAttributionText(zoom, topLeft, bottomRight); if (attributionText != null) { Rectangle2D stringBounds = g.getFontMetrics().getStringBounds(attributionText, g); int textHeight = (int) stringBounds.getHeight() - 5; int x = width - (int) stringBounds.getWidth(); int y = height - textHeight; g.setColor(Color.black); g.drawString(attributionText, x + 1, y + 1); g.setColor(Color.white); g.drawString(attributionText, x, y); attrTextBounds = new Rectangle(x, y-textHeight, (int) stringBounds.getWidth(), (int) stringBounds.getHeight()); } else { attrTextBounds = null; } g.setFont(font); } public boolean handleAttributionCursor(Point p) { if (attrTextBounds != null && attrTextBounds.contains(p)) { return true; } else if (attrImageBounds != null && attrImageBounds.contains(p)) { return true; } else if (attrToUBounds != null && attrToUBounds.contains(p)) { return true; } return false; } public boolean handleAttribution(Point p, boolean click) { if (source == null || !source.requiresAttribution()) return false; if (attrTextBounds != null && attrTextBounds.contains(p)) { String attributionURL = source.getAttributionLinkURL(); if (attributionURL != null) { if (click) { FeatureAdapter.openLink(attributionURL); } return true; } } else if (attrImageBounds != null && attrImageBounds.contains(p)) { String attributionImageURL = source.getAttributionImageURL(); if (attributionImageURL != null) { if (click) { FeatureAdapter.openLink(source.getAttributionImageURL()); } return true; } } else if (attrToUBounds != null && attrToUBounds.contains(p)) { String termsOfUseURL = source.getTermsOfUseURL(); if (termsOfUseURL != null) { if (click) { FeatureAdapter.openLink(termsOfUseURL); } return true; } } return false; } }