Overhaul of SOYC dashboard styling.



git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@6348 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/soyc/MakeTopLevelHtmlForPerm.java b/dev/core/src/com/google/gwt/soyc/MakeTopLevelHtmlForPerm.java
index 79d9258..122959e 100644
--- a/dev/core/src/com/google/gwt/soyc/MakeTopLevelHtmlForPerm.java
+++ b/dev/core/src/com/google/gwt/soyc/MakeTopLevelHtmlForPerm.java
@@ -23,6 +23,7 @@
 import java.io.OutputStream;
 import java.io.PrintWriter;
 import java.io.UnsupportedEncodingException;
+import java.text.DecimalFormat;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
@@ -102,7 +103,7 @@
    */
   private static final Pattern PATTERN_SP_INT = Pattern.compile("sp([0-9]+)");
 
-  public static String escapeXml(String unescaped) {
+  private static String escapeXml(String unescaped) {
     String escaped = unescaped.replaceAll("\\&", "&");
     escaped = escaped.replaceAll("\\<", "&lt;");
     escaped = escaped.replaceAll("\\>", "&gt;");
@@ -115,24 +116,7 @@
       Map<String, String> allPermsInfo, OutputDirectory outDir)
       throws IOException {
     PrintWriter outFile = new PrintWriter(outDir.getOutputStream("index.html"));
-
-    outFile.println("<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\">");
-    outFile.println("<html>");
-    outFile.println("<head>");
-    outFile.println("  <title>Story of Your Compile - Top Level Dashboard for all Permutations</title>");
-    outFile.println("<style type=\"text/css\">");
-    outFile.println("body {background-color: #728FCE}");
-    outFile.println("h2 {background-color: transparent}");
-    outFile.println("</style>");
-    outFile.println("</head>");
-
-    outFile.println("<body>");
-    outFile.println("<center>");
-    outFile.println("<h1>Story of Your Compile</h1>");
-    outFile.println("<hr>");
-    outFile.println("<h3>Story of Your Compile - Overview of Permutations</h3>");
-    outFile.println("<hr>");
-
+    addStandardHtmlProlog(outFile, "Compile report", "Overview of permutations");
     outFile.println("<div style='overflow:auto; background-color:white'>");
     outFile.println("<center>");
     for (String permutationId : allPermsInfo.keySet()) {
@@ -146,54 +130,44 @@
       }
     }
     outFile.println("</center>");
-    outFile.println("</div>");
     addStandardHtmlEnding(outFile);
     outFile.close();
   }
 
-  private static void addCenteredHeader(final PrintWriter outFile, String header) {
-    outFile.println("<hr>");
-    outFile.println("<b>" + header + "</b>");
-    outFile.println("<hr>");
-  }
-
-  /**
-   * Adds a header line indicating which breakdown is being analyzed.
-   */
-  private static void addHeaderWithBreakdownContext(SizeBreakdown breakdown,
-      final PrintWriter outFile) {
-    addCenteredHeader(outFile, headerLineForBreakdown(breakdown));
-  }
-
   private static void addStandardHtmlEnding(final PrintWriter out) {
     out.println("</div>");
     out.println("</body>");
     out.println("</html>");
   }
 
-  private static void addStandardHtmlProlog(final PrintWriter out,
-      String title, String header) {
-    out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\"");
-    out.println("\"http://www.w3.org/TR/html4/strict.dtd\">");
-    out.println("<html>");
-    out.println("<head>");
-    out.println("<meta http-equiv=\"content-type\" content=\"text/html;charset=ISO-8859-1\">");
-    out.println("<title>" + title + "</title>");
-    out.println("</head>");
-
-    out.println("<style type=\"text/css\">");
-    out.println("body {background-color: #728FCE}");
-    out.println("h2 {background-color: transparent}");
-    out.println("p {background-color: fuchsia}");
-    out.println("</style>");
-
-    out.println("<body>");
-    out.println("<center>");
-    out.println("<h2>" + title + "</h2>");
-    if (header != null) {
-      addCenteredHeader(out, header);
+  private static void addStandardHtmlProlog(final PrintWriter outFile, String header,
+      String barText) {
+    outFile.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\"");
+    outFile.println("\"http://www.w3.org/TR/html4/strict.dtd\">");
+    outFile.println("<html>");
+    outFile.println("<head>");
+    if ((header != null) && (header.compareTo("") != 0)) {
+      outFile.println("<title>" + header + "</title>");
+    } else {
+      outFile.println("<title/>");
     }
-    out.println("</center>");
+    outFile.println("<meta http-equiv=\"content-type\" content=\"text/html;chars  et=ISO-8859-1\">");
+    outFile.println("<link rel=\"stylesheet\" href=\"soycStyling.css\" media=\"screen\">");
+    outFile.println("</head>");
+    outFile.println("<body> ");
+    outFile.println("<div>");
+    outFile.println("<h2 id='header'>");
+    outFile.println("<img id='logo' src=\"http://code.google.com/webtoolkit/images/gwt-logo.png\"/>");
+    outFile.println(header);
+    outFile.println("</h2>");
+    outFile.println("</div>");
+    if ((barText != null) && (barText.compareTo("") != 0)) {
+      outFile.println("<div id=\"topBar\">");
+      outFile.println(barText);
+      outFile.println("</div>");
+    } else {
+      outFile.println("<div id=\"topBar\"><br></div>");
+    }
   }
 
   private static String classesInPackageFileName(SizeBreakdown breakdown,
@@ -236,6 +210,14 @@
     this.outDir = outDir;
   }
 
