Author: [EMAIL PROTECTED]
Date: Sun Oct 5 12:59:21 2008
New Revision: 3712
Modified:
changes/jat/oophm-branch/dev/core/src/com/google/gwt/dev/ModulePanel.java
changes/jat/oophm-branch/dev/core/src/com/google/gwt/dev/util/log/SwingLoggerPanel.java
changes/jat/oophm-branch/dev/core/src/com/google/gwt/dev/util/log/SwingTreeLogger.java
changes/jat/oophm-branch/plugins/common/ByteOrder.h
Log:
Added tree-based copy (Ctrl-C) support in the tree logger, hooks for find
(Ctrl-F) and a few minor cleanups.
Modified:
changes/jat/oophm-branch/dev/core/src/com/google/gwt/dev/ModulePanel.java
==============================================================================
---
changes/jat/oophm-branch/dev/core/src/com/google/gwt/dev/ModulePanel.java
(original)
+++
changes/jat/oophm-branch/dev/core/src/com/google/gwt/dev/ModulePanel.java
Sun Oct 5 12:59:21 2008
@@ -54,6 +54,7 @@
button.setBorderPainted(false);
button.setPreferredSize(new Dimension(closeIcon.getIconWidth(),
closeIcon.getIconHeight()));
+ button.setToolTipText("Close this tab");
add(button);
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
@@ -111,7 +112,7 @@
}
synchronized (tabs) {
tabs.addTab(shortModuleName, browserIcon, this, moduleName + " from "
- + remoteSocket);
+ + remoteSocket + " on " + userAgent);
}
logger.log(TreeLogger.INFO, "Request for module " + moduleName
+ " by user agent '" + userAgent + "' from " + remoteSocket);
Modified:
changes/jat/oophm-branch/dev/core/src/com/google/gwt/dev/util/log/SwingLoggerPanel.java
==============================================================================
---
changes/jat/oophm-branch/dev/core/src/com/google/gwt/dev/util/log/SwingLoggerPanel.java
(original)
+++
changes/jat/oophm-branch/dev/core/src/com/google/gwt/dev/util/log/SwingLoggerPanel.java
Sun Oct 5 12:59:21 2008
@@ -23,12 +23,19 @@
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
+import java.awt.HeadlessException;
+import java.awt.datatransfer.Clipboard;
+import java.awt.datatransfer.StringSelection;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
+import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
import java.util.Enumeration;
+import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JComboBox;
+import javax.swing.JComponent;
import javax.swing.JEditorPane;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
@@ -37,11 +44,13 @@
import javax.swing.JSplitPane;
import javax.swing.JTextField;
import javax.swing.JTree;
+import javax.swing.KeyStroke;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
+import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel;
@@ -50,8 +59,6 @@
*/
public class SwingLoggerPanel extends JPanel implements
TreeSelectionListener {
- private static final Color DISCONNECTED_COLOR = Color.decode("0xFFDDDD");
-
private static class TreeRenderer extends DefaultTreeCellRenderer {
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value,
@@ -68,7 +75,9 @@
return this;
}
}
-
+
+ private static final Color DISCONNECTED_COLOR = Color.decode("0xFFDDDD");
+
// package protected for SwingTreeLogger to access
final JTree tree;
@@ -160,6 +169,7 @@
TreeSelectionModel.SINGLE_TREE_SELECTION);
tree.addTreeSelectionListener(this);
JScrollPane treeView = new JScrollPane(tree);
+ // TODO(jat): better way to do this
details = new JEditorPane() {
@Override
public boolean getScrollableTracksViewportWidth() {
@@ -180,11 +190,23 @@
add(splitter);
logger = new SwingTreeLogger(this);
logger.setMaxDetail(maxLevel);
- }
-
- protected void alert(String msg) {
- JOptionPane.showMessageDialog(null, "Alert", msg,
- JOptionPane.INFORMATION_MESSAGE);
+ KeyStroke key = KeyStroke.getKeyStroke(KeyEvent.VK_F,
+ InputEvent.CTRL_DOWN_MASK);
+ getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(key, "find");
+ getActionMap().put("find", new AbstractAction() {
+ public void actionPerformed(ActionEvent e) {
+ // TODO(jat): popup Chrome-like find box
+ JOptionPane.showMessageDialog(null, "Find not implemented yet",
+ "Alert: Not Implemented", JOptionPane.INFORMATION_MESSAGE);
+ }
+ });
+ key = KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_DOWN_MASK);
+ tree.getInputMap().put(key, "copy");
+ tree.getActionMap().put("copy", new AbstractAction() {
+ public void actionPerformed(ActionEvent e) {
+ treeCopy();
+ }
+ });
}
@SuppressWarnings("unchecked")
@@ -243,6 +265,11 @@
if (e.isAddedPath()) {
TreePath path = e.getPath();
Object treeNode = path.getLastPathComponent();
+ if (treeNode == null) {
+ // handle the case of no selection
+ details.setText("");
+ return;
+ }
Object userObject = ((DefaultMutableTreeNode)
treeNode).getUserObject();
String text = userObject.toString();
if (userObject instanceof LogEvent) {
@@ -253,6 +280,11 @@
}
}
+ protected void alert(String msg) {
+ JOptionPane.showMessageDialog(null, "Alert", msg,
+ JOptionPane.INFORMATION_MESSAGE);
+ }
+
protected void setLevelFilter(Type selectedLevel) {
levelFilter = selectedLevel;
// TODO(jat): filter current tree
@@ -265,5 +297,60 @@
// TODO(jat): filter current tree
JOptionPane.showMessageDialog(null, "Regex filtering not implemented
yet",
"Alert: Not Implemented", JOptionPane.INFORMATION_MESSAGE);
+ }
+
+ protected void treeCopy() {
+ DefaultMutableTreeNode node = (DefaultMutableTreeNode)
tree.getLastSelectedPathComponent();
+ if (node == null) {
+ return;
+ }
+ // is it better to use SwingUtilities2.canAccessSystemClipboard() here?
+ Clipboard clipboard;
+ try {
+ clipboard = tree.getToolkit().getSystemClipboard();
+ } catch (SecurityException e) {
+ return;
+ } catch (HeadlessException e) {
+ return;
+ }
+ if (clipboard == null) {
+ return;
+ }
+ StringBuilder text = new StringBuilder();
+ treeLogTraverse(text, node, 0);
+ StringSelection selection = new StringSelection(text.toString());
+ clipboard.setContents(selection, selection);
+ }
+
+ private String htmlUnescape(String str) {
+ // TODO(jat): real implementation, needs to correspond to
+ // SwingTreeLogger.htmlEscape()
+ return
str.replace("<", "<").replace(">", ">").replace("&", "&").replace(
+ "<br>", "\n");
+ }
+
+ private void treeLogTraverse(StringBuilder buf, TreeNode node, int
indent) {
+ for (int i = 0; i < indent; ++i) {
+ buf.append(' ');
+ }
+ if (node instanceof DefaultMutableTreeNode) {
+ DefaultMutableTreeNode mutableNode = (DefaultMutableTreeNode) node;
+ Object userObject = mutableNode.getUserObject();
+ if (userObject instanceof LogEvent) {
+ LogEvent event = (LogEvent) userObject;
+ buf.append(htmlUnescape(event.getFullText()));
+ if (event.isBranchCommit) {
+ SwingTreeLogger childLogger = event.childLogger;
+ DefaultMutableTreeNode parent = childLogger.treeNode;
+ for (int i = 0; i < parent.getChildCount(); ++i) {
+ treeLogTraverse(buf, parent.getChildAt(i), indent + 2);
+ }
+ }
+ } else {
+ buf.append(userObject.toString());
+ }
+ } else {
+ buf.append(node.toString());
+ }
}
}
Modified:
changes/jat/oophm-branch/dev/core/src/com/google/gwt/dev/util/log/SwingTreeLogger.java
==============================================================================
---
changes/jat/oophm-branch/dev/core/src/com/google/gwt/dev/util/log/SwingTreeLogger.java
(original)
+++
changes/jat/oophm-branch/dev/core/src/com/google/gwt/dev/util/log/SwingTreeLogger.java
Sun Oct 5 12:59:21 2008
@@ -235,9 +235,10 @@
}
}
+ // package protected so SwingLoggerPanel can access
+ DefaultMutableTreeNode treeNode;
+
private SwingLoggerPanel panel;
- // Highest level of log message we or our children have seen
- private DefaultMutableTreeNode treeNode;
/**
* Constructs the top-level TreeItemLogger.
Modified: changes/jat/oophm-branch/plugins/common/ByteOrder.h
==============================================================================
--- changes/jat/oophm-branch/plugins/common/ByteOrder.h (original)
+++ changes/jat/oophm-branch/plugins/common/ByteOrder.h Sun Oct 5 12:59:21
2008
@@ -46,6 +46,10 @@
char b[sizeof(double)];
} DoubleUnion;
+ /**
+ * Copy src to dest, reversing the order of the bytes.
+ * Assumes src and dest do not overlap.
+ */
void memcpyrev(char* dest, const char* src, size_t n) {
src += n;
while (n-- > 0) {
--~--~---------~--~----~------------~-------~--~----~
http://groups.google.com/group/Google-Web-Toolkit-Contributors
-~----------~----~----~----~------~----~------~--~---