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

  1. import java.awt.Color;
  2. import java.awt.Component;
  3. import java.awt.Font;
  4. import java.awt.FontMetrics;
  5. import java.awt.Graphics;
  6. import java.util.Vector;
  7.  
  8. public class FunScrollAnimatedText {
  9.    static final int START = 0;
  10.    static final int SHOW = 1;
  11.    static final int END = 2;
  12.    static final int DONE = 3;
  13.    int state;
  14.    FunScroll appl;
  15.    FunScrollTextAttr attr;
  16.    String unparsedText;
  17.    String[] lines;
  18.    protected int[] lineWidths;
  19.    int noOfLines = 1;
  20.    char[] chars;
  21.    int noOfChars;
  22.    int[] xPos;
  23.    int[] yPos;
  24.    boolean[] visible;
  25.    int delayCount;
  26.    int offset;
  27.    int width;
  28.    int height;
  29.    int textHeight;
  30.    int lineHeight;
  31.    // $FF: renamed from: bg java.awt.Color
  32.    Color field_0;
  33.    // $FF: renamed from: fg java.awt.Color
  34.    Color field_1;
  35.    Color darkBg;
  36.    Color lightDarkBg;
  37.    Color brightBg;
  38.    Color brightFg;
  39.    Font font;
  40.    FontMetrics fontMetrics;
  41.    int ascent;
  42.    int descent;
  43.    int leading;
  44.    int maxWidth;
  45.    int sinDegree;
  46.    int xStart;
  47.    int yStart;
  48.    // $FF: renamed from: dx int
  49.    int field_2;
  50.    // $FF: renamed from: dy int
  51.    int field_3;
  52.  
  53.    public FunScrollAnimatedText(FunScroll var1, String var2, Font var3, Color var4, Color var5, int var6, int var7, String var8) {
  54.       this.appl = var1;
  55.       this.font = var3;
  56.       this.field_1 = var4;
  57.       this.field_0 = var5;
  58.       this.field_3 = var7;
  59.       this.field_2 = var6;
  60.       this.unparsedText = var2;
  61.       this.attr = new FunScrollTextAttr(var2, var8);
  62.       (new StringBuffer()).append("         msg:").append(this.attr.msg()).toString();
  63.       (new StringBuffer()).append(" startScroll:").append(this.attr.startScroll()).toString();
  64.       (new StringBuffer()).append("   endScroll:").append(this.attr.endScroll()).toString();
  65.       (new StringBuffer()).append("   showDelay:").append(this.attr.showDelay()).toString();
  66.       (new StringBuffer()).append("    endDelay:").append(this.attr.endDelay()).toString();
  67.       (new StringBuffer()).append("       style:").append(this.attr.style()).toString();
  68.       (new StringBuffer()).append("   drawStyle:").append(this.attr.drawStyle()).toString();
  69.       (new StringBuffer()).append("      color:").append(this.attr.color()).toString();
  70.       (new StringBuffer()).append("dy:").append(var7).append(" dx:").append(var6).toString();
  71.       if (this.attr.color() != null) {
  72.          this.field_1 = var1.readColor(this.attr.color(), var4);
  73.       }
  74.  
  75.       (new StringBuffer()).append("      color:").append(var4).toString();
  76.       this.fontMetrics = ((Component)var1).getFontMetrics(var3);
  77.       this.ascent = this.fontMetrics.getAscent();
  78.       this.descent = this.fontMetrics.getDescent();
  79.       this.leading = this.fontMetrics.getLeading();
  80.       String var9 = this.attr.msg();
  81.       Vector var10 = new Vector();
  82.       this.noOfChars = var9.length();
  83.       this.chars = new char[this.noOfChars];
  84.       var9.getChars(0, this.noOfChars, this.chars, 0);
  85.       this.xPos = new int[this.noOfChars];
  86.       this.yPos = new int[this.noOfChars];
  87.       this.visible = new boolean[this.noOfChars];
  88.       this.textHeight = this.fontMetrics.getHeight();
  89.       if (this.attr.style() == 1 || this.attr.style() == 2) {
  90.          this.textHeight += 4;
  91.       }
  92.  
  93.       this.lineHeight = this.fontMetrics.getHeight();
  94.       int var11 = 0;
  95.       int var12 = this.ascent;
  96.       boolean var13 = false;
  97.       boolean var14 = false;
  98.       int var15 = 0;
  99.  
  100.       int var16;
  101.       for(var16 = 0; var16 < this.noOfChars; ++var16) {
  102.          if (var13) {
  103.             if (this.chars[var16] == 'n') {
  104.                this.chars[var16 - 1] = ' ';
  105.                this.chars[var16] = ' ';
  106.                var14 = true;
  107.             }
  108.  
  109.             var13 = false;
  110.          } else if (this.chars[var16] == '\\') {
  111.             var13 = true;
  112.          } else {
  113.             if (var14) {
  114.                var10.addElement(var9.substring(var15, var16 - 2));
  115.                var15 = var16;
  116.                ++this.noOfLines;
  117.                this.textHeight += this.fontMetrics.getHeight();
  118.                var11 = this.fontMetrics.charsWidth(this.chars, 0, var16);
  119.                var12 += this.lineHeight;
  120.                var14 = false;
  121.             }
  122.  
  123.             if (var16 > 0) {
  124.                this.xPos[var16] = this.fontMetrics.charsWidth(this.chars, 0, var16) - var11;
  125.             } else {
  126.                this.xPos[var16] = var11;
  127.             }
  128.  
  129.             this.maxWidth = Math.max(this.maxWidth, this.xPos[var16]);
  130.             this.yPos[var16] = var12;
  131.          }
  132.       }
  133.  
  134.       if (var16 > var15) {
  135.          var10.addElement(var9.substring(var15, var16));
  136.       }
  137.  
  138.       this.lineWidths = new int[this.noOfLines];
  139.       this.lines = new String[this.noOfLines];
  140.  
  141.       for(int var17 = 0; var17 < this.noOfLines; ++var17) {
  142.          this.lines[var17] = (String)var10.elementAt(var17);
  143.          this.lineWidths[var17] = this.fontMetrics.stringWidth(this.lines[var17]);
  144.       }
  145.  
  146.    }
  147.  
  148.    void resetX() {
  149.       int var1 = 0;
  150.       int var2 = this.noOfChars > 0 ? this.yPos[0] : 0;
  151.  
  152.       for(int var3 = 0; var3 < this.noOfChars; ++var3) {
  153.          if (var2 != this.yPos[var3]) {
  154.             var1 = this.fontMetrics.charsWidth(this.chars, 0, var3);
  155.             var2 = this.yPos[var3];
  156.          }
  157.  
  158.          if (var3 > 0) {
  159.             this.xPos[var3] = this.fontMetrics.charsWidth(this.chars, 0, var3) - var1;
  160.          } else {
  161.             this.xPos[var3] = var1;
  162.          }
  163.       }
  164.  
  165.    }
  166.  
  167.    void reset(int var1, int var2, int var3, Graphics var4) {
  168.       this.offset = var1;
  169.       this.width = var2;
  170.       this.height = var3;
  171.       int var5 = this.attr.startScroll();
  172.       switch (var5) {
  173.          case 0:
  174.             this.xStart = (var2 - this.maxWidth) / 2;
  175.             this.yStart = (var3 - this.textHeight) / 2;
  176.             break;
  177.          case 1:
  178.             this.xStart = var2 - this.field_2 - var1;
  179.             this.yStart = (var3 - this.textHeight) / 2;
  180.             break;
  181.          case 2:
  182.             this.xStart = this.field_2 + var1;
  183.             this.yStart = (var3 - this.textHeight) / 2;
  184.             break;
  185.          case 3:
  186.             this.xStart = (var2 - this.maxWidth) / 2;
  187.             this.yStart = var3 - this.descent - var1;
  188.             break;
  189.          case 4:
  190.             this.xStart = (var2 - this.maxWidth) / 2;
  191.             this.yStart = -this.textHeight + var1;
  192.       }
  193.  
  194.       int var10000 = var2 - 2 * var1;
  195.       var10000 = var3 - 2 * var1;
  196.       this.resetX();
  197.       this.state = 0;
  198.       var4.setFont(this.font);
  199.       var4.setColor(this.field_1);
  200.    }
  201.  
  202.    public String getUnparsedTextLine() {
  203.       return this.unparsedText;
  204.    }
  205.  
  206.    boolean update(Graphics var1) {
  207.       this.move();
  208.       this.paint(var1);
  209.       return this.state == 3 && this.delayCount <= 0;
  210.    }
  211.  
  212.    void move() {
  213.       boolean var1 = false;
  214.       int var2 = 0;
  215.       switch (this.state) {
  216.          case 0:
  217.             var2 = this.attr.startScroll();
  218.             if (var2 == 0) {
  219.                var1 = true;
  220.             } else if (this.textDisplayed(var2)) {
  221.                var1 = true;
  222.             }
  223.  
  224.             if (!var1) {
  225.                this.moveText(var2);
  226.                this.updateVisible(var2);
  227.                return;
  228.             }
  229.  
  230.             this.updateVisible(var2);
  231.             this.state = 1;
  232.             this.delayCount = this.attr.showDelay();
  233.          case 1:
  234.             if (--this.delayCount >= 0) {
  235.                break;
  236.             }
  237.  
  238.             this.state = 2;
  239.          case 2:
  240.             if (this.updateVisible(this.attr.endScroll()) != 0 && this.attr.endScroll() != 0) {
  241.                this.moveText(this.attr.endScroll());
  242.                return;
  243.             }
  244.  
  245.             this.state = 3;
  246.             this.delayCount = this.attr.endDelay();
  247.             return;
  248.          case 3:
  249.             --this.delayCount;
  250.             return;
  251.       }
  252.  
  253.    }
  254.  
  255.    boolean textDisplayed(int var1) {
  256.       switch (var1) {
  257.          case 1:
  258.             if (this.maxWidth > this.width) {
  259.                if (this.maxWidth + this.xStart < this.width - 4 * this.field_2) {
  260.                   return true;
  261.                }
  262.             } else {
  263.                int var4 = this.width / 2;
  264.                int var5 = this.xStart + this.maxWidth / 2;
  265.                if (var5 <= var4) {
  266.                   return true;
  267.                }
  268.             }
  269.             break;
  270.          case 2:
  271.             if (this.maxWidth > this.width) {
  272.                if (this.xPos[0] + this.xStart > 4 * this.field_2) {
  273.                   return true;
  274.                }
  275.             } else {
  276.                int var2 = this.width / 2;
  277.                int var3 = this.xStart + this.maxWidth / 2;
  278.                if (var3 >= var2) {
  279.                   return true;
  280.                }
  281.             }
  282.             break;
  283.          case 3:
  284.             if (this.yStart <= (this.height - this.textHeight) / 2 - this.descent) {
  285.                return true;
  286.             }
  287.             break;
  288.          case 4:
  289.             if (this.yStart >= (this.height - this.textHeight) / 2 - this.descent) {
  290.                return true;
  291.             }
  292.       }
  293.  
  294.       return false;
  295.    }
  296.  
  297.    int updateVisible(int var1) {
  298.       int var2 = 0;
  299.  
  300.       for(int var3 = 0; var3 < this.noOfChars; ++var3) {
  301.          this.visible[var3] = this.xPos[var3] + this.xStart > this.offset && this.xPos[var3] + this.xStart < this.width - this.offset && this.yPos[var3] + this.yStart + this.lineHeight > this.offset && this.yPos[var3] + this.yStart - this.lineHeight < this.height - this.offset;
  302.          if (this.visible[var3]) {
  303.             ++var2;
  304.          }
  305.       }
  306.  
  307.       if (var1 == 5 && var2 <= this.noOfLines * 5) {
  308.          var2 = 0;
  309.       }
  310.  
  311.       return var2;
  312.    }
  313.  
  314.    void moveText(int var1) {
  315.       switch (var1) {
  316.          case 1:
  317.             this.xStart -= this.field_2;
  318.             return;
  319.          case 2:
  320.             this.xStart += this.field_2;
  321.             return;
  322.          case 3:
  323.             this.yStart -= this.field_3;
  324.             return;
  325.          case 4:
  326.             this.yStart += this.field_3;
  327.             return;
  328.          case 5:
  329.             this.moveExplodeText();
  330.             return;
  331.          default:
  332.       }
  333.    }
  334.  
  335.    void moveExplodeText() {
  336.       int var1 = this.noOfChars / 2;
  337.       float var2 = (float)(this.maxWidth / 4);
  338.  
  339.       for(int var3 = 0; var3 < var1; ++var3) {
  340.          float var4 = (float)(var1 - var3) / (float)var1;
  341.          int[] var10000 = this.xPos;
  342.          var10000[var3] -= (int)Math.max((double)(var4 * var2), (double)2.0F);
  343.       }
  344.  
  345.       for(int var6 = var1; var6 < this.noOfChars; ++var6) {
  346.          float var5 = (float)(var6 - var1) / (float)var1;
  347.          int[] var7 = this.xPos;
  348.          var7[var6] += (int)Math.max((double)(var5 * var2), (double)2.0F);
  349.       }
  350.  
  351.    }
  352.  
  353.    void paint(Graphics var1) {
  354.       var1.setColor(this.field_1);
  355.       switch (this.attr.style()) {
  356.          case 1:
  357.             this.paintNervous(var1);
  358.             return;
  359.          case 2:
  360.             this.paintSineWave(var1);
  361.             return;
  362.          default:
  363.             if (this.attr.endScroll() == 5) {
  364.                this.paintExplode(var1);
  365.             } else {
  366.                this.paintNormal(var1);
  367.             }
  368.       }
  369.    }
  370.  
  371.    void paintExplode(Graphics var1) {
  372.       for(int var2 = 0; var2 < this.noOfChars; ++var2) {
  373.          if (this.visible[var2]) {
  374.             this.drawNormalChar(var1, var2);
  375.          }
  376.       }
  377.  
  378.    }
  379.  
  380.    void paintNormal(Graphics var1) {
  381.       switch (this.attr.drawStyle()) {
  382.          case 0:
  383.             for(int var2 = 0; var2 < this.noOfLines; ++var2) {
  384.                this.drawAlignedString(var1, var2, this.xStart, this.yStart + this.ascent + this.lineHeight * var2);
  385.             }
  386.  
  387.             return;
  388.          case 1:
  389.          case 2:
  390.             this.paintEmbossEngrave(var1);
  391.             return;
  392.          case 3:
  393.             this.paintShadow(var1);
  394.             return;
  395.          default:
  396.       }
  397.    }
  398.  
  399.    void paintEmbossEngrave(Graphics var1) {
  400.       if (this.darkBg == null) {
  401.          this.darkBg = FunScrollColorSupport.darker(this.field_0, (double)0.5F);
  402.          this.lightDarkBg = FunScrollColorSupport.darker(this.field_0, (double)0.25F);
  403.          this.brightBg = FunScrollColorSupport.brighter(this.field_0, (double)0.5F);
  404.       }
  405.  
  406.       int var2 = this.attr.drawStyle();
  407.       Color var3 = var2 == 2 ? this.darkBg : this.brightBg;
  408.       Color var4 = var2 == 2 ? this.brightBg : this.darkBg;
  409.       Color var5 = var2 == 2 ? this.lightDarkBg : this.field_0;
  410.  
  411.       for(int var6 = 0; var6 < this.noOfLines; ++var6) {
  412.          this.drawAlignedString(var1, var6, this.xStart, this.yStart + this.ascent + this.lineHeight * var6);
  413.          var1.setColor(var3);
  414.          this.drawAlignedString(var1, var6, this.xStart, this.yStart + this.ascent + this.lineHeight * var6 - 1);
  415.          var1.setColor(var4);
  416.          this.drawAlignedString(var1, var6, this.xStart + 2, this.yStart + this.ascent + this.lineHeight * var6 + 1);
  417.          var1.setColor(var5);
  418.          this.drawAlignedString(var1, var6, this.xStart + 1, this.yStart + this.ascent + this.lineHeight * var6);
  419.       }
  420.  
  421.    }
  422.  
  423.    void paintShadow(Graphics var1) {
  424.       if (this.brightFg == null) {
  425.          this.brightFg = FunScrollColorSupport.brighter(this.field_1, (double)0.75F);
  426.       }
  427.  
  428.       for(int var2 = 0; var2 < this.noOfLines; ++var2) {
  429.          var1.setColor(this.brightFg);
  430.          this.drawAlignedString(var1, var2, this.xStart + 4, this.yStart + this.ascent + this.lineHeight * var2 + 4);
  431.          var1.setColor(this.field_1);
  432.          this.drawAlignedString(var1, var2, this.xStart, this.yStart + this.ascent + this.lineHeight * var2);
  433.       }
  434.  
  435.    }
  436.  
  437.    void drawAlignedString(Graphics var1, int var2, int var3, int var4) {
  438.       switch (this.attr.align()) {
  439.          case 0:
  440.             var3 += (this.maxWidth - this.lineWidths[var2]) / 2;
  441.          case 1:
  442.          default:
  443.             break;
  444.          case 2:
  445.             var3 = this.width - var3 - this.lineWidths[var2];
  446.       }
  447.  
  448.       var1.drawString(this.lines[var2], var3, var4);
  449.    }
  450.  
  451.    void paintSineWave(Graphics var1) {
  452.       int var2 = this.noOfChars > 0 ? this.yPos[0] : 0;
  453.       int var3 = this.sinDegree;
  454.  
  455.       for(int var4 = this.noOfChars - 1; var4 >= 0; --var4) {
  456.          if (var2 != this.yPos[var4]) {
  457.             var2 = this.yPos[var4];
  458.             var3 = this.sinDegree;
  459.          }
  460.  
  461.          if (this.visible[var4]) {
  462.             int var5 = this.lineHeight / 3;
  463.             int var6 = (int)(Math.sin((double)var3 * 3.1414 / (double)180.0F) * (double)var5);
  464.             this.drawChar(var1, var4, this.xPos[var4] + this.xStart, this.yPos[var4] + this.yStart + var6);
  465.          }
  466.  
  467.          var3 -= 15;
  468.          if (var3 <= 0) {
  469.             var3 = 360;
  470.          }
  471.       }
  472.  
  473.       this.sinDegree -= 15;
  474.       if (this.sinDegree <= 0) {
  475.          this.sinDegree = 360;
  476.       }
  477.  
  478.    }
  479.  
  480.    void paintNervous(Graphics var1) {
  481.       for(int var2 = 0; var2 < this.noOfChars; ++var2) {
  482.          if (this.visible[var2]) {
  483.             this.drawNervousChar(var1, var2);
  484.          }
  485.       }
  486.  
  487.    }
  488.  
  489.    void drawNervousChar(Graphics var1, int var2) {
  490.       int var3 = (int)(Math.random() * (double)2.0F) + this.xPos[var2];
  491.       int var4 = (int)(Math.random() * (double)4.0F) + this.yPos[var2];
  492.       this.drawChar(var1, var2, var3 + this.xStart, var4 + this.yStart);
  493.    }
  494.  
  495.    void drawNormalChar(Graphics var1, int var2) {
  496.       this.drawChar(var1, var2, this.xPos[var2] + this.xStart, this.yPos[var2] + this.yStart);
  497.    }
  498.  
  499.    void drawChar(Graphics var1, int var2, int var3, int var4) {
  500.       int var5 = this.attr.drawStyle();
  501.       if (var5 != 0 && var5 != 3) {
  502.          if (this.darkBg == null) {
  503.             this.darkBg = FunScrollColorSupport.darker(this.field_0, (double)0.5F);
  504.             this.lightDarkBg = FunScrollColorSupport.darker(this.field_0, (double)0.25F);
  505.             this.brightBg = FunScrollColorSupport.brighter(this.field_0, (double)0.5F);
  506.          }
  507.  
  508.          Color var6 = var5 == 2 ? this.darkBg : this.brightBg;
  509.          Color var7 = var5 == 2 ? this.brightBg : this.darkBg;
  510.          Color var8 = var5 == 2 ? this.lightDarkBg : this.field_0;
  511.          var1.setColor(var6);
  512.          var1.drawChars(this.chars, var2, 1, var3, var4 - 1);
  513.          var1.setColor(var7);
  514.          var1.drawChars(this.chars, var2, 1, var3 + 2, var4 + 1);
  515.          var1.setColor(var8);
  516.          var1.drawChars(this.chars, var2, 1, var3 + 1, var4);
  517.       } else {
  518.          if (var5 == 3) {
  519.             if (this.brightFg == null) {
  520.                this.brightFg = FunScrollColorSupport.brighter(this.field_1, (double)0.75F);
  521.             }
  522.  
  523.             var1.setColor(this.brightFg);
  524.             var1.drawChars(this.chars, var2, 1, var3 + 4, var4 + 4);
  525.             var1.setColor(this.field_1);
  526.          }
  527.  
  528.          var1.drawChars(this.chars, var2, 1, var3, var4);
  529.       }
  530.    }
  531. }
  532.