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]