+  /**
+   * Adds a header line indicating which breakdown is being analyzed.
+   */
+  private void addHeaderWithBreakdownContext(SizeBreakdown breakdown,
+      final PrintWriter outFile, String header) {
+    addStandardHtmlProlog(outFile, header, headerLineForBreakdown(breakdown));
+  }
+
   public void makeBreakdownShell(SizeBreakdown breakdown) throws IOException {
     Map<String, CodeCollection> nameToCodeColl = breakdown.nameToCodeColl;
     Map<String, LiteralsCollection> nameToLitColl = breakdown.nameToLitColl;
@@ -247,54 +229,7 @@
     outFile.println("<html>");
     outFile.println("<head>");
     outFile.println("  <title>Story of Your Compile - Top Level Dashboard for Permutation</title>");
-    outFile.println("  <link rel=\"stylesheet\" href=\"common.css\">");
-    outFile.println("  <style type=\"text/css\">");
-    outFile.println(" body {");
-    outFile.println("   background-color: #728FCE;");
-    outFile.println(" }");
-
-    outFile.println(".abs {");
-    outFile.println("  position: absolute;");
-    outFile.println(" overflow: hidden;");
-    outFile.println(" }");
-
-    outFile.println(" .mainHeader {");
-    outFile.println("   left:0; right: 0;");
-    outFile.println("   top:0; height: 6em;");
-    outFile.println("  text-align: center;");
-    outFile.println("}");
-
-    outFile.println(".mainContent {");
-    outFile.println("  left:0; right: 0;");
-    outFile.println("  top: 6em; bottom: 0;");
-    outFile.println("}");
-
-    outFile.println(".header {");
-    outFile.println("  left:0; right: 0;");
-    outFile.println(" top:0; height: 5em;");
-    outFile.println("  padding: 0.5em;");
-    outFile.println("}");
-
-    outFile.println(".innerContent {");
-    outFile.println("   left:0; right: 0;");
-    outFile.println("  top: 2em; bottom: 0;");
-    outFile.println("}");
-
-    outFile.println(".frame {");
-    outFile.println(" width: 100%; height: 100%;");
-    outFile.println("  border: 0px;");
-    outFile.println("}");
-
-    outFile.println(".packages {");
-    outFile.println(" left:0; right: 0;");
-    outFile.println(" top:0; bottom: 50%;");
-    outFile.println("}");
-
-    outFile.println(".codeType {");
-    outFile.println("left:0; right: 0;");
-    outFile.println("top:50%; bottom: 0;");
-    outFile.println("}");
-    outFile.println("</style>");
+    outFile.println("  <link rel=\"stylesheet\" href=\"soycStyling.css\">");
     outFile.println("</head>");
 
     outFile.println("<body>");
@@ -303,7 +238,7 @@
     outFile.println("<center>");
     outFile.println("<h3>Story of Your Compile Dashboard</h3>");
 
-    addHeaderWithBreakdownContext(breakdown, outFile);
+    addHeaderWithBreakdownContext(breakdown, outFile, "Compile report");
 
     outFile.println("</center>");
 
@@ -369,67 +304,8 @@
       }
 
       final PrintWriter outFile = new PrintWriter(getOutFile(outFileName));
-
-      outFile.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\"");
-      outFile.println("\"http://www.w3.org/TR/html4/strict.dtd\">");
-      outFile.println("<html>");
-      outFile.println("<head>");
-      outFile.println("<title>Classes in package \"" + codeType + "\"</title>");
-      outFile.println("  <meta http-equiv=\"content-type\" content=\"text/html;charset=ISO-8859-1\">");
-      outFile.println("  <link rel=\"stylesheet\" href=\"common.css\" media=\"screen\">");
-
-      outFile.println("  <style type=\"text/css\">");
-
-      outFile.println(".abs {");
-      outFile.println("  position: absolute;");
-      outFile.println(" overflow: hidden;");
-      outFile.println(" }");
-
-      outFile.println(" .mainHeader {");
-      outFile.println("   left:0; right: 0;");
-      outFile.println("   top:0; height: 6em;");
-      outFile.println("  text-align: center;");
-      outFile.println("background-color: #728FCE;");
-      outFile.println("}");
-
-      outFile.println(".mainContent {");
-      outFile.println("  left:0; right: 0;");
-      outFile.println("  top: 6em; bottom: 0;");
-      outFile.println("}");
-
-      outFile.println(".header {");
-      outFile.println("  left:0; right: 0;");
-      outFile.println(" top:0; height: 2em;");
-      outFile.println("  padding: 0.5em;");
-      outFile.println("}");
-
-      outFile.println(".innerContent {");
-      outFile.println("   left:0; right: 0;");
-      outFile.println("  top: 2em; bottom: 0;");
-      outFile.println("}");
-
-      outFile.println(".frame {");
-      outFile.println(" width: 100%; height: 100%;");
-      outFile.println("  border: 0px;");
-      outFile.println("}");
-
-      outFile.println(".packages {");
-      outFile.println(" left:0; right: 0;");
-      outFile.println(" top:0; bottom: 50%;");
-      outFile.println("}");
-
-      outFile.println(".codeType {");
-      outFile.println("left:0; right: 0;");
-      outFile.println("top:50%; bottom: 0;");
-      outFile.println("}");
-      outFile.println("</style>");
-      outFile.println("</head>");
-
-      outFile.println("<body>");
-      outFile.println("<div class='abs mainHeader'>");
-      outFile.println("<h2>Classes in package \"" + codeType + "\"</h2>");
-      addHeaderWithBreakdownContext(breakdown, outFile);
-      outFile.println("</center>");
+      addHeaderWithBreakdownContext(breakdown, outFile, "Classes in package "
+          + codeType);
       outFile.println("<hr>");
       outFile.println("</div>");
       outFile.println("<div class='abs mainContent' style='overflow:auto'>");
