// This example is from the book _JavaScript: The Definitive Guide_.
// Written by David Flanagan. Copyright (c) 1996 O'Reilly & Associates.
// This example is provided WITHOUT WARRANTY either expressed or implied.
// You may study, use, modify, and distribute it for any purpose.
// This is a Java code, not JavaScript code.
import netscape.javascript.JSObject; // these are the classes we'll use
import java.applet.Applet;
import java.io.OutputStream;
// An output stream that sends HTML text to a newly created Web browser window.
public class HTMLOutputStream extends OutputStream
{
JSObject main_window; // the initial browser window
JSObject window; // the new window we create
JSObject document; // the document of that new window
static int window_num = 0; // used to give each new window a unique name
// To create a new HTMLOutputStream, you must specify the applet that
// will use it (this specifies a browser window) and the desired size
// for the new window.
public HTMLOutputStream(Applet applet, int width, int height)
{
// get main browser window from the applet with JSObject.getWindow()
main_window = JSObject.getWindow(applet);
// use JSObject.eval() to create a new window
window = (JSObject)
main_window.eval("self.open(''," +
"'HTMLOutputStream" + window_num++ + "'," +
"'menubar,status,resizable,scrollbars," +
"width=" + width + ",height=" + height + "')");
// use JSObject.getMember() to get the document of this new window
document = (JSObject) window.getMember("document");
// Then use JSObject.call() to open this document.
document.call("open", null);
}
// This is the write() method required for all OutputStream subclasses.
public void write(byte[] chars, int offset, int length)
{
// Create a string from the specified bytes
String s = new String(chars, 0, offset, length);
// Store the string in an array for use with JSObject.call()
Object[] args = { s };
// check to see if the window has been closed
boolean closed = ((Boolean)window.getMember("closed")).booleanValue();
// If not, use JSObject.call() to invoke document.write()
if (!closed) document.call("write", args);
}
// Here are two variants on the above method, also required.
public void write(byte[] chars) { write(chars, 0, chars.length); }
public void write(int c) { byte[] chars = {(byte)c}; write(chars, 0, 1); }
// When the stream is closed, use JSObject.call() to call Document.close
public void close() { document.call("close", null); }
// This method is unique to HTMLOutputStream. If the new window is
// still open, use JSObject.call() to invoke Window.close() to close it.
public void close_window()
{
boolean closed = ((Boolean)window.getMember("closed")).booleanValue();
if (!closed) window.call("close", null);
}
}