Adds autoscoll on/off option for log output in Gwt Hosted mode window.

Fixes issues: 5224

Change-Id: I2dfa2b70d264804c4b0a52811923ca09fd4d5969
Review-Link: https://gwt-review.googlesource.com/#/c/1220/

Review by: skybrian@google.com

git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@11381 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/dev/shell/log/SwingLoggerPanel.java b/dev/core/src/com/google/gwt/dev/shell/log/SwingLoggerPanel.java
index 01c886a..9bac9bd 100644
--- a/dev/core/src/com/google/gwt/dev/shell/log/SwingLoggerPanel.java
+++ b/dev/core/src/com/google/gwt/dev/shell/log/SwingLoggerPanel.java
@@ -50,6 +50,7 @@
 import javax.swing.AbstractAction;
 import javax.swing.BorderFactory;
 import javax.swing.JButton;
+import javax.swing.JCheckBox;
 import javax.swing.JComboBox;
 import javax.swing.JComponent;
 import javax.swing.JEditorPane;
@@ -65,10 +66,12 @@
 import javax.swing.PopupFactory;
 import javax.swing.UIManager;
 import javax.swing.event.HyperlinkEvent;
+import javax.swing.event.HyperlinkEvent.EventType;
 import javax.swing.event.HyperlinkListener;
+import javax.swing.event.TreeModelEvent;
+import javax.swing.event.TreeModelListener;
 import javax.swing.event.TreeSelectionEvent;
 import javax.swing.event.TreeSelectionListener;
-import javax.swing.event.HyperlinkEvent.EventType;
 import javax.swing.text.html.HTMLDocument;
 import javax.swing.tree.DefaultMutableTreeNode;
 import javax.swing.tree.DefaultTreeCellRenderer;
@@ -211,9 +214,6 @@
       searchField.requestFocusInWindow();
     }
 
-    /**
-     * 
-     */
     private void updateSearchResult() {
       int n = matches.size();
       if (n == 0) {
@@ -260,7 +260,7 @@
 
   String regexFilter;
 
-  final JTree tree;
+  private final JTree tree;
 
   DefaultTreeModel treeModel;
 
@@ -286,6 +286,8 @@
   
   private JScrollPane treeView;
 
+  private JCheckBox autoScroll;
+
   /**
    * Create a Swing-based logger panel, with a tree section and a detail
    * section.
@@ -317,6 +319,9 @@
       }
     });
     logButtons.add(collapseButton);
+    autoScroll = new JCheckBox("Auto-scroll", true);
+    autoScroll.setMnemonic(KeyEvent.VK_U);
+    logButtons.add(autoScroll);
     topPanel.add(logButtons, BorderLayout.CENTER);
     // TODO(jat): temporarily avoid showing parts that aren't implemented.
     if (false) {
@@ -369,6 +374,16 @@
     add(topPanel, BorderLayout.NORTH);
     root = new DefaultMutableTreeNode();
     treeModel = new DefaultTreeModel(root);
+    treeModel.addTreeModelListener(new TreeModelListener() {
+      @Override public void treeNodesInserted(TreeModelEvent e) {
+        for (Object treeNode : e.getChildren()) {
+          onTreeNodeAdded((DefaultMutableTreeNode) treeNode);
+        }
+      }
+      @Override public void treeStructureChanged(TreeModelEvent e) { }
+      @Override public void treeNodesRemoved(TreeModelEvent e) { }
+      @Override public void treeNodesChanged(TreeModelEvent e) { }
+    });
     tree = new JTree(treeModel);
     tree.setRootVisible(false);
     tree.setEditable(false);
@@ -516,13 +531,6 @@
     }
   }
 
-  /**
-   * @param node
-   */
-  public void notifyChange(DefaultMutableTreeNode node) {
-    treeModel.nodeChanged(node);
-  }
-
   @Override
   public void removeAll() {
     tree.removeAll();
@@ -716,4 +724,18 @@
       buf.append('\n');
     }
   }
+
+  private void onTreeNodeAdded(DefaultMutableTreeNode treeNode) {
+    TreePath path = new TreePath(treeNode.getPath());
+    if (autoScroll.isSelected()) {
+      tree.scrollPathToVisible(path); // internally will also call makeVisible
+    } else {
+      Object userObject = treeNode.getUserObject();
+      if (userObject instanceof LogEvent) {
+        if (((LogEvent) userObject).type.needsAttention()) {
+          tree.makeVisible(path);
+        }
+      }
+    }
+  }
 }
diff --git a/dev/core/src/com/google/gwt/dev/shell/log/SwingTreeLogger.java b/dev/core/src/com/google/gwt/dev/shell/log/SwingTreeLogger.java
index ac5d464..67d4804 100644
--- a/dev/core/src/com/google/gwt/dev/shell/log/SwingTreeLogger.java
+++ b/dev/core/src/com/google/gwt/dev/shell/log/SwingTreeLogger.java
@@ -30,7 +30,6 @@
 import javax.swing.Icon;
 import javax.swing.JLabel;
 import javax.swing.tree.DefaultMutableTreeNode;
-import javax.swing.tree.TreePath;
 
 /**
  * Tree logger built on an Swing tree item.
@@ -355,9 +354,6 @@
         }
         int insertIndex = findInsertionPoint(parentNode, idx);
         panel.treeModel.insertNodeInto(node, parentNode, insertIndex);
-        if (logEvent.type.needsAttention()) {
-          panel.tree.makeVisible(new TreePath(node.getPath()));
-        }
         if (parentNode == panel.treeModel.getRoot()
             && parentNode.getChildCount() == 1) {
           panel.treeModel.reload();