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 }