home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2001 February / maximum-cd-2001-02.iso / PowerWare / Opera / Opera5_final_java.exe / OPERA.JAR / opera / PluginPanel.class (.txt) < prev    next >
Encoding:
Java Class File  |  2000-08-16  |  7.6 KB  |  394 lines

  1. package opera;
  2.  
  3. import java.applet.Applet;
  4. import java.applet.AppletContext;
  5. import java.applet.AppletStub;
  6. import java.awt.BorderLayout;
  7. import java.awt.Component;
  8. import java.awt.Container;
  9. import java.awt.FontMetrics;
  10. import java.awt.Graphics;
  11. import java.awt.Panel;
  12. import java.net.MalformedURLException;
  13. import java.net.URL;
  14. import java.util.Hashtable;
  15. import java.util.StringTokenizer;
  16.  
  17. public class PluginPanel extends Panel implements AppletStub, Runnable {
  18.    private static final int APPSTATE_UNKNOWN = 0;
  19.    private static final int APPSTATE_LOADING = 1;
  20.    private static final int APPSTATE_NOTFOUND = 2;
  21.    private static final int APPSTATE_STOPPED = 3;
  22.    private static final int APPSTATE_RUNNING = 4;
  23.    private static final int APPSTATE_CRASHED = 5;
  24.    private static final int APPSTATE_DESTROYED = 6;
  25.    private static final int APPSTATE_INTERRUPTED = 7;
  26.    private static final int APPSTATE_CLASSFORMATERROR = 8;
  27.    private int appletState = 0;
  28.    private Applet applet;
  29.    private PluginContext context;
  30.    private URL codeBase;
  31.    private URL docBase;
  32.    private Hashtable params;
  33.    private Hashtable attr;
  34.    private PluginClassLoader loader;
  35.    private Thread loaderThread = null;
  36.    private Thread destroyThread = null;
  37.    private static Hashtable classLoaders = new Hashtable();
  38.  
  39.    public PluginPanel(PluginContext var1, Hashtable var2, Hashtable var3, URL var4) {
  40.       try {
  41.          ((Container)this).setLayout(new BorderLayout());
  42.          this.context = var1;
  43.          this.attr = var2;
  44.          this.params = var3;
  45.          this.docBase = var4;
  46.          String var5 = this.getParameter("codebase");
  47.          if (var5 != null) {
  48.             if (!var5.endsWith("/")) {
  49.                var5 = var5 + "/";
  50.             }
  51.  
  52.             try {
  53.                this.codeBase = new URL(this.docBase, var5);
  54.             } catch (MalformedURLException var11) {
  55.             }
  56.          }
  57.  
  58.          if (this.codeBase == null) {
  59.             String var6 = this.docBase.getFile();
  60.             int var7 = var6.lastIndexOf(47);
  61.             if (var7 >= 0 && var7 < var6.length() - 1) {
  62.                try {
  63.                   this.codeBase = new URL(this.docBase, var6.substring(0, var7 + 1));
  64.                } catch (MalformedURLException var10) {
  65.                }
  66.             }
  67.          }
  68.  
  69.          if (this.codeBase == null) {
  70.             this.codeBase = this.docBase;
  71.          }
  72.  
  73.          this.loader = this.getClassLoader(this.codeBase);
  74.          this.loader.grab();
  75.          if (var1 != null) {
  76.             var1.setClassLoader(this.loader);
  77.          }
  78.  
  79.          String var13 = this.getParameter("archive");
  80.          if (var13 != null) {
  81.             StringTokenizer var14 = new StringTokenizer(var13, ",", false);
  82.  
  83.             while(var14.hasMoreTokens()) {
  84.                String var8 = var14.nextToken().trim();
  85.  
  86.                try {
  87.                   this.loader.addJar(new URL(this.codeBase, var8));
  88.                } catch (IllegalArgumentException var9) {
  89.                }
  90.             }
  91.          }
  92.  
  93.          this.loader.addJar(this.codeBase);
  94.          if (this.docBase != this.codeBase) {
  95.             this.loader.addJar(this.docBase);
  96.          }
  97.       } catch (Exception var12) {
  98.          ((Throwable)var12).printStackTrace(System.err);
  99.       }
  100.  
  101.    }
  102.  
  103.    public void appletResize(int var1, int var2) {
  104.       ((Component)this).setSize(var1, var2);
  105.    }
  106.  
  107.    public void destroyApplet() {
  108.       try {
  109.          if (this.loaderThread != null) {
  110.             try {
  111.                this.loaderThread.interrupt();
  112.                this.loaderThread.join();
  113.             } catch (Exception var2) {
  114.                ((Throwable)var2).printStackTrace(System.err);
  115.             }
  116.  
  117.             this.loaderThread = null;
  118.          }
  119.  
  120.          if (this.loader != null) {
  121.             this.destroyThread = new Thread(this.loader.getThreadGroup(), this);
  122.             if (this.destroyThread != null) {
  123.                this.destroyThread.start();
  124.             }
  125.          }
  126.       } catch (Exception var3) {
  127.          ((Throwable)var3).printStackTrace(System.err);
  128.       } catch (Error var4) {
  129.          ((Throwable)var4).printStackTrace(System.err);
  130.       }
  131.  
  132.    }
  133.  
  134.    public Applet getApplet() {
  135.       return this.applet;
  136.    }
  137.  
  138.    public AppletContext getAppletContext() {
  139.       return this.context;
  140.    }
  141.  
  142.    PluginClassLoader getClassLoader(URL var1) {
  143.       Hashtable var3 = classLoaders;
  144.       synchronized(var3){}
  145.  
  146.       PluginClassLoader var2;
  147.       try {
  148.          PluginClassLoader var5 = (PluginClassLoader)classLoaders.get(var1);
  149.          if (var5 == null) {
  150.             var5 = new PluginClassLoader(var1);
  151.             classLoaders.put(var1, var5);
  152.          }
  153.  
  154.          var2 = var5;
  155.       } catch (Throwable var7) {
  156.          throw var7;
  157.       }
  158.  
  159.       return var2;
  160.    }
  161.  
  162.    public URL getCodeBase() {
  163.       return this.codeBase;
  164.    }
  165.  
  166.    public URL getDocumentBase() {
  167.       return this.docBase;
  168.    }
  169.  
  170.    private int getHeightParam() {
  171.       if (this.attr != null) {
  172.          String var1 = (String)this.attr.get("height");
  173.          if (var1 != null) {
  174.             return new Integer(var1);
  175.          }
  176.       }
  177.  
  178.       return 10;
  179.    }
  180.  
  181.    public String getParameter(String var1) {
  182.       String var2 = (String)this.params.get(var1.toLowerCase());
  183.       if (var2 == null) {
  184.          var2 = (String)this.attr.get(var1.toLowerCase());
  185.       }
  186.  
  187.       return var2;
  188.    }
  189.  
  190.    private int getWidthParam() {
  191.       if (this.attr != null) {
  192.          String var1 = (String)this.attr.get("width");
  193.          if (var1 != null) {
  194.             return new Integer(var1);
  195.          }
  196.       }
  197.  
  198.       return 10;
  199.    }
  200.  
  201.    public boolean isActive() {
  202.       return this.appletState == 4;
  203.    }
  204.  
  205.    public void loadApplet() {
  206.       try {
  207.          ThreadGroup var1 = this.loader.getThreadGroup();
  208.          this.loaderThread = new Thread(var1, this);
  209.          this.loaderThread.start();
  210.       } catch (Exception var2) {
  211.          ((Throwable)var2).printStackTrace(System.err);
  212.       }
  213.  
  214.    }
  215.  
  216.    public void paint(Graphics var1) {
  217.       try {
  218.          if (this.appletState != 0 && this.appletState != 4) {
  219.             FontMetrics var2 = var1.getFontMetrics();
  220.             String var3;
  221.             switch (this.appletState) {
  222.                case 1:
  223.                   var3 = "Loading applet...";
  224.                   break;
  225.                case 2:
  226.                   var3 = "Applet not found.";
  227.                   break;
  228.                case 3:
  229.                   var3 = "Applet loaded.";
  230.                   break;
  231.                case 4:
  232.                default:
  233.                   var3 = "";
  234.                   break;
  235.                case 5:
  236.                   var3 = "Applet crashed.";
  237.                   break;
  238.                case 6:
  239.                   var3 = "Applet destroyed.";
  240.                   break;
  241.                case 7:
  242.                   var3 = "Loading interrupted.";
  243.                   break;
  244.                case 8:
  245.                   var3 = "Invalid bytecode.";
  246.             }
  247.  
  248.             int var4 = var2.stringWidth(var3);
  249.             int var5 = (((Component)this).getWidth() - var4) / 2;
  250.             if (var5 < 0) {
  251.                var5 = 0;
  252.             }
  253.  
  254.             var1.drawString(var3, var5, ((Component)this).getHeight() / 2);
  255.          }
  256.       } catch (Exception var6) {
  257.          ((Throwable)var6).printStackTrace(System.err);
  258.       }
  259.  
  260.    }
  261.  
  262.    void resizeEmbedBox(int var1, int var2) {
  263.       PluginFrame var3 = (PluginFrame)((Component)this).getParent();
  264.       if (var3 != null) {
  265.          ((Component)var3).setSize(var1, var2);
  266.       }
  267.  
  268.       ((Component)this).setSize(var1, var2);
  269.       if (this.applet != null) {
  270.          this.applet.setSize(var1, var2);
  271.       }
  272.  
  273.       ((Container)this).validate();
  274.       this.attr.put("width", String.valueOf(var1));
  275.       this.attr.put("height", String.valueOf(var2));
  276.    }
  277.  
  278.    public void run() {
  279.       if (Thread.currentThread() == this.destroyThread) {
  280.          if (this.applet != null) {
  281.             if (this.appletState == 4) {
  282.                this.stopApplet();
  283.             }
  284.  
  285.             this.applet.destroy();
  286.             this.applet = null;
  287.             this.appletState = 6;
  288.          }
  289.  
  290.          if (this.loader != null) {
  291.             this.loader.release();
  292.             this.loader = null;
  293.          }
  294.  
  295.          this.destroyThread = null;
  296.       } else {
  297.          try {
  298.             String var1 = (String)this.attr.get("code");
  299.             if (var1 != null) {
  300.                int var2 = var1.length();
  301.                String var3 = var1.substring(0, var2 - 6);
  302.                this.appletState = 1;
  303.                ((Component)this).repaint();
  304.                Class var4 = this.loader.loadClass(var3);
  305.                if (var4 != null) {
  306.                   this.applet = (Applet)var4.newInstance();
  307.                   if (this.applet != null) {
  308.                      this.appletState = 3;
  309.                      ((Component)this).repaint();
  310.                      this.applet.setStub(this);
  311.                      this.applet.setVisible(false);
  312.                      ((Container)this).add("Center", this.applet);
  313.                      ((Container)this).validate();
  314.                      ((Component)this).setSize(this.getWidthParam(), this.getHeightParam());
  315.                      this.applet.resize(this.getWidthParam(), this.getHeightParam());
  316.                      this.context.showStatus("Initializing applet.");
  317.  
  318.                      try {
  319.                         this.applet.init();
  320.                         ((Container)this).validate();
  321.                         this.startApplet();
  322.                      } catch (Exception var6) {
  323.                         ((Throwable)var6).printStackTrace(System.err);
  324.                         this.appletState = 5;
  325.                         ((Component)this).repaint();
  326.                      }
  327.                   } else {
  328.                      this.appletState = 2;
  329.                      ((Component)this).repaint();
  330.                   }
  331.                } else {
  332.                   this.appletState = 2;
  333.                   ((Component)this).repaint();
  334.                }
  335.             }
  336.  
  337.             this.loaderThread = null;
  338.          } catch (ClassNotFoundException var7) {
  339.             this.appletState = 2;
  340.             ((Component)this).repaint();
  341.             this.loaderThread = null;
  342.          } catch (Exception var8) {
  343.             this.appletState = 5;
  344.             ((Component)this).repaint();
  345.             ((Throwable)var8).printStackTrace(System.err);
  346.             this.loaderThread = null;
  347.          } catch (ClassFormatError var9) {
  348.             this.appletState = 8;
  349.             ((Component)this).repaint();
  350.             ((Throwable)var9).printStackTrace(System.err);
  351.          } catch (Error var10) {
  352.             this.appletState = 5;
  353.             ((Component)this).repaint();
  354.             ((Throwable)var10).printStackTrace(System.err);
  355.             this.loaderThread = null;
  356.          }
  357.       }
  358.  
  359.    }
  360.  
  361.    public void startApplet() {
  362.       try {
  363.          if (this.applet != null && this.appletState == 3) {
  364.             this.applet.resize(this.getWidthParam(), this.getHeightParam());
  365.             this.applet.start();
  366.             this.appletState = 4;
  367.             this.applet.validate();
  368.             this.applet.setVisible(true);
  369.             this.context.showStatus("Applet started.");
  370.          }
  371.       } catch (Exception var2) {
  372.          ((Throwable)var2).printStackTrace(System.err);
  373.          if (this.appletState != 4) {
  374.             this.appletState = 5;
  375.             ((Component)this).repaint();
  376.          }
  377.       }
  378.  
  379.    }
  380.  
  381.    public void stopApplet() {
  382.       if (this.applet != null && this.appletState == 4) {
  383.          try {
  384.             this.applet.stop();
  385.          } catch (Exception var2) {
  386.             ((Throwable)var2).printStackTrace(System.err);
  387.          }
  388.  
  389.          this.appletState = 3;
  390.       }
  391.  
  392.    }
  393. }
  394.