Author: sdeboy
Date: Tue Feb  7 00:01:17 2006
New Revision: 375537

URL: http://svn.apache.org/viewcvs?rev=375537&view=rev
Log:
- Welcome tab now default displayed tab instead of dnd tab
- persist column order/visible columns/widths
- hide/show event property columns
- persist detail pane format
- persist logger tree width/detail pane height
- persist undocked location/size
- log panel preference model now updates dynamically (use ok/cancel to commit 
text field changes)
 (a bit of duplication in the persistent state, but we nothing that can't be 
improved)

NOTE: The mechanism and format used to persist settings in Chainsaw is changing 
significantly with this release, and is subject to change during this alpha 
phase.  If you are experiencing problems displaying events in Chainsaw, please 
delete everything in the $user.dir/.chainsaw directory.

Modified:
    
logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/CheckListCellRenderer.java
    logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/LogPanel.java
    
logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/LogPanelPreferenceModel.java
    
logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/LogPanelPreferencePanel.java
    logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/LogUI.java
    
logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/help/release-notes.html
    
logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/version/VersionManager.java
    
logging/chainsaw/trunk/tests/org/apache/log4j/chainsaw/LogPanelPreferenceModelTest.java

Modified: 
logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/CheckListCellRenderer.java
URL: 
http://svn.apache.org/viewcvs/logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/CheckListCellRenderer.java?rev=375537&r1=375536&r2=375537&view=diff
==============================================================================
--- 
logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/CheckListCellRenderer.java
 (original)
+++ 
logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/CheckListCellRenderer.java
 Tue Feb  7 00:01:17 2006
@@ -10,6 +10,7 @@
 import javax.swing.ListCellRenderer;
 import javax.swing.UIManager;
 import javax.swing.border.Border;
+import javax.swing.table.TableColumn;
 
 
 /**
@@ -42,7 +43,7 @@
   public Component getListCellRendererComponent(
     JList list, Object value, int index, boolean isSelected,
     boolean cellHasFocus) {
-    setText(value.toString());
+         setText(((TableColumn)value).getHeaderValue().toString());
     setBackground(
       isSelected ? list.getSelectionBackground() : list.getBackground());
     setForeground(

Modified: 
logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/LogPanel.java
URL: 
http://svn.apache.org/viewcvs/logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/LogPanel.java?rev=375537&r1=375536&r2=375537&view=diff
==============================================================================
--- logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/LogPanel.java 
(original)
+++ logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/LogPanel.java Tue 
Feb  7 00:01:17 2006
@@ -64,7 +64,6 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 import java.util.StringTokenizer;
 import java.util.Vector;
 
@@ -111,7 +110,6 @@
 import javax.swing.table.TableColumnModel;
 import javax.swing.text.Document;
 
-import org.apache.log4j.Layout;
 import org.apache.log4j.LogManager;
 import org.apache.log4j.Logger;
 import org.apache.log4j.PatternLayout;
@@ -218,7 +216,7 @@
   private final FilterModel filterModel = new FilterModel();
   private final RuleColorizer colorizer = new RuleColorizer();
   private final RuleMediator ruleMediator = new RuleMediator();
-  private Layout detailLayout = new EventDetailLayout();
+  private EventDetailLayout detailLayout = new EventDetailLayout();
   private double lastDetailPanelSplitLocation = DEFAULT_DETAIL_SPLIT_LOCATION;
   private double lastLogTreePanelSplitLocation =
     DEFAULT_LOG_TREE_SPLIT_LOCATION;
@@ -438,7 +436,7 @@
           }
         }
       });
-
+    
     preferenceModel.addPropertyChangeListener(
       "toolTips",
       new PropertyChangeListener() {
@@ -451,44 +449,17 @@
     preferenceModel.addPropertyChangeListener(
       "visibleColumns",
       new PropertyChangeListener() {
-        public void propertyChange(PropertyChangeEvent evt) {
-          TableColumnModel columnModel = table.getColumnModel();
-
-          for (int i = 0; i < columnModel.getColumnCount(); i++) {
-            TableColumn column = columnModel.getColumn(i);
-
-            if (
-              !preferenceModel.isColumnVisible(
-                  column.getHeaderValue().toString())) {
-              columnModel.removeColumn(column);
-            }
-          }
-
-          Set columnSet = new HashSet();
-          Enumeration enumeration = columnModel.getColumns();
-
-          while (enumeration.hasMoreElements()) {
-            TableColumn column = (TableColumn) enumeration.nextElement();
-
-            columnSet.add(column.getHeaderValue());
-          }
-
-          for (
-            Iterator iter = ChainsawColumns.getColumnsNames().iterator();
-              iter.hasNext();) {
-            String column = (String) iter.next();
-
-            if (
-              preferenceModel.isColumnVisible(column)
-                && !columnSet.contains(column)) {
-              TableColumn newCol =
-                new TableColumn(
-                  ChainsawColumns.getColumnsNames().indexOf(column));
-              newCol.setHeaderValue(column);
-              columnModel.addColumn(newCol);
-            }
-          }
-        }
+       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 (Iterator iter = 
preferenceModel.getVisibleColumnOrder().iterator();iter.hasNext();) {
+                       TableColumn c = (TableColumn)iter.next();
+                       columnModel.addColumn(c);
+               }
+       }
       });
 
     PropertyChangeListener datePrefsChangeListener =
@@ -504,8 +475,13 @@
           if (model.isUseISO8601Format()) {
             renderer.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));
+                       }
           }
 
           table.tableChanged(new TableModelEvent(tableModel));
@@ -836,15 +812,27 @@
      */
     tableModel.addNewKeyListener(
       new NewKeyListener() {
-        public void newKeyAdded(NewKeyEvent e) {
+        public void newKeyAdded(final NewKeyEvent e) {
+               SwingUtilities.invokeLater(new Runnable() {
+                       public void run() {
            // 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
-            if(table.getColumn(e.getKey())!=null){
+            //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
+               
+               try {
+               if(table.getColumn(e.getKey())!=null){
                 return;
-            }
+            } 
+               } catch (IllegalArgumentException iae) {}
           TableColumn col = new TableColumn(e.getNewModelIndex());
           col.setHeaderValue(e.getKey());
-          
-          table.addColumn(col);
+
+          if (preferenceModel.addColumn(col)) {
+                 table.addColumn(col);
+                 preferenceModel.setColumnVisible(e.getKey().toString(), true);
+          }
+                       }
+               });
         }
       });
 
@@ -1409,7 +1397,7 @@
       detailPaneUpdater.setSelectedRow(table.getSelectedRow());
     }
   }
