001 package com.ochafik.swing.candy;
002
003 import java.awt.Cursor;
004 import java.awt.event.MouseAdapter;
005 import java.awt.event.MouseEvent;
006
007 import javax.swing.JLabel;
008
009 import com.ochafik.xml.XMLUtils;
010
011 public class JLinkLabel extends JLabel {
012 private static final long serialVersionUID = -2619802894792618038L;
013 Runnable linkAction;
014 boolean actInNewThread = false;
015
016 public JLinkLabel(String text) {
017 super(text);
018 init(null);
019 }
020
021 public JLinkLabel(String text, int orientation) {
022 super(text, orientation);
023 init(null);
024 }
025
026 public JLinkLabel(String text, int orientation, Runnable linkAction) {
027 this(text, orientation, linkAction, false);
028 }
029 public JLinkLabel(String text, int orientation, Runnable linkAction, boolean actInNewThread) {
030 super(text, orientation);
031 init(linkAction);
032 setActInNewThread(actInNewThread);
033 }
034 public JLinkLabel(String text, Runnable linkAction) {
035 this(text, linkAction, false);
036 }
037 public JLinkLabel(String text, Runnable linkAction, boolean actInNewThread) {
038 super(text);
039 init(linkAction);
040 setActInNewThread(actInNewThread);
041 }
042
043 public void setActInNewThread(boolean actInNewThread) {
044 this.actInNewThread = actInNewThread;
045 }
046 public boolean isActInNewThread() {
047 return actInNewThread;
048 }
049
050 protected void enabledChanged() {
051 String text = actualText;
052 if (getLinkAction() == null) {
053 setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
054 } else {
055 if (isEnabled()) {
056 setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
057 if (!actualText.startsWith("<html>"))
058 text = "<html><body width='100%'><a href='#'>" + XMLUtils.escapeEntities(actualText) + "</a></body></html>";
059
060 } else {
061 setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
062 if (!actualText.startsWith("<html>"))
063 text = "<html><body width='100%'><u>" + XMLUtils.escapeEntities(actualText) + "</u></body></html>";
064 }
065 }
066 super.setText(text);
067 setMaximumSize(getMinimumSize());
068 }
069 String actualText;
070 @Override
071 public void setText(String text) {
072 this.actualText = text;
073 enabledChanged();
074 }
075 private void init(Runnable linkAction2) {
076 setLinkAction(linkAction2);
077 enabledChanged();
078 addMouseListener(new MouseAdapter() {
079 @Override
080 public void mouseClicked(MouseEvent arg0) {
081 action();
082 }
083 @Override
084 public void mouseEntered(MouseEvent arg0) {
085 if (isEnabled() && getLinkAction() != null)
086 setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
087 else
088 setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
089 }
090 });
091 }
092
093 public boolean action() {
094 Runnable linkAction = getLinkAction();
095 if (!isEnabled() || linkAction == null)
096 return false;
097
098 if (isActInNewThread())
099 new Thread(linkAction).start();
100 else
101 linkAction.run();
102 return true;
103 }
104
105 public void setLinkAction(Runnable linkAction) {
106 this.linkAction = linkAction;
107 enabledChanged();
108 }
109 public Runnable getLinkAction() {
110 return linkAction;
111 }
112
113 }