package prolog.ui;

import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Console
	extends JScrollPane
{
	JTextArea jTextArea = new JTextArea();

	JPopupMenu menu = new JPopupMenu( "contextmenu" );
	JMenuItem clearItem = new JMenuItem( "clear" );
	JMenuItem saveItem = new JMenuItem( "save..." );

	public Console()
	{
		try
		{
			jbInit();
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
	}

	public String getText()
	{
		return this.jTextArea.getText();
	}

	private synchronized void print( String text )
	{
		jTextArea.insert( text, jTextArea.getText().length() );
	}

	private synchronized void println( String text )
	{
		print( text + "\n" );
	}

	public void printThreadSafe( final String str )
	{
		SwingUtilities.invokeLater( new Runnable()
		{
			public void run()
			{
				print( str );
			}
		});
	}

	public void printlnThreadSafe( final String str )
	{
		SwingUtilities.invokeLater( new Runnable()
		{
			public void run()
			{
				println( str );
			}
		});
	}

	public void cls()
	{
		this.jTextArea.setText( "" );
	}

	public void clsThreadSafe()
	{
		SwingUtilities.invokeLater( new Runnable()
		{
			public void run()
			{
				cls();
			}
		});
	}

	private void jbInit() throws Exception
	{
		jTextArea.setTabSize( 4 );
		jTextArea.setFont(new java.awt.Font("Monospaced", 0, 12));
		jTextArea.setText("");
		this.getViewport().add(jTextArea, null);
		menu.add( this.clearItem );
		menu.add( this.saveItem );

		this.clearItem.addActionListener( new ActionListener()
		{
			public void actionPerformed( ActionEvent anEvent )
			{
				jTextArea.setText( "" );
			}
		});

		this.saveItem.addActionListener( new ActionListener()
		{
			public void actionPerformed( ActionEvent anEvent )
			{
				save();
			}
		});

		jTextArea.addMouseListener( new MouseAdapter()
		{
			public void mouseClicked( MouseEvent anEvent )
			{
				if( anEvent.getModifiers() == MouseEvent.BUTTON3_MASK )
					showContextMenu( anEvent.getPoint() );
			}
		});
	}

	private void showContextMenu( Point p0 )
	{
		Point p1 = this.getViewport().getViewPosition();
		menu.show( this, p0.x - p1.x, p0.y - p1.y );
	}

	private void save()
	{
		JFileChooser fileChooser = new JFileChooser();
		fileChooser.setDialogTitle( "Export program..." );
		fileChooser.setDialogType(JFileChooser.SAVE_DIALOG);
		fileChooser.setMultiSelectionEnabled(false);
		fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);

		if( fileChooser.showSaveDialog(this) == JFileChooser.APPROVE_OPTION )
		{
			File f = fileChooser.getSelectedFile();
			if( f != null )
			{
				try
				{
					FileWriter out = new FileWriter( f );
					out.write( this.getText() );
					out.close();
				}
				catch( IOException ae )
				{
					ae.printStackTrace();
					JOptionPane.showMessageDialog(
						this,
						ae.getMessage(),
						"Error",
						JOptionPane.ERROR_MESSAGE );
				}
			}
		}
	}
}
