psmith 2003/06/17 21:07:41
Modified: src/java/org/apache/log4j/chainsaw
ChainsawToolBarAndMenus.java
Log:
Added very early implementation of Pausing/Resuming a Receiver
via the GUI.
Only Socket Receiver is supported at this stage, and the toolbar
buttons aren't hooked up to the action, but single clicking a SocketReceiver
node in the tree will now toggle the active flag for that receiver
effectively discarding all received events unless active.
WIP. (This is also getting at a bit big for this class, will eventually move it out).
Revision Changes Path
1.41 +130 -3
jakarta-log4j-sandbox/src/java/org/apache/log4j/chainsaw/ChainsawToolBarAndMenus.java
Index: ChainsawToolBarAndMenus.java
===================================================================
RCS file:
/home/cvs/jakarta-log4j-sandbox/src/java/org/apache/log4j/chainsaw/ChainsawToolBarAndMenus.java,v
retrieving revision 1.40
retrieving revision 1.41
diff -u -r1.40 -r1.41
--- ChainsawToolBarAndMenus.java 18 Jun 2003 01:55:41 -0000 1.40
+++ ChainsawToolBarAndMenus.java 18 Jun 2003 04:07:40 -0000 1.41
@@ -55,17 +55,24 @@
*/
package org.apache.log4j.chainsaw;
+import org.apache.log4j.LogManager;
import org.apache.log4j.chainsaw.icons.ChainsawIcons;
import org.apache.log4j.chainsaw.prefs.LoadSettingsEvent;
import org.apache.log4j.chainsaw.prefs.SaveSettingsEvent;
import org.apache.log4j.chainsaw.prefs.SettingsListener;
import org.apache.log4j.chainsaw.prefs.SettingsManager;
import org.apache.log4j.helpers.LogLog;
+import org.apache.log4j.net.SocketNodeEventListener;
+import org.apache.log4j.net.SocketReceiver;
+import org.apache.log4j.plugins.PluginRegistry;
+import org.apache.log4j.plugins.Receiver;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
@@ -79,6 +86,7 @@
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
+import java.util.List;
import javax.swing.AbstractAction;
import javax.swing.Action;
@@ -117,6 +125,9 @@
import javax.swing.event.ChangeListener;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
+import javax.swing.event.TreeSelectionEvent;
+import javax.swing.event.TreeSelectionListener;
+import javax.swing.tree.DefaultMutableTreeNode;
/**
@@ -807,13 +818,111 @@
private Action createShowReceiversAction() {
final JTree tree = new JTree(ReceiversTreeModel.create());
+ /**
+ * We need to setup a runnable that updates the tree
+ * any time a Socket event happens (opening/closing of a socket).
+ *
+ * We do this by installing a SocketNodeEventListener in ALL the
+ * registered SocketReceivers
+ */
+ final Runnable updateReceiverTree =
+ new Runnable() {
+ public void run() {
+ tree.setModel(ReceiversTreeModel.create());
+ }
+ };
+
tree.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
tree.setCellRenderer(new ReceiverTreeCellRenderer());
final Container container = receiversWindow.getContentPane();
+ container.setLayout(new BorderLayout());
+
+ JPanel buttonPanel = new JPanel(new GridBagLayout());
+ GridBagConstraints c = new GridBagConstraints();
+
+ final Action playReceiverButtonAction =
+ new AbstractAction() {
+ public void actionPerformed(ActionEvent e) {
+ }
+ };
+
+ playReceiverButtonAction.putValue(
+ Action.SHORT_DESCRIPTION, "Resumes the seleted Node");
+ playReceiverButtonAction.putValue(
+ Action.SMALL_ICON, new ImageIcon(ChainsawIcons.ICON_RESUME_RECEIVER));
+ playReceiverButtonAction.setEnabled(false);
+
+ SmallButton playReceiverButton = new SmallButton(playReceiverButtonAction);
+
+ final Action pauseReceiverButtonAction =
+ new AbstractAction() {
+ public void actionPerformed(ActionEvent e) {
+ }
+ };
+
+ pauseReceiverButtonAction.putValue(
+ Action.SHORT_DESCRIPTION, "Pauses the selected Node");
+ pauseReceiverButtonAction.putValue(
+ Action.SMALL_ICON, new ImageIcon(ChainsawIcons.PAUSE));
+ pauseReceiverButtonAction.setEnabled(false);
+
+ SmallButton pauseReceiverButton =
+ new SmallButton(pauseReceiverButtonAction);
+
+ c.weightx = 0.0;
+ c.weighty = 0.0;
+ c.ipadx = 2;
+ c.ipady = 2;
+ c.gridx = 0;
+ c.gridy = 0;
+ c.fill = GridBagConstraints.NONE;
+ c.anchor = GridBagConstraints.WEST;
+ buttonPanel.add(playReceiverButton, c);
+
+ c.gridx = 1;
+ c.weightx = 1.0;
+ c.weighty = 1.0;
+ buttonPanel.add(pauseReceiverButton, c);
+
+ tree.addTreeSelectionListener(
+ new TreeSelectionListener() {
+ public void valueChanged(TreeSelectionEvent e) {
+ DefaultMutableTreeNode node =
+ (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
+
+ if (node == null) {
+ return;
+ }
+
+ Object nodeInfo = node.getUserObject();
+
+ if (nodeInfo instanceof SocketReceiver) {
+ SocketReceiver receiver = (SocketReceiver) nodeInfo;
+
+ if (receiver.isActive()) {
+ receiver.setActive(false);
+ pauseReceiverButtonAction.setEnabled(false);
+ playReceiverButtonAction.setEnabled(true);
+ } else {
+ receiver.setActive(true);
+ pauseReceiverButtonAction.setEnabled(true);
+ playReceiverButtonAction.setEnabled(false);
+ }
+
+ updateReceiverTree.run();
+ } else {
+ pauseReceiverButtonAction.setEnabled(false);
+ playReceiverButtonAction.setEnabled(false);
+ }
+ }
+ });
+
JComponent component = tree;
- container.add(new JScrollPane(component));
+ container.add(new JScrollPane(component), BorderLayout.CENTER);
+ container.add(buttonPanel, BorderLayout.NORTH);
+
receiversWindow.setSize(320, 240);
final Action action =
@@ -825,16 +934,34 @@
if (!receiversWindow.isVisible()) {
receiversWindow.setVisible(true);
}
+ }
+ };
+
+ SocketNodeEventListener listener =
+ new SocketNodeEventListener() {
+ public void socketOpened(String remoteInfo) {
+ SwingUtilities.invokeLater(updateReceiverTree);
+ }
+ public void socketClosedEvent(Exception e) {
+ SwingUtilities.invokeLater(updateReceiverTree);
}
};
+ List socketReceivers =
+ PluginRegistry.getPlugins(
+ LogManager.getLoggerRepository(), SocketReceiver.class);
+
+ for (Iterator iter = socketReceivers.iterator(); iter.hasNext();) {
+ SocketReceiver element = (SocketReceiver) iter.next();
+ element.addSocketNodeEventListener(listener);
+ }
+
action.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_E));
action.putValue(
Action.SHORT_DESCRIPTION,
"Shows the currently configured Log4j Receivers");
- action.putValue(
- Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("F6"));
+ action.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("F6"));
return action;
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]