@@ -443,13 +319,10 @@
       for (Float size : sortedClasses.keySet()) {
 
         String className = sortedClasses.get(size);
-
         float ratio = (size / maxSize) * 85;
-
-        if (ratio < 5) {
-          ratio = 5;
+        if (ratio < 1) {
+          ratio = 1;
         }
-
         outFile.println("<tr>");
         outFile.println("<td class=\"barlabel\">" + size + "</td>");
         outFile.println("<td class=\"barlabel\">" + className + "</td>");
@@ -488,27 +361,8 @@
       String outFileName = literalType + "-" + getPermutationId() + "Lits.html";
       final PrintWriter outFile = new PrintWriter(getOutFile(breakdown.getId()
           + "_" + outFileName));
-
-      outFile.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\"");
-      outFile.println("\"http://www.w3.org/TR/html4/strict.dtd\">");
-      outFile.println("<html>");
-      outFile.println("<head>");
-      outFile.println("<meta http-equiv=\"content-type\" content=\"text/html;charset=ISO-8859-1\">");
-      outFile.println("<title>Literals of type \"" + literalType + "\"</title>");
-      outFile.println("</head>");
-
-      outFile.println("<style type=\"text/css\">");
-      outFile.println("body {background-color: #728FCE}");
-      outFile.println("h2 {background-color: transparent}");
-      outFile.println("p {background-color: fuchsia}");
-      outFile.println("</style>");
-
-      outFile.println("<body>");
-      outFile.println("<center>");
-      outFile.println("<h2>Literals of type \"" + literalType + "\"</h2>");
-      addHeaderWithBreakdownContext(breakdown, outFile);
-      outFile.println("</center>");
-
+      addHeaderWithBreakdownContext(breakdown, outFile, "Literals of type "
+          + literalType);
       outFile.println("<center>");
       outFile.println("<table border=\"1\" width=\"80%\" style=\"font-size: 11pt;\" bgcolor=\"white\">");
 
@@ -577,67 +431,8 @@
           getOutFile(classesInPackageFileName(breakdown, packageName,
               getPermutationId())));
 
-      outFile.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\"");
-      outFile.println("\"http://www.w3.org/TR/html4/strict.dtd\">");
-      outFile.println("<html>");
-      outFile.println("<head>");
-      outFile.println("<title>Classes in package \"" + packageName
-          + "\"</title>");
-      outFile.println("  <meta http-equiv=\"content-type\" content=\"text/html;charset=ISO-8859-1\">");
-      outFile.println("  <link rel=\"stylesheet\" href=\"common.css\" media=\"screen\">");
-
-      outFile.println("  <style type=\"text/css\">");
-
-      outFile.println(".abs {");
-      outFile.println("  position: absolute;");
-      outFile.println(" overflow: hidden;");
-      outFile.println(" }");
-
-      outFile.println(" .mainHeader {");
-      outFile.println("   left:0; right: 0;");
-      outFile.println("   top:0; height: 6em;");
-      outFile.println("  text-align: center;");
-      outFile.println("background-color: #728FCE;");
-      outFile.println("}");
-
-      outFile.println(".mainContent {");
-      outFile.println("  left:0; right: 0;");
-      outFile.println("  top: 6em; bottom: 0;");
-      outFile.println("}");
-
-      outFile.println(".header {");
-      outFile.println("  left:0; right: 0;");
-      outFile.println(" top:0; height: 2em;");
-      outFile.println("  padding: 0.5em;");
-      outFile.println("}");
-
-      outFile.println(".innerContent {");
-      outFile.println("   left:0; right: 0;");
-      outFile.println("  top: 2em; bottom: 0;");
-      outFile.println("}");
-
-      outFile.println(".frame {");
-      outFile.println(" width: 100%; height: 100%;");
-      outFile.println("  border: 0px;");
-      outFile.println("}");
-
-      outFile.println(".packages {");
-      outFile.println(" left:0; right: 0;");
-      outFile.println(" top:0; bottom: 50%;");
-      outFile.println("}");
-
-      outFile.println(".codeType {");
-      outFile.println("left:0; right: 0;");
-      outFile.println("top:50%; bottom: 0;");
-      outFile.println("}");
-      outFile.println("</style>");
-      outFile.println("</head>");
-
-      outFile.println("<body>");
-      outFile.println("<div class='abs mainHeader'>");
-      outFile.println("<h2>Classes in package \"" + packageName + "\"</h2>");
-      addHeaderWithBreakdownContext(breakdown, outFile);
-      outFile.println("</center>");
+      addHeaderWithBreakdownContext(breakdown, outFile, "Classes in package "
+          + packageName);
       outFile.println("<hr>");
       outFile.println("</div>");
       outFile.println("<div class='abs mainContent' style='overflow:auto'>");
@@ -652,15 +447,16 @@
       for (Float size : sortedClasses.keySet()) {
         String className = sortedClasses.get(size);
         float ratio = (size / maxSize) * 85;
-        if (ratio < 5) {
-          ratio = 5;
+        if (ratio < 1) {
+          ratio = 1;
         }
         float perc = (size / sumSize) * 100;
 
         String dependencyLink = depLinker.dependencyLinkForClass(className);
         outFile.println("<tr>");
         outFile.println("<td class=\"barlabel\">" + size + "</td>");
-        outFile.println("<td class=\"barlabel\">" + perc + "%</td>");
+        outFile.println("<td class=\"barlabel\">" + formatNumber(perc)
+            + "%</td>");
         if (dependencyLink != null) {
           outFile.println("<td class=\"barlabel\"><a href=\"" + dependencyLink
               + "\" target=\"_top\">" + className + "</a></td>");
@@ -668,9 +464,8 @@
           outFile.println("<td class=\"barlabel\">" + className + "</td>");
         }
         outFile.println("<td class=\"box\">");
-        outFile.println("  <div style=\"width:"
-            + ratio
-            + "%;\" class=\"lb\"><div class=\"rb\"><div class=\"bb\"><div class=\"blc\"><div class=\"brc\"><div class=\"tb\"><div class=\"tlc\"><div class=\"trc\"><div class=\"content\"></div></div></div></div></div></div></div></div>");
+        outFile.println("  <div style=\"width:" + ratio
+            + "%;\" class=\"sizebar\"/>");
         outFile.println("</td>");
         outFile.println("</tr>");
       }
@@ -688,77 +483,15 @@
   }
 
   public void makeTopLevelShell() throws IOException {
+    
+    String permutationId = getPermutationId();
     PrintWriter outFile = new PrintWriter(getOutFile("SoycDashboard" + "-"
         + getPermutationId() + "-index.html"));
 
-    outFile.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\"");
-    outFile.println("\"http://www.w3.org/TR/html4/strict.dtd\">");
-    outFile.println("<html>");
-    outFile.println("<head>");
-    outFile.println("<title>Story of Your Compile - Top Level Dashboard for Permutation</title>");
-    outFile.println("  <meta http-equiv=\"content-type\" content=\"text/html;charset=ISO-8859-1\">");
-    outFile.println("  <link rel=\"stylesheet\" href=\"common.css\" media=\"screen\">");
+    
+    addStandardHtmlProlog(outFile, "Compile report", "Permutation "
+        + permutationId);
 
