package org.buzztroll.mud;

import java.lang.*;
import java.awt.*;
import java.net.*;
import java.io.*;
import java.util.*;
import java.awt.event.*;

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

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import com.ozten.font.JFontChooser;

public class
ActionPanel
    extends TransformPanel
    implements ItemListener,
               ActionListener,
               ChangeListener
{
    protected JTextField            parseText;
    protected JComboBox             actionCombo;
    protected JComboBox             positionCombo;
    protected JList                 actionList;
    protected CardLayout            cardLayout;
    protected JTextField            runText;
    protected JTextField            urlText;
    protected JColorChooser         colorPicker;
    protected JPanel                colorPanel;
    protected JButton               colorButton;
    protected JButton               fontButton;
    protected JSlider               intensitySlider;
    protected JButton               addButton;
    protected JButton               removeButton;
    protected MudFrame              owner;
    protected Vector                actionVector = new Vector(10, 10);

    protected JPanel                cardPanel;

    private static final String     RUN_CARD = "RUN_CARD";    
    private static final String     COLOR_CARD = "COLOR_CARD";    
    private static final String     NOTIFY_CARD = "NOTIFY_CARD";    
    private static final String     INTENSITY_CARD = "INTENSITY_CARD";    
    private static final String     FONT_CARD = "FONT_CARD";    
    private static final String     IGNORE_CARD = "IGNORE_CARD";    
    private static final String     PLAY_CARD = "PLAY_CARD";   
    private static final String     SPEAK_CARD = "SPEAK_CARD"; 

    public
    ActionPanel(
        MudFrame                    owner)
    {
        super();

        JPanel                      topPanel;
        JPanel                      buttonPanel;
        JPanel                      tempP;

        this.owner = owner;

        addButton = new JButton("Add");
        removeButton = new JButton("Remove");
        addButton.addActionListener(this);
        removeButton.addActionListener(this);

        JScrollPane scrollPane = new JScrollPane();

        parseText = new JTextField("");
        actionList = new JList(actionVector);
        scrollPane.getViewport().setView(actionList);
        MyCellRenderer cr = new MyCellRenderer();
        actionList.setCellRenderer(cr);

        positionCombo = new JComboBox();
        positionCombo.addItem("Starts with");
        positionCombo.addItem("Contains");
        positionCombo.addItem("Ends with");

        actionCombo = new JComboBox();
        actionCombo.addItem("Run");
        actionCombo.addItem("Color");
        actionCombo.addItem("Notify");
        actionCombo.addItem("Intensity");
        actionCombo.addItem("Font");
        actionCombo.addItem("Ignore");
	actionCombo.addItem("Play");
	actionCombo.addItem("Speak");

    
        JPanel intensityPanel = new JPanel();
        intensityPanel.setLayout(new BorderLayout());
        intensitySlider = new JSlider(-100, 100, 0);
        intensityPanel.add("Center", intensitySlider);
        intensitySlider.addChangeListener(this);

        actionCombo.addItemListener(this);

        topPanel = new JPanel();

        colorPanel = new JPanel();

        runText = new JTextField("");
	urlText = new JTextField();

        colorPicker = new JColorChooser();
        
        cardPanel = new JPanel();
        cardLayout = new CardLayout();
        cardPanel.setLayout(cardLayout);

        fontButton = new JButton("Font");
        fontButton.addActionListener(this);

        colorButton = new JButton("Color");
        colorButton.addActionListener(this);

        cardPanel.add(runText, RUN_CARD);
        cardPanel.add(colorButton, COLOR_CARD);
        cardPanel.add(new JPanel(), NOTIFY_CARD);
        cardPanel.add(intensityPanel, INTENSITY_CARD);
        cardPanel.add(fontButton, FONT_CARD);
        cardPanel.add(new JPanel(), IGNORE_CARD);
	cardPanel.add(urlText, PLAY_CARD);
	cardPanel.add(new JPanel(), SPEAK_CARD);

        cardLayout.show(cardPanel, RUN_CARD);

        topPanel.setLayout(new GridLayout(1, 4));
        topPanel.add(positionCombo); 
        topPanel.add(parseText);
        topPanel.add(actionCombo);
        topPanel.add(cardPanel);

        buttonPanel = new JPanel();
        buttonPanel.setLayout(new GridLayout(4, 1));
        buttonPanel.add(new JPanel());
        buttonPanel.add(addButton);
        buttonPanel.add(removeButton);
    
        tempP = new JPanel();
        tempP.setLayout(new BorderLayout());
        tempP.add("North", topPanel);
        tempP.add("Center", scrollPane);
       
        this.setLayout(new BorderLayout());
        this.add("Center", tempP);
        this.add("East", buttonPanel);
    }

    public String
    getName()
    {
        return "Action";
    }

    public void
    clear()
    {
        actionVector.clear();
    }

    public DisplayMessage
    transform(
        DisplayMessage                          msg)
    {
        int                                     ctr;
    
        for(ctr = 0; ctr < actionVector.size(); ctr++)
        {
            MessageTransformer mt = (MessageTransformer)
                                        actionVector.elementAt(ctr);
            msg = mt.transform(msg);
        }

        return msg;
    }

    public void
    parse(
        Document                                doc)
    {
        Node                                    n;
        Node                                    nj;
        Element rootE = doc.getDocumentElement();

        n = rootE.getFirstChild();
        while(n != null)
        {
            if(Node.ELEMENT_NODE == n.getNodeType())
            {
                Element e = (Element)n;

                if(e.getTagName().equals("action"))
                {
                    nj = n.getFirstChild();
                    while(nj != null)
                    {
                        if(Node.ELEMENT_NODE == nj.getNodeType())
                        {
                            Element ej = (Element)nj;

                              /* get server name host port and auth */
                            if(ej.getTagName().equals("notify"))
                            {
                                NotifyMessageTransformer nmt = 
                                    new NotifyMessageTransformer(owner);
                                nmt.parse(ej);
                                actionVector.add(nmt);
                            }   
                            else if(ej.getTagName().equals("color"))
                            {
                                ColorMessageTransformer cmt = 
                                    new ColorMessageTransformer();
                                cmt.parse(ej);
                                actionVector.add(cmt);
                            }
                            else if(ej.getTagName().equals("run"))
                            {
                                RunMessageTransformer rmt = 
                                    new RunMessageTransformer();
                                rmt.parse(ej);
                                actionVector.add(rmt);
                            }
                            else if(ej.getTagName().equals("intensify"))
                            {
                                IntensityMessageTransformer imt = 
                                    new IntensityMessageTransformer();
                                imt.parse(ej);
                                actionVector.add(imt);
                            }
                            else if(ej.getTagName().equals("font"))
                            {
                                FontMessageTransformer fmt = 
                                    new FontMessageTransformer();
                                fmt.parse(ej);
                                actionVector.add(fmt);
                            }
                            else if(ej.getTagName().equals("ignore"))
                            {
                                IgnoreMessageTransformer imt = 
                                    new IgnoreMessageTransformer();
                                imt.parse(ej);
                                actionVector.add(imt);
                            }
			    else if(ej.getTagName().equals("play"))
                            {
                                PlayMessageTransformer imt = 
                                    new PlayMessageTransformer();
                                imt.parse(ej);
                                actionVector.add(imt);
                            }
			    else if(ej.getTagName().equals("speak"))
                            {
                                SpeechMessageTransformer imt = 
                                    new SpeechMessageTransformer();
                                imt.parse(ej);
                                actionVector.add(imt);
                            }
                        }
                        nj = nj.getNextSibling();
                    }
                }
            }
            n = n.getNextSibling();
        }
        actionList.updateUI();
    }

    public Node
    createDoc(
        Document                                doc)
            throws Exception
    {
        Element base = doc.createElement("action"); 

        for(int ctr = 0; ctr < actionVector.size(); ctr++)
        {
            MessageTransformer mt = (MessageTransformer)
                                        actionVector.elementAt(ctr);
            Element kid = mt.createDoc(doc);
            base.appendChild(kid);
        }

        return base;
    }

    public void
    actionPerformed(
        ActionEvent                         e)
    {
        if(e.getSource() == colorButton)
        {
            Color c = colorPicker.showDialog(this, "Pick Color", 
                    colorButton.getBackground());
            colorButton.setBackground(c);
            intensitySlider.setBackground(c);
        }
        else if(e.getSource() == addButton)
        {
            MessageTransformer              mt;

            int position = positionCombo.getSelectedIndex();

            if(actionCombo.getSelectedIndex() == 0)
            {
                RunMessageTransformer rmt = 
                    new RunMessageTransformer(
                            parseText.getText(),
                            runText.getText(),
                            position);

                mt = rmt;
            }
            else if(actionCombo.getSelectedIndex() == 1)
            {
                ColorMessageTransformer cmt = 
                    new ColorMessageTransformer(
                            parseText.getText(),
                            colorButton.getBackground(),
                            position);

                mt = cmt;
            }
            else if(actionCombo.getSelectedIndex() == 2)
            {
                NotifyMessageTransformer nmt = 
                    new NotifyMessageTransformer(
                            parseText.getText(),
                            this.owner,
                            position);

                mt = nmt;
            }
            else if(actionCombo.getSelectedIndex() == 3)
            {
                IntensityMessageTransformer nmt =
                    new IntensityMessageTransformer(
                            parseText.getText(),
                            intensitySlider.getValue(),
                            position);

                mt = nmt;
            }
            else if(actionCombo.getSelectedIndex() == 4)
            {
                FontMessageTransformer fmt =
                    new FontMessageTransformer(
                            parseText.getText(),
                            fontButton.getFont(),
                            position);

                mt = fmt;
            }
            else if(actionCombo.getSelectedIndex() == 5)
            {
                IgnoreMessageTransformer imt =
                    new IgnoreMessageTransformer(
                            parseText.getText(),
                            position);
                mt = imt;
            }
	    else if(actionCombo.getSelectedIndex() == 6)
            {
                PlayMessageTransformer imt =
                    new PlayMessageTransformer(parseText.getText(),
					       position,
					       urlText.getText());
                mt = imt;
            }
	    else if(actionCombo.getSelectedIndex() == 7)
            {
                SpeechMessageTransformer imt =
                    new SpeechMessageTransformer(parseText.getText(),
						 position);
                mt = imt;
            }
            else
            {
                return;
            }

            actionVector.addElement(mt);
            actionList.updateUI();
        }
        else if(e.getSource() == removeButton)
        {
            int ndx = actionList.getSelectedIndex();
            actionVector.removeElementAt(ndx);
            actionList.updateUI();
        }
        else if(e.getSource() == fontButton)
        {
            Font f = JFontChooser.showDialog(this);
            fontButton.setFont(f);
        }
    }

    public void 
    stateChanged(
        ChangeEvent                             e) 
    {
        if(e.getSource() == intensitySlider)
        {
            Color c = IntensityMessageTransformer.intensify(
                        colorButton.getBackground(), 
                        intensitySlider.getValue());
            
            intensitySlider.setBackground(c);
        }
    }

    public void 
    itemStateChanged(
        ItemEvent                               e)
    {
        if(actionCombo.getSelectedIndex() == 0)
        {
            cardLayout.show(cardPanel, RUN_CARD);
        }
        else if(actionCombo.getSelectedIndex() == 1)
        {
            cardLayout.show(cardPanel, COLOR_CARD);
        }
        else if(actionCombo.getSelectedIndex() == 2)
        {
            cardLayout.show(cardPanel, NOTIFY_CARD);
        }
        else if(actionCombo.getSelectedIndex() == 3)
        {
            cardLayout.show(cardPanel, INTENSITY_CARD);
        }
        else if(actionCombo.getSelectedIndex() == 4)
        {
            cardLayout.show(cardPanel, FONT_CARD);
        }
        else if(actionCombo.getSelectedIndex() == 5)
        {
            cardLayout.show(cardPanel, IGNORE_CARD);
        }
	else if(actionCombo.getSelectedIndex() == 6)
        {
            cardLayout.show(cardPanel, PLAY_CARD);
        }
	else if(actionCombo.getSelectedIndex() == 7)
        {
            cardLayout.show(cardPanel, SPEAK_CARD);
        }
    }

    class
    MyCellRenderer
        implements ListCellRenderer
    {
        public
        MyCellRenderer()
        {
        }

        public Component 
        getListCellRendererComponent(
            JList list,
            Object value,            // value to display
            int index,               // cell index
            boolean isSelected,      // is the cell selected
            boolean cellHasFocus)    // the list and the cell have the focus
        {
            MessageTransformer mt = (MessageTransformer) value;
            JComponent c = mt.getRendererComponent();

            if(isSelected)
            {
                c.setBackground(list.getSelectionBackground());
            }
            else
            {
                c.setBackground(list.getBackground());
            }

            c.setEnabled(list.isEnabled());
            c.setOpaque(true);

            return c;
        }
    }

}