psmith 2003/12/16 20:28:05 Modified: src/java/org/apache/log4j/chainsaw LoggerNameTreePanel.java LogPanel.java Log: A LogPanel's Logger name ignore list is now saved and loaded with the preferences. Revision Changes Path 1.21 +868 -606 jakarta-log4j/src/java/org/apache/log4j/chainsaw/LoggerNameTreePanel.java Index: LoggerNameTreePanel.java =================================================================== RCS file: /home/cvs/jakarta-log4j/src/java/org/apache/log4j/chainsaw/LoggerNameTreePanel.java,v retrieving revision 1.20 retrieving revision 1.21 diff -u -r1.20 -r1.21 --- LoggerNameTreePanel.java 16 Dec 2003 00:45:26 -0000 1.20 +++ LoggerNameTreePanel.java 17 Dec 2003 04:28:04 -0000 1.21 @@ -46,11 +46,17 @@ * Apache Software Foundation, please see <http://www.apache.org/>. * */ - /* */ package org.apache.log4j.chainsaw; +import org.apache.log4j.chainsaw.icons.ChainsawIcons; +import org.apache.log4j.chainsaw.icons.LineIconFactory; +import org.apache.log4j.helpers.LogLog; +import org.apache.log4j.rule.AbstractRule; +import org.apache.log4j.rule.Rule; +import org.apache.log4j.spi.LoggingEvent; + import java.awt.BorderLayout; import java.awt.Component; import java.awt.Cursor; @@ -64,9 +70,12 @@ import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter; import java.awt.event.MouseMotionListener; + import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; + import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.Enumeration; import java.util.HashSet; @@ -107,13 +116,6 @@ import javax.swing.tree.TreePath; import javax.swing.tree.TreeSelectionModel; -import org.apache.log4j.chainsaw.icons.ChainsawIcons; -import org.apache.log4j.chainsaw.icons.LineIconFactory; -import org.apache.log4j.helpers.LogLog; -import org.apache.log4j.rule.AbstractRule; -import org.apache.log4j.rule.Rule; -import org.apache.log4j.spi.LoggingEvent; - /** * A panel that encapsulates the Logger Name tree, with associated actions @@ -122,118 +124,62 @@ * * @author Paul Smith <[EMAIL PROTECTED]> */ -final class LoggerNameTreePanel extends JPanel implements Rule { - private final class MouseKeyIconListener - extends MouseMotionAdapter - implements MouseMotionListener { - Cursor focusOnCursor = Toolkit.getDefaultToolkit().createCustomCursor(ChainsawIcons.FOCUS_ON_ICON.getImage(), new Point(10,10), ""); - Cursor ignoreCursor = Toolkit.getDefaultToolkit().createCustomCursor(ChainsawIcons.IGNORE_ICON.getImage(), new Point(10,10), ""); - /* (non-Javadoc) - * @see java.awt.event.MouseMotionListener#mouseMoved(java.awt.event.MouseEvent) - */ - public void mouseMoved(MouseEvent e) { -// LogLog.debug(e.toString()); - if((e.getModifiers() & InputEvent.CTRL_MASK)>0 && (e.getModifiers() & InputEvent.SHIFT_MASK)>0) { - logTree.setCursor(ignoreCursor); - }else if((e.getModifiers() & InputEvent.CTRL_MASK)>0) { - logTree.setCursor(focusOnCursor); - }else { - logTree.setCursor(Cursor.getDefaultCursor()); - } - } -} - private final class MouseFocusOnListener extends MouseAdapter { - - /* (non-Javadoc) - * @see java.awt.event.MouseListener#mouseClicked(java.awt.event.MouseEvent) - */ - public void mouseClicked(MouseEvent e) { - if(e.getClickCount()>1 && (e.getModifiers() & InputEvent.CTRL_MASK)>0 && (e.getModifiers() & InputEvent.SHIFT_MASK)>0) { - ignoreLoggerAtPoint(e.getPoint()); - e.consume(); - fireChangeEvent(); - }else if(e.getClickCount()>1 &&(e.getModifiers() & InputEvent.CTRL_MASK)>0) { - focusAnLoggerAtPoint(e.getPoint()); - e.consume(); - fireChangeEvent(); - } - } +final class LoggerNameTreePanel extends JPanel implements Rule +{ + //~ Static fields/initializers ============================================== - /** - * @param point - */ - private void focusAnLoggerAtPoint(Point point) { - String logger = getLoggerAtPoint(point); - if(logger!=null) { - toggleFocusOnState(); - } - } + private static final int WARN_DEPTH = 4; - /** - * @param point - * @return - */ - private String getLoggerAtPoint(Point point) { - TreePath path = logTree.getPathForLocation(point.x, point.y); - if(path!=null) { - return getLoggerName(path); - } - return null; - } + //~ Instance fields ========================================================= - /** - * @param point - */ - private void ignoreLoggerAtPoint(Point point) { - String logger = getLoggerAtPoint(point); - if(logger!=null) { - toggleHiddenLogger(logger); - } - - } - } - private static final int WARN_DEPTH = 4; - private final JTree logTree; - private final JScrollPane scrollTree; - private final JToolBar toolbar = new JToolBar(); - private final JButton expandButton = new SmallButton(); - private final JButton collapseButton = new SmallButton(); + private LoggerNameTreeCellRenderer cellRenderer = + new LoggerNameTreeCellRenderer(); + private final Action clearIgnoreListAction; + private final Action closeAction; private final JButton closeButton = new SmallButton(); - private final SmallToggleButton focusOnLoggerButton = - new SmallToggleButton(); - private final SmallToggleButton ignoreLoggerButton = new SmallToggleButton(); - private final JButton editLoggerButton = new SmallButton(); - private final Action expandAction; private final Action collapseAction; - private final Action closeAction; + private final JButton collapseButton = new SmallButton(); private final Action editLoggerAction; + private final JButton editLoggerButton = new SmallButton(); + private final Action expandAction; + private final JButton expandButton = new SmallButton(); private final Action focusOnAction; + private final SmallToggleButton focusOnLoggerButton = + new SmallToggleButton(); + private final Set hiddenSet = new HashSet(); private final Action hideAction; - private final Action clearIgnoreListAction; - + private final JList ignoreList = new JList(); private final JScrollPane ignoreListScroll = new JScrollPane(ignoreList); + private final SmallToggleButton ignoreLoggerButton = new SmallToggleButton(); + private final EventListenerList listenerList = new EventListenerList(); + private final JTree logTree; // private final EventListenerList focusOnActionListeners = // new EventListenerList(); private final LogPanelLoggerTreeModel logTreeModel; - private LoggerNameTreeCellRenderer cellRenderer = - new LoggerNameTreeCellRenderer(); - private final LoggerTreePopupMenu popupMenu; private final PopupListener popupListener; - private final Set hiddenSet = new HashSet(); - private final EventListenerList listenerList = new EventListenerList(); - private Rule ruleDelegate = - new AbstractRule() { - public boolean evaluate(LoggingEvent e) { + private final LoggerTreePopupMenu popupMenu; + private Rule ruleDelegate = new AbstractRule() + { + public boolean evaluate(LoggingEvent e) + { return true; } }; + private final JScrollPane scrollTree; + private final JToolBar toolbar = new JToolBar(); + + //~ Constructors ============================================================ + /** + * Creates a new LoggerNameTreePanel object. + * * @param logTreeModel */ - LoggerNameTreePanel(LogPanelLoggerTreeModel logTreeModel) { + LoggerNameTreePanel(LogPanelLoggerTreeModel logTreeModel) + { super(); this.logTreeModel = logTreeModel; @@ -241,46 +187,55 @@ setBorder(BorderFactory.createEtchedBorder()); logTree = - new JTree(logTreeModel) { - public String getToolTipText(MouseEvent ev) { - if (ev == null) { - return null; - } - - TreePath path = logTree.getPathForLocation(ev.getX(), ev.getY()); + new JTree(logTreeModel) + { + public String getToolTipText(MouseEvent ev) + { + if (ev == null) + { + return null; + } - String loggerName = getLoggerName(path); + TreePath path = logTree.getPathForLocation(ev.getX(), ev.getY()); - if (hiddenSet.contains(loggerName)) { - loggerName += " (you are ignoring this logger)"; - } + String loggerName = getLoggerName(path); - return loggerName; + if (hiddenSet.contains(loggerName)) + { + loggerName += " (you are ignoring this logger)"; } - }; + + return loggerName; + } + }; ToolTipManager.sharedInstance().registerComponent(logTree); logTree.setCellRenderer(cellRenderer); // ============================================ - logTreeModel.addTreeModelListener( - new TreeModelListener() { + logTreeModel.addTreeModelListener(new TreeModelListener() + { private boolean latched = false; - public void treeNodesChanged(TreeModelEvent e) { + public void treeNodesChanged(TreeModelEvent e) + { } - public void treeNodesInserted(TreeModelEvent e) { - if (!latched) { + public void treeNodesInserted(TreeModelEvent e) + { + if (!latched) + { ensureRootExpanded(); latched = true; } } - public void treeNodesRemoved(TreeModelEvent e) { + public void treeNodesRemoved(TreeModelEvent e) + { } - public void treeStructureChanged(TreeModelEvent e) { + public void treeStructureChanged(TreeModelEvent e) + { } }); @@ -312,114 +267,123 @@ add(toolbar, BorderLayout.NORTH); add(scrollTree, BorderLayout.CENTER); - + add(ignoreListScroll, BorderLayout.SOUTH); - - CheckListCellRenderer cellRenderer = new CheckListCellRenderer(){ - protected boolean isSelected(Object value) { - return true; - } - - }; - + CheckListCellRenderer cellRenderer = new CheckListCellRenderer() + { + protected boolean isSelected(Object value) + { + return true; + } + }; + ignoreList.setCellRenderer(cellRenderer); - - ignoreList.addMouseListener(new MouseAdapter(){ - - public void mouseClicked(MouseEvent e) { - if (e.getClickCount()>1 && (e.getModifiers() & InputEvent.BUTTON1_MASK)>0) { - int index = ignoreList.locationToIndex(e.getPoint()); - - if (index>=0) { - String string = - ignoreList.getModel().getElementAt(index).toString(); - toggleHiddenLogger(string); - fireChangeEvent(); - /** - * TODO this needs to get the node that has this logger and fire a visual update - */ - LoggerNameTreePanel.this.logTreeModel.nodeStructureChanged((TreeNode) LoggerNameTreePanel.this.logTreeModel.getRoot()); + + ignoreList.addMouseListener(new MouseAdapter() + { + public void mouseClicked(MouseEvent e) + { + if ( + (e.getClickCount() > 1) + && ((e.getModifiers() & InputEvent.BUTTON1_MASK) > 0)) + { + int index = ignoreList.locationToIndex(e.getPoint()); + + if (index >= 0) + { + String string = + ignoreList.getModel().getElementAt(index).toString(); + toggleHiddenLogger(string); + fireChangeEvent(); + + /** + * TODO this needs to get the node that has this logger and fire a visual update + */ + LoggerNameTreePanel.this.logTreeModel.nodeStructureChanged( + (TreeNode) LoggerNameTreePanel.this.logTreeModel.getRoot()); + } } } - - } - - }); + }); } + //~ Methods ================================================================= + /** * Adds a change Listener to this LoggerNameTreePanel to be notfied * when the State of the Focus or Hidden details have changed. * * @param l */ - public void addChangeListener(ChangeListener l) { + public void addChangeListener(ChangeListener l) + { listenerList.add(ChangeListener.class, l); } - public void removeChangeListener(ChangeListener l) { - listenerList.remove(ChangeListener.class, l); + /* (non-Javadoc) + * @see org.apache.log4j.chainsaw.rule.Rule#evaluate(org.apache.log4j.spi.LoggingEvent) + */ + /** + * DOCUMENT ME! + * + * @param e DOCUMENT ME! + * + * @return DOCUMENT ME! + */ + public boolean evaluate(LoggingEvent e) + { + return ruleDelegate.evaluate(e); } /** - * @return - */ - private Action createClearIgnoreListAction() { - Action action = - new AbstractAction("Clear Ignore list", null) { - public void actionPerformed(ActionEvent e) { - ignoreLoggerButton.setSelected(false); - logTreeModel.reload(); - hiddenSet.clear(); - fireChangeEvent(); - } - }; - - action.putValue( - Action.SHORT_DESCRIPTION, - "Removes all entries from the Ignore list so you can see their events in the view"); - - return action; + * DOCUMENT ME! + * + * @param l DOCUMENT ME! + */ + public void removeChangeListener(ChangeListener l) + { + listenerList.remove(ChangeListener.class, l); } /** - * @return - */ - private Action createIgnoreAction() { - Action action = - new AbstractAction( - "Ignore this Logger", new ImageIcon(ChainsawIcons.ICON_COLLAPSE)) { - public void actionPerformed(ActionEvent e) { - String logger = getCurrentlySelectedLoggerName(); - - if (logger != null) { - toggleHiddenLogger(logger); - logTreeModel.nodeChanged( - (TreeNode) logTree.getSelectionPath().getLastPathComponent()); - ignoreLoggerButton.setSelected(hiddenSet.contains(logger)); - focusOnAction.setEnabled(!hiddenSet.contains(logger)); - popupMenu.hideCheck.setSelected(hiddenSet.contains(logger)); - } - - fireChangeEvent(); - } - }; + * Ensures the Focus is set to a specific logger name + * @param logger + */ + public void setFocusOn(String logger) + { + DefaultMutableTreeNode node = logTreeModel.lookupLogger(logger); - action.putValue( - Action.SHORT_DESCRIPTION, - "Adds the selected Logger to your Ignore list, filtering those events from view"); + if (node != null) + { + TreeNode[] nodes = node.getPath(); + TreePath treePath = new TreePath(nodes); + logTree.setSelectionPath(treePath); - return action; + if (!focusOnLoggerButton.isSelected()) + { + focusOnLoggerButton.doClick(); + } + } + else + { + LogLog.error("failed to lookup logger " + logger); + } } /** + * DOCUMENT ME! + * * @param logger */ - protected void toggleHiddenLogger(String logger) { - if (!hiddenSet.contains(logger)) { + protected void toggleHiddenLogger(String logger) + { + if (!hiddenSet.contains(logger)) + { hiddenSet.add(logger); - } else { + } + else + { hiddenSet.remove(logger); } @@ -427,42 +391,6 @@ } /** - * Returns an unmodifiable set of those Loggers marked as hidden. - * @return - */ - Set getHiddenSet() { - return Collections.unmodifiableSet(hiddenSet); - } - - /** - * @return - */ - private Action createFocusOnAction() { - final Action action = - new AbstractAction() { - public void actionPerformed(ActionEvent e) { - toggleFocusOnState(); - } - }; - - action.putValue(Action.NAME, "Focus"); - action.putValue( - Action.SHORT_DESCRIPTION, - "Allows you to Focus on the selected logger by setting a filter that discards all but this Logger"); - action.putValue( - Action.SMALL_ICON, new ImageIcon(ChainsawIcons.WINDOW_ICON)); - - action.setEnabled(false); - - return action; - } - - private void toggleFocusOnState() { - setFocusOnSelected(!isFocusOnSelected()); - hideAction.setEnabled(!isFocusOnSelected()); - } - - /** * Returns the full name of the Logger that is represented by * the currently selected Logger node in the tree. * @@ -471,10 +399,12 @@ * If multiple Nodes are selected, the first path is used * @return Logger Name or null if nothing selected */ - String getCurrentlySelectedLoggerName() { + String getCurrentlySelectedLoggerName() + { TreePath[] paths = logTree.getSelectionPaths(); - if ((paths == null) || (paths.length == 0)) { + if ((paths == null) || (paths.length == 0)) + { return null; } @@ -484,18 +414,32 @@ } /** + * Returns an unmodifiable set of those Loggers marked as hidden. + * @return + */ + Set getHiddenSet() + { + return Collections.unmodifiableSet(hiddenSet); + } + + /** * Returns the full + * @param path DOCUMENT ME! * @return */ - String getLoggerName(TreePath path) { - if (path != null) { + String getLoggerName(TreePath path) + { + if (path != null) + { Object[] objects = path.getPath(); StringBuffer buf = new StringBuffer(); - for (int i = 1; i < objects.length; i++) { + for (int i = 1; i < objects.length; i++) + { buf.append(objects[i].toString()); - if (i < (objects.length - 1)) { + if (i < (objects.length - 1)) + { buf.append("."); } } @@ -506,260 +450,201 @@ return null; } - private void ensureRootExpanded() { - LogLog.debug("Ensuring Root node is expanded."); - - final DefaultMutableTreeNode root = - (DefaultMutableTreeNode) logTreeModel.getRoot(); - SwingUtilities.invokeLater( - new Runnable() { - public void run() { - logTree.expandPath(new TreePath(root)); - } - }); + /** + * adds a Collection of Strings to the ignore List and notifise all listeners of + * both the "hiddenSet" property and those expecting the Rule to change + * via the ChangeListener interface + * @param fqnLoggersToIgnore + */ + void ignore(Collection fqnLoggersToIgnore) + { + hiddenSet.addAll(fqnLoggersToIgnore); + firePropertyChange("hiddenSet", null, null); + fireChangeEvent(); } /** - * @return - */ - private Action createCollapseAction() { - Action action = - new AbstractAction() { - public void actionPerformed(ActionEvent e) { - collapseCurrentlySelectedNode(); - } - }; - - action.putValue(Action.SMALL_ICON, LineIconFactory.createCollapseIcon()); - action.putValue(Action.NAME, "Collapse Branch"); - action.putValue( - Action.SHORT_DESCRIPTION, - "Collapses all the children of the currently selected node"); - action.setEnabled(false); - - return action; + * Returns true if the FocusOn element has been selected + * @return true if the FocusOn action/lement has been selected + */ + boolean isFocusOnSelected() + { + return focusOnAction.getValue("checked") != null; } - /** - * An action that closes (hides) this panel - * @return - */ - private Action createCloseAction() { - Action action = - new AbstractAction() { - public void actionPerformed(ActionEvent e) { - LoggerNameTreePanel.this.setVisible(false); - } - }; - - action.putValue(Action.NAME, "Close"); - action.putValue(Action.SHORT_DESCRIPTION, "Closes the Logger panel"); - action.putValue(Action.SMALL_ICON, LineIconFactory.createCloseIcon()); - - return action; + void setFocusOnSelected(boolean selected) + { + if (selected) + { + focusOnAction.putValue("checked", Boolean.TRUE); + } + else + { + focusOnAction.putValue("checked", null); + } } /** - * Configures varoius listeners etc for the components within - * this Class. - */ - private void setupListeners() { - - logTree.addMouseMotionListener(new MouseKeyIconListener()); - /** - * Enable the actions depending on state of the tree selection - */ - logTree.addTreeSelectionListener( - new TreeSelectionListener() { - public void valueChanged(TreeSelectionEvent e) { - TreePath path = e.getNewLeadSelectionPath(); - TreeNode node = null; - - if (path != null) { - node = (TreeNode) path.getLastPathComponent(); - } + * Given the currently selected nodes + * collapses all the children of those nodes. + * + */ + private void collapseCurrentlySelectedNode() + { + TreePath[] paths = logTree.getSelectionPaths(); - // editLoggerAction.setEnabled(path != null); - String logger = getCurrentlySelectedLoggerName(); - focusOnAction.setEnabled( - (path != null) && (node != null) && (node.getParent() != null) - && !hiddenSet.contains(logger)); - hideAction.setEnabled( - (path != null) && (node != null) && (node.getParent() != null) - && !isFocusOnSelected()); + if (paths == null) + { + return; + } - if (!focusOnAction.isEnabled()) { - setFocusOnSelected(false); - } else { - } + if (LogLog.isDebugEnabled()) + { + LogLog.debug("Collapsing all children of selected node"); + } - expandAction.setEnabled(path != null); + for (int i = 0; i < paths.length; i++) + { + TreePath path = paths[i]; + DefaultMutableTreeNode node = + (DefaultMutableTreeNode) path.getLastPathComponent(); + Enumeration enumeration = node.depthFirstEnumeration(); - if (logger != null) { - boolean isHidden = hiddenSet.contains(logger); - popupMenu.hideCheck.setSelected(isHidden); - ignoreLoggerButton.setSelected(isHidden); - } + while (enumeration.hasMoreElements()) + { + DefaultMutableTreeNode child = + (DefaultMutableTreeNode) enumeration.nextElement(); - collapseAction.setEnabled(path != null); + if ((child.getParent() != null) && (child != node)) + { + TreeNode[] nodes = + ((DefaultMutableTreeNode) child.getParent()).getPath(); - reconfigureMenuText(); + TreePath treePath = new TreePath(nodes); + logTree.collapsePath(treePath); } - }); + } + } - logTree.addMouseListener(popupListener); + ensureRootExpanded(); + } - /** - * This listener ensures the Tool bar toggle button and popup menu check box - * stay in sync, plus notifies all the ChangeListeners that - * an effective filter criteria has been modified + /** + * configures all the components that are used in the mini-toolbar of this + * component */ - focusOnAction.addPropertyChangeListener( - new PropertyChangeListener() { - public void propertyChange(PropertyChangeEvent evt) { - popupMenu.focusOnCheck.setSelected(isFocusOnSelected()); - focusOnLoggerButton.setSelected(isFocusOnSelected()); - - if (logTree.getSelectionPath() != null) { - logTreeModel.nodeChanged( - (TreeNode) logTree.getSelectionPath().getLastPathComponent()); - } + private void configureToolbarPanel() + { + toolbar.setFloatable(false); - fireChangeEvent(); - } - }); + expandButton.setAction(expandAction); + expandButton.setText(null); + collapseButton.setAction(collapseAction); + collapseButton.setText(null); + focusOnLoggerButton.setAction(focusOnAction); + focusOnLoggerButton.setText(null); + ignoreLoggerButton.setAction(hideAction); + ignoreLoggerButton.setText(null); - hideAction.addPropertyChangeListener( - new PropertyChangeListener() { - public void propertyChange(PropertyChangeEvent evt) { - if (logTree.getSelectionPath() != null) { - logTreeModel.nodeChanged( - (TreeNode) logTree.getSelectionPath().getLastPathComponent()); - } + expandButton.setFont(expandButton.getFont().deriveFont(Font.BOLD)); + collapseButton.setFont(collapseButton.getFont().deriveFont(Font.BOLD)); - fireChangeEvent(); - } - }); + editLoggerButton.setAction(editLoggerAction); + editLoggerButton.setText(null); + closeButton.setAction(closeAction); + closeButton.setText(null); -// /** -// * Now add a MouseListener that fires the expansion -// * action if CTRL + DBL CLICK is done. -// */ -// logTree.addMouseListener( -// new MouseAdapter() { -// public void mouseClicked(MouseEvent e) { -// if ( -// (e.getClickCount() > 1) -// && ((e.getModifiers() & InputEvent.CTRL_MASK) > 0) -// && ((e.getModifiers() & InputEvent.BUTTON1_MASK) > 0)) { -// expandCurrentlySelectedNode(); -// e.consume(); -// } else if (e.getClickCount() > 1) { -// super.mouseClicked(e); -// LogLog.debug("Ignoring dbl click event " + e); -// } -// } -// }); + toolbar.add(expandButton); + toolbar.add(collapseButton); + toolbar.addSeparator(); + toolbar.add(focusOnLoggerButton); + toolbar.add(ignoreLoggerButton); - logTree.addMouseListener(new MouseFocusOnListener()); - /** - * We listen for when the FocusOn action changes, and then translate - * that to a RuleChange - */ - addChangeListener( - new ChangeListener() { - public void stateChanged(ChangeEvent evt) { - final String currentlySelectedLoggerName = - getCurrentlySelectedLoggerName(); + // toolbar.add(editLoggerButton); + toolbar.addSeparator(); - ruleDelegate = - new AbstractRule() { - public boolean evaluate(LoggingEvent e) { - boolean isHidden = - getHiddenSet().contains(e.getLoggerName()); - boolean result = !isHidden; - - if (result && isFocusOnSelected()) { - result = - result - && e.getLoggerName().startsWith( - currentlySelectedLoggerName); - } + toolbar.add(Box.createHorizontalGlue()); + toolbar.add(closeButton); + toolbar.add(Box.createHorizontalStrut(5)); + } - return result; - } - }; - firePropertyChange("rule", null, null); + /** + * DOCUMENT ME! + * + * @return + */ + private Action createClearIgnoreListAction() + { + Action action = new AbstractAction("Clear Ignore list", null) + { + public void actionPerformed(ActionEvent e) + { + ignoreLoggerButton.setSelected(false); + logTreeModel.reload(); + hiddenSet.clear(); + fireChangeEvent(); } - }); - - addPropertyChangeListener("hiddenSet",new PropertyChangeListener(){ - - public void propertyChange(PropertyChangeEvent arg0) { + }; - DefaultListModel model = new DefaultListModel(); - - List sortedIgnoreList = new ArrayList(getHiddenSet()); - Collections.sort(sortedIgnoreList); - for (Iterator iter = sortedIgnoreList.iterator(); iter.hasNext();) { - String string = (String) iter.next(); - model.addElement(string); - } - ignoreList.setModel(model); - }}); + action.putValue( + Action.SHORT_DESCRIPTION, + "Removes all entries from the Ignore list so you can see their events in the view"); + return action; } - private void reconfigureMenuText() { - String logger = getCurrentlySelectedLoggerName(); + /** + * An action that closes (hides) this panel + * @return + */ + private Action createCloseAction() + { + Action action = new AbstractAction() + { + public void actionPerformed(ActionEvent e) + { + LoggerNameTreePanel.this.setVisible(false); + } + }; - if ((logger == null) || (logger.length() == 0)) { - focusOnAction.putValue(Action.NAME, "Focus On..."); - hideAction.putValue(Action.NAME, "Ignore ..."); - } else { - focusOnAction.putValue(Action.NAME, "Focus On '" + logger + "'"); - hideAction.putValue(Action.NAME, "Ignore '" + logger + "'"); - } + action.putValue(Action.NAME, "Close"); + action.putValue(Action.SHORT_DESCRIPTION, "Closes the Logger panel"); + action.putValue(Action.SMALL_ICON, LineIconFactory.createCloseIcon()); - // need to ensure the button doens't update itself with the text, looks stupid otherwise - focusOnLoggerButton.setText(null); - ignoreLoggerButton.setText(null); + return action; } /** - * Returns true if the FocusOn element has been selected - * @return true if the FocusOn action/lement has been selected - */ - boolean isFocusOnSelected() { - return focusOnAction.getValue("checked") != null; - } - - void setFocusOnSelected(boolean selected) { - if (selected) { - focusOnAction.putValue("checked", Boolean.TRUE); - } else { - focusOnAction.putValue("checked", null); - } - } - - private void fireChangeEvent() { - ChangeListener[] listeners = - (ChangeListener[]) listenerList.getListeners(ChangeListener.class); - ChangeEvent e = null; + * DOCUMENT ME! + * + * @return + */ + private Action createCollapseAction() + { + Action action = new AbstractAction() + { + public void actionPerformed(ActionEvent e) + { + collapseCurrentlySelectedNode(); + } + }; - for (int i = 0; i < listeners.length; i++) { - if (e == null) { - e = new ChangeEvent(this); - } + action.putValue(Action.SMALL_ICON, LineIconFactory.createCollapseIcon()); + action.putValue(Action.NAME, "Collapse Branch"); + action.putValue( + Action.SHORT_DESCRIPTION, + "Collapses all the children of the currently selected node"); + action.setEnabled(false); - listeners[i].stateChanged(e); - } + return action; } - private Action createEditLoggerAction() { - Action action = - new AbstractAction() { - public void actionPerformed(ActionEvent e) { + private Action createEditLoggerAction() + { + Action action = new AbstractAction() + { + public void actionPerformed(ActionEvent e) + { // TODO Auto-generated method stub } }; @@ -783,10 +668,12 @@ * and all children * @return an Action */ - private Action createExpandAction() { - Action action = - new AbstractAction() { - public void actionPerformed(ActionEvent e) { + private Action createExpandAction() + { + Action action = new AbstractAction() + { + public void actionPerformed(ActionEvent e) + { expandCurrentlySelectedNode(); } }; @@ -802,190 +689,403 @@ } /** - * Given the currently selected nodes - * collapses all the children of those nodes. + * DOCUMENT ME! + * + * @return + */ + private Action createFocusOnAction() + { + final Action action = new AbstractAction() + { + public void actionPerformed(ActionEvent e) + { + toggleFocusOnState(); + } + }; + + action.putValue(Action.NAME, "Focus"); + action.putValue( + Action.SHORT_DESCRIPTION, + "Allows you to Focus on the selected logger by setting a filter that discards all but this Logger"); + action.putValue( + Action.SMALL_ICON, new ImageIcon(ChainsawIcons.WINDOW_ICON)); + + action.setEnabled(false); + + return action; + } + + /** + * DOCUMENT ME! + * + * @return + */ + private Action createIgnoreAction() + { + Action action = + new AbstractAction( + "Ignore this Logger", new ImageIcon(ChainsawIcons.ICON_COLLAPSE)) + { + public void actionPerformed(ActionEvent e) + { + String logger = getCurrentlySelectedLoggerName(); + + if (logger != null) + { + toggleHiddenLogger(logger); + logTreeModel.nodeChanged( + (TreeNode) logTree.getSelectionPath().getLastPathComponent()); + ignoreLoggerButton.setSelected(hiddenSet.contains(logger)); + focusOnAction.setEnabled(!hiddenSet.contains(logger)); + popupMenu.hideCheck.setSelected(hiddenSet.contains(logger)); + } + + fireChangeEvent(); + } + }; + + action.putValue( + Action.SHORT_DESCRIPTION, + "Adds the selected Logger to your Ignore list, filtering those events from view"); + + return action; + } + + private void ensureRootExpanded() + { + if (LogLog.isDebugEnabled()) + { + LogLog.debug("Ensuring Root node is expanded."); + } + + final DefaultMutableTreeNode root = + (DefaultMutableTreeNode) logTreeModel.getRoot(); + SwingUtilities.invokeLater(new Runnable() + { + public void run() + { + logTree.expandPath(new TreePath(root)); + } + }); + } + + /** + * Expands the currently selected node (if any) + * including all the children. * */ - private void collapseCurrentlySelectedNode() { + private void expandCurrentlySelectedNode() + { TreePath[] paths = logTree.getSelectionPaths(); - if (paths == null) { + if (paths == null) + { return; } - LogLog.debug("Collapsing all children of selected node"); + if (LogLog.isDebugEnabled()) + { + LogLog.debug("Expanding all children of selected node"); + } - for (int i = 0; i < paths.length; i++) { + for (int i = 0; i < paths.length; i++) + { TreePath path = paths[i]; - DefaultMutableTreeNode node = + + /** + * TODO this is commented out, right now it expands all nodes including the root, so if there is a large tree..... look out. + */ + + // /** + // * Handle an expansion of the Root node by only doing the first level. + // * Safe... + // */ + // if (path.getPathCount() == 1) { + // logTree.expandPath(path); + // + // return; + // } + + DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode) path.getLastPathComponent(); - Enumeration enumeration = node.depthFirstEnumeration(); - while (enumeration.hasMoreElements()) { - DefaultMutableTreeNode child = - (DefaultMutableTreeNode) enumeration.nextElement(); + Enumeration depthEnum = treeNode.depthFirstEnumeration(); - if (child.getParent() != null && child!=node) { - TreeNode[] nodes = - ((DefaultMutableTreeNode) child.getParent()).getPath(); + if (!depthEnum.hasMoreElements()) + { + break; + } + + List depths = new ArrayList(); + + while (depthEnum.hasMoreElements()) + { + depths.add( + new Integer( + ((DefaultMutableTreeNode) depthEnum.nextElement()).getDepth())); + } + + Collections.sort(depths); + Collections.reverse(depths); + + int maxDepth = ((Integer) depths.get(0)).intValue(); + + if (maxDepth > WARN_DEPTH) + { + LogLog.warn("Should warn user, depth=" + maxDepth); + } + + depthEnum = treeNode.depthFirstEnumeration(); + while (depthEnum.hasMoreElements()) + { + DefaultMutableTreeNode node = + (DefaultMutableTreeNode) depthEnum.nextElement(); + + if (node.isLeaf()) + { + TreeNode[] nodes = + ((DefaultMutableTreeNode) node.getParent()).getPath(); TreePath treePath = new TreePath(nodes); - logTree.collapsePath(treePath); + + LogLog.debug("Expanding path:" + treePath); + + logTree.expandPath(treePath); } } } + } - ensureRootExpanded(); + private void fireChangeEvent() + { + ChangeListener[] listeners = + (ChangeListener[]) listenerList.getListeners(ChangeListener.class); + ChangeEvent e = null; + + for (int i = 0; i < listeners.length; i++) + { + if (e == null) + { + e = new ChangeEvent(this); + } + + listeners[i].stateChanged(e); + } } - /** - * Expands the currently selected node (if any) - * including all the children. - * - */ - private void expandCurrentlySelectedNode() { - TreePath[] paths = logTree.getSelectionPaths(); + private void reconfigureMenuText() + { + String logger = getCurrentlySelectedLoggerName(); + + if ((logger == null) || (logger.length() == 0)) + { + focusOnAction.putValue(Action.NAME, "Focus On..."); + hideAction.putValue(Action.NAME, "Ignore ..."); + } + else + { + focusOnAction.putValue(Action.NAME, "Focus On '" + logger + "'"); + hideAction.putValue(Action.NAME, "Ignore '" + logger + "'"); + } + + // need to ensure the button doens't update itself with the text, looks stupid otherwise + focusOnLoggerButton.setText(null); + ignoreLoggerButton.setText(null); + } - if (paths == null) { - return; - } + /** + * Configures varoius listeners etc for the components within + * this Class. + */ + private void setupListeners() + { + logTree.addMouseMotionListener(new MouseKeyIconListener()); - LogLog.debug("Expanding all children of selected node"); + /** + * Enable the actions depending on state of the tree selection + */ + logTree.addTreeSelectionListener(new TreeSelectionListener() + { + public void valueChanged(TreeSelectionEvent e) + { + TreePath path = e.getNewLeadSelectionPath(); + TreeNode node = null; - for (int i = 0; i < paths.length; i++) { - TreePath path = paths[i]; + if (path != null) + { + node = (TreeNode) path.getLastPathComponent(); + } -/** - * TODO this is commented out, right now it expands all nodes including the root, so if there is a large tree..... look out. - */ -// /** -// * Handle an expansion of the Root node by only doing the first level. -// * Safe... -// */ -// if (path.getPathCount() == 1) { -// logTree.expandPath(path); -// -// return; -// } + // editLoggerAction.setEnabled(path != null); + String logger = getCurrentlySelectedLoggerName(); + focusOnAction.setEnabled( + (path != null) && (node != null) && (node.getParent() != null) + && !hiddenSet.contains(logger)); + hideAction.setEnabled( + (path != null) && (node != null) && (node.getParent() != null) + && !isFocusOnSelected()); - DefaultMutableTreeNode treeNode = - (DefaultMutableTreeNode) path.getLastPathComponent(); + if (!focusOnAction.isEnabled()) + { + setFocusOnSelected(false); + } + else + { + } - Enumeration depthEnum = treeNode.depthFirstEnumeration(); + expandAction.setEnabled(path != null); - if (!depthEnum.hasMoreElements()) { - break; - } + if (logger != null) + { + boolean isHidden = hiddenSet.contains(logger); + popupMenu.hideCheck.setSelected(isHidden); + ignoreLoggerButton.setSelected(isHidden); + } - List depths = new ArrayList(); + collapseAction.setEnabled(path != null); - while (depthEnum.hasMoreElements()) { - depths.add( - new Integer( - ((DefaultMutableTreeNode) depthEnum.nextElement()).getDepth())); - } + reconfigureMenuText(); + } + }); - Collections.sort(depths); - Collections.reverse(depths); + logTree.addMouseListener(popupListener); - int maxDepth = ((Integer) depths.get(0)).intValue(); + /** + * This listener ensures the Tool bar toggle button and popup menu check box + * stay in sync, plus notifies all the ChangeListeners that + * an effective filter criteria has been modified + */ + focusOnAction.addPropertyChangeListener(new PropertyChangeListener() + { + public void propertyChange(PropertyChangeEvent evt) + { + popupMenu.focusOnCheck.setSelected(isFocusOnSelected()); + focusOnLoggerButton.setSelected(isFocusOnSelected()); - if (maxDepth > WARN_DEPTH) { - LogLog.warn("Should warn user, depth=" + maxDepth); - } + if (logTree.getSelectionPath() != null) + { + logTreeModel.nodeChanged( + (TreeNode) logTree.getSelectionPath().getLastPathComponent()); + } - depthEnum = treeNode.depthFirstEnumeration(); + fireChangeEvent(); + } + }); - while (depthEnum.hasMoreElements()) { - DefaultMutableTreeNode node = - (DefaultMutableTreeNode) depthEnum.nextElement(); + hideAction.addPropertyChangeListener(new PropertyChangeListener() + { + public void propertyChange(PropertyChangeEvent evt) + { + if (logTree.getSelectionPath() != null) + { + logTreeModel.nodeChanged( + (TreeNode) logTree.getSelectionPath().getLastPathComponent()); + } - if (node.isLeaf()) { - TreeNode[] nodes = - ((DefaultMutableTreeNode) node.getParent()).getPath(); - TreePath treePath = new TreePath(nodes); + fireChangeEvent(); + } + }); - LogLog.debug("Expanding path:" + treePath); + // /** + // * Now add a MouseListener that fires the expansion + // * action if CTRL + DBL CLICK is done. + // */ + // logTree.addMouseListener( + // new MouseAdapter() { + // public void mouseClicked(MouseEvent e) { + // if ( + // (e.getClickCount() > 1) + // && ((e.getModifiers() & InputEvent.CTRL_MASK) > 0) + // && ((e.getModifiers() & InputEvent.BUTTON1_MASK) > 0)) { + // expandCurrentlySelectedNode(); + // e.consume(); + // } else if (e.getClickCount() > 1) { + // super.mouseClicked(e); + // LogLog.debug("Ignoring dbl click event " + e); + // } + // } + // }); - logTree.expandPath(treePath); - } - } - } - } + logTree.addMouseListener(new MouseFocusOnListener()); - /** - * configures all the components that are used in the mini-toolbar of this - * component + /** + * We listen for when the FocusOn action changes, and then translate + * that to a RuleChange */ - private void configureToolbarPanel() { - toolbar.setFloatable(false); + addChangeListener(new ChangeListener() + { + public void stateChanged(ChangeEvent evt) + { + final String currentlySelectedLoggerName = + getCurrentlySelectedLoggerName(); - expandButton.setAction(expandAction); - expandButton.setText(null); - collapseButton.setAction(collapseAction); - collapseButton.setText(null); - focusOnLoggerButton.setAction(focusOnAction); - focusOnLoggerButton.setText(null); - ignoreLoggerButton.setAction(hideAction); - ignoreLoggerButton.setText(null); + ruleDelegate = + new AbstractRule() + { + public boolean evaluate(LoggingEvent e) + { + boolean isHidden = getHiddenSet().contains(e.getLoggerName()); + boolean result = !isHidden; + + if (result && isFocusOnSelected()) + { + result = + result + && e.getLoggerName().startsWith( + currentlySelectedLoggerName); + } - expandButton.setFont(expandButton.getFont().deriveFont(Font.BOLD)); - collapseButton.setFont(collapseButton.getFont().deriveFont(Font.BOLD)); + return result; + } + }; + firePropertyChange("rule", null, null); + } + }); - editLoggerButton.setAction(editLoggerAction); - editLoggerButton.setText(null); - closeButton.setAction(closeAction); - closeButton.setText(null); + addPropertyChangeListener("hiddenSet", new PropertyChangeListener() + { + public void propertyChange(PropertyChangeEvent arg0) + { + DefaultListModel model = new DefaultListModel(); - toolbar.add(expandButton); - toolbar.add(collapseButton); - toolbar.addSeparator(); - toolbar.add(focusOnLoggerButton); - toolbar.add(ignoreLoggerButton); + List sortedIgnoreList = new ArrayList(getHiddenSet()); + Collections.sort(sortedIgnoreList); - // toolbar.add(editLoggerButton); - toolbar.addSeparator(); + for (Iterator iter = sortedIgnoreList.iterator(); iter.hasNext();) + { + String string = (String) iter.next(); + model.addElement(string); + } - toolbar.add(Box.createHorizontalGlue()); - toolbar.add(closeButton); - toolbar.add(Box.createHorizontalStrut(5)); + ignoreList.setModel(model); + } + }); } - /** - * Ensures the Focus is set to a specific logger name - * @param string - */ - public void setFocusOn(String logger) { - DefaultMutableTreeNode node = logTreeModel.lookupLogger(logger); - - if (node != null) { - TreeNode[] nodes = node.getPath(); - TreePath treePath = new TreePath(nodes); - logTree.setSelectionPath(treePath); - - if (!focusOnLoggerButton.isSelected()) { - focusOnLoggerButton.doClick(); - } - } else { - LogLog.error("failed to lookup logger " + logger); - } + private void toggleFocusOnState() + { + setFocusOnSelected(!isFocusOnSelected()); + hideAction.setEnabled(!isFocusOnSelected()); } - /* (non-Javadoc) - * @see org.apache.log4j.chainsaw.rule.Rule#evaluate(org.apache.log4j.spi.LoggingEvent) - */ - public boolean evaluate(LoggingEvent e) { - return ruleDelegate.evaluate(e); - } + //~ Inner Classes =========================================================== /** - * - * @author Paul Smith <[EMAIL PROTECTED]> + * DOCUMENT ME! + * + * @author $author$ + * @version $Revision$, $Date$ + * + * @author Paul Smith <[EMAIL PROTECTED]> * */ - private class LoggerNameTreeCellRenderer extends DefaultTreeCellRenderer { + private class LoggerNameTreeCellRenderer extends DefaultTreeCellRenderer + { + //~ Constructors ========================================================== + // private JPanel panel = new JPanel(); - private LoggerNameTreeCellRenderer() { + private LoggerNameTreeCellRenderer() + { super(); // panel.setBackground(UIManager.getColor("Tree.textBackground")); @@ -998,12 +1098,28 @@ setOpaque(false); } + //~ Methods =============================================================== + /* (non-Javadoc) * @see javax.swing.tree.TreeCellRenderer#getTreeCellRendererComponent(javax.swing.JTree, java.lang.Object, boolean, boolean, boolean, int, boolean) */ + /** + * DOCUMENT ME! + * + * @param tree DOCUMENT ME! + * @param value DOCUMENT ME! + * @param sel DOCUMENT ME! + * @param expanded DOCUMENT ME! + * @param leaf DOCUMENT ME! + * @param row DOCUMENT ME! + * @param hasFocus DOCUMENT ME! + * + * @return DOCUMENT ME! + */ public Component getTreeCellRendererComponent( JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, - int row, boolean hasFocus) { + int row, boolean hasFocus) + { JLabel component = (JLabel) super.getTreeCellRendererComponent( tree, value, sel, expanded, leaf, row, hasFocus); @@ -1012,7 +1128,8 @@ int style = Font.PLAIN; - if (sel && focusOnLoggerButton.isSelected()) { + if (sel && focusOnLoggerButton.isSelected()) + { style = style | Font.BOLD; } @@ -1020,43 +1137,78 @@ getLoggerName( new TreePath(((DefaultMutableTreeNode) value).getPath())); - if (hiddenSet.contains(logger)) { + if (hiddenSet.contains(logger)) + { // component.setEnabled(false); // component.setIcon(leaf?null:getDefaultOpenIcon()); style = style | Font.ITALIC; // LogLog.debug("TreeRenderer: '" + logger + "' is in hiddenSet, italicizing"); - } else { + } + else + { // LogLog.debug("TreeRenderer: '" + logger + "' is NOT in hiddenSet, leaving plain"); // component.setEnabled(true); } - if (originalFont!=null) + if (originalFont != null) { Font font2 = originalFont.deriveFont(style); + if (font2 != null) { component.setFont(font2); } - } return component; } } - private class LoggerTreePopupMenu extends JPopupMenu { + private class LoggerTreePopupMenu extends JPopupMenu + { + //~ Instance fields ======================================================= + JCheckBoxMenuItem focusOnCheck = new JCheckBoxMenuItem(); JCheckBoxMenuItem hideCheck = new JCheckBoxMenuItem(); - private LoggerTreePopupMenu() { + //~ Constructors ========================================================== + + private LoggerTreePopupMenu() + { initMenu(); } + //~ Methods =============================================================== + + /* (non-Javadoc) + * @see javax.swing.JPopupMenu#show(java.awt.Component, int, int) + */ /** - * - */ - private void initMenu() { + * DOCUMENT ME! + * + * @param invoker DOCUMENT ME! + * @param x DOCUMENT ME! + * @param y DOCUMENT ME! + */ + public void show(Component invoker, int x, int y) + { + DefaultMutableTreeNode node = + (DefaultMutableTreeNode) logTree.getLastSelectedPathComponent(); + + if (node == null) + { + return; + } + + super.show(invoker, x, y); + } + + /** + * DOCUMENT ME! + */ + private void initMenu() + { add(expandAction); add(collapseAction); addSeparator(); @@ -1069,19 +1221,129 @@ addSeparator(); add(clearIgnoreListAction); } + } + + private final class MouseFocusOnListener extends MouseAdapter + { + //~ Methods =============================================================== /* (non-Javadoc) - * @see javax.swing.JPopupMenu#show(java.awt.Component, int, int) - */ - public void show(Component invoker, int x, int y) { - DefaultMutableTreeNode node = - (DefaultMutableTreeNode) logTree.getLastSelectedPathComponent(); + * @see java.awt.event.MouseListener#mouseClicked(java.awt.event.MouseEvent) + */ + /** + * DOCUMENT ME! + * + * @param e DOCUMENT ME! + */ + public void mouseClicked(MouseEvent e) + { + if ( + (e.getClickCount() > 1) + && ((e.getModifiers() & InputEvent.CTRL_MASK) > 0) + && ((e.getModifiers() & InputEvent.SHIFT_MASK) > 0)) + { + ignoreLoggerAtPoint(e.getPoint()); + e.consume(); + fireChangeEvent(); + } + else if ( + (e.getClickCount() > 1) + && ((e.getModifiers() & InputEvent.CTRL_MASK) > 0)) + { + focusAnLoggerAtPoint(e.getPoint()); + e.consume(); + fireChangeEvent(); + } + } - if (node == null) { - return; + /** + * DOCUMENT ME! + * + * @param point + */ + private void focusAnLoggerAtPoint(Point point) + { + String logger = getLoggerAtPoint(point); + + if (logger != null) + { + toggleFocusOnState(); } + } - super.show(invoker, x, y); + /** + * DOCUMENT ME! + * + * @param point + * @return + */ + private String getLoggerAtPoint(Point point) + { + TreePath path = logTree.getPathForLocation(point.x, point.y); + + if (path != null) + { + return getLoggerName(path); + } + + return null; + } + + /** + * DOCUMENT ME! + * + * @param point + */ + private void ignoreLoggerAtPoint(Point point) + { + String logger = getLoggerAtPoint(point); + + if (logger != null) + { + toggleHiddenLogger(logger); + } + } + } + + private final class MouseKeyIconListener extends MouseMotionAdapter + implements MouseMotionListener + { + //~ Instance fields ======================================================= + + Cursor focusOnCursor = + Toolkit.getDefaultToolkit().createCustomCursor( + ChainsawIcons.FOCUS_ON_ICON.getImage(), new Point(10, 10), ""); + Cursor ignoreCursor = + Toolkit.getDefaultToolkit().createCustomCursor( + ChainsawIcons.IGNORE_ICON.getImage(), new Point(10, 10), ""); + + //~ Methods =============================================================== + + /* (non-Javadoc) + * @see java.awt.event.MouseMotionListener#mouseMoved(java.awt.event.MouseEvent) + */ + /** + * DOCUMENT ME! + * + * @param e DOCUMENT ME! + */ + public void mouseMoved(MouseEvent e) + { + // LogLog.debug(e.toString()); + if ( + ((e.getModifiers() & InputEvent.CTRL_MASK) > 0) + && ((e.getModifiers() & InputEvent.SHIFT_MASK) > 0)) + { + logTree.setCursor(ignoreCursor); + } + else if ((e.getModifiers() & InputEvent.CTRL_MASK) > 0) + { + logTree.setCursor(focusOnCursor); + } + else + { + logTree.setCursor(Cursor.getDefaultCursor()); + } } } } 1.41 +9 -0 jakarta-log4j/src/java/org/apache/log4j/chainsaw/LogPanel.java Index: LogPanel.java =================================================================== RCS file: /home/cvs/jakarta-log4j/src/java/org/apache/log4j/chainsaw/LogPanel.java,v retrieving revision 1.40 retrieving revision 1.41 diff -u -r1.40 -r1.41 --- LogPanel.java 17 Dec 2003 02:06:50 -0000 1.40 +++ LogPanel.java 17 Dec 2003 04:28:04 -0000 1.41 @@ -1407,6 +1407,13 @@ getPreferenceModel().isLogTreePanelVisible()); + Set set = logTreePanel.getHiddenSet(); + int index = 0; + for (Iterator iter = set.iterator(); iter.hasNext(); ) + { + Object logger = (Object) iter.next(); + event.saveSetting("Logger.Ignore." + index++, logger.toString() ); + } saveColumnSettings(); saveColorSettings(); } @@ -1497,6 +1504,8 @@ lowerPanel.setDividerLocation(0.5d); + logTreePanel.ignore(event.getSettingsStartingWith("Logger.Ignore.")); + File f = new File(SettingsManager.getInstance().getSettingsDirectory() + File.separator + identifier + LogUI.COLUMNS_EXTENSION);
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]