psmith      2003/06/16 20:58:05

  Modified:    src/java/org/apache/log4j/chainsaw
                        ChainsawToolBarAndMenus.java
  Log:
  Modified the show Receivers action to show all the receivers
  in a Tree component, together with whether they are active or not.
  
  Currently only really renderes SocketReceivers correctly while I
  nut out some UI elements first.  
  
  WIP.
  
  Revision  Changes    Path
  1.34      +1228 -773 
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.33
  retrieving revision 1.34
  diff -u -r1.33 -r1.34
  --- ChainsawToolBarAndMenus.java      16 Jun 2003 07:24:40 -0000      1.33
  +++ ChainsawToolBarAndMenus.java      17 Jun 2003 03:58:05 -0000      1.34
  @@ -46,7 +46,6 @@
    * Apache Software Foundation, please see <http://www.apache.org/>.
    *
    */
  -
   /*
    * Created on May 3, 2003
    *
  @@ -55,25 +54,13 @@
    */
   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.Graphics;
   import java.awt.Insets;
   import java.awt.event.ActionEvent;
   import java.awt.event.ActionListener;
  @@ -83,18 +70,17 @@
   import java.awt.event.KeyEvent;
   import java.awt.event.MouseEvent;
   import java.awt.event.MouseListener;
  -
   import java.util.ArrayList;
   import java.util.Collection;
   import java.util.Iterator;
   import java.util.List;
  -
   import javax.swing.AbstractAction;
   import javax.swing.Action;
   import javax.swing.BorderFactory;
   import javax.swing.Box;
   import javax.swing.BoxLayout;
   import javax.swing.ButtonGroup;
  +import javax.swing.Icon;
   import javax.swing.ImageIcon;
   import javax.swing.JButton;
   import javax.swing.JCheckBoxMenuItem;
  @@ -114,6 +100,7 @@
   import javax.swing.JTextField;
   import javax.swing.JToggleButton;
   import javax.swing.JToolBar;
  +import javax.swing.JTree;
   import javax.swing.KeyStroke;
   import javax.swing.SwingConstants;
   import javax.swing.SwingUtilities;
  @@ -128,6 +115,24 @@
   import javax.swing.event.DocumentListener;
   import javax.swing.table.AbstractTableModel;
   import javax.swing.table.DefaultTableCellRenderer;
  +import javax.swing.tree.DefaultMutableTreeNode;
  +import javax.swing.tree.DefaultTreeCellRenderer;
  +import javax.swing.tree.DefaultTreeModel;
  +import javax.swing.tree.TreeCellRenderer;
  +import javax.swing.tree.TreeModel;
  +import javax.swing.tree.TreeNode;
  +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;
   
   
   /**
  @@ -135,44 +140,53 @@
    * @author Paul Smith <[EMAIL PROTECTED]>
    *
    */
  -class ChainsawToolBarAndMenus implements ChangeListener, SettingsListener {
  +class ChainsawToolBarAndMenus implements ChangeListener, SettingsListener
  +{
  +  //~ Static fields/initializers ==============================================
  +
     private static final String SETTING_RESPONSIVENESS = "Responsiveness";
     private static final String SETTING_TAB_PLACEMENT = "tab.placement";
  -  private LogUI logui;
  -  private final JToolBar toolbar;
  -  private final JMenuBar menuBar;
  -  private final JMenu viewMenu = new JMenu("View");
  -  private final Collection lookAndFeelMenus = new ArrayList();
  -  private final Action lockToolbarAction;
  -  private final Action toggleToolbarAction;
  -  private final Action pauseAction;
  +
  +  //~ Instance fields =========================================================
  +
  +  final JTextField findTextField;
     private final Action clearAction;
     private final Action closeAction;
  -  private final Action toggleDetailPaneAction;
     private final Action findNextAction;
  +  private final Action lockToolbarAction;
  +  private final Action pauseAction;
     private final Action showPreferencesAction;
  -  private final Action undockAction;
     private final Action showReceiversAction;
  +  private final Action toggleDetailPaneAction;
  +  private final Action toggleToolbarAction;
  +  private final Action undockAction;
  +  private final Collection lookAndFeelMenus = new ArrayList();
     private final FileMenu fileMenu;
  -  private final SmallToggleButton pauseButton = new SmallToggleButton();
  -  private final SmallToggleButton detailPaneButton = new SmallToggleButton();
  -  private final SmallButton clearButton = new SmallButton();
  -  private final JSlider responsiveSlider;
  -  final JTextField findTextField;
  -  private final JRadioButtonMenuItem tabsTop = new JRadioButtonMenuItem("Top");
     private final JCheckBoxMenuItem toggleStatusBarCheck =
       new JCheckBoxMenuItem();
  -  private final JRadioButtonMenuItem tabsBottom =
  -    new JRadioButtonMenuItem("Bottom");
  +  private final JMenu viewMenu = new JMenu("View");
  +  private final JMenuBar menuBar;
     private final JRadioButtonMenuItem levelDisplayIcon =
       new JRadioButtonMenuItem("Icon");
     private final JRadioButtonMenuItem levelDisplayText =
       new JRadioButtonMenuItem("Text");
  -  private String levelDisplay = ChainsawConstants.LEVEL_DISPLAY_ICONS;
  +  private final JRadioButtonMenuItem tabsBottom =
  +    new JRadioButtonMenuItem("Bottom");
  +  private final JRadioButtonMenuItem tabsTop = new JRadioButtonMenuItem("Top");
  +  private final JSlider responsiveSlider;
  +  private final JToolBar toolbar;
  +  private LogUI logui;
  +  private final SmallButton clearButton = new SmallButton();
  +  private final SmallToggleButton detailPaneButton = new SmallToggleButton();
  +  private final SmallToggleButton pauseButton = new SmallToggleButton();
     private String lastFind = "";
  +  private String levelDisplay = ChainsawConstants.LEVEL_DISPLAY_ICONS;
     private final Action[] logPanelSpecificActions;
   
  -  ChainsawToolBarAndMenus(final LogUI logui) {
  +  //~ Constructors ============================================================
  +
  +  ChainsawToolBarAndMenus(final LogUI logui)
  +  {
       this.logui = logui;
       toolbar = new JToolBar(JToolBar.HORIZONTAL);
       menuBar = new JMenuBar();
  @@ -194,337 +208,381 @@
       createToolbar();
   
       logPanelSpecificActions =
  -      new Action[] {
  +      new Action[]
  +      {
           pauseAction, findNextAction, clearAction, fileMenu.getFileSaveAction(),
           toggleDetailPaneAction, showPreferencesAction, undockAction
         };
     }
   
  +  //~ Methods =================================================================
  +
     /**
  -   * @return
  +   * DOCUMENT ME!
  +   *
  +   * @param event DOCUMENT ME!
      */
  -  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);
  +  public void loadSettings(LoadSettingsEvent event)
  +  {
  +    try
  +    {
  +      levelDisplay = event.getSetting(ChainsawConstants.LEVEL_DISPLAY);
   
  -    final Container container = receiversWindow.getContentPane();
  -    container.add(new JScrollPane(table));
  -    receiversWindow.setSize(320, 240);
  +      if (levelDisplay.equals(ChainsawConstants.LEVEL_DISPLAY_ICONS))
  +      {
  +        levelDisplayIcon.setSelected(true);
  +      }
  +      else
  +      {
  +        levelDisplayText.setSelected(true);
  +      }
   
  -    final Action action =
  -      new AbstractAction("Show Receivers...") {
  -        public void actionPerformed(ActionEvent arg0) {
  -          model.refresh();
  +      final int responsiveness =
  +        event.asInt(ChainsawToolBarAndMenus.SETTING_RESPONSIVENESS);
  +      final int tabPlacement =
  +        event.asInt(ChainsawToolBarAndMenus.SETTING_TAB_PLACEMENT);
   
  -          if (!receiversWindow.isVisible()) {
  -            receiversWindow.setVisible(true);
  +      SwingUtilities.invokeLater(
  +        new Runnable()
  +        {
  +          public void run()
  +          {
  +            responsiveSlider.setValue(responsiveness);
  +            logui.tabbedPane.setTabPlacement(tabPlacement);
  +            scanState();
             }
  -
  -          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;
  +        });
  +    }
  +    catch (NullPointerException e)
  +    {
  +      LogLog.error("error decoding setting", e);
  +    }
     }
   
  -  JToolBar getToolbar() {
  -    return toolbar;
  -  }
  +  /**
  +   * DOCUMENT ME!
  +   *
  +   * @param event DOCUMENT ME!
  +   */
  +  public void saveSettings(SaveSettingsEvent event)
  +  {
  +    event.saveSetting(
  +      ChainsawToolBarAndMenus.SETTING_RESPONSIVENESS,
  +      responsiveSlider.getValue());
   
  -  JMenuBar getMenubar() {
  -    return menuBar;
  +    event.saveSetting(
  +      ChainsawToolBarAndMenus.SETTING_TAB_PLACEMENT,
  +      logui.tabbedPane.getTabPlacement());
  +
  +    event.saveSetting(ChainsawConstants.LEVEL_DISPLAY, levelDisplay);
     }
   
  -  public void stateChanged(ChangeEvent e) {
  +  /**
  +   * DOCUMENT ME!
  +   */
  +  public void stateChange()
  +  {
       scanState();
     }
   
  -  public void stateChange() {
  +  /**
  +   * DOCUMENT ME!
  +   *
  +   * @param e DOCUMENT ME!
  +   */
  +  public void stateChanged(ChangeEvent e)
  +  {
       scanState();
     }
   
  -  private void scanState() {
  -    switch (logui.tabbedPane.getTabPlacement()) {
  -    case SwingConstants.TOP:
  -      tabsTop.setSelected(true);
  +  JMenuBar getMenubar()
  +  {
  +    return menuBar;
  +  }
   
  -      break;
  +  JToolBar getToolbar()
  +  {
  +    return toolbar;
  +  }
   
  -    case SwingConstants.BOTTOM:
  -      tabsBottom.setSelected(true);
  +  JToolBar createDockwindowToolbar(
  +    final JFrame dockablePanel, final LogUI.LogPanel logPanel)
  +  {
  +    final JToolBar toolbar = new JToolBar();
  +    toolbar.setFloatable(false);
   
  -      break;
  -    }
  +    final String ident = dockablePanel.getTitle();
  +    final Action dockPauseAction =
  +      new AbstractAction("Pause")
  +      {
  +        public void actionPerformed(ActionEvent evt)
  +        {
  +          System.out.println("trying to pause '" + ident + "'");
   
  -    toggleStatusBarCheck.setSelected(logui.isStatusBarVisible());
  +          if (!logui.pausedList.contains(ident))
  +          {
  +            logui.pausedList.add(ident);
  +          }
  +          else
  +          {
  +            logui.pausedList.remove(ident);
  +          }
  +        }
  +      };
   
  -    /**
  -     * We get the currently selected LogPanel, and if null, deactivate some
  -     * actions
  -     */
  -    LogUI.LogPanel logPanel = logui.getCurrentLogPanel();
  +    dockPauseAction.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_P));
  +    dockPauseAction.putValue(
  +      Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("F12"));
  +    dockPauseAction.putValue(
  +      Action.SHORT_DESCRIPTION,
  +      "Halts the display, while still allowing events to stream in the background");
  +    dockPauseAction.putValue(
  +      Action.SMALL_ICON, new ImageIcon(ChainsawIcons.PAUSE));
   
  -    boolean activateLogPanelActions = true;
  +    final SmallToggleButton dockPauseButton =
  +      new SmallToggleButton(dockPauseAction);
  +    dockPauseButton.setText("");
   
  -    if (logPanel == null) {
  -      activateLogPanelActions = false;
  -      logui.getStatusBar().clear();
  -      findTextField.setEnabled(false);
  +    if (logui.pausedList.contains(ident))
  +    {
  +      dockPauseButton.getModel().setSelected(true);
  +    }
  +    else
  +    {
  +      dockPauseButton.getModel().setSelected(false);
  +    }
   
  -      if (logui.tabbedPane.containsWelcomePanel()) {
  -        closeAction.setEnabled(true);
  -      } else {
  -        closeAction.setEnabled(false);
  -      }
  -    } else {
  -      fileMenu.getFileSaveAction().setEnabled(true);
  -      findTextField.setEnabled(true);
  +    dockPauseButton.setText("");
   
  -      if (logui.pausedList.contains(logPanel.getIdentifier())) {
  -        pauseButton.getModel().setSelected(true);
  -        logui.getStatusBar().setPaused(true);
  -      } else {
  -        pauseButton.getModel().setSelected(false);
  -        logui.getStatusBar().setPaused(false);
  -      }
  +    toolbar.add(dockPauseButton);
   
  -      detailPaneButton.getModel().setSelected(logPanel.isDetailPaneVisible());
  -    }
  +    Action dockShowPrefsAction =
  +      new AbstractAction("")
  +      {
  +        public void actionPerformed(ActionEvent arg0)
  +        {
  +          logPanel.showPreferences();
  +        }
  +      };
   
  -    for (int i = 0; i < logPanelSpecificActions.length; i++) {
  -      logPanelSpecificActions[i].setEnabled(activateLogPanelActions);
  -    }
  +    dockShowPrefsAction.putValue(
  +      Action.SHORT_DESCRIPTION,
  +      showPreferencesAction.getValue(Action.SHORT_DESCRIPTION));
  +    dockShowPrefsAction.putValue(
  +      Action.SMALL_ICON, showPreferencesAction.getValue(Action.SMALL_ICON));
   
  -    String currentLookAndFeel =
  -      UIManager.getLookAndFeel().getClass().getName();
  -    String currentLookAndFeelName = UIManager.getLookAndFeel().getName();
  +    toolbar.add(new SmallButton(dockShowPrefsAction));
  +    toolbar.addSeparator();
   
  -    for (Iterator iter = lookAndFeelMenus.iterator(); iter.hasNext();) {
  -      JRadioButtonMenuItem element = (JRadioButtonMenuItem) iter.next();
  +    final Action undockedClearAction =
  +      new AbstractAction("Clear")
  +      {
  +        public void actionPerformed(ActionEvent arg0)
  +        {
  +          logPanel.clearModel();
  +        }
  +      };
   
  -      if (element.getText().equals(currentLookAndFeelName)) {
  -        element.setSelected(true);
  -      } else {
  -        element.setSelected(false);
  -      }
  -    }
  -  }
  +    undockedClearAction.putValue(
  +      Action.SMALL_ICON, new ImageIcon(ChainsawIcons.DELETE));
  +    undockedClearAction.putValue(
  +      Action.SHORT_DESCRIPTION, "Removes all the events from the current view");
   
  -  private void find(boolean next) {
  -    LogUI.LogPanel logPanel = logui.getCurrentLogPanel();
  +    final SmallButton dockClearButton = new SmallButton(undockedClearAction);
  +    dockClearButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
  +      KeyStroke.getKeyStroke(KeyEvent.VK_BACK_SPACE, InputEvent.CTRL_MASK),
  +      undockedClearAction.getValue(Action.NAME));
  +    dockClearButton.getActionMap().put(
  +      undockedClearAction.getValue(Action.NAME), undockedClearAction);
   
  -    if (logPanel != null) {
  -      localFind(next, logPanel, findTextField);
  -    }
  -  }
  +    dockClearButton.setText("");
  +    toolbar.add(dockClearButton);
  +    toolbar.addSeparator();
   
  -  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());
  +    final JTextField findField = createFindField();
  +    findField.getDocument().addDocumentListener(
  +      new DocumentListener()
  +      {
  +        public void insertUpdate(DocumentEvent e)
  +        {
  +          findInUndocked(false);
           }
  -      }
  -
  -      lastFind = theFindTextField.getText();
  -    } else {
  -      theFindTextField.requestFocus();
  -    }
  -  }
   
  -  private void createFindDocListener(final JTextField field) {
  -    field.getDocument().addDocumentListener(
  -      new DocumentListener() {
  -        public void insertUpdate(DocumentEvent e) {
  -          find(false);
  +        public void removeUpdate(DocumentEvent e)
  +        {
  +          findInUndocked(false);
           }
   
  -        public void removeUpdate(DocumentEvent e) {
  -          find(false);
  +        public void changedUpdate(DocumentEvent e)
  +        {
  +          findInUndocked(false);
           }
   
  -        public void changedUpdate(DocumentEvent e) {
  -          find(false);
  +        private void findInUndocked(boolean next)
  +        {
  +          localFind(next, logPanel, findField);
           }
         });
  -  }
   
  -  private Action setupFindFieldsAndActions() {
  -    createFindDocListener(findTextField);
  +    final Action undockedFindAction =
  +      new AbstractAction()
  +      {
  +        public void actionPerformed(ActionEvent e)
  +        {
  +          localFind(true, logPanel, findField);
  +        }
  +      };
   
  -    final Action action =
  -      new AbstractAction("Find Next") {
  -        public void actionPerformed(ActionEvent e) {
  -          find(true);
  +    undockedFindAction.putValue(Action.NAME, "Find");
  +    undockedFindAction.putValue(
  +      Action.SHORT_DESCRIPTION, "Finds the next occurrence within this view");
  +    undockedFindAction.putValue(
  +      Action.SMALL_ICON, new ImageIcon(ChainsawIcons.FIND));
  +
  +    SmallButton undockedFindNextButton = new SmallButton(undockedFindAction);
  +
  +    undockedFindNextButton.setAction(undockedFindAction);
  +    undockedFindNextButton.setText("");
  +    undockedFindNextButton.getActionMap().put(
  +      undockedFindAction.getValue(Action.NAME), undockedFindAction);
  +    undockedFindNextButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
  +      KeyStroke.getKeyStroke("F3"), undockedFindAction.getValue(Action.NAME));
  +
  +    toolbar.add(undockedFindNextButton);
  +    toolbar.add(findField);
  +
  +    toolbar.addSeparator();
  +
  +    Action redockAction =
  +      new AbstractAction("", ChainsawIcons.ICON_DOCK)
  +      {
  +        public void actionPerformed(ActionEvent arg0)
  +        {
  +          logPanel.dock();
           }
         };
   
  -    //    action.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_F));
  -    action.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("F3"));
  -    action.putValue(
  -      Action.SHORT_DESCRIPTION, "Finds the next occurrence of the Find string");
  -    action.putValue(Action.SMALL_ICON, new ImageIcon(ChainsawIcons.FIND));
  +    redockAction.putValue(
  +      Action.SHORT_DESCRIPTION,
  +      "Docks this window back with the main Chainsaw window");
   
  -    return action;
  +    SmallButton redockButton = new SmallButton(redockAction);
  +    toolbar.add(redockButton);
  +
  +    return toolbar;
     }
   
  -  private Action createUndockAction() {
  -    Action action =
  -      new AbstractAction("Undock", ChainsawIcons.ICON_UNDOCK) {
  -        public void actionPerformed(ActionEvent arg0) {
  +  private Action createClearAction()
  +  {
  +    final Action action =
  +      new AbstractAction("Clear")
  +      {
  +        public void actionPerformed(ActionEvent e)
  +        {
             LogUI.LogPanel logPanel = logui.getCurrentLogPanel();
   
  -          if (logPanel != null) {
  -            logPanel.undock();
  +          if (logPanel == null)
  +          {
  +            return;
             }
  +
  +          logPanel.clearModel();
           }
         };
   
  +    action.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_P));
       action.putValue(
  -      Action.SHORT_DESCRIPTION,
  -      "Undocks the current Log panel into it's own window");
  +      Action.ACCELERATOR_KEY,
  +      KeyStroke.getKeyStroke(KeyEvent.VK_BACK_SPACE, InputEvent.CTRL_MASK));
  +    action.putValue(
  +      Action.SHORT_DESCRIPTION, "Removes all the events from the current view");
  +    action.putValue(Action.SMALL_ICON, new ImageIcon(ChainsawIcons.DELETE));
   
  -    //       TODO think of some mnemonics and HotKeys for this action
       return action;
     }
   
  -  private Action createToggleToolbarAction() {
  -    /**
  -     * -== Begin of Show/Hide toolbar action
  -     */
  -    final Action toggleToolbarAction =
  -      new AbstractAction("Show Toolbar") {
  -        private boolean hide = false;
  -
  -        public void actionPerformed(ActionEvent e) {
  -          hide = !hide;
  -
  -          Runnable runnable = null;
  -
  -          if (hide) {
  -            runnable =
  -              new Runnable() {
  -                  public void run() {
  -                    logui.getContentPane().remove(toolbar);
  -                    logui.getRootPane().repaint();
  -                    logui.getRootPane().revalidate();
  -                  }
  -                };
  -          } else {
  -            runnable =
  -              new Runnable() {
  -                  public void run() {
  -                    logui.getContentPane().add(toolbar, BorderLayout.NORTH);
  -                    logui.getRootPane().repaint();
  -                    logui.getRootPane().revalidate();
  -                  }
  -                };
  +  private Action createCloseHelpAction()
  +  {
  +    final Action action =
  +      new AbstractAction()
  +      {
  +        public void actionPerformed(ActionEvent e)
  +        {
  +          if (logui.tabbedPane.containsWelcomePanel())
  +          {
  +            logui.removeWelcomePanel();
  +            closeAction.putValue(Action.NAME, "Show Welcome tab");
  +          }
  +          else
  +          {
  +            logui.addWelcomePanel();
  +            closeAction.putValue(Action.NAME, "Close Welcome tab");
             }
  -
  -          SwingUtilities.invokeLater(runnable);
           }
         };
   
  -    toggleToolbarAction.putValue(
  -      Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_T));
  +    action.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("F1"));
   
  -    return toggleToolbarAction;
  +    //    action.putValue(Action.ACCELERATOR_KEY, 
KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.ALT_MASK));
  +    action.putValue(Action.SHORT_DESCRIPTION, "Removes the Welcome tab");
  +    action.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_C));
  +    action.putValue(Action.NAME, "Close Welcome tab");
  +
  +    return action;
     }
   
  -  private Action createShowPreferencesAction() {
  -    Action showPreferences =
  -      new AbstractAction("", ChainsawIcons.ICON_PREFERENCES) {
  -        public void actionPerformed(ActionEvent arg0) {
  -          LogUI.LogPanel logPanel = logui.getCurrentLogPanel();
  +  private void createFindDocListener(final JTextField field)
  +  {
  +    field.getDocument().addDocumentListener(
  +      new DocumentListener()
  +      {
  +        public void insertUpdate(DocumentEvent e)
  +        {
  +          find(false);
  +        }
   
  -          if (logPanel != null) {
  -            logPanel.showPreferences();
  -          }
  +        public void removeUpdate(DocumentEvent e)
  +        {
  +          find(false);
           }
  -      };
   
  -    showPreferences.putValue(
  -      Action.SHORT_DESCRIPTION, "Define display and color filters...");
  +        public void changedUpdate(DocumentEvent e)
  +        {
  +          find(false);
  +        }
  +      });
  +  }
   
  -    // TODO think of good mnemonics and HotKey for this action
  -    return showPreferences;
  +  private JTextField createFindField()
  +  {
  +    JTextField tf = new JTextField();
  +    Dimension fixedSize = new Dimension(132, 24);
  +    tf.setPreferredSize(fixedSize);
  +    tf.setMaximumSize(fixedSize);
  +    tf.setMinimumSize(fixedSize);
  +    tf.setToolTipText("type in a simple string to find events");
  +
  +    return tf;
     }
   
  -  private Action createLockableToolbarAction() {
  +  private Action createLockableToolbarAction()
  +  {
       final Action lockToolbarAction =
  -      new AbstractAction("Lock Toolbar") {
  +      new AbstractAction("Lock Toolbar")
  +      {
           private boolean lock = true;
   
  -        public void actionPerformed(ActionEvent e) {
  +        public void actionPerformed(ActionEvent e)
  +        {
             lock = !lock;
   
             final boolean isLocked = lock;
             Runnable runnable = null;
             runnable =
  -            new Runnable() {
  -                public void run() {
  +            new Runnable()
  +              {
  +                public void run()
  +                {
                     toolbar.setFloatable(!isLocked);
                     toolbar.repaint();
                   }
  @@ -536,188 +594,254 @@
       return lockToolbarAction;
     }
   
  -  private Action createPauseAction() {
  -    final Action pauseAction =
  -      new AbstractAction("Pause") {
  -        public void actionPerformed(ActionEvent evt) {
  -          LogUI.LogPanel logPanel = logui.getCurrentLogPanel();
  +  private void createMenuBar()
  +  {
  +    JMenu activeTabMenu = new JMenu("Current tab");
   
  -          if (logPanel == null) {
  -            return;
  -          }
  +    JMenuItem menuItemUseRightMouse =
  +      new JMenuItem(
  +        "Other options available via panel's right mouse button popup menu");
  +    menuItemUseRightMouse.setEnabled(false);
  +    activeTabMenu.add(menuItemUseRightMouse);
   
  -          String ident = logPanel.getIdentifier();
  -          System.out.println("trying to pause '" + ident + "'");
  +    viewMenu.setMnemonic('V');
   
  -          if (!logui.pausedList.contains(ident)) {
  -            logui.pausedList.add(ident);
  -          } else {
  -            logui.pausedList.remove(ident);
  -          }
  +    JCheckBoxMenuItem lockToolbarCheck =
  +      new JCheckBoxMenuItem(lockToolbarAction);
  +    lockToolbarCheck.setSelected(true);
   
  -          scanState();
  -        }
  -      };
  +    JCheckBoxMenuItem showToolbarCheck =
  +      new JCheckBoxMenuItem(toggleToolbarAction);
  +    showToolbarCheck.setSelected(true);
   
  -    pauseAction.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_P));
  -    pauseAction.putValue(
  -      Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("F12"));
  -    pauseAction.putValue(
  -      Action.SHORT_DESCRIPTION,
  -      "Halts the display, while still allowing events to stream in the background");
  -    pauseAction.putValue(
  -      Action.SMALL_ICON, new ImageIcon(ChainsawIcons.PAUSE));
  +    JMenuItem menuItemClose = new JMenuItem(closeAction);
  +    JCheckBoxMenuItem pause = new JCheckBoxMenuItem(pauseAction);
  +    JMenuItem menuPrefs = new JMenuItem(showPreferencesAction);
  +    menuPrefs.setText(
  +      showPreferencesAction.getValue(Action.SHORT_DESCRIPTION).toString());
   
  -    return pauseAction;
  -  }
  +    JMenuItem menuUndock = new JMenuItem(undockAction);
   
  -  private Action createToggleDetailPaneAction() {
  -    Action action =
  -      new AbstractAction("Show Detail Pane") {
  -        boolean enabled = true;
  +    viewMenu.add(menuUndock);
  +    viewMenu.add(pause);
   
  -        public void actionPerformed(ActionEvent evt) {
  -          LogUI.LogPanel logPanel = logui.getCurrentLogPanel();
  +    JCheckBoxMenuItem toggleDetailMenuItem =
  +      new JCheckBoxMenuItem(toggleDetailPaneAction);
  +    toggleDetailMenuItem.setSelected(true);
   
  -          if (logPanel == null) {
  -            return;
  +    final Action toggleStatusBarAction =
  +      new AbstractAction("Show Status bar")
  +      {
  +        public void actionPerformed(ActionEvent arg0)
  +        {
  +          if (toggleStatusBarCheck.isSelected())
  +          {
  +            logui.addStatusBar();
             }
  -
  -          logPanel.toggleDetailPanel();
  -          scanState();
  -        }
  -      };
  -
  -    action.putValue("enabled", Boolean.TRUE);
  -    action.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_D));
  -    action.putValue(
  -      Action.ACCELERATOR_KEY,
  -      KeyStroke.getKeyStroke(KeyEvent.VK_D, InputEvent.ALT_MASK));
  -    action.putValue(Action.SHORT_DESCRIPTION, "Hides/Shows the Detail Pane");
  -    action.putValue(Action.SMALL_ICON, new ImageIcon(ChainsawIcons.INFO));
  -
  -    return action;
  -  }
  -
  -  private Action createCloseHelpAction() {
  -    final Action action =
  -      new AbstractAction() {
  -        public void actionPerformed(ActionEvent e) {
  -          if (logui.tabbedPane.containsWelcomePanel()) {
  -            logui.removeWelcomePanel();
  -            closeAction.putValue(Action.NAME, "Show Welcome tab");
  -          } else {
  -            logui.addWelcomePanel();
  -            closeAction.putValue(Action.NAME, "Close Welcome tab");
  +          else
  +          {
  +            logui.removeStatusBar();
             }
           }
         };
   
  -    action.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("F1"));
  +    toggleStatusBarAction.putValue(
  +      Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_B));
  +    toggleStatusBarCheck.setAction(toggleStatusBarAction);
  +    toggleStatusBarCheck.setSelected(true);
  +    viewMenu.add(toggleDetailMenuItem);
  +    viewMenu.add(menuPrefs);
   
  -    //    action.putValue(Action.ACCELERATOR_KEY, 
KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.ALT_MASK));
  -    action.putValue(Action.SHORT_DESCRIPTION, "Removes the Welcome tab");
  -    action.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_C));
  -    action.putValue(Action.NAME, "Close Welcome tab");
  +    viewMenu.addSeparator();
   
  -    return action;
  -  }
  +    viewMenu.add(new JMenuItem(clearAction));
  +    viewMenu.addSeparator();
  +    viewMenu.add(showToolbarCheck);
  +    viewMenu.add(toggleStatusBarCheck);
  +    viewMenu.add(menuItemClose);
  +    viewMenu.addSeparator();
   
  -  private Action createClearAction() {
  -    final Action action =
  -      new AbstractAction("Clear") {
  -        public void actionPerformed(ActionEvent e) {
  -          LogUI.LogPanel logPanel = logui.getCurrentLogPanel();
  +    ButtonGroup levelIconGroup = new ButtonGroup();
  +    JMenu levelIconMenu = new JMenu("Display Level column as");
  +    levelIconMenu.setMnemonic('l');
   
  -          if (logPanel == null) {
  -            return;
  -          }
  +    levelIconGroup.add(levelDisplayIcon);
  +    levelIconGroup.add(levelDisplayText);
   
  -          logPanel.clearModel();
  +    levelDisplayIcon.addActionListener(
  +      new ActionListener()
  +      {
  +        public void actionPerformed(ActionEvent e)
  +        {
  +          levelDisplay = ChainsawConstants.LEVEL_DISPLAY_ICONS;
  +          SettingsManager.getInstance().saveSettings();
  +          SettingsManager.getInstance().loadSettings();
           }
  -      };
  -
  -    action.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_P));
  -    action.putValue(
  -      Action.ACCELERATOR_KEY,
  -      KeyStroke.getKeyStroke(KeyEvent.VK_BACK_SPACE, InputEvent.CTRL_MASK));
  -    action.putValue(
  -      Action.SHORT_DESCRIPTION, "Removes all the events from the current view");
  -    action.putValue(Action.SMALL_ICON, new ImageIcon(ChainsawIcons.DELETE));
  +      });
   
  -    return action;
  -  }
  +    levelDisplayText.addActionListener(
  +      new ActionListener()
  +      {
  +        public void actionPerformed(ActionEvent e)
  +        {
  +          levelDisplay = ChainsawConstants.LEVEL_DISPLAY_TEXT;
  +          SettingsManager.getInstance().saveSettings();
  +          SettingsManager.getInstance().loadSettings();
  +        }
  +      });
   
  -  private void createToolbar() {
  -    Insets buttonMargins = new Insets(1, 1, 1, 1);
  +    ButtonGroup tabPlacementGroup = new ButtonGroup();
  +    JMenu tabMenu = new JMenu("Tabs");
  +    tabMenu.setMnemonic('a');
   
  -    FileMenu fileMenu = (FileMenu) menuBar.getMenu(0);
  +    tabPlacementGroup.add(tabsTop);
  +    tabPlacementGroup.add(tabsBottom);
   
  -    JButton fileOpenButton =
  -      new SmallButton(fileMenu.getLog4JFileOpenAction());
  -    fileOpenButton.setMargin(buttonMargins);
  +    tabsTop.addActionListener(
  +      new ActionListener()
  +      {
  +        public void actionPerformed(ActionEvent e)
  +        {
  +          logui.tabbedPane.setTabPlacement(JTabbedPane.TOP);
  +        }
  +      });
   
  -    JButton fileSaveButton = new SmallButton(fileMenu.getFileSaveAction());
  -    fileSaveButton.setMargin(buttonMargins);
  +    tabsBottom.addActionListener(
  +      new ActionListener()
  +      {
  +        public void actionPerformed(ActionEvent e)
  +        {
  +          logui.tabbedPane.setTabPlacement(JTabbedPane.BOTTOM);
  +        }
  +      });
   
  -    fileOpenButton.setText("");
  -    fileSaveButton.setText("");
  +    JMenu responsiveNess =
  +      new JMenu(ChainsawToolBarAndMenus.SETTING_RESPONSIVENESS);
  +    responsiveNess.setMnemonic('R');
   
  -    toolbar.add(fileOpenButton);
  -    toolbar.add(fileSaveButton);
  -    toolbar.addSeparator();
  +    responsiveNess.add(createResponsivenessSlider());
   
  -    pauseButton.setAction(pauseAction);
  -    pauseButton.setText("");
  +    final JMenu lookAndFeelMenu = new JMenu("Look & Feel");
  +    lookAndFeelMenu.setMnemonic('L');
   
  -    //               
pauseButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("F12"),pauseAction.getValue(Action.NAME)
 );
  -    pauseButton.getActionMap().put(
  -      pauseAction.getValue(Action.NAME), pauseAction);
  +    UIManager.LookAndFeelInfo[] lookAndFeels =
  +      UIManager.getInstalledLookAndFeels();
   
  -    detailPaneButton.setAction(toggleDetailPaneAction);
  -    detailPaneButton.setText("");
  -    detailPaneButton.getActionMap().put(
  -      toggleDetailPaneAction.getValue(Action.NAME), toggleDetailPaneAction);
  -    detailPaneButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
  -      KeyStroke.getKeyStroke(KeyEvent.VK_D, InputEvent.ALT_MASK),
  -      toggleDetailPaneAction.getValue(Action.NAME));
  +    final ButtonGroup lookAndFeelGroup = new ButtonGroup();
   
  -    SmallButton prefsButton = new SmallButton(showPreferencesAction);
  -    SmallButton undockButton = new SmallButton(undockAction);
  -    undockButton.setText("");
  +    for (int i = 0; i < lookAndFeels.length; i++)
  +    {
  +      final UIManager.LookAndFeelInfo lfInfo = lookAndFeels[i];
  +      final JRadioButtonMenuItem lfItemMenu =
  +        new JRadioButtonMenuItem(lfInfo.getName());
  +      lfItemMenu.addActionListener(
  +        new ActionListener()
  +        {
  +          public void actionPerformed(ActionEvent e)
  +          {
  +            SwingUtilities.invokeLater(
  +              new Runnable()
  +              {
  +                public void run()
  +                {
  +                  logui.setLookAndFeel(lfInfo.getClassName());
  +                }
  +              });
  +          }
  +        });
  +      lookAndFeelGroup.add(lfItemMenu);
  +      lookAndFeelMenu.add(lfItemMenu);
  +      lookAndFeelMenus.add(lfItemMenu);
  +    }
   
  -    toolbar.add(undockButton);
  -    toolbar.add(pauseButton);
  -    toolbar.add(detailPaneButton);
  -    toolbar.add(prefsButton);
  -    toolbar.addSeparator();
  +    levelIconMenu.add(levelDisplayIcon);
  +    levelIconMenu.add(levelDisplayText);
   
  -    toolbar.add(clearButton);
  -    clearButton.setAction(clearAction);
  -    clearButton.setText("");
  -    toolbar.addSeparator();
  +    if (levelDisplay.equals(ChainsawConstants.LEVEL_DISPLAY_ICONS))
  +    {
  +      levelDisplayIcon.setSelected(true);
  +    }
  +    else
  +    {
  +      levelDisplayText.setSelected(true);
  +    }
   
  -    JButton findNextButton = new SmallButton(findNextAction);
  -    findNextButton.setText("");
  -    findNextButton.getActionMap().put(
  -      findNextAction.getValue(Action.NAME), findNextAction);
  -    findNextButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
  -      (KeyStroke) findNextAction.getValue(Action.ACCELERATOR_KEY),
  -      findNextAction.getValue(Action.NAME));
  +    tabMenu.add(tabsTop);
  +    tabMenu.add(tabsBottom);
   
  -    toolbar.add(findNextButton);
  +    viewMenu.add(levelIconMenu);
  +    viewMenu.add(tabMenu);
  +    viewMenu.add(responsiveNess);
  +    viewMenu.addSeparator();
  +    viewMenu.add(showReceiversAction);
  +    viewMenu.add(lookAndFeelMenu);
   
  -    Box findBox = Box.createHorizontalBox();
  -    findBox.add(findTextField);
  -    toolbar.add(findBox);
  +    JMenu helpMenu = new JMenu("Help");
  +    helpMenu.setMnemonic('H');
   
  -    toolbar.add(Box.createHorizontalGlue());
  +    JMenuItem about = new JMenuItem("About Chainsaw v2...");
  +    about.setMnemonic('A');
  +    about.addActionListener(
  +      new ActionListener()
  +      {
  +        public void actionPerformed(ActionEvent e)
  +        {
  +          logui.showAboutBox();
  +        }
  +      });
   
  -    toolbar.setMargin(buttonMargins);
  -    toolbar.setFloatable(false);
  +    helpMenu.add(about);
  +
  +    menuBar.add(fileMenu);
  +    menuBar.add(viewMenu);
  +    menuBar.add(activeTabMenu);
  +    menuBar.add(helpMenu);
  +  }
  +
  +  private Action createPauseAction()
  +  {
  +    final Action pauseAction =
  +      new AbstractAction("Pause")
  +      {
  +        public void actionPerformed(ActionEvent evt)
  +        {
  +          LogUI.LogPanel logPanel = logui.getCurrentLogPanel();
  +
  +          if (logPanel == null)
  +          {
  +            return;
  +          }
  +
  +          String ident = logPanel.getIdentifier();
  +          System.out.println("trying to pause '" + ident + "'");
  +
  +          if (!logui.pausedList.contains(ident))
  +          {
  +            logui.pausedList.add(ident);
  +          }
  +          else
  +          {
  +            logui.pausedList.remove(ident);
  +          }
  +
  +          scanState();
  +        }
  +      };
  +
  +    pauseAction.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_P));
  +    pauseAction.putValue(
  +      Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("F12"));
  +    pauseAction.putValue(
  +      Action.SHORT_DESCRIPTION,
  +      "Halts the display, while still allowing events to stream in the background");
  +    pauseAction.putValue(
  +      Action.SMALL_ICON, new ImageIcon(ChainsawIcons.PAUSE));
  +
  +    return pauseAction;
     }
   
  -  private JComponent createResponsivenessSlider() {
  +  private JComponent createResponsivenessSlider()
  +  {
       JPanel responsiveNessPanel = new JPanel();
       BoxLayout layout = new BoxLayout(responsiveNessPanel, BoxLayout.Y_AXIS);
   
  @@ -737,16 +861,22 @@
       responsiveSlider.setPaintTrack(true);
       responsiveSlider.setInverted(true);
       responsiveSlider.getModel().addChangeListener(
  -      new ChangeListener() {
  -        public void stateChanged(ChangeEvent e) {
  -          if (responsiveSlider.getValueIsAdjusting()) {
  +      new ChangeListener()
  +      {
  +        public void stateChanged(ChangeEvent e)
  +        {
  +          if (responsiveSlider.getValueIsAdjusting())
  +          {
               /**
                * We'll wait until it stops.
                */
  -          } else {
  +          }
  +          else
  +          {
               int value = responsiveSlider.getValue();
   
  -            if (value == 0) {
  +            if (value == 0)
  +            {
                 value = 100;
               }
   
  @@ -768,399 +898,547 @@
       return responsiveNessPanel;
     }
   
  -  private void createMenuBar() {
  -    JMenu activeTabMenu = new JMenu("Current tab");
  -
  -    JMenuItem menuItemUseRightMouse =
  -      new JMenuItem(
  -        "Other options available via panel's right mouse button popup menu");
  -    menuItemUseRightMouse.setEnabled(false);
  -    activeTabMenu.add(menuItemUseRightMouse);
  +  private Action createShowPreferencesAction()
  +  {
  +    Action showPreferences =
  +      new AbstractAction("", ChainsawIcons.ICON_PREFERENCES)
  +      {
  +        public void actionPerformed(ActionEvent arg0)
  +        {
  +          LogUI.LogPanel logPanel = logui.getCurrentLogPanel();
   
  -    viewMenu.setMnemonic('V');
  +          if (logPanel != null)
  +          {
  +            logPanel.showPreferences();
  +          }
  +        }
  +      };
   
  -    JCheckBoxMenuItem lockToolbarCheck =
  -      new JCheckBoxMenuItem(lockToolbarAction);
  -    lockToolbarCheck.setSelected(true);
  +    showPreferences.putValue(
  +      Action.SHORT_DESCRIPTION, "Define display and color filters...");
   
  -    JCheckBoxMenuItem showToolbarCheck =
  -      new JCheckBoxMenuItem(toggleToolbarAction);
  -    showToolbarCheck.setSelected(true);
  +    // TODO think of good mnemonics and HotKey for this action
  +    return showPreferences;
  +  }
   
  -    JMenuItem menuItemClose = new JMenuItem(closeAction);
  -    JCheckBoxMenuItem pause = new JCheckBoxMenuItem(pauseAction);
  -    JMenuItem menuPrefs = new JMenuItem(showPreferencesAction);
  -    menuPrefs.setText(
  -      showPreferencesAction.getValue(Action.SHORT_DESCRIPTION).toString());
  +  /**
  +   * @return
  +   */
  +  private Action createShowReceiversAction()
  +  {
  +    final JDialog receiversWindow = new JDialog(logui, "Receivers", false);
   
  -    JMenuItem menuUndock = new JMenuItem(undockAction);
  +    final JTree tree = new JTree(ReceiversTreeModel.create());
  +    tree.setCellRenderer(new ReceiverTreeCellRenderer());
   
  -    viewMenu.add(menuUndock);
  -    viewMenu.add(pause);
  +    final Container container = receiversWindow.getContentPane();
  +    JComponent component = tree;
  +    container.add(new JScrollPane(component));
  +    receiversWindow.setSize(320, 240);
   
  -    JCheckBoxMenuItem toggleDetailMenuItem =
  -      new JCheckBoxMenuItem(toggleDetailPaneAction);
  -    toggleDetailMenuItem.setSelected(true);
  +    final Action action =
  +      new AbstractAction("Show Receivers...")
  +      {
  +        public void actionPerformed(ActionEvent arg0)
  +        {
  +          tree.setModel(ReceiversTreeModel.create());
   
  -    final Action toggleStatusBarAction =
  -      new AbstractAction("Show Status bar") {
  -        public void actionPerformed(ActionEvent arg0) {
  -          if (toggleStatusBarCheck.isSelected()) {
  -            logui.addStatusBar();
  -          } else {
  -            logui.removeStatusBar();
  +          if (!receiversWindow.isVisible())
  +          {
  +            receiversWindow.setVisible(true);
             }
  +
  +          receiversWindow.setLocationRelativeTo(logui);
           }
         };
   
  -    toggleStatusBarAction.putValue(
  -      Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_B));
  -    toggleStatusBarCheck.setAction(toggleStatusBarAction);
  -    toggleStatusBarCheck.setSelected(true);
  -    viewMenu.add(toggleDetailMenuItem);
  -    viewMenu.add(menuPrefs);
  +    action.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_E));
  +    action.putValue(
  +      Action.SHORT_DESCRIPTION,
  +      "Shows the currently configured Log4j Receivers");
   
  -    viewMenu.addSeparator();
  +    return action;
  +  }
   
  -    viewMenu.add(new JMenuItem(clearAction));
  -    viewMenu.addSeparator();
  -    viewMenu.add(showToolbarCheck);
  -    viewMenu.add(toggleStatusBarCheck);
  -    viewMenu.add(menuItemClose);
  -    viewMenu.addSeparator();
  +  private Action createToggleDetailPaneAction()
  +  {
  +    Action action =
  +      new AbstractAction("Show Detail Pane")
  +      {
  +        boolean enabled = true;
   
  -    ButtonGroup levelIconGroup = new ButtonGroup();
  -    JMenu levelIconMenu = new JMenu("Display Level column as");
  -    levelIconMenu.setMnemonic('l');
  +        public void actionPerformed(ActionEvent evt)
  +        {
  +          LogUI.LogPanel logPanel = logui.getCurrentLogPanel();
   
  -    levelIconGroup.add(levelDisplayIcon);
  -    levelIconGroup.add(levelDisplayText);
  +          if (logPanel == null)
  +          {
  +            return;
  +          }
   
  -    levelDisplayIcon.addActionListener(
  -      new ActionListener() {
  -        public void actionPerformed(ActionEvent e) {
  -          levelDisplay = ChainsawConstants.LEVEL_DISPLAY_ICONS;
  -          SettingsManager.getInstance().saveSettings();
  -          SettingsManager.getInstance().loadSettings();
  +          logPanel.toggleDetailPanel();
  +          scanState();
           }
  -      });
  +      };
   
  -    levelDisplayText.addActionListener(
  -      new ActionListener() {
  -        public void actionPerformed(ActionEvent e) {
  -          levelDisplay = ChainsawConstants.LEVEL_DISPLAY_TEXT;
  -          SettingsManager.getInstance().saveSettings();
  -          SettingsManager.getInstance().loadSettings();
  -        }
  -      });
  +    action.putValue("enabled", Boolean.TRUE);
  +    action.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_D));
  +    action.putValue(
  +      Action.ACCELERATOR_KEY,
  +      KeyStroke.getKeyStroke(KeyEvent.VK_D, InputEvent.ALT_MASK));
  +    action.putValue(Action.SHORT_DESCRIPTION, "Hides/Shows the Detail Pane");
  +    action.putValue(Action.SMALL_ICON, new ImageIcon(ChainsawIcons.INFO));
   
  -    ButtonGroup tabPlacementGroup = new ButtonGroup();
  -    JMenu tabMenu = new JMenu("Tabs");
  -    tabMenu.setMnemonic('a');
  +    return action;
  +  }
   
  -    tabPlacementGroup.add(tabsTop);
  -    tabPlacementGroup.add(tabsBottom);
  +  private Action createToggleToolbarAction()
  +  {
  +    /**
  +     * -== Begin of Show/Hide toolbar action
  +     */
  +    final Action toggleToolbarAction =
  +      new AbstractAction("Show Toolbar")
  +      {
  +        private boolean hide = false;
   
  -    tabsTop.addActionListener(
  -      new ActionListener() {
  -        public void actionPerformed(ActionEvent e) {
  -          logui.tabbedPane.setTabPlacement(JTabbedPane.TOP);
  -        }
  -      });
  +        public void actionPerformed(ActionEvent e)
  +        {
  +          hide = !hide;
   
  -    tabsBottom.addActionListener(
  -      new ActionListener() {
  -        public void actionPerformed(ActionEvent e) {
  -          logui.tabbedPane.setTabPlacement(JTabbedPane.BOTTOM);
  -        }
  -      });
  +          Runnable runnable = null;
   
  -    JMenu responsiveNess =
  -      new JMenu(ChainsawToolBarAndMenus.SETTING_RESPONSIVENESS);
  -    responsiveNess.setMnemonic('R');
  +          if (hide)
  +          {
  +            runnable =
  +              new Runnable()
  +                {
  +                  public void run()
  +                  {
  +                    logui.getContentPane().remove(toolbar);
  +                    logui.getRootPane().repaint();
  +                    logui.getRootPane().revalidate();
  +                  }
  +                };
  +          }
  +          else
  +          {
  +            runnable =
  +              new Runnable()
  +                {
  +                  public void run()
  +                  {
  +                    logui.getContentPane().add(toolbar, BorderLayout.NORTH);
  +                    logui.getRootPane().repaint();
  +                    logui.getRootPane().revalidate();
  +                  }
  +                };
  +          }
   
  -    responsiveNess.add(createResponsivenessSlider());
  +          SwingUtilities.invokeLater(runnable);
  +        }
  +      };
   
  -    final JMenu lookAndFeelMenu = new JMenu("Look & Feel");
  -    lookAndFeelMenu.setMnemonic('L');
  +    toggleToolbarAction.putValue(
  +      Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_T));
   
  -    UIManager.LookAndFeelInfo[] lookAndFeels =
  -      UIManager.getInstalledLookAndFeels();
  +    return toggleToolbarAction;
  +  }
   
  -    final ButtonGroup lookAndFeelGroup = new ButtonGroup();
  +  private void createToolbar()
  +  {
  +    Insets buttonMargins = new Insets(1, 1, 1, 1);
   
  -    for (int i = 0; i < lookAndFeels.length; i++) {
  -      final UIManager.LookAndFeelInfo lfInfo = lookAndFeels[i];
  -      final JRadioButtonMenuItem lfItemMenu =
  -        new JRadioButtonMenuItem(lfInfo.getName());
  -      lfItemMenu.addActionListener(
  -        new ActionListener() {
  -          public void actionPerformed(ActionEvent e) {
  -            SwingUtilities.invokeLater(
  -              new Runnable() {
  -                public void run() {
  -                  logui.setLookAndFeel(lfInfo.getClassName());
  -                }
  -              });
  -          }
  -        });
  -      lookAndFeelGroup.add(lfItemMenu);
  -      lookAndFeelMenu.add(lfItemMenu);
  -      lookAndFeelMenus.add(lfItemMenu);
  -    }
  +    FileMenu fileMenu = (FileMenu) menuBar.getMenu(0);
   
  -    levelIconMenu.add(levelDisplayIcon);
  -    levelIconMenu.add(levelDisplayText);
  +    JButton fileOpenButton =
  +      new SmallButton(fileMenu.getLog4JFileOpenAction());
  +    fileOpenButton.setMargin(buttonMargins);
   
  -    if (levelDisplay.equals(ChainsawConstants.LEVEL_DISPLAY_ICONS)) {
  -      levelDisplayIcon.setSelected(true);
  -    } else {
  -      levelDisplayText.setSelected(true);
  -    }
  +    JButton fileSaveButton = new SmallButton(fileMenu.getFileSaveAction());
  +    fileSaveButton.setMargin(buttonMargins);
   
  -    tabMenu.add(tabsTop);
  -    tabMenu.add(tabsBottom);
  +    fileOpenButton.setText("");
  +    fileSaveButton.setText("");
   
  -    viewMenu.add(levelIconMenu);
  -    viewMenu.add(tabMenu);
  -    viewMenu.add(responsiveNess);
  -    viewMenu.addSeparator();
  -    viewMenu.add(showReceiversAction);
  -    viewMenu.add(lookAndFeelMenu);
  +    toolbar.add(fileOpenButton);
  +    toolbar.add(fileSaveButton);
  +    toolbar.addSeparator();
   
  -    JMenu helpMenu = new JMenu("Help");
  -    helpMenu.setMnemonic('H');
  +    pauseButton.setAction(pauseAction);
  +    pauseButton.setText("");
   
  -    JMenuItem about = new JMenuItem("About Chainsaw v2...");
  -    about.setMnemonic('A');
  -    about.addActionListener(
  -      new ActionListener() {
  -        public void actionPerformed(ActionEvent e) {
  -          logui.showAboutBox();
  -        }
  -      });
  +    //               
pauseButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("F12"),pauseAction.getValue(Action.NAME)
 );
  +    pauseButton.getActionMap().put(
  +      pauseAction.getValue(Action.NAME), pauseAction);
   
  -    helpMenu.add(about);
  +    detailPaneButton.setAction(toggleDetailPaneAction);
  +    detailPaneButton.setText("");
  +    detailPaneButton.getActionMap().put(
  +      toggleDetailPaneAction.getValue(Action.NAME), toggleDetailPaneAction);
  +    detailPaneButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
  +      KeyStroke.getKeyStroke(KeyEvent.VK_D, InputEvent.ALT_MASK),
  +      toggleDetailPaneAction.getValue(Action.NAME));
   
  -    menuBar.add(fileMenu);
  -    menuBar.add(viewMenu);
  -    menuBar.add(activeTabMenu);
  -    menuBar.add(helpMenu);
  -  }
  +    SmallButton prefsButton = new SmallButton(showPreferencesAction);
  +    SmallButton undockButton = new SmallButton(undockAction);
  +    undockButton.setText("");
   
  -  JToolBar createDockwindowToolbar(
  -    final JFrame dockablePanel, final LogUI.LogPanel logPanel) {
  -    final JToolBar toolbar = new JToolBar();
  -    toolbar.setFloatable(false);
  +    toolbar.add(undockButton);
  +    toolbar.add(pauseButton);
  +    toolbar.add(detailPaneButton);
  +    toolbar.add(prefsButton);
  +    toolbar.addSeparator();
   
  -    final String ident = dockablePanel.getTitle();
  -    final Action dockPauseAction =
  -      new AbstractAction("Pause") {
  -        public void actionPerformed(ActionEvent evt) {
  -          System.out.println("trying to pause '" + ident + "'");
  +    toolbar.add(clearButton);
  +    clearButton.setAction(clearAction);
  +    clearButton.setText("");
  +    toolbar.addSeparator();
   
  -          if (!logui.pausedList.contains(ident)) {
  -            logui.pausedList.add(ident);
  -          } else {
  -            logui.pausedList.remove(ident);
  -          }
  -        }
  -      };
  +    JButton findNextButton = new SmallButton(findNextAction);
  +    findNextButton.setText("");
  +    findNextButton.getActionMap().put(
  +      findNextAction.getValue(Action.NAME), findNextAction);
  +    findNextButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
  +      (KeyStroke) findNextAction.getValue(Action.ACCELERATOR_KEY),
  +      findNextAction.getValue(Action.NAME));
   
  -    dockPauseAction.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_P));
  -    dockPauseAction.putValue(
  -      Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("F12"));
  -    dockPauseAction.putValue(
  -      Action.SHORT_DESCRIPTION,
  -      "Halts the display, while still allowing events to stream in the background");
  -    dockPauseAction.putValue(
  -      Action.SMALL_ICON, new ImageIcon(ChainsawIcons.PAUSE));
  +    toolbar.add(findNextButton);
   
  -    final SmallToggleButton dockPauseButton =
  -      new SmallToggleButton(dockPauseAction);
  -    dockPauseButton.setText("");
  +    Box findBox = Box.createHorizontalBox();
  +    findBox.add(findTextField);
  +    toolbar.add(findBox);
   
  -    if (logui.pausedList.contains(ident)) {
  -      dockPauseButton.getModel().setSelected(true);
  -    } else {
  -      dockPauseButton.getModel().setSelected(false);
  -    }
  +    toolbar.add(Box.createHorizontalGlue());
   
  -    dockPauseButton.setText("");
  +    toolbar.setMargin(buttonMargins);
  +    toolbar.setFloatable(false);
  +  }
   
  -    toolbar.add(dockPauseButton);
  +  private Action createUndockAction()
  +  {
  +    Action action =
  +      new AbstractAction("Undock", ChainsawIcons.ICON_UNDOCK)
  +      {
  +        public void actionPerformed(ActionEvent arg0)
  +        {
  +          LogUI.LogPanel logPanel = logui.getCurrentLogPanel();
   
  -    Action dockShowPrefsAction =
  -      new AbstractAction("") {
  -        public void actionPerformed(ActionEvent arg0) {
  -          logPanel.showPreferences();
  +          if (logPanel != null)
  +          {
  +            logPanel.undock();
  +          }
           }
         };
   
  -    dockShowPrefsAction.putValue(
  +    action.putValue(
         Action.SHORT_DESCRIPTION,
  -      showPreferencesAction.getValue(Action.SHORT_DESCRIPTION));
  -    dockShowPrefsAction.putValue(
  -      Action.SMALL_ICON, showPreferencesAction.getValue(Action.SMALL_ICON));
  +      "Undocks the current Log panel into it's own window");
   
  -    toolbar.add(new SmallButton(dockShowPrefsAction));
  -    toolbar.addSeparator();
  +    //       TODO think of some mnemonics and HotKeys for this action
  +    return action;
  +  }
   
  -    final Action undockedClearAction =
  -      new AbstractAction("Clear") {
  -        public void actionPerformed(ActionEvent arg0) {
  -          logPanel.clearModel();
  -        }
  -      };
  +  private void find(boolean next)
  +  {
  +    LogUI.LogPanel logPanel = logui.getCurrentLogPanel();
   
  -    undockedClearAction.putValue(
  -      Action.SMALL_ICON, new ImageIcon(ChainsawIcons.DELETE));
  -    undockedClearAction.putValue(
  -      Action.SHORT_DESCRIPTION, "Removes all the events from the current view");
  +    if (logPanel != null)
  +    {
  +      localFind(next, logPanel, findTextField);
  +    }
  +  }
   
  -    final SmallButton dockClearButton = new SmallButton(undockedClearAction);
  -    dockClearButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
  -      KeyStroke.getKeyStroke(KeyEvent.VK_BACK_SPACE, InputEvent.CTRL_MASK),
  -      undockedClearAction.getValue(Action.NAME));
  -    dockClearButton.getActionMap().put(
  -      undockedClearAction.getValue(Action.NAME), undockedClearAction);
  +  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();
  +    }
  +    else
  +    {
  +      theFindTextField.requestFocus();
  +    }
  +  }
   
  -    dockClearButton.setText("");
  -    toolbar.add(dockClearButton);
  -    toolbar.addSeparator();
  +  private void scanState()
  +  {
  +    switch (logui.tabbedPane.getTabPlacement())
  +    {
  +      case SwingConstants.TOP :
  +        tabsTop.setSelected(true);
   
  -    final JTextField findField = createFindField();
  -    findField.getDocument().addDocumentListener(
  -      new DocumentListener() {
  -        public void insertUpdate(DocumentEvent e) {
  -          findInUndocked(false);
  -        }
  +        break;
   
  -        public void removeUpdate(DocumentEvent e) {
  -          findInUndocked(false);
  -        }
  +      case SwingConstants.BOTTOM :
  +        tabsBottom.setSelected(true);
   
  -        public void changedUpdate(DocumentEvent e) {
  -          findInUndocked(false);
  -        }
  +        break;
  +    }
   
  -        private void findInUndocked(boolean next) {
  -          localFind(next, logPanel, findField);
  -        }
  -      });
  +    toggleStatusBarCheck.setSelected(logui.isStatusBarVisible());
   
  -    final Action undockedFindAction =
  -      new AbstractAction() {
  -        public void actionPerformed(ActionEvent e) {
  -          localFind(true, logPanel, findField);
  -        }
  -      };
  +    /**
  +     * We get the currently selected LogPanel, and if null, deactivate some
  +     * actions
  +     */
  +    LogUI.LogPanel logPanel = logui.getCurrentLogPanel();
   
  -    undockedFindAction.putValue(Action.NAME, "Find");
  -    undockedFindAction.putValue(
  -      Action.SHORT_DESCRIPTION, "Finds the next occurrence within this view");
  -    undockedFindAction.putValue(
  -      Action.SMALL_ICON, new ImageIcon(ChainsawIcons.FIND));
  +    boolean activateLogPanelActions = true;
   
  -    SmallButton undockedFindNextButton = new SmallButton(undockedFindAction);
  +    if (logPanel == null)
  +    {
  +      activateLogPanelActions = false;
  +      logui.getStatusBar().clear();
  +      findTextField.setEnabled(false);
   
  -    undockedFindNextButton.setAction(undockedFindAction);
  -    undockedFindNextButton.setText("");
  -    undockedFindNextButton.getActionMap().put(
  -      undockedFindAction.getValue(Action.NAME), undockedFindAction);
  -    undockedFindNextButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
  -      KeyStroke.getKeyStroke("F3"), undockedFindAction.getValue(Action.NAME));
  +      if (logui.tabbedPane.containsWelcomePanel())
  +      {
  +        closeAction.setEnabled(true);
  +      }
  +      else
  +      {
  +        closeAction.setEnabled(false);
  +      }
  +    }
  +    else
  +    {
  +      fileMenu.getFileSaveAction().setEnabled(true);
  +      findTextField.setEnabled(true);
   
  -    toolbar.add(undockedFindNextButton);
  -    toolbar.add(findField);
  +      if (logui.pausedList.contains(logPanel.getIdentifier()))
  +      {
  +        pauseButton.getModel().setSelected(true);
  +        logui.getStatusBar().setPaused(true);
  +      }
  +      else
  +      {
  +        pauseButton.getModel().setSelected(false);
  +        logui.getStatusBar().setPaused(false);
  +      }
   
  -    toolbar.addSeparator();
  +      detailPaneButton.getModel().setSelected(logPanel.isDetailPaneVisible());
  +    }
   
  -    Action redockAction =
  -      new AbstractAction("", ChainsawIcons.ICON_DOCK) {
  -        public void actionPerformed(ActionEvent arg0) {
  -          logPanel.dock();
  -        }
  -      };
  +    for (int i = 0; i < logPanelSpecificActions.length; i++)
  +    {
  +      logPanelSpecificActions[i].setEnabled(activateLogPanelActions);
  +    }
   
  -    redockAction.putValue(
  -      Action.SHORT_DESCRIPTION,
  -      "Docks this window back with the main Chainsaw window");
  +    String currentLookAndFeel =
  +      UIManager.getLookAndFeel().getClass().getName();
  +    String currentLookAndFeelName = UIManager.getLookAndFeel().getName();
   
  -    SmallButton redockButton = new SmallButton(redockAction);
  -    toolbar.add(redockButton);
  +    for (Iterator iter = lookAndFeelMenus.iterator(); iter.hasNext();)
  +    {
  +      JRadioButtonMenuItem element = (JRadioButtonMenuItem) iter.next();
   
  -    return toolbar;
  +      if (element.getText().equals(currentLookAndFeelName))
  +      {
  +        element.setSelected(true);
  +      }
  +      else
  +      {
  +        element.setSelected(false);
  +      }
  +    }
     }
   
  -  private JTextField createFindField() {
  -    JTextField tf = new JTextField();
  -    Dimension fixedSize = new Dimension(132, 24);
  -    tf.setPreferredSize(fixedSize);
  -    tf.setMaximumSize(fixedSize);
  -    tf.setMinimumSize(fixedSize);
  -    tf.setToolTipText("type in a simple string to find events");
  +  private Action setupFindFieldsAndActions()
  +  {
  +    createFindDocListener(findTextField);
   
  -    return tf;
  +    final Action action =
  +      new AbstractAction("Find Next")
  +      {
  +        public void actionPerformed(ActionEvent e)
  +        {
  +          find(true);
  +        }
  +      };
  +
  +    //    action.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_F));
  +    action.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("F3"));
  +    action.putValue(
  +      Action.SHORT_DESCRIPTION, "Finds the next occurrence of the Find string");
  +    action.putValue(Action.SMALL_ICON, new ImageIcon(ChainsawIcons.FIND));
  +
  +    return action;
     }
   
  -  public void loadSettings(LoadSettingsEvent event) {
  -    try {
  -      levelDisplay = event.getSetting(ChainsawConstants.LEVEL_DISPLAY);
  +  //~ Inner Classes ===========================================================
   
  -      if (levelDisplay.equals(ChainsawConstants.LEVEL_DISPLAY_ICONS)) {
  -        levelDisplayIcon.setSelected(true);
  -      } else {
  -        levelDisplayText.setSelected(true);
  -      }
  +  /**
  +   * DOCUMENT ME!
  +   *
  +   * @author $author$
  +   * @version $Revision$
  +   */
  +  public static class ReceiverTreeCellRenderer extends DefaultTreeCellRenderer
  +  {
  +    //~ Instance fields =======================================================
  +
  +    protected Color m_bkNonSelectionColor;
  +    protected Color m_bkSelectionColor;
  +    protected Color m_borderSelectionColor;
  +    protected Color m_textNonSelectionColor;
  +    protected Color m_textSelectionColor;
  +    private Icon activeReceiverIcon =
  +      new ImageIcon(ChainsawIcons.ICON_ACTIVE_RECEIVER);
  +    private Icon inactiveReceiverIcon =
  +      new ImageIcon(ChainsawIcons.ICON_INACTIVE_RECEIVER);
  +    private Icon rootIcon = new ImageIcon(ChainsawIcons.ANIM_NET_CONNECT);
  +    private boolean m_selected;
   
  -      final int responsiveness =
  -        event.asInt(ChainsawToolBarAndMenus.SETTING_RESPONSIVENESS);
  -      final int tabPlacement =
  -        event.asInt(ChainsawToolBarAndMenus.SETTING_TAB_PLACEMENT);
  +    //~ Constructors ==========================================================
   
  -      SwingUtilities.invokeLater(
  -        new Runnable() {
  -          public void run() {
  -            responsiveSlider.setValue(responsiveness);
  -            logui.tabbedPane.setTabPlacement(tabPlacement);
  -            scanState();
  -          }
  -        });
  -    } catch (NullPointerException e) {
  -      LogLog.error("error decoding setting", e);
  +    public ReceiverTreeCellRenderer()
  +    {
  +      super();
  +
  +      //      m_textSelectionColor = UIManager.getColor("Tree.selectionForeground");
  +      //      m_textNonSelectionColor = UIManager.getColor("Tree.textForeground");
  +      //      m_bkSelectionColor = UIManager.getColor("Tree.selectionBackground");
  +      //      m_bkNonSelectionColor = UIManager.getColor("Tree.textBackground");
  +      //      m_borderSelectionColor = 
UIManager.getColor("Tree.selectionBorderColor");
  +      //      setOpaque(false);
       }
  -  }
   
  -  public void saveSettings(SaveSettingsEvent event) {
  -    event.saveSetting(
  -      ChainsawToolBarAndMenus.SETTING_RESPONSIVENESS,
  -      responsiveSlider.getValue());
  +    //~ Methods ===============================================================
   
  -    event.saveSetting(
  -      ChainsawToolBarAndMenus.SETTING_TAB_PLACEMENT,
  -      logui.tabbedPane.getTabPlacement());
  +    /**
  +     * DOCUMENT ME!
  +     *
  +     * @param tree DOCUMENT ME!
  +     * @param value DOCUMENT ME!
  +     * @param selected DOCUMENT ME!
  +     * @param expanded DOCUMENT ME!
  +     * @param leaf DOCUMENT ME!
  +     * @param row DOCUMENT ME!
  +     * @param hasFocus DOCUMENT ME!
  +     *
  +     * @return DOCUMENT ME!
  +     */
  +    public Component getTreeCellRendererComponent(
  +      JTree tree, Object value, boolean selected, boolean expanded,
  +      boolean leaf, int row, boolean hasFocus)
  +    {
  +      super.getTreeCellRendererComponent(
  +        tree, value, selected, expanded, leaf, row, hasFocus);
  +
  +      DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
  +      Object obj = node.getUserObject();
  +      setText(obj.toString());
  +
  +      if (tree.getModel().getRoot().equals(value))
  +      {
  +        setIcon(rootIcon);
  +      }
  +      else if (obj instanceof SocketReceiver)
  +      {
  +        SocketReceiver receiver = (SocketReceiver) obj;
  +        setText(receiver.getName() + "::" + receiver.getPort());
  +
  +        if (receiver.isActive())
  +        {
  +          setIcon(activeReceiverIcon);
  +        }
  +        else
  +        {
  +          setIcon(inactiveReceiverIcon);
  +        }
  +      }
   
  -    event.saveSetting(ChainsawConstants.LEVEL_DISPLAY, levelDisplay);
  +      return this;
  +    }
     }
   
  -  public static class ReceiversTableModel extends AbstractTableModel {
  +  /**
  +   * DOCUMENT ME!
  +   *
  +   * @author $author$
  +   * @version $Revision$
  +   */
  +  public static class ReceiversTableModel extends AbstractTableModel
  +  {
  +    //~ Instance fields =======================================================
  +
       private List receivers;
   
  -    public Object getValueAt(int row, int col) {
  -      return receivers.get(row);
  -    }
  +    //~ Methods ===============================================================
   
  -    public int getColumnCount() {
  +    /**
  +     * DOCUMENT ME!
  +     *
  +     * @return DOCUMENT ME!
  +     */
  +    public int getColumnCount()
  +    {
         return 1;
       }
   
  -    public int getRowCount() {
  +    /**
  +     * DOCUMENT ME!
  +     *
  +     * @param column DOCUMENT ME!
  +     *
  +     * @return DOCUMENT ME!
  +     */
  +    public String getColumnName(int column)
  +    {
  +      return "Receiver Details";
  +    }
  +
  +    /**
  +     * DOCUMENT ME!
  +     *
  +     * @return DOCUMENT ME!
  +     */
  +    public int getRowCount()
  +    {
         return receivers.size();
       }
   
  -    public void refresh() {
  -      synchronized (this) {
  +    /**
  +     * DOCUMENT ME!
  +     *
  +     * @param row DOCUMENT ME!
  +     * @param col DOCUMENT ME!
  +     *
  +     * @return DOCUMENT ME!
  +     */
  +    public Object getValueAt(int row, int col)
  +    {
  +      return receivers.get(row);
  +    }
  +
  +    /**
  +     * DOCUMENT ME!
  +     */
  +    public void refresh()
  +    {
  +      synchronized (this)
  +      {
           receivers =
             PluginRegistry.getPlugins(
               LogManager.getLoggerRepository(), Receiver.class);
  @@ -1168,9 +1446,64 @@
   
         fireTableDataChanged();
       }
  +  }
  +
  +  /**
  +   * DOCUMENT ME!
  +   *
  +   * @author $author$
  +   * @version $Revision$
  +   */
  +  public static class ReceiversTreeModel extends DefaultTreeModel
  +  {
  +    //~ Constructors ==========================================================
  +
  +    public ReceiversTreeModel()
  +    {
  +      super(new DefaultMutableTreeNode("Receivers"));
  +    }
   
  -    public String getColumnName(int column) {
  -      return "Receiver Details";
  +    //~ Methods ===============================================================
  +
  +    /**
  +     * DOCUMENT ME!
  +     *
  +     * @return DOCUMENT ME!
  +     */
  +    public static final TreeModel create()
  +    {
  +      ReceiversTreeModel model = new ReceiversTreeModel();
  +
  +      Collection receivers =
  +        PluginRegistry.getPlugins(
  +          LogManager.getLoggerRepository(), Receiver.class);
  +
  +      for (Iterator iter = receivers.iterator(); iter.hasNext();)
  +      {
  +        Receiver item = (Receiver) iter.next();
  +        DefaultMutableTreeNode receiverNode = new DefaultMutableTreeNode(item);
  +
  +        if (item instanceof SocketReceiver)
  +        {
  +          for (
  +            Iterator iterator =
  +              ((SocketReceiver) item).getConnectedSocketDetails().iterator();
  +              iterator.hasNext();)
  +          {
  +            Object details = (Object) iterator.next();
  +            receiverNode.add(new DefaultMutableTreeNode(details));
  +          }
  +        }
  +
  +        model.getRootNode().add(receiverNode);
  +      }
  +
  +      return model;
  +    }
  +
  +    DefaultMutableTreeNode getRootNode()
  +    {
  +      return (DefaultMutableTreeNode) getRoot();
       }
     }
   
  @@ -1186,14 +1519,20 @@
      * @author Paul Smith <[EMAIL PROTECTED]>
      *
      */
  -  class SmallButton extends JButton implements MouseListener {
  -    protected Border m_raised = new SoftBevelBorder(BevelBorder.RAISED);
  -    protected Border m_lowered = new SoftBevelBorder(BevelBorder.LOWERED);
  +  class SmallButton extends JButton implements MouseListener
  +  {
  +    //~ Instance fields =======================================================
  +
       protected Border m_inactive = new EmptyBorder(3, 3, 3, 3);
       protected Border m_border = m_inactive;
  +    protected Border m_lowered = new SoftBevelBorder(BevelBorder.LOWERED);
  +    protected Border m_raised = new SoftBevelBorder(BevelBorder.RAISED);
       protected Insets m_ins = new Insets(4, 4, 4, 4);
   
  -    public SmallButton() {
  +    //~ Constructors ==========================================================
  +
  +    public SmallButton()
  +    {
         super();
         setBorder(m_inactive);
         setMargin(m_ins);
  @@ -1201,7 +1540,8 @@
         addMouseListener(this);
       }
   
  -    public SmallButton(Action act) {
  +    public SmallButton(Action act)
  +    {
         this();
         setAction(act);
         setRequestFocusEnabled(false);
  @@ -1210,39 +1550,90 @@
         addMouseListener(this);
       }
   
  -    public float getAlignmentY() {
  +    //~ Methods ===============================================================
  +
  +    /**
  +     * DOCUMENT ME!
  +     *
  +     * @return DOCUMENT ME!
  +     */
  +    public float getAlignmentY()
  +    {
         return 0.5f;
       }
   
  -    public Border getBorder() {
  +    /**
  +     * DOCUMENT ME!
  +     *
  +     * @return DOCUMENT ME!
  +     */
  +    public Border getBorder()
  +    {
         return m_border;
       }
   
  -    public Insets getInsets() {
  +    /**
  +     * DOCUMENT ME!
  +     *
  +     * @return DOCUMENT ME!
  +     */
  +    public Insets getInsets()
  +    {
         return m_ins;
       }
   
  -    public void mousePressed(MouseEvent e) {
  -      m_border = m_lowered;
  -      setBorder(m_lowered);
  +    /**
  +     * DOCUMENT ME!
  +     *
  +     * @param e DOCUMENT ME!
  +     */
  +    public void mouseClicked(MouseEvent e)
  +    {
       }
   
  -    public void mouseReleased(MouseEvent e) {
  -      m_border = m_inactive;
  -      setBorder(m_inactive);
  +    /**
  +     * DOCUMENT ME!
  +     *
  +     * @param e DOCUMENT ME!
  +     */
  +    public void mouseEntered(MouseEvent e)
  +    {
  +      if (isEnabled())
  +      {
  +        m_border = m_raised;
  +        setBorder(m_raised);
  +      }
       }
   
  -    public void mouseClicked(MouseEvent e) {
  +    /**
  +     * DOCUMENT ME!
  +     *
  +     * @param e DOCUMENT ME!
  +     */
  +    public void mouseExited(MouseEvent e)
  +    {
  +      m_border = m_inactive;
  +      setBorder(m_inactive);
       }
   
  -    public void mouseEntered(MouseEvent e) {
  -      if (isEnabled()) {
  -        m_border = m_raised;
  -        setBorder(m_raised);
  -      }
  +    /**
  +     * DOCUMENT ME!
  +     *
  +     * @param e DOCUMENT ME!
  +     */
  +    public void mousePressed(MouseEvent e)
  +    {
  +      m_border = m_lowered;
  +      setBorder(m_lowered);
       }
   
  -    public void mouseExited(MouseEvent e) {
  +    /**
  +     * DOCUMENT ME!
  +     *
  +     * @param e DOCUMENT ME!
  +     */
  +    public void mouseReleased(MouseEvent e)
  +    {
         m_border = m_inactive;
         setBorder(m_inactive);
       }
  @@ -1260,15 +1651,21 @@
      * @author Paul Smith <[EMAIL PROTECTED]>
      */
     class SmallToggleButton extends JToggleButton implements ItemListener,
  -    MouseListener {
  +    MouseListener
  +  {
  +    //~ Instance fields =======================================================
  +
  +    protected Border m_highlighted = new SoftBevelBorder(BevelBorder.RAISED);
       protected Border m_raised = BorderFactory.createEmptyBorder();
       protected Border m_inactive = m_raised;
  -    protected Border m_highlighted = new SoftBevelBorder(BevelBorder.RAISED);
  +    protected Border m_border = m_inactive;
       protected Border m_lowered = new SoftBevelBorder(BevelBorder.LOWERED);
       protected Insets m_ins = new Insets(4, 4, 4, 4);
  -    protected Border m_border = m_inactive;
   
  -    public SmallToggleButton() {
  +    //~ Constructors ==========================================================
  +
  +    public SmallToggleButton()
  +    {
         super();
         setHorizontalAlignment(CENTER);
         setBorder(isSelected() ? m_lowered : m_raised);
  @@ -1279,48 +1676,106 @@
         setText("");
       }
   
  -    public SmallToggleButton(Action action) {
  +    public SmallToggleButton(Action action)
  +    {
         this();
         setAction(action);
       }
   
  -    public float getAlignmentY() {
  +    //~ Methods ===============================================================
  +
  +    /**
  +     * DOCUMENT ME!
  +     *
  +     * @return DOCUMENT ME!
  +     */
  +    public float getAlignmentY()
  +    {
         return 0.5f;
       }
   
  -    public Insets getInsets() {
  -      return m_ins;
  +    /**
  +     * DOCUMENT ME!
  +     *
  +     * @return DOCUMENT ME!
  +     */
  +    public Border getBorder()
  +    {
  +      return m_border;
       }
   
  -    public Border getBorder() {
  -      return m_border;
  +    /**
  +     * DOCUMENT ME!
  +     *
  +     * @return DOCUMENT ME!
  +     */
  +    public Insets getInsets()
  +    {
  +      return m_ins;
       }
   
  -    public void itemStateChanged(ItemEvent e) {
  +    /**
  +     * DOCUMENT ME!
  +     *
  +     * @param e DOCUMENT ME!
  +     */
  +    public void itemStateChanged(ItemEvent e)
  +    {
         setBorder(isSelected() ? m_lowered : m_raised);
       }
   
  -    public void mousePressed(MouseEvent e) {
  -      m_border = m_lowered;
  -      setBorder(m_lowered);
  +    /**
  +     * DOCUMENT ME!
  +     *
  +     * @param e DOCUMENT ME!
  +     */
  +    public void mouseClicked(MouseEvent e)
  +    {
  +    }
  +
  +    /**
  +     * DOCUMENT ME!
  +     *
  +     * @param e DOCUMENT ME!
  +     */
  +    public void mouseEntered(MouseEvent e)
  +    {
  +      if (isEnabled())
  +      {
  +        m_border = m_highlighted;
  +        setBorder(m_highlighted);
  +      }
       }
   
  -    public void mouseReleased(MouseEvent e) {
  +    /**
  +     * DOCUMENT ME!
  +     *
  +     * @param e DOCUMENT ME!
  +     */
  +    public void mouseExited(MouseEvent e)
  +    {
         m_border = m_inactive;
         setBorder(m_inactive);
       }
   
  -    public void mouseClicked(MouseEvent e) {
  +    /**
  +     * DOCUMENT ME!
  +     *
  +     * @param e DOCUMENT ME!
  +     */
  +    public void mousePressed(MouseEvent e)
  +    {
  +      m_border = m_lowered;
  +      setBorder(m_lowered);
       }
   
  -    public void mouseEntered(MouseEvent e) {
  -      if (isEnabled()) {
  -        m_border = m_highlighted;
  -        setBorder(m_highlighted);
  -      }
  -    }
  -    
  -    public void mouseExited(MouseEvent e) {
  +    /**
  +     * DOCUMENT ME!
  +     *
  +     * @param e DOCUMENT ME!
  +     */
  +    public void mouseReleased(MouseEvent e)
  +    {
         m_border = m_inactive;
         setBorder(m_inactive);
       }
  
  
  

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

Reply via email to