- now displaying dependencies at the class level
- improved table layout



git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@4230 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/tools/soyc-vis/src/com/google/gwt/soyc/GlobalInformation.java b/tools/soyc-vis/src/com/google/gwt/soyc/GlobalInformation.java
index 40b377c..d7d23f5 100644
--- a/tools/soyc-vis/src/com/google/gwt/soyc/GlobalInformation.java
+++ b/tools/soyc-vis/src/com/google/gwt/soyc/GlobalInformation.java
@@ -33,7 +33,7 @@
   public static HashMap<String, String> classToPackage = new HashMap<String, String>();
   
   //TODO(kprobst): not currently used, but will be for dependencies
-  //public static HashMap<String, HashSet<String>> classToWhatItDependsOn = new HashMap<String, HashSet<String>>();
+  public static HashMap<String, HashSet<String>> classToWhatItDependsOn = new HashMap<String, HashSet<String>>();
   
   public static HashMap<String, Integer> classToSize = new HashMap<String, Integer>();
   public static HashMap<String, Float> classToPartialSize = new HashMap<String, Float>();
diff --git a/tools/soyc-vis/src/com/google/gwt/soyc/MakeTopLevelHtmlForPerm.java b/tools/soyc-vis/src/com/google/gwt/soyc/MakeTopLevelHtmlForPerm.java
index d538be3..459387e 100644
--- a/tools/soyc-vis/src/com/google/gwt/soyc/MakeTopLevelHtmlForPerm.java
+++ b/tools/soyc-vis/src/com/google/gwt/soyc/MakeTopLevelHtmlForPerm.java
@@ -510,7 +510,7 @@
       float maxSize = 0f;
       
       //TODO(kprobst): not currently used, but will be for dependencies
-      //int maxDepCount = 0;
+      int maxDepCount = 1;
 
       for (String className : GlobalInformation.packageToClasses.get(packageName)){
         
@@ -523,10 +523,10 @@
         }
           
         //TODO(kprobst): not currently used, but will be for dependencies
-        /*int depCount = 0;
+        int depCount = 0;
         if (GlobalInformation.classToWhatItDependsOn.containsKey(className)){
           depCount = GlobalInformation.classToWhatItDependsOn.get(className).size();
-        }*/
+        }
         
         if (curSize != 0f){
           
@@ -535,9 +535,9 @@
             maxSize = curSize;
           }
           //TODO(kprobst): not currently used, but will be for dependencies
-          /*if (depCount > maxDepCount){
+          if (depCount > maxDepCount){
             maxDepCount = depCount;
-          }*/
+          }
         }
       }
       
@@ -569,23 +569,23 @@
         String className = sortedClasses.get(size);
         
         //TODO(kprobst): switch out the commented/uncommented lines below when showing dependencies
-        //float ratio = (size / maxSize) * 45;
-        float ratio = (size / maxSize) * 85;
+        float ratio = (size / maxSize) * 45;
+        //float ratio = (size / maxSize) * 85;
          
         if (ratio < 3){
           ratio = 3;
         }
         
         //TODO(kprobst): not currently used, but will be for dependencies
-/*        // get the dependency count
+       // get the dependency count
         int depCount = 0;
         if (GlobalInformation.classToWhatItDependsOn.containsKey(className)){
           depCount = GlobalInformation.classToWhatItDependsOn.get(className).size();
         }
-        float depRatio = (depCount / maxDepCount) * 25;
-        if (depRatio < 3){
+        float depRatio = ((float)depCount / (float)maxDepCount) * 45f;
+        if (depRatio < 3.0){
           depRatio = 3;
-        }*/
+        }
   
         outFile.println("<div class=\"box\" style=\"width:" + ratio + "%; top: " + yOffset + "px; left: 60px;\">");
         outFile.println("<div id=\"lb\">");
@@ -601,7 +601,7 @@
         
         //TODO(kprobst): not currently used, but will be for dependencies
         // place holder for mock-up of dependency display  
