src/main/java/xelfi/debugger/Debugger.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
 * Debugger
jaroslav@0
     3
 *
jaroslav@0
     4
 * @author Roman Blazevic
jaroslav@0
     5
 * @version 970326
jaroslav@0
     6
 */
jaroslav@0
     7
jaroslav@0
     8
package xelfi.debugger;
jaroslav@0
     9
jaroslav@0
    10
import java.io.IOException;
jaroslav@0
    11
import java.util.*;
jaroslav@0
    12
import java.awt.Color;
jaroslav@0
    13
import java.awt.Panel;
jaroslav@0
    14
import xelfi.util.EnhProperties;
jaroslav@0
    15
import xelfi.top.*;
jaroslav@0
    16
import xelfi.editor.*;
jaroslav@0
    17
import xelfi.xedit.JavaEditorFrame;
jaroslav@0
    18
import xelfi.compiler.Output;
jaroslav@0
    19
import xelfi.execution.RunOptions;
jaroslav@0
    20
jaroslav@0
    21
//import symantec.tools.debug.*; // doesn't need TCP/IP
jaroslav@0
    22
jaroslav@0
    23
/**
jaroslav@0
    24
 * This is a main class of the Xelfi debugger.
jaroslav@0
    25
 * It is also a document on which several views can exist
jaroslav@0
    26
 * (LocalsView, CallStackView and ThreadsView).
jaroslav@0
    27
 */
jaroslav@0
    28
jaroslav@0
    29
