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