psmith      2003/06/15 22:10:36

  Modified:    src/java/org/apache/log4j/chainsaw
                        ChainsawToolBarAndMenus.java
  Log:
  added Show Receivers menu item, which pops up a Dialog with 
  the currently registered Receiver implementations.
  
  Currently displayed in a boring, read only table, but would like to 
  eventually move this to a Tree style view, with each Receiver
  type as a top level node, with the actual details of, say, each connected
  Socket as child nodes.  
  
  Then eventually allow stopping of the specific
  receivers, and perhaps a Create Receiver... action.
  
  Revision  Changes    Path
  1.32      +158 -23   
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.31
  retrieving revision 1.32
  diff -u -r1.31 -r1.32
  --- ChainsawToolBarAndMenus.java      4 Jun 2003 05:02:35 -0000       1.31
  +++ ChainsawToolBarAndMenus.java      16 Jun 2003 05:10:36 -0000      1.32
  @@ -55,14 +55,23 @@
    */
   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.MulticastReceiver;
  +import org.apache.log4j.net.SocketReceiver;
  +import org.apache.log4j.net.UDPReceiver;
  +import org.apache.log4j.plugins.PluginRegistry;
  +import org.apache.log4j.plugins.Receiver;
   
   import java.awt.BorderLayout;
  +import java.awt.Color;
  +import java.awt.Component;
  +import java.awt.Container;
   import java.awt.Dimension;
   import java.awt.FlowLayout;
   import java.awt.Insets;
  @@ -78,6 +87,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;
  @@ -89,6 +99,7 @@
   import javax.swing.JButton;
   import javax.swing.JCheckBoxMenuItem;
   import javax.swing.JComponent;
  +import javax.swing.JDialog;
   import javax.swing.JFrame;
   import javax.swing.JLabel;
   import javax.swing.JMenu;
  @@ -96,8 +107,10 @@
   import javax.swing.JMenuItem;
   import javax.swing.JPanel;
   import javax.swing.JRadioButtonMenuItem;
  +import javax.swing.JScrollPane;
   import javax.swing.JSlider;
   import javax.swing.JTabbedPane;
  +import javax.swing.JTable;
   import javax.swing.JTextField;
   import javax.swing.JToggleButton;
   import javax.swing.JToolBar;
  @@ -113,6 +126,8 @@
   import javax.swing.event.ChangeListener;
   import javax.swing.event.DocumentEvent;
   import javax.swing.event.DocumentListener;
  +import javax.swing.table.AbstractTableModel;
  +import javax.swing.table.DefaultTableCellRenderer;
   
   
   /**
  @@ -137,6 +152,7 @@
     private final Action findNextAction;
     private final Action showPreferencesAction;
     private final Action undockAction;
  +  private final Action showReceiversAction;
     private final FileMenu fileMenu;
     private final SmallToggleButton pauseButton = new SmallToggleButton();
     private final SmallToggleButton detailPaneButton = new SmallToggleButton();
  @@ -148,11 +164,12 @@
       new JCheckBoxMenuItem();
     private final JRadioButtonMenuItem tabsBottom =
       new JRadioButtonMenuItem("Bottom");
  -  private final JRadioButtonMenuItem levelDisplayIcon = new 
JRadioButtonMenuItem("Icon");
  -  private final JRadioButtonMenuItem levelDisplayText = new 
JRadioButtonMenuItem("Text");
  +  private final JRadioButtonMenuItem levelDisplayIcon =
  +    new JRadioButtonMenuItem("Icon");
  +  private final JRadioButtonMenuItem levelDisplayText =
  +    new JRadioButtonMenuItem("Text");
     private String levelDisplay = ChainsawConstants.LEVEL_DISPLAY_ICONS;
     private String lastFind = "";
  -
     private final Action[] logPanelSpecificActions;
   
     ChainsawToolBarAndMenus(final LogUI logui) {
  @@ -169,10 +186,10 @@
       pauseAction = createPauseAction();
       clearAction = createClearAction();
       undockAction = createUndockAction();
  +    showReceiversAction = createShowReceiversAction();
       toggleDetailPaneAction = createToggleDetailPaneAction();
       responsiveSlider =
  -      new JSlider(
  -        JSlider.VERTICAL, 0, 5000, logui.handler.getQueueInterval());
  +      new JSlider(JSlider.VERTICAL, 0, 5000, logui.handler.getQueueInterval());
       createMenuBar();
       createToolbar();
   
  @@ -183,6 +200,87 @@
         };
     }
   
  +  /**
  +   * @return
  +   */
  +  private Action createShowReceiversAction() {
  +    final JDialog receiversWindow = new JDialog(logui, "Receivers", false);
  +
  +    //    TODO Change this into a TreeModel, looks nicer by Receiver type
  +    final ReceiversTableModel model = new ReceiversTableModel();
  +    model.refresh();
  +
  +    final JTable table = new JTable();
  +    table.setModel(model);
  +    table.getColumnModel().getColumn(0).setCellRenderer(
  +      new DefaultTableCellRenderer() {
  +        public void setValue(Object value) {
  +          //        TODO Other receiver types/refactor
  +          if (value instanceof SocketReceiver) {
  +            SocketReceiver s = (SocketReceiver) value;
  +            super.setValue(s.getName() + "::" + s.getPort());
  +          } else if (value instanceof UDPReceiver) {
  +            UDPReceiver u = (UDPReceiver) value;
  +            super.setValue(u.getName() + "::" + u.getPort());
  +          } else if (value instanceof MulticastReceiver) {
  +            MulticastReceiver m = (MulticastReceiver) value;
  +            super.setValue(m.getName() + "::" + m.getPort());
  +          } else {
  +            super.setValue(value);
  +          }
  +        }
  +
  +        private final Color background = new Color(255, 255, 254);
  +        private final Color COLOR_ODD = new Color(230, 230, 230);
  +
  +        public Component getTableCellRendererComponent(
  +          JTable table, Object value, boolean isSelected, boolean hasFocus,
  +          int row, int column) {
  +          Component c =
  +            super.getTableCellRendererComponent(
  +              table, value, isSelected, hasFocus, row, column);
  +
  +          if ((row % 2) != 0) {
  +            c.setBackground(COLOR_ODD);
  +          } else {
  +            c.setBackground(background);
  +          }
  +
  +          return c;
  +        }
  +      });
  +
  +    table.setCellSelectionEnabled(false);
  +    table.setRowSelectionAllowed(false);
  +    table.setShowGrid(false);
  +    table.setColumnSelectionAllowed(false);
  +    table.setEnabled(false);
  +
  +    final Container container = receiversWindow.getContentPane();
  +    container.add(new JScrollPane(table));
  +    receiversWindow.setSize(320, 240);
  +
  +    final Action action =
  +      new AbstractAction("Show Receivers...") {
  +        public void actionPerformed(ActionEvent arg0) {
  +          model.refresh();
  +
  +          if (!receiversWindow.isVisible()) {
  +            receiversWindow.setVisible(true);
  +          }
  +
  +          receiversWindow.setLocationRelativeTo(logui);
  +        }
  +      };
  +
  +    action.putValue(Action.MNEMONIC_KEY,new Integer(KeyEvent.VK_E));
  +    action.putValue(
  +      Action.SHORT_DESCRIPTION,
  +      "Shows the currently configured Log4j Receivers");
  +
  +    return action;
  +  }
  +
     JToolBar getToolbar() {
       return toolbar;
     }
  @@ -274,19 +372,23 @@
       }
     }
   
  -  private void localFind(boolean next, 
  -    final LogUI.LogPanel logPanel, final JTextField theFindTextField) {
  +  private void localFind(
  +    boolean next, final LogUI.LogPanel logPanel,
  +    final JTextField theFindTextField) {
       if (!theFindTextField.getText().equals("")) {
  -     if (lastFind.length() == 0 || lastFind.length() > 
theFindTextField.getText().length()) {
  -             logPanel.findFromTop(theFindTextField.getText());
  -     } else {
  -             if (next) {
  -                     logPanel.findNext(theFindTextField.getText());
  -             } else {
  -                     logPanel.find(theFindTextField.getText());
  -             }
  -     }
  -             lastFind = theFindTextField.getText();          
  +      if (
  +        (lastFind.length() == 0)
  +          || (lastFind.length() > theFindTextField.getText().length())) {
  +        logPanel.findFromTop(theFindTextField.getText());
  +      } else {
  +        if (next) {
  +          logPanel.findNext(theFindTextField.getText());
  +        } else {
  +          logPanel.find(theFindTextField.getText());
  +        }
  +      }
  +
  +      lastFind = theFindTextField.getText();
       } else {
         theFindTextField.requestFocus();
       }
  @@ -725,6 +827,7 @@
       viewMenu.add(showToolbarCheck);
       viewMenu.add(toggleStatusBarCheck);
       viewMenu.add(menuItemClose);
  +    viewMenu.addSeparator();
   
       ButtonGroup levelIconGroup = new ButtonGroup();
       JMenu levelIconMenu = new JMenu("Display Level column as");
  @@ -805,6 +908,7 @@
         lookAndFeelMenu.add(lfItemMenu);
         lookAndFeelMenus.add(lfItemMenu);
       }
  +
       levelIconMenu.add(levelDisplayIcon);
       levelIconMenu.add(levelDisplayText);
   
  @@ -814,14 +918,14 @@
         levelDisplayText.setSelected(true);
       }
   
  -    
       tabMenu.add(tabsTop);
       tabMenu.add(tabsBottom);
   
  -     viewMenu.add(levelIconMenu);
  +    viewMenu.add(levelIconMenu);
       viewMenu.add(tabMenu);
       viewMenu.add(responsiveNess);
       viewMenu.addSeparator();
  +    viewMenu.add(showReceiversAction);
       viewMenu.add(lookAndFeelMenu);
   
       JMenu helpMenu = new JMenu("Help");
  @@ -882,7 +986,6 @@
         dockPauseButton.getModel().setSelected(false);
       }
   
  -
       dockPauseButton.setText("");
   
       toolbar.add(dockPauseButton);
  @@ -1004,11 +1107,13 @@
     public void loadSettings(LoadSettingsEvent event) {
       try {
         levelDisplay = event.getSetting(ChainsawConstants.LEVEL_DISPLAY);
  +
         if (levelDisplay.equals(ChainsawConstants.LEVEL_DISPLAY_ICONS)) {
  -             levelDisplayIcon.setSelected(true);
  +        levelDisplayIcon.setSelected(true);
         } else {
  -             levelDisplayText.setSelected(true);
  +        levelDisplayText.setSelected(true);
         }
  +
         final int responsiveness =
           event.asInt(ChainsawToolBarAndMenus.SETTING_RESPONSIVENESS);
         final int tabPlacement =
  @@ -1035,8 +1140,38 @@
       event.saveSetting(
         ChainsawToolBarAndMenus.SETTING_TAB_PLACEMENT,
         logui.tabbedPane.getTabPlacement());
  -      
  +
       event.saveSetting(ChainsawConstants.LEVEL_DISPLAY, levelDisplay);
  +  }
  +
  +  public static class ReceiversTableModel extends AbstractTableModel {
  +    private List receivers;
  +
  +    public Object getValueAt(int row, int col) {
  +      return receivers.get(row);
  +    }
  +
  +    public int getColumnCount() {
  +      return 1;
  +    }
  +
  +    public int getRowCount() {
  +      return receivers.size();
  +    }
  +
  +    public void refresh() {
  +      synchronized (this) {
  +        receivers =
  +          PluginRegistry.getPlugins(
  +            LogManager.getLoggerRepository(), Receiver.class);
  +      }
  +
  +      fireTableDataChanged();
  +    }
  +
  +    public String getColumnName(int column) {
  +      return "Receiver Details";
  +    }
     }
   
     /**
  
  
  

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

Reply via email to