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