/*
	Joseph Bergin, Nov. 1997
	Ported to JFC, December 2000
*/
package jbgui;

import java.awt.Container;
import java.awt.Component;
import java.awt.Frame;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Event;
import java.awt.Graphics;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.InputEvent;

import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JTextField;
import javax.swing.JTextArea;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.JComboBox;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JLabel;
import javax.swing.JScrollPane;


public class AllenApplet extends JApplet
{	public void init() 
	{	resize(460, 460);
		Component ac = this;
		while(!(ac instanceof Frame)) ac = ac.getParent();
		Frame myFrame = (Frame)ac;
		Box topPane = new Box(BoxLayout.Y_AXIS);
		contentPane = getContentPane();
		contentPane.setLayout(new GridLayout(2,1, 10, 10));
		contentPane.setBackground(Color.yellow);
		contentPane.add(topPane);				
		contentPane.add(controls); 		
		
		// Create a new popup menu to display our options
		popup = new JPopupMenu("Activities");
		// Add menu items to the menu.  Give each an ActionListener for its action.
		JMenuItem item = new JMenuItem("Cyan");
		item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, Event.CTRL_MASK));
		item.setMnemonic(KeyEvent.VK_C);
		popup.add(item);
		item.addActionListener(new CyanListener());

		item = new JMenuItem("Yellow");
		item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Y, Event.CTRL_MASK));
		item.setMnemonic(KeyEvent.VK_Y);
		popup.add(item);
		item.addActionListener(new YellowListener());
		
		item = new JMenuItem("UserColor");
		item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_U, Event.CTRL_MASK));
		item.setMnemonic(KeyEvent.VK_U);
		popup.add(item);
		item.addActionListener(new UserColorListener());

		userColorDialog = new ColorSliderDialog(myFrame, controls);
		userColorDialog.setLocation(150, 50);
		
		controls.setBackground(Color.yellow); 
		
		topPane.add(new JScrollPane(userText)); // Decorator pattern
		
		JLabel prompt = new JLabel("Enter text below and click \"Add It\".");
		topPane.add(prompt);
		topPane.add(userInput);
		
		JButton okButton = new JButton("Add It");
		controls.add(okButton, BorderLayout.NORTH);
		
		OkListener ok = new OkListener();
		okButton.addActionListener(ok);
		userInput.addActionListener(ok);
		
		fonts.addItemListener(new FontListener());
		fonts.addItem("Plain");
		fonts.addItem("Bold");
		fonts.addItem("Italic");
		controls.add(fonts, BorderLayout.SOUTH); 
		
		userText.setFont(new Font("Serif", Font.PLAIN, fontSize));
		userText.setEditable(false);
		
		
		// Handle mouse clicks in our window. 
		MouseListener mouser = new MouseWatcher();
		contentPane.addMouseListener(mouser);
		addMouseListener(mouser);  // Same listener for two components.	
		
		JLabel instructions = new JLabel("Click anywhere in the colored region. Right click to get popup");
		controls.add(instructions, BorderLayout.CENTER);
		controls.addMouseListener(mouser);
				
		// Handle menu shortcuts in our popup menu.  
		addKeyListener(new KeyWatcher());
		
		userInput.requestFocus();
	}
	
	JDialog userColorDialog;
	JPanel controls = new JPanel(new BorderLayout());
	JTextArea userText = new JTextArea(15, 60);
	JTextField userInput = new JTextField(60);
	JPopupMenu popup;
	JTextField red = new JTextField(6);
	JTextField green = new JTextField(6);
	JTextField blue = new JTextField(6);
	JComboBox fonts = new JComboBox();
	Container contentPane;
	int fontSize = 14;
	
	// Inner Classes for handlers	
	class CyanListener implements ActionListener // Menu Cyan
	{	public void actionPerformed(ActionEvent e)
		{	Color lightCyan = new Color(200, 255, 255);
			controls.setBackground(lightCyan);  //pale Cyan (RGB)
			contentPane.setBackground(lightCyan);
			repaint();
		}
	}

	class YellowListener implements ActionListener // Menu Yellow...
	{	public void actionPerformed(ActionEvent e)
		{	controls.setBackground(Color.yellow);
			contentPane.setBackground(Color.yellow);	
			repaint();
		}
	}

	class UserColorListener implements ActionListener // Menu UserColor
	{	public void actionPerformed(ActionEvent e)
		{	userColorDialog.setVisible(true);
			red.requestFocus();
		} 
	}

	class OkListener implements ActionListener // OK button for main window.
	{	public void actionPerformed(ActionEvent e)
		{	String s = userInput.getText();
			userText.append(s + '\n');
			userInput.setText("");
		}
	}

	class FontListener implements ItemListener // Listener for font choice
	{	public void itemStateChanged(ItemEvent e)
		{	int i = fonts.getSelectedIndex();
			Font f = userText.getFont();
			switch(i)
			{	case 0: f = new Font("Serif", Font.PLAIN, fontSize); break;
				case 1: f = new Font("Serif", Font.BOLD, fontSize); break;
				case 2: f = new Font("Serif", Font.ITALIC, fontSize); break;
			}
			userText.setFont(f);
		}
	}
	
	class KeyWatcher extends KeyAdapter
	{	public void keyTyped(KeyEvent e)
		{	if (! e.isMetaDown()) return;
			switch((int)e.getKeyChar())
			{	case KeyEvent.VK_C: setBackground(new Color(200, 255, 255)); repaint(); break;
				case KeyEvent.VK_Y: setBackground(Color.yellow); repaint(); break;
				case KeyEvent.VK_U: userColorDialog.setVisible(true); red.requestFocus(); break;
			}
		}
	}

	class MouseWatcher extends MouseAdapter // Mouse click handler.
	{	public void mouseClicked(MouseEvent e)
		{	Graphics g = e.getComponent().getGraphics();
			int x = e.getX(), y = e.getY();
			if(e.getModifiers() == InputEvent.BUTTON3_MASK) // Right button (Ctrl click on Mac).
			{	Font font = new Font("Serif", Font.ITALIC, 10);
				g.setFont(font);
				g.setColor(Color.red);
				g.drawString("Right Click at:(" + x + "," + y + ")", x, y);
			}
			else // Other buttons.
			{	g.drawString("Left Clickat:(" + x + "," + y + ")", x, y);	
			}
			g.dispose();
		}
		
		public void mousePressed(MouseEvent e)
		{	int x = e.getX(), y = e.getY();
			if (e.isPopupTrigger()) 
			{	popup.show(e.getComponent(), x, y);	
			}
		}

		public void mouseReleased(MouseEvent e)
		{	int x = e.getX(), y = e.getY();
			if (e.isPopupTrigger()) 
			{	popup.show(e.getComponent(), x, y);	
			}		
		}
	}

}

