home *** CD-ROM | disk | FTP | other *** search
Wrap
import java.applet.Applet; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.Event; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Image; import java.awt.MediaTracker; import java.awt.image.ImageObserver; import java.io.DataInputStream; import java.io.FilterInputStream; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.Vector; public class FunScroll extends Applet implements Runnable { static final int MaxLines = 50; static final int ShadowIn = 0; static final int ShadowOut = 1; static final int ShadowEtchedIn = 2; static final int ShadowEtchedOut = 3; Image bgImage; Image tiledBgImage; MediaTracker mediaTracker; Thread thread; ThreadGroup threadGroup; boolean suspended = false; int threadDelay = 100; String lineData; int updateInterval; int animateCount; Font font; // $FF: renamed from: dx int int field_0 = 3; // $FF: renamed from: dy int int field_1 = 2; String delim; long threadStartTime; Vector animatedTexts; Vector urlStrings; String urlTarget; int noOfTexts; int currentTextIndex; FunScrollAnimatedText currentText; int frameWidth; int frameType; int frameMargin; Color frameDark1; Color frameDark2; Color frameBright; Image offImage; Graphics offGraphics; Dimension offSize; Dimension textSize; protected boolean initiated = false; static final boolean debug = false; static final String sourceLocation = "http://www.algonet.se/FunScroll/FunScroll.html"; static final String versionInfo = "FunScroll 2.3"; public void init() { Color var1 = this.readColor(this.getParameter("fgColor"), Color.black); Color var2 = this.readColor(this.getParameter("bgColor"), ((Component)this).getBackground()); ((Component)this).setBackground(var2); ((Component)this).setForeground(var1); this.offSize = ((Component)this).size(); this.offImage = ((Component)this).createImage(this.offSize.width, this.offSize.height); this.offGraphics = this.offImage.getGraphics(); this.threadGroup = Thread.currentThread().getThreadGroup(); } public void initParameters() { Vector var1 = new Vector(); this.urlStrings = new Vector(); String var2 = this.getParameter("lineData"); if (var2 != null) { this.lineData = var2; this.initLineParametersFromInputURL(this.lineData, var1, this.urlStrings); var2 = this.getParameter("updateInterval"); if (var2 != null) { this.updateInterval = Integer.valueOf(var2); } } else { this.initLineParameters(var1, this.urlStrings); } var2 = this.getParameter("frameWidth"); if (var2 != null) { this.frameWidth = Integer.valueOf(var2); } var2 = this.getParameter("frameMargin"); if (var2 != null) { this.frameMargin = Integer.valueOf(var2); } var2 = this.getParameter("frameType"); if (var2 != null) { if (var2.equalsIgnoreCase("ShadowOut")) { this.frameType = 1; } else if (var2.equalsIgnoreCase("ShadowEtchedIn")) { this.frameType = 2; } else if (var2.equalsIgnoreCase("ShadowEtchedOut")) { this.frameType = 3; } else { this.frameType = 0; } } this.urlTarget = this.getParameter("target"); var2 = this.getParameter("bgImage"); if (var2 != null) { this.bgImage = ((Applet)this).getImage(((Applet)this).getCodeBase(), var2); this.mediaTracker = new MediaTracker(this); this.mediaTracker.addImage(this.bgImage, 0); } String var3 = this.getParameter("font"); if (var3 == null) { var3 = "TimesRoman"; } String var4 = this.getParameter("style"); byte var5 = 1; if (var4 != null) { if (var4.equalsIgnoreCase("plain")) { var5 = 0; } else if (var4.equalsIgnoreCase("bold")) { var5 = 1; } else if (var4.equalsIgnoreCase("italic")) { var5 = 2; } } String var6 = this.getParameter("size"); if (var6 == null) { var6 = "24"; } int var7 = Integer.valueOf(var6); int var9 = var7; FontMetrics var8; do { (new StringBuffer()).append("trying: ").append(var3).append(",").append(var9).toString(); this.font = new Font(var3, var5, var9--); var8 = ((Component)this).getFontMetrics(this.font); } while(var8.getDescent() + var8.getAscent() > var7 && var9 >= var7 - 3 && var7 >= 6); if (var9 < var7 - 3 || var7 < 6) { this.font = new Font(var3, var5, var7); } var2 = this.getParameter("delay"); if (var2 != null) { this.threadDelay = Integer.valueOf(var2); } var2 = this.getParameter("dx"); if (var2 != null) { this.field_0 = Integer.valueOf(var2); } var2 = this.getParameter("dy"); if (var2 != null) { this.field_1 = Integer.valueOf(var2); } this.delim = this.getParameter("delim"); this.createAnimatedTexts(var1, this.font, ((Component)this).getForeground(), ((Component)this).getBackground(), this.field_0, this.field_1, this.delim); this.initiated = true; } public String getParameter(String var1) { String var2 = super.getParameter(var1); if (var2 == null) { return null; } else { char[] var3 = var2.toCharArray(); for(int var4 = 0; var4 < var3.length; ++var4) { if (var3[var4] >= '\uff00') { var3[var4] = (char)(var3[var4] & 255); } } return new String(var3); } } protected void initLineParameters(Vector var1, Vector var2) { for(int var3 = 0; var3 < 50; ++var3) { String var4 = "line" + var3; String var5 = this.getParameter(var4); String var6 = "url" + var3; String var7 = this.getParameter(var6); if (var5 != null) { (new StringBuffer()).append(" ").append(var4).append(":").append(var5).toString(); var1.addElement(var5); (new StringBuffer()).append(" ").append(var6).append(":").append(var7).toString(); var2.addElement(var7); } } if (var1.size() <= 0) { this.initDefaultLineParameters(var1); } } protected void initLineParametersFromInputURL(String var1, Vector var2, Vector var3) { Object var4 = null; Object var5 = null; try { URL var10 = new URL(((Applet)this).getDocumentBase(), var1); var12 = new DataInputStream(var10.openStream()); } catch (Exception var8) { var12 = null; } if (var12 == null) { try { URL var11 = new URL(var1); var12 = new DataInputStream(var11.openStream()); } catch (Exception var7) { this.initURLErrorLineParameters(var1, var2); this.updateInterval = 0; return; } } try { Object var6 = null; String var13 = var12.readLine(); while(var13 != null) { if (var13.length() > 0) { var2.addElement(var13); } var13 = var12.readLine(); if (var13 != null && var13.length() > 4 && var13.substring(0, 4).equalsIgnoreCase("URL:")) { var3.addElement(var13.substring(4)); var13 = var12.readLine(); } else { var3.addElement((Object)null); } } ((FilterInputStream)var12).close(); } catch (IOException var9) { } if (var2.size() <= 0) { this.initURLErrorLineParameters(var1, var2); this.updateInterval = 0; } } protected void initDefaultLineParameters(Vector var1) { var1.addElement("<25>" + this.getAppletInfo()); var1.addElement("<25>Text can be displayed as normal text"); var1.addElement("<25><engrave>OR AS ENGRAVED TEXT"); var1.addElement("<nervous><color=#FF0000><25>or as this - nervous(and in another color)"); var1.addElement("<sine-wave><25>or as this - sine-wave"); var1.addElement("<up>We can scroll up, down, left and right<up>"); var1.addElement("We can start like this, and move down<down>"); var1.addElement("<up>We can also use more than one line\\nlike this.<up>"); var1.addElement("<down><20>Another feature -\"exploding\" chacters...<explode>"); var1.addElement("<left><10><color=blue><sine-wave>Fun? I think so... at least a little bit."); } protected void initURLErrorLineParameters(String var1, Vector var2) { var2.addElement("<nervous><30><color=#FF0000>Error!"); var2.addElement("<100>Could not read url: " + var1); } public String getAppletInfo() { return "FunScroll 2.3"; } public String[][] getParameterInfo() { String[][] var1 = new String[][]{{"line<n>", "string", "Message line <n>"}, {"url<n>", "string", "URL <n>"}, {"lineData", "string", "Message line data file"}, {"updateInterval", "int", "Update interval to read data file (0)"}, {"delim", "string", "Delimiter string (<>)"}, {"frameWidth", "int", "Frame border width (0)"}, {"frameMargin", "int", "Frame margin width (0)"}, {"frameType", "string", "Frame type (ShadowIn)"}, {"font", "string", "Message font (TimesRoman)"}, {"style", "string", "Message font style (bold)"}, {"size", "int", "Message font size (22)"}, {"delay", "int", "Animation delay time in millisec. (100)"}, {"dx", "int", "No of pixels to move horizontally for each animation (2)"}, {"dy", "int", "No of pixels to move vertically for each animation (1)"}, {"fgColor", "string", "Foreground Color"}, {"bgColor", "string", "Background Color"}}; return var1; } public Color readColor(String var1, Color var2) { if (var1 == null) { return var2; } else { Object var3 = null; try { if (var1.startsWith("#")) { var5 = Integer.valueOf(var1.substring(1), 16); } else if (var1.startsWith("0x")) { var5 = Integer.valueOf(var1.substring(2), 16); } else { var5 = Integer.valueOf(FunScrollColorSupport.lookup(var1), 16); } } catch (NumberFormatException var4) { var5 = null; } return var5 == null ? var2 : new Color(var5); } } public void createAnimatedTexts(Vector var1, Font var2, Color var3, Color var4, int var5, int var6, String var7) { this.noOfTexts = 0; this.animatedTexts = new Vector(var1.size()); for(int var8 = 0; var8 < var1.size(); ++var8) { String var9 = " " + (String)var1.elementAt(var8); this.animatedTexts.addElement(new FunScrollAnimatedText(this, (String)var1.elementAt(var8), var2, var3, var4, var5, var6, var7)); ++this.noOfTexts; } this.currentTextIndex = 0; this.currentText = (FunScrollAnimatedText)this.animatedTexts.elementAt(this.currentTextIndex); this.offImage = null; } public void animate(Graphics var1, int var2, int var3, int var4) { if (this.currentText.update(var1)) { ++this.currentTextIndex; if (this.currentTextIndex >= this.noOfTexts) { if (this.lineData != null && this.updateInterval > 0) { ++this.animateCount; } this.currentTextIndex = 0; } this.currentText = (FunScrollAnimatedText)this.animatedTexts.elementAt(this.currentTextIndex); this.currentText.reset(var2, var3, var4, var1); } } public void paintTiledImage(Graphics var1, Image var2, int var3, int var4, int var5) { if (this.tiledBgImage == null) { int var6 = var2.getWidth((ImageObserver)null); int var7 = var2.getHeight((ImageObserver)null); if (var6 > 0 && var7 > 0) { this.tiledBgImage = ((Component)this).createImage(var4, var5); Graphics var8 = this.tiledBgImage.getGraphics(); var8.setColor(((Component)this).getBackground()); var8.fillRect(0, 0, var4, var5); for(int var9 = 0; var9 < var4; var9 += var6) { for(int var10 = 0; var10 < var5; var10 += var7) { var8.drawImage(var2, var9, var10, (ImageObserver)null); } } } } if (this.tiledBgImage != null) { var1.drawImage(this.tiledBgImage, var3, var3, (ImageObserver)null); } } public void paint(Graphics var1) { if (this.offImage != null) { var1.drawImage(this.offImage, 0, 0, (ImageObserver)null); } } public void paintLoadMessage(Graphics var1) { this.offGraphics.setColor(((Component)this).getBackground()); this.offGraphics.fillRect(0, 0, this.offSize.width, this.offSize.height); this.offGraphics.setColor(((Component)this).getForeground()); this.offGraphics.drawString("FunScroll: Loading applet...", 10, 10); var1.drawImage(this.offImage, 0, this.offSize.height / 3, (ImageObserver)null); } protected void drawFrame(Graphics var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8) { if (var7 > 0) { if (this.frameDark1 == null) { this.frameDark1 = FunScrollColorSupport.darker(((Component)this).getBackground(), (double)0.5F); this.frameDark2 = FunScrollColorSupport.darker(((Component)this).getBackground(), 0.1); this.frameBright = FunScrollColorSupport.brighter(((Component)this).getBackground(), (double)0.5F); } switch (var6) { case 1: for(int var11 = 0; var11 < var7; ++var11) { var1.setColor(this.frameBright); this.drawTopLeftLines(var1, var2, var3, var4, var5, var11, var8); var1.setColor(this.frameDark1); this.drawBottomRightLines(var1, var2, var3, var4, var5, var11, var8); } break; case 2: for(int var10 = 0; var10 < var7; ++var10) { if (var10 == 0) { var1.setColor(this.frameDark1); } else if (var10 == var7 - 1) { var1.setColor(this.frameBright); } else { var1.setColor(this.frameDark2); } this.drawTopLeftLines(var1, var2, var3, var4, var5, var10, var8); if (var10 == 0) { var1.setColor(this.frameBright); } else if (var10 == var7 - 1) { var1.setColor(this.frameDark1); } else { var1.setColor(this.frameDark2); } this.drawBottomRightLines(var1, var2, var3, var4, var5, var10, var8); } break; case 3: for(int var9 = 0; var9 < var7; ++var9) { if (var9 == 0) { var1.setColor(this.frameBright); } else if (var9 == var7 - 1) { var1.setColor(this.frameDark1); } else { var1.setColor(((Component)this).getBackground()); } this.drawTopLeftLines(var1, var2, var3, var4, var5, var9, var8); if (var9 == 0) { var1.setColor(this.frameDark1); } else if (var9 == var7 - 1) { var1.setColor(this.frameBright); } else { var1.setColor(((Component)this).getBackground()); } this.drawBottomRightLines(var1, var2, var3, var4, var5, var9, var8); } break; default: for(int var12 = 0; var12 < var7; ++var12) { var1.setColor(this.frameDark1); this.drawTopLeftLines(var1, var2, var3, var4, var5, var12, var8); var1.setColor(this.frameBright); this.drawBottomRightLines(var1, var2, var3, var4, var5, var12, var8); } } var1.setColor(((Component)this).getBackground()); } } void drawTopLeftLines(Graphics var1, int var2, int var3, int var4, int var5, int var6, int var7) { var1.drawLine(var2 + var7 + var6, var3 + var7 + var6, var2 + var4 - var7 - var6 - 1, var3 + var7 + var6); var1.drawLine(var2 + var7 + var6, var3 + var7 + var6, var2 + var7 + var6, var3 + var5 - var7 - var6 - 1); } void drawBottomRightLines(Graphics var1, int var2, int var3, int var4, int var5, int var6, int var7) { var1.drawLine(var2 + var7 + var6, var3 + var5 - var7 - var6 - 1, var2 + var4 - var7 - var6 - 1, var3 + var5 - var7 - var6 - 1); var1.drawLine(var2 + var4 - var7 - var6 - 1, var3 + var7 + var6, var2 + var4 - var7 - var6 - 1, var3 + var5 - var7 - var6 - 1); } public void update(Graphics var1) { if (!this.initiated) { this.paintLoadMessage(var1); } else { long var2 = 0L; Dimension var4 = ((Component)this).size(); if (this.offImage == null || var4.width != this.offSize.width || var4.height != this.offSize.height) { this.offSize = var4; this.offImage = ((Component)this).createImage(var4.width, var4.height); this.offGraphics = this.offImage.getGraphics(); this.textSize = new Dimension(var4.width - 2 * (this.frameWidth + this.frameMargin), var4.height - 2 * (this.frameWidth + this.frameMargin)); this.currentText.reset(this.frameMargin + this.frameWidth, var4.width, var4.height, this.offGraphics); this.offGraphics.setColor(((Component)this).getBackground()); this.offGraphics.fillRect(0, 0, var4.width, var4.height); this.drawFrame(this.offGraphics, 0, 0, var4.width, var4.height, this.frameType, this.frameWidth, this.frameMargin); this.offGraphics.clipRect(this.frameMargin + this.frameWidth, this.frameMargin + this.frameWidth, this.textSize.width, this.textSize.height); } this.offGraphics.setColor(((Component)this).getBackground()); this.offGraphics.fillRect(this.frameMargin + this.frameWidth, this.frameMargin + this.frameWidth, this.textSize.width, this.textSize.height); if (this.bgImage != null && (this.mediaTracker.statusID(0, true) & 8) != 0) { this.paintTiledImage(this.offGraphics, this.bgImage, this.frameMargin + this.frameWidth, this.textSize.width, this.textSize.height); } this.animate(this.offGraphics, this.frameMargin + this.frameWidth, var4.width, var4.height); var1.drawImage(this.offImage, 0, 0, (ImageObserver)null); String var5 = "time for update():" + (System.currentTimeMillis() - var2); } } public void run() { if (Thread.currentThread() == this.thread) { this.thread.setPriority(1); if (!this.initiated) { Graphics var1 = ((Component)this).getGraphics(); this.paintLoadMessage(var1); ((Component)this).getToolkit().sync(); this.initParameters(); } } while(Thread.currentThread() == this.thread) { ((Component)this).repaint(); try { this.threadStartTime += (long)this.threadDelay; int var4 = (int)Math.max((long)(this.threadDelay / 2), this.threadStartTime - System.currentTimeMillis()); (new StringBuffer()).append("Sleep:").append(var4).toString(); Thread.sleep((long)var4); } catch (InterruptedException var3) { return; } if (this.lineData != null && this.updateInterval > 0 && this.animateCount >= this.updateInterval) { this.animateCount = 0; Vector var5 = new Vector(); this.initLineParametersFromInputURL(this.lineData, var5, this.urlStrings); this.createAnimatedTexts(var5, this.font, ((Component)this).getForeground(), ((Component)this).getBackground(), this.field_0, this.field_1, this.delim); } } } public void start() { ((Component)this).repaint(); if (this.thread == null) { if (this.threadGroup != null) { this.thread = new Thread(this.threadGroup, this); } else { this.thread = new Thread(this); } this.thread.start(); } this.threadStartTime = System.currentTimeMillis(); } public void stop() { this.thread = null; } public boolean mouseUp(Event var1, int var2, int var3) { if ((var1.modifiers & 1) != 0) { this.showAbout(); return true; } else { String var4 = null; if (this.currentTextIndex < this.urlStrings.size()) { var4 = (String)this.urlStrings.elementAt(this.currentTextIndex); } if (!this.suspended && this.thread != null) { if (var4 == null) { this.stop(); this.suspended = true; } } else { this.start(); this.suspended = false; } if (this.suspended) { ((Applet)this).showStatus(this.getAppletInfo() + " - Click to resume."); } else if (var4 != null) { this.showDocument(var4); } else { ((Applet)this).showStatus(this.getAppletInfo() + " - Shift-click for info..."); } return true; } } public boolean mouseEnter(Event var1, int var2, int var3) { this.showUrl(); return true; } void showAbout() { FunScrollAbout var1 = new FunScrollAbout(this.getAppletInfo()); var1.appendText("\t" + this.getAppletInfo() + "\n\n"); var1.appendText("Copyright (c) 1996 by Jan Andersson, Torpa Konsult AB.\n\n"); var1.appendText("Info, updates and documentation at http://www.algonet.se/FunScroll/FunScroll.html\n\n"); var1.appendText("Applet information:\n"); var1.appendText(" Document base: " + ((Applet)this).getDocumentBase() + "\n"); var1.appendText(" Code base: " + ((Applet)this).getCodeBase() + "\n\n"); var1.appendText(" Applet parameters:\n"); var1.appendText(" width = " + this.getParameter("WIDTH") + "\n"); var1.appendText(" height = " + this.getParameter("HEIGHT") + "\n\n"); var1.appendText(" Message lines (line<n> parameters):\n"); for(int var2 = 0; var2 < this.noOfTexts; ++var2) { FunScrollAnimatedText var3 = (FunScrollAnimatedText)this.animatedTexts.elementAt(var2); var1.appendText(" line" + var2 + " = " + var3.getUnparsedTextLine() + "\n"); var1.appendText(" url" + var2 + " = "); String var4 = null; if (var2 < this.urlStrings.size()) { var4 = (String)this.urlStrings.elementAt(var2); } var1.appendText(var4 + "\n"); } var1.appendText("\n Other parameters:\n"); String[][] var6 = this.getParameterInfo(); for(int var7 = 2; var7 < var6.length; ++var7) { String var5 = " " + var6[var7][0] + " = " + this.getParameter(var6[var7][0]); if (var5.length() <= 17) { var5 = var5 + "\t"; } var1.appendText(var5 + "\t [" + var6[var7][2] + "]\n"); } var1.show(); } void showUrl() { if (this.urlStrings != null && this.currentTextIndex < this.urlStrings.size()) { String var1 = (String)this.urlStrings.elementAt(this.currentTextIndex); if (var1 != null) { String var2 = var1.toUpperCase(); int var3 = var2.indexOf("TARGET="); if (var3 > 0) { var1 = var1.substring(0, var3); } ((Applet)this).showStatus(var1); return; } ((Applet)this).showStatus(""); } } void showDocument(String var1) { String var2 = null; String var3 = var1.toUpperCase(); int var4 = var3.indexOf("TARGET="); if (var4 > 0) { String var9 = var1.substring(var4 + 7); var1 = var1.substring(0, var4); var2 = var9.trim(); (new StringBuffer()).append("target:").append(var2).toString(); } if (var2 == null) { var2 = this.urlTarget; } Object var5 = null; try { var10 = new URL(((Applet)this).getDocumentBase(), var1); } catch (MalformedURLException var8) { ((Applet)this).showStatus(((Throwable)var8).getMessage()); var10 = null; } if (var10 == null) { try { var10 = new URL(var1); } catch (MalformedURLException var7) { ((Applet)this).showStatus(((Throwable)var7).getMessage()); var10 = null; } } if (var10 != null) { ((Applet)this).showStatus("Loading: " + var1 + "..."); if (var2 == null) { ((Applet)this).getAppletContext().showDocument(var10); return; } ((Applet)this).getAppletContext().showDocument(var10, var2); } } public static void dbg(String var0) { } }