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