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/16 07:32:35 UTC

svn commit: r934693 - in /logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw: ChainsawAppenderHandler.java ChainsawStatusBar.java LogPanel.java LoggerNameTreePanel.java TableColorizingRenderer.java

Author: sdeboy
Date: Fri Apr 16 05:32:34 2010
New Revision: 934693

URL: http://svn.apache.org/viewvc?rev=934693&view=rev
Log:
Chainsaw UI updates (feedback appreciated)
 - instead of the default row selection rendering of changing the row's background color, the selected row color is preserved but a border around the selected row is displayed
 - removed table row and column margin (border around cells in the selected row had gaps without making this change)
 - updated widths of fields in status bar
 - performance tweak: tree node selection no longer triggers unnecessary calculations (only currently displayed rows are recalculated for highlighting)
 - removed bevel border around ID field
 
Fixed xml decoders - an empty throwable node was resulting in a loggingEvent with a non-null (but blank) throwableInformation ('exception exists' expression in Chainsaw would match all events)

Modified:
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawAppenderHandler.java
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawStatusBar.java
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogPanel.java
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LoggerNameTreePanel.java
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/TableColorizingRenderer.java

Modified: logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawAppenderHandler.java
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawAppenderHandler.java?rev=934693&r1=934692&r2=934693&view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawAppenderHandler.java (original)
+++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawAppenderHandler.java Fri Apr 16 05:32:34 2010
@@ -122,7 +122,7 @@ public class ChainsawAppenderHandler ext
    * Determines an appropriate title for the Tab for the Tab Pane by locating a
    * the hostname property
    * 
-   * @param event
+   * @param e
    * @return identifier
    */
   String getTabIdentifier(LoggingEvent e) {

Modified: logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawStatusBar.java
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawStatusBar.java?rev=934693&r1=934692&r2=934693&view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawStatusBar.java (original)
+++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawStatusBar.java Fri Apr 16 05:32:34 2010
@@ -52,7 +52,7 @@ public class ChainsawStatusBar extends J
   private final JLabel pausedLabel = new JLabel("", SwingConstants.CENTER);
   private final JLabel lineSelectionLabel = new JLabel("", SwingConstants.CENTER);
   private final JLabel eventCountLabel = new JLabel("", SwingConstants.CENTER);
-  private final JLabel receivedEventLabel = new JLabel("0.0", SwingConstants.CENTER);
+  private final JLabel receivedEventLabel = new JLabel("", SwingConstants.CENTER);
   private final JLabel receivedConnectionlabel = new JLabel("", SwingConstants.CENTER);
   private volatile long lastReceivedConnection = System.currentTimeMillis();
   private final Thread connectionThread;
@@ -66,8 +66,8 @@ public class ChainsawStatusBar extends J
   public ChainsawStatusBar() {
     setLayout(new GridBagLayout());
 
-    nf.setMaximumFractionDigits(1);
-    nf.setMinimumFractionDigits(1);
+    nf.setMaximumFractionDigits(0);
+    nf.setMinimumFractionDigits(0);
     nf.setGroupingUsed(false);
 
     JPanel statusMsgPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 2, 2));
@@ -88,7 +88,7 @@ public class ChainsawStatusBar extends J
     receivedEventLabel.setMinimumSize(
       new Dimension(
         receivedEventLabel.getFontMetrics(receivedEventLabel.getFont())
-                          .stringWidth("9999.9/s") + 5,
+                          .stringWidth("99999999999.9/s") + 5,
         (int) receivedEventLabel.getPreferredSize().getHeight()));
 
 	eventCountLabel.setBorder(statusBarComponentBorder);

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=934693&r1=934692&r2=934693&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 Fri Apr 16 05:32:34 2010
@@ -639,7 +639,7 @@ public class LogPanel extends DockablePa
      *
      */
     LogPanelLoggerTreeModel logTreeModel = new LogPanelLoggerTreeModel();
