| 1 | package net.oni2.swingcomponents;
 | 
|---|
| 2 | 
 | 
|---|
| 3 | import java.awt.Color;
 | 
|---|
| 4 | import java.awt.Desktop;
 | 
|---|
| 5 | import java.awt.Font;
 | 
|---|
| 6 | import java.io.IOException;
 | 
|---|
| 7 | import java.net.URISyntaxException;
 | 
|---|
| 8 | 
 | 
|---|
| 9 | import javax.swing.JEditorPane;
 | 
|---|
| 10 | import javax.swing.JFrame;
 | 
|---|
| 11 | import javax.swing.JLabel;
 | 
|---|
| 12 | import javax.swing.UIDefaults;
 | 
|---|
| 13 | import javax.swing.border.Border;
 | 
|---|
| 14 | import javax.swing.event.HyperlinkEvent;
 | 
|---|
| 15 | import javax.swing.event.HyperlinkListener;
 | 
|---|
| 16 | import javax.swing.text.DefaultCaret;
 | 
|---|
| 17 | import javax.swing.text.html.HTMLEditorKit;
 | 
|---|
| 18 | import javax.swing.text.html.StyleSheet;
 | 
|---|
| 19 | 
 | 
|---|
| 20 | /**
 | 
|---|
| 21 |  * @author Christian Illy
 | 
|---|
| 22 |  */
 | 
|---|
| 23 | public class HTMLLinkLabel extends JEditorPane {
 | 
|---|
| 24 |         private static final long serialVersionUID = 2416829757362043910L;
 | 
|---|
| 25 | 
 | 
|---|
| 26 |         private String prefix;
 | 
|---|
| 27 |         private String suffix;
 | 
|---|
| 28 | 
 | 
|---|
| 29 |         private boolean borderEnabled = true;
 | 
|---|
| 30 | 
 | 
|---|
| 31 |         /**
 | 
|---|
| 32 |          * Create a new HTMLLinkLabel
 | 
|---|
| 33 |          */
 | 
|---|
| 34 |         public HTMLLinkLabel() {
 | 
|---|
| 35 |                 super();
 | 
|---|
| 36 | 
 | 
|---|
| 37 |                 ((DefaultCaret) this.getCaret())
 | 
|---|
| 38 |                                 .setUpdatePolicy(DefaultCaret.NEVER_UPDATE);
 | 
|---|
| 39 | 
 | 
|---|
| 40 |                 setContentType("text/html");
 | 
|---|
| 41 | 
 | 
|---|
| 42 |                 HTMLEditorKit hek = (HTMLEditorKit) getEditorKit();
 | 
|---|
| 43 |                 StyleSheet css = hek.getStyleSheet();
 | 
|---|
| 44 |                 css.removeStyle("p");
 | 
|---|
| 45 | 
 | 
|---|
| 46 |                 Font font = new JLabel().getFont();
 | 
|---|
| 47 | 
 | 
|---|
| 48 |                 StringBuffer style = new StringBuffer("font-family:" + font.getFamily()
 | 
|---|
| 49 |                                 + ";");
 | 
|---|
| 50 |                 style.append("font-weight:" + (font.isBold() ? "bold" : "normal") + ";");
 | 
|---|
| 51 |                 style.append("font-size:" + font.getSize() + "pt;");
 | 
|---|
| 52 |                 style.append("margin: 0; padding: 0;");
 | 
|---|
| 53 | 
 | 
|---|
| 54 |                 prefix = "<html><body style=\"" + style + "\">";
 | 
|---|
| 55 |                 suffix = "</body></html>";
 | 
|---|
| 56 | 
 | 
|---|
| 57 |                 addHyperlinkListener(new HyperlinkListener() {
 | 
|---|
| 58 | 
 | 
|---|
| 59 |                         @Override
 | 
|---|
| 60 |                         public void hyperlinkUpdate(HyperlinkEvent e) {
 | 
|---|
| 61 |                                 if (e.getEventType().equals(HyperlinkEvent.EventType.ACTIVATED))
 | 
|---|
| 62 |                                         try {
 | 
|---|
| 63 |                                                 Desktop.getDesktop().browse(e.getURL().toURI());
 | 
|---|
| 64 |                                         } catch (IOException e1) {
 | 
|---|
| 65 |                                                 e1.printStackTrace();
 | 
|---|
| 66 |                                         } catch (URISyntaxException e1) {
 | 
|---|
| 67 |                                                 e1.printStackTrace();
 | 
|---|
| 68 |                                         }
 | 
|---|
| 69 |                         }
 | 
|---|
| 70 |                 });
 | 
|---|
| 71 |                 setEditable(false);
 | 
|---|
| 72 | 
 | 
|---|
| 73 |                 Color bgColor = ColorCopy.copyColor(new JFrame().getBackground());
 | 
|---|
| 74 |                 UIDefaults defaults = new UIDefaults();
 | 
|---|
| 75 |                 defaults.put("EditorPane[Enabled].backgroundPainter", bgColor);
 | 
|---|
| 76 |                 putClientProperty("Nimbus.Overrides", defaults);
 | 
|---|
| 77 |                 putClientProperty("Nimbus.Overrides.InheritDefaults", true);
 | 
|---|
| 78 |                 setBackground(bgColor);
 | 
|---|
| 79 |         }
 | 
|---|
| 80 | 
 | 
|---|
| 81 |         /**
 | 
|---|
| 82 |          * Allow or forbid to set a non-null border
 | 
|---|
| 83 |          * 
 | 
|---|
| 84 |          * @param enable
 | 
|---|
| 85 |          *            Non-null border allowed?
 | 
|---|
| 86 |          */
 | 
|---|
| 87 |         public void enableBorder(boolean enable) {
 | 
|---|
| 88 |                 this.borderEnabled = enable;
 | 
|---|
| 89 |                 if (!enable)
 | 
|---|
| 90 |                         setBorder(null);
 | 
|---|
| 91 |         }
 | 
|---|
| 92 | 
 | 
|---|
| 93 |         @Override
 | 
|---|
| 94 |         public void setBorder(Border border) {
 | 
|---|
| 95 |                 if (borderEnabled || border == null)
 | 
|---|
| 96 |                         super.setBorder(border);
 | 
|---|
| 97 |         }
 | 
|---|
| 98 | 
 | 
|---|
| 99 |         @Override
 | 
|---|
| 100 |         public void setText(String t) {
 | 
|---|
| 101 |                 super.setText(prefix + t + suffix);
 | 
|---|
| 102 |         }
 | 
|---|
| 103 | 
 | 
|---|
| 104 | }
 | 
|---|