Author: sdeboy Date: Thu Sep 16 06:18:54 2010 New Revision: 997597 URL: http://svn.apache.org/viewvc?rev=997597&view=rev Log: New feature: Clickable thumbnail bar on the left shows time delta to prior displayed event if the time delta is > 1 second (behaves similarly to the thumbnail bar on the right which shows colors and search matches, but represents the time delta between events). A bigger delta is represented as a wider line. Also added millisdelta to default detail layout (which is also used in the hover tooltips for left & right thumbnail panels) and changed the millisdelta dynamic property to lowercase (was uppercase). Modified: logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModel.java logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawConstants.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/resources/org/apache/log4j/chainsaw/help/release-notes.html logging/chainsaw/trunk/src/main/resources/org/apache/log4j/chainsaw/layout/DefaultDetailLayout.html Modified: logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModel.java URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModel.java?rev=997597&r1=997596&r2=997597&view=diff ============================================================================== --- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModel.java (original) +++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModel.java Thu Sep 16 06:18:54 2010 @@ -223,6 +223,21 @@ public class ApplicationPreferenceModel } } + //use a lighter version of search color as the delta color + public Color getDeltaColor() { + float factor = 1.3F; + Color search = getSearchBackgroundColor(); + + return new Color(boundColorValue((int)(search.getRed() * factor)), + boundColorValue((int)(search.getGreen() * factor)), + boundColorValue((int)(search.getBlue() * factor))); + } + + private int boundColorValue(int colorValue) { + return Math.min(Math.max(0, colorValue), 255); + } + + /** * @return Returns the responsiveness. */ 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=997597&r1=997596&r2=997597&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 Thu Sep 16 06:18:54 2010 @@ -31,7 +31,9 @@ import java.net.URL; public class ChainsawConstants { private ChainsawConstants(){} - public static final String MILLIS_DELTA = "MILLISDELTA"; + public static final String MILLIS_DELTA = "millisdelta"; + public static final int MILLIS_DELTA_RENDERING_HEIGHT_MAX = 50; + public static final float MILLIS_DELTA_RENDERING_FACTOR = .002F; public static final String DEFAULT_COLOR_RULE_NAME = "Default"; public static final Color COLOR_DEFAULT_BACKGROUND = new Color(255,255,255); 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=997597&r1=997596&r2=997597&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 Thu Sep 16 06:18:54 2010 @@ -1162,18 +1162,29 @@ public class LogPanel extends DockablePa eventsPane.getVerticalScrollBar().setUnitIncrement(ChainsawConstants.DEFAULT_ROW_HEIGHT * 2); eventsAndStatusPanel.add(eventsPane, BorderLayout.CENTER); + + Integer scrollBarWidth = (Integer) UIManager.get("ScrollBar.width"); + JPanel rightPanel = new JPanel(); rightPanel.setLayout(new BoxLayout(rightPanel, BoxLayout.Y_AXIS)); - JPanel thumbNailPanel = new EventMatchThumbnail(); - rightPanel.add(thumbNailPanel); - + JPanel rightThumbNailPanel = new ColorizedEventAndSearchMatchThumbnail(); + rightPanel.add(rightThumbNailPanel); //set thumbnail width to be a bit narrower than scrollbar width - Integer scrollBarWidth = (Integer) UIManager.get("ScrollBar.width"); if (scrollBarWidth != null) { - thumbNailPanel.setPreferredSize(new Dimension(scrollBarWidth.intValue() -4, -1)); + rightThumbNailPanel.setPreferredSize(new Dimension(scrollBarWidth.intValue() -4, -1)); } eventsAndStatusPanel.add(rightPanel, BorderLayout.EAST); + JPanel leftPanel = new JPanel(); + leftPanel.setLayout(new BoxLayout(leftPanel, BoxLayout.Y_AXIS)); + JPanel leftThumbNailPanel = new EventTimeDeltaMatchThumbnail(); + leftPanel.add(leftThumbNailPanel); + //set thumbnail width to be a bit narrower than scrollbar width + if (scrollBarWidth != null) { + leftThumbNailPanel.setPreferredSize(new Dimension(scrollBarWidth.intValue() -4, -1)); + } + eventsAndStatusPanel.add(leftPanel, BorderLayout.WEST); + final JPanel statusLabelPanel = new JPanel(); statusLabelPanel.setLayout(new BorderLayout()); @@ -3354,22 +3365,214 @@ public class LogPanel extends DockablePa } } - private class EventMatchThumbnail extends JPanel { - private List all = new ArrayList(); - private List findMatches = new ArrayList(); + private class EventTimeDeltaMatchThumbnail extends AbstractEventMatchThumbnail { + public EventTimeDeltaMatchThumbnail() { + super(); + initializeLists(); + } + + boolean primaryMatches(EventWrapper wrapper) { + String millisDelta = wrapper.loggingEvent.getProperty(ChainsawConstants.MILLIS_DELTA); + if (millisDelta != null && !millisDelta.trim().equals("")) { + long millisDeltaLong = Long.parseLong(millisDelta); + //arbitrary + return millisDeltaLong >= 1000; + } + return false; + } + + boolean secondaryMatches(EventWrapper wrapper) { + //secondary is not used + return false; + } + + private void initializeLists() { + secondaryList.clear(); + primaryList.clear(); + + int i=0; + for (Iterator iter = tableModel.getFilteredEvents().iterator();iter.hasNext();) { + ExtendedLoggingEvent extendedLoggingEvent = (ExtendedLoggingEvent) iter.next(); + EventWrapper wrapper = new EventWrapper(i, extendedLoggingEvent); + i++; + //only add if there is a color defined + if (primaryMatches(wrapper)) { + primaryList.add(wrapper); + } + } + invalidate(); + repaint(); + } + + public void paintComponent(Graphics g) { + super.paintComponent(g); - private final int maxEventHeight = 6; + Point topAndBottomOffset = getScrollBarOffsets(); + int topOffset = topAndBottomOffset.x; + int bottomOffset = topAndBottomOffset.y; - public EventMatchThumbnail() { + int rowCount = table.getRowCount(); + if (rowCount == 0) { + return; + } + //use event pane height as reference height - max component height will be extended by event height if + // last row is rendered, so subtract here + int height = eventsPane.getHeight() - topOffset - bottomOffset; + int maxHeight = Math.min(maxEventHeight, (height / rowCount)); + int minHeight = Math.max(1, maxHeight); + int componentHeight = height - minHeight; + int eventHeight = minHeight; + + //draw all events + for (Iterator iter = primaryList.iterator();iter.hasNext();) { + EventWrapper wrapper = (EventWrapper)iter.next(); + if (primaryMatches(wrapper)) { + float ratio = (wrapper.rowNum / (float)rowCount); + // System.out.println("error - ratio: " + ratio + ", component height: " + componentHeight); + int verticalLocation = (int) (componentHeight * ratio) + topOffset; + + int startX = 1; + int width = getWidth() - (startX * 2); + //max out at 50, min 2... + String millisDelta = wrapper.loggingEvent.getProperty(ChainsawConstants.MILLIS_DELTA); + long millisDeltaLong = Long.parseLong(millisDelta); + long delta = Math.min(ChainsawConstants.MILLIS_DELTA_RENDERING_HEIGHT_MAX, Math.max(0, (long) (millisDeltaLong * ChainsawConstants.MILLIS_DELTA_RENDERING_FACTOR))); + float widthMaxMillisDeltaRenderRatio = ((float)width / ChainsawConstants.MILLIS_DELTA_RENDERING_HEIGHT_MAX); + int widthToUse = Math.max(2, (int)(delta * widthMaxMillisDeltaRenderRatio)); + eventHeight = Math.min(maxEventHeight, eventHeight + 3); +// eventHeight = maxEventHeight; + drawEvent(applicationPreferenceModel.getDeltaColor(), (verticalLocation - eventHeight + 1), eventHeight, g, startX, widthToUse); + // System.out.println("painting error - rownum: " + wrapper.rowNum + ", location: " + verticalLocation + ", height: " + eventHeight + ", component height: " + componentHeight + ", row count: " + rowCount); + } + } + } + } + + private class ColorizedEventAndSearchMatchThumbnail extends AbstractEventMatchThumbnail { + public ColorizedEventAndSearchMatchThumbnail() { + super(); configureColors(); - colorizer.addPropertyChangeListener(new PropertyChangeListener() - { - public void propertyChange(PropertyChangeEvent evt) - { + colorizer.addPropertyChangeListener(new PropertyChangeListener() { + public void propertyChange(PropertyChangeEvent evt) { configureColors(); } }); - + } + + boolean primaryMatches(EventWrapper wrapper) { + return !wrapper.loggingEvent.getColorRuleBackground().equals(ChainsawConstants.COLOR_DEFAULT_BACKGROUND); + } + + boolean secondaryMatches(EventWrapper wrapper) { + return wrapper.loggingEvent.isSearchMatch(); + } + + private void configureColors() { + secondaryList.clear(); + primaryList.clear(); + + int i=0; + for (Iterator iter = tableModel.getFilteredEvents().iterator();iter.hasNext();) { + ExtendedLoggingEvent extendedLoggingEvent = (ExtendedLoggingEvent) iter.next(); + extendedLoggingEvent.updateColorRuleColors(colorizer.getBackgroundColor(extendedLoggingEvent), colorizer.getForegroundColor(extendedLoggingEvent)); + EventWrapper wrapper = new EventWrapper(i, extendedLoggingEvent); + if (secondaryMatches(wrapper)) { + secondaryList.add(wrapper); + } + i++; + //only add if there is a color defined + if (primaryMatches(wrapper)) { + primaryList.add(wrapper); + } + } + invalidate(); + repaint(); + } + + public void paintComponent(Graphics g) { + super.paintComponent(g); + + Point topAndBottomOffset = getScrollBarOffsets(); + int topOffset = topAndBottomOffset.x; + int bottomOffset = topAndBottomOffset.y; + + int rowCount = table.getRowCount(); + if (rowCount == 0) { + return; + } + //use event pane height as reference height - max component height will be extended by event height if + // last row is rendered, so subtract here + int height = eventsPane.getHeight() - topOffset - bottomOffset; + int maxHeight = Math.min(maxEventHeight, (height / rowCount)); + int minHeight = Math.max(1, maxHeight); + int componentHeight = height - minHeight; + int eventHeight = minHeight; + + //draw all non error/warning/marker events + for (Iterator iter = primaryList.iterator();iter.hasNext();) { + EventWrapper wrapper = (EventWrapper)iter.next(); + if (!wrapper.loggingEvent.getColorRuleBackground().equals(ChainsawConstants.COLOR_DEFAULT_BACKGROUND)) { + if (wrapper.loggingEvent.getLevel().toInt() < Level.WARN.toInt() && wrapper.loggingEvent.getProperty(ChainsawConstants.LOG4J_MARKER_COL_NAME_LOWERCASE) == null) { + float ratio = (wrapper.rowNum / (float)rowCount); + // System.out.println("error - ratio: " + ratio + ", component height: " + componentHeight); + int verticalLocation = (int) (componentHeight * ratio) + topOffset; + + int startX = 1; + int width = getWidth() - (startX * 2); + + drawEvent(wrapper.loggingEvent.getColorRuleBackground(), verticalLocation, eventHeight, g, startX, width); + // System.out.println("painting error - rownum: " + wrapper.rowNum + ", location: " + verticalLocation + ", height: " + eventHeight + ", component height: " + componentHeight + ", row count: " + rowCount); + } + } + } + + //draw warnings, error, fatal & markers last (full width) + for (Iterator iter = primaryList.iterator();iter.hasNext();) { + EventWrapper wrapper = (EventWrapper)iter.next(); + if (!wrapper.loggingEvent.getColorRuleBackground().equals(ChainsawConstants.COLOR_DEFAULT_BACKGROUND)) { + if (wrapper.loggingEvent.getLevel().toInt() >= Level.WARN.toInt() || wrapper.loggingEvent.getProperty(ChainsawConstants.LOG4J_MARKER_COL_NAME_LOWERCASE) != null) { + float ratio = (wrapper.rowNum / (float)rowCount); + // System.out.println("error - ratio: " + ratio + ", component height: " + componentHeight); + int verticalLocation = (int) (componentHeight * ratio) + topOffset; + + int startX = 1; + int width = getWidth() - (startX * 2); + //narrow the color a bit if level is less than warn + //make warnings, errors a little taller + + eventHeight = Math.min(maxEventHeight, eventHeight + 3); +// eventHeight = maxEventHeight; + + drawEvent(wrapper.loggingEvent.getColorRuleBackground(), (verticalLocation - eventHeight + 1), eventHeight, g, startX, width); + // System.out.println("painting error - rownum: " + wrapper.rowNum + ", location: " + verticalLocation + ", height: " + eventHeight + ", component height: " + componentHeight + ", row count: " + rowCount); + } + } + } + + for (Iterator iter = secondaryList.iterator();iter.hasNext();) { + EventWrapper wrapper = (EventWrapper)iter.next(); + float ratio = (wrapper.rowNum / (float)rowCount); +// System.out.println("warning - ratio: " + ratio + ", component height: " + componentHeight); + int verticalLocation = (int) (componentHeight * ratio) + topOffset; + + int startX = 1; + int width = getWidth() - (startX * 2); + width = (width / 2); + + //use black for search indicator in the 'gutter' + drawEvent(Color.BLACK, verticalLocation, eventHeight, g, startX, width); +// System.out.println("painting warning - rownum: " + wrapper.rowNum + ", location: " + verticalLocation + ", height: " + eventHeight + ", component height: " + componentHeight + ", row count: " + rowCount); + } + } + } + + abstract class AbstractEventMatchThumbnail extends JPanel { + protected List primaryList = new ArrayList(); + protected List secondaryList = new ArrayList(); + protected final int maxEventHeight = 6; + + AbstractEventMatchThumbnail() { + super(); addMouseMotionListener(new MouseMotionAdapter() { public void mouseMoved(MouseEvent e) { if (preferenceModel.isThumbnailBarToolTips()) { @@ -3404,8 +3607,8 @@ public class LogPanel extends DockablePa int lastRow = Math.min(e.getLastRow(), table.getRowCount() - 1); //clear everything if we got an event w/-1 for first or last row if (firstRow < 0 || lastRow < 0) { - all.clear(); - findMatches.clear(); + primaryList.clear(); + secondaryList.clear(); } // System.out.println("lastRow: " + lastRow + ", first row: " + firstRow + ", original last row: " + e.getLastRow() + ", type: " + e.getType()); @@ -3416,13 +3619,13 @@ public class LogPanel extends DockablePa for (int i=firstRow;i= firstRow) && (wrapper.rowNum <= lastRow)) { // System.out.println("deleting find: " + wrapper); iter.remove(); } } - for (Iterator iter = all.iterator();iter.hasNext();) { + for (Iterator iter = primaryList.iterator();iter.hasNext();) { EventWrapper wrapper = (EventWrapper)iter.next(); if ((wrapper.rowNum >= firstRow) && (wrapper.rowNum <= lastRow)) { // System.out.println("deleting error: " + wrapper); @@ -3452,14 +3655,14 @@ public class LogPanel extends DockablePa } else if (e.getType() == TableModelEvent.UPDATE) { // System.out.println("update - about to delete old warnings in range: " + firstRow + " to " + lastRow + ", current warnings: " + warnings.size() + ", errors: " + errors.size()); //find each eventwrapper with an id in the deleted range and remove it... - for (Iterator iter = findMatches.iterator();iter.hasNext();) { + for (Iterator iter = secondaryList.iterator();iter.hasNext();) { EventWrapper wrapper = (EventWrapper)iter.next(); if ((wrapper.rowNum >= firstRow) && (wrapper.rowNum <= lastRow)) { // System.out.println("update - deleting warning: " + wrapper); iter.remove(); } } - for (Iterator iter = all.iterator();iter.hasNext();) { + for (Iterator iter = primaryList.iterator();iter.hasNext();) { EventWrapper wrapper = (EventWrapper)iter.next(); if ((wrapper.rowNum >= firstRow) && (wrapper.rowNum <= lastRow)) { // System.out.println("update - deleting error: " + wrapper); @@ -3473,13 +3676,19 @@ public class LogPanel extends DockablePa EventWrapper wrapper = new EventWrapper(i, event); // System.out.println("update - adding error: " + i + ", event: " + event.getMessage()); //only add event to thumbnail if there is a color - if (!wrapper.loggingEvent.getColorRuleBackground().equals(ChainsawConstants.COLOR_DEFAULT_BACKGROUND)) { - all.add(wrapper); + if (primaryMatches(wrapper)) { + //!wrapper.loggingEvent.getColorRuleBackground().equals(ChainsawConstants.COLOR_DEFAULT_BACKGROUND) + primaryList.add(wrapper); + } else { + primaryList.remove(wrapper); } - if (event.isSearchMatch()) { + if (secondaryMatches(wrapper)) { + //event.isSearchMatch()) // System.out.println("update - adding marker: " + i + ", event: " + event.getMessage()); - findMatches.add(wrapper); + secondaryList.add(wrapper); + } else { + secondaryList.remove(wrapper); } } // System.out.println("update - new warnings: " + warnings.size() + ", errors: " + errors.size()); @@ -3493,13 +3702,15 @@ public class LogPanel extends DockablePa }); } + abstract boolean primaryMatches(EventWrapper wrapper); + + abstract boolean secondaryMatches(EventWrapper wrapper); /** * Get event wrapper - may be null * @param yPosition * @return event wrapper or null */ - private EventWrapper getEventWrapperAtPosition(int yPosition) - { + protected EventWrapper getEventWrapperAtPosition(int yPosition) { int rowCount = table.getRowCount(); Point offsets = getScrollBarOffsets(); @@ -3517,10 +3728,10 @@ public class LogPanel extends DockablePa yPosition = height; } -// System.out.println("clicked y pos: " + e.getPoint().y + ", relative: " + clickLocation); + // System.out.println("clicked y pos: " + e.getPoint().y + ", relative: " + clickLocation); float ratio = (float) yPosition / height; int rowToSelect = Math.round(rowCount * ratio); -// System.out.println("rowCount: " + rowCount + ", height: " + height + ", clickLocation: " + clickLocation + ", ratio: " + ratio + ", rowToSelect: " + rowToSelect); + // System.out.println("rowCount: " + rowCount + ", height: " + height + ", clickLocation: " + clickLocation + ", ratio: " + ratio + ", rowToSelect: " + rowToSelect); EventWrapper event = getClosestRow(rowToSelect); return event; } @@ -3528,7 +3739,7 @@ public class LogPanel extends DockablePa private EventWrapper getClosestRow(int rowToSelect) { EventWrapper closestRow = null; int rowDelta = Integer.MAX_VALUE; - for (Iterator iter = findMatches.iterator();iter.hasNext();) { + for (Iterator iter = secondaryList.iterator();iter.hasNext();) { EventWrapper event = (EventWrapper) iter.next(); int newRowDelta = Math.abs(rowToSelect - event.rowNum); if (newRowDelta < rowDelta) { @@ -3536,7 +3747,7 @@ public class LogPanel extends DockablePa rowDelta = newRowDelta; } } - for (Iterator iter = all.iterator();iter.hasNext();) { + for (Iterator iter = primaryList.iterator();iter.hasNext();) { EventWrapper event = (EventWrapper) iter.next(); int newRowDelta = Math.abs(rowToSelect - event.rowNum); if (newRowDelta < rowDelta) { @@ -3547,28 +3758,6 @@ public class LogPanel extends DockablePa return closestRow; } - private void configureColors() { - findMatches.clear(); - all.clear(); - - int i=0; - for (Iterator iter = tableModel.getFilteredEvents().iterator();iter.hasNext();) { - ExtendedLoggingEvent extendedLoggingEvent = (ExtendedLoggingEvent) iter.next(); - extendedLoggingEvent.updateColorRuleColors(colorizer.getBackgroundColor(extendedLoggingEvent), colorizer.getForegroundColor(extendedLoggingEvent)); - EventWrapper wrapper = new EventWrapper(i, extendedLoggingEvent); - if (extendedLoggingEvent.isSearchMatch()) { - findMatches.add(wrapper); - } - i++; - //only add if there is a color defined - if (!wrapper.loggingEvent.getColorRuleBackground().equals(ChainsawConstants.COLOR_DEFAULT_BACKGROUND)) { - all.add(wrapper); - } - } - invalidate(); - repaint(); - } - /** * Return a point representing top and bottom offsets * Top offset is held by Point.x, bottom offset is held by Point.y @@ -3592,91 +3781,13 @@ public class LogPanel extends DockablePa return new Point(topOffset, bottomOffset); } - public void paintComponent(Graphics g) - { - super.paintComponent(g); - - Point topAndBottomOffset = getScrollBarOffsets(); - int topOffset = topAndBottomOffset.x; - int bottomOffset = topAndBottomOffset.y; - - int rowCount = table.getRowCount(); - if (rowCount == 0) { - return; - } - //use event pane height as reference height - max component height will be extended by event height if - // last row is rendered, so subtract here - int height = eventsPane.getHeight() - topOffset - bottomOffset; - int maxHeight = Math.min(maxEventHeight, (height / rowCount)); - int minHeight = Math.max(1, maxHeight); - int componentHeight = height - minHeight; - int eventHeight = minHeight; - - //draw all non error/warning/marker events - for (Iterator iter = all.iterator();iter.hasNext();) { - EventWrapper wrapper = (EventWrapper)iter.next(); - if (!wrapper.loggingEvent.getColorRuleBackground().equals(ChainsawConstants.COLOR_DEFAULT_BACKGROUND)) { - if (wrapper.loggingEvent.getLevel().toInt() < Level.WARN.toInt() && wrapper.loggingEvent.getProperty(ChainsawConstants.LOG4J_MARKER_COL_NAME_LOWERCASE) == null) { - float ratio = (wrapper.rowNum / (float)rowCount); - // System.out.println("error - ratio: " + ratio + ", component height: " + componentHeight); - int verticalLocation = (int) (componentHeight * ratio) + topOffset; - - int startX = 1; - int width = getWidth() - (startX * 2); - - drawEvent(wrapper.loggingEvent.getColorRuleBackground(), verticalLocation, eventHeight, g, startX, width); - // System.out.println("painting error - rownum: " + wrapper.rowNum + ", location: " + verticalLocation + ", height: " + eventHeight + ", component height: " + componentHeight + ", row count: " + rowCount); - } - } - } - - //draw warnings, error, fatal & markers last (full width) - for (Iterator iter = all.iterator();iter.hasNext();) { - EventWrapper wrapper = (EventWrapper)iter.next(); - if (!wrapper.loggingEvent.getColorRuleBackground().equals(ChainsawConstants.COLOR_DEFAULT_BACKGROUND)) { - if (wrapper.loggingEvent.getLevel().toInt() >= Level.WARN.toInt() || wrapper.loggingEvent.getProperty(ChainsawConstants.LOG4J_MARKER_COL_NAME_LOWERCASE) != null) { - float ratio = (wrapper.rowNum / (float)rowCount); - // System.out.println("error - ratio: " + ratio + ", component height: " + componentHeight); - int verticalLocation = (int) (componentHeight * ratio) + topOffset; - - int startX = 1; - int width = getWidth() - (startX * 2); - //narrow the color a bit if level is less than warn - //make warnings, errors a little taller - - eventHeight = Math.min(maxEventHeight, eventHeight + 3); -// eventHeight = maxEventHeight; - - drawEvent(wrapper.loggingEvent.getColorRuleBackground(), (verticalLocation - eventHeight + 1), eventHeight, g, startX, width); - // System.out.println("painting error - rownum: " + wrapper.rowNum + ", location: " + verticalLocation + ", height: " + eventHeight + ", component height: " + componentHeight + ", row count: " + rowCount); - } - } - } - - for (Iterator iter = findMatches.iterator();iter.hasNext();) { - EventWrapper wrapper = (EventWrapper)iter.next(); - float ratio = (wrapper.rowNum / (float)rowCount); -// System.out.println("warning - ratio: " + ratio + ", component height: " + componentHeight); - int verticalLocation = (int) (componentHeight * ratio) + topOffset; - - int startX = 1; - int width = getWidth() - (startX * 2); - width = (width / 2); - - //use black for search indicator in the 'gutter' - drawEvent(Color.BLACK, verticalLocation, eventHeight, g, startX, width); -// System.out.println("painting warning - rownum: " + wrapper.rowNum + ", location: " + verticalLocation + ", height: " + eventHeight + ", component height: " + componentHeight + ", row count: " + rowCount); - } - } - - public Point getToolTipLocation(MouseEvent event) - { + public Point getToolTipLocation(MouseEvent event) { //shift tooltip down so the the pointer doesn't cover up events below the current mouse location return new Point(event.getX(), event.getY() + 30); } - private void drawEvent(Color newColor, int verticalLocation, int eventHeight, Graphics g, int x, int width) { -// System.out.println("painting: - color: " + newColor + ", verticalLocation: " + verticalLocation + ", eventHeight: " + eventHeight); + protected void drawEvent(Color newColor, int verticalLocation, int eventHeight, Graphics g, int x, int width) { + // System.out.println("painting: - color: " + newColor + ", verticalLocation: " + verticalLocation + ", eventHeight: " + eventHeight); //center drawing at vertical location int y = verticalLocation + (eventHeight / 2); Color oldColor = g.getColor(); @@ -3688,45 +3799,39 @@ public class LogPanel extends DockablePa } g.setColor(oldColor); } + } - class EventWrapper { - int rowNum; - ExtendedLoggingEvent loggingEvent; - public EventWrapper(int rowNum, ExtendedLoggingEvent loggingEvent) { - this.rowNum = rowNum; - this.loggingEvent = loggingEvent; - } - - public String toString() - { - return "event - rownum: " + rowNum + ", level: " + loggingEvent.getLevel(); - } - - public boolean equals(Object o) - { - if (this == o) - { - return true; - } - if (o == null || getClass() != o.getClass()) - { - return false; - } - - EventWrapper that = (EventWrapper) o; + class EventWrapper { + int rowNum; + ExtendedLoggingEvent loggingEvent; + public EventWrapper(int rowNum, ExtendedLoggingEvent loggingEvent) { + this.rowNum = rowNum; + this.loggingEvent = loggingEvent; + } - if (loggingEvent != null ? !loggingEvent.equals(that.loggingEvent) : that.loggingEvent != null) - { - return false; - } + public String toString() { + return "event - rownum: " + rowNum + ", level: " + loggingEvent.getLevel(); + } + public boolean equals(Object o) { + if (this == o) { return true; } + if (o == null || getClass() != o.getClass()) { + return false; + } + + EventWrapper that = (EventWrapper) o; - public int hashCode() - { - return loggingEvent != null ? loggingEvent.hashCode() : 0; + if (loggingEvent != null ? !loggingEvent.equals(that.loggingEvent) : that.loggingEvent != null) { + return false; } + + return true; + } + + public int hashCode() { + return loggingEvent != null ? loggingEvent.hashCode() : 0; } } 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=997597&r1=997596&r2=997597&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 Thu Sep 16 06:18:54 2010 @@ -186,8 +186,7 @@ public class TableColorizingRenderer ext long delta = 0; if (row > 0) { LoggingEvent previous = eventContainer.getRow(row - 1); - float deltaFactor = .002F; - delta = Math.min(50, Math.max(0, (long) ((loggingEvent.getTimeStamp() - previous.getTimeStamp()) * deltaFactor))); + delta = Math.min(ChainsawConstants.MILLIS_DELTA_RENDERING_HEIGHT_MAX, Math.max(0, (long) ((loggingEvent.getTimeStamp() - previous.getTimeStamp()) * ChainsawConstants.MILLIS_DELTA_RENDERING_FACTOR))); } Map matches = loggingEvent.getSearchMatches(); @@ -298,7 +297,7 @@ public class TableColorizingRenderer ext if (delta > 0 && logPanelPreferenceModel.isShowMillisDeltaAsGap()) { JPanel newPanel = new JPanel(); newPanel.setOpaque(true); - newPanel.setBackground(getDeltaColor()); + newPanel.setBackground(applicationPreferenceModel.getDeltaColor()); newPanel.setPreferredSize(new Dimension(width, (int) delta)); multiLinePanel.add(newPanel, BorderLayout.NORTH); } @@ -464,7 +463,7 @@ public class TableColorizingRenderer ext } else { JPanel newPanel = new JPanel(); newPanel.setOpaque(true); - newPanel.setBackground(getDeltaColor()); + newPanel.setBackground(applicationPreferenceModel.getDeltaColor()); newPanel.setPreferredSize(new Dimension(width, (int) delta)); container.add(newPanel, BorderLayout.NORTH); if (col == 0) { @@ -487,7 +486,7 @@ public class TableColorizingRenderer ext if (delta == 0 || !wrap || !logPanelPreferenceModel.isShowMillisDeltaAsGap()) { return innerBorder; } else { - Border outerBorder = BorderFactory.createMatteBorder((int) Math.max(borderWidth, delta), 0, 0, 0, getDeltaColor()); + Border outerBorder = BorderFactory.createMatteBorder((int) Math.max(borderWidth, delta), 0, 0, 0, applicationPreferenceModel.getDeltaColor()); return BorderFactory.createCompoundBorder(outerBorder, innerBorder); } } @@ -499,7 +498,7 @@ public class TableColorizingRenderer ext if (delta == 0 || !wrap || !logPanelPreferenceModel.isShowMillisDeltaAsGap()) { return innerBorder; } else { - Border outerBorder = BorderFactory.createMatteBorder((int) Math.max(borderWidth, delta), 0, 0, 0, getDeltaColor()); + Border outerBorder = BorderFactory.createMatteBorder((int) Math.max(borderWidth, delta), 0, 0, 0, applicationPreferenceModel.getDeltaColor()); return BorderFactory.createCompoundBorder(outerBorder, innerBorder); } } @@ -511,7 +510,7 @@ public class TableColorizingRenderer ext if (delta == 0 || !wrap || !logPanelPreferenceModel.isShowMillisDeltaAsGap()) { return innerBorder; } else { - Border outerBorder = BorderFactory.createMatteBorder((int)Math.max(borderWidth, delta), 0, 0, 0, getDeltaColor()); + Border outerBorder = BorderFactory.createMatteBorder((int)Math.max(borderWidth, delta), 0, 0, 0, applicationPreferenceModel.getDeltaColor()); return BorderFactory.createCompoundBorder(outerBorder, innerBorder); } } @@ -525,20 +524,6 @@ public class TableColorizingRenderer ext textPane.setBackground(background); } - //use a lighter version of search color as the delta color - private Color getDeltaColor() { - float factor = 1.3F; - Color search = applicationPreferenceModel.getSearchBackgroundColor(); - - return new Color(boundColorValue((int)(search.getRed() * factor)), - boundColorValue((int)(search.getGreen() * factor)), - boundColorValue((int)(search.getBlue() * factor))); - } - - private int boundColorValue(int colorValue) { - return Math.min(Math.max(0, colorValue), 255); - } - /** * Changes the Date Formatting object to be used for rendering dates. * @param formatter Modified: logging/chainsaw/trunk/src/main/resources/org/apache/log4j/chainsaw/help/release-notes.html URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/resources/org/apache/log4j/chainsaw/help/release-notes.html?rev=997597&r1=997596&r2=997597&view=diff ============================================================================== --- logging/chainsaw/trunk/src/main/resources/org/apache/log4j/chainsaw/help/release-notes.html (original) +++ logging/chainsaw/trunk/src/main/resources/org/apache/log4j/chainsaw/help/release-notes.html Thu Sep 16 06:18:54 2010 @@ -12,6 +12,7 @@

2.1

15 Sep 2010