-    logTreePanel = new LoggerNameTreePanel(logTreeModel, preferenceModel);
+    logTreePanel = new LoggerNameTreePanel(logTreeModel, preferenceModel, this);
     logTreePanel.addPropertyChangeListener("searchExpression", new PropertyChangeListener()
     {
         public void propertyChange(PropertyChangeEvent evt)
@@ -692,6 +692,8 @@ public class LogPanel extends DockablePa
      * Table definition.  Actual construction is above (next to tablemodel)
      */
     table.setRowHeight(20);
+    table.setRowMargin(0);
+    table.getColumnModel().setColumnMargin(0);
     table.setShowGrid(false);
 
     table.getColumnModel().addColumnModelListener(

Modified: logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LoggerNameTreePanel.java
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LoggerNameTreePanel.java?rev=934693&r1=934692&r2=934693&view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LoggerNameTreePanel.java (original)
+++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LoggerNameTreePanel.java Fri Apr 16 05:32:34 2010
@@ -139,6 +139,7 @@ final class LoggerNameTreePanel extends 
   private Rule colorRuleDelegate; 
   private final JScrollPane scrollTree;
   private final JToolBar toolbar = new JToolBar();
+  private final LogPanel logPanel;
 
     //~ Constructors ============================================================
 
@@ -147,11 +148,12 @@ final class LoggerNameTreePanel extends 
    *
    * @param logTreeModel
    */
-  LoggerNameTreePanel(LogPanelLoggerTreeModel logTreeModel, LogPanelPreferenceModel preferenceModel)
+  LoggerNameTreePanel(LogPanelLoggerTreeModel logTreeModel, LogPanelPreferenceModel preferenceModel, LogPanel logPanel)
   {
     super();
     this.logTreeModel = logTreeModel;
     this.preferenceModel = preferenceModel;
+    this.logPanel = logPanel;
 
     setLayout(new BorderLayout());
 
@@ -1037,7 +1039,7 @@ final class LoggerNameTreePanel extends 
           {
             node = (TreeNode) path.getLastPathComponent();
           }
-
+          boolean focusOnSelected = isFocusOnSelected();
           //          editLoggerAction.setEnabled(path != null);
           String logger = getCurrentlySelectedLoggerName();
           focusOnAction.setEnabled(
@@ -1069,6 +1071,15 @@ final class LoggerNameTreePanel extends 
           collapseAction.setEnabled(path != null);
 
           reconfigureMenuText();
+          if (isFocusOnSelected()) {
+              fireChangeEvent();
+          }
+          //fire change event if we toggled focus off
+          if (focusOnSelected && !isFocusOnSelected()) {
+              fireChangeEvent();
+          }
+          //trigger a table repaint
+          logPanel.repaint();
         }
       });
 
@@ -1091,8 +1102,6 @@ final class LoggerNameTreePanel extends 
             logTreeModel.nodeChanged(
               (TreeNode) logTree.getSelectionPath().getLastPathComponent());
           }
-
-          fireChangeEvent();
         }
       });
 
@@ -1105,8 +1114,6 @@ final class LoggerNameTreePanel extends 
             logTreeModel.nodeChanged(
               (TreeNode) logTree.getSelectionPath().getLastPathComponent());
           }
-
-          fireChangeEvent();
         }
       });
 
@@ -1182,6 +1189,7 @@ final class LoggerNameTreePanel extends 
   {
     setFocusOnSelected(!isFocusOnSelected());
     hideAction.setEnabled(!isFocusOnSelected());
+    fireChangeEvent();
   }
 
     public Collection getHiddenSet() {
@@ -1420,6 +1428,7 @@ final class LoggerNameTreePanel extends 
       if (logger != null)
       {
         toggleHiddenLogger(logger);
+        fireChangeEvent();
       }
     }
   }

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=934693&r1=934692&r2=934693&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 Fri Apr 16 05:32:34 2010
@@ -5,9 +5,9 @@
  * The ASF licenses this file to You under the Apache License, Version 2.0
  * (the "License"); you may not use this file except in compliance with
  * the License.  You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -32,6 +32,8 @@ import javax.swing.Icon;
 import javax.swing.JLabel;
 import javax.swing.JTable;
 import javax.swing.SwingConstants;
+import javax.swing.UIManager;
+import javax.swing.border.Border;
 import javax.swing.table.DefaultTableCellRenderer;
 import javax.swing.table.TableColumn;
 
@@ -54,7 +56,6 @@ public class TableColorizingRenderer ext
   private static final DateFormat DATE_FORMATTER = new SimpleDateFormat(Constants.SIMPLE_TIME_PATTERN);
   private static final Map iconMap = LevelIconFactory.getInstance().getLevelToIconMap();
   private RuleColorizer colorizer;
