package view; import java.awt.Color; import java.awt.Component; import java.awt.Font; import javax.swing.JTree; import javax.swing.tree.DefaultTreeCellRenderer; import lib.TextLayoutHelper; import processor.Memory; import processor.PseudoCodeNode; import processor.Memory.Visibility; /** * A tree-like display of pseudocode. * Extends {@link DefaultTreeCellRenderer} * @author kolja * */ public class PseudoCodeRenderer extends DefaultTreeCellRenderer { private static final long serialVersionUID = 1L; private Color specialColor = null; private Memory mem; private String toolTip = ""; public void setMemory( Memory m ) { mem = m; } @Override public Color getBackgroundNonSelectionColor() { if(specialColor != null) { return specialColor; } else { return RenderHelper.BACKGROUND_COLOR; } } @Override public Color getForeground() { return new Color(0xa9b7c6); } @Override public Font getFont() { return RenderHelper.font; } @Override public String getToolTipText() { return toolTip; } @Override public Component getTreeCellRendererComponent(JTree tree, Object value, boolean arg2, boolean arg3, boolean arg4, int arg5, boolean arg6) { PseudoCodeNode node = (PseudoCodeNode) value; this.doLayout(); this.setClosedIcon( null ); this.setOpenIcon( null ); this.setLeafIcon( null ); super.getTreeCellRendererComponent(tree, value, arg2, arg3, arg4, arg5, arg6); specialColor = null; if(node.isSelected()) { specialColor = new Color(0x2d6099); } else if (node.hasBreakPoint()) { specialColor = RenderHelper.BREAKPOINT_COLOR; } setText((String)node.getUserObject()); toolTip = ""; for( String var : TextLayoutHelper.getVariables( (String)node.getUserObject() ) ) { if( mem != null ) { synchronized( mem ) { if( mem.isSomewhereDefined( var, Visibility.LOCAL ) ) { Object val = mem.read( var, Visibility.LOCAL ); if( val != null ) toolTip += var + "=" + val.toString() + "
"; } } } } if( toolTip.equals( "" ) ) toolTip += "no variables found in the stack"; else toolTip = toolTip.substring( 0, toolTip.length() - 4 ); toolTip += ""; return this; } }