001 // License: GPL. Copyright 2007 by Immanuel Scholz and others
002 package org.openstreetmap.josm.tools;
003
004 import java.awt.Cursor;
005 import java.awt.event.MouseEvent;
006 import java.awt.event.MouseListener;
007 import javax.swing.JLabel;
008 import javax.swing.SwingUtilities;
009 import static org.openstreetmap.josm.tools.I18n.tr;
010
011 /**
012 * Label that contains a clickable link.
013 * @author Imi
014 * 5050: Simplifications by Zverikk included by akks
015 */
016 public class UrlLabel extends JLabel implements MouseListener {
017
018 private String url = "";
019 private String description = "";
020 private int fontPlus;
021
022 public UrlLabel() {
023 addMouseListener(this);
024 setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
025 }
026
027 public UrlLabel(String url) {
028 this (url, url, 0);
029 }
030
031 public UrlLabel(String url, int fontPlus) {
032 this (url, url, fontPlus);
033 }
034
035 public UrlLabel(String url, String description) {
036 this (url, url, 0);
037 }
038
039 public UrlLabel(String url, String description, int fontPlus) {
040 this();
041 setUrl(url);
042 setDescription(description);
043 this.fontPlus = fontPlus;
044 if (fontPlus!=0) setFont(getFont().deriveFont(0, getFont().getSize()+fontPlus));
045 refresh();
046 }
047
048 protected void refresh() {
049 if (url != null) {
050 setText("<html><a href=\""+url+"\">"+description+"</a></html>");
051 setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
052 setToolTipText(String.format("<html>%s<br/>%s</html>", url, tr("Right click = copy to clipboard")));
053 } else {
054 setText("<html>" + description + "</html>");
055 setCursor(null);
056 setToolTipText(null);
057 }
058 }
059
060 /**
061 * Sets the URL to be visited if the user clicks on this URL label. If null, the
062 * label turns into a normal label without hyperlink.
063 *
064 * @param url the url. Can be null.
065 */
066 public void setUrl(String url) {
067 this.url = url;
068 refresh();
069 }
070
071 /**
072 * Sets the text part of the URL label. Defaults to the empty string if description is null.
073 *
074 * @param description the description
075 */
076 public void setDescription(String description) {
077 this.description = description == null? "" : description;
078 this.description = this.description.replace("&", "&").replace(">", ">").replace("<", "<");
079 refresh();
080 }
081
082 @Override
083 public void mouseClicked(MouseEvent e) {
084 if( SwingUtilities.isLeftMouseButton(e) ) {
085 OpenBrowser.displayUrl(url);
086 } else if( SwingUtilities.isRightMouseButton(e) ) {
087 Utils.copyToClipboard(url);
088 }
089 }
090 @Override
091 public void mousePressed(MouseEvent e) { }
092 @Override
093 public void mouseEntered(MouseEvent e) { }
094 @Override
095 public void mouseExited(MouseEvent e) { }
096 @Override
097 public void mouseReleased(MouseEvent e) { }
098
099 }