psmith      2003/06/19 21:51:02

  Modified:    src/java/org/apache/log4j/chainsaw ReceiversPanel.java
  Log:
  General refactoring of the Receiver panel.
  
  Can stop, pause, start, and recycle receives via the receiver panel toolbar.
  
  Minor alignment and adjustment to the way the Close box is located.
  
  Refactored all the actions in this class to be a bit cleaner.
  
  Only the popup menus have not been completed at this time.
  
  Revision  Changes    Path
  1.8       +273 -140  
jakarta-log4j-sandbox/src/java/org/apache/log4j/chainsaw/ReceiversPanel.java
  
  Index: ReceiversPanel.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-log4j-sandbox/src/java/org/apache/log4j/chainsaw/ReceiversPanel.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- ReceiversPanel.java       19 Jun 2003 23:05:03 -0000      1.7
  +++ ReceiversPanel.java       20 Jun 2003 04:51:02 -0000      1.8
  @@ -75,6 +75,7 @@
   import javax.swing.AbstractAction;
   import javax.swing.Action;
   import javax.swing.BorderFactory;
  +import javax.swing.Box;
   import javax.swing.Icon;
   import javax.swing.ImageIcon;
   import javax.swing.JComponent;
  @@ -86,6 +87,8 @@
   import javax.swing.JScrollPane;
   import javax.swing.JTree;
   import javax.swing.SwingUtilities;
  +import javax.swing.event.TreeSelectionEvent;
  +import javax.swing.event.TreeSelectionListener;
   import javax.swing.tree.DefaultMutableTreeNode;
   
   
  @@ -107,11 +110,11 @@
       super(new BorderLayout());
       this.logui = logui;
       setBorder(BorderFactory.createEtchedBorder());
  -    
  -    setPreferredSize(new Dimension(250,400));
  +
  +    setPreferredSize(new Dimension(250, 400));
       setMinimumSize(getPreferredSize());
       setMaximumSize(getPreferredSize());
  -    
  +
       receiversTree.setModel(ReceiversTreeModel.create());
   
       receiversTree.setToolTipText("Allows you to manage Log4j Receivers");
  @@ -139,7 +142,6 @@
                         PluginRegistry.startPlugin(item);
                       }
   
  -                    
                       updateReceiverTreeInDispatchThread();
                       logui.getStatusBar().setMessage(
                         "All Receivers have been (re)started");
  @@ -171,133 +173,22 @@
   
       receiversTree.setCellRenderer(new ReceiverTreeCellRenderer());
   
  -    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 selected 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);
  -
  -    SmallButton restartAllButton = new SmallButton(startAllAction);
  -    restartAllButton.setText(null);
  -
  -    c.weightx = 0.0;
  -    c.weighty = 0.0;
  -    c.ipadx = 1;
  -    c.ipady = 1;
  -    c.fill = GridBagConstraints.NONE;
  -    c.anchor = GridBagConstraints.WEST;
  -
  -    buttonPanel.add(restartAllButton, c);
  -
  -    buttonPanel.add(playReceiverButton, c);
  -
  -    c.weightx = 1.0;
  -    c.weighty = 1.0;
  -    buttonPanel.add(pauseReceiverButton, c);
  -
  -    c.weightx = 0.00;
  -    c.weighty = 0.0;
  -    c.ipadx = 1;
  -    c.ipady = 1;
  -    c.fill = GridBagConstraints.BOTH;
  -    c.anchor = GridBagConstraints.EAST;
  -
  -    Action closeAction =
  -      new AbstractAction(null, new CloseIcon(8, 1, 1)) {
  -        public void actionPerformed(ActionEvent e) {
  -          logui.toggleReceiversPanel();
  -        }
  -      };
  -
  -    closeAction.putValue(
  -      Action.SHORT_DESCRIPTION, "Closes the Receiver panel");
  -
  -    buttonPanel.add(new SmallButton(closeAction));
  +    ReceiverToolbar buttonPanel = new ReceiverToolbar();
  +    receiversTree.addTreeSelectionListener(buttonPanel);
   
       PopupListener popupListener = new PopupListener(popupMenu);
       receiversTree.addMouseListener(popupListener);
       this.addMouseListener(popupListener);
   
  -    //    receiversTree.addMouseMotionListener(new MouseMotionListener(){
  -    //      
  -    //      public void handle(MouseEvent e) {
  -    ////        (e.getModifiers() & InputEvent.CTRL_MASK)>0
  -    //        if( e.isPopupTrigger()) {
  -    //          DefaultMutableTreeNode node =
  -    //            (DefaultMutableTreeNode) receiversTree
  -    //            .getLastSelectedPathComponent();
  -    //
  -    //          if (node == null) {
  -    //            return;
  -    //          }
  -    //          
  -    ////          e.consume();
  -    ////
  -    ////          Object nodeInfo = node.getUserObject();
  -    ////
  -    ////          if (nodeInfo instanceof SocketReceiver) {
  -    ////            SocketReceiver receiver = (SocketReceiver) nodeInfo;
  -    ////            
  -    ////            
  -    ////            if (receiver.isActive()) {
  -    ////              receiver.setActive(false);
  -    ////              pauseReceiverButtonAction.setEnabled(false);
  -    ////              playReceiverButtonAction.setEnabled(true);
  -    ////              logui.getStatusBar().setMessage("Deactivating " + 
