import java.awt.*;
import java.awt.event.*;
import java.awt.datatransfer.*;
import java.applet.*;

public class PhonemePicker2 extends Applet {

		// updated to use IPA unicode chars
		public final String[] phonemes = { 
						"\u026A",
						"i:",
						"j",
						"w",
						"\u02A7",
						"\u02A4",
						"e",
						"\u0251:", 
						"p",
						"t",
						"k",
						"l",
						"\u00E6", 
						"\u028A",
						"b",
						"d",
						"g",
						"r",
						"\u028C",
						"u:",  
						"m", 
						"n",
						"\u014B",
						"h",
						"\u0252",   
						"\u0254:",  
						"f",
						"\u0275",
						"s",
						"\u0283",  
						"\u0259",   
						"\u025C:",  
						"v",
						"\u00F0",   
						"z",
						"\u0292",   
						null, null, null, null, null, null,
						null, null, null, null, null, null
						};
										   
	{
		phonemes[ 36 ] = phonemes[ 6 ]  + phonemes[ 0 ];
		phonemes[ 37 ] = phonemes[ 30 ] + phonemes[ 13 ];
		phonemes[ 38 ] = "\u0251"       + phonemes[ 0 ];
		phonemes[ 39 ] = "\u0251"  		+ phonemes[ 13 ];
										   
		phonemes[ 42 ] = "\u0254"       + phonemes[ 0 ];
		phonemes[ 43 ] = phonemes[ 0 ]  + phonemes[ 30 ];
		phonemes[ 44 ] = phonemes[ 6 ]  + phonemes[ 30 ];
		phonemes[ 45 ] = phonemes[ 13 ] + phonemes[ 30 ];
	}
	
	public final String[] words = { 
						"shIp",   // u026A
						"shEEp",  // i  + :
						"Yoghurt",
						"Watch",
						"CHurCH",  // u02A7
						"Jug",  // u02A4
						"bEd",
						"cAr",  // u0251 + :
						"Pen",
						"TenT",
						"King",
						"Light",
						"cAt",   // u00E6
						"fOOt",   // u028A
						"Bill",
						"Desk",
						"Girl",
						"Road",
						"cUp",   // u028C
						"mOOn",  // u + :
						"Milk", 
						"Nose",
						"riNG",   // u014B
						"Hat",
						"dOg",   // u0252
						"hORse",  // u0254 + :
						"Fish",
						"THrow",   // u03B8
						"Sun",
						"SHower",   // u0283
						"doctOR",   // u0259
						"pURse",  // u025C + :
						"Vase",
						"moTHer",   // u00F0
						"Zebra",
						"treaSURE",   //0292
						"tAble", "cOAt", "pIpe", "hOUse", null, null,
						"bOY", "EAR", "bEAR", "jEWEl", null, null
						};
										   
	private final Color darkGreen = new Color( 0, 128, 0 );
	private final Color brown     = new Color( 128, 64, 64 );
	private final Color purple    = new Color( 128, 0, 128 );
										   
	public final Color[] phonemeColors = { 
										   Color.yellow,
										   Color.yellow,
										   darkGreen,
										   darkGreen,
										   Color.cyan,
										   Color.cyan,
										   Color.yellow,
										   Color.yellow,
										   Color.pink,
										   Color.pink,
										   Color.pink,
										   Color.black,
										   Color.yellow,
										   Color.yellow,
										   Color.pink,
										   Color.pink,
										   Color.pink,
										   brown,
										   Color.yellow,
										   Color.yellow,
										   Color.green,
										   Color.green,
										   Color.green,
										   purple,
										   Color.yellow,
										   Color.yellow,
										   purple,
										   purple,
										   purple,
										   purple,
										   Color.yellow,
										   Color.yellow,
										   purple,
										   purple,
										   purple,
										   purple,
										   Color.red,
										   Color.red,
										   Color.red,
										   Color.red,
										   null,
										   null,
										   Color.red,
										   Color.red,
										   Color.red,
										   Color.red,
										   null,
										   null
										   }; 
	
	private TextArea textfield = null;
	private Label wordLabel = null;
										
	private void tip( String str ) {
		wordLabel.setText( str );
		wordLabel.repaint();
	}
	
	private void untip() {
		wordLabel.setText( "         " );
		wordLabel.repaint();
	}
										   
