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/17 08:05:23 UTC

svn commit: r935135 - in /logging/chainsaw/trunk/src: main/java/org/apache/log4j/chainsaw/ main/resources/org/apache/log4j/chainsaw/help/ test/java/org/apache/log4j/chainsaw/

Author: sdeboy
Date: Sat Apr 17 06:05:22 2010
New Revision: 935135

URL: http://svn.apache.org/viewvc?rev=935135&view=rev
Log:
Added preference to line wrap the message field in the table (multi-line rows) (setting is persisted)
Adjusted non-selected border to fix alignment issues between selected & non-selected rows

Modified:
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogPanel.java
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogPanelPreferenceModel.java
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogPanelPreferencePanel.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/test/java/org/apache/log4j/chainsaw/LogPanelPreferenceModelTest.java

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=935135&r1=935134&r2=935135&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 Sat Apr 17 06:05:22 2010
@@ -424,6 +424,19 @@ public class LogPanel extends DockablePa
         }
       });
 
+    /*
+     * add preferencemodel listeners
+     */
+    preferenceModel.addPropertyChangeListener(
+      "wrapMessage",
+      new PropertyChangeListener() {
+        public void propertyChange(PropertyChangeEvent evt) {
+          renderer.setWrapMessage(
+            ((Boolean) evt.getNewValue()).booleanValue());
+          table.tableChanged(new TableModelEvent(tableModel));
+        }
+      });
+
     preferenceModel.addPropertyChangeListener(
       "detailPaneVisible",
       new PropertyChangeListener() {

Modified: logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogPanelPreferenceModel.java
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogPanelPreferenceModel.java?rev=935135&r1=935134&r2=935135&view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogPanelPreferenceModel.java (original)
+++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogPanelPreferenceModel.java Sat Apr 17 06:05:22 2010
@@ -80,8 +80,9 @@ public class LogPanelPreferenceModel imp
 
   private Collection hiddenLoggers = new HashSet();
   private String timeZone;
-  
-  /**
+  private boolean wrapMsg;
+
+    /**
    * Returns an <b>unmodifiable</b> list of the columns.
    * 
    * The reason it is unmodifiable is to enforce the requirement that
@@ -218,6 +219,7 @@ public class LogPanelPreferenceModel imp
     setLoggerPrecision(model.getLoggerPrecision());
     setDateFormatPattern(model.getDateFormatPattern());
     setLevelIcons(model.isLevelIcons());
+    setWrapMessage(model.isWrapMessage());
     setTimeZone(model.getTimeZone());
     setToolTips(model.isToolTips());
     setScrollToBottom(model.isScrollToBottom());
@@ -248,6 +250,10 @@ public class LogPanelPreferenceModel imp
     return levelIcons;
   }
 
+  public boolean isWrapMessage() {
+    return wrapMsg;
+  }
+
   /**
    * @param levelIcons
    */
@@ -257,6 +263,13 @@ public class LogPanelPreferenceModel imp
   }
 
   /**
+   * @param wrapMsg
+   */
+  public void setWrapMessage(boolean wrapMsg) {
+    this.wrapMsg = wrapMsg;
+    propertySupport.firePropertyChange("wrapMessage", !wrapMsg, wrapMsg);
+  }
+  /**
    * @param loggerPrecision - an integer representing the number of packages to display, 
    * or an empty string representing 'display all packages' 
    */

Modified: logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogPanelPreferencePanel.java
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogPanelPreferencePanel.java?rev=935135&r1=935134&r2=935135&view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogPanelPreferencePanel.java (original)
+++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogPanelPreferencePanel.java Sat Apr 17 06:05:22 2010
@@ -243,6 +243,7 @@ public class LogPanelPreferencePanel ext
     private final JTextField timeZone = new JTextField(10);
     private final JRadioButton rdLevelIcons = new JRadioButton("Icons");
     private final JRadioButton rdLevelText = new JRadioButton("Text");
+    private final JCheckBox wrapMessage = new JCheckBox("Display entire message field in the table (multi-line rows)");
     private JRadioButton rdLast;
 
     //~ Constructors ==========================================================
@@ -362,6 +363,7 @@ public class LogPanelPreferencePanel ext
       levelFormatPanel.add(rdLevelText);
 
       add(levelFormatPanel);
+      add(wrapMessage);
 
       JPanel loggerFormatPanel = new JPanel();
       loggerFormatPanel.setLayout(
@@ -501,6 +503,15 @@ public class LogPanelPreferencePanel ext
           }
         };
 
+      ActionListener wrapMessageListener = new ActionListener()
+      {
+          public void actionPerformed(ActionEvent e)
+          {
+              preferenceModel.setWrapMessage(wrapMessage.isSelected());
+          }
+      };
+
+      wrapMessage.addActionListener(wrapMessageListener);
       rdLevelIcons.addActionListener(levelIconListener);
       rdLevelText.addActionListener(levelIconListener);
 
