home *** CD-ROM | disk | FTP | other *** search
/ MACD 7 / MACD7.iso / www / weirdscience / babylon5 / applets / funscroll.class (.txt) < prev    next >
Encoding:
Java Class File  |  1997-10-26  |  13.8 KB  |  694 lines

  1. import java.applet.Applet;
  2. import java.awt.Color;
  3. import java.awt.Component;
  4. import java.awt.Dimension;
  5. import java.awt.Event;
  6. import java.awt.Font;
  7. import java.awt.FontMetrics;
  8. import java.awt.Graphics;
  9. import java.awt.Image;
  10. import java.awt.MediaTracker;
  11. import java.awt.image.ImageObserver;
  12. import java.io.DataInputStream;
  13. import java.io.FilterInputStream;
  14. import java.io.IOException;
  15. import java.net.MalformedURLException;
  16. import java.net.URL;
  17. import java.util.Vector;
  18.  
  19. public class FunScroll extends Applet implements Runnable {
  20.    static final int MaxLines = 50;
  21.    static final int ShadowIn = 0;
  22.    static final int ShadowOut = 1;
  23.    static final int ShadowEtchedIn = 2;
  24.    static final int ShadowEtchedOut = 3;
  25.    Image bgImage;
  26.    Image tiledBgImage;
  27.    MediaTracker mediaTracker;
  28.    Thread thread;
  29.    ThreadGroup threadGroup;
  30.    boolean suspended = false;
  31.    int threadDelay = 100;
  32.    String lineData;
  33.    int updateInterval;
  34.    int animateCount;
  35.    Font font;
  36.    // $FF: renamed from: dx int
  37.    int field_0 = 3;
  38.    // $FF: renamed from: dy int
  39.    int field_1 = 2;
  40.    String delim;
  41.    long threadStartTime;
  42.    Vector animatedTexts;
  43.    Vector urlStrings;
  44.    String urlTarget;
  45.    int noOfTexts;
  46.    int currentTextIndex;
  47.    FunScrollAnimatedText currentText;
  48.    int frameWidth;
  49.    int frameType;
  50.    int frameMargin;
  51.    Color frameDark1;
  52.    Color frameDark2;
  53.    Color frameBright;
  54.    Image offImage;
  55.    Graphics offGraphics;
  56.    Dimension offSize;
  57.    Dimension textSize;
  58.    protected boolean initiated = false;
  59.    static final boolean debug = false;
  60.    static final String sourceLocation = "http://www.algonet.se/FunScroll/FunScroll.html";
  61.    static final String versionInfo = "FunScroll 2.3";
  62.  
  63.    public void init() {
  64.       Color var1 = this.readColor(this.getParameter("fgColor"), Color.black);
  65.       Color var2 = this.readColor(this.getParameter("bgColor"), ((Component)this).getBackground());
  66.       ((Component)this).setBackground(var2);
  67.       ((Component)this).setForeground(var1);
  68.       this.offSize = ((Component)this).size();
  69.       this.offImage = ((Component)this).createImage(this.offSize.width, this.offSize.height);
  70.       this.offGraphics = this.offImage.getGraphics();
  71.       this.threadGroup = Thread.currentThread().getThreadGroup();
  72.    }
  73.  
  74.    public void initParameters() {
  75.       Vector var1 = new Vector();
  76.       this.urlStrings = new Vector();
  77.       String var2 = this.getParameter("lineData");
  78.       if (var2 != null) {
  79.          this.lineData = var2;
  80.          this.initLineParametersFromInputURL(this.lineData, var1, this.urlStrings);
  81.          var2 = this.getParameter("updateInterval");
  82.          if (var2 != null) {
  83.             this.updateInterval = Integer.valueOf(var2);
  84.          }
  85.       } else {
  86.          this.initLineParameters(var1, this.urlStrings);
  87.       }
  88.  
  89.       var2 = this.getParameter("frameWidth");
  90.       if (var2 != null) {
  91.          this.frameWidth = Integer.valueOf(var2);
  92.       }
  93.  
  94.       var2 = this.getParameter("frameMargin");
  95.       if (var2 != null) {
  96.          this.frameMargin = Integer.valueOf(var2);
  97.       }
  98.  
  99.       var2 = this.getParameter("frameType");
  100.       if (var2 != null) {
  101.          if (var2.equalsIgnoreCase("ShadowOut")) {
  102.             this.frameType = 1;
  103.          } else if (var2.equalsIgnoreCase("ShadowEtchedIn")) {
  104.             this.frameType = 2;
  105.          } else if (var2.equalsIgnoreCase("ShadowEtchedOut")) {
  106.             this.frameType = 3;
  107.          } else {
  108.             this.frameType = 0;
  109.          }
  110.       }
  111.  
  112.       this.urlTarget = this.getParameter("target");
  113.       var2 = this.getParameter("bgImage");
  114.       if (var2 != null) {
  115.          this.bgImage = ((Applet)this).getImage(((Applet)this).getCodeBase(), var2);
  116.          this.mediaTracker = new MediaTracker(this);
  117.          this.mediaTracker.addImage(this.bgImage, 0);
  118.       }
  119.  
  120.       String var3 = this.getParameter("font");
  121.       if (var3 == null) {
  122.          var3 = "TimesRoman";
  123.       }
  124.  
  125.       String var4 = this.getParameter("style");
  126.       byte var5 = 1;
  127.       if (var4 != null) {
  128.          if (var4.equalsIgnoreCase("plain")) {
  129.             var5 = 0;
  130.          } else if (var4.equalsIgnoreCase("bold")) {
  131.             var5 = 1;
  132.          } else if (var4.equalsIgnoreCase("italic")) {
  133.             var5 = 2;
  134.          }
  135.       }
  136.  
  137.       String var6 = this.getParameter("size");
  138.       if (var6 == null) {
  139.          var6 = "24";
  140.       }
  141.  
  142.       int var7 = Integer.valueOf(var6);
  143.       int var9 = var7;
  144.  
  145.       FontMetrics var8;
  146.       do {
  147.          (new StringBuffer()).append("trying: ").append(var3).append(",").append(var9).toString();
  148.          this.font = new Font(var3, var5, var9--);
  149.          var8 = ((Component)this).getFontMetrics(this.font);
  150.       } while(var8.getDescent() + var8.getAscent() > var7 && var9 >= var7 - 3 && var7 >= 6);
  151.  
  152.       if (var9 < var7 - 3 || var7 < 6) {
  153.          this.font = new Font(var3, var5, var7);
  154.       }
  155.  
  156.       var2 = this.getParameter("delay");
  157.       if (var2 != null) {
  158.          this.threadDelay = Integer.valueOf(var2);
  159.       }
  160.  
  161.       var2 = this.getParameter("dx");
  162.       if (var2 != null) {
  163.          this.field_0 = Integer.valueOf(var2);
  164.       }
  165.  
  166.       var2 = this.getParameter("dy");
  167.       if (var2 != null) {
  168.          this.field_1 = Integer.valueOf(var2);
  169.       }
  170.  
  171.       this.delim = this.getParameter("delim");
  172.       this.createAnimatedTexts(var1, this.font, ((Component)this).getForeground(), ((Component)this).getBackground(), this.field_0, this.field_1, this.delim);
  173.       this.initiated = true;
  174.    }
  175.  
  176.    public String getParameter(String var1) {
  177.       String var2 = super.getParameter(var1);
  178.       if (var2 == null) {
  179.          return null;
  180.       } else {
  181.          char[] var3 = var2.toCharArray();
  182.  
  183.          for(int var4 = 0; var4 < var3.length; ++var4) {
  184.             if (var3[var4] >= '\uff00') {
  185.                var3[var4] = (char)(var3[var4] & 255);
  186.             }
  187.          }
  188.  
  189.          return new String(var3);
  190.       }
  191.    }
  192.  
  193.    protected void initLineParameters(Vector var1, Vector var2) {
  194.       for(int var3 = 0; var3 < 50; ++var3) {
  195.          String var4 = "line" + var3;
  196.          String var5 = this.getParameter(var4);
  197.          String var6 = "url" + var3;
  198.          String var7 = this.getParameter(var6);
  199.          if (var5 != null) {
  200.             (new StringBuffer()).append("  ").append(var4).append(":").append(var5).toString();
  201.             var1.addElement(var5);
  202.             (new StringBuffer()).append("  ").append(var6).append(":").append(var7).toString();
  203.             var2.addElement(var7);
  204.          }
  205.       }
  206.  
  207.       if (var1.size() <= 0) {
  208.          this.initDefaultLineParameters(var1);
  209.       }
  210.  
  211.    }
  212.  
  213.    protected void initLineParametersFromInputURL(String var1, Vector var2, Vector var3) {
  214.       Object var4 = null;
  215.       Object var5 = null;
  216.  
  217.       try {
  218.          URL var10 = new URL(((Applet)this).getDocumentBase(), var1);
  219.          var12 = new DataInputStream(var10.openStream());
  220.       } catch (Exception var8) {
  221.          var12 = null;
  222.       }
  223.  
  224.       if (var12 == null) {
  225.          try {
  226.             URL var11 = new URL(var1);
  227.             var12 = new DataInputStream(var11.openStream());
  228.          } catch (Exception var7) {
  229.             this.initURLErrorLineParameters(var1, var2);
  230.             this.updateInterval = 0;
  231.             return;
  232.          }
  233.       }
  234.  
  235.       try {
  236.          Object var6 = null;
  237.          String var13 = var12.readLine();
  238.  
  239.          while(var13 != null) {
  240.             if (var13.length() > 0) {
  241.                var2.addElement(var13);
  242.             }
  243.  
  244.             var13 = var12.readLine();
  245.             if (var13 != null && var13.length() > 4 && var13.substring(0, 4).equalsIgnoreCase("URL:")) {
  246.                var3.addElement(var13.substring(4));
  247.                var13 = var12.readLine();
  248.             } else {
  249.                var3.addElement((Object)null);
  250.             }
  251.          }
  252.  
  253.          ((FilterInputStream)var12).close();
  254.       } catch (IOException var9) {
  255.       }
  256.  
  257.       if (var2.size() <= 0) {
  258.          this.initURLErrorLineParameters(var1, var2);
  259.          this.updateInterval = 0;
  260.       }
  261.  
  262.    }
  263.  
  264.    protected void initDefaultLineParameters(Vector var1) {
  265.       var1.addElement("<25>" + this.getAppletInfo());
  266.       var1.addElement("<25>Text can be displayed as normal text");
  267.       var1.addElement("<25><engrave>OR AS ENGRAVED TEXT");
  268.       var1.addElement("<nervous><color=#FF0000><25>or as this - nervous(and in another color)");
  269.       var1.addElement("<sine-wave><25>or as this - sine-wave");
  270.       var1.addElement("<up>We can scroll up, down, left and right<up>");
  271.       var1.addElement("We can start like this, and move down<down>");
  272.       var1.addElement("<up>We can also use more than one line\\nlike this.<up>");
  273.       var1.addElement("<down><20>Another feature -\"exploding\" chacters...<explode>");
  274.       var1.addElement("<left><10><color=blue><sine-wave>Fun? I think so... at least a little bit.");
  275.    }
  276.  
  277.    protected void initURLErrorLineParameters(String var1, Vector var2) {
  278.       var2.addElement("<nervous><30><color=#FF0000>Error!");
  279.       var2.addElement("<100>Could not read url: " + var1);
  280.    }
  281.  
  282.    public String getAppletInfo() {
  283.       return "FunScroll 2.3";
  284.    }
  285.  
  286.    public String[][] getParameterInfo() {
  287.       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"}};
  288.       return var1;
  289.    }
  290.  
  291.    public Color readColor(String var1, Color var2) {
  292.       if (var1 == null) {
  293.          return var2;
  294.       } else {
  295.          Object var3 = null;
  296.  
  297.          try {
  298.             if (var1.startsWith("#")) {
  299.                var5 = Integer.valueOf(var1.substring(1), 16);
  300.             } else if (var1.startsWith("0x")) {
  301.                var5 = Integer.valueOf(var1.substring(2), 16);
  302.             } else {
  303.                var5 = Integer.valueOf(FunScrollColorSupport.lookup(var1), 16);
  304.             }
  305.          } catch (NumberFormatException var4) {
  306.             var5 = null;
  307.          }
  308.  
  309.          return var5 == null ? var2 : new Color(var5);
  310.       }
  311.    }
  312.  
  313.    public void createAnimatedTexts(Vector var1, Font var2, Color var3, Color var4, int var5, int var6, String var7) {
  314.       this.noOfTexts = 0;
  315.       this.animatedTexts = new Vector(var1.size());
  316.  
  317.       for(int var8 = 0; var8 < var1.size(); ++var8) {
  318.          String var9 = "  " + (String)var1.elementAt(var8);
  319.          this.animatedTexts.addElement(new FunScrollAnimatedText(this, (String)var1.elementAt(var8), var2, var3, var4, var5, var6, var7));
  320.          ++this.noOfTexts;
  321.       }
  322.  
  323.       this.currentTextIndex = 0;
  324.       this.currentText = (FunScrollAnimatedText)this.animatedTexts.elementAt(this.currentTextIndex);
  325.       this.offImage = null;
  326.    }
  327.  
  328.    public void animate(Graphics var1, int var2, int var3, int var4) {
  329.       if (this.currentText.update(var1)) {
  330.          ++this.currentTextIndex;
  331.          if (this.currentTextIndex >= this.noOfTexts) {
  332.             if (this.lineData != null && this.updateInterval > 0) {
  333.                ++this.animateCount;
  334.             }
  335.  
  336.             this.currentTextIndex = 0;
  337.          }
  338.  
  339.          this.currentText = (FunScrollAnimatedText)this.animatedTexts.elementAt(this.currentTextIndex);
  340.          this.currentText.reset(var2, var3, var4, var1);
  341.       }
  342.  
  343.    }
  344.  
  345.    public void paintTiledImage(Graphics var1, Image var2, int var3, int var4, int var5) {
  346.       if (this.tiledBgImage == null) {
  347.          int var6 = var2.getWidth((ImageObserver)null);
  348.          int var7 = var2.getHeight((ImageObserver)null);
  349.          if (var6 > 0 && var7 > 0) {
  350.             this.tiledBgImage = ((Component)this).createImage(var4, var5);
  351.             Graphics var8 = this.tiledBgImage.getGraphics();
  352.             var8.setColor(((Component)this).getBackground());
  353.             var8.fillRect(0, 0, var4, var5);
  354.  
  355.             for(int var9 = 0; var9 < var4; var9 += var6) {
  356.                for(int var10 = 0; var10 < var5; var10 += var7) {
  357.                   var8.drawImage(var2, var9, var10, (ImageObserver)null);
  358.                }
  359.             }
  360.          }
  361.       }
  362.  
  363.       if (this.tiledBgImage != null) {
  364.          var1.drawImage(this.tiledBgImage, var3, var3, (ImageObserver)null);
  365.       }
  366.  
  367.    }
  368.  
  369.    public void paint(Graphics var1) {
  370.       if (this.offImage != null) {
  371.          var1.drawImage(this.offImage, 0, 0, (ImageObserver)null);
  372.       }
  373.  
  374.    }
  375.  
  376.    public void paintLoadMessage(Graphics var1) {
  377.       this.offGraphics.setColor(((Component)this).getBackground());
  378.       this.offGraphics.fillRect(0, 0, this.offSize.width, this.offSize.height);
  379.       this.offGraphics.setColor(((Component)this).getForeground());
  380.       this.offGraphics.drawString("FunScroll: Loading applet...", 10, 10);
  381.       var1.drawImage(this.offImage, 0, this.offSize.height / 3, (ImageObserver)null);
  382.    }
  383.  
  384.    protected void drawFrame(Graphics var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8) {
  385.       if (var7 > 0) {
  386.          if (this.frameDark1 == null) {
  387.             this.frameDark1 = FunScrollColorSupport.darker(((Component)this).getBackground(), (double)0.5F);
  388.             this.frameDark2 = FunScrollColorSupport.darker(((Component)this).getBackground(), 0.1);
  389.             this.frameBright = FunScrollColorSupport.brighter(((Component)this).getBackground(), (double)0.5F);
  390.          }
  391.  
  392.          switch (var6) {
  393.             case 1:
  394.                for(int var11 = 0; var11 < var7; ++var11) {
  395.                   var1.setColor(this.frameBright);
  396.                   this.drawTopLeftLines(var1, var2, var3, var4, var5, var11, var8);
  397.                   var1.setColor(this.frameDark1);
  398.                   this.drawBottomRightLines(var1, var2, var3, var4, var5, var11, var8);
  399.                }
  400.                break;
  401.             case 2:
  402.                for(int var10 = 0; var10 < var7; ++var10) {
  403.                   if (var10 == 0) {
  404.                      var1.setColor(this.frameDark1);
  405.                   } else if (var10 == var7 - 1) {
  406.                      var1.setColor(this.frameBright);
  407.                   } else {
  408.                      var1.setColor(this.frameDark2);
  409.                   }
  410.  
  411.                   this.drawTopLeftLines(var1, var2, var3, var4, var5, var10, var8);
  412.                   if (var10 == 0) {
  413.                      var1.setColor(this.frameBright);
  414.                   } else if (var10 == var7 - 1) {
  415.                      var1.setColor(this.frameDark1);
  416.                   } else {
  417.                      var1.setColor(this.frameDark2);
  418.                   }
  419.  
  420.                   this.drawBottomRightLines(var1, var2, var3, var4, var5, var10, var8);
  421.                }
  422.                break;
  423.             case 3:
  424.                for(int var9 = 0; var9 < var7; ++var9) {
  425.                   if (var9 == 0) {
  426.                      var1.setColor(this.frameBright);
  427.                   } else if (var9 == var7 - 1) {
  428.                      var1.setColor(this.frameDark1);
  429.                   } else {
  430.                      var1.setColor(((Component)this).getBackground());
  431.                   }
  432.  
  433.                   this.drawTopLeftLines(var1, var2, var3, var4, var5, var9, var8);
  434.                   if (var9 == 0) {
  435.                      var1.setColor(this.frameDark1);
  436.                   } else if (var9 == var7 - 1) {
  437.                      var1.setColor(this.frameBright);
  438.                   } else {
  439.                      var1.setColor(((Component)this).getBackground());
  440.                   }
  441.  
  442.                   this.drawBottomRightLines(var1, var2, var3, var4, var5, var9, var8);
  443.                }
  444.                break;
  445.             default:
  446.                for(int var12 = 0; var12 < var7; ++var12) {
  447.                   var1.setColor(this.frameDark1);
  448.                   this.drawTopLeftLines(var1, var2, var3, var4, var5, var12, var8);
  449.                   var1.setColor(this.frameBright);
  450.                   this.drawBottomRightLines(var1, var2, var3, var4, var5, var12, var8);
  451.                }
  452.          }
  453.  
  454.          var1.setColor(((Component)this).getBackground());
  455.       }
  456.    }
  457.  
  458.    void drawTopLeftLines(Graphics var1, int var2, int var3, int var4, int var5, int var6, int var7) {
  459.       var1.drawLine(var2 + var7 + var6, var3 + var7 + var6, var2 + var4 - var7 - var6 - 1, var3 + var7 + var6);
  460.       var1.drawLine(var2 + var7 + var6, var3 + var7 + var6, var2 + var7 + var6, var3 + var5 - var7 - var6 - 1);
  461.    }
  462.  
  463.    void drawBottomRightLines(Graphics var1, int var2, int var3, int var4, int var5, int var6, int var7) {
  464.       var1.drawLine(var2 + var7 + var6, var3 + var5 - var7 - var6 - 1, var2 + var4 - var7 - var6 - 1, var3 + var5 - var7 - var6 - 1);
  465.       var1.drawLine(var2 + var4 - var7 - var6 - 1, var3 + var7 + var6, var2 + var4 - var7 - var6 - 1, var3 + var5 - var7 - var6 - 1);
  466.    }
  467.  
  468.    public void update(Graphics var1) {
  469.       if (!this.initiated) {
  470.          this.paintLoadMessage(var1);
  471.       } else {
  472.          long var2 = 0L;
  473.          Dimension var4 = ((Component)this).size();
  474.          if (this.offImage == null || var4.width != this.offSize.width || var4.height != this.offSize.height) {
  475.             this.offSize = var4;
  476.             this.offImage = ((Component)this).createImage(var4.width, var4.height);
  477.             this.offGraphics = this.offImage.getGraphics();
  478.             this.textSize = new Dimension(var4.width - 2 * (this.frameWidth + this.frameMargin), var4.height - 2 * (this.frameWidth + this.frameMargin));
  479.             this.currentText.reset(this.frameMargin + this.frameWidth, var4.width, var4.height, this.offGraphics);
  480.             this.offGraphics.setColor(((Component)this).getBackground());
  481.             this.offGraphics.fillRect(0, 0, var4.width, var4.height);
  482.             this.drawFrame(this.offGraphics, 0, 0, var4.width, var4.height, this.frameType, this.frameWidth, this.frameMargin);
  483.             this.offGraphics.clipRect(this.frameMargin + this.frameWidth, this.frameMargin + this.frameWidth, this.textSize.width, this.textSize.height);
  484.          }
  485.  
  486.          this.offGraphics.setColor(((Component)this).getBackground());
  487.          this.offGraphics.fillRect(this.frameMargin + this.frameWidth, this.frameMargin + this.frameWidth, this.textSize.width, this.textSize.height);
  488.          if (this.bgImage != null && (this.mediaTracker.statusID(0, true) & 8) != 0) {
  489.             this.paintTiledImage(this.offGraphics, this.bgImage, this.frameMargin + this.frameWidth, this.textSize.width, this.textSize.height);
  490.          }
  491.  
  492.          this.animate(this.offGraphics, this.frameMargin + this.frameWidth, var4.width, var4.height);
  493.          var1.drawImage(this.offImage, 0, 0, (ImageObserver)null);
  494.          String var5 = "time for update():" + (System.currentTimeMillis() - var2);
  495.       }
  496.    }
  497.  
  498.    public void run() {
  499.       if (Thread.currentThread() == this.thread) {
  500.          this.thread.setPriority(1);
  501.          if (!this.initiated) {
  502.             Graphics var1 = ((Component)this).getGraphics();
  503.             this.paintLoadMessage(var1);
  504.             ((Component)this).getToolkit().sync();
  505.             this.initParameters();
  506.          }
  507.       }
  508.  
  509.       while(Thread.currentThread() == this.thread) {
  510.          ((Component)this).repaint();
  511.  
  512.          try {
  513.             this.threadStartTime += (long)this.threadDelay;
  514.             int var4 = (int)Math.max((long)(this.threadDelay / 2), this.threadStartTime - System.currentTimeMillis());
  515.             (new StringBuffer()).append("Sleep:").append(var4).toString();
  516.             Thread.sleep((long)var4);
  517.          } catch (InterruptedException var3) {
  518.             return;
  519.          }
  520.  
  521.          if (this.lineData != null && this.updateInterval > 0 && this.animateCount >= this.updateInterval) {
  522.             this.animateCount = 0;
  523.             Vector var5 = new Vector();
  524.             this.initLineParametersFromInputURL(this.lineData, var5, this.urlStrings);
  525.             this.createAnimatedTexts(var5, this.font, ((Component)this).getForeground(), ((Component)this).getBackground(), this.field_0, this.field_1, this.delim);
  526.          }
  527.       }
  528.  
  529.    }
  530.  
  531.    public void start() {
  532.       ((Component)this).repaint();
  533.       if (this.thread == null) {
  534.          if (this.threadGroup != null) {
  535.             this.thread = new Thread(this.threadGroup, this);
  536.          } else {
  537.             this.thread = new Thread(this);
  538.          }
  539.  
  540.          this.thread.start();
  541.       }
  542.  
  543.       this.threadStartTime = System.currentTimeMillis();
  544.    }
  545.  
  546.    public void stop() {
  547.       this.thread = null;
  548.    }
  549.  
  550.    public boolean mouseUp(Event var1, int var2, int var3) {
  551.       if ((var1.modifiers & 1) != 0) {
  552.          this.showAbout();
  553.          return true;
  554.       } else {
  555.          String var4 = null;
  556.          if (this.currentTextIndex < this.urlStrings.size()) {
  557.             var4 = (String)this.urlStrings.elementAt(this.currentTextIndex);
  558.          }
  559.  
  560.          if (!this.suspended && this.thread != null) {
  561.             if (var4 == null) {
  562.                this.stop();
  563.                this.suspended = true;
  564.             }
  565.          } else {
  566.             this.start();
  567.             this.suspended = false;
  568.          }
  569.  
  570.          if (this.suspended) {
  571.             ((Applet)this).showStatus(this.getAppletInfo() + " - Click to resume.");
  572.          } else if (var4 != null) {
  573.             this.showDocument(var4);
  574.          } else {
  575.             ((Applet)this).showStatus(this.getAppletInfo() + " - Shift-click for info...");
  576.          }
  577.  
  578.          return true;
  579.       }
  580.    }
  581.  
  582.    public boolean mouseEnter(Event var1, int var2, int var3) {
  583.       this.showUrl();
  584.       return true;
  585.    }
  586.  
  587.    void showAbout() {
  588.       FunScrollAbout var1 = new FunScrollAbout(this.getAppletInfo());
  589.       var1.appendText("\t" + this.getAppletInfo() + "\n\n");
  590.       var1.appendText("Copyright (c) 1996 by Jan Andersson, Torpa Konsult AB.\n\n");
  591.       var1.appendText("Info, updates and documentation at http://www.algonet.se/FunScroll/FunScroll.html\n\n");
  592.       var1.appendText("Applet information:\n");
  593.       var1.appendText(" Document base: " + ((Applet)this).getDocumentBase() + "\n");
  594.       var1.appendText(" Code base: " + ((Applet)this).getCodeBase() + "\n\n");
  595.       var1.appendText(" Applet parameters:\n");
  596.       var1.appendText("  width = " + this.getParameter("WIDTH") + "\n");
  597.       var1.appendText("  height = " + this.getParameter("HEIGHT") + "\n\n");
  598.       var1.appendText(" Message lines (line<n> parameters):\n");
  599.  
  600.       for(int var2 = 0; var2 < this.noOfTexts; ++var2) {
  601.          FunScrollAnimatedText var3 = (FunScrollAnimatedText)this.animatedTexts.elementAt(var2);
  602.          var1.appendText("  line" + var2 + " = " + var3.getUnparsedTextLine() + "\n");
  603.          var1.appendText("  url" + var2 + " = ");
  604.          String var4 = null;
  605.          if (var2 < this.urlStrings.size()) {
  606.             var4 = (String)this.urlStrings.elementAt(var2);
  607.          }
  608.  
  609.          var1.appendText(var4 + "\n");
  610.       }
  611.  
  612.       var1.appendText("\n Other parameters:\n");
  613.       String[][] var6 = this.getParameterInfo();
  614.  
  615.       for(int var7 = 2; var7 < var6.length; ++var7) {
  616.          String var5 = "  " + var6[var7][0] + " = " + this.getParameter(var6[var7][0]);
  617.          if (var5.length() <= 17) {
  618.             var5 = var5 + "\t";
  619.          }
  620.  
  621.          var1.appendText(var5 + "\t [" + var6[var7][2] + "]\n");
  622.       }
  623.  
  624.       var1.show();
  625.    }
  626.  
  627.    void showUrl() {
  628.       if (this.urlStrings != null && this.currentTextIndex < this.urlStrings.size()) {
  629.          String var1 = (String)this.urlStrings.elementAt(this.currentTextIndex);
  630.          if (var1 != null) {
  631.             String var2 = var1.toUpperCase();
  632.             int var3 = var2.indexOf("TARGET=");
  633.             if (var3 > 0) {
  634.                var1 = var1.substring(0, var3);
  635.             }
  636.  
  637.             ((Applet)this).showStatus(var1);
  638.             return;
  639.          }
  640.  
  641.          ((Applet)this).showStatus("");
  642.       }
  643.  
  644.    }
  645.  
  646.    void showDocument(String var1) {
  647.       String var2 = null;
  648.       String var3 = var1.toUpperCase();
  649.       int var4 = var3.indexOf("TARGET=");
  650.       if (var4 > 0) {
  651.          String var9 = var1.substring(var4 + 7);
  652.          var1 = var1.substring(0, var4);
  653.          var2 = var9.trim();
  654.          (new StringBuffer()).append("target:").append(var2).toString();
  655.       }
  656.  
  657.       if (var2 == null) {
  658.          var2 = this.urlTarget;
  659.       }
  660.  
  661.       Object var5 = null;
  662.  
  663.       try {
  664.          var10 = new URL(((Applet)this).getDocumentBase(), var1);
  665.       } catch (MalformedURLException var8) {
  666.          ((Applet)this).showStatus(((Throwable)var8).getMessage());
  667.          var10 = null;
  668.       }
  669.  
  670.       if (var10 == null) {
  671.          try {
  672.             var10 = new URL(var1);
  673.          } catch (MalformedURLException var7) {
  674.             ((Applet)this).showStatus(((Throwable)var7).getMessage());
  675.             var10 = null;
  676.          }
  677.       }
  678.  
  679.       if (var10 != null) {
  680.          ((Applet)this).showStatus("Loading: " + var1 + "...");
  681.          if (var2 == null) {
  682.             ((Applet)this).getAppletContext().showDocument(var10);
  683.             return;
  684.          }
  685.  
  686.          ((Applet)this).getAppletContext().showDocument(var10, var2);
  687.       }
  688.  
  689.    }
  690.  
  691.    public static void dbg(String var0) {
  692.    }
  693. }
  694.