	public void init() {
		
		setBackground( Color.lightGray );
		
		Panel panel = new Panel();
		panel.setBackground( Color.black );
										   
		int gridWidth = 6;
		int gridHeight = 8;
		
		GridLayout gridLayout = new GridLayout( gridHeight, gridWidth, 1, 1 );
		panel.setLayout( gridLayout );
		
										   
		MouseListener mouseAdapter = new MouseAdapter() {
			public void mouseClicked( MouseEvent me ) {
				Object source = me.getSource();
				Label label = (Label)source;
				textfield.append( label.getText() );
			}
			
			public void mouseEntered( MouseEvent me ) {
				Object source = me.getSource();
				Label label = (Label)source;
				String phoneme = label.getText();
				for ( int i = 0; i < phonemes.length; i++ ) {
					if ( phoneme.equals( phonemes[ i ] ) ) {
						tip( words[ i ] );										   
						break;
					}
				}
			}
										   
			public void mouseExited( MouseEvent me ) {
				untip();
			}
			
		};
		
		MouseMotionListener mouseMotionAdapter = new MouseMotionAdapter() {
			public void mouseMoved( MouseEvent me ) {
				Object source = me.getSource();
				Label label = (Label)source;
				String phoneme = label.getText();
				for ( int i = 0; i < phonemes.length; i++ ) {
					if ( phoneme.equals( phonemes[ i ] ) ) {
						tip( words[ i ] );										   
						break;
					}
				}
			}
		};
		
		for ( int i = 0; i < phonemes.length; i++ ) {
			String phoneme = phonemes[ i ];
			Color color    = phonemeColors[ i ];
			Font font      = new Font( "Serif", Font.PLAIN, 24 );
			if ( phoneme != null ) {
				Label label = new Label( phoneme, Label.CENTER );
				label.setFont( font );
				label.addMouseListener( mouseAdapter );
				label.addMouseMotionListener( mouseMotionAdapter );
				label.setForeground( color );
				label.setBackground( Color.gray );
				panel.add( label );
			} 
			else {
				Label label = new Label("");
				label.setBackground( Color.gray );
				label.setFont( font );
				panel.add( label ); // empty label	
			}
		}
		
										   
		BorderLayout layout = new BorderLayout();
		setLayout( layout );
		
		String fontName = "SILDoulosIPA-Regular";
		Label fontLabel = new Label( "use: " + fontName, Label.CENTER );								   
										   
		textfield = new TextArea( 2, 20 );
		textfield.setFont( new Font( fontName, Font.PLAIN, 24 ) );				   
		textfield.setBackground( Color.white );
		textfield.setForeground( Color.black );
		
		textfield.setSize( 200, 40 );
		
		Panel sidePanel = new Panel();
		
		Panel controls = new Panel( new GridLayout( 4, 1, 20, 5 ) );
		
		Button copy = new Button( "Copy" );
		copy.setActionCommand( "copy" );
		
		Button back = new Button( "Back" );
		back.setActionCommand( "back" );
										   
		Button clearall = new Button( "Clear All" );
		clearall.setActionCommand( "clear all" );
										   
		ActionListener actionlistener = new ActionListener() {
			public void actionPerformed( ActionEvent ae ) {
				Object source = ae.getSource();
				Button button = (Button)source;
				String action =  button.getActionCommand();
				
				if ( action.equals( "copy" ) ) {
					
					Toolkit tk = getToolkit();
					Clipboard clipboard = tk.getSystemClipboard();
					StringSelection text = new StringSelection( textfield.getText() );
					clipboard.setContents( text, text );
				}
				else if ( action.equals( "back" ) ) {
					String text = textfield.getText();
					textfield.replaceRange( "", text.length()-1, text.length() );
				}
				else if ( action.equals( "clear all" ) ) {
					textfield.setText( "" );
				}
				
			}
		};
			
		copy.addActionListener( actionlistener );
		back.addActionListener( actionlistener );
		clearall.addActionListener( actionlistener );
										   
		controls.add( copy );
		controls.add( back );
		controls.add( clearall );
		//controls.add( wordLabel );
										   
		sidePanel.add( controls );
		
		Panel textPanel = new Panel( new BorderLayout() );
		textPanel.add( BorderLayout.NORTH, textfield );
		textPanel.add( BorderLayout.SOUTH, fontLabel );								   
			
		add( BorderLayout.NORTH, textPanel );
		add( BorderLayout.EAST, sidePanel );
		
		add( BorderLayout.CENTER, panel );
										   
		wordLabel = new Label( "phoneme picker" );
		//add( BorderLayout.SOUTH, wordLabel );

	}
	
										   
	public static void main( String[] args ) {
		Frame frame = new Frame( "Phonemes" );
		WindowAdapter close = new WindowAdapter() {
			public void windowClosing( WindowEvent we ) {
				Window win = we.getWindow();
				win.dispose();
			}
			public void windowClosed( WindowEvent we ) {
				System.exit( 0 );
			}
		};
		
		frame.addWindowListener( close );
										   	
		PhonemePicker2 picker = new PhonemePicker2();
		
		frame.add( picker );
		picker.init();
		frame.pack();
		frame.show();
		
		
		/*Toolkit tk = frame.getToolkit();
		String[] fontList = tk.getFontList();
		for ( int i = 0; i < fontList.length; i++ ) {
			System.out.println( fontList[ i ] );
		}*/
		
	}
	
}