langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageUseWriter.java
changeset 10 06bc494ca11e
child 868 d0f233085cbb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageUseWriter.java	Sat Dec 01 00:00:00 2007 +0000
@@ -0,0 +1,266 @@
+/*
+ * Copyright 1998-2005 Sun Microsystems, Inc.  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.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package com.sun.tools.doclets.formats.html;
+
+import com.sun.tools.doclets.internal.toolkit.util.*;
+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.
+     * @throws IOException
+     * @throws DocletAbortException
+     */
+    public PackageUseWriter(ConfigurationImpl configuration,
+                            ClassUseMapper mapper, String filename,
+                            PackageDoc pkgdoc) throws IOException {
+        super(configuration, 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.qualifiedName());
+            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.name());
+                    if (usedClasses == null) {
+                        usedClasses = new TreeSet();
+                        usingPackageToUsedClasses.put(Util.getPackageName(usingPackage),
+                                                      usedClasses);
+                    }
+                    usedClasses.add(usedClass);
+                }
+            }
+        }
+    }
+
+    /**
+     * Generate a class page.
+     *
+     * @param configuration the current configuration of the doclet.
+     * @param mapper        the mapping of the class usage.
+     * @param pkgdoc        the package doc being documented.
+     */
+    public static void generate(ConfigurationImpl configuration,
+                                ClassUseMapper mapper, PackageDoc pkgdoc) {
+        PackageUseWriter pkgusegen;
+        String filename = "package-use.html";
+        try {
+            pkgusegen = new PackageUseWriter(configuration,
+                                             mapper, filename, pkgdoc);
+            pkgusegen.generatePackageUseFile();
+            pkgusegen.close();
+        } catch (IOException exc) {
+            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 (configuration.packages.length > 1) {
+            generatePackageList();
+        }
+        generateClassList();
+    }
+
+    protected void generatePackageList() throws IOException {
+        tableIndexSummary();
+        tableHeaderStart("#CCCCFF");
+        printText("doclet.ClassUse_Packages.that.use.0",
+            getPackageLink(pkgdoc, Util.getPackageName(pkgdoc), false));
+        tableHeaderEnd();
+        Iterator it = usingPackageToUsedClasses.keySet().iterator();
+        while (it.hasNext()) {
+            PackageDoc pkg = configuration.root.packageNamed((String)it.next());
+            generatePackageUse(pkg);
+        }
+        tableEnd();
+        space();
+        p();
+    }
+
+    protected void generateClassList() throws IOException {
+        Iterator itp = usingPackageToUsedClasses.keySet().iterator();
+        while (itp.hasNext()) {
+            String packageName = (String)itp.next();
+            PackageDoc usingPackage = configuration.root.packageNamed(packageName);
+            if (usingPackage != null) {
+                anchor(usingPackage.name());
+            }
+            tableIndexSummary();
+            tableHeaderStart("#CCCCFF");
+            printText("doclet.ClassUse_Classes.in.0.used.by.1",
+                getPackageLink(pkgdoc, Util.getPackageName(pkgdoc), false),
+                getPackageLink(usingPackage,Util.getPackageName(usingPackage), false));
+            tableHeaderEnd();
+            Iterator itc =
+                ((Collection)usingPackageToUsedClasses.get(packageName))
+                .iterator();
+            while (itc.hasNext()) {
+                printClassRow((ClassDoc)itc.next(), packageName);
+            }
+            tableEnd();
+            space();
+            p();
+        }
+    }
+
+    protected void printClassRow(ClassDoc usedClass, String packageName) {
+        String path = pathString(usedClass,
+                                 "class-use/" + usedClass.name() + ".html");
+
+        trBgcolorStyle("white", "TableRowColor");
+        summaryRow(0);
+        bold();
+        printHyperLink(path, packageName, 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);
+        //Just want an anchor here.
+        printHyperLink("", pkg.name(), Util.getPackageName(pkg), true);
+        summaryRowEnd();
+        summaryRow(0);
+        if (pkg != null) {
+            printSummaryComment(pkg);
+        }
+        space();
+        summaryRowEnd();
+        trEnd();
+    }
+
+    /**
+     * Print the header for the class use Listing.
+     */
+    protected void printPackageUseHeader() {
+        String packageLabel = configuration.getText("doclet.Package");
+        String name = pkgdoc.name();
+        printHtmlHeader(configuration.getText("doclet.Window_ClassUse_Header",
+            packageLabel, name), null, true);
+        printTop();
+        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", "", configuration.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", "", configuration.getText("doclet.Tree"),
+                       true, "NavBarFont1");
+        navCellEnd();
+    }
+
+}