-  private final JLabel idComponent = new JLabel();
   private final JLabel levelComponent = new JLabel();
   private boolean levelUseIcons = false;
   private DateFormat dateFormatInUse = DATE_FORMATTER;
@@ -63,23 +64,25 @@ public class TableColorizingRenderer ext
   private String dateFormatTZ;
   private boolean useRelativeTimes = false;
   private long relativeTimestampBase;
+  private static int borderWidth = 2;
+  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);
+  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);
 
     /**
    * Creates a new TableColorizingRenderer object.
    */
   public TableColorizingRenderer(RuleColorizer colorizer) {
     this.colorizer = colorizer;
-    idComponent.setBorder(BorderFactory.createRaisedBevelBorder());
-    idComponent.setBackground(Color.gray);
-    idComponent.setHorizontalAlignment(SwingConstants.CENTER);
-    idComponent.setOpaque(true);
 
     levelComponent.setOpaque(true);
     levelComponent.setHorizontalAlignment(SwingConstants.CENTER);
 
     levelComponent.setText("");
   }
-  
+
   public void setToolTipsVisible(boolean toolTipsVisible) {
       this.toolTipsVisible = toolTipsVisible;
   }
@@ -89,25 +92,22 @@ public class TableColorizingRenderer ext
     int row, int col) {
     value = formatField(value);
 
-    JLabel c = (JLabel)super.getTableCellRendererComponent(table, value, 
+    JLabel c = (JLabel)super.getTableCellRendererComponent(table, value,
         isSelected, hasFocus, row, col);
 
     TableColumn tableColumn = table.getColumnModel().getColumn(col);
     int colIndex = tableColumn.getModelIndex() + 1;
 
     EventContainer container = (EventContainer) table.getModel();
-    ExtendedLoggingEvent event = container.getRow(row);
+    ExtendedLoggingEvent loggingEvent = container.getRow(row);
     //no event, use default renderer
-    if (event == null) {
+    if (loggingEvent == null) {
         return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col);
     }
 
     switch (colIndex) {
     case ChainsawColumns.INDEX_ID_COL_NAME:
-      idComponent.setText(value.toString());
-      idComponent.setForeground(c.getForeground());
-      idComponent.setBackground(c.getBackground());
-      c = idComponent;
+      c.setText(value.toString());
       break;
 
     case ChainsawColumns.INDEX_THROWABLE_COL_NAME:
@@ -172,7 +172,7 @@ public class TableColorizingRenderer ext
 
     //remaining entries are properties
     default:
-        Set propertySet = event.getPropertyKeySet();
+        Set propertySet = loggingEvent.getPropertyKeySet();
         String headerName = tableColumn.getHeaderValue().toString().toLowerCase();
         String thisProp = null;
         //find the property in the property set...case-sensitive
@@ -184,24 +184,21 @@ public class TableColorizingRenderer ext
             }
         }
         if (thisProp != null) {
-            c.setText(event.getProperty(headerName));
+            c.setText(loggingEvent.getProperty(headerName));
         }
         break;
     }
-    if (isSelected) {
-      return c;
-    }
 
     Color background;
     Color foreground;
     Rule loggerRule = colorizer.getLoggerRule();
     //use logger colors in table instead of event colors if event passes logger rule
-    if (loggerRule != null && loggerRule.evaluate(event)) {
+    if (loggerRule != null && loggerRule.evaluate(loggingEvent)) {
         background = ChainsawConstants.FIND_LOGGER_BACKGROUND;
         foreground = ChainsawConstants.FIND_LOGGER_FOREGROUND;
     } else {
-        background = event.getBackground();
-        foreground = event.getForeground();
+        background = loggingEvent.getBackground();
+        foreground = loggingEvent.getForeground();
     }
 
     /**
@@ -218,6 +215,17 @@ public class TableColorizingRenderer ext
     c.setBackground(background);
     c.setForeground(foreground);
 
+    if (isSelected) {
+      if (col == 0) {
+        c.setBorder(LEFT_BORDER);
+      } else if (col == table.getColumnCount() - 1) {
+        c.setBorder(RIGHT_BORDER);
+      } else {
+        c.setBorder(MIDDLE_BORDER);
+      }
+    } else {
+      c.setBorder(EMPTY_BORDER);
+    }
     return c;
   }