src/main/java/xelfi/debugger/CallStackView.java
author Jaroslav Tulach <jaroslav.tulach@xelfi.cz>
Tue, 17 Jan 2017 21:12:37 +0100
branchDirtyFix
changeset 10 fe294d0f1297
parent 0 189280700bc7
permissions -rw-r--r--
Making the project compilable
jaroslav@0
     1
/**
jaroslav@0
     2
 * CallStackView
jaroslav@0
     3
 *
jaroslav@0
     4
 * @author Roman Blazevic
jaroslav@0
     5
 * @version 970208
jaroslav@0
     6
 */
jaroslav@0
     7
jaroslav@0
     8
package xelfi.debugger;
jaroslav@0
     9
jaroslav@0
    10
import java.awt.*;
jaroslav@0
    11
import xelfi.top.TopLevel;
jaroslav@0
    12
import xelfi.top.TopDialog;
jaroslav@0
    13
jaroslav@0
    14
public class CallStackView extends TopDialog
jaroslav@0
    15
{
jaroslav@0
    16
	private Debugger document;
jaroslav@0
    17
	private List list;
jaroslav@0
    18
	private RemoteStackFrame[] csf = null; // used for call stack choosing
jaroslav@0
    19
jaroslav@0
    20
	static final int KEY_ENTER = 10;
jaroslav@0
    21
jaroslav@0
    22
	static final int HINT_COMPLETE_UPDATE = 0;
jaroslav@0
    23
jaroslav@0
    24
	/**
jaroslav@0
    25
	 * CallStackView constructor.
jaroslav@0
    26
	 *
jaroslav@0
    27
	 * debugger - the document for this view
jaroslav@0
    28
	 */
jaroslav@0
    29
	CallStackView(Debugger debugger)
jaroslav@0
    30
	{
jaroslav@0
    31
		super(TopLevel.getMenu(), false);
jaroslav@0
    32
		setTitle("Call Stack");
jaroslav@0
    33
		//super("Call Stack");
jaroslav@0
    34
		setBackground(Color.lightGray);
jaroslav@0
    35
jaroslav@0
    36
		document = debugger;
jaroslav@0
    37
		list = new List();
jaroslav@0
    38
		add("Center", list);
jaroslav@0
    39
	}
jaroslav@0
    40
jaroslav@0
    41
	/**
jaroslav@0
    42
	 * My handleEvent() implementation.
jaroslav@0
    43
	 */
jaroslav@0
    44
	public boolean handleEvent(Event event)
jaroslav@0
    45
	{
jaroslav@0
    46
		// items with index csf.length-i-2 contains info about stack frame with index i (variable csf[i])
jaroslav@0
    47
		int selectedIndex = list.getSelectedIndex();
jaroslav@0
    48
jaroslav@0
    49
		if ((event.id == Event.KEY_PRESS && event.key == KEY_ENTER)
jaroslav@0
    50
			|| (event.id == Event.ACTION_EVENT))
jaroslav@0
    51
		{
jaroslav@0
    52
			if (selectedIndex != -1)
jaroslav@0
    53
			{
jaroslav@0
    54
				int stackFrameIndex = csf.length-selectedIndex-2;
jaroslav@0
    55
jaroslav@0
    56
				document.stackFrameChosen(csf[stackFrameIndex]);
jaroslav@0
    57
			}
jaroslav@0
    58
			return true;
jaroslav@0
    59
		}
jaroslav@0
    60
jaroslav@0
    61
		return super.handleEvent(event);
jaroslav@0
    62
	}
jaroslav@0
    63
jaroslav@0
    64
	/**
jaroslav@0
    65
	 * This method is called when the content of the view must be
jaroslav@0
    66
	 * updated.
jaroslav@0
    67
	 */
jaroslav@0
    68
	void update(int hint, int index)
jaroslav@0
    69
	{
jaroslav@0
    70
		if (!isVisible())
jaroslav@0
    71
			return;
jaroslav@0
    72
jaroslav@0
    73
		if (hint != HINT_COMPLETE_UPDATE)
jaroslav@0
    74
		{
jaroslav@0
    75
			System.out.println("unsupported hint");
jaroslav@0
    76
			return;
jaroslav@0
    77
		}
jaroslav@0
    78
jaroslav@0
    79
		csf = document.getCurrentStackFrames();
jaroslav@0
    80
jaroslav@0
    81
		if (csf == null)
jaroslav@0
    82
		{
jaroslav@0
    83
			list.clear();
jaroslav@0
    84
			return;
jaroslav@0
    85
		}
jaroslav@0
    86
jaroslav@0
    87
		int indexOfSelected = list.getSelectedIndex();
jaroslav@0
    88
		if (indexOfSelected != -1)
jaroslav@0
    89
			list.deselect(indexOfSelected);
jaroslav@0
    90
jaroslav@0
    91
		int currentStackFrameIndex = document.getCurrentStackFrameIndex();
jaroslav@0
    92
		int numberOfLines = csf.length-currentStackFrameIndex-1; // without "system" frame
jaroslav@0
    93
		// int numberOfLines = csf.length-currentStackFrameIndex;
jaroslav@0
    94
jaroslav@0
    95
		if (numberOfLines < list.countItems())
jaroslav@0
    96
			list.delItems(numberOfLines, list.countItems()-1);
jaroslav@0
    97
jaroslav@0
    98
		for(int i = csf.length-2; i >= currentStackFrameIndex; i--) // without "system" frame
jaroslav@0
    99
	{
jaroslav@0
   100
			// for(int i = csf.length-1; i >= currentStackFrameIndex; i--)
jaroslav@0
   101
			// "system" frame is that one with index csf.length-1
jaroslav@0
   102
jaroslav@0
   103
			try
jaroslav@0
   104
			{
jaroslav@0
   105
        		RemoteStackVariable lv[] = csf[i].getLocalVariables();
jaroslav@0
   106
				String string = new String();
jaroslav@0
   107
				int lastParameterIndex = -1;
jaroslav@0
   108
jaroslav@0
   109
				for(int j = lv.length-1; j >= 0; j--)
jaroslav@0
   110
					if (lv[j].methodArgument())
jaroslav@0
   111
					{
jaroslav@0
   112
						lastParameterIndex = j; // the last method argument is here
jaroslav@0
   113
						break;
jaroslav@0
   114
					}
jaroslav@0
   115
jaroslav@0
   116
				for(int j = 0; j <= lastParameterIndex; j++)
jaroslav@0
   117
					if (lv[j].methodArgument())
jaroslav@0
   118
					{
jaroslav@0
   119
						String name = lv[j].getName();
jaroslav@0
   120
jaroslav@0
   121
						string += name+": "+document.getCurrentValue(name /*, i*/);
jaroslav@0
   122
						if (j != lastParameterIndex)
jaroslav@0
   123
							string += ", ";
jaroslav@0
   124
					}
jaroslav@0
   125
jaroslav@0
   126
				// put one call stack line into the 'string' variable
jaroslav@0
   127
				string = " ["+(csf.length-i-1)+"] "+csf[i].getRemoteClass().getName()+"."
jaroslav@0
   128
					+csf[i].getMethodName()+"("+string+")";
jaroslav@0
   129
jaroslav@0
   130
				if (csf.length-i-1 > list.countItems())
jaroslav@0
   131
					list.addItem(string);
jaroslav@0
   132
				else
jaroslav@0
   133
					if (list.getItem(csf.length-i-2).compareTo(string) != 0)
jaroslav@0
   134
						list.replaceItem(string, csf.length-i-2);
jaroslav@0
   135
			}
jaroslav@0
   136
			catch(Exception e)
jaroslav@0
   137
			{
jaroslav@0
   138
				System.out.println(e);
jaroslav@0
   139
			}
jaroslav@0
   140
		}
jaroslav@0
   141
	}
jaroslav@0
   142
jaroslav@0
   143
	/**
jaroslav@0
   144
	 * My show() implementation.
jaroslav@0
   145
	 */
jaroslav@0
   146
	public void show()
jaroslav@0
   147
	{
jaroslav@0
   148
		super.show();
jaroslav@0
   149
		list.requestFocus();
jaroslav@0
   150
		document.callStackViewShown();
jaroslav@0
   151
	}
jaroslav@0
   152
}