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, 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, 81 SectionName.NESTED_CLASS_SUMMARY, memberSummaryTree, memberTree); 82 } 83 84 /** 85 * {@inheritDoc} 86 */ 87 @Override 88 public void addSummaryLabel(Content memberTree) { 89 Content label = HtmlTree.HEADING(Headings.TypeDeclaration.SUMMARY_HEADING, 90 contents.nestedClassSummary); 91 memberTree.add(label); 92 } 93 94 /** 95 * {@inheritDoc} 96 */ 97 @Override 98 public TableHeader getSummaryTableHeader(Element member) { 99 Content label = utils.isInterface(member) ? 100 contents.interfaceLabel : contents.classLabel; 101 102 return new TableHeader(contents.modifierAndTypeLabel, label, contents.descriptionLabel); 103 } 104 105 @Override 106 protected Table createSummaryTable() { 107 List<HtmlStyle> bodyRowStyles = Arrays.asList(HtmlStyle.colFirst, HtmlStyle.colSecond, 108 HtmlStyle.colLast); 109 110 return new Table(HtmlStyle.memberSummary) 111 .setCaption(contents.getContent("doclet.Nested_Classes")) 112 .setHeader(getSummaryTableHeader(typeElement)) 113 .setRowScopeColumn(1) 114 .setColumnStyles(bodyRowStyles); 115 } 116 117 /** 118 * {@inheritDoc} 119 */ 120 @Override 121 public void addInheritedSummaryLabel(TypeElement typeElement, Content inheritedTree) { 122 Content classLink = writer.getPreQualifiedClassLink( 123 LinkInfoImpl.Kind.MEMBER, typeElement, false); 124 Content label; 125 if (configuration.summarizeOverriddenMethods) { 126 label = new StringContent(utils.isInterface(typeElement) 127 ? resources.getText("doclet.Nested_Classes_Interfaces_Declared_In_Interface") 128 : resources.getText("doclet.Nested_Classes_Interfaces_Declared_In_Class")); 129 } else { 130 label = new StringContent(utils.isInterface(typeElement) 131 ? resources.getText("doclet.Nested_Classes_Interfaces_Inherited_From_Interface") 132 : resources.getText("doclet.Nested_Classes_Interfaces_Inherited_From_Class")); 133 } 134 HtmlTree labelHeading = HtmlTree.HEADING(Headings.TypeDeclaration.SUMMARY_HEADING, label); 135 labelHeading.setId(SectionName.NESTED_CLASSES_INHERITANCE.getName() 136 + links.getName(utils.getFullyQualifiedName(typeElement))); 137 labelHeading.add(Entity.NO_BREAK_SPACE); 138 labelHeading.add(classLink); 139 inheritedTree.add(labelHeading); 140 } 141 142 /** 143 * {@inheritDoc} 144 */ 145 @Override 146 protected void addSummaryLink(LinkInfoImpl.Kind context, TypeElement typeElement, Element member, 147 Content tdSummary) { 148 Content memberLink = HtmlTree.SPAN(HtmlStyle.memberNameLink, 149 writer.getLink(new LinkInfoImpl(configuration, context, (TypeElement)member))); 150 Content code = HtmlTree.CODE(memberLink); 151 tdSummary.add(code); 152 } 153 154 /** 155 * {@inheritDoc} 156 */ 157 @Override 158 protected void addInheritedSummaryLink(TypeElement typeElement, Element member, Content linksTree) { 159 linksTree.add( 160 writer.getLink(new LinkInfoImpl(configuration, LinkInfoImpl.Kind.MEMBER, 161 (TypeElement)member))); 162 } 163 164 /** 165 * {@inheritDoc} 166 */ 167 @Override 168 protected void addSummaryType(Element member, Content tdSummaryType) { 169 addModifierAndType(member, null, tdSummaryType); 170 } 171 172 /** 173 * {@inheritDoc} 174 */ 175 @Override 176 protected Content getDeprecatedLink(Element member) { 177 return writer.getQualifiedClassLink(LinkInfoImpl.Kind.MEMBER, member); 178 } 179 }