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]

Reply via email to