-
+  
   /**
    * Load settings from the panel preference model
    *
@@ -1424,38 +1412,61 @@
 
         if (xmlFile.exists()) {
             XStream stream = buildXStreamForLogPanelPreference();
+            ObjectInputStream in = null;
             try {
-                LogPanelPreferenceModel storedPrefs = 
(LogPanelPreferenceModel) stream
-                        .fromXML(new FileReader(xmlFile));
+               FileReader r = new FileReader(xmlFile);
+               in = stream.createObjectInputStream(r);
+               
+                LogPanelPreferenceModel storedPrefs = 
(LogPanelPreferenceModel)in.readObject();
                 preferenceModel.apply(storedPrefs);
+                TableColumnModel columnModel = table.getColumnModel();
+                //remove previous columns
+                while (columnModel.getColumnCount() > 0) {
+                       columnModel.removeColumn(columnModel.getColumn(0));
+                }
+                //add visible column order columns
+                for (Iterator iter = 
preferenceModel.getVisibleColumnOrder().iterator();iter.hasNext();) {
+                       TableColumn col = (TableColumn)iter.next();
+                       columnModel.addColumn(col);
+                }
+
+                try {
+                       //may be panel configs that don't have these values
+                lowerPanel.setDividerLocation(in.readInt());
+                nameTreeAndMainPanelSplit.setDividerLocation(in.readInt());
+                detailLayout.setConversionPattern(in.readObject().toString());
+                Point p = (Point)in.readObject();
+                undockedFrame.setLocation(p.x, p.y);
+                undockedFrame.setSize(((Dimension)in.readObject()));
+                } catch (EOFException eof){}
             } catch (Exception e) {
                 e.printStackTrace();
                 // TODO need to log this..
+            } finally {
+               if (in != null) {
+                       try {
+                               in.close();
+                       } catch (IOException ioe) {}
+               }
             }
-        }
+        } else {
+            loadDefaultColumnSettings(event);
+               }
         
     logTreePanel.ignore(preferenceModel.getHiddenLoggers());
 
-    if (preferenceModel.getColumns().size()>0) {
-        loadColumnSettings();
-    } else {
-      loadDefaultColumnSettings(event);
-    }
-
     //first attempt to load encoded file
     File f2 =
       new File(
         SettingsManager.getInstance().getSettingsDirectory(), 
URLEncoder.encode(identifier) + COLORS_EXTENSION);
 
-    if (!f2.exists()) {
+    if (f2.exists()) {
+        loadColorSettings(f2);
+    } else {
         f2 =
             new File(
               SettingsManager.getInstance().getSettingsDirectory(), identifier 
+ COLORS_EXTENSION);
     }
-
-    if (f2.exists()) {
-      loadColorSettings(f2);
-    }
   }
 
   /**
@@ -1469,32 +1480,41 @@
       File xmlFile = new File(SettingsManager.getInstance()
               .getSettingsDirectory(), URLEncoder.encode(identifier) + ".xml");
 
-//      TODO  TableColumnData is no longer required, delete it
-    updatePreferenceModelColumnDetails();
     preferenceModel.setHiddenLoggers(new HashSet(logTreePanel.getHiddenSet()));
+    List visibleOrder = new ArrayList();
+    Enumeration cols = table.getColumnModel().getColumns();
+    while (cols.hasMoreElements()) {
+       TableColumn c = (TableColumn)cols.nextElement();
+       visibleOrder.add(c);
+    }
+    preferenceModel.setVisibleColumnOrder(visibleOrder);
     
     XStream stream = buildXStreamForLogPanelPreference();
+    ObjectOutputStream s = null;
     try {
-        stream.toXML(preferenceModel, new FileWriter(xmlFile));
+       FileWriter w = new FileWriter(xmlFile);
+       s = stream.createObjectOutputStream(w);
+       s.writeObject(preferenceModel);
+       s.writeInt(lowerPanel.getDividerLocation());
+       s.writeInt(nameTreeAndMainPanelSplit.getDividerLocation());
+       s.writeObject(detailLayout.getConversionPattern());
+       s.writeObject(undockedFrame.getLocation());
+       s.writeObject(undockedFrame.getSize());
     } catch (Exception ex) {
         ex.printStackTrace();
         // TODO need to log this..
+    } finally {
+       if (s != null) {
+               try {
+                       s.close();
+               } catch (IOException ioe) {}
+       }
     }
 
 //    TODO colour settings need to be saved
     saveColorSettings();
   }
 
-    private void updatePreferenceModelColumnDetails() {
-        preferenceModel.clearColumns();
-        for (int i = 0; i < table.getColumnModel().getColumnCount(); i++) {
-    
-            TableColumn c = table.getColumnModel().getColumn(i);
-    
-            preferenceModel.addColumn(c);
-        }
-    }
-    
     private XStream buildXStreamForLogPanelPreference() {
         XStream stream = new XStream(new DomDriver());
         stream.registerConverter(new TableColumnConverter());
@@ -1505,7 +1525,6 @@
      * Display the panel preferences frame
      */
   void showPreferences() {
-    preferencesPanel.updateModel();
     preferencesFrame.setVisible(true);
   }
 
