logging-general mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From sde...@apache.org
Subject svn commit: r829505 - in /logging/chainsaw/trunk/src/main: java/org/apache/log4j/chainsaw/ java/org/apache/log4j/chainsaw/icons/ resources/org/apache/log4j/chainsaw/
Date Sun, 25 Oct 2009 07:42:22 GMT
Author: sdeboy
Date: Sun Oct 25 07:42:21 2009
New Revision: 829505

URL: http://svn.apache.org/viewvc?rev=829505&view=rev
Log:
Add new 'marker' feature
Marker is displayed as an icon that appears in the first displayed column (using 'about' icon
currently)

Ctrl-F2 or double-click: toggle a marker on or off
F2: search for next marker
Shift-F2: search for previous marker
Ctrl-Shift-F2: clear all markers

To facilitate search, rendering & toggle of markers, adding a marker temporarily adds
a new property to events that have the marker set called 'log4j.marker' (value 'true')'.

Also added a new method to LoggingEvent: 
public Object removeProperty(String propName)
to facilitate removal of this temporary property when the marker is un-set for a loggingevent

Modified:
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawConstants.java
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawCyclicBufferTableModel.java
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawToolBarAndMenus.java
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/EventContainer.java
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogPanel.java
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/TableColorizingRenderer.java
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/icons/ChainsawIcons.java
    logging/chainsaw/trunk/src/main/resources/org/apache/log4j/chainsaw/WelcomePanel.html

Modified: logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawConstants.java
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawConstants.java?rev=829505&r1=829504&r2=829505&view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawConstants.java
(original)
+++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawConstants.java
Sun Oct 25 07:42:21 2009
@@ -79,7 +79,9 @@
 
   static final String LEVEL_DISPLAY = "level.display";
   static final String LEVEL_DISPLAY_ICONS = "icons";
-  static final String LEVEL_DISPLAY_TEXT = "text";  
+  static final String LEVEL_DISPLAY_TEXT = "text";
+
+  static final String MARKER_PROPERTY_NAME = "log4j.marker";
 
   static final String DATETIME_FORMAT = "EEE MMM dd HH:mm:ss z yyyy";
   

Modified: logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawCyclicBufferTableModel.java
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawCyclicBufferTableModel.java?rev=829505&r1=829504&r2=829505&view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawCyclicBufferTableModel.java
(original)
+++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawCyclicBufferTableModel.java
Sun Oct 25 07:42:21 2009
@@ -333,7 +333,21 @@
     }
   }
 
-  public int getColumnCount() {
+    public void removePropertyFromEvents(String propName) {
+        for (Iterator iter = unfilteredList.iterator();iter.hasNext();) {
+            LoggingEvent event = (LoggingEvent)iter.next();
+            event.removeProperty(propName);
+        }
+        for (int i=0;i<filteredList.size();i++) {
+            LoggingEvent event = (LoggingEvent)filteredList.get(i);
+            Object result = event.removeProperty(propName);
+            if (result != null) {
+                fireRowUpdated(i);
+            }
+        }
+    }
+
+    public int getColumnCount() {
     return columnNames.size();
   }
 
@@ -549,7 +563,11 @@
   }});
   }
 
