You are viewing a plain text version of this content. The canonical link for it is here.
Posted to general@logging.apache.org by sd...@apache.org on 2010/04/18 07:39:02 UTC

svn commit: r935299 - /logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/TableColorizingRenderer.java

Author: sdeboy
Date: Sun Apr 18 05:39:01 2010
New Revision: 935299

URL: http://svn.apache.org/viewvc?rev=935299&view=rev
Log:
Replaced multi-line table rendering implementation with one which doesn't exhibit the visual glitches, and calculates textarea height using AttributedString, LineBreakMeasurer and actual font information

Modified:
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/TableColorizingRenderer.java

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=935299&r1=935298&r2=935299&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 Apr 18 05:39:01 2010
@@ -19,9 +19,17 @@ package org.apache.log4j.chainsaw;
 
 import java.awt.Color;
 import java.awt.Component;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.font.LineBreakMeasurer;
+import java.awt.font.TextAttribute;
+import java.awt.font.TextLayout;
+import java.text.AttributedCharacterIterator;
+import java.text.AttributedString;
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
@@ -68,6 +76,8 @@ public class TableColorizingRenderer ext
   private boolean useRelativeTimes = false;
   private long relativeTimestampBase;
   private static int borderWidth = 2;
+  private JTextArea msgRenderer = new JTextArea();
+
   private static Color borderColor = (Color)UIManager.get("Table.selectionBackground");
   private static final Border LEFT_BORDER = BorderFactory.createMatteBorder(borderWidth, borderWidth, borderWidth, 0, borderColor);
   private static final Border MIDDLE_BORDER = BorderFactory.createMatteBorder(borderWidth, 0, borderWidth, 0, borderColor);
@@ -76,7 +86,6 @@ public class TableColorizingRenderer ext
   private static final Border LEFT_EMPTY_BORDER = BorderFactory.createEmptyBorder(borderWidth, borderWidth, borderWidth, 0);
   private static final Border MIDDLE_EMPTY_BORDER = BorderFactory.createEmptyBorder(borderWidth, 0, borderWidth, 0);
   private static final Border RIGHT_EMPTY_BORDER = BorderFactory.createEmptyBorder(borderWidth, 0, borderWidth, borderWidth);
-  private JTextArea msgRenderer = new JTextArea();
 
     /**
    * Creates a new TableColorizingRenderer object.
@@ -89,7 +98,7 @@ public class TableColorizingRenderer ext
 
     levelComponent.setText("");
     levelComponent.setVerticalAlignment(SwingConstants.TOP);
-    msgRenderer.setSize(1000, 2);
+    msgRenderer.setEditable(false);
   }
 
   public void setToolTipsVisible(boolean toolTipsVisible) {
@@ -106,11 +115,12 @@ public class TableColorizingRenderer ext
     labelRenderer.setVerticalAlignment(SwingConstants.TOP);
     JComponent component;
     TableColumn tableColumn = table.getColumnModel().getColumn(col);
+    //chainsawcolumns uses one-based indexing
     int colIndex = tableColumn.getModelIndex() + 1;
 
     if(colIndex == ChainsawColumns.INDEX_MESSAGE_COL_NAME) {
-        component = msgRenderer;
         msgRenderer.setFont(labelRenderer.getFont());
+        component = msgRenderer;
     } else if (colIndex == ChainsawColumns.INDEX_LEVEL_COL_NAME) {
         component = levelComponent;
     } else {
@@ -163,21 +173,21 @@ public class TableColorizingRenderer ext
       break;
 
     case ChainsawColumns.INDEX_MESSAGE_COL_NAME:
+        String string = value.toString().trim();
         msgRenderer.setLineWrap(wrapMsg);
         msgRenderer.setWrapStyleWord(wrapMsg);
-
-        if (wrapMsg) {
-            int width = table.getColumnModel().getColumn(ChainsawColumns.INDEX_MESSAGE_COL_NAME).getWidth();
-            msgRenderer.setSize(width, 2);
-        }
-        msgRenderer.setText(value.toString());
-        if (wrapMsg) {
-            int preferredHeight = (int) msgRenderer.getPreferredSize().getHeight();
-            int tableRowHeight;
-            tableRowHeight = table.getRowHeight(row);
-            if(preferredHeight != tableRowHeight && preferredHeight != ChainsawConstants.DEFAULT_ROW_HEIGHT) {
-                table.setRowHeight(row, preferredHeight);
+        if (wrapMsg && string.length() > 0) {
+            int width = tableColumn.getWidth();
+            int tableRowHeight = table.getRowHeight(row);
+            Map paramMap = new HashMap();
+            paramMap.put(TextAttribute.FONT, msgRenderer.getFont());
+            int preferredHeight = calculateHeight(table.getGraphics(), string, width, paramMap);
+            if(preferredHeight != tableRowHeight) {
+                table.setRowHeight(row, Math.max(preferredHeight, ChainsawConstants.DEFAULT_ROW_HEIGHT));
             }
+            msgRenderer.setText(string);
+        } else {
+            msgRenderer.setText(string);
         }
     break;
     case ChainsawColumns.INDEX_LEVEL_COL_NAME:
@@ -351,4 +361,20 @@ public class TableColorizingRenderer ext
   public void setUseNormalTimes() {
     useRelativeTimes = false;
   }
+
+   private int calculateHeight(Graphics g, String string, int width, Map paramMap) {
+     AttributedCharacterIterator paragraph = new AttributedString(string, paramMap).getIterator();
+     LineBreakMeasurer lineMeasurer = new LineBreakMeasurer(paragraph, ((Graphics2D)g).getFontRenderContext());
+     float height = 0;
+     lineMeasurer.setPosition(paragraph.getBeginIndex());
+     TextLayout layout;
+     while (lineMeasurer.getPosition() < paragraph.getEndIndex()) {
+       layout = lineMeasurer.nextLayout(width);
+         //add 1 pixel padding per row
+         float layoutHeight = layout.getAscent() + layout.getDescent() + layout.getLeading() + 1;
+         height += layoutHeight;
+     }
+     //pad total by 4
+     return (int) height + 4;
+    }
 }