psmith 2003/06/17 23:29:38 Modified: src/java/org/apache/log4j/chainsaw LogUI.java ChainsawToolBarAndMenus.java Added: src/java/org/apache/log4j/chainsaw ReceiversPanel.java Log: * factored out the Receiver panel into its own class. * Changed the panels home from a Dialog to a snapable location within the main Chainsaw2 window. I have to say, this looks a lot better, IMHO. F6 now toggles the display within the window. Revision Changes Path 1.104 +30 -4 jakarta-log4j-sandbox/src/java/org/apache/log4j/chainsaw/LogUI.java Index: LogUI.java =================================================================== RCS file: /home/cvs/jakarta-log4j-sandbox/src/java/org/apache/log4j/chainsaw/LogUI.java,v retrieving revision 1.103 retrieving revision 1.104 diff -u -r1.103 -r1.104 --- LogUI.java 18 Jun 2003 04:00:06 -0000 1.103 +++ LogUI.java 18 Jun 2003 06:29:38 -0000 1.104 @@ -65,10 +65,13 @@ import java.awt.BorderLayout; import java.awt.Component; +import java.awt.Container; import java.awt.Dimension; import java.awt.Event; import java.awt.FlowLayout; import java.awt.Font; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; import java.awt.Point; import java.awt.Toolkit; import java.awt.event.ActionEvent; @@ -113,6 +116,7 @@ import javax.swing.BorderFactory; import javax.swing.ButtonGroup; import javax.swing.ImageIcon; +import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JCheckBoxMenuItem; import javax.swing.JComboBox; @@ -132,6 +136,7 @@ import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.JToolBar; +import javax.swing.JTree; import javax.swing.JWindow; import javax.swing.KeyStroke; import javax.swing.ListSelectionModel; @@ -144,10 +149,13 @@ import javax.swing.event.ListSelectionListener; import javax.swing.event.TableColumnModelEvent; import javax.swing.event.TableColumnModelListener; +import javax.swing.event.TreeSelectionEvent; +import javax.swing.event.TreeSelectionListener; import javax.swing.table.AbstractTableModel; import javax.swing.table.TableColumn; import javax.swing.table.TableColumnModel; import javax.swing.table.TableModel; +import javax.swing.tree.DefaultMutableTreeNode; /** @@ -187,6 +195,7 @@ private static final String STATUS_BAR = "StatusBar"; private static final String COLUMNS_EXTENSION = ".columns"; private static ChainsawSplash splash; + private JPanel receiversPanel; ChainsawTabbedPane tabbedPane; private JToolBar toolbar; private final ChainsawStatusBar statusBar = new ChainsawStatusBar(); @@ -271,6 +280,7 @@ * */ private void initGUI() { + receiversPanel = new ReceiversPanel(this); tbms = new ChainsawToolBarAndMenus(this); toolbar = tbms.getToolbar(); setJMenuBar(tbms.getMenubar()); @@ -369,10 +379,9 @@ } List utilLevels = new ArrayList(); - Iterator iter = utilList.iterator(); - while (iter.hasNext()) { - utilLevels.add(iter.next().toString()); + for (Iterator iterator = utilLevels.iterator(); iterator.hasNext();) { + utilLevels.add(iterator.next().toString()); } levelMap.put(ChainsawConstants.UTIL_LOGGING_EVENT_TYPE, utilLevels); @@ -532,6 +541,22 @@ tabbedPane.getComponentAt(tabbedPane.indexOfTab("Welcome"))); } + void toggleReceiversPanel() { + SwingUtilities.invokeLater( + new Runnable() { + public void run() { + if (getContentPane().isAncestorOf(receiversPanel)) { + getContentPane().remove(receiversPanel); + } else { + getContentPane().add(receiversPanel, BorderLayout.WEST); + } + + getContentPane().invalidate(); + getContentPane().validate(); + } + }); + } + ChainsawStatusBar getStatusBar() { return statusBar; } @@ -561,7 +586,7 @@ try { int progress = 1; final int delay = 100; - + handler.close(); panel.setProgress(progress++); @@ -1005,6 +1030,7 @@ try { UIManager.setLookAndFeel(lookAndFeelClassName); SwingUtilities.updateComponentTreeUI(this); + SwingUtilities.updateComponentTreeUI(receiversPanel); tbms.lookAndFeelUpdated(); if (tbms != null) { 1.42 +3 -377 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.41 retrieving revision 1.42 diff -u -r1.41 -r1.42 --- ChainsawToolBarAndMenus.java 18 Jun 2003 04:07:40 -0000 1.41 +++ ChainsawToolBarAndMenus.java 18 Jun 2003 06:29:38 -0000 1.42 @@ -138,7 +138,6 @@ class ChainsawToolBarAndMenus implements ChangeListener, SettingsListener { private static final String SETTING_RESPONSIVENESS = "Responsiveness"; private static final String SETTING_TAB_PLACEMENT = "tab.placement"; - final JDialog receiversWindow; final JTextField findTextField; private final Action clearAction; private final Action closeAction; @@ -175,7 +174,6 @@ ChainsawToolBarAndMenus(final LogUI logui) { this.logui = logui; - receiversWindow = new JDialog(logui, "Receivers", false); toolbar = new JToolBar(JToolBar.HORIZONTAL); menuBar = new JMenuBar(); fileMenu = new FileMenu(logui); @@ -422,7 +420,6 @@ } void lookAndFeelUpdated() { - SwingUtilities.updateComponentTreeUI(receiversWindow); fileMenu.lookAndFeelUpdated(); } @@ -684,7 +681,7 @@ viewMenu.add(tabMenu); viewMenu.add(responsiveNess); viewMenu.addSeparator(); - viewMenu.add(showReceiversAction); + viewMenu.add(new JCheckBoxMenuItem(showReceiversAction)); viewMenu.add(lookAndFeelMenu); JMenu helpMenu = new JMenu("Help"); @@ -816,147 +813,13 @@ * @return */ private Action createShowReceiversAction() { - final JTree tree = new JTree(ReceiversTreeModel.create()); - - /** - * We need to setup a runnable that updates the tree - * any time a Socket event happens (opening/closing of a socket). - * - * We do this by installing a SocketNodeEventListener in ALL the - * registered SocketReceivers - */ - final Runnable updateReceiverTree = - new Runnable() { - public void run() { - tree.setModel(ReceiversTreeModel.create()); - } - }; - - tree.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); - - tree.setCellRenderer(new ReceiverTreeCellRenderer()); - - final Container container = receiversWindow.getContentPane(); - container.setLayout(new BorderLayout()); - - JPanel buttonPanel = new JPanel(new GridBagLayout()); - GridBagConstraints c = new GridBagConstraints(); - - final Action playReceiverButtonAction = - new AbstractAction() { - public void actionPerformed(ActionEvent e) { - } - }; - - playReceiverButtonAction.putValue( - Action.SHORT_DESCRIPTION, "Resumes the seleted Node"); - playReceiverButtonAction.putValue( - Action.SMALL_ICON, new ImageIcon(ChainsawIcons.ICON_RESUME_RECEIVER)); - playReceiverButtonAction.setEnabled(false); - - SmallButton playReceiverButton = new SmallButton(playReceiverButtonAction); - - final Action pauseReceiverButtonAction = - new AbstractAction() { - public void actionPerformed(ActionEvent e) { - } - }; - - pauseReceiverButtonAction.putValue( - Action.SHORT_DESCRIPTION, "Pauses the selected Node"); - pauseReceiverButtonAction.putValue( - Action.SMALL_ICON, new ImageIcon(ChainsawIcons.PAUSE)); - pauseReceiverButtonAction.setEnabled(false); - - SmallButton pauseReceiverButton = - new SmallButton(pauseReceiverButtonAction); - - c.weightx = 0.0; - c.weighty = 0.0; - c.ipadx = 2; - c.ipady = 2; - c.gridx = 0; - c.gridy = 0; - c.fill = GridBagConstraints.NONE; - c.anchor = GridBagConstraints.WEST; - buttonPanel.add(playReceiverButton, c); - - c.gridx = 1; - c.weightx = 1.0; - c.weighty = 1.0; - buttonPanel.add(pauseReceiverButton, c); - - tree.addTreeSelectionListener( - new TreeSelectionListener() { - public void valueChanged(TreeSelectionEvent e) { - DefaultMutableTreeNode node = - (DefaultMutableTreeNode) tree.getLastSelectedPathComponent(); - - if (node == null) { - return; - } - - Object nodeInfo = node.getUserObject(); - - if (nodeInfo instanceof SocketReceiver) { - SocketReceiver receiver = (SocketReceiver) nodeInfo; - - if (receiver.isActive()) { - receiver.setActive(false); - pauseReceiverButtonAction.setEnabled(false); - playReceiverButtonAction.setEnabled(true); - } else { - receiver.setActive(true); - pauseReceiverButtonAction.setEnabled(true); - playReceiverButtonAction.setEnabled(false); - } - - updateReceiverTree.run(); - } else { - pauseReceiverButtonAction.setEnabled(false); - playReceiverButtonAction.setEnabled(false); - } - } - }); - - JComponent component = tree; - container.add(new JScrollPane(component), BorderLayout.CENTER); - container.add(buttonPanel, BorderLayout.NORTH); - - receiversWindow.setSize(320, 240); - final Action action = - new AbstractAction("Show Receivers...") { + new AbstractAction("Show Receivers") { public void actionPerformed(ActionEvent arg0) { - tree.setModel(ReceiversTreeModel.create()); - receiversWindow.setLocationRelativeTo(logui); - - if (!receiversWindow.isVisible()) { - receiversWindow.setVisible(true); - } - } - }; - - SocketNodeEventListener listener = - new SocketNodeEventListener() { - public void socketOpened(String remoteInfo) { - SwingUtilities.invokeLater(updateReceiverTree); - } - - public void socketClosedEvent(Exception e) { - SwingUtilities.invokeLater(updateReceiverTree); + logui.toggleReceiversPanel(); } }; - List socketReceivers = - PluginRegistry.getPlugins( - LogManager.getLoggerRepository(), SocketReceiver.class); - - for (Iterator iter = socketReceivers.iterator(); iter.hasNext();) { - SocketReceiver element = (SocketReceiver) iter.next(); - element.addSocketNodeEventListener(listener); - } - action.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_E)); action.putValue( Action.SHORT_DESCRIPTION, @@ -1240,242 +1103,5 @@ action.putValue(Action.SMALL_ICON, new ImageIcon(ChainsawIcons.FIND)); return action; - } - - /** - * A better button class that has nice roll over effects. - * - * This class is borrowed (quite heavily, but with modifications) - * from the "Swing: Second Edition" - * book by Matthew Robinson and Pavel Vorobeiv. An excellent book on Swing. - * - * @author Matthew Robinson - * @author Pavel Vorobeiv - * @author Paul Smith <[EMAIL PROTECTED]> - * - */ - class SmallButton extends JButton implements MouseListener { - 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() { - super(); - setBorder(m_inactive); - setMargin(m_ins); - setRequestFocusEnabled(false); - addMouseListener(this); - } - - public SmallButton(Action act) { - this(); - setAction(act); - setRequestFocusEnabled(false); - - // addActionListener(act); - addMouseListener(this); - } - - /** - * DOCUMENT ME! - * - * @return DOCUMENT ME! - */ - public float getAlignmentY() { - return 0.5f; - } - - /** - * DOCUMENT ME! - * - * @return DOCUMENT ME! - */ - public Border getBorder() { - return m_border; - } - - /** - * DOCUMENT ME! - * - * @return DOCUMENT ME! - */ - public Insets getInsets() { - return m_ins; - } - - /** - * 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_raised; - setBorder(m_raised); - } - } - - /** - * DOCUMENT ME! - * - * @param e DOCUMENT ME! - */ - public void mouseExited(MouseEvent e) { - m_border = m_inactive; - setBorder(m_inactive); - } - - /** - * DOCUMENT ME! - * - * @param e DOCUMENT ME! - */ - public void mousePressed(MouseEvent e) { - m_border = m_lowered; - setBorder(m_lowered); - } - - /** - * DOCUMENT ME! - * - * @param e DOCUMENT ME! - */ - public void mouseReleased(MouseEvent e) { - m_border = m_inactive; - setBorder(m_inactive); - } - } - - /** - * A better button class that has nice roll over effects. - * - * This class is borrowed (quite heavily, but with modifications) - * from the "Swing: Second Edition" - * book by Matthew Robinson and Pavel Vorobeiv. An excellent book on Swing. - * - * @author Matthew Robinson - * @author Pavel Vorobeiv - * @author Paul Smith <[EMAIL PROTECTED]> - */ - class SmallToggleButton extends JToggleButton implements ItemListener, - MouseListener { - protected Border m_highlighted = new SoftBevelBorder(BevelBorder.RAISED); - protected Border m_raised = BorderFactory.createEmptyBorder(); - protected Border m_inactive = m_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); - - public SmallToggleButton() { - super(); - setHorizontalAlignment(CENTER); - setBorder(isSelected() ? m_lowered : m_raised); - setMargin(m_ins); - setRequestFocusEnabled(false); - addItemListener(this); - addMouseListener(this); - setText(""); - } - - public SmallToggleButton(Action action) { - this(); - setAction(action); - } - - /** - * DOCUMENT ME! - * - * @return DOCUMENT ME! - */ - public float getAlignmentY() { - return 0.5f; - } - - /** - * DOCUMENT ME! - * - * @return DOCUMENT ME! - */ - public Border getBorder() { - return m_border; - } - - /** - * DOCUMENT ME! - * - * @return DOCUMENT ME! - */ - public Insets getInsets() { - return m_ins; - } - - /** - * DOCUMENT ME! - * - * @param e DOCUMENT ME! - */ - public void itemStateChanged(ItemEvent e) { - setBorder(isSelected() ? m_lowered : m_raised); - } - - /** - * 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); - } - } - - /** - * DOCUMENT ME! - * - * @param e DOCUMENT ME! - */ - public void mouseExited(MouseEvent e) { - m_border = m_inactive; - setBorder(m_inactive); - } - - /** - * DOCUMENT ME! - * - * @param e DOCUMENT ME! - */ - public void mousePressed(MouseEvent e) { - m_border = m_lowered; - setBorder(m_lowered); - } - - /** - * DOCUMENT ME! - * - * @param e DOCUMENT ME! - */ - public void mouseReleased(MouseEvent e) { - m_border = m_inactive; - setBorder(m_inactive); - } } } 1.1 jakarta-log4j-sandbox/src/java/org/apache/log4j/chainsaw/ReceiversPanel.java Index: ReceiversPanel.java =================================================================== /* * ============================================================================ * The Apache Software License, Version 1.1 * ============================================================================ * * Copyright (C) 1999 The Apache Software Foundation. All rights reserved. * * Redistribution and use in source and binary forms, with or without modifica- * tion, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The end-user documentation included with the redistribution, if any, must * include the following acknowledgment: "This product includes software * developed by the Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, if * and wherever such third-party acknowledgments normally appear. * * 4. The names "log4j" and "Apache Software Foundation" must not be used to * endorse or promote products derived from this software without prior * written permission. For written permission, please contact * [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache", nor may * "Apache" appear in their name, without prior written permission of the * Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU- * DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * This software consists of voluntary contributions made by many individuals * on behalf of the Apache Software Foundation. For more information on the * Apache Software Foundation, please see <http://www.apache.org/>. * */ package org.apache.log4j.chainsaw; import org.apache.log4j.LogManager; import org.apache.log4j.chainsaw.icons.ChainsawIcons; import org.apache.log4j.net.SocketNodeEventListener; import org.apache.log4j.net.SocketReceiver; import org.apache.log4j.plugins.PluginRegistry; import java.awt.BorderLayout; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.util.Iterator; import java.util.List; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.BorderFactory; import javax.swing.ImageIcon; import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.SwingUtilities; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; import javax.swing.tree.DefaultMutableTreeNode; /** * This panel is used to manage all the Receivers configured within Log4j * * * @author Paul Smith <[EMAIL PROTECTED]> * */ class ReceiversPanel extends JPanel { private final JTree receiversTree = new JTree(); private final LogUI logui; ReceiversPanel(final LogUI logui) { super(new BorderLayout()); this.logui = logui; receiversTree.setModel(ReceiversTreeModel.create()); /** * We need to setup a runnable that updates the tree * any time a Socket event happens (opening/closing of a socket). * * We do this by installing a SocketNodeEventListener in ALL the * registered SocketReceivers */ final Runnable updateReceiverTree = new Runnable() { public void run() { receiversTree.setModel(ReceiversTreeModel.create()); } }; receiversTree.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); receiversTree.setCellRenderer(new ReceiverTreeCellRenderer()); JPanel buttonPanel = new JPanel(new GridBagLayout()); GridBagConstraints c = new GridBagConstraints(); final Action playReceiverButtonAction = new AbstractAction() { public void actionPerformed(ActionEvent e) { } }; playReceiverButtonAction.putValue( Action.SHORT_DESCRIPTION, "Resumes the selected Node"); playReceiverButtonAction.putValue( Action.SMALL_ICON, new ImageIcon(ChainsawIcons.ICON_RESUME_RECEIVER)); playReceiverButtonAction.setEnabled(false); SmallButton playReceiverButton = new SmallButton(playReceiverButtonAction); final Action pauseReceiverButtonAction = new AbstractAction() { public void actionPerformed(ActionEvent e) { } }; pauseReceiverButtonAction.putValue( Action.SHORT_DESCRIPTION, "Pauses the selected Node"); pauseReceiverButtonAction.putValue( Action.SMALL_ICON, new ImageIcon(ChainsawIcons.PAUSE)); pauseReceiverButtonAction.setEnabled(false); SmallButton pauseReceiverButton = new SmallButton(pauseReceiverButtonAction); c.weightx = 0.0; c.weighty = 0.0; c.ipadx = 2; c.ipady = 2; c.gridx = 0; c.gridy = 0; c.fill = GridBagConstraints.NONE; c.anchor = GridBagConstraints.WEST; buttonPanel.add(playReceiverButton, c); c.gridx = 1; c.weightx = 1.0; c.weighty = 1.0; buttonPanel.add(pauseReceiverButton, c); c.gridx = 1; c.weightx = 1.0; c.weighty = 1.0; c.anchor = GridBagConstraints.EAST; buttonPanel.add( new SmallButton( new AbstractAction("Close") { public void actionPerformed(ActionEvent e) { logui.toggleReceiversPanel(); } })); receiversTree.addTreeSelectionListener( new TreeSelectionListener() { public void valueChanged(TreeSelectionEvent e) { DefaultMutableTreeNode node = (DefaultMutableTreeNode) receiversTree .getLastSelectedPathComponent(); if (node == null) { return; } Object nodeInfo = node.getUserObject(); if (nodeInfo instanceof SocketReceiver) { SocketReceiver receiver = (SocketReceiver) nodeInfo; if (receiver.isActive()) { receiver.setActive(false); pauseReceiverButtonAction.setEnabled(false); playReceiverButtonAction.setEnabled(true); } else { receiver.setActive(true); pauseReceiverButtonAction.setEnabled(true); playReceiverButtonAction.setEnabled(false); } updateReceiverTree.run(); } else { pauseReceiverButtonAction.setEnabled(false); playReceiverButtonAction.setEnabled(false); } } }); JComponent component = receiversTree; add(new JScrollPane(component), BorderLayout.CENTER); add(buttonPanel, BorderLayout.NORTH); SocketNodeEventListener listener = new SocketNodeEventListener() { public void socketOpened(String remoteInfo) { SwingUtilities.invokeLater(updateReceiverTree); } public void socketClosedEvent(Exception e) { SwingUtilities.invokeLater(updateReceiverTree); } }; List socketReceivers = PluginRegistry.getPlugins( LogManager.getLoggerRepository(), SocketReceiver.class); for (Iterator iter = socketReceivers.iterator(); iter.hasNext();) { SocketReceiver element = (SocketReceiver) iter.next(); element.addSocketNodeEventListener(listener); } } }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]