receiver.getName());
  -    ////              
  -    ////            } else {
  -    ////              receiver.setActive(true);
  -    ////              pauseReceiverButtonAction.setEnabled(true);
  -    ////              playReceiverButtonAction.setEnabled(false);
  -    ////              logui.getStatusBar().setMessage("Activating " + 
receiver.getName());
  -    ////            }
  -    ////
  -    ////            updateReceiverTree.run();
  -    ////          } else {
  -    ////            pauseReceiverButtonAction.setEnabled(false);
  -    ////            playReceiverButtonAction.setEnabled(false);
  -    ////          }
  -    //        }
  -    //      }
  -    //      public void mouseDragged(MouseEvent e) {
  -    //        
  -    //      }
  -    //
  -    //      public void mouseMoved(MouseEvent e) {
  -    //        
  -    //      }
  -    //    });
       JComponent component = receiversTree;
   
       add(new JScrollPane(component), BorderLayout.CENTER);
       add(buttonPanel, BorderLayout.NORTH);
   
  +    /**
  +     * This Tree likes to be notified when Socket's are accepted so
  +     * we listen for them and update the Tree.
  +     */
       SocketNodeEventListener listener =
         new SocketNodeEventListener() {
           public void socketOpened(String remoteInfo) {
  @@ -309,6 +200,9 @@
           }
         };
   
  +    /**
  +     * add this listener to all SocketReceivers
  +     */
       List socketReceivers =
         PluginRegistry.getPlugins(
           LogManager.getLoggerRepository(), SocketReceiver.class);
  @@ -318,15 +212,253 @@
         element.addSocketNodeEventListener(listener);
       }
     }
  -  
  +
  +  /**
  +   * Ensures that the Receiver tree is updated with the latest information
  +   * and that this operation occurs in the Swing Event Dispatch thread.
  +   *
  +   */
     private void updateReceiverTreeInDispatchThread() {
  -    if(SwingUtilities.isEventDispatchThread()){
  +    if (SwingUtilities.isEventDispatchThread()) {
         updateReceiverTree.run();
  -    } else{
  +    } else {
         SwingUtilities.invokeLater(updateReceiverTree);
       }
     }
   
  +  /**
  +   * Returns the currently selected Receiver, or null if there is no
  +   * selected Receiver (this could be because a) nothing at all is selected
  +   * or b) a non Receiver type node is selected
  +   *
  +   * @return Receiver or null
  +   */
  +  private Receiver getCurrentlySelectedReceiver() {
  +    DefaultMutableTreeNode node =
  +      (DefaultMutableTreeNode) receiversTree.getLastSelectedPathComponent();
  +
  +    if (node == null) {
  +      return null;
  +    }
  +
  +    Object userObject = node.getUserObject();
  +
  +    if (userObject instanceof Receiver) {
  +      return (Receiver) userObject;
  +    }
  +
  +    return null;
  +  }
  +
  +  /**
  +   * Ensures that the currently selected receiver active property is set to
  +   * true
  +   *
  +   */
  +  private void playCurrentlySelectedReceiver() {
  +    new Thread(
  +      new Runnable() {
  +        public void run() {
  +          Receiver receiver = getCurrentlySelectedReceiver();
  +
  +          if (receiver != null) {
  +            if (!receiver.isActive()) {
  +              receiver.setActive(true);
  +            }
  +
  +            updateReceiverTreeInDispatchThread();
  +          }
  +        }
  +      }).start();
  +  }
  +
  +  /**
  +   * Takes the currently selected Receiver and pauess it, effectively
  +   * discarding any received event BEFORE it is even posted to the logger
  +   * repository.
  +   *
  +   * The user is NOT asked to confirm this operation
  +   *
  +   */
  +  private void pauseCurrentlySelectedReceiver() {
  +    new Thread(
  +      new Runnable() {
  +        public void run() {
  +          Receiver receiver = getCurrentlySelectedReceiver();
  +
  +          if (receiver != null) {
  +            receiver.setActive(false);
  +            updateReceiverTreeInDispatchThread();
  +          }
  +        }
  +      }).start();
  +  }
  +
  +  /**
  +   * Takes the currently selected Receiver and stops it, which effectively
  +   * removes it from the PluginRegistry.
  +   *
  +   * The user is asked to confirm this operation
  +   *
  +   */
  +  private void shutdownCurrentlySelectedReceiver() {
  +    if (
  +      JOptionPane.showConfirmDialog(
  +          logui,
  +          "Are you sure you wish to shutdown this receiver?\n\nThis will disconnect 
any network resources, and remove it from the PluginRegistry.",
  +          "Confirm stop of Receiver", JOptionPane.YES_NO_OPTION) == 
JOptionPane.YES_OPTION) {
  +      new Thread(
  +        new Runnable() {
  +          public void run() {
  +            Receiver receiver = getCurrentlySelectedReceiver();
  +
  +            if (receiver != null) {
  +              PluginRegistry.stopPlugin(receiver);
  +
  +              updateReceiverTreeInDispatchThread();
  +            }
  +          }
  +        }).start();
  +    }
  +  }
  +
  +  /**
  +   * A simple Panel that has toolbar buttons for restarting,
  +   * playing, pausing, and stoping receivers
  +   *
  +   * @author Paul Smith <[EMAIL PROTECTED]>
  +   *
  +   */
  +  private class ReceiverToolbar extends JPanel implements TreeSelectionListener {
  +    final Action playReceiverButtonAction;
  +    final Action shutdownReceiverButtonAction;
  +    final Action pauseReceiverButtonAction;
  +
  +    private ReceiverToolbar() {
  +      setLayout(new GridBagLayout());
  +
  +      GridBagConstraints c = new GridBagConstraints();
  +
  +      playReceiverButtonAction =
  +        new AbstractAction() {
  +            public void actionPerformed(ActionEvent e) {
  +              playCurrentlySelectedReceiver();
  +            }
  +          };
  +
  +      playReceiverButtonAction.putValue(
  +        Action.SHORT_DESCRIPTION, "Resumes the selected Node");
  +      playReceiverButtonAction.putValue(
  +        Action.SMALL_ICON, new ImageIcon(ChainsawIcons.ICON_RESUME_RECEIVER));
  +      playReceiverButtonAction.setEnabled(false);
  +
  +      SmallButton playReceiverButton =
  +        new SmallButton(playReceiverButtonAction);
  +
  +      pauseReceiverButtonAction =
  +        new AbstractAction() {
  +            public void actionPerformed(ActionEvent e) {
  +              pauseCurrentlySelectedReceiver();
  +            }
  +          };
  +
  +      pauseReceiverButtonAction.putValue(
  +        Action.SHORT_DESCRIPTION,
  +        "Pause the selected Receiver.  All events received will be discarded.");
  +      pauseReceiverButtonAction.putValue(
  +        Action.SMALL_ICON, new ImageIcon(ChainsawIcons.PAUSE));
  +      pauseReceiverButtonAction.setEnabled(false);
  +
  +      SmallButton pauseReceiverButton =
  +        new SmallButton(pauseReceiverButtonAction);
  +
  +      shutdownReceiverButtonAction =
  +        new AbstractAction() {
  +            public void actionPerformed(ActionEvent e) {
  +              shutdownCurrentlySelectedReceiver();
  +            }
  +          };
  +
  +      shutdownReceiverButtonAction.putValue(
  +        Action.SHORT_DESCRIPTION,
  +        "Shuts down the selected Receiver, and removes it from the Plugin 
registry");
  +      shutdownReceiverButtonAction.putValue(
  +        Action.SMALL_ICON, new ImageIcon(ChainsawIcons.ICON_STOP_RECEIVER));
  +      shutdownReceiverButtonAction.setEnabled(false);
  +
  +      SmallButton shutdownReceiverButton =
  +        new SmallButton(shutdownReceiverButtonAction);
  +
  +      SmallButton restartAllButton = new SmallButton(startAllAction);
  +      restartAllButton.setText(null);
  +
  +      c.weightx = 0.0;
  +      c.weighty = 0.0;
  +      c.ipadx = 1;
  +      c.ipady = 1;
  +      c.fill = GridBagConstraints.NONE;
  +      c.anchor = GridBagConstraints.WEST;
  +
  +      add(restartAllButton, c);
  +
  +      add(playReceiverButton, c);
  +      add(pauseReceiverButton, c);
  +      add(shutdownReceiverButton, c);
  +
  +      c.weightx = 1.0;
  +      c.weighty = 1.0;
  +      c.anchor = GridBagConstraints.EAST;
  +
  +      Action closeAction =
  +        new AbstractAction(null, new CloseIcon(8, 1, 1)) {
  +          public void actionPerformed(ActionEvent e) {
  +            logui.toggleReceiversPanel();
  +          }
  +        };
  +
  +      closeAction.putValue(
  +        Action.SHORT_DESCRIPTION, "Closes the Receiver panel");
  +
  +      add(new SmallButton(closeAction), c);
  +
  +      c.weightx = 0;
  +      c.ipadx = 0;
  +      c.ipady = 0;
  +      add(Box.createHorizontalStrut(5), c);
  +    }
  +
  +    /**
  +     * Ensures the enabled property of the actions is set properly
  +     * according to the currently selected node in the tree
  +     */
  +    public void valueChanged(TreeSelectionEvent e) {
  +      Receiver receiver = getCurrentlySelectedReceiver();
  +
  +      if (receiver != null) {
  +        if (receiver.isActive()) {
  +          shutdownReceiverButtonAction.setEnabled(true);
  +          pauseReceiverButtonAction.setEnabled(true);
  +          playReceiverButtonAction.setEnabled(false);
  +        } else {
  +          shutdownReceiverButtonAction.setEnabled(false);
  +          pauseReceiverButtonAction.setEnabled(false);
  +          playReceiverButtonAction.setEnabled(true);
  +        }
  +      } else {
  +        shutdownReceiverButtonAction.setEnabled(false);
  +        pauseReceiverButtonAction.setEnabled(false);
  +        playReceiverButtonAction.setEnabled(false);
  +      }
  +    }
  +  }
  +
  +  /**
  +   * A popup menu class for when the user uses the popup trigger action
  +   * on a node in the Receiver tree.
  +   *
  +   * @author Paul Smith <[EMAIL PROTECTED]>
  +   *
  +   */
     class ReceiverPopupMenu extends JPopupMenu {
       final JMenu startMenu = new JMenu("Start");
       final JMenu pauseMenu = new JMenu("Pause");
  @@ -376,29 +508,24 @@
       }
   
       /**
  -     *
  +     * Builds the popup menu with relevant items for a selected
  +     * Receiver node in the Tree.
        */
       private void buildForReceiverNode() {
         final Action pauseReceiver =
           new AbstractAction(
             "Pause this Receiver", new ImageIcon(ChainsawIcons.PAUSE)) {
             public void actionPerformed(ActionEvent e) {
  -            DefaultMutableTreeNode node =
  -              (DefaultMutableTreeNode) receiversTree
  -              .getLastSelectedPathComponent();
  +            Receiver receiver = getCurrentlySelectedReceiver();
   
  -            if (node == null) {
  -              return;
  -            }
  -
  -            Object userObject = node.getUserObject();
  -
  -            if (userObject instanceof SocketReceiver) {
  -              SocketReceiver socketReceiver = (SocketReceiver) userObject;
  -              socketReceiver.setActive(false);
  -              logui.getStatusBar().setMessage(
  -                socketReceiver.getName() + " has been paused");
  -              updateReceiverTreeInDispatchThread();
  +            if (receiver != null) {
  +              if (receiver instanceof SocketReceiver) {
  +                SocketReceiver socketReceiver = (SocketReceiver) receiver;
  +                socketReceiver.setActive(false);
  +                logui.getStatusBar().setMessage(
  +                  socketReceiver.getName() + " has been paused");
  +                updateReceiverTreeInDispatchThread();
  +              }
               }
             }
           };
  @@ -408,6 +535,11 @@
         shutdownMenu.add(createNotDoneYet());
       }
   
  +    /**
  +     * Builds a relevant set of menus for when the Root node in the Receiver
  +     * tree has been selected
  +     *
  +     */
       private void buildForReceiversRoot() {
         JMenuItem startAll = new JMenuItem(startAllAction);
         startMenu.add(startAll);
  @@ -417,6 +549,7 @@
     }
   
     /**
  +   * A nice and simple 'X' style icon that is used to indicate a 'close' operation.
      *
      * @author Scott Deboy <[EMAIL PROTECTED]>
      *
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to