aboutsummaryrefslogtreecommitdiffstats
path: root/netx/net/sourceforge/jnlp/NetxPanel.java
diff options
context:
space:
mode:
Diffstat (limited to 'netx/net/sourceforge/jnlp/NetxPanel.java')
-rw-r--r--netx/net/sourceforge/jnlp/NetxPanel.java168
1 files changed, 168 insertions, 0 deletions
diff --git a/netx/net/sourceforge/jnlp/NetxPanel.java b/netx/net/sourceforge/jnlp/NetxPanel.java
new file mode 100644
index 0000000..7c6cf3c
--- /dev/null
+++ b/netx/net/sourceforge/jnlp/NetxPanel.java
@@ -0,0 +1,168 @@
+/*
+ * Copyright 2007 Red Hat, Inc.
+ * This file is part of IcedTea, http://icedtea.classpath.org
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+package net.sourceforge.jnlp;
+
+import net.sourceforge.jnlp.runtime.AppThreadGroup;
+import net.sourceforge.jnlp.runtime.AppletInstance;
+import net.sourceforge.jnlp.runtime.JNLPRuntime;
+
+import java.net.URL;
+import java.util.Hashtable;
+
+import sun.applet.AppletViewerPanel;
+import sun.awt.SunToolkit;
+
+/**
+ * This panel calls into netx to run an applet, and pipes the display
+ * into a panel from gcjwebplugin.
+ *
+ * @author Francis Kung <[email protected]>
+ */
+public class NetxPanel extends AppletViewerPanel
+{
+ private PluginBridge bridge = null;
+ private boolean exitOnFailure = true;
+ private AppletInstance appInst = null;
+ private boolean appletAlive;
+
+ public NetxPanel(URL documentURL, Hashtable atts)
+ {
+ super(documentURL, atts);
+ }
+
+ // overloaded constructor, called when initialized via plugin
+ public NetxPanel(URL documentURL, Hashtable atts, boolean exitOnFailure)
+ {
+ this(documentURL, atts);
+ this.exitOnFailure = exitOnFailure;
+ this.appletAlive = true;
+ }
+
+ @Override
+ public void run() {
+ /*
+ * create an AppContext for this thread associated with this particular
+ * plugin instance (which runs in a different thread group from the rest
+ * of the plugin).
+ */
+ SunToolkit.createNewAppContext();
+
+ super.run();
+ }
+
+ //Overriding to use Netx classloader. You might need to relax visibility
+ //in sun.applet.AppletPanel for runLoader().
+ protected void runLoader() {
+
+ try {
+ bridge = new PluginBridge(baseURL,
+ getDocumentBase(),
+ getJarFiles(),
+ getCode(),
+ getWidth(),
+ getHeight(),
+ atts);
+
+ synchronized(JNLPRuntime.initMutex) {
+ //The custom NetX Policy and SecurityManager are set here.
+ if (!JNLPRuntime.isInitialized()) {
+ if (JNLPRuntime.isDebug())
+ System.out.println("initializing JNLPRuntime...");
+
+ JNLPRuntime.initialize(false);
+ } else {
+ if (JNLPRuntime.isDebug())
+ System.out.println("JNLPRuntime already initialized");
+ }
+ }
+
+ doInit = true;
+ dispatchAppletEvent(APPLET_LOADING, null);
+ status = APPLET_LOAD;
+
+ Launcher l = new Launcher(exitOnFailure);
+
+ try {
+ appInst = (AppletInstance) l.launch(bridge, this);
+ } catch (LaunchException e) {
+ // Assume user has indicated he does not trust the
+ // applet.
+ if (exitOnFailure)
+ System.exit(0);
+ }
+ applet = appInst.getApplet();
+
+ //On the other hand, if you create an applet this way, it'll work
+ //fine. Note that you might to open visibility in sun.applet.AppletPanel
+ //for this to work (the loader field, and getClassLoader).
+ //loader = getClassLoader(getCodeBase(), getClassLoaderCacheKey());
+ //applet = createApplet(loader);
+
+ // This shows that when using NetX's JNLPClassLoader, keyboard input
+ // won't make it to the applet, whereas using sun.applet.AppletClassLoader
+ // works just fine.
+
+ dispatchAppletEvent(APPLET_LOADING_COMPLETED, null);
+
+ if (applet != null)
+ {
+ // Stick it in the frame
+ applet.setStub(this);
+ applet.setVisible(false);
+ add("Center", applet);
+ showAppletStatus("loaded");
+ validate();
+ }
+ } catch (Exception e) {
+ this.appletAlive = false;
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * Creates a new Thread (in a new applet-specific ThreadGroup) for running
+ * the applet
+ */
+ // Reminder: Relax visibility in sun.applet.AppletPanel
+ protected synchronized void createAppletThread() {
+ // when this was being done (incorrectly) in Launcher, the call was
+ // new AppThreadGroup(mainGroup, file.getTitle());
+ ThreadGroup tg = new AppThreadGroup(Launcher.mainGroup,
+ this.documentURL.toString());
+ handler = new Thread(tg, this);
+ handler.start();
+ }
+
+ public void updateSizeInAtts(int height, int width) {
+ this.atts.put("height", Integer.toString(height));
+ this.atts.put("width", Integer.toString(width));
+ }
+
+ public ClassLoader getAppletClassLoader() {
+ return appInst.getClassLoader();
+ }
+
+ public boolean isAlive() {
+ return handler != null && handler.isAlive() && this.appletAlive;
+ }
+}