-/*        outFile.println("<div class=\"box-right\" style=\"width:" + depRatio + "%; top: " + yOffset + "px; left: 50%\">");
+        outFile.println("<div class=\"box-right\" style=\"width:" + depRatio + "%; top: " + yOffset + "px; left: 50%\">");
         outFile.println("<div id=\"lb\">");
         outFile.println("<div id=\"rb\">");
         outFile.println("<div id=\"bb\"><div id=\"blc\"><div id=\"brc\">");
@@ -611,22 +611,13 @@
         outFile.println("</div></div></div></div>");
         outFile.println("</div></div></div></div>");
         outFile.println("</div>");
-        
-        
-        outFile.println("<div class=\"box-right\" style=\"width:10%; top: " + yOffset + "px; left: 75%\">");
-        outFile.println("<div id=\"lb\">");
-        outFile.println("<div id=\"rb\">");
-        outFile.println("<div id=\"bb\"><div id=\"blc\"><div id=\"brc\">");
-        outFile.println("<div id=\"tb\"><div id=\"tlc\"><div id=\"trc\">");
-        outFile.println("<div id=\"content\">");
-        outFile.println("</div>");
-        outFile.println("</div></div></div></div>");
-        outFile.println("</div></div></div></div>");
-        outFile.println("</div>"); */
-        
+              
         int yOffsetText = yOffset+8;
         outFile.printf("<div class=\"barlabel\" style=\"top:" + yOffsetText + "px; left:5px;\">%.1f</div>\n", size);
         outFile.println("<div class=\"barlabel\" style=\"top:" + yOffsetText + "px; left:70px;\">"+className+"</div>");
+        //TODO(kprobst) make this a link
+        String drillDownFileName = className + "Deps.html";
+        outFile.println("<div class=\"barlabel\" style=\"top:" + yOffsetText + "px; left:50%;\"><a href=\"" + drillDownFileName + "\" target=\"_top\">Dependencies: " + depCount + "</a></div>");
         
         yOffset = yOffset + 25;
   
@@ -723,7 +714,7 @@
         
         int yOffsetText = yOffset+8;
          outFile.printf("<div class=\"barlabel\" style=\"top:" + yOffsetText + "px; left:5px;\">%.1f</div>\n", size);
-        outFile.println("<div class=\"barlabel\" style=\"top:" + yOffsetText + "px; left:70px;\">"+className+"</div>");
+         outFile.println("<div class=\"barlabel\" style=\"top:" + yOffsetText + "px; left:70px;\">"+className+"</div>");
         
         yOffset = yOffset + 25;
   
@@ -737,6 +728,112 @@
   }
 
 
