1/*
2 * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.  Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25package javax.swing.text.html;
26
27import java.awt.*;
28import java.awt.event.*;
29import java.io.*;
30import java.net.MalformedURLException;
31import java.net.URL;
32import javax.swing.text.*;
33import javax.swing.*;
34import javax.swing.border.*;
35import javax.swing.event.*;
36import java.util.*;
37
38/**
39 * CommentView subclasses HiddenTagView to contain a JTextArea showing
40 * a comment. When the textarea is edited the comment is
41 * reset. As this inherits from EditableView if the JTextComponent is
42 * not editable, the textarea will not be visible.
43 *
44 * @author  Scott Violet
45 */
46class CommentView extends HiddenTagView {
47    CommentView(Element e) {
48        super(e);
49    }
50
51    protected Component createComponent() {
52        Container host = getContainer();
53        if (host != null && !((JTextComponent)host).isEditable()) {
54            return null;
55        }
56        JTextArea ta = new JTextArea(getRepresentedText());
57        Document doc = getDocument();
58        Font font;
59        if (doc instanceof StyledDocument) {
60            font = ((StyledDocument)doc).getFont(getAttributes());
61            ta.setFont(font);
62        }
63        else {
64            font = ta.getFont();
65        }
66        updateYAlign(font);
67        ta.setBorder(CBorder);
68        ta.getDocument().addDocumentListener(this);
69        ta.setFocusable(isVisible());
70        return ta;
71    }
72
73    void resetBorder() {
74    }
75
76    /**
77     * This is subclassed to put the text on the Comment attribute of
78     * the Element's AttributeSet.
79     */
80    void _updateModelFromText() {
81        JTextComponent textC = getTextComponent();
82        Document doc = getDocument();
83        if (textC != null && doc != null) {
84            String text = textC.getText();
85            SimpleAttributeSet sas = new SimpleAttributeSet();
86            isSettingAttributes = true;
87            try {
88                sas.addAttribute(HTML.Attribute.COMMENT, text);
89                ((StyledDocument)doc).setCharacterAttributes
90                    (getStartOffset(), getEndOffset() -
91                     getStartOffset(), sas, false);
92            }
93            finally {
94                isSettingAttributes = false;
95            }
96        }
97    }
98
99    JTextComponent getTextComponent() {
100        return (JTextComponent)getComponent();
101    }
102
103    String getRepresentedText() {
104        AttributeSet as = getElement().getAttributes();
105        if (as != null) {
106            Object comment = as.getAttribute(HTML.Attribute.COMMENT);
107            if (comment instanceof String) {
108                return (String)comment;
109            }
110        }
111        return "";
112    }
113
114    static final Border CBorder = new CommentBorder();
115    static final int commentPadding = 3;
116    static final int commentPaddingD = commentPadding * 3;
117
118    @SuppressWarnings("serial") // Superclass is not serializable across versions
119    static class CommentBorder extends LineBorder {
120        CommentBorder() {
121            super(Color.black, 1);
122        }
123
124        public void paintBorder(Component c, Graphics g, int x, int y,
125                                int width, int height) {
126            super.paintBorder(c, g, x + commentPadding, y,
127                              width - commentPaddingD, height);
128        }
129
130        public Insets getBorderInsets(Component c, Insets insets) {
131            Insets retI = super.getBorderInsets(c, insets);
132
133            retI.left += commentPadding;
134            retI.right += commentPadding;
135            return retI;
136        }
137
138        public boolean isBorderOpaque() {
139            return false;
140        }
141    } // End of class CommentView.CommentBorder
142} // End of CommentView
143