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 javax.lang.model.element.Element; 29 import javax.lang.model.element.ExecutableElement; 30 import javax.lang.model.element.TypeElement; 31 32 import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder; 33 import jdk.javadoc.internal.doclets.formats.html.markup.Entity; 34 import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; 35 import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; 36 import jdk.javadoc.internal.doclets.formats.html.markup.StringContent; 37 import jdk.javadoc.internal.doclets.formats.html.markup.Table; 38 import jdk.javadoc.internal.doclets.formats.html.markup.TableHeader; 39 import jdk.javadoc.internal.doclets.toolkit.Content; 40 import jdk.javadoc.internal.doclets.toolkit.MemberSummaryWriter; 41 import jdk.javadoc.internal.doclets.toolkit.PropertyWriter; 42 43 /** 44 * Writes property documentation in HTML format. 45 * 46 * <p><b>This is NOT part of any supported API. 47 * If you write code that depends on this, you do so at your own risk. 48 * This code and its internal interfaces are subject to change or 49 * deletion without notice.</b> 50 * 51 * @author Robert Field 52 * @author Atul M Dambalkar 53 * @author Jamie Ho (rewrite) 54 * @author Bhavesh Patel (Modified) 55 */ 56 public class PropertyWriterImpl extends AbstractMemberWriter 57 implements PropertyWriter, MemberSummaryWriter { 58 59 public PropertyWriterImpl(SubWriterHolderWriter writer, TypeElement typeElement) { 60 super(writer, typeElement); 61 } 62 63 /** 64 * {@inheritDoc} 65 */ 66 @Override 67 public Content getMemberSummaryHeader(TypeElement typeElement, Content memberSummaryTree) { 68 memberSummaryTree.add(MarkerComments.START_OF_PROPERTY_SUMMARY); 69 Content memberTree = new ContentBuilder(); 70 writer.addSummaryHeader(this, typeElement, memberTree); 71 return memberTree; 72 } 73 74 /** 75 * {@inheritDoc} 76 */ 77 @Override 78 public void addMemberTree(Content memberSummaryTree, Content memberTree) { 79 writer.addMemberTree(HtmlStyle.propertySummary, memberSummaryTree, memberTree); 80 } 81 82 /** 83 * {@inheritDoc} 84 */ 85 @Override 86 public Content getPropertyDetailsTreeHeader(TypeElement typeElement, 87 Content memberDetailsTree) { 88 memberDetailsTree.add(MarkerComments.START_OF_PROPERTY_DETAILS); 89 Content propertyDetailsTree = new ContentBuilder(); 90 Content heading = HtmlTree.HEADING(Headings.TypeDeclaration.DETAILS_HEADING, 91 contents.propertyDetailsLabel); 92 propertyDetailsTree.add(heading); 93 propertyDetailsTree.add(links.createAnchor(SectionName.PROPERTY_DETAIL)); 94 return propertyDetailsTree; 95 } 96 97 /** 98 * {@inheritDoc} 99 */ 100 @Override 101 public Content getPropertyDocTreeHeader(ExecutableElement property, 102 Content propertyDetailsTree) { 103 Content propertyDocTree = new ContentBuilder(); 104 Content heading = new HtmlTree(Headings.TypeDeclaration.MEMBER_HEADING); 105 heading.add(utils.getPropertyLabel(name(property))); 106 propertyDocTree.add(heading); 107 propertyDocTree.add(links.createAnchor(name(property))); 108 return HtmlTree.SECTION(HtmlStyle.detail, propertyDocTree); 109 } 110 111 /** 112 * {@inheritDoc} 113 */ 114 @Override 115 public Content getSignature(ExecutableElement property) { 116 return new MemberSignature(property) 117 .addType(utils.getReturnType(property)) 118 .toContent(); 119 } 120 121 /** 122 * {@inheritDoc} 123 */ 124 @Override 125 public void addDeprecated(ExecutableElement property, Content propertyDocTree) { 126 } 127 128 /** 129 * {@inheritDoc} 130 */ 131 @Override 132 public void addComments(ExecutableElement property, Content propertyDocTree) { 133 TypeElement holder = (TypeElement)property.getEnclosingElement(); 134 if (!utils.getFullBody(property).isEmpty()) { 135 if (holder.equals(typeElement) || 136 (!utils.isPublic(holder) || utils.isLinkable(holder))) { 137 writer.addInlineComment(property, propertyDocTree); 138 } else { 139 Content link = 140 writer.getDocLink(LinkInfoImpl.Kind.PROPERTY_COPY, 141 holder, property, 142 utils.isIncluded(holder) 143 ? holder.getSimpleName() : holder.getQualifiedName(), 144 false); 145 Content codeLink = HtmlTree.CODE(link); 146 Content descfrmLabel = HtmlTree.SPAN(HtmlStyle.descfrmTypeLabel, 147 utils.isClass(holder) 148 ? contents.descfrmClassLabel 149 : contents.descfrmInterfaceLabel); 150 descfrmLabel.add(Entity.NO_BREAK_SPACE); 151 descfrmLabel.add(codeLink); 152 propertyDocTree.add(HtmlTree.DIV(HtmlStyle.block, descfrmLabel)); 153 writer.addInlineComment(property, propertyDocTree); 154 } 155 } 156 } 157 158 /** 159 * {@inheritDoc} 160 */ 161 @Override 162 public void addTags(ExecutableElement property, Content propertyDocTree) { 163 writer.addTagsInfo(property, propertyDocTree); 164 } 165 166 /** 167 * {@inheritDoc} 168 */ 169 @Override 170 public Content getPropertyDetails(Content propertyDetailsTreeHeader, Content propertyDetailsTree) { 171 Content propertyDetails = new ContentBuilder(propertyDetailsTreeHeader, propertyDetailsTree); 172 return getMemberTree(HtmlTree.SECTION(HtmlStyle.propertyDetails, propertyDetails)); 173 } 174 175 /** 176 * {@inheritDoc} 177 */ 178 @Override 179 public Content getPropertyDoc(Content propertyDocTree, 180 boolean isLastContent) { 181 return getMemberTree(propertyDocTree, isLastContent); 182 } 183 184 /** 185 * {@inheritDoc} 186 */ 187 @Override 188 public void addSummaryLabel(Content memberTree) { 189 Content label = HtmlTree.HEADING(Headings.TypeDeclaration.SUMMARY_HEADING, 190 contents.propertySummaryLabel); 191 memberTree.add(label); 192 } 193 194 /** 195 * {@inheritDoc} 196 */ 197 @Override 198 public TableHeader getSummaryTableHeader(Element member) { 199 return new TableHeader(contents.typeLabel, contents.propertyLabel, 200 contents.descriptionLabel); 201 } 202 203 /** 204 * {@inheritDoc} 205 */ 206 @Override 207 protected Table createSummaryTable() { 208 return new Table(HtmlStyle.memberSummary) 209 .setCaption(contents.properties) 210 .setHeader(getSummaryTableHeader(typeElement)) 211 .setColumnStyles(HtmlStyle.colFirst, HtmlStyle.colSecond, HtmlStyle.colLast) 212 .setRowScopeColumn(1); 213 } 214 215 /** 216 * {@inheritDoc} 217 */ 218 @Override 219 public void addSummaryAnchor(TypeElement typeElement, Content memberTree) { 220 memberTree.add(links.createAnchor(SectionName.PROPERTY_SUMMARY)); 221 } 222 223 /** 224 * {@inheritDoc} 225 */ 226 @Override 227 public void addInheritedSummaryAnchor(TypeElement typeElement, Content inheritedTree) { 228 inheritedTree.add(links.createAnchor( 229 SectionName.PROPERTIES_INHERITANCE, 230 configuration.getClassName(typeElement))); 231 } 232 233 /** 234 * {@inheritDoc} 235 */ 236 @Override 237 public void addInheritedSummaryLabel(TypeElement typeElement, Content inheritedTree) { 238 Content classLink = writer.getPreQualifiedClassLink( 239 LinkInfoImpl.Kind.MEMBER, typeElement, false); 240 Content label; 241 if (configuration.summarizeOverriddenMethods) { 242 label = new StringContent(utils.isClass(typeElement) 243 ? resources.getText("doclet.Properties_Declared_In_Class") 244 : resources.getText("doclet.Properties_Declared_In_Interface")); 245 } else { 246 label = new StringContent(utils.isClass(typeElement) 247 ? resources.getText("doclet.Properties_Inherited_From_Class") 248 : resources.getText("doclet.Properties_Inherited_From_Interface")); 249 } 250 Content labelHeading = HtmlTree.HEADING(Headings.TypeDeclaration.INHERITED_SUMMARY_HEADING, 251 label); 252 labelHeading.add(Entity.NO_BREAK_SPACE); 253 labelHeading.add(classLink); 254 inheritedTree.add(labelHeading); 255 } 256 257 /** 258 * {@inheritDoc} 259 */ 260 @Override 261 protected void addSummaryLink(LinkInfoImpl.Kind context, TypeElement typeElement, Element member, 262 Content tdSummary) { 263 Content memberLink = HtmlTree.SPAN(HtmlStyle.memberNameLink, 264 writer.getDocLink(context, typeElement, 265 member, 266 utils.getPropertyLabel(name(member)), 267 false, 268 true)); 269 270 Content code = HtmlTree.CODE(memberLink); 271 tdSummary.add(code); 272 } 273 274 /** 275 * {@inheritDoc} 276 */ 277 @Override 278 protected void addInheritedSummaryLink(TypeElement typeElement, Element member, Content linksTree) { 279 String mname = name(member); 280 Content content = writer.getDocLink(LinkInfoImpl.Kind.MEMBER, typeElement, member, 281 utils.isProperty(mname) ? utils.getPropertyName(mname) : mname, 282 false, true); 283 linksTree.add(content); 284 } 285 286 /** 287 * {@inheritDoc} 288 */ 289 @Override 290 protected void addSummaryType(Element member, Content tdSummaryType) { 291 addModifierAndType(member, utils.getReturnType((ExecutableElement)member), tdSummaryType); 292 } 293 294 /** 295 * {@inheritDoc} 296 */ 297 @Override 298 protected Content getDeprecatedLink(Element member) { 299 return writer.getDocLink(LinkInfoImpl.Kind.MEMBER, member, 300 utils.getFullyQualifiedName(member)); 301 } 302 303 @Override 304 public Content getMemberTreeHeader(){ 305 return writer.getMemberTreeHeader(); 306 } 307 } --- EOF ---