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]