package org.buzztroll.mud;

import java.lang.*;
import java.util.Vector;
import java.util.StringTokenizer;
import java.util.Hashtable;
import java.awt.*;
import java.io.*;
import java.net.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.text.*;
import javax.swing.event.*;
import javax.swing.border.*;


public
class EmacsTextBox
    extends JTextArea
    implements KeyListener
{
    protected Vector                  bangVector = new Vector(25, 25);
    protected int                     bangIndex = 0;


    public
    EmacsTextBox()
    {
        super();

        addKeyListener(this);
    }    

    public String getRawText() {
	String txt = getText();
	int len = txt.length();
	if (len > 0 && txt.charAt(len - 1) == '\n') {
	    return txt.substring(0, len-1);
	} else {
	    return txt;
	}
    }

    protected
    void processComponentKeyEvent(
        KeyEvent                      e)  
    {
        if(e == null)
        {
            return; 
        }
        if(e.getKeyChar() != '\n')
        {
            super.processComponentKeyEvent(e);
        }
        else
        {
            String msg = this.getText();

            if(msg.equals(""))
            {
                return;
            }
            if(msg.charAt(0) == '\n' &&
              msg.length() > 1)
            {
                msg = msg.substring(1);
            }
            if(msg.charAt(msg.length() - 1) == '\n')
            {
                msg = msg.substring(0, msg.length()-1);
            }

            if(msg.length() > 0)
            {
                bangVector.addElement(msg);
                bangIndex = bangVector.size();
            }

            this.setText(msg);
        }
    }

    public void
    keyReleased(
        KeyEvent                      ke)
    {
    }

    public void
    keyTyped(
        KeyEvent                      ke)
    {
    }

    public void
    keyPressed(
        KeyEvent                      ke)
    {
        int                           keyCode;
        String                        msg;

        keyCode = ke.getKeyCode();

        try
        {
            if(keyCode == KeyEvent.VK_UP)
            {
                bangIndex--;
                if(bangIndex >= 0)
                {
                    msg = (String)bangVector.elementAt(bangIndex);
                    this.setText(msg);
                }
                else if(bangIndex == -1)
                {
                    bangIndex = 0;
                    msg = (String)bangVector.elementAt(bangIndex);
                    this.setText(msg);
                }
            }
            else if(keyCode == KeyEvent.VK_DOWN)
            {
                bangIndex++;
                if(bangIndex < bangVector.size())
                {
                    msg = (String)bangVector.elementAt(bangIndex);
                    this.setText(msg);
                }
                else
                {
                    bangIndex = bangVector.size();
                    this.setText("");
                }
            }
            else if(keyCode == KeyEvent.VK_ENTER)
            {
            }
        }
        catch(Exception e)
        {
            bangIndex = 0;
        }
    }
}