1 /*
2  * Copyright (c) 2013, 2018, 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.ArrayList;
29 import java.util.List;
30 import java.util.Map;
31 import java.util.Set;
32 
33 import javax.lang.model.element.ModuleElement;
34 import javax.lang.model.element.PackageElement;
35 
36 import jdk.javadoc.internal.doclets.formats.html.markup.HtmlConstants;
37 import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle;
38 import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTag;
39 import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
40 import jdk.javadoc.internal.doclets.formats.html.markup.RawHtml;
41 import jdk.javadoc.internal.doclets.formats.html.markup.StringContent;
42 import jdk.javadoc.internal.doclets.toolkit.Content;
43 import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException;
44 import jdk.javadoc.internal.doclets.toolkit.util.DocPath;
45 import jdk.javadoc.internal.doclets.toolkit.util.DocPaths;
46 
47 /**
48  * Generate the module package index for the left-hand frame in the generated output.
49  * A click on the package name in this frame will update the page in the bottom
50  * left hand frame with the listing of contents of the clicked module package.
51  *
52  *  <p><b>This is NOT part of any supported API.
53  *  If you write code that depends on this, you do so at your own risk.
54  *  This code and its internal interfaces are subject to change or
55  *  deletion without notice.</b>
56  *
57  * @author Bhavesh Patel
58  */
59 public class ModulePackageIndexFrameWriter extends AbstractModuleIndexWriter {
60 
61     /**
62      * Construct the ModulePackageIndexFrameWriter object.
63      *
64      * @param configuration the configuration object
65      * @param filename Name of the package index file to be generated.
66      */
ModulePackageIndexFrameWriter(HtmlConfiguration configuration, DocPath filename)67     public ModulePackageIndexFrameWriter(HtmlConfiguration configuration, DocPath filename)  {
68         super(configuration, filename);
69     }
70 
71     /**
72      * Generate the module package index file.
73      * @throws DocFileIOException
74      * @param configuration the configuration object
75      * @param mdle the module being documented
76      */
generate(HtmlConfiguration configuration, ModuleElement mdle)77     public static void generate(HtmlConfiguration configuration, ModuleElement mdle) throws DocFileIOException {
78         DocPath filename = configuration.docPaths.moduleFrame(mdle);
79         ModulePackageIndexFrameWriter modpackgen = new ModulePackageIndexFrameWriter(configuration, filename);
80         modpackgen.buildModulePackagesIndexFile("doclet.Window_Overview", false, mdle);
81     }
82 
83     /**
84      * {@inheritDoc}
85      */
addModulePackagesList(Map<ModuleElement, Set<PackageElement>> modules, String text, String tableSummary, Content main, ModuleElement mdle)86     protected void addModulePackagesList(Map<ModuleElement, Set<PackageElement>> modules, String text,
87             String tableSummary, Content main, ModuleElement mdle) {
88         Content profNameContent = new StringContent(mdle.getQualifiedName().toString());
89         Content heading = HtmlTree.HEADING(HtmlConstants.PACKAGE_HEADING, true,
90                 getTargetModuleLink("classFrame", profNameContent, mdle));
91         heading.addContent(Contents.SPACE);
92         heading.addContent(contents.packagesLabel);
93         HtmlTree htmlTree = HtmlTree.DIV(HtmlStyle.indexContainer, heading);
94         HtmlTree ul = new HtmlTree(HtmlTag.UL);
95         ul.setTitle(contents.packagesLabel);
96         List<PackageElement> packages = new ArrayList<>(modules.get(mdle));
97         for (PackageElement pkg : packages) {
98             if ((!(configuration.nodeprecated && utils.isDeprecated(pkg)))) {
99                 ul.addContent(getPackage(pkg, mdle));
100             }
101         }
102         htmlTree.addContent(ul);
103         main.addContent(htmlTree);
104     }
105 
106     /**
107      * {@inheritDoc}
108      */
addModulePackagesList(Set<ModuleElement> modules, String text, String tableSummary, Content body, ModuleElement mdle)109     protected void addModulePackagesList(Set<ModuleElement> modules, String text,
110             String tableSummary, Content body, ModuleElement mdle) {
111         Content moduleNameContent = new StringContent(mdle.getQualifiedName().toString());
112         Content heading = HtmlTree.HEADING(HtmlConstants.PACKAGE_HEADING, true,
113                 getTargetModuleLink("classFrame", moduleNameContent, mdle));
114         heading.addContent(Contents.SPACE);
115         heading.addContent(contents.packagesLabel);
116         HtmlTree htmlTree = (configuration.allowTag(HtmlTag.MAIN))
117                 ? HtmlTree.MAIN(HtmlStyle.indexContainer, heading)
118                 : HtmlTree.DIV(HtmlStyle.indexContainer, heading);
119         HtmlTree ul = new HtmlTree(HtmlTag.UL);
120         ul.setTitle(contents.packagesLabel);
121         Set<PackageElement> modulePackages = configuration.modulePackages.get(mdle);
122         for (PackageElement pkg: modulePackages) {
123             if ((!(configuration.nodeprecated && utils.isDeprecated(pkg)))) {
124                 ul.addContent(getPackage(pkg, mdle));
125             }
126         }
127         htmlTree.addContent(ul);
128         body.addContent(htmlTree);
129     }
130 
131     /**
132      * Returns each package name as a separate link.
133      *
134      * @param pkg PackageElement
135      * @param mdle the module being documented
136      * @return content for the package link
137      */
getPackage(PackageElement pkg, ModuleElement mdle)138     protected Content getPackage(PackageElement pkg, ModuleElement mdle) {
139         Content packageLinkContent;
140         Content pkgLabel;
141         if (!pkg.isUnnamed()) {
142             pkgLabel = getPackageLabel(utils.getPackageName(pkg));
143             packageLinkContent = links.createLink(pathString(pkg,
144                      DocPaths.PACKAGE_FRAME), pkgLabel, "",
145                     "packageFrame");
146         } else {
147             pkgLabel = new StringContent("<unnamed package>");
148             packageLinkContent = links.createLink(DocPaths.PACKAGE_FRAME,
149                     pkgLabel, "", "packageFrame");
150         }
151         Content li = HtmlTree.LI(packageLinkContent);
152         return li;
153     }
154 
155     /**
156      * {@inheritDoc}
157      */
addNavigationBarHeader(Content header)158     protected void addNavigationBarHeader(Content header) {
159         Content headerContent;
160         if (configuration.packagesheader.length() > 0) {
161             headerContent = new RawHtml(replaceDocRootDir(configuration.packagesheader));
162         } else {
163             headerContent = new RawHtml(replaceDocRootDir(configuration.header));
164         }
165         Content heading = HtmlTree.HEADING(HtmlConstants.TITLE_HEADING, true,
166                 HtmlStyle.bar, headerContent);
167         header.addContent(heading);
168     }
169 
170     /**
171      * Do nothing as there is no overview information in this page.
172      */
addOverviewHeader(Content body)173     protected void addOverviewHeader(Content body) {
174     }
175 
176     /**
177      * Do nothing as there is no modules list on this page.
178      */
addModulesList(Content body)179     protected void addModulesList(Content body) {
180     }
181 
182     /**
183      * Adds "All Classes" link for the top of the left-hand frame page to the
184      * documentation tree.
185      *
186      * @param ul the Content object to which the all classes link should be added
187      */
addAllClassesLink(Content ul)188     protected void addAllClassesLink(Content ul) {
189         DocPath allClassesFrame = configuration.useModuleDirectories
190                 ? DocPaths.DOT_DOT.resolve(DocPaths.ALLCLASSES_FRAME)
191                 : DocPaths.ALLCLASSES_FRAME;
192         Content linkContent = links.createLink(allClassesFrame,
193                 contents.allClassesLabel, "", "packageFrame");
194         Content li = HtmlTree.LI(linkContent);
195         ul.addContent(li);
196     }
197 
198     /**
199      * Adds "All Packages" link for the top of the left-hand frame page to the
200      * documentation tree.
201      *
202      * @param ul the Content object to which the all packages link should be added
203      */
addAllPackagesLink(Content ul)204     protected void addAllPackagesLink(Content ul) {
205         DocPath overviewFrame = configuration.useModuleDirectories
206                 ? DocPaths.DOT_DOT.resolve(DocPaths.OVERVIEW_FRAME)
207                 : DocPaths.OVERVIEW_FRAME;
208         Content linkContent = links.createLink(overviewFrame,
209                 contents.allPackagesLabel, "", "packageListFrame");
210         Content li = HtmlTree.LI(linkContent);
211         ul.addContent(li);
212     }
213 
214     /**
215      * Adds "All Modules" link for the top of the left-hand frame page to the
216      * documentation tree.
217      *
218      * @param ul the Content object to which the all modules link should be added
219      */
addAllModulesLink(Content ul)220     protected void addAllModulesLink(Content ul) {
221         DocPath moduleOverviewFrame = configuration.useModuleDirectories
222                 ? DocPaths.DOT_DOT.resolve(DocPaths.MODULE_OVERVIEW_FRAME)
223                 : DocPaths.MODULE_OVERVIEW_FRAME;
224         Content linkContent = links.createLink(moduleOverviewFrame,
225                 contents.allModulesLabel, "", "packageListFrame");
226         Content li = HtmlTree.LI(linkContent);
227         ul.addContent(li);
228     }
229 
230     /**
231      * {@inheritDoc}
232      */
addNavigationBarFooter(Content footer)233     protected void addNavigationBarFooter(Content footer) {
234         Content p = HtmlTree.P(Contents.SPACE);
235         footer.addContent(p);
236     }
237 }
238