-  /**
+    public void fireRowUpdated(int row) {
+        fireTableRowsUpdated(row, row);
+    }
+
+    /**
   * @param e
   */
   private void fireNewKeyColumnAdded(NewKeyEvent e) {

Modified: logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawToolBarAndMenus.java
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawToolBarAndMenus.java?rev=829505&r1=829504&r2=829505&view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawToolBarAndMenus.java
(original)
+++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawToolBarAndMenus.java
Sun Oct 25 07:42:21 2009
@@ -75,6 +75,10 @@
   private final Action closeAction;
   private final Action findNextAction;
   private final Action findPreviousAction;
+  private final Action findNextMarkerAction;
+  private final Action findPreviousMarkerAction;
+  private final Action toggleMarkerAction;
+  private final Action clearAllMarkersAction;
   private final Action pauseAction;
   private final Action showPreferencesAction;
   private final Action showColorPanelAction;
@@ -114,7 +118,7 @@
   private final JMenu activeTabMenu = new JMenu("Current tab");
   private final JPanel findPanel;
 
-  ChainsawToolBarAndMenus(final LogUI logui) {
+    ChainsawToolBarAndMenus(final LogUI logui) {
     this.logui = logui;
     toolbar = new JToolBar(SwingConstants.HORIZONTAL);
     menuBar = new JMenuBar();
@@ -124,6 +128,10 @@
     findField = new JTextField();
     findNextAction = getFindNextAction();
     findPreviousAction = getFindPreviousAction();
+    findNextMarkerAction = createFindNextMarkerAction();
+    findPreviousMarkerAction = createFindPreviousMarkerAction();
+    toggleMarkerAction = createToggleMarkerAction();
+    clearAllMarkersAction = createClearAllMarkersAction();
     customExpressionPanelAction = createCustomExpressionPanelAction();
     showPreferencesAction = createShowPreferencesAction();
     showColorPanelAction = createShowColorPanelAction();
@@ -155,7 +163,8 @@
 
     logPanelSpecificActions =
       new Action[] {
-        pauseAction, findNextAction, findPreviousAction, clearAction,
+        pauseAction, findNextAction, findPreviousAction, findNextMarkerAction, findPreviousMarkerAction,
+        toggleMarkerAction, clearAllMarkersAction, clearAction,
         fileMenu.getFileSaveAction(), toggleDetailPaneAction,
         showPreferencesAction, showColorPanelAction, undockAction,
         toggleLogTreeAction, toggleScrollToBottomAction, changeModelAction,
@@ -250,6 +259,78 @@
      return action;
    }
 
+     private Action createFindNextMarkerAction() {
+       Action action =
+         new AbstractAction("Find next marker") {
+           public void actionPerformed(ActionEvent e) {
+             if (logui.getCurrentLogPanel() != null) {
+               logui.getCurrentLogPanel().findNextMarker();
+             }
+           }
+         };
+
+       action.putValue(Action.SHORT_DESCRIPTION, "Searches for the next marker from the current
location");
+       action.putValue("enabled", Boolean.TRUE);
+       action.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_N));
+       action.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("F2"));
+
+       return action;
+     }
+
+    private Action createFindPreviousMarkerAction() {
+      Action action =
+        new AbstractAction("Find previous marker") {
+          public void actionPerformed(ActionEvent e) {
+            if (logui.getCurrentLogPanel() != null) {
+              logui.getCurrentLogPanel().findPreviousMarker();
+            }
+          }
+        };
+
+      action.putValue(Action.SHORT_DESCRIPTION, "Searches for the previous marker from the
current location");
+      action.putValue("enabled", Boolean.TRUE);
+      action.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_P));
+      action.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_F2,  InputEvent.SHIFT_MASK));
+
+      return action;
+    }
+
+    private Action createToggleMarkerAction() {
+      Action action =
+        new AbstractAction("Toggle marker") {
+          public void actionPerformed(ActionEvent e) {
+            if (logui.getCurrentLogPanel() != null) {
+              logui.getCurrentLogPanel().toggleMarker();
+            }
+          }
+        };
+
+      action.putValue(Action.SHORT_DESCRIPTION, "Toggle marker for selected row");
+      action.putValue("enabled", Boolean.TRUE);
+      action.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_T));
+      action.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_F2,  InputEvent.CTRL_MASK));
+
+      return action;
+    }
+
+    private Action createClearAllMarkersAction() {
+      Action action =
+        new AbstractAction("Clear all markers") {
+          public void actionPerformed(ActionEvent e) {
+            if (logui.getCurrentLogPanel() != null) {
+              logui.getCurrentLogPanel().clearAllMarkers();
+            }
+          }
+        };
+
+      action.putValue(Action.SHORT_DESCRIPTION, "Removes all markers");
+      action.putValue("enabled", Boolean.TRUE);
+      action.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_R));
+      action.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_F2,  InputEvent.CTRL_MASK
| InputEvent.SHIFT_MASK));
+
+      return action;
+    }
+
    /**
    * DOCUMENT ME!
    */
@@ -412,6 +493,13 @@
     activeTabMenu.addSeparator();
     activeTabMenu.add(new CopyEventsToClipboardAction(logui));
     activeTabMenu.add(new JMenuItem(clearAction));
+
+    activeTabMenu.addSeparator();
+    activeTabMenu.add(new JMenuItem(toggleMarkerAction));
+    activeTabMenu.add(new JMenuItem(findNextMarkerAction));
+    activeTabMenu.add(new JMenuItem(findPreviousMarkerAction));
+    activeTabMenu.add(new JMenuItem(clearAllMarkersAction));
+
     activeTabMenu.addSeparator();
     activeTabMenu.add(toggleScrollToBottomMenuItem);
     activeTabMenu.add(menuItemUseRightMouse);

Modified: logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/EventContainer.java
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/EventContainer.java?rev=829505&r1=829504&r2=829505&view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/EventContainer.java (original)
+++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/EventContainer.java Sun
Oct 25 07:42:21 2009
@@ -140,6 +140,11 @@
    */
   void fireTableEvent(int begin, int end, int count);
 
+    /**
+     * A row was updated
+     * @param row
+     */
+  void fireRowUpdated(int row);
   /**
    * Allow a forced notification of the EventCountListeners
    *
@@ -157,4 +162,10 @@
    * @param e
    */
   int getRowIndex(LoggingEvent e);
