psmith      2003/12/18 19:21:36

  Modified:    src/java/org/apache/log4j/chainsaw/receivers
                        ReceiversTreeModel.java
                        PluginPropertyEditorPanel.java ReceiversPanel.java
  Log:
  Plugin Property editor now getting close to being pretty usable.
  
  Can edit Text, Int, and Level properties.
  
  Revision  Changes    Path
  1.2       +19 -2     
jakarta-log4j/src/java/org/apache/log4j/chainsaw/receivers/ReceiversTreeModel.java
  
  Index: ReceiversTreeModel.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-log4j/src/java/org/apache/log4j/chainsaw/receivers/ReceiversTreeModel.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- ReceiversTreeModel.java   18 Dec 2003 21:41:45 -0000      1.1
  +++ ReceiversTreeModel.java   19 Dec 2003 03:21:36 -0000      1.2
  @@ -49,6 +49,8 @@
   
   package org.apache.log4j.chainsaw.receivers;
   
  +import java.beans.PropertyChangeEvent;
  +import java.beans.PropertyChangeListener;
   import java.util.Collection;
   import java.util.HashMap;
   import java.util.Iterator;
  @@ -59,6 +61,7 @@
   import javax.swing.tree.TreeNode;
   
   import org.apache.log4j.LogManager;
  +import org.apache.log4j.helpers.LogLog;
   import org.apache.log4j.net.SocketReceiver;
   import org.apache.log4j.plugins.Plugin;
   import org.apache.log4j.plugins.PluginEvent;
  @@ -106,9 +109,10 @@
         getRootNode().add(NoReceiversNode);
       } else {
         for (Iterator iter = receivers.iterator(); iter.hasNext();) {
  -        Receiver item = (Receiver) iter.next();
  -        DefaultMutableTreeNode receiverNode = new DefaultMutableTreeNode(item);
  +        final Receiver item = (Receiver) iter.next();
  +        final DefaultMutableTreeNode receiverNode = new 
DefaultMutableTreeNode(item);
   
  +        item.addPropertyChangeListener(creatPluginPropertyChangeListener(item, 
receiverNode));
           if (item instanceof SocketReceiver) {
             for (
               Iterator iterator =
  @@ -128,6 +132,18 @@
       return this;
     }
   
  +  private PropertyChangeListener creatPluginPropertyChangeListener(final Receiver 
item, final DefaultMutableTreeNode receiverNode)
  +  {
  +    return new PropertyChangeListener() {
  +
  +      public void propertyChange(PropertyChangeEvent evt)
  +      {
  +        LogLog.debug(evt.toString());
  +        ReceiversTreeModel.this.fireTreeNodesChanged(item, receiverNode.getPath(), 
null, null);
  +        
  +      }};
  +  }
  +
     /**
      * Ensure the Root node of this tree is updated with the latest information
      * and that listeners are notified.
  @@ -156,6 +172,7 @@
         Receiver receiver = (Receiver) e.getPlugin();
         DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(receiver);
         getRootNode().add(newNode);
  +      
receiver.addPropertyChangeListener(creatPluginPropertyChangeListener(receiver, 
newNode));
         nodesWereInserted(
           getRootNode(), new int[] { getRootNode().getIndex(newNode) });
         pluginNodeMap.put(receiver, newNode);
  
  
  
  1.2       +129 -6    
jakarta-log4j/src/java/org/apache/log4j/chainsaw/receivers/PluginPropertyEditorPanel.java
  
  Index: PluginPropertyEditorPanel.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-log4j/src/java/org/apache/log4j/chainsaw/receivers/PluginPropertyEditorPanel.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- PluginPropertyEditorPanel.java    18 Dec 2003 21:41:45 -0000      1.1
  +++ PluginPropertyEditorPanel.java    19 Dec 2003 03:21:36 -0000      1.2
  @@ -48,12 +48,15 @@
    */
   package org.apache.log4j.chainsaw.receivers;
   
  +import org.apache.log4j.Level;
   import org.apache.log4j.chainsaw.Generator;
  +import org.apache.log4j.chainsaw.helper.TableCellEditorFactory;
   import org.apache.log4j.helpers.LogLog;
   import org.apache.log4j.net.SocketHubReceiver;
   import org.apache.log4j.plugins.Plugin;
   
   import java.awt.BorderLayout;
  +import java.awt.Component;
   import java.awt.Dimension;
   import java.awt.event.WindowAdapter;
   import java.awt.event.WindowEvent;
  @@ -69,14 +72,21 @@
   import java.util.Arrays;
   import java.util.Collections;
   import java.util.Comparator;
  +import java.util.HashMap;
   import java.util.List;
  +import java.util.Map;
   
  +import javax.swing.AbstractCellEditor;
  +import javax.swing.DefaultCellEditor;
   import javax.swing.JFrame;
   import javax.swing.JPanel;
   import javax.swing.JScrollPane;
   import javax.swing.JTable;
  +import javax.swing.JTextField;
   import javax.swing.table.AbstractTableModel;
   import javax.swing.table.DefaultTableModel;
  +import javax.swing.table.TableCellEditor;
  +import javax.swing.table.TableModel;
   
   
   /**
  @@ -91,6 +101,8 @@
       private final JTable propertyTable = new JTable();
   
       private Plugin plugin;
  +    private TableModel defaultModel = new DefaultTableModel(
  +            new String[] { "Property", "Value" }, 1);
   
       /**
        *
  @@ -111,10 +123,10 @@
   
           add(scrollPane, BorderLayout.CENTER);
   
  -        propertyTable.setModel(new DefaultTableModel());
  +        propertyTable.setModel(
  +            defaultModel = new DefaultTableModel(
  +                    new String[] { "Property", "Value" }, 1));
   
  -//        TODO when all the correct CellEditors are in place, remove this line
  -           propertyTable.setEnabled(false);
       }
   
       /**
  @@ -126,16 +138,23 @@
                   public void propertyChange(PropertyChangeEvent evt) {
   
                       final Plugin p = (Plugin) evt.getNewValue();
  +
                       if (p != null) {
   
                           try {
  -                          PluginPropertyTableModel model = new 
PluginPropertyTableModel(p);
  +
  +                            PluginPropertyTableModel model =
  +                                new PluginPropertyTableModel(p);
                               propertyTable.setModel(model);
  +                            propertyTable.getColumnModel().getColumn(1)
  +                            .setCellEditor(new PluginTableCellEditor());
  +                            propertyTable.setEnabled(true);
                           } catch (Throwable e) {
                               LogLog.error("Failed to introspect the Plugin", e);
                           }
                       } else {
  -                        // TODO handle else condition
  +                        propertyTable.setModel(defaultModel);
  +                        propertyTable.setEnabled(false);
                       }
   
                   }
  @@ -192,6 +211,61 @@
           firePropertyChange("plugin", oldValue, this.plugin);
       }
   
  +    /**
  +     * @author psmith
  +     *
  +     */
  +    private class PluginTableCellEditor extends AbstractCellEditor
  +        implements TableCellEditor {
  +
  +        private Map editorMap = new HashMap();
  +        private DefaultCellEditor defaultEditor = new DefaultCellEditor(
  +                new JTextField());
  +        private DefaultCellEditor currentEditor = defaultEditor;
  +
  +        private PluginTableCellEditor() {
  +
  +            editorMap.put(Boolean.class,
  +                TableCellEditorFactory.createBooleanTableCellEditor());
  +            editorMap.put(Level.class,
  +                TableCellEditorFactory.createLevelTableCellEditor());
  +        }
  +
  +        /* (non-Javadoc)
  +         * @see 
javax.swing.table.TableCellEditor#getTableCellEditorComponent(javax.swing.JTable, 
java.lang.Object, boolean, int, int)
  +         */
  +        public Component getTableCellEditorComponent(JTable table, Object value,
  +            boolean isSelected, int row, int column) {
  +
  +            if (editorMap.containsKey(value.getClass())) {
  +
  +                DefaultCellEditor editor =
  +                    (DefaultCellEditor) editorMap.get(value.getClass());
  +                LogLog.debug("Located CellEditor for " + value.getClass());
  +                currentEditor = editor;
  +
  +                return currentEditor.getTableCellEditorComponent(table, value,
  +                    isSelected, row, column);
  +            }
  +
  +            currentEditor = defaultEditor;
  +            LogLog.debug("Cell value class " + value.getClass() +
  +                " not know, using default editor");
  +
  +            return defaultEditor.getTableCellEditorComponent(table, value,
  +                isSelected, row, column);
  +        }
  +
  +        /* (non-Javadoc)
  +         * @see javax.swing.CellEditor#getCellEditorValue()
  +         */
  +        public Object getCellEditorValue() {
  +
  +            return currentEditor.getCellEditorValue();
  +        }
  +
  +    }
  +
       private static class PluginPropertyTableModel extends AbstractTableModel {
   
           private final PropertyDescriptor[] descriptors;
  @@ -240,7 +314,7 @@
   
                       if (object != null) {
   
  -                        return object.toString();
  +                        return object;
                       }
                   } catch (Exception e) {
                       LogLog.error(
  @@ -292,6 +366,55 @@
           public String getColumnName(int column) {
   
               return (column == 0) ? "Property" : "Value";
  +        }
  +
  +        /* (non-Javadoc)
  +         * @see javax.swing.table.TableModel#setValueAt(java.lang.Object, int, int)
  +         */
  +        public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
  +
  +
  +            if (columnIndex == 1) {
  +                aValue = translateValueIfNeeded(rowIndex, aValue);
  +                LogLog.debug(
  +                    "setValueAt, " + rowIndex + ", " + columnIndex +
  +                    ", value=" + aValue + ", valueClass" + aValue.getClass());
  +
  +                try {
  +                    descriptors[rowIndex].getWriteMethod().invoke(plugin,
  +                        new Object[] { aValue });
  +                    fireTableCellUpdated(rowIndex, columnIndex);
  +                } catch (IllegalArgumentException e) {
  +                    // ignore
  +                } catch (Exception e) {
  +                    LogLog.error(
  +                        "Failed to modify the Plugin because of Exception", e);
  +                }
  +
  +            } else {
  +                super.setValueAt(aValue, rowIndex, columnIndex);
  +            }
  +        }
  +
  +        /**
  +         * @param columnIndex
  +         * @param value
  +         * @return
  +         */
  +        private Object translateValueIfNeeded(int row, Object value) {
  +
  +            if ((descriptors[row].getPropertyType() == int.class) ||
  +                    (descriptors[row].getPropertyType() == Integer.class)) {
  +
  +                try {
  +
  +                    return Integer.valueOf(value.toString());
  +                } catch (Exception e) {
  +                    LogLog.error("Failed to convert to Integer type");
  +                }
  +            }
  +
  +            return value;
           }
       }
   }
  
  
  
  1.2       +3 -0      
jakarta-log4j/src/java/org/apache/log4j/chainsaw/receivers/ReceiversPanel.java
  
  Index: ReceiversPanel.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-log4j/src/java/org/apache/log4j/chainsaw/receivers/ReceiversPanel.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- ReceiversPanel.java       18 Dec 2003 21:41:45 -0000      1.1
  +++ ReceiversPanel.java       19 Dec 2003 03:21:36 -0000      1.2
  @@ -228,7 +228,10 @@
               Plugin p = (Plugin) node.getUserObject();
               LogLog.debug("plugin=" + p);
               pluginEditorPanel.setPlugin(p);
  +          }else {
  +            pluginEditorPanel.setPlugin(null);
             }
  +                
             
           }
           
  
  
  

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

Reply via email to