| Method from sun.applet.AppletViewer Detail: |
public MenuItem addMenuItem(Menu m,
String s) {
MenuItem mItem = new MenuItem(amh.getMessage(s));
mItem.addActionListener(new UserActionListener());
return m.add(mItem);
}
|
void appletCharacterEncoding() {
showStatus(amh.getMessage("appletencoding", encoding));
}
Show character encoding type |
void appletClone() {
Point p = location();
updateAtts();
factory.createAppletViewer(p.x + XDELTA, p.y + YDELTA,
panel.documentURL, (Hashtable)panel.atts.clone());
}
Clone the viewer and the applet. |
void appletClose() {
// The caller thread is event dispatch thread, so
// spawn a new thread to avoid blocking the event queue
// when calling appletShutdown.
//
final AppletPanel p = panel;
new Thread(new Runnable()
{
public void run()
{
appletShutdown(p);
appletPanels.removeElement(p);
dispose();
if (countApplets() == 0) {
appletSystemExit();
}
}
}).start();
}
Close this viewer.
Stop, Destroy, Dispose and Quit an AppletView, then
reclaim resources and exit the program if this is
the last applet. |
void appletEdit() {
}
|
void appletInfo() {
String str = panel.applet.getAppletInfo();
if (str == null) {
str = amh.getMessage("appletinfo.applet");
}
str += "\n\n";
String atts[][] = panel.applet.getParameterInfo();
if (atts != null) {
for (int i = 0 ; i < atts.length ; i++) {
str += atts[i][0] + " -- " + atts[i][1] + " -- " + atts[i][2] + "\n";
}
} else {
str += amh.getMessage("appletinfo.param");
}
Point p = location();
new TextFrame(p.x + XDELTA, p.y + YDELTA, amh.getMessage("appletinfo.textframe"), str);
}
|
void appletPrint() {
PrinterJob pj = PrinterJob.getPrinterJob();
if (pj != null) {
PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
if (pj.printDialog(aset)) {
pj.setPrintable(this);
try {
pj.print(aset);
statusMsgStream.println(amh.getMessage("appletprint.finish"));
} catch (PrinterException e) {
statusMsgStream.println(amh.getMessage("appletprint.fail"));
}
} else {
statusMsgStream.println(amh.getMessage("appletprint.cancel"));
}
} else {
statusMsgStream.println(amh.getMessage("appletprint.fail"));
}
}
|
protected void appletQuit() {
// The caller thread is event dispatch thread, so
// spawn a new thread to avoid blocking the event queue
// when calling appletShutdown.
//
new Thread(new Runnable()
{
public void run()
{
for (Enumeration e = appletPanels.elements() ; e.hasMoreElements() ;) {
AppletPanel p = (AppletPanel)e.nextElement();
appletShutdown(p);
}
appletSystemExit();
}
}).start();
}
Quit all viewers.
Shutdown all viewers properly then
exit from the program (if not stand alone) |
void appletReload() {
panel.sendEvent(AppletPanel.APPLET_STOP);
panel.sendEvent(AppletPanel.APPLET_DESTROY);
panel.sendEvent(AppletPanel.APPLET_DISPOSE);
/**
* Fixed #4501142: Classlaoder sharing policy doesn't
* take "archive" into account. This will be overridden
* by Java Plug-in. [stanleyh]
*/
AppletPanel.flushClassLoader(panel.getClassLoaderCacheKey());
/*
* Make sure we don't have two threads running through the event queue
* at the same time.
*/
try {
panel.joinAppletThread();
panel.release();
} catch (InterruptedException e) {
return; // abort the reload
}
panel.createAppletThread();
panel.sendEvent(AppletPanel.APPLET_LOAD);
panel.sendEvent(AppletPanel.APPLET_INIT);
panel.sendEvent(AppletPanel.APPLET_START);
}
|
void appletRestart() {
panel.sendEvent(AppletPanel.APPLET_STOP);
panel.sendEvent(AppletPanel.APPLET_DESTROY);
panel.sendEvent(AppletPanel.APPLET_INIT);
panel.sendEvent(AppletPanel.APPLET_START);
}
|
void appletSave() {
AccessController.doPrivileged(new PrivilegedAction() {
public Object run() {
// XXX: this privileged block should be made smaller
// by initializing a private static variable with "user.dir"
// Applet needs to be stopped for serialization to succeed.
// Since panel.sendEvent only queues the event, there is a
// chance that the event will not be processed before
// serialization begins. However, by sending the event before
// FileDialog is created, enough time is given such that this
// situation is unlikely to ever occur.
panel.sendEvent(AppletPanel.APPLET_STOP);
FileDialog fd = new FileDialog(AppletViewer.this,
amh.getMessage("appletsave.filedialogtitle"),
FileDialog.SAVE);
// needed for a bug under Solaris...
fd.setDirectory(System.getProperty("user.dir"));
fd.setFile(defaultSaveFile);
fd.show();
String fname = fd.getFile();
if (fname == null) {
// Restart applet if Save is cancelled.
panel.sendEvent(AppletPanel.APPLET_START);
return null; // cancelled
}
String dname = fd.getDirectory();
File file = new File(dname, fname);
try {
BufferedOutputStream s = new BufferedOutputStream(new FileOutputStream(file));
ObjectOutputStream os = new ObjectOutputStream(s);
showStatus(amh.getMessage("appletsave.err1",
panel.applet.toString(), file.toString()));
os.writeObject(panel.applet);
} catch (IOException ex) {
System.err.println(amh.getMessage("appletsave.err2", ex));
} finally {
panel.sendEvent(AppletPanel.APPLET_START);
}
return null;
}
});
}
Save the applet to a well known file (for now) as a serialized object |
void appletStart() {
panel.sendEvent(AppletPanel.APPLET_START);
}
|
void appletStop() {
panel.sendEvent(AppletPanel.APPLET_STOP);
}
|
void appletTag() {
ByteArrayOutputStream out = new ByteArrayOutputStream();
updateAtts();
printTag(new PrintStream(out), panel.atts);
showStatus(amh.getMessage("applettag"));
Point p = location();
new TextFrame(p.x + XDELTA, p.y + YDELTA, amh.getMessage("applettag.textframe"), out.toString());
}
|
public static int countApplets() {
return appletPanels.size();
}
How many applets are running? |
static void flushImageCache() {
imageRefs.clear();
}
|
public Applet getApplet(String name) {
AppletSecurity security = (AppletSecurity)System.getSecurityManager();
name = name.toLowerCase();
SocketPermission panelSp =
new SocketPermission(panel.getCodeBase().getHost(), "connect");
for (Enumeration e = appletPanels.elements() ; e.hasMoreElements() ;) {
AppletPanel p = (AppletPanel)e.nextElement();
String param = p.getParameter("name");
if (param != null) {
param = param.toLowerCase();
}
if (name.equals(param) &&
p.getDocumentBase().equals(panel.getDocumentBase())) {
SocketPermission sp =
new SocketPermission(p.getCodeBase().getHost(), "connect");
if (panelSp.implies(sp)) {
return p.applet;
}
}
}
return null;
}
|
public Enumeration getApplets() {
AppletSecurity security = (AppletSecurity)System.getSecurityManager();
Vector v = new Vector();
SocketPermission panelSp =
new SocketPermission(panel.getCodeBase().getHost(), "connect");
for (Enumeration e = appletPanels.elements() ; e.hasMoreElements() ;) {
AppletPanel p = (AppletPanel)e.nextElement();
if (p.getDocumentBase().equals(panel.getDocumentBase())) {
SocketPermission sp =
new SocketPermission(p.getCodeBase().getHost(), "connect");
if (panelSp.implies(sp)) {
v.addElement(p.applet);
}
}
}
return v.elements();
}
Return an enumeration of all the accessible
applets on this page. |
public AudioClip getAudioClip(URL url) {
checkConnect(url);
synchronized (audioClips) {
AudioClip clip = (AudioClip)audioClips.get(url);
if (clip == null) {
audioClips.put(url, clip = new AppletAudioClip(url));
}
return clip;
}
}
|
static Image getCachedImage(URL url) {
// System.getSecurityManager().checkConnection(url.getHost(), url.getPort());
return (Image)getCachedImageRef(url).get();
}
|
static Ref getCachedImageRef(URL url) {
synchronized (imageRefs) {
AppletImageRef ref = (AppletImageRef)imageRefs.get(url);
if (ref == null) {
ref = new AppletImageRef(url);
imageRefs.put(url, ref);
}
return ref;
}
}
|
public Image getImage(URL url) {
return getCachedImage(url);
}
|
public InputStream getStream(String key) {
// We do nothing.
return null;
}
|
public Iterator getStreamKeys() {
// We do nothing.
return null;
}
|
public static void main(String[] argv) {
// re-route everything to the new main entry point
Main.main(argv);
} Deprecated!
|
public static synchronized void networkProperties() {
if (props == null) {
props = new AppletProps();
}
props.addNotify();
props.setVisible(true);
}
|
public static void parse(URL url) throws IOException {
parse(url, System.out, new StdAppletViewerFactory());
}
|
public static void parse(URL url,
String enc) throws IOException {
encoding = enc;
parse(url, System.out, new StdAppletViewerFactory());
}
Scan an html file for |
public static void parse(URL url,
PrintStream statusMsgStream,
AppletViewerFactory factory) throws IOException {
// < OBJECT > < EMBED > tag flags
boolean isAppletTag = false;
boolean isObjectTag = false;
boolean isEmbedTag = false;
// warning messages
String requiresNameWarning = amh.getMessage("parse.warning.requiresname");
String paramOutsideWarning = amh.getMessage("parse.warning.paramoutside");
String appletRequiresCodeWarning = amh.getMessage("parse.warning.applet.requirescode");
String appletRequiresHeightWarning = amh.getMessage("parse.warning.applet.requiresheight");
String appletRequiresWidthWarning = amh.getMessage("parse.warning.applet.requireswidth");
String objectRequiresCodeWarning = amh.getMessage("parse.warning.object.requirescode");
String objectRequiresHeightWarning = amh.getMessage("parse.warning.object.requiresheight");
String objectRequiresWidthWarning = amh.getMessage("parse.warning.object.requireswidth");
String embedRequiresCodeWarning = amh.getMessage("parse.warning.embed.requirescode");
String embedRequiresHeightWarning = amh.getMessage("parse.warning.embed.requiresheight");
String embedRequiresWidthWarning = amh.getMessage("parse.warning.embed.requireswidth");
String appNotLongerSupportedWarning = amh.getMessage("parse.warning.appnotLongersupported");
java.net.URLConnection conn = url.openConnection();
Reader in = makeReader(conn.getInputStream());
/* The original URL may have been redirected - this
* sets it to whatever URL/codebase we ended up getting
*/
url = conn.getURL();
int ydisp = 1;
Hashtable atts = null;
while(true) {
c = in.read();
if (c == -1)
break;
if (c == '< ") {
c = in.read();
if (c == '/") {
c = in.read();
String nm = scanIdentifier(in);
if (nm.equalsIgnoreCase("applet") ||
nm.equalsIgnoreCase("object") ||
nm.equalsIgnoreCase("embed")) {
// We can't test for a code tag until < /OBJECT >
// because it is a parameter, not an attribute.
if(isObjectTag) {
if (atts.get("code") == null && atts.get("object") == null) {
statusMsgStream.println(objectRequiresCodeWarning);
atts = null;
}
}
if (atts != null) {
// XXX 5/18 In general this code just simply
// shouldn't be part of parsing. It's presence
// causes things to be a little too much of a
// hack.
factory.createAppletViewer(x, y, url, atts);
x += XDELTA;
y += YDELTA;
// make sure we don't go too far!
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
if ((x > d.width - 300) || (y > d.height - 300)) {
x = 0;
y = 2 * ydisp * YDELTA;
ydisp++;
}
}
atts = null;
isAppletTag = false;
isObjectTag = false;
isEmbedTag = false;
}
}
else {
String nm = scanIdentifier(in);
if (nm.equalsIgnoreCase("param")) {
Hashtable t = scanTag(in);
String att = (String)t.get("name");
if (att == null) {
statusMsgStream.println(requiresNameWarning);
} else {
String val = (String)t.get("value");
if (val == null) {
statusMsgStream.println(requiresNameWarning);
} else if (atts != null) {
atts.put(att.toLowerCase(), val);
} else {
statusMsgStream.println(paramOutsideWarning);
}
}
}
else if (nm.equalsIgnoreCase("applet")) {
isAppletTag = true;
atts = scanTag(in);
if (atts.get("code") == null && atts.get("object") == null) {
statusMsgStream.println(appletRequiresCodeWarning);
atts = null;
} else if (atts.get("width") == null) {
statusMsgStream.println(appletRequiresWidthWarning);
atts = null;
} else if (atts.get("height") == null) {
statusMsgStream.println(appletRequiresHeightWarning);
atts = null;
}
}
else if (nm.equalsIgnoreCase("object")) {
isObjectTag = true;
atts = scanTag(in);
// The < OBJECT > attribute codebase isn't what
// we want. If its defined, remove it.
if(atts.get("codebase") != null) {
atts.remove("codebase");
}
if (atts.get("width") == null) {
statusMsgStream.println(objectRequiresWidthWarning);
atts = null;
} else if (atts.get("height") == null) {
statusMsgStream.println(objectRequiresHeightWarning);
atts = null;
}
}
else if (nm.equalsIgnoreCase("embed")) {
isEmbedTag = true;
atts = scanTag(in);
if (atts.get("code") == null && atts.get("object") == null) {
statusMsgStream.println(embedRequiresCodeWarning);
atts = null;
} else if (atts.get("width") == null) {
statusMsgStream.println(embedRequiresWidthWarning);
atts = null;
} else if (atts.get("height") == null) {
statusMsgStream.println(embedRequiresHeightWarning);
atts = null;
}
}
else if (nm.equalsIgnoreCase("app")) {
statusMsgStream.println(appNotLongerSupportedWarning);
Hashtable atts2 = scanTag(in);
nm = (String)atts2.get("class");
if (nm != null) {
atts2.remove("class");
atts2.put("code", nm + ".class");
}
nm = (String)atts2.get("src");
if (nm != null) {
atts2.remove("src");
atts2.put("codebase", nm);
}
if (atts2.get("width") == null) {
atts2.put("width", "100");
}
if (atts2.get("height") == null) {
atts2.put("height", "100");
}
printTag(statusMsgStream, atts2);
statusMsgStream.println();
}
}
}
}
in.close();
}
|
public int print(Graphics graphics,
PageFormat pf,
int pageIndex) {
if (pageIndex > 0) {
return Printable.NO_SUCH_PAGE;
} else {
Graphics2D g2d = (Graphics2D)graphics;
g2d.translate(pf.getImageableX(), pf.getImageableY());
panel.applet.printAll(graphics);
return Printable.PAGE_EXISTS;
}
}
|
public static void printTag(PrintStream out,
Hashtable atts) {
systemParam.put("codebase", "codebase");
systemParam.put("code", "code");
systemParam.put("alt", "alt");
systemParam.put("width", "width");
systemParam.put("height", "height");
systemParam.put("align", "align");
systemParam.put("vspace", "vspace");
systemParam.put("hspace", "hspace");
out.print("< applet");
String v = (String)atts.get("codebase");
if (v != null) {
out.print(" codebase=\"" + v + "\"");
}
v = (String)atts.get("code");
if (v == null) {
v = "applet.class";
}
out.print(" code=\"" + v + "\"");
v = (String)atts.get("width");
if (v == null) {
v = "150";
}
out.print(" width=" + v);
v = (String)atts.get("height");
if (v == null) {
v = "100";
}
out.print(" height=" + v);
v = (String)atts.get("name");
if (v != null) {
out.print(" name=\"" + v + "\"");
}
out.println(" >");
// A very slow sorting algorithm
int len = atts.size();
String params[] = new String[len];
len = 0;
for (Enumeration e = atts.keys() ; e.hasMoreElements() ;) {
String param = (String)e.nextElement();
int i = 0;
for (; i < len ; i++) {
if (params[i].compareTo(param) >= 0) {
break;
}
}
System.arraycopy(params, i, params, i + 1, len - i);
params[i] = param;
len++;
}
for (int i = 0 ; i < len ; i++) {
String param = params[i];
if (systemParam.get(param) == null) {
out.println("< param name=" + param +
" value=\"" + atts.get(param) + "\" >");
}
}
out.println("< /applet >");
}
|
public void processUserAction(ActionEvent evt) {
String label = ((MenuItem)evt.getSource()).getLabel();
if (amh.getMessage("menuitem.restart").equals(label)) {
appletRestart();
return;
}
if (amh.getMessage("menuitem.reload").equals(label)) {
appletReload();
return;
}
if (amh.getMessage("menuitem.clone").equals(label)) {
appletClone();
return;
}
if (amh.getMessage("menuitem.stop").equals(label)) {
appletStop();
return;
}
if (amh.getMessage("menuitem.save").equals(label)) {
appletSave();
return;
}
if (amh.getMessage("menuitem.start").equals(label)) {
appletStart();
return;
}
if (amh.getMessage("menuitem.tag").equals(label)) {
appletTag();
return;
}
if (amh.getMessage("menuitem.info").equals(label)) {
appletInfo();
return;
}
if (amh.getMessage("menuitem.encoding").equals(label)) {
appletCharacterEncoding();
return;
}
if (amh.getMessage("menuitem.edit").equals(label)) {
appletEdit();
return;
}
if (amh.getMessage("menuitem.print").equals(label)) {
appletPrint();
return;
}
if (amh.getMessage("menuitem.props").equals(label)) {
networkProperties();
return;
}
if (amh.getMessage("menuitem.close").equals(label)) {
appletClose();
return;
}
if (factory.isStandalone() && amh.getMessage("menuitem.quit").equals(label)) {
appletQuit();
return;
}
//statusMsgStream.println("evt = " + evt);
}
|
public static String scanIdentifier(Reader in) throws IOException {
StringBuffer buf = new StringBuffer();
while (true) {
if (((c >= 'a") && (c < = 'z")) ||
((c >= 'A") && (c < = 'Z")) ||
((c >= '0") && (c < = '9")) || (c == '_")) {
buf.append((char)c);
c = in.read();
} else {
return buf.toString();
}
}
}
|
public static Hashtable scanTag(Reader in) throws IOException {
Hashtable atts = new Hashtable();
skipSpace(in);
while (c >= 0 && c != ' >") {
String att = scanIdentifier(in);
String val = "";
skipSpace(in);
if (c == '=") {
int quote = -1;
c = in.read();
skipSpace(in);
if ((c == '\'") || (c == '\"")) {
quote = c;
c = in.read();
}
StringBuffer buf = new StringBuffer();
while ((c > 0) &&
(((quote < 0) && (c != ' ") && (c != '\t") &&
(c != '\n") && (c != '\r") && (c != ' >"))
|| ((quote >= 0) && (c != quote)))) {
buf.append((char)c);
c = in.read();
}
if (c == quote) {
c = in.read();
}
skipSpace(in);
val = buf.toString();
}
//statusMsgStream.println("PUT " + att + " = '" + val + "'");
if (! val.equals("")) {
atts.put(att.toLowerCase(java.util.Locale.ENGLISH), val);
}
while (true) {
if ((c == ' >") || (c < 0) ||
((c >= 'a") && (c < = 'z")) ||
((c >= 'A") && (c < = 'Z")) ||
((c >= '0") && (c < = '9")) || (c == '_"))
break;
c = in.read();
}
//skipSpace(in);
}
return atts;
}
|
public void setStream(String key,
InputStream stream) throws IOException {
// We do nothing.
}
|
public void showDocument(URL url) {
}
|
public void showDocument(URL url,
String target) {
}
|
public void showStatus(String status) {
label.setText(status);
}
|
public static void skipSpace(Reader in) throws IOException {
while ((c >= 0) &&
((c == ' ") || (c == '\t") || (c == '\n") || (c == '\r"))) {
c = in.read();
}
}
|
public void updateAtts() {
Dimension d = panel.size();
Insets in = panel.insets();
panel.atts.put("width",
Integer.toString(d.width - (in.left + in.right)));
panel.atts.put("height",
Integer.toString(d.height - (in.top + in.bottom)));
}
Make sure the atrributes are uptodate. |