http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/96ebd9ad/src/main/java/org/apache/log4j/chainsaw/LogPanelPreferencePanel.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/log4j/chainsaw/LogPanelPreferencePanel.java 
b/src/main/java/org/apache/log4j/chainsaw/LogPanelPreferencePanel.java
index fce03be..2d10041 100644
--- a/src/main/java/org/apache/log4j/chainsaw/LogPanelPreferencePanel.java
+++ b/src/main/java/org/apache/log4j/chainsaw/LogPanelPreferencePanel.java
@@ -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.
@@ -16,9 +16,15 @@
  */
 package org.apache.log4j.chainsaw;
 
-import java.awt.BorderLayout;
-import java.awt.Component;
-import java.awt.Dimension;
+import org.apache.log4j.LogManager;
+import org.apache.log4j.Logger;
+
+import javax.swing.*;
+import javax.swing.table.TableColumn;
+import javax.swing.tree.DefaultMutableTreeNode;
+import javax.swing.tree.DefaultTreeModel;
+import javax.swing.tree.TreeModel;
+import java.awt.*;
 import java.awt.event.ActionListener;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
@@ -26,618 +32,568 @@ import java.util.ArrayList;
 import java.util.Enumeration;
 import java.util.List;
 
-import javax.swing.BorderFactory;
-import javax.swing.Box;
-import javax.swing.BoxLayout;
-import javax.swing.ButtonGroup;
-import javax.swing.JButton;
-import javax.swing.JCheckBox;
-import javax.swing.JEditorPane;
-import javax.swing.JFrame;
-import javax.swing.JLabel;
-import javax.swing.JList;
-import javax.swing.JPanel;
-import javax.swing.JRadioButton;
-import javax.swing.JScrollPane;
-import javax.swing.JTextField;
-import javax.swing.SwingConstants;
-import javax.swing.table.TableColumn;
-import javax.swing.tree.DefaultMutableTreeNode;
-import javax.swing.tree.DefaultTreeModel;
-import javax.swing.tree.TreeModel;
-
-import org.apache.log4j.LogManager;
-import org.apache.log4j.Logger;
-
 
 /**
  * GUI panel used to manipulate the PreferenceModel for a Log Panel
  *
  * @author Paul Smith
  */
