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 34 import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder; 35 import jdk.javadoc.internal.doclets.formats.html.markup.Entity; 36 import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle; 37 import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree; 38 import jdk.javadoc.internal.doclets.formats.html.markup.StringContent; 39 import jdk.javadoc.internal.doclets.formats.html.markup.Table; 40 import jdk.javadoc.internal.doclets.formats.html.markup.TableHeader; 41 import jdk.javadoc.internal.doclets.toolkit.Content; 42 import jdk.javadoc.internal.doclets.toolkit.MemberSummaryWriter; 43 44 /** 45 * Writes nested class documentation in HTML format. 46 * 47 * <p><b>This is NOT part of any supported API. 48 * If you write code that depends on this, you do so at your own risk. 49 * This code and its internal interfaces are subject to change or 50 * deletion without notice.</b> 51 * 52 * @author Robert Field 53 * @author Atul M Dambalkar 54 * @author Jamie Ho (rewrite) 55 * @author Bhavesh Patel (Modified) 56 */ 57 public class NestedClassWriterImpl extends AbstractMemberWriter 58 implements MemberSummaryWriter { 59 NestedClassWriterImpl(SubWriterHolderWriter writer, TypeElement typeElement)60 public NestedClassWriterImpl(SubWriterHolderWriter writer, TypeElement typeElement) { 61 super(writer, typeElement); 62 } 63 NestedClassWriterImpl(SubWriterHolderWriter writer)64 public NestedClassWriterImpl(SubWriterHolderWriter writer) { 65 super(writer); 66 } 67 68 /** 69 * {@inheritDoc} 70 */ 71 @Override getMemberSummaryHeader(TypeElement typeElement, Content memberSummaryTree)72 public Content getMemberSummaryHeader(TypeElement typeElement, 73 Content memberSummaryTree) { 74 memberSummaryTree.add(MarkerComments.START_OF_NESTED_CLASS_SUMMARY); 75 Content memberTree = new ContentBuilder(); 76 writer.addSummaryHeader(this, typeElement, memberTree); 77 return memberTree; 78 } 79 80 /** 81 * {@inheritDoc} 82 */ 83 @Override addMemberTree(Content memberSummaryTree, Content memberTree)84 public void addMemberTree(Content memberSummaryTree, Content memberTree) { 85 writer.addMemberTree(HtmlStyle.nestedClassSummary, memberSummaryTree, memberTree); 86 } 87 88 /** 89 * {@inheritDoc} 90 */ 91 @Override addSummaryLabel(Content memberTree)92 public void addSummaryLabel(Content memberTree) { 93 Content label = HtmlTree.HEADING(Headings.TypeDeclaration.SUMMARY_HEADING, 94 contents.nestedClassSummary); 95 memberTree.add(label); 96 } 97 98 /** 99 * {@inheritDoc} 100 */ 101 @Override getSummaryTableHeader(Element member)102 public TableHeader getSummaryTableHeader(Element member) { 103 Content label = utils.isInterface(member) ? 104 contents.interfaceLabel : contents.classLabel; 105 106 return new TableHeader(contents.modifierAndTypeLabel, label, contents.descriptionLabel); 107 } 108 109 @Override createSummaryTable()110 protected Table createSummaryTable() { 111 List<HtmlStyle> bodyRowStyles = Arrays.asList(HtmlStyle.colFirst, HtmlStyle.colSecond, 112 HtmlStyle.colLast); 113 114 return new Table(HtmlStyle.memberSummary) 115 .setCaption(contents.getContent("doclet.Nested_Classes")) 116 .setHeader(getSummaryTableHeader(typeElement)) 117 .setRowScopeColumn(1) 118 .setColumnStyles(bodyRowStyles); 119 } 120 121 /** 122 * {@inheritDoc} 123 */ 124 @Override addSummaryAnchor(TypeElement typeElement, Content memberTree)125 public void addSummaryAnchor(TypeElement typeElement, Content memberTree) { 126 memberTree.add(links.createAnchor( 127 SectionName.NESTED_CLASS_SUMMARY)); 128 } 129 130 /** 131 * {@inheritDoc} 132 */ 133 @Override addInheritedSummaryAnchor(TypeElement typeElement, Content inheritedTree)134 public void addInheritedSummaryAnchor(TypeElement typeElement, Content inheritedTree) { 135 inheritedTree.add(links.createAnchor( 136 SectionName.NESTED_CLASSES_INHERITANCE, 137 utils.getFullyQualifiedName(typeElement))); 138 } 139 140 /** 141 * {@inheritDoc} 142 */ 143 @Override addInheritedSummaryLabel(TypeElement typeElement, Content inheritedTree)144 public void addInheritedSummaryLabel(TypeElement typeElement, Content inheritedTree) { 145 Content classLink = writer.getPreQualifiedClassLink( 146 LinkInfoImpl.Kind.MEMBER, typeElement, false); 147 Content label; 148 if (configuration.summarizeOverriddenMethods) { 149 label = new StringContent(utils.isInterface(typeElement) 150 ? resources.getText("doclet.Nested_Classes_Interfaces_Declared_In_Interface") 151 : resources.getText("doclet.Nested_Classes_Interfaces_Declared_In_Class")); 152 } else { 153 label = new StringContent(utils.isInterface(typeElement) 154 ? resources.getText("doclet.Nested_Classes_Interfaces_Inherited_From_Interface") 155 : resources.getText("doclet.Nested_Classes_Interfaces_Inherited_From_Class")); 156 } 157 Content labelHeading = HtmlTree.HEADING(Headings.TypeDeclaration.SUMMARY_HEADING, label); 158 labelHeading.add(Entity.NO_BREAK_SPACE); 159 labelHeading.add(classLink); 160 inheritedTree.add(labelHeading); 161 } 162 163 /** 164 * {@inheritDoc} 165 */ 166 @Override addSummaryLink(LinkInfoImpl.Kind context, TypeElement typeElement, Element member, Content tdSummary)167 protected void addSummaryLink(LinkInfoImpl.Kind context, TypeElement typeElement, Element member, 168 Content tdSummary) { 169 Content memberLink = HtmlTree.SPAN(HtmlStyle.memberNameLink, 170 writer.getLink(new LinkInfoImpl(configuration, context, (TypeElement)member))); 171 Content code = HtmlTree.CODE(memberLink); 172 tdSummary.add(code); 173 } 174 175 /** 176 * {@inheritDoc} 177 */ 178 @Override addInheritedSummaryLink(TypeElement typeElement, Element member, Content linksTree)179 protected void addInheritedSummaryLink(TypeElement typeElement, Element member, Content linksTree) { 180 linksTree.add( 181 writer.getLink(new LinkInfoImpl(configuration, LinkInfoImpl.Kind.MEMBER, 182 (TypeElement)member))); 183 } 184 185 /** 186 * {@inheritDoc} 187 */ 188 @Override addSummaryType(Element member, Content tdSummaryType)189 protected void addSummaryType(Element member, Content tdSummaryType) { 190 addModifierAndType(member, null, tdSummaryType); 191 } 192 193 /** 194 * {@inheritDoc} 195 */ 196 @Override getDeprecatedLink(Element member)197 protected Content getDeprecatedLink(Element member) { 198 return writer.getQualifiedClassLink(LinkInfoImpl.Kind.MEMBER, member); 199 } 200 } 201