FileDocCategorySizeDatePackage
PackageUseWriter.javaAPI DocExample7343Wed Apr 19 11:17:14 BST 2000com.sun.tools.doclets.standard

PackageUseWriter.java

/*
 * @(#)PackageUseWriter.java	1.6 00/02/02
 *
 * Copyright 1997-2000 Sun Microsystems, Inc. All Rights Reserved.
 * 
 * This software is the proprietary information of Sun Microsystems, Inc.  
 * Use is subject to license terms.
 * 
 */


package com.sun.tools.doclets.standard;

import com.sun.tools.doclets.*;
import com.sun.javadoc.*;
import java.io.*;
import java.util.*;

/**
 * Generate package usage information. 
 *
 * @author Robert G. Field
 */
public class PackageUseWriter extends SubWriterHolderWriter {

    final PackageDoc pkgdoc;
    final SortedMap usingPackageToUsedClasses = new TreeMap();  

    /**
     * Constructor.
     *
     * @param filename the file to be generated. 
     */
    public PackageUseWriter(ClassUseMapper mapper, String filename, 
            PackageDoc pkgdoc) throws IOException, DocletAbortException {
        super(DirectoryManager.getDirectoryPath(pkgdoc), 
              filename, 
              DirectoryManager.getRelativePath(pkgdoc.name()));
        this.pkgdoc = pkgdoc;

        // by examining all classes in this package, find what packages
        // use these classes - produce a map between using package and
        // used classes.
        ClassDoc[] content = pkgdoc.allClasses();
        for (int i = 0; i < content.length; ++i) {
            ClassDoc usedClass = content[i];
            Set usingClasses = (Set)mapper.classToClass.get(usedClass);
            if (usingClasses != null) {
                for (Iterator it = usingClasses.iterator(); it.hasNext(); ) {
                    ClassDoc usingClass = (ClassDoc)it.next();
                    PackageDoc usingPackage = usingClass.containingPackage();
                    Set usedClasses = (Set)usingPackageToUsedClasses
                                                     .get(usingPackage);
                    if (usedClasses == null) {
                        usedClasses = new TreeSet();
                        usingPackageToUsedClasses.put(usingPackage, 
                                                      usedClasses);
                    }
                    usedClasses.add(usedClass);
                }
            }
        }
    }

    /**
     * Generate a class page.
     *
     * @param prev the previous class to generated, or null if no previous.
     * @param classdoc the class to generate.
     * @param next the next class to be generated, or null if no next.
     */
    public static void generate(ClassUseMapper mapper, 
				PackageDoc pkgdoc) throws DocletAbortException {
            PackageUseWriter pkgusegen;
            String filename = "package-use.html";
            try {
                pkgusegen = new PackageUseWriter(mapper, filename, pkgdoc);
                pkgusegen.generatePackageUseFile();
                pkgusegen.close();
            } catch (IOException exc) {
                Standard.configuration().standardmessage.
                    error("doclet.exception_encountered",
                           exc.toString(), filename);
                throw new DocletAbortException();
            }
    }


    /** 
     * Print the class use list.
     */ 
    protected void generatePackageUseFile() throws IOException {
        printPackageUseHeader();

	if (usingPackageToUsedClasses.isEmpty()) {
            printText("doclet.ClassUse_No.usage.of.0", pkgdoc.name());
            p();
        } else {
            generatePackageUse();
        }
        
        printPackageUseFooter();
    }        

    /** 
     * Print the class use list.
     */ 
    protected void generatePackageUse() throws IOException {
        if (Standard.configuration().packages.length > 1) {
            generatePackageList();
        }
        generateClassList();
    }

    protected void generatePackageList() throws IOException {
	tableIndexSummary();
	tableHeaderStart("#CCCCFF");
	printText("doclet.ClassUse_Packages.that.use.0",
		  getPackageLink(pkgdoc));
	tableHeaderEnd();

	Iterator it = usingPackageToUsedClasses.keySet().iterator();
        while (it.hasNext()) {
	    PackageDoc pkg = (PackageDoc)it.next();
	    generatePackageUse(pkg);
	}
	tableEnd();
	space();
	p();
    }
        
    protected void generateClassList() throws IOException {
	Iterator itp = usingPackageToUsedClasses.keySet().iterator();
        while (itp.hasNext()) {
	    PackageDoc usingPackage = (PackageDoc)itp.next();
	    anchor(usingPackage.name());
	    tableIndexSummary();
	    tableHeaderStart("#CCCCFF");
	    printText("doclet.ClassUse_Classes.in.0.used.by.1",
		      getPackageLink(pkgdoc),
                      getPackageLink(usingPackage));
            Iterator itc = 
                  ((Collection)usingPackageToUsedClasses.get(usingPackage))
                       .iterator();
            while (itc.hasNext()) {
                printClassRow((ClassDoc)itc.next(), usingPackage);
            }
	    tableHeaderEnd();
	    tableEnd();
            space();
            p();
	}
    }        

    protected void printClassRow(ClassDoc usedClass, PackageDoc usingPackage) {
        String path = pathString(usedClass, 
                                 "class-use/" + usedClass.name() + ".html");

        trBgcolorStyle("white", "TableRowColor");
        summaryRow(0);
        bold();
        printHyperLink(path, usingPackage.name(), usedClass.name(), true);
        boldEnd();
        println(); br();
        printNbsps();
        printIndexComment(usedClass); 
        summaryRowEnd();
        trEnd(); 
    }

    /** 
     * Print the package use list.
     */ 
    protected void generatePackageUse(PackageDoc pkg) throws IOException {
        trBgcolorStyle("white", "TableRowColor");
	summaryRow(0);
	printHyperLink("", pkg.name(), pkg.name(), true);
	summaryRowEnd();
	summaryRow(0);
	printSummaryComment(pkg);
	space();
	summaryRowEnd();
	trEnd();
    }

    /**
     * Print the header for the class use Listing.
     */
    protected void printPackageUseHeader() {
        String packageLabel = getText("doclet.Package");
        String name = pkgdoc.name();
        printHeader(getText("doclet.Window_ClassUse_Header", 
                            Standard.configuration().windowtitle, 
                            packageLabel, name));
        navLinks(true);
        hr();
        center();
        h2();
        boldText("doclet.ClassUse_Title", packageLabel, name);
        h2End();
        centerEnd();
    }

    /**
     * Print the footer for the class use Listing.
     */
    protected void printPackageUseFooter() {
        hr();
        navLinks(false);
        printBottom();
        printBodyHtmlEnd();
    }


    /**
     * Print this package link
     */
    protected void navLinkPackage() {
        navCellStart();
        printHyperLink("package-summary.html", "", getText("doclet.Package"),
                        true, "NavBarFont1");
        navCellEnd();
    }
                                
    /**
     * Print class use link
     */
    protected void navLinkClassUse() {
        navCellRevStart();
        fontStyle("NavBarFont1Rev");
        boldText("doclet.navClassUse");
        fontEnd();
        navCellEnd();
    }

    protected void navLinkTree() {
        navCellStart();
        printHyperLink("package-tree.html", "", getText("doclet.Tree"),
                        true, "NavBarFont1");
        navCellEnd();
    }

}