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 package jdk.javadoc.internal.doclets.formats.html.markup;
26
27 import java.util.ArrayDeque;
28 import java.util.ArrayList;
29 import java.util.Deque;
30 import java.util.HashMap;
31 import java.util.List;
32 import java.util.Map;
33 import java.util.Set;
34 import java.util.SortedSet;
35
36 import javax.lang.model.element.Element;
37 import javax.lang.model.element.ElementKind;
38 import javax.lang.model.element.ModuleElement;
39 import javax.lang.model.element.PackageElement;
40 import javax.lang.model.element.TypeElement;
41
42 import jdk.javadoc.internal.doclets.formats.html.AbstractMemberWriter;
43 import jdk.javadoc.internal.doclets.formats.html.Contents;
44 import jdk.javadoc.internal.doclets.formats.html.HtmlConfiguration;
45 import jdk.javadoc.internal.doclets.formats.html.MarkerComments;
46 import jdk.javadoc.internal.doclets.formats.html.SectionName;
47 import jdk.javadoc.internal.doclets.toolkit.Content;
48 import jdk.javadoc.internal.doclets.toolkit.builders.MemberSummaryBuilder;
49 import jdk.javadoc.internal.doclets.toolkit.util.DocFile;
50 import jdk.javadoc.internal.doclets.toolkit.util.DocLink;
51 import jdk.javadoc.internal.doclets.toolkit.util.DocPath;
52 import jdk.javadoc.internal.doclets.toolkit.util.DocPaths;
62 * your own risk. This code and its internal interfaces are subject to change or deletion without
63 * notice.</b>
64 */
65 public class Navigation {
66
67 private final HtmlConfiguration configuration;
68 private final Element element;
69 private final Contents contents;
70 private final DocPath path;
71 private final DocPath pathToRoot;
72 private final Links links;
73 private final PageMode documentedPage;
74 private Content navLinkModule;
75 private Content navLinkPackage;
76 private Content navLinkClass;
77 private MemberSummaryBuilder memberSummaryBuilder;
78 private boolean displaySummaryModuleDescLink;
79 private boolean displaySummaryModulesLink;
80 private boolean displaySummaryPackagesLink;
81 private boolean displaySummaryServicesLink;
82 private final Map<Position, Deque<Content>> topBottomNavContents;
83 private Content userHeader;
84 private Content userFooter;
85 private final String rowListTitle;
86 private final Content searchLabel;
87
88 public enum PageMode {
89 ALLCLASSES,
90 ALLPACKAGES,
91 CLASS,
92 CONSTANTVALUES,
93 DEPRECATED,
94 DOCFILE,
95 HELP,
96 INDEX,
97 MODULE,
98 OVERVIEW,
99 PACKAGE,
100 SERIALIZEDFORM,
101 SYSTEMPROPERTIES,
102 TREE,
103 USE;
104 }
105
106 enum Position {
107 BOTTOM(MarkerComments.START_OF_BOTTOM_NAVBAR, MarkerComments.END_OF_BOTTOM_NAVBAR),
124 }
125 }
126
127 /**
128 * Creates a {@code Navigation} object for a specific file, to be written in a specific HTML
129 * version.
130 *
131 * @param element element being documented. null if its not an element documentation page
132 * @param configuration the configuration object
133 * @param page the kind of page being documented
134 * @param path the DocPath object
135 */
136 public Navigation(Element element, HtmlConfiguration configuration, PageMode page, DocPath path) {
137 this.configuration = configuration;
138 this.element = element;
139 this.contents = configuration.contents;
140 this.documentedPage = page;
141 this.path = path;
142 this.pathToRoot = path.parent().invert();
143 this.links = new Links(path);
144 this.topBottomNavContents = new HashMap<>();
145 this.rowListTitle = configuration.getResources().getText("doclet.Navigation");
146 this.searchLabel = contents.getContent("doclet.search");
147 populateNavContents(Position.TOP);
148 populateNavContents(Position.BOTTOM);
149 }
150
151 /**
152 * Populate the navigation contents for top and bottom navigation
153 *
154 * @param position the position of the navigation bar on the page
155 */
156 private void populateNavContents(Position position) {
157 Deque<Content> queue = new ArrayDeque<>();
158 Content skipNavLinks = contents.getContent("doclet.Skip_navigation_links");
159 switch (position) {
160 case TOP:
161 queue.addLast(links.createAnchor(SectionName.NAVBAR_TOP));
162 queue.addLast(links.createLink(SectionName.SKIP_NAVBAR_TOP, skipNavLinks,
163 skipNavLinks.toString(), ""));
164 queue.addLast(links.createAnchor(SectionName.NAVBAR_TOP_FIRSTROW));
165 queue.addLast(links.createAnchor(SectionName.SKIP_NAVBAR_TOP));
166 topBottomNavContents.put(position, queue);
167 break;
168 case BOTTOM:
169 queue.addLast(links.createAnchor(SectionName.NAVBAR_BOTTOM));
170 queue.addLast(links.createLink(SectionName.SKIP_NAVBAR_BOTTOM, skipNavLinks,
171 skipNavLinks.toString(), ""));
172 queue.addLast(links.createAnchor(SectionName.NAVBAR_BOTTOM_FIRSTROW));
173 queue.addLast(links.createAnchor(SectionName.SKIP_NAVBAR_BOTTOM));
174 topBottomNavContents.put(position, queue);
175 break;
176 default:
177 break;
178 }
179 }
180
181 public Navigation setNavLinkModule(Content navLinkModule) {
182 this.navLinkModule = navLinkModule;
183 return this;
184 }
185
186 public Navigation setNavLinkPackage(Content navLinkPackage) {
187 this.navLinkPackage = navLinkPackage;
188 return this;
189 }
190
191 public Navigation setNavLinkClass(Content navLinkClass) {
192 this.navLinkClass = navLinkClass;
193 return this;
194 }
195
196 public Navigation setMemberSummaryBuilder(MemberSummaryBuilder memberSummaryBuilder) {
197 this.memberSummaryBuilder = memberSummaryBuilder;
198 return this;
929 String searchValueId = "search";
930 String reset = "reset";
931 HtmlTree inputText = HtmlTree.INPUT("text", searchValueId, searchValueId);
932 HtmlTree inputReset = HtmlTree.INPUT(reset, reset, reset);
933 HtmlTree searchDiv = HtmlTree.DIV(HtmlStyle.navListSearch, HtmlTree.LABEL(searchValueId, searchLabel));
934 searchDiv.add(inputText);
935 searchDiv.add(inputReset);
936 tree.add(searchDiv);
937 }
938
939 /**
940 * Get the navigation content.
941 *
942 * @param top true if the top navigation bar is to be printed
943 * @return the navigation contents
944 */
945 public Content getContent(boolean top) {
946 if (configuration.nonavbar) {
947 return new ContentBuilder();
948 }
949 Deque<Content> queue;
950 Content tree = HtmlTree.NAV();
951 HtmlTree navDiv = new HtmlTree(HtmlTag.DIV);
952 if (top) {
953 queue = topBottomNavContents.get(Position.TOP);
954 tree.add(Position.TOP.startOfNav());
955 navDiv.setStyle(HtmlStyle.topNav);
956 } else {
957 queue = topBottomNavContents.get(Position.BOTTOM);
958 tree.add(Position.BOTTOM.startOfNav());
959 navDiv.setStyle(HtmlStyle.bottomNav);
960 }
961 navDiv.add(queue.poll());
962 HtmlTree skipLinkDiv = HtmlTree.DIV(HtmlStyle.skipNav, queue.poll());
963 navDiv.add(skipLinkDiv);
964 navDiv.add(queue.poll());
965 HtmlTree navList = new HtmlTree(HtmlTag.UL);
966 navList.setStyle(HtmlStyle.navList);
967 navList.put(HtmlAttr.TITLE, rowListTitle);
968 addMainNavLinks(navList);
969 navDiv.add(navList);
970 Content aboutDiv = HtmlTree.DIV(HtmlStyle.aboutLanguage, top ? userHeader : userFooter);
971 navDiv.add(aboutDiv);
972 tree.add(navDiv);
973 HtmlTree subDiv = new HtmlTree(HtmlTag.DIV);
974 subDiv.setStyle(HtmlStyle.subNav);
975 HtmlTree div = new HtmlTree(HtmlTag.DIV);
976 // Add the summary links if present.
977 HtmlTree ulNavSummary = new HtmlTree(HtmlTag.UL);
978 ulNavSummary.setStyle(HtmlStyle.subNavList);
979 addSummaryLinks(ulNavSummary);
980 div.add(ulNavSummary);
981 // Add the detail links if present.
982 HtmlTree ulNavDetail = new HtmlTree(HtmlTag.UL);
983 ulNavDetail.setStyle(HtmlStyle.subNavList);
984 addDetailLinks(ulNavDetail);
985 div.add(ulNavDetail);
986 subDiv.add(div);
987 if (top && configuration.createindex) {
988 addSearch(subDiv);
989 }
990 tree.add(subDiv);
991 if (top) {
992 tree.add(Position.TOP.endOfNav());
993 tree.add(HtmlTree.DIV(HtmlStyle.skipNav, queue.poll()));
994 } else {
995 tree.add(queue.poll());
996 tree.add(Position.BOTTOM.endOfNav());
997 }
998 return tree;
999 }
1000 }
|
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 package jdk.javadoc.internal.doclets.formats.html.markup;
26
27 import java.util.ArrayList;
28 import java.util.Deque;
29 import java.util.List;
30 import java.util.Set;
31 import java.util.SortedSet;
32
33 import javax.lang.model.element.Element;
34 import javax.lang.model.element.ElementKind;
35 import javax.lang.model.element.ModuleElement;
36 import javax.lang.model.element.PackageElement;
37 import javax.lang.model.element.TypeElement;
38
39 import jdk.javadoc.internal.doclets.formats.html.AbstractMemberWriter;
40 import jdk.javadoc.internal.doclets.formats.html.Contents;
41 import jdk.javadoc.internal.doclets.formats.html.HtmlConfiguration;
42 import jdk.javadoc.internal.doclets.formats.html.MarkerComments;
43 import jdk.javadoc.internal.doclets.formats.html.SectionName;
44 import jdk.javadoc.internal.doclets.toolkit.Content;
45 import jdk.javadoc.internal.doclets.toolkit.builders.MemberSummaryBuilder;
46 import jdk.javadoc.internal.doclets.toolkit.util.DocFile;
47 import jdk.javadoc.internal.doclets.toolkit.util.DocLink;
48 import jdk.javadoc.internal.doclets.toolkit.util.DocPath;
49 import jdk.javadoc.internal.doclets.toolkit.util.DocPaths;
59 * your own risk. This code and its internal interfaces are subject to change or deletion without
60 * notice.</b>
61 */
62 public class Navigation {
63
64 private final HtmlConfiguration configuration;
65 private final Element element;
66 private final Contents contents;
67 private final DocPath path;
68 private final DocPath pathToRoot;
69 private final Links links;
70 private final PageMode documentedPage;
71 private Content navLinkModule;
72 private Content navLinkPackage;
73 private Content navLinkClass;
74 private MemberSummaryBuilder memberSummaryBuilder;
75 private boolean displaySummaryModuleDescLink;
76 private boolean displaySummaryModulesLink;
77 private boolean displaySummaryPackagesLink;
78 private boolean displaySummaryServicesLink;
79 private Content userHeader;
80 private Content userFooter;
81 private final String rowListTitle;
82 private final Content searchLabel;
83
84 private static final Content EMPTY_COMMENT = new Comment(" ");
85
86 public enum PageMode {
87 ALLCLASSES,
88 ALLPACKAGES,
89 CLASS,
90 CONSTANTVALUES,
91 DEPRECATED,
92 DOCFILE,
93 HELP,
94 INDEX,
95 MODULE,
96 OVERVIEW,
97 PACKAGE,
98 SERIALIZEDFORM,
99 SYSTEMPROPERTIES,
100 TREE,
101 USE;
102 }
103
104 enum Position {
105 BOTTOM(MarkerComments.START_OF_BOTTOM_NAVBAR, MarkerComments.END_OF_BOTTOM_NAVBAR),
122 }
123 }
124
125 /**
126 * Creates a {@code Navigation} object for a specific file, to be written in a specific HTML
127 * version.
128 *
129 * @param element element being documented. null if its not an element documentation page
130 * @param configuration the configuration object
131 * @param page the kind of page being documented
132 * @param path the DocPath object
133 */
134 public Navigation(Element element, HtmlConfiguration configuration, PageMode page, DocPath path) {
135 this.configuration = configuration;
136 this.element = element;
137 this.contents = configuration.contents;
138 this.documentedPage = page;
139 this.path = path;
140 this.pathToRoot = path.parent().invert();
141 this.links = new Links(path);
142 this.rowListTitle = configuration.getResources().getText("doclet.Navigation");
143 this.searchLabel = contents.getContent("doclet.search");
144 }
145
146 public Navigation setNavLinkModule(Content navLinkModule) {
147 this.navLinkModule = navLinkModule;
148 return this;
149 }
150
151 public Navigation setNavLinkPackage(Content navLinkPackage) {
152 this.navLinkPackage = navLinkPackage;
153 return this;
154 }
155
156 public Navigation setNavLinkClass(Content navLinkClass) {
157 this.navLinkClass = navLinkClass;
158 return this;
159 }
160
161 public Navigation setMemberSummaryBuilder(MemberSummaryBuilder memberSummaryBuilder) {
162 this.memberSummaryBuilder = memberSummaryBuilder;
163 return this;
894 String searchValueId = "search";
895 String reset = "reset";
896 HtmlTree inputText = HtmlTree.INPUT("text", searchValueId, searchValueId);
897 HtmlTree inputReset = HtmlTree.INPUT(reset, reset, reset);
898 HtmlTree searchDiv = HtmlTree.DIV(HtmlStyle.navListSearch, HtmlTree.LABEL(searchValueId, searchLabel));
899 searchDiv.add(inputText);
900 searchDiv.add(inputReset);
901 tree.add(searchDiv);
902 }
903
904 /**
905 * Get the navigation content.
906 *
907 * @param top true if the top navigation bar is to be printed
908 * @return the navigation contents
909 */
910 public Content getContent(boolean top) {
911 if (configuration.nonavbar) {
912 return new ContentBuilder();
913 }
914 Content tree = HtmlTree.NAV();
915 HtmlTree navDiv = new HtmlTree(HtmlTag.DIV);
916 Content skipNavLinks = contents.getContent("doclet.Skip_navigation_links");
917 if (top) {
918 tree.add(Position.TOP.startOfNav());
919 navDiv.setStyle(HtmlStyle.topNav)
920 .setId(SectionName.NAVBAR_TOP.getName())
921 .add(HtmlTree.DIV(HtmlStyle.skipNav,
922 links.createLink(SectionName.SKIP_NAVBAR_TOP, skipNavLinks,
923 skipNavLinks.toString(), "")));
924 } else {
925 tree.add(Position.BOTTOM.startOfNav());
926 navDiv.setStyle(HtmlStyle.bottomNav)
927 .setId(SectionName.NAVBAR_BOTTOM.getName())
928 .add(HtmlTree.DIV(HtmlStyle.skipNav,
929 links.createLink(SectionName.SKIP_NAVBAR_BOTTOM, skipNavLinks,
930 skipNavLinks.toString(), "")));
931 }
932 HtmlTree navList = new HtmlTree(HtmlTag.UL);
933 navList.setId(top ? SectionName.NAVBAR_TOP_FIRSTROW.getName()
934 : SectionName.NAVBAR_BOTTOM_FIRSTROW.getName());
935 navList.setStyle(HtmlStyle.navList);
936 navList.put(HtmlAttr.TITLE, rowListTitle);
937 addMainNavLinks(navList);
938 navDiv.add(navList);
939 Content aboutDiv = HtmlTree.DIV(HtmlStyle.aboutLanguage, top ? userHeader : userFooter);
940 navDiv.add(aboutDiv);
941 tree.add(navDiv);
942 HtmlTree subDiv = new HtmlTree(HtmlTag.DIV);
943 subDiv.setStyle(HtmlStyle.subNav);
944 HtmlTree div = new HtmlTree(HtmlTag.DIV);
945 // Add the summary links if present.
946 HtmlTree ulNavSummary = new HtmlTree(HtmlTag.UL);
947 ulNavSummary.setStyle(HtmlStyle.subNavList);
948 addSummaryLinks(ulNavSummary);
949 div.add(ulNavSummary);
950 // Add the detail links if present.
951 HtmlTree ulNavDetail = new HtmlTree(HtmlTag.UL);
952 ulNavDetail.setStyle(HtmlStyle.subNavList);
953 addDetailLinks(ulNavDetail);
954 div.add(ulNavDetail);
955 subDiv.add(div);
956 if (top && configuration.createindex) {
957 addSearch(subDiv);
958 }
959 tree.add(subDiv);
960 if (top) {
961 tree.add(Position.TOP.endOfNav());
962 tree.add(HtmlTree.SPAN(HtmlStyle.skipNav, EMPTY_COMMENT)
963 .setId(SectionName.SKIP_NAVBAR_TOP.getName()));
964 } else {
965 tree.add(Position.BOTTOM.endOfNav());
966 tree.add(HtmlTree.SPAN(HtmlStyle.skipNav, EMPTY_COMMENT)
967 .setId(SectionName.SKIP_NAVBAR_BOTTOM.getName()));
968 }
969 return tree;
970 }
971 }
|