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]

Reply via email to