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 return new MemberSignature(field) 124 .addType(field.asType()) 125 .toContent(); 126 } 127 128 /** 129 * {@inheritDoc} 130 */ 131 @Override 132 public void addDeprecated(VariableElement field, Content fieldTree) { 133 addDeprecatedInfo(field, fieldTree); 134 } 135 136 /** 137 * {@inheritDoc} 138 */ 139 @Override 140 public void addComments(VariableElement field, Content fieldTree) { 141 if (!utils.getFullBody(field).isEmpty()) { 142 writer.addInlineComment(field, fieldTree); 143 } 144 } 145 146 /** 147 * {@inheritDoc} 148 */ 149 @Override 150 public void addTags(VariableElement field, Content fieldTree) { 151 writer.addTagsInfo(field, fieldTree); 152 } 153 154 /** 155 * {@inheritDoc} 156 */ 157 @Override 158 public Content getFieldDetails(Content fieldDetailsTreeHeader, Content fieldDetailsTree) { 159 Content fieldDetails = new ContentBuilder(fieldDetailsTreeHeader, fieldDetailsTree); 160 return getMemberTree(HtmlTree.SECTION(HtmlStyle.fieldDetails, fieldDetails)); 161 } 162 163 /** 164 * {@inheritDoc} 165 */ 166 @Override 167 public Content getFieldDoc(Content fieldTree, 168 boolean isLastContent) { 169 return getMemberTree(fieldTree, isLastContent); 170 } 171 172 /** 173 * {@inheritDoc} 174 */ 175 @Override 176 public void addSummaryLabel(Content memberTree) { 177 Content label = HtmlTree.HEADING(Headings.TypeDeclaration.SUMMARY_HEADING, 178 contents.fieldSummaryLabel); 179 memberTree.add(label); 180 } 181 182 /** 183 * {@inheritDoc} 184 */ 185 @Override 186 public TableHeader getSummaryTableHeader(Element member) { 187 return new TableHeader(contents.modifierAndTypeLabel, contents.fieldLabel, 188 contents.descriptionLabel); 189 } 190 191 @Override 192 protected Table createSummaryTable() { 193 List<HtmlStyle> bodyRowStyles = Arrays.asList(HtmlStyle.colFirst, HtmlStyle.colSecond, 194 HtmlStyle.colLast); 195 196 return new Table(HtmlStyle.memberSummary) 197 .setCaption(contents.fields) 198 .setHeader(getSummaryTableHeader(typeElement)) 199 .setRowScopeColumn(1) 200 .setColumnStyles(bodyRowStyles); 201 } 202 203 /** 204 * {@inheritDoc} 205 */ 206 @Override 207 public void addSummaryAnchor(TypeElement typeElement, Content memberTree) { 208 memberTree.add(links.createAnchor( 209 SectionName.FIELD_SUMMARY)); 210 } 211 212 /** 213 * {@inheritDoc} 214 */ 215 @Override 216 public void addInheritedSummaryAnchor(TypeElement typeElement, Content inheritedTree) { 217 inheritedTree.add(links.createAnchor( 218 SectionName.FIELDS_INHERITANCE, configuration.getClassName(typeElement))); 219 } 220 221 /** 222 * {@inheritDoc} 223 */ 224 @Override 225 public void addInheritedSummaryLabel(TypeElement typeElement, Content inheritedTree) { 226 Content classLink = writer.getPreQualifiedClassLink( 227 LinkInfoImpl.Kind.MEMBER, typeElement, false); 228 Content label; 229 if (configuration.summarizeOverriddenMethods) { 230 label = new StringContent(utils.isClass(typeElement) 231 ? resources.getText("doclet.Fields_Declared_In_Class") 232 : resources.getText("doclet.Fields_Declared_In_Interface")); 233 } else { 234 label = new StringContent(utils.isClass(typeElement) 235 ? resources.getText("doclet.Fields_Inherited_From_Class") 236 : resources.getText("doclet.Fields_Inherited_From_Interface")); 237 } 238 Content labelHeading = HtmlTree.HEADING(Headings.TypeDeclaration.INHERITED_SUMMARY_HEADING, 239 label); 240 labelHeading.add(Entity.NO_BREAK_SPACE); 241 labelHeading.add(classLink); 242 inheritedTree.add(labelHeading); 243 } 244 245 /** 246 * {@inheritDoc} 247 */ 248 @Override 249 protected void addSummaryLink(LinkInfoImpl.Kind context, TypeElement typeElement, Element member, 250 Content tdSummary) { 251 Content memberLink = HtmlTree.SPAN(HtmlStyle.memberNameLink, 252 writer.getDocLink(context, typeElement , member, name(member), false)); 253 Content code = HtmlTree.CODE(memberLink); 254 tdSummary.add(code); 255 } 256 257 /** 258 * {@inheritDoc} 259 */ 260 @Override 261 protected void addInheritedSummaryLink(TypeElement typeElement, Element member, Content linksTree) { 262 linksTree.add( 263 writer.getDocLink(LinkInfoImpl.Kind.MEMBER, typeElement, member, 264 name(member), false)); 265 } 266 267 /** 268 * {@inheritDoc} 269 */ 270 @Override 271 protected void addSummaryType(Element member, Content tdSummaryType) { 272 addModifierAndType(member, member.asType(), tdSummaryType); 273 } 274 275 /** 276 * {@inheritDoc} 277 */ 278 @Override 279 protected Content getDeprecatedLink(Element member) { 280 String name = utils.getFullyQualifiedName(member) + "." + member.getSimpleName(); 281 return writer.getDocLink(LinkInfoImpl.Kind.MEMBER, member, name); 282 } 283 284 @Override 285 public Content getMemberTreeHeader(){ 286 return writer.getMemberTreeHeader(); 287 } 288 } --- EOF ---