public class Debugger implements DebuggerCallback, BackgroundCallback, XFColorCallback, XelfiOptions
jaroslav@0
    30
{
jaroslav@0
    31
	private DebuggerOptions options;
jaroslav@0
    32
jaroslav@0
    33
	private Vector remoteDebuggers;
jaroslav@0
    34
jaroslav@0
    35
	private boolean debuggingSession; // just debugging
jaroslav@0
    36
jaroslav@0
    37
	private RemoteDebugger remoteDebugger;
jaroslav@0
    38
	private RemoteThreadGroup currentThreadGroup;
jaroslav@0
    39
	private RemoteThread currentThread;
jaroslav@0
    40
jaroslav@0
    41
	private Watches watches;
jaroslav@0
    42
	private Breakpoints breakpoints;
jaroslav@0
    43
jaroslav@0
    44
	private LocalsView localsView;
jaroslav@0
    45
	private CallStackView callStackView;
jaroslav@0
    46
	private ThreadsView threadsView;
jaroslav@0
    47
jaroslav@0
    48
	private Position currentPosition = null; //some position on the current line
jaroslav@0
    49
jaroslav@0
    50
	private Breakpoint temporaryBreakpoint = null; //used "while going to cursor"
jaroslav@0
    51
jaroslav@0
    52
	// bude se delat trochu jinak
jaroslav@0
    53
	private Color currentLineBackgroundColor;
jaroslav@0
    54
	private Color breakpointLineBackgroundColor;
jaroslav@0
    55
	private Color currentLineForegroundColor;
jaroslav@0
    56
	private Color breakpointLineForegroundColor;
jaroslav@0
    57
	private Color foregroundColor; // filled in getBackground()
jaroslav@0
    58
jaroslav@0
    59
	private boolean canEnableGoFlag = true;
jaroslav@0
    60
	private boolean canEnableGoToCursorFlag = true;
jaroslav@0
    61
jaroslav@0
    62
	/**
jaroslav@0
    63
	 * Debugger constructor.
jaroslav@0
    64
	 */
jaroslav@0
    65
	public Debugger()
jaroslav@0
    66
	{
jaroslav@0
    67
		options = new DebuggerOptions();
jaroslav@0
    68
jaroslav@0
    69
		remoteDebuggers = new Vector();
jaroslav@0
    70
jaroslav@0
    71
		watches = new Watches(this);
jaroslav@0
    72
		breakpoints = new Breakpoints(this);
jaroslav@0
    73
jaroslav@0
    74
		localsView = new LocalsView(this);
jaroslav@0
    75
		callStackView = new CallStackView(this);
jaroslav@0
    76
		threadsView = new ThreadsView(this);
jaroslav@0
    77
		remoteDebugger = null;
jaroslav@0
    78
		currentThreadGroup = null;
jaroslav@0
    79
		currentThread = null;
jaroslav@0
    80
		debuggingSession = false;
jaroslav@0
    81
jaroslav@0
    82
		XFColor.addCallback(this);
jaroslav@0
    83
		TopLevel.addOption(this);
jaroslav@0
    84
	}
jaroslav@0
    85
jaroslav@0
    86
	/**
jaroslav@0
    87
	 * Implementation of the breakpointEvent from the DebuggerCallback
jaroslav@0
    88
	 */
jaroslav@0
    89
	public void breakpointEvent(RemoteThread t) throws Exception
jaroslav@0
    90
	{
jaroslav@0
    91
		canEnableGoFlag = true;
jaroslav@0
    92
		canEnableGoToCursorFlag = true;
jaroslav@0
    93
jaroslav@0
    94
		TopLevel.getMenu().enableItem(MainMenu.miDebugGo);
jaroslav@0
    95
		TopLevel.getMenu().enableItem(MainMenu.miDebugGoCursor);
jaroslav@0
    96
		TopLevel.getMenu().enableItem(MainMenu.miDebugTraceOver);
jaroslav@0
    97
		TopLevel.getMenu().enableItem(MainMenu.miDebugTraceInto);
jaroslav@0
    98
jaroslav@0
    99
		RemoteStackFrame[] stack = t.dumpStack();
jaroslav@0
   100
jaroslav@0
   101
		if (stack.length > 0)
jaroslav@0
   102
		{
jaroslav@0
   103
			//TopLevel.getOutput().println(stack[0].toString());
jaroslav@0
   104
			currentThread = t;
jaroslav@0
   105
		}
jaroslav@0
   106
		else
jaroslav@0
   107
		{
jaroslav@0
   108
			TopLevel.getOutput().show();
jaroslav@0
   109
			TopLevel.getOutput().println("invalid thread specified in breakpoint");
jaroslav@0
   110
		}
jaroslav@0
   111
jaroslav@0
   112
		if (getCurrentStackFrameIndex() == stack.length-1)
jaroslav@0
   113
		{
jaroslav@0
   114
			internalFinishDebugging(); // nebo vyber dalsi thread, ktery je na breakpointu;
jaroslav@0
   115
			return;
jaroslav@0
   116
		}
jaroslav@0
   117
jaroslav@0
   118
		String className = new String();
jaroslav@0
   119
jaroslav@0
   120
		try
jaroslav@0
   121
		{
jaroslav@0
   122
			// try to find out the class name and the line number on which we has stopped
jaroslav@0
   123
			StringTokenizer st = new StringTokenizer(stack[0].toString(), ".()");
jaroslav@0
   124
			int lineNumber = -1;
jaroslav@0
   125
			int nTokens = st.countTokens();
jaroslav@0
   126
jaroslav@0
   127
			for(int i = 3; i < nTokens; i++) // n-3 times
jaroslav@0
   128
				className = className+st.nextToken()+".";
jaroslav@0
   129
jaroslav@0
   130
			className += st.nextToken();
jaroslav@0
   131
jaroslav@0
   132
			st.nextToken();
jaroslav@0
   133
			st.nextToken(":");
jaroslav@0
   134
			lineNumber = Integer.valueOf(st.nextToken(":)")).intValue();
jaroslav@0
   135
jaroslav@0
   136
			// decide if we have stopped on the temporary breakpoint
jaroslav@0
   137
			if (temporaryBreakpoint != null)
jaroslav@0
   138
				if (lineNumber == temporaryBreakpoint.getLineNumber()
jaroslav@0
   139
					&& className.equals(temporaryBreakpoint.getClassName()))
jaroslav@0
   140
				{
jaroslav@0
   141
					// destroy the temporary breakpoint
jaroslav@0
   142
					int numberOfBreakpoints = breakpoints.getNumberOfBreakpoints();
jaroslav@0
   143
					boolean canDestroy = true;
jaroslav@0
   144
jaroslav@0
   145
					for(int i = 0; i < numberOfBreakpoints; i++)
jaroslav@0
   146
					{
jaroslav@0
   147
						Breakpoint breakpoint = breakpoints.getBreakpoint(i);
jaroslav@0
   148
jaroslav@0
   149
						if (breakpoint.getLineNumber() == temporaryBreakpoint.getLineNumber()
jaroslav@0
   150
							&& breakpoint.getClassName() == temporaryBreakpoint.getClassName()
jaroslav@0
   151
							&& breakpoint.isEnabled() && breakpoint.isValid())
jaroslav@0
   152
							canDestroy = false;
jaroslav@0
   153
					}
jaroslav@0
   154
jaroslav@0
   155
					if (canDestroy)
jaroslav@0
   156
					{
jaroslav@0
   157
						boolean success = true; // breakpoint was successfully removed from the remoteDebugger (if exists)
jaroslav@0
   158
jaroslav@0
   159
						try
jaroslav@0
   160
						{
jaroslav@0
   161
							RemoteClass rc = remoteDebugger.findClass(className);
jaroslav@0
   162
									String result;
jaroslav@0
   163
jaroslav@0
   164
							if (rc != null)
jaroslav@0
   165
							{
jaroslav@0
   166
								result = rc.clearBreakpointLine(lineNumber);
jaroslav@0
   167
										if (!result.equals(""))
jaroslav@0
   168
											success = false;
jaroslav@0
   169
							}
jaroslav@0
   170
							else
jaroslav@0
   171
								success = false;
jaroslav@0
   172
						}
jaroslav@0
   173
						catch(Exception e)
jaroslav@0
   174
						{
jaroslav@0
   175
							e.printStackTrace();
jaroslav@0
   176
							success = false;
jaroslav@0
   177
						}
jaroslav@0
   178
jaroslav@0
   179
						// if the breakpoint was succesfully removed from the debugger, we must also remove breakpoint
jaroslav@0
   180
						// line (if exists)
jaroslav@0
   181
						if (!success)
jaroslav@0
   182
						{
jaroslav@0
   183
							TopLevel.getOutput().show();
jaroslav@0
   184
							TopLevel.getOutput().println("temporary breakpoint \""+className+":"+lineNumber+"\" cannot be removed");
jaroslav@0
   185
						}
jaroslav@0
   186
						else
jaroslav@0
   187
							temporaryBreakpoint = null;
jaroslav@0
   188
					}
jaroslav@0
   189
				}
jaroslav@0
   190
jaroslav@0
   191
			// get a source and a position on which we have stopped
jaroslav@0
   192
			Source s = null;
jaroslav@0
   193
jaroslav@0
   194
			s = new Source(className, false);
jaroslav@0
   195
jaroslav@0
   196
			//JARDA - az Jaroslav opravi editor, nebude se mazat current line
jaroslav@0
   197
			//Position oldPosition = currentPosition;
jaroslav@0
   198
			currentPosition = TopLevel.getCurrentSnapshot().getPosition(s, lineNumber-1).beginOfLine();
jaroslav@0
   199
			JavaEditorFrame jef = TopLevel.showEditor(s, currentPosition, true);
jaroslav@0
   200
jaroslav@0
   201
			//if (oldPosition != null)
jaroslav@0
   202
			//	Block.line(oldPosition).redraw();
jaroslav@0
   203
jaroslav@0
   204
			Block.line(currentPosition).redraw();
jaroslav@0
   205
		}
jaroslav@0
   206
		catch (IOException e)
jaroslav@0
   207
		{
jaroslav@0
   208
			TopLevel.getOutput().show();
jaroslav@0
   209
			TopLevel.getOutput().println("class '"+className+"' not found");
jaroslav@0
   210
		}
jaroslav@0
   211
		catch (NoSuchElementException e)
jaroslav@0
   212
		{
jaroslav@0
   213
			TopLevel.getOutput().show();
jaroslav@0
   214
			TopLevel.getOutput().println("cannot get debug info for the class '"+className+"'");
jaroslav@0
   215
			TopLevel.getOutput().println("    ( is the class compiled with the -g option? )");
jaroslav@0
   216
		}
jaroslav@0
   217
jaroslav@0
   218
		watches.updateContent();
jaroslav@0
   219
		localsView.update(LocalsView.HINT_COMPLETE_UPDATE, -1);
jaroslav@0
   220
		callStackView.update(CallStackView.HINT_COMPLETE_UPDATE, -1);
jaroslav@0
   221
		threadsView.update(ThreadsView.HINT_COMPLETE_UPDATE, -1);
jaroslav@0
   222
		//threadsView.highlightThread(t);
jaroslav@0
   223
	}
jaroslav@0
   224
jaroslav@0
   225
	/**
jaroslav@0
   226
	 * Implementation of the exceptionEvent from the DebuggerCallback
jaroslav@0
   227
	 */
jaroslav@0
   228
	public void exceptionEvent(RemoteThread t, String s) throws Exception
jaroslav@0
   229
	{
jaroslav@0
   230
		Output output = TopLevel.getOutput();
jaroslav@0
   231
jaroslav@0
   232
		output.show();
jaroslav@0
   233
		output.println("exception in thread \""+t.getName()+"\": "+s);
jaroslav@0
   234
	}
jaroslav@0
   235
jaroslav@0
   236
	/**
jaroslav@0
   237
	 * Implementation of the threadDeathEvent from the DebuggerCallback
jaroslav@0
   238
	 */
jaroslav@0
   239
	public void threadDeathEvent(RemoteThread t)
jaroslav@0
   240
	{
jaroslav@0
   241
		if (t == currentThread)
jaroslav@0
   242
			internalFinishDebugging();
jaroslav@0
   243
		else
jaroslav@0
   244
			threadsView.update(ThreadsView.HINT_COMPLETE_UPDATE, -1);
jaroslav@0
   245
	}
jaroslav@0
   246
jaroslav@0
   247
	/**
jaroslav@0
   248
	 * Implementation of the quitEvent from the DebuggerCallback
jaroslav@0
   249
	 */
jaroslav@0
   250
	public void quitEvent()
jaroslav@0
   251
	{
jaroslav@0
   252
		internalFinishDebugging();
jaroslav@0
   253
	}
jaroslav@0
   254
jaroslav@0
   255
	/**
jaroslav@0
   256
	 * Implementation of the printToConsole from the DebuggerCallback
jaroslav@0
   257
	 */
jaroslav@0
   258
	public synchronized void printToConsole(String s)
jaroslav@0
   259
	{
jaroslav@0
   260
		TopLevel.getOutput().println(s);
jaroslav@0
   261
	}
jaroslav@0
   262
jaroslav@0
   263
	/**
jaroslav@0
   264
	 * Implementation of the getForeground method from the BackgroundCallback
jaroslav@0
   265
	 */
jaroslav@0
   266
	public Color getForeground()
jaroslav@0
   267
	{
jaroslav@0
   268
		return foregroundColor;
jaroslav@0
   269
	}
jaroslav@0
   270
jaroslav@0
   271
	/**
jaroslav@0
   272
	 * Implementation of the getBackground method from the BackgroundCallback
jaroslav@0
   273
	 */
jaroslav@0
   274
	// musi se delat efektivneji - nejlepe hashovat , zatim se to dela v O(n) !!!
jaroslav@0
   275
	public Color getBackground(Position p)
jaroslav@0
   276
	{
jaroslav@0
   277
		if (debuggingSession)
jaroslav@0
   278
			if (currentPosition != null)
jaroslav@0
   279
				if (p.sameLine(currentPosition))
jaroslav@0
   280
				{
jaroslav@0
   281
					foregroundColor = currentLineForegroundColor;
jaroslav@0
   282
					return currentLineBackgroundColor;
jaroslav@0
   283
				}
jaroslav@0
   284
jaroslav@0
   285
		// jeste se musime podivat, zda to neni breakpoint line
jaroslav@0
   286
		PositionInfo pInfo = TopLevel.getCurrentSnapshot().getPositionInfo(p);
jaroslav@0
   287
		String className = pInfo.getSource().getName();
jaroslav@0
   288
		int lineNumber = pInfo.getLine();
jaroslav@0
   289
jaroslav@0
   290
		int numberOfBreakpoints = breakpoints.getNumberOfBreakpoints();
jaroslav@0
   291
jaroslav@0
   292
		for(int i = 0; i < numberOfBreakpoints; i++)
jaroslav@0
   293
			if (breakpoints.getBreakpoint(i).getLineNumber()-1 == lineNumber)
jaroslav@0
   294
				if (breakpoints.getBreakpoint(i).getClassName().compareTo(className) == 0)
jaroslav@0
   295
					if (breakpoints.getBreakpoint(i).isValid() && breakpoints.getBreakpoint(i).isEnabled())
jaroslav@0
   296
					{
jaroslav@0
   297
						foregroundColor = breakpointLineForegroundColor;
jaroslav@0
   298
						return breakpointLineBackgroundColor;
jaroslav@0
   299
					}
jaroslav@0
   300
jaroslav@0
   301
		return null;
jaroslav@0
   302
	}
jaroslav@0
   303
jaroslav@0
   304
	/**
jaroslav@0
   305
	 * Implementation of the colorsChanged from the XFColorCallback
jaroslav@0
   306
	 */
jaroslav@0
   307
	public void colorsChanged()
jaroslav@0
   308
	{
jaroslav@0
   309
	   currentLineBackgroundColor = XFColor.getBgColor(XFColor.CurrentLine);
jaroslav@0
   310
		currentLineForegroundColor = XFColor.getFgColor(XFColor.CurrentLine);
jaroslav@0
   311
		breakpointLineBackgroundColor = XFColor.getBgColor(XFColor.BreakpointLine);
jaroslav@0
   312
		breakpointLineForegroundColor = XFColor.getFgColor(XFColor.BreakpointLine);
jaroslav@0
   313
	}
jaroslav@0
   314
jaroslav@0
   315
	/**
jaroslav@0
   316
	 * Implementation of the loadProperies from the XelfiOptions
jaroslav@0
   317
	 */
jaroslav@0
   318
	public void loadProperties(EnhProperties properties)
jaroslav@0
   319
	{
jaroslav@0
   320
		options.getProperties(properties);
jaroslav@0
   321
jaroslav@0
   322
		watches.getProperties(properties);
jaroslav@0
   323
		breakpoints.getProperties(properties);
jaroslav@0
   324
	}
jaroslav@0
   325
jaroslav@0
   326
	/**
jaroslav@0
   327
	 * Implementation of the storeProperties from the XelfiOptions
jaroslav@0
   328
	 */
jaroslav@0
   329
	public void storeProperties(EnhProperties properties)
jaroslav@0
   330
	{
jaroslav@0
   331
		options.putProperties(properties);
jaroslav@0
   332
jaroslav@0
   333
		watches.putProperties(properties);
jaroslav@0
   334
		breakpoints.putProperties(properties);
jaroslav@0
   335
	}
jaroslav@0
   336
jaroslav@0
   337
	/**
jaroslav@0
   338
	 * Implementation of the getPanel from the XelfiOptions
jaroslav@0
   339
	 */
jaroslav@0
   340
	public Panel getPanel()
jaroslav@0
   341
	{
jaroslav@0
   342
		return new DebuggerOptionsPanel(options);
jaroslav@0
   343
	}
jaroslav@0
   344
jaroslav@0
   345
	/**
jaroslav@0
   346
	 * Implementation of the getTabName from the XelfiOptions
jaroslav@0
   347
	 */
jaroslav@0
   348
	public String getTabName()
jaroslav@0
   349
	{
jaroslav@0
   350
		return "Debug";
jaroslav@0
   351
	}
jaroslav@0
   352
jaroslav@0
   353
	/**
jaroslav@0
   354
	 * Implementation of the onOK from the XelfiOptions
jaroslav@0
   355
	 */
jaroslav@0
   356
	public void onOK(Panel p)
jaroslav@0
   357
	{
jaroslav@0
   358
		options = ((DebuggerOptionsPanel)p).getDebuggerOptions();
jaroslav@0
   359
jaroslav@0
   360
		watches.updateContent();
jaroslav@0
   361
		localsView.update(LocalsView.HINT_COMPLETE_UPDATE, -1);
jaroslav@0
   362
		callStackView.update(CallStackView.HINT_COMPLETE_UPDATE, -1);
jaroslav@0
   363
	}
jaroslav@0
   364
jaroslav@0
   365
	/**
jaroslav@0
   366
	 * Handles Debug|Go command.
jaroslav@0
   367
	 */
jaroslav@0
   368
	public void go()
jaroslav@0
   369
	{
jaroslav@0
   370
		canEnableGoFlag = false;
jaroslav@0
   371
		canEnableGoToCursorFlag = false;
jaroslav@0
   372
jaroslav@0
   373
		TopLevel.getMenu().disableItem(MainMenu.miDebugGo);
jaroslav@0
   374
		TopLevel.getMenu().disableItem(MainMenu.miDebugGoCursor);
jaroslav@0
   375
		TopLevel.getMenu().disableItem(MainMenu.miDebugTraceOver);
jaroslav@0
   376
		TopLevel.getMenu().disableItem(MainMenu.miDebugTraceInto);
jaroslav@0
   377
jaroslav@0
   378
		if (!debuggingSession)
jaroslav@0
   379
		{
jaroslav@0
   380
			try
jaroslav@0
   381
			{
jaroslav@0
   382
				if (!initDebuggingSession())
jaroslav@0
   383
				{
jaroslav@0
   384
					finishDebugging();
jaroslav@0
   385
					/*canEnableGoFlag = false;
jaroslav@0
   386
					canEnableGoToCursorFlag = false;
jaroslav@0
   387
jaroslav@0
   388
					TopLevel.getMenu().enableItem(MainMenu.miDebugGo);
jaroslav@0
   389
					TopLevel.getMenu().enableItem(MainMenu.miDebugGoCursor);*/
jaroslav@0
   390
jaroslav@0
   391
					return;
jaroslav@0
   392
				}
jaroslav@0
   393
jaroslav@0
   394
				if (remoteDebugger.listBreakpoints().length == 0)
jaroslav@0
   395
					if (!setDefaultBreakpoint())
jaroslav@0
   396
					{
jaroslav@0
   397
						finishDebugging();
jaroslav@0
   398
						/*canEnableGoFlag = false;
jaroslav@0
   399
						canEnableGoToCursorFlag = false;
jaroslav@0
   400
jaroslav@0
   401
						TopLevel.getMenu().enableItem(MainMenu.miDebugGo);
jaroslav@0
   402
						TopLevel.getMenu().enableItem(MainMenu.miDebugGoCursor);*/
jaroslav@0
   403
jaroslav@0
   404
						return;
jaroslav@0
   405
					}
jaroslav@0
   406
jaroslav@0
   407
jaroslav@0
   408
                            StringTokenizer st = new StringTokenizer(RunOptions.getArguments());
jaroslav@0
   409
                            int nTokens = st.countTokens();
jaroslav@0
   410
                            String args[] = new String[1+nTokens];
jaroslav@0
   411
jaroslav@0
   412
                            args[0] = new String(getClassToDebug());
jaroslav@0
   413
                            for(int i = 1; i <= nTokens; i++)
jaroslav@0
   414
                                args[i] = st.nextToken();
jaroslav@0
   415
jaroslav@0
   416
                            currentThreadGroup = remoteDebugger.run(1+nTokens, args);
jaroslav@0
   417
			    // setThread(1);
jaroslav@0
   418
			}
jaroslav@0
   419
			catch(Exception e)
jaroslav@0
   420
			{
jaroslav@0
   421
				e.printStackTrace();
jaroslav@0
   422
			};
jaroslav@0
   423
		}
jaroslav@0
   424
		else
jaroslav@0
   425
		{
jaroslav@0
   426
			if (currentThread == null)
jaroslav@0
   427
			{
jaroslav@0
   428
				System.err.println("nothing suspended");
jaroslav@0
   429
				return;
jaroslav@0
   430
			}
jaroslav@0
   431
jaroslav@0
   432
			try
jaroslav@0
   433
			{
jaroslav@0
   434
				currentThread.cont();
jaroslav@0
   435
			}
jaroslav@0
   436
			catch(Exception e)
jaroslav@0
   437
			{
jaroslav@0
   438
				e.printStackTrace();
jaroslav@0
   439
			};
jaroslav@0
   440
jaroslav@0
   441
			currentThread.resetCurrentFrameIndex();
jaroslav@0
   442
		}
jaroslav@0
   443
jaroslav@0
   444
		// JARDA - dokud Jarda neopravi, bude se to delat az v breakpointEvent
jaroslav@0
   445
		// decolor the current line
jaroslav@0
   446
		if (currentPosition != null)
jaroslav@0
   447
		{
jaroslav@0
   448
			Position oldPosition = currentPosition;
jaroslav@0
   449
jaroslav@0
   450
			currentPosition = null;
jaroslav@0
   451
			Block.line(oldPosition).redraw();
jaroslav@0
   452
		}
jaroslav@0
   453
	}
jaroslav@0
   454
jaroslav@0
   455
	/**
jaroslav@0
   456
	 * Handles Debug|GoToCursor command.
jaroslav@0
   457
	 */
jaroslav@0
   458
	public void goToCursor(Source s, Position p)
jaroslav@0
   459
	{
jaroslav@0
   460
		canEnableGoFlag = false;
jaroslav@0
   461
		canEnableGoToCursorFlag = false;
jaroslav@0
   462
jaroslav@0
   463
		TopLevel.getMenu().disableItem(MainMenu.miDebugGo);
jaroslav@0
   464
		TopLevel.getMenu().disableItem(MainMenu.miDebugGoCursor);
jaroslav@0
   465
		TopLevel.getMenu().disableItem(MainMenu.miDebugTraceOver);
jaroslav@0
   466
		TopLevel.getMenu().disableItem(MainMenu.miDebugTraceInto);
jaroslav@0
   467
jaroslav@0
   468
		if (!debuggingSession)
jaroslav@0
   469
		{
jaroslav@0
   470
			try
jaroslav@0
   471
			{
jaroslav@0
   472
				if (!initDebuggingSession())
jaroslav@0
   473
				{
jaroslav@0
   474
					canEnableGoFlag = false;
jaroslav@0
   475
					canEnableGoToCursorFlag = false;
jaroslav@0
   476
jaroslav@0
   477
					TopLevel.getMenu().enableItem(MainMenu.miDebugGo);
jaroslav@0
   478
					TopLevel.getMenu().enableItem(MainMenu.miDebugGoCursor);
jaroslav@0
   479
jaroslav@0
   480
					return;
jaroslav@0
   481
				}
jaroslav@0
   482
jaroslav@0
   483
				setTemporaryBreakpoint(s, p);
jaroslav@0
   484
jaroslav@0
   485
                            StringTokenizer st = new StringTokenizer(RunOptions.getArguments());
jaroslav@0
   486
                            int nTokens = st.countTokens();
jaroslav@0
   487
                            String args[] = new String[1+nTokens];
jaroslav@0
   488
jaroslav@0
   489
                            args[0] = new String(getClassToDebug());
jaroslav@0
   490
                            for(int i = 1; i <= nTokens; i++)
jaroslav@0
   491
                                args[i] = st.nextToken();
jaroslav@0
   492
jaroslav@0
   493
                            currentThreadGroup = remoteDebugger.run(1+nTokens, args);
jaroslav@0
   494
                            // setThread(1);
jaroslav@0
   495
			}
jaroslav@0
   496
			catch(Exception e)
jaroslav@0
   497
			{
jaroslav@0
   498
				e.printStackTrace();
jaroslav@0
   499
			};
jaroslav@0
   500
		}
jaroslav@0
   501
		else
jaroslav@0
   502
		{
jaroslav@0
   503
			if (currentThread == null)
jaroslav@0
   504
			{
jaroslav@0
   505
				System.err.println("nothing suspended");
jaroslav@0
   506
				return;
jaroslav@0
   507
			}
jaroslav@0
   508
jaroslav@0
   509
			try
jaroslav@0
   510
			{
jaroslav@0
   511
				setTemporaryBreakpoint(s, p);
jaroslav@0
   512
				currentThread.cont();
jaroslav@0
   513
			}
jaroslav@0
   514
			catch(Exception e)
jaroslav@0
   515
			{
jaroslav@0
   516
				e.printStackTrace();
jaroslav@0
   517
			};
jaroslav@0
   518
jaroslav@0
   519
			currentThread.resetCurrentFrameIndex();
jaroslav@0
   520
		}
jaroslav@0
   521
jaroslav@0
   522
		// JARDA - dokud Jarda neopravi, bude se to delat az v breakpointEvent
jaroslav@0
   523
		// decolor the current line
jaroslav@0
   524
		if (currentPosition != null)
jaroslav@0
   525
		{
jaroslav@0
   526
			Position oldPosition = currentPosition;
jaroslav@0
   527
jaroslav@0
   528
			currentPosition = null;
jaroslav@0
   529
			Block.line(oldPosition).redraw();
jaroslav@0
   530
		}
jaroslav@0
   531
	}
jaroslav@0
   532
jaroslav@0
   533
	void internalFinishDebugging()
jaroslav@0
   534
	{
jaroslav@0
   535
		canEnableGoFlag = true;
jaroslav@0
   536
		canEnableGoToCursorFlag = true;
jaroslav@0
   537
jaroslav@0
   538
		Position oldPosition = currentPosition;
jaroslav@0
   539
jaroslav@0
   540
		doneDebuggingSession(false);
jaroslav@0
   541
jaroslav@0
   542
		currentPosition = null;
jaroslav@0
   543
		if (oldPosition != null)
jaroslav@0
   544
			Block.line(oldPosition).redraw();
jaroslav@0
   545
jaroslav@0
   546
		watches.updateContent();
jaroslav@0
   547
		localsView.update(LocalsView.HINT_COMPLETE_UPDATE, -1);
jaroslav@0
   548
		callStackView.update(CallStackView.HINT_COMPLETE_UPDATE, -1);
jaroslav@0
   549
		threadsView.update(ThreadsView.HINT_COMPLETE_UPDATE, -1);
jaroslav@0
   550
	}
jaroslav@0
   551
jaroslav@0
   552
	/**
jaroslav@0
   553
	 * Handles Debug|FinishDebugging command.
jaroslav@0
   554
	 */
jaroslav@0
   555
	public void finishDebugging()
jaroslav@0
   556
	{
jaroslav@0
   557
		canEnableGoFlag = true;
jaroslav@0
   558
		canEnableGoToCursorFlag = true;
jaroslav@0
   559
jaroslav@0
   560
		Position oldPosition = currentPosition;
jaroslav@0
   561
jaroslav@0
   562
		doneDebuggingSession(true);
jaroslav@0
   563
jaroslav@0
   564
		currentPosition = null;
jaroslav@0
   565
		if (oldPosition != null)
jaroslav@0
   566
			Block.line(oldPosition).redraw();
jaroslav@0
   567
jaroslav@0
   568
		watches.updateContent();
jaroslav@0
   569
		localsView.update(LocalsView.HINT_COMPLETE_UPDATE, -1);
jaroslav@0
   570
		callStackView.update(CallStackView.HINT_COMPLETE_UPDATE, -1);
jaroslav@0
   571
		threadsView.update(ThreadsView.HINT_COMPLETE_UPDATE, -1);
jaroslav@0
   572
	}
jaroslav@0
   573
jaroslav@0
   574
	/**
jaroslav@0
   575
	 * Handles Debug|RestartDebugging command.
jaroslav@0
   576
	 */
jaroslav@0
   577
	public void restartDebugging()
jaroslav@0
   578
	{
jaroslav@0
   579
		try
jaroslav@0
   580
		{
jaroslav@0
   581
			finishDebugging();
jaroslav@0
   582
			go();
jaroslav@0
   583
		}
jaroslav@0
   584
		catch(Exception e)
jaroslav@0
   585
		{
jaroslav@0
   586
			e.printStackTrace();
jaroslav@0
   587
		}
jaroslav@0
   588
	}
jaroslav@0
   589
jaroslav@0
   590
	/**
jaroslav@0
   591
	 * Handles Debug|TraceOver command.
jaroslav@0
   592
	 */
jaroslav@0
   593
	public void traceOver()
jaroslav@0
   594
	{
jaroslav@0
   595
		canEnableGoFlag = false;
jaroslav@0
   596
		canEnableGoToCursorFlag = false;
jaroslav@0
   597
jaroslav@0
   598
		TopLevel.getMenu().disableItem(MainMenu.miDebugGo);
jaroslav@0
   599
		TopLevel.getMenu().disableItem(MainMenu.miDebugGoCursor);
jaroslav@0
   600
		TopLevel.getMenu().disableItem(MainMenu.miDebugTraceOver);
jaroslav@0
   601
		TopLevel.getMenu().disableItem(MainMenu.miDebugTraceInto);
jaroslav@0
   602
jaroslav@0
   603
		if (currentThread == null)
jaroslav@0
   604
		{
jaroslav@0
   605
			System.err.println("nothing suspended");
jaroslav@0
   606
			return;
jaroslav@0
   607
		}
jaroslav@0
   608
jaroslav@0
   609
		try
jaroslav@0
   610
		{
jaroslav@0
   611
			currentThread.next();
jaroslav@0
   612
		}
jaroslav@0
   613
		catch(IllegalAccessError e)
jaroslav@0
   614
		{
jaroslav@0
   615
			//"Current thread is not at breakpoint."
jaroslav@0
   616
			e.printStackTrace();
jaroslav@0
   617
		}
jaroslav@0
   618
		catch(Exception e)
jaroslav@0
   619
		{
jaroslav@0
   620
			e.printStackTrace();
jaroslav@0
   621
		}
jaroslav@0
   622
jaroslav@0
   623
	// JARDA - dokud Jarda neopravi, bude se to delat az v breakpointEvent
jaroslav@0
   624
		// decolor the current line
jaroslav@0
   625
		if (currentPosition != null)
jaroslav@0
   626
		{
jaroslav@0
   627
			Position oldPosition = currentPosition;
jaroslav@0
   628
jaroslav@0
   629
			currentPosition = null;
jaroslav@0
   630
			Block.line(oldPosition).redraw();
jaroslav@0
   631
		}
jaroslav@0
   632
	}
jaroslav@0
   633
jaroslav@0
   634
	/**
jaroslav@0
   635
	 * Handles Debug|TraceInto command.
jaroslav@0
   636
	 */
jaroslav@0
   637
	public void traceInto()
jaroslav@0
   638
	{
jaroslav@0
   639
		canEnableGoFlag = false;
jaroslav@0
   640
		canEnableGoToCursorFlag = false;
jaroslav@0
   641
jaroslav@0
   642
		TopLevel.getMenu().disableItem(MainMenu.miDebugGo);
jaroslav@0
   643
		TopLevel.getMenu().disableItem(MainMenu.miDebugGoCursor);
jaroslav@0
   644
		TopLevel.getMenu().disableItem(MainMenu.miDebugTraceOver);
jaroslav@0
   645
		TopLevel.getMenu().disableItem(MainMenu.miDebugTraceInto);
jaroslav@0
   646
jaroslav@0
   647
		if (currentThread == null)
jaroslav@0
   648
		{
jaroslav@0
   649
			System.err.println("nothing suspended");
jaroslav@0
   650
			return;
jaroslav@0
   651
		}
jaroslav@0
   652
jaroslav@0
   653
		try
jaroslav@0
   654
		{
jaroslav@0
   655
			currentThread.step(true);
jaroslav@0
   656
		}
jaroslav@0
   657
		catch(IllegalAccessError e)
jaroslav@0
   658
		{
jaroslav@0
   659
			//"Current thread is not at breakpoint."
jaroslav@0
   660
			e.printStackTrace();
jaroslav@0
   661
		}
jaroslav@0
   662
		catch(Exception e)
jaroslav@0
   663
		{
jaroslav@0
   664
			e.printStackTrace();
jaroslav@0
   665
		}
jaroslav@0
   666
jaroslav@0
   667
		// JARDA - dokud Jarda neopravi, bude se to delat az v breakpointEvent
jaroslav@0
   668
		// decolor the current line
jaroslav@0
   669
		if (currentPosition != null)
jaroslav@0
   670
		{
jaroslav@0
   671
			Position oldPosition = currentPosition;
jaroslav@0
   672
jaroslav@0
   673
			currentPosition = null;
jaroslav@0
   674
			Block.line(oldPosition).redraw();
jaroslav@0
   675
		}
jaroslav@0
   676
	}
jaroslav@0
   677
jaroslav@0
   678
	/**
jaroslav@0
   679
	 * Handles Debug|ToggleBreakpoint command.
jaroslav@0
   680
	 */
jaroslav@0
   681
	public void toggleBreakpoint(Source s, Position p)
jaroslav@0
   682
	{
jaroslav@0
   683
		PositionInfo pInfo = TopLevel.getCurrentSnapshot().getPositionInfo(p);
jaroslav@0
   684
		String className = pInfo.getSource().getName();
jaroslav@0
   685
		int lineNumber = pInfo.getLine()+1;
jaroslav@0
   686
		int numberOfBreakpoints = breakpoints.getNumberOfBreakpoints();
jaroslav@0
   687
		int index = -1;
jaroslav@0
   688
jaroslav@0
   689
		for(int i = 0; i < numberOfBreakpoints; i++)
jaroslav@0
   690
		{
jaroslav@0
   691
			Breakpoint breakpoint = breakpoints.getBreakpoint(i);
jaroslav@0
   692
jaroslav@0
   693
			if (className.equals(breakpoint.getClassName()) &&
jaroslav@0
   694
				lineNumber == breakpoint.getLineNumber())
jaroslav@0
   695
			{
jaroslav@0
   696
				index = i;
jaroslav@0
   697
				break; // breakpoint is already set
jaroslav@0
   698
			}
jaroslav@0
   699
		}
jaroslav@0
   700
jaroslav@0
   701
		if (index == -1)
jaroslav@0
   702
			breakpoints.addBreakpoint(new Breakpoint(className, lineNumber));
jaroslav@0
   703
		else
jaroslav@0
   704
			breakpoints.removeBreakpoint(index);
jaroslav@0
   705
	}
jaroslav@0
   706
jaroslav@0
   707
	/**
jaroslav@0
   708
	 * Handles Debug|AddWatch command.
jaroslav@0
   709
	 */
jaroslav@0
   710
	public void addWatch()
jaroslav@0
   711
	{
jaroslav@0
   712
		watches.getView().addWatch();
jaroslav@0
   713
	}
jaroslav@0
   714
jaroslav@0
   715
	/**
jaroslav@0
   716
	 * Initializes the debugging session.
jaroslav@0
   717
	 * Returns false if it is not possible to continue (don't know which class to start).
jaroslav@0
   718
	 */
jaroslav@0
   719
	boolean initDebuggingSession() throws Exception
jaroslav@0
   720
	{
jaroslav@0
   721
		TopLevel.getOutput().clear();
jaroslav@0
   722
jaroslav@0
   723
		if (getClassToDebug().equals(""))
jaroslav@0
   724
		{
jaroslav@0
   725
			TopLevel.getOutput().show();
jaroslav@0
   726
			TopLevel.getOutput().println("don't know which class to start");
jaroslav@0
   727
			return false;
jaroslav@0
   728
		}
jaroslav@0
   729
jaroslav@0
   730
		TopLevel.getMenu().enableItem(MainMenu.miDebugFinish);
jaroslav@0
   731
		TopLevel.getMenu().enableItem(MainMenu.miDebugRestart);
jaroslav@0
   732
jaroslav@0
   733
		try
jaroslav@0
   734
		{
jaroslav@0
   735
			TopLevel.getOutput().show();
jaroslav@0
   736
			TopLevel.getOutput().println("debugger session is starting ...");
jaroslav@0
   737
jaroslav@0
   738
			remoteDebugger = new RemoteDebugger("", this, false);
jaroslav@0
   739
			remoteDebuggers.addElement(remoteDebugger);
jaroslav@0
   740
jaroslav@0
   741
			TopLevel.getOutput().clear();
jaroslav@0
   742
			TopLevel.getOutput().println("debugger session has started");
jaroslav@0
   743
		}
jaroslav@0
   744
		catch(Exception e)
jaroslav@0
   745
		{
jaroslav@0
   746
			e.printStackTrace();
jaroslav@0
   747
		}
jaroslav@0
   748
jaroslav@0
   749
		int numberOfBreakpoints = breakpoints.getNumberOfBreakpoints();
jaroslav@0
   750
jaroslav@0
   751
		debuggingSession = true;
jaroslav@0
   752
		for(int i = 0; i < numberOfBreakpoints; i++)
jaroslav@0
   753
		{
jaroslav@0
   754
			Breakpoint breakpoint = breakpoints.getBreakpoint(i);
jaroslav@0
   755
jaroslav@0
   756
			if (breakpoint.isEnabled())
jaroslav@0
   757
				addBreakpoint(breakpoint);
jaroslav@0
   758
		}
jaroslav@0
   759
jaroslav@0
   760
		breakpoints.updateContent();
jaroslav@0
   761
		return true;
jaroslav@0
   762
	}
jaroslav@0
   763
jaroslav@0
   764
	/**
jaroslav@0
   765
	 * Closes the debugging session.
jaroslav@0
   766
	 */
jaroslav@0
   767
	void doneDebuggingSession(boolean closeDebugger)
jaroslav@0
   768
	{
jaroslav@0
   769
		try
jaroslav@0
   770
		{
jaroslav@0
   771
			if (remoteDebugger != null)
jaroslav@0
   772
			{
jaroslav@0
   773
				// stop all threads
jaroslav@0
   774
				RemoteThreadGroup[] rtg = getThreadGroups();
jaroslav@0
   775
jaroslav@0
   776
				if (rtg != null)
jaroslav@0
   777
					for(int i = 0; i < rtg.length; i++)
jaroslav@0
   778
					{
jaroslav@0
   779
						try
jaroslav@0
   780
						{
jaroslav@0
   781
							//without system thread group
jaroslav@0
   782
							if (rtg[i].getName().equals("system"))
jaroslav@0
   783
								continue;
jaroslav@0
   784
jaroslav@0
   785
							RemoteThread rt[] = rtg[i].listThreads(true);
jaroslav@0
   786
							if (rt == null)
jaroslav@0
   787
								continue;
jaroslav@0
   788
jaroslav@0
   789
							for(int j = 0; j < rt.length; j++)
jaroslav@0
   790
								if (rt[j] != null)
jaroslav@0
   791
									rt[j].stop();
jaroslav@0
   792
						}
jaroslav@0
   793
						catch(Exception e)
jaroslav@0
   794
						{
jaroslav@0
   795
							//e.printStackTrace();
jaroslav@0
   796
						}
jaroslav@0
   797
					}
jaroslav@0
   798
jaroslav@0
   799
             if (closeDebugger)
jaroslav@0
   800
             {
jaroslav@0
   801
                 remoteDebugger.close();
jaroslav@0
   802
                 remoteDebuggers.removeElement(remoteDebugger);
jaroslav@0
   803
             }
jaroslav@0
   804
             else
jaroslav@0
   805
                 remoteDebuggers.removeElement(remoteDebugger);
jaroslav@0
   806
jaroslav@0
   807
				if (debuggingSession)
jaroslav@0
   808
				{
jaroslav@0
   809
					debuggingSession = false;
jaroslav@0
   810
jaroslav@0
   811
					TopLevel.getOutput().show();
jaroslav@0
   812
					TopLevel.getOutput().println("debugger session has finished");
jaroslav@0
   813
				}
jaroslav@0
   814
jaroslav@0
   815
				currentThread = null;
jaroslav@0
   816
				currentThreadGroup = null;
jaroslav@0
   817
				remoteDebugger = null;
jaroslav@0
   818
			}
jaroslav@0
   819
jaroslav@0
   820
			TopLevel.getMenu().enableItem(MainMenu.miDebugGo);
jaroslav@0
   821
			TopLevel.getMenu().enableItem(MainMenu.miDebugGoCursor);
jaroslav@0
   822
			TopLevel.getMenu().disableItem(MainMenu.miDebugFinish);
jaroslav@0
   823
			TopLevel.getMenu().disableItem(MainMenu.miDebugRestart);
jaroslav@0
   824
jaroslav@0
   825
			TopLevel.getMenu().disableItem(MainMenu.miDebugTraceOver);
jaroslav@0
   826
			TopLevel.getMenu().disableItem(MainMenu.miDebugTraceInto);
jaroslav@0
   827
		}
jaroslav@0
   828
		catch(Exception e)
jaroslav@0
   829
		{ }
jaroslav@0
   830
	}
jaroslav@0
   831
jaroslav@0
   832
	/**
jaroslav@0
   833
	 * This method is called by the CallStackView when
jaroslav@0
   834
	 * a stack frame is chosen.
jaroslav@0
   835
	 */
jaroslav@0
   836
	void stackFrameChosen(RemoteStackFrame rsf)
jaroslav@0
   837
	{
jaroslav@0
   838
		String className = null;
jaroslav@0
   839
jaroslav@0
   840
		try
jaroslav@0
   841
		{
jaroslav@10
   842
			RemoteStackFrame.Name rc = rsf.getRemoteClass();
jaroslav@0
   843
jaroslav@0
   844
			if (rc == null)
jaroslav@0
   845
				System.out.println("invalid stack frame");
jaroslav@0
   846
jaroslav@0
   847
			try
jaroslav@0
   848
			{
jaroslav@0
   849
				className = rc.getName();
jaroslav@0
   850
			}
jaroslav@0
   851
			catch(Exception e)
jaroslav@0
   852
			{
jaroslav@0
   853
				className = null;
jaroslav@0
   854
				e.printStackTrace();
jaroslav@0
   855
			}
jaroslav@0
   856
jaroslav@0
   857
			int lineNumber = rsf.getLineNumber();
jaroslav@0
   858
jaroslav@0
   859
			if (className == null)
jaroslav@0
   860
				System.out.println("invalid class name");
jaroslav@0
   861
jaroslav@0
   862
			// get a source and a position
jaroslav@0
   863
    		Source s = new Source(className, false);
jaroslav@0
   864
			Position p = TopLevel.getCurrentSnapshot().getPosition(s, lineNumber-1).beginOfLine();
jaroslav@0
   865
jaroslav@0
   866
			TopLevel.showEditor(s, p, true);
jaroslav@0
   867
		}
jaroslav@0
   868
		catch (IOException e)
jaroslav@0
   869
		{
jaroslav@0
   870
			TopLevel.getOutput().show();
jaroslav@0
   871
			TopLevel.getOutput().println("source code for class '"+className+"' not found");
jaroslav@0
   872
		}
jaroslav@0
   873
	}
jaroslav@0
   874
jaroslav@0
   875
	/**
jaroslav@0
   876
	 * Called when final clean up is neccessary.
jaroslav@0
   877
	 */
jaroslav@0
   878
	public void shutdown()
jaroslav@0
   879
	{
jaroslav@0
   880
		for(int i = 0; i < remoteDebuggers.size(); i++)
jaroslav@0
   881
		{
jaroslav@0
   882
			try
jaroslav@0
   883
			{
jaroslav@0
   884
				remoteDebugger = (RemoteDebugger)remoteDebuggers.elementAt(i);
jaroslav@0
   885
jaroslav@0
   886
				// stop all threads
jaroslav@0
   887
				RemoteThreadGroup[] rtg = getThreadGroups();
jaroslav@0
   888
jaroslav@0
   889
				if (rtg != null)
jaroslav@0
   890
					for(int k = 0; k < rtg.length; k++)
jaroslav@0
   891
					{
jaroslav@0
   892
						try
jaroslav@0
   893
						{
jaroslav@0
   894
							//without system thread group
jaroslav@0
   895
							if (rtg[k].getName().equals("system"))
jaroslav@0
   896
								continue;
jaroslav@0
   897
jaroslav@0
   898
							RemoteThread rt[] = rtg[k].listThreads(true);
jaroslav@0
   899
							if (rt == null)
jaroslav@0
   900
								continue;
jaroslav@0
   901
jaroslav@0
   902
							for(int j = 0; j < rt.length; j++)
jaroslav@0
   903
								if (rt[j] != null)
jaroslav@0
   904
									rt[j].stop();
jaroslav@0
   905
						}
jaroslav@0
   906
						catch(Exception e)
jaroslav@0
   907
						{
jaroslav@0
   908
							e.printStackTrace();
jaroslav@0
   909
						}
jaroslav@0
   910
					}
jaroslav@0
   911
jaroslav@0
   912
            remoteDebugger.close();
jaroslav@0
   913
            remoteDebuggers.removeElement(remoteDebugger);
jaroslav@0
   914
				//((RemoteDebugger)remoteDebuggers.elementAt(i)).close();
jaroslav@0
   915
			}
jaroslav@0
   916
			catch(Exception e)
jaroslav@0
   917
			{
jaroslav@0
   918
				//e.printStackTrace();
jaroslav@0
   919
				//because some RemoteDebuggers are already closed
jaroslav@0
   920
         }
jaroslav@0
   921
		}
jaroslav@0
   922
	}
jaroslav@0
   923
jaroslav@0
   924
	/**
jaroslav@0
   925
	 * Sets the default breakpoint (on method <main class>.main).
jaroslav@0
   926
	 */
jaroslav@0
   927
	boolean setDefaultBreakpoint()
jaroslav@0
   928
	{
jaroslav@0
   929
		boolean success = true; // breakpoint was successfully added into the remoteDebugger (if exists)
jaroslav@0
   930
jaroslav@0
   931
		try
jaroslav@0
   932
		{
jaroslav@0
   933
			RemoteClass rc = remoteDebugger.findClass(getClassToDebug());
jaroslav@0
   934
			String result;
jaroslav@0
   935
jaroslav@0
   936
			if (rc != null)
jaroslav@0
   937
			{
jaroslav@0
   938
				RemoteField rf = rc.getMethod("main");
jaroslav@0
   939
jaroslav@0
   940
				if (rf != null)
jaroslav@0
   941
				{
jaroslav@0
   942
					result = rc.setBreakpointMethod(rf);;
jaroslav@0
   943
					if (!result.equals(""))
jaroslav@0
   944
						success = false;
jaroslav@0
   945
				}
jaroslav@0
   946
				else
jaroslav@0
   947
					success = false;
jaroslav@0
   948
			}
jaroslav@0
   949
			else
jaroslav@0
   950
				success = false;
jaroslav@0
   951
		}
jaroslav@0
   952
		catch(Exception e)
jaroslav@0
   953
		{
jaroslav@0
   954
			e.printStackTrace();
jaroslav@0
   955
			success = false;
jaroslav@0
   956
		}
jaroslav@0
   957
jaroslav@0
   958
		if (!success)
jaroslav@0
   959
		{
jaroslav@0
   960
			TopLevel.getOutput().show();
jaroslav@0
   961
			TopLevel.getOutput().println("default breakpoint \""+getClassToDebug()+".main\" cannot be set");
jaroslav@0
   962
			TopLevel.getOutput().println("    ( is the class compiled with the -g option? )");
jaroslav@0
   963
			return false;
jaroslav@0
   964
		}
jaroslav@0
   965
		else
jaroslav@0
   966
			return true;
jaroslav@0
   967
	}
jaroslav@0
   968
jaroslav@0
   969
	/**
jaroslav@0
   970
	 * Sets the temporary breakpoint.
jaroslav@0
   971
	 */
jaroslav@0
   972
	void setTemporaryBreakpoint(Source s, Position p)
jaroslav@0
   973
	{
jaroslav@0
   974
		PositionInfo pInfo = TopLevel.getCurrentSnapshot().getPositionInfo(p);
jaroslav@0
   975
		String className = pInfo.getSource().getName();
jaroslav@0
   976
		int lineNumber = pInfo.getLine()+1;
jaroslav@0
   977
jaroslav@0
   978
		boolean success = true; // breakpoint was successfully added into the remoteDebugger (if exists)
jaroslav@0
   979
jaroslav@0
   980
		try
jaroslav@0
   981
		{
jaroslav@0
   982
			RemoteClass rc = remoteDebugger.findClass(className);
jaroslav@0
   983
			String result;
jaroslav@0
   984
jaroslav@0
   985
		if (rc != null)
jaroslav@0
   986
		{
jaroslav@0
   987
			result = rc.setBreakpointLine(lineNumber);
jaroslav@0
   988
jaroslav@0
   989
			if (!result.equals(""))
jaroslav@0
   990
			{
jaroslav@0
   991
				rc.clearBreakpointLine(lineNumber);
jaroslav@0
   992
				success = false;
jaroslav@0
   993
			}
jaroslav@0
   994
		}
jaroslav@0
   995
		else
jaroslav@0
   996
			success = false;
jaroslav@0
   997
		}
jaroslav@0
   998
	catch(Exception e)
jaroslav@0
   999
	{
jaroslav@0
  1000
		e.printStackTrace();
jaroslav@0
  1001
		success = false;
jaroslav@0
  1002
	}
jaroslav@0
  1003
jaroslav@0
  1004
	if (!success)
jaroslav@0
  1005
		{
jaroslav@0
  1006
			TopLevel.getOutput().show();
jaroslav@0
  1007
			TopLevel.getOutput().println("temporary breakpoint \""+className+":"+lineNumber+"\" cannot be set");
jaroslav@0
  1008
			temporaryBreakpoint = null;
jaroslav@0
  1009
		}
jaroslav@0
  1010
		else
jaroslav@0
  1011
			temporaryBreakpoint = new Breakpoint(className, lineNumber);
jaroslav@0
  1012
	}
jaroslav@0
  1013
jaroslav@0
  1014
	/**
jaroslav@0
  1015
	 * Returns true if the debugger allows to enable the Debug|Go command.
jaroslav@0
  1016
	 */
jaroslav@0
  1017
	public boolean canEnableGo()
jaroslav@0
  1018
	{
jaroslav@0
  1019
		return canEnableGoFlag;
jaroslav@0
  1020
	}
jaroslav@0
  1021
jaroslav@0
  1022
	/**
jaroslav@0
  1023
	 * Returns true if the debugger allows to enable the Debug|GoToCursor command.
jaroslav@0
  1024
	 */
jaroslav@0
  1025
	public boolean canEnableGoToCursor()
jaroslav@0
  1026
	{
jaroslav@0
  1027
		return canEnableGoToCursorFlag;
jaroslav@0
  1028
	}
jaroslav@0
  1029
jaroslav@0
  1030
	/**
jaroslav@0
  1031
	 * Called by the LocalsView class after its instance has been shown.
jaroslav@0
  1032
	 */
jaroslav@0
  1033
	void localsViewShown()
jaroslav@0
  1034
	{
jaroslav@0
  1035
		localsView.update(LocalsView.HINT_COMPLETE_UPDATE, -1);
jaroslav@0
  1036
	}
jaroslav@0
  1037
jaroslav@0
  1038
	/**
jaroslav@0
  1039
	 * Called by the CallStackView class after its instance has been shown.
jaroslav@0
  1040
	 */
jaroslav@0
  1041
	void callStackViewShown()
jaroslav@0
  1042
	{
jaroslav@0
  1043
		callStackView.update(CallStackView.HINT_COMPLETE_UPDATE, -1);
jaroslav@0
  1044
	}
jaroslav@0
  1045
jaroslav@0
  1046
	/**
jaroslav@0
  1047
	 * Called by the ThreadsView class after its instance has been shown.
jaroslav@0
  1048
	 */
jaroslav@0
  1049
	void threadsViewShown()
jaroslav@0
  1050
	{
jaroslav@0
  1051
		threadsView.update(ThreadsView.HINT_COMPLETE_UPDATE, -1);
jaroslav@0
  1052
	}
jaroslav@0
  1053
jaroslav@0
  1054
	/**
jaroslav@0
  1055
	 * Returns the current value of the variable specified by the name variableName
jaroslav@0
  1056
	 */
jaroslav@0
  1057
	String getCurrentValue(String variableName)
jaroslav@0
  1058
	{
jaroslav@0
  1059
		if (!debuggingSession)
jaroslav@0
  1060
			return "is not defined";
jaroslav@0
  1061
jaroslav@0
  1062
		if (currentThread == null)
jaroslav@0
  1063
			return "is not defined";
jaroslav@0
  1064
jaroslav@0
  1065
		try
jaroslav@0
  1066
		{
jaroslav@0
  1067
			StringTokenizer st = new StringTokenizer(variableName, ".[]", true);
jaroslav@0
  1068
jaroslav@0
  1069
			if (!st.hasMoreTokens())
jaroslav@0
  1070
				return "invalid expression";
jaroslav@0
  1071
jaroslav@0
  1072
  			String token = st.nextToken();
jaroslav@0
  1073
			RemoteStackVariable rsv = currentThread.getStackVariable(token);
jaroslav@0
  1074
jaroslav@0
  1075
			if (rsv == null)
jaroslav@0
  1076
				return "is not defined";
jaroslav@0
  1077
			if (!rsv.inScope())
jaroslav@0
  1078
				return "is not in scope.";
jaroslav@0
  1079
jaroslav@0
  1080
			RemoteValue obj = rsv.getValue();
jaroslav@0
  1081
jaroslav@0
  1082
			if (obj == null)
jaroslav@0
  1083
				return "null"; // is it correct?
jaroslav@0
  1084
jaroslav@0
  1085
			while (st.hasMoreTokens())
jaroslav@0
  1086
			{
jaroslav@0
  1087
				token = st.nextToken();
jaroslav@0
  1088
				if (token.equals("["))
jaroslav@0
  1089
				{
jaroslav@0
  1090
					if (!st.hasMoreTokens())
jaroslav@0
  1091
						return "index missing";
jaroslav@0
  1092
					token = st.nextToken();
jaroslav@0
  1093
jaroslav@0
  1094
					if (!st.hasMoreTokens())
jaroslav@0
  1095
						return "invalid expression";
jaroslav@0
  1096
					if (!st.nextToken().equals("]"))
jaroslav@0
  1097
						return "invalid expression";
jaroslav@0
  1098
jaroslav@0
  1099
					int index;
jaroslav@0
  1100
jaroslav@0
  1101
					try
jaroslav@0
  1102
					{
jaroslav@0
  1103
						try
jaroslav@0
  1104
						{
jaroslav@0
  1105
							index = Integer.valueOf(token).intValue();
jaroslav@0
  1106
						}
jaroslav@0
  1107
						catch (NumberFormatException e)
jaroslav@0
  1108
						{
jaroslav@0
  1109
							index = Integer.valueOf(getCurrentValue(token)).intValue();
jaroslav@0
  1110
						}
jaroslav@0
  1111
jaroslav@0
  1112
						obj = ((RemoteArray)obj).getElement(index);
jaroslav@0
  1113
jaroslav@0
  1114
						if (obj == null)
jaroslav@0
  1115
							return "null"; // is it correct?
jaroslav@0
  1116
					}
jaroslav@0
  1117
					catch (NumberFormatException e)
jaroslav@0
  1118
					{
jaroslav@0
  1119
						return "invalid index";
jaroslav@0
  1120
					}
jaroslav@0
  1121
					catch (ArrayIndexOutOfBoundsException e)
jaroslav@0
  1122
					{
jaroslav@0
  1123
						return "out of bounds";
jaroslav@0
  1124
					}
jaroslav@0
  1125
					catch (ClassCastException e)
jaroslav@0
  1126
					{
jaroslav@0
  1127
						return "is not an array element";
jaroslav@0
  1128
					}
jaroslav@0
  1129
				}
jaroslav@0
  1130
jaroslav@0
  1131
				if (token.equals("."))
jaroslav@0
  1132
				{
jaroslav@0
  1133
					if (!st.hasMoreTokens())
jaroslav@0
  1134
						return "field missing";
jaroslav@0
  1135
					token = st.nextToken();
jaroslav@0
  1136
jaroslav@0
  1137
					try
jaroslav@0
  1138
					{
jaroslav@0
  1139
						obj = ((RemoteObject)obj).getFieldValue(token);
jaroslav@0
  1140
jaroslav@0
  1141
						if (obj == null)
jaroslav@0
  1142
							return "null"; // is it correct?
jaroslav@0
  1143
					}
jaroslav@0
  1144
					catch (ClassCastException e)
jaroslav@0
  1145
					{
jaroslav@0
  1146
						return "is not a class field";
jaroslav@0
  1147
					}
jaroslav@0
  1148
				}
jaroslav@0
  1149
			}
jaroslav@0
  1150
jaroslav@0
  1151
			return getCurrentValue(obj, options.getDepthOfRecursiveWatching());
jaroslav@0
  1152
		}
jaroslav@0
  1153
		catch(Exception e)
jaroslav@0
  1154
		{
jaroslav@0
  1155
			e.printStackTrace();
jaroslav@0
  1156
			return "";
jaroslav@0
  1157
		}
jaroslav@0
  1158
	}
jaroslav@0
  1159
jaroslav@0
  1160
	/**
jaroslav@0
  1161
	 * Returns the string containing a value of the RemoteValue instance.
jaroslav@0
  1162
	 * Depth - how deep we can scan the value (it must be 0 at least).
jaroslav@0
  1163
	 */
jaroslav@0
  1164
	String getCurrentValue(RemoteValue obj, int depth)
jaroslav@0
  1165
	{
jaroslav@0
  1166
		if (obj == null)
jaroslav@0
  1167
			return "null";
jaroslav@0
  1168
jaroslav@0
  1169
		if (obj instanceof RemoteChar)
jaroslav@0
  1170
			return "'"+obj.toString()+"'";
jaroslav@0
  1171
jaroslav@0
  1172
		if (obj instanceof RemoteString)
jaroslav@0
  1173
			return "\""+obj.toString()+"\"";
jaroslav@0
  1174
jaroslav@0
  1175
		if (obj instanceof RemoteArray)
jaroslav@0
  1176
		{
jaroslav@0
  1177
			if (depth == 0)
jaroslav@0
  1178
				return "[...]"; // don't continue in recursive watching
jaroslav@0
  1179
				
jaroslav@0
  1180
			RemoteValue elements[];
jaroslav@0
  1181
jaroslav@0
  1182
			try
jaroslav@0
  1183
			{
jaroslav@0
  1184
				elements = ((RemoteArray)obj).getElements();
jaroslav@0
  1185
			}
jaroslav@0
  1186
			catch(Exception e)
jaroslav@0
  1187
			{
jaroslav@0
  1188
				e.printStackTrace();
jaroslav@0
  1189
				return "?";
jaroslav@0
  1190
			}
jaroslav@0
  1191
jaroslav@0
  1192
			String returnValue = "[";
jaroslav@0
  1193
jaroslav@0
  1194
			for(int i = 0; i < elements.length-1; i++)
jaroslav@0
  1195
				if (options.showArrayIndexes())
jaroslav@0
  1196
					returnValue += i+": "+getCurrentValue(elements[i], depth-1)+", ";
jaroslav@0
  1197
				else
jaroslav@0
  1198
					returnValue += getCurrentValue(elements[i], depth-1)+", ";
jaroslav@0
  1199
jaroslav@0
  1200
			if (elements.length > 0)
jaroslav@0
  1201
				if (options.showArrayIndexes())
jaroslav@0
  1202
					returnValue += (elements.length-1)+": "+getCurrentValue(elements[elements.length-1], depth-1)+"]";
jaroslav@0
  1203
				else
jaroslav@0
  1204
					returnValue += getCurrentValue(elements[elements.length-1], depth-1)+"]";
jaroslav@0
  1205
			else
jaroslav@0
  1206
				returnValue += "]";
jaroslav@0
  1207
jaroslav@0
  1208
			return returnValue;
jaroslav@0
  1209
		}
jaroslav@0
  1210
jaroslav@0
  1211
		if (obj instanceof RemoteObject)
jaroslav@0
  1212
		{
jaroslav@0
  1213
			if (depth == 0)
jaroslav@0
  1214
				return "{...}"; // don't continue in recursive watching
jaroslav@0
  1215
				
jaroslav@0
  1216
			RemoteObject ro = (RemoteObject)obj;
jaroslav@0
  1217
			RemoteField fields[];
jaroslav@0
  1218
jaroslav@0
  1219
			try
jaroslav@0
  1220
			{
jaroslav@0
  1221
				fields = ro.getFields();
jaroslav@0
  1222
			}
jaroslav@0
  1223
			catch(Exception e)
jaroslav@0
  1224
			{
jaroslav@0
  1225
				e.printStackTrace();
jaroslav@0
  1226
				return "?";
jaroslav@0
  1227
			}
jaroslav@0
  1228
jaroslav@0
  1229
			String returnValue = "{";
jaroslav@0
  1230
			String fieldName;
jaroslav@0
  1231
			RemoteValue fieldValue;
jaroslav@0
  1232
jaroslav@0
  1233
			if (fields.length == 0)
jaroslav@0
  1234
				return returnValue+"}";
jaroslav@0
  1235
jaroslav@0
  1236
			for(int i = 0; i < fields.length-1; i++)
jaroslav@0
  1237
			{
jaroslav@0
  1238
				fieldName = fields[i].getName();
jaroslav@0
  1239
				try
jaroslav@0
  1240
				{
jaroslav@0
  1241
					fieldValue = ro.getFieldValue(fieldName);
jaroslav@0
  1242
					returnValue += fieldName+": "+getCurrentValue(fieldValue, depth-1)+", ";
jaroslav@0
  1243
				}
jaroslav@0
  1244
				catch(Exception e)
jaroslav@0
  1245
				{
jaroslav@0
  1246
					returnValue += fieldName+": ?, ";
jaroslav@0
  1247
				}
jaroslav@0
  1248
			}
jaroslav@0
  1249
  
jaroslav@0
  1250
			fieldName = fields[fields.length-1].getName();
jaroslav@0
  1251
			try
jaroslav@0
  1252
			{
jaroslav@0
  1253
				fieldValue = ro.getFieldValue(fieldName);
jaroslav@0
  1254
				returnValue = returnValue+fieldName+": "+getCurrentValue(fieldValue, depth-1)+"}";
jaroslav@0
  1255
			}
jaroslav@0
  1256
			catch(Exception e)
jaroslav@0
  1257
			{
jaroslav@0
  1258
				returnValue = returnValue+fieldName+": ?}";
jaroslav@0
  1259
			}
jaroslav@0
  1260
jaroslav@0
  1261
			return returnValue;
jaroslav@0
  1262
		}
jaroslav@0
  1263
jaroslav@0
  1264
		// process the RemoteThread and RemoteTreadGroup instances
jaroslav@0
  1265
		// ...
jaroslav@0
  1266
		
jaroslav@0
  1267
		return obj.toString();
jaroslav@0
  1268
	}
jaroslav@0
  1269
jaroslav@0
  1270
	/**
jaroslav@0
  1271
	 * Returns the name of the class which will be started in the debugger
jaroslav@0
  1272
	 * (or "").
jaroslav@0
  1273
	 */
jaroslav@0
  1274
	String getClassToDebug()
jaroslav@0
  1275
        {
jaroslav@0
  1276
		String returnValue = RunOptions.getMainClass();
jaroslav@0
  1277
jaroslav@0
  1278
		if (returnValue != null)
jaroslav@0
  1279
			return returnValue;
jaroslav@0
  1280
		else
jaroslav@0
  1281
			return "";
jaroslav@0
  1282
	}
jaroslav@0
  1283
jaroslav@0
  1284
	/**
jaroslav@0
  1285
	 * This method is called by the Breakpoints class after a breakpoint
jaroslav@0
  1286
	 * has been added into the breakpoints document or after a breakpoint
jaroslav@0
  1287
	 * has been successfully enabled in the breakpoints document.
jaroslav@0
  1288
	 * This method can change the breakpoint state from valid to invalid
jaroslav@0
  1289
	 * if it can not be added into the remote debugger.
jaroslav@0
  1290
	 * This method is also called by the Debugger class while the debugging session is starting.
jaroslav@0
  1291
	 */
jaroslav@0
  1292
	void addBreakpoint(Breakpoint breakpoint)
jaroslav@0
  1293
	{
jaroslav@0
  1294
		boolean success = true; // breakpoint was successfully added into the remoteDebugger (if exists)
jaroslav@0
  1295
jaroslav@0
  1296
		if (debuggingSession)
jaroslav@0
  1297
		{
jaroslav@0
  1298
			try
jaroslav@0
  1299
			{
jaroslav@0
  1300
				RemoteClass rc = remoteDebugger.findClass(breakpoint.getClassName());
jaroslav@0
  1301
				String result;
jaroslav@0
  1302
jaroslav@0
  1303
				if (rc != null)
jaroslav@0
  1304
				{
jaroslav@0
  1305
					result = rc.setBreakpointLine(breakpoint.getLineNumber());
jaroslav@0
  1306
					if (!result.equals(""))
jaroslav@0
  1307
					{
jaroslav@0
  1308
						rc.clearBreakpointLine(breakpoint.getLineNumber());
jaroslav@0
  1309
						success = false;
jaroslav@0
  1310
					}
jaroslav@0
  1311
				}
jaroslav@0
  1312
				else
jaroslav@0
  1313
					success = false;
jaroslav@0
  1314
			}
jaroslav@0
  1315
			catch(Exception e)
jaroslav@0
  1316
			{
jaroslav@0
  1317
				e.printStackTrace();
jaroslav@0
  1318
				success = false;
jaroslav@0
  1319
			}
jaroslav@0
  1320
		}
jaroslav@0
  1321
jaroslav@0
  1322
		// if the breakpoint was succesfully enabled or added into the remote debugger,
jaroslav@0
  1323
		// we must also add breakpoint line (if possible)
jaroslav@0
  1324
		if (!success)
jaroslav@0
  1325
		{
jaroslav@0
  1326
			breakpoint.setInvalid();
jaroslav@0
  1327
			TopLevel.getOutput().show();
jaroslav@0
  1328
			TopLevel.getOutput().println("breakpoint \""+breakpoint.getClassName()+":"+breakpoint.getLineNumber()+"\" cannot be set");
jaroslav@0
  1329
jaroslav@0
  1330
			try
jaroslav@0
  1331
			{
jaroslav@0
  1332
				Position breakpointPosition;
jaroslav@0
  1333
				JavaEditorFrame jef = TopLevel.findEditor(breakpoint.getClassName());
jaroslav@0
  1334
jaroslav@0
  1335
				if (jef != null)
jaroslav@0
  1336
				{
jaroslav@0
  1337
					breakpointPosition = TopLevel.getCurrentSnapshot().getPosition(jef.getSource(), breakpoint.getLineNumber()-1);
jaroslav@0
  1338
					Block.line(breakpointPosition).redraw();
jaroslav@0
  1339
				}
jaroslav@0
  1340
			}
jaroslav@0
  1341
			catch (Exception e)
jaroslav@0
  1342
			{
jaroslav@0
  1343
				// mozna by se vyjimka mela jenom sezrat
jaroslav@0
  1344
				e.printStackTrace();
jaroslav@0
  1345
			}
jaroslav@0
  1346
		}
jaroslav@0
  1347
		else
jaroslav@0
  1348
		{
jaroslav@0
  1349
			breakpoint.setValid();
jaroslav@0
  1350
jaroslav@0
  1351
			try
jaroslav@0
  1352
			{
jaroslav@0
  1353
				Position breakpointPosition;
jaroslav@0
  1354
				JavaEditorFrame jef = TopLevel.findEditor(breakpoint.getClassName());
jaroslav@0
  1355
jaroslav@0
  1356
				if (jef != null)
jaroslav@0
  1357
				{
jaroslav@0
  1358
					breakpointPosition = TopLevel.getCurrentSnapshot().getPosition(jef.getSource(), breakpoint.getLineNumber()-1);
jaroslav@0
  1359
					Block.line(breakpointPosition).redraw();
jaroslav@0
  1360
				}
jaroslav@0
  1361
			}
jaroslav@0
  1362
			catch (Exception e)
jaroslav@0
  1363
			{
jaroslav@0
  1364
				// mozna by se vyjimka mela jenom sezrat
jaroslav@0
  1365
				e.printStackTrace();
jaroslav@0
  1366
			}
jaroslav@0
  1367
		}
jaroslav@0
  1368
	}
jaroslav@0
  1369
jaroslav@0
  1370
	/**
jaroslav@0
  1371
	 * This method is called by the Breakpoints class after a breakpoint
jaroslav@0
  1372
	 * has been removed or disabled in the breakpoints document.
jaroslav@0
  1373
	 */
jaroslav@0
  1374
	void removeBreakpoint(String className, int lineNumber)
jaroslav@0
  1375
	{
jaroslav@0
  1376
		boolean success = true; // breakpoint was successfully removed from the remoteDebugger (if exists)
jaroslav@0
  1377
jaroslav@0
  1378
		if (debuggingSession)
jaroslav@0
  1379
		{
jaroslav@0
  1380
			try
jaroslav@0
  1381
			{
jaroslav@0
  1382
				RemoteClass rc = remoteDebugger.findClass(className);
jaroslav@0
  1383
				String result;
jaroslav@0
  1384
jaroslav@0
  1385
				if (rc != null)
jaroslav@0
  1386
				{
jaroslav@0
  1387
					result = rc.clearBreakpointLine(lineNumber);
jaroslav@0
  1388
					if (!result.equals(""))
jaroslav@0
  1389
						success = false;
jaroslav@0
  1390
				}
jaroslav@0
  1391
				else
jaroslav@0
  1392
					success = false;
jaroslav@0
  1393
			}
jaroslav@0
  1394
			catch(Exception e)
jaroslav@0
  1395
			{
jaroslav@0
  1396
				e.printStackTrace();
jaroslav@0
  1397
				success = false;
jaroslav@0
  1398
			}
jaroslav@0
  1399
		}
jaroslav@0
  1400
jaroslav@0
  1401
		// if the breakpoint was succesfully removed from the debugger, we must also remove breakpoint
jaroslav@0
  1402
		// line (if exists)
jaroslav@0
  1403
		if (success)
jaroslav@0
  1404
		{
jaroslav@0
  1405
			try
jaroslav@0
  1406
			{
jaroslav@0
  1407
				Position breakpointPosition;
jaroslav@0
  1408
				JavaEditorFrame jef = TopLevel.findEditor(className);
jaroslav@0
  1409
jaroslav@0
  1410
				if (jef != null)
jaroslav@0
  1411
				{
jaroslav@0
  1412
					breakpointPosition = TopLevel.getCurrentSnapshot().getPosition(jef.getSource(), lineNumber-1);
jaroslav@0
  1413
					Block.line(breakpointPosition).redraw();
jaroslav@0
  1414
				}
jaroslav@0
  1415
			}
jaroslav@0
  1416
			catch (Exception e)
jaroslav@0
  1417
			{
jaroslav@0
  1418
				// mozna by se vyjimka mela jenom sezrat
jaroslav@0
  1419
				e.printStackTrace();
jaroslav@0
  1420
			}
jaroslav@0
  1421
		}
jaroslav@0
  1422
	}
jaroslav@0
  1423
jaroslav@0
  1424
	/**
jaroslav@0
  1425
	 * Returns the stack frames of the current thread
jaroslav@0
  1426
	 */
jaroslav@0
  1427
	RemoteStackFrame[] getCurrentStackFrames()
jaroslav@0
  1428
	{
jaroslav@0
  1429
		RemoteStackFrame[] rsf = null;
jaroslav@0
  1430
jaroslav@0
  1431
		if (currentThread == null)
jaroslav@0
  1432
			return null;
jaroslav@0
  1433
jaroslav@0
  1434
		try
jaroslav@0
  1435
		{
jaroslav@0
  1436
			rsf = currentThread.dumpStack();
jaroslav@0
  1437
		}
jaroslav@0
  1438
		catch(Exception e)
jaroslav@0
  1439
		{
jaroslav@0
  1440
			e.printStackTrace();
jaroslav@0
  1441
		}
jaroslav@0
  1442
jaroslav@0
  1443
		return rsf;
jaroslav@0
  1444
	}
jaroslav@0
  1445
jaroslav@0
  1446
	/**
jaroslav@0
  1447
	 * Returns the stack frame index of the current thread
jaroslav@0
  1448
	 */
jaroslav@0
  1449
	int getCurrentStackFrameIndex()
jaroslav@0
  1450
	{
jaroslav@0
  1451
		if (currentThread == null)
jaroslav@0
  1452
			return -1;
jaroslav@0
  1453
jaroslav@0
  1454
		return currentThread.getCurrentFrameIndex();
jaroslav@0
  1455
	}
jaroslav@0
  1456
jaroslav@0
  1457
	/**
jaroslav@0
  1458
	 * Returns the stack variables of the current thread
jaroslav@0
  1459
	 */
jaroslav@0
  1460
	RemoteStackVariable[] getStackVariables()
jaroslav@0
  1461
	{
jaroslav@0
  1462
		RemoteStackVariable[] rsv = null;
jaroslav@0
  1463
jaroslav@0
  1464
		if (currentThread == null)
jaroslav@0
  1465
			return null;
jaroslav@0
  1466
jaroslav@0
  1467
		try
jaroslav@0
  1468
		{
jaroslav@0
  1469
			rsv = currentThread.getStackVariables();
jaroslav@0
  1470
		}
jaroslav@0
  1471
		catch(Exception e)
jaroslav@0
  1472
		{
jaroslav@0
  1473
			e.printStackTrace();
jaroslav@0
  1474
		};
jaroslav@0
  1475
jaroslav@0
  1476
		return rsv;
jaroslav@0
  1477
	}
jaroslav@0
  1478
jaroslav@0
  1479
	/**
jaroslav@0
  1480
	 * Returns the current stack frame of the current thread
jaroslav@0
  1481
	 */
jaroslav@0
  1482
	RemoteStackFrame getCurrentStackFrame()
jaroslav@0
  1483
	{
jaroslav@0
  1484
		RemoteStackFrame rsf = null;
jaroslav@0
  1485
jaroslav@0
  1486
		if (currentThread == null)
jaroslav@0
  1487
			return null;
jaroslav@0
  1488
jaroslav@0
  1489
		try
jaroslav@0
  1490
		{
jaroslav@0
  1491
			 rsf = currentThread.getCurrentFrame();
jaroslav@0
  1492
		}
jaroslav@0
  1493
		catch(Exception e)
jaroslav@0
  1494
		{
jaroslav@0
  1495
			 e.printStackTrace();
jaroslav@0
  1496
		};
jaroslav@0
  1497
jaroslav@0
  1498
		return rsf;
jaroslav@0
  1499
	}
jaroslav@0
  1500
jaroslav@0
  1501
	/**
jaroslav@0
  1502
	 * Returns the thread groups
jaroslav@0
  1503
	 */
jaroslav@0
  1504
	RemoteThreadGroup[] getThreadGroups()
jaroslav@0
  1505
	{
jaroslav@0
  1506
		RemoteThreadGroup[] rtg = null;
jaroslav@0
  1507
jaroslav@0
  1508
		if (remoteDebugger == null)
jaroslav@0
  1509
			return null;
jaroslav@0
  1510
jaroslav@0
  1511
		try
jaroslav@0
  1512
		{
jaroslav@0
  1513
			rtg = remoteDebugger.listThreadGroups(null);
jaroslav@0
  1514
		}
jaroslav@0
  1515
		catch(Exception e)
jaroslav@0
  1516
		{
jaroslav@0
  1517
			e.printStackTrace();
jaroslav@0
  1518
		};
jaroslav@0
  1519
jaroslav@0
  1520
		return rtg;
jaroslav@0
  1521
	}
jaroslav@0
  1522
jaroslav@0
  1523
	/**
jaroslav@0
  1524
	 * Returns the current thread
jaroslav@0
  1525
	 */
jaroslav@0
  1526
	RemoteThread getCurrentThread()
jaroslav@0
  1527
	{
jaroslav@0
  1528
		return currentThread;
jaroslav@0
  1529
	}
jaroslav@0
  1530
jaroslav@0
  1531
	/**
jaroslav@0
  1532
	 * Returns the Watches document
jaroslav@0
  1533
	 */
jaroslav@0
  1534
	public Watches getWatches()
jaroslav@0
  1535
	{
jaroslav@0
  1536
		return watches;
jaroslav@0
  1537
	}
jaroslav@0
  1538
jaroslav@0
  1539
	/**
jaroslav@0
  1540
	 * Returns the Breakpoints document
jaroslav@0
  1541
	 */
jaroslav@0
  1542
	public Breakpoints getBreakpoints()
jaroslav@0
  1543
	{
jaroslav@0
  1544
		return breakpoints;
jaroslav@0
  1545
	}
jaroslav@0
  1546
jaroslav@0
  1547
	/**
jaroslav@0
  1548
	 * Returns the LocalsView on the Debugger
jaroslav@0
  1549
	 */
jaroslav@0
  1550
	public LocalsView getLocalsView()
jaroslav@0
  1551
	{
jaroslav@0
  1552
		return localsView;
jaroslav@0
  1553
	}
jaroslav@0
  1554
jaroslav@0
  1555
	/**
jaroslav@0
  1556
	 * Returns the CallStackView on the Debugger
jaroslav@0
  1557
	 */
jaroslav@0
  1558
	public CallStackView getCallStackView()
jaroslav@0
  1559
	{
jaroslav@0
  1560
		return callStackView;
jaroslav@0
  1561
	}
jaroslav@0
  1562
jaroslav@0
  1563
	/**
jaroslav@0
  1564
	 * Returns the ThreadsView on the Debugger
jaroslav@0
  1565
	 */
jaroslav@0
  1566
	public ThreadsView getThreadsView()
jaroslav@0
  1567
	{
jaroslav@0
  1568
		return threadsView;
jaroslav@0
  1569
	}
jaroslav@0
  1570
jaroslav@0
  1571
	////////////////////////////////////////////////////////////////
jaroslav@0
  1572
jaroslav@0
  1573
	/*	void threadChosen(RemoteThreadGroup tg, RemoteThread t)
jaroslav@0
  1574
	{
jaroslav@0
  1575
		canEnableGoFlag = true;
jaroslav@0
  1576
		canEnableGoToCursorFlag = true;
jaroslav@0
  1577
jaroslav@0
  1578
		TopLevel.getMenu().enableItem(MainMenu.miDebugGo);
jaroslav@0
  1579
		TopLevel.getMenu().enableItem(MainMenu.miDebugGoCursor);
jaroslav@0
  1580
		TopLevel.getMenu().enableItem(MainMenu.miDebugTraceOver);
jaroslav@0
  1581
		TopLevel.getMenu().enableItem(MainMenu.miDebugTraceInto);
jaroslav@0
  1582
jaroslav@0
  1583
		RemoteStackFrame[] stack;
jaroslav@0
  1584
jaroslav@0
  1585
		try
jaroslav@0
  1586
		{
jaroslav@0
  1587
			stack = t.dumpStack();
jaroslav@0
  1588
		}
jaroslav@0
  1589
		catch(Exception e)
jaroslav@0
  1590
		{
jaroslav@0
  1591
			e.printStackTrace();
jaroslav@0
  1592
			return;
jaroslav@0
  1593
		}
jaroslav@0
  1594
jaroslav@0
  1595
		currentThreadGroup = tg;
jaroslav@0
  1596
jaroslav@0
  1597
		if (stack.length > 0)
jaroslav@0
  1598
		{
jaroslav@0
  1599
			for(int i = 0; i < stack.length; i++)
jaroslav@0
  1600
			{
jaroslav@0
  1601
				System.out.println(i+"   "+stack[i].toString());
jaroslav@0
  1602
			}
jaroslav@0
  1603
			currentThread = t;
jaroslav@0
  1604
		}
jaroslav@0
  1605
		else
jaroslav@0
  1606
		{
jaroslav@0
  1607
			TopLevel.getOutput().show();
jaroslav@0
  1608
			TopLevel.getOutput().println("invalid thread specified in breakpoint");
jaroslav@0
  1609
		}
jaroslav@0
  1610
jaroslav@0
  1611
		StringTokenizer st = new StringTokenizer(stack[getCurrentStackFrameIndex()].toString(), ".()");
jaroslav@0
  1612
		String className = new String();
jaroslav@0
  1613
		int lineNumber = -1;
jaroslav@0
  1614
		int nTokens = st.countTokens();
jaroslav@0
  1615
jaroslav@0
  1616
		for(int i = 3; i < nTokens; i++) // n-3 times
jaroslav@0
  1617
			className = className+st.nextToken()+".";
jaroslav@0
  1618
jaroslav@0
  1619
		className += st.nextToken();
jaroslav@0
  1620
jaroslav@0
  1621
		st.nextToken();
jaroslav@0
  1622
		st.nextToken(":");
jaroslav@0
  1623
		lineNumber = Integer.valueOf(st.nextToken(":)")).intValue();
jaroslav@0
  1624
jaroslav@0
  1625
		try
jaroslav@0
  1626
		{
jaroslav@0
  1627
			// get a source and a position on which we stopped
jaroslav@0
  1628
			Source s = null;
jaroslav@0
  1629
jaroslav@0
  1630
			s = new Source(className, false);
jaroslav@0
  1631
jaroslav@0
  1632
	// JARDA - az Jaroslav opravi editor, nebude se mazat current line
jaroslav@0
  1633
			Position oldPosition = currentPosition;
jaroslav@0
  1634
			currentPosition = TopLevel.getCurrentSnapshot().getPosition(s, lineNumber-1).beginOfLine();
jaroslav@0
  1635
			JavaEditorFrame jef = TopLevel.showEditor(s, currentPosition, true);
jaroslav@0
  1636
jaroslav@0
  1637
			if (oldPosition != null)
jaroslav@0
  1638
				Block.line(oldPosition).redraw();
jaroslav@0
  1639
jaroslav@0
  1640
			Block.line(currentPosition).redraw();
jaroslav@0
  1641
		}
jaroslav@0
  1642
		catch (IOException e)
jaroslav@0
  1643
		{
jaroslav@0
  1644
			TopLevel.getOutput().show();
jaroslav@0
  1645
			TopLevel.getOutput().println("class '"+className+"' not found");
jaroslav@0
  1646
		}
jaroslav@0
  1647
jaroslav@0
  1648
		watches.updateContent();
jaroslav@0
  1649
		localsView.update(LocalsView.HINT_COMPLETE_UPDATE, -1);
jaroslav@0
  1650
		callStackView.update(CallStackView.HINT_COMPLETE_UPDATE, -1);
jaroslav@0
  1651
		threadsView.update(ThreadsView.HINT_COMPLETE_UPDATE, -1);
jaroslav@0
  1652
		//	threadsView.highlightThread(t);
jaroslav@0
  1653
	}
jaroslav@0
  1654
jaroslav@0
  1655
	/**
jaroslav@0
  1656
	 * Returns the current value of the variable specified by the name variableName
jaroslav@0
  1657
	 * The argument i indexes the current stack frame of the current thread.
jaroslav@0
  1658
	 */
jaroslav@0
  1659
	/*	    String getCurrentValue(String variableName, int i)
jaroslav@0
  1660
	{
jaroslav@0
  1661
		String returnValue;
jaroslav@0
  1662
jaroslav@0
  1663
		if (currentThread == null)
jaroslav@0
  1664
			return "is not defined";
jaroslav@0
  1665
jaroslav@0
  1666
		int currentIndex = currentThread.getCurrentFrameIndex();
jaroslav@0
  1667
jaroslav@0
  1668
		currentThread.resetCurrentFrameIndex();
jaroslav@0
  1669
		currentThread.setCurrentFrameIndex(currentIndex);
jaroslav@0
  1670
		returnValue = getCurrentValue(variableName);
jaroslav@0
  1671
		currentThread.setCurrentFrameIndex(currentIndex);
jaroslav@0
  1672
		currentThread.resetCurrentFrameIndex();
jaroslav@0
  1673
jaroslav@0
  1674
		return returnValue;
jaroslav@0
  1675
	}*/
jaroslav@0
  1676
jaroslav@0
  1677
	public void currentSnapshotHasChanged(Snapshot oldSnapshot)
jaroslav@0
  1678
	{
jaroslav@0
  1679
		int numberOfBreakpoints = breakpoints.getNumberOfBreakpoints();
jaroslav@0
  1680
jaroslav@0
  1681
		for(int i = 0; i < numberOfBreakpoints; i++)
jaroslav@0
  1682
		{
jaroslav@0
  1683
			try
jaroslav@0
  1684
			{
jaroslav@0
  1685
				Breakpoint breakpoint = breakpoints.getBreakpoint(i);
jaroslav@0
  1686
jaroslav@0
  1687
				Source s = new Source(breakpoint.getClassName());
jaroslav@0
  1688
				Position position = oldSnapshot.getPosition(s, breakpoint.getLineNumber()-1).beginOfLine();
jaroslav@0
  1689
				PositionInfo pi = TopLevel.getCurrentSnapshot().getPositionInfo(position);
jaroslav@0
  1690
jaroslav@0
  1691
				breakpoint.setLineNumber(pi.getLine()+1);
jaroslav@0
  1692
			}
jaroslav@0
  1693
			catch(Exception e)
jaroslav@0
  1694
			{
jaroslav@0
  1695
				//e.printStackTrace();
jaroslav@0
  1696
			}
jaroslav@0
  1697
		}
jaroslav@0
  1698
jaroslav@0
  1699
		breakpoints.updateContent();
jaroslav@0
  1700
	}
jaroslav@0
  1701
}