You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by ma...@apache.org on 2018/03/13 07:04:48 UTC

[20/27] logging-chainsaw git commit: Reformat code for consistency

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/96ebd9ad/src/main/java/org/apache/log4j/chainsaw/LogPanel.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/chainsaw/LogPanel.java b/src/main/java/org/apache/log4j/chainsaw/LogPanel.java
index dcf16a0..8bbd2d4 100644
--- a/src/main/java/org/apache/log4j/chainsaw/LogPanel.java
+++ b/src/main/java/org/apache/log4j/chainsaw/LogPanel.java
@@ -17,113 +17,8 @@
 
 package org.apache.log4j.chainsaw;
 
-import java.awt.BorderLayout;
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.Container;
-import java.awt.Dimension;
-import java.awt.EventQueue;
-import java.awt.Font;
-import java.awt.FontMetrics;
-import java.awt.Graphics;
-import java.awt.Point;
-import java.awt.Toolkit;
-import java.awt.Window;
-import java.awt.datatransfer.Clipboard;
-import java.awt.datatransfer.StringSelection;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.FocusEvent;
-import java.awt.event.FocusListener;
-import java.awt.event.InputEvent;
-import java.awt.event.KeyEvent;
-import java.awt.event.KeyListener;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
-import java.awt.event.MouseListener;
-import java.awt.event.MouseMotionAdapter;
-import java.awt.event.WindowAdapter;
-import java.awt.event.WindowEvent;
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
-import java.io.EOFException;
-import java.io.File;
-import java.io.FileReader;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.io.StringReader;
-import java.io.UnsupportedEncodingException;
-import java.net.URLEncoder;
-import java.text.DateFormat;
-import java.text.NumberFormat;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.Enumeration;
-import java.util.EventObject;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Set;
-import java.util.StringTokenizer;
-import java.util.Vector;
-
-import javax.swing.AbstractAction;
-import javax.swing.AbstractListModel;
-import javax.swing.Action;
-import javax.swing.BorderFactory;
-import javax.swing.Box;
-import javax.swing.BoxLayout;
-import javax.swing.ButtonGroup;
-import javax.swing.ComboBoxEditor;
-import javax.swing.ImageIcon;
-import javax.swing.JButton;
-import javax.swing.JCheckBoxMenuItem;
-import javax.swing.JColorChooser;
-import javax.swing.JComboBox;
-import javax.swing.JComponent;
-import javax.swing.JDialog;
-import javax.swing.JEditorPane;
-import javax.swing.JFrame;
-import javax.swing.JLabel;
-import javax.swing.JMenuItem;
-import javax.swing.JPanel;
-import javax.swing.JPopupMenu;
-import javax.swing.JRadioButtonMenuItem;
-import javax.swing.JScrollPane;
-import javax.swing.JSeparator;
-import javax.swing.JSplitPane;
-import javax.swing.JTable;
-import javax.swing.JTextField;
-import javax.swing.JToolBar;
-import javax.swing.KeyStroke;
-import javax.swing.ListSelectionModel;
-import javax.swing.MutableComboBoxModel;
-import javax.swing.SwingConstants;
-import javax.swing.SwingUtilities;
-import javax.swing.UIManager;
-import javax.swing.WindowConstants;
-import javax.swing.event.CellEditorListener;
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.DocumentEvent;
-import javax.swing.event.DocumentListener;
-import javax.swing.event.ListSelectionEvent;
-import javax.swing.event.ListSelectionListener;
-import javax.swing.event.PopupMenuEvent;
-import javax.swing.event.PopupMenuListener;
-import javax.swing.event.TableColumnModelEvent;
-import javax.swing.event.TableColumnModelListener;
-import javax.swing.event.TableModelEvent;
-import javax.swing.table.TableCellEditor;
-import javax.swing.table.TableColumn;
-import javax.swing.table.TableColumnModel;
-import javax.swing.text.Document;
-
+import com.thoughtworks.xstream.XStream;
+import com.thoughtworks.xstream.io.xml.DomDriver;
 import org.apache.log4j.Level;
 import org.apache.log4j.LogManager;
 import org.apache.log4j.Logger;
@@ -150,8 +45,25 @@ import org.apache.log4j.rule.Rule;
 import org.apache.log4j.spi.LoggingEvent;
 import org.apache.log4j.spi.LoggingEventFieldResolver;
 