-    outFile.println("  <style type=\"text/css\">");
-
-    outFile.println(".abs {");
-    outFile.println("  position: absolute;");
-    outFile.println(" overflow: hidden;");
-    outFile.println(" }");
-
-    outFile.println(" .mainHeader {");
-    outFile.println("   left:0; right: 0;");
-    outFile.println("   top:0; height: 6em;");
-    outFile.println("  text-align: center;");
-    outFile.println("background-color: #728FCE;");
-    outFile.println("}");
-
-    outFile.println(".mainContent {");
-    outFile.println("  left:0; right: 0;");
-    outFile.println("  top: 6em; bottom: 0;");
-    outFile.println("}");
-
-    outFile.println(".header {");
-    outFile.println("  left:0; right: 0;");
-    outFile.println(" top:0; height: 2em;");
-    outFile.println("  padding: 0.5em;");
-    outFile.println("}");
-
-    outFile.println(".innerContent {");
-    outFile.println("   left:0; right: 0;");
-    outFile.println("  top: 2em; bottom: 0;");
-    outFile.println("}");
-
-    outFile.println(".frame {");
-    outFile.println(" width: 100%; height: 100%;");
-    outFile.println("  border: 0px;");
-    outFile.println("}");
-
-    outFile.println(".packages {");
-    outFile.println(" left:0; right: 0;");
-    outFile.println(" top:0; bottom: 50%;");
-    outFile.println("}");
-
-    outFile.println(".codeType {");
-    outFile.println("left:0; right: 0;");
-    outFile.println("top:50%; bottom: 0;");
-    outFile.println("}");
-    outFile.println("</style>");
-    outFile.println("</head>");
-
-    outFile.println("<body>");
-    outFile.println("<div class='abs mainHeader'>");
-    outFile.println("<h2>Story of Your Compile Dashboard</h2>");
-    // String permutationInfo = settings.allPermsInfo.get(getPermutationId());
-    String permutationInfo = ""; // TODO(spoon) pass in permutation information
-    // here
-    outFile.print("<h3>Permutation " + getPermutationId());
-    if (permutationInfo.length() > 0) {
-      outFile.println(" (" + permutationInfo + ")");
-    }
-    outFile.println("</h3>");
-    outFile.println("<hr>");
-    outFile.println("<center>");
     if (globalInformation.getSplitPointToLocation().size() > 1) {
       outFile.println("<b>Initial download size: <span style=\"color:maroon\">"
           + globalInformation.getInitialCodeBreakdown().sizeAllCode
@@ -769,8 +502,6 @@
         + "</span></span></b>");
 
     outFile.println("<hr>");
-    outFile.println("Available code subsets to analyze");
-    outFile.println("<hr>");
     outFile.println("</div>");
 
     outFile.println("<div class='abs mainContent' style=\"overflow: auto\" >");
@@ -814,28 +545,27 @@
       String drillDownFileName = shellFileName(breakdown, getPermutationId());
       String splitPointDescription = breakdown.getDescription();
 
-      int size = breakdown.sizeAllCode;
+      float size = breakdown.sizeAllCode;
       float ratio;
       if (globalInformation.getInitialCodeBreakdown().sizeAllCode > 0) {
         ratio = (size / globalInformation.getInitialCodeBreakdown().sizeAllCode) * 79;
       } else {
         ratio = (size / maxSize) * 79;
       }
-      if (ratio < 5) {
-        ratio = 5;
+      if (ratio < 1) {
+        ratio = 1;
       }
       float perc = (size / maxSize) * 100;
 
       outFile.println("<tr>");
       outFile.println("<td class=\"barlabel\">" + size + "</td>");
-      outFile.println("<td class=\"barlabel\">" + perc + "%</td>");
+      outFile.println("<td class=\"barlabel\">" + formatNumber(perc) + "%</td>");
       outFile.println("<td class=\"barlabel\"><a href=\"" + drillDownFileName
           + "\" target=\"_top\">" + splitPointDescription + "</a></td>");
       outFile.println("<td class=\"box\">");
       if (splitPointDescription.compareTo("Total program") != 0) {
-        outFile.println("<div style=\"width:"
-            + ratio
-            + "%;\" class=\"lb\"><div class=\"rb\"><div class=\"bb\"><div class=\"blc\"><div class=\"brc\"><div class=\"tb\"><div class=\"tlc\"><div class=\"trc\"><div class=\"content\"></div></div></div></div></div></div></div></div>");
+        outFile.println("<div style=\"width:" + ratio
+            + "%;\" class=\"sizebar\"/>");
       }
       outFile.println("</td>");
       outFile.println("</tr>");
@@ -847,54 +577,7 @@
 
   private void addDependenciesHtmlProlog(final PrintWriter out, String title,
       String header) {
-    out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\"");
-    out.println("\"http://www.w3.org/TR/html4/strict.dtd\">");
-    out.println("<html>");
-
-    out.println("<head>");
-    out.println("<meta http-equiv=\"content-type\" content=\"text/html;charset=ISO-8859-1\">");
-    out.println("<title>" + title + "</title>");
-    out.println("<link rel=\"stylesheet\" href=\"common.css\">");
-    out.println("<style type=\"text/css\">");
-    out.println("body {background-color: #728FCE}");
-    out.println("h2 {background-color: transparent}");
-    out.println("p {background-color: fuchsia}");
-    out.println(".calledBy {");
-    out.println("  color: green;");
-    out.println("}");
-    out.println(".toggle {");
-    out.println("cursor: pointer;");
-    out.println("}");
-    out.println(".main {");
-    out.println("background-color: white;");
-    out.println("padding: 8px;");
-    out.println("}");
-    out.println("</style>");
-    out.println("<script>");
-    out.println("function nextSiblingElement(a) {");
-    out.println("var ul = a.nextSibling;");
-    out.println("while (ul && ul.nodeType != 1) { // 1==element");
-    out.println("  ul = ul.nextSibling;");
-    out.println("}");
-    out.println("return ul;");
-    out.println("}");
-    out.println("function toggle() {");
-    out.println("var ul = nextSiblingElement(this);");
-    out.println("if (ul) {");
-    out.println(" ul.style.display = (ul.style.display == 'none') ? '' : 'none';");
-    out.println("}");
-    out.println("}");
-    out.println("</script>");
-
-    out.println("</head>");
-
-    out.println("<body>");
-    out.println("<center>");
-    out.println("<h2>" + title + "</h2>");
-    if (header != null) {
-      addCenteredHeader(out, header);
-    }
-    out.println("</center>");
+    addStandardHtmlProlog(out, title, header);
   }
 
   private void addLefttoversStatus(String className, String packageName,
@@ -913,12 +596,26 @@
     }
   }
 
