1 /* 2 * Copyright (c) 1997, 2019, 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.ContentBuilder; 36 import jdk.javadoc.internal.doclets.formats.html.markup.Entity; 37 import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; 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.formats.html.markup.Table; 41 import jdk.javadoc.internal.doclets.formats.html.markup.TableHeader; 42 import jdk.javadoc.internal.doclets.toolkit.Content; 43 import jdk.javadoc.internal.doclets.toolkit.FieldWriter; 44 import jdk.javadoc.internal.doclets.toolkit.MemberSummaryWriter; 45 46 /** 47 * Writes field documentation in HTML format. 48 * 49 * <p><b>This is NOT part of any supported API. 50 * If you write code that depends on this, you do so at your own risk. 51 * This code and its internal interfaces are subject to change or 52 * deletion without notice.</b> 53 * 54 * @author Robert Field 55 * @author Atul M Dambalkar 56 * @author Jamie Ho (rewrite) 57 * @author Bhavesh Patel (Modified) 58 */ 59 public class FieldWriterImpl extends AbstractMemberWriter 60 implements FieldWriter, MemberSummaryWriter { 61 62 public FieldWriterImpl(SubWriterHolderWriter writer, TypeElement typeElement) { 63 super(writer, typeElement); 64 } 65 66 public FieldWriterImpl(SubWriterHolderWriter writer) { 67 super(writer); 68 } 69 70 /** 71 * {@inheritDoc} 72 */ 73 @Override 74 public Content getMemberSummaryHeader(TypeElement typeElement, 75 Content memberSummaryTree) { 76 memberSummaryTree.add(MarkerComments.START_OF_FIELD_SUMMARY); 77 Content memberTree = new ContentBuilder(); 78 writer.addSummaryHeader(this, typeElement, memberTree); 79 return memberTree; 80 } 81 82 /** 83 * {@inheritDoc} 84 */ 85 @Override 86 public void addMemberTree(Content memberSummaryTree, Content memberTree) { 87 writer.addMemberTree(HtmlStyle.fieldSummary, memberSummaryTree, memberTree); 88 } 89 90 /** 91 * {@inheritDoc} 92 */ 93 @Override 94 public Content getFieldDetailsTreeHeader(TypeElement typeElement, Content memberDetailsTree) { 95 memberDetailsTree.add(MarkerComments.START_OF_FIELD_DETAILS); 96 Content fieldDetailsTree = new ContentBuilder(); 97 Content heading = HtmlTree.HEADING(Headings.TypeDeclaration.DETAILS_HEADING, 98 contents.fieldDetailsLabel); 99 fieldDetailsTree.add(heading); 100 fieldDetailsTree.add(links.createAnchor( 101 SectionName.FIELD_DETAIL)); 102 return fieldDetailsTree; 103 } 104 105 /** 106 * {@inheritDoc} 107 */ 108 @Override 109 public Content getFieldDocTreeHeader(VariableElement field, Content fieldDetailsTree) { 110 Content fieldTree = new ContentBuilder(); 111 Content heading = new HtmlTree(Headings.TypeDeclaration.MEMBER_HEADING); 112 heading.add(name(field)); 113 fieldTree.add(heading); 114 fieldTree.add(links.createAnchor(name(field))); 115 return HtmlTree.SECTION(HtmlStyle.detail, fieldTree); 116 } 117 118 /** 119 * {@inheritDoc} 120 */ 121 @Override 122 public Content getSignature(VariableElement field) { 123 MemberSignature sig = new MemberSignature(field); 124 sig.addType(field.asType()); 125 sig.addName(field); 126 return sig.toContent(); 127 } 128 129 /** 130 * {@inheritDoc} 131 */ 132 @Override 133 public void addDeprecated(VariableElement field, Content fieldTree) { 134 addDeprecatedInfo(field, fieldTree); 135 } 136 137 /** 138 * {@inheritDoc} 139 */ 140 @Override 141 public void addComments(VariableElement field, Content fieldTree) { 142 if (!utils.getFullBody(field).isEmpty()) { 143 writer.addInlineComment(field, fieldTree); 144 } 145 } 146 147 /** 148 * {@inheritDoc} 149 */ 150 @Override 151 public void addTags(VariableElement field, Content fieldTree) { 152 writer.addTagsInfo(field, fieldTree); 153 } 154 155 /** 156 * {@inheritDoc} 157 */ 158 @Override 159 public Content getFieldDetails(Content fieldDetailsTreeHeader, Content fieldDetailsTree) { 160 Content fieldDetails = new ContentBuilder(fieldDetailsTreeHeader, fieldDetailsTree); 161 return getMemberTree(HtmlTree.SECTION(HtmlStyle.fieldDetails, fieldDetails)); 162 } 163 164 /** 165 * {@inheritDoc} 166 */ 167 @Override 168 public Content getFieldDoc(Content fieldTree, 169 boolean isLastContent) { 170 return getMemberTree(fieldTree, isLastContent); 171 } 172 173 /** 174 * {@inheritDoc} 175 */ 176 @Override 177 public void addSummaryLabel(Content memberTree) { 178 Content label = HtmlTree.HEADING(Headings.TypeDeclaration.SUMMARY_HEADING, 179 contents.fieldSummaryLabel); 180 memberTree.add(label); 181 } 182 183 /** 184 * {@inheritDoc} 185 */ 186 @Override 187 public TableHeader getSummaryTableHeader(Element member) { 188 return new TableHeader(contents.modifierAndTypeLabel, contents.fieldLabel, 189 contents.descriptionLabel); 190 } 191 192 @Override 193 protected Table createSummaryTable() { 194 List<HtmlStyle> bodyRowStyles = Arrays.asList(HtmlStyle.colFirst, HtmlStyle.colSecond, 195 HtmlStyle.colLast); 196 197 return new Table(HtmlStyle.memberSummary) 198 .setCaption(contents.fields) 199 .setHeader(getSummaryTableHeader(typeElement)) 200 .setRowScopeColumn(1) 201 .setColumnStyles(bodyRowStyles); 202 } 203 204 /** 205 * {@inheritDoc} 206 */ 207 @Override 208 public void addSummaryAnchor(TypeElement typeElement, Content memberTree) { 209 memberTree.add(links.createAnchor( 210 SectionName.FIELD_SUMMARY)); 211 } 212 213 /** 214 * {@inheritDoc} 215 */ 216 @Override 217 public void addInheritedSummaryAnchor(TypeElement typeElement, Content inheritedTree) { 218 inheritedTree.add(links.createAnchor( 219 SectionName.FIELDS_INHERITANCE, configuration.getClassName(typeElement))); 220 } 221 222 /** 223 * {@inheritDoc} 224 */ 225 @Override 226 public void addInheritedSummaryLabel(TypeElement typeElement, Content inheritedTree) { 227 Content classLink = writer.getPreQualifiedClassLink( 228 LinkInfoImpl.Kind.MEMBER, typeElement, false); 229 Content label; 230 if (configuration.summarizeOverriddenMethods) { 231 label = new StringContent(utils.isClass(typeElement) 232 ? resources.getText("doclet.Fields_Declared_In_Class") 233 : resources.getText("doclet.Fields_Declared_In_Interface")); 234 } else { 235 label = new StringContent(utils.isClass(typeElement) 236 ? resources.getText("doclet.Fields_Inherited_From_Class") 237 : resources.getText("doclet.Fields_Inherited_From_Interface")); 238 } 239 Content labelHeading = HtmlTree.HEADING(Headings.TypeDeclaration.INHERITED_SUMMARY_HEADING, 240 label); 241 labelHeading.add(Entity.NO_BREAK_SPACE); 242 labelHeading.add(classLink); 243 inheritedTree.add(labelHeading); 244 } 245 246 /** 247 * {@inheritDoc} 248 */ 249 @Override 250 protected void addSummaryLink(LinkInfoImpl.Kind context, TypeElement typeElement, Element member, 251 Content tdSummary) { 252 Content memberLink = HtmlTree.SPAN(HtmlStyle.memberNameLink, 253 writer.getDocLink(context, typeElement , member, name(member), false)); 254 Content code = HtmlTree.CODE(memberLink); 255 tdSummary.add(code); 256 } 257 258 /** 259 * {@inheritDoc} 260 */ 261 @Override 262 protected void addInheritedSummaryLink(TypeElement typeElement, Element member, Content linksTree) { 263 linksTree.add( 264 writer.getDocLink(LinkInfoImpl.Kind.MEMBER, typeElement, member, 265 name(member), false)); 266 } 267 268 /** 269 * {@inheritDoc} 270 */ 271 @Override 272 protected void addSummaryType(Element member, Content tdSummaryType) { 273 addModifierAndType(member, member.asType(), tdSummaryType); 274 } 275 276 /** 277 * {@inheritDoc} 278 */ 279 @Override 280 protected Content getDeprecatedLink(Element member) { 281 String name = utils.getFullyQualifiedName(member) + "." + member.getSimpleName(); 282 return writer.getDocLink(LinkInfoImpl.Kind.MEMBER, member, name); 283 } 284 285 @Override 286 public Content getMemberTreeHeader(){ 287 return writer.getMemberTreeHeader(); 288 } 289 } --- EOF ---