-import com.thoughtworks.xstream.XStream;
-import com.thoughtworks.xstream.io.xml.DomDriver;
+import javax.swing.*;
+import javax.swing.event.*;
+import javax.swing.table.TableCellEditor;
+import javax.swing.table.TableColumn;
+import javax.swing.table.TableColumnModel;
+import javax.swing.text.Document;
+import java.awt.*;
+import java.awt.datatransfer.Clipboard;
+import java.awt.datatransfer.StringSelection;
+import java.awt.event.*;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.io.*;
+import java.net.URLEncoder;
+import java.text.DateFormat;
+import java.text.NumberFormat;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.List;
 
 
 /**
@@ -193,597 +105,595 @@ import com.thoughtworks.xstream.io.xml.DomDriver;
  * CHAINSAW_CAPACITY system property) or ArrayList (no max size)
  * <li>use the mouse context menu to 'best-fit' columns, define display
  * expression filters based on mouse location and access other capabilities
- *</ul>
- *
- *@see org.apache.log4j.chainsaw.color.ColorPanel
- *@see org.apache.log4j.rule.ExpressionRule
- *@see org.apache.log4j.spi.LoggingEventFieldResolver
- *
- *@author Scott Deboy (sdeboy at apache.org)
- *@author Paul Smith (psmith at apache.org)
- *@author Stephen Pain
- *@author Isuru Suriarachchi
+ * </ul>
  *
+ * @author Scott Deboy (sdeboy at apache.org)
+ * @author Paul Smith (psmith at apache.org)
+ * @author Stephen Pain
+ * @author Isuru Suriarachchi
+ * @see org.apache.log4j.chainsaw.color.ColorPanel
+ * @see org.apache.log4j.rule.ExpressionRule
+ * @see org.apache.log4j.spi.LoggingEventFieldResolver
  */
 public class LogPanel extends DockablePanel implements EventBatchListener, Profileable {
-  private static final DateFormat TIMESTAMP_DATE_FORMAT = new SimpleDateFormat(Constants.TIMESTAMP_RULE_FORMAT);
-  private static final double DEFAULT_DETAIL_SPLIT_LOCATION = 0.71d;
-  private static final double DEFAULT_LOG_TREE_SPLIT_LOCATION = 0.2d;
-  private final String identifier;
-  private final ChainsawStatusBar statusBar;
-  private final JFrame logPanelPreferencesFrame = new JFrame();
-  private ColorPanel colorPanel;
-  private final JFrame colorFrame = new JFrame();
-  private final JFrame undockedFrame;
-  private final DockablePanel externalPanel;
-  private final Action dockingAction;
-  private final JToolBar undockedToolbar;
-  private final JSortTable table;
-  private final TableColorizingRenderer renderer;
-  private final EventContainer tableModel;
-  private final JEditorPane detail;
-  private final JSplitPane lowerPanel;
-  private final DetailPaneUpdater detailPaneUpdater;
-  private final JPanel detailPanel = new JPanel(new BorderLayout());
-  private final JSplitPane nameTreeAndMainPanelSplit;
-  private final LoggerNameTreePanel logTreePanel;
-  private final LogPanelPreferenceModel preferenceModel = new LogPanelPreferenceModel();
-  private ApplicationPreferenceModel applicationPreferenceModel;
-  private final LogPanelPreferencePanel logPanelPreferencesPanel;
-  private final FilterModel filterModel = new FilterModel();
-  private final RuleColorizer colorizer = new RuleColorizer();
-  private final RuleMediator tableRuleMediator = new RuleMediator(false);
-  private final RuleMediator searchRuleMediator = new RuleMediator(true);
-  private final EventDetailLayout detailLayout = new EventDetailLayout();
-  private double lastLogTreePanelSplitLocation = DEFAULT_LOG_TREE_SPLIT_LOCATION;
-  private Point currentPoint;
-  private JTable currentTable;
-  private boolean paused = false;
-  private Rule findRule;
-  private String currentFindRuleText;
-  private Rule findMarkerRule;
-  private final int dividerSize;
-  static final String TABLE_COLUMN_ORDER = "table.columns.order";
-  static final String TABLE_COLUMN_WIDTHS = "table.columns.widths";
-  static final String COLORS_EXTENSION = ".colors";
-  private static final int LOG_PANEL_SERIALIZATION_VERSION_NUMBER = 2; //increment when format changes
-  private int previousLastIndex = -1;
-  private final Logger logger = LogManager.getLogger(LogPanel.class);
-  private AutoFilterComboBox filterCombo;
-  private AutoFilterComboBox findCombo;
-  private JScrollPane eventsPane;
-  private int currentSearchMatchCount;
-  private Rule clearTableExpressionRule;
-  private int lowerPanelDividerLocation;
-  private EventContainer searchModel;
-  private final JSortTable searchTable;
-  private TableColorizingRenderer searchRenderer;
-  private ToggleToolTips mainToggleToolTips;
-  private ToggleToolTips searchToggleToolTips;
-  private JScrollPane detailPane;
-  private JScrollPane searchPane;
-  //only one tableCellEditor, shared by both tables
-  private TableCellEditor markerCellEditor;
-  private JToolBar detailToolbar;
-  private boolean searchResultsDisplayed;
-  private ColorizedEventAndSearchMatchThumbnail colorizedEventAndSearchMatchThumbnail;
-  private EventTimeDeltaMatchThumbnail eventTimeDeltaMatchThumbnail;
-  private boolean isDetailPanelVisible;
-
-  /**
-   * Creates a new LogPanel object.  If a LogPanel with this identifier has
-   * been loaded previously, reload settings saved on last exit.
-   *
-   * @param statusBar shared status bar, provided by main application
-   * @param identifier used to load and save settings
-   */
-  public LogPanel(final ChainsawStatusBar statusBar, final String identifier, int cyclicBufferSize,
-                  Map<String, RuleColorizer> allColorizers, final ApplicationPreferenceModel applicationPreferenceModel) {
-    this.identifier = identifier;
-    this.statusBar = statusBar;
-    this.applicationPreferenceModel = applicationPreferenceModel;
-    this.logPanelPreferencesPanel = new LogPanelPreferencePanel(preferenceModel, applicationPreferenceModel);
-    logger.debug("creating logpanel for " + identifier);
-
-    setLayout(new BorderLayout());
-
-    String prototypeValue = "1231231231231231231231";
-
-    filterCombo = new AutoFilterComboBox();
-    findCombo = new AutoFilterComboBox();
-
-    filterCombo.setPrototypeDisplayValue(prototypeValue);
-    buildCombo(filterCombo, true, findCombo.model);
-
-    findCombo.setPrototypeDisplayValue(prototypeValue);
-    buildCombo(findCombo, false, filterCombo.model);
-
-    final Map<Object, String> columnNameKeywordMap = new HashMap<>();
-    columnNameKeywordMap.put(ChainsawConstants.CLASS_COL_NAME, LoggingEventFieldResolver.CLASS_FIELD);
-    columnNameKeywordMap.put(ChainsawConstants.FILE_COL_NAME, LoggingEventFieldResolver.FILE_FIELD);
-    columnNameKeywordMap.put(ChainsawConstants.LEVEL_COL_NAME, LoggingEventFieldResolver.LEVEL_FIELD);
-    columnNameKeywordMap.put(ChainsawConstants.LINE_COL_NAME, LoggingEventFieldResolver.LINE_FIELD);
-    columnNameKeywordMap.put(ChainsawConstants.LOGGER_COL_NAME, LoggingEventFieldResolver.LOGGER_FIELD);
-    columnNameKeywordMap.put(ChainsawConstants.NDC_COL_NAME, LoggingEventFieldResolver.NDC_FIELD);
-    columnNameKeywordMap.put(ChainsawConstants.MESSAGE_COL_NAME, LoggingEventFieldResolver.MSG_FIELD);
-    columnNameKeywordMap.put(ChainsawConstants.THREAD_COL_NAME, LoggingEventFieldResolver.THREAD_FIELD);
-    columnNameKeywordMap.put(ChainsawConstants.THROWABLE_COL_NAME, LoggingEventFieldResolver.EXCEPTION_FIELD);
-    columnNameKeywordMap.put(ChainsawConstants.TIMESTAMP_COL_NAME, LoggingEventFieldResolver.TIMESTAMP_FIELD);
-    columnNameKeywordMap.put(ChainsawConstants.ID_COL_NAME.toUpperCase(), LoggingEventFieldResolver.PROP_FIELD + Constants.LOG4J_ID_KEY);
-    columnNameKeywordMap.put(ChainsawConstants.LOG4J_MARKER_COL_NAME_LOWERCASE.toUpperCase(), LoggingEventFieldResolver.PROP_FIELD + ChainsawConstants.LOG4J_MARKER_COL_NAME_LOWERCASE);
-    columnNameKeywordMap.put(ChainsawConstants.MILLIS_DELTA_COL_NAME_LOWERCASE.toUpperCase(), LoggingEventFieldResolver.PROP_FIELD + ChainsawConstants.MILLIS_DELTA_COL_NAME_LOWERCASE);
-
-    logPanelPreferencesFrame.setTitle("'" + identifier + "' Log Panel Preferences");
-    logPanelPreferencesFrame.setIconImage(
-      ((ImageIcon) ChainsawIcons.ICON_PREFERENCES).getImage());
-    logPanelPreferencesFrame.getContentPane().add(new JScrollPane(logPanelPreferencesPanel));
-
-    logPanelPreferencesFrame.setSize(740, 520);
-
-    logPanelPreferencesPanel.setOkCancelActionListener(
+    private static final DateFormat TIMESTAMP_DATE_FORMAT = new SimpleDateFormat(Constants.TIMESTAMP_RULE_FORMAT);
+    private static final double DEFAULT_DETAIL_SPLIT_LOCATION = 0.71d;
+    private static final double DEFAULT_LOG_TREE_SPLIT_LOCATION = 0.2d;
+    private final String identifier;
+    private final ChainsawStatusBar statusBar;
+    private final JFrame logPanelPreferencesFrame = new JFrame();
+    private ColorPanel colorPanel;
+    private final JFrame colorFrame = new JFrame();
+    private final JFrame undockedFrame;
+    private final DockablePanel externalPanel;
+    private final Action dockingAction;
+    private final JToolBar undockedToolbar;
+    private final JSortTable table;
+    private final TableColorizingRenderer renderer;
+    private final EventContainer tableModel;
+    private final JEditorPane detail;
+    private final JSplitPane lowerPanel;
+    private final DetailPaneUpdater detailPaneUpdater;
+    private final JPanel detailPanel = new JPanel(new BorderLayout());
+    private final JSplitPane nameTreeAndMainPanelSplit;
+    private final LoggerNameTreePanel logTreePanel;
+    private final LogPanelPreferenceModel preferenceModel = new LogPanelPreferenceModel();
+    private ApplicationPreferenceModel applicationPreferenceModel;
+    private final LogPanelPreferencePanel logPanelPreferencesPanel;
+    private final FilterModel filterModel = new FilterModel();
+    private final RuleColorizer colorizer = new RuleColorizer();
+    private final RuleMediator tableRuleMediator = new RuleMediator(false);
+    private final RuleMediator searchRuleMediator = new RuleMediator(true);
+    private final EventDetailLayout detailLayout = new EventDetailLayout();
+    private double lastLogTreePanelSplitLocation = DEFAULT_LOG_TREE_SPLIT_LOCATION;
+    private Point currentPoint;
+    private JTable currentTable;
+    private boolean paused = false;
+    private Rule findRule;
+    private String currentFindRuleText;
+    private Rule findMarkerRule;
+    private final int dividerSize;
+    static final String TABLE_COLUMN_ORDER = "table.columns.order";
+    static final String TABLE_COLUMN_WIDTHS = "table.columns.widths";
+    static final String COLORS_EXTENSION = ".colors";
+    private static final int LOG_PANEL_SERIALIZATION_VERSION_NUMBER = 2; //increment when format changes
+    private int previousLastIndex = -1;
+    private final Logger logger = LogManager.getLogger(LogPanel.class);
+    private AutoFilterComboBox filterCombo;
+    private AutoFilterComboBox findCombo;
+    private JScrollPane eventsPane;
+    private int currentSearchMatchCount;
+    private Rule clearTableExpressionRule;
+    private int lowerPanelDividerLocation;
+    private EventContainer searchModel;
+    private final JSortTable searchTable;
+    private TableColorizingRenderer searchRenderer;
+    private ToggleToolTips mainToggleToolTips;
+    private ToggleToolTips searchToggleToolTips;
+    private JScrollPane detailPane;
+    private JScrollPane searchPane;
+    //only one tableCellEditor, shared by both tables
+    private TableCellEditor markerCellEditor;
+    private JToolBar detailToolbar;
+    private boolean searchResultsDisplayed;
+    private ColorizedEventAndSearchMatchThumbnail colorizedEventAndSearchMatchThumbnail;
+    private EventTimeDeltaMatchThumbnail eventTimeDeltaMatchThumbnail;
+    private boolean isDetailPanelVisible;
+
+    /**
+     * Creates a new LogPanel object.  If a LogPanel with this identifier has
+     * been loaded previously, reload settings saved on last exit.
+     *
+     * @param statusBar  shared status bar, provided by main application
+     * @param identifier used to load and save settings
+     */
+    public LogPanel(final ChainsawStatusBar statusBar, final String identifier, int cyclicBufferSize,
+                    Map<String, RuleColorizer> allColorizers, final ApplicationPreferenceModel applicationPreferenceModel) {
+        this.identifier = identifier;
+        this.statusBar = statusBar;
+        this.applicationPreferenceModel = applicationPreferenceModel;
+        this.logPanelPreferencesPanel = new LogPanelPreferencePanel(preferenceModel, applicationPreferenceModel);
+        logger.debug("creating logpanel for " + identifier);
+
+        setLayout(new BorderLayout());
+
+        String prototypeValue = "1231231231231231231231";
+
+        filterCombo = new AutoFilterComboBox();
+        findCombo = new AutoFilterComboBox();
+
+        filterCombo.setPrototypeDisplayValue(prototypeValue);
+        buildCombo(filterCombo, true, findCombo.model);
+
+        findCombo.setPrototypeDisplayValue(prototypeValue);
+        buildCombo(findCombo, false, filterCombo.model);
+
+        final Map<Object, String> columnNameKeywordMap = new HashMap<>();
+        columnNameKeywordMap.put(ChainsawConstants.CLASS_COL_NAME, LoggingEventFieldResolver.CLASS_FIELD);
+        columnNameKeywordMap.put(ChainsawConstants.FILE_COL_NAME, LoggingEventFieldResolver.FILE_FIELD);
+        columnNameKeywordMap.put(ChainsawConstants.LEVEL_COL_NAME, LoggingEventFieldResolver.LEVEL_FIELD);
+        columnNameKeywordMap.put(ChainsawConstants.LINE_COL_NAME, LoggingEventFieldResolver.LINE_FIELD);
+        columnNameKeywordMap.put(ChainsawConstants.LOGGER_COL_NAME, LoggingEventFieldResolver.LOGGER_FIELD);
+        columnNameKeywordMap.put(ChainsawConstants.NDC_COL_NAME, LoggingEventFieldResolver.NDC_FIELD);
+        columnNameKeywordMap.put(ChainsawConstants.MESSAGE_COL_NAME, LoggingEventFieldResolver.MSG_FIELD);
+        columnNameKeywordMap.put(ChainsawConstants.THREAD_COL_NAME, LoggingEventFieldResolver.THREAD_FIELD);
+        columnNameKeywordMap.put(ChainsawConstants.THROWABLE_COL_NAME, LoggingEventFieldResolver.EXCEPTION_FIELD);
+        columnNameKeywordMap.put(ChainsawConstants.TIMESTAMP_COL_NAME, LoggingEventFieldResolver.TIMESTAMP_FIELD);
+        columnNameKeywordMap.put(ChainsawConstants.ID_COL_NAME.toUpperCase(), LoggingEventFieldResolver.PROP_FIELD + Constants.LOG4J_ID_KEY);
+        columnNameKeywordMap.put(ChainsawConstants.LOG4J_MARKER_COL_NAME_LOWERCASE.toUpperCase(), LoggingEventFieldResolver.PROP_FIELD + ChainsawConstants.LOG4J_MARKER_COL_NAME_LOWERCASE);
+        columnNameKeywordMap.put(ChainsawConstants.MILLIS_DELTA_COL_NAME_LOWERCASE.toUpperCase(), LoggingEventFieldResolver.PROP_FIELD + ChainsawConstants.MILLIS_DELTA_COL_NAME_LOWERCASE);
+
+        logPanelPreferencesFrame.setTitle("'" + identifier + "' Log Panel Preferences");
+        logPanelPreferencesFrame.setIconImage(
+            ((ImageIcon) ChainsawIcons.ICON_PREFERENCES).getImage());
+        logPanelPreferencesFrame.getContentPane().add(new JScrollPane(logPanelPreferencesPanel));
+
+        logPanelPreferencesFrame.setSize(740, 520);
+
+        logPanelPreferencesPanel.setOkCancelActionListener(
             e -> logPanelPreferencesFrame.setVisible(false));
 
         KeyStroke escape = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0, false);
-            Action closeLogPanelPreferencesFrameAction = new AbstractAction() {
-                public void actionPerformed(ActionEvent e) {
-                  logPanelPreferencesFrame.setVisible(false);
-                }
-            };
-            logPanelPreferencesFrame.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(escape, "ESCAPE"); logPanelPreferencesFrame.getRootPane().
-                    getActionMap().put("ESCAPE", closeLogPanelPreferencesFrameAction);
+        Action closeLogPanelPreferencesFrameAction = new AbstractAction() {
+            public void actionPerformed(ActionEvent e) {
+                logPanelPreferencesFrame.setVisible(false);
+            }
+        };
+        logPanelPreferencesFrame.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(escape, "ESCAPE");
+        logPanelPreferencesFrame.getRootPane().
+            getActionMap().put("ESCAPE", closeLogPanelPreferencesFrameAction);
 
 
-    setDetailPaneConversionPattern(
-      DefaultLayoutFactory.getDefaultPatternLayout());
-      detailLayout.setConversionPattern(
-      DefaultLayoutFactory.getDefaultPatternLayout());
+        setDetailPaneConversionPattern(
+            DefaultLayoutFactory.getDefaultPatternLayout());
+        detailLayout.setConversionPattern(
+            DefaultLayoutFactory.getDefaultPatternLayout());
 
-    undockedFrame = new JFrame(identifier);
-    undockedFrame.setDefaultCloseOperation(
-      WindowConstants.DO_NOTHING_ON_CLOSE);
+        undockedFrame = new JFrame(identifier);
+        undockedFrame.setDefaultCloseOperation(
+            WindowConstants.DO_NOTHING_ON_CLOSE);
 
-    if (ChainsawIcons.UNDOCKED_ICON != null) {
-      undockedFrame.setIconImage(
-        new ImageIcon(ChainsawIcons.UNDOCKED_ICON).getImage());
-    }
+        if (ChainsawIcons.UNDOCKED_ICON != null) {
+            undockedFrame.setIconImage(
+                new ImageIcon(ChainsawIcons.UNDOCKED_ICON).getImage());
+        }
 
-    externalPanel = new DockablePanel();
-    externalPanel.setLayout(new BorderLayout());
+        externalPanel = new DockablePanel();
+        externalPanel.setLayout(new BorderLayout());
 
-    undockedFrame.addWindowListener(
-      new WindowAdapter() {
-        public void windowClosing(WindowEvent e) {
-          dock();
-        }
-      });
+        undockedFrame.addWindowListener(
+            new WindowAdapter() {
+                public void windowClosing(WindowEvent e) {
+                    dock();
+                }
+            });
 
-    undockedToolbar = createDockwindowToolbar();
-    externalPanel.add(undockedToolbar, BorderLayout.NORTH);
-    undockedFrame.getContentPane().add(externalPanel);
-    undockedFrame.setSize(new Dimension(1024, 768));
-    undockedFrame.pack();
+        undockedToolbar = createDockwindowToolbar();
+        externalPanel.add(undockedToolbar, BorderLayout.NORTH);
+        undockedFrame.getContentPane().add(externalPanel);
+        undockedFrame.setSize(new Dimension(1024, 768));
+        undockedFrame.pack();
 
-    preferenceModel.addPropertyChangeListener(
-      "scrollToBottom",
+        preferenceModel.addPropertyChangeListener(
+            "scrollToBottom",
             evt -> {
-              boolean value = (Boolean) evt.getNewValue();
-              if (value) {
-                scrollToBottom();
-              }
+                boolean value = (Boolean) evt.getNewValue();
+                if (value) {
+                    scrollToBottom();
+                }
             });
-    /*
-     * Menus on which the preferencemodels rely
-     */
+        /*
+         * Menus on which the preferencemodels rely
+         */
 
-    /**
-     * Setup a popup menu triggered for Timestamp column to allow time stamp
-     * format changes
-     */
-    final JPopupMenu dateFormatChangePopup = new JPopupMenu();
-    final JRadioButtonMenuItem isoButton =
-      new JRadioButtonMenuItem(
-        new AbstractAction("Use ISO8601Format") {
-          public void actionPerformed(ActionEvent e) {
-            preferenceModel.setDateFormatPattern("ISO8601");
-          }
-        });
-    final JRadioButtonMenuItem simpleTimeButton =
-      new JRadioButtonMenuItem(
-        new AbstractAction("Use simple time") {
-          public void actionPerformed(ActionEvent e) {
-            preferenceModel.setDateFormatPattern("HH:mm:ss");
-          }
-        });
+        /**
+         * Setup a popup menu triggered for Timestamp column to allow time stamp
+         * format changes
+         */
+        final JPopupMenu dateFormatChangePopup = new JPopupMenu();
+        final JRadioButtonMenuItem isoButton =
+            new JRadioButtonMenuItem(
+                new AbstractAction("Use ISO8601Format") {
+                    public void actionPerformed(ActionEvent e) {
+                        preferenceModel.setDateFormatPattern("ISO8601");
+                    }
+                });
+        final JRadioButtonMenuItem simpleTimeButton =
+            new JRadioButtonMenuItem(
+                new AbstractAction("Use simple time") {
+                    public void actionPerformed(ActionEvent e) {
+                        preferenceModel.setDateFormatPattern("HH:mm:ss");
+                    }
+                });
 
-    ButtonGroup dfBG = new ButtonGroup();
-    dfBG.add(isoButton);
-    dfBG.add(simpleTimeButton);
-    simpleTimeButton.setSelected(true);
-    dateFormatChangePopup.add(isoButton);
-    dateFormatChangePopup.add(simpleTimeButton);
+        ButtonGroup dfBG = new ButtonGroup();
+        dfBG.add(isoButton);
+        dfBG.add(simpleTimeButton);
+        simpleTimeButton.setSelected(true);
+        dateFormatChangePopup.add(isoButton);
+        dateFormatChangePopup.add(simpleTimeButton);
 
-    final JCheckBoxMenuItem menuItemLoggerTree =
-      new JCheckBoxMenuItem("Show Logger Tree");
-    menuItemLoggerTree.addActionListener(
+        final JCheckBoxMenuItem menuItemLoggerTree =
+            new JCheckBoxMenuItem("Show Logger Tree");
+        menuItemLoggerTree.addActionListener(
             e -> preferenceModel.setLogTreePanelVisible(
-              menuItemLoggerTree.isSelected()));
-    menuItemLoggerTree.setIcon(new ImageIcon(ChainsawIcons.WINDOW_ICON));
+                menuItemLoggerTree.isSelected()));
+        menuItemLoggerTree.setIcon(new ImageIcon(ChainsawIcons.WINDOW_ICON));
 
-    final JCheckBoxMenuItem menuItemToggleDetails =
-      new JCheckBoxMenuItem("Show Detail Pane");
-    menuItemToggleDetails.addActionListener(
+        final JCheckBoxMenuItem menuItemToggleDetails =
+            new JCheckBoxMenuItem("Show Detail Pane");
+        menuItemToggleDetails.addActionListener(
             e -> preferenceModel.setDetailPaneVisible(
-              menuItemToggleDetails.isSelected()));
+                menuItemToggleDetails.isSelected()));
 
-    menuItemToggleDetails.setIcon(new ImageIcon(ChainsawIcons.INFO));
+        menuItemToggleDetails.setIcon(new ImageIcon(ChainsawIcons.INFO));
 
-    /*
-     * add preferencemodel listeners
-     */
-    preferenceModel.addPropertyChangeListener("levelIcons",
-      new PropertyChangeListener() {
-        public void propertyChange(PropertyChangeEvent evt) {
-          boolean useIcons = (Boolean) evt.getNewValue();
-          renderer.setLevelUseIcons(useIcons);
-          table.tableChanged(new TableModelEvent(tableModel));
-          searchRenderer.setLevelUseIcons(useIcons);
-          searchTable.tableChanged(new TableModelEvent(searchModel));
-        }
-      });
+        /*
+         * add preferencemodel listeners
+         */
+        preferenceModel.addPropertyChangeListener("levelIcons",
+            new PropertyChangeListener() {
+                public void propertyChange(PropertyChangeEvent evt) {
+                    boolean useIcons = (Boolean) evt.getNewValue();
+                    renderer.setLevelUseIcons(useIcons);
+                    table.tableChanged(new TableModelEvent(tableModel));
+                    searchRenderer.setLevelUseIcons(useIcons);
+                    searchTable.tableChanged(new TableModelEvent(searchModel));
+                }
+            });
 
-    /*
-     * add preferencemodel listeners
-     */
-    preferenceModel.addPropertyChangeListener("wrapMessage",
-      new PropertyChangeListener() {
-        public void propertyChange(PropertyChangeEvent evt) {
-          boolean wrap = (Boolean) evt.getNewValue();
-          renderer.setWrapMessage(wrap);
-          table.tableChanged(new TableModelEvent(tableModel));
-          searchRenderer.setWrapMessage(wrap);
-          searchTable.tableChanged(new TableModelEvent(searchModel));
-        }
-      });
+        /*
+         * add preferencemodel listeners
+         */
+        preferenceModel.addPropertyChangeListener("wrapMessage",
+            new PropertyChangeListener() {
+                public void propertyChange(PropertyChangeEvent evt) {
+                    boolean wrap = (Boolean) evt.getNewValue();
+                    renderer.setWrapMessage(wrap);
+                    table.tableChanged(new TableModelEvent(tableModel));
+                    searchRenderer.setWrapMessage(wrap);
+                    searchTable.tableChanged(new TableModelEvent(searchModel));
+                }
+            });
 
-    preferenceModel.addPropertyChangeListener("searchResultsVisible",
+        preferenceModel.addPropertyChangeListener("searchResultsVisible",
             evt -> {
-              boolean displaySearchResultsInDetailsIfAvailable = (Boolean) evt.getNewValue();
-              if (displaySearchResultsInDetailsIfAvailable) {
-                showSearchResults();
-              } else {
-                hideSearchResults();
-              }
+                boolean displaySearchResultsInDetailsIfAvailable = (Boolean) evt.getNewValue();
+                if (displaySearchResultsInDetailsIfAvailable) {
+                    showSearchResults();
+                } else {
+                    hideSearchResults();
+                }
             });
 
-      preferenceModel.addPropertyChangeListener("highlightSearchMatchText",
-        new PropertyChangeListener() {
-          public void propertyChange(PropertyChangeEvent evt) {
-            boolean highlightText = (Boolean) evt.getNewValue();
-            renderer.setHighlightSearchMatchText(highlightText);
-            table.tableChanged(new TableModelEvent(tableModel));
-            searchRenderer.setHighlightSearchMatchText(highlightText);
-            searchTable.tableChanged(new TableModelEvent(searchModel));
-          }
-        });
+        preferenceModel.addPropertyChangeListener("highlightSearchMatchText",
+            new PropertyChangeListener() {
+                public void propertyChange(PropertyChangeEvent evt) {
+                    boolean highlightText = (Boolean) evt.getNewValue();
+                    renderer.setHighlightSearchMatchText(highlightText);
+                    table.tableChanged(new TableModelEvent(tableModel));
+                    searchRenderer.setHighlightSearchMatchText(highlightText);
+                    searchTable.tableChanged(new TableModelEvent(searchModel));
+                }
+            });
 
-    preferenceModel.addPropertyChangeListener(
-      "detailPaneVisible",
+        preferenceModel.addPropertyChangeListener(
+            "detailPaneVisible",
             evt -> {
-              boolean detailPaneVisible = (Boolean) evt.getNewValue();
+                boolean detailPaneVisible = (Boolean) evt.getNewValue();
 
-              if (detailPaneVisible) {
-                showDetailPane();
-              } else {
-                //don't hide the detail pane if search results are being displayed
-                if (!searchResultsDisplayed) {
-                  hideDetailPane();
+                if (detailPaneVisible) {
+                    showDetailPane();
+                } else {
+                    //don't hide the detail pane if search results are being displayed
+                    if (!searchResultsDisplayed) {
+                        hideDetailPane();
+                    }
                 }
-              }
             });
 
-    preferenceModel.addPropertyChangeListener(
-      "logTreePanelVisible",
+        preferenceModel.addPropertyChangeListener(
+            "logTreePanelVisible",
             evt -> {
-              boolean newValue = (Boolean) evt.getNewValue();
+                boolean newValue = (Boolean) evt.getNewValue();
 
-              if (newValue) {
-                showLogTreePanel();
-              } else {
-                hideLogTreePanel();
-              }
+                if (newValue) {
+                    showLogTreePanel();
+                } else {
+                    hideLogTreePanel();
+                }
             });
-    
-    preferenceModel.addPropertyChangeListener("toolTips",
-      new PropertyChangeListener() {
-        public void propertyChange(PropertyChangeEvent evt) {
-          boolean toolTips = (Boolean) evt.getNewValue();
-          renderer.setToolTipsVisible(toolTips);
-          searchRenderer.setToolTipsVisible(toolTips);
-        }
-      });
-
-    preferenceModel.addPropertyChangeListener("visibleColumns",
-      new PropertyChangeListener() {
-    	public void propertyChange(PropertyChangeEvent evt) {
-    		//remove all columns and re-add visible
-            TableColumnModel columnModel = table.getColumnModel();
-            while (columnModel.getColumnCount() > 0) {
-                columnModel.removeColumn(columnModel.getColumn(0));
-        		}
-          for (Object o1 : preferenceModel.getVisibleColumnOrder()) {
-            TableColumn c = (TableColumn) o1;
-            if (c.getHeaderValue().toString().equalsIgnoreCase(ChainsawConstants.LOG4J_MARKER_COL_NAME_LOWERCASE)) {
-              c.setCellEditor(markerCellEditor);
-            }
-            columnModel.addColumn(c);
-          }
-          TableColumnModel searchColumnModel = searchTable.getColumnModel();
-          while (searchColumnModel.getColumnCount() > 0) {
-              searchColumnModel.removeColumn(searchColumnModel.getColumn(0));
-          }
-          for (Object o : preferenceModel.getVisibleColumnOrder()) {
-            TableColumn c = (TableColumn) o;
-            searchColumnModel.addColumn(c);
-          }
-      	}
-      });
-
-    PropertyChangeListener datePrefsChangeListener =
-      new PropertyChangeListener() {
-        public void propertyChange(PropertyChangeEvent evt) {
-          LogPanelPreferenceModel model = (LogPanelPreferenceModel) evt.getSource();
-
-          isoButton.setSelected(model.isUseISO8601Format());
-          simpleTimeButton.setSelected(!model.isUseISO8601Format() && !model.isCustomDateFormat());
-
-          if (model.getTimeZone() != null) {
-            renderer.setTimeZone(model.getTimeZone());
-            searchRenderer.setTimeZone(model.getTimeZone());
-          }
-          
-          if (model.isUseISO8601Format()) {
-            renderer.setDateFormatter(new SimpleDateFormat(Constants.ISO8601_PATTERN));
-            searchRenderer.setDateFormatter(new SimpleDateFormat(Constants.ISO8601_PATTERN));
-          } else {
-      		try {
-              renderer.setDateFormatter(new SimpleDateFormat(model.getDateFormatPattern()));
-          } catch (IllegalArgumentException iae) {
-            model.setDefaultDatePatternFormat();
-            renderer.setDateFormatter(new SimpleDateFormat(Constants.ISO8601_PATTERN));
-          }
-  		    try {
-              searchRenderer.setDateFormatter(new SimpleDateFormat(model.getDateFormatPattern()));
-          } catch (IllegalArgumentException iae) {
-            model.setDefaultDatePatternFormat();
-            searchRenderer.setDateFormatter(new SimpleDateFormat(Constants.ISO8601_PATTERN));
-          }
-        }
 
-        table.tableChanged(new TableModelEvent(tableModel));
-        searchTable.tableChanged(new TableModelEvent(searchModel));
-        }
-      };
+        preferenceModel.addPropertyChangeListener("toolTips",
+            new PropertyChangeListener() {
+                public void propertyChange(PropertyChangeEvent evt) {
+                    boolean toolTips = (Boolean) evt.getNewValue();
+                    renderer.setToolTipsVisible(toolTips);
+                    searchRenderer.setToolTipsVisible(toolTips);
+                }
+            });
+
+        preferenceModel.addPropertyChangeListener("visibleColumns",
+            new PropertyChangeListener() {
+                public void propertyChange(PropertyChangeEvent evt) {
+                    //remove all columns and re-add visible
+                    TableColumnModel columnModel = table.getColumnModel();
+                    while (columnModel.getColumnCount() > 0) {
+                        columnModel.removeColumn(columnModel.getColumn(0));
+                    }
+                    for (Object o1 : preferenceModel.getVisibleColumnOrder()) {
+                        TableColumn c = (TableColumn) o1;
+                        if (c.getHeaderValue().toString().equalsIgnoreCase(ChainsawConstants.LOG4J_MARKER_COL_NAME_LOWERCASE)) {
+                            c.setCellEditor(markerCellEditor);
+                        }
+                        columnModel.addColumn(c);
+                    }
+                    TableColumnModel searchColumnModel = searchTable.getColumnModel();
+                    while (searchColumnModel.getColumnCount() > 0) {
+                        searchColumnModel.removeColumn(searchColumnModel.getColumn(0));
+                    }
+                    for (Object o : preferenceModel.getVisibleColumnOrder()) {
+                        TableColumn c = (TableColumn) o;
+                        searchColumnModel.addColumn(c);
+                    }
+                }
+            });
 
-    preferenceModel.addPropertyChangeListener("dateFormatPattern", datePrefsChangeListener);
-    preferenceModel.addPropertyChangeListener("dateFormatTimeZone", datePrefsChangeListener);
+        PropertyChangeListener datePrefsChangeListener =
+            new PropertyChangeListener() {
+                public void propertyChange(PropertyChangeEvent evt) {
+                    LogPanelPreferenceModel model = (LogPanelPreferenceModel) evt.getSource();
 
-    preferenceModel.addPropertyChangeListener("clearTableExpression", evt -> {
-        LogPanelPreferenceModel model = (LogPanelPreferenceModel)evt.getSource();
-        String expression = model.getClearTableExpression();
-        try {
-            clearTableExpressionRule = ExpressionRule.getRule(expression);
-            logger.info("clearTableExpressionRule set to: " + expression);
-        } catch (Exception e) {
-            logger.info("clearTableExpressionRule invalid - ignoring: " + expression);
-            clearTableExpressionRule = null;
-        }
-    });
+                    isoButton.setSelected(model.isUseISO8601Format());
+                    simpleTimeButton.setSelected(!model.isUseISO8601Format() && !model.isCustomDateFormat());
+
+                    if (model.getTimeZone() != null) {
+                        renderer.setTimeZone(model.getTimeZone());
+                        searchRenderer.setTimeZone(model.getTimeZone());
+                    }
+
+                    if (model.isUseISO8601Format()) {
+                        renderer.setDateFormatter(new SimpleDateFormat(Constants.ISO8601_PATTERN));
+                        searchRenderer.setDateFormatter(new SimpleDateFormat(Constants.ISO8601_PATTERN));
+                    } else {
+                        try {
+                            renderer.setDateFormatter(new SimpleDateFormat(model.getDateFormatPattern()));
+                        } catch (IllegalArgumentException iae) {
+                            model.setDefaultDatePatternFormat();
+                            renderer.setDateFormatter(new SimpleDateFormat(Constants.ISO8601_PATTERN));
+                        }
+                        try {
+                            searchRenderer.setDateFormatter(new SimpleDateFormat(model.getDateFormatPattern()));
+                        } catch (IllegalArgumentException iae) {
+                            model.setDefaultDatePatternFormat();
+                            searchRenderer.setDateFormatter(new SimpleDateFormat(Constants.ISO8601_PATTERN));
+                        }
+                    }
 
-    preferenceModel.addPropertyChangeListener("loggerPrecision",
-      new PropertyChangeListener() {
-        public void propertyChange(PropertyChangeEvent evt) {
-          LogPanelPreferenceModel model = (LogPanelPreferenceModel) evt.getSource();
+                    table.tableChanged(new TableModelEvent(tableModel));
+                    searchTable.tableChanged(new TableModelEvent(searchModel));
+                }
+            };
 
-          renderer.setLoggerPrecision(model.getLoggerPrecision());
-          table.tableChanged(new TableModelEvent(tableModel));
+        preferenceModel.addPropertyChangeListener("dateFormatPattern", datePrefsChangeListener);
+        preferenceModel.addPropertyChangeListener("dateFormatTimeZone", datePrefsChangeListener);
 
-          searchRenderer.setLoggerPrecision(model.getLoggerPrecision());
-          searchTable.tableChanged(new TableModelEvent(searchModel));
-        }
-      });
+        preferenceModel.addPropertyChangeListener("clearTableExpression", evt -> {
+            LogPanelPreferenceModel model = (LogPanelPreferenceModel) evt.getSource();
+            String expression = model.getClearTableExpression();
+            try {
+                clearTableExpressionRule = ExpressionRule.getRule(expression);
+                logger.info("clearTableExpressionRule set to: " + expression);
+            } catch (Exception e) {
+                logger.info("clearTableExpressionRule invalid - ignoring: " + expression);
+                clearTableExpressionRule = null;
+            }
+        });
+
+        preferenceModel.addPropertyChangeListener("loggerPrecision",
+            new PropertyChangeListener() {
+                public void propertyChange(PropertyChangeEvent evt) {
+                    LogPanelPreferenceModel model = (LogPanelPreferenceModel) evt.getSource();
+
+                    renderer.setLoggerPrecision(model.getLoggerPrecision());
+                    table.tableChanged(new TableModelEvent(tableModel));
+
+                    searchRenderer.setLoggerPrecision(model.getLoggerPrecision());
+                    searchTable.tableChanged(new TableModelEvent(searchModel));
+                }
+            });
 
-    preferenceModel.addPropertyChangeListener("toolTips",
+        preferenceModel.addPropertyChangeListener("toolTips",
             evt -> {
-              boolean value = (Boolean) evt.getNewValue();
-              searchToggleToolTips.setSelected(value);
-              mainToggleToolTips.setSelected(value);
+                boolean value = (Boolean) evt.getNewValue();
+                searchToggleToolTips.setSelected(value);
+                mainToggleToolTips.setSelected(value);
             });
 
-    preferenceModel.addPropertyChangeListener(
-      "logTreePanelVisible",
+        preferenceModel.addPropertyChangeListener(
+            "logTreePanelVisible",
             evt -> {
-              boolean value = (Boolean) evt.getNewValue();
-              menuItemLoggerTree.setSelected(value);
+                boolean value = (Boolean) evt.getNewValue();
+                menuItemLoggerTree.setSelected(value);
             });
 
-    preferenceModel.addPropertyChangeListener(
-      "detailPaneVisible",
+        preferenceModel.addPropertyChangeListener(
+            "detailPaneVisible",
             evt -> {
-              boolean value = (Boolean) evt.getNewValue();
-              menuItemToggleDetails.setSelected(value);
+                boolean value = (Boolean) evt.getNewValue();
+                menuItemToggleDetails.setSelected(value);
             });
 
-    applicationPreferenceModel.addPropertyChangeListener("searchColor", new PropertyChangeListener() {
-        public void propertyChange(PropertyChangeEvent evt)
-        {
-            if (table != null) {
-              table.repaint();
-            }
-            if (searchTable != null) {
-              searchTable.repaint();
+        applicationPreferenceModel.addPropertyChangeListener("searchColor", new PropertyChangeListener() {
+            public void propertyChange(PropertyChangeEvent evt) {
+                if (table != null) {
+                    table.repaint();
+                }
+                if (searchTable != null) {
+                    searchTable.repaint();
+                }
             }
-        }
-    });
+        });
 
-    applicationPreferenceModel.addPropertyChangeListener("alternatingColor", new PropertyChangeListener() {
-        public void propertyChange(PropertyChangeEvent evt)
-        {
-            if (table != null) {
-              table.repaint();
+        applicationPreferenceModel.addPropertyChangeListener("alternatingColor", new PropertyChangeListener() {
+            public void propertyChange(PropertyChangeEvent evt) {
+                if (table != null) {
+                    table.repaint();
+                }
+                if (searchTable != null) {
+                    searchTable.repaint();
+                }
             }
-            if (searchTable != null) {
-              searchTable.repaint();
-           }
-        }
-    });
+        });
 
-    /*
-     *End of preferenceModel listeners
-     */
-    tableModel = new ChainsawCyclicBufferTableModel(cyclicBufferSize, colorizer, "main");
-    table = new JSortTable(tableModel);
+        /*
+         *End of preferenceModel listeners
+         */
+        tableModel = new ChainsawCyclicBufferTableModel(cyclicBufferSize, colorizer, "main");
+        table = new JSortTable(tableModel);
 
-    markerCellEditor = new MarkerCellEditor();
-    table.setName("main");
-    table.setColumnSelectionAllowed(false);
-    table.setRowSelectionAllowed(true);
+        markerCellEditor = new MarkerCellEditor();
+        table.setName("main");
+        table.setColumnSelectionAllowed(false);
+        table.setRowSelectionAllowed(true);
 
-    searchModel = new ChainsawCyclicBufferTableModel(cyclicBufferSize, colorizer, "search");
-    searchTable = new JSortTable(searchModel);
+        searchModel = new ChainsawCyclicBufferTableModel(cyclicBufferSize, colorizer, "search");
+        searchTable = new JSortTable(searchModel);
 
-    searchTable.setName("search");
-    searchTable.setColumnSelectionAllowed(false);
-    searchTable.setRowSelectionAllowed(true);
+        searchTable.setName("search");
+        searchTable.setColumnSelectionAllowed(false);
+        searchTable.setRowSelectionAllowed(true);
 
-    //we've mapped f2, shift f2 and ctrl-f2 to marker-related actions, unmap them from the table
-    table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke("F2"), "none");
-    table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_F2, InputEvent.SHIFT_MASK), "none");
-    table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_F2, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()), "none");
-    table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_F2, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask() | InputEvent.SHIFT_MASK), "none");
+        //we've mapped f2, shift f2 and ctrl-f2 to marker-related actions, unmap them from the table
+        table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke("F2"), "none");
+        table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_F2, InputEvent.SHIFT_MASK), "none");
+        table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_F2, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()), "none");
+        table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_F2, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask() | InputEvent.SHIFT_MASK), "none");
 