+
+  /**
+   * Remove property from all events in container
+   * @param propName the property name to remove
+   */
+  void removePropertyFromEvents(String propName);
 }

Modified: logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogPanel.java
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogPanel.java?rev=829505&r1=829504&r2=829505&view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogPanel.java (original)
+++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogPanel.java Sun Oct 25
07:42:21 2009
@@ -230,6 +230,7 @@
   private Point currentPoint;
   private boolean paused = false;
   private Rule findRule;
+  private Rule findMarkerRule;
   private final JPanel findPanel;
   private JTextField findField;
   private final int dividerSize;
@@ -559,6 +560,13 @@
      */
     tableModel = new ChainsawCyclicBufferTableModel(cyclicBufferSize);
     table = new JSortTable(tableModel);
+
+    //we've mapped f2, shift f2 and ctrl-f2 to marker-related actions, unmap them from the
table
+    table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke("F2"),
"none");
+    table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_F2,
InputEvent.SHIFT_MASK), "none");
+    table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_F2,
InputEvent.CTRL_MASK), "none");
+    table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_F2,
InputEvent.CTRL_MASK | InputEvent.SHIFT_MASK), "none");
+
     //add a listener to update the 'refine focus'
     tableModel.addNewKeyListener(new NewKeyListener() {
 		public void newKeyAdded(NewKeyEvent e) {
@@ -681,6 +689,7 @@
     table.setAutoCreateColumnsFromModel(false);
 
     table.addMouseMotionListener(new TableColumnDetailMouseListener());
+    table.addMouseListener(new TableMarkerListener());
 
     table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
 
@@ -1022,7 +1031,8 @@
             
         }
     });