+  /**
+   * Returns a file name for the dependencies list.
+   */
   private String dependenciesFileName(String depGraphName, String packageName) {
     return "methodDependencies-" + depGraphName + "-" + filename(packageName)
         + "-" + getPermutationId() + ".html";
   }
 
   /**
+   * Format floating point number to two decimal points.
+   * 
+   * @param number
+   * @return formatted number
+   */
+  private String formatNumber(float number) {
+    DecimalFormat formatBy = new DecimalFormat("#.##");
+    return formatBy.format(number);
+  }
+
+  /**
    * Return a {@link File} object for a file to be emitted into the output
    * directory.
    */
@@ -959,16 +656,37 @@
         + depGraphName);
   }
 
+  /**
+   * Returns whether a split point is initial or not.
+   * 
+   * @param splitPoint
+   * @returns true of the split point is initial, false otherwise
+   */
   private boolean isInitialSplitPoint(int splitPoint) {
     return globalInformation.getSplitPointInitialLoadSequence().contains(
         splitPoint);
   }
 
+  /**
+   * Makes a file name for a leftovers status file.
+   * 
+   * @param className
+   * @return the file name of the leftovers status file
+   */
   private String leftoversStatusFileName(String className) {
     return "leftoverStatus-" + filename(className) + "-" + getPermutationId()
         + ".html";
   }
 
+  /**
+   * Produces an HTML file that breaks down by code type.
+   * 
+   * @param breakdown
+   * @param nameToCodeColl
+   * @param nameToLitColl
+   * @return the name of the produced file
+   * @throws IOException
+   */
   private String makeCodeTypeHtml(SizeBreakdown breakdown,
       Map<String, CodeCollection> nameToCodeColl,
       Map<String, LiteralsCollection> nameToLitColl) throws IOException {
@@ -998,7 +716,7 @@
     outFile.println("<html>");
     outFile.println("<head>");
     outFile.println("<meta http-equiv=\"content-type\" content=\"text/html;charset=ISO-8859-1\">");
-    outFile.println("<link rel=\"stylesheet\" href=\"common.css\" media=\"screen\">");
+    outFile.println("<link rel=\"stylesheet\" href=\"soycStyling.css\" media=\"screen\">");
     outFile.println("</head>");
 
     outFile.println("<body>");
@@ -1026,13 +744,12 @@
 
       outFile.println("<tr>");
       outFile.println("<td class=\"barlabel\">" + size + "</td>");
-      outFile.println("<td class=\"barlabel\">" + perc + "%</td>");
+      outFile.println("<td class=\"barlabel\">" + formatNumber(perc) + "%</td>");
       outFile.println("<td class=\"barlabel\"><a href=\"" + drillDownFileName
           + "\" target=\"_top\">" + codeType + "</a></td>");
       outFile.println("<td class=\"box\">");
-      outFile.println("<div style=\"width:"
-          + ratio
-          + "%;\" class=\"lb\"><div class=\"rb\"><div class=\"bb\"><div class=\"blc\"><div class=\"brc\"><div class=\"tb\"><div class=\"tlc\"><div class=\"trc\"><div class=\"content\"></div></div></div></div></div></div></div></div>");
+      outFile.println("<div style=\"width:" + ratio
+          + "%;\" class=\"sizebar\"/>");
       outFile.println("</td>");
       outFile.println("</tr>");
     }
@@ -1063,13 +780,13 @@
       float ratio = (size / maxSize) * 79;
       float perc = (size / sumSize) * 100;
 
-      if (ratio < 5) {
-        ratio = 5;
+      if (ratio < 1) {
+        ratio = 1;
       }
 
       outFile.println("<tr>");
       outFile.println("<td class=\"barlabel\">" + size + "</td>");
-      outFile.println("<td class=\"barlabel\">" + perc + "%</td>");
+      outFile.println("<td class=\"barlabel\">" + formatNumber(perc) + "%</td>");
       outFile.println("<td class=\"barlabel\"><a href=\"" + drillDownFileName
           + "\" target=\"_top\">" + literal + "</a></td>");
       outFile.println("<td class=\"box\">");
@@ -1088,6 +805,13 @@
     return outFileName;
   }
 