-    //we're also mapping ctrl-a to scroll-to-top, unmap from the table
-    table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_A, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()), "none");
-        
-    searchTable.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke("F2"), "none");
-    searchTable.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_F2, InputEvent.SHIFT_MASK), "none");
-    searchTable.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_F2, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()), "none");
-    searchTable.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_F2, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask() | InputEvent.SHIFT_MASK), "none");
+        //we're also mapping ctrl-a to scroll-to-top, unmap from the table
+        table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_A, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()), "none");
 
-    //we're also mapping ctrl-a to scroll-to-top, unmap from the table
-    searchTable.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_A, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()), "none");
+        searchTable.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke("F2"), "none");
+        searchTable.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_F2, InputEvent.SHIFT_MASK), "none");
+        searchTable.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_F2, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()), "none");
+        searchTable.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_F2, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask() | InputEvent.SHIFT_MASK), "none");
 
-    //add a listener to update the 'refine focus'
-    tableModel.addNewKeyListener(e -> columnNameKeywordMap.put(e.getKey(), "PROP." + e.getKey()));
+        //we're also mapping ctrl-a to scroll-to-top, unmap from the table
+        searchTable.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_A, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()), "none");
 
-    /*
-     * Set the Display rule to use the mediator, the model will add itself as
-     * a property change listener and update itself when the rule changes.
-     */
-    tableModel.setRuleMediator(tableRuleMediator);
-    searchModel.setRuleMediator(searchRuleMediator);
+        //add a listener to update the 'refine focus'
+        tableModel.addNewKeyListener(e -> columnNameKeywordMap.put(e.getKey(), "PROP." + e.getKey()));
+
+        /*
+         * Set the Display rule to use the mediator, the model will add itself as
+         * a property change listener and update itself when the rule changes.
+         */
+        tableModel.setRuleMediator(tableRuleMediator);
+        searchModel.setRuleMediator(searchRuleMediator);
 
