package com.marinilli.b2.c11.util;
import javax.swing.JLabel;
import java.awt.event.*;
import java.util.*;
import java.awt.Cursor;
import java.net.URL;
import javax.swing.event.*;
/**
 * Chapter 11 - A Label that launches a browser
 * @author Mauro Marinilli
 * @version 1.0
 */
public class JNLPLabel extends JLabel implements MouseListener {
  private String text = "";
  private URL url= null;
  private static final String COLOR_BEFORE_CLICKING = "blue";
  private static final String COLOR_AFTER_CLICKING  = "purple";
  private boolean alreadyClicked = false;
  private transient Vector hListeners;

  public JNLPLabel() {
    addMouseListener(this);
  }
  public void mouseClicked(MouseEvent e) {
    alreadyClicked=true;
    java.awt.Toolkit.getDefaultToolkit().beep();
    fireHyperlinkUpdate(new HyperlinkEvent(this, HyperlinkEvent.EventType.ACTIVATED,url));
    Utilities.getBasicService().showDocument(url);
  }
  public void mousePressed(MouseEvent e) {
  }
  public void mouseReleased(MouseEvent e) {
  }
  public void mouseDragged(MouseEvent e) {
  }
  public void mouseMoved(MouseEvent e) {
  }
  public void mouseEntered(MouseEvent e) {
    if (!alreadyClicked)
      super.setText("<html><font color="+COLOR_BEFORE_CLICKING+" ><u>"+text+"</u></font>");
    else
      super.setText("<html><font color="+COLOR_AFTER_CLICKING+" ><u>"+text+"</u></font>");
    setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
  }
  public void mouseExited(MouseEvent e) {
    setText("<html><body>"+text+"");
  }
  public void setText(String txt) {
    text=txt;
      super.setText("<html><font color="+COLOR_BEFORE_CLICKING+" ><u>"+text+"</u></font>");
  }
  public void setURL(URL u) {
    url=u;
    setToolTipText("view in browser "+url);
  }
  public void setURL(String u) {
    try {
      setURL(new URL(u));
    } catch (Exception exc) {
      System.out.println(getClass()+"setURL: "+ exc);
    }
  }
  public synchronized void removeHyperlinkListener(HyperlinkListener l) {
    if (hListeners != null && hListeners.contains(l)) {
      Vector v = (Vector) hListeners.clone();
      v.removeElement(l);
      hListeners = v;
    }
  }
  public synchronized void addHyperlinkListener(HyperlinkListener l) {
    Vector v;
    if (hListeners == null)
      v = new Vector(2);
    else v = (Vector) hListeners.clone();
    if (!v.contains(l)) {
      v.addElement(l);
      hListeners = v;
    }
  }
  protected void fireHyperlinkUpdate(HyperlinkEvent e) {
    if (hListeners != null) {
      Vector listeners = hListeners;
      int count = listeners.size();
      for (int i = 0; i < count; i++) {
        ((HyperlinkListener) listeners.elementAt(i)).hyperlinkUpdate(e);
      }
    }
  }
}