001    package org.shiftone.jrat.provider.tree.ui.trace;
002    
003    
004    import org.shiftone.jrat.core.MethodKey;
005    import org.shiftone.jrat.desktop.util.Icons;
006    import org.shiftone.jrat.provider.tree.ui.TraceTreeNode;
007    import org.shiftone.jrat.util.log.Logger;
008    
009    import javax.swing.*;
010    import javax.swing.tree.DefaultTreeCellRenderer;
011    import javax.swing.tree.TreeCellRenderer;
012    import java.awt.*;
013    import java.text.DecimalFormat;
014    
015    
016    /**
017     * Class StackTreeCellRenderer
018     *
019     * @author jeff@shiftone.org (Jeff Drost)
020     */
021    public class StackTreeCellRenderer extends DefaultTreeCellRenderer implements TreeCellRenderer {
022    
023        private static final Logger LOG = Logger.getLogger(StackTreeCellRenderer.class);
024        private PercentColorLookup colorLookup = new PercentColorLookup();
025        private static Icon EVIL = Icons.getIcon("red.png");
026        private static Icon GOOD = Icons.getIcon("green.png");
027        private static Icon ROOT2 = Icons.getIcon("output_folder_attrib.png");
028        private static Icon ROOT = Icons.getIcon("black.png");
029        private TraceTreeNode treeNode = null;
030        private DecimalFormat pctDecimalFormat = new DecimalFormat("#,###.#'%'");
031        private DecimalFormat msDecimalFormat = new DecimalFormat("#,###,###.##'ms'");
032    
033        public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded,
034                                                      boolean leaf, int row, boolean hasFocus) {
035    
036            this.treeNode = (TraceTreeNode) value;
037            this.hasFocus = hasFocus;
038            this.selected = sel;
039    
040            double w = treeNode.getPctOfAvgParentDuration();
041            Icon icon = null;
042    
043            if (treeNode.isRootNode()) {
044                icon = ROOT;
045            } else if (treeNode.getDepth() == 1) {
046                icon = ROOT2;
047            } else {
048                icon = (w >= 25.0) ? EVIL : GOOD;
049            }
050    
051            setText(nodeText(sel));
052    
053            if (selected) {
054                setForeground(Color.white);
055            } else {
056                setForeground(Color.black);
057            }
058    
059            if (!tree.isEnabled()) {
060                setEnabled(false);
061                setDisabledIcon(icon);
062            } else {
063                setEnabled(true);
064                setIcon(icon);
065            }
066    
067            setComponentOrientation(tree.getComponentOrientation());
068    
069            return this;
070        }
071    
072    
073        public String nodeText(boolean selected) {
074    
075            String result;
076    
077            if (treeNode.isRootNode()) {
078                result = "Root";
079            } else {
080                MethodKey methodKey = treeNode.getMethodKey();
081                String methodName = methodKey.getMethodName();
082    
083                if (treeNode.getDepth() == 1) {
084                    Double avg = treeNode.getAverageDuration();
085    
086                    result = methodName + ((avg == null)
087                            ? " - never exited"
088                            : (" - " + msDecimalFormat.format(treeNode.getAverageDuration())));
089                } else {
090                    double pct = treeNode.getPctOfAvgRootDuration();
091    
092                    if (pct > 0.09) {
093                        result = methodName + " - " + pctDecimalFormat.format(pct);
094                    } else {
095                        result = methodName;
096                    }
097                }
098            }
099    
100            return result;    // + " " + treeNode.getMaxDepth();
101        }
102    }