|
27 | 27 |
|
28 | 28 | import java.util.ArrayList;
|
29 | 29 | import java.util.List;
|
| 30 | +import java.util.Objects; |
30 | 31 |
|
31 | 32 | import javax.lang.model.element.Element;
|
| 33 | +import javax.lang.model.element.ElementKind; |
32 | 34 | import javax.lang.model.element.ModuleElement;
|
33 | 35 | import javax.lang.model.element.PackageElement;
|
34 | 36 | import javax.lang.model.element.TypeElement;
|
@@ -68,7 +70,6 @@ public class Navigation {
|
68 | 70 | private final PageMode documentedPage;
|
69 | 71 | private Content userHeader;
|
70 | 72 | private final String rowListTitle;
|
71 |
| - private List<Content> subNavLinks = List.of(); |
72 | 73 |
|
73 | 74 | public enum PageMode {
|
74 | 75 | ALL_CLASSES,
|
@@ -120,11 +121,6 @@ public Navigation setUserHeader(Content userHeader) {
|
120 | 121 | return this;
|
121 | 122 | }
|
122 | 123 |
|
123 |
| - public Navigation setSubNavLinks(List<Content> subNavLinks) { |
124 |
| - this.subNavLinks = subNavLinks; |
125 |
| - return this; |
126 |
| - } |
127 |
| - |
128 | 124 | /**
|
129 | 125 | * Adds the links for the main navigation.
|
130 | 126 | *
|
@@ -320,26 +316,6 @@ private void addMainNavLinks(Content target) {
|
320 | 316 | }
|
321 | 317 | }
|
322 | 318 |
|
323 |
| - /** |
324 |
| - * Adds the navigation Type detail link. |
325 |
| - * |
326 |
| - * @param kind the kind of member being documented |
327 |
| - * @param link true if the members are listed and need to be linked |
328 |
| - * @param listContents the list of contents to which the detail will be added. |
329 |
| - */ |
330 |
| - protected void addTypeDetailLink(VisibleMemberTable.Kind kind, boolean link, List<Content> listContents) { |
331 |
| - addContentToList(listContents, switch (kind) { |
332 |
| - case CONSTRUCTORS -> links.createLinkOrLabel(HtmlIds.CONSTRUCTOR_DETAIL, contents.navConstructor, link); |
333 |
| - case ENUM_CONSTANTS -> links.createLinkOrLabel(HtmlIds.ENUM_CONSTANT_DETAIL, contents.navEnum, link); |
334 |
| - case FIELDS -> links.createLinkOrLabel(HtmlIds.FIELD_DETAIL, contents.navField, link); |
335 |
| - case METHODS -> links.createLinkOrLabel(HtmlIds.METHOD_DETAIL, contents.navMethod, link); |
336 |
| - case PROPERTIES -> links.createLinkOrLabel(HtmlIds.PROPERTY_DETAIL, contents.navProperty, link); |
337 |
| - case ANNOTATION_TYPE_MEMBER -> links.createLinkOrLabel(HtmlIds.ANNOTATION_TYPE_ELEMENT_DETAIL, |
338 |
| - contents.navAnnotationTypeMember, link); |
339 |
| - default -> Text.EMPTY; |
340 |
| - }); |
341 |
| - } |
342 |
| - |
343 | 319 | private void addContentToList(List<Content> listContents, Content source) {
|
344 | 320 | listContents.add(HtmlTree.LI(source));
|
345 | 321 | }
|
@@ -397,6 +373,46 @@ private void addOverviewLink(Content target) {
|
397 | 373 | }
|
398 | 374 | }
|
399 | 375 |
|
| 376 | + /** |
| 377 | + * Adds breadcrumb navigation links for {@code element} and its containing elements |
| 378 | + * to {@code contents}. Only module, package and type elements are supported in |
| 379 | + * breadcrumb navigation. |
| 380 | + * |
| 381 | + * @param elem a module, package or type element |
| 382 | + * @param contents the list to which links are added |
| 383 | + * @param selected {@code true} if elem is the current page element |
| 384 | + */ |
| 385 | + protected void addBreadcrumbLinks(Element elem, List<Content> contents, boolean selected) { |
| 386 | + if (elem == null) { |
| 387 | + return; |
| 388 | + } else if (elem.getKind() != ElementKind.MODULE) { |
| 389 | + addBreadcrumbLinks(elem.getEnclosingElement(), contents, false); |
| 390 | + } else if (!configuration.showModules) { |
| 391 | + return; |
| 392 | + } |
| 393 | + var docPaths = configuration.docPaths; |
| 394 | + HtmlTree link = switch (elem) { |
| 395 | + case ModuleElement mdle -> links.createLink(pathToRoot.resolve( |
| 396 | + docPaths.moduleSummary(mdle)), |
| 397 | + Text.of(mdle.getQualifiedName())); |
| 398 | + case PackageElement pkg -> links.createLink(pathToRoot.resolve( |
| 399 | + docPaths.forPackage(pkg).resolve(DocPaths.PACKAGE_SUMMARY)), |
| 400 | + pkg.isUnnamed() |
| 401 | + ? configuration.contents.defaultPackageLabel |
| 402 | + : Text.of(pkg.getQualifiedName())); |
| 403 | + // Breadcrumb navigation displays nested classes as separate links. |
| 404 | + // Enclosing classes may be undocumented, in which case we just display the class name. |
| 405 | + case TypeElement type -> (configuration.isGeneratedDoc(type) && !configuration.utils.hasHiddenTag(type)) |
| 406 | + ? links.createLink(pathToRoot.resolve( |
| 407 | + docPaths.forClass(type)), type.getSimpleName().toString()) |
| 408 | + : HtmlTree.SPAN(Text.of(type.getSimpleName().toString())); |
| 409 | + default -> throw new IllegalArgumentException(Objects.toString(elem)); |
| 410 | + }; |
| 411 | + if (selected) { |
| 412 | + link.setStyle(HtmlStyle.currentSelection); |
| 413 | + } |
| 414 | + contents.add(link); |
| 415 | + } |
400 | 416 |
|
401 | 417 | private void addPageElementLink(Content list) {
|
402 | 418 | Content link = switch (element) {
|
@@ -530,7 +546,12 @@ public Content getContent() {
|
530 | 546 | navigationBar.add(HtmlTree.DIV(HtmlStyle.topNav, navContent).setId(HtmlIds.NAVBAR_TOP));
|
531 | 547 |
|
532 | 548 | var subNavContent = HtmlTree.DIV(HtmlStyle.navContent);
|
533 |
| - |
| 549 | + List<Content> subNavLinks = new ArrayList<>(); |
| 550 | + switch (documentedPage) { |
| 551 | + case MODULE, PACKAGE, CLASS, USE, DOC_FILE, TREE -> { |
| 552 | + addBreadcrumbLinks(element, subNavLinks, true); |
| 553 | + } |
| 554 | + } |
534 | 555 | // Add the breadcrumb navigation links if present.
|
535 | 556 | var breadcrumbNav = HtmlTree.OL(HtmlStyle.subNavList);
|
536 | 557 | breadcrumbNav.addAll(subNavLinks, HtmlTree::LI);
|
|
0 commit comments