/**
  * Add the list of classes that use the given package.
  *
  * @param contentTree the content tree to which the class list will be added
  */
 protected void addClassList(Content contentTree) throws IOException {
   String[] classTableHeader =
       new String[] {
         configuration.getText(
             "doclet.0_and_1",
             configuration.getText("doclet.Class"),
             configuration.getText("doclet.Description"))
       };
   Iterator<String> itp = usingPackageToUsedClasses.keySet().iterator();
   while (itp.hasNext()) {
     String packageName = itp.next();
     PackageDoc usingPackage = configuration.root.packageNamed(packageName);
     HtmlTree li = new HtmlTree(HtmlTag.LI);
     li.addStyle(HtmlStyle.blockList);
     if (usingPackage != null) {
       li.addContent(getMarkerAnchor(usingPackage.name()));
     }
     String tableSummary =
         configuration.getText(
             "doclet.Use_Table_Summary", configuration.getText("doclet.classes"));
     Content table =
         HtmlTree.TABLE(
             HtmlStyle.useSummary,
             0,
             3,
             0,
             tableSummary,
             getTableCaption(
                 configuration.getResource(
                     "doclet.ClassUse_Classes.in.0.used.by.1",
                     getPackageLink(pkgdoc, Util.getPackageName(pkgdoc)),
                     getPackageLink(usingPackage, Util.getPackageName(usingPackage)))));
     table.addContent(getSummaryTableHeader(classTableHeader, "col"));
     Content tbody = new HtmlTree(HtmlTag.TBODY);
     Iterator<ClassDoc> itc = usingPackageToUsedClasses.get(packageName).iterator();
     for (int i = 0; itc.hasNext(); i++) {
       HtmlTree tr = new HtmlTree(HtmlTag.TR);
       if (i % 2 == 0) {
         tr.addStyle(HtmlStyle.altColor);
       } else {
         tr.addStyle(HtmlStyle.rowColor);
       }
       addClassRow(itc.next(), packageName, tr);
       tbody.addContent(tr);
     }
     table.addContent(tbody);
     li.addContent(table);
     contentTree.addContent(li);
   }
 }
 /**
  * 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(PackageDoc pkg, Content contentTree) throws IOException {
   Content tdFirst =
       HtmlTree.TD(
           HtmlStyle.colFirst,
           getHyperLink(Util.getPackageName(pkg), new StringContent(Util.getPackageName(pkg))));
   contentTree.addContent(tdFirst);
   HtmlTree tdLast = new HtmlTree(HtmlTag.TD);
   tdLast.addStyle(HtmlStyle.colLast);
   if (pkg != null && pkg.name().length() != 0) {
     addSummaryComment(pkg, tdLast);
   } else {
     tdLast.addContent(getSpace());
   }
   contentTree.addContent(tdLast);
 }
  /**
   * Constructor.
   *
   * @param filename the file to be generated.
   * @throws IOException
   * @throws DocletAbortException
   */
  public PackageUseWriter(
      ConfigurationImpl configuration, ClassUseMapper mapper, DocPath filename, PackageDoc pkgdoc)
      throws IOException {
    super(configuration, DocPath.forPackage(pkgdoc).resolve(filename));
    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<ClassDoc> usingClasses = mapper.classToClass.get(usedClass.qualifiedName());
      if (usingClasses != null) {
        for (Iterator<ClassDoc> it = usingClasses.iterator(); it.hasNext(); ) {
          ClassDoc usingClass = it.next();
          PackageDoc usingPackage = usingClass.containingPackage();
          Set<ClassDoc> usedClasses = usingPackageToUsedClasses.get(usingPackage.name());
          if (usedClasses == null) {
            usedClasses = new TreeSet<ClassDoc>();
            usingPackageToUsedClasses.put(Util.getPackageName(usingPackage), usedClasses);
          }
          usedClasses.add(usedClass);
        }
      }
    }
  }
 /**
  * Add the list of packages that use the given package.
  *
  * @param contentTree the content tree to which the package list will be added
  */
 protected void addPackageList(Content contentTree) throws IOException {
   Content table =
       HtmlTree.TABLE(
           HtmlStyle.useSummary,
           0,
           3,
           0,
           useTableSummary,
           getTableCaption(
               configuration.getResource(
                   "doclet.ClassUse_Packages.that.use.0",
                   getPackageLink(pkgdoc, Util.getPackageName(pkgdoc)))));
   table.addContent(getSummaryTableHeader(packageTableHeader, "col"));
   Content tbody = new HtmlTree(HtmlTag.TBODY);
   Iterator<String> it = usingPackageToUsedClasses.keySet().iterator();
   for (int i = 0; it.hasNext(); i++) {
     PackageDoc pkg = configuration.root.packageNamed(it.next());
     HtmlTree tr = new HtmlTree(HtmlTag.TR);
     if (i % 2 == 0) {
       tr.addStyle(HtmlStyle.altColor);
     } else {
       tr.addStyle(HtmlStyle.rowColor);
     }
     addPackageUse(pkg, tr);
     tbody.addContent(tr);
   }
   table.addContent(tbody);
   Content li = HtmlTree.LI(HtmlStyle.blockList, table);
   contentTree.addContent(li);
 }
 /**
  * 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
  */
 protected void addPackageUse(PackageDoc pkg, Content contentTree) throws IOException {
   Content tdFirst =
       HtmlTree.TD(
           HtmlStyle.colFirst,
           getHyperLink(pkg.name(), new StringContent(Util.getPackageName(pkg))));
   contentTree.addContent(tdFirst);
   HtmlTree tdLast = new HtmlTree(HtmlTag.TD);
   tdLast.addStyle(HtmlStyle.colLast);
   addSummaryComment(pkg, tdLast);
   contentTree.addContent(tdLast);
 }
 /**
  * Add the class list that use the given class.
  *
  * @param contentTree the content tree to which the class list will be added
  */
 protected void addClassList(Content contentTree) throws IOException {
   HtmlTree ul = new HtmlTree(HtmlTag.UL);
   ul.addStyle(HtmlStyle.blockList);
   for (PackageDoc pkg : pkgSet) {
     Content li = HtmlTree.LI(HtmlStyle.blockList, getMarkerAnchor(pkg.name()));
     Content link =
         getResource(
             "doclet.ClassUse_Uses.of.0.in.1",
             getLink(
                 new LinkInfoImpl(configuration, LinkInfoImpl.Kind.CLASS_USE_HEADER, classdoc)),
             getPackageLink(pkg, Util.getPackageName(pkg)));
     Content heading = HtmlTree.HEADING(HtmlConstants.SUMMARY_HEADING, link);
     li.addContent(heading);
     addClassUse(pkg, li);
     ul.addContent(li);
   }
   Content li = HtmlTree.LI(HtmlStyle.blockList, ul);
   contentTree.addContent(li);
 }
 /**
  * Add the class use information.
  *
  * @param pkg the package that uses the given class
  * @param contentTree the content tree to which the class use information will be added
  */
 protected void addClassUse(PackageDoc pkg, Content contentTree) throws IOException {
   Content classLink =
       getLink(new LinkInfoImpl(configuration, LinkInfoImpl.Kind.CLASS_USE_HEADER, classdoc));
   Content pkgLink = getPackageLink(pkg, Util.getPackageName(pkg));
   classSubWriter.addUseInfo(
       pkgToClassAnnotations.get(pkg.name()),
       configuration.getResource("doclet.ClassUse_Annotation", classLink, pkgLink),
       classUseTableSummary,
       contentTree);
   classSubWriter.addUseInfo(
       pkgToClassTypeParameter.get(pkg.name()),
       configuration.getResource("doclet.ClassUse_TypeParameter", classLink, pkgLink),
       classUseTableSummary,
       contentTree);
   classSubWriter.addUseInfo(
       pkgToSubclass.get(pkg.name()),
       configuration.getResource("doclet.ClassUse_Subclass", classLink, pkgLink),
       subclassUseTableSummary,
       contentTree);
   classSubWriter.addUseInfo(
       pkgToSubinterface.get(pkg.name()),
       configuration.getResource("doclet.ClassUse_Subinterface", classLink, pkgLink),
       subinterfaceUseTableSummary,
       contentTree);
   classSubWriter.addUseInfo(
       pkgToImplementingClass.get(pkg.name()),
       configuration.getResource("doclet.ClassUse_ImplementingClass", classLink, pkgLink),
       classUseTableSummary,
       contentTree);
   fieldSubWriter.addUseInfo(
       pkgToField.get(pkg.name()),
       configuration.getResource("doclet.ClassUse_Field", classLink, pkgLink),
       fieldUseTableSummary,
       contentTree);
   fieldSubWriter.addUseInfo(
       pkgToFieldAnnotations.get(pkg.name()),
       configuration.getResource("doclet.ClassUse_FieldAnnotations", classLink, pkgLink),
       fieldUseTableSummary,
       contentTree);
   fieldSubWriter.addUseInfo(
       pkgToFieldTypeParameter.get(pkg.name()),
       configuration.getResource("doclet.ClassUse_FieldTypeParameter", classLink, pkgLink),
       fieldUseTableSummary,
       contentTree);
   methodSubWriter.addUseInfo(
       pkgToMethodAnnotations.get(pkg.name()),
       configuration.getResource("doclet.ClassUse_MethodAnnotations", classLink, pkgLink),
       methodUseTableSummary,
       contentTree);
   methodSubWriter.addUseInfo(
       pkgToMethodParameterAnnotations.get(pkg.name()),
       configuration.getResource("doclet.ClassUse_MethodParameterAnnotations", classLink, pkgLink),
       methodUseTableSummary,
       contentTree);
   methodSubWriter.addUseInfo(
       pkgToMethodTypeParameter.get(pkg.name()),
       configuration.getResource("doclet.ClassUse_MethodTypeParameter", classLink, pkgLink),
       methodUseTableSummary,
       contentTree);
   methodSubWriter.addUseInfo(
       pkgToMethodReturn.get(pkg.name()),
       configuration.getResource("doclet.ClassUse_MethodReturn", classLink, pkgLink),
       methodUseTableSummary,
       contentTree);
   methodSubWriter.addUseInfo(
       pkgToMethodReturnTypeParameter.get(pkg.name()),
       configuration.getResource("doclet.ClassUse_MethodReturnTypeParameter", classLink, pkgLink),
       methodUseTableSummary,
       contentTree);
   methodSubWriter.addUseInfo(
       pkgToMethodArgs.get(pkg.name()),
       configuration.getResource("doclet.ClassUse_MethodArgs", classLink, pkgLink),
       methodUseTableSummary,
       contentTree);
   methodSubWriter.addUseInfo(
       pkgToMethodArgTypeParameter.get(pkg.name()),
       configuration.getResource("doclet.ClassUse_MethodArgsTypeParameters", classLink, pkgLink),
       methodUseTableSummary,
       contentTree);
   methodSubWriter.addUseInfo(
       pkgToMethodThrows.get(pkg.name()),
       configuration.getResource("doclet.ClassUse_MethodThrows", classLink, pkgLink),
       methodUseTableSummary,
       contentTree);
   constrSubWriter.addUseInfo(
       pkgToConstructorAnnotations.get(pkg.name()),
       configuration.getResource("doclet.ClassUse_ConstructorAnnotations", classLink, pkgLink),
       constructorUseTableSummary,
       contentTree);
   constrSubWriter.addUseInfo(
       pkgToConstructorParameterAnnotations.get(pkg.name()),
       configuration.getResource(
           "doclet.ClassUse_ConstructorParameterAnnotations", classLink, pkgLink),
       constructorUseTableSummary,
       contentTree);
   constrSubWriter.addUseInfo(
       pkgToConstructorArgs.get(pkg.name()),
       configuration.getResource("doclet.ClassUse_ConstructorArgs", classLink, pkgLink),
       constructorUseTableSummary,
       contentTree);
   constrSubWriter.addUseInfo(
       pkgToConstructorArgTypeParameter.get(pkg.name()),
       configuration.getResource(
           "doclet.ClassUse_ConstructorArgsTypeParameters", classLink, pkgLink),
       constructorUseTableSummary,
       contentTree);
   constrSubWriter.addUseInfo(
       pkgToConstructorThrows.get(pkg.name()),
       configuration.getResource("doclet.ClassUse_ConstructorThrows", classLink, pkgLink),
       constructorUseTableSummary,
       contentTree);
 }