// BlogBridge -- RSS feed reader, manager, and web based service
// Copyright (C) 2002-2006 by R. Pito Salas
//
// This program is free software; you can redistribute it and/or modify it under
// the terms of the GNU General Public License as published by the Free Software Foundation;
// either version 2 of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License along with this program;
// if not, write to the Free Software Foundation, Inc., 59 Temple Place,
// Suite 330, Boston, MA 02111-1307 USA
//
// Contact: R. Pito Salas
// mailto:pitosalas@users.sourceforge.net
// More information: about BlogBridge
// http://www.blogbridge.com
// http://sourceforge.net/projects/blogbridge
//
// $Id: LinkLabel.java,v 1.15 2007/09/26 11:04:03 spyromus Exp $
//
package com.salas.bb.utils.uif;
import com.salas.bb.core.GlobalController;
import com.salas.bb.core.GlobalModel;
import com.salas.bb.domain.prefs.UserPreferences;
import com.salas.bb.utils.BrowserLauncher;
import com.salas.bb.utils.Constants;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.net.MalformedURLException;
import java.net.URL;
/**
* LinkLabel is label which holds the link to somewhere.
*/
public class LinkLabel extends JLabel
{
/** The color the link is highlighted. */
public static final Color HIGHLIGHT_COLOR = Color.BLUE;
private URL link;
private Color originalForeground;
private boolean highlightLink;
/**
* Creates pure link label without link.
*/
public LinkLabel()
{
this(null);
}
/**
* Creates pure link label without link.
*
* @param text text to put.
*/
public LinkLabel(String text)
{
this(text, null);
}
/**
* Creates pure link label without link.
*
* @param text text to put.
* @param link the link.
*/
public LinkLabel(String text, String link)
{
super(text);
setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
enableEvents(AWTEvent.MOUSE_EVENT_MASK);
originalForeground = getForeground();
highlightLink = false;
try
{
setLink(new URL(link));
} catch (MalformedURLException e)
{
// Not a problem
}
super.setForeground(LinkLabel.HIGHLIGHT_COLOR);
}
/**
* Intercepts the call and saves foreground.
*
* @param fg color.
*/
public void setForeground(Color fg)
{
super.setForeground(fg);
originalForeground = fg;
}
/**
* Returns link of current label.
*
* @return URL
*/
public URL getLink()
{
return link;
}
/**
* Binds this label to new link.
*
* @param aLink new link URL.
*/
public void setLink(URL aLink)
{
this.link = aLink;
highlightLink = ((aLink != null) &&
!(Constants.EMPTY_STRING.equals(aLink.toString().trim())));
String fullLink = aLink != null ? aLink.toString() : Constants.EMPTY_STRING;
setToolTipText(fullLink);
}
/**
* Sets the highlight link flag.
*
* @param high <code>TRUE</code> to highlight link.
*/
public void setHighlightLink(boolean high)
{
highlightLink = high;
if (high) super.setForeground(originalForeground);
}
/**
* Returns status to be displayed.
*
* @return status.
*/
protected String getStatus()
{
return link == null ? null : link.toString();
}
/**
* Handles the event.
*
* @param e event.
*/
protected void processMouseEvent(MouseEvent e)
{
super.processMouseEvent(e);
switch (e.getID())
{
case MouseEvent.MOUSE_CLICKED:
if (e.getClickCount() == 1 && e.getButton() == MouseEvent.BUTTON1)
{
doAction();
}
break;
case MouseEvent.MOUSE_ENTERED:
if (highlightLink)
{
super.setForeground(HIGHLIGHT_COLOR);
GlobalController.SINGLETON.setHoveredHyperLink(link);
}
break;
case MouseEvent.MOUSE_EXITED:
if (highlightLink)
{
super.setForeground(originalForeground);
GlobalController.SINGLETON.setHoveredHyperLink(null);
}
break;
}
}
/**
* Invoked when user clicks on the link.
*/
protected void doAction()
{
URL aLink = getLink();
UserPreferences prefs = GlobalModel.SINGLETON.getUserPreferences();
if (aLink != null) BrowserLauncher.showDocument(aLink, prefs.getInternetBrowser());
}
/**
* Creates a label that does something different than the default action
* (opening the browser window) when clicked.
*
* @param text text.
* @param action action to invoke.
*
* @return label.
*/
public static LinkLabel create(String text, final Action action)
{
LinkLabel link = new LinkLabel(text)
{
@Override
protected void doAction()
{
action.actionPerformed(null);
}
};
link.setHighlightLink(true);
return link;
}
}