+  /**
+   * Produces an HTML file that displays dependencies.
+   * 
+   * @param name of dependency graph
+   * @param map of dependencies
+   * @throws IOException
+   */
   private void makeDependenciesHtml(String depGraphName,
       Map<String, String> dependencies) throws IOException {
     String depGraphDescription = inferDepGraphDescription(depGraphName);
@@ -1127,13 +851,13 @@
       if (curClassName.compareTo(className) != 0) {
         name = className;
         curClassName = className;
-        outFile.println("<h3>Class: " + curClassName + "</h3>");
+        outFile.println("<h3><a name=\"" + name + "\"/>Class: " + curClassName + "</h3>");
       }
 
       outFile.println("<div class='main'>");
-      outFile.println("<a class='toggle' onclick='toggle.call(this)' name="
-          + name + "><span class='calledBy'> Call stack: </span>" + name
-          + "</a>");
+      outFile.println("<a class='toggle' onclick='toggle.call(this)'> " +
+          "<span class='calledBy'> Call stack: </span>"
+          + name + "</a>");
       outFile.println("<ul>");
 
       String depMethod = dependencies.get(method);
@@ -1151,6 +875,12 @@
     outFile.close();
   }
 
+  /**
+   * Produces an HTML file for leftovers status.
+   * 
+   * @param className
+   * @throws IOException
+   */
   private void makeLeftoversStatusPage(String className) throws IOException {
     String packageName = globalInformation.getClassToPackage().get(className);
     PrintWriter out = new PrintWriter(
@@ -1170,6 +900,13 @@
     out.close();
   }
 
+  /**
+   * Produces an HTML file that shows information about a package.
+   * 
+   * @param breakdown
+   * @return the name of the HTML file
+   * @throws IOException
+   */
   private String makePackageHtml(SizeBreakdown breakdown) throws IOException {
     String outFileName = breakdown.getId() + "-" + getPermutationId() + "_"
         + "packageBreakdown.html";
@@ -1193,7 +930,7 @@
     outFile.println("<html>");
     outFile.println("<head>");
     outFile.println("<meta http-equiv=\"content-type\" content=\"text/html;charset=ISO-8859-1\">");
-    outFile.println("<link rel=\"stylesheet\" href=\"common.css\" media=\"screen\">");
+    outFile.println("<link rel=\"stylesheet\" href=\"soycStyling.css\" media=\"screen\">");
     outFile.println("</head>");
     outFile.println("<body>");
     outFile.println("<table style='width:100%'>");
@@ -1211,20 +948,20 @@
           packageName, getPermutationId());
 
       float ratio = (size / maxSize) * 79;
-      if (ratio < 5) {
-        ratio = 5;
+      if (ratio < 1) {
+        ratio = 1;
       }
       float perc = (size / sumSize) * 100;
 
       outFile.println("<tr>");
       outFile.println("<td class='barlabel'>" + size + "</td>");
-      outFile.println("<td class='barlabel'>" + perc + "</td>");
+      outFile.println("<td class='barlabel'>" + formatNumber(perc) + "%</td>");
       outFile.println("<td class='barlabel'><a href=\"" + drillDownFileName
           + "\" target=\"_top\">" + packageName + "</a></td>");
       outFile.println("<td class=\"box\">");
       outFile.println("<div style=\"width:"
           + ratio
-          + "%;\" class=\"lb\"><div class=\"rb\"><div class=\"bb\"><div class=\"blc\"><div class=\"brc\"><div class=\"tb\"><div class=\"tlc\"><div class=\"trc\"><div class=\"content\"></div></div></div></div></div></div></div></div>");
+          + "%;\" class=\"sizebar\"/>");
       outFile.println("</td>");
       outFile.println("</tr>");
     }
@@ -1242,7 +979,7 @@
     PrintWriter out = new PrintWriter(
         getOutFile(splitStatusFileName(className)));
 
-    addStandardHtmlProlog(out, "Split point status for " + className, null);
+    addStandardHtmlProlog(out, "Split point status for " + className, "");
 
     out.println("<center>");
     out.println("<table border=\"1\" width=\"80%\" style=\"font-size: 11pt;\" bgcolor=\"white\">");
