Code drop from //branches/cupcake/...@124589
diff --git a/tools/droiddoc/src/DroidDoc.java b/tools/droiddoc/src/DroidDoc.java
index b0412c9..23ff654 100644
--- a/tools/droiddoc/src/DroidDoc.java
+++ b/tools/droiddoc/src/DroidDoc.java
@@ -209,6 +209,9 @@
             writeHTMLPages();
         }
 
+        // Navigation tree
+        NavTree.writeNavTree(javadocDir);
+
         // Packages Pages
         writePackages(javadocDir
                         + (ClearPage.htmlDir!=null
@@ -475,7 +478,7 @@
                     classesToCheck = pkg.interfaces();
                     break;
                 default:
-                    System.out.println("Error reading package: " + pkg.name());
+                    System.err.println("Error reading package: " + pkg.name());
                     break;
                 }
                 for (ClassInfo cl : classesToCheck) {
@@ -516,24 +519,17 @@
                 if (len > 3 && ".cs".equals(templ.substring(len-3))) {
                     HDF data = makeHDF();
                     String filename = templ.substring(0,len-3) + htmlExtension;
-                    System.out.println("Writing CS:  " + filename);
                     ClearPage.write(data, templ, filename);
                 }
                 else if (len > 3 && ".jd".equals(templ.substring(len-3))) {
                     String filename = templ.substring(0,len-3) + htmlExtension;
-                    System.out.println("Writing JD:  " + filename);
                     DocFile.writePage(f.getAbsolutePath(), relative, filename);
                 }
                 else {
-//                    System.out.println("relative=" + relative
-//                            + " f.getAbsolutePath()=" + f.getAbsolutePath()
-//                            + " templ=" + templ);
-                    System.out.println("Copying:     " + templ);
                     ClearPage.copyFile(f, templ);
                 }
             }
             else if (f.isDirectory()) {
-                System.out.println("Writing dir: " + relative + f.getName() + "/");
                 writeDirectory(f, relative + f.getName() + "/");
             }
         }
@@ -543,7 +539,7 @@
     {
         File f = new File(ClearPage.htmlDir);
         if (!f.isDirectory()) {
-            System.out.println("htmlDir not a directory: " + ClearPage.htmlDir);
+            System.err.println("htmlDir not a directory: " + ClearPage.htmlDir);
         }
         writeDirectory(f, "");
     }
@@ -644,7 +640,7 @@
             }
         }
         catch (FileNotFoundException e) {
-            System.out.println("error writing file: " + filename);
+            System.err.println("error writing file: " + filename);
         }
         finally {
             if (stream != null) {
@@ -653,13 +649,13 @@
         }
     }
 
-    public static void writePackages(String filename)
-    {
-        System.out.println("Writing packages...");
-        HDF data = makePackageHDF();
+    private static PackageInfo[] sVisiblePackages = null;
+    public static PackageInfo[] choosePackages() {
+        if (sVisiblePackages != null) {
+            return sVisiblePackages;
+        }
 
         ClassInfo[] classes = Converter.rootClasses();
-
         SortedMap<String, PackageInfo> sorted = new TreeMap<String, PackageInfo>();
         for (ClassInfo cl: classes) {
             PackageInfo pkg = cl.containingPackage();
@@ -672,7 +668,8 @@
             sorted.put(name, pkg);
         }
 
-        int i = 0;
+        ArrayList<PackageInfo> result = new ArrayList();
+
         for (String s: sorted.keySet()) {
             PackageInfo pkg = sorted.get(s);
 
@@ -680,10 +677,13 @@
                 continue;
             }
             Boolean allHidden = true;
-            int pass = 1;
-            ClassInfo[] classesToCheck = pkg.ordinaryClasses();
+            int pass = 0;
+            ClassInfo[] classesToCheck = null;
             while (pass < 5 ) {
                 switch(pass) {
+                case 0:
+                    classesToCheck = pkg.ordinaryClasses();
+                    break;
                 case 1:
                     classesToCheck = pkg.enums();
                     break;
@@ -697,7 +697,7 @@
                     classesToCheck = pkg.interfaces();
                     break;
                 default:
-                    System.out.println("Error reading package: " + pkg.name());
+                    System.err.println("Error reading package: " + pkg.name());
                     break;
                 }
                 for (ClassInfo cl : classesToCheck) {
@@ -715,8 +715,26 @@
                 continue;
             }
 
+            result.add(pkg);
+        }
+
+        sVisiblePackages = result.toArray(new PackageInfo[result.size()]);
+        return sVisiblePackages;
+    }
+
+    public static void writePackages(String filename)
+    {
+        HDF data = makePackageHDF();
+
+        int i = 0;
+        for (PackageInfo pkg: choosePackages()) {
             writePackage(pkg);
 
+            data.setValue("docs.packages." + i + ".name", pkg.name());
+            data.setValue("docs.packages." + i + ".link", pkg.htmlPage());
+            TagInfo.makeHDF(data, "docs.packages." + i + ".shortDescr",
+                            pkg.firstSentenceTags());
+
             i++;
         }
 
@@ -739,7 +757,6 @@
         HDF data = makePackageHDF();
 
         String name = pkg.name();
-        System.out.println("Writing " + name);
 
         data.setValue("package.name", name);
         data.setValue("package.descr", "...description...");
@@ -762,8 +779,7 @@
         setPageTitle(data, name);
         ClearPage.write(data, "package.cs", filename);
 
-        filename = filename.substring(0, filename.lastIndexOf('/')+1)
-            + "package-descr" + htmlExtension;
+        filename = pkg.fullDescriptionHtmlPage();
         setPageTitle(data, name + " Details");
         ClearPage.write(data, "package-descr.cs", filename);
 
@@ -804,8 +820,6 @@
                             sorted[j].label = sorted[j].label + " (" + pkg.name() + ")";
                         }
                     }
-                } else {
-                    //System.out.println("not duplicate: " + sorted[i].label);
                 }
                 firstMatch = i;
                 lastName = s;
@@ -838,7 +852,7 @@
             cl.makeKeywordEntries(keywords);
         }
 
-        HDF data = makePackageHDF();
+        HDF data = makeHDF();
 
         Collections.sort(keywords);
         
@@ -884,7 +898,6 @@
     {
         cl.makeHDF(data);
 
-        System.out.println("Writing " + cl.name());
         setPageTitle(data, cl.name());
         ClearPage.write(data, "class.cs", cl.htmlPage());