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