+  public static void makeLiteralsClassesTableHtmls(TreeMap<String, LiteralsCollection> nameToLitColl) throws IOException{
+
+    for (String literalType : nameToLitColl.keySet()){
+      
+      String outFileName = literalType + "Lits.html";
+      final PrintWriter outFile = new PrintWriter(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>");
+      outFile.println("</center>");
+      outFile.println("<hr>");
+      
+      outFile.println("<center>");
+      outFile.println("<table border=\"1\" width=\"80%\" style=\"font-size: 11pt;\" bgcolor=\"white\">");
+   
+      for (String literal : nameToLitColl.get(literalType).literalToLocations.keySet()){
+  
+        if (literal.trim().compareTo("") == 0){
+          literal = "[whitespace only string]";
+        }
+        
+
+        String newLiteral = "";
+        if(literal.length() > 80){
+          int i;
+          for (i = 80; i < literal.length(); i=i+80){
+            String part1 = literal.substring(i-80, i);
+            newLiteral = newLiteral + part1 + " "; 
+          }
+          if (i-80 > 0){
+            newLiteral = newLiteral + literal.substring(i-80);
+          }
+        }
+        else{
+          newLiteral = literal;
+        }
+        
+        String escliteral = escapeXml(newLiteral);
+
+        outFile.println("<tr>");
+        outFile.println("<td width=\"40%\">" + escliteral + "</td>");
+        
+
+        int ct = 0;
+        for (String location : nameToLitColl.get(literalType).literalToLocations.get(literal)){
+          
+          if (ct > 0){
+            outFile.println("<tr>");  
+            outFile.println("<td width=\"40%\"> </td>");          
+          }
+          
+          String newLocation = "";
+          if(location.length() > 80){
+            int i;
+            for (i = 80; i < location.length(); i=i+80){
+              String part1 = location.substring(i-80, i);
+              newLocation = newLocation + part1 + " "; 
+            }
+            if (i-80 > 0){
+              newLocation = newLocation + location.substring(i-80);
+            }
+          }
+          else{
+            newLocation = location;
+          }
+          
+          
+          outFile.println("<td width=\"40%\">" + newLocation + "</td>");
+
+          if (ct > 0){
+            outFile.println("</tr>");
+          }
+          ct++;
+          
+        }
+
+        
+        outFile.println("</tr>");
+        
+      }
+
+      outFile.println("</table>");
+      outFile.println("<center>");
+
+      
+      outFile.println("</div>");
+      outFile.println("</body>");
+      outFile.println("</html>");
+      outFile.close();
+     }
+  }
 
   public static void makeLiteralsClassesHtmls(TreeMap<String, LiteralsCollection> nameToLitColl) throws IOException{
     
@@ -1033,6 +1130,178 @@
   }
   
   
+  
+  
+  
+
+  public static void makeStringLiteralsClassesTableHtmls(TreeMap<String, LiteralsCollection> nameToLitColl) throws IOException{
+
+    
+    for (String literalType : nameToLitColl.get("string").stringTypeToSize.keySet()){
+ 
+      
+      String outFileName = literalType + "Strings.html";
+      final PrintWriter outFile = new PrintWriter(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>");
+      outFile.println("</center>");
+      outFile.println("<hr>");
+      
+      outFile.println("<center>");      
+      outFile.println("<table border=\"1\" width=\"80%\" style=\"font-size: 11pt;\" bgcolor=\"white\">");
+      
+   
+      
+      for (String literal : nameToLitColl.get("string").stringLiteralToType.keySet()){
+        
+        if (nameToLitColl.get("string").stringLiteralToType.get(literal).compareTo(literalType) == 0){
+ 
+            if (literal.trim().compareTo("") == 0){
+            literal = "[whitespace only string]";
+          }
+          
+  
+          String newLiteral = "";
+          if(literal.length() > 80){
+            int i;
+            for (i = 80; i < literal.length(); i=i+80){
+              String part1 = literal.substring(i-80, i);
+              newLiteral = newLiteral + part1 + " "; 
+            }
+            if (i-80 > 0){
+              newLiteral = newLiteral + literal.substring(i-80);
+            }
+          }
+          else{
+            newLiteral = literal;
+          }
+          
+          String escliteral = escapeXml(newLiteral);
+  
+          outFile.println("<tr>");
+          outFile.println("<td width=\"40%\">" + escliteral + "</td>");
+          
+  
+          int ct = 0;
+
+          for (String location : nameToLitColl.get("string").literalToLocations.get(literal)){
+            
+            if (ct > 0){
+              outFile.println("<tr>");  
+              outFile.println("<td width=\"40%\"> </td>");          
+            }
+            
+            String newLocation = "";
+            if(location.length() > 80){
+              int i;
+              for (i = 80; i < location.length(); i=i+80){
+                String part1 = location.substring(i-80, i);
+                newLocation = newLocation + part1 + " "; 
+              }
+              if (i-80 > 0){
+                newLocation = newLocation + location.substring(i-80);
+              }
+            }
+            else{
+              newLocation = location;
+            }
+            
+            
+            outFile.println("<td width=\"40%\">" + newLocation + "</td>");
+  
+            if (ct > 0){
+              outFile.println("</tr>");
+            }
+            ct++;
+            
+          }
+  
+          
+          outFile.println("</tr>");
+          
+        }
+  
+        outFile.println("</table>");
+        outFile.println("<center>");
+  
+        
+        outFile.println("</div>");
+        outFile.println("</body>");
+        outFile.println("</html>");
+        outFile.close();
+       }
+    }
+  }
+
+  
+
+
+  public static void makeDependenciesTableHtmls() throws IOException{
+
+    for (String className : GlobalInformation.classToWhatItDependsOn.keySet()){
+          
+      String outFileName = className + "Deps.html";
+      final PrintWriter outFile = new PrintWriter(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>Classes that \"" + className + "\" depends on</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>Classes that \"" + className + "\" depends on</h2>");
+      outFile.println("</center>");
+      outFile.println("<hr>");
+      
+      outFile.println("<center>");
+      outFile.println("<table border=\"1\" width=\"80%\" style=\"font-size: 11pt;\" bgcolor=\"white\">");
+      
+      for (String depClassName : GlobalInformation.classToWhatItDependsOn.get(className)){
+        
+          outFile.println("<tr>");
+          outFile.println("<td width=\"80%\">" + depClassName + "</td>");
+          outFile.println("</tr>");
+          
+      }
+  
+      outFile.println("</table>");
+      outFile.println("<center>");
+      
+      outFile.println("</div>");
+      outFile.println("</body>");
+      outFile.println("</html>");
+      outFile.close();
+    }
+  }
+
+  
+  
 
   public static String escapeXml(String unescaped) {
     String escaped = unescaped.replaceAll("\\&", "&amp;");
diff --git a/tools/soyc-vis/src/com/google/gwt/soyc/SoycDashboard.java b/tools/soyc-vis/src/com/google/gwt/soyc/SoycDashboard.java
index 3333352..bf6b94b 100644
--- a/tools/soyc-vis/src/com/google/gwt/soyc/SoycDashboard.java
+++ b/tools/soyc-vis/src/com/google/gwt/soyc/SoycDashboard.java
@@ -146,6 +146,7 @@
       String curClassId;
       String curPackage;
       Integer curFragment;
+      String curFunctionId = "";
       boolean specialCodeType = false;
       StringBuilder valueBuilder = new StringBuilder();
       int ct = 0;
@@ -182,11 +183,17 @@
           
           parseClass(nameToCodeColl, attributes);
         }
+
+        else if (strippedName.compareTo("function") == 0){
+          if (attributes.getValue("id") != null){
+            curFunctionId = attributes.getValue("id");
+          }
+        }
         
         //TODO(kprobst): not currently used, but will be for dependencies
-/*        else if (strippedName.compareTo("on") == 0){
+        else if (strippedName.compareTo("on") == 0){
           parseDependsOn(nameToCodeColl, attributes);
-        }*/
+        }
         
         else if (strippedName.compareTo("of") == 0){
           parseOverrides(nameToCodeColl, attributes);
@@ -619,27 +626,29 @@
        * parses the "depends on" portion of the XML file
        */
       //TODO(kprobst): not currently used, but will be for dependencies
-      /*private void parseDependsOn(final HashMap<String, CodeCollection> nameToCodeColl, Attributes attributes) {
-        if (attributes.getValue("idref") != null){
-          String curDepClassId = attributes.getValue("idref");
-
-          if (curDepClassId.contains(":")){
-            // strip everything after the :: (to get to class, even if it's a method)
-            curDepClassId = curDepClassId.replaceAll(":.*", "");
-          }
-          if (curDepClassId.contains("$")){
-            curDepClassId = curDepClassId.replaceAll("\\$.*", "");
-          }
-          
-          if (! GlobalInformation.classToWhatItDependsOn.containsKey(curClassId)){
-            HashSet<String> insertSet = new HashSet<String>();
-            GlobalInformation.classToWhatItDependsOn.put(curClassId, insertSet);
-          }
-          else{
-            GlobalInformation.classToWhatItDependsOn.get(curClassId).add(curDepClassId);
+      private void parseDependsOn(final HashMap<String, CodeCollection> nameToCodeColl, Attributes attributes) {
+        if (curFunctionId.compareTo("") == 0){
+          if (attributes.getValue("idref") != null){
+            String curDepClassId = attributes.getValue("idref");
+  
+            if (curDepClassId.contains(":")){
+              // strip everything after the :: (to get to class, even if it's a method)
+              curDepClassId = curDepClassId.replaceAll(":.*", "");
+            }
+ 
+            if (curDepClassId.contains(".")){
+              if (! GlobalInformation.classToWhatItDependsOn.containsKey(curClassId)){
+                HashSet<String> insertSet = new HashSet<String>();
+                insertSet.add(curDepClassId);
+                GlobalInformation.classToWhatItDependsOn.put(curClassId, insertSet);
+              }
+              else{
+                GlobalInformation.classToWhatItDependsOn.get(curClassId).add(curDepClassId);
+              }
+            }
           }
         }
-      }*/
+      }
     };
     return handler;
   }
@@ -698,13 +707,18 @@
 
     try {
       MakeTopLevelHtmlForPerm.makePackageClassesHtmls();
-      MakeTopLevelHtmlForPerm.makeCodeTypeClassesHtmls(nameToCodeColl); 
-      MakeTopLevelHtmlForPerm.makeLiteralsClassesHtmls(nameToLitColl);
-      MakeTopLevelHtmlForPerm.makeStringLiteralsClassesHtmls(nameToLitColl);
+      MakeTopLevelHtmlForPerm.makeCodeTypeClassesHtmls(nameToCodeColl);
+      MakeTopLevelHtmlForPerm.makeLiteralsClassesTableHtmls(nameToLitColl);
+      MakeTopLevelHtmlForPerm.makeStringLiteralsClassesTableHtmls(nameToLitColl);
       MakeTopLevelHtmlForPerm.makeFragmentClassesHtmls();
+      MakeTopLevelHtmlForPerm.makeDependenciesTableHtmls();
 
       //make the shell last so we can display aggregate information here
       MakeTopLevelHtmlForPerm.makeHTMLShell(nameToCodeColl, nameToLitColl);
+      
+      
+
+      
 
     } catch (IOException e) {
       throw new RuntimeException("Cannot open file. ", e);