import java.applet.*;
import java.awt.*;
import java.io.*;
import java.net.URL;
import java.util.*;
public class Typewriter4 extends Applet implements Runnable
{
AudioClip hit, cr, ding ;
boolean alreadyRun = false,
soundOn = false,
loop = false;
Color bgColor = Color.lightGray,
textColor = Color.black ;
Font font ;
Image offScreen, background ;
int width, height,
currentline = 0,
currentword = 0,
currentletter = 0,
depth = 0,
margin = 0,
cycles = 0,
step = 0,
pause = 0,
speed = 0,
update = 0,
linecount = 0 ;
long lastread = 0;
MediaTracker mt ;
String soundactivation, text, textfile, target ;
Thread woohoo = null;
URL hotlink = null;
Vector lines = null;
public Typewriter4()
{
alreadyRun = false;
soundOn = false;
loop = true;
soundactivation = "enter";
}
public void buildLines()
{
lines = new Vector();
FontMetrics fontmetrics =
offScreen.getGraphics().getFontMetrics();
StringTokenizer strTok = new StringTokenizer(text, "\n") ;
while (strTok.hasMoreTokens())
{
StringTokenizer strTok1 =
new StringTokenizer(strTok.nextToken());
int wordcount = strTok1.countTokens();
String[] words = new String[wordcount];
for(int i = 0; i < wordcount; i++)
words[i] = strTok1.nextToken();
String s = "" ;
for(int j = 0; j < wordcount; j++)
{
s = s != null ? s + words[j] + " " : words[0];
if(fontmetrics.stringWidth(s) > width - margin * 2)
{
lines.addElement(s.substring(0,
s.lastIndexOf(" ", s.lastIndexOf(" ") - 1)));
s = words[j] + " ";
}
}
lines.addElement(s);
linecount = lines.size();
}
depth = height - fontmetrics.getHeight() / 2;
}
public void checkTextfile()
{
loop = true;
text = "";
try
{
DataInputStream datainputstream = new
DataInputStream((new URL(getDocumentBase(),
textfile)).openStream());
boolean flag = true;
while(flag)
{
String s = datainputstream.readLine();
if(s == null)
flag = false;
else
text = text + s + "\n";
}
datainputstream.close();
lastread =
(new Long((new Date()).getTime())).longValue();
return;
}
catch(Exception exception)
{
System.out.println("OOOHH--" + exception.toString());
}
}
public void init()
{
mt = new MediaTracker(this);
lastread = 0L;
width = getSize().width;
height = getSize().height;
offScreen = createImage(width, height);
String param ;
if ((param = getParameter("BACKGROUND")) != null)
{
try
{
background = getImage(new URL(getDocumentBase(),
param));
}
catch(Exception e) { }
if(background != null) mt.addImage(background, 0);
}
if ((param = getParameter("BGCOLOR")) != null)
bgColor = new Color(Integer.parseInt(param, 16)) ;
if ((param = getParameter("TEXTCOLOR")) != null)
textColor = new Color(Integer.parseInt(param, 16)) ;
String fontName = "Helvetica" ;
if ((param = getParameter("FONTNAME")) != null)
fontName = param ;
int fontSize = 12 ;
if ((param = getParameter("FONTSIZE")) != null)
fontSize = Integer.parseInt(param) ;
int fontStyle = Font.PLAIN ;
if ((param = getParameter("FONTSTYLE")) != null)
{
param = param.toUpperCase() ;
if (param.indexOf("BOLD") != -1)
fontStyle |= Font.BOLD ;
if (param.indexOf("ITALIC") != -1)
fontStyle |= Font.ITALIC ;
}
font = new Font(fontName, fontStyle, fontSize);
param = getParameter("CYCLES");
if(param == null || param.equalsIgnoreCase("infinite"))
{
cycles = 1;
step = 0;
}
else
{
cycles = Integer.parseInt(param);
step = 1;
}
param = getParameter("MARGIN");
margin = param == null ?
width / 10 : Integer.parseInt(param);
param = getParameter("PAUSE");
pause = param == null ? 2000 : Integer.parseInt(param);
param = getParameter("SOUNDACTIVATION");
soundactivation = param == null ?
"enter" : param.toLowerCase();
soundOn = soundactivation.equals("auto");
if((param = getParameter("SOUND.KEYSTROKE")) != null)
try
{
hit = getAudioClip(new URL(getDocumentBase(),
param));
}
catch(Exception e) { }
if((param = getParameter("SOUND.RETURN")) != null)
try
{
cr = getAudioClip(new URL(getDocumentBase(),
param));
}
catch(Exception e) { }
if((param = getParameter("SOUND.BELL")) != null)
try
{
ding = getAudioClip(new URL(getDocumentBase(),
param));
}
catch(Exception _ex) { }
param = getParameter("SPEED");
speed = param == null ?
100 : Math.max(10, Integer.parseInt(param));
param = getParameter("TARGET");
target = param == null ? "_self" : param;
if((param = getParameter("URL")) != null)
try
{
hotlink = new URL(getDocumentBase(), param);
}
catch(Exception e) { }
param = getParameter("TEXT");
text = param == null ?
"This is a test... \nthis is a test..." : param;
text = text.replace('\\', '\n');
textfile = getParameter("TEXTFILE") ;
param = getParameter("UPDATE");
update = param == null ? 15 : Integer.parseInt(param);
buildLines();
try
{
mt.waitForID(0);
return;
}
catch(InterruptedException _ex) { return; }
}
public void run()
{
currentline = 0;
for(int i = 0; i < cycles; i += step)
{
long l = (new Long((new Date()).getTime())).longValue();
if(l - lastread > (long)(update * 60000)
&& textfile != null)
{
checkTextfile();
buildLines();
}
for(int j = 0; j < linecount; j++)
{
currentletter = 1;
String s = (String)lines.elementAt(j);
for(int k = 0; k < s.length(); k++)
{
if(soundOn && hit != null)
hit.play();
if(k == s.length() && soundOn && cr != null)
cr.play();
repaint();
int i1 = 75 + (int)(Math.random() * 100D);
try
{
Thread.sleep((i1 * speed) / 100);
}
catch(InterruptedException interruptedexception)
{
System.out.println("BB: "
+ interruptedexception.toString());
}
currentletter++;
}
currentletter = 0;
currentline++;
alreadyRun = false;
}
currentline = currentline % linecount;
try
{
Thread.sleep(pause);
}
catch(InterruptedException interruptedexception)
{
System.out.println("AA: " +
interruptedexception.toString());
}
}
}
public void paintBuffer(Graphics g)
{
if(background != null)
{
g.drawImage(background, 0, 0, this);
}
else
{
g.setColor(bgColor);
g.fillRect(0, 0, width, height);
}
g.setColor(textColor);
g.setFont(font);
FontMetrics fontmetrics = g.getFontMetrics();
for(int i = 0; i < currentline; i++)
g.drawString(
(String)lines.elementAt(currentline - i - 1),
margin, depth - (i + 1) * fontmetrics.getHeight()
);
String s = (String)lines.elementAt(currentline);
String s1 = currentletter >= s.length() ?
s : s.substring(0, currentletter);
if(fontmetrics.stringWidth(s1) > (8 * width) / 10
&& !alreadyRun && soundOn)
{
alreadyRun = true;
if(ding != null) ding.play();
}
g.drawString(s1, margin, depth);
}
public void paint(Graphics g)
{
paintBuffer(offScreen.getGraphics());
g.drawImage(offScreen, 0, 0, this);
}
public void update(Graphics g)
{
paint(g);
}
public void start()
{
if(woohoo == null)
{
woohoo = new Thread(this);
woohoo.start();
}
}
public void stop()
{
woohoo.stop();
woohoo = null;
}
public boolean mouseEnter(Event event, int i, int j)
{
if(hotlink != null) showStatus("Link to " + hotlink.toString());
if(soundactivation.equals("enter")) soundOn = true;
return true;
}
public boolean mouseExit(Event event, int i, int j)
{
if(soundactivation.equals("enter")) soundOn = false;
return true;
}
public boolean mouseDown(Event event, int i, int j)
{
try
{
getAppletContext().showDocument(hotlink, target);
}
catch(Exception e) { }
return true;
}
}