-public class LogPanelPreferencePanel extends AbstractPreferencePanel
-{
-  //~ Instance fields =========================================================
+public class LogPanelPreferencePanel extends AbstractPreferencePanel {
+    //~ Instance fields 
=========================================================
 
-  private final LogPanelPreferenceModel preferenceModel;
-  private final ModifiableListModel columnListModel = new 
ModifiableListModel();
-  private static final Logger logger = 
LogManager.getLogger(LogPanelPreferencePanel.class);
-  private ApplicationPreferenceModel appPreferenceModel;
+    private final LogPanelPreferenceModel preferenceModel;
+    private final ModifiableListModel columnListModel = new 
ModifiableListModel();
+    private static final Logger logger = 
LogManager.getLogger(LogPanelPreferencePanel.class);
+    private ApplicationPreferenceModel appPreferenceModel;
 
-  //~ Constructors ============================================================
+    //~ Constructors 
============================================================
 
-  public LogPanelPreferencePanel(LogPanelPreferenceModel model, 
ApplicationPreferenceModel appModel)
-  {
-    preferenceModel = model;
-    appPreferenceModel = appModel;
-    initComponents();
+    public LogPanelPreferencePanel(LogPanelPreferenceModel model, 
ApplicationPreferenceModel appModel) {
+        preferenceModel = model;
+        appPreferenceModel = appModel;
+        initComponents();
 
-    getOkButton().addActionListener(e -> hidePanel());
+        getOkButton().addActionListener(e -> hidePanel());
 
-    getCancelButton().addActionListener(e -> hidePanel());
+        getCancelButton().addActionListener(e -> hidePanel());
     }
 
-  //~ Methods =================================================================
-
-  /**
-   * DOCUMENT ME!
-   *
-   * @param args DOCUMENT ME!
-   */
-  public static void main(String[] args)
-  {
-    JFrame f = new JFrame("Preferences Panel Test Bed");
-    LogPanelPreferenceModel model = new LogPanelPreferenceModel();
-    ApplicationPreferenceModel appModel = new ApplicationPreferenceModel();
-    LogPanelPreferencePanel panel = new LogPanelPreferencePanel(model, 
appModel);
-    f.getContentPane().add(panel);
-
-    model.addPropertyChangeListener(evt -> logger.warn(evt.toString()));
-    panel.setOkCancelActionListener(e -> System.exit(1));
-
-    f.setSize(640, 480);
-    f.setVisible(true);
-  }
-
-  protected TreeModel createTreeModel()
-  {
-    final DefaultMutableTreeNode rootNode =
-      new DefaultMutableTreeNode("Preferences");
-    DefaultTreeModel model = new DefaultTreeModel(rootNode);
-
-    DefaultMutableTreeNode visuals =
-      new DefaultMutableTreeNode(new VisualsPrefPanel());
-    DefaultMutableTreeNode formatting =
-      new DefaultMutableTreeNode(new FormattingPanel());
-    DefaultMutableTreeNode columns =
-      new DefaultMutableTreeNode(new ColumnSelectorPanel());
-
-    rootNode.add(visuals);
-    rootNode.add(formatting);
-    rootNode.add(columns);
-
-    return model;
-  }
-
-  //~ Inner Classes ===========================================================
-
-  /**
-   * Allows the user to choose which columns to display.
-   *
-   * @author Paul Smith
-   *
-   */
-  public class ColumnSelectorPanel extends BasicPrefPanel
-  {
-    //~ Constructors ==========================================================
-
-    ColumnSelectorPanel()
-    {
-      super("Columns");
-      initComponents();
+    //~ Methods 
=================================================================
+
+    /**
+     * DOCUMENT ME!
+     *
+     * @param args DOCUMENT ME!
+     */
+    public static void main(String[] args) {
+        JFrame f = new JFrame("Preferences Panel Test Bed");
+        LogPanelPreferenceModel model = new LogPanelPreferenceModel();
+        ApplicationPreferenceModel appModel = new ApplicationPreferenceModel();
+        LogPanelPreferencePanel panel = new LogPanelPreferencePanel(model, 
appModel);
+        f.getContentPane().add(panel);
+
+        model.addPropertyChangeListener(evt -> logger.warn(evt.toString()));
+        panel.setOkCancelActionListener(e -> System.exit(1));
+
+        f.setSize(640, 480);
+        f.setVisible(true);
     }
 
-    //~ Methods ===============================================================
+    protected TreeModel createTreeModel() {
+        final DefaultMutableTreeNode rootNode =
+            new DefaultMutableTreeNode("Preferences");
+        DefaultTreeModel model = new DefaultTreeModel(rootNode);
 
-    private void initComponents()
-    {
-      setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
+        DefaultMutableTreeNode visuals =
+            new DefaultMutableTreeNode(new VisualsPrefPanel());
+        DefaultMutableTreeNode formatting =
+            new DefaultMutableTreeNode(new FormattingPanel());
+        DefaultMutableTreeNode columns =
+            new DefaultMutableTreeNode(new ColumnSelectorPanel());
 
-      Box columnBox = new Box(BoxLayout.Y_AXIS);
+        rootNode.add(visuals);
+        rootNode.add(formatting);
+        rootNode.add(columns);
 
-      //               
columnBox.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(),
 "Displayed Columns"));
-      final JList columnList = new JList();
-      columnList.setVisibleRowCount(17);
+        return model;
+    }
 
-      for (Object o : preferenceModel.getColumns()) {
-        TableColumn col = (TableColumn) o;
-        Enumeration enumeration = columnListModel.elements();
-        boolean found = false;
-        while (enumeration.hasMoreElements()) {
-          TableColumn thisCol = (TableColumn) enumeration.nextElement();
-          if (thisCol.getHeaderValue().equals(col.getHeaderValue())) {
-            found = true;
-          }
-        }
-        if (!found) {
-          columnListModel.addElement(col);
+    //~ Inner Classes 
===========================================================
+
+    /**
+     * Allows the user to choose which columns to display.
+     *
+     * @author Paul Smith
+     */
+    public class ColumnSelectorPanel extends BasicPrefPanel {
+        //~ Constructors 
==========================================================
+
+        ColumnSelectorPanel() {
+            super("Columns");
+            initComponents();
         }
-      }
-
-      columnList.setModel(columnListModel);
-
-      CheckListCellRenderer cellRenderer = new CheckListCellRenderer()
-        {
-          protected boolean isSelected(Object value)
-          {
-            return 
LogPanelPreferencePanel.this.preferenceModel.isColumnVisible((TableColumn)
-              value);
-          }
-        };
-
-      columnList.addMouseListener(new MouseAdapter()
-        {
-          public void mouseClicked(MouseEvent e)
-          {
-              int i = columnList.locationToIndex(e.getPoint());
-
-              if (i >= 0)
-              {
-                Object column = columnListModel.get(i);
-                preferenceModel.toggleColumn(((TableColumn)column));
-              }
-          }
-        });
-      JButton setAsDefaultsButton = new JButton("Use selected columns as 
default visible columns");
-      setAsDefaultsButton.addActionListener(actionEvent -> {
-        List selectedColumns = new ArrayList();
-        for (int i = 0;i<columnListModel.getSize();i++) {
-          if (preferenceModel.isColumnVisible((TableColumn) 
columnListModel.get(i))) {
-            
selectedColumns.add(((TableColumn)columnListModel.get(i)).getHeaderValue());
-          }
+
+        //~ Methods 
===============================================================
+
+        private void initComponents() {
+            setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
+
+            Box columnBox = new Box(BoxLayout.Y_AXIS);
+
+            //         
columnBox.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(),
 "Displayed Columns"));
+            final JList columnList = new JList();
+            columnList.setVisibleRowCount(17);
+
+            for (Object o : preferenceModel.getColumns()) {
+                TableColumn col = (TableColumn) o;
+                Enumeration enumeration = columnListModel.elements();
+                boolean found = false;
+                while (enumeration.hasMoreElements()) {
+                    TableColumn thisCol = (TableColumn) 
enumeration.nextElement();
+                    if (thisCol.getHeaderValue().equals(col.getHeaderValue())) 
{
+                        found = true;
+                    }
+                }
+                if (!found) {
+                    columnListModel.addElement(col);
+                }
+            }
+
+            columnList.setModel(columnListModel);
+
+            CheckListCellRenderer cellRenderer = new CheckListCellRenderer() {
+                protected boolean isSelected(Object value) {
+                    return 
LogPanelPreferencePanel.this.preferenceModel.isColumnVisible((TableColumn)
+                        value);
+                }
+            };
+
+            columnList.addMouseListener(new MouseAdapter() {
+                public void mouseClicked(MouseEvent e) {
+                    int i = columnList.locationToIndex(e.getPoint());
+
+                    if (i >= 0) {
+                        Object column = columnListModel.get(i);
+                        preferenceModel.toggleColumn(((TableColumn) column));
+                    }
+                }
+            });
+            JButton setAsDefaultsButton = new JButton("Use selected columns as 
default visible columns");
+            setAsDefaultsButton.addActionListener(actionEvent -> {
+                List selectedColumns = new ArrayList();
+                for (int i = 0; i < columnListModel.getSize(); i++) {
+                    if (preferenceModel.isColumnVisible((TableColumn) 
columnListModel.get(i))) {
+                        selectedColumns.add(((TableColumn) 
columnListModel.get(i)).getHeaderValue());
+                    }
+                }
+                appPreferenceModel.setDefaultColumnNames(selectedColumns);
+            });
+            columnList.setCellRenderer(cellRenderer);
+            columnBox.add(new JScrollPane(columnList));
+            columnBox.add(Box.createVerticalStrut(5));
+            columnBox.add(setAsDefaultsButton);
+            add(columnBox);
+            add(Box.createVerticalGlue());
         }
-        appPreferenceModel.setDefaultColumnNames(selectedColumns);
-      });
-      columnList.setCellRenderer(cellRenderer);
-      columnBox.add(new JScrollPane(columnList));
-      columnBox.add(Box.createVerticalStrut(5));
-      columnBox.add(setAsDefaultsButton);
-      add(columnBox);
-      add(Box.createVerticalGlue());
-    }
-  }
-
-  /**
-   * Provides preference gui's for all the Formatting options
-   * available for the columns etc.
-   */
-  private class FormattingPanel extends BasicPrefPanel
-  {
-    //~ Instance fields =======================================================
-
-    private JTextField customFormatText = new JTextField("", 10);
-    private JTextField loggerPrecision = new JTextField(10);
-    private JRadioButton rdCustom = new JRadioButton("Custom Format ");
-    private final JRadioButton rdISO =
-      new JRadioButton(
-        "<html><b>Fast</b> ISO 8601 format (yyyy-MM-dd HH:mm:ss) </html>");
-    private final JTextField timeZone = new JTextField(10);
-    private final JRadioButton rdLevelIcons = new JRadioButton("Icons ");
-    private final JRadioButton rdLevelText = new JRadioButton("Text ");
-    private JRadioButton rdLast;
-
-    //~ Constructors ==========================================================
-
-    private FormattingPanel()
-    {
-      super("Formatting");
-      this.initComponents();
-      setupListeners();
     }
 
-    //~ Methods ===============================================================
+    /**
+     * Provides preference gui's for all the Formatting options
+     * available for the columns etc.
+     */
+    private class FormattingPanel extends BasicPrefPanel {
+        //~ Instance fields 
=======================================================
+
+        private JTextField customFormatText = new JTextField("", 10);
+        private JTextField loggerPrecision = new JTextField(10);
+        private JRadioButton rdCustom = new JRadioButton("Custom Format ");
+        private final JRadioButton rdISO =
+            new JRadioButton(
+                "<html><b>Fast</b> ISO 8601 format (yyyy-MM-dd HH:mm:ss) 
</html>");
+        private final JTextField timeZone = new JTextField(10);
+        private final JRadioButton rdLevelIcons = new JRadioButton("Icons ");
+        private final JRadioButton rdLevelText = new JRadioButton("Text ");
+        private JRadioButton rdLast;
+
+        //~ Constructors 
==========================================================
+
+        private FormattingPanel() {
+            super("Formatting");
+            this.initComponents();
+            setupListeners();
+        }
+
+        //~ Methods 
===============================================================
+
+        private void initComponents() {
+            setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
+
+            JPanel dateFormatPanel = new JPanel();
+            dateFormatPanel.setLayout(new BoxLayout(dateFormatPanel, 
BoxLayout.Y_AXIS));
+            dateFormatPanel.setBorder(
+                BorderFactory.createTitledBorder(
+                    BorderFactory.createEtchedBorder(), "Timestamp"));
+
+            ButtonGroup bgDateFormat = new ButtonGroup();
 
-    private void initComponents()
-    {
-      setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
+            rdISO.setSelected(preferenceModel.isUseISO8601Format());
+
+            rdISO.setHorizontalTextPosition(SwingConstants.RIGHT);
+            rdISO.setAlignmentX(Component.LEFT_ALIGNMENT);
+
+            bgDateFormat.add(rdISO);
+            dateFormatPanel.add(rdISO);
+
+            for (Object DATE_FORMAT : LogPanelPreferenceModel.DATE_FORMATS) {
+                final String format = (String) DATE_FORMAT;
+                final JRadioButton rdFormat = new JRadioButton(format);
+                rdFormat.setHorizontalTextPosition(SwingConstants.RIGHT);
+                rdFormat.setAlignmentX(Component.LEFT_ALIGNMENT);
+
+                rdFormat.addActionListener(e -> {
+                    preferenceModel.setDateFormatPattern(format);
+                    customFormatText.setEnabled(rdCustom.isSelected());
+                    rdLast = rdFormat;
+                });
+                //update based on external changes to dateformatpattern 
(column context
+                //menu)
+                preferenceModel.addPropertyChangeListener(
+                    "dateFormatPattern", evt -> {
+                        rdFormat.setSelected(
+                            
preferenceModel.getDateFormatPattern().equals(format));
+                        rdLast = rdFormat;
+                    });
+
+                dateFormatPanel.add(rdFormat);
+                bgDateFormat.add(rdFormat);
+            }
+
+            customFormatText.setPreferredSize(new Dimension(100, 20));
+            
customFormatText.setMaximumSize(customFormatText.getPreferredSize());
+            
customFormatText.setMinimumSize(customFormatText.getPreferredSize());
+            customFormatText.setEnabled(false);
+
+            bgDateFormat.add(rdCustom);
+            rdCustom.setSelected(preferenceModel.isCustomDateFormat());
+
+            // add a custom date format
+            if (preferenceModel.isCustomDateFormat()) {
+                
customFormatText.setText(preferenceModel.getDateFormatPattern());
+                customFormatText.setEnabled(true);
+            }
+
+            JPanel customPanel = new JPanel();
+            customPanel.setLayout(new BoxLayout(customPanel, 
BoxLayout.X_AXIS));
+            customPanel.add(rdCustom);
+            customPanel.add(customFormatText);
+            customPanel.setAlignmentX(Component.LEFT_ALIGNMENT);
+
+            dateFormatPanel.add(customPanel);
+            dateFormatPanel.add(Box.createVerticalStrut(5));
+
+            JLabel dateFormatLabel = new JLabel("Time zone of events (or blank 
for local time zone");
+            dateFormatPanel.add(dateFormatLabel);
+
+            timeZone.setMaximumSize(timeZone.getPreferredSize());
+            dateFormatPanel.add(Box.createVerticalStrut(5));
+            dateFormatPanel.add(timeZone);
+
+            add(dateFormatPanel);
+
+            JPanel levelFormatPanel = new JPanel();
+            levelFormatPanel.setLayout(
+                new BoxLayout(levelFormatPanel, BoxLayout.Y_AXIS));
+            levelFormatPanel.setBorder(
+                BorderFactory.createTitledBorder(
+                    BorderFactory.createEtchedBorder(), "Level"));
+            levelFormatPanel.setAlignmentX(Component.LEFT_ALIGNMENT);
+
+            ButtonGroup bgLevel = new ButtonGroup();
+            bgLevel.add(rdLevelIcons);
+            bgLevel.add(rdLevelText);
+
+            rdLevelIcons.setSelected(preferenceModel.isLevelIcons());
+
+            levelFormatPanel.add(rdLevelIcons);
+            levelFormatPanel.add(rdLevelText);
+
+            add(levelFormatPanel);
+
+            JPanel loggerFormatPanel = new JPanel();
+            loggerFormatPanel.setLayout(
+                new BoxLayout(loggerFormatPanel, BoxLayout.Y_AXIS));
+            loggerFormatPanel.setBorder(
+                BorderFactory.createTitledBorder(
+                    BorderFactory.createEtchedBorder(), "Logger"));
+            loggerFormatPanel.setAlignmentX(Component.LEFT_ALIGNMENT);
+
+            loggerFormatPanel.add(Box.createVerticalStrut(3));
+
+            final JLabel precisionLabel =
+                new JLabel("Number of package levels to hide (or blank to 
display full logger)");
+
+            loggerFormatPanel.add(precisionLabel);
+            loggerFormatPanel.add(Box.createVerticalStrut(5));
+
+            loggerPrecision.setMaximumSize(loggerPrecision.getPreferredSize());
+            loggerFormatPanel.add(loggerPrecision);
+
+            add(loggerFormatPanel);
+        }
 
-      JPanel dateFormatPanel = new JPanel();
-      dateFormatPanel.setLayout(new BoxLayout(dateFormatPanel, 
BoxLayout.Y_AXIS));
-      dateFormatPanel.setBorder(
-        BorderFactory.createTitledBorder(
-          BorderFactory.createEtchedBorder(), "Timestamp"));
+        /*
+         * Restore text fields to current model values
+         */
+        private void reset() {
+
+            if (preferenceModel.isCustomDateFormat()) {
+                
customFormatText.setText(preferenceModel.getDateFormatPattern());
+            } else {
+                if (rdLast != null) {
+                    rdLast.setSelected(true);
+                }
+                customFormatText.setEnabled(false);
+            }
+
+            loggerPrecision.setText(preferenceModel.getLoggerPrecision());
+            timeZone.setText(preferenceModel.getTimeZone());
+        }
 
-      ButtonGroup bgDateFormat = new ButtonGroup();
+        /*
+         * Commit text fields to model
+         */
+        private void commit() {
+            if (rdCustom.isSelected()) {
+                
preferenceModel.setDateFormatPattern(customFormatText.getText());
+            }
+            preferenceModel.setLoggerPrecision(loggerPrecision.getText());
+            preferenceModel.setTimeZone(timeZone.getText());
+        }
 
-      rdISO.setSelected(preferenceModel.isUseISO8601Format());
+        /**
+         * DOCUMENT ME!
+         */
+        private void setupListeners() {
+            getOkButton().addActionListener(evt -> commit());
 
-      rdISO.setHorizontalTextPosition(SwingConstants.RIGHT);
-      rdISO.setAlignmentX(Component.LEFT_ALIGNMENT);      
+            getCancelButton().addActionListener(evt -> reset());
 
-      bgDateFormat.add(rdISO);
-      dateFormatPanel.add(rdISO);
+            rdCustom.addActionListener(e -> {
+                customFormatText.setEnabled(rdCustom.isSelected());
+                customFormatText.grabFocus();
+            });
 
-      for (Object DATE_FORMAT : LogPanelPreferenceModel.DATE_FORMATS) {
-        final String format = (String) DATE_FORMAT;
-        final JRadioButton rdFormat = new JRadioButton(format);
-        rdFormat.setHorizontalTextPosition(SwingConstants.RIGHT);
-        rdFormat.setAlignmentX(Component.LEFT_ALIGNMENT);
+            //a second?? listener for dateformatpattern
+            preferenceModel.addPropertyChangeListener(
+                "dateFormatPattern", evt -> {
+                    /**
+                     * we need to make sure we are not reacting to the user 
typing, so only do this
+                     * if the text box is not the same as the model
+                     */
+                    if (
+                        preferenceModel.isCustomDateFormat()
+                            && !customFormatText.getText().equals(
+                            evt.getNewValue().toString())) {
+                        
customFormatText.setText(preferenceModel.getDateFormatPattern());
+                        rdCustom.setSelected(true);
+                        customFormatText.setEnabled(true);
+                    } else {
+                        rdCustom.setSelected(false);
+                    }
+                });
 
-        rdFormat.addActionListener(e -> {
-          preferenceModel.setDateFormatPattern(format);
-          customFormatText.setEnabled(rdCustom.isSelected());
-          rdLast = rdFormat;
-        });
-        //update based on external changes to dateformatpattern (column context
-        //menu)
-        preferenceModel.addPropertyChangeListener(
+            rdISO.addActionListener(e -> {
+                preferenceModel.setDateFormatPattern("ISO8601");
+                customFormatText.setEnabled(rdCustom.isSelected());
+                rdLast = rdISO;
+            });
+            preferenceModel.addPropertyChangeListener(
                 "dateFormatPattern", evt -> {
-                  rdFormat.setSelected(
-                          
preferenceModel.getDateFormatPattern().equals(format));
-                  rdLast = rdFormat;
+                    rdISO.setSelected(preferenceModel.isUseISO8601Format());
+                    rdLast = rdISO;
                 });
+            preferenceModel.addPropertyChangeListener(
+                "dateFormatTimeZone", evt -> 
timeZone.setText(preferenceModel.getTimeZone())
+            );
 
-        dateFormatPanel.add(rdFormat);
-        bgDateFormat.add(rdFormat);
-      }
+            ActionListener levelIconListener = e -> 
preferenceModel.setLevelIcons(rdLevelIcons.isSelected());
 
-      customFormatText.setPreferredSize(new Dimension(100, 20));
-      customFormatText.setMaximumSize(customFormatText.getPreferredSize());
-      customFormatText.setMinimumSize(customFormatText.getPreferredSize());
-      customFormatText.setEnabled(false);
+            rdLevelIcons.addActionListener(levelIconListener);
+            rdLevelText.addActionListener(levelIconListener);
 
-      bgDateFormat.add(rdCustom);
-      rdCustom.setSelected(preferenceModel.isCustomDateFormat());
+            preferenceModel.addPropertyChangeListener(
+                "levelIcons", evt -> {
+                    boolean value = (Boolean) evt.getNewValue();
+                    rdLevelIcons.setSelected(value);
+                    rdLevelText.setSelected(!value);
+                });
+        }
+    }
 
-      // add a custom date format
-      if (preferenceModel.isCustomDateFormat())
-      {
-        customFormatText.setText(preferenceModel.getDateFormatPattern());
-        customFormatText.setEnabled(true);
-      }
+    /**
+     * DOCUMENT ME!
+     *
+     * @author $author$
+     * @author psmith
+     * @version $Revision$, $Date$
+     */
+    private class VisualsPrefPanel extends BasicPrefPanel {
+        //~ Instance fields 
=======================================================
+
+        private final JCheckBox detailPanelVisible =
+            new JCheckBox("Show Event Detail panel");
+
+        private final JCheckBox loggerTreePanel =
+            new JCheckBox("Show Logger Tree");
+        private final JCheckBox wrapMessage = new JCheckBox("Wrap message 
field (display multi-line rows) ");
+        private final JCheckBox searchResultsVisible = new JCheckBox("Display 
find results in details panel ");
+        private final JCheckBox highlightSearchMatchText = new 
JCheckBox("Highlight find match text ");
+        private final JCheckBox scrollToBottom =
+            new JCheckBox("Scroll to bottom (view tracks with new events)");
+        private final JCheckBox showMillisDeltaAsGap =
+            new JCheckBox("Display timestamp delta between events as row gap");
+        private final JCheckBox toolTips =
+            new JCheckBox("Show Event Detail Tooltips");
+        private final JCheckBox thumbnailBarToolTips =
+            new JCheckBox("Show Thumbnail Bar Tooltips");
+        private final JEditorPane clearTableExpression = new JEditorPane();
+
+        //~ Constructors 
==========================================================
+
+        /**
+         * Creates a new VisualsPrefPanel object.
+         */
+        private VisualsPrefPanel() {
+            super("Visuals");
+            initPanelComponents();
+            setupListeners();
+        }
 
-      JPanel customPanel = new JPanel();
-      customPanel.setLayout(new BoxLayout(customPanel, BoxLayout.X_AXIS));
-      customPanel.add(rdCustom);
-      customPanel.add(customFormatText);
-      customPanel.setAlignmentX(Component.LEFT_ALIGNMENT);      
+        //~ Methods 
===============================================================
+
+        /**
+         * DOCUMENT ME!
+         */
+        private void initPanelComponents() {
+            
JTextComponentFormatter.applySystemFontAndSize(clearTableExpression);
+            setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
+            toolTips.setAlignmentX(Component.LEFT_ALIGNMENT);
+            thumbnailBarToolTips.setAlignmentX(Component.LEFT_ALIGNMENT);
+            detailPanelVisible.setAlignmentX(Component.LEFT_ALIGNMENT);
+            loggerTreePanel.setAlignmentX(Component.LEFT_ALIGNMENT);
+            scrollToBottom.setAlignmentX(Component.LEFT_ALIGNMENT);
+            showMillisDeltaAsGap.setAlignmentX(Component.LEFT_ALIGNMENT);
+            add(toolTips);
+            add(thumbnailBarToolTips);
+            add(detailPanelVisible);
+            add(loggerTreePanel);
+            add(scrollToBottom);
+            add(wrapMessage);
+            add(highlightSearchMatchText);
+            add(searchResultsVisible);
+            add(showMillisDeltaAsGap);
+            JPanel clearPanel = new JPanel(new BorderLayout());
+            clearPanel.setAlignmentX(Component.LEFT_ALIGNMENT);
+            clearPanel.add(new JLabel("Clear all events if expression 
matches"), BorderLayout.NORTH);
+            
clearTableExpression.setText(preferenceModel.getClearTableExpression());
+            clearTableExpression.setPreferredSize(new Dimension(300, 50));
+            JPanel clearTableScrollPanel = new JPanel(new BorderLayout());
+            clearTableScrollPanel.add(new JScrollPane(clearTableExpression), 
BorderLayout.NORTH);
+            clearPanel.add(clearTableScrollPanel, BorderLayout.CENTER);
+            add(clearPanel);
+
+            toolTips.setSelected(preferenceModel.isToolTips());
+            
thumbnailBarToolTips.setSelected(preferenceModel.isThumbnailBarToolTips());
+            
detailPanelVisible.setSelected(preferenceModel.isDetailPaneVisible());
+            
searchResultsVisible.setSelected(preferenceModel.isSearchResultsVisible());
+            
loggerTreePanel.setSelected(preferenceModel.isLogTreePanelVisible());
+        }
 
-      dateFormatPanel.add(customPanel);
-      dateFormatPanel.add(Box.createVerticalStrut(5));
+        /**
+         * DOCUMENT ME!
+         */
+        private void setupListeners() {
+            ActionListener wrapMessageListener = e -> 
preferenceModel.setWrapMessage(wrapMessage.isSelected());
 
-      JLabel dateFormatLabel = new JLabel("Time zone of events (or blank for 
local time zone");
-      dateFormatPanel.add(dateFormatLabel);
+            wrapMessage.addActionListener(wrapMessageListener);
 
-      timeZone.setMaximumSize(timeZone.getPreferredSize());
-      dateFormatPanel.add(Box.createVerticalStrut(5));
-      dateFormatPanel.add(timeZone);
-      
-      add(dateFormatPanel);
+            ActionListener searchResultsVisibleListener = e -> 
preferenceModel.setSearchResultsVisible(searchResultsVisible.isSelected());
 
-      JPanel levelFormatPanel = new JPanel();
-      levelFormatPanel.setLayout(
-        new BoxLayout(levelFormatPanel, BoxLayout.Y_AXIS));
-      levelFormatPanel.setBorder(
-        BorderFactory.createTitledBorder(
-          BorderFactory.createEtchedBorder(), "Level"));
-      levelFormatPanel.setAlignmentX(Component.LEFT_ALIGNMENT);
+            
searchResultsVisible.addActionListener(searchResultsVisibleListener);
 
-      ButtonGroup bgLevel = new ButtonGroup();
-      bgLevel.add(rdLevelIcons);
-      bgLevel.add(rdLevelText);
+            ActionListener highlightSearchMatchTextListener = e -> 
preferenceModel.setHighlightSearchMatchText(highlightSearchMatchText.isSelected());
 
-      rdLevelIcons.setSelected(preferenceModel.isLevelIcons());
+            
highlightSearchMatchText.addActionListener(highlightSearchMatchTextListener);
 
-      levelFormatPanel.add(rdLevelIcons);
-      levelFormatPanel.add(rdLevelText);
+            preferenceModel.addPropertyChangeListener(
+                "wrapMessage", evt -> {
+                    boolean value = (Boolean) evt.getNewValue();
+                    wrapMessage.setSelected(value);
+                });
 
-      add(levelFormatPanel);
+            preferenceModel.addPropertyChangeListener(
+                "searchResultsVisible", evt -> {
+                    boolean value = (Boolean) evt.getNewValue();
+                    searchResultsVisible.setSelected(value);
+                });
 
-      JPanel loggerFormatPanel = new JPanel();
-      loggerFormatPanel.setLayout(
-        new BoxLayout(loggerFormatPanel, BoxLayout.Y_AXIS));
-      loggerFormatPanel.setBorder(
-        BorderFactory.createTitledBorder(
-          BorderFactory.createEtchedBorder(), "Logger"));
-      loggerFormatPanel.setAlignmentX(Component.LEFT_ALIGNMENT);
+            preferenceModel.addPropertyChangeListener(
+                "highlightSearchMatchText", evt -> {
+                    boolean value = (Boolean) evt.getNewValue();
+                    highlightSearchMatchText.setSelected(value);
+                });
 
-      loggerFormatPanel.add(Box.createVerticalStrut(3));
+            toolTips.addActionListener(e -> 
preferenceModel.setToolTips(toolTips.isSelected()));
 
-      final JLabel precisionLabel =
-        new JLabel("Number of package levels to hide (or blank to display full 
logger)");
+            thumbnailBarToolTips.addActionListener(e -> 
preferenceModel.setThumbnailBarToolTips(thumbnailBarToolTips.isSelected()));
 
-      loggerFormatPanel.add(precisionLabel);
-      loggerFormatPanel.add(Box.createVerticalStrut(5));
+            getOkButton().addActionListener(e -> 
preferenceModel.setClearTableExpression(clearTableExpression.getText().trim()));
 
-      loggerPrecision.setMaximumSize(loggerPrecision.getPreferredSize());
-      loggerFormatPanel.add(loggerPrecision);
+            preferenceModel.addPropertyChangeListener(
+                "toolTips", evt -> {
+                    boolean value = (Boolean) evt.getNewValue();
+                    toolTips.setSelected(value);
+                });
 
-      add(loggerFormatPanel);
-    }
+            preferenceModel.addPropertyChangeListener(
+                "thumbnailBarToolTips", evt -> {
+                    boolean value = (Boolean) evt.getNewValue();
+                    thumbnailBarToolTips.setSelected(value);
+                });
 
-    /*
-     * Restore text fields to current model values
-     */
-    private void reset() {
-
-       if (preferenceModel.isCustomDateFormat()) {
-               
customFormatText.setText(preferenceModel.getDateFormatPattern());
-       } else {
-               if (rdLast != null) {
-                       rdLast.setSelected(true);
-               }
-               customFormatText.setEnabled(false);
-       }
-       
-       loggerPrecision.setText(preferenceModel.getLoggerPrecision());
-       timeZone.setText(preferenceModel.getTimeZone());
-    }
+            detailPanelVisible.addActionListener(e -> 
preferenceModel.setDetailPaneVisible(detailPanelVisible.isSelected()));
 
-    /*
-     * Commit text fields to model
-     */
-    private void commit() {
-       if (rdCustom.isSelected()) {
-               
preferenceModel.setDateFormatPattern(customFormatText.getText());
-       }
-       preferenceModel.setLoggerPrecision(loggerPrecision.getText());
-       preferenceModel.setTimeZone(timeZone.getText());
-    }
+            preferenceModel.addPropertyChangeListener(
+                "detailPaneVisible", evt -> {
+                    boolean value = (Boolean) evt.getNewValue();
+                    detailPanelVisible.setSelected(value);
+                });
 
-    /**
-     * DOCUMENT ME!
-    */
-    private void setupListeners()
-    {
-      getOkButton().addActionListener(evt -> commit());
-      
-      getCancelButton().addActionListener(evt -> reset());
-         
-         rdCustom.addActionListener(e -> {
-            customFormatText.setEnabled(rdCustom.isSelected());
-            customFormatText.grabFocus();
-          });
-
-      //a second?? listener for dateformatpattern
-      preferenceModel.addPropertyChangeListener(
-        "dateFormatPattern", evt -> {
-          /**
-           * we need to make sure we are not reacting to the user typing, so 
only do this
-           * if the text box is not the same as the model
-           */
-          if (
-            preferenceModel.isCustomDateFormat()
-              && !customFormatText.getText().equals(
-                evt.getNewValue().toString()))
-          {
-            customFormatText.setText(preferenceModel.getDateFormatPattern());
-            rdCustom.setSelected(true);
-            customFormatText.setEnabled(true);
-          }
-          else
-          {
-            rdCustom.setSelected(false);
-          }
-        });
-
-      rdISO.addActionListener(e -> {
-        preferenceModel.setDateFormatPattern("ISO8601");
-        customFormatText.setEnabled(rdCustom.isSelected());
-        rdLast = rdISO;
-      });
-      preferenceModel.addPropertyChangeListener(
-        "dateFormatPattern", evt -> {
-          rdISO.setSelected(preferenceModel.isUseISO8601Format());
-          rdLast = rdISO;
-        });
-      preferenceModel.addPropertyChangeListener(
-          "dateFormatTimeZone", evt -> 
timeZone.setText(preferenceModel.getTimeZone())
-      );
-
-      ActionListener levelIconListener = e -> 
preferenceModel.setLevelIcons(rdLevelIcons.isSelected());
-
-      rdLevelIcons.addActionListener(levelIconListener);
-      rdLevelText.addActionListener(levelIconListener);
-
-      preferenceModel.addPropertyChangeListener(
-        "levelIcons", evt -> {
-          boolean value = (Boolean) evt.getNewValue();
-          rdLevelIcons.setSelected(value);
-          rdLevelText.setSelected(!value);
-        });
-    }
-  }
-
-  /**
-   * DOCUMENT ME!
-   *
-   * @author $author$
-   * @version $Revision$, $Date$
-   *
-   * @author psmith
-   *
-   */
-  private class VisualsPrefPanel extends BasicPrefPanel
-  {
-    //~ Instance fields =======================================================
-
-    private final JCheckBox detailPanelVisible =
-      new JCheckBox("Show Event Detail panel");
-
-    private final JCheckBox loggerTreePanel =
-      new JCheckBox("Show Logger Tree");
-    private final JCheckBox wrapMessage = new JCheckBox("Wrap message field 
(display multi-line rows) ");
-    private final JCheckBox searchResultsVisible = new JCheckBox("Display find 
results in details panel ");
-    private final JCheckBox highlightSearchMatchText = new 
JCheckBox("Highlight find match text ");
-    private final JCheckBox scrollToBottom =
-      new JCheckBox("Scroll to bottom (view tracks with new events)");
-    private final JCheckBox showMillisDeltaAsGap =
-      new JCheckBox("Display timestamp delta between events as row gap");
-    private final JCheckBox toolTips =
-      new JCheckBox("Show Event Detail Tooltips");
-    private final JCheckBox thumbnailBarToolTips =
-      new JCheckBox("Show Thumbnail Bar Tooltips");
-    private final JEditorPane clearTableExpression = new JEditorPane();
-
-    //~ Constructors ==========================================================
+            scrollToBottom.addActionListener(e -> 
preferenceModel.setScrollToBottom(scrollToBottom.isSelected()));
 
-    /**
-     * Creates a new VisualsPrefPanel object.
-    */
-    private VisualsPrefPanel()
-    {
-      super("Visuals");
-      initPanelComponents();
-      setupListeners();
-    }
+            showMillisDeltaAsGap.addActionListener(e -> 
preferenceModel.setShowMillisDeltaAsGap(showMillisDeltaAsGap.isSelected()));
 
-    //~ Methods ===============================================================
+            preferenceModel.addPropertyChangeListener("showMillisDeltaAsGap", 
evt -> {
+                boolean value = (Boolean) evt.getNewValue();
+                showMillisDeltaAsGap.setSelected(value);
+            });
+            preferenceModel.addPropertyChangeListener(
+                "scrollToBottom", evt -> {
+                    boolean value = (Boolean) evt.getNewValue();
+                    scrollToBottom.setSelected(value);
+                });
 
-    /**
-     * DOCUMENT ME!
-    */
-    private void initPanelComponents()
-    {
-      JTextComponentFormatter.applySystemFontAndSize(clearTableExpression);
-      setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
-      toolTips.setAlignmentX(Component.LEFT_ALIGNMENT);
-      thumbnailBarToolTips.setAlignmentX(Component.LEFT_ALIGNMENT);
-      detailPanelVisible.setAlignmentX(Component.LEFT_ALIGNMENT);
-      loggerTreePanel.setAlignmentX(Component.LEFT_ALIGNMENT);
-      scrollToBottom.setAlignmentX(Component.LEFT_ALIGNMENT);
-      showMillisDeltaAsGap.setAlignmentX(Component.LEFT_ALIGNMENT);
-      add(toolTips);
-      add(thumbnailBarToolTips);
-      add(detailPanelVisible);
-      add(loggerTreePanel);
-      add(scrollToBottom);
-      add(wrapMessage);
-      add(highlightSearchMatchText);
-      add(searchResultsVisible);
-      add(showMillisDeltaAsGap);
-      JPanel clearPanel = new JPanel(new BorderLayout());
-      clearPanel.setAlignmentX(Component.LEFT_ALIGNMENT);
-      clearPanel.add(new JLabel("Clear all events if expression matches"), 
BorderLayout.NORTH);
-      clearTableExpression.setText(preferenceModel.getClearTableExpression());
-      clearTableExpression.setPreferredSize(new Dimension(300, 50));
-      JPanel clearTableScrollPanel = new JPanel(new BorderLayout());
-      clearTableScrollPanel.add(new JScrollPane(clearTableExpression), 
BorderLayout.NORTH);
-      clearPanel.add(clearTableScrollPanel, BorderLayout.CENTER);
-      add(clearPanel);
-
-      toolTips.setSelected(preferenceModel.isToolTips());
-      
thumbnailBarToolTips.setSelected(preferenceModel.isThumbnailBarToolTips());
-      detailPanelVisible.setSelected(preferenceModel.isDetailPaneVisible());
-      
searchResultsVisible.setSelected(preferenceModel.isSearchResultsVisible());
-      loggerTreePanel.setSelected(preferenceModel.isLogTreePanelVisible());
-    }
+            loggerTreePanel.addActionListener(e -> 
preferenceModel.setLogTreePanelVisible(loggerTreePanel.isSelected()));
 
-    /**
-     * DOCUMENT ME!
-    */
-    private void setupListeners()
-    {
-        ActionListener wrapMessageListener = e -> 
preferenceModel.setWrapMessage(wrapMessage.isSelected());
-
-        wrapMessage.addActionListener(wrapMessageListener);
-
-        ActionListener searchResultsVisibleListener = e -> 
preferenceModel.setSearchResultsVisible(searchResultsVisible.isSelected());
-
-        searchResultsVisible.addActionListener(searchResultsVisibleListener);
-
-        ActionListener highlightSearchMatchTextListener = e -> 
preferenceModel.setHighlightSearchMatchText(highlightSearchMatchText.isSelected());
-
-        
highlightSearchMatchText.addActionListener(highlightSearchMatchTextListener);
-
-        preferenceModel.addPropertyChangeListener(
-          "wrapMessage", evt -> {
-            boolean value = (Boolean) evt.getNewValue();
-            wrapMessage.setSelected(value);
-          });
-
-      preferenceModel.addPropertyChangeListener(
-        "searchResultsVisible", evt -> {
-          boolean value = (Boolean) evt.getNewValue();
-          searchResultsVisible.setSelected(value);
-        });
-
-        preferenceModel.addPropertyChangeListener(
-          "highlightSearchMatchText", evt -> {
-            boolean value = (Boolean) evt.getNewValue();
-            highlightSearchMatchText.setSelected(value);
-          });
-
-      toolTips.addActionListener(e -> 
preferenceModel.setToolTips(toolTips.isSelected()));
-
-      thumbnailBarToolTips.addActionListener(e -> 
preferenceModel.setThumbnailBarToolTips(thumbnailBarToolTips.isSelected()));
-
-      getOkButton().addActionListener(e -> 
preferenceModel.setClearTableExpression(clearTableExpression.getText().trim()));
-
-      preferenceModel.addPropertyChangeListener(
-        "toolTips", evt -> {
-          boolean value = (Boolean) evt.getNewValue();
-          toolTips.setSelected(value);
-        });
-
-    preferenceModel.addPropertyChangeListener(
-      "thumbnailBarToolTips", evt -> {
-        boolean value = (Boolean) evt.getNewValue();
-        thumbnailBarToolTips.setSelected(value);
-      });
-
-      detailPanelVisible.addActionListener(e -> 
preferenceModel.setDetailPaneVisible(detailPanelVisible.isSelected()));
-
-      preferenceModel.addPropertyChangeListener(
-        "detailPaneVisible", evt -> {
-          boolean value = (Boolean) evt.getNewValue();
-          detailPanelVisible.setSelected(value);
-        });
-
-      scrollToBottom.addActionListener(e -> 
preferenceModel.setScrollToBottom(scrollToBottom.isSelected()));
-
-      showMillisDeltaAsGap.addActionListener(e -> 
preferenceModel.setShowMillisDeltaAsGap(showMillisDeltaAsGap.isSelected()));
-
-      preferenceModel.addPropertyChangeListener("showMillisDeltaAsGap", evt -> 
{
-          boolean value = (Boolean) evt.getNewValue();
-          showMillisDeltaAsGap.setSelected(value);
-      });
-      preferenceModel.addPropertyChangeListener(
-        "scrollToBottom", evt -> {
-          boolean value = (Boolean) evt.getNewValue();
-          scrollToBottom.setSelected(value);
-        });
-
-      loggerTreePanel.addActionListener(e -> 
preferenceModel.setLogTreePanelVisible(loggerTreePanel.isSelected()));
-
-      preferenceModel.addPropertyChangeListener(
-        "logTreePanelVisible", evt -> {
-          boolean value = (Boolean) evt.getNewValue();
-          loggerTreePanel.setSelected(value);
-        });
-
-      preferenceModel.addPropertyChangeListener("columns", evt -> {
-      List cols = (List)evt.getNewValue();
-for (Object col1 : cols) {
-TableColumn col = (TableColumn) col1;
-Enumeration enumeration = columnListModel.elements();
-boolean found = false;
-while (enumeration.hasMoreElements()) {
-TableColumn thisCol = (TableColumn) enumeration.nextElement();
-if (thisCol.getHeaderValue().equals(col.getHeaderValue())) {
-found = true;
-}
-}
-if (!found) {
-columnListModel.addElement(col);
-columnListModel.fireContentsChanged();
-}
-}
-});
+            preferenceModel.addPropertyChangeListener(
+                "logTreePanelVisible", evt -> {
+                    boolean value = (Boolean) evt.getNewValue();
+                    loggerTreePanel.setSelected(value);
+                });
 
-        preferenceModel.addPropertyChangeListener(
+            preferenceModel.addPropertyChangeListener("columns", evt -> {
+                List cols = (List) evt.getNewValue();
+                for (Object col1 : cols) {
+                    TableColumn col = (TableColumn) col1;
+                    Enumeration enumeration = columnListModel.elements();
+                    boolean found = false;
+                    while (enumeration.hasMoreElements()) {
+                        TableColumn thisCol = (TableColumn) 
enumeration.nextElement();
+                        if 
(thisCol.getHeaderValue().equals(col.getHeaderValue())) {
+                            found = true;
+                        }
+                    }
+                    if (!found) {
+                        columnListModel.addElement(col);
+                        columnListModel.fireContentsChanged();
+                    }
+                }
+            });
+
+            preferenceModel.addPropertyChangeListener(
                 "visibleColumns", evt -> 
columnListModel.fireContentsChanged());
 
-        preferenceModel.addPropertyChangeListener("clearTableExpression", evt 
-> 
clearTableExpression.setText(((LogPanelPreferenceModel)evt.getSource()).getClearTableExpression()));
+            preferenceModel.addPropertyChangeListener("clearTableExpression", 
evt -> clearTableExpression.setText(((LogPanelPreferenceModel) 
evt.getSource()).getClearTableExpression()));
+        }
     }
-  }
 }

Reply via email to