@@ -1603,9 +1622,6 @@
     externalPanel.add(undockedToolbar, BorderLayout.NORTH);
     externalPanel.add(nameTreeAndMainPanelSplit, BorderLayout.CENTER);
     externalPanel.setDocked(false);
-    undockedFrame.setSize(getSize());
-
-    undockedFrame.setLocation(getBounds().x, getBounds().y);
 
     undockedFrame.setVisible(true);
     dockingAction.putValue(Action.NAME, "Dock");
@@ -2129,26 +2145,6 @@
   }
 
   /**
-   * Load panel column settings
-   */
-  private void loadColumnSettings() {
-      //only remove columns and add serialized columns if 
-      //at least one column was read from the file
-      TableColumnModel model = table.getColumnModel();
-
-      if (preferenceModel.getColumns().size() > 0) {
-        //remove columns from model - will be re-added in the correct order
-        for (int i = model.getColumnCount() - 1; i > -1; i--) {
-          model.removeColumn(model.getColumn(i));
-        }
-
-        for (Iterator iter = preferenceModel.getColumns().iterator(); 
iter.hasNext();) {
-          model.addColumn((TableColumn) iter.next());
-        }
-      }
-  }
-
-  /**
    * Load default column settings if no settings exist for this identifier
    *
    * @param event
@@ -2182,11 +2178,15 @@
         table.removeColumn(column);
       }
     }
-
+    preferenceModel.setDetailPaneVisible(event.asBoolean("detailPaneVisible"));
+    
preferenceModel.setLogTreePanelVisible(event.asBoolean("logTreePanelVisible"));
     //re-add columns to the table in the order provided from the list
     for (Iterator iter = sortedColumnList.iterator(); iter.hasNext();) {
       TableColumn element = (TableColumn) iter.next();
-      table.addColumn(element);
+      if (preferenceModel.addColumn(element)) {
+          table.addColumn(element);
+         preferenceModel.setColumnVisible(element.getHeaderValue().toString(), 
true);
+      }
     }
 
     String columnWidths = event.getSetting(TABLE_COLUMN_WIDTHS);
@@ -2213,13 +2213,10 @@
         logger.error("Error decoding a Table width", e);
       }
     }
+    undockedFrame.setSize(getSize());
+    undockedFrame.setLocation(getBounds().x, getBounds().y);
 
-    SwingUtilities.invokeLater(
-             new Runnable() {
-               public void run() {
-                 repaint();
-               }
-             });
+      repaint();
     }
 
   public JTextField getFindTextField() {
@@ -2474,9 +2471,6 @@
         if (
           (column.getModelIndex() + 1) == 
ChainsawColumns.INDEX_THROWABLE_COL_NAME) {
           column.setCellEditor(throwableRenderPanel);
-        }
-        if (column.getModelIndex() > 0) {
-            
preferenceModel.setColumnVisible(column.getHeaderValue().toString(), true);
         }
       }
     }

Modified: 
logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/LogPanelPreferenceModel.java
URL: 
http://svn.apache.org/viewcvs/logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/LogPanelPreferenceModel.java?rev=375537&r1=375536&r2=375537&view=diff
==============================================================================
--- 
logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/LogPanelPreferenceModel.java
 (original)
+++ 
logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/LogPanelPreferenceModel.java
 Tue Feb  7 00:01:17 2006
@@ -18,13 +18,9 @@
  */
 package org.apache.log4j.chainsaw;
 
-import org.apache.log4j.chainsaw.prefs.SettingsManager;
-
-import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
 import java.beans.PropertyChangeSupport;
 import java.io.Serializable;
-
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -33,10 +29,13 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
-import java.util.Set;
 
 import javax.swing.table.TableColumn;
 
+import org.apache.log4j.LogManager;
+import org.apache.log4j.Logger;
+import org.apache.log4j.chainsaw.prefs.SettingsManager;
+
 
 /**
  *  Used to encapsulate all the preferences for a given LogPanel
@@ -45,6 +44,7 @@
 public class LogPanelPreferenceModel implements Serializable{
   public static final String ISO8601 = "ISO8601";
   public static final Collection DATE_FORMATS;
+  private static final Logger logger = 
LogManager.getLogger(LogPanelPreferenceModel.class);
 
   static {
     Collection list = new ArrayList();
@@ -66,14 +66,15 @@
     new PropertyChangeSupport(this);
   private String dateFormatPattern = ISO8601;
   private boolean levelIcons;
-  private Set visibleColumns = new HashSet(ChainsawColumns.getColumnsNames());
+  private List allColumns = new ArrayList();
+  private List visibleColumns = new ArrayList();
+  private List visibleColumnOrder = new ArrayList();
   private boolean detailPaneVisible;
   private boolean toolTips;
   private boolean scrollToBottom;
   private boolean logTreePanelVisible;
   private String loggerPrecision = "";
 
-  private List columns = new ArrayList();
   private Collection hiddenLoggers = new HashSet();
   
   /**
@@ -86,39 +87,62 @@
    * @return
    */
   public List getColumns() {
-      return Collections.unmodifiableList(columns);
+      return Collections.unmodifiableList(allColumns);
+  }
+  
+  /**
+   * Returns an <b>unmodifiable</b> list of the visible columns.
+   * 
+   * The reason it is unmodifiable is to enforce the requirement that
+   * the List is actually unique columns.  IT _could_ be a set,
+   * but we need to maintain the order of insertion.
+   * 
+   * @return
+   */
+  public List getVisibleColumns() {
+      return Collections.unmodifiableList(visibleColumns);
   }
   
   public void clearColumns(){
-      columns.clear();
+      Object oldValue = this.allColumns;
+      allColumns = new ArrayList();
+      propertySupport.firePropertyChange("columns", oldValue, allColumns);
   }
   