@@ -514,6 +525,16 @@ public class LogPanelPreferencePanel ext
             rdLevelText.setSelected(!value);
           }
         });
+        
+        preferenceModel.addPropertyChangeListener(
+          "wrapMessage", new PropertyChangeListener()
+          {
+            public void propertyChange(PropertyChangeEvent evt)
+            {
+              boolean value = ((Boolean) evt.getNewValue()).booleanValue();
+              wrapMessage.setSelected(value);
+            }
+          });
     }
   }
 

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=935135&r1=935134&r2=935135&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 Sat Apr 17 06:05:22 2010
@@ -29,8 +29,10 @@ import java.util.TimeZone;
 
 import javax.swing.BorderFactory;
 import javax.swing.Icon;
+import javax.swing.JComponent;
 import javax.swing.JLabel;
 import javax.swing.JTable;
+import javax.swing.JTextArea;
 import javax.swing.SwingConstants;
 import javax.swing.UIManager;
 import javax.swing.border.Border;
@@ -58,6 +60,7 @@ public class TableColorizingRenderer ext
   private RuleColorizer colorizer;
   private final JLabel levelComponent = new JLabel();
   private boolean levelUseIcons = false;
+  private boolean wrapMsg = false;
   private DateFormat dateFormatInUse = DATE_FORMATTER;
   private int loggerPrecision = 0;
   private boolean toolTipsVisible;
@@ -69,7 +72,11 @@ public class TableColorizingRenderer ext
   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);
   private static final Border RIGHT_BORDER = BorderFactory.createMatteBorder(borderWidth, 0, borderWidth, borderWidth, borderColor);
-  private static final Border EMPTY_BORDER = BorderFactory.createEmptyBorder(borderWidth, borderWidth, borderWidth, borderWidth);
+
+  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.
@@ -78,9 +85,11 @@ public class TableColorizingRenderer ext
     this.colorizer = colorizer;
 
     levelComponent.setOpaque(true);
-    levelComponent.setHorizontalAlignment(SwingConstants.CENTER);
+    levelComponent.setVerticalAlignment(SwingConstants.TOP);
 
     levelComponent.setText("");
+    levelComponent.setVerticalAlignment(SwingConstants.TOP);
+    msgRenderer.setSize(1000, 2);
   }
 
   public void setToolTipsVisible(boolean toolTipsVisible) {
@@ -92,12 +101,22 @@ public class TableColorizingRenderer ext
     int row, int col) {
     value = formatField(value);
 
-    JLabel c = (JLabel)super.getTableCellRendererComponent(table, value,
+    JLabel labelRenderer = (JLabel)super.getTableCellRendererComponent(table, value,
         isSelected, hasFocus, row, col);
-
+    labelRenderer.setVerticalAlignment(SwingConstants.TOP);
+    JComponent component;
     TableColumn tableColumn = table.getColumnModel().getColumn(col);
     int colIndex = tableColumn.getModelIndex() + 1;
 
+    if(colIndex == ChainsawColumns.INDEX_MESSAGE_COL_NAME) {
+        component = msgRenderer;
+        msgRenderer.setFont(labelRenderer.getFont());
+    } else if (colIndex == ChainsawColumns.INDEX_LEVEL_COL_NAME) {
+        component = levelComponent;
+    } else {
+        component = labelRenderer;
+    }
+
     EventContainer container = (EventContainer) table.getModel();
     ExtendedLoggingEvent loggingEvent = container.getRow(row);
     //no event, use default renderer
@@ -107,12 +126,12 @@ public class TableColorizingRenderer ext
 
     switch (colIndex) {
     case ChainsawColumns.INDEX_ID_COL_NAME:
-      c.setText(value.toString());
+      labelRenderer.setText(value.toString());
       break;
 
     case ChainsawColumns.INDEX_THROWABLE_COL_NAME:
       if (value instanceof String[] && ((String[])value).length > 0){
-        c.setText(((String[]) value)[0]);
+        labelRenderer.setText(((String[]) value)[0]);
       }
       break;
 
@@ -130,20 +149,37 @@ public class TableColorizingRenderer ext
         }
       }
 
-    c.setText(logger.substring(startPos + 1));
+    labelRenderer.setText(logger.substring(startPos + 1));
       break;
     case ChainsawColumns.INDEX_LOG4J_MARKER_COL_NAME:
     case ChainsawColumns.INDEX_CLASS_COL_NAME:
     case ChainsawColumns.INDEX_FILE_COL_NAME:
     case ChainsawColumns.INDEX_LINE_COL_NAME:
-    case ChainsawColumns.INDEX_MESSAGE_COL_NAME:
     case ChainsawColumns.INDEX_NDC_COL_NAME:
     case ChainsawColumns.INDEX_THREAD_COL_NAME:
     case ChainsawColumns.INDEX_TIMESTAMP_COL_NAME:
     case ChainsawColumns.INDEX_METHOD_COL_NAME:
-      c.setText(value.toString());
+      labelRenderer.setText(value.toString());
       break;
 
+    case ChainsawColumns.INDEX_MESSAGE_COL_NAME:
+        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 = table.getRowHeight();
+            if(preferredHeight != tableRowHeight) {
+                int rowHeight = Math.max(preferredHeight, tableRowHeight);
+                table.setRowHeight(row, rowHeight);
+            }
+        }
+    break;
     case ChainsawColumns.INDEX_LEVEL_COL_NAME:
       if (levelUseIcons) {
         levelComponent.setIcon((Icon) iconMap.get(value.toString()));
@@ -162,12 +198,10 @@ public class TableColorizingRenderer ext
         }
       }
       if (toolTipsVisible) {
-          levelComponent.setToolTipText(c.getToolTipText());
+          levelComponent.setToolTipText(labelRenderer.getToolTipText());
       }
