8190295: Introduce a new Table builder class

Reviewed-by: bpatel, ksrini
This commit is contained in:
Jonathan Gibbons 2017-11-16 15:01:45 -08:00
parent 99fe8dcb60
commit fbd053bd26
52 changed files with 1449 additions and 1625 deletions

@ -364,7 +364,7 @@ public class AbstractIndexWriter extends HtmlDocletWriter {
List<? extends DocTree> tags;
Content span = HtmlTree.SPAN(HtmlStyle.deprecatedLabel, getDeprecatedPhrase(element));
HtmlTree div = new HtmlTree(HtmlTag.DIV);
div.addStyle(HtmlStyle.deprecationBlock);
div.setStyle(HtmlStyle.deprecationBlock);
if (utils.isDeprecated(element)) {
div.addContent(span);
tags = utils.getBlockTags(element, DocTree.Kind.DEPRECATED);

@ -25,6 +25,9 @@
package jdk.javadoc.internal.doclets.formats.html;
import jdk.javadoc.internal.doclets.formats.html.markup.Table;
import jdk.javadoc.internal.doclets.formats.html.markup.TableHeader;
import java.util.*;
import java.util.stream.Collectors;
@ -36,7 +39,7 @@ import javax.lang.model.element.TypeParameterElement;
import javax.lang.model.type.TypeMirror;
import com.sun.source.doctree.DocTree;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlAttr;
import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlConstants;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTag;
@ -46,7 +49,6 @@ import jdk.javadoc.internal.doclets.toolkit.Content;
import jdk.javadoc.internal.doclets.toolkit.MemberSummaryWriter;
import jdk.javadoc.internal.doclets.toolkit.Resources;
import jdk.javadoc.internal.doclets.toolkit.taglets.DeprecatedTaglet;
import jdk.javadoc.internal.doclets.toolkit.util.MethodTypes;
import jdk.javadoc.internal.doclets.toolkit.util.Utils;
import jdk.javadoc.internal.doclets.toolkit.util.VisibleMemberMap;
@ -74,9 +76,6 @@ public abstract class AbstractMemberWriter implements MemberSummaryWriter {
protected final Resources resources;
protected final TypeElement typeElement;
protected Map<String, Integer> typeMap = new LinkedHashMap<>();
protected Set<MethodTypes> methodTypes = EnumSet.noneOf(MethodTypes.class);
private int methodTypesOr = 0;
public final boolean nodepr;
protected boolean printedSummaryHeader = false;
@ -109,14 +108,7 @@ public abstract class AbstractMemberWriter implements MemberSummaryWriter {
*
* @return a string for the table summary
*/
public abstract String getTableSummary();
/**
* Get the caption for the member summary table.
*
* @return a string for the table caption
*/
public abstract Content getCaption();
private String getTableSummaryX() { return null; }
/**
* Get the summary table header for the member.
@ -126,6 +118,27 @@ public abstract class AbstractMemberWriter implements MemberSummaryWriter {
*/
public abstract TableHeader getSummaryTableHeader(Element member);
private Table summaryTable;
private Table getSummaryTable() {
if (summaryTable == null) {
summaryTable = createSummaryTable();
}
return summaryTable;
}
/**
* Create the summary table for this element.
* The table should be created and initialized if needed, and configured
* so that it is ready to add content with {@link Table#addRows(Content[])}
* and similar methods.
*
* @return the summary table
*/
protected abstract Table createSummaryTable();
/**
* Add inherited summary label for the member.
*
@ -229,7 +242,7 @@ public abstract class AbstractMemberWriter implements MemberSummaryWriter {
* Add the modifier for the member. The modifiers are ordered as specified
* by <em>The Java Language Specification</em>.
*
* @param member the member for which teh modifier will be added.
* @param member the member for which the modifier will be added.
* @param htmltree the content tree to which the modifier information will be added.
*/
protected void addModifiers(Element member, Content htmltree) {
@ -420,51 +433,41 @@ public abstract class AbstractMemberWriter implements MemberSummaryWriter {
List<? extends Element> members = mems;
boolean printedUseTableHeader = false;
if (members.size() > 0) {
Content caption = writer.getTableCaption(heading);
Content table = (configuration.isOutputHtml5())
? HtmlTree.TABLE(HtmlStyle.useSummary, caption)
: HtmlTree.TABLE(HtmlStyle.useSummary, tableSummary, caption);
Content tbody = new HtmlTree(HtmlTag.TBODY);
boolean altColor = true;
Table useTable = new Table(configuration.htmlVersion, HtmlStyle.useSummary)
.setSummary(tableSummary)
.setCaption(heading)
.setRowScopeColumn(1)
.setColumnStyles(HtmlStyle.colFirst, HtmlStyle.colSecond, HtmlStyle.colLast);
for (Element element : members) {
TypeElement te = utils.getEnclosingTypeElement(element);
TypeElement te = (typeElement == null)
? utils.getEnclosingTypeElement(element)
: typeElement;
if (!printedUseTableHeader) {
table.addContent(getSummaryTableHeader(element).toContent());
useTable.setHeader(getSummaryTableHeader(element));
printedUseTableHeader = true;
}
HtmlTree tr = new HtmlTree(HtmlTag.TR);
tr.addStyle(altColor ? HtmlStyle.altColor : HtmlStyle.rowColor);
altColor = !altColor;
HtmlTree tdFirst = new HtmlTree(HtmlTag.TD);
tdFirst.addStyle(HtmlStyle.colFirst);
writer.addSummaryType(this, element, tdFirst);
tr.addContent(tdFirst);
HtmlTree thType = new HtmlTree(HtmlTag.TH);
thType.addStyle(HtmlStyle.colSecond);
thType.addAttr(HtmlAttr.SCOPE, "row");
Content summaryType = new ContentBuilder();
addSummaryType(element, summaryType);
Content typeContent = new ContentBuilder();
if (te != null
&& !utils.isConstructor(element)
&& !utils.isClass(element)
&& !utils.isInterface(element)
&& !utils.isAnnotationType(element)) {
HtmlTree name = new HtmlTree(HtmlTag.SPAN);
name.addStyle(HtmlStyle.typeNameLabel);
name.setStyle(HtmlStyle.typeNameLabel);
name.addContent(name(te) + ".");
thType.addContent(name);
typeContent.addContent(name);
}
addSummaryLink(utils.isClass(element) || utils.isInterface(element)
? LinkInfoImpl.Kind.CLASS_USE
: LinkInfoImpl.Kind.MEMBER,
te, element, thType);
tr.addContent(thType);
HtmlTree tdDesc = new HtmlTree(HtmlTag.TD);
tdDesc.addStyle(HtmlStyle.colLast);
writer.addSummaryLinkComment(this, element, tdDesc);
tr.addContent(tdDesc);
tbody.addContent(tr);
te, element, typeContent);
Content desc = new ContentBuilder();
writer.addSummaryLinkComment(this, element, desc);
useTable.addRow(summaryType, typeContent, desc);
}
table.addContent(tbody);
contentTree.addContent(table);
contentTree.addContent(useTable.toContent());
}
}
@ -515,81 +518,25 @@ public abstract class AbstractMemberWriter implements MemberSummaryWriter {
* @param tElement the class that is being documented
* @param member the member being documented
* @param firstSentenceTags the first sentence tags to be added to the summary
* @param tableContents the list of contents to which the documentation will be added
* @param counter the counter for determining id and style for the table row
*/
public void addMemberSummary(TypeElement tElement, Element member,
List<? extends DocTree> firstSentenceTags, List<Content> tableContents, int counter,
VisibleMemberMap.Kind vmmKind) {
HtmlTree tdSummaryType = new HtmlTree(HtmlTag.TD);
tdSummaryType.addStyle(HtmlStyle.colFirst);
writer.addSummaryType(this, member, tdSummaryType);
HtmlTree tr = HtmlTree.TR(tdSummaryType);
HtmlTree thSummaryLink = new HtmlTree(HtmlTag.TH);
setSummaryColumnStyleAndScope(thSummaryLink);
addSummaryLink(tElement, member, thSummaryLink);
tr.addContent(thSummaryLink);
HtmlTree tdDesc = new HtmlTree(HtmlTag.TD);
tdDesc.addStyle(HtmlStyle.colLast);
writer.addSummaryLinkComment(this, member, firstSentenceTags, tdDesc);
tr.addContent(tdDesc);
if (utils.isMethod(member) && !utils.isAnnotationType(member)
&& vmmKind != VisibleMemberMap.Kind.PROPERTIES) {
int methodType = utils.isStatic(member) ? MethodTypes.STATIC.tableTabs().value() :
MethodTypes.INSTANCE.tableTabs().value();
if (utils.isInterface(member.getEnclosingElement())) {
methodType = utils.isAbstract(member)
? methodType | MethodTypes.ABSTRACT.tableTabs().value()
: methodType | MethodTypes.DEFAULT.tableTabs().value();
} else {
methodType = utils.isAbstract(member)
? methodType | MethodTypes.ABSTRACT.tableTabs().value()
: methodType | MethodTypes.CONCRETE.tableTabs().value();
}
if (utils.isDeprecated(member) || utils.isDeprecated(typeElement)) {
methodType = methodType | MethodTypes.DEPRECATED.tableTabs().value();
}
methodTypesOr = methodTypesOr | methodType;
String tableId = "i" + counter;
typeMap.put(tableId, methodType);
tr.addAttr(HtmlAttr.ID, tableId);
List<? extends DocTree> firstSentenceTags) {
if (tElement != typeElement) {
throw new IllegalStateException();
}
if (counter%2 == 0)
tr.addStyle(HtmlStyle.altColor);
else
tr.addStyle(HtmlStyle.rowColor);
tableContents.add(tr);
}
/**
* Generate the method types set and return true if the method summary table
* needs to show tabs.
*
* @return true if the table should show tabs
*/
public boolean showTabs() {
int value;
for (MethodTypes type : EnumSet.allOf(MethodTypes.class)) {
value = type.tableTabs().value();
if ((value & methodTypesOr) == value) {
methodTypes.add(type);
}
}
boolean showTabs = methodTypes.size() > 1;
if (showTabs) {
methodTypes.add(MethodTypes.ALL);
}
return showTabs;
}
/**
* Set the style and scope attribute for the summary column.
*
* @param thTree the column for which the style and scope attribute will be set
*/
public void setSummaryColumnStyleAndScope(HtmlTree thTree) {
thTree.addStyle(HtmlStyle.colSecond);
thTree.addAttr(HtmlAttr.SCOPE, "row");
Table table = getSummaryTable();
List<Content> rowContents = new ArrayList<>();
Content summaryType = new ContentBuilder();
addSummaryType(member, summaryType);
if (!summaryType.isEmpty())
rowContents.add(summaryType);
Content summaryLink = new ContentBuilder();
addSummaryLink(tElement, member, summaryLink);
rowContents.add(summaryLink);
Content desc = new ContentBuilder();
writer.addSummaryLinkComment(this, member, firstSentenceTags, desc);
rowContents.add(desc);
table.addRow(member, rowContents);
}
/**
@ -601,6 +548,7 @@ public abstract class AbstractMemberWriter implements MemberSummaryWriter {
* @param isLast true if this is the last member in the list
* @param linksTree the content tree to which the summary will be added
*/
@Override
public void addInheritedMemberSummary(TypeElement tElement,
Element nestedClass, boolean isFirst, boolean isLast,
Content linksTree) {
@ -614,6 +562,7 @@ public abstract class AbstractMemberWriter implements MemberSummaryWriter {
* @param tElement the class the inherited member belongs to
* @return a content tree for the inherited summary header
*/
@Override
public Content getInheritedSummaryHeader(TypeElement tElement) {
Content inheritedTree = writer.getMemberTreeHeader();
writer.addInheritedSummaryHeader(this, tElement, inheritedTree);
@ -625,6 +574,7 @@ public abstract class AbstractMemberWriter implements MemberSummaryWriter {
*
* @return a content tree for the inherited summary links
*/
@Override
public Content getInheritedSummaryLinksTree() {
return new HtmlTree(HtmlTag.CODE);
}
@ -633,11 +583,18 @@ public abstract class AbstractMemberWriter implements MemberSummaryWriter {
* Get the summary table tree for the given class.
*
* @param tElement the class for which the summary table is generated
* @param tableContents list of contents to be displayed in the summary table
* @return a content tree for the summary table
*/
public Content getSummaryTableTree(TypeElement tElement, List<Content> tableContents) {
return writer.getSummaryTableTree(this, tElement, tableContents, showTabs());
@Override
public Content getSummaryTableTree(TypeElement tElement) {
if (tElement != typeElement) {
throw new IllegalStateException();
}
Table table = getSummaryTable();
if (table.needsScript()) {
writer.getScript().addContent(table.getScript());
}
return table.toContent();
}
/**
@ -646,6 +603,7 @@ public abstract class AbstractMemberWriter implements MemberSummaryWriter {
* @param memberTree the content tree of member to be documented
* @return a content tree that will be added to the class documentation
*/
@Override
public Content getMemberTree(Content memberTree) {
return writer.getMemberTree(memberTree);
}

@ -203,7 +203,7 @@ public abstract class AbstractModuleIndexWriter extends HtmlDocletWriter {
HtmlTree htmlTree = (configuration.allowTag(HtmlTag.NAV))
? HtmlTree.NAV()
: new HtmlTree(HtmlTag.DIV);
htmlTree.addStyle(HtmlStyle.indexNav);
htmlTree.setStyle(HtmlStyle.indexNav);
HtmlTree ul = new HtmlTree(HtmlTag.UL);
addAllClassesLink(ul);
addAllPackagesLink(ul);
@ -226,7 +226,7 @@ public abstract class AbstractModuleIndexWriter extends HtmlDocletWriter {
HtmlTree htmlTree = (configuration.allowTag(HtmlTag.NAV))
? HtmlTree.NAV()
: new HtmlTree(HtmlTag.DIV);
htmlTree.addStyle(HtmlStyle.indexNav);
htmlTree.setStyle(HtmlStyle.indexNav);
HtmlTree ul = new HtmlTree(HtmlTag.UL);
addAllClassesLink(ul);
addAllPackagesLink(ul);

@ -146,7 +146,7 @@ public abstract class AbstractPackageIndexWriter extends HtmlDocletWriter {
HtmlTree htmlTree = (configuration.allowTag(HtmlTag.NAV))
? HtmlTree.NAV()
: new HtmlTree(HtmlTag.DIV);
htmlTree.addStyle(HtmlStyle.indexNav);
htmlTree.setStyle(HtmlStyle.indexNav);
HtmlTree ul = new HtmlTree(HtmlTag.UL);
addAllClassesLink(ul);
if (configuration.showModules && configuration.modules.size() > 1) {

@ -88,7 +88,7 @@ public abstract class AbstractTreeWriter extends HtmlDocletWriter {
Content ul = new HtmlTree(HtmlTag.UL);
for (TypeElement local : collection) {
HtmlTree li = new HtmlTree(HtmlTag.LI);
li.addStyle(HtmlStyle.circle);
li.setStyle(HtmlStyle.circle);
addPartialInfo(local, li);
addExtendsImplements(parent, local, li);
addLevelInfo(local, classtree.directSubClasses(local, isEnum),

@ -25,12 +25,16 @@
package jdk.javadoc.internal.doclets.formats.html;
import jdk.javadoc.internal.doclets.formats.html.markup.Table;
import java.util.Arrays;
import javax.lang.model.element.Element;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.TypeElement;
import javax.lang.model.type.TypeMirror;
import jdk.javadoc.internal.doclets.formats.html.TableHeader;
import jdk.javadoc.internal.doclets.formats.html.markup.TableHeader;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlConstants;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTag;
@ -197,22 +201,6 @@ public class AnnotationTypeFieldWriterImpl extends AbstractMemberWriter
memberTree.addContent(label);
}
/**
* {@inheritDoc}
*/
public String getTableSummary() {
return configuration.getText("doclet.Member_Table_Summary",
configuration.getText("doclet.Field_Summary"),
configuration.getText("doclet.fields"));
}
/**
* {@inheritDoc}
*/
public Content getCaption() {
return configuration.getContent("doclet.Fields");
}
/**
* {@inheritDoc}
*/
@ -222,6 +210,25 @@ public class AnnotationTypeFieldWriterImpl extends AbstractMemberWriter
contents.descriptionLabel);
}
@Override
protected Table createSummaryTable() {
String summary = resources.getText("doclet.Member_Table_Summary",
resources.getText("doclet.Field_Summary"),
resources.getText("doclet.fields"));
Content caption = contents.getContent("doclet.Fields");
TableHeader header = new TableHeader(contents.modifierAndTypeLabel, contents.fields,
contents.descriptionLabel);
return new Table(configuration.htmlVersion, HtmlStyle.memberSummary)
.setSummary(summary)
.setCaption(caption)
.setHeader(header)
.setRowScopeColumn(1)
.setColumnStyles(HtmlStyle.colFirst, HtmlStyle.colSecond, HtmlStyle.colLast)
.setUseTBody(false); // temporary? compatibility mode for TBody
}
/**
* {@inheritDoc}
*/

@ -25,15 +25,14 @@
package jdk.javadoc.internal.doclets.formats.html;
import java.util.Arrays;
import java.util.List;
import jdk.javadoc.internal.doclets.formats.html.markup.TableHeader;
import javax.lang.model.element.AnnotationValue;
import javax.lang.model.element.Element;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.TypeElement;
import jdk.javadoc.internal.doclets.formats.html.TableHeader;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlConstants;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.formats.html.markup.StringContent;
@ -71,6 +70,7 @@ public class AnnotationTypeOptionalMemberWriterImpl extends
/**
* {@inheritDoc}
*/
@Override
public Content getMemberSummaryHeader(TypeElement typeElement,
Content memberSummaryTree) {
memberSummaryTree.addContent(
@ -83,6 +83,7 @@ public class AnnotationTypeOptionalMemberWriterImpl extends
/**
* {@inheritDoc}
*/
@Override
public void addMemberTree(Content memberSummaryTree, Content memberTree) {
writer.addMemberTree(memberSummaryTree, memberTree);
}
@ -90,6 +91,7 @@ public class AnnotationTypeOptionalMemberWriterImpl extends
/**
* {@inheritDoc}
*/
@Override
public void addDefaultValueInfo(Element member, Content annotationDocTree) {
if (utils.isAnnotationType(member)) {
ExecutableElement ee = (ExecutableElement)member;
@ -107,6 +109,7 @@ public class AnnotationTypeOptionalMemberWriterImpl extends
/**
* {@inheritDoc}
*/
@Override
public void addSummaryLabel(Content memberTree) {
Content label = HtmlTree.HEADING(HtmlConstants.SUMMARY_HEADING,
contents.annotateTypeOptionalMemberSummaryLabel);
@ -116,7 +119,8 @@ public class AnnotationTypeOptionalMemberWriterImpl extends
/**
* {@inheritDoc}
*/
public String getTableSummary() {
@Override
protected String getTableSummary() {
return resources.getText("doclet.Member_Table_Summary",
resources.getText("doclet.Annotation_Type_Optional_Member_Summary"),
resources.getText("doclet.annotation_type_optional_members"));
@ -125,8 +129,9 @@ public class AnnotationTypeOptionalMemberWriterImpl extends
/**
* {@inheritDoc}
*/
public Content getCaption() {
return configuration.getContent("doclet.Annotation_Type_Optional_Members");
@Override
protected Content getCaption() {
return contents.getContent("doclet.Annotation_Type_Optional_Members");
}
/**
@ -141,6 +146,7 @@ public class AnnotationTypeOptionalMemberWriterImpl extends
/**
* {@inheritDoc}
*/
@Override
public void addSummaryAnchor(TypeElement typeElement, Content memberTree) {
memberTree.addContent(writer.getMarkerAnchor(
SectionName.ANNOTATION_TYPE_OPTIONAL_ELEMENT_SUMMARY));
@ -149,6 +155,7 @@ public class AnnotationTypeOptionalMemberWriterImpl extends
/**
* {@inheritDoc}
*/
@Override
protected Content getNavSummaryLink(TypeElement typeElement, boolean link) {
if (link) {
return writer.getHyperLink(

@ -25,6 +25,8 @@
package jdk.javadoc.internal.doclets.formats.html;
import jdk.javadoc.internal.doclets.formats.html.markup.Table;
import java.util.Arrays;
import java.util.List;
@ -33,7 +35,7 @@ import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.TypeElement;
import javax.lang.model.type.TypeMirror;
import jdk.javadoc.internal.doclets.formats.html.TableHeader;
import jdk.javadoc.internal.doclets.formats.html.markup.TableHeader;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlConstants;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTag;
@ -203,29 +205,49 @@ public class AnnotationTypeRequiredMemberWriterImpl extends AbstractMemberWriter
}
/**
* {@inheritDoc}
* Get the summary for the member summary table.
*
* @return a string for the table summary
*/
public String getTableSummary() {
return configuration.getText("doclet.Member_Table_Summary",
configuration.getText("doclet.Annotation_Type_Required_Member_Summary"),
configuration.getText("doclet.annotation_type_required_members"));
}
/**
* {@inheritDoc}
*/
public Content getCaption() {
return configuration.getContent("doclet.Annotation_Type_Required_Members");
// Overridden by AnnotationTypeOptionalMemberWriterImpl
protected String getTableSummary() {
return resources.getText("doclet.Member_Table_Summary",
resources.getText("doclet.Annotation_Type_Required_Member_Summary"),
resources.getText("doclet.annotation_type_required_members"));
}
/**
* Get the caption for the summary table.
* @return the caption
*/
// Overridden by AnnotationTypeOptionalMemberWriterImpl
protected Content getCaption() {
return contents.getContent("doclet.Annotation_Type_Required_Members");
}
/**
* {@inheritDoc}
*/
@Override
public TableHeader getSummaryTableHeader(Element member) {
return new TableHeader(contents.modifierAndTypeLabel,
contents.annotationTypeRequiredMemberLabel, contents.descriptionLabel);
}
/**
* {@inheritDoc}
*/
@Override
protected Table createSummaryTable() {
return new Table(configuration.htmlVersion, HtmlStyle.memberSummary)
.setSummary(getTableSummary())
.setCaption(getCaption())
.setHeader(getSummaryTableHeader(typeElement))
.setRowScopeColumn(1)
.setColumnStyles(HtmlStyle.colFirst, HtmlStyle.colSecond, HtmlStyle.colLast)
.setUseTBody(false); // temporary? compatibility mode for TBody
}
/**
* {@inheritDoc}
*/

@ -191,7 +191,7 @@ public class AnnotationTypeWriterImpl extends SubWriterHolderWriter
}
bodyTree.addContent(HtmlConstants.START_OF_CLASS_DATA);
HtmlTree div = new HtmlTree(HtmlTag.DIV);
div.addStyle(HtmlStyle.header);
div.setStyle(HtmlStyle.header);
if (configuration.showModules) {
ModuleElement mdle = configuration.docEnv.getElementUtils().getModuleOf(annotationType);
Content typeModuleLabel = HtmlTree.SPAN(HtmlStyle.moduleLabelInType, contents.moduleLabel);

@ -25,6 +25,8 @@
package jdk.javadoc.internal.doclets.formats.html;
import jdk.javadoc.internal.doclets.formats.html.markup.Table;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Collections;
@ -245,7 +247,7 @@ public class ClassUseWriter extends SubWriterHolderWriter {
protected void generateClassUseFile() throws DocFileIOException {
HtmlTree body = getClassUseHeader();
HtmlTree div = new HtmlTree(HtmlTag.DIV);
div.addStyle(HtmlStyle.classUseContainer);
div.setStyle(HtmlStyle.classUseContainer);
if (pkgSet.size() > 0) {
addClassUse(div);
} else {
@ -276,7 +278,7 @@ public class ClassUseWriter extends SubWriterHolderWriter {
*/
protected void addClassUse(Content contentTree) {
HtmlTree ul = new HtmlTree(HtmlTag.UL);
ul.addStyle(HtmlStyle.blockList);
ul.setStyle(HtmlStyle.blockList);
if (configuration.packages.size() > 1) {
addPackageList(ul);
addPackageAnnotationList(ul);
@ -291,25 +293,19 @@ public class ClassUseWriter extends SubWriterHolderWriter {
* @param contentTree the content tree to which the packages elements will be added
*/
protected void addPackageList(Content contentTree) {
Content caption = getTableCaption(configuration.getContent(
Content caption = getTableCaption(contents.getContent(
"doclet.ClassUse_Packages.that.use.0",
getLink(new LinkInfoImpl(configuration,
LinkInfoImpl.Kind.CLASS_USE_HEADER, typeElement))));
Content table = (configuration.isOutputHtml5())
? HtmlTree.TABLE(HtmlStyle.useSummary, caption)
: HtmlTree.TABLE(HtmlStyle.useSummary, packageUseTableSummary, caption);
table.addContent(getPackageTableHeader().toContent());
Content tbody = new HtmlTree(HtmlTag.TBODY);
boolean altColor = true;
Table table = new Table(configuration.htmlVersion, HtmlStyle.useSummary)
.setSummary(packageUseTableSummary)
.setCaption(caption)
.setHeader(getPackageTableHeader())
.setColumnStyles(HtmlStyle.colFirst, HtmlStyle.colLast);
for (PackageElement pkg : pkgSet) {
HtmlTree tr = new HtmlTree(HtmlTag.TR);
tr.addStyle(altColor ? HtmlStyle.altColor : HtmlStyle.rowColor);
altColor = !altColor;
addPackageUse(pkg, tr);
tbody.addContent(tr);
addPackageUse(pkg, table);
}
table.addContent(tbody);
Content li = HtmlTree.LI(HtmlStyle.blockList, table);
Content li = HtmlTree.LI(HtmlStyle.blockList, table.toContent());
contentTree.addContent(li);
}
@ -324,30 +320,22 @@ public class ClassUseWriter extends SubWriterHolderWriter {
pkgToPackageAnnotations.isEmpty()) {
return;
}
Content caption = getTableCaption(configuration.getContent(
Content caption = getTableCaption(contents.getContent(
"doclet.ClassUse_PackageAnnotation",
getLink(new LinkInfoImpl(configuration,
LinkInfoImpl.Kind.CLASS_USE_HEADER, typeElement))));
Content table = (configuration.isOutputHtml5())
? HtmlTree.TABLE(HtmlStyle.useSummary, caption)
: HtmlTree.TABLE(HtmlStyle.useSummary, packageUseTableSummary, caption);
table.addContent(getPackageTableHeader().toContent());
Content tbody = new HtmlTree(HtmlTag.TBODY);
boolean altColor = true;
Table table = new Table(configuration.htmlVersion, HtmlStyle.useSummary)
.setSummary(packageUseTableSummary)
.setCaption(caption)
.setHeader(getPackageTableHeader())
.setColumnStyles(HtmlStyle.colFirst, HtmlStyle.colLast);
for (PackageElement pkg : pkgToPackageAnnotations) {
HtmlTree tr = new HtmlTree(HtmlTag.TR);
tr.addStyle(altColor ? HtmlStyle.altColor : HtmlStyle.rowColor);
altColor = !altColor;
Content thFirst = HtmlTree.TH_ROW_SCOPE(HtmlStyle.colFirst, getPackageLink(pkg));
tr.addContent(thFirst);
HtmlTree tdLast = new HtmlTree(HtmlTag.TD);
tdLast.addStyle(HtmlStyle.colLast);
addSummaryComment(pkg, tdLast);
tr.addContent(tdLast);
tbody.addContent(tr);
Content summary = new ContentBuilder();
addSummaryComment(pkg, summary);
table.addRow(getPackageLink(pkg), summary);
}
table.addContent(tbody);
Content li = HtmlTree.LI(HtmlStyle.blockList, table);
Content li = HtmlTree.LI(HtmlStyle.blockList, table.toContent());
contentTree.addContent(li);
}
@ -358,7 +346,7 @@ public class ClassUseWriter extends SubWriterHolderWriter {
*/
protected void addClassList(Content contentTree) {
HtmlTree ul = new HtmlTree(HtmlTag.UL);
ul.addStyle(HtmlStyle.blockList);
ul.setStyle(HtmlStyle.blockList);
for (PackageElement pkg : pkgSet) {
Content markerAnchor = getMarkerAnchor(getPackageAnchorName(pkg));
HtmlTree htmlTree = (configuration.allowTag(HtmlTag.SECTION))
@ -385,16 +373,14 @@ public class ClassUseWriter extends SubWriterHolderWriter {
* Add the package use information.
*
* @param pkg the package that uses the given class
* @param contentTree the content tree to which the package use information will be added
* @param table the table to which the package use information will be added
*/
protected void addPackageUse(PackageElement pkg, Content contentTree) {
Content thFirst = HtmlTree.TH_ROW_SCOPE(HtmlStyle.colFirst,
getHyperLink(getPackageAnchorName(pkg), new StringContent(utils.getPackageName(pkg))));
contentTree.addContent(thFirst);
HtmlTree tdLast = new HtmlTree(HtmlTag.TD);
tdLast.addStyle(HtmlStyle.colLast);
addSummaryComment(pkg, tdLast);
contentTree.addContent(tdLast);
protected void addPackageUse(PackageElement pkg, Table table) {
Content pkgLink =
getHyperLink(getPackageAnchorName(pkg), new StringContent(utils.getPackageName(pkg)));
Content summary = new ContentBuilder();
addSummaryComment(pkg, summary);
table.addRow(pkgLink, summary);
}
/**

@ -202,7 +202,7 @@ public class ClassWriterImpl extends SubWriterHolderWriter implements ClassWrite
}
bodyTree.addContent(HtmlConstants.START_OF_CLASS_DATA);
HtmlTree div = new HtmlTree(HtmlTag.DIV);
div.addStyle(HtmlStyle.header);
div.setStyle(HtmlStyle.header);
if (configuration.showModules) {
ModuleElement mdle = configuration.docEnv.getElementUtils().getModuleOf(typeElement);
Content classModuleLabel = HtmlTree.SPAN(HtmlStyle.moduleLabelInType, contents.moduleLabel);
@ -380,13 +380,13 @@ public class ClassWriterImpl extends SubWriterHolderWriter implements ClassWrite
private Content getClassInheritenceTree(TypeMirror type) {
TypeMirror sup;
HtmlTree classTreeUl = new HtmlTree(HtmlTag.UL);
classTreeUl.addStyle(HtmlStyle.inheritance);
classTreeUl.setStyle(HtmlStyle.inheritance);
Content liTree = null;
do {
sup = utils.getFirstVisibleSuperClass(type);
if (sup != null) {
HtmlTree ul = new HtmlTree(HtmlTag.UL);
ul.addStyle(HtmlStyle.inheritance);
ul.setStyle(HtmlStyle.inheritance);
ul.addContent(getTreeForClassHelper(type));
if (liTree != null)
ul.addContent(liTree);

@ -25,6 +25,9 @@
package jdk.javadoc.internal.doclets.formats.html;
import jdk.javadoc.internal.doclets.formats.html.markup.Table;
import jdk.javadoc.internal.doclets.formats.html.markup.TableHeader;
import java.util.*;
import javax.lang.model.element.Modifier;
@ -75,7 +78,7 @@ public class ConstantsSummaryWriterImpl extends HtmlDocletWriter implements Cons
/**
* The HTML tree for main tag.
*/
private HtmlTree mainTree = HtmlTree.MAIN();
private final HtmlTree mainTree = HtmlTree.MAIN();
/**
* The HTML tree for constant values summary.
@ -99,6 +102,7 @@ public class ConstantsSummaryWriterImpl extends HtmlDocletWriter implements Cons
/**
* {@inheritDoc}
*/
@Override
public Content getHeader() {
String label = configuration.getText("doclet.Constants_Summary");
HtmlTree bodyTree = getBody(true, getWindowTitle(label));
@ -116,6 +120,7 @@ public class ConstantsSummaryWriterImpl extends HtmlDocletWriter implements Cons
/**
* {@inheritDoc}
*/
@Override
public Content getContentsHeader() {
return new HtmlTree(HtmlTag.UL);
}
@ -123,6 +128,7 @@ public class ConstantsSummaryWriterImpl extends HtmlDocletWriter implements Cons
/**
* {@inheritDoc}
*/
@Override
public void addLinkToPackageContent(PackageElement pkg,
Set<PackageElement> printedPackageHeaders, Content contentListTree) {
//add link to summary
@ -146,6 +152,7 @@ public class ConstantsSummaryWriterImpl extends HtmlDocletWriter implements Cons
/**
* {@inheritDoc}
*/
@Override
public void addContentsList(Content contentTree, Content contentListTree) {
Content titleContent = contents.constantsSummaryTitle;
Content pHeading = HtmlTree.HEADING(HtmlConstants.TITLE_HEADING, true,
@ -169,15 +176,17 @@ public class ConstantsSummaryWriterImpl extends HtmlDocletWriter implements Cons
/**
* {@inheritDoc}
*/
@Override
public Content getConstantSummaries() {
HtmlTree summariesDiv = new HtmlTree(HtmlTag.DIV);
summariesDiv.addStyle(HtmlStyle.constantValuesContainer);
summariesDiv.setStyle(HtmlStyle.constantValuesContainer);
return summariesDiv;
}
/**
* {@inheritDoc}
*/
@Override
public void addPackageName(PackageElement pkg, Content summariesTree, boolean first) {
Content pkgNameContent;
if (!first && configuration.allowTag(HtmlTag.SECTION)) {
@ -206,15 +215,17 @@ public class ConstantsSummaryWriterImpl extends HtmlDocletWriter implements Cons
/**
* {@inheritDoc}
*/
@Override
public Content getClassConstantHeader() {
HtmlTree ul = new HtmlTree(HtmlTag.UL);
ul.addStyle(HtmlStyle.blockList);
ul.setStyle(HtmlStyle.blockList);
return ul;
}
/**
* {@inheritDoc}
*/
@Override
public void addClassConstant(Content summariesTree, Content classConstantTree) {
if (configuration.allowTag(HtmlTag.SECTION)) {
summaryTree.addContent(classConstantTree);
@ -224,12 +235,13 @@ public class ConstantsSummaryWriterImpl extends HtmlDocletWriter implements Cons
}
/**
* Get the table caption and header for the constant summary table
*
* @param typeElement the TypeElement to be documented
* @return constant members header content
* {@inheritDoc}
*/
public Content getConstantMembersHeader(TypeElement typeElement) {
@Override
public void addConstantMembers(TypeElement typeElement, Collection<VariableElement> fields,
Content classConstantTree) {
currentTypeElement = typeElement;
//generate links backward only to public classes.
Content classlink = (utils.isPublic(typeElement) || utils.isProtected(typeElement)) ?
getLink(new LinkInfoImpl(configuration,
@ -237,65 +249,27 @@ public class ConstantsSummaryWriterImpl extends HtmlDocletWriter implements Cons
new StringContent(utils.getFullyQualifiedName(typeElement));
PackageElement enclosingPackage = utils.containingPackage(typeElement);
Content caption = new ContentBuilder();
if (!enclosingPackage.isUnnamed()) {
Content cb = new ContentBuilder();
cb.addContent(enclosingPackage.getQualifiedName());
cb.addContent(".");
cb.addContent(classlink);
return getClassName(cb);
} else {
return getClassName(classlink);
caption.addContent(enclosingPackage.getQualifiedName());
caption.addContent(".");
}
}
caption.addContent(classlink);
/**
* Get the class name in the table caption and the table header.
*
* @param classStr the class name to print.
* @return the table caption and header
*/
protected Content getClassName(Content classStr) {
Content caption = getTableCaption(classStr);
Content table = (configuration.isOutputHtml5())
? HtmlTree.TABLE(HtmlStyle.constantsSummary, caption)
: HtmlTree.TABLE(HtmlStyle.constantsSummary, constantsTableSummary, caption);
table.addContent(constantsTableHeader.toContent());
return table;
}
Table table = new Table(configuration.htmlVersion, HtmlStyle.constantsSummary)
.setSummary(constantsTableSummary)
.setCaption(caption)
.setHeader(constantsTableHeader)
.setRowScopeColumn(1)
.setColumnStyles(HtmlStyle.colFirst, HtmlStyle.colSecond, HtmlStyle.colLast);
/**
* {@inheritDoc}
*/
public void addConstantMembers(TypeElement typeElement, Collection<VariableElement> fields,
Content classConstantTree) {
currentTypeElement = typeElement;
Content tbody = new HtmlTree(HtmlTag.TBODY);
boolean altColor = true;
for (VariableElement field : fields) {
HtmlTree tr = new HtmlTree(HtmlTag.TR);
tr.addStyle(altColor ? HtmlStyle.altColor : HtmlStyle.rowColor);
addConstantMember(field, tr);
tbody.addContent(tr);
altColor = !altColor;
table.addRow(getTypeColumn(field), getNameColumn(field), getValue(field));
}
Content table = getConstantMembersHeader(typeElement);
table.addContent(tbody);
Content li = HtmlTree.LI(HtmlStyle.blockList, table);
Content li = HtmlTree.LI(HtmlStyle.blockList, table.toContent());
classConstantTree.addContent(li);
}
/**
* Add the row for the constant summary table.
*
* @param member the field to be documented.
* @param trTree an htmltree object for the table row
*/
private void addConstantMember(VariableElement member, HtmlTree trTree) {
trTree.addContent(getTypeColumn(member));
trTree.addContent(getNameColumn(member));
trTree.addContent(getValue(member));
}
/**
* Get the type column for the constant summary table row.
*
@ -305,7 +279,8 @@ public class ConstantsSummaryWriterImpl extends HtmlDocletWriter implements Cons
private Content getTypeColumn(VariableElement member) {
Content anchor = getMarkerAnchor(currentTypeElement.getQualifiedName() +
"." + member.getSimpleName());
Content tdType = HtmlTree.TD(HtmlStyle.colFirst, anchor);
Content typeContent = new ContentBuilder();
typeContent.addContent(anchor);
Content code = new HtmlTree(HtmlTag.CODE);
for (Modifier mod : member.getModifiers()) {
Content modifier = new StringContent(mod.toString());
@ -315,8 +290,8 @@ public class ConstantsSummaryWriterImpl extends HtmlDocletWriter implements Cons
Content type = getLink(new LinkInfoImpl(configuration,
LinkInfoImpl.Kind.CONSTANT_SUMMARY, member.asType()));
code.addContent(type);
tdType.addContent(code);
return tdType;
typeContent.addContent(code);
return typeContent;
}
/**
@ -328,8 +303,7 @@ public class ConstantsSummaryWriterImpl extends HtmlDocletWriter implements Cons
private Content getNameColumn(VariableElement member) {
Content nameContent = getDocLink(LinkInfoImpl.Kind.CONSTANT_SUMMARY,
member, member.getSimpleName(), false);
Content code = HtmlTree.CODE(nameContent);
return HtmlTree.TH_ROW_SCOPE(HtmlStyle.colSecond, code);
return HtmlTree.CODE(nameContent);
}
/**
@ -341,13 +315,13 @@ public class ConstantsSummaryWriterImpl extends HtmlDocletWriter implements Cons
private Content getValue(VariableElement member) {
String value = utils.constantValueExpresion(member);
Content valueContent = new StringContent(value);
Content code = HtmlTree.CODE(valueContent);
return HtmlTree.TD(HtmlStyle.colLast, code);
return HtmlTree.CODE(valueContent);
}
/**
* {@inheritDoc}
*/
@Override
public void addConstantSummaries(Content contentTree, Content summariesTree) {
if (configuration.allowTag(HtmlTag.SECTION) && summaryTree != null) {
summariesTree.addContent(summaryTree);
@ -363,6 +337,7 @@ public class ConstantsSummaryWriterImpl extends HtmlDocletWriter implements Cons
/**
* {@inheritDoc}
*/
@Override
public void addFooter(Content contentTree) {
Content htmlTree = (configuration.allowTag(HtmlTag.FOOTER))
? HtmlTree.FOOTER()

@ -25,14 +25,15 @@
package jdk.javadoc.internal.doclets.formats.html;
import jdk.javadoc.internal.doclets.formats.html.markup.Table;
import jdk.javadoc.internal.doclets.formats.html.markup.TableHeader;
import java.util.*;
import javax.lang.model.element.Element;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.TypeElement;
import jdk.javadoc.internal.doclets.formats.html.TableHeader;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlAttr;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlConstants;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTag;
@ -105,6 +106,7 @@ public class ConstructorWriterImpl extends AbstractExecutableMemberWriter
/**
* {@inheritDoc}
*/
@Override
public void addMemberTree(Content memberSummaryTree, Content memberTree) {
writer.addMemberTree(memberSummaryTree, memberTree);
}
@ -165,15 +167,6 @@ public class ConstructorWriterImpl extends AbstractExecutableMemberWriter
return pre;
}
/**
* {@inheritDoc}
*/
@Override
public void setSummaryColumnStyleAndScope(HtmlTree thTree) {
thTree.addStyle(HtmlStyle.colConstructorName);
thTree.addAttr(HtmlAttr.SCOPE, "row");
}
/**
* {@inheritDoc}
*/
@ -239,24 +232,6 @@ public class ConstructorWriterImpl extends AbstractExecutableMemberWriter
memberTree.addContent(label);
}
/**
* {@inheritDoc}
*/
@Override
public String getTableSummary() {
return resources.getText("doclet.Member_Table_Summary",
resources.getText("doclet.Constructor_Summary"),
resources.getText("doclet.constructors"));
}
/**
* {@inheritDoc}
*/
@Override
public Content getCaption() {
return contents.constructors;
}
/**
* {@inheritDoc}
*/
@ -270,6 +245,33 @@ public class ConstructorWriterImpl extends AbstractExecutableMemberWriter
}
}
@Override
protected Table createSummaryTable() {
List<HtmlStyle> bodyRowStyles;
int rowScopeColumn;
if (foundNonPubConstructor) {
bodyRowStyles = Arrays.asList(HtmlStyle.colFirst, HtmlStyle.colConstructorName,
HtmlStyle.colLast);
rowScopeColumn = 1;
} else {
bodyRowStyles = Arrays.asList(HtmlStyle.colConstructorName, HtmlStyle.colLast);
rowScopeColumn = 0;
}
String summary = resources.getText("doclet.Member_Table_Summary",
resources.getText("doclet.Constructor_Summary"),
resources.getText("doclet.constructors"));
return new Table(configuration.htmlVersion, HtmlStyle.memberSummary)
.setSummary(summary)
.setCaption(contents.constructors)
.setHeader(getSummaryTableHeader(typeElement))
.setRowScopeColumn(rowScopeColumn)
.setColumnStyles(bodyRowStyles)
.setUseTBody(false); // temporary? compatibility mode for TBody
}
/**
* {@inheritDoc}
*/

@ -25,6 +25,9 @@
package jdk.javadoc.internal.doclets.formats.html;
import jdk.javadoc.internal.doclets.formats.html.markup.Table;
import jdk.javadoc.internal.doclets.formats.html.markup.TableHeader;
import java.util.EnumMap;
import java.util.List;
import java.util.SortedSet;
@ -34,6 +37,7 @@ import javax.lang.model.element.ModuleElement;
import javax.lang.model.element.PackageElement;
import com.sun.source.doctree.DocTree;
import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlConstants;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTag;
@ -281,7 +285,7 @@ public class DeprecatedListWriter extends SubWriterHolderWriter {
htmlTree.addContent(getContentsList(deprapi));
String memberTableSummary;
HtmlTree div = new HtmlTree(HtmlTag.DIV);
div.addStyle(HtmlStyle.contentContainer);
div.setStyle(HtmlStyle.contentContainer);
for (DeprElementKind kind : DeprElementKind.values()) {
if (deprapi.hasDocumentation(kind)) {
addAnchor(deprapi, kind, div);
@ -404,49 +408,42 @@ public class DeprecatedListWriter extends SubWriterHolderWriter {
protected void addDeprecatedAPI(SortedSet<Element> deprList, String headingKey,
String tableSummary, TableHeader tableHeader, Content contentTree) {
if (deprList.size() > 0) {
Content caption = getTableCaption(configuration.getContent(headingKey));
Content table = (configuration.isOutputHtml5())
? HtmlTree.TABLE(HtmlStyle.deprecatedSummary, caption)
: HtmlTree.TABLE(HtmlStyle.deprecatedSummary, tableSummary, caption);
table.addContent(tableHeader.toContent());
Content tbody = new HtmlTree(HtmlTag.TBODY);
boolean altColor = true;
Content caption = contents.getContent(headingKey);
Table table = new Table(configuration.htmlVersion, HtmlStyle.deprecatedSummary)
.setSummary(tableSummary)
.setCaption(caption)
.setHeader(tableHeader)
.setColumnStyles(HtmlStyle.colDeprecatedItemName, HtmlStyle.colLast);
for (Element e : deprList) {
HtmlTree thRow;
Content link;
switch (e.getKind()) {
case MODULE:
ModuleElement m = (ModuleElement)e;
thRow = HtmlTree.TH_ROW_SCOPE(HtmlStyle.colFirst,
getModuleLink(m, new StringContent(m.getQualifiedName())));
ModuleElement m = (ModuleElement) e;
link = getModuleLink(m, new StringContent(m.getQualifiedName()));
break;
case PACKAGE:
PackageElement pkg = (PackageElement)e;
thRow = HtmlTree.TH_ROW_SCOPE(HtmlStyle.colFirst,
getPackageLink(pkg, getPackageName(pkg)));
PackageElement pkg = (PackageElement) e;
link = getPackageLink(pkg, getPackageName(pkg));
break;
default:
thRow = getDeprecatedLink(e);
link = getDeprecatedLink(e);
}
HtmlTree tr = HtmlTree.TR(thRow);
HtmlTree tdDesc = new HtmlTree(HtmlTag.TD);
tdDesc.addStyle(HtmlStyle.colLast);
Content desc = new ContentBuilder();
List<? extends DocTree> tags = utils.getDeprecatedTrees(e);
if (!tags.isEmpty()) {
addInlineDeprecatedComment(e, tags.get(0), tdDesc);
addInlineDeprecatedComment(e, tags.get(0), desc);
} else {
desc.addContent(HtmlTree.EMPTY);
}
tr.addContent(tdDesc);
tr.addStyle(altColor ? HtmlStyle.altColor : HtmlStyle.rowColor);
altColor = !altColor;
tbody.addContent(tr);
table.addRow(link, desc);
}
table.addContent(tbody);
Content li = HtmlTree.LI(HtmlStyle.blockList, table);
Content li = HtmlTree.LI(HtmlStyle.blockList, table.toContent());
Content ul = HtmlTree.UL(HtmlStyle.blockList, li);
contentTree.addContent(ul);
}
}
protected HtmlTree getDeprecatedLink(Element e) {
protected Content getDeprecatedLink(Element e) {
AbstractMemberWriter writer;
switch (e.getKind()) {
case INTERFACE:
@ -470,6 +467,6 @@ public class DeprecatedListWriter extends SubWriterHolderWriter {
default:
writer = new AnnotationTypeOptionalMemberWriterImpl(this, null);
}
return HtmlTree.TH_ROW_SCOPE(HtmlStyle.colDeprecatedItemName, writer.getDeprecatedLink(e));
return writer.getDeprecatedLink(e);
}
}

@ -25,16 +25,14 @@
package jdk.javadoc.internal.doclets.formats.html;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import jdk.javadoc.internal.doclets.formats.html.markup.Table;
import jdk.javadoc.internal.doclets.formats.html.markup.TableHeader;
import javax.lang.model.element.Element;
import javax.lang.model.element.TypeElement;
import javax.lang.model.element.VariableElement;
import jdk.javadoc.internal.doclets.formats.html.TableHeader;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlAttr;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlConstants;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTag;
@ -81,6 +79,7 @@ public class EnumConstantWriterImpl extends AbstractMemberWriter
/**
* {@inheritDoc}
*/
@Override
public void addMemberTree(Content memberSummaryTree, Content memberTree) {
writer.addMemberTree(memberSummaryTree, memberTree);
}
@ -192,24 +191,6 @@ public class EnumConstantWriterImpl extends AbstractMemberWriter
memberTree.addContent(label);
}
/**
* {@inheritDoc}
*/
@Override
public String getTableSummary() {
return resources.getText("doclet.Member_Table_Summary",
resources.getText("doclet.Enum_Constant_Summary"),
resources.getText("doclet.enum_constants"));
}
/**
* {@inheritDoc}
*/
@Override
public Content getCaption() {
return configuration.getContent("doclet.Enum_Constants");
}
/**
* {@inheritDoc}
*/
@ -218,6 +199,23 @@ public class EnumConstantWriterImpl extends AbstractMemberWriter
return new TableHeader(contents.enumConstantLabel, contents.descriptionLabel);
}
/**
* {@inheritDoc}
*/
@Override
protected Table createSummaryTable() {
String summary = resources.getText("doclet.Member_Table_Summary",
resources.getText("doclet.Enum_Constant_Summary"),
resources.getText("doclet.enum_constants"));
return new Table(configuration.htmlVersion, HtmlStyle.memberSummary)
.setSummary(summary)
.setCaption(contents.getContent("doclet.Enum_Constants"))
.setHeader(getSummaryTableHeader(typeElement))
.setColumnStyles(HtmlStyle.colFirst, HtmlStyle.colLast)
.setUseTBody(false);
}
/**
* {@inheritDoc}
*/
@ -253,15 +251,6 @@ public class EnumConstantWriterImpl extends AbstractMemberWriter
tdSummary.addContent(code);
}
/**
* {@inheritDoc}
*/
@Override
public void setSummaryColumnStyleAndScope(HtmlTree thTree) {
thTree.addStyle(HtmlStyle.colFirst);
thTree.addAttr(HtmlAttr.SCOPE, "row");
}
/**
* {@inheritDoc}
*/

@ -25,11 +25,16 @@
package jdk.javadoc.internal.doclets.formats.html;
import jdk.javadoc.internal.doclets.formats.html.markup.Table;
import jdk.javadoc.internal.doclets.formats.html.markup.TableHeader;
import java.util.Arrays;
import java.util.List;
import javax.lang.model.element.Element;
import javax.lang.model.element.TypeElement;
import javax.lang.model.element.VariableElement;
import jdk.javadoc.internal.doclets.formats.html.TableHeader;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlConstants;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTag;
@ -78,6 +83,7 @@ public class FieldWriterImpl extends AbstractMemberWriter
/**
* {@inheritDoc}
*/
@Override
public void addMemberTree(Content memberSummaryTree, Content memberTree) {
writer.addMemberTree(memberSummaryTree, memberTree);
}
@ -188,24 +194,6 @@ public class FieldWriterImpl extends AbstractMemberWriter
memberTree.addContent(label);
}
/**
* {@inheritDoc}
*/
@Override
public String getTableSummary() {
return resources.getText("doclet.Member_Table_Summary",
resources.getText("doclet.Field_Summary"),
resources.getText("doclet.fields"));
}
/**
* {@inheritDoc}
*/
@Override
public Content getCaption() {
return contents.fields;
}
/**
* {@inheritDoc}
*/
@ -215,6 +203,24 @@ public class FieldWriterImpl extends AbstractMemberWriter
contents.descriptionLabel);
}
@Override
protected Table createSummaryTable() {
String summary = resources.getText("doclet.Member_Table_Summary",
resources.getText("doclet.Field_Summary"),
resources.getText("doclet.fields"));
List<HtmlStyle> bodyRowStyles = Arrays.asList(HtmlStyle.colFirst, HtmlStyle.colSecond,
HtmlStyle.colLast);
return new Table(configuration.htmlVersion, HtmlStyle.memberSummary)
.setSummary(summary)
.setCaption(contents.fields)
.setHeader(getSummaryTableHeader(typeElement))
.setRowScopeColumn(1)
.setColumnStyles(bodyRowStyles)
.setUseTBody(false); // temporary? compatibility mode for TBody
}
/**
* {@inheritDoc}
*/

@ -156,8 +156,8 @@ public class FrameOutputWriter extends HtmlDocletWriter {
protected Content getFrameDetails() {
HtmlTree leftContainerDiv = new HtmlTree(HtmlTag.DIV);
HtmlTree rightContainerDiv = new HtmlTree(HtmlTag.DIV);
leftContainerDiv.addStyle(HtmlStyle.leftContainer);
rightContainerDiv.addStyle(HtmlStyle.rightContainer);
leftContainerDiv.setStyle(HtmlStyle.leftContainer);
rightContainerDiv.setStyle(HtmlStyle.rightContainer);
if (configuration.showModules && configuration.modules.size() > 1) {
addAllModulesFrameTag(leftContainerDiv);
} else if (noOfPackages > 1) {
@ -214,7 +214,7 @@ public class FrameOutputWriter extends HtmlDocletWriter {
private void addClassFrameTag(Content contentTree) {
HtmlTree frame = HtmlTree.IFRAME(configuration.topFile.getPath(), "classFrame",
configuration.getText("doclet.Package_class_and_interface_descriptions"));
frame.addStyle(HtmlStyle.rightIframe);
frame.setStyle(HtmlStyle.rightIframe);
contentTree.addContent(frame);
}
}

@ -124,7 +124,7 @@ public class HelpWriter extends HtmlDocletWriter {
}
HtmlTree htmlTree;
HtmlTree ul = new HtmlTree(HtmlTag.UL);
ul.addStyle(HtmlStyle.blockList);
ul.setStyle(HtmlStyle.blockList);
if (configuration.createoverview) {
Content overviewHeading = HtmlTree.HEADING(HtmlConstants.CONTENT_HEADING,
contents.overviewLabel);

@ -25,6 +25,8 @@
package jdk.javadoc.internal.doclets.formats.html;
import jdk.javadoc.internal.doclets.formats.html.markup.TableHeader;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.regex.Matcher;
@ -92,9 +94,7 @@ import jdk.javadoc.internal.doclets.toolkit.util.DocLink;
import jdk.javadoc.internal.doclets.toolkit.util.DocPath;
import jdk.javadoc.internal.doclets.toolkit.util.DocPaths;
import jdk.javadoc.internal.doclets.toolkit.util.DocletConstants;
import jdk.javadoc.internal.doclets.toolkit.util.GroupTypes;
import jdk.javadoc.internal.doclets.toolkit.util.ImplementedMethods;
import jdk.javadoc.internal.doclets.toolkit.util.TableTabTypes.TableTabs;
import jdk.javadoc.internal.doclets.toolkit.util.Utils;
import jdk.javadoc.internal.doclets.toolkit.util.VisibleMemberMap;
@ -503,11 +503,11 @@ public class HtmlDocletWriter extends HtmlDocWriter {
: htmlTree;
String allClassesId = "allclasses_";
HtmlTree navDiv = new HtmlTree(HtmlTag.DIV);
fixedNavDiv.addStyle(HtmlStyle.fixedNav);
fixedNavDiv.setStyle(HtmlStyle.fixedNav);
Content skipNavLinks = configuration.getContent("doclet.Skip_navigation_links");
if (header) {
fixedNavDiv.addContent(HtmlConstants.START_OF_TOP_NAVBAR);
navDiv.addStyle(HtmlStyle.topNav);
navDiv.setStyle(HtmlStyle.topNav);
allClassesId += "navbar_top";
Content a = getMarkerAnchor(SectionName.NAVBAR_TOP);
//WCAG - Hyperlinks should contain text or an image with alt text - for AT tools
@ -518,7 +518,7 @@ public class HtmlDocletWriter extends HtmlDocWriter {
navDiv.addContent(skipLinkContent);
} else {
tree.addContent(HtmlConstants.START_OF_BOTTOM_NAVBAR);
navDiv.addStyle(HtmlStyle.bottomNav);
navDiv.setStyle(HtmlStyle.bottomNav);
allClassesId += "navbar_bottom";
Content a = getMarkerAnchor(SectionName.NAVBAR_BOTTOM);
navDiv.addContent(a);
@ -533,7 +533,7 @@ public class HtmlDocletWriter extends HtmlDocWriter {
navDiv.addContent(getMarkerAnchor(SectionName.NAVBAR_BOTTOM_FIRSTROW));
}
HtmlTree navList = new HtmlTree(HtmlTag.UL);
navList.addStyle(HtmlStyle.navList);
navList.setStyle(HtmlStyle.navList);
navList.addAttr(HtmlAttr.TITLE,
configuration.getText("doclet.Navigation"));
if (configuration.createoverview) {
@ -913,73 +913,6 @@ public class HtmlDocletWriter extends HtmlDocWriter {
return caption;
}
/**
* Get table header.
*
* @param caption the table caption
* @param tableSummary the summary for the table
* @param tableStyle the table style
* @return a content object
*/
public Content getTableHeader(Content caption, String tableSummary, HtmlStyle tableStyle) {
Content table = (configuration.isOutputHtml5())
? HtmlTree.TABLE(tableStyle, caption)
: HtmlTree.TABLE(tableStyle, tableSummary, caption);
return table;
}
/**
* Get the summary table caption.
*
* @param groupTypes the group types for table tabs
* @return the caption for the summary table
*/
public Content getTableCaption(GroupTypes groupTypes) {
Content tabbedCaption = new HtmlTree(HtmlTag.CAPTION);
Map<String, TableTabs> groups = groupTypes.getGroupTypes();
for (String group : groups.keySet()) {
Content captionSpan;
Content span;
TableTabs tab = groups.get(group);
if (tab.isDefaultTab()) {
captionSpan = HtmlTree.SPAN(new StringContent(tab.resourceKey()));
span = HtmlTree.SPAN(tab.tabId(),
HtmlStyle.activeTableTab, captionSpan);
} else {
captionSpan = HtmlTree.SPAN(getGroupTypeLinks(groupTypes, group));
span = HtmlTree.SPAN(tab.tabId(),
HtmlStyle.tableTab, captionSpan);
}
Content tabSpan = HtmlTree.SPAN(HtmlStyle.tabEnd, Contents.SPACE);
span.addContent(tabSpan);
tabbedCaption.addContent(span);
}
return tabbedCaption;
}
/**
* Get the group type links for the table caption.
*
* @param groupTypes the group types for table tabs
* @param groupName the group name to be displayed as link
* @return the content tree for the group type link
*/
public Content getGroupTypeLinks(GroupTypes groupTypes, String groupName) {
String jsShow = "javascript:showGroups(" + groupTypes.getTableTab(groupName).value() + ");";
HtmlTree link = HtmlTree.A(jsShow, new StringContent(groupTypes.getTableTab(groupName).resourceKey()));
return link;
}
/**
* Returns true if the table tabs needs to be displayed.
*
* @param groupTypes the group types for table tabs
* @return true if the tabs should be displayed
*/
public boolean showTabs(GroupTypes groupTypes) {
return groupTypes.getGroupTypes().size() > 1;
}
/**
* Get the marker anchor which will be added to the documentation tree.
*
@ -2201,9 +2134,9 @@ public class HtmlDocletWriter extends HtmlDocWriter {
* @param filePath the DocPath of the file that needs to be added
*/
private void addJQueryFile(Content head, DocPath filePath) {
HtmlTree jqyeryScriptFile = HtmlTree.SCRIPT(
HtmlTree jqueryScriptFile = HtmlTree.SCRIPT(
pathToRoot.resolve(DocPaths.JQUERY_FILES.resolve(filePath)).getPath());
head.addContent(jqyeryScriptFile);
head.addContent(jqueryScriptFile);
}
/**
@ -2614,4 +2547,8 @@ public class HtmlDocletWriter extends HtmlDocWriter {
protected TableHeader getPackageTableHeader() {
return new TableHeader(contents.packageLabel, contents.descriptionLabel);
}
Content getScript() {
return script;
}
}

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998, 2016, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1998, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -75,7 +75,7 @@ public class HtmlSerialFieldWriter extends FieldWriterImpl
*/
public Content getSerializableFieldsHeader() {
HtmlTree ul = new HtmlTree(HtmlTag.UL);
ul.addStyle(HtmlStyle.blockList);
ul.setStyle(HtmlStyle.blockList);
return ul;
}
@ -88,9 +88,9 @@ public class HtmlSerialFieldWriter extends FieldWriterImpl
public Content getFieldsContentHeader(boolean isLastContent) {
HtmlTree li = new HtmlTree(HtmlTag.LI);
if (isLastContent)
li.addStyle(HtmlStyle.blockListLast);
li.setStyle(HtmlStyle.blockListLast);
else
li.addStyle(HtmlStyle.blockList);
li.setStyle(HtmlStyle.blockList);
return li;
}
@ -104,7 +104,7 @@ public class HtmlSerialFieldWriter extends FieldWriterImpl
*/
public Content getSerializableFields(String heading, Content serializableFieldsTree) {
HtmlTree li = new HtmlTree(HtmlTag.LI);
li.addStyle(HtmlStyle.blockList);
li.setStyle(HtmlStyle.blockList);
if (serializableFieldsTree.isValid()) {
Content headingContent = new StringContent(heading);
Content serialHeading = HtmlTree.HEADING(HtmlConstants.SERIALIZED_MEMBER_HEADING,

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998, 2016, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1998, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -66,7 +66,7 @@ public class HtmlSerialMethodWriter extends MethodWriterImpl implements
*/
public Content getSerializableMethodsHeader() {
HtmlTree ul = new HtmlTree(HtmlTag.UL);
ul.addStyle(HtmlStyle.blockList);
ul.setStyle(HtmlStyle.blockList);
return ul;
}
@ -79,9 +79,9 @@ public class HtmlSerialMethodWriter extends MethodWriterImpl implements
public Content getMethodsContentHeader(boolean isLastContent) {
HtmlTree li = new HtmlTree(HtmlTag.LI);
if (isLastContent)
li.addStyle(HtmlStyle.blockListLast);
li.setStyle(HtmlStyle.blockListLast);
else
li.addStyle(HtmlStyle.blockList);
li.setStyle(HtmlStyle.blockList);
return li;
}

@ -25,8 +25,9 @@
package jdk.javadoc.internal.doclets.formats.html;
import java.util.Arrays;
import java.util.List;
import jdk.javadoc.internal.doclets.formats.html.markup.Table;
import jdk.javadoc.internal.doclets.formats.html.markup.TableHeader;
import java.util.SortedSet;
import java.util.TreeSet;
@ -35,7 +36,6 @@ import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.TypeElement;
import javax.lang.model.type.TypeMirror;
import jdk.javadoc.internal.doclets.formats.html.TableHeader;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlConstants;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTag;
@ -96,6 +96,7 @@ public class MethodWriterImpl extends AbstractExecutableMemberWriter
/**
* {@inheritDoc}
*/
@Override
public void addMemberTree(Content memberSummaryTree, Content memberTree) {
writer.addMemberTree(memberSummaryTree, memberTree);
}
@ -238,24 +239,6 @@ public class MethodWriterImpl extends AbstractExecutableMemberWriter
memberTree.addContent(label);
}
/**
* {@inheritDoc}
*/
@Override
public String getTableSummary() {
return resources.getText("doclet.Member_Table_Summary",
resources.getText("doclet.Method_Summary"),
resources.getText("doclet.methods"));
}
/**
* {@inheritDoc}
*/
@Override
public Content getCaption() {
return contents.methods;
}
/**
* {@inheritDoc}
*/
@ -265,6 +248,33 @@ public class MethodWriterImpl extends AbstractExecutableMemberWriter
contents.descriptionLabel);
}
@Override
protected Table createSummaryTable() {
String summary = resources.getText("doclet.Member_Table_Summary",
resources.getText("doclet.Method_Summary"),
resources.getText("doclet.methods"));
return new Table(configuration.htmlVersion, HtmlStyle.memberSummary)
.setSummary(summary)
.setHeader(getSummaryTableHeader(typeElement))
.setRowScopeColumn(1)
.setColumnStyles(HtmlStyle.colFirst, HtmlStyle.colSecond, HtmlStyle.colLast)
.setDefaultTab(resources.getText("doclet.All_Methods"))
.addTab(resources.getText("doclet.Static_Methods"), utils::isStatic)
.addTab(resources.getText("doclet.Instance_Methods"), e -> !utils.isStatic(e))
.addTab(resources.getText("doclet.Abstract_Methods"), utils::isAbstract)
.addTab(resources.getText("doclet.Concrete_Methods"),
e -> !utils.isAbstract(e) && !utils.isInterface(e.getEnclosingElement()))
.addTab(resources.getText("doclet.Default_Methods"),
e -> !utils.isAbstract(e) && utils.isInterface(e.getEnclosingElement()))
.addTab(resources.getText("doclet.Deprecated_Methods"),
e -> utils.isDeprecated(e) || utils.isDeprecated(typeElement))
.setTabScriptVariable("methods")
.setTabScript(i -> "show(" + i + ");")
.setUseTBody(false)
.setPutIdFirst(true);
}
/**
* {@inheritDoc}
*/

@ -103,7 +103,7 @@ public class ModuleFrameWriter extends HtmlDocletWriter {
mdlgen.getHyperLink(DocPaths.moduleSummary(moduleElement), mdlLabel, "", "classFrame"));
htmlTree.addContent(heading);
HtmlTree div = new HtmlTree(HtmlTag.DIV);
div.addStyle(HtmlStyle.indexContainer);
div.setStyle(HtmlStyle.indexContainer);
mdlgen.addClassListing(div);
htmlTree.addContent(div);
if (configuration.allowTag(HtmlTag.MAIN)) {

@ -25,13 +25,15 @@
package jdk.javadoc.internal.doclets.formats.html;
import jdk.javadoc.internal.doclets.formats.html.markup.Table;
import jdk.javadoc.internal.doclets.formats.html.markup.TableHeader;
import java.util.*;
import javax.lang.model.element.ModuleElement;
import javax.lang.model.element.PackageElement;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlAttr;
import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder;
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;
@ -40,8 +42,6 @@ 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 module index page "overview-summary.html" for the right-hand
@ -56,28 +56,6 @@ import jdk.javadoc.internal.doclets.toolkit.util.GroupTypes;
*/
public class ModuleIndexWriter extends AbstractModuleIndexWriter {
/**
* Map representing the group of modules as specified on the command line.
*
* @see Group
*/
private final Map<String, SortedSet<ModuleElement>> groupModuleMap;
/**
* List to store the order groups, which has elements to be displayed, as specified on the command line.
*/
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.
*/
@ -90,11 +68,6 @@ public class ModuleIndexWriter extends AbstractModuleIndexWriter {
*/
public ModuleIndexWriter(HtmlConfiguration configuration, DocPath filename) {
super(configuration, filename);
groupModuleMap = configuration.group.groupModules(configuration.modules);
configuration.group.getGroupList().stream()
.filter(groupModuleMap::containsKey)
.forEach(groupList::add);
groupTypes = new GroupTypes(groupList, resources.getText("doclet.All_Modules"));
}
/**
@ -128,7 +101,7 @@ public class ModuleIndexWriter extends AbstractModuleIndexWriter {
HtmlTree htmltree = (configuration.allowTag(HtmlTag.NAV))
? HtmlTree.NAV()
: new HtmlTree(HtmlTag.DIV);
htmltree.addStyle(HtmlStyle.indexNav);
htmltree.setStyle(HtmlStyle.indexNav);
HtmlTree ul = new HtmlTree(HtmlTag.UL);
addAllClassesLink(ul);
if (configuration.showModules) {
@ -144,68 +117,53 @@ public class ModuleIndexWriter extends AbstractModuleIndexWriter {
*
* @param body the content tree to which the module list will be added
*/
@Override
protected void addModulesList(Content body) {
if (!groupList.isEmpty()) {
Content caption;
TreeMap<ModuleElement, String> groupMap = new TreeMap<>(utils.makeModuleComparator());
Content tbody = new HtmlTree(HtmlTag.TBODY);
Map<String, SortedSet<ModuleElement>> groupModuleMap
= configuration.group.groupModules(configuration.modules);
if (!groupModuleMap.keySet().isEmpty()) {
String tableSummary = configuration.getText("doclet.Member_Table_Summary",
configuration.getText("doclet.Module_Summary"), configuration.getText("doclet.modules"));
for (String groupname : groupList) {
for (ModuleElement mdle : groupModuleMap.get(groupname)) {
groupMap.put(mdle, groupname);
TableHeader header = new TableHeader(contents.moduleLabel, contents.descriptionLabel);
Table table = new Table(configuration.htmlVersion, HtmlStyle.overviewSummary)
.setSummary(tableSummary)
.setHeader(header)
.setColumnStyles(HtmlStyle.colFirst, HtmlStyle.colLast)
.setDefaultTab(resources.getText("doclet.All_Modules"))
.setTabScriptVariable("groups")
.setTabScript(i -> "showGroups(" + i + ");")
.setTabId(i -> (i == 0) ? "t0" : ("t" + (1 << (i - 1))));
// add the tabs in command-line order
for (String groupName : configuration.group.getGroupList()) {
Set<ModuleElement> groupModules = groupModuleMap.get(groupName);
if (groupModules != null) {
table.addTab(groupName, groupModules::contains);
}
}
if (!groupMap.isEmpty()) {
addModulesList(groupMap, tbody);
for (ModuleElement mdle : configuration.modules) {
if (!mdle.isUnnamed()) {
if (!(configuration.nodeprecated && utils.isDeprecated(mdle))) {
Content moduleLinkContent = getModuleLink(mdle, new StringContent(mdle.getQualifiedName().toString()));
Content summaryContent = new ContentBuilder();
addSummaryComment(mdle, summaryContent);
table.addRow(mdle, moduleLinkContent, summaryContent);
}
}
}
if (showTabs(groupTypes)) {
caption = getTableCaption(groupTypes);
generateGroupTypesScript(groupTypeMap, groupTypes.getGroupTypes());
} else {
caption = getTableCaption((groupList.size() == 1) ? new StringContent(groupList.get(0)) : contents.modulesLabel);
}
Content table = getTableHeader(caption, tableSummary, HtmlStyle.overviewSummary);
Content header = new TableHeader(contents.moduleLabel, contents.descriptionLabel).toContent();
table.addContent(header);
table.addContent(tbody);
Content div = HtmlTree.DIV(HtmlStyle.contentContainer, table);
Content div = HtmlTree.DIV(HtmlStyle.contentContainer, table.toContent());
if (configuration.allowTag(HtmlTag.MAIN)) {
htmlTree.addContent(div);
} else {
body.addContent(div);
}
}
}
/**
* Adds list of modules in the index table. Generate link to each module.
*
* @param map map of module elements and group names
* @param tbody the documentation tree to which the list will be added
*/
protected void addModulesList(TreeMap<ModuleElement, String> map, Content tbody) {
String groupname;
for (ModuleElement mdle : map.keySet()) {
if (!mdle.isUnnamed()) {
groupname = map.get(mdle);
Content moduleLinkContent = getModuleLink(mdle, new StringContent(mdle.getQualifiedName().toString()));
Content thModule = HtmlTree.TH_ROW_SCOPE(HtmlStyle.colFirst, moduleLinkContent);
HtmlTree tdSummary = new HtmlTree(HtmlTag.TD);
tdSummary.addStyle(HtmlStyle.colLast);
addSummaryComment(mdle, tdSummary);
HtmlTree tr = HtmlTree.TR(thModule);
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);
if (table.needsScript()) {
getScript().addContent(table.getScript());
}
altColor = !altColor;
}
}
@ -221,7 +179,7 @@ public class ModuleIndexWriter extends AbstractModuleIndexWriter {
addConfigurationTitle(body);
if (!utils.getFullBody(configuration.overviewElement).isEmpty()) {
HtmlTree div = new HtmlTree(HtmlTag.DIV);
div.addStyle(HtmlStyle.contentContainer);
div.setStyle(HtmlStyle.contentContainer);
addOverviewComment(div);
if (configuration.allowTag(HtmlTag.MAIN)) {
htmlTree.addContent(div);
@ -265,13 +223,13 @@ public class ModuleIndexWriter extends AbstractModuleIndexWriter {
*/
@Override
protected void addNavigationBarHeader(Content body) {
Content htmlTree = (configuration.allowTag(HtmlTag.HEADER))
Content tree = (configuration.allowTag(HtmlTag.HEADER))
? HtmlTree.HEADER()
: body;
addTop(htmlTree);
addNavLinks(true, htmlTree);
addTop(tree);
addNavLinks(true, tree);
if (configuration.allowTag(HtmlTag.HEADER)) {
body.addContent(htmlTree);
body.addContent(tree);
}
}

@ -25,9 +25,11 @@
package jdk.javadoc.internal.doclets.formats.html;
import jdk.javadoc.internal.doclets.formats.html.markup.Table;
import jdk.javadoc.internal.doclets.formats.html.markup.TableHeader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.EnumSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
@ -43,7 +45,7 @@ import javax.lang.model.util.ElementFilter;
import com.sun.source.doctree.DocTree;
import jdk.javadoc.doclet.DocletEnvironment.ModuleMode;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlAttr;
import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlConstants;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTag;
@ -55,7 +57,6 @@ import jdk.javadoc.internal.doclets.toolkit.ModuleSummaryWriter;
import jdk.javadoc.internal.doclets.toolkit.util.CommentHelper;
import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException;
import jdk.javadoc.internal.doclets.toolkit.util.DocPaths;
import jdk.javadoc.internal.doclets.toolkit.util.ModulePackageTypes;
/**
* Class to generate file for each module contents in the right-hand frame. This will list all the
@ -157,12 +158,6 @@ public class ModuleWriterImpl extends HtmlDocletWriter implements ModuleSummaryW
private final Map<TypeElement, Content> providesTrees
= new TreeMap<>(utils.makeAllClassesComparator());
private int packageTypesOr = 0;
protected Set<ModulePackageTypes> modulePackageTypes = EnumSet.noneOf(ModulePackageTypes.class);
protected Map<String, Integer> typeMap = new LinkedHashMap<>();
/**
* The HTML tree for main tag.
*/
@ -208,7 +203,7 @@ public class ModuleWriterImpl extends HtmlDocletWriter implements ModuleSummaryW
bodyTree.addContent(htmlTree);
}
HtmlTree div = new HtmlTree(HtmlTag.DIV);
div.addStyle(HtmlStyle.header);
div.setStyle(HtmlStyle.header);
Content annotationContent = new HtmlTree(HtmlTag.P);
addAnnotationInfo(mdle, annotationContent);
div.addContent(annotationContent);
@ -234,7 +229,7 @@ public class ModuleWriterImpl extends HtmlDocletWriter implements ModuleSummaryW
@Override
public Content getContentHeader() {
HtmlTree div = new HtmlTree(HtmlTag.DIV);
div.addStyle(HtmlStyle.contentContainer);
div.setStyle(HtmlStyle.contentContainer);
return div;
}
@ -244,7 +239,7 @@ public class ModuleWriterImpl extends HtmlDocletWriter implements ModuleSummaryW
@Override
public Content getSummaryHeader() {
HtmlTree li = new HtmlTree(HtmlTag.LI);
li.addStyle(HtmlStyle.blockList);
li.setStyle(HtmlStyle.blockList);
return li;
}
@ -465,21 +460,7 @@ public class ModuleWriterImpl extends HtmlDocletWriter implements ModuleSummaryW
}
/**
* Get a table.
*
* @param text the table caption
* @param tableSummary the summary for the table
* @param tableStyle the table style
* @param tableHeader the table header
* @return a content object
*/
Content getTable(String text, String tableSummary, HtmlStyle tableStyle,
TableHeader tableHeader) {
return getTable(getTableCaption(new RawHtml(text)), tableSummary, tableStyle, tableHeader);
}
/**
* Get a table.
* Get a table, with two columns.
*
* @param caption the table caption
* @param tableSummary the summary for the table
@ -487,13 +468,32 @@ public class ModuleWriterImpl extends HtmlDocletWriter implements ModuleSummaryW
* @param tableHeader the table header
* @return a content object
*/
Content getTable(Content caption, String tableSummary, HtmlStyle tableStyle,
private Table getTable2(Content caption, String tableSummary, HtmlStyle tableStyle,
TableHeader tableHeader) {
Content table = (configuration.isOutputHtml5())
? HtmlTree.TABLE(tableStyle, caption)
: HtmlTree.TABLE(tableStyle, tableSummary, caption);
table.addContent(tableHeader.toContent());
return table;
return new Table(configuration.htmlVersion, tableStyle)
.setSummary(tableSummary)
.setCaption(caption)
.setHeader(tableHeader)
.setColumnStyles(HtmlStyle.colFirst, HtmlStyle.colLast);
}
/**
* Get a table, with three columns, with the second column being the defining column.
*
* @param caption the table caption
* @param tableSummary the summary for the table
* @param tableStyle the table style
* @param tableHeader the table header
* @return a content object
*/
private Table getTable3(Content caption, String tableSummary, HtmlStyle tableStyle,
TableHeader tableHeader) {
return new Table(configuration.htmlVersion, tableStyle)
.setSummary(tableSummary)
.setCaption(caption)
.setHeader(tableHeader)
.setRowScopeColumn(1)
.setColumnStyles(HtmlStyle.colFirst, HtmlStyle.colSecond, HtmlStyle.colLast);
}
/**
@ -506,33 +506,31 @@ public class ModuleWriterImpl extends HtmlDocletWriter implements ModuleSummaryW
new TableHeader(contents.modifierLabel, contents.moduleLabel,
contents.descriptionLabel);
HtmlTree li = new HtmlTree(HtmlTag.LI);
li.addStyle(HtmlStyle.blockList);
li.setStyle(HtmlStyle.blockList);
addSummaryHeader(HtmlConstants.START_OF_MODULES_SUMMARY, SectionName.MODULES,
contents.navModules, li);
if (display(requires)) {
String text = configuration.getText("doclet.Requires_Summary");
String tableSummary = configuration.getText("doclet.Member_Table_Summary",
String text = resources.getText("doclet.Requires_Summary");
String tableSummary = resources.getText("doclet.Member_Table_Summary",
text,
configuration.getText("doclet.modules"));
Content table = getTable(text, tableSummary, HtmlStyle.requiresSummary,
requiresTableHeader);
Content tbody = new HtmlTree(HtmlTag.TBODY);
addModulesList(requires, tbody);
table.addContent(tbody);
li.addContent(table);
resources.getText("doclet.modules"));
Content caption = getTableCaption(new StringContent(text));
Table table = getTable3(caption, tableSummary, HtmlStyle.requiresSummary,
requiresTableHeader);
addModulesList(requires, table);
li.addContent(table.toContent());
}
// Display indirect modules table in both "api" and "all" mode.
if (display(indirectModules)) {
String amrText = configuration.getText("doclet.Indirect_Requires_Summary");
String amrTableSummary = configuration.getText("doclet.Member_Table_Summary",
String amrText = resources.getText("doclet.Indirect_Requires_Summary");
String amrTableSummary = resources.getText("doclet.Member_Table_Summary",
amrText,
configuration.getText("doclet.modules"));
Content amrTable = getTable(amrText, amrTableSummary, HtmlStyle.requiresSummary,
requiresTableHeader);
Content amrTbody = new HtmlTree(HtmlTag.TBODY);
addModulesList(indirectModules, amrTbody);
amrTable.addContent(amrTbody);
li.addContent(amrTable);
Content amrCaption = getTableCaption(new StringContent(amrText));
Table amrTable = getTable3(amrCaption, amrTableSummary, HtmlStyle.requiresSummary,
requiresTableHeader);
addModulesList(indirectModules, amrTable);
li.addContent(amrTable.toContent());
}
HtmlTree ul = HtmlTree.UL(HtmlStyle.blockList, li);
summaryContentTree.addContent(ul);
@ -545,21 +543,13 @@ public class ModuleWriterImpl extends HtmlDocletWriter implements ModuleSummaryW
* @param mdleMap map of modules and modifiers
* @param tbody the content tree to which the list will be added
*/
public void addModulesList(Map<ModuleElement, Content> mdleMap, Content tbody) {
boolean altColor = true;
private void addModulesList(Map<ModuleElement, Content> mdleMap, Table table) {
for (ModuleElement m : mdleMap.keySet()) {
Content tdModifiers = HtmlTree.TD(HtmlStyle.colFirst, mdleMap.get(m));
Content moduleLinkContent = getModuleLink(m, new StringContent(m.getQualifiedName()));
Content thModule = HtmlTree.TH_ROW_SCOPE(HtmlStyle.colSecond, moduleLinkContent);
HtmlTree tdSummary = new HtmlTree(HtmlTag.TD);
tdSummary.addStyle(HtmlStyle.colLast);
addSummaryComment(m, tdSummary);
HtmlTree tr = HtmlTree.TR(tdModifiers);
tr.addContent(thModule);
tr.addContent(tdSummary);
tr.addStyle(altColor ? HtmlStyle.altColor : HtmlStyle.rowColor);
tbody.addContent(tr);
altColor = !altColor;
Content modifiers = mdleMap.get(m);
Content moduleLink = getModuleLink(m, new StringContent(m.getQualifiedName()));
Content moduleSummary = new ContentBuilder();
addSummaryComment(m, moduleSummary);
table.addRow(modifiers, moduleLink, moduleSummary);
}
}
@ -568,42 +558,38 @@ public class ModuleWriterImpl extends HtmlDocletWriter implements ModuleSummaryW
if (display(exportedPackages) || display(openedPackages) || display(concealedPackages)
|| display(indirectPackages) || display(indirectOpenPackages)) {
HtmlTree li = new HtmlTree(HtmlTag.LI);
li.addStyle(HtmlStyle.blockList);
li.setStyle(HtmlStyle.blockList);
addSummaryHeader(HtmlConstants.START_OF_PACKAGES_SUMMARY, SectionName.PACKAGES,
contents.navPackages, li);
String tableSummary = configuration.getText("doclet.Member_Table_Summary",
configuration.getText("doclet.Packages_Summary"),
configuration.getText("doclet.packages"));
if (display(exportedPackages) || display(openedPackages) || display(concealedPackages)) {
String tableSummary = resources.getText("doclet.Member_Table_Summary",
resources.getText("doclet.Packages_Summary"),
resources.getText("doclet.packages"));
addPackageSummary(tableSummary, li);
}
TableHeader indirectPackagesHeader =
new TableHeader(contents.fromLabel, contents.packagesLabel);
if (display(indirectPackages)) {
String aepText = configuration.getText("doclet.Indirect_Exports_Summary");
String aepTableSummary = configuration.getText("doclet.Indirect_Packages_Table_Summary",
String aepText = resources.getText("doclet.Indirect_Exports_Summary");
String aepTableSummary = resources.getText("doclet.Indirect_Packages_Table_Summary",
aepText,
configuration.getText("doclet.modules"),
configuration.getText("doclet.packages"));
Content aepTable = getTable(aepText, aepTableSummary, HtmlStyle.packagesSummary,
indirectPackagesHeader);
Content aepTbody = new HtmlTree(HtmlTag.TBODY);
addIndirectPackages(aepTbody, indirectPackages);
aepTable.addContent(aepTbody);
li.addContent(aepTable);
resources.getText("doclet.modules"),
resources.getText("doclet.packages"));
Table aepTable = getTable2(new StringContent(aepText), aepTableSummary,
HtmlStyle.packagesSummary, indirectPackagesHeader);
addIndirectPackages(aepTable, indirectPackages);
li.addContent(aepTable.toContent());
}
if (display(indirectOpenPackages)) {
String aopText = configuration.getText("doclet.Indirect_Opens_Summary");
String aopTableSummary = configuration.getText("doclet.Indirect_Packages_Table_Summary",
String aopText = resources.getText("doclet.Indirect_Opens_Summary");
String aopTableSummary = resources.getText("doclet.Indirect_Packages_Table_Summary",
aopText,
configuration.getText("doclet.modules"),
configuration.getText("doclet.packages"));
Content aopTable = getTable(aopText, aopTableSummary, HtmlStyle.packagesSummary,
indirectPackagesHeader);
Content aopTbody = new HtmlTree(HtmlTag.TBODY);
addIndirectPackages(aopTbody, indirectOpenPackages);
aopTable.addContent(aopTbody);
li.addContent(aopTable);
resources.getText("doclet.modules"),
resources.getText("doclet.packages"));
Table aopTable = getTable2(new StringContent(aopText), aopTableSummary,
HtmlStyle.packagesSummary, indirectPackagesHeader);
addIndirectPackages(aopTable, indirectOpenPackages);
li.addContent(aopTable.toContent());
}
HtmlTree ul = HtmlTree.UL(HtmlStyle.blockList, li);
summaryContentTree.addContent(ul);
@ -617,79 +603,31 @@ public class ModuleWriterImpl extends HtmlDocletWriter implements ModuleSummaryW
* @param li
*/
public void addPackageSummary(String tableSummary, HtmlTree li) {
Content caption;
Content tbody = getPackageTableRows();
if (showTabs()) {
caption = getTableCaption();
generateTableTabTypesScript(typeMap, modulePackageTypes, "packages");
Table table = new Table(configuration.htmlVersion, HtmlStyle.packagesSummary)
.setSummary(tableSummary)
.setDefaultTab(resources.getText("doclet.All_Packages"))
.addTab(resources.getText("doclet.Exported_Packages_Summary"),
e -> exportedPackages.containsKey((PackageElement) e))
.addTab(resources.getText("doclet.Opened_Packages_Summary"),
e -> openedPackages.containsKey((PackageElement) e))
.addTab(resources.getText("doclet.Concealed_Packages_Summary"),
e -> concealedPackages.contains((PackageElement) e))
.setTabScript(i -> String.format("showPkgs(%d);", i))
.setTabScriptVariable("packages");
if (configuration.docEnv.getModuleMode() == ModuleMode.API) {
table.setHeader(new TableHeader(contents.packageLabel, contents.descriptionLabel))
.setColumnStyles(HtmlStyle.colFirst, HtmlStyle.colLast);
} else {
ModulePackageTypes type = modulePackageTypes.iterator().next();
caption = getTableCaption(configuration.getContent(type.tableTabs().resourceKey()));
table.setHeader(new TableHeader(contents.packageLabel, contents.moduleLabel, contents.descriptionLabel))
.setColumnStyles(HtmlStyle.colFirst, HtmlStyle.colSecond, HtmlStyle.colLast);
}
TableHeader header = (configuration.docEnv.getModuleMode() == ModuleMode.ALL)
? new TableHeader(contents.packageLabel, contents.moduleLabel, contents.descriptionLabel)
: new TableHeader(contents.packageLabel, contents.descriptionLabel);
Content table = getTable(caption, tableSummary, HtmlStyle.packagesSummary, header);
table.addContent(tbody);
li.addContent(table);
}
/**
* Returns true if the table tabs needs to be displayed.
*
* @return true if the tabs should be displayed
*/
public boolean showTabs() {
int value;
for (ModulePackageTypes type : EnumSet.allOf(ModulePackageTypes.class)) {
value = type.tableTabs().value();
if ((value & packageTypesOr) == value) {
modulePackageTypes.add(type);
}
addPackageTableRows(table);
li.addContent(table.toContent());
if (table.needsScript()) {
script.addContent(new RawHtml(table.getScript()));
}
boolean showTabs = modulePackageTypes.size() > 1;
if (showTabs) {
modulePackageTypes.add(ModulePackageTypes.ALL);
}
return showTabs;
}
/**
* Get the summary table caption.
*
* @return the caption for the summary table
*/
public Content getTableCaption() {
Content tabbedCaption = new HtmlTree(HtmlTag.CAPTION);
for (ModulePackageTypes type : modulePackageTypes) {
Content captionSpan;
Content span;
if (type.tableTabs().isDefaultTab()) {
captionSpan = HtmlTree.SPAN(configuration.getContent(type.tableTabs().resourceKey()));
span = HtmlTree.SPAN(type.tableTabs().tabId(),
HtmlStyle.activeTableTab, captionSpan);
} else {
captionSpan = HtmlTree.SPAN(getPackageTypeLinks(type));
span = HtmlTree.SPAN(type.tableTabs().tabId(),
HtmlStyle.tableTab, captionSpan);
}
Content tabSpan = HtmlTree.SPAN(HtmlStyle.tabEnd, Contents.SPACE);
span.addContent(tabSpan);
tabbedCaption.addContent(span);
}
return tabbedCaption;
}
/**
* Get the package type links for the table caption.
*
* @param packageType the package type to be displayed as link
* @return the content tree for the package type link
*/
public Content getPackageTypeLinks(ModulePackageTypes packageType) {
String jsShow = "javascript:showPkgs(" + packageType.tableTabs().value() + ");";
HtmlTree link = HtmlTree.A(jsShow, configuration.getContent(packageType.tableTabs().resourceKey()));
return link;
}
/**
@ -697,109 +635,70 @@ public class ModuleWriterImpl extends HtmlDocletWriter implements ModuleSummaryW
*
* @return a content object
*/
public Content getPackageTableRows() {
Content tbody = new HtmlTree(HtmlTag.TBODY);
boolean altColor = true;
int counter = 0;
counter = addPackageTableRows(tbody, counter, ModulePackageTypes.EXPORTED, exportedPackages);
counter = addPackageTableRows(tbody, counter, ModulePackageTypes.OPENED, openedPackages);
private void addPackageTableRows(Table table) {
addPackageTableRows(table, exportedPackages);
addPackageTableRows(table, openedPackages);
// Show concealed packages only in "all" mode.
if (moduleMode == ModuleMode.ALL) {
for (PackageElement pkg : concealedPackages) {
Content pkgLinkContent = getPackageLink(pkg, new StringContent(utils.getPackageName(pkg)));
Content thPackage = HtmlTree.TH_ROW_SCOPE(HtmlStyle.colFirst, pkgLinkContent);
HtmlTree tdModules = new HtmlTree(HtmlTag.TD);
tdModules.addStyle(HtmlStyle.colSecond);
tdModules.addContent(configuration.getText("doclet.None"));
HtmlTree tdSummary = new HtmlTree(HtmlTag.TD);
tdSummary.addStyle(HtmlStyle.colLast);
addSummaryComment(pkg, tdSummary);
HtmlTree tr = HtmlTree.TR(thPackage);
tr.addContent(tdModules);
tr.addContent(tdSummary);
tr.addStyle(altColor ? HtmlStyle.altColor : HtmlStyle.rowColor);
int pkgType = ModulePackageTypes.CONCEALED.tableTabs().value();
packageTypesOr = packageTypesOr | pkgType;
String tableId = "i" + counter;
counter++;
typeMap.put(tableId, pkgType);
tr.addAttr(HtmlAttr.ID, tableId);
tbody.addContent(tr);
altColor = !altColor;
Content noModules = new StringContent(resources.getText("doclet.None"));
Content summary = new ContentBuilder();
addSummaryComment(pkg, summary);
table.addRow(pkg, pkgLinkContent, noModules, summary);
}
}
return tbody;
}
public int addPackageTableRows(Content tbody, int counter, ModulePackageTypes pType,
Map<PackageElement,SortedSet<ModuleElement>> ap) {
boolean altColor = true;
private void addPackageTableRows(Table table, Map<PackageElement,SortedSet<ModuleElement>> ap) {
for (Map.Entry<PackageElement, SortedSet<ModuleElement>> entry : ap.entrySet()) {
List<Content> row = new ArrayList<>();
PackageElement pkg = entry.getKey();
SortedSet<ModuleElement> mdleList = entry.getValue();
Content pkgLinkContent = getPackageLink(pkg, new StringContent(utils.getPackageName(pkg)));
Content thPackage = HtmlTree.TH_ROW_SCOPE(HtmlStyle.colFirst, pkgLinkContent);
HtmlTree tr = HtmlTree.TR(thPackage);
row.add(pkgLinkContent);
if (moduleMode == ModuleMode.ALL) {
HtmlTree tdModules = new HtmlTree(HtmlTag.TD);
tdModules.addStyle(HtmlStyle.colSecond);
Content modules = new ContentBuilder();
if (!mdleList.isEmpty()) {
int sep = 0;
for (ModuleElement m : mdleList) {
if (sep > 0) {
tdModules.addContent(new HtmlTree(HtmlTag.BR));
if (!modules.isEmpty()) {
modules.addContent(new HtmlTree(HtmlTag.BR));
}
tdModules.addContent(getModuleLink(m, new StringContent(m.getQualifiedName())));
sep++;
modules.addContent(getModuleLink(m, new StringContent(m.getQualifiedName())));
}
} else {
tdModules.addContent(configuration.getText("doclet.All_Modules"));
Content allModules = new StringContent(resources.getText("doclet.All_Modules"));
modules.addContent(allModules);
}
tr.addContent(tdModules);
row.add(modules);
}
HtmlTree tdSummary = new HtmlTree(HtmlTag.TD);
tdSummary.addStyle(HtmlStyle.colLast);
addSummaryComment(pkg, tdSummary);
tr.addContent(tdSummary);
tr.addStyle(altColor ? HtmlStyle.altColor : HtmlStyle.rowColor);
int pkgType = pType.tableTabs().value();
packageTypesOr = packageTypesOr | pkgType;
String tableId = "i" + counter;
counter++;
typeMap.put(tableId, pkgType);
tr.addAttr(HtmlAttr.ID, tableId);
tbody.addContent(tr);
altColor = !altColor;
Content summary = new ContentBuilder();
addSummaryComment(pkg, summary);
row.add(summary);
table.addRow(pkg, row);
}
return counter;
}
/**
* Add the indirect packages for the module being documented.
*
* @param tbody the content tree to which the table will be added
* @param table the table to which the content rows will be added
* @param ip indirect packages to be added
*/
public void addIndirectPackages(Content tbody, Map<ModuleElement, SortedSet<PackageElement>> ip) {
boolean altColor = true;
public void addIndirectPackages(Table table, Map<ModuleElement, SortedSet<PackageElement>> ip) {
for (Map.Entry<ModuleElement, SortedSet<PackageElement>> entry : ip.entrySet()) {
ModuleElement m = entry.getKey();
SortedSet<PackageElement> pkgList = entry.getValue();
Content moduleLinkContent = getModuleLink(m, new StringContent(m.getQualifiedName()));
Content thModule = HtmlTree.TH_ROW_SCOPE(HtmlStyle.colFirst, moduleLinkContent);
HtmlTree tdPackages = new HtmlTree(HtmlTag.TD);
tdPackages.addStyle(HtmlStyle.colLast);
Content packages = new ContentBuilder();
String sep = "";
for (PackageElement pkg : pkgList) {
tdPackages.addContent(sep);
tdPackages.addContent(getPackageLink(pkg, new StringContent(utils.getPackageName(pkg))));
packages.addContent(sep);
packages.addContent(getPackageLink(pkg, new StringContent(utils.getPackageName(pkg))));
sep = " ";
}
HtmlTree tr = HtmlTree.TR(thModule);
tr.addContent(tdPackages);
tr.addStyle(altColor ? HtmlStyle.altColor : HtmlStyle.rowColor);
tbody.addContent(tr);
altColor = !altColor;
table.addRow(moduleLinkContent, packages);
}
}
@ -814,7 +713,7 @@ public class ModuleWriterImpl extends HtmlDocletWriter implements ModuleSummaryW
if (haveProvides || haveUses) {
HtmlTree li = new HtmlTree(HtmlTag.LI);
li.addStyle(HtmlStyle.blockList);
li.setStyle(HtmlStyle.blockList);
addSummaryHeader(HtmlConstants.START_OF_SERVICES_SUMMARY, SectionName.SERVICES,
contents.navServices, li);
TableHeader usesProvidesTableHeader =
@ -822,27 +721,25 @@ public class ModuleWriterImpl extends HtmlDocletWriter implements ModuleSummaryW
if (haveProvides) {
String label = resources.getText("doclet.Provides_Summary");
String tableSummary = resources.getText("doclet.Member_Table_Summary",
label, resources.getText("doclet.types"));
Content table = getTable(label, tableSummary, HtmlStyle.providesSummary,
label,
resources.getText("doclet.types"));
Table table = getTable2(new StringContent(label), tableSummary, HtmlStyle.providesSummary,
usesProvidesTableHeader);
Content tbody = new HtmlTree(HtmlTag.TBODY);
addProvidesList(tbody);
if (!tbody.isEmpty()) {
table.addContent(tbody);
li.addContent(table);
addProvidesList(table);
if (!table.isEmpty()) {
li.addContent(table.toContent());
}
}
if (haveUses){
String label = resources.getText("doclet.Uses_Summary");
String tableSummary = resources.getText("doclet.Member_Table_Summary",
label, resources.getText("doclet.types"));
Content table = getTable(label, tableSummary, HtmlStyle.usesSummary,
label,
resources.getText("doclet.types"));
Table table = getTable2(new StringContent(label), tableSummary, HtmlStyle.usesSummary,
usesProvidesTableHeader);
Content tbody = new HtmlTree(HtmlTag.TBODY);
addUsesList(tbody);
if (!tbody.isEmpty()) {
table.addContent(tbody);
li.addContent(table);
addUsesList(table);
if (!table.isEmpty()) {
li.addContent(table.toContent());
}
}
HtmlTree ul = HtmlTree.UL(HtmlStyle.blockList, li);
@ -853,44 +750,34 @@ public class ModuleWriterImpl extends HtmlDocletWriter implements ModuleSummaryW
/**
* Add the uses list for the module.
*
* @param tbody the content tree to which the directive will be added
* @param table the table to which the services used will be added
*/
public void addUsesList(Content tbody) {
boolean altColor = true;
public void addUsesList(Table table) {
Content typeLinkContent;
Content thType;
HtmlTree tdSummary;
Content description;
for (TypeElement t : uses) {
if (!displayServiceDirective(t, usesTrees)) {
continue;
}
typeLinkContent = getLink(new LinkInfoImpl(configuration, LinkInfoImpl.Kind.PACKAGE, t));
thType = HtmlTree.TH_ROW_SCOPE(HtmlStyle.colFirst, typeLinkContent);
tdSummary = new HtmlTree(HtmlTag.TD);
tdSummary.addStyle(HtmlStyle.colLast);
Content summary = new ContentBuilder();
if (display(usesTrees)) {
description = usesTrees.get(t);
if (description != null) {
tdSummary.addContent(description);
summary.addContent(description);
}
}
addSummaryComment(t, tdSummary);
HtmlTree tr = HtmlTree.TR(thType);
tr.addContent(tdSummary);
tr.addStyle(altColor ? HtmlStyle.altColor : HtmlStyle.rowColor);
tbody.addContent(tr);
altColor = !altColor;
addSummaryComment(t, summary);
table.addRow(typeLinkContent, summary);
}
}
/**
* Add the provides list for the module.
*
* @param tbody the content tree to which the directive will be added
* @param table the table to which the services provided will be added
*/
public void addProvidesList(Content tbody) {
boolean altColor = true;
public void addProvidesList(Table table) {
SortedSet<TypeElement> implSet;
Content description;
for (Map.Entry<TypeElement, SortedSet<TypeElement>> entry : provides.entrySet()) {
@ -900,36 +787,30 @@ public class ModuleWriterImpl extends HtmlDocletWriter implements ModuleSummaryW
}
implSet = entry.getValue();
Content srvLinkContent = getLink(new LinkInfoImpl(configuration, LinkInfoImpl.Kind.PACKAGE, srv));
HtmlTree thType = HtmlTree.TH_ROW_SCOPE(HtmlStyle.colFirst, srvLinkContent);
HtmlTree tdDesc = new HtmlTree(HtmlTag.TD);
tdDesc.addStyle(HtmlStyle.colLast);
Content desc = new ContentBuilder();
if (display(providesTrees)) {
description = providesTrees.get(srv);
if (description != null) {
tdDesc.addContent(description);
desc.addContent(description);
}
}
addSummaryComment(srv, tdDesc);
addSummaryComment(srv, desc);
// Only display the implementation details in the "all" mode.
if (moduleMode == ModuleMode.ALL && !implSet.isEmpty()) {
tdDesc.addContent(new HtmlTree(HtmlTag.BR));
tdDesc.addContent("(");
desc.addContent(new HtmlTree(HtmlTag.BR));
desc.addContent("(");
HtmlTree implSpan = HtmlTree.SPAN(HtmlStyle.implementationLabel, contents.implementation);
tdDesc.addContent(implSpan);
tdDesc.addContent(Contents.SPACE);
desc.addContent(implSpan);
desc.addContent(Contents.SPACE);
String sep = "";
for (TypeElement impl : implSet) {
tdDesc.addContent(sep);
tdDesc.addContent(getLink(new LinkInfoImpl(configuration, LinkInfoImpl.Kind.PACKAGE, impl)));
desc.addContent(sep);
desc.addContent(getLink(new LinkInfoImpl(configuration, LinkInfoImpl.Kind.PACKAGE, impl)));
sep = ", ";
}
tdDesc.addContent(")");
desc.addContent(")");
}
HtmlTree tr = HtmlTree.TR(thType);
tr.addContent(tdDesc);
tr.addStyle(altColor ? HtmlStyle.altColor : HtmlStyle.rowColor);
tbody.addContent(tr);
altColor = !altColor;
table.addRow(srvLinkContent, desc);
}
}
@ -943,7 +824,7 @@ public class ModuleWriterImpl extends HtmlDocletWriter implements ModuleSummaryW
if (utils.isDeprecated(mdle)) {
CommentHelper ch = utils.getCommentHelper(mdle);
HtmlTree deprDiv = new HtmlTree(HtmlTag.DIV);
deprDiv.addStyle(HtmlStyle.deprecationBlock);
deprDiv.setStyle(HtmlStyle.deprecationBlock);
Content deprPhrase = HtmlTree.SPAN(HtmlStyle.deprecatedLabel, getDeprecatedPhrase(mdle));
deprDiv.addContent(deprPhrase);
if (!deprs.isEmpty()) {
@ -1078,7 +959,7 @@ public class ModuleWriterImpl extends HtmlDocletWriter implements ModuleSummaryW
if (utils.isDeprecated(pkg)) {
deprs = utils.getDeprecatedTrees(pkg);
HtmlTree deprDiv = new HtmlTree(HtmlTag.DIV);
deprDiv.addStyle(HtmlStyle.deprecationBlock);
deprDiv.setStyle(HtmlStyle.deprecationBlock);
Content deprPhrase = HtmlTree.SPAN(HtmlStyle.deprecatedLabel, getDeprecatedPhrase(pkg));
deprDiv.addContent(deprPhrase);
if (!deprs.isEmpty()) {

@ -25,10 +25,15 @@
package jdk.javadoc.internal.doclets.formats.html;
import jdk.javadoc.internal.doclets.formats.html.markup.Table;
import jdk.javadoc.internal.doclets.formats.html.markup.TableHeader;
import java.util.Arrays;
import java.util.List;
import javax.lang.model.element.Element;
import javax.lang.model.element.TypeElement;
import jdk.javadoc.internal.doclets.formats.html.TableHeader;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlConstants;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
@ -94,33 +99,29 @@ public class NestedClassWriterImpl extends AbstractMemberWriter
* {@inheritDoc}
*/
@Override
public String getTableSummary() {
return resources.getText("doclet.Member_Table_Summary",
public TableHeader getSummaryTableHeader(Element member) {
Content label = utils.isInterface(member) ?
contents.interfaceLabel : contents.classLabel;
return new TableHeader(contents.modifierAndTypeLabel, label, contents.descriptionLabel);
}
@Override
protected Table createSummaryTable() {
String summary = resources.getText("doclet.Member_Table_Summary",
resources.getText("doclet.Nested_Class_Summary"),
resources.getText("doclet.nested_classes"));
}
/**
* {@inheritDoc}
*/
@Override
public Content getCaption() {
return configuration.getContent("doclet.Nested_Classes");
}
List<HtmlStyle> bodyRowStyles = Arrays.asList(HtmlStyle.colFirst, HtmlStyle.colSecond,
HtmlStyle.colLast);
/**
* {@inheritDoc}
*/
@Override
public TableHeader getSummaryTableHeader(Element member) {
if (utils.isInterface(member)) {
return new TableHeader(contents.modifierAndTypeLabel, contents.interfaceLabel,
contents.descriptionLabel);
} else {
return new TableHeader(contents.modifierAndTypeLabel, contents.classLabel,
contents.descriptionLabel);
}
return new Table(configuration.htmlVersion, HtmlStyle.memberSummary)
.setSummary(summary)
.setCaption(contents.getContent("doclet.Nested_Classes"))
.setHeader(getSummaryTableHeader(typeElement))
.setRowScopeColumn(1)
.setColumnStyles(bodyRowStyles)
.setUseTBody(false); // temporary? compatibility mode for TBody
}
/**

@ -108,7 +108,7 @@ public class PackageFrameWriter extends HtmlDocletWriter {
packgen.getTargetPackageLink(packageElement, "classFrame", pkgNameContent));
htmlTree.addContent(heading);
HtmlTree div = new HtmlTree(HtmlTag.DIV);
div.addStyle(HtmlStyle.indexContainer);
div.setStyle(HtmlStyle.indexContainer);
packgen.addClassListing(div);
htmlTree.addContent(div);
if (configuration.allowTag(HtmlTag.MAIN)) {

@ -25,21 +25,21 @@
package jdk.javadoc.internal.doclets.formats.html;
import jdk.javadoc.internal.doclets.formats.html.markup.Table;
import java.util.*;
import javax.lang.model.element.PackageElement;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlAttr;
import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder;
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.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
@ -56,29 +56,6 @@ import jdk.javadoc.internal.doclets.toolkit.util.GroupTypes;
*/
public class PackageIndexWriter extends AbstractPackageIndexWriter {
/**
* Map representing the group of packages as specified on the command line.
*
* @see Group
*/
private final Map<String, SortedSet<PackageElement>> groupPackageMap;
/**
* List to store the order groups, which has elements to be displayed, as specified on the command line.
*/
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.
*/
@ -95,11 +72,6 @@ public class PackageIndexWriter extends AbstractPackageIndexWriter {
*/
public PackageIndexWriter(HtmlConfiguration configuration, DocPath filename) {
super(configuration, filename);
groupPackageMap = configuration.group.groupPackages(packages);
configuration.group.getGroupList().stream()
.filter(groupPackageMap::containsKey)
.forEachOrdered(groupList::add);
groupTypes = new GroupTypes(groupList, resources.getText("doclet.All_Packages"));
}
/**
@ -130,68 +102,50 @@ public class PackageIndexWriter extends AbstractPackageIndexWriter {
*/
@Override
protected void addPackagesList(Content body) {
if (!groupList.isEmpty()) {
Content caption;
TreeMap<PackageElement, String> groupMap = new TreeMap<>(utils.makePackageComparator());
Content tbody = new HtmlTree(HtmlTag.TBODY);
Map<String, SortedSet<PackageElement>> groupPackageMap
= configuration.group.groupPackages(packages);
if (!groupPackageMap.keySet().isEmpty()) {
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);
Table table = new Table(configuration.htmlVersion, HtmlStyle.overviewSummary)
.setSummary(tableSummary)
.setHeader(getPackageTableHeader())
.setColumnStyles(HtmlStyle.colFirst, HtmlStyle.colLast)
.setDefaultTab(resources.getText("doclet.All_Packages"))
.setTabScriptVariable("groups")
.setTabScript(i -> "showGroups(" + i + ");")
.setTabId(i -> (i == 0) ? "t0" : ("t" + (1 << (i - 1))));
// add the tabs in command-line order
for (String groupName : configuration.group.getGroupList()) {
Set<PackageElement> groupPackages = groupPackageMap.get(groupName);
if (groupPackages != null) {
table.addTab(groupName, groupPackages::contains);
}
}
if (!groupMap.isEmpty()) {
addPackagesList(groupMap, tbody);
for (PackageElement pkg : configuration.packages) {
if (!pkg.isUnnamed()) {
if (!(configuration.nodeprecated && utils.isDeprecated(pkg))) {
Content packageLinkContent = getPackageLink(pkg, getPackageName(pkg));
Content summaryContent = new ContentBuilder();
addSummaryComment(pkg, summaryContent);
table.addRow(pkg, packageLinkContent, summaryContent);
}
}
}
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);
Content div = HtmlTree.DIV(HtmlStyle.contentContainer, table.toContent());
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 map map of package elements and group names
* @param tbody the documentation tree to which the list will be added
*/
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);
tdSummary.addStyle(HtmlStyle.colLast);
addSummaryComment(pkg, tdSummary);
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);
}
if (table.needsScript()) {
getScript().addContent(table.getScript());
}
altColor = !altColor;
}
}
@ -207,7 +161,7 @@ public class PackageIndexWriter extends AbstractPackageIndexWriter {
addConfigurationTitle(body);
if (!utils.getFullBody(configuration.overviewElement).isEmpty()) {
HtmlTree div = new HtmlTree(HtmlTag.DIV);
div.addStyle(HtmlStyle.contentContainer);
div.setStyle(HtmlStyle.contentContainer);
addOverviewComment(div);
if (configuration.allowTag(HtmlTag.MAIN)) {
htmlTree.addContent(div);
@ -251,13 +205,13 @@ public class PackageIndexWriter extends AbstractPackageIndexWriter {
*/
@Override
protected void addNavigationBarHeader(Content body) {
Content htmlTree = (configuration.allowTag(HtmlTag.HEADER))
Content tree = (configuration.allowTag(HtmlTag.HEADER))
? HtmlTree.HEADER()
: body;
addTop(htmlTree);
addNavLinks(true, htmlTree);
addTop(tree);
addNavLinks(true, tree);
if (configuration.allowTag(HtmlTag.HEADER)) {
body.addContent(htmlTree);
body.addContent(tree);
}
}
@ -269,13 +223,13 @@ public class PackageIndexWriter extends AbstractPackageIndexWriter {
*/
@Override
protected void addNavigationBarFooter(Content body) {
Content htmlTree = (configuration.allowTag(HtmlTag.FOOTER))
Content tree = (configuration.allowTag(HtmlTag.FOOTER))
? HtmlTree.FOOTER()
: body;
addNavLinks(false, htmlTree);
addBottom(htmlTree);
addNavLinks(false, tree);
addBottom(tree);
if (configuration.allowTag(HtmlTag.FOOTER)) {
body.addContent(htmlTree);
body.addContent(tree);
}
}
}

@ -126,7 +126,7 @@ public class PackageTreeWriter extends AbstractTreeWriter {
}
htmlTree.addContent(div);
HtmlTree divTree = new HtmlTree(HtmlTag.DIV);
divTree.addStyle(HtmlStyle.contentContainer);
divTree.setStyle(HtmlStyle.contentContainer);
addTree(classtree.baseClasses(), "doclet.Class_Hierarchy", divTree);
addTree(classtree.baseInterfaces(), "doclet.Interface_Hierarchy", divTree);
addTree(classtree.baseAnnotationTypes(), "doclet.Annotation_Type_Hierarchy", divTree);
@ -176,7 +176,7 @@ public class PackageTreeWriter extends AbstractTreeWriter {
contents.packageHierarchies);
div.addContent(span);
HtmlTree ul = new HtmlTree (HtmlTag.UL);
ul.addStyle(HtmlStyle.horizontal);
ul.setStyle(HtmlStyle.horizontal);
ul.addContent(getNavLinkMainTree(configuration.getText("doclet.All_Packages")));
div.addContent(ul);
}

@ -25,6 +25,9 @@
package jdk.javadoc.internal.doclets.formats.html;
import jdk.javadoc.internal.doclets.formats.html.markup.Table;
import jdk.javadoc.internal.doclets.formats.html.markup.TableHeader;
import java.util.*;
import javax.lang.model.element.PackageElement;
@ -121,7 +124,7 @@ public class PackageUseWriter extends SubWriterHolderWriter {
protected void generatePackageUseFile() throws DocFileIOException {
HtmlTree body = getPackageUseHeader();
HtmlTree div = new HtmlTree(HtmlTag.DIV);
div.addStyle(HtmlStyle.contentContainer);
div.setStyle(HtmlStyle.contentContainer);
if (usingPackageToUsedClasses.isEmpty()) {
div.addContent(contents.getContent("doclet.ClassUse_No.usage.of.0", utils.getPackageName(packageElement)));
} else {
@ -151,7 +154,7 @@ public class PackageUseWriter extends SubWriterHolderWriter {
*/
protected void addPackageUse(Content contentTree) {
HtmlTree ul = new HtmlTree(HtmlTag.UL);
ul.addStyle(HtmlStyle.blockList);
ul.setStyle(HtmlStyle.blockList);
if (configuration.packages.size() > 1) {
addPackageList(ul);
}
@ -165,25 +168,27 @@ public class PackageUseWriter extends SubWriterHolderWriter {
* @param contentTree the content tree to which the package list will be added
*/
protected void addPackageList(Content contentTree) {
Content caption = getTableCaption(configuration.getContent(
Content caption = contents.getContent(
"doclet.ClassUse_Packages.that.use.0",
getPackageLink(packageElement, utils.getPackageName(packageElement))));
Content table = (configuration.isOutputHtml5())
? HtmlTree.TABLE(HtmlStyle.useSummary, caption)
: HtmlTree.TABLE(HtmlStyle.useSummary, packageUseTableSummary, caption);
table.addContent(getPackageTableHeader().toContent());
Content tbody = new HtmlTree(HtmlTag.TBODY);
boolean altColor = true;
getPackageLink(packageElement, utils.getPackageName(packageElement)));
Table table = new Table(configuration.htmlVersion, HtmlStyle.useSummary)
.setSummary(packageUseTableSummary)
.setCaption(caption)
.setHeader(getPackageTableHeader())
.setColumnStyles(HtmlStyle.colFirst, HtmlStyle.colLast);
for (String pkgname: usingPackageToUsedClasses.keySet()) {
PackageElement pkg = utils.elementUtils.getPackageElement(pkgname);
HtmlTree tr = new HtmlTree(HtmlTag.TR);
tr.addStyle(altColor ? HtmlStyle.altColor : HtmlStyle.rowColor);
altColor = !altColor;
addPackageUse(pkg, tr);
tbody.addContent(tr);
Content packageLink = getHyperLink(utils.getPackageName(pkg),
new StringContent(utils.getPackageName(pkg)));
Content summary = new ContentBuilder();
if (pkg != null && !pkg.isUnnamed()) {
addSummaryComment(pkg, summary);
} else {
summary.addContent(Contents.SPACE);
}
table.addRow(packageLink, summary);
}
table.addContent(tbody);
Content li = HtmlTree.LI(HtmlStyle.blockList, table);
Content li = HtmlTree.LI(HtmlStyle.blockList, table.toContent());
contentTree.addContent(li);
}
@ -198,86 +203,46 @@ public class PackageUseWriter extends SubWriterHolderWriter {
for (String packageName : usingPackageToUsedClasses.keySet()) {
PackageElement usingPackage = utils.elementUtils.getPackageElement(packageName);
HtmlTree li = new HtmlTree(HtmlTag.LI);
li.addStyle(HtmlStyle.blockList);
li.setStyle(HtmlStyle.blockList);
if (usingPackage != null) {
li.addContent(getMarkerAnchor(utils.getPackageName(usingPackage)));
}
String tableSummary = configuration.getText("doclet.Use_Table_Summary",
configuration.getText("doclet.classes"));
Content caption = getTableCaption(configuration.getContent(
String tableSummary = resources.getText("doclet.Use_Table_Summary",
resources.getText("doclet.classes"));
Content caption = contents.getContent(
"doclet.ClassUse_Classes.in.0.used.by.1",
getPackageLink(packageElement, utils.getPackageName(packageElement)),
getPackageLink(usingPackage, utils.getPackageName(usingPackage))));
Content table = (configuration.isOutputHtml5())
? HtmlTree.TABLE(HtmlStyle.useSummary, caption)
: HtmlTree.TABLE(HtmlStyle.useSummary, tableSummary, caption);
table.addContent(classTableHeader.toContent());
Content tbody = new HtmlTree(HtmlTag.TBODY);
boolean altColor = true;
getPackageLink(usingPackage, utils.getPackageName(usingPackage)));
Table table = new Table(configuration.htmlVersion, HtmlStyle.useSummary)
.setSummary(tableSummary)
.setCaption(caption)
.setHeader(classTableHeader)
.setColumnStyles(HtmlStyle.colFirst, HtmlStyle.colLast);
for (TypeElement te : usingPackageToUsedClasses.get(packageName)) {
HtmlTree tr = new HtmlTree(HtmlTag.TR);
tr.addStyle(altColor ? HtmlStyle.altColor : HtmlStyle.rowColor);
altColor = !altColor;
addClassRow(te, usingPackage, tr);
tbody.addContent(tr);
DocPath dp = pathString(te,
DocPaths.CLASS_USE.resolve(DocPath.forName(utils, te)));
Content stringContent = new StringContent(utils.getSimpleName(te));
Content typeContent = getHyperLink(dp.fragment(getPackageAnchorName(usingPackage)),
stringContent);
Content summary = new ContentBuilder();
addIndexComment(te, summary);
table.addRow(typeContent, summary);
}
table.addContent(tbody);
li.addContent(table);
li.addContent(table.toContent());
contentTree.addContent(li);
}
}
/**
* Add a row for the class that uses the given package.
*
* @param usedClass the class that uses the given package
* @param pkg the package to which the class belongs
* @param contentTree the content tree to which the row will be added
*/
protected void addClassRow(TypeElement usedClass, PackageElement pkg,
Content contentTree) {
DocPath dp = pathString(usedClass,
DocPaths.CLASS_USE.resolve(DocPath.forName(utils, usedClass)));
StringContent stringContent = new StringContent(utils.getSimpleName(usedClass));
Content thType = HtmlTree.TH_ROW_SCOPE(HtmlStyle.colFirst,
getHyperLink(dp.fragment(getPackageAnchorName(pkg)), stringContent));
contentTree.addContent(thType);
HtmlTree tdDesc = new HtmlTree(HtmlTag.TD);
tdDesc.addStyle(HtmlStyle.colLast);
addIndexComment(usedClass, tdDesc);
contentTree.addContent(tdDesc);
}
/**
* Add the package use information.
*
* @param pkg the package that used the given package
* @param contentTree the content tree to which the information will be added
*/
protected void addPackageUse(PackageElement pkg, Content contentTree) {
Content thFirst = HtmlTree.TH_ROW_SCOPE(HtmlStyle.colFirst,
getHyperLink(utils.getPackageName(pkg),
new StringContent(utils.getPackageName(pkg))));
contentTree.addContent(thFirst);
HtmlTree tdLast = new HtmlTree(HtmlTag.TD);
tdLast.addStyle(HtmlStyle.colLast);
if (pkg != null && !pkg.isUnnamed()) {
addSummaryComment(pkg, tdLast);
} else {
tdLast.addContent(Contents.SPACE);
}
contentTree.addContent(tdLast);
}
/**
* Get the header for the package use listing.
*
* @return a content tree representing the package use header
*/
protected HtmlTree getPackageUseHeader() {
String packageText = configuration.getText("doclet.Package");
private HtmlTree getPackageUseHeader() {
String packageText = resources.getText("doclet.Package");
String name = packageElement.isUnnamed() ? "" : utils.getPackageName(packageElement);
String title = configuration.getText("doclet.Window_ClassUse_Header", packageText, name);
String title = resources.getText("doclet.Window_ClassUse_Header", packageText, name);
HtmlTree bodyTree = getBody(true, getWindowTitle(title));
HtmlTree htmlTree = (configuration.allowTag(HtmlTag.HEADER))
? HtmlTree.HEADER()

@ -25,6 +25,9 @@
package jdk.javadoc.internal.doclets.formats.html;
import jdk.javadoc.internal.doclets.formats.html.markup.Table;
import jdk.javadoc.internal.doclets.formats.html.markup.TableHeader;
import java.util.*;
import javax.lang.model.element.ModuleElement;
@ -32,11 +35,11 @@ import javax.lang.model.element.PackageElement;
import javax.lang.model.element.TypeElement;
import com.sun.source.doctree.DocTree;
import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlConstants;
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.PackageSummaryWriter;
@ -124,7 +127,7 @@ public class PackageWriterImpl extends HtmlDocletWriter
bodyTree.addContent(htmlTree);
}
HtmlTree div = new HtmlTree(HtmlTag.DIV);
div.addStyle(HtmlStyle.header);
div.setStyle(HtmlStyle.header);
if (configuration.showModules) {
ModuleElement mdle = configuration.docEnv.getElementUtils().getModuleOf(packageElement);
Content classModuleLabel = HtmlTree.SPAN(HtmlStyle.moduleLabelInPackage, contents.moduleLabel);
@ -157,7 +160,7 @@ public class PackageWriterImpl extends HtmlDocletWriter
@Override
public Content getContentHeader() {
HtmlTree div = new HtmlTree(HtmlTag.DIV);
div.addStyle(HtmlStyle.contentContainer);
div.setStyle(HtmlStyle.contentContainer);
return div;
}
@ -171,7 +174,7 @@ public class PackageWriterImpl extends HtmlDocletWriter
if (utils.isDeprecated(packageElement)) {
CommentHelper ch = utils.getCommentHelper(packageElement);
HtmlTree deprDiv = new HtmlTree(HtmlTag.DIV);
deprDiv.addStyle(HtmlStyle.deprecationBlock);
deprDiv.setStyle(HtmlStyle.deprecationBlock);
Content deprPhrase = HtmlTree.SPAN(HtmlStyle.deprecatedLabel, getDeprecatedPhrase(packageElement));
deprDiv.addContent(deprPhrase);
if (!deprs.isEmpty()) {
@ -190,7 +193,7 @@ public class PackageWriterImpl extends HtmlDocletWriter
@Override
public Content getSummaryHeader() {
HtmlTree ul = new HtmlTree(HtmlTag.UL);
ul.addStyle(HtmlStyle.blockList);
ul.setStyle(HtmlStyle.blockList);
return ul;
}
@ -278,47 +281,34 @@ public class PackageWriterImpl extends HtmlDocletWriter
addClassesSummary(annoTypes, label, tableSummary, tableHeader, summaryContentTree);
}
/**
* {@inheritDoc}
*/
public void addClassesSummary(SortedSet<TypeElement> classes, String label,
String tableSummary, TableHeader tableHeader, Content summaryContentTree) {
if(!classes.isEmpty()) {
Content caption = getTableCaption(new RawHtml(label));
Content table = (configuration.isOutputHtml5())
? HtmlTree.TABLE(HtmlStyle.typeSummary, caption)
: HtmlTree.TABLE(HtmlStyle.typeSummary, tableSummary, caption);
table.addContent(tableHeader.toContent());
Content tbody = new HtmlTree(HtmlTag.TBODY);
boolean altColor = false;
Table table = new Table(configuration.htmlVersion, HtmlStyle.typeSummary)
.setSummary(tableSummary)
.setCaption(getTableCaption(new StringContent(label)))
.setHeader(tableHeader)
.setColumnStyles(HtmlStyle.colFirst, HtmlStyle.colLast);
for (TypeElement klass : classes) {
if (!utils.isCoreClass(klass) ||
!configuration.isGeneratedDoc(klass)) {
if (!utils.isCoreClass(klass) || !configuration.isGeneratedDoc(klass)) {
continue;
}
altColor = !altColor;
Content classContent = getLink(new LinkInfoImpl(
Content classLink = getLink(new LinkInfoImpl(
configuration, LinkInfoImpl.Kind.PACKAGE, klass));
Content thClass = HtmlTree.TH_ROW_SCOPE(HtmlStyle.colFirst, classContent);
HtmlTree tr = HtmlTree.TR(thClass);
tr.addStyle(altColor ? HtmlStyle.altColor : HtmlStyle.rowColor);
HtmlTree tdClassDescription = new HtmlTree(HtmlTag.TD);
tdClassDescription.addStyle(HtmlStyle.colLast);
ContentBuilder description = new ContentBuilder();
if (utils.isDeprecated(klass)) {
tdClassDescription.addContent(getDeprecatedPhrase(klass));
description.addContent(getDeprecatedPhrase(klass));
List<? extends DocTree> tags = utils.getDeprecatedTrees(klass);
if (!tags.isEmpty()) {
addSummaryDeprecatedComment(klass, tags.get(0), tdClassDescription);
addSummaryDeprecatedComment(klass, tags.get(0), description);
}
} else {
addSummaryComment(klass, tdClassDescription);
addSummaryComment(klass, description);
}
tr.addContent(tdClassDescription);
tbody.addContent(tr);
table.addRow(classLink, description);
}
table.addContent(tbody);
Content li = HtmlTree.LI(HtmlStyle.blockList, table);
Content li = HtmlTree.LI(HtmlStyle.blockList, table.toContent());
summaryContentTree.addContent(li);
}
}
@ -411,8 +401,8 @@ public class PackageWriterImpl extends HtmlDocletWriter
if (prev == null) {
li = HtmlTree.LI(contents.prevPackageLabel);
} else {
DocPath path = DocPath.relativePath(packageElement, prev);
li = HtmlTree.LI(getHyperLink(path.resolve(DocPaths.PACKAGE_SUMMARY),
DocPath p = DocPath.relativePath(packageElement, prev);
li = HtmlTree.LI(getHyperLink(p.resolve(DocPaths.PACKAGE_SUMMARY),
contents.prevPackageLabel, "", ""));
}
return li;
@ -429,8 +419,8 @@ public class PackageWriterImpl extends HtmlDocletWriter
if (next == null) {
li = HtmlTree.LI(contents.nextPackageLabel);
} else {
DocPath path = DocPath.relativePath(packageElement, next);
li = HtmlTree.LI(getHyperLink(path.resolve(DocPaths.PACKAGE_SUMMARY),
DocPath p = DocPath.relativePath(packageElement, next);
li = HtmlTree.LI(getHyperLink(p.resolve(DocPaths.PACKAGE_SUMMARY),
contents.nextPackageLabel, "", ""));
}
return li;

@ -26,11 +26,13 @@
package jdk.javadoc.internal.doclets.formats.html;
import jdk.javadoc.internal.doclets.formats.html.markup.Table;
import jdk.javadoc.internal.doclets.formats.html.markup.TableHeader;
import javax.lang.model.element.Element;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.TypeElement;
import jdk.javadoc.internal.doclets.formats.html.TableHeader;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlConstants;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTag;
@ -72,11 +74,6 @@ public class PropertyWriterImpl extends AbstractMemberWriter
return memberTree;
}
@Override
public boolean showTabs() {
return false;
}
/**
* {@inheritDoc}
*/
@ -214,24 +211,6 @@ public class PropertyWriterImpl extends AbstractMemberWriter
memberTree.addContent(label);
}
/**
* {@inheritDoc}
*/
@Override
public String getTableSummary() {
return resources.getText("doclet.Member_Table_Summary",
resources.getText("doclet.Property_Summary"),
resources.getText("doclet.properties"));
}
/**
* {@inheritDoc}
*/
@Override
public Content getCaption() {
return contents.properties;
}
/**
* {@inheritDoc}
*/
@ -241,6 +220,24 @@ public class PropertyWriterImpl extends AbstractMemberWriter
contents.descriptionLabel);
}
/**
* {@inheritDoc}
*/
@Override
protected Table createSummaryTable() {
String summary = resources.getText("doclet.Member_Table_Summary",
resources.getText("doclet.Property_Summary"),
resources.getText("doclet.properties"));
return new Table(configuration.htmlVersion, HtmlStyle.memberSummary)
.setSummary(summary)
.setCaption(contents.properties)
.setHeader(getSummaryTableHeader(typeElement))
.setColumnStyles(HtmlStyle.colFirst, HtmlStyle.colSecond, HtmlStyle.colLast)
.setRowScopeColumn(1)
.setUseTBody(false);
}
/**
* {@inheritDoc}
*/
@ -270,12 +267,12 @@ public class PropertyWriterImpl extends AbstractMemberWriter
Content label;
if (configuration.summarizeOverriddenMethods) {
label = new StringContent(utils.isClass(typeElement)
? configuration.getText("doclet.Properties_Declared_In_Class")
: configuration.getText("doclet.Properties_Declared_In_Interface"));
? resources.getText("doclet.Properties_Declared_In_Class")
: resources.getText("doclet.Properties_Declared_In_Interface"));
} else {
label = new StringContent(utils.isClass(typeElement)
? configuration.getText("doclet.Properties_Inherited_From_Class")
: configuration.getText("doclet.Properties_Inherited_From_Interface"));
? resources.getText("doclet.Properties_Inherited_From_Class")
: resources.getText("doclet.Properties_Inherited_From_Interface"));
}
Content labelHeading = HtmlTree.HEADING(HtmlConstants.INHERITED_SUMMARY_HEADING,
label);

@ -102,7 +102,7 @@ public class SerializedFormWriterImpl extends SubWriterHolderWriter
*/
public Content getSerializedSummariesHeader() {
HtmlTree ul = new HtmlTree(HtmlTag.UL);
ul.addStyle(HtmlStyle.blockList);
ul.setStyle(HtmlStyle.blockList);
return ul;
}
@ -117,7 +117,7 @@ public class SerializedFormWriterImpl extends SubWriterHolderWriter
htmlTree = HtmlTree.SECTION();
} else {
htmlTree = new HtmlTree(HtmlTag.LI);
htmlTree.addStyle(HtmlStyle.blockList);
htmlTree.setStyle(HtmlStyle.blockList);
}
return htmlTree;
}
@ -143,7 +143,7 @@ public class SerializedFormWriterImpl extends SubWriterHolderWriter
*/
public Content getClassSerializedHeader() {
HtmlTree ul = new HtmlTree(HtmlTag.UL);
ul.addStyle(HtmlStyle.blockList);
ul.setStyle(HtmlStyle.blockList);
return ul;
}
@ -194,7 +194,7 @@ public class SerializedFormWriterImpl extends SubWriterHolderWriter
*/
public Content getSerialUIDInfoHeader() {
HtmlTree dl = new HtmlTree(HtmlTag.DL);
dl.addStyle(HtmlStyle.nameValue);
dl.setStyle(HtmlStyle.nameValue);
return dl;
}
@ -221,7 +221,7 @@ public class SerializedFormWriterImpl extends SubWriterHolderWriter
*/
public Content getClassContentHeader() {
HtmlTree ul = new HtmlTree(HtmlTag.UL);
ul.addStyle(HtmlStyle.blockList);
ul.setStyle(HtmlStyle.blockList);
return ul;
}

@ -102,7 +102,7 @@ public class SingleIndexWriter extends AbstractIndexWriter {
body.addContent(htmlTree);
}
HtmlTree divTree = new HtmlTree(HtmlTag.DIV);
divTree.addStyle(HtmlStyle.contentContainer);
divTree.setStyle(HtmlStyle.contentContainer);
elements = new TreeSet<>(indexbuilder.getIndexMap().keySet());
elements.addAll(configuration.tagSearchIndexKeys);
addLinksForIndexes(divTree);

@ -275,7 +275,7 @@ public class SourceToHTMLConverter {
*/
private static void addLineNo(Content pre, int lineno) {
HtmlTree span = new HtmlTree(HtmlTag.SPAN);
span.addStyle(HtmlStyle.sourceLineNo);
span.setStyle(HtmlStyle.sourceLineNo);
if (lineno < 10) {
span.addContent("00" + Integer.toString(lineno));
} else if (lineno < 100) {

@ -145,7 +145,7 @@ public class SplitIndexWriter extends AbstractIndexWriter {
body.addContent(htmlTree);
}
HtmlTree divTree = new HtmlTree(HtmlTag.DIV);
divTree.addStyle(HtmlStyle.contentContainer);
divTree.setStyle(HtmlStyle.contentContainer);
addLinksForIndexes(divTree);
if (configuration.tagSearchIndexMap.get(unicode) == null) {
addContents(unicode, indexbuilder.getMemberList(unicode), divTree);

@ -36,7 +36,6 @@ import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTag;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.toolkit.Content;
import jdk.javadoc.internal.doclets.toolkit.util.DocPath;
import jdk.javadoc.internal.doclets.toolkit.util.MethodTypes;
/**
* This abstract class exists to provide functionality needed in the
@ -73,7 +72,7 @@ public abstract class SubWriterHolderWriter extends HtmlDocletWriter {
* Add the summary header.
*
* @param mw the writer for the member being documented
* @param typeElement the te to be documented
* @param typeElement the type element to be documented
* @param memberTree the content tree to which the summary header will be added
*/
public void addSummaryHeader(AbstractMemberWriter mw, TypeElement typeElement,
@ -82,74 +81,6 @@ public abstract class SubWriterHolderWriter extends HtmlDocletWriter {
mw.addSummaryLabel(memberTree);
}
/**
* Get the summary table.
*
* @param mw the writer for the member being documented
* @param typeElement the te to be documented
* @param tableContents list of summary table contents
* @param showTabs true if the table needs to show tabs
* @return the content tree for the summary table
*/
public Content getSummaryTableTree(AbstractMemberWriter mw, TypeElement typeElement,
List<Content> tableContents, boolean showTabs) {
Content caption;
if (showTabs) {
caption = getTableCaption(mw.methodTypes);
generateTableTabTypesScript(mw.typeMap, mw.methodTypes, "methods");
}
else {
caption = getTableCaption(mw.getCaption());
}
Content table = (configuration.isOutputHtml5())
? HtmlTree.TABLE(HtmlStyle.memberSummary, caption)
: HtmlTree.TABLE(HtmlStyle.memberSummary, mw.getTableSummary(), caption);
table.addContent(mw.getSummaryTableHeader(typeElement).toContent());
for (Content tableContent : tableContents) {
table.addContent(tableContent);
}
return table;
}
/**
* Get the summary table caption.
*
* @param methodTypes set comprising of method types to show as table caption
* @return the caption for the summary table
*/
public Content getTableCaption(Set<MethodTypes> methodTypes) {
Content tabbedCaption = new HtmlTree(HtmlTag.CAPTION);
for (MethodTypes type : methodTypes) {
Content captionSpan;
Content span;
if (type.tableTabs().isDefaultTab()) {
captionSpan = HtmlTree.SPAN(configuration.getContent(type.tableTabs().resourceKey()));
span = HtmlTree.SPAN(type.tableTabs().tabId(),
HtmlStyle.activeTableTab, captionSpan);
} else {
captionSpan = HtmlTree.SPAN(getMethodTypeLinks(type));
span = HtmlTree.SPAN(type.tableTabs().tabId(),
HtmlStyle.tableTab, captionSpan);
}
Content tabSpan = HtmlTree.SPAN(HtmlStyle.tabEnd, Contents.SPACE);
span.addContent(tabSpan);
tabbedCaption.addContent(span);
}
return tabbedCaption;
}
/**
* Get the method type links for the table caption.
*
* @param methodType the method type to be displayed as link
* @return the content tree for the method type link
*/
public Content getMethodTypeLinks(MethodTypes methodType) {
String jsShow = "javascript:show(" + methodType.tableTabs().value() +");";
HtmlTree link = HtmlTree.A(jsShow, configuration.getContent(methodType.tableTabs().resourceKey()));
return link;
}
/**
* Add the inherited summary header.
*
@ -204,17 +135,6 @@ public abstract class SubWriterHolderWriter extends HtmlDocletWriter {
addSummaryComment(member, firstSentenceTags, tdSummary);
}
/**
* Add the summary type for the member.
*
* @param mw the writer for the member being documented
* @param member the member to be documented
* @param tdSummaryType the content tree to which the type will be added
*/
public void addSummaryType(AbstractMemberWriter mw, Element member, Content tdSummaryType) {
mw.addSummaryType(member, tdSummaryType);
}
/**
* Add the summary link for the member.
*
@ -264,7 +184,7 @@ public abstract class SubWriterHolderWriter extends HtmlDocletWriter {
*/
public Content getContentHeader() {
HtmlTree div = new HtmlTree(HtmlTag.DIV);
div.addStyle(HtmlStyle.contentContainer);
div.setStyle(HtmlStyle.contentContainer);
return div;
}
@ -300,7 +220,7 @@ public abstract class SubWriterHolderWriter extends HtmlDocletWriter {
*/
public Content getMemberTreeHeader() {
HtmlTree li = new HtmlTree(HtmlTag.LI);
li.addStyle(HtmlStyle.blockList);
li.setStyle(HtmlStyle.blockList);
return li;
}

@ -112,7 +112,7 @@ public class TreeWriter extends AbstractTreeWriter {
: body;
htmlTree.addContent(div);
HtmlTree divTree = new HtmlTree(HtmlTag.DIV);
divTree.addStyle(HtmlStyle.contentContainer);
divTree.setStyle(HtmlStyle.contentContainer);
addTree(classtree.baseClasses(), "doclet.Class_Hierarchy", divTree);
addTree(classtree.baseInterfaces(), "doclet.Interface_Hierarchy", divTree);
addTree(classtree.baseAnnotationTypes(), "doclet.Annotation_Type_Hierarchy", divTree);
@ -149,7 +149,7 @@ public class TreeWriter extends AbstractTreeWriter {
contents.packageHierarchies);
contentTree.addContent(span);
HtmlTree ul = new HtmlTree(HtmlTag.UL);
ul.addStyle(HtmlStyle.horizontal);
ul.setStyle(HtmlStyle.horizontal);
int i = 0;
for (PackageElement pkg : packages) {
// If the package name length is 0 or if -nodeprecated option

@ -52,7 +52,7 @@ import jdk.javadoc.internal.doclets.toolkit.util.DocletConstants;
*/
public class HtmlTree extends Content {
private HtmlTag htmlTag;
public final HtmlTag htmlTag;
private Map<HtmlAttr,String> attrs = Collections.emptyMap();
private List<Content> content = Collections.emptyList();
public static final Content EMPTY = new StringContent("");
@ -78,33 +78,64 @@ public class HtmlTree extends Content {
addContent(content);
}
/**
* Constructor to construct HtmlTree object.
*
* @param tag HTML tag for the HtmlTree object
* @param contents contents to be added to the tree
*/
public HtmlTree(HtmlTag tag, List<Content> contents) {
this(tag);
for (Content content: contents)
addContent(content);
}
/**
* Adds an attribute for the HTML tag.
*
* @param attrName name of the attribute
* @param attrValue value of the attribute
* @return this object
*/
public void addAttr(HtmlAttr attrName, String attrValue) {
public HtmlTree addAttr(HtmlAttr attrName, String attrValue) {
if (attrs.isEmpty())
attrs = new LinkedHashMap<>(3);
attrs.put(nullCheck(attrName), escapeHtmlChars(attrValue));
}
public void setTitle(Content body) {
addAttr(HtmlAttr.TITLE, stripHtml(body));
}
public void setRole(Role role) {
addAttr(HtmlAttr.ROLE, role.toString());
return this;
}
/**
* Adds a style for the HTML tag.
* Sets the "title" attribute for this tag.
* Any HTML tags in the content will be removed.
*
* @param body the content for the title attribute
* @return this object
*/
public HtmlTree setTitle(Content body) {
addAttr(HtmlAttr.TITLE, stripHtml(body));
return this;
}
/**
* Sets the "role" attribute for this tag.
*
* @param role the role
* @return this object
*/
public HtmlTree setRole(Role role) {
addAttr(HtmlAttr.ROLE, role.toString());
return this;
}
/**
* Sets the style for the HTML tag.
*
* @param style style to be added
* @return this object
*/
public void addStyle(HtmlStyle style) {
public HtmlTree setStyle(HtmlStyle style) {
addAttr(HtmlAttr.CLASS, style.toString());
return this;
}
/**
@ -112,6 +143,7 @@ public class HtmlTree extends Content {
*
* @param tagContent tag content to be added
*/
@Override
public void addContent(Content tagContent) {
if (tagContent instanceof ContentBuilder) {
for (Content content: ((ContentBuilder)tagContent).contents) {
@ -302,7 +334,7 @@ public class HtmlTree extends Content {
public static HtmlTree A_ID(HtmlStyle styleClass, String id, Content body) {
HtmlTree htmltree = A_ID(id, body);
if (styleClass != null)
htmltree.addStyle(styleClass);
htmltree.setStyle(styleClass);
return htmltree;
}
@ -361,7 +393,7 @@ public class HtmlTree extends Content {
public static HtmlTree DIV(HtmlStyle styleClass, Content body) {
HtmlTree htmltree = new HtmlTree(HtmlTag.DIV, nullCheck(body));
if (styleClass != null)
htmltree.addStyle(styleClass);
htmltree.setStyle(styleClass);
return htmltree;
}
@ -424,7 +456,7 @@ public class HtmlTree extends Content {
if (printTitle)
htmltree.setTitle(body);
if (styleClass != null)
htmltree.addStyle(styleClass);
htmltree.setStyle(styleClass);
return htmltree;
}
@ -546,7 +578,7 @@ public class HtmlTree extends Content {
public static HtmlTree LI(HtmlStyle styleClass, Content body) {
HtmlTree htmltree = new HtmlTree(HtmlTag.LI, nullCheck(body));
if (styleClass != null)
htmltree.addStyle(styleClass);
htmltree.setStyle(styleClass);
return htmltree;
}
@ -601,7 +633,7 @@ public class HtmlTree extends Content {
public static HtmlTree MAIN(HtmlStyle styleClass, Content body) {
HtmlTree htmltree = HtmlTree.MAIN(body);
if (styleClass != null) {
htmltree.addStyle(styleClass);
htmltree.setStyle(styleClass);
}
return htmltree;
}
@ -678,7 +710,7 @@ public class HtmlTree extends Content {
public static HtmlTree P(HtmlStyle styleClass, Content body) {
HtmlTree htmltree = new HtmlTree(HtmlTag.P, nullCheck(body));
if (styleClass != null)
htmltree.addStyle(styleClass);
htmltree.setStyle(styleClass);
return htmltree;
}
@ -760,7 +792,7 @@ public class HtmlTree extends Content {
public static HtmlTree SPAN(HtmlStyle styleClass, Content body) {
HtmlTree htmltree = new HtmlTree(HtmlTag.SPAN, nullCheck(body));
if (styleClass != null)
htmltree.addStyle(styleClass);
htmltree.setStyle(styleClass);
return htmltree;
}
@ -777,7 +809,7 @@ public class HtmlTree extends Content {
HtmlTree htmltree = new HtmlTree(HtmlTag.SPAN, nullCheck(body));
htmltree.addAttr(HtmlAttr.ID, nullCheck(id));
if (styleClass != null)
htmltree.addStyle(styleClass);
htmltree.setStyle(styleClass);
return htmltree;
}
@ -792,7 +824,7 @@ public class HtmlTree extends Content {
public static HtmlTree TABLE(HtmlStyle styleClass, String summary, Content body) {
HtmlTree htmltree = new HtmlTree(HtmlTag.TABLE, nullCheck(body));
if (styleClass != null)
htmltree.addStyle(styleClass);
htmltree.setStyle(styleClass);
htmltree.addAttr(HtmlAttr.SUMMARY, nullCheck(summary));
return htmltree;
}
@ -807,7 +839,7 @@ public class HtmlTree extends Content {
public static HtmlTree TABLE(HtmlStyle styleClass, Content body) {
HtmlTree htmltree = new HtmlTree(HtmlTag.TABLE, nullCheck(body));
if (styleClass != null) {
htmltree.addStyle(styleClass);
htmltree.setStyle(styleClass);
}
return htmltree;
}
@ -822,7 +854,7 @@ public class HtmlTree extends Content {
public static HtmlTree TD(HtmlStyle styleClass, Content body) {
HtmlTree htmltree = new HtmlTree(HtmlTag.TD, nullCheck(body));
if (styleClass != null)
htmltree.addStyle(styleClass);
htmltree.setStyle(styleClass);
return htmltree;
}
@ -847,7 +879,7 @@ public class HtmlTree extends Content {
public static HtmlTree TH(HtmlStyle styleClass, String scope, Content body) {
HtmlTree htmltree = new HtmlTree(HtmlTag.TH, nullCheck(body));
if (styleClass != null)
htmltree.addStyle(styleClass);
htmltree.setStyle(styleClass);
htmltree.addAttr(HtmlAttr.SCOPE, nullCheck(scope));
return htmltree;
}
@ -910,7 +942,7 @@ public class HtmlTree extends Content {
for (Content c : more) {
htmlTree.addContent(nullCheck(c));
}
htmlTree.addStyle(nullCheck(styleClass));
htmlTree.setStyle(nullCheck(styleClass));
return htmlTree;
}

@ -26,7 +26,6 @@
package jdk.javadoc.internal.doclets.formats.html.markup;
import java.io.*;
import java.util.*;
import jdk.javadoc.internal.doclets.formats.html.HtmlConfiguration;
import jdk.javadoc.internal.doclets.toolkit.Content;
@ -35,8 +34,6 @@ import jdk.javadoc.internal.doclets.toolkit.util.DocFile;
import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException;
import jdk.javadoc.internal.doclets.toolkit.util.DocPath;
import jdk.javadoc.internal.doclets.toolkit.util.DocletConstants;
import jdk.javadoc.internal.doclets.toolkit.util.TableTabTypes;
import jdk.javadoc.internal.doclets.toolkit.util.TableTabTypes.TableTabs;
/**
@ -251,110 +248,6 @@ public class HtmlWriter {
return body;
}
/**
* Generated javascript variables for the document.
*
* @param typeMap map comprising of method and type relationship
* @param tabTypes set comprising of all table tab types for this class
* @param elementName packages or methods table for which tabs need to be displayed
*/
public void generateTableTabTypesScript(Map<String,Integer> typeMap,
Set<? extends TableTabTypes> tabTypes, String elementName) {
String sep = "";
StringBuilder vars = new StringBuilder("var ");
vars.append(elementName)
.append(" = {");
for (Map.Entry<String,Integer> entry : typeMap.entrySet()) {
vars.append(sep);
sep = ",";
vars.append("\"")
.append(entry.getKey())
.append("\":")
.append(entry.getValue());
}
vars.append("};").append(DocletConstants.NL);
sep = "";
vars.append("var tabs = {");
for (TableTabTypes entry : tabTypes) {
vars.append(sep);
sep = ",";
vars.append(entry.tableTabs().value())
.append(":")
.append("[")
.append("\"")
.append(entry.tableTabs().tabId())
.append("\"")
.append(sep)
.append("\"")
.append(configuration.getText(entry.tableTabs().resourceKey()))
.append("\"]");
}
vars.append("};")
.append(DocletConstants.NL);
addStyles(HtmlStyle.altColor, vars);
addStyles(HtmlStyle.rowColor, vars);
addStyles(HtmlStyle.tableTab, vars);
addStyles(HtmlStyle.activeTableTab, vars);
script.addContent(new RawHtml(vars));
}
/**
* Generated javascript variables for the document.
*
* @param groupTypeMap map comprising of group relationship
* @param groupTypes map comprising of all table tab types
*/
public void generateGroupTypesScript(Map<String,Integer> groupTypeMap,
Map<String,TableTabs> groupTypes) {
String sep = "";
StringBuilder vars = new StringBuilder("var groups");
vars.append(" = {");
for (Map.Entry<String,Integer> entry : groupTypeMap.entrySet()) {
vars.append(sep);
sep = ",";
vars.append("\"")
.append(entry.getKey())
.append("\":")
.append(entry.getValue());
}
vars.append("};").append(DocletConstants.NL);
sep = "";
vars.append("var tabs = {");
for (String group : groupTypes.keySet()) {
TableTabs tab = groupTypes.get(group);
vars.append(sep);
sep = ",";
vars.append(tab.value())
.append(":")
.append("[")
.append("\"")
.append(tab.tabId())
.append("\"")
.append(sep)
.append("\"")
.append(new StringContent(tab.resourceKey()))
.append("\"]");
}
vars.append("};")
.append(DocletConstants.NL);
addStyles(HtmlStyle.altColor, vars);
addStyles(HtmlStyle.rowColor, vars);
addStyles(HtmlStyle.tableTab, vars);
addStyles(HtmlStyle.activeTableTab, vars);
script.addContent(new RawHtml(vars));
}
/**
* Adds javascript style variables to the document.
*
* @param style style to be added as a javascript variable
* @param vars variable string to which the style variable will be added
*/
public void addStyles(HtmlStyle style, StringBuilder vars) {
vars.append("var ").append(style).append(" = \"").append(style)
.append("\";").append(DocletConstants.NL);
}
/**
* Returns an HtmlTree for the TITLE tag.
*

@ -0,0 +1,589 @@
/*
* Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package jdk.javadoc.internal.doclets.formats.html.markup;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import java.util.function.IntFunction;
import java.util.function.Predicate;
import javax.lang.model.element.Element;
import jdk.javadoc.internal.doclets.formats.html.Contents;
import jdk.javadoc.internal.doclets.toolkit.Content;
import jdk.javadoc.internal.doclets.toolkit.util.DocletConstants;
/**
* A builder for HTML tables, such as the summary tables for various
* types of element.
*
* <p>The table should be used in three phases:
* <ol>
* <li>Configuration: the overall characteristics of the table should be specified
* <li>Population: the content for the cells in each row should be added
* <li>Generation: the HTML content and any associated JavaScript can be accessed
* </ol>
*
* Many methods return the current object, to facilitate fluent builder-style usage.
*
* <p><b>This is NOT part of any supported API.
* If you write code that depends on this, you do so at your own risk.
* This code and its internal interfaces are subject to change or
* deletion without notice.</b>
*/
public class Table {
private final HtmlVersion version;
private final HtmlStyle tableStyle;
private String summary;
private Content caption;
private Map<String, Predicate<Element>> tabMap;
private String defaultTab;
private Set<String> tabs;
private HtmlStyle activeTabStyle = HtmlStyle.activeTableTab;
private HtmlStyle tabStyle = HtmlStyle.tableTab;
private HtmlStyle tabEnd = HtmlStyle.tabEnd;
private IntFunction<String> tabScript;
private String tabScriptVariable;
private Function<Integer, String> tabId = (i -> "t" + i);
private TableHeader header;
private List<HtmlStyle> columnStyles;
private int rowScopeColumnIndex;
private List<HtmlStyle> stripedStyles = Arrays.asList(HtmlStyle.altColor, HtmlStyle.rowColor);
private final List<Content> bodyRows;
private final List<Integer> bodyRowMasks;
private String rowIdPrefix = "i";
// compatibility flags
private boolean putIdFirst = false;
private boolean useTBody = true;
/**
* Creates a builder for an HTML table.
*
* @param version the version of HTML, used to determine is a {@code summary}
* attribute is needed
* @param style the style class for the {@code <table>} tag
*/
public Table(HtmlVersion version, HtmlStyle style) {
this.version = version;
this.tableStyle = style;
bodyRows = new ArrayList<>();
bodyRowMasks = new ArrayList<>();
}
/**
* Sets the summary for the table.
* This is ignored if the HTML version for the table is not {@link HtmlVersion#HTML4}.
*
* @param summary the summary
* @return this object
*/
public Table setSummary(String summary) {
if (version == HtmlVersion.HTML4) {
this.summary = summary;
}
return this;
}
/**
* Sets the caption for the table.
* This is ignored if the table is configured to provide tabs to select
* different subsets of rows within the table.
* The caption should be suitable for use as the content of a {@code <caption>}
* element.
*
* <b>For compatibility, the code currently accepts a {@code <caption>} element
* as well. This should be removed when all clients rely on using the {@code <caption>}
* element being generated by this class.</b>
*
* @param captionContent the caption
* @return this object
*/
public Table setCaption(Content captionContent) {
if (captionContent instanceof HtmlTree
&& ((HtmlTree) captionContent).htmlTag == HtmlTag.CAPTION) {
caption = captionContent;
} else {
caption = getCaption(captionContent);
}
return this;
}
/**
* Adds a tab to the table.
* Tabs provide a way to display subsets of rows, as determined by a
* predicate for the tab, and an element associated with each row.
* Tabs will appear left-to-right in the order they are added.
*
* @param name the name of the tab
* @param predicate the predicate
* @return this object
*/
public Table addTab(String name, Predicate<Element> predicate) {
if (tabMap == null) {
tabMap = new LinkedHashMap<>(); // preserves order that tabs are added
tabs = new HashSet<>(); // order not significant
}
tabMap.put(name, predicate);
return this;
}
/**
* Sets the name for the default tab, which displays all the rows in the table.
* This tab will appear first in the left-to-right list of displayed tabs.
*
* @param name the name
* @return this object
*/
public Table setDefaultTab(String name) {
defaultTab = name;
return this;
}
/**
* Sets the function used to generate the JavaScript to be used when a tab is selected.
* When the function is invoked, the argument will be an integer value containing
* the bit mask identifying the rows to be selected.
*
* @param f the function
* @return this object
*/
public Table setTabScript(IntFunction<String> f) {
tabScript = f;
return this;
}
/**
* Sets the name of the JavaScript variable used to contain the data for each tab.
*
* @param name the name
* @return this object
*/
public Table setTabScriptVariable(String name) {
tabScriptVariable = name;
return this;
}
/**
* Sets the name of the styles used to display the tabs.
*
* @param activeTabStyle the style for the active tab
* @param tabStyle the style for other tabs
* @param tabEnd the style for the padding that appears within each tab
* @return this object
*/
public Table setTabStyles(HtmlStyle activeTabStyle, HtmlStyle tabStyle, HtmlStyle tabEnd) {
this.activeTabStyle = activeTabStyle;
this.tabStyle = tabStyle;
this.tabEnd = tabEnd;
return this;
}
/**
* Sets the JavaScript function used to generate the {@code id} attribute for each tag.
* The default is to use <code>t</code><i>N</i> where <i>N</i> is the index of the tab,
* counting from 0 (for the default tab), and then from 1 upwards for additional tabs.
*
* @param f the function
* @return this object
*/
public Table setTabId(Function<Integer,String> f) {
tabId = f;
return this;
}
/**
* Sets the header for the table.
*
* <p>Notes:
* <ul>
* <liThis currently does not use a {@code <thead>} tag, but probably should, eventually
* <li>The column styles are not currently applied to the header, but probably should, eventually
* </ul>
*
* @param header the header
* @return this object
*/
public Table setHeader(TableHeader header) {
this.header = header;
return this;
}
/**
* Sets the styles used for {@code <tr>} tags, to give a "striped" appearance.
* The defaults are currently {@code rowColor} and {@code altColor}.
*
* @param evenRowStyle the style to use for even-numbered rows
* @param oddRowStyle the style to use for odd-numbered rows
* @return
*/
public Table setStripedStyles(HtmlStyle evenRowStyle, HtmlStyle oddRowStyle) {
stripedStyles = Arrays.asList(evenRowStyle, oddRowStyle);
return this;
}
/**
* Sets the column used to indicate which cell in a row should be declared
* as a header cell with the {@code scope} attribute set to {@code row}.
*
* @param columnIndex the column index
* @return this object
*/
public Table setRowScopeColumn(int columnIndex) {
rowScopeColumnIndex = columnIndex;
return this;
}
/**
* Sets the styles for be used for the cells in each row.
*
* <p>Note:
* <ul>
* <li>The column styles are not currently applied to the header, but probably should, eventually
* </ul>
*
* @param styles the styles
* @return this object
*/
public Table setColumnStyles(HtmlStyle... styles) {
return setColumnStyles(Arrays.asList(styles));
}
/**
* Sets the styles for be used for the cells in each row.
*
* <p>Note:
* <ul>
* <li>The column styles are not currently applied to the header, but probably should, eventually
* </ul>
*
* @param styles the styles
* @return this object
*/
public Table setColumnStyles(List<HtmlStyle> styles) {
columnStyles = styles;
return this;
}
/**
* Sets the prefix used for the {@code id} attribute for each row in the table.
* The default is "i".
*
* <p>Note:
* <ul>
* <li>The prefix should probably be a value such that the generated ids cannot
* clash with any other id, such as those that might be created for fields within
* a class.
* </ul>
*
* @param prefix the prefix
* @return this object
*/
public Table setRowIdPrefix(String prefix) {
rowIdPrefix = prefix;
return this;
}
/**
* Sets whether the {@code id} attribute should appear first in a {@code <tr>} tag.
* The default is {@code false}.
*
* <b>This is a compatibility feature that should be removed when all tables use a
* consistent policy.</b>
*
* @param first whether to put {@code id} attributes first
* @return this object
*/
public Table setPutIdFirst(boolean first) {
this.putIdFirst = first;
return this;
}
/**
* Sets whether or not to use an explicit {@code <tbody>} element to enclose the rows
* of a table.
* The default is {@code true}.
*
* <b>This is a compatibility feature that should be removed when all tables use a
* consistent policy.</b>
*
* @param use whether o use a {@code <tbody> element
* @return this object
*/
public Table setUseTBody(boolean use) {
this.useTBody = use;
return this;
}
/**
* Add a row of data to the table.
* Each item of content should be suitable for use as the content of a
* {@code <th>} or {@code <td>} cell.
* This method should not be used when the table has tabs: use a method
* that takes an {@code Element} parameter instead.
*
* @param contents the contents for the row
*/
public void addRow(Content... contents) {
addRow(null, Arrays.asList(contents));
}
/**
* Add a row of data to the table.
* Each item of content should be suitable for use as the content of a
* {@code <th>} or {@code <td> cell}.
* This method should not be used when the table has tabs: use a method
* that takes an {@code element} parameter instead.
*
* @param contents the contents for the row
*/
public void addRow(List<Content> contents) {
addRow(null, contents);
}
/**
* Add a row of data to the table.
* Each item of content should be suitable for use as the content of a
* {@code <th>} or {@code <td>} cell.
*
* If tabs have been added to the table, the specified element will be used
* to determine whether the row should be displayed when any particular tab
* is selected, using the predicate specified when the tab was
* {@link #add(String,Predicate) added}.
*
* @param element the element
* @param contents the contents for the row
* @throws NullPointerException if tabs have previously been added to the table
* and {@code element} is null
*/
public void addRow(Element element, Content... contents) {
addRow(element, Arrays.asList(contents));
}
/**
* Add a row of data to the table.
* Each item of content should be suitable for use as the content of a
* {@code <th>} or {@code <td>} cell.
*
* If tabs have been added to the table, the specified element will be used
* to determine whether the row should be displayed when any particular tab
* is selected, using the predicate specified when the tab was
* {@link #add(String,Predicate) added}.
*
* @param element the element
* @param contents the contents for the row
* @throws NullPointerException if tabs have previously been added to the table
* and {@code element} is null
*/
public void addRow(Element element, List<Content> contents) {
if (tabMap != null && element == null) {
throw new NullPointerException();
}
HtmlTree row = new HtmlTree(HtmlTag.TR);
if (putIdFirst && tabMap != null) {
int index = bodyRows.size();
row.addAttr(HtmlAttr.ID, (rowIdPrefix + index));
}
if (stripedStyles != null) {
int rowIndex = bodyRows.size();
row.addAttr(HtmlAttr.CLASS, stripedStyles.get(rowIndex % 2).name());
}
int colIndex = 0;
for (Content c : contents) {
HtmlStyle cellStyle = (columnStyles == null || colIndex > columnStyles.size())
? null
: columnStyles.get(colIndex);
HtmlTree cell = (colIndex == rowScopeColumnIndex)
? HtmlTree.TH(cellStyle, "row", c)
: HtmlTree.TD(cellStyle, c);
row.addContent(cell);
colIndex++;
}
bodyRows.add(row);
if (tabMap != null) {
if (!putIdFirst) {
int index = bodyRows.size() - 1;
row.addAttr(HtmlAttr.ID, (rowIdPrefix + index));
}
int mask = 0;
int maskBit = 1;
for (Map.Entry<String, Predicate<Element>> e : tabMap.entrySet()) {
String name = e.getKey();
Predicate<Element> predicate = e.getValue();
if (predicate.test(element)) {
tabs.add(name);
mask |= maskBit;
}
maskBit = (maskBit << 1);
}
bodyRowMasks.add(mask);
}
}
/**
* Returns whether or not the table is empty.
* The table is empty if it has no (body) rows.
*
* @return true if the table has no rows
*/
public boolean isEmpty() {
return bodyRows.isEmpty();
}
/**
* Returns the HTML for the table.
*
* @return the HTML
*/
public Content toContent() {
HtmlTree table = new HtmlTree(HtmlTag.TABLE);
table.setStyle(tableStyle);
if (summary != null) {
table.addAttr(HtmlAttr.SUMMARY, summary);
}
if (tabMap != null) {
if (tabs.size() == 1) {
String tabName = tabs.iterator().next();
table.addContent(getCaption(new StringContent(tabName)));
} else {
ContentBuilder cb = new ContentBuilder();
int tabIndex = 0;
HtmlTree defaultTabSpan = new HtmlTree(HtmlTag.SPAN,
HtmlTree.SPAN(new StringContent(defaultTab)),
HtmlTree.SPAN(tabEnd, Contents.SPACE))
.addAttr(HtmlAttr.ID, tabId.apply(tabIndex))
.setStyle(activeTabStyle);
cb.addContent(defaultTabSpan);
for (String tabName : tabMap.keySet()) {
tabIndex++;
if (tabs.contains(tabName)) {
String script = "javascript:" + tabScript.apply(1 << (tabIndex - 1));
HtmlTree link = HtmlTree.A(script, new StringContent(tabName));
HtmlTree tabSpan = new HtmlTree(HtmlTag.SPAN,
HtmlTree.SPAN(link), HtmlTree.SPAN(tabEnd, Contents.SPACE))
.addAttr(HtmlAttr.ID, tabId.apply(tabIndex))
.setStyle(tabStyle);
cb.addContent(tabSpan);
}
}
table.addContent(HtmlTree.CAPTION(cb));
}
} else {
table.addContent(caption);
}
table.addContent(header.toContent());
if (useTBody) {
Content tbody = new HtmlTree(HtmlTag.TBODY);
bodyRows.forEach(row -> tbody.addContent(row));
table.addContent(tbody);
} else {
bodyRows.forEach(row -> table.addContent(row));
}
return table;
}
/**
* Returns whether or not the table needs JavaScript support.
* It requires such support if tabs have been added.
*
* @return true if JavaScript is required
*/
public boolean needsScript() {
return (tabs != null) && (tabs.size() > 1);
}
/**
* Returns the script to be used in conjunction with the table.
*
* @return the script
*/
public String getScript() {
if (tabMap == null)
throw new IllegalStateException();
StringBuilder sb = new StringBuilder();
// Add the variable defining the bitmask for each row
sb.append("var ").append(tabScriptVariable).append(" = {");
int rowIndex = 0;
for (int mask : bodyRowMasks) {
if (rowIndex > 0) {
sb.append(",");
}
sb.append("\"").append(rowIdPrefix).append(rowIndex).append("\":").append(mask);
rowIndex++;
}
sb.append("};").append(DocletConstants.NL);
// Add the variable defining the tabs
sb.append("var tabs = {");
appendTabInfo(sb, 65535, tabId.apply(0), defaultTab);
int tabIndex = 1;
int maskBit = 1;
for (String tabName: tabMap.keySet()) {
if (tabs.contains(tabName)) {
sb.append(",");
appendTabInfo(sb, maskBit, tabId.apply(tabIndex), tabName);
}
tabIndex++;
maskBit = (maskBit << 1);
}
sb.append("};").append(DocletConstants.NL);
// Add the variables defining the stylenames
appendStyleInfo(sb,
stripedStyles.get(0), stripedStyles.get(1), tabStyle, activeTabStyle);
return sb.toString();
}
private void appendTabInfo(StringBuilder sb, int value, String id, String name) {
sb.append(value).append(":[\"").append(id).append("\",").append("\"").append(name).append("\"]");
}
private void appendStyleInfo(StringBuilder sb, HtmlStyle... styles) {
for (HtmlStyle style : styles) {
sb.append("var ").append(style).append(" = \"").append(style)
.append("\";").append(DocletConstants.NL);
}
}
private HtmlTree getCaption(Content title) {
return new HtmlTree(HtmlTag.CAPTION,
HtmlTree.SPAN(title),
HtmlTree.SPAN(tabEnd, Contents.SPACE));
}
}

@ -23,15 +23,13 @@
* questions.
*/
package jdk.javadoc.internal.doclets.formats.html;
package jdk.javadoc.internal.doclets.formats.html.markup;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
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.Contents;
import jdk.javadoc.internal.doclets.toolkit.Content;
/**
@ -41,6 +39,10 @@ import jdk.javadoc.internal.doclets.toolkit.Content;
* The attribute {@code scope="col"} is automatically added to each header cell.
* In addition, a series of style class names can be specified, to be applied one per cell.
*
* <p><b>This is NOT part of any supported API.
* If you write code that depends on this, you do so at your own risk.
* This code and its internal interfaces are subject to change or
* deletion without notice.</b>
*/
public class TableHeader {
@ -60,7 +62,7 @@ public class TableHeader {
* @param contents a factory to get the content for each header cell.
* @param colHeaderKeys the resource keys for the content in each cell.
*/
TableHeader(Contents contents, String... colHeaderKeys) {
public TableHeader(Contents contents, String... colHeaderKeys) {
this.cellContents = Arrays.stream(colHeaderKeys)
.map((key) -> contents.getContent(key))
.collect(Collectors.toList());
@ -70,7 +72,7 @@ public class TableHeader {
* Creates a header row, with specified content for each cell.
* @param headerCellContents a content object for each header cell
*/
TableHeader(Content... headerCellContents) {
public TableHeader(Content... headerCellContents) {
this.cellContents = Arrays.asList(headerCellContents);
}
@ -80,7 +82,7 @@ public class TableHeader {
* @param styles the style class names
* @return this object
*/
TableHeader styles(HtmlStyle... styles) {
public TableHeader styles(HtmlStyle... styles) {
if (styles.length != cellContents.size()) {
throw new IllegalStateException();
}
@ -90,9 +92,9 @@ public class TableHeader {
/**
* Converts this header to a {@link Content} object, for use in an {@link HtmlTree}.
* @returns a Content object
* @return a Content object
*/
Content toContent() {
public Content toContent() {
String scope = "col";
Content tr = new HtmlTree(HtmlTag.TR);
int i = 0;

@ -1,5 +1,5 @@
/*
* Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2007, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -24,12 +24,17 @@
*/
/**
This package contains classes that write HTML markup tags.
<p><b>This is NOT part of any supported API.
If you write code that depends on this, you do so at your own risk.
This code and its internal interfaces are subject to change or
deletion without notice.</b>
* This package contains classes that create and write HTML markup tags.
*
* The primary low level classes are {@link HtmlTree} and subtypes
* of {@code Content}. In addition, there are mid-level builders
* like {@link TableHeader} and {@link Table} to help build more
* complex HTML trees.
*
* <p><b>This is NOT part of any supported API.
* If you write code that depends on this, you do so at your own risk.
* This code and its internal interfaces are subject to change or
* deletion without notice.</b>
*/
package jdk.javadoc.internal.doclets.formats.html.markup;

@ -25,7 +25,6 @@
package jdk.javadoc.internal.doclets.toolkit;
import java.io.*;
import java.util.*;
import javax.lang.model.element.Element;
@ -62,11 +61,9 @@ public interface MemberSummaryWriter {
* Get the summary table for the given class.
*
* @param typeElement the class the summary table belongs to
* @param tableContents list of contents that will be added to the summary table
* @return a content tree for the member summary table
*/
public Content getSummaryTableTree(TypeElement typeElement,
List<Content> tableContents);
public Content getSummaryTableTree(TypeElement typeElement);
/**
* Add the member summary for the given class and member.
@ -74,12 +71,9 @@ public interface MemberSummaryWriter {
* @param typeElement the class the summary belongs to
* @param member the member that is documented
* @param firstSentenceTags the tags for the sentence being documented
* @param tableContents list of contents to which the summary will be added
* @param counter the counter for determining id and style for the table row
*/
public void addMemberSummary(TypeElement typeElement, Element member,
List<? extends DocTree> firstSentenceTags, List<Content> tableContents, int counter,
VisibleMemberMap.Kind vmmKind);
List<? extends DocTree> firstSentenceTags);
/**
* Get the inherited member summary header for the given class.

@ -333,8 +333,6 @@ public abstract class MemberSummaryBuilder extends AbstractMemberBuilder {
VisibleMemberMap visibleMemberMap, LinkedList<Content> summaryTreeList) {
SortedSet<Element> members = asSortedSet(visibleMemberMap.getLeafMembers());
if (!members.isEmpty()) {
List<Content> tableContents = new LinkedList<>();
int counter = 0;
for (Element member : members) {
final Element property = visibleMemberMap.getPropertyElement(member);
if (property != null) {
@ -355,11 +353,9 @@ public abstract class MemberSummaryBuilder extends AbstractMemberBuilder {
firstSentenceTags = utils.getFirstSentenceTrees(inheritedDoc.holder);
}
}
writer.addMemberSummary(typeElement, member, firstSentenceTags,
tableContents, counter, visibleMemberMap.kind);
counter++;
writer.addMemberSummary(typeElement, member, firstSentenceTags);
}
summaryTreeList.add(writer.getSummaryTableTree(typeElement, tableContents));
summaryTreeList.add(writer.getSummaryTableTree(typeElement));
}
}

@ -1,67 +0,0 @@
/*
* Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package jdk.javadoc.internal.doclets.toolkit.util;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import jdk.javadoc.internal.doclets.toolkit.util.TableTabTypes.TableTabs;
/**
* Enum representing group types.
*
* <p><b>This is NOT part of any supported API.
* If you write code that depends on this, you do so at your own risk.
* This code and its internal interfaces are subject to change or
* deletion without notice.</b>
*
* @author Bhavesh Patel
*/
public class GroupTypes {
private final Map<String,TableTabs> tabs = new LinkedHashMap<>();
private int value = 1;
public GroupTypes(List<String> groupList, String allLabel) {
if (groupList.size() > 1) {
tabs.put(allLabel, TableTabs.tab(65535, allLabel, "t0", true));
}
groupList.forEach((groupname) -> {
tabs.put(groupname, TableTabs.tab(value, groupname, "t" + value, false));
value = 2 * value;
});
}
public Map<String,TableTabs> getGroupTypes() {
return tabs;
}
public TableTabs getTableTab(String groupName) {
return tabs.get(groupName);
}
}

@ -1,52 +0,0 @@
/*
* Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package jdk.javadoc.internal.doclets.toolkit.util;
/**
* Enum representing method types.
*
* @author Bhavesh Patel
*/
public enum MethodTypes implements TableTabTypes {
ALL(TableTabs.tab(0xffff, "doclet.All_Methods", "t0", true)),
STATIC(TableTabs.tab(0x1, "doclet.Static_Methods", "t1", false)),
INSTANCE(TableTabs.tab(0x2, "doclet.Instance_Methods", "t2", false)),
ABSTRACT(TableTabs.tab(0x4, "doclet.Abstract_Methods", "t3", false)),
CONCRETE(TableTabs.tab(0x8, "doclet.Concrete_Methods", "t4", false)),
DEFAULT(TableTabs.tab(0x10, "doclet.Default_Methods", "t5", false)),
DEPRECATED(TableTabs.tab(0x20, "doclet.Deprecated_Methods", "t6", false));
private final TableTabs tabs;
private MethodTypes(TableTabs t) {
this.tabs = t;
}
public TableTabs tableTabs() {
return this.tabs;
}
}

@ -1,55 +0,0 @@
/*
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package jdk.javadoc.internal.doclets.toolkit.util;
import jdk.javadoc.internal.doclets.toolkit.util.TableTabTypes.TableTabs;
/**
* Enum representing module package types.
*
* <p><b>This is NOT part of any supported API.
* If you write code that depends on this, you do so at your own risk.
* This code and its internal interfaces are subject to change or
* deletion without notice.</b>
*
* @author Bhavesh Patel
*/
public enum ModulePackageTypes implements TableTabTypes {
ALL(TableTabs.tab(0xffff, "doclet.All_Packages", "t0", true)),
EXPORTED(TableTabs.tab(0x1, "doclet.Exported_Packages_Summary", "t1", false)),
OPENED(TableTabs.tab(0x2, "doclet.Opened_Packages_Summary", "t2", false)),
CONCEALED(TableTabs.tab(0x4, "doclet.Concealed_Packages_Summary", "t3", false));
private final TableTabs tabs;
private ModulePackageTypes(TableTabs t) {
this.tabs = t;
}
public TableTabs tableTabs() {
return this.tabs;
}
}

@ -1,76 +0,0 @@
/*
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package jdk.javadoc.internal.doclets.toolkit.util;
/**
* Interface representing table tab types.
*
* <p><b>This is NOT part of any supported API.
* If you write code that depends on this, you do so at your own risk.
* This code and its internal interfaces are subject to change or
* deletion without notice.</b>
*
* @author Bhavesh Patel
*/
public interface TableTabTypes {
TableTabs tableTabs();
public static final class TableTabs {
private final int value;
private final String resourceKey;
private final String tabId;
private final boolean isDefaultTab;
private TableTabs(int v, String k, String id, boolean dt) {
this.value = v;
this.resourceKey = k;
this.tabId = id;
this.isDefaultTab = dt;
}
public static TableTabs tab(int value, String resourceKey, String tabId, boolean isDefaultTab) {
return new TableTabs(value, resourceKey, tabId, isDefaultTab);
}
public int value() {
return this.value;
}
public String resourceKey() {
return this.resourceKey;
}
public String tabId() {
return this.tabId;
}
public boolean isDefaultTab() {
return this.isDefaultTab;
}
}
}

@ -24,7 +24,7 @@
/*
* @test
* @bug 4927552 8026567 8071982 8162674 8175200 8175218 8183511 8186332 8169819 8074407
* @summary <DESC>
* @summary test generated docs for deprecated items
* @author jamieh
* @library ../lib
* @modules jdk.javadoc/jdk.javadoc.internal.tool
@ -254,6 +254,7 @@ public class TestDeprecatedDocs extends JavadocTester {
+ "<tbody>\n"
+ "<tr class=\"altColor\">\n"
+ "<th class=\"colDeprecatedItemName\" scope=\"row\"><a href=\"pkg/DeprecatedClassByAnnotation.html#field\">pkg.DeprecatedClassByAnnotation.field</a></th>\n"
+ "<td class=\"colLast\"></td>\n"
+ "</tr>\n"
+ "<tr class=\"rowColor\">\n"
+ "<th class=\"colDeprecatedItemName\" scope=\"row\"><a href=\"pkg/TestClass.html#field\">pkg.TestClass.field</a></th>\n"

@ -1050,7 +1050,7 @@ public class TestModules extends JavadocTester {
+ "<li><a href=\"#module\">Modules</a></li>\n"
+ "</ul>",
"<tr class=\"altColor\">\n"
+ "<th class=\"colFirst\" scope=\"row\"><a href=\"moduleA-summary.html\">moduleA</a></th>\n"
+ "<th class=\"colDeprecatedItemName\" scope=\"row\"><a href=\"moduleA-summary.html\">moduleA</a></th>\n"
+ "<td class=\"colLast\">\n"
+ "<div class=\"deprecationComment\">This module is deprecated.</div>\n"
+ "</td>\n"

@ -2,10 +2,10 @@
<!-- NewPage -->
<html lang="ru">
<head>
<!-- Generated by javadoc (9-internal) on Mon Jan 04 22:47:26 MSK 2016 -->
<!-- Generated by javadoc (removed) -->
<title>API Help</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="date" content="2016-01-04">
<meta name="date" content="(removed)">
<link rel="stylesheet" type="text/css" href="stylesheet.css" title="Style">
<link rel="stylesheet" type="text/css" href="jquery/jquery-ui.css" title="Style">
<script type="text/javascript" src="script.js"></script>