psmith 2003/09/12 22:56:13
Modified: src/java/org/apache/log4j/chainsaw
ChainsawToolBarAndMenus.java LogPanel.java
ChainsawCyclicBufferTableModel.java
EventContainer.java
src/java/org/apache/log4j/chainsaw/icons ChainsawIcons.java
Added: src/java/org/apache/log4j/chainsaw/icons Refresh16.gif
Refresh24.gif
Log:
Changing between Cyclic and Unlimited mode is now supported, and
can be done via the GUI. The default is Cyclic, with a 5000 event
limit.
There is no way to change the bounds of the Cyclic model at this time,
but that is a goal.
Revision Changes Path
1.13 +39 -3
jakarta-log4j/src/java/org/apache/log4j/chainsaw/ChainsawToolBarAndMenus.java
Index: ChainsawToolBarAndMenus.java
===================================================================
RCS file:
/home/cvs/jakarta-log4j/src/java/org/apache/log4j/chainsaw/ChainsawToolBarAndMenus.java,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- ChainsawToolBarAndMenus.java 12 Sep 2003 03:37:47 -0000 1.12
+++ ChainsawToolBarAndMenus.java 13 Sep 2003 05:56:13 -0000 1.13
@@ -117,6 +117,7 @@
private static final String SETTING_TAB_PLACEMENT = "tab.placement";
private final SmallToggleButton showReceiversButton;
final JTextField findTextField;
+ private final Action changeModelAction;
private final Action clearAction;
private final Action closeAction;
private final Action findNextAction;
@@ -133,6 +134,8 @@
new JCheckBoxMenuItem();
private final JCheckBoxMenuItem toggleDetailMenuItem =
new JCheckBoxMenuItem();
+ private final JCheckBoxMenuItem toggleCyclicMenuItem =
+ new JCheckBoxMenuItem();
private final FileMenu fileMenu;
private final JCheckBoxMenuItem toggleStatusBarCheck =
new JCheckBoxMenuItem();
@@ -153,6 +156,8 @@
private final SmallToggleButton detailPaneButton = new SmallToggleButton();
private final SmallToggleButton logTreePaneButton = new SmallToggleButton();
private final SmallToggleButton pauseButton = new SmallToggleButton();
+ private final SmallToggleButton toggleCyclicButton = new SmallToggleButton();
+
private String lastFind = "";
private String levelDisplay = ChainsawConstants.LEVEL_DISPLAY_ICONS;
private final Action[] logPanelSpecificActions;
@@ -167,6 +172,7 @@
menuBar = new JMenuBar();
fileMenu = new FileMenu(logui);
closeAction = createCloseHelpAction();
+ changeModelAction = createChangeModelAction();
findTextField = createFindField();
findNextAction = setupFindFieldsAndActions();
showPreferencesAction = createShowPreferencesAction();
@@ -228,11 +234,27 @@
new Action[] {
pauseAction, findNextAction, clearAction, fileMenu.getFileSaveAction(),
toggleDetailPaneAction, showPreferencesAction, undockAction,
- toggleLogTreeAction
+ toggleLogTreeAction, changeModelAction,
};
}
/**
+ * @return
+ */
+ private Action createChangeModelAction() {
+ Action action = new AbstractAction("Use Cyclic", new
ImageIcon(ChainsawIcons.REFRESH)){
+
+ public void actionPerformed(ActionEvent arg0) {
+ LogPanel logPanel = logui.getCurrentLogPanel();
+ logPanel.toggleCyclic();
+ scanState();
+ }
+ };
+ action.putValue(Action.SHORT_DESCRIPTION, "Changes between Cyclic and Unlimited
mode.");
+ return action;
+ }
+
+ /**
* @return
*/
private Action createToggleLogTreeAction() {
@@ -463,7 +485,11 @@
toggleDetailMenuItem.setAction(toggleDetailPaneAction);
toggleDetailMenuItem.setSelected(true);
-
+
+ toggleCyclicMenuItem.setAction(changeModelAction);
+
+ toggleCyclicMenuItem.setSelected(true);
+
JCheckBoxMenuItem toggleLogTreeMenuItem =
new JCheckBoxMenuItem(toggleLogTreeAction);
toggleLogTreeMenuItem.setSelected(true);
@@ -484,7 +510,10 @@
toggleStatusBarCheck.setAction(toggleStatusBarAction);
toggleStatusBarCheck.setSelected(true);
+
activeTabMenu.add(pause);
+ activeTabMenu.add(toggleCyclicMenuItem);
+ activeTabMenu.addSeparator();
activeTabMenu.add(toggleDetailMenuItem);
activeTabMenu.add(toggleLogTreeMenuItem);
activeTabMenu.addSeparator();
@@ -863,8 +892,11 @@
pauseButton.getActionMap().put(
pauseAction.getValue(Action.NAME), pauseAction);
+ toggleCyclicButton.setAction(changeModelAction);
+ toggleCyclicButton.setText(null);
+
detailPaneButton.setAction(toggleDetailPaneAction);
- detailPaneButton.setText("");
+ detailPaneButton.setText(null);
detailPaneButton.getActionMap().put(
toggleDetailPaneAction.getValue(Action.NAME), toggleDetailPaneAction);
detailPaneButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
@@ -886,6 +918,8 @@
toolbar.add(undockButton);
toolbar.add(pauseButton);
+ toolbar.add(toggleCyclicButton);
+ toolbar.addSeparator();
toolbar.add(detailPaneButton);
toolbar.add(logTreePaneButton);
toolbar.add(prefsButton);
@@ -990,8 +1024,10 @@
findTextField.setEnabled(true);
pauseButton.getModel().setSelected(logPanel.isPaused());
+ toggleCyclicButton.setSelected(logPanel.getModel().isCyclic());
logui.getStatusBar().setPaused(logPanel.isPaused());
toggleDetailMenuItem.setSelected(logPanel.isDetailPaneVisible());
+ toggleCyclicMenuItem.setSelected(logPanel.getModel().isCyclic());
detailPaneButton.getModel().setSelected(logPanel.isDetailPaneVisible());
}
1.8 +138 -121 jakarta-log4j/src/java/org/apache/log4j/chainsaw/LogPanel.java
Index: LogPanel.java
===================================================================
RCS file: /home/cvs/jakarta-log4j/src/java/org/apache/log4j/chainsaw/LogPanel.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- LogPanel.java 11 Sep 2003 10:23:56 -0000 1.7
+++ LogPanel.java 13 Sep 2003 05:56:13 -0000 1.8
@@ -55,21 +55,6 @@
*/
package org.apache.log4j.chainsaw;
-import org.apache.log4j.Layout;
-import org.apache.log4j.PatternLayout;
-import org.apache.log4j.chainsaw.filter.FilterModel;
-import org.apache.log4j.chainsaw.icons.ChainsawIcons;
-import org.apache.log4j.chainsaw.layout.DefaultLayoutFactory;
-import org.apache.log4j.chainsaw.layout.EventDetailLayout;
-import org.apache.log4j.chainsaw.layout.LayoutEditorPane;
-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.chainsaw.rule.AbstractRule;
-import org.apache.log4j.helpers.LogLog;
-import org.apache.log4j.spi.LoggingEvent;
-
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
@@ -88,10 +73,8 @@
import java.awt.event.MouseMotionAdapter;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
-
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
-
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.EOFException;
@@ -103,9 +86,7 @@
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
-
import java.text.NumberFormat;
-
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
@@ -124,7 +105,6 @@
import javax.swing.BoxLayout;
import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
-import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JComboBox;
@@ -156,10 +136,24 @@
import javax.swing.event.TableColumnModelEvent;
import javax.swing.event.TableColumnModelListener;
import javax.swing.table.AbstractTableModel;
-import javax.swing.table.TableCellEditor;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
-import javax.swing.table.TableModel;
+
+import org.apache.log4j.Layout;
+import org.apache.log4j.PatternLayout;
+import org.apache.log4j.chainsaw.filter.FilterModel;
+import org.apache.log4j.chainsaw.icons.ChainsawIcons;
+import org.apache.log4j.chainsaw.icons.LineIconFactory;
+import org.apache.log4j.chainsaw.layout.DefaultLayoutFactory;
+import org.apache.log4j.chainsaw.layout.EventDetailLayout;
+import org.apache.log4j.chainsaw.layout.LayoutEditorPane;
+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.chainsaw.rule.AbstractRule;
+import org.apache.log4j.helpers.LogLog;
+import org.apache.log4j.spi.LoggingEvent;
/**
@@ -170,8 +164,7 @@
*/
public class LogPanel extends DockablePanel implements SettingsListener,
EventBatchListener {
- private ThrowableRenderPanel throwableRenderPanel ;
-
+ private ThrowableRenderPanel throwableRenderPanel;
private boolean paused = false;
private boolean logTreePanelVisible = true;
private final FilterModel filterModel = new FilterModel();
@@ -188,7 +181,7 @@
final Action dockingAction;
final JSortTable table;
private String profileName = null;
- private final JDialog detailDialog = new JDialog((JFrame)null, true);
+ private final JDialog detailDialog = new JDialog((JFrame) null, true);
final JPanel detailPanel = new JPanel(new BorderLayout());
private final TableColorizingRenderer renderer =
new TableColorizingRenderer();
@@ -222,19 +215,7 @@
((EventDetailLayout) toolTipLayout).setConversionPattern(
DefaultLayoutFactory.getDefaultPatternLayout());
- int bufferSize = 500;
-
- //if buffer size not provided, set default buffer size to 500 (only used if
usecyclicbuffer true)
- if (System.getProperty(LogUI.CYCLIC_BUFFER_SIZE_PROP_NAME) != null) {
- bufferSize =
- Integer.valueOf(
- System.getProperty(LogUI.CYCLIC_BUFFER_SIZE_PROP_NAME)).intValue();
- }
-
- tableModel =
- new ChainsawCyclicBufferTableModel(
- Boolean.valueOf(System.getProperty(LogUI.USE_CYCLIC_BUFFER_PROP_NAME))
- .booleanValue(), bufferSize);
+ tableModel = new ChainsawCyclicBufferTableModel();
table = new JSortTable(tableModel);
table.getColumnModel().addColumnModelListener(
@@ -242,7 +223,7 @@
table.setAutoCreateColumnsFromModel(false);
- throwableRenderPanel = new ThrowableRenderPanel(table);
+ throwableRenderPanel = new ThrowableRenderPanel(table);
/**
* We listen for new Key's coming in so we can get them automatically
added as columns
@@ -253,7 +234,15 @@
table.addColumn(new TableColumn(e.getNewModelIndex()));
}
});
+ tableModel.addPropertyChangeListener("cyclic", new PropertyChangeListener(){
+ public void propertyChange(PropertyChangeEvent arg0) {
+ if(tableModel.isCyclic()){
+ statusBar.setMessage("Changed to Cyclic Mode. Maximum # events kept: " +
tableModel.getMaxSize());
+ } else{
+ statusBar.setMessage("Changed to Unlimited Mode. Warning, you may run out
of memory.");
+ }
+ }});
table.setRowHeight(20);
table.setShowGrid(false);
@@ -438,7 +427,8 @@
detailPaneUpdater =
new DetailPaneUpdater(this, detail, (EventContainer) tableModel);
- addPropertyChangeListener("detailPaneConversionPattern", detailPaneUpdater);
+ addPropertyChangeListener(
+ "detailPaneConversionPattern", detailPaneUpdater);
upperPanel = new JPanel(new BorderLayout());
upperPanel.setBorder(BorderFactory.createEmptyBorder(2, 5, 2, 0));
@@ -645,34 +635,47 @@
editDetailButton.setText(null);
detailToolbar.add(Box.createHorizontalGlue());
detailToolbar.add(editDetailButton);
+ detailToolbar.addSeparator();
+ detailToolbar.add(Box.createHorizontalStrut(5));
+
+ Action closeDetailAction = new AbstractAction(null,
LineIconFactory.createCloseIcon()){
- // detailToolbar.add(Box.createHorizontalStrut(5));
- detailPanel.add(detailToolbar, BorderLayout.NORTH);
+ public void actionPerformed(ActionEvent arg0) {
+ toggleDetailPanel();
+ }};
+ closeDetailAction.putValue(Action.SHORT_DESCRIPTION, "Hides the Detail Panel");
+ SmallButton closeDetailButton = new SmallButton(closeDetailAction);
+ detailToolbar.add(closeDetailButton);
+ detailPanel.add(detailToolbar, BorderLayout.NORTH);
JPopupMenu editDetailPopupMenu = new JPopupMenu();
editDetailPopupMenu.add(editDetailAction);
editDetailPopupMenu.addSeparator();
- final ButtonGroup layoutGroup = new ButtonGroup();
-
- JRadioButtonMenuItem defaultLayoutRadio = new JRadioButtonMenuItem( new
AbstractAction("Set to Default Layout") {
- public void actionPerformed(ActionEvent e) {
- setDetailPaneConversionPattern(
- DefaultLayoutFactory.getDefaultPatternLayout());
- }
- } );
+ final ButtonGroup layoutGroup = new ButtonGroup();
+
+ JRadioButtonMenuItem defaultLayoutRadio =
+ new JRadioButtonMenuItem(
+ new AbstractAction("Set to Default Layout") {
+ public void actionPerformed(ActionEvent e) {
+ setDetailPaneConversionPattern(
+ DefaultLayoutFactory.getDefaultPatternLayout());
+ }
+ });
editDetailPopupMenu.add(defaultLayoutRadio);
layoutGroup.add(defaultLayoutRadio);
- defaultLayoutRadio.setSelected(true);
+ defaultLayoutRadio.setSelected(true);
- JRadioButtonMenuItem tccLayoutRadio = new JRadioButtonMenuItem( new
AbstractAction("Set to TCCLayout") {
- public void actionPerformed(ActionEvent e) {
- setDetailPaneConversionPattern(
- PatternLayout.TTCC_CONVERSION_PATTERN);
- }
- });
+ JRadioButtonMenuItem tccLayoutRadio =
+ new JRadioButtonMenuItem(
+ new AbstractAction("Set to TCCLayout") {
+ public void actionPerformed(ActionEvent e) {
+ setDetailPaneConversionPattern(
+ PatternLayout.TTCC_CONVERSION_PATTERN);
+ }
+ });
editDetailPopupMenu.add(tccLayoutRadio);
- layoutGroup.add(tccLayoutRadio);
+ layoutGroup.add(tccLayoutRadio);
PopupListener editDetailPopupListener =
new PopupListener(editDetailPopupMenu);
@@ -960,16 +963,16 @@
}
});
- if (tableModel.isCyclic()) {
- final ChainsawCyclicBufferTableModel cyclicModel =
- (ChainsawCyclicBufferTableModel) tableModel;
- tableModel.addEventCountListener(
- new EventCountListener() {
- final NumberFormat formatter = NumberFormat.getPercentInstance();
- boolean warning75 = false;
- boolean warning100 = false;
+ final ChainsawCyclicBufferTableModel cyclicModel =
+ (ChainsawCyclicBufferTableModel) tableModel;
+ tableModel.addEventCountListener(
+ new EventCountListener() {
+ final NumberFormat formatter = NumberFormat.getPercentInstance();
+ boolean warning75 = false;
+ boolean warning100 = false;
- public void eventCountChanged(int currentCount, int totalCount) {
+ public void eventCountChanged(int currentCount, int totalCount) {
+ if (tableModel.isCyclic()) {
double percent = ((double) totalCount) / cyclicModel.getMaxSize();
String msg = null;
@@ -990,45 +993,51 @@
statusBar.setMessage(msg);
}
}
- });
- }
+ }
+ });
undockedToolbar = createDockwindowToolbar();
externalPanel.add(undockedToolbar, BorderLayout.NORTH);
undockedFrame.pack();
-
+
Container container = detailDialog.getContentPane();
- final JTextArea detailArea = new JTextArea(10,40);
+ final JTextArea detailArea = new JTextArea(10, 40);
detailArea.setEditable(false);
container.setLayout(new BoxLayout(container, BoxLayout.Y_AXIS));
container.add(new JScrollPane(detailArea));
- throwableRenderPanel.addActionListener(new ActionListener(){
+ throwableRenderPanel.addActionListener(
+ new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ Object o =
+ table.getValueAt(
+ table.getSelectedRow(), table.getSelectedColumn());
+ detailDialog.setTitle(
+ table.getColumnName(table.getSelectedColumn()) + " detail...");
- public void actionPerformed(ActionEvent e) {
- Object o = table.getValueAt(table.getSelectedRow(),
table.getSelectedColumn());
-
detailDialog.setTitle(table.getColumnName(table.getSelectedColumn()) + " detail...");
-
- if(o instanceof String[]){
- StringBuffer buf = new StringBuffer();
- String[] ti = (String[]) o;
- buf.append(ti[0]).append("\n");
- for (int i = 1; i < ti.length; i++) {
- buf.append(ti[i]).append("\n ");
- }
- detailArea.setText(buf.toString());
-
- } else {
- detailArea.setText(o.toString());
- }
-
- detailDialog.setLocation(LogPanel.this.getLocationOnScreen());
- SwingUtilities.invokeLater(new Runnable(){
-
- public void run() {
- detailDialog.setVisible(true);
- }});
- }});
- detailDialog.pack();
+ if (o instanceof String[]) {
+ StringBuffer buf = new StringBuffer();
+ String[] ti = (String[]) o;
+ buf.append(ti[0]).append("\n");
+
+ for (int i = 1; i < ti.length; i++) {
+ buf.append(ti[i]).append("\n ");
+ }
+
+ detailArea.setText(buf.toString());
+ } else {
+ detailArea.setText(o.toString());
+ }
+
+ detailDialog.setLocation(LogPanel.this.getLocationOnScreen());
+ SwingUtilities.invokeLater(
+ new Runnable() {
+ public void run() {
+ detailDialog.setVisible(true);
+ }
+ });
+ }
+ });
+ detailDialog.pack();
}
private JToolBar createDockwindowToolbar() {
@@ -1227,9 +1236,9 @@
String oldPattern = getDetailPaneConversionPattern();
((EventDetailLayout) detailPaneLayout).setConversionPattern(
conversionPattern);
- firePropertyChange("detailPaneConversionPattern", oldPattern,
getDetailPaneConversionPattern());
-
-
+ firePropertyChange(
+ "detailPaneConversionPattern", oldPattern,
+ getDetailPaneConversionPattern());
}
String getDetailPaneConversionPattern() {
@@ -1240,7 +1249,7 @@
// colorDisplaySelector.show();
}
- TableModel getModel() {
+ EventContainer getModel() {
return tableModel;
}
@@ -1369,7 +1378,8 @@
if (visible) {
lowerPanel.setDividerLocation(150);
}
- lowerPanel.setOneTouchExpandable(visible);
+
+ lowerPanel.setOneTouchExpandable(visible);
firePropertyChange("detailPanelVisible", oldValue, isDetailPaneVisible());
}
@@ -1677,7 +1687,7 @@
* @param detailPaneLayout
*/
public final void setDetailPaneLayout(Layout detailPaneLayout) {
- Layout oldLayout = this.detailPaneLayout;
+ Layout oldLayout = this.detailPaneLayout;
this.detailPaneLayout = detailPaneLayout;
firePropertyChange("detailPaneLayout", oldLayout, detailPaneLayout);
}
@@ -1710,6 +1720,13 @@
return this.logTreePanelVisible;
}
+ /**
+ *
+ */
+ public void toggleCyclic() {
+ getModel().setCyclic(!getModel().isCyclic());
+ }
+
class TableColumnData implements Serializable {
static final long serialVersionUID = 5350440293110513986L;
private String colName;
@@ -1759,8 +1776,7 @@
}
public void columnAdded(TableColumnModelEvent e) {
-// LogLog.debug("Detected columnAdded" + e);
-
+ // LogLog.debug("Detected columnAdded" + e);
TableColumnModel columnModel = (TableColumnModel) e.getSource();
Enumeration enum = table.getColumnModel().getColumns();
@@ -1793,7 +1809,7 @@
* Thread that periodically checks if the selected row has changed, and if
* it was, updates the Detail Panel with the detailed Logging information
*/
- class DetailPaneUpdater implements PropertyChangeListener{
+ class DetailPaneUpdater implements PropertyChangeListener {
private int selectedRow = -1;
private int lastRow = -1;
private final JEditorPane pane;
@@ -1816,13 +1832,14 @@
updateDetailPane();
}
- private void updateDetailPane(){
- updateDetailPane(false);
- }
+ private void updateDetailPane() {
+ updateDetailPane(false);
+ }
+
private void updateDetailPane(boolean force) {
String text = null;
- if (selectedRow != lastRow || force) {
+ if ((selectedRow != lastRow) || force) {
if (selectedRow == -1) {
text = "Nothing selected";
} else {
@@ -1859,17 +1876,17 @@
}
}
- /* (non-Javadoc)
- * @see
java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)
- */
- public void propertyChange(PropertyChangeEvent arg0) {
- SwingUtilities.invokeLater(new Runnable(){
-
- public void run() {
- updateDetailPane(true);
-
- }});
- }
+ /* (non-Javadoc)
+ * @see
java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)
+ */
+ public void propertyChange(PropertyChangeEvent arg0) {
+ SwingUtilities.invokeLater(
+ new Runnable() {
+ public void run() {
+ updateDetailPane(true);
+ }
+ });
+ }
}
class ScrollToBottom extends Thread {
1.8 +73 -26
jakarta-log4j/src/java/org/apache/log4j/chainsaw/ChainsawCyclicBufferTableModel.java
Index: ChainsawCyclicBufferTableModel.java
===================================================================
RCS file:
/home/cvs/jakarta-log4j/src/java/org/apache/log4j/chainsaw/ChainsawCyclicBufferTableModel.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- ChainsawCyclicBufferTableModel.java 11 Sep 2003 03:35:05 -0000 1.7
+++ ChainsawCyclicBufferTableModel.java 13 Sep 2003 05:56:13 -0000 1.8
@@ -56,6 +56,7 @@
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeSupport;
import java.util.ArrayList;
import java.util.Collection;
@@ -87,12 +88,11 @@
*/
class ChainsawCyclicBufferTableModel extends AbstractTableModel
implements EventContainer, PropertyChangeListener {
- private boolean cyclic;
- private final int INITIAL_CAPACITY = 1024;
- final List unfilteredList;
- final List filteredList;
+ private boolean cyclic = true;
+ private final int INITIAL_CAPACITY = 5000;
+ List unfilteredList = new CyclicBufferList(INITIAL_CAPACITY);
+ List filteredList = new CyclicBufferList(INITIAL_CAPACITY);
- // private Vector countListeners = new Vector();
private boolean currentSortAscending;
private int currentSortColumn;
private EventListenerList eventListenerList = new EventListenerList();
@@ -109,17 +109,11 @@
int uniqueRow;
private Set uniqueMDCKeys = new HashSet();
private Rule displayRule;
+ private PropertyChangeSupport propertySupport =
+ new PropertyChangeSupport(this);
- public ChainsawCyclicBufferTableModel(boolean isCyclic, int bufferSize) {
- this.cyclic = isCyclic;
-
- if (isCyclic) {
- unfilteredList = new CyclicBufferList(bufferSize);
- filteredList = new CyclicBufferList(bufferSize);
- } else {
- unfilteredList = new ArrayList(INITIAL_CAPACITY);
- filteredList = new ArrayList(INITIAL_CAPACITY);
- }
+ public ChainsawCyclicBufferTableModel() {
+ propertySupport.addPropertyChangeListener("cyclic",new ModelChanger());
}
/**
@@ -490,7 +484,7 @@
/**
* @return
*/
- protected int getMaxSize() {
+ public int getMaxSize() {
if (!isCyclic()) {
throw new IllegalStateException(
"You cannot call getMaxSize() when the model is not cyclic");
@@ -522,6 +516,38 @@
}
}
+ /* (non-Javadoc)
+ * @see javax.swing.table.TableModel#isCellEditable(int, int)
+ */
+ public boolean isCellEditable(int rowIndex, int columnIndex) {
+ switch (columnIndex + 1) {
+ case ChainsawColumns.INDEX_THROWABLE_COL_NAME:
+ return true;
+ }
+
+ return super.isCellEditable(rowIndex, columnIndex);
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.log4j.chainsaw.EventContainer#setCyclic(boolean)
+ */
+ public void setCyclic(boolean cyclic) {
+ if (this.cyclic == cyclic) {
+ return;
+ }
+
+ boolean old = this.cyclic;
+ this.cyclic = cyclic;
+ propertySupport.firePropertyChange("cyclic", old, this.cyclic);
+ }
+
+ /* (non-Javadoc)
+ * @see
org.apache.log4j.chainsaw.EventContainer#addPropertyChangeListener(java.beans.PropertyChangeListener)
+ */
+ public void addPropertyChangeListener(PropertyChangeListener l) {
+ propertySupport.addPropertyChangeListener(l);
+ }
+
class SortExecutor implements Runnable {
private JSortTable table;
private int col;
@@ -607,15 +633,36 @@
});
}
}
- /* (non-Javadoc)
- * @see javax.swing.table.TableModel#isCellEditable(int, int)
- */
- public boolean isCellEditable(int rowIndex, int columnIndex) {
- switch(columnIndex+1){
- case ChainsawColumns.INDEX_THROWABLE_COL_NAME:
- return true;
- }
- return super.isCellEditable(rowIndex, columnIndex);
- }
+ private class ModelChanger implements PropertyChangeListener {
+ /* (non-Javadoc)
+ * @see
java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)
+ */
+ public void propertyChange(PropertyChangeEvent arg0) {
+ synchronized (syncLock) {
+ LogLog.debug("Changing Model, isCyclic is now " + isCyclic());
+ List oldUnfilteredList = unfilteredList;
+ List oldFilteredList = filteredList;
+
+ if (isCyclic()) {
+ unfilteredList = new CyclicBufferList(INITIAL_CAPACITY);
+ filteredList = new CyclicBufferList(INITIAL_CAPACITY);
+ } else {
+ unfilteredList = new ArrayList(INITIAL_CAPACITY);
+ filteredList = new ArrayList(INITIAL_CAPACITY);
+ }
+
+ unfilteredList.addAll(oldUnfilteredList);
+ filteredList.addAll(oldFilteredList);
+ }
+ LogLog.debug("Model Change completed");
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see
org.apache.log4j.chainsaw.EventContainer#addPropertyChangeListener(java.lang.String,
java.beans.PropertyChangeListener)
+ */
+ public void addPropertyChangeListener(String propertyName, PropertyChangeListener
l) {
+ propertySupport.addPropertyChangeListener(propertyName, l);
+ }
}
1.7 +24 -0
jakarta-log4j/src/java/org/apache/log4j/chainsaw/EventContainer.java
Index: EventContainer.java
===================================================================
RCS file:
/home/cvs/jakarta-log4j/src/java/org/apache/log4j/chainsaw/EventContainer.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- EventContainer.java 9 Sep 2003 02:56:17 -0000 1.6
+++ EventContainer.java 13 Sep 2003 05:56:13 -0000 1.7
@@ -52,6 +52,7 @@
import org.apache.log4j.chainsaw.rule.Rule;
import org.apache.log4j.spi.LoggingEvent;
+import java.beans.PropertyChangeListener;
import java.util.List;
@@ -72,6 +73,9 @@
*/
void addEventCountListener(EventCountListener listener);
+ void addPropertyChangeListener(PropertyChangeListener l);
+ void addPropertyChangeListener(String propertyName, PropertyChangeListener l);
+
/**
* Adds a NewKeyListener to be notified when unique Key (MDC/Property keys)
* arrive into this EventContainer
@@ -96,6 +100,26 @@
* @return true/false
*/
public boolean isCyclic();
+
+ /**
+ * Configures this model to use Cyclic or non-cyclic models.
+ * This method should fire a property Change event if
+ * it involves an actual change in the underlying model.
+ *
+ * This method does nothing if there is no change in proprty.
+ * @param cyclic
+ */
+ public void setCyclic(boolean cyclic);
+
+ /**
+ * If this container is in Cyclic mode, returns the Size of the cyclic buffer,
+ * otherwise this method throws an IllegalStateException, when in unlimited
+ * mode, this method has no meaning.
+ *
+ * @throws IllegalStateException if this containers isCyclic() method returns
false.
+ * @return int size of the cyclic buffer
+ */
+ public int getMaxSize();
/**
* Locates a row number, starting from startRow, containing the text
1.4 +3 -0
jakarta-log4j/src/java/org/apache/log4j/chainsaw/icons/ChainsawIcons.java
Index: ChainsawIcons.java
===================================================================
RCS file:
/home/cvs/jakarta-log4j/src/java/org/apache/log4j/chainsaw/icons/ChainsawIcons.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- ChainsawIcons.java 4 Sep 2003 05:40:36 -0000 1.3
+++ ChainsawIcons.java 13 Sep 2003 05:56:13 -0000 1.4
@@ -77,6 +77,9 @@
public static final URL PAUSE =
ChainsawIcons.class.getClassLoader().getResource(
BASE_ICON_PATH + "Pause16.gif");
+ public static final URL REFRESH =
+ ChainsawIcons.class.getClassLoader().getResource(
+ BASE_ICON_PATH + "Refresh16.gif");
public static final URL DELETE =
ChainsawIcons.class.getClassLoader().getResource(
BASE_ICON_PATH + "Delete16.gif");
1.1
jakarta-log4j/src/java/org/apache/log4j/chainsaw/icons/Refresh16.gif
<<Binary file>>
1.1
jakarta-log4j/src/java/org/apache/log4j/chainsaw/icons/Refresh24.gif
<<Binary file>>
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]