1 /* 2 * Copyright (c) 1997, 2016, 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 26 package jdk.javadoc.internal.doclets.formats.html; 27 28 import java.io.*; 29 import java.util.Arrays; 30 import java.util.List; 31 32 import javax.lang.model.element.Element; 33 import javax.lang.model.element.TypeElement; 34 import javax.lang.model.element.VariableElement; 35 36 import jdk.javadoc.internal.doclets.formats.html.markup.HtmlConstants; 37 import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; 38 import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTag; 39 import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; 40 import jdk.javadoc.internal.doclets.formats.html.markup.StringContent; 41 import jdk.javadoc.internal.doclets.toolkit.Content; 42 import jdk.javadoc.internal.doclets.toolkit.FieldWriter; 43 import jdk.javadoc.internal.doclets.toolkit.MemberSummaryWriter; 44 45 /** 46 * Writes field documentation in HTML format. 47 * 48 * <p><b>This is NOT part of any supported API. 49 * If you write code that depends on this, you do so at your own risk. 50 * This code and its internal interfaces are subject to change or 51 * deletion without notice.</b> 52 * 53 * @author Robert Field 54 * @author Atul M Dambalkar 55 * @author Jamie Ho (rewrite) 56 * @author Bhavesh Patel (Modified) 57 */ 58 public class FieldWriterImpl extends AbstractMemberWriter 59 implements FieldWriter, MemberSummaryWriter { 60 61 public FieldWriterImpl(SubWriterHolderWriter writer, TypeElement typeElement) { 62 super(writer, typeElement); 63 } 64 65 public FieldWriterImpl(SubWriterHolderWriter writer) { 66 super(writer); 67 } 68 69 /** 70 * {@inheritDoc} 71 */ 72 @Override 73 public Content getMemberSummaryHeader(TypeElement typeElement, 74 Content memberSummaryTree) { 75 memberSummaryTree.addContent(HtmlConstants.START_OF_FIELD_SUMMARY); 76 Content memberTree = writer.getMemberTreeHeader(); 77 writer.addSummaryHeader(this, typeElement, memberTree); 78 return memberTree; 79 } 80 81 /** 82 * {@inheritDoc} 83 */ 84 public void addMemberTree(Content memberSummaryTree, Content memberTree) { 85 writer.addMemberTree(memberSummaryTree, memberTree); 86 } 87 88 /** 89 * {@inheritDoc} 90 */ 91 @Override 92 public Content getFieldDetailsTreeHeader(TypeElement typeElement, Content memberDetailsTree) { 93 memberDetailsTree.addContent(HtmlConstants.START_OF_FIELD_DETAILS); 94 Content fieldDetailsTree = writer.getMemberTreeHeader(); 95 fieldDetailsTree.addContent(writer.getMarkerAnchor( 96 SectionName.FIELD_DETAIL)); 97 Content heading = HtmlTree.HEADING(HtmlConstants.DETAILS_HEADING, 98 writer.fieldDetailsLabel); 99 fieldDetailsTree.addContent(heading); 100 return fieldDetailsTree; 101 } 102 103 /** 104 * {@inheritDoc} 105 */ 106 @Override 107 public Content getFieldDocTreeHeader(VariableElement field, Content fieldDetailsTree) { 108 fieldDetailsTree.addContent(writer.getMarkerAnchor(name(field))); 109 Content fieldTree = writer.getMemberTreeHeader(); 110 Content heading = new HtmlTree(HtmlConstants.MEMBER_HEADING); 111 heading.addContent(name(field)); 112 fieldTree.addContent(heading); 113 return fieldTree; 114 } 115 116 /** 117 * {@inheritDoc} 118 */ 119 @Override 120 public Content getSignature(VariableElement field) { 121 Content pre = new HtmlTree(HtmlTag.PRE); 122 writer.addAnnotationInfo(field, pre); 123 addModifiers(field, pre); 124 Content fieldlink = writer.getLink(new LinkInfoImpl( 125 configuration, LinkInfoImpl.Kind.MEMBER, field.asType())); 126 pre.addContent(fieldlink); 127 pre.addContent(" "); 128 if (configuration.linksource) { 129 Content fieldName = new StringContent(name(field)); 130 writer.addSrcLink(field, fieldName, pre); 131 } else { 132 addName(name(field), pre); 133 } 134 return pre; 135 } 136 137 /** 138 * {@inheritDoc} 139 */ 140 @Override 141 public void addDeprecated(VariableElement field, Content fieldTree) { 142 addDeprecatedInfo(field, fieldTree); 143 } 144 145 /** 146 * {@inheritDoc} 147 */ 148 @Override 149 public void addComments(VariableElement field, Content fieldTree) { 150 if (!utils.getBody(field).isEmpty()) { 151 writer.addInlineComment(field, fieldTree); 152 } 153 } 154 155 /** 156 * {@inheritDoc} 157 */ 158 @Override 159 public void addTags(VariableElement field, Content fieldTree) { 160 writer.addTagsInfo(field, fieldTree); 161 } 162 163 /** 164 * {@inheritDoc} 165 */ 166 @Override 167 public Content getFieldDetails(Content fieldDetailsTree) { 168 if (configuration.allowTag(HtmlTag.SECTION)) { 169 HtmlTree htmlTree = HtmlTree.SECTION(getMemberTree(fieldDetailsTree)); 170 return htmlTree; 171 } 172 return getMemberTree(fieldDetailsTree); 173 } 174 175 /** 176 * {@inheritDoc} 177 */ 178 @Override 179 public Content getFieldDoc(Content fieldTree, 180 boolean isLastContent) { 181 return getMemberTree(fieldTree, isLastContent); 182 } 183 184 /** 185 * Close the writer. 186 */ 187 @Override 188 public void close() throws IOException { 189 writer.close(); 190 } 191 192 /** 193 * {@inheritDoc} 194 */ 195 @Override 196 public void addSummaryLabel(Content memberTree) { 197 Content label = HtmlTree.HEADING(HtmlConstants.SUMMARY_HEADING, 198 writer.getResource("doclet.Field_Summary")); 199 memberTree.addContent(label); 200 } 201 202 /** 203 * {@inheritDoc} 204 */ 205 @Override 206 public String getTableSummary() { 207 return configuration.getText("doclet.Member_Table_Summary", 208 configuration.getText("doclet.Field_Summary"), 209 configuration.getText("doclet.fields")); 210 } 211 212 /** 213 * {@inheritDoc} 214 */ 215 @Override 216 public Content getCaption() { 217 return configuration.getResource("doclet.Fields"); 218 } 219 220 /** 221 * {@inheritDoc} 222 */ 223 @Override 224 public List<String> getSummaryTableHeader(Element member) { 225 List<String> header = Arrays.asList(writer.getModifierTypeHeader(), 226 configuration.getText("doclet.0_and_1", 227 configuration.getText("doclet.Field"), 228 configuration.getText("doclet.Description"))); 229 return header; 230 } 231 232 /** 233 * {@inheritDoc} 234 */ 235 @Override 236 public void addSummaryAnchor(TypeElement typeElement, Content memberTree) { 237 memberTree.addContent(writer.getMarkerAnchor( 238 SectionName.FIELD_SUMMARY)); 239 } 240 241 /** 242 * {@inheritDoc} 243 */ 244 @Override 245 public void addInheritedSummaryAnchor(TypeElement typeElement, Content inheritedTree) { 246 inheritedTree.addContent(writer.getMarkerAnchor( 247 SectionName.FIELDS_INHERITANCE, configuration.getClassName(typeElement))); 248 } 249 250 /** 251 * {@inheritDoc} 252 */ 253 @Override 254 public void addInheritedSummaryLabel(TypeElement typeElement, Content inheritedTree) { 255 Content classLink = writer.getPreQualifiedClassLink( 256 LinkInfoImpl.Kind.MEMBER, typeElement, false); 257 Content label = new StringContent(utils.isClass(typeElement) 258 ? configuration.getText("doclet.Fields_Inherited_From_Class") 259 : configuration.getText("doclet.Fields_Inherited_From_Interface")); 260 Content labelHeading = HtmlTree.HEADING(HtmlConstants.INHERITED_SUMMARY_HEADING, 261 label); 262 labelHeading.addContent(writer.getSpace()); 263 labelHeading.addContent(classLink); 264 inheritedTree.addContent(labelHeading); 265 } 266 267 /** 268 * {@inheritDoc} 269 */ 270 @Override 271 protected void addSummaryLink(LinkInfoImpl.Kind context, TypeElement typeElement, Element member, 272 Content tdSummary) { 273 Content memberLink = HtmlTree.SPAN(HtmlStyle.memberNameLink, 274 writer.getDocLink(context, typeElement , member, name(member), false)); 275 Content code = HtmlTree.CODE(memberLink); 276 tdSummary.addContent(code); 277 } 278 279 /** 280 * {@inheritDoc} 281 */ 282 @Override 283 protected void addInheritedSummaryLink(TypeElement typeElement, Element member, Content linksTree) { 284 linksTree.addContent( 285 writer.getDocLink(LinkInfoImpl.Kind.MEMBER, typeElement, member, 286 name(member), false)); 287 } 288 289 /** 290 * {@inheritDoc} 291 */ 292 @Override 293 protected void addSummaryType(Element member, Content tdSummaryType) { 294 addModifierAndType(member, member.asType(), tdSummaryType); 295 } 296 297 /** 298 * {@inheritDoc} 299 */ 300 @Override 301 protected Content getDeprecatedLink(Element member) { 302 String name = utils.getFullyQualifiedName(member) + "." + member.getSimpleName(); 303 return writer.getDocLink(LinkInfoImpl.Kind.MEMBER, member, name); 304 } 305 306 /** 307 * {@inheritDoc} 308 */ 309 @Override 310 protected Content getNavSummaryLink(TypeElement typeElement, boolean link) { 311 if (link) { 312 if (typeElement == null) { 313 return writer.getHyperLink( 314 SectionName.FIELD_SUMMARY, 315 writer.getResource("doclet.navField")); 316 } else { 317 return writer.getHyperLink( 318 SectionName.FIELDS_INHERITANCE, 319 configuration.getClassName(typeElement), writer.getResource("doclet.navField")); 320 } 321 } else { 322 return writer.getResource("doclet.navField"); 323 } 324 } 325 326 /** 327 * {@inheritDoc} 328 */ 329 @Override 330 protected void addNavDetailLink(boolean link, Content liNav) { 331 if (link) { 332 liNav.addContent(writer.getHyperLink( 333 SectionName.FIELD_DETAIL, 334 writer.getResource("doclet.navField"))); 335 } else { 336 liNav.addContent(writer.getResource("doclet.navField")); 337 } 338 } 339 }