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 */ 25 package javax.swing.text.html; 26 27 import java.awt.*; 28 import java.awt.event.*; 29 import java.io.*; 30 import java.net.MalformedURLException; 31 import java.net.URL; 32 import javax.swing.text.*; 33 import javax.swing.*; 34 import javax.swing.border.*; 35 import javax.swing.event.*; 36 import 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 */ 46 class 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