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 public class NestedClassWriterImpl extends AbstractMemberWriter 53 implements MemberSummaryWriter { 54 55 public NestedClassWriterImpl(SubWriterHolderWriter writer, TypeElement typeElement) { 56 super(writer, typeElement); 57 } 58 59 public NestedClassWriterImpl(SubWriterHolderWriter writer) { 60 super(writer); 61 } 62 63 /** 64 * {@inheritDoc} 65 */ 66 @Override 67 public Content getMemberSummaryHeader(TypeElement typeElement, 68 Content memberSummaryTree) { 69 memberSummaryTree.add(MarkerComments.START_OF_NESTED_CLASS_SUMMARY); 70 Content memberTree = new ContentBuilder(); 71 writer.addSummaryHeader(this, typeElement, memberTree); 72 return memberTree; 73 } 74 75 /** 76 * {@inheritDoc} 77 */ 78 @Override 79 public void addMemberTree(Content memberSummaryTree, Content memberTree) { 80 writer.addMemberTree(HtmlStyle.nestedClassSummary, memberSummaryTree, memberTree); 81 } 82 83 /** 84 * {@inheritDoc} 85 */ 86 @Override 87 public void addSummaryLabel(Content memberTree) { 88 Content label = HtmlTree.HEADING(Headings.TypeDeclaration.SUMMARY_HEADING, 89 contents.nestedClassSummary); 90 memberTree.add(label); 91 } 92 93 /** 94 * {@inheritDoc} 95 */ 96 @Override 97 public TableHeader getSummaryTableHeader(Element member) { 98 Content label = utils.isInterface(member) ? 99 contents.interfaceLabel : contents.classLabel; 100 101 return new TableHeader(contents.modifierAndTypeLabel, label, contents.descriptionLabel); 102 } 103 104 @Override 105 protected Table createSummaryTable() { 106 List<HtmlStyle> bodyRowStyles = Arrays.asList(HtmlStyle.colFirst, HtmlStyle.colSecond, 107 HtmlStyle.colLast); 108 109 return new Table(HtmlStyle.memberSummary) 110 .setCaption(contents.getContent("doclet.Nested_Classes")) 111 .setHeader(getSummaryTableHeader(typeElement)) 112 .setRowScopeColumn(1) 113 .setColumnStyles(bodyRowStyles); 114 } 115 116 /** 117 * {@inheritDoc} 118 */ 119 @Override 120 public void addSummaryAnchor(TypeElement typeElement, Content memberTree) { 121 memberTree.add(links.createAnchor( 122 SectionName.NESTED_CLASS_SUMMARY)); 123 } 124 125 /** 126 * {@inheritDoc} 127 */ 128 @Override 129 public void addInheritedSummaryAnchor(TypeElement typeElement, Content inheritedTree) { 130 inheritedTree.add(links.createAnchor( 131 SectionName.NESTED_CLASSES_INHERITANCE, 132 utils.getFullyQualifiedName(typeElement))); 133 } 134 135 /** 136 * {@inheritDoc} 137 */ 138 @Override 139 public void addInheritedSummaryLabel(TypeElement typeElement, Content inheritedTree) { 140 Content classLink = writer.getPreQualifiedClassLink( 141 LinkInfoImpl.Kind.MEMBER, typeElement, false); 142 Content label; 143 if (configuration.summarizeOverriddenMethods) { 144 label = new StringContent(utils.isInterface(typeElement) 145 ? resources.getText("doclet.Nested_Classes_Interfaces_Declared_In_Interface") 146 : resources.getText("doclet.Nested_Classes_Interfaces_Declared_In_Class")); 147 } else { 148 label = new StringContent(utils.isInterface(typeElement) 149 ? resources.getText("doclet.Nested_Classes_Interfaces_Inherited_From_Interface") 150 : resources.getText("doclet.Nested_Classes_Interfaces_Inherited_From_Class")); 151 } 152 Content labelHeading = HtmlTree.HEADING(Headings.TypeDeclaration.SUMMARY_HEADING, label); 153 labelHeading.add(Entity.NO_BREAK_SPACE); 154 labelHeading.add(classLink); 155 inheritedTree.add(labelHeading); 156 } 157 158 /** 159 * {@inheritDoc} 160 */ 161 @Override 162 protected void addSummaryLink(LinkInfoImpl.Kind context, TypeElement typeElement, Element member, 163 Content tdSummary) { 164 Content memberLink = HtmlTree.SPAN(HtmlStyle.memberNameLink, 165 writer.getLink(new LinkInfoImpl(configuration, context, (TypeElement)member))); 166 Content code = HtmlTree.CODE(memberLink); 167 tdSummary.add(code); 168 } 169 170 /** 171 * {@inheritDoc} 172 */ 173 @Override 174 protected void addInheritedSummaryLink(TypeElement typeElement, Element member, Content linksTree) { 175 linksTree.add( 176 writer.getLink(new LinkInfoImpl(configuration, LinkInfoImpl.Kind.MEMBER, 177 (TypeElement)member))); 178 } 179 180 /** 181 * {@inheritDoc} 182 */ 183 @Override 184 protected void addSummaryType(Element member, Content tdSummaryType) { 185 addModifierAndType(member, null, tdSummaryType); 186 } 187 188 /** 189 * {@inheritDoc} 190 */ 191 @Override 192 protected Content getDeprecatedLink(Element member) { 193 return writer.getQualifiedClassLink(LinkInfoImpl.Kind.MEMBER, member); 194 } 195 }