home *** CD-ROM | disk | FTP | other *** search
/ PC Online 1997 October / PCO1097.ISO / FilesBBS / FREI / FSCROLL.EXE / FunScroll.class (.txt) < prev    next >
Encoding:
Java Class File  |  1997-09-02  |  18.3 KB  |  988 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.DataOutputStream;
  14. import java.io.FilterInputStream;
  15. import java.io.FilterOutputStream;
  16. import java.io.IOException;
  17. import java.io.InputStream;
  18. import java.io.OutputStream;
  19. import java.net.MalformedURLException;
  20. import java.net.Socket;
  21. import java.net.URL;
  22. import java.net.URLConnection;
  23. import java.util.Hashtable;
  24. import java.util.Vector;
  25.  
  26. public class FunScroll extends Applet implements Runnable {
  27.    static final int MaxLines = 50;
  28.    static final int ShadowIn = 0;
  29.    static final int ShadowOut = 1;
  30.    static final int ShadowEtchedIn = 2;
  31.    static final int ShadowEtchedOut = 3;
  32.    Image bgImage;
  33.    Image tiledBgImage;
  34.    MediaTracker mediaTracker;
  35.    Thread thread;
  36.    ThreadGroup threadGroup;
  37.    boolean suspended = false;
  38.    int threadDelay = 100;
  39.    String lineData;
  40.    boolean usingCgi = false;
  41.    boolean randomize = false;
  42.    boolean showAbout = true;
  43.    int updateInterval;
  44.    int animateCount;
  45.    Font font;
  46.    // $FF: renamed from: dx int
  47.    int field_0 = 3;
  48.    // $FF: renamed from: dy int
  49.    int field_1 = 2;
  50.    String delim;
  51.    long threadStartTime;
  52.    Vector animatedObjects;
  53.    Vector urlStrings;
  54.    String urlTarget;
  55.    int noOfObjects;
  56.    int currentObjectIndex;
  57.    FunScrollAnimate currentObj;
  58.    int frameWidth;
  59.    int frameType;
  60.    int frameMargin;
  61.    Color frameDark1;
  62.    Color frameDark2;
  63.    Color frameBright;
  64.    Image offImage;
  65.    Dimension offSize;
  66.    Dimension animAreaSize;
  67.    Hashtable urlParameters;
  68.    protected boolean initiated = false;
  69.    static final boolean debug = false;
  70.    static final String sourceLocation = "http://www.algonet.se/~jannea/FunScroll/FunScroll.html";
  71.    static final String versionInfo = "FunScroll 3.2";
  72.    // $FF: renamed from: c int
  73.    private int field_2;
  74.  
  75.    public void init() {
  76.       Color var1 = this.readColor(this.getParameter("fgColor"), Color.black);
  77.       Color var2 = this.readColor(this.getParameter("bgColor"), ((Component)this).getBackground());
  78.       ((Component)this).setBackground(var2);
  79.       ((Component)this).setForeground(var1);
  80.       this.threadGroup = Thread.currentThread().getThreadGroup();
  81.    }
  82.  
  83.    public void initParameters() {
  84.       Vector var1 = new Vector();
  85.       this.urlStrings = new Vector();
  86.       String var2 = this.getParameter("cgi");
  87.       if (var2 != null) {
  88.          this.usingCgi = true;
  89.       } else {
  90.          var2 = this.getParameter("lineData");
  91.       }
  92.  
  93.       if (var2 != null) {
  94.          this.lineData = var2;
  95.          this.initLineParametersFromInputURL(this.lineData, var1, this.urlStrings);
  96.          var2 = this.getParameter("updateInterval");
  97.          if (var2 != null) {
  98.             this.updateInterval = Integer.valueOf(var2);
  99.          }
  100.       } else {
  101.          this.initLineParameters(var1, this.urlStrings);
  102.       }
  103.  
  104.       Color var3 = this.readColor(this.getParameter("fgColor"), Color.black);
  105.       Color var4 = this.readColor(this.getParameter("bgColor"), ((Component)this).getBackground());
  106.       ((Component)this).setBackground(var4);
  107.       ((Component)this).setForeground(var3);
  108.       this.frameWidth = this.getParameterToInt("frameWidth", this.frameWidth);
  109.       this.frameMargin = this.getParameterToInt("frameMargin", this.frameMargin);
  110.       this.frameType = this.getParameterToFrameType("frameType", this.frameType);
  111.       this.urlTarget = this.getParameter("target");
  112.       var2 = this.getParameter("bgImage");
  113.       if (var2 != null) {
  114.          this.bgImage = ((Applet)this).getImage(((Applet)this).getCodeBase(), var2);
  115.          this.mediaTracker = new MediaTracker(this);
  116.          this.mediaTracker.addImage(this.bgImage, 0);
  117.       }
  118.  
  119.       this.font = this.getParameterToFont("font", "style", "size");
  120.       this.threadDelay = this.getParameterToInt("delay", this.threadDelay);
  121.       this.field_0 = this.getParameterToInt("dx", this.field_0);
  122.       this.field_1 = this.getParameterToInt("dy", this.field_1);
  123.       this.delim = this.getParameter("delim");
  124.       var2 = this.getParameter("randomize");
  125.       if (var2 != null && var2.equalsIgnoreCase("True")) {
  126.          this.randomize = true;
  127.       }
  128.  
  129.       var2 = this.getParameter("showAbout");
  130.       if (var2 != null && var2.equalsIgnoreCase("False")) {
  131.          this.showAbout = false;
  132.       }
  133.  
  134.       this.createAnimates(var1, this.font, ((Component)this).getForeground(), ((Component)this).getBackground(), this.field_0, this.field_1, this.delim);
  135.       this.initiated = true;
  136.    }
  137.  
  138.    public String getParameter(String var1) {
  139.       String var2 = super.getParameter(var1);
  140.       if (this.urlParameters != null) {
  141.          String var3 = (String)this.urlParameters.get(var1.toLowerCase());
  142.          if (var3 != null) {
  143.             var2 = var3;
  144.          }
  145.       }
  146.  
  147.       if (var2 == null) {
  148.          return null;
  149.       } else {
  150.          char[] var5 = var2.toCharArray();
  151.  
  152.          for(int var4 = 0; var4 < var5.length; ++var4) {
  153.             if (var5[var4] >= '\uff00') {
  154.                var5[var4] = (char)(var5[var4] & 255);
  155.             }
  156.          }
  157.  
  158.          return new String(var5);
  159.       }
  160.    }
  161.  
  162.    public int getParameterToInt(String var1, int var2) {
  163.       String var3 = this.getParameter(var1);
  164.       return var3 == null ? var2 : Integer.parseInt(var3);
  165.    }
  166.  
  167.    public int getParameterToFrameType(String var1, int var2) {
  168.       String var3 = this.getParameter(var1);
  169.       if (var3 == null) {
  170.          return var2;
  171.       } else if (var3.equalsIgnoreCase("ShadowOut")) {
  172.          return 1;
  173.       } else if (var3.equalsIgnoreCase("ShadowEtchedIn")) {
  174.          return 2;
  175.       } else {
  176.          return var3.equalsIgnoreCase("ShadowEtchedOut") ? 3 : 0;
  177.       }
  178.    }
  179.  
  180.    public Font getParameterToFont(String var1, String var2, String var3) {
  181.       String var4 = this.getParameter(var1);
  182.       if (var4 == null) {
  183.          var4 = "TimesRoman";
  184.       }
  185.  
  186.       String var5 = this.getParameter(var2);
  187.       byte var6 = 1;
  188.       if (var5 != null) {
  189.          if (var5.equalsIgnoreCase("plain")) {
  190.             var6 = 0;
  191.          } else if (var5.equalsIgnoreCase("bold")) {
  192.             var6 = 1;
  193.          } else if (var5.equalsIgnoreCase("italic")) {
  194.             var6 = 2;
  195.          } else if (var5.equalsIgnoreCase("bolditalic")) {
  196.             var6 = 3;
  197.          }
  198.       }
  199.  
  200.       int var7 = this.getParameterToInt(var3, 24);
  201.       int var9 = var7;
  202.       Object var10 = null;
  203.  
  204.       FontMetrics var8;
  205.       do {
  206.          (new StringBuffer()).append("trying: ").append(var4).append(",").append(var9).toString();
  207.          var12 = new Font(var4, var6, var9--);
  208.          var8 = ((Component)this).getFontMetrics(var12);
  209.       } while(var8.getDescent() + var8.getAscent() > var7 && var9 >= var7 - 3 && var7 >= 6);
  210.  
  211.       if (var9 < var7 - 3 || var7 < 6) {
  212.          var12 = new Font(var4, var6, var7);
  213.       }
  214.  
  215.       (new StringBuffer()).append("using font: ").append(var12.toString()).toString();
  216.       return var12;
  217.    }
  218.  
  219.    protected void initLineParameters(Vector var1, Vector var2) {
  220.       for(int var3 = 0; var3 < 50; ++var3) {
  221.          String var4 = "line" + var3;
  222.          String var5 = this.getParameter(var4);
  223.          String var6 = "url" + var3;
  224.          String var7 = this.getParameter(var6);
  225.          if (var5 != null) {
  226.             (new StringBuffer()).append("  ").append(var4).append(":").append(var5).toString();
  227.             var1.addElement(var5);
  228.             (new StringBuffer()).append("  ").append(var6).append(":").append(var7).toString();
  229.             var2.addElement(var7);
  230.          }
  231.       }
  232.  
  233.       if (var1.size() <= 0) {
  234.          this.initDefaultLineParameters(var1);
  235.       }
  236.  
  237.    }
  238.  
  239.    private void skipSpace(InputStream var1) throws IOException {
  240.       while(this.field_2 >= 0 && (this.field_2 == 32 || this.field_2 == 9 || this.field_2 == 10 || this.field_2 == 13)) {
  241.          this.field_2 = var1.read();
  242.       }
  243.  
  244.    }
  245.  
  246.    private void skipCommentLine(InputStream var1) throws IOException {
  247.       while(this.field_2 >= 0 && this.field_2 != 10 && this.field_2 != 13) {
  248.          this.field_2 = var1.read();
  249.       }
  250.  
  251.    }
  252.  
  253.    private String scanIdentifier(InputStream var1) throws IOException {
  254.       StringBuffer var2;
  255.       for(var2 = new StringBuffer(); this.field_2 >= 97 && this.field_2 <= 122 || this.field_2 >= 65 && this.field_2 <= 90 || this.field_2 >= 48 && this.field_2 <= 57 || this.field_2 == 95; this.field_2 = var1.read()) {
  256.          var2.append((char)this.field_2);
  257.       }
  258.  
  259.       return var2.toString();
  260.    }
  261.  
  262.    private Hashtable scanTag(InputStream var1) throws IOException {
  263.       Hashtable var2 = new Hashtable();
  264.       this.skipSpace(var1);
  265.  
  266.       while(this.field_2 >= 0 && this.field_2 != 62) {
  267.          String var3 = this.scanIdentifier(var1);
  268.          String var4 = "";
  269.          this.skipSpace(var1);
  270.          if (this.field_2 == 61) {
  271.             int var5 = -1;
  272.             this.field_2 = var1.read();
  273.             this.skipSpace(var1);
  274.             if (this.field_2 == 39 || this.field_2 == 34) {
  275.                var5 = this.field_2;
  276.                this.field_2 = var1.read();
  277.             }
  278.  
  279.             StringBuffer var6;
  280.             for(var6 = new StringBuffer(); this.field_2 > 0 && (var5 < 0 && this.field_2 != 32 && this.field_2 != 9 && this.field_2 != 10 && this.field_2 != 13 && this.field_2 != 62 || var5 >= 0 && this.field_2 != var5); this.field_2 = var1.read()) {
  281.                var6.append((char)this.field_2);
  282.             }
  283.  
  284.             if (this.field_2 == var5) {
  285.                this.field_2 = var1.read();
  286.             }
  287.  
  288.             this.skipSpace(var1);
  289.             var4 = var6.toString();
  290.          }
  291.  
  292.          var2.put(var3.toLowerCase(), var4);
  293.          this.skipSpace(var1);
  294.       }
  295.  
  296.       return var2;
  297.    }
  298.  
  299.    private void parseInput(DataInputStream var1, Vector var2, Vector var3) throws IOException {
  300.       for(this.field_2 = ((FilterInputStream)var1).read(); this.field_2 >= 0; this.skipSpace(var1)) {
  301.          if (this.field_2 == 35) {
  302.             this.skipCommentLine(var1);
  303.          } else {
  304.             if (this.field_2 != 60) {
  305.                this.readLineData(var1, "", var2, var3);
  306.                ((FilterInputStream)var1).close();
  307.                return;
  308.             }
  309.  
  310.             this.field_2 = ((FilterInputStream)var1).read();
  311.             String var4 = this.scanIdentifier(var1);
  312.             if (!var4.equalsIgnoreCase("param")) {
  313.                this.readLineData(var1, "<" + var4 + ">", var2, var3);
  314.                ((FilterInputStream)var1).close();
  315.                return;
  316.             }
  317.  
  318.             Hashtable var5 = this.scanTag(var1);
  319.             String var6 = (String)var5.get("name");
  320.             if (var6 == null) {
  321.                System.out.println("Warning: <param name=... value=...>tag requires name attribute.");
  322.             } else {
  323.                String var7 = (String)var5.get("value");
  324.                if (var7 == null) {
  325.                   System.out.println("Warning: <param name=... value=...>tag requires value attribute.");
  326.                } else {
  327.                   if (this.urlParameters == null) {
  328.                      this.urlParameters = new Hashtable();
  329.                   }
  330.  
  331.                   String var8 = "parseInput() put " + var6 + " = '" + var7 + "'";
  332.                   this.urlParameters.put(var6.toLowerCase(), var7);
  333.                }
  334.             }
  335.          }
  336.  
  337.          if (this.field_2 == 62) {
  338.             this.field_2 = ((FilterInputStream)var1).read();
  339.          }
  340.       }
  341.  
  342.       ((FilterInputStream)var1).close();
  343.    }
  344.  
  345.    String readDataLine(DataInputStream var1) throws IOException {
  346.       String var2;
  347.       for(var2 = var1.readLine(); var2 != null && (var2.length() == 0 || var2.charAt(0) == '#'); var2 = var1.readLine()) {
  348.       }
  349.  
  350.       return var2;
  351.    }
  352.  
  353.    void readLineData(DataInputStream var1, String var2, Vector var3, Vector var4) throws IOException {
  354.       Object var5 = null;
  355.       String var7 = var2 + var1.readLine();
  356.  
  357.       while(var7 != null) {
  358.          (new StringBuffer()).append("readLineData: ").append(var7).toString();
  359.          var3.addElement(var7);
  360.          var7 = this.readDataLine(var1);
  361.          if (var7 != null && var7.length() > 4 && var7.substring(0, 4).equalsIgnoreCase("URL:")) {
  362.             var4.addElement(var7.substring(4));
  363.             var7 = this.readDataLine(var1);
  364.          } else {
  365.             var4.addElement((Object)null);
  366.          }
  367.       }
  368.  
  369.    }
  370.  
  371.    protected void initLineParametersFromInputURL(String var1, Vector var2, Vector var3) {
  372.       if (this.usingCgi) {
  373.          this.postCGI(var1, var2, var3);
  374.       } else {
  375.          URL var4 = null;
  376.          Object var5 = null;
  377.  
  378.          try {
  379.             var4 = new URL(var1);
  380.             (new StringBuffer()).append("initLineParametersFromInputURL(): using direct URL: ").append(var4).toString();
  381.             URLConnection var6 = var4.openConnection();
  382.             var6.setUseCaches(false);
  383.             var11 = new DataInputStream(var6.getInputStream());
  384.          } catch (Exception var9) {
  385.             (new StringBuffer()).append("initLineParametersFromInputURL(): Can't read URL:").append(var4).toString();
  386.             var11 = null;
  387.          }
  388.  
  389.          if (var11 == null) {
  390.             try {
  391.                var4 = new URL(((Applet)this).getDocumentBase(), var1);
  392.                (new StringBuffer()).append("initLineParametersFromInputURL(): using rel. URL:").append(var4).toString();
  393.                URLConnection var13 = var4.openConnection();
  394.                var13.setUseCaches(false);
  395.                var11 = new DataInputStream(var13.getInputStream());
  396.             } catch (Exception var8) {
  397.                (new StringBuffer()).append("initLineParametersFromInputURL(): Can't read URL:").append(var4).toString();
  398.                var5 = null;
  399.                this.initURLErrorLineParameters(var1, var2);
  400.                this.updateInterval = 0;
  401.                return;
  402.             }
  403.          }
  404.  
  405.          try {
  406.             this.parseInput(var11, var2, var3);
  407.          } catch (IOException var7) {
  408.          }
  409.  
  410.          if (var2.size() <= 0) {
  411.             this.initURLErrorLineParameters(var1, var2);
  412.             this.updateInterval = 0;
  413.          }
  414.  
  415.       }
  416.    }
  417.  
  418.    public void postCGI(String var1, Vector var2, Vector var3) {
  419.       String var4 = ((Applet)this).getCodeBase().getHost();
  420.       int var5 = ((Applet)this).getCodeBase().getPort();
  421.       if (var5 == -1) {
  422.          var5 = 80;
  423.       }
  424.  
  425.       (new StringBuffer()).append("postCGI; home: ").append(var4).append("port: ").append(var5).toString();
  426.  
  427.       Socket var6;
  428.       try {
  429.          var6 = new Socket(var4, var5);
  430.       } catch (Exception var19) {
  431.          String var8 = "postCGI(): Can't create socket:" + var19;
  432.          this.initURLErrorLineParameters(var1, var2);
  433.          this.updateInterval = 0;
  434.          return;
  435.       }
  436.  
  437.       OutputStream var7;
  438.       InputStream var21;
  439.       try {
  440.          var7 = var6.getOutputStream();
  441.          var21 = var6.getInputStream();
  442.       } catch (Exception var18) {
  443.          try {
  444.             var6.close();
  445.          } catch (IOException var14) {
  446.          }
  447.  
  448.          String var12 = "postCGI(): Can't create output stream:" + var18;
  449.          this.initURLErrorLineParameters(var1, var2);
  450.          this.updateInterval = 0;
  451.          return;
  452.       }
  453.  
  454.       DataOutputStream var9;
  455.       DataInputStream var10;
  456.       try {
  457.          var9 = new DataOutputStream(var7);
  458.          var10 = new DataInputStream(var21);
  459.       } catch (Exception var17) {
  460.          try {
  461.             var6.close();
  462.          } catch (IOException var13) {
  463.          }
  464.  
  465.          String var22 = "postCGI(): Can't create output stream:" + var17;
  466.          this.initURLErrorLineParameters(var1, var2);
  467.          this.updateInterval = 0;
  468.          return;
  469.       }
  470.  
  471.       try {
  472.          var9.writeBytes("POST " + var1 + " HTTP/1.0\r\n");
  473.          var9.writeBytes("Content-type: application/octet-stream\r\n");
  474.          var9.writeBytes("Content-length: 0\r\n");
  475.          var9.writeBytes("User-Agent: FunScroll 3.2\r\n");
  476.          var9.writeBytes("\r\n");
  477.  
  478.          String var11;
  479.          while((var11 = var10.readLine()) != null && !var11.equals("")) {
  480.             (new StringBuffer()).append("postCGI(); respose header: ").append(var11).toString();
  481.          }
  482.  
  483.          this.parseInput(var10, var2, var3);
  484.       } catch (Exception var20) {
  485.       }
  486.  
  487.       if (var2.size() <= 0) {
  488.          this.initURLErrorLineParameters(var1, var2);
  489.          this.updateInterval = 0;
  490.       }
  491.  
  492.       try {
  493.          ((FilterOutputStream)var9).close();
  494.          ((FilterInputStream)var10).close();
  495.       } catch (IOException var16) {
  496.       }
  497.  
  498.       try {
  499.          var6.close();
  500.       } catch (IOException var15) {
  501.       }
  502.    }
  503.  
  504.    protected void initDefaultLineParameters(Vector var1) {
  505.       this.threadDelay = 200;
  506.       var1.addElement("<25><typed>" + this.getAppletInfo());
  507.       var1.addElement("<100>No parameters specified!");
  508.    }
  509.  
  510.    protected void initURLErrorLineParameters(String var1, Vector var2) {
  511.       this.threadDelay = 200;
  512.       var2.addElement("<nervous><30><color=#FF0000>Error!");
  513.       var2.addElement("<100>Could not read url: " + var1);
  514.    }
  515.  
  516.    public String getAppletInfo() {
  517.       return "FunScroll 3.2";
  518.    }
  519.  
  520.    public String[][] getParameterInfo() {
  521.       String[][] var1 = new String[][]{{"line<n>", "string", "Message line <n>"}, {"url<n>", "string", "URL <n>"}, {"showAbout", "boolean", "Display about popup on shift-click"}, {"randomize", "boolean", "Display message lines in random order"}, {"target", "string", "Default frame or window target"}, {"lineData", "string", "Message line data file"}, {"cgi", "string", "CGI script to be used to read message lines"}, {"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"}};
  522.       return var1;
  523.    }
  524.  
  525.    public Color readColor(String var1, Color var2) {
  526.       if (var1 == null) {
  527.          return var2;
  528.       } else {
  529.          Object var3 = null;
  530.  
  531.          try {
  532.             if (var1.startsWith("#")) {
  533.                var5 = Integer.valueOf(var1.substring(1), 16);
  534.             } else if (var1.startsWith("0x")) {
  535.                var5 = Integer.valueOf(var1.substring(2), 16);
  536.             } else {
  537.                var5 = Integer.valueOf(FunScrollColorSupport.lookup(var1), 16);
  538.             }
  539.          } catch (NumberFormatException var4) {
  540.             var5 = null;
  541.          }
  542.  
  543.          return var5 == null ? var2 : new Color(var5);
  544.       }
  545.    }
  546.  
  547.    public void createAnimates(Vector var1, Font var2, Color var3, Color var4, int var5, int var6, String var7) {
  548.       this.noOfObjects = 0;
  549.       this.animatedObjects = new Vector(var1.size());
  550.  
  551.       for(int var8 = 0; var8 < var1.size(); ++var8) {
  552.          String var9 = "  " + (String)var1.elementAt(var8);
  553.          this.animatedObjects.addElement(new FunScrollAnimate(this, (String)var1.elementAt(var8), var2, var3, var4, var5, var6, var7));
  554.          ++this.noOfObjects;
  555.       }
  556.  
  557.       this.currentObjectIndex = 0;
  558.       if (this.randomize) {
  559.          this.currentObjectIndex = (int)((double)this.noOfObjects * Math.random());
  560.       }
  561.  
  562.       this.currentObj = (FunScrollAnimate)this.animatedObjects.elementAt(this.currentObjectIndex);
  563.       this.offSize = new Dimension(0, 0);
  564.    }
  565.  
  566.    public void animate(Graphics var1) {
  567.       if (this.currentObj.update(var1)) {
  568.          if (this.randomize) {
  569.             this.currentObjectIndex = (int)((double)this.noOfObjects * Math.random());
  570.          } else {
  571.             ++this.currentObjectIndex;
  572.          }
  573.  
  574.          if (this.currentObjectIndex >= this.noOfObjects) {
  575.             if (this.lineData != null && this.updateInterval > 0) {
  576.                ++this.animateCount;
  577.             }
  578.  
  579.             this.currentObjectIndex = 0;
  580.          }
  581.  
  582.          this.currentObj = (FunScrollAnimate)this.animatedObjects.elementAt(this.currentObjectIndex);
  583.          this.currentObj.reset();
  584.       }
  585.  
  586.    }
  587.  
  588.    public void paintTiledImage(Graphics var1, Image var2, int var3, int var4, int var5) {
  589.       if (this.tiledBgImage == null) {
  590.          int var6 = var2.getWidth((ImageObserver)null);
  591.          int var7 = var2.getHeight((ImageObserver)null);
  592.          if (var6 > 0 && var7 > 0) {
  593.             this.tiledBgImage = ((Component)this).createImage(var4, var5);
  594.             Graphics var8 = this.tiledBgImage.getGraphics();
  595.             var8.setColor(((Component)this).getBackground());
  596.             var8.fillRect(0, 0, var4, var5);
  597.  
  598.             for(int var9 = 0; var9 < var4; var9 += var6) {
  599.                for(int var10 = 0; var10 < var5; var10 += var7) {
  600.                   var8.drawImage(var2, var9, var10, (ImageObserver)null);
  601.                }
  602.             }
  603.  
  604.             var8.dispose();
  605.          }
  606.       }
  607.  
  608.       if (this.tiledBgImage != null) {
  609.          var1.drawImage(this.tiledBgImage, var3, var3, (ImageObserver)null);
  610.       }
  611.  
  612.    }
  613.  
  614.    public void paint(Graphics var1) {
  615.       if (this.offImage != null) {
  616.          var1.drawImage(this.offImage, 0, 0, (ImageObserver)null);
  617.       }
  618.  
  619.    }
  620.  
  621.    public void initLoadMessage() {
  622.       if (this.offImage == null) {
  623.          this.offSize = ((Component)this).size();
  624.          this.offImage = ((Component)this).createImage(this.offSize.width, this.offSize.height);
  625.       }
  626.  
  627.       Graphics var1 = this.offImage.getGraphics();
  628.       var1.setColor(((Component)this).getBackground());
  629.       var1.fillRect(0, 0, this.offSize.width, this.offSize.height);
  630.       var1.setColor(((Component)this).getForeground());
  631.       var1.drawString("FunScroll: Loading applet...", 10, this.offSize.height / 2);
  632.       var1.dispose();
  633.    }
  634.  
  635.    protected void drawFrame(Graphics var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8) {
  636.       if (var7 > 0) {
  637.          if (this.frameDark1 == null) {
  638.             this.frameDark1 = FunScrollColorSupport.darker(((Component)this).getBackground(), (double)0.5F);
  639.             this.frameDark2 = FunScrollColorSupport.darker(((Component)this).getBackground(), 0.1);
  640.             this.frameBright = FunScrollColorSupport.brighter(((Component)this).getBackground(), (double)0.5F);
  641.          }
  642.  
  643.          switch (var6) {
  644.             case 1:
  645.                for(int var11 = 0; var11 < var7; ++var11) {
  646.                   var1.setColor(this.frameBright);
  647.                   this.drawTopLeftLines(var1, var2, var3, var4, var5, var11, var8);
  648.                   var1.setColor(this.frameDark1);
  649.                   this.drawBottomRightLines(var1, var2, var3, var4, var5, var11, var8);
  650.                }
  651.                break;
  652.             case 2:
  653.                for(int var10 = 0; var10 < var7; ++var10) {
  654.                   if (var10 == 0) {
  655.                      var1.setColor(this.frameDark1);
  656.                   } else if (var10 == var7 - 1) {
  657.                      var1.setColor(this.frameBright);
  658.                   } else {
  659.                      var1.setColor(this.frameDark2);
  660.                   }
  661.  
  662.                   this.drawTopLeftLines(var1, var2, var3, var4, var5, var10, var8);
  663.                   if (var10 == 0) {
  664.                      var1.setColor(this.frameBright);
  665.                   } else if (var10 == var7 - 1) {
  666.                      var1.setColor(this.frameDark1);
  667.                   } else {
  668.                      var1.setColor(this.frameDark2);
  669.                   }
  670.  
  671.                   this.drawBottomRightLines(var1, var2, var3, var4, var5, var10, var8);
  672.                }
  673.                break;
  674.             case 3:
  675.                for(int var9 = 0; var9 < var7; ++var9) {
  676.                   if (var9 == 0) {
  677.                      var1.setColor(this.frameBright);
  678.                   } else if (var9 == var7 - 1) {
  679.                      var1.setColor(this.frameDark1);
  680.                   } else {
  681.                      var1.setColor(((Component)this).getBackground());
  682.                   }
  683.  
  684.                   this.drawTopLeftLines(var1, var2, var3, var4, var5, var9, var8);
  685.                   if (var9 == 0) {
  686.                      var1.setColor(this.frameDark1);
  687.                   } else if (var9 == var7 - 1) {
  688.                      var1.setColor(this.frameBright);
  689.                   } else {
  690.                      var1.setColor(((Component)this).getBackground());
  691.                   }
  692.  
  693.                   this.drawBottomRightLines(var1, var2, var3, var4, var5, var9, var8);
  694.                }
  695.                break;
  696.             default:
  697.                for(int var12 = 0; var12 < var7; ++var12) {
  698.                   var1.setColor(this.frameDark1);
  699.                   this.drawTopLeftLines(var1, var2, var3, var4, var5, var12, var8);
  700.                   var1.setColor(this.frameBright);
  701.                   this.drawBottomRightLines(var1, var2, var3, var4, var5, var12, var8);
  702.                }
  703.          }
  704.  
  705.          var1.setColor(((Component)this).getBackground());
  706.       }
  707.    }
  708.  
  709.    void drawTopLeftLines(Graphics var1, int var2, int var3, int var4, int var5, int var6, int var7) {
  710.       var1.drawLine(var2 + var7 + var6, var3 + var7 + var6, var2 + var4 - var7 - var6 - 1, var3 + var7 + var6);
  711.       var1.drawLine(var2 + var7 + var6, var3 + var7 + var6, var2 + var7 + var6, var3 + var5 - var7 - var6 - 1);
  712.    }
  713.  
  714.    void drawBottomRightLines(Graphics var1, int var2, int var3, int var4, int var5, int var6, int var7) {
  715.       var1.drawLine(var2 + var7 + var6, var3 + var5 - var7 - var6 - 1, var2 + var4 - var7 - var6 - 1, var3 + var5 - var7 - var6 - 1);
  716.       var1.drawLine(var2 + var4 - var7 - var6 - 1, var3 + var7 + var6, var2 + var4 - var7 - var6 - 1, var3 + var5 - var7 - var6 - 1);
  717.    }
  718.  
  719.    public void update(Graphics var1) {
  720.       this.paint(var1);
  721.    }
  722.  
  723.    void updateAnimation() {
  724.       if (this.initiated) {
  725.          long var1 = 0L;
  726.          Dimension var3 = ((Component)this).size();
  727.          if (this.offImage == null || var3.width != this.offSize.width || var3.height != this.offSize.height) {
  728.             this.offSize = var3;
  729.             this.offImage = ((Component)this).createImage(var3.width, var3.height);
  730.             this.currentObj.reset();
  731.          }
  732.  
  733.          Graphics var4 = this.offImage.getGraphics();
  734.          int var5 = this.getMargin();
  735.          this.animAreaSize = new Dimension(var3.width - 2 * var5, var3.height - 2 * var5);
  736.          var4.setColor(((Component)this).getBackground());
  737.          var4.fillRect(0, 0, var3.width, var3.height);
  738.          this.drawFrame(var4, 0, 0, var3.width, var3.height, this.frameType, this.frameWidth, this.frameMargin);
  739.          var4.clipRect(var5, var5, this.animAreaSize.width, this.animAreaSize.height);
  740.          var4.setColor(((Component)this).getBackground());
  741.          var4.fillRect(this.frameMargin + this.frameWidth, this.frameMargin + this.frameWidth, this.animAreaSize.width, this.animAreaSize.height);
  742.          if (this.bgImage != null) {
  743.             if ((this.mediaTracker.statusID(0, true) & 8) != 0) {
  744.                this.paintTiledImage(var4, this.bgImage, this.frameMargin + this.frameWidth, this.animAreaSize.width, this.animAreaSize.height);
  745.             } else if (this.mediaTracker.isErrorID(0)) {
  746.                System.out.println("Error: Can't load bgImage");
  747.                this.bgImage = null;
  748.             }
  749.          }
  750.  
  751.          this.animate(var4);
  752.          var4.dispose();
  753.          String var6 = "time for updateAnimation():" + (System.currentTimeMillis() - var1);
  754.       }
  755.    }
  756.  
  757.    public void run() {
  758.       if (Thread.currentThread() == this.thread) {
  759.          this.thread.setPriority(1);
  760.          if (!this.initiated) {
  761.             this.initLoadMessage();
  762.             ((Component)this).repaint();
  763.  
  764.             try {
  765.                Thread.sleep(50L);
  766.             } catch (InterruptedException var4) {
  767.             }
  768.  
  769.             this.initParameters();
  770.          }
  771.       }
  772.  
  773.       while(Thread.currentThread() == this.thread) {
  774.          this.updateAnimation();
  775.          ((Component)this).repaint();
  776.  
  777.          try {
  778.             this.threadStartTime += (long)this.threadDelay;
  779.             int var1 = (int)Math.max((long)(this.threadDelay / 2), this.threadStartTime - System.currentTimeMillis());
  780.             (new StringBuffer()).append("Sleep:").append(var1).toString();
  781.             Thread.sleep((long)var1);
  782.          } catch (InterruptedException var3) {
  783.             return;
  784.          }
  785.  
  786.          if (this.lineData != null && this.updateInterval > 0 && this.animateCount >= this.updateInterval) {
  787.             this.animateCount = 0;
  788.             Vector var5 = new Vector();
  789.             this.initLineParametersFromInputURL(this.lineData, var5, this.urlStrings);
  790.             this.createAnimates(var5, this.font, ((Component)this).getForeground(), ((Component)this).getBackground(), this.field_0, this.field_1, this.delim);
  791.          }
  792.       }
  793.  
  794.    }
  795.  
  796.    public void start() {
  797.       ((Component)this).repaint();
  798.       if (this.thread == null) {
  799.          if (this.threadGroup != null) {
  800.             this.thread = new Thread(this.threadGroup, this);
  801.          } else {
  802.             this.thread = new Thread(this);
  803.          }
  804.  
  805.          this.thread.start();
  806.       }
  807.  
  808.       this.threadStartTime = System.currentTimeMillis();
  809.    }
  810.  
  811.    public void stop() {
  812.       this.thread = null;
  813.    }
  814.  
  815.    public boolean mouseUp(Event var1, int var2, int var3) {
  816.       if ((var1.modifiers & 1) != 0) {
  817.          this.showAboutPopup();
  818.          return true;
  819.       } else {
  820.          String var4 = null;
  821.          if (this.currentObjectIndex < this.urlStrings.size()) {
  822.             var4 = (String)this.urlStrings.elementAt(this.currentObjectIndex);
  823.          }
  824.  
  825.          if (!this.suspended && this.thread != null) {
  826.             if (var4 == null) {
  827.                this.stop();
  828.                this.suspended = true;
  829.             }
  830.          } else {
  831.             this.start();
  832.             this.suspended = false;
  833.          }
  834.  
  835.          if (this.suspended) {
  836.             ((Applet)this).showStatus(this.getAppletInfo() + " - Click to resume.");
  837.          } else if (var4 != null) {
  838.             this.showDocument(var4);
  839.          } else if (this.showAbout) {
  840.             ((Applet)this).showStatus(this.getAppletInfo() + " - Shift-click for info...");
  841.          } else {
  842.             ((Applet)this).showStatus(this.getAppletInfo());
  843.          }
  844.  
  845.          return true;
  846.       }
  847.    }
  848.  
  849.    public boolean mouseEnter(Event var1, int var2, int var3) {
  850.       this.showUrl();
  851.       return true;
  852.    }
  853.  
  854.    void showAboutPopup() {
  855.       if (this.showAbout) {
  856.          FunScrollAbout var1 = new FunScrollAbout(this.getAppletInfo());
  857.          var1.appendText("\t" + this.getAppletInfo() + "\n\n");
  858.          var1.appendText(" Copyright (c) 1996, 1997 by Jan Andersson, Torpa Konsult AB.\n\n");
  859.          var1.appendText(" Info, updates and documentation at http://www.algonet.se/~jannea/FunScroll/FunScroll.html\n\n");
  860.          var1.appendText(" Applet information:\n");
  861.          var1.appendText(" Document base: " + ((Applet)this).getDocumentBase() + "\n");
  862.          var1.appendText(" Code base: " + ((Applet)this).getCodeBase() + "\n\n");
  863.          var1.appendText(" Applet parameters:\n");
  864.          var1.appendText("  width = " + this.getParameter("WIDTH") + "\n");
  865.          var1.appendText("  height = " + this.getParameter("HEIGHT") + "\n\n");
  866.          var1.appendText(" Message lines (line<n> parameters):\n");
  867.  
  868.          for(int var2 = 0; var2 < this.noOfObjects; ++var2) {
  869.             FunScrollAnimate var3 = (FunScrollAnimate)this.animatedObjects.elementAt(var2);
  870.             var1.appendText("  line" + var2 + " = " + var3.getUnparsedTextLine() + "\n");
  871.             var1.appendText("  url" + var2 + " = ");
  872.             String var4 = null;
  873.             if (var2 < this.urlStrings.size()) {
  874.                var4 = (String)this.urlStrings.elementAt(var2);
  875.             }
  876.  
  877.             var1.appendText(var4 + "\n");
  878.          }
  879.  
  880.          var1.appendText("\n Other parameters:\n");
  881.          String[][] var6 = this.getParameterInfo();
  882.  
  883.          for(int var7 = 2; var7 < var6.length; ++var7) {
  884.             String var5 = "  " + var6[var7][0] + " = " + this.getParameter(var6[var7][0]);
  885.             if (var5.length() <= 17) {
  886.                var5 = var5 + "\t";
  887.             }
  888.  
  889.             var1.appendText(var5 + "\t [" + var6[var7][2] + "]\n");
  890.          }
  891.  
  892.          var1.show();
  893.       }
  894.    }
  895.  
  896.    void showUrl() {
  897.       if (this.urlStrings != null && this.currentObjectIndex < this.urlStrings.size()) {
  898.          String var1 = (String)this.urlStrings.elementAt(this.currentObjectIndex);
  899.          if (var1 != null) {
  900.             String var2 = var1.toUpperCase();
  901.             int var3 = var2.indexOf("TARGET=");
  902.             if (var3 > 0) {
  903.                var1 = var1.substring(0, var3);
  904.             }
  905.  
  906.             ((Applet)this).showStatus(var1);
  907.             return;
  908.          }
  909.  
  910.          ((Applet)this).showStatus("");
  911.       }
  912.  
  913.    }
  914.  
  915.    void showDocument(String var1) {
  916.       String var2 = null;
  917.       String var3 = var1.toUpperCase();
  918.       int var4 = var3.indexOf("TARGET=");
  919.       if (var4 > 0) {
  920.          String var9 = var1.substring(var4 + 7);
  921.          var1 = var1.substring(0, var4);
  922.          var2 = var9.trim();
  923.          (new StringBuffer()).append("target:").append(var2).toString();
  924.       }
  925.  
  926.       if (var2 == null) {
  927.          var2 = this.urlTarget;
  928.       }
  929.  
  930.       Object var5 = null;
  931.  
  932.       try {
  933.          var10 = new URL(var1);
  934.       } catch (MalformedURLException var8) {
  935.          var10 = null;
  936.       }
  937.  
  938.       if (var10 == null) {
  939.          try {
  940.             var10 = new URL(((Applet)this).getDocumentBase(), var1);
  941.          } catch (MalformedURLException var7) {
  942.             System.out.println("Error. Can't open URL: " + var1);
  943.             System.out.println("(" + ((Throwable)var7).getMessage() + ")");
  944.             ((Applet)this).showStatus("Error. Can't open URL: " + var1);
  945.             var10 = null;
  946.          }
  947.       }
  948.  
  949.       if (var10 != null) {
  950.          ((Applet)this).showStatus("Loading: " + var1 + "...");
  951.          if (var2 == null) {
  952.             ((Applet)this).getAppletContext().showDocument(var10);
  953.             return;
  954.          }
  955.  
  956.          ((Applet)this).getAppletContext().showDocument(var10, var2);
  957.       }
  958.  
  959.    }
  960.  
  961.    public static void dbg(String var0) {
  962.    }
  963.  
  964.    public Image getOffImage() {
  965.       return this.offImage;
  966.    }
  967.  
  968.    public int getMargin() {
  969.       return this.frameMargin + this.frameWidth;
  970.    }
  971.  
  972.    static Color darker(int var0, int var1, int var2, double var3) {
  973.       return FunScrollColorSupport.darker(var0, var1, var2, var3);
  974.    }
  975.  
  976.    static Color darker(Color var0, double var1) {
  977.       return FunScrollColorSupport.darker(var0, var1);
  978.    }
  979.  
  980.    static Color brighter(int var0, int var1, int var2, double var3) {
  981.       return FunScrollColorSupport.brighter(var0, var1, var2, var3);
  982.    }
  983.  
  984.    static Color brighter(Color var0, double var1) {
  985.       return FunScrollColorSupport.brighter(var0, var1);
  986.    }
  987. }
  988.