001    // License: GPL. For details, see LICENSE file.
002    package org.openstreetmap.josm.gui.widgets;
003    
004    import java.awt.BorderLayout;
005    import java.awt.Font;
006    import java.text.MessageFormat;
007    
008    import javax.swing.JEditorPane;
009    import javax.swing.JPanel;
010    import javax.swing.UIManager;
011    import javax.swing.text.html.HTMLEditorKit;
012    import javax.swing.text.html.StyleSheet;
013    
014    /**
015     * This panel can be used to display larger sections of formatted text in
016     * HTML.
017     *
018     * It displays HTML text in the same font as {@link JLabel}. Hyperlinks are rendered in
019     * blue and they are underlined. There is also a CSS rule for the HTML tag <strong>
020     * configured.
021     *
022     */
023    public class HtmlPanel extends JPanel {
024        private JEditorPane jepMessage;
025    
026        protected void build() {
027            setLayout(new BorderLayout());
028            jepMessage = new JEditorPane("text/html", "");
029            jepMessage.setOpaque(false);
030            jepMessage.setEditable(false);
031            Font f = UIManager.getFont("Label.font");
032            StyleSheet ss = new StyleSheet();
033            String rule = MessageFormat.format(
034                    "font-family: ''{0}'';font-size: {1,number}pt; font-weight: {2}; font-style: {3}",
035                    f.getName(),
036                    f.getSize(),
037                    f.isBold() ? "bold" : "normal",
038                            f.isItalic() ? "italic" : "normal"
039            );
040            rule = "body {" + rule + "}";
041            rule = MessageFormat.format(
042                    "font-family: ''{0}'';font-size: {1,number}pt; font-weight: {2}; font-style: {3}",
043                    f.getName(),
044                    f.getSize(),
045                    "bold",
046                    f.isItalic() ? "italic" : "normal"
047            );
048            rule = "strong {" + rule + "}";
049            ss.addRule(rule);
050            ss.addRule("a {text-decoration: underline; color: blue}");
051            ss.addRule("ul {margin-left: 1cm; list-style-type: disc}");
052            HTMLEditorKit kit = new HTMLEditorKit();
053            kit.setStyleSheet(ss);
054            jepMessage.setEditorKit(kit);
055    
056            add(jepMessage, BorderLayout.CENTER);
057        }
058    
059        public HtmlPanel() {
060            build();
061        }
062    
063        public HtmlPanel(String text) {
064            this();
065            setText(text);
066        }
067    
068        /**
069         * Replies the editor pane used internally to render the HTML text.
070         *
071         * @return the editor pane used internally to render the HTML text.
072         */
073        public JEditorPane getEditorPane() {
074            return jepMessage;
075        }
076    
077        /**
078         * Sets the current text to display. <code>text</code> is a html fragment.
079         * If null, empty string is assumed.
080         *
081         * @param text the text to display
082         */
083        public void setText(String text) {
084            if (text == null) {
085                text = "";
086            }
087            jepMessage.setText(text);
088        }
089    }