private void viewSource(Project project, AnalysisRun analysisRun, SourceLineAnnotation srcLine) {
private void viewSource(Project project, AnalysisRun analysisRun, final SourceLineAnnotation srcLine) {
    private void viewSource(Project project, AnalysisRun analysisRun, SourceLineAnnotation srcLine) {        // Get rid of old source code text	sourceTextArea.setText("");        // There is nothing to do without a source annotation        // TODO: actually, might want to put a message in the source window        // explaining that we don't have the source file, and that        // they might want to recompile with debugging info turned on.        if (srcLine == null)            return;                // Look up the source file for this class.        sourceFinder.setSourceBaseList(project.getSourceDirList());        String sourceFile = analysisRun.getSourceFile(srcLine.getClassName());	if (sourceFile == null) {	    logger.logMessage(ConsoleLogger.INFO, "No source file for class " + srcLine.getClassName());	    return;	}	// Try to open the source file and display its contents	// in the source text area.	try {	    InputStream in = sourceFinder.openSource(srcLine.getPackageName(), sourceFile);	    BufferedReader reader = new BufferedReader(new InputStreamReader(in));	    	    String line;	    while ((line = reader.readLine()) != null) {		sourceTextArea.append(line + "\n");	    }	    	    reader.close();	} catch (IOException e) {	    logger.logMessage(ConsoleLogger.ERROR, e.getMessage());	    return;	}        // Highlight the lines from the source annotation.        // Note that the source lines start at 1, while the line numbers        // in the text area start at 0.        int selBegin;        try {            selBegin = sourceTextArea.getLineStartOffset(srcLine.getStartLine() - 1);            int selEnd = sourceTextArea.getLineStartOffset(srcLine.getEndLine());            sourceTextArea.select(selBegin, selEnd);            sourceTextArea.getCaret().setSelectionVisible(true);        } catch (javax.swing.text.BadLocationException e) {            logger.logMessage(ConsoleLogger.ERROR, e.toString());            return;        }        // This hack is required because Swing doesn't really manage        // to get the selection into the visible part of the source text        // area on the first attempt.        final int show = selBegin;        SwingUtilities.invokeLater(new Runnable() {            public void run() {                try {                    sourceTextArea.scrollRectToVisible(sourceTextArea.modelToView(show));                } catch (javax.swing.text.BadLocationException e) {                    logger.logMessage(ConsoleLogger.ERROR,  e.toString());                }            }        });        }