-  public boolean addColumn(TableColumn column){
-      if(containsHeaderValue(column)){
-          return false;
-      }else{
-          return columns.add(column);
-      }
+  private TableColumn findColumnByHeader(List list, String header) {
+         for (Iterator iter = list.iterator();iter.hasNext();) {
+                 TableColumn c = (TableColumn)iter.next();
+                 if (c.getHeaderValue().equals(header)) {
+                         return c;
+                 }
+         }
+         return null;
   }
   
-  /**
-   * Quite an inefficient search mechanism to make sure we don't allow 
duplicate Column headers
-   * @param column
-   * @return
-   */
-  private boolean containsHeaderValue(TableColumn column) {
-      for (Iterator iter = columns.iterator(); iter.hasNext();) {
-        TableColumn c = (TableColumn) iter.next();
-        if(c.getHeaderValue().equals(column.getHeaderValue())){
-            return true;
-        }
-      }
-      return false;
+  public void setVisibleColumnOrder(List visibleColumnOrder) {
+         this.visibleColumnOrder = visibleColumnOrder;
   }
-
-  public void setColumns(List columns) {
-      Object oldValue = this.columns;
-      this.columns = columns;
+  
+  public List getVisibleColumnOrder() {
+         return visibleColumnOrder;
+  }
+  
+  public boolean addColumn(TableColumn column){
+         if (findColumnByHeader(allColumns, 
column.getHeaderValue().toString()) != null) {
+                 return false;
+         }
+         
+      Object oldValue = allColumns;
+      allColumns = new ArrayList(allColumns);
+      allColumns.add(column);
+      
+      propertySupport.firePropertyChange("columns", oldValue, allColumns);
+      return true;
+  }
+  
+  private void setColumns(List columns) {
+      Object oldValue = allColumns;
+      allColumns = new ArrayList(columns);
       propertySupport.firePropertyChange("columns", oldValue, columns);
   }
 
@@ -130,6 +154,12 @@
     return dateFormatPattern;
   }
 
+  public final void setDefaultDatePatternFormat() {
+           String oldVal = this.dateFormatPattern;
+           this.dateFormatPattern = ISO8601;
+           propertySupport.firePropertyChange(
+                     "dateFormatPattern", oldVal, this.dateFormatPattern);
+  }
   /**
    * @param dateFormatPattern
    */
@@ -188,38 +218,13 @@
     setScrollToBottom(model.isScrollToBottom());
     setDetailPaneVisible(model.isDetailPaneVisible());
     setLogTreePanelVisible(model.isLogTreePanelVisible());
+    setVisibleColumnOrder(model.getVisibleColumnOrder());
 
     // we have to copy the list, because getColumns() is unmodifiable
-    setColumns(new ArrayList(model.getColumns()));
-    setHiddenLoggers(model.getHiddenLoggers());
+    setColumns(model.getColumns());
     
-    /**
-     * First, iterate and ADD new columns, (this means notifications of adds 
go out first
-     * add to the end
-     */
-    for (Iterator iter = model.visibleColumns.iterator(); iter.hasNext();) {
-      String column = (String) iter.next();
-
-      if (!this.visibleColumns.contains(column)) {
-        setColumnVisible(column, true);
-      }
-    }
-
-    /**
-     * Now go through and apply removals
-     */
-    /**
-     * this copy is needed to stop ConcurrentModificationException
-     */
-    Set thisSet = new HashSet(this.visibleColumns);
-
-    for (Iterator iter = thisSet.iterator(); iter.hasNext();) {
-      String column = (String) iter.next();
-
-      if (!model.visibleColumns.contains(column)) {
-        setColumnVisible(column, false);
-      }
-    }
+    setVisibleColumns(model.getVisibleColumns());
+    setHiddenLoggers(model.getHiddenLoggers());
   }
 
   /**
@@ -270,31 +275,42 @@
    * @param columnName
    * @return column visible flag
    */
-  public boolean isColumnVisible(String columnName) {
-    return visibleColumns.contains(columnName);
+  public boolean isColumnVisible(TableColumn column) {
+         return (visibleColumns.contains(column));
   }
 
-  public void setColumnVisible(String columnName, boolean isVisible) {
-    boolean oldValue = visibleColumns.contains(columnName);
-    boolean newValue = isVisible;
+  private void setVisibleColumns(List visibleColumns) {
+      Object oldValue = new ArrayList();
+      this.visibleColumns = new ArrayList(visibleColumns);
+      
+      propertySupport.firePropertyChange("visibleColumns", oldValue, 
this.visibleColumns);
+  }
 
-    if (isVisible) {
-      visibleColumns.add(columnName);
-    } else {
-      visibleColumns.remove(columnName);
-    }
+  public void setColumnVisible(String columnName, boolean isVisible) {
+    boolean wasVisible = findColumnByHeader(visibleColumns, columnName) != 
null;
+    boolean newVisible = isVisible;
 
-    propertySupport.firePropertyChange(
-      new PropertyChangeEvent(
-        this, "visibleColumns", new Boolean(oldValue), new Boolean(newValue)));
+    //because we're a list and not a set, ensure we keep at most
+    //one entry for a tablecolumn
+    Object col = findColumnByHeader(allColumns, columnName);
+    if (newVisible && !wasVisible) {
+               visibleColumns.add(col);
+               visibleColumnOrder.add(col);
+           propertySupport.firePropertyChange("visibleColumns", new 
Boolean(newVisible), new Boolean(wasVisible));      
+       }
+    if (!newVisible && wasVisible) {
+               visibleColumns.remove(col);
+               visibleColumnOrder.remove(col);
+           propertySupport.firePropertyChange("visibleColumns", new 
Boolean(newVisible), new Boolean(wasVisible));      
+       }
   }
-
+  
   /**
    * Toggles the state between visible, non-visible for a particular Column 
name
    * @param column
    */
-  public void toggleColumn(String column) {
-    setColumnVisible(column, !isColumnVisible(column));
+  public void toggleColumn(TableColumn column) {
+    setColumnVisible(column.getHeaderValue().toString(), 
!isColumnVisible(column));
   }
 
   /**

Modified: 
logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/LogPanelPreferencePanel.java
URL: 
http://svn.apache.org/viewcvs/logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/LogPanelPreferencePanel.java?rev=375537&r1=375536&r2=375537&view=diff
==============================================================================
--- 
logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/LogPanelPreferencePanel.java
 (original)
+++ 
logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/LogPanelPreferencePanel.java
 Tue Feb  7 00:01:17 2006
@@ -26,6 +26,7 @@
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
 import java.util.Iterator;
+import java.util.List;
 
 import javax.swing.BorderFactory;
 import javax.swing.Box;
@@ -39,8 +40,7 @@
 import javax.swing.JRadioButton;
 import javax.swing.JScrollPane;
 import javax.swing.JTextField;
-import javax.swing.event.DocumentEvent;
-import javax.swing.event.DocumentListener;
+import javax.swing.table.TableColumn;
 import javax.swing.tree.DefaultMutableTreeNode;
 import javax.swing.tree.DefaultTreeModel;
 import javax.swing.tree.TreeModel;
@@ -58,26 +58,21 @@
 {
   //~ Instance fields =========================================================
 
-  private final LogPanelPreferenceModel committedPreferenceModel;
-  private JTextField loggerPrecision = new JTextField(5);
-  private final LogPanelPreferenceModel uncommittedPreferenceModel =
-    new LogPanelPreferenceModel();
-  private static final Logger logger = 
LogManager.getLogger(LogPanelPreferenceModel.class);
+  private final LogPanelPreferenceModel preferenceModel;
+  private final ModifiableListModel columnListModel = new 
ModifiableListModel();
+  private static final Logger logger = 
LogManager.getLogger(LogPanelPreferencePanel.class);
 
   //~ Constructors ============================================================
 
   public LogPanelPreferencePanel(LogPanelPreferenceModel model)
   {
-    this.committedPreferenceModel = model;
+    preferenceModel = model;
     initComponents();
 
     getOkButton().addActionListener(new ActionListener()
       {
         public void actionPerformed(ActionEvent e)
         {
-          uncommittedPreferenceModel.setLoggerPrecision(
-            loggerPrecision.getText());
-          committedPreferenceModel.apply(uncommittedPreferenceModel);
           hidePanel();
         }
       });
@@ -89,7 +84,7 @@
           hidePanel();
         }
       });
-  }
+    }
 
   //~ Methods =================================================================
 
@@ -124,16 +119,6 @@
     f.setVisible(true);
   }
 
-  /**
-   * Ensures this panels DISPLAYED model is in sync with
-   * the model initially passed to the constructor.
-   *
-   */
-  public void updateModel()
-  {
-    this.uncommittedPreferenceModel.apply(committedPreferenceModel);
-  }
-
   protected TreeModel createTreeModel()
   {
     final DefaultMutableTreeNode rootNode =
@@ -154,16 +139,6 @@
     return model;
   }
 
-  /**
-   * DOCUMENT ME!
-   *
-   * @return
-   */
-  private LogPanelPreferenceModel getModel()
-  {
-    return uncommittedPreferenceModel;
-  }
-
   //~ Inner Classes ===========================================================
 
   /**
@@ -194,36 +169,24 @@
       final JList columnList = new JList();
       columnList.setVisibleRowCount(10);
 
-      final ModifiableListModel listModel = new ModifiableListModel();
-
       for (
-        Iterator iter = ChainsawColumns.getColumnsNames().iterator();
+        Iterator iter = preferenceModel.getColumns().iterator();
           iter.hasNext();)
       {
-        String name = (String) iter.next();
-        listModel.addElement(name);
+        columnListModel.addElement(iter.next());
       }
 
-      columnList.setModel(listModel);
+      columnList.setModel(columnListModel);
 
       CheckListCellRenderer cellRenderer = new CheckListCellRenderer()
         {
           protected boolean isSelected(Object value)
           {
-            return LogPanelPreferencePanel.this.getModel().isColumnVisible(
-              value.toString());
+            return 
LogPanelPreferencePanel.this.preferenceModel.isColumnVisible((TableColumn)
+              value);
           }
         };
 
-      getModel().addPropertyChangeListener(
-        "visibleColumns", new PropertyChangeListener()
-        {
-          public void propertyChange(PropertyChangeEvent evt)
-          {
-            listModel.fireContentsChanged();
-          }
-        });
-
       columnList.addMouseListener(new MouseAdapter()
         {
           public void mouseClicked(MouseEvent e)
@@ -236,13 +199,10 @@
 
               if (i >= 0)
               {
-                Object column = listModel.get(i);
-                getModel().toggleColumn(column.toString());
+                Object column = columnListModel.get(i);
+                preferenceModel.toggleColumn(((TableColumn)column));
               }
             }
-            else
-            {
-            }
           }
         });
       columnList.setCellRenderer(cellRenderer);
@@ -262,12 +222,14 @@
     //~ Instance fields =======================================================
 
     private JTextField customFormatText = new JTextField("", 10);
+    private JTextField loggerPrecision = new JTextField(5);
     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 JRadioButton rdLevelIcons = new JRadioButton("Icons");
     private final JRadioButton rdLevelText = new JRadioButton("Text");
+    private JRadioButton rdLast;
 
     //~ Constructors ==========================================================
 
@@ -297,12 +259,12 @@
       customFormatText.setMinimumSize(customFormatText.getPreferredSize());
       customFormatText.setEnabled(false);
 
-      rdCustom.setSelected(getModel().isCustomDateFormat());
+      rdCustom.setSelected(preferenceModel.isCustomDateFormat());
 
       ButtonGroup bgDateFormat = new ButtonGroup();
 
       rdISO.setAlignmentX(0);
-      rdISO.setSelected(getModel().isUseISO8601Format());
+      rdISO.setSelected(preferenceModel.isUseISO8601Format());
 
       bgDateFormat.add(rdISO);
       dateFormatPanel.add(rdISO);
@@ -320,17 +282,21 @@
           {
             public void actionPerformed(ActionEvent e)
             {
-              getModel().setDateFormatPattern(format);
+              preferenceModel.setDateFormatPattern(format);
               customFormatText.setEnabled(rdCustom.isSelected());
+              rdLast = rdFormat;
             }
           });
-        getModel().addPropertyChangeListener(
+        //update based on external changes to dateformatpattern (column context
+        //menu)
+        preferenceModel.addPropertyChangeListener(
           "dateFormatPattern", new PropertyChangeListener()
           {
             public void propertyChange(PropertyChangeEvent evt)
             {
               rdFormat.setSelected(
-                getModel().getDateFormatPattern().equals(format));
+                preferenceModel.getDateFormatPattern().equals(format));
+              rdLast = rdFormat;
             }
           });
 
@@ -338,9 +304,9 @@
       }
 
       // add a custom date format
-      if (getModel().isCustomDateFormat())
+      if (preferenceModel.isCustomDateFormat())
       {
-        customFormatText.setText(getModel().getDateFormatPattern());
+        customFormatText.setText(preferenceModel.getDateFormatPattern());
         customFormatText.setEnabled(true);
       }
 
@@ -371,7 +337,7 @@
       bgLevel.add(rdLevelIcons);
       bgLevel.add(rdLevelText);
 
-      rdLevelIcons.setSelected(getModel().isLevelIcons());
+      rdLevelIcons.setSelected(preferenceModel.isLevelIcons());
 
       levelFormatPanel.add(rdLevelIcons);
       levelFormatPanel.add(rdLevelText);
@@ -404,21 +370,61 @@
       add(Box.createVerticalGlue());
     }
 
+    /*
+     * 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());
+    }
+
+    /*
+     * Commit text fields to model
+     */
+    private void commit() {
+       if (rdCustom.isSelected()) {
+               
preferenceModel.setDateFormatPattern(customFormatText.getText());
+       }
+       preferenceModel.setLoggerPrecision(loggerPrecision.getText());
+    }
+
     /**
      * DOCUMENT ME!
     */
     private void setupListeners()
     {
-      rdCustom.addActionListener(new ActionListener()
+      getOkButton().addActionListener(new ActionListener() {
+         public void actionPerformed(ActionEvent evt) {
+                 commit();
+         }
+      });
+      
+      getCancelButton().addActionListener(new ActionListener() {
+         public void actionPerformed(ActionEvent evt) {
+                 reset();
+         }
+      });
+         
+         rdCustom.addActionListener(new ActionListener()
         {
           public void actionPerformed(ActionEvent e)
           {
             customFormatText.setEnabled(rdCustom.isSelected());
-            customFormatText.setText("");
             customFormatText.grabFocus();
           }
         });
-      getModel().addPropertyChangeListener(
+
+      //a second?? listener for dateformatpattern
+      preferenceModel.addPropertyChangeListener(
         "dateFormatPattern", new PropertyChangeListener()
         {
           public void propertyChange(PropertyChangeEvent evt)
@@ -428,11 +434,11 @@
              * if the text box is not the same as the model
              */
             if (
-              getModel().isCustomDateFormat()
+              preferenceModel.isCustomDateFormat()
                 && !customFormatText.getText().equals(
                   evt.getNewValue().toString()))
             {
-              customFormatText.setText(getModel().getDateFormatPattern());
+              customFormatText.setText(preferenceModel.getDateFormatPattern());
               rdCustom.setSelected(true);
               customFormatText.setEnabled(true);
             }
@@ -447,40 +453,18 @@
         {
           public void actionPerformed(ActionEvent e)
           {
-            getModel().setDateFormatPattern("ISO8601");
+            preferenceModel.setDateFormatPattern("ISO8601");
             customFormatText.setEnabled(rdCustom.isSelected());
+            rdLast = rdISO;
           }
         });
-      getModel().addPropertyChangeListener(
+      preferenceModel.addPropertyChangeListener(
         "dateFormatPattern", new PropertyChangeListener()
         {
           public void propertyChange(PropertyChangeEvent evt)
           {
-            rdISO.setSelected(getModel().isUseISO8601Format());
-          }
-        });
-
-      customFormatText.getDocument().addDocumentListener(
-        new DocumentListener()
-        {
-          public void textChanged()
-          {
-            getModel().setDateFormatPattern(customFormatText.getText());
-          }
-
-          public void changedUpdate(DocumentEvent e)
-          {
-            textChanged();
-          }
-
-          public void insertUpdate(DocumentEvent e)
-          {
-            textChanged();
-          }
-
-          public void removeUpdate(DocumentEvent e)
-          {
-            textChanged();
+            rdISO.setSelected(preferenceModel.isUseISO8601Format());
+            rdLast = rdISO;
           }
         });
 
@@ -488,14 +472,14 @@
         {
           public void actionPerformed(ActionEvent e)
           {
-            getModel().setLevelIcons(rdLevelIcons.isSelected());
+            preferenceModel.setLevelIcons(rdLevelIcons.isSelected());
           }
         };
 
       rdLevelIcons.addActionListener(levelIconListener);
       rdLevelText.addActionListener(levelIconListener);
 
-      getModel().addPropertyChangeListener(
+      preferenceModel.addPropertyChangeListener(
         "levelIcons", new PropertyChangeListener()
         {
           public void propertyChange(PropertyChangeEvent evt)
@@ -557,9 +541,9 @@
       add(loggerTreePanel);
       add(scrollToBottom);
 
-      toolTips.setSelected(getModel().isToolTips());
-      detailPanelVisible.setSelected(getModel().isDetailPaneVisible());
-      loggerTreePanel.setSelected(getModel().isLogTreePanelVisible());
+      toolTips.setSelected(preferenceModel.isToolTips());
+      detailPanelVisible.setSelected(preferenceModel.isDetailPaneVisible());
+      loggerTreePanel.setSelected(preferenceModel.isLogTreePanelVisible());
     }
 
     /**
@@ -571,10 +555,10 @@
         {
           public void actionPerformed(ActionEvent e)
           {
-            getModel().setToolTips(toolTips.isSelected());
+            preferenceModel.setToolTips(toolTips.isSelected());
           }
         });
-      getModel().addPropertyChangeListener(
+      preferenceModel.addPropertyChangeListener(
         "toolTips", new PropertyChangeListener()
         {
           public void propertyChange(PropertyChangeEvent evt)
@@ -588,11 +572,11 @@
         {
           public void actionPerformed(ActionEvent e)
           {
-            getModel().setDetailPaneVisible(detailPanelVisible.isSelected());
+            
preferenceModel.setDetailPaneVisible(detailPanelVisible.isSelected());
           }
         });
 
-      getModel().addPropertyChangeListener(
+      preferenceModel.addPropertyChangeListener(
         "detailPaneVisible", new PropertyChangeListener()
         {
           public void propertyChange(PropertyChangeEvent evt)
@@ -606,11 +590,11 @@
         {
           public void actionPerformed(ActionEvent e)
           {
-            getModel().setScrollToBottom(scrollToBottom.isSelected());
+            preferenceModel.setScrollToBottom(scrollToBottom.isSelected());
           }
         });
 
-      getModel().addPropertyChangeListener(
+      preferenceModel.addPropertyChangeListener(
         "scrollToBottom", new PropertyChangeListener()
         {
           public void propertyChange(PropertyChangeEvent evt)
@@ -624,11 +608,11 @@
         {
           public void actionPerformed(ActionEvent e)
           {
-            getModel().setLogTreePanelVisible(loggerTreePanel.isSelected());
+            
preferenceModel.setLogTreePanelVisible(loggerTreePanel.isSelected());
           }
         });
 
-      getModel().addPropertyChangeListener(
+      preferenceModel.addPropertyChangeListener(
         "logTreePanelVisible", new PropertyChangeListener()
         {
           public void propertyChange(PropertyChangeEvent evt)
@@ -637,6 +621,31 @@
             loggerTreePanel.setSelected(value);
           }
         });
+
+      preferenceModel.addPropertyChangeListener("columns", new 
PropertyChangeListener() {
+               public void propertyChange(PropertyChangeEvent evt) {
+         List cols = (List)evt.getNewValue();
+            for (
+                       Iterator iter = cols.iterator();
+                         iter.hasNext();)
+                     {
+                       TableColumn col = (TableColumn) iter.next();
+                       if (!columnListModel.contains(col)) {
+                               columnListModel.addElement(col);
+                           columnListModel.fireContentsChanged();
+                       }
+                     }
+        }});
+
+        preferenceModel.addPropertyChangeListener(
+                "visibleColumns", new PropertyChangeListener()
+                {
+                  public void propertyChange(PropertyChangeEvent evt)
+                  {
+                    columnListModel.fireContentsChanged();
+                  }
+                });
+
     }
   }
 }

Modified: logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/LogUI.java
URL: 
http://svn.apache.org/viewcvs/logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/LogUI.java?rev=375537&r1=375536&r2=375537&view=diff
==============================================================================
--- logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/LogUI.java 
(original)
+++ logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/LogUI.java Tue 
Feb  7 00:01:17 2006
@@ -435,13 +435,16 @@
             
         }});
    
-    JLabel lbl  = new JLabel();
+    final JLabel lbl  = new JLabel();
     lbl.setEnabled(false);
-    String dndTitle = "Drag & Drop XML log files here";
-    getTabbedPane().addANewTab(dndTitle,lbl,null, "You can Drag & Drop XML log 
files onto the Tabbed Pane and they will be loaded into Chainsaw" );
-    getTabbedPane().setEnabledAt(getTabbedPane().indexOfTab(dndTitle), false);
-    ensureWelcomePanelVisible();
-    
+    final String dndTitle = "Drag & Drop XML log files here";
+    SwingUtilities.invokeLater(new Runnable() {
+       public void run() {
+           ensureWelcomePanelVisible();
+           getTabbedPane().addANewTab(dndTitle,lbl,null, "You can Drag & Drop 
XML log files onto the Tabbed Pane and they will be loaded into Chainsaw" );
+           getTabbedPane().setEnabledAt(getTabbedPane().indexOfTab(dndTitle), 
false);
+       }
+    });
     applicationPreferenceModelPanel = new 
ApplicationPreferenceModelPanel(applicationPreferenceModel);
     applicationPreferenceModelPanel.setOkCancelActionListener(
       new ActionListener() {
@@ -558,9 +561,6 @@
       if(!getTabbedPane().containsWelcomePanel()) {
           addWelcomePanel();
       }
-      if(getTabbedPane().getSelectedComponent()!=welcomePanel) {
-          
getTabbedPane().setSelectedIndex(getTabbedPane().indexOfComponent(welcomePanel));
-      }
   }
   
   /**
@@ -1374,6 +1374,7 @@
     getTabbedPane().insertTab(
       "Welcome",  new ImageIcon(ChainsawIcons.ABOUT),welcomePanel,
       "Welcome/Help", 0);
+    getTabbedPane().setSelectedComponent(welcomePanel);
   }
 
   void removeWelcomePanel() {
@@ -1831,13 +1832,13 @@
       /**
                * Let the new LogPanel receive this batch
                */
-      thisPanel.receiveEventBatch(ident, events);
 
       SwingUtilities.invokeLater(
         new Runnable() {
           public void run() {
             getTabbedPane().addANewTab(
               ident, thisPanel, new ImageIcon(ChainsawIcons.ANIM_RADIO_TOWER));
+            thisPanel.receiveEventBatch(ident, events);
           }
         });
 

Modified: 
logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/help/release-notes.html
URL: 
http://svn.apache.org/viewcvs/logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/help/release-notes.html?rev=375537&r1=375536&r2=375537&view=diff
==============================================================================
--- 
logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/help/release-notes.html
 (original)
+++ 
logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/help/release-notes.html
 Tue Feb  7 00:01:17 2006
@@ -9,6 +9,11 @@
 
 <h1>1.99.99</h2>
 
+<h2>06 January 2006</h2>
+<ul>
+<li>Save/load of custom event columns now supported, as well as column 
order.</li>
+</ul>
+<ul><b>NOTE:</b> The mechanism and format used to persist settings in Chainsaw 
is changing significantly with this release, and is subject to change during 
this alpha phase.  If you are experiencing problems displaying events in 
Chainsaw, please delete everything in the $user.dir/.chainsaw directory.</ul>
 <h2>21 November 2005</h2>
 <ul>
 <li>Revamped build system for easier maintenance and deployment of builds. 
Fixed issues with Commons VFS and Webstart.</li>

Modified: 
logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/version/VersionManager.java
URL: 
http://svn.apache.org/viewcvs/logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/version/VersionManager.java?rev=375537&r1=375536&r2=375537&view=diff
==============================================================================
--- 
logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/version/VersionManager.java
 (original)
+++ 
logging/chainsaw/trunk/src/java/org/apache/log4j/chainsaw/version/VersionManager.java
 Tue Feb  7 00:01:17 2006
@@ -10,7 +10,7 @@
 
     private static final VersionManager instance = new VersionManager();
     
-    private static final String VERSION_INFO = "1.99.99 (02 February 2006)";
+    private static final String VERSION_INFO = "1.99.99 (06 February 2006)";
     
     public static final VersionManager getInstance() {
         return instance;

Modified: 
logging/chainsaw/trunk/tests/org/apache/log4j/chainsaw/LogPanelPreferenceModelTest.java
URL: 
http://svn.apache.org/viewcvs/logging/chainsaw/trunk/tests/org/apache/log4j/chainsaw/LogPanelPreferenceModelTest.java?rev=375537&r1=375536&r2=375537&view=diff
==============================================================================
--- 
logging/chainsaw/trunk/tests/org/apache/log4j/chainsaw/LogPanelPreferenceModelTest.java
 (original)
+++ 
logging/chainsaw/trunk/tests/org/apache/log4j/chainsaw/LogPanelPreferenceModelTest.java
 Tue Feb  7 00:01:17 2006
@@ -17,7 +17,6 @@
          */
         
         model.setLevelIcons(!model.isLevelIcons());
-        
model.setColumnVisible(ChainsawColumns.getColumnName(ChainsawColumns.INDEX_LOGGER_COL_NAME),
 false);
         model.setDateFormatPattern("yyyyDDmm");
         model.setLoggerPrecision("FATAL");
         model.setLogTreePanelVisible(!model.isLogTreePanelVisible());
@@ -36,8 +35,6 @@
         assertEquals(model.isLogTreePanelVisible(), 
restored.isLogTreePanelVisible());
         assertEquals(model.isScrollToBottom(), restored.isScrollToBottom());
         assertEquals(model.isToolTips(), restored.isToolTips());
-        
-        
assertEquals(!model.isColumnVisible(ChainsawColumns.getColumnName(ChainsawColumns.INDEX_LOGGER_COL_NAME)),
 
restored.isColumnVisible(ChainsawColumns.getColumnName(ChainsawColumns.INDEX_LOGGER_COL_NAME)));
         
         
         



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to