/**
 * Creates a JConsole in a JInternalFrame and adds it to the desktop 
 *
 * @return this (the workspace scripted object for allowing access to the 
 *          frame, interpreter, etc.)
 *
 * @author Pat Niemeyer
 * @author Daniel Leuck (bug fixes)
 */

import javax.swing.*;
import bsh.Interpreter;
import bsh.BshClassManager;
import bsh.ClassPathException;
import bsh.util.JConsole;
import bsh.util.NameCompletionTable;

makeWorkspace( String name ) 
{
	if ( bsh.system.desktop == void ) {
		print("No desktop...");
		return;
	}

	this.console = new JConsole();
	this.name="Bsh Workspace: "+name;

	this.interpreter = new Interpreter( console );

	// provide name completion for console, name source is global namespace
	// move this into JConsole?

	// Access to read classpath is protected 
	try {
	this.nct = new NameCompletionTable();
	nct.add( interpreter.getNameSpace() );
	try {
		this.bcm = this.caller.namespace.getClassManager();
		if ( bcm != null ) {
			classNamesSource = bcm.getClassPath();
			nct.add( classNamesSource );
		}
	} catch ( ClassPathException e ) {
		error("classpath exception in name compl:"+e);
	}
	console.setNameCompletion( nct );
	// end setup name completion
	} catch ( SecurityException e ) { }

	// for convenience and backwards compatability
	interpreter.set( "bsh.desktop",  bsh.system.desktop );

	this.frame = bsh.system.desktop.makeInternalFrame( name );
	frame.frameIcon=bsh.system.icons.workspace;
	
	/*
		Notes: Careful not to print anything before returning sys io...
		console is now gone.
	*/
	internalFrameClosing( e ) {
		if ( haveSysIO )
			returnSysIO();
	}
	internalFrameActivated(ife) {}
	internalFrameDeactivated(ife) {}
	internalFrameClosed(ife) {}
	internalFrameOpened(ife) {}
	internalFrameIconified(ife) {}
	internalFrameDeiconified(ife) {}	
	
	frame.addInternalFrameListener(this);

	actionPerformed( e ) 
	{
		this.com = e.getActionCommand();
		if ( com.equals("Workspace Editor") )
			workspaceEditor( interpreter, name );
		else if ( com.equals("Capture System in/out/err") )
			captureSysIO();
		else if	( com.equals("Close") )	{
			frame.setClosed(true);
		}
	}

	this.menubar = new JMenuBar();
	this.menu=new JMenu("File");
	this.mi=new JMenuItem("Workspace Editor");
	mi.addActionListener(this);
	menu.add(mi);
	mi=new JMenuItem("Capture System in/out/err");
	mi.addActionListener(this);
	menu.add(mi);
	mi=new JMenuItem("Close");
	mi.addActionListener(this);
	menu.add(mi);
	menubar.add(menu);

	menu = fontMenu(console);
	menubar.add(menu);

	frame.setMenuBar(menubar);

	frame.getContentPane().add("Center", console);
	//frame.pack();
	this.thread = new Thread( interpreter );
	thread.start();

	frame.setBounds(5,5,600,300);
	// cascade windows?
	//off=bsh.system.desktop.windowCount*10;
	//frame.setLocation( off, off );
	//frame.validate();
	bsh.system.desktop.addInternalFrame( frame	);
	frame.toFront();
	frame.setSelected(true);

	this.haveSysIO=false;
	this.sysIn = System.in;
	this.sysOut = System.out;
	this.sysErr = System.err;

	captureSysIO() {
		super.haveSysIO = true; // old scoping rules
		System.setIn( console.getInputStream() );
		System.setOut( console.getOut() );
		System.setErr( console.getErr() );
	}

	returnSysIO() {
		super.haveSysIO = false; // old scoping rules
		System.setIn( sysIn );
		System.setOut( sysOut );
		System.setErr( sysErr );
	}

	return this;
}

