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]