diff --git a/dev/core/src/com/google/gwt/soyc/StaticResources.java b/dev/core/src/com/google/gwt/soyc/StaticResources.java
index 5e63e6c..3b9f32a 100644
--- a/dev/core/src/com/google/gwt/soyc/StaticResources.java
+++ b/dev/core/src/com/google/gwt/soyc/StaticResources.java
@@ -34,12 +34,7 @@
    * cannot be iterated over.
    */
   private static String[] resourceNames = new String[] {
-      "classLevel.css", "common.css", "roundedCorners.css", "images/1bl.gif",
-      "images/1br.gif", "images/1tl.gif", "images/1tr.gif", "images/bb.gif",
-      "images/blc.gif", "images/brc.gif", "images/l.gif", "images/r.gif",
-      "images/roundedbox_lo.gif", "images/roundedbox_lu.gif",
-      "images/roundedbox_ro.gif", "images/roundedbox_ru.gif", "images/tb.gif",
-      "images/tlc.gif", "images/trc.gif",};
+      "soycStyling.css",};
 
   public static void emit(OutputDirectory outDir) throws IOException {
     String prefix = StaticResources.class.getPackage().getName().replace('.',
diff --git a/dev/core/src/com/google/gwt/soyc/resources/classLevel.css b/dev/core/src/com/google/gwt/soyc/resources/classLevel.css
deleted file mode 100644
index 5c70a24..0000000
--- a/dev/core/src/com/google/gwt/soyc/resources/classLevel.css
+++ /dev/null
@@ -1,162 +0,0 @@
-/* \*/
-* html #tlc, * html #trc {height: 1%;}
-/* */
-
-#tlc, #trc { zoom: 1 }
-
-h2 {background-color: transparent}
-p {background-color: fuchsia}
-    A:link {text-decoration: none; color: blue;}
-A:visited {text-decoration: none; color: blue;}
-A:active {text-decoration: none}
-A:hover {text-decoration: underline; color: maroon;}
-
-body
-	{
-	margin: 0;
-	padding: 0;
-    background-color: #728FCE;
-	font-size: 100.01%;
-	text-align: center; 
-	}
-
-.box
-	{
-	position: absolute;
-	margin-left: 0;
-	margin-right: 0;
-    margin-top: 0;
-    margin-bottom: 0;
-	text-align: left;
-	<!--background-color: #eeeeee;-->
-   
-    z-index: 1;
-    opacity:0.7; 
-	}
-
-.box-right
-	{
-	position: absolute;
-	margin-left: 0;
-	margin-right: 0;
-    margin-top: 0;
-    margin-bottom: 0;
-	text-align: right;
-	<!--background-color: #eeeeee;-->
-    z-index: 2;
-    opacity:0.7; 
-	}
-
- 	
-#content
-	{
-    height:25px;
-	}
-
-
-
-.barlabel {
-    
-    position: absolute;
-    font-size: 14px;
-    text-color: maroon;
-    z-index: 2;
-    <!--font-weight: bold;-->
-    text-align: left;
-    
-
-}
-
-#content h1
-	{
-	color:#0354c2;
-	font-weight: bold;
-	font-size: 1.2em;
-	font-family: helvetica, geneva, arial, sans-serif;
-	}
-		
-#content p
-	{
-	color:#3b3b3b;
-	font-size: 1em;
-	line-height: 1.3em;
-	font-family: arial, helvetica, sans-serif;
-	}
-
-
-		
-/* ---=== border code follows ===--- */
-/*
-	tlc = top left corner
-	trc = top right corner
-	blc = bottom left corner
-	brc = bottom right corner
-	lb = left border
-	rb = right border
-	tb = top border
-	bb = bottom border 
-*/
-
-#tlc, #trc, #blc, #brc
-	{
-	background-color: transparent;
-	background-repeat: no-repeat;
-	}
-
-#tlc
-	{
-	background-image:url(images/tlc.gif);
-	background-position: 0% 0%;
-	}
-
-#trc
-	{
-	background-image:url(images/trc.gif);
-	background-position: 100% 0%;
-	}
-	
-#blc
-	{
-	background-image:url(images/blc.gif);
-	background-position: 0% 100%;
-	}
-
-#brc
-	{
-	background-image:url(images/brc.gif);
-	background-position: 100% 100%;
-	}
-
-#tb, #bb
-	{
-	 background-color: transparent;
-	background-repeat: repeat-x;
-	}
-			
-#tb
-	{
-	background-image:url(images/tb.gif);
-	background-position: 0% 0%;
-	}
-
-#bb
-	{
-	background-image:url(images/bb.gif);
-	background-position: 50% 100%;
-	}
-	
-#rb
-	{
-	background-image:url(images/r.gif);
-	background-position: 100% 0%;
-	background-repeat: repeat-y;
-	}
-
-#lb
-	{
-	background-color: #eeeeee;
-	background-image:url(images/l.gif);
-	background-position: 0% 100%;
-	background-repeat: repeat-y;
-	}
-			
diff --git a/dev/core/src/com/google/gwt/soyc/resources/common.css b/dev/core/src/com/google/gwt/soyc/resources/common.css
deleted file mode 100644
index fa741df..0000000
--- a/dev/core/src/com/google/gwt/soyc/resources/common.css
+++ /dev/null
@@ -1,101 +0,0 @@
-body {
-  background-color: white;
-}
-
-body, table {
-  font-family: Arial, sans-serif;
-  font-size: small;
-}
-
-h2 {background-color: transparent}
-p {background-color: fuchsia}
-a:link {text-decoration: none; color: blue;}
-a:visited {text-decoration: none; color: blue;}
-a:active {text-decoration: none}
-a:hover {text-decoration: underline; color: maroon;}
-
-.box {
-  margin-left: 0;
-  margin-right: 0;
-  margin-top: 0;
-  margin-bottom: 0;
-  text-align: left;
-}
-
-.content {
-  height: 25px;
-}
-
-.barlabel {
-    font-size: 14px;
-    text-color: maroon;
-    text-align: left;
-    white-space: nowrap;
-}
-
-.content h1 {
-  color:#0354c2;
-  font-weight: bold;
-  font-size: 1.2em;
-  font-family: helvetica, geneva, arial, sans-serif;
-}
-
-.content p {
-  color:#3b3b3b;
-  font-size: 1em;
-  line-height: 1.3em;
-  font-family: arial, helvetica, sans-serif;
-}
-
-.tlc, .trc, .blc, .brc {
-  background-color: transparent;
-  background-repeat: no-repeat;
-}
-
-.tlc {
-  background-image:url(images/tlc.gif);
-  background-position: 0% 0%;
-}
-
-.trc {
-  background-image:url(images/trc.gif);
-  background-position: 100% 0%;
-}
-
-.blc {
-  background-image:url(images/blc.gif);
-  background-position: 0% 100%;
-}
-
-.brc {
-  background-image:url(images/brc.gif);
-  background-position: 100% 100%;
-}
-
-.tb, .bb {
-   background-color: transparent;
-  background-repeat: repeat-x;
-}
-
-.tb {
-  background-image:url(images/tb.gif);
-  background-position: 0% 0%;
-}
-
-.bb {
-  background-image:url(images/bb.gif);
-  background-position: 50% 100%;
-}
-
-.rb {
-  background-image:url(images/r.gif);
-  background-position: 100% 0%;
-  background-repeat: repeat-y;
-}
-
-.lb {
-  background-color: #eeeeee;
-  background-image:url(images/l.gif);
-  background-position: 0% 100%;
-  background-repeat: repeat-y;
-}
diff --git a/dev/core/src/com/google/gwt/soyc/resources/roundedCorners.css b/dev/core/src/com/google/gwt/soyc/resources/roundedCorners.css
deleted file mode 100644
index d8514ae..0000000
--- a/dev/core/src/com/google/gwt/soyc/resources/roundedCorners.css
+++ /dev/null
@@ -1,143 +0,0 @@
-/* \*/
-* html #tlc, * html #trc {height: 1%;}
-/* */
-
-#tlc, #trc { zoom: 1 }
-
-h2 {background-color: transparent}
-p {background-color: fuchsia}
-    A:link {text-decoration: none; color: blue;}
-A:visited {text-decoration: none; color: blue;}
-A:active {text-decoration: none}
-A:hover {text-decoration: underline; color: maroon;}
-
-body
-	{
-	margin: 0;
-	padding: 0;
-    background-color: white;
-	font-size: 100.01%;
-	text-align: center; 
-	}
-
-#box
-	{
-	position: absolute;
-	margin-left: 0;
-	margin-right: 0;
-    margin-top: 0;
-    margin-bottom: 0;
-	text-align: left;
-    z-index: 1;
-    opacity:0.7; 
-	}
- 	
-#content
-	{
-    height:25px;
-	}
-
-.barlabel {
-    
-    position: absolute;
-    font-size: 14px;
-    text-color: maroon;
-    z-index: 2;
-    text-align: left;
-    
-
-}
-
-#content h1
-	{
-	color:#0354c2;
-	font-weight: bold;
-	font-size: 1.2em;
-	font-family: helvetica, geneva, arial, sans-serif;
-	}
-		
-#content p
-	{
-	color:#3b3b3b;
-	font-size: 1em;
-	line-height: 1.3em;
-	font-family: arial, helvetica, sans-serif;
-	}
-
-
-		
-/* ---=== border code follows ===--- */
-/*
-	tlc = top left corner
-	trc = top right corner
-	blc = bottom left corner
-	brc = bottom right corner
-	lb = left border
-	rb = right border
-	tb = top border
-	bb = bottom border 
-*/
-
-#tlc, #trc, #blc, #brc
-	{
-	background-color: transparent;
-	background-repeat: no-repeat;
-	}
-
-#tlc
-	{
-	background-image:url(images/tlc.gif);
-	background-position: 0% 0%;
-	}
-
-#trc
-	{
-	background-image:url(images/trc.gif);
-	background-position: 100% 0%;
-	}
-	
-#blc
-	{
-	background-image:url(images/blc.gif);
-	background-position: 0% 100%;
-	}
-
-#brc
-	{
-	background-image:url(images/brc.gif);
-	background-position: 100% 100%;
-	}
-
-#tb, #bb
-	{
-	 background-color: transparent;
-	background-repeat: repeat-x;
-	}
-			
-#tb
-	{
-	background-image:url(images/tb.gif);
-	background-position: 0% 0%;
-	}
-
-#bb
-	{
-	background-image:url(images/bb.gif);
-	background-position: 50% 100%;
-	}
-	
-#rb
-	{
-	background-image:url(images/r.gif);
-	background-position: 100% 0%;
-	background-repeat: repeat-y;
-	}
-
-#lb
-	{
-	background-color: #eeeeee;
-	background-image:url(images/l.gif);
-	background-position: 0% 100%;
-	background-repeat: repeat-y;
-	}
-			
diff --git a/dev/core/src/com/google/gwt/soyc/resources/soycStyling.css b/dev/core/src/com/google/gwt/soyc/resources/soycStyling.css
new file mode 100644
index 0000000..6c0a0b5
--- /dev/null
+++ b/dev/core/src/com/google/gwt/soyc/resources/soycStyling.css
@@ -0,0 +1,105 @@
+body {
+  font-family: arial, sans-serif;
+}
+
+#header {
+  margin-left: 8px;
+  margin-top: 8px;
+}
+
+#logo {
+  vertical-align: middle;
+  width: 50px;
+  height: 50px;
+}
+
+#topBar {
+  width:100%;
+  background-color: #E5ECF9;
+  padding: 4px;
+  margin-bottom: 1em;
+}
+
+.groupHeader {
+  text-align: center;
+}
+
+.colHeader {
+  text-align: left;
+}
+
+.kColHeader {
+  text-align: right;
+}
+
+.sortable {
+  padding-right: 16px;
+  background-image: url();
+}
+
+.md5 {
+  font-family: courier;
+}
+
+.k {
+  text-align: right;
+  font-family: courier;
+}
+
+.na {
+  text-align: center;
+}
+
+.box {
+  margin-left: 0;
+  margin-right: 0;
+  margin-top: 0;
+  margin-bottom: 0;
+  text-align: left;
+}
+
+.content {
+  height: 25px;
+}
+
+.barlabel {
+    font-size: 14px;
+    text-color: maroon;
+    text-align: left;
+    white-space: nowrap;
+}
+
+.content h1 {
+  color:#0354c2;
+  font-weight: bold;
+  font-size: 1.2em;
+  font-family: helvetica, geneva, arial, sans-serif;
+}
+
+.content p {
+  color:#3b3b3b;
+  font-size: 1em;
+  line-height: 1.3em;
+  font-family: arial, helvetica, sans-serif;
+}
+
+.frame {
+  width: 100%; height: 100%;
+  border: 0px;
+}
+
+.packages {
+ left:0; right: 0;
+ top:0; bottom: 50%;
+}
+
+.codeType {
+  left:0; right: 0;
+  top:50%; bottom: 0;
+}
+
+.sizebar {
+  width:100%;
+  height: 0.5em;
+  background-color: #4684ee;
+}