< prev index next >

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

Print this page




   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 }
< prev index next >