-      levelComponent.setForeground(c.getForeground());
-      levelComponent.setBackground(c.getBackground());
-
-      c = levelComponent;
+      levelComponent.setForeground(labelRenderer.getForeground());
+      levelComponent.setBackground(labelRenderer.getBackground());
       break;
 
     //remaining entries are properties
@@ -184,7 +218,7 @@ public class TableColorizingRenderer ext
             }
         }
         if (thisProp != null) {
-            c.setText(loggingEvent.getProperty(headerName));
+            labelRenderer.setText(loggingEvent.getProperty(headerName));
         }
         break;
     }
@@ -212,21 +246,28 @@ public class TableColorizingRenderer ext
       }
     }
 
-    c.setBackground(background);
-    c.setForeground(foreground);
+    component.setBackground(background);
+    component.setForeground(foreground);
 
     if (isSelected) {
       if (col == 0) {
-        c.setBorder(LEFT_BORDER);
+        component.setBorder(LEFT_BORDER);
       } else if (col == table.getColumnCount() - 1) {
-        c.setBorder(RIGHT_BORDER);
+        component.setBorder(RIGHT_BORDER);
       } else {
-        c.setBorder(MIDDLE_BORDER);
+        component.setBorder(MIDDLE_BORDER);
       }
     } else {
-      c.setBorder(EMPTY_BORDER);
+      if (col == 0) {
+        component.setBorder(LEFT_EMPTY_BORDER);
+      } else if (col == table.getColumnCount() - 1) {
+        component.setBorder(RIGHT_EMPTY_BORDER);
+      } else {
+        component.setBorder(MIDDLE_EMPTY_BORDER);
+      }
     }
-    return c;
+
+    return component;
   }
 
   /**
@@ -275,6 +316,14 @@ public class TableColorizingRenderer ext
     return dateFormatInUse.format((Date) o);
   }
 
+    /**
+    * Sets the property which determines whether to wrap the message
+    * @param wrapMsg
+    */
+   public void setWrapMessage(boolean wrapMsg) {
+     this.wrapMsg = wrapMsg;
+   }
+
    /**
    * Sets the property which determines whether to use Icons or text
    * for the Level column

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=935135&r1=935134&r2=935135&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 Sat Apr 17 06:05:22 2010
@@ -10,6 +10,10 @@
 <b>NOTE:</b> The mechanism and format used to persist settings in Chainsaw is subject to change.  If you are experiencing problems displaying events in Chainsaw, please delete everything in the $user.dir/.chainsaw directory and restart Chainsaw.
 <br>
 <h1>1.99.99</h1>
+<h2>16 Apr 2010</h2>
+<ul>
+<li>Added preference to line wrap the message field in the table (multi-line rows)</li>
+</ul>
 <h2>7 Apr 2010</h2>
 <ul>
 <li>Forward and backward search, as well as forward and backward next-color search now wrap.</li>

Modified: logging/chainsaw/trunk/src/test/java/org/apache/log4j/chainsaw/LogPanelPreferenceModelTest.java
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/test/java/org/apache/log4j/chainsaw/LogPanelPreferenceModelTest.java?rev=935135&r1=935134&r2=935135&view=diff
==============================================================================
--- logging/chainsaw/trunk/src/test/java/org/apache/log4j/chainsaw/LogPanelPreferenceModelTest.java (original)
+++ logging/chainsaw/trunk/src/test/java/org/apache/log4j/chainsaw/LogPanelPreferenceModelTest.java Sat Apr 17 06:05:22 2010
@@ -17,6 +17,7 @@ public class LogPanelPreferenceModelTest
          */
         
         model.setLevelIcons(!model.isLevelIcons());
+        model.setWrapMessage(!model.isWrapMessage());
         model.setDateFormatPattern("yyyyDDmm");
         model.setLoggerPrecision("FATAL");
         model.setLogTreePanelVisible(!model.isLogTreePanelVisible());