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/

[email protected]
Newsgroups gmane.comp.apache.logging
Message-ID <[email protected]>
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());
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.