-
+    findMarkerRule = ExpressionRule.getRule("prop." + ChainsawConstants.MARKER_PROPERTY_NAME
+ " exists");
+        
     tableModel.addTableModelListener(new TableModelListener() {
 		public void tableChanged(TableModelEvent e) {
 			detailPaneUpdater.setSelectedRow(table.getSelectedRow());
@@ -1874,7 +1884,7 @@
         "Enter expression - right click or ctrl-space for menu");
       return false;
     } else {
-      //only turn off scroltobottom when finding something (find not empty)
+      //only turn off scrolltobottom when finding something (find not empty)
       preferenceModel.setScrollToBottom(false);
       try {
         findField.setToolTipText(
@@ -2477,7 +2487,41 @@
     filterModel.processNewLoggingEvent(event);
   }
 
-  /**
+    public void findNextMarker() {
+      final int nextRow = tableModel.find(findMarkerRule, table.getSelectedRow() + 1, true);
+
+      if (nextRow > -1) {
+        table.scrollToRow(nextRow);
+      }
+    }
+
+    public void findPreviousMarker() {
+        final int previousRow = tableModel.find(findMarkerRule, table.getSelectedRow() -
1, false);
+
+        if (previousRow > -1) {
+          table.scrollToRow(previousRow);
+        }
+    }
+
+    public void clearAllMarkers() {
+        tableModel.removePropertyFromEvents(ChainsawConstants.MARKER_PROPERTY_NAME);
+    }
+
+    public void toggleMarker() {
+        int row = table.getSelectedRow();
+        if (row != -1) {
+          LoggingEvent event = tableModel.getRow(row);
+          Object marker = event.getProperty(ChainsawConstants.MARKER_PROPERTY_NAME);
+          if (marker == null) {
+              event.setProperty(ChainsawConstants.MARKER_PROPERTY_NAME, "true");
+          } else {
+              event.removeProperty(ChainsawConstants.MARKER_PROPERTY_NAME);
+          }
+          tableModel.fireRowUpdated(row);
+        }
+    }
+
+    /**
    * This class receives notification when the Refine focus text field is
    * updated, where a backgrounh thread periodically wakes up and checks if
    * they have stopped typing yet. This ensures that the filtering of the
@@ -2595,6 +2639,24 @@
     }
   }
 
+  private final class TableMarkerListener extends MouseAdapter {
+      public void mouseClicked(MouseEvent evt) {
+          if (evt.getClickCount() == 2) {
+              int row = table.rowAtPoint(evt.getPoint());
+              if (row != -1) {
+                LoggingEvent event = tableModel.getRow(row);
+                Object marker = event.getProperty(ChainsawConstants.MARKER_PROPERTY_NAME);
+                if (marker == null) {
+                    event.setProperty(ChainsawConstants.MARKER_PROPERTY_NAME, "true");
+                } else {
+                    event.removeProperty(ChainsawConstants.MARKER_PROPERTY_NAME);
+                }
+                tableModel.fireRowUpdated(row);
+              }
+          }
+      }
+  }
+
   /**
    * Update active tooltip
    */

Modified: logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/TableColorizingRenderer.java
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/TableColorizingRenderer.java?rev=829505&r1=829504&r2=829505&view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/TableColorizingRenderer.java
(original)
+++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/TableColorizingRenderer.java
Sun Oct 25 07:42:21 2009
@@ -27,12 +27,14 @@
 
 import javax.swing.BorderFactory;
 import javax.swing.Icon;
+import javax.swing.ImageIcon;
 import javax.swing.JLabel;
 import javax.swing.JTable;
 import javax.swing.SwingConstants;
 import javax.swing.table.DefaultTableCellRenderer;
 
 import org.apache.log4j.chainsaw.color.Colorizer;
+import org.apache.log4j.chainsaw.icons.ChainsawIcons;
 import org.apache.log4j.chainsaw.icons.LevelIconFactory;
 import org.apache.log4j.helpers.Constants;
 import org.apache.log4j.spi.LoggingEvent;
@@ -60,6 +62,7 @@
   private int loggerPrecision = 0;
   private boolean toolTipsVisible;
   private String dateFormatTZ;
+  private final Icon markerIcon = new ImageIcon(ChainsawIcons.MARKER);
 
   /**
    * Creates a new TableColorizingRenderer object.
@@ -90,6 +93,9 @@
         isSelected, hasFocus, row, col);
     int colIndex = table.getColumnModel().getColumn(col).getModelIndex() + 1;
 
+    EventContainer container = (EventContainer) table.getModel();
+    LoggingEvent event = container.getRow(row);
+
     switch (colIndex) {
     case ChainsawColumns.INDEX_ID_COL_NAME:
       idComponent.setText(value.toString());
@@ -150,6 +156,12 @@
     default:
       break;
     }
+    //set the 'info' icon next to the zeroth column if marker is set
+    if (col == 0 && event.getProperty("log4j.marker") != null) {
+        c.setIcon(markerIcon);
+    } else {
+        c.setIcon(null);
+    }
 
     if (isSelected) {
       return c;
@@ -159,8 +171,6 @@
     Color foreground = null;
 
     if (colorizer != null) {
-      EventContainer container = (EventContainer) table.getModel();
-      LoggingEvent event = container.getRow(row);
 
       if (event == null) {
         //ignore...probably changed displayed cols
@@ -206,7 +216,7 @@
 
   /**
    * Changes the Logger precision.
-   * @param precision
+   * @param loggerPrecisionText
    */
   void setLoggerPrecision(String loggerPrecisionText) {
     try {

Modified: logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/icons/ChainsawIcons.java
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/icons/ChainsawIcons.java?rev=829505&r1=829504&r2=829505&view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/icons/ChainsawIcons.java
(original)
+++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/icons/ChainsawIcons.java
Sun Oct 25 07:42:21 2009
@@ -85,6 +85,9 @@
   public static final URL HELP =
     ChainsawIcons.class.getClassLoader().getResource(
       BASE_ICON_PATH + "Help16.gif");
+  public static final URL MARKER =
+    ChainsawIcons.class.getClassLoader().getResource(
+      BASE_ICON_PATH + "About16.gif");
   public static final Icon ICON_UP = new ImageIcon(UP);
   public static final Icon ICON_DOWN = new ImageIcon(DOWN);
   public static final Icon ICON_HELP = new ImageIcon(HELP);

Modified: logging/chainsaw/trunk/src/main/resources/org/apache/log4j/chainsaw/WelcomePanel.html
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/resources/org/apache/log4j/chainsaw/WelcomePanel.html?rev=829505&r1=829504&r2=829505&view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/resources/org/apache/log4j/chainsaw/WelcomePanel.html
(original)
+++ logging/chainsaw/trunk/src/main/resources/org/apache/log4j/chainsaw/WelcomePanel.html
Sun Oct 25 07:42:21 2009
@@ -84,6 +84,22 @@
     <td width="50" align="center">-</td>
     <td colspan="1">Go to line</td>
 </tr>
+    <tr valign="top" bgcolor="#EEEEEE">
+        <td nowrap class="HotKey">Ctrl-F2 (or double-click on a row)</td>
+        <td width="50" align="center">-</td>
+        <td colspan="1">Toggle marker</td>
+        <td nowrap class="HotKey">F2</td>
+        <td width="50" align="center">-</td>
+        <td colspan="1">Find next marker</td>
+    </tr>
+    <tr valign="top" bgcolor="#EEEEEE">
+        <td nowrap class="HotKey">Shift-F2</td>
+        <td width="50" align="center">-</td>
+        <td colspan="1">Find previous marker</td>
+        <td nowrap class="HotKey">Ctrl-shift-F2</td>
+        <td width="50" align="center">-</td>
+        <td colspan="1">Clear all markers</td>
+    </tr>
 </table></P>
 <!--<p><a href="#TheTop">Back to top</a></p>-->
 <a name="Receivers"></a>



Mime
View raw message