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>