duke@1: /* duke@1: * Copyright 2003-2005 Sun Microsystems, Inc. All Rights Reserved. duke@1: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. duke@1: * duke@1: * This code is free software; you can redistribute it and/or modify it duke@1: * under the terms of the GNU General Public License version 2 only, as duke@1: * published by the Free Software Foundation. Sun designates this duke@1: * particular file as subject to the "Classpath" exception as provided duke@1: * by Sun in the LICENSE file that accompanied this code. duke@1: * duke@1: * This code is distributed in the hope that it will be useful, but WITHOUT duke@1: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or duke@1: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License duke@1: * version 2 for more details (a copy is included in the LICENSE file that duke@1: * accompanied this code). duke@1: * duke@1: * You should have received a copy of the GNU General Public License version duke@1: * 2 along with this work; if not, write to the Free Software Foundation, duke@1: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. duke@1: * duke@1: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, duke@1: * CA 95054 USA or visit www.sun.com if you need additional information or duke@1: * have any questions. duke@1: */ duke@1: duke@1: package com.sun.tools.doclets.formats.html; duke@1: bpatel@233: import com.sun.javadoc.*; duke@1: import com.sun.tools.doclets.internal.toolkit.*; duke@1: import com.sun.tools.doclets.internal.toolkit.util.*; duke@1: import com.sun.tools.doclets.internal.toolkit.builders.*; duke@1: duke@1: /** duke@1: * Generate the Class Information Page. duke@1: * @see com.sun.javadoc.ClassDoc duke@1: * @see java.util.Collections duke@1: * @see java.util.List duke@1: * @see java.util.ArrayList duke@1: * @see java.util.HashMap duke@1: * duke@1: * @author Atul M Dambalkar duke@1: * @author Robert Field duke@1: */ duke@1: public class AnnotationTypeWriterImpl extends SubWriterHolderWriter duke@1: implements AnnotationTypeWriter { duke@1: duke@1: protected AnnotationTypeDoc annotationType; duke@1: duke@1: protected Type prev; duke@1: duke@1: protected Type next; duke@1: duke@1: /** duke@1: * @param annotationType the annotation type being documented. duke@1: * @param prevType the previous class that was documented. duke@1: * @param nextType the next class being documented. duke@1: */ duke@1: public AnnotationTypeWriterImpl (AnnotationTypeDoc annotationType, duke@1: Type prevType, Type nextType) duke@1: throws Exception { duke@1: super(ConfigurationImpl.getInstance(), duke@1: DirectoryManager.getDirectoryPath(annotationType.containingPackage()), duke@1: annotationType.name() + ".html", duke@1: DirectoryManager.getRelativePath(annotationType.containingPackage().name())); duke@1: this.annotationType = annotationType; duke@1: configuration.currentcd = annotationType.asClassDoc(); duke@1: this.prev = prevType; duke@1: this.next = nextType; duke@1: } duke@1: duke@1: /** duke@1: * Print this package link duke@1: */ duke@1: protected void navLinkPackage() { duke@1: navCellStart(); duke@1: printHyperLink("package-summary.html", "", duke@1: configuration.getText("doclet.Package"), true, "NavBarFont1"); duke@1: navCellEnd(); duke@1: } duke@1: duke@1: /** duke@1: * Print class page indicator duke@1: */ duke@1: protected void navLinkClass() { duke@1: navCellRevStart(); duke@1: fontStyle("NavBarFont1Rev"); bpatel@182: strongText("doclet.Class"); duke@1: fontEnd(); duke@1: navCellEnd(); duke@1: } duke@1: duke@1: /** duke@1: * Print class use link duke@1: */ duke@1: protected void navLinkClassUse() { duke@1: navCellStart(); duke@1: printHyperLink("class-use/" + filename, "", duke@1: configuration.getText("doclet.navClassUse"), true, "NavBarFont1"); duke@1: navCellEnd(); duke@1: } duke@1: duke@1: /** duke@1: * Print previous package link duke@1: */ duke@1: protected void navLinkPrevious() { duke@1: if (prev == null) { duke@1: printText("doclet.Prev_Class"); duke@1: } else { duke@1: printLink(new LinkInfoImpl(LinkInfoImpl.CONTEXT_CLASS, duke@1: prev.asClassDoc(), "", duke@1: configuration.getText("doclet.Prev_Class"), true)); duke@1: } duke@1: } duke@1: duke@1: /** duke@1: * Print next package link duke@1: */ duke@1: protected void navLinkNext() { duke@1: if (next == null) { duke@1: printText("doclet.Next_Class"); duke@1: } else { duke@1: printLink(new LinkInfoImpl(LinkInfoImpl.CONTEXT_CLASS, duke@1: next.asClassDoc(), "", duke@1: configuration.getText("doclet.Next_Class"), true)); duke@1: } duke@1: } duke@1: duke@1: /** duke@1: * {@inheritDoc} duke@1: */ duke@1: public void writeHeader(String header) { duke@1: duke@1: String pkgname = (annotationType.containingPackage() != null)? duke@1: annotationType.containingPackage().name(): ""; duke@1: String clname = annotationType.name(); duke@1: duke@1: printHtmlHeader(clname, duke@1: configuration.metakeywords.getMetaKeywords(annotationType), true); duke@1: printTop(); duke@1: navLinks(true); duke@1: hr(); duke@1: println(""); duke@1: h2(); duke@1: if (pkgname.length() > 0) { duke@1: font("-1"); print(pkgname); fontEnd(); br(); duke@1: } duke@1: print(header + getTypeParameterLinks(new LinkInfoImpl( duke@1: LinkInfoImpl.CONTEXT_CLASS_HEADER, duke@1: annotationType, false))); duke@1: h2End(); duke@1: } duke@1: duke@1: /** duke@1: * {@inheritDoc} duke@1: */ duke@1: public void writeFooter() { duke@1: println(""); duke@1: hr(); duke@1: navLinks(false); duke@1: printBottom(); duke@1: printBodyHtmlEnd(); duke@1: } duke@1: duke@1: /** duke@1: * {@inheritDoc} duke@1: */ duke@1: public void writeAnnotationTypeSignature(String modifiers) { duke@1: preNoNewLine(); duke@1: writeAnnotationInfo(annotationType); duke@1: print(modifiers); duke@1: String name = annotationType.name() + duke@1: getTypeParameterLinks(new LinkInfoImpl( duke@1: LinkInfoImpl.CONTEXT_CLASS_SIGNATURE, annotationType, false)); duke@1: if (configuration().linksource) { duke@1: printSrcLink(annotationType, name); duke@1: } else { bpatel@182: strong(name); duke@1: } duke@1: preEnd(); duke@1: p(); duke@1: } duke@1: duke@1: /** duke@1: * {@inheritDoc} duke@1: */ duke@1: public void writeAnnotationTypeDescription() { duke@1: if(!configuration.nocomment) { duke@1: // generate documentation for the class. duke@1: if (annotationType.inlineTags().length > 0) { duke@1: printInlineComment(annotationType); duke@1: p(); duke@1: } duke@1: } duke@1: } duke@1: duke@1: /** duke@1: * {@inheritDoc} duke@1: */ duke@1: public void writeAnnotationTypeTagInfo() { duke@1: boolean needHr = annotationType.elements().length > 0; duke@1: if(!configuration.nocomment) { duke@1: // Print Information about all the tags here duke@1: printTags(annotationType); duke@1: if (needHr) { duke@1: hr(); duke@1: } duke@1: p(); duke@1: } else if (needHr) { duke@1: hr(); duke@1: } duke@1: } duke@1: duke@1: /** duke@1: * {@inheritDoc} duke@1: */ duke@1: public void writeAnnotationTypeDeprecationInfo() { duke@1: hr(); duke@1: Tag[] deprs = annotationType.tags("deprecated"); duke@1: if (Util.isDeprecated(annotationType)) { bpatel@182: strongText("doclet.Deprecated"); duke@1: if (deprs.length > 0) { duke@1: Tag[] commentTags = deprs[0].inlineTags(); duke@1: if (commentTags.length > 0) { duke@1: duke@1: space(); duke@1: printInlineDeprecatedComment(annotationType, deprs[0]); duke@1: } duke@1: } duke@1: p(); duke@1: } duke@1: } duke@1: duke@1: protected void navLinkTree() { duke@1: navCellStart(); duke@1: printHyperLink("package-tree.html", "", duke@1: configuration.getText("doclet.Tree"), true, "NavBarFont1"); duke@1: navCellEnd(); duke@1: } duke@1: duke@1: protected void printSummaryDetailLinks() { duke@1: try { duke@1: tr(); duke@1: tdVAlignClass("top", "NavBarCell3"); duke@1: font("-2"); duke@1: print(" "); duke@1: navSummaryLinks(); duke@1: fontEnd(); duke@1: tdEnd(); duke@1: duke@1: tdVAlignClass("top", "NavBarCell3"); duke@1: font("-2"); duke@1: navDetailLinks(); duke@1: fontEnd(); duke@1: tdEnd(); duke@1: trEnd(); duke@1: } catch (Exception e) { duke@1: e.printStackTrace(); duke@1: throw new DocletAbortException(); duke@1: } duke@1: } duke@1: duke@1: protected void navSummaryLinks() throws Exception { duke@1: printText("doclet.Summary"); duke@1: space(); duke@1: MemberSummaryBuilder memberSummaryBuilder = (MemberSummaryBuilder) duke@1: configuration.getBuilderFactory().getMemberSummaryBuilder(this); duke@1: writeNavSummaryLink(memberSummaryBuilder, duke@1: "doclet.navAnnotationTypeRequiredMember", duke@1: VisibleMemberMap.ANNOTATION_TYPE_MEMBER_REQUIRED); duke@1: navGap(); duke@1: writeNavSummaryLink(memberSummaryBuilder, duke@1: "doclet.navAnnotationTypeOptionalMember", duke@1: VisibleMemberMap.ANNOTATION_TYPE_MEMBER_OPTIONAL); duke@1: } duke@1: duke@1: private void writeNavSummaryLink(MemberSummaryBuilder builder, duke@1: String label, int type) { duke@1: AbstractMemberWriter writer = ((AbstractMemberWriter) builder. duke@1: getMemberSummaryWriter(type)); duke@1: if (writer == null) { duke@1: printText(label); duke@1: } else { duke@1: writer.printNavSummaryLink(null, duke@1: ! builder.getVisibleMemberMap(type).noVisibleMembers()); duke@1: } duke@1: } duke@1: duke@1: /** duke@1: * Method navDetailLinks duke@1: * duke@1: * @throws Exception duke@1: * duke@1: */ duke@1: protected void navDetailLinks() throws Exception { duke@1: printText("doclet.Detail"); duke@1: space(); duke@1: MemberSummaryBuilder memberSummaryBuilder = (MemberSummaryBuilder) duke@1: configuration.getBuilderFactory().getMemberSummaryBuilder(this); duke@1: AbstractMemberWriter writerOptional = duke@1: ((AbstractMemberWriter) memberSummaryBuilder. duke@1: getMemberSummaryWriter(VisibleMemberMap.ANNOTATION_TYPE_MEMBER_OPTIONAL)); duke@1: AbstractMemberWriter writerRequired = duke@1: ((AbstractMemberWriter) memberSummaryBuilder. duke@1: getMemberSummaryWriter(VisibleMemberMap.ANNOTATION_TYPE_MEMBER_REQUIRED)); duke@1: if (writerOptional != null){ duke@1: writerOptional.printNavDetailLink(annotationType.elements().length > 0); duke@1: } else if (writerRequired != null){ duke@1: writerRequired.printNavDetailLink(annotationType.elements().length > 0); duke@1: } else { duke@1: printText("doclet.navAnnotationTypeMember"); duke@1: } duke@1: } duke@1: duke@1: protected void navGap() { duke@1: space(); duke@1: print('|'); duke@1: space(); duke@1: } duke@1: duke@1: /** duke@1: * If this is an inner class or interface, write the enclosing class or duke@1: * interface. duke@1: */ duke@1: public void writeNestedClassInfo() { duke@1: ClassDoc outerClass = annotationType.containingClass(); duke@1: if (outerClass != null) { duke@1: dl(); duke@1: dt(); duke@1: if (annotationType.isInterface()) { bpatel@182: strongText("doclet.Enclosing_Interface"); duke@1: } else { bpatel@182: strongText("doclet.Enclosing_Class"); duke@1: } bpatel@233: dtEnd(); duke@1: dd(); duke@1: printLink(new LinkInfoImpl(LinkInfoImpl.CONTEXT_CLASS, outerClass, duke@1: false)); duke@1: ddEnd(); duke@1: dlEnd(); duke@1: } duke@1: } duke@1: duke@1: /** duke@1: * {@inheritDoc} duke@1: */ duke@1: public AnnotationTypeDoc getAnnotationTypeDoc() { duke@1: return annotationType; duke@1: } duke@1: duke@1: /** duke@1: * {@inheritDoc} duke@1: */ duke@1: public void completeMemberSummaryBuild() { duke@1: p(); duke@1: } duke@1: }