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]