View Javadoc

1   package com.ochafik.swing.candy;
2   
3   import java.awt.Cursor;
4   import java.awt.event.MouseAdapter;
5   import java.awt.event.MouseEvent;
6   
7   import javax.swing.JLabel;
8   
9   import com.ochafik.xml.XMLUtils;
10  
11  public class JLinkLabel extends JLabel {
12  	private static final long serialVersionUID = -2619802894792618038L;
13  	Runnable linkAction;
14  	boolean actInNewThread = false;
15  	
16  	public JLinkLabel(String text) {
17  		super(text);
18  		init(null);
19  	}
20  	
21  	public JLinkLabel(String text, int orientation) {
22  		super(text, orientation);
23  		init(null);
24  	}
25  	
26  	public JLinkLabel(String text, int orientation, Runnable linkAction) {
27  		this(text, orientation, linkAction, false);
28  	}
29  	public JLinkLabel(String text, int orientation, Runnable linkAction, boolean actInNewThread) {
30  		super(text, orientation);
31  		init(linkAction);
32  		setActInNewThread(actInNewThread);
33  	}
34  	public JLinkLabel(String text, Runnable linkAction) {
35  		this(text, linkAction, false);
36  	}
37  	public JLinkLabel(String text, Runnable linkAction, boolean actInNewThread) {
38  		super(text);
39  		init(linkAction);
40  		setActInNewThread(actInNewThread);
41  	}
42  	
43  	public void setActInNewThread(boolean actInNewThread) {
44  		this.actInNewThread = actInNewThread;
45  	}
46  	public boolean isActInNewThread() {
47  		return actInNewThread;
48  	}
49  	
50  	protected void enabledChanged() {
51  		String text = actualText;
52  		if (getLinkAction() == null) {
53  			setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
54  		} else {
55  			if (isEnabled()) {
56  				setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
57  				if (!actualText.startsWith("<html>"))
58  					text = "<html><body width='100%'><a href='#'>" + XMLUtils.escapeEntities(actualText) + "</a></body></html>";
59  				
60  			} else {
61  				setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
62  				if (!actualText.startsWith("<html>"))
63  					text = "<html><body width='100%'><u>" + XMLUtils.escapeEntities(actualText) + "</u></body></html>";
64  			}
65  		}
66  		super.setText(text);
67  		setMaximumSize(getMinimumSize());
68  	}
69  	String actualText;
70  	@Override
71  	public void setText(String text) {
72  		this.actualText = text;
73  		enabledChanged();
74  	}
75  	private void init(Runnable linkAction2) {
76  		setLinkAction(linkAction2);
77  		enabledChanged();
78  		addMouseListener(new MouseAdapter() {
79  			@Override
80  			public void mouseClicked(MouseEvent arg0) {
81  				action();
82  			}
83  			@Override
84  			public void mouseEntered(MouseEvent arg0) {
85  				if (isEnabled() && getLinkAction() != null)
86  					setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
87  				else
88  					setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
89  			}
90  		});
91  	}
92  	
93  	public boolean action() {
94  		Runnable linkAction = getLinkAction();
95  		if (!isEnabled() || linkAction == null)
96  			return false;
97  		
98  		if (isActInNewThread())
99  			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 }