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