Skip to content

Commit 1d44014

Browse files
committed
8273034: Make javadoc navigation collapsible on small displays
Reviewed-by: jjg
1 parent bb74ae8 commit 1d44014

File tree

10 files changed

+241
-83
lines changed

10 files changed

+241
-83
lines changed

src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlIds.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,8 @@ public class HtmlIds {
8989
static final HtmlId METHOD_SUMMARY_TABLE = HtmlId.of("method-summary-table");
9090
static final HtmlId MODULES = HtmlId.of("modules-summary");
9191
static final HtmlId MODULE_DESCRIPTION = HtmlId.of("module-description");
92+
static final HtmlId NAVBAR_SUB_LIST = HtmlId.of("navbar-sub-list");
93+
static final HtmlId NAVBAR_TOGGLE_BUTTON = HtmlId.of("navbar-toggle-button");
9294
static final HtmlId NAVBAR_TOP = HtmlId.of("navbar-top");
9395
static final HtmlId NAVBAR_TOP_FIRSTROW = HtmlId.of("navbar-top-firstrow");
9496
static final HtmlId NESTED_CLASS_SUMMARY = HtmlId.of("nested-class-summary");

src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Navigation.java

Lines changed: 38 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -350,21 +350,28 @@ private void addMainNavLinks(Content tree) {
350350
* Adds the summary links to the sub-navigation.
351351
*
352352
* @param tree the content tree to which the sub-navigation will added
353+
* @param nested whether to create a flat or nested list
353354
*/
354-
private void addSummaryLinks(Content tree) {
355+
private void addSummaryLinks(Content tree, boolean nested) {
355356
switch (documentedPage) {
356357
case MODULE, PACKAGE, CLASS, HELP -> {
357358
List<? extends Content> listContents = subNavLinks.getSubNavLinks()
358359
.stream().map(HtmlTree::LI).toList();
359360
if (!listContents.isEmpty()) {
360-
tree.add(HtmlTree.LI(switch (documentedPage) {
361+
Content label = switch (documentedPage) {
361362
case MODULE -> contents.moduleSubNavLabel;
362363
case PACKAGE -> contents.packageSubNavLabel;
363364
case CLASS -> contents.summaryLabel;
364365
case HELP -> contents.helpSubNavLabel;
365366
default -> Text.EMPTY;
366-
}).add(Entity.NO_BREAK_SPACE));
367-
addListToNav(listContents, tree);
367+
};
368+
if (nested) {
369+
tree.add(HtmlTree.LI(HtmlTree.P(label))
370+
.add(new HtmlTree(TagName.UL).add(listContents)));
371+
} else {
372+
tree.add(HtmlTree.LI(label).add(Entity.NO_BREAK_SPACE));
373+
addListToNav(listContents, tree);
374+
}
368375
}
369376
}
370377
}
@@ -374,8 +381,9 @@ private void addSummaryLinks(Content tree) {
374381
* Adds the detail links to sub-navigation.
375382
*
376383
* @param tree the content tree to which the links will be added
384+
* @param nested whether to create a flat or nested list
377385
*/
378-
private void addDetailLinks(Content tree) {
386+
private void addDetailLinks(Content tree, boolean nested) {
379387
if (documentedPage == PageMode.CLASS) {
380388
List<Content> listContents = new ArrayList<>();
381389
VisibleMemberTable vmt = configuration.getVisibleMemberTable((TypeElement) element);
@@ -394,10 +402,16 @@ private void addDetailLinks(Content tree) {
394402
}
395403
}
396404
if (!listContents.isEmpty()) {
397-
Content li = HtmlTree.LI(contents.detailLabel);
398-
li.add(Entity.NO_BREAK_SPACE);
399-
tree.add(li);
400-
addListToNav(listContents, tree);
405+
if (nested) {
406+
Content li = HtmlTree.LI(HtmlTree.P(contents.detailLabel));
407+
li.add(new HtmlTree(TagName.UL).add(listContents));
408+
tree.add(li);
409+
} else {
410+
Content li = HtmlTree.LI(contents.detailLabel);
411+
li.add(Entity.NO_BREAK_SPACE);
412+
tree.add(li);
413+
addListToNav(listContents, tree);
414+
}
401415
}
402416
}
403417
}
@@ -605,9 +619,17 @@ public Content getContent() {
605619

606620
HtmlTree navDiv = new HtmlTree(TagName.DIV);
607621
Content skipNavLinks = contents.getContent("doclet.Skip_navigation_links");
622+
String toggleNavLinks = configuration.getDocResources().getText("doclet.Toggle_navigation_links");
608623
tree.add(MarkerComments.START_OF_TOP_NAVBAR);
609624
navDiv.setStyle(HtmlStyle.topNav)
610625
.setId(HtmlIds.NAVBAR_TOP)
626+
.add(new HtmlTree(TagName.BUTTON).setId(HtmlIds.NAVBAR_TOGGLE_BUTTON)
627+
.put(HtmlAttr.ARIA_CONTROLS, HtmlIds.NAVBAR_TOP.name())
628+
.put(HtmlAttr.ARIA_EXPANDED, String.valueOf(false))
629+
.put(HtmlAttr.ARIA_LABEL, toggleNavLinks)
630+
.add(HtmlTree.SPAN(HtmlStyle.navBarToggleIcon, HtmlTree.EMPTY))
631+
.add(HtmlTree.SPAN(HtmlStyle.navBarToggleIcon, HtmlTree.EMPTY))
632+
.add(HtmlTree.SPAN(HtmlStyle.navBarToggleIcon, HtmlTree.EMPTY)))
611633
.add(HtmlTree.DIV(HtmlStyle.skipNav,
612634
links.createLink(HtmlIds.SKIP_NAVBAR_TOP, skipNavLinks,
613635
skipNavLinks.toString())));
@@ -622,18 +644,22 @@ public Content getContent() {
622644
.put(HtmlAttr.TITLE, rowListTitle);
623645
addMainNavLinks(navList);
624646
navDiv.add(navList);
647+
HtmlTree ulNavSummaryRight = new HtmlTree(TagName.UL).setStyle(HtmlStyle.subNavListSmall);
648+
addSummaryLinks(ulNavSummaryRight, true);
649+
addDetailLinks(ulNavSummaryRight, true);
650+
navDiv.add(ulNavSummaryRight);
625651
tree.add(navDiv);
626652

627653
HtmlTree subDiv = new HtmlTree(TagName.DIV).setStyle(HtmlStyle.subNav);
628654

629-
HtmlTree div = new HtmlTree(TagName.DIV);
655+
HtmlTree div = new HtmlTree(TagName.DIV).setId(HtmlIds.NAVBAR_SUB_LIST);
630656
// Add the summary links if present.
631657
HtmlTree ulNavSummary = new HtmlTree(TagName.UL).setStyle(HtmlStyle.subNavList);
632-
addSummaryLinks(ulNavSummary);
658+
addSummaryLinks(ulNavSummary, false);
633659
div.add(ulNavSummary);
634660
// Add the detail links if present.
635661
HtmlTree ulNavDetail = new HtmlTree(TagName.UL).setStyle(HtmlStyle.subNavList);
636-
addDetailLinks(ulNavDetail);
662+
addDetailLinks(ulNavDetail, false);
637663
div.add(ulNavDetail);
638664
subDiv.add(div);
639665

src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlAttr.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@
3838
public enum HtmlAttr {
3939
ALT,
4040
ARIA_CONTROLS("aria-controls"),
41+
ARIA_EXPANDED("aria-expanded"),
42+
ARIA_LABEL("aria-label"),
4143
ARIA_LABELLEDBY("aria-labelledby"),
4244
ARIA_ORIENTATION("aria-orientation"),
4345
ARIA_SELECTED("aria-selected"),

src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlStyle.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,11 @@ public enum HtmlStyle {
103103
// The etymology of the name is a mystery.
104104
navBarCell1Rev,
105105

106+
/**
107+
* The class for the navigation bar toggle button for smaller displays.
108+
*/
109+
navBarToggleIcon,
110+
106111
/**
107112
* The class for the primary list of navigation links.
108113
*/
@@ -130,6 +135,11 @@ public enum HtmlStyle {
130135
*/
131136
subNavList,
132137

138+
/**
139+
* The class for the list of subsidiary navigation links for smaller displays.
140+
*/
141+
subNavListSmall,
142+
133143
//</editor-fold>
134144

135145
//<editor-fold desc="header (title block)">

src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/search.js.template

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,35 @@ function doSearch(request, response) {
291291
response(result);
292292
}
293293
$(function() {
294+
var expanded = false;
295+
var windowWidth;
296+
function collapse() {
297+
if (expanded) {
298+
$("div#navbar-top").removeAttr("style");
299+
$("button#navbar-toggle-button")
300+
.removeClass("expanded")
301+
.attr("aria-expanded", "false");
302+
expanded = false;
303+
}
304+
}
305+
$("button#navbar-toggle-button").click(function (e) {
306+
if (expanded) {
307+
collapse();
308+
} else {
309+
$("div#navbar-top").height($("#navbar-top").prop("scrollHeight"));
310+
$("button#navbar-toggle-button")
311+
.addClass("expanded")
312+
.attr("aria-expanded", "true");
313+
expanded = true;
314+
windowWidth = window.innerWidth;
315+
}
316+
});
317+
$("ul.sub-nav-list-small li a").click(collapse);
318+
$("input#search-input").focus(collapse);
319+
$("main").click(collapse);
320+
$(window).on("orientationchange", collapse).on("resize", function(e) {
321+
if (expanded && windowWidth !== window.innerWidth) collapse();
322+
});
294323
$("#search-input").catcomplete({
295324
minLength: 1,
296325
delay: 300,

src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ doclet.Window_Single_Index=Index
7878
doclet.Window_Split_Index={0}-Index
7979
doclet.Help=Help
8080
doclet.Skip_navigation_links=Skip navigation links
81+
doclet.Toggle_navigation_links=Toggle navigation links
8182
doclet.Navigation=Navigation
8283
doclet.navDeprecated=Deprecated
8384
doclet.Window_Deprecated_List=Deprecated List

0 commit comments

Comments
 (0)