/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
/*
* HyperlinkLabel.java
*
* Created on 14. Januar 2004, 11:08
*/
package Sirius.navigator.ui.widget;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.event.*;
/**
* Eine Angebotsklasse f\u00FCr die FAQ f\u00FCr das Problem: Frage: Ich m\u00F6chte in meine Swing-GUI gern JLabel
* einf\u00FCgen, die aktive Hyperlinks enthalten. Wie kann ich vorgehen? Antwort: Die untenstehende Klasse kann wie
* folgt genutzt werden
*
* @author Andreas Jaeger <jaeger@ifgi.uni-muenster.de>, Pascal
* @version $Revision$, $Date$
*/
public class HyperlinkLabel extends JLabel implements MouseListener {
//~ Static fields/initializers ---------------------------------------------
private static Color linkColor = Color.blue;
private static Color mouseOverColor = Color.magenta;
private static Border emptyBorder = BorderFactory.createEmptyBorder(0, 0, 1, 0);
private static Border mouseDownBorder = BorderFactory.createMatteBorder(0, 0, 1, 0, mouseOverColor);
//~ Instance fields --------------------------------------------------------
private final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(this.getClass());
// private JLabel label;
private URL url;
private HyperlinkListener hyperlinkListener;
private boolean dragging;
//~ Constructors -----------------------------------------------------------
/**
* Creates a new HyperlinkLabel object.
*/
public HyperlinkLabel() {
super();
this.setForeground(linkColor);
this.setBorder(emptyBorder);
this.setCursor(Cursor.getDefaultCursor());
this.addMouseListener(this);
// setLayout(new GridBagLayout());
// add(label, new GridBagConstraints());
}
/**
* Creates a new HyperlinkLabel object.
*
* @param url DOCUMENT ME!
* @param hyperlinkListener DOCUMENT ME!
*/
public HyperlinkLabel(final URL url, final HyperlinkListener hyperlinkListener) {
this();
this.setUrl(url);
this.setHyperlinkListener(hyperlinkListener);
}
//~ Methods ----------------------------------------------------------------
/**
* DOCUMENT ME!
*
* @param url DOCUMENT ME!
*/
public void setUrl(final URL url) {
this.url = url;
this.setText(url.toExternalForm());
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public URL getUrl() {
return this.url;
}
/**
* DOCUMENT ME!
*
* @param hyperlinkListener DOCUMENT ME!
*/
public void setHyperlinkListener(final HyperlinkListener hyperlinkListener) {
this.hyperlinkListener = hyperlinkListener;
}
/**
* DOCUMENT ME!
*
* @param c DOCUMENT ME!
*/
public static void setDefaultLinkColor(final Color c) {
linkColor = c;
}
/**
* DOCUMENT ME!
*
* @param c DOCUMENT ME!
*/
public static void setDefaultMouseOverColor(final Color c) {
mouseOverColor = c;
mouseDownBorder = BorderFactory.createMatteBorder(0, 0, 1, 0,
mouseOverColor);
}
@Override
public void mouseEntered(final MouseEvent e) {
this.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
this.setForeground(mouseOverColor);
if (hyperlinkListener != null) {
hyperlinkListener.hyperlinkUpdate(new HyperlinkEvent(this,
HyperlinkEvent.EventType.ENTERED, url));
}
if (dragging) {
this.setBorder(mouseDownBorder);
}
}
@Override
public void mousePressed(final MouseEvent e) {
dragging = true;
this.setBorder(mouseDownBorder);
}
@Override
public void mouseReleased(final MouseEvent e) {
this.setBorder(emptyBorder);
dragging = false;
}
@Override
public void mouseClicked(final MouseEvent e) {
if (log.isDebugEnabled()) {
log.debug("HyperlinkLabelClicked()"); // NOI18N
}
if (e.getClickCount() != 1) {
return;
}
if (hyperlinkListener != null) {
hyperlinkListener.hyperlinkUpdate(new HyperlinkEvent(this,
HyperlinkEvent.EventType.ACTIVATED, url));
}
}
@Override
public void mouseExited(final MouseEvent e) {
this.setCursor(Cursor.getDefaultCursor());
this.setForeground(linkColor);
this.setBorder(emptyBorder);
if (hyperlinkListener != null) {
hyperlinkListener.hyperlinkUpdate(new HyperlinkEvent(this,
HyperlinkEvent.EventType.EXITED, url));
}
}
}