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();