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 }