src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageIndexWriter.java
changeset 47447 9887d1bc3e9c
parent 47427 251676148c62
child 47846 4e78aba768f0
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageIndexWriter.java	Wed Oct 25 10:40:45 2017 -0700
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageIndexWriter.java	Wed Oct 25 12:29:00 2017 -0700
@@ -29,17 +29,17 @@
 
 import javax.lang.model.element.PackageElement;
 
-import jdk.javadoc.internal.doclets.formats.html.markup.HtmlConstants;
+import jdk.javadoc.internal.doclets.formats.html.markup.HtmlAttr;
 import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle;
 import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTag;
 import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
-import jdk.javadoc.internal.doclets.formats.html.markup.RawHtml;
 import jdk.javadoc.internal.doclets.formats.html.markup.StringContent;
 import jdk.javadoc.internal.doclets.toolkit.Content;
 import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException;
 import jdk.javadoc.internal.doclets.toolkit.util.DocPath;
 import jdk.javadoc.internal.doclets.toolkit.util.DocPaths;
 import jdk.javadoc.internal.doclets.toolkit.util.Group;
+import jdk.javadoc.internal.doclets.toolkit.util.GroupTypes;
 
 /**
  * Generate the package index page "overview-summary.html" for the right-hand
@@ -65,9 +65,19 @@
     private final Map<String, SortedSet<PackageElement>> groupPackageMap;
 
     /**
-     * List to store the order groups as specified on the command line.
+     * List to store the order groups, which has elements to be displayed, as specified on the command line.
      */
-    private final List<String> groupList;
+    private final List<String> groupList = new ArrayList<>();
+
+    private final GroupTypes groupTypes;
+
+    private int groupTypesOr = 0;
+
+    protected Map<String, Integer> groupTypeMap = new LinkedHashMap<>();
+
+    boolean altColor = true;
+
+    int counter = 0;
 
     /**
      * HTML tree for main tag.
@@ -86,7 +96,10 @@
     public PackageIndexWriter(HtmlConfiguration configuration, DocPath filename) {
         super(configuration, filename);
         groupPackageMap = configuration.group.groupPackages(packages);
-        groupList = configuration.group.getGroupList();
+        configuration.group.getGroupList().stream()
+                .filter(groupPackageMap::containsKey)
+                .forEachOrdered(groupList::add);
+        groupTypes = new GroupTypes(groupList, resources.getText("doclet.All_Packages"));
     }
 
     /**
@@ -109,50 +122,58 @@
      */
     @Override
     protected void addIndex(Content body) {
-        for (String groupname : groupList) {
-            SortedSet<PackageElement> list = groupPackageMap.get(groupname);
-            if (list != null && !list.isEmpty()) {
-                addIndexContents(list,
-                        groupname, configuration.getText("doclet.Member_Table_Summary",
-                                groupname, configuration.getText("doclet.packages")), body);
-            }
-        }
+        addIndexContents(body);
     }
 
     /**
      * {@inheritDoc}
      */
     @Override
-    protected void addPackagesList(Collection<PackageElement> packages, String text,
-            String tableSummary, Content body) {
-        Content table = (configuration.isOutputHtml5())
-                ? HtmlTree.TABLE(HtmlStyle.overviewSummary, getTableCaption(new RawHtml(text)))
-                : HtmlTree.TABLE(HtmlStyle.overviewSummary, tableSummary, getTableCaption(new RawHtml(text)));
-        table.addContent(getPackageTableHeader().toContent());
-        Content tbody = new HtmlTree(HtmlTag.TBODY);
-        addPackagesList(packages, tbody);
-        table.addContent(tbody);
-        Content anchor = getMarkerAnchor(text);
-        Content div = HtmlTree.DIV(HtmlStyle.contentContainer, anchor);
-        div.addContent(table);
-        if (configuration.allowTag(HtmlTag.MAIN)) {
-            htmlTree.addContent(div);
-        } else {
-            body.addContent(div);
+    protected void addPackagesList(Content body) {
+        if (!groupList.isEmpty()) {
+            Content caption;
+            TreeMap<PackageElement, String> groupMap = new TreeMap<>(utils.makePackageComparator());
+            Content tbody = new HtmlTree(HtmlTag.TBODY);
+            String tableSummary = configuration.getText("doclet.Member_Table_Summary",
+                    configuration.getText("doclet.Package_Summary"), configuration.getText("doclet.packages"));
+            for (String groupname : groupList) {
+                for (PackageElement pkg : groupPackageMap.get(groupname)) {
+                    groupMap.put(pkg, groupname);
+                }
+            }
+            if (!groupMap.isEmpty()) {
+                addPackagesList(groupMap, tbody);
+            }
+            if (showTabs(groupTypes)) {
+                caption = getTableCaption(groupTypes);
+                generateGroupTypesScript(groupTypeMap, groupTypes.getGroupTypes());
+            } else {
+                caption = getTableCaption((groupList.size() == 1) ? new StringContent(groupList.get(0)) : contents.packagesLabel);
+            }
+            Content table = getTableHeader(caption, tableSummary, HtmlStyle.overviewSummary);
+            table.addContent(getPackageTableHeader().toContent());
+            table.addContent(tbody);
+            Content div = HtmlTree.DIV(HtmlStyle.contentContainer, table);
+            if (configuration.allowTag(HtmlTag.MAIN)) {
+                htmlTree.addContent(div);
+            } else {
+                body.addContent(div);
+            }
         }
     }
 
     /**
      * Adds list of packages in the index table. Generate link to each package.
      *
-     * @param packages Packages to which link is to be generated
+     * @param map map of package elements and group names
      * @param tbody the documentation tree to which the list will be added
      */
-    protected void addPackagesList(Collection<PackageElement> packages, Content tbody) {
-        boolean altColor = true;
-        for (PackageElement pkg : packages) {
+    protected void addPackagesList(TreeMap<PackageElement, String> map, Content tbody) {
+        String groupname;
+        for (PackageElement pkg : map.keySet()) {
             if (!pkg.isUnnamed()) {
                 if (!(configuration.nodeprecated && utils.isDeprecated(pkg))) {
+                    groupname = map.get(pkg);
                     Content packageLinkContent = getPackageLink(pkg, getPackageName(pkg));
                     Content thPackage = HtmlTree.TH_ROW_SCOPE(HtmlStyle.colFirst, packageLinkContent);
                     HtmlTree tdSummary = new HtmlTree(HtmlTag.TD);
@@ -161,6 +182,12 @@
                     HtmlTree tr = HtmlTree.TR(thPackage);
                     tr.addContent(tdSummary);
                     tr.addStyle(altColor ? HtmlStyle.altColor : HtmlStyle.rowColor);
+                    int groupType = groupTypes.getTableTab(groupname).value();
+                    groupTypesOr = groupTypesOr | groupType;
+                    String tableId = "i" + counter;
+                    counter++;
+                    groupTypeMap.put(tableId, groupType);
+                    tr.addAttr(HtmlAttr.ID, tableId);
                     tbody.addContent(tr);
                 }
             }