import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JTextArea;
import javax.swing.Timer;

public class TypeWriter extends JTextArea{
	
		private String message = "This is a sample TypeWriter Effect written in java.\nUse setText(String message) to put your text.";
		private int count = 0;
		private Timer timer = new Timer(200,new TimerListener());
		private boolean isPaused = false;
		
		/*		Constuctors		*/
		public TypeWriter(){
			setEditable(false);		//Disabled Editing
			setLineWrap(true);		//Enable Line Wrap
			setWrapStyleWord(true);	//Enable Word Wrap Style
			setOpaque(false);		//Make the JTextArea Transparent
			timer.start();
		}
		
		public TypeWriter(String message){
			this.message = message;
			setEditable(false);		//Disabled Editing	
			setLineWrap(true);		//Enable Line Wrap
			setWrapStyleWord(true);	//Enable Word Wrap Style
			setOpaque(false);		//Make the JTextArea Transparent
			timer.start();		
		}
				
		/*		Overrides Some Methods from  JTextArea		*/
		public void setText(String message){
			this.message = message;
		}
		public String getText(){
			return message;
		}
		
		/*		This part makes the Typing Effect		*/
		protected void type(){			
			if(count<message.length()){
				append(String.valueOf(message.charAt(count)));
				count++;				
			}
			else{
				timer.stop();	//Typing Finished. Stop the Timer.
				}			
		}

		public boolean isPaused(){
			return isPaused;
		}
		public void setDelay(int speed){
				timer.setDelay(speed);
		}
		public int getDelay(){
				return timer.getDelay();
		}
		
		public void start(){
			timer.start();
			isPaused = false;
		}
		public void pause() throws InterruptedException{
			timer.stop();
			isPaused = true;
		}
		public void restart(){
			count = 0;
			super.setText("");
			this.setText(message);
			timer.restart();
		}
		protected class TimerListener implements ActionListener{
			public void actionPerformed(ActionEvent e){
				type();
			}
		}
		
		/*			Optional			*/
		protected int getMessageLength(){
				return message.length();
		}
		protected int getCurrentCount(){
				return count;
		}
}