-    tableModel.addEventCountListener(
+        tableModel.addEventCountListener(
             (currentCount, totalCount) -> {
-              if (LogPanel.this.isVisible()) {
-                statusBar.setSelectedLine(
-                  table.getSelectedRow() + 1, currentCount, totalCount, getIdentifier());
-              }
+                if (LogPanel.this.isVisible()) {
+                    statusBar.setSelectedLine(
+                        table.getSelectedRow() + 1, currentCount, totalCount, getIdentifier());
+                }
             });
 
-    tableModel.addEventCountListener(
-      new EventCountListener() {
-        final NumberFormat formatter = NumberFormat.getPercentInstance();
-        boolean warning75 = false;
-        boolean warning100 = false;
-
-        public void eventCountChanged(int currentCount, int totalCount) {
-          if (preferenceModel.isCyclic()) {
-            double percent =
-              ((double) totalCount) / tableModel.getMaxSize();
-            String msg;
-            boolean wasWarning = warning75 || warning100;
-            if ((percent > 0.75) && (percent < 1.0) && !warning75) {
-              msg =
-                "Warning :: " + formatter.format(percent) + " of the '"
-                + getIdentifier() + "' buffer has been used";
-              warning75 = true;
-            } else if ((percent >= 1.0) && !warning100) {
-              msg =
-                "Warning :: " + formatter.format(percent) + " of the '"
-                + getIdentifier()
-                + "' buffer has been used.  Older events are being discarded.";
-              warning100 = true;
-            } else {
-                //clear msg
-                msg = "";
-                warning75 = false;
-                warning100 = false;
-            }
+        tableModel.addEventCountListener(
+            new EventCountListener() {
+                final NumberFormat formatter = NumberFormat.getPercentInstance();
+                boolean warning75 = false;
+                boolean warning100 = false;
+
+                public void eventCountChanged(int currentCount, int totalCount) {
+                    if (preferenceModel.isCyclic()) {
+                        double percent =
+                            ((double) totalCount) / tableModel.getMaxSize();
+                        String msg;
+                        boolean wasWarning = warning75 || warning100;
+                        if ((percent > 0.75) && (percent < 1.0) && !warning75) {
+                            msg =
+                                "Warning :: " + formatter.format(percent) + " of the '"
+                                    + getIdentifier() + "' buffer has been used";
+                            warning75 = true;
+                        } else if ((percent >= 1.0) && !warning100) {
+                            msg =
+                                "Warning :: " + formatter.format(percent) + " of the '"
+                                    + getIdentifier()
+                                    + "' buffer has been used.  Older events are being discarded.";
+                            warning100 = true;
+                        } else {
+                            //clear msg
+                            msg = "";
+                            warning75 = false;
+                            warning100 = false;
+                        }
+
+                        if (msg != null && wasWarning) {
+                            MessageCenter.getInstance().getLogger().info(msg);
+                        }
+                    }
+                }
+            });
 
-            if (msg != null && wasWarning) {
-              MessageCenter.getInstance().getLogger().info(msg);
+        /*
+         * Logger tree panel
+         *
+         */
+        LogPanelLoggerTreeModel logTreeModel = new LogPanelLoggerTreeModel();
+        logTreePanel = new LoggerNameTreePanel(logTreeModel, preferenceModel, this, colorizer, filterModel);
+        logTreePanel.getLoggerVisibilityRule().addPropertyChangeListener(evt -> {
+            if (evt.getPropertyName().equals("searchExpression")) {
+                findCombo.setSelectedItem(evt.getNewValue().toString());
+                findNext();
             }
-          }
-        }
-      });
+        });
 
-    /*
-     * Logger tree panel
-     *
-     */
-    LogPanelLoggerTreeModel logTreeModel = new LogPanelLoggerTreeModel();
-    logTreePanel = new LoggerNameTreePanel(logTreeModel, preferenceModel, this, colorizer, filterModel);
-    logTreePanel.getLoggerVisibilityRule().addPropertyChangeListener(evt -> {
-        if (evt.getPropertyName().equals("searchExpression")) {
-            findCombo.setSelectedItem(evt.getNewValue().toString());
-            findNext();
-        }
-    });
-      
-    tableModel.addLoggerNameListener(logTreeModel);
-    tableModel.addLoggerNameListener(logTreePanel);
+        tableModel.addLoggerNameListener(logTreeModel);
+        tableModel.addLoggerNameListener(logTreePanel);
 
-    /**
-     * Set the LoggerRule to be the LoggerTreePanel, as this visual component
-     * is a rule itself, and the RuleMediator will automatically listen when
-     * it's rule state changes.
-     */
-    tableRuleMediator.setLoggerRule(logTreePanel.getLoggerVisibilityRule());
-    searchRuleMediator.setLoggerRule(logTreePanel.getLoggerVisibilityRule());
+        /**
+         * Set the LoggerRule to be the LoggerTreePanel, as this visual component
+         * is a rule itself, and the RuleMediator will automatically listen when
+         * it's rule state changes.
+         */
+        tableRuleMediator.setLoggerRule(logTreePanel.getLoggerVisibilityRule());
+        searchRuleMediator.setLoggerRule(logTreePanel.getLoggerVisibilityRule());
 
-    colorizer.setLoggerRule(logTreePanel.getLoggerColorRule());
+        colorizer.setLoggerRule(logTreePanel.getLoggerColorRule());
 
-    /*
-     * Color rule frame and panel
-     */
-    colorFrame.setTitle("'" + identifier + "' color settings");
-    colorFrame.setIconImage(
-      ((ImageIcon) ChainsawIcons.ICON_PREFERENCES).getImage());
+        /*
+         * Color rule frame and panel
+         */
+        colorFrame.setTitle("'" + identifier + "' color settings");
+        colorFrame.setIconImage(
+            ((ImageIcon) ChainsawIcons.ICON_PREFERENCES).getImage());
 
-    allColorizers.put(identifier, colorizer);
-    colorPanel = new ColorPanel(colorizer, filterModel, allColorizers, applicationPreferenceModel);
+        allColorizers.put(identifier, colorizer);
+        colorPanel = new ColorPanel(colorizer, filterModel, allColorizers, applicationPreferenceModel);
 
-    colorFrame.getContentPane().add(colorPanel);
+        colorFrame.getContentPane().add(colorPanel);
 
         Action closeColorPanelAction = new AbstractAction() {
             public void actionPerformed(ActionEvent e) {
-              colorPanel.hidePanel();
+                colorPanel.hidePanel();
             }
         };
-        colorFrame.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(escape, "ESCAPE"); colorFrame.getRootPane().
-                getActionMap().put("ESCAPE", closeColorPanelAction);
+        colorFrame.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(escape, "ESCAPE");
+        colorFrame.getRootPane().
+            getActionMap().put("ESCAPE", closeColorPanelAction);
 
-    colorPanel.setCloseActionListener(
+        colorPanel.setCloseActionListener(
             e -> colorFrame.setVisible(false));
 
-    colorizer.addPropertyChangeListener(
-      "colorrule",
-      new PropertyChangeListener() {
-        public void propertyChange(PropertyChangeEvent evt) {
-          for (Object o : tableModel.getAllEvents()) {
-            LoggingEventWrapper loggingEventWrapper = (LoggingEventWrapper) o;
-            loggingEventWrapper.updateColorRuleColors(colorizer.getBackgroundColor(loggingEventWrapper.getLoggingEvent()), colorizer.getForegroundColor(loggingEventWrapper.getLoggingEvent()));
-          }
+        colorizer.addPropertyChangeListener(
+            "colorrule",
+            new PropertyChangeListener() {
+                public void propertyChange(PropertyChangeEvent evt) {
+                    for (Object o : tableModel.getAllEvents()) {
+                        LoggingEventWrapper loggingEventWrapper = (LoggingEventWrapper) o;
+                        loggingEventWrapper.updateColorRuleColors(colorizer.getBackgroundColor(loggingEventWrapper.getLoggingEvent()), colorizer.getForegroundColor(loggingEventWrapper.getLoggingEvent()));
+                    }
 //          no need to update searchmodel events since tablemodel and searchmodel share all events, and color rules aren't different between the two
 //          if that changes, un-do the color syncing in loggingeventwrapper & re-enable this code
 //
@@ -791,2369 +701,2365 @@ public class LogPanel extends DockablePanel implements EventBatchListener, Profi
 //             LoggingEventWrapper loggingEventWrapper = (LoggingEventWrapper)iter.next();
 //             loggingEventWrapper.updateColorRuleColors(colorizer.getBackgroundColor(loggingEventWrapper.getLoggingEvent()), colorizer.getForegroundColor(loggingEventWrapper.getLoggingEvent()));
 //           }
-          colorizedEventAndSearchMatchThumbnail.configureColors();
-          lowerPanel.revalidate();
-          lowerPanel.repaint();
-
-          searchTable.revalidate();
-          searchTable.repaint();
-        }
-      });
+                    colorizedEventAndSearchMatchThumbnail.configureColors();
+                    lowerPanel.revalidate();
+                    lowerPanel.repaint();
 
-    /*
-     * Table definition.  Actual construction is above (next to tablemodel)
-     */
-    table.setRowHeight(ChainsawConstants.DEFAULT_ROW_HEIGHT);
-    table.setRowMargin(0);
-    table.getColumnModel().setColumnMargin(0);
-    table.setShowGrid(false);
-    table.getColumnModel().addColumnModelListener(new ChainsawTableColumnModelListener(table));
-    table.setAutoCreateColumnsFromModel(false);
-    table.addMouseMotionListener(new TableColumnDetailMouseListener(table, tableModel));
-    table.addMouseListener(new TableMarkerListener(table, tableModel, searchModel));
-    table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
-
-    searchTable.setRowHeight(ChainsawConstants.DEFAULT_ROW_HEIGHT);
-    searchTable.setRowMargin(0);
-    searchTable.getColumnModel().setColumnMargin(0);
-    searchTable.setShowGrid(false);
-    searchTable.getColumnModel().addColumnModelListener(new ChainsawTableColumnModelListener(searchTable));
-    searchTable.setAutoCreateColumnsFromModel(false);
-    searchTable.addMouseMotionListener(new TableColumnDetailMouseListener(searchTable, searchModel));
-    searchTable.addMouseListener(new TableMarkerListener(searchTable, searchModel, tableModel));
-    searchTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
-
-
-    //set valueisadjusting if holding down a key - don't process setdetail events
-    table.addKeyListener(
-      new KeyListener() {
-        public void keyTyped(KeyEvent e) {
-        }
-
-        public void keyPressed(KeyEvent e) {
-          synchronized (detail) {
-            table.getSelectionModel().setValueIsAdjusting(true);
-            detail.notify();
-          }
-        }
-
-        public void keyReleased(KeyEvent e) {
-          synchronized (detail) {
-            table.getSelectionModel().setValueIsAdjusting(false);
-            detail.notify();
-          }
-        }
-      });
-
-    table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
-    searchTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
-
-    table.getSelectionModel().addListSelectionListener(evt -> {
-        if (((evt.getFirstIndex() == evt.getLastIndex())
-            && (evt.getFirstIndex() > 0) && previousLastIndex != -1) || (evt.getValueIsAdjusting())) {
-          return;
-        }
-        boolean lastIndexOnLastRow = (evt.getLastIndex() == (table.getRowCount() - 1));
-        boolean lastIndexSame = (previousLastIndex == evt.getLastIndex());
+                    searchTable.revalidate();
+                    searchTable.repaint();
+                }
+            });
 
         /*
-         * when scroll-to-bottom is active, here is what events look like:
-         * rowcount-1: 227, last: 227, previous last: 191..first: 191
-         *
-         * when the user has unselected the bottom row, here is what the events look like:
-         * rowcount-1: 227, last: 227, previous last: 227..first: 222
-         *
-         * note: previouslast is set after it is evaluated in the bypass scroll check
-        */
-       //System.out.println("rowcount: " + (table.getRowCount() - 1) + ", last: " + evt.getLastIndex() +", previous last: " + previousLastIndex + "..first: " + evt.getFirstIndex() + ", isadjusting: " + evt.getValueIsAdjusting());
+         * Table definition.  Actual construction is above (next to tablemodel)
+         */
+        table.setRowHeight(ChainsawConstants.DEFAULT_ROW_HEIGHT);
+        table.setRowMargin(0);
+        table.getColumnModel().setColumnMargin(0);
+        table.setShowGrid(false);
+        table.getColumnModel().addColumnModelListener(new ChainsawTableColumnModelListener(table));
+        table.setAutoCreateColumnsFromModel(false);
+        table.addMouseMotionListener(new TableColumnDetailMouseListener(table, tableModel));
+        table.addMouseListener(new TableMarkerListener(table, tableModel, searchModel));
+        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
+
+        searchTable.setRowHeight(ChainsawConstants.DEFAULT_ROW_HEIGHT);
+        searchTable.setRowMargin(0);
+        searchTable.getColumnModel().setColumnMargin(0);
+        searchTable.setShowGrid(false);
+        searchTable.getColumnModel().addColumnModelListener(new ChainsawTableColumnModelListener(searchTable));
+        searchTable.setAutoCreateColumnsFromModel(false);
+        searchTable.addMouseMotionListener(new TableColumnDetailMouseListener(searchTable, searchModel));
+        searchTable.addMouseListener(new TableMarkerListener(searchTable, searchModel, tableModel));
+        searchTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
+
+
+        //set valueisadjusting if holding down a key - don't process setdetail events
+        table.addKeyListener(
+            new KeyListener() {
+                public void keyTyped(KeyEvent e) {
+                }
 
-        boolean disableScrollToBottom = (lastIndexOnLastRow && lastIndexSame && previousLastIndex != evt.getFirstIndex());
-        if (disableScrollToBottom && isScrollToBottom() && table.getRowCount() > 0) {
-          preferenceModel.setScrollToBottom(false);
-        }
-        previousLastIndex = evt.getLastIndex();
-      }
-    );
-
-    table.getSelectionModel().addListSelectionListener(
-      new ListSelectionListener() {
-        public void valueChanged(ListSelectionEvent evt) {
-          if (((evt.getFirstIndex() == evt.getLastIndex())
-              && (evt.getFirstIndex() > 0) && previousLastIndex != -1) || (evt.getValueIsAdjusting())) {
-            return;
-          }
+                public void keyPressed(KeyEvent e) {
+                    synchronized (detail) {
+                        table.getSelectionModel().setValueIsAdjusting(true);
+                        detail.notify();
+                    }
+                }
 
-          final ListSelectionModel lsm = (ListSelectionModel) evt.getSource();
+                public void keyReleased(KeyEvent e) {
+                    synchronized (detail) {
+                        table.getSelectionModel().setValueIsAdjusting(false);
+                        detail.notify();
+                    }
+                }
+            });
 
-          if (lsm.isSelectionEmpty()) {
-            if (isVisible()) {
-              statusBar.setNothingSelected();
-            }
+        table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
+        searchTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
 
-            if (detail.getDocument().getDefaultRootElement() != null) {
-              detailPaneUpdater.setSelectedRow(-1);
+        table.getSelectionModel().addListSelectionListener(evt -> {
+                if (((evt.getFirstIndex() == evt.getLastIndex())
+                    && (evt.getFirstIndex() > 0) && previousLastIndex != -1) || (evt.getValueIsAdjusting())) {
+                    return;
+                }
+                boolean lastIndexOnLastRow = (evt.getLastIndex() == (table.getRowCount() - 1));
+                boolean lastIndexSame = (previousLastIndex == evt.getLastIndex());
+
+                /*
+                 * when scroll-to-bottom is active, here is what events look like:
+                 * rowcount-1: 227, last: 227, previous last: 191..first: 191
+                 *
+                 * when the user has unselected the bottom row, here is what the events look like:
+                 * rowcount-1: 227, last: 227, previous last: 227..first: 222
+                 *
+                 * note: previouslast is set after it is evaluated in the bypass scroll check
+                 */
+                //System.out.println("rowcount: " + (table.getRowCount() - 1) + ", last: " + evt.getLastIndex() +", previous last: " + previousLastIndex + "..first: " + evt.getFirstIndex() + ", isadjusting: " + evt.getValueIsAdjusting());
+
+                boolean disableScrollToBottom = (lastIndexOnLastRow && lastIndexSame && previousLastIndex != evt.getFirstIndex());
+                if (disableScrollToBottom && isScrollToBottom() && table.getRowCount() > 0) {
+                    preferenceModel.setScrollToBottom(false);
+                }
+                previousLastIndex = evt.getLastIndex();
             }
-          } else {
-            if (table.getSelectedRow() > -1) {
-              int selectedRow = table.getSelectedRow();
+        );
+
+        table.getSelectionModel().addListSelectionListener(
+            new ListSelectionListener() {
+                public void valueChanged(ListSelectionEvent evt) {
+                    if (((evt.getFirstIndex() == evt.getLastIndex())
+                        && (evt.getFirstIndex() > 0) && previousLastIndex != -1) || (evt.getValueIsAdjusting())) {
+                        return;
+                    }
 
-              if (isVisible()) {
-                updateStatusBar();
-              }
+                    final ListSelectionModel lsm = (ListSelectionModel) evt.getSource();
 
-              try {
-                if (tableModel.getRowCount() >= selectedRow) {
-                  detailPaneUpdater.setSelectedRow(table.getSelectedRow());
-                } else {
-                  detailPaneUpdater.setSelectedRow(-1);
+                    if (lsm.isSelectionEmpty()) {
+                        if (isVisible()) {
+                            statusBar.setNothingSelected();
+                        }
+
+                        if (detail.getDocument().getDefaultRootElement() != null) {
+                            detailPaneUpdater.setSelectedRow(-1);
+                        }
+                    } else {
+                        if (table.getSelectedRow() > -1) {
+                            int selectedRow = table.getSelectedRow();
+
+                            if (isVisible()) {
+                                updateStatusBar();
+                            }
+
+                            try {
+                                if (tableModel.getRowCount() >= selectedRow) {
+                                    detailPaneUpdater.setSelectedRow(table.getSelectedRow());
+                                } else {
+                                    detailPaneUpdater.setSelectedRow(-1);
+                                }
+                            } catch (Exception e) {
+                                e.printStackTrace();
+                                detailPaneUpdater.setSelectedRow(-1);
+                            }
+                        }
+                    }
                 }
-              } catch (Exception e) {
-                e.printStackTrace();
-                detailPaneUpdater.setSelectedRow(-1);
-              }
-            }
-          }
-        }
-      });
+            });
 
-    renderer = new TableColorizingRenderer(colorizer, applicationPreferenceModel, tableModel, preferenceModel, true);
-    renderer.setToolTipsVisible(preferenceModel.isToolTips());
+        renderer = new TableColorizingRenderer(colorizer, applicationPreferenceModel, tableModel, preferenceModel, true);
+        renderer.setToolTipsVisible(preferenceModel.isToolTips());
 
-    table.setDefaultRenderer(Object.class, renderer);
+        table.setDefaultRenderer(Object.class, renderer);
 
-    searchRenderer = new TableColorizingRenderer(colorizer, applicationPreferenceModel, searchModel, preferenceModel, false);
-    searchRenderer.setToolTipsVisible(preferenceModel.isToolTips());
+        searchRenderer = new TableColorizingRenderer(colorizer, applicationPreferenceModel, searchModel, preferenceModel, false);
+        searchRenderer.setToolTipsVisible(preferenceModel.isToolTips());
 
-    searchTable.setDefaultRenderer(Object.class, searchRenderer);
+        searchTable.setDefaultRenderer(Object.class, searchRenderer);
 
-    /*
-     * Throwable popup
-     */
-    table.addMouseListener(new ThrowableDisplayMouseAdapter(table, tableModel));
-    searchTable.addMouseListener(new ThrowableDisplayMouseAdapter(searchTable, searchModel));
-
-    //select a row in the main table when a row in the search table is selected
-    searchTable.addMouseListener(new MouseAdapter() {
-      public void mouseClicked(MouseEvent e) {
-        LoggingEventWrapper loggingEventWrapper = searchModel.getRow(searchTable.getSelectedRow());
-        if (loggingEventWrapper != null) {
-          int id = new Integer(loggingEventWrapper.getLoggingEvent().getProperty("log4jid"));
-          //preserve the table's viewble column
-          setSelectedEvent(id);
-        }
-      }
-    });
+        /*
+         * Throwable popup
+         */
+        table.addMouseListener(new ThrowableDisplayMouseAdapter(table, tableModel));
+        searchTable.addMouseListener(new ThrowableDisplayMouseAdapter(searchTable, searchModel));
 
-    /*
-     * We listen for new Key's coming in so we can get them automatically
-     * added as columns
-     */
-    tableModel.addNewKeyListener(
+        //select a row in the main table when a row in the search table is selected
+        searchTable.addMouseListener(new MouseAdapter() {
+            public void mouseClicked(MouseEvent e) {
+                LoggingEventWrapper loggingEventWrapper = searchModel.getRow(searchTable.getSelectedRow());
+                if (loggingEventWrapper != null) {
+                    int id = new Integer(loggingEventWrapper.getLoggingEvent().getProperty("log4jid"));
+                    //preserve the table's viewble column
+                    setSelectedEvent(id);
+                }
+            }
+        });
+
+        /*
+         * We listen for new Key's coming in so we can get them automatically
+         * added as columns
+         */
+        tableModel.addNewKeyListener(
             e -> SwingHelper.invokeOnEDT(() -> {
 // don't add the column if we already know about it, this could be if we've seen it before and saved the column preferences
 //this may throw an illegalargexception - ignore it because we need to add only if not already added
-              //if the column is already added, don't add again
+                //if the column is already added, don't add again
 
-              try {
-                if (table.getColumn(e.getKey()) != null) {
-                  return;
-                }
+                try {
+                    if (table.getColumn(e.getKey()) != null) {
+                        return;
+                    }
 //no need to check search table - we use the same columns
-              } catch (IllegalArgumentException iae) {
-              }
-              TableColumn col = new TableColumn(e.getNewModelIndex());
-              col.setHeaderValue(e.getKey());
+                } catch (IllegalArgumentException iae) {
+                }
+                TableColumn col = new TableColumn(e.getNewModelIndex());
+                col.setHeaderValue(e.getKey());
 
-              if (preferenceModel.addColumn(col)) {
-                if (preferenceModel.isColumnVisible(col) || !applicationPreferenceModel.isDefaultColumnsSet() || applicationPreferenceModel.isDefaultColumnsSet() &&
+                if (preferenceModel.addColumn(col)) {
+                    if (preferenceModel.isColumnVisible(col) || !applicationPreferenceModel.isDefaultColumnsSet() || applicationPreferenceModel.isDefaultColumnsSet() &&
                         applicationPreferenceModel.getDefaultColumnNames().contains(col.getHeaderValue())) {
-                  table.addColumn(col);
-                  searchTable.addColumn(col);
-                  preferenceModel.setColumnVisible(e.getKey().toString(), true);
+                        table.addColumn(col);
+                        searchTable.addColumn(col);
+                        preferenceModel.setColumnVisible(e.getKey().toString(), true);
+                    }
                 }
-              }
             }));
 
-    //if the table is refiltered, try to reselect the last selected row
-    //refilter with a newValue of TRUE means refiltering is about to begin
-    //refilter with a newValue of FALSE means refiltering is complete
-    //assuming notification is called on the EDT so we can in the current EDT call update the scroll & selection
-    tableModel.addPropertyChangeListener("refilter", new PropertyChangeListener() {
-        private LoggingEventWrapper currentEvent;
-        public void propertyChange(PropertyChangeEvent evt) {
-            //if new value is true, filtering is about to begin
-            //if new value is false, filtering is complete
-            if (evt.getNewValue().equals(Boolean.TRUE)) {
-                int currentRow = table.getSelectedRow();
-                if (currentRow > -1) {
-                    currentEvent = tableModel.getRow(currentRow);
-                }
-            } else {
-                if (currentEvent != null) {
-                    table.scrollToRow(tableModel.getRowIndex(currentEvent));
+        //if the table is refiltered, try to reselect the last selected row
+        //refilter with a newValue of TRUE means refiltering is about to begin
+        //refilter with a newValue of FALSE means refiltering is complete
+        //assuming notification is called on the EDT so we can in the current EDT call update the scroll & selection
+        tableModel.addPropertyChangeListener("refilter", new PropertyChangeListener() {
+            private LoggingEventWrapper currentEvent;
+
+            public void propertyChange(PropertyChangeEvent evt) {
+                //if new value is true, filtering is about to begin
+                //if new value is false, filtering is complete
+                if (evt.getNewValue().equals(Boolean.TRUE)) {
+                    int currentRow = table.getSelectedRow();
+                    if (currentRow > -1) {
+                        currentEvent = tableModel.getRow(currentRow);
+                    }
+                } else {
+                    if (currentEvent != null) {
+                        table.scrollToRow(tableModel.getRowIndex(currentEvent));
+                    }
                 }
             }
-        }
-    });
+        });
 
-    table.getTableHeader().addMouseListener(
-      new MouseAdapter() {
-        public void mouseClicked(MouseEvent e) {
-          checkEvent(e);
-        }
+        table.getTableHeader().addMouseListener(
+            new MouseAdapter() {
+                public void mouseClicked(MouseEvent e) {
+                    checkEvent(e);
+                }
 
-        public void mousePressed(MouseEvent e) {
-          checkEvent(e);
-        }
+                public void mousePressed(MouseEvent e) {
+                    checkEvent(e);
+                }
 
-        public void mouseReleased(MouseEvent e) {
-          checkEvent(e);
-        }
+                public void mouseReleased(MouseEvent e) {
+                    checkEvent(e);
+                }
 
-        private void checkEvent(MouseEvent e) {
-          if (e.isPopupTrigger()) {
-            TableColumnModel colModel = table.getColumnModel();
-            int index = colModel.getColumnIndexAtX(e.getX());
-            int modelIndex = colModel.getColumn(index).getModelIndex();
+                private void checkEvent(MouseEvent e) {
+                    if (e.isPopupTrigger()) {
+                        TableColumnModel colModel = table.getColumnModel();
+                        int index = colModel.getColumnIndexAtX(e.getX());
+                        int modelIndex = colModel.getColumn(index).getModelIndex();
 
-            if ((modelIndex + 1) == ChainsawColumns.INDEX_TIMESTAMP_COL_NAME) {
-              dateFormatChangePopup.show(e.getComponent(), e.getX(), e.getY());
-            }
-          }
-        }
-      });
+                        if ((modelIndex + 1) == ChainsawColumns.INDEX_TIMESTAMP_COL_NAME) {
+                            dateFormatChangePopup.show(e.getComponent(), e.getX(), e.getY());
+                        }
+                    }
+                }
+            });
 
-    /*
-     * Upper panel definition
-     */
-    JPanel upperPanel = new JPanel();
-    upperPanel.setLayout(new BoxLayout(upperPanel, BoxLayout.X_AXIS));
-    upperPanel.setBorder(BorderFactory.createEmptyBorder(2, 5, 2, 0));
+        /*
+         * Upper panel definition
+         */
+        JPanel upperPanel = new JPanel();
+        upperPanel.setLayout(new BoxLayout(upperPanel, BoxLayout.X_AXIS));
+        upperPanel.setBorder(BorderFactory.createEmptyBorder(2, 5, 2, 0));
 
-    final JLabel filterLabel = new JLabel("Refine focus on: ");
-    filterLabel.setFont(filterLabel.getFont().deriveFont(Font.BOLD));
+        final JLabel filterLabel = new JLabel("Refine focus on: ");
+        filterLabel.setFont(filterLabel.getFont().deriveFont(Font.BOLD));
 
-    upperPanel.add(filterLabel);
-    upperPanel.add(Box.createHorizontalStrut(3));
-    upperPanel.add(filterCombo);
-    upperPanel.add(Box.createHorizontalStrut(3));
+        upperPanel.add(filterLabel);
+        upperPanel.add(Box.createHorizontalStrut(3));
+        upperPanel.add(filterCombo);
+        upperPanel.add(Box.createHorizontalStrut(3));
 
-    final JTextField filterText =(JTextField) filterCombo.getEditor().getEditorComponent();
-    final JTextField findText =(JTextField) findCombo.getEditor().getEditorComponent();
+        final JTextField filterText = (JTextField) filterCombo.getEditor().getEditorComponent();
+        final JTextField findText = (JTextField) findCombo.getEditor().getEditorComponent();
 
 
-    //Adding a button to clear filter expressions which are currently remembered by Chainsaw...
-    final JButton removeFilterButton = new JButton(" Remove ");
+        //Adding a button to clear filter expressions which are currently remembered by Chainsaw...
+        final JButton removeFilterButton = new JButton(" Remove ");
 
-    removeFilterButton.setToolTipText("Click here to remove the selected expression from the list");
-    removeFilterButton.addActionListener(
+        removeFilterButton.setToolTipText("Click here to remove the selected expression from the list");
+        removeFilterButton.addActionListener(
             new AbstractAction() {
-                public void actionPerformed(ActionEvent e){
-                	Object selectedItem = filterCombo.getSelectedItem();
-                    if (e.getSource() == removeFilterButton && selectedItem != null && !selectedItem.toString().trim().equals("")){
-                      //don't just remove the entry from the store, clear the field
-                      int index = filterCombo.getSelectedIndex();
-                      filterText.setText(null);
-                      filterCombo.setSelectedIndex(-1);
-                      filterCombo.removeItemAt(index);
-                      if (!(findCombo.getSelectedItem() != null && findCombo.getSelectedItem().equals(selectedItem))) {
-                        //now remove the entry from the other model
-                        ((AutoFilterComboBox.AutoFilterComboBoxModel)findCombo.getModel()).removeElement(selectedItem);
-                      }
+                public void actionPerformed(ActionEvent e) {
+                    Object selectedItem = filterCombo.getSelectedItem();
+                    if (e.getSource() == removeFilterButton && selectedItem != null && !selectedItem.toString().trim().equals("")) {
+                        //don't just remove the entry from the store, clear the field
+                        int index = filterCombo.getSelectedIndex();
+                        filterText.setText(null);
+                        filterCombo.setSelectedIndex(-1);
+                        filterCombo.removeItemAt(index);
+                        if (!(findCombo.getSelectedItem() != null && findCombo.getSelectedItem().equals(selectedItem))) {
+                            //now remove the entry from the other model
+                            ((AutoFilterComboBox.AutoFilterComboBoxModel) findCombo.getModel()).removeElement(selectedItem);
+                        }
                     }
                 }
             }
-    );
-    upperPanel.add(removeFilterButton);
-    //add some space between refine focus and search sections of the panel
-    upperPanel.add(Box.createHorizontalStrut(25));
-
-    final JLabel findLabel = new JLabel("Find: ");
-    findLabel.setFont(filterLabel.getFont().deriveFont(Font.BOLD));
-
-    upperPanel.add(findLabel);
-    upperPanel.add(Box.createHorizontalStrut(3));
-
-    upperPanel.add(findCombo);
-    upperPanel.add(Box.createHorizontalStrut(3));
-
-    Action findNextAction = getFindNextAction();
-    Action findPreviousAction = getFindPreviousAction();
-    //add up & down search
-    JButton findNextButton = new SmallButton(findNextAction);
-    findNextButton.setText("");
-    findNextButton.getActionMap().put(
-      findNextAction.getValue(Action.NAME), findNextAction);
-    findNextButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
-      (KeyStroke) findNextAction.getValue(Action.ACCELERATOR_KEY),
-      findNextAction.getValue(Action.NAME));
-
-    JButton findPreviousButton = new SmallButton(findPreviousAction);
-    findPreviousButton.setText("");
-    findPreviousButton.getActionMap().put(
-      findPreviousAction.getValue(Action.NAME), findPreviousAction);
-    findPreviousButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
-      (KeyStroke) findPreviousAction.getValue(Action.ACCELERATOR_KEY),
-      findPreviousAction.getValue(Action.NAME));
-
-    upperPanel.add(findNextButton);
-
-    upperPanel.add(findPreviousButton);
-    upperPanel.add(Box.createHorizontalStrut(3));
-    
-    //Adding a button to clear filter expressions which are currently remembered by Chainsaw...
-    final JButton removeFindButton = new JButton(" Remove ");
-    removeFindButton.setToolTipText("Click here to remove the selected expression from the list");
-    removeFindButton.addActionListener(
+        );
+        upperPanel.add(removeFilterButton);
+        //add some space between refine focus and search sections of the panel
+        upperPanel.add(Box.createHorizontalStrut(25));
+
+        final JLabel findLabel = new JLabel("Find: ");
+        findLabel.setFont(filterLabel.getFont().deriveFont(Font.BOLD));
+
+        upperPanel.add(findLabel);
+        upperPanel.add(Box.createHorizontalStrut(3));
+
+        upperPanel.add(findCombo);
+        upperPanel.add(Box.createHorizontalStrut(3));
+
+        Action findNextAction = getFindNextAction();
+        Action findPreviousAction = getFindPreviousAction();
+        //add up & down search
+        JButton findNextButton = new SmallButton(findNextAction);
+        findNextButton.setText("");
+        findNextButton.getActionMap().put(
+            findNextAction.getValue(Action.NAME), findNextAction);
+        findNextButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
+            (KeyStroke) findNextAction.getValue(Action.ACCELERATOR_KEY),
+            findNextAction.getValue(Action.NAME));
+
+        JButton findPreviousButton = new SmallButton(findPreviousAction);
+        findPreviousButton.setText("");
+        findPreviousButton.getActionMap().put(
+            findPreviousAction.getValue(Action.NAME), findPreviousAction);
+        findPreviousButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
+            (KeyStroke) findPreviousAction.getValue(Action.ACCELERATOR_KEY),
+            findPreviousAction.getValue(Action.NAME));
+
+        upperPanel.add(findNextButton);
+
+        upperPanel.add(findPreviousButton);
+        upperPanel.add(Box.createHorizontalStrut(3));
+
+        //Adding a button to clear filter expressions which are currently remembered by Chainsaw...
+        final JButton removeFindButton = new JButton(" Remove ");
+        removeFindButton.setToolTipText("Click here to remove the selected expression from the list");
+        removeFindButton.addActionListener(
             new AbstractAction() {
-                public void actionPerformed(ActionEvent e){
-                	Object selectedItem = findCombo.getSelectedItem();
-                    if (e.getSource() == removeFindButton && selectedItem != null && !selectedItem.toString().trim().equals("")){
-                      //don't just remove the entry from the store, clear the field
-                      int index = findCombo.getSelectedIndex();
-                      findText.setText(null);
-           

<TRUNCATED>