home *** CD-ROM | disk | FTP | other *** search
/ PC Plus SuperCD (UK) 1999 October / pcp156b.iso / handson / files / java / Panorama.class (.txt) < prev    next >
Encoding:
Java Class File  |  1998-08-20  |  13.4 KB  |  709 lines

  1. import java.applet.Applet;
  2. import java.awt.Color;
  3. import java.awt.Component;
  4. import java.awt.Cursor;
  5. import java.awt.Dimension;
  6. import java.awt.Event;
  7. import java.awt.Font;
  8. import java.awt.FontMetrics;
  9. import java.awt.Graphics;
  10. import java.awt.Image;
  11. import java.awt.MediaTracker;
  12. import java.awt.Point;
  13. import java.awt.Polygon;
  14. import java.io.BufferedInputStream;
  15. import java.io.DataInputStream;
  16. import java.io.IOException;
  17. import java.io.InputStream;
  18. import java.net.MalformedURLException;
  19. import java.net.URL;
  20.  
  21. public class Panorama extends Applet implements Runnable {
  22.    private Graphics screenG;
  23.    private Image screenImage;
  24.    private Image theImage;
  25.    // $FF: renamed from: dx int[][]
  26.    private int[][] field_0;
  27.    // $FF: renamed from: dy int[][]
  28.    private int[][] field_1;
  29.    // $FF: renamed from: dw int[]
  30.    private int[] field_2;
  31.    // $FF: renamed from: cx int
  32.    private int field_3;
  33.    // $FF: renamed from: cy int
  34.    private int field_4;
  35.    // $FF: renamed from: w1 int
  36.    private int field_5;
  37.    // $FF: renamed from: h1 int
  38.    private int field_6;
  39.    // $FF: renamed from: w2 int
  40.    private int field_7;
  41.    // $FF: renamed from: h2 int
  42.    private int field_8;
  43.    // $FF: renamed from: mx int
  44.    private int field_9;
  45.    // $FF: renamed from: my int
  46.    private int field_10;
  47.    private int mxOrig;
  48.    private int myOrig;
  49.    private int moveX;
  50.    private int moveY;
  51.    private int renderRate;
  52.    private int degrees;
  53.    // $FF: renamed from: sw int
  54.    private int field_11;
  55.    // $FF: renamed from: sh int
  56.    private int field_12;
  57.    private int needDetail;
  58.    private int timeSample;
  59.    private int rotateAmount;
  60.    private boolean interlace;
  61.    private boolean jdk10;
  62.    private boolean mouseMoving;
  63.    private boolean autoRotate;
  64.    private boolean autoRotateOn;
  65.    private boolean imageLoading;
  66.    private int hyperLink;
  67.    private Color tipColour;
  68.    private FontMetrics screenFM;
  69.    private DataInputStream mapIn;
  70.    private static final int HYPER_COUNT = 10;
  71.    private Polygon[] hyperArea;
  72.    private String[] tip;
  73.    private String[] href;
  74.    private int polyCount;
  75.    private int[] pointx;
  76.    private int[] pointy;
  77.    private int coordNo;
  78.    private Thread thrMain;
  79.    private transient long totTime;
  80.    private transient int totPass;
  81.    private transient Graphics gMain;
  82.    private int rotateSpeed;
  83.    boolean alreadyPainting;
  84.    // $FF: synthetic field
  85.    static Class class$java$awt$Image;
  86.    // $FF: synthetic field
  87.    static Class class$java$awt$image$ImageObserver;
  88.    // $FF: synthetic field
  89.    static Class class$java$awt$Graphics;
  90.  
  91.    public Panorama() {
  92.       this.imageLoading = false;
  93.       this.hyperLink = -1;
  94.       this.tipColour = new Color(255, 255, 225);
  95.       this.hyperArea = new Polygon[10];
  96.       this.tip = new String[10];
  97.       this.href = new String[10];
  98.       this.pointx = new int[255];
  99.       this.pointy = new int[255];
  100.       this.rotateSpeed = 3;
  101.       this.alreadyPainting = false;
  102.       this.field_0 = new int[600][600];
  103.       this.field_1 = new int[600][600];
  104.       this.field_2 = new int[600];
  105.       if (!System.getProperty("java.version").substring(0, 3).equals("1.0")) {
  106.          try {
  107.             Class[] var1 = new Class[]{class$java$awt$Image != null ? class$java$awt$Image : (class$java$awt$Image = class$("java.awt.Image")), Integer.TYPE, Integer.TYPE, Integer.TYPE, Integer.TYPE, Integer.TYPE, Integer.TYPE, Integer.TYPE, Integer.TYPE, class$java$awt$image$ImageObserver != null ? class$java$awt$image$ImageObserver : (class$java$awt$image$ImageObserver = class$("java.awt.image.ImageObserver"))};
  108.             this.jdk10 = false;
  109.             (class$java$awt$Graphics != null ? class$java$awt$Graphics : (class$java$awt$Graphics = class$("java.awt.Graphics"))).getMethod("drawImage", var1);
  110.          } catch (Exception var2) {
  111.             this.jdk10 = true;
  112.          }
  113.       } else {
  114.          this.jdk10 = true;
  115.       }
  116.    }
  117.  
  118.    public Panorama(Image var1) {
  119.       this(360, var1);
  120.    }
  121.  
  122.    public Panorama(int var1, Image var2) {
  123.       this(360, var2, 300, 200);
  124.    }
  125.  
  126.    public Panorama(int var1, Image var2, int var3, int var4) {
  127.       this();
  128.       this.degrees = var1;
  129.       this.theImage = var2;
  130.       this.field_11 = var3;
  131.       this.field_12 = var4;
  132.       ((Applet)this).resize(this.field_11, this.field_12);
  133.    }
  134.  
  135.    public void start() {
  136.       if (this.thrMain == null) {
  137.          this.thrMain = new Thread(this);
  138.          this.thrMain.start();
  139.       }
  140.  
  141.    }
  142.  
  143.    public void stop() {
  144.       if (this.thrMain != null) {
  145.          this.thrMain.stop();
  146.          this.thrMain = null;
  147.       }
  148.  
  149.    }
  150.  
  151.    public void run() {
  152.       this.gMain = ((Component)this).getGraphics();
  153.  
  154.       while(true) {
  155.          if (this.autoRotateOn && !this.mouseMoving) {
  156.             this.needDetail = this.renderRate;
  157.             this.moveX = this.rotateSpeed;
  158.          }
  159.  
  160.          if (!this.alreadyPainting) {
  161.             ((Component)this).repaint();
  162.          }
  163.  
  164.          try {
  165.             Thread.sleep(50L);
  166.          } catch (InterruptedException var1) {
  167.             this.stop();
  168.          }
  169.       }
  170.    }
  171.  
  172.    public Dimension preferredSize() {
  173.       return new Dimension(300, 200);
  174.    }
  175.  
  176.    public void setAutoRotate(int var1) {
  177.       this.autoRotate = var1 != 0;
  178.       this.autoRotateOn = this.autoRotate;
  179.       this.rotateSpeed = var1;
  180.    }
  181.  
  182.    public void init() {
  183.       String var1 = ((Applet)this).getParameter("autorotate");
  184.       if (var1 != null) {
  185.          this.setAutoRotate(Integer.parseInt(var1));
  186.       } else {
  187.          this.setAutoRotate(0);
  188.       }
  189.  
  190.       var1 = ((Applet)this).getParameter("degrees");
  191.       if (var1 != null) {
  192.          this.degrees = Integer.parseInt(var1);
  193.       } else {
  194.          this.degrees = 360;
  195.       }
  196.  
  197.       this.theImage = ((Applet)this).getImage(((Applet)this).getDocumentBase(), ((Applet)this).getParameter("image"));
  198.       this.field_11 = ((Component)this).size().width;
  199.       this.field_12 = ((Component)this).size().height;
  200.       this.mouseMoving = false;
  201.       String var2 = ((Applet)this).getParameter("map");
  202.       if (var2 != null) {
  203.          this.openImageMap(var2);
  204.       }
  205.  
  206.    }
  207.  
  208.    private synchronized void createScreenImage() {
  209.       if (this.screenImage == null) {
  210.          MediaTracker var1 = new MediaTracker(this);
  211.          var1.addImage(this.theImage, 0);
  212.  
  213.          try {
  214.             var1.waitForID(0);
  215.          } catch (Exception var2) {
  216.          }
  217.  
  218.          this.field_5 = this.field_11;
  219.          this.field_7 = this.theImage.getWidth(this);
  220.          this.field_6 = this.field_12;
  221.          this.field_8 = this.theImage.getHeight(this);
  222.          this.screenImage = ((Component)this).createImage(this.field_7 + this.field_11 + this.field_7 / 4, this.field_8);
  223.          this.screenG = this.screenImage.getGraphics();
  224.          this.screenG.drawImage(this.theImage, this.field_11, 0, this);
  225.          this.screenG.drawImage(this.theImage, this.field_11 + this.field_7, 0, this);
  226.          this.screenG.setFont(new Font("Helvetica", 0, 11));
  227.          this.screenFM = this.screenG.getFontMetrics();
  228.          this.initialise();
  229.       }
  230.    }
  231.  
  232.    private void initialise() {
  233.       int var1 = (int)((double)this.field_7 / ((double)(this.degrees / 180) * 3.1415926));
  234.       this.resetView();
  235.       if (this.field_5 > this.field_0.length) {
  236.          this.field_5 = this.field_0.length;
  237.       }
  238.  
  239.       if (this.field_8 > this.field_1.length) {
  240.          this.field_8 = this.field_1.length;
  241.       }
  242.  
  243.       for(int var3 = 0; var3 < this.field_5; ++var3) {
  244.          for(int var4 = 0; var4 < this.field_8; ++var4) {
  245.             double var5 = (double)(var3 - this.field_5 / 2);
  246.             double var7 = (double)(this.field_8 / 2 - var4);
  247.             double var9 = (double)var1 * Math.atan(var5 / (double)var1);
  248.             double var11 = var5 * var5;
  249.             var11 += (double)(var1 * var1);
  250.             var11 = Math.sqrt(var11);
  251.             double var13 = var7 * (double)var1 / var11;
  252.             this.field_0[var3][var4] = (int)var9;
  253.             this.field_1[var3][var4] = (int)var13;
  254.          }
  255.       }
  256.  
  257.       int var2 = 0;
  258.       int var15 = this.field_5;
  259.  
  260.       while(true) {
  261.          --var15;
  262.          if (var15 < 0) {
  263.             this.renderRate = 1;
  264.             this.interlace = true;
  265.             this.needDetail = this.renderRate;
  266.             return;
  267.          }
  268.  
  269.          if (this.field_1[var15][0] == var2) {
  270.             this.field_2[var15] = this.field_2[var15 + 1] + 1;
  271.          } else {
  272.             var2 = this.field_1[var15][0];
  273.             this.field_2[var15] = 1;
  274.          }
  275.       }
  276.    }
  277.  
  278.    public void update(Graphics var1) {
  279.       this.paint(var1);
  280.    }
  281.  
  282.    public void paint(Graphics var1) {
  283.       if (!this.alreadyPainting) {
  284.          this.alreadyPainting = true;
  285.          if (this.screenImage == null) {
  286.             var1.setFont(new Font("Helvetica", 20, 0));
  287.             String var2 = "Panorama Loading...";
  288.             FontMetrics var3 = var1.getFontMetrics();
  289.             int var4 = var3.stringWidth(var2);
  290.             int var5 = var3.getHeight();
  291.             var1.setColor(Color.lightGray);
  292.             var1.fillRect(0, 0, this.field_11, this.field_12);
  293.             var1.setColor(Color.white);
  294.             var1.drawString(var2, (this.field_11 - var4) / 2, (this.field_12 + var5) / 2);
  295.             var1.setColor(Color.black);
  296.             var1.drawString(var2, (this.field_11 - var4) / 2 + 2, (this.field_12 + var5) / 2 + 2);
  297.             var1.setColor(Color.lightGray);
  298.             var1.drawString(var2, (this.field_11 - var4) / 2 + 1, (this.field_12 + var5) / 2 + 1);
  299.             if (!this.imageLoading) {
  300.                this.imageLoading = true;
  301.                this.createScreenImage();
  302.                ((Component)this).repaint();
  303.             }
  304.          } else {
  305.             if (this.jdk10) {
  306.                this.oldPaint(var1);
  307.             } else {
  308.                this.renderImage(var1, 1, 0, this.interlace);
  309.             }
  310.  
  311.             if (this.hyperLink != -1) {
  312.                this.drawTip(this.tip[this.hyperLink]);
  313.             }
  314.  
  315.             var1.drawImage(this.screenImage, 0, 0, this);
  316.          }
  317.  
  318.          if (this.moveX != 0 && this.field_5 > 0) {
  319.             this.moveHoriz(this.moveX * this.field_7 / (this.field_5 << 4));
  320.          }
  321.  
  322.          if (this.moveY != 0 && this.field_5 > 0) {
  323.             this.moveVert(this.moveY * this.field_7 / (this.field_5 << 4));
  324.          }
  325.  
  326.          if (this.moveX != 0 || this.moveY != 0) {
  327.             this.needDetail = this.renderRate;
  328.          }
  329.  
  330.          this.alreadyPainting = false;
  331.       }
  332.    }
  333.  
  334.    public void oldPaint(Graphics var1) {
  335.       long var2 = 0L;
  336.       long var4 = 0L;
  337.       long var6 = 10000L;
  338.       var2 = System.currentTimeMillis();
  339.       this.oldRenderImage(var1, this.renderRate, this.needDetail, this.interlace);
  340.       var4 = System.currentTimeMillis();
  341.       if (var6 > var4 - var2) {
  342.          var6 = var4 - var2;
  343.       }
  344.  
  345.       if (this.renderRate < 8 && var6 > 100L && var4 != var2) {
  346.          ++this.renderRate;
  347.       }
  348.  
  349.       this.rotateAmount = this.rotateSpeed * (int)var6 / 50;
  350.    }
  351.  
  352.    private void oldRenderImage(Graphics var1, int var2, int var3, boolean var4) {
  353.       int var6 = 1;
  354.       int var5 = var3 * this.field_8 / (this.field_8 - this.field_6);
  355.  
  356.       for(int var7 = 0; var7 < this.field_5; var7 += var6) {
  357.          if (this.field_2[var7] > var3) {
  358.             var6 = this.field_2[var7];
  359.          } else {
  360.             var6 = var3;
  361.          }
  362.  
  363.          for(int var8 = 0; var8 < this.field_6; var8 += var5) {
  364.             int var9 = this.field_3 + this.field_0[var7][this.field_4 + var8];
  365.             int var10 = this.field_8 / 2 - this.field_1[var7][this.field_4 + var8];
  366.             if (var9 >= this.field_7) {
  367.                var9 -= this.field_7;
  368.             } else if (var9 < 0) {
  369.                var9 += this.field_7;
  370.             }
  371.  
  372.             if (var7 + var6 < this.field_11) {
  373.                this.screenG.copyArea(var9 + this.field_11, var10, var6, var5, var7 - var9 - this.field_11, var8 - var10);
  374.             } else {
  375.                this.screenG.copyArea(var9 + this.field_11, var10, this.field_11 - var7, var5, var7 - var9 - this.field_11, var8 - var10);
  376.             }
  377.          }
  378.       }
  379.  
  380.    }
  381.  
  382.    public void renderImage(Graphics var1, int var2, int var3, boolean var4) {
  383.       boolean var6 = true;
  384.       boolean var7 = true;
  385.  
  386.       for(int var5 = var3; var5 < this.field_5; var5 += this.field_2[var5]) {
  387.          int var8 = this.field_3 + this.field_0[var5][this.field_4 + this.field_6];
  388.          int var9 = this.field_8 / 2 - this.field_1[var5][this.field_4 + this.field_6];
  389.          if (var8 >= this.field_7) {
  390.             var8 -= this.field_7;
  391.          } else if (var8 < 0) {
  392.             var8 += this.field_7;
  393.          }
  394.  
  395.          this.screenG.drawImage(this.screenImage, var5, 0, var5 + this.field_2[var5], this.field_12, var8 + this.field_11, this.field_8 / 2 - this.field_1[var5][this.field_4], var8 + this.field_2[var5] + this.field_11, var9, this);
  396.       }
  397.  
  398.    }
  399.  
  400.    public boolean mouseDown(Event var1, int var2, int var3) {
  401.       this.mouseMoving = true;
  402.       this.mxOrig = this.field_9 = var2;
  403.       this.myOrig = this.field_10 = var3;
  404.       this.moveX = this.moveY = 0;
  405.       this.checkCursor(var2, var3);
  406.       return true;
  407.    }
  408.  
  409.    public boolean mouseUp(Event var1, int var2, int var3) {
  410.       if (this.mxOrig == var2 && this.myOrig == var3 && this.autoRotate) {
  411.          this.autoRotateOn = !this.autoRotateOn;
  412.       }
  413.  
  414.       this.mouseMoving = false;
  415.       this.needDetail = 1;
  416.       this.moveX = this.moveY = 0;
  417.       this.checkCursor(var2, var3);
  418.       if (this.mxOrig == var2 && this.myOrig == var3 && this.hyperLink != -1) {
  419.          this.openDoc(this.href[this.hyperLink]);
  420.       }
  421.  
  422.       return false;
  423.    }
  424.  
  425.    private void openDoc(String var1) {
  426.       try {
  427.          URL var2 = new URL(((Applet)this).getDocumentBase(), var1);
  428.          ((Applet)this).getAppletContext().showDocument(var2, "_self");
  429.       } catch (MalformedURLException var3) {
  430.          ((Applet)this).getAppletContext().showStatus("Bad URL: " + var1);
  431.       }
  432.    }
  433.  
  434.    public boolean mouseDrag(Event var1, int var2, int var3) {
  435.       if (var2 != this.field_9) {
  436.          this.moveX += var2 - this.field_9;
  437.       }
  438.  
  439.       if (var3 != this.field_10) {
  440.          this.moveY += var3 - this.field_10;
  441.       }
  442.  
  443.       this.field_9 = var2;
  444.       this.field_10 = var3;
  445.       return true;
  446.    }
  447.  
  448.    public boolean mouseMove(Event var1, int var2, int var3) {
  449.       this.checkCursor(var2, var3);
  450.       return true;
  451.    }
  452.  
  453.    public void resetView() {
  454.       this.field_3 = this.field_7 / 2;
  455.       this.field_4 = this.field_8 / 2 - this.field_6 / 2;
  456.    }
  457.  
  458.    private void moveVert(int var1) {
  459.       if (this.field_4 + var1 >= 0 && this.field_4 + var1 < this.field_8 - this.field_6) {
  460.          this.field_4 += var1;
  461.       }
  462.  
  463.    }
  464.  
  465.    private void moveHoriz(int var1) {
  466.       this.field_3 += var1;
  467.       if (this.field_3 < 0) {
  468.          this.field_3 += this.field_7;
  469.       } else {
  470.          if (this.field_3 >= this.field_7) {
  471.             this.field_3 -= this.field_7;
  472.          }
  473.  
  474.       }
  475.    }
  476.  
  477.    public int getHorizontalPos() {
  478.       return this.field_3;
  479.    }
  480.  
  481.    private void openImageMap(String var1) {
  482.       String var2 = "";
  483.       String var3 = "";
  484.       String var4 = "";
  485.       boolean var5 = false;
  486.  
  487.       try {
  488.          InputStream var8 = ((Applet)this).getDocumentBase().openStream();
  489.          this.mapIn = new DataInputStream(new BufferedInputStream(var8));
  490.  
  491.          for(String var10 = this.mapIn.readLine(); var10 != null; var10 = this.mapIn.readLine()) {
  492.             if (var10.toUpperCase().indexOf("<MAP") != -1) {
  493.                if (var10.toUpperCase().indexOf("NAME=\"" + var1.toUpperCase() + "\"") != -1) {
  494.                   var3 = var10;
  495.                   var5 = true;
  496.                }
  497.             } else if (var5) {
  498.                var3 = var3 + var10;
  499.             }
  500.  
  501.             if (var10.indexOf("</MAP") != -1) {
  502.                var5 = false;
  503.             }
  504.          }
  505.       } catch (IOException var9) {
  506.          System.out.println("IO Error: " + ((Throwable)var9).getMessage());
  507.       }
  508.  
  509.       if (var3.length() > 0) {
  510.          for(int var6 = var3.toUpperCase().indexOf("<AREA") + "<AREA".length(); var6 >= "<AREA".length(); var6 = var3.toUpperCase().indexOf("<AREA") + "<AREA".length()) {
  511.             int var7 = var3.indexOf(">", var6);
  512.             var4 = var3.substring(var6, var7);
  513.             if (var7 > var6) {
  514.                this.createArea(var4, this.polyCount++);
  515.             }
  516.  
  517.             var3 = var3.substring(var6);
  518.          }
  519.       }
  520.  
  521.    }
  522.  
  523.    private void createArea(String var1, int var2) {
  524.       Polygon var3 = null;
  525.       String var4 = "";
  526.       String var5 = "";
  527.       String var6 = "";
  528.       String var7 = "";
  529.       if (var1.length() > 0) {
  530.          var4 = this.getAttr(var1, "COORDS");
  531.          var5 = this.getAttr(var1, "SHAPE").toUpperCase();
  532.          var6 = this.getAttr(var1, "ALT");
  533.          var7 = this.getAttr(var1, "HREF");
  534.          if (var5.equals("RECT")) {
  535.             var3 = this.aRect(var4);
  536.          } else if (var5.equals("POLYGON")) {
  537.             var3 = this.aPolygon(var4);
  538.          } else if (var5.equals("CIRCLE")) {
  539.             var3 = this.aCircle(var4);
  540.          }
  541.       }
  542.  
  543.       this.hyperArea[var2] = var3;
  544.       this.tip[var2] = var6;
  545.       this.href[var2] = var7;
  546.    }
  547.  
  548.    private String getAttr(String var1, String var2) {
  549.       int var4 = var1.toUpperCase().indexOf(var2.toUpperCase() + "=\"") + (var2 + "=\"").length();
  550.       String var3 = "";
  551.       if (var4 >= (var2 + "=\"").length()) {
  552.          int var5 = var1.indexOf("\"", var4);
  553.          var3 = var1.substring(var4, var5);
  554.       }
  555.  
  556.       return var3;
  557.    }
  558.  
  559.    private Polygon aRect(String var1) {
  560.       int[] var2 = new int[4];
  561.       int[] var3 = new int[4];
  562.       this.getPoints(var1);
  563.       var2[0] = this.pointx[0];
  564.       var2[1] = this.pointx[1];
  565.       var2[2] = var2[1];
  566.       var2[3] = var2[0];
  567.       var3[0] = this.pointy[0];
  568.       var3[1] = this.pointy[0];
  569.       var3[2] = this.pointy[1];
  570.       var3[3] = var3[2];
  571.       return new Polygon(var2, var3, 4);
  572.    }
  573.  
  574.    private Polygon aCircle(String var1) {
  575.       String var2 = var1 + ",0";
  576.       int[] var6 = new int[8];
  577.       int[] var7 = new int[8];
  578.       this.getPoints(var2);
  579.       int var3 = this.pointx[0];
  580.       int var4 = this.pointy[0];
  581.       int var5 = this.pointx[1];
  582.  
  583.       for(int var8 = 0; var8 < var6.length; ++var8) {
  584.          var6[var8] = var3 + (int)((double)var5 * Math.cos(6.2831852 * (double)var8 / (double)var6.length));
  585.          var7[var8] = var4 + (int)((double)var5 * Math.sin(6.2831852 * (double)var8 / (double)var6.length));
  586.       }
  587.  
  588.       return new Polygon(var6, var7, var6.length);
  589.    }
  590.  
  591.    private Polygon aPolygon(String var1) {
  592.       this.getPoints(var1);
  593.       return new Polygon(this.pointx, this.pointy, this.coordNo);
  594.    }
  595.  
  596.    private void getPoints(String var1) {
  597.       String var2 = var1 + ",";
  598.       int var3 = var2.indexOf(44);
  599.  
  600.       for(this.coordNo = 0; var3 != -1; var3 = var2.indexOf(44)) {
  601.          this.pointx[this.coordNo] = Integer.parseInt(var2.substring(0, var3));
  602.          var2 = var2.substring(var3 + 1).trim();
  603.          var3 = var2.indexOf(44);
  604.          this.pointy[this.coordNo++] = Integer.parseInt(var2.substring(0, var3));
  605.          var2 = var2.substring(var3 + 1).trim();
  606.       }
  607.  
  608.    }
  609.  
  610.    private void checkCursor(int var1, int var2) {
  611.       if (this.mouseMoving) {
  612.          if (!this.jdk10) {
  613.             ((Component)this).setCursor(Cursor.getPredefinedCursor(13));
  614.          }
  615.  
  616.          this.hyperLink = -1;
  617.       } else {
  618.          int var3 = this.field_3 + this.field_0[var1][this.field_4 + var2];
  619.          int var4 = this.field_8 / 2 - this.field_1[var1][this.field_4 + var2];
  620.          if (var3 >= this.field_7) {
  621.             var3 -= this.field_7;
  622.          } else if (var3 < 0) {
  623.             var3 += this.field_7;
  624.          }
  625.  
  626.          Point var5 = new Point(var3, var4);
  627.  
  628.          for(int var6 = 0; var6 < this.polyCount; ++var6) {
  629.             if (this.hyperArea[var6].inside(var5.x, var5.y)) {
  630.                if (!this.jdk10) {
  631.                   ((Component)this).setCursor(Cursor.getPredefinedCursor(12));
  632.                }
  633.  
  634.                this.hyperLink = var6;
  635.                ((Component)this).repaint();
  636.                return;
  637.             }
  638.          }
  639.  
  640.          if (!this.jdk10) {
  641.             ((Component)this).setCursor(Cursor.getDefaultCursor());
  642.          }
  643.  
  644.          if (this.hyperLink != -1) {
  645.             ((Component)this).repaint();
  646.          }
  647.  
  648.          this.hyperLink = -1;
  649.       }
  650.    }
  651.  
  652.    private void drawTip(String var1) {
  653.       byte var13 = 1;
  654.       int var14 = 2 * this.field_11 / 3;
  655.       int var6 = this.screenFM.getAscent();
  656.       int var7 = this.screenFM.getHeight() - this.screenFM.getAscent();
  657.       int var5 = var6 + var7 + (var13 << 1);
  658.       int var11 = 0;
  659.       byte var9 = 0;
  660.       int var12 = var7;
  661.       int var10 = this.field_12 + 1;
  662.       byte var2 = 20;
  663.       int var3 = 20;
  664.       String var17 = var1;
  665.  
  666.       String var20;
  667.       for(var20 = ""; !var17.equals(""); var17 = var20) {
  668.          int var8 = this.screenFM.stringWidth(var17);
  669.          int var19 = var17.length();
  670.          var20 = "";
  671.          if (var8 > var14) {
  672.             int var15 = var17.length() * var14 / var8;
  673.             String var16 = var17.substring(0, var15);
  674.             var19 = var16.lastIndexOf(32);
  675.             var20 = var17.substring(var19 + 1, var17.length());
  676.             var17 = var17.substring(0, var19 + 1);
  677.          }
  678.  
  679.          int var4 = this.screenFM.stringWidth(var17) + (var7 << 1) + (var13 << 1);
  680.          if (var4 > var11) {
  681.             var11 = var4;
  682.          }
  683.  
  684.          var12 = var12 + var7 + var6;
  685.          var9 = var2;
  686.          if (var3 < var10) {
  687.             var10 = var3;
  688.          }
  689.  
  690.          this.screenG.setColor(this.tipColour);
  691.          this.screenG.fillRect(var2, var3, var11, var5);
  692.          this.screenG.setColor(Color.black);
  693.          this.screenG.drawString(var17, var2 + var7 + var13, var3 + var6 + var13);
  694.          var3 = var3 + var7 + var6;
  695.       }
  696.  
  697.       this.screenG.drawRect(var9, var10, var11, var12);
  698.    }
  699.  
  700.    // $FF: synthetic method
  701.    static Class class$(String var0) {
  702.       try {
  703.          return Class.forName(var0);
  704.       } catch (ClassNotFoundException var2) {
  705.          throw new NoClassDefFoundError(((Throwable)var2).getMessage());
